diff --git a/docs/ADR.md b/docs/ADR.md index a79b125..564de45 100644 --- a/docs/ADR.md +++ b/docs/ADR.md @@ -355,7 +355,7 @@ Planning은 Step마다 정확한 상대 파일 목록 `owned_paths`를 작성한 ### ADR-028: 메인이 필요한 전문 작업을 조정하고 Harness를 명시적 검증 실행기로 사용한다 **상태**: Accepted. 2026-09-07 사용자가 승인한 -[문서 갱신 계획](superpowers/plans/2026-09-07-agent-harness-documentation-update.md)에 따라 +[문서 갱신 계획](development-history.md#승인과-교훈)에 따라 Agent·Harness 경량화 결정을 공통 운영 문서에 반영한다. 솔버의 제품·물리·수치·입출력 계약과 외부 실행 권한은 변경하지 않는다. diff --git a/docs/FEATURE_DOCUMENTATION.md b/docs/FEATURE_DOCUMENTATION.md index dc62d9c..8bf6d73 100644 --- a/docs/FEATURE_DOCUMENTATION.md +++ b/docs/FEATURE_DOCUMENTATION.md @@ -15,8 +15,9 @@ 3. Specialist는 할당 작업에 관련된 Feature 문서와 원문의 절만 읽는다. `FEATURED_AGENTS.md`는 자동 로드되는 `AGENTS.md`가 아니므로 필요한 context는 메인이 경로·절로 전달한다. 모든 인계에서 핵심 문서 3개를 재독하도록 강제하지 않는다. -4. 기존 `docs/features//`와 `coordination.md`는 이력으로 보존한다. - 자동 이동·복제하지 않고 재개에 필요한 경로·계약 revision을 참조한다. +4. 과거 단계별 계획·coordination은 현재 작업 입력이 아니다. 별도 문서 정리 요청에서는 + 유효한 결정·승인·실패·검증 근거를 현재 기능 문서에 통합하고 반복 진행 기록을 제거할 수 있다. + 요구사항·ADR ID와 당시 판정은 보존하며, 이동·삭제 시 저장소의 파일·절 참조를 갱신한다. `coordination.md`를 새로 생성하거나 현재 상태 기록을 위해 갱신하지 않는다. Feature 문서는 공통 기준을 복사하거나 묵시적으로 덮어쓰지 않는다. 실제 상위 계약 문제는 @@ -72,6 +73,23 @@ hash·gate 기록은 요구하지 않는다. 보고서에서 참조한다. 기존 phase 이력은 새 보고서 형식에 맞추어 변경하지 않는다. Reference artifact와 tolerance를 구현 결과에 맞추어 수정하지 않는다. +## 기능 문서 정리 기준 + +기능별 [README](README.md#기능별-진입점)는 목적·현재 범위와 필요한 문서의 진입점이다. +파일 수를 고정하지 않으며 짧은 결과 보고서는 `verification.md`, 중요한 수정은 +`lessons.md` 등으로 통합할 수 있다. 기존 PRD·ADR·정식화·I/O의 유효한 의미를 유지한다. + +- 최종 수식·가정·단위·부호·좌표·source identity·적용 한계와 공개 I/O를 보존한다. +- 재사용 책임·수명과 재사용하면 안 되는 조건을 Handoff에 명시한다. +- 채택 이유·중요한 대안·승인 이력을 유지하고 오래된 실패 원인을 해결 상태와 함께 기록한다. +- 구현/검증 완료, PASS/FAIL/SKIP/미실행과 보류를 구분하고 과거 readiness를 승계하지 않는다. +- 실행 revision·환경·명령·native exit·주요 metric·reference identity와 evidence 위치를 유지한다. +- 최신 날짜나 링크 부재만으로 삭제하지 않는다. 중복은 한 원본으로 통합하고 참조를 수정한다. +- 삭제한 파일의 과거 원문은 Git revision과 원래 경로로 조회할 수 있게 연결한다. + +원시 로그·논문·reference 데이터는 별도 역할이다. 존재하지 않는 개인 artifact를 유효한 +파일 링크로 표시하거나 문서 정리를 이유로 원본을 생성·보정하지 않는다. + ## 언어와 확인 기본 Feature 문서는 한국어 Markdown으로 작성하고 agent/skill ID, field, requirement ID, diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..e92e065 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,48 @@ +# FESA 문서 안내 + +현재 계약, 기능의 재사용 정보, 실제 검증 결과와 과거 개발 이력을 구분한다. +기능 구현과 기능 검증 완료는 다르며, 문서 정리로 과거 실행을 현재 통과로 바꾸지 않는다. + +## 공통 기준 + +| 확인할 내용 | 원본 문서 | +| --- | --- | +| 제품 목적·지원 범위·승인 요구사항 | [PRD](PRD.md), [business-rules](business-rules.md) | +| 모듈·데이터 흐름·소유권·수명 | [ARCHITECTURE](ARCHITECTURE.md) | +| CLI·입력·결과·비교 identity | [contracts](contracts.md) | +| 외부 수치 비교와 승인 예외 | [TOLERANCE](TOLERANCE.md) | +| 개발·수치 구현에서 지킬 규칙 | [standards](standards.md), [CODINGSTYLE](CODINGSTYLE.md), [engineering-notes](engineering-notes.md) | +| 환경 준비·실행·build/test | [operations](operations.md), [HARNESS](HARNESS.md), [HARNESS_WORKFLOW](HARNESS_WORKFLOW.md) | +| 실행 권한·데이터 취급 | [security](security.md) | +| 전문 작업·skill·기능 문서 소유권 | [SOLVER_AGENT_DESIGN](SOLVER_AGENT_DESIGN.md), [SOLVER_SKILL_DESIGN](SOLVER_SKILL_DESIGN.md), [FEATURE_DOCUMENTATION](FEATURE_DOCUMENTATION.md) | +| 승인 결정과 변경 이유 | [ADR](ADR.md), [결정 목록](tracking/decisions/index.md) | +| 현재 구현·검증과 잔여 문제 | [현황](tracking/status.md), [미해결 문제](tracking/findings.md) | + +공통 요약과 상세 계약이 충돌하면 내용을 최신 날짜만으로 덮어쓰지 않는다. 승인된 의미와 +실제 구현·검사 대상 revision을 대조하고, 물리·acceptance 변경은 별도로 판단한다. + +## 기능별 진입점 + +각 진입점에서 목적·범위, 수식·I/O, 사용법·Handoff, 검증·수정·한계를 연결한다. + +| 기능 | 문서 | +| --- | --- | +| B33 선형 정적 Beam | [linear-static-3d-euler-beam](linear-static-3d-euler-beam/README.md) | +| MITC4 선형 정적 Shell | [linear-static-mitc4-shell](linear-static-mitc4-shell/README.md) | +| MITC4 비선형 정적 Newton–Raphson | [nonlinear-static-newton-raphson](nonlinear-static-newton-raphson/README.md) | +| Shell 표면 압력 | [shell-surface-pressure-load](shell-surface-pressure-load/README.md) | +| MITC4 질량·FEAST 현재 구현 | [mitc4-shell-feast-eigen2](mitc4-shell-feast-eigen2/README.md) | +| 이전 MFE의 요구·채택 유도·반례 근거 | [mitc4-shell-feast-eigen](mitc4-shell-feast-eigen/README.md) | +| HHT implicit dynamics | [hht-implicit-dynamics](hht-implicit-dynamics/README.md) | +| Shell transient heat transfer | [shell-transient-heat-transfer](shell-transient-heat-transfer/README.md) | +| C++ 모듈화와 공개 API 정리 | [cpp-object-oriented-modular-refactoring](cpp-object-oriented-modular-refactoring/README.md) | + +## 개발 이력과 원문 + +[개발 결정·폐기된 운영 계획](development-history.md)은 승인 출처와 중요한 교훈을 연결한다. +[MITC4 보충 기록](MITC4_SUPP.md)은 실제 실패·계약 변경·예상 TDD RED를 구분한다. +[초기 작성 노트](archive/ProjectInitialPlanNote.md)는 역사 자료이고 현재 작업 계획이 아니다. +`reference-papers/`는 논문·발췌·이미지 원문이며 기능 검증 통과의 근거와는 구분한다. + +현재 checkout에 없는 개인 로그·생성 결과는 당시 evidence 위치로 표시한다. 저장소에 있는 +검사 코드·reference 원본·검증 보고서와 다른 자료이므로 실제 파일이 제공된 것으로 해석하지 않는다. diff --git a/docs/business-rules.md b/docs/business-rules.md index bbadaef..3189b29 100644 --- a/docs/business-rules.md +++ b/docs/business-rules.md @@ -65,21 +65,22 @@ HHT 동해석은 consistent kinetic mass를 사용한다. 고유치 해석의 lu 알고리즘 보조 가속도를 구별한다. 어느 하나의 reference 일치로 다른 양의 시간수렴을 통과했다고 판정하지 않는다. 현재 shell 시간수렴에는 미해결 문제가 있다. -## 열해석의 합의된 향후 범위 +## 열해석의 채택 범위와 검증 경계 -가까운 목표는 shell의 단일 step uncoupled transient heat transfer다. 두께가 균질한 +구현된 첫 범위는 shell의 단일 step uncoupled transient heat transfer다. 두께가 균질한 단면에 온도점 5개를 두고 면내 및 두께 방향 열전달을 다룬다. 상수 등방 전도도·밀도·비열, 영역별 재료·두께, 고정 시간 증분과 시간에 따라 일정한 입력이 합의된 범위다. 초기 온도는 절점마다 지정하되 그 절점의 두께 온도점에는 같은 값을 준다. 지정 온도와 -절점 열률은 아랫면·윗면에 적용하고, edge 열입력은 두께에 걸쳐 균일하게 적용한다. +절점 열률은 아랫면·윗면에 적용한다. Edge 열입력은 이번 공개 입력에서 연기했다. 온도·heat flux·반력 열률의 저장을 요구한다. 5개 온도점에서 source DOF 11은 아랫면, 13은 중앙면, 15는 윗면이다. -Q4 면내 보간과 두 구간의 이차 두께 보간, consistent 열용량, Backward Euler와 flux -복구 위치는 아직 제안이다. Geometry 근사, 초기 경계 jump, edge 문법·단위와 영속 결과 -schema를 확정한 뒤 구현한다. 장기 목표인 양방향 열-구조 연성은 현재 열해석의 완료 -조건에 포함하지 않는다. +Q4 면내 보간과 두 구간의 이차 두께 보간, consistent 열용량, Backward Euler를 채택했다. +Raw 초기값·마지막 짧은 증분·geometry 근사·24개 flux trace와 영속 schema는 +[Feature PRD](shell-transient-heat-transfer/PRD.md)의 상세 계약을 따른다. 원본 NT11 비교는 +실제 수치 FAIL을 유지하는 진단 family이며 새 필수 reference가 준비 중이다. +장기 목표인 양방향 열-구조 연성은 현재 uncoupled 범위의 완료 조건에 포함하지 않는다. ## 수용과 실패 diff --git a/docs/contracts.md b/docs/contracts.md index 1dfafdb..2af4fde 100644 --- a/docs/contracts.md +++ b/docs/contracts.md @@ -51,14 +51,14 @@ contact·MPC·비탄성·혼합 beam/shell model은 현재 공개 subset이 아 | 입력 | 소비자가 지켜야 할 의미 | | --- | --- | | `*NODE` | Part 안의 `label,x,y,z`; label은 양의 정수, 좌표는 finite | -| `*ELEMENT, TYPE=B33|S4|S4R, ELSET=...` | B33은 2개, shell은 서로 다른 4개 node label; source type과 내부 정식화 구별 | +| `*ELEMENT, TYPE=..., ELSET=...` | 구조 B33은 2개, S4/S4R은 4개 node label; 열전달 DS4는 4개. Source type과 내부 정식화 구별 | | `*NSET`·`*ELSET` | 허용 scope의 label 나열 또는 `GENERATE`; assembly set은 명시 instance에 결속 | | `*INSTANCE, NAME=..., PART=...` | 기존 part의 identity instance; transform data 미지원 | | `*ELASTIC` | 상수 등방 `E,nu`; `E>0`, `-1/` | | Frequency | schema 0에 `feature_id=mitc4-shell-feast-eigen2`, `analysis_procedure=linear-frequency`, `eigen_schema_version=1` 추가 | | HHT | `feature_id=hht-implicit-dynamics`, `analysis_procedure=hht-implicit-dynamics`, schema 1, 전체 accepted frame과 `/steps/Step-1/frames//` | +| Shell 열전달 | 식별·thermal model·frame·temperature/flux/reaction의 별도 계약은 [Feature PRD](shell-transient-heat-transfer/PRD.md)의 HDF5 정의를 따른다 | -`Step-1`은 storage slot이다. Frequency는 `/steps/Step-1`의 `source_step_name`, HHT는 +`Step-1`은 storage slot이다. Frequency는 `/steps/Step-1`의 `source_step_name`, HHT와 열전달은 `/metadata`의 `source_step_name`에서 원래 이름을 읽는다. 기존 선형·비선형 static은 canonical `step_name=Step-1`만 저장하므로 원래 source 이름이 HDF5에 별도로 있다고 가정하지 않는다. Float64와 fixed-width integer는 little-endian, @@ -130,7 +139,7 @@ canonical `step_name=Step-1`만 저장하므로 원래 source 이름이 HDF5에 Source 입력 identity는 실제 읽은 byte의 identity를 포함한다. `/model/nodes`와 `/model/elements`의 source instance/label과 internal ID를 사용해 -결과 row를 연결한다. Internal row 번호를 원본 label로 취급하지 않는다. Nodal +결과 row를 연결한다. Internal row 번호를 원본 label로 취급하지 않는다. 구조해석의 nodal displacement와 constraint mask의 6성분 순서는 `[UX,UY,UZ,URX,URY,URZ]`다. Reaction, 가속도 등 다른 dataset에는 각각의 component 이름이 있으므로 이 이름을 재사용하지 않고 단위·좌표·location·component attribute를 함께 읽는다. `/model/nodal_constraint_mask`의 @@ -154,6 +163,11 @@ Nodal `acceleration`과 `algorithmic_acceleration`, `angular_acceleration`, `generalized_reaction`과 공간 `reaction`은 구별된 dataset이다. Accepted frame과 source identity로 접근하고 failed trial이나 time 기반 nearest-neighbor matching을 사용하지 않는다. +열전달은 구조해석의 6성분 dataset을 재사용하지 않는다. 5개 section point 온도와 +thermal constraint mask, heat flux의 좌표·위치, reaction heat rate의 부호·초기 frame 규칙은 +[열전달 결과 계약](shell-transient-heat-transfer/PRD.md)을 따른다. Flux 적분과 full-residual +reaction을 같은 복구량으로 해석하지 않는다. + ## 외부 비교 Comparison은 필요한 instance·entity·location·component·step/frame을 일대일 대응한다. diff --git a/docs/cpp-object-oriented-modular-refactoring/README.md b/docs/cpp-object-oriented-modular-refactoring/README.md new file mode 100644 index 0000000..03e6e95 --- /dev/null +++ b/docs/cpp-object-oriented-modular-refactoring/README.md @@ -0,0 +1,21 @@ +# C++ 모듈화와 공개 API 정리 + +## 목적과 개발 결과 + +모델·요소·assembly·procedure·backend·I/O 책임을 분리하고 공개 header의 vendor 의존을 +격리했다. Naming/format/header guard·Doxygen 계약과 HDF5/reference 동작의 보존을 확인했다. +당시 revision·명령·수치 결과와 환경 실패는 [검증 기록](verification.md)에 남긴다. + +## 재사용 Handoff + +현재 architecture·수명은 [ARCHITECTURE](../ARCHITECTURE.md), C++ 규약은 +[CODINGSTYLE](../CODINGSTYLE.md), 실행은 [operations](../operations.md)를 따른다. +실제 공개 header와 대응 src consumer를 함께 읽으며 `.hpp` 시절의 API명·임시 Step 명령을 +다시 도입하지 않는다. 원본 reference와 물리·tolerance를 리팩터링 편의로 바꾸지 않는다. + +## 실패와 교훈 + +상속된 `FESA_HARNESS_CODEX_SANDBOX`로 Python default 계약 검사가 실패했던 사례는 환경 +오분류를 피하는 근거다. Clang-format의 변경 유무와 exit를 분리하고 link 성공만으로 +MSVC runtime·dependency 설정이 완성됐다고 판단하지 않는다. 그때의 pass는 현재 codebase +전체의 재검증 결과가 아니다. diff --git a/docs/cpp-object-oriented-modular-refactoring/build-test.md b/docs/cpp-object-oriented-modular-refactoring/build-test.md deleted file mode 100644 index a6145c8..0000000 --- a/docs/cpp-object-oriented-modular-refactoring/build-test.md +++ /dev/null @@ -1,100 +0,0 @@ -# C++ Object-Oriented Modular Refactoring Build/Test Report - -## Metadata - -- owner_agent: `implementation-agent` -- feature_id: `cpp-object-oriented-modular-refactoring` -- report_status: `passed` -- date: `2026-08-16` -- workspace: `C:\git\FESADev\.worktrees\cpp-object-oriented-modular-refactoring` -- branch: `feat-cpp-object-oriented-modular-refactoring` -- head: `f84ebb541f4717ab8300cf0d80497e1277d3bb48` -- `.harness/config.json`: absent; Harness/CMake defaults and Step 24 explicit commands used -- build generator: `Visual Studio 18 2026` -- platform/configuration: `x64` / `Debug` -- compiler observed by configure: `MSVC 19.51.36252.0` -- inherited environment note: `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` - -## Execution environment - -Required dependency paths all existed: - -| Path | Status | -| --- | --- | -| `C:/git/googletest` | found | -| `C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl` | found | -| `C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb` | found | -| `C:/Program Files/HDF_Group/HDF5/2.1.1/cmake` | found | - -LLVM tools: - -- `clang-format version 22.1.8` -- `clang-tidy LLVM version 22.1.8` -- `clang-tidy --verify-config`: `No config errors detected.` - -## Command log summary - -| Command | Exit | Duration | Output tail / result | -| --- | ---: | ---: | --- | -| `uv run --with pytest python -m pytest -v -rs` | 1 | 2.700s | 20 passed, 1 failed: `test_invoke_codex_uses_utf8_for_unicode_prompt` saw inherited sandbox override `danger-full-access` instead of default `workspace-write`. Classified as environment-specific diagnostic, not product failure. | -| Clean child process without `FESA_HARNESS_CODEX_SANDBOX`; `uv run --with pytest python -m pytest -v -rs` | 0 | 0.751s | `21 passed in 0.13s`. | -| `clang-format --dry-run --Werror` over `@(rg --files include src tests -g "*.h" -g "*.cpp")` | 1 | 0.892s | Reported four formatting findings in `src/fesa/math/sparse_matrix.cpp`, `tests/unit/math/sparse_matrix_test.cpp`, `tests/unit/solvers/linear/linear_solver_test.cpp`, `tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp`. | -| `clang-format -i` on the four reported files | 0 | tool wall 0.5s | Normalized formatting/stat state; `git diff --raw` and `git diff --numstat` remained empty for those files. | -| `clang-format --dry-run --Werror` over 163 C++ files | 0 | 0.888s | `CPP_FILE_COUNT: 163`; no violations. | -| `clang-tidy --config-file=.clang-tidy -- -x c++ -std=c++17 -Iinclude` | 0 | 41.822s | `PUBLIC_HEADER_COUNT: 46`; 45 diagnostics were required trailing-underscore header guards and two were `const` parameter classifications; zero other naming diagnostics. | -| Read-only production Doxygen/header-guard and test-tag scan | 0 | 0.302s | 63 production headers, 0 missing guards, 0 missing Doxygen-contract headers, and 0 test files with imposed Doxygen tags. | -| `.hpp` scan under `include src tests` | 0 | 0.162s | `LEGACY_HPP_COUNT: 0`; `rg` returned 1 for empty result but count-based AC passed. | -| Required dependency path check | 0 | 0.165s | All four declared dependency paths found. | -| `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 | 6.204s | Configure/generate complete; MKL 2026.1.0 found; build files written to `.harness/build`. | -| `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | 9.639s | `fesa_solver.lib`, `fesa_integration_tests.exe`, `fesa_reference_tests.exe`, and `fesa_unit_tests.exe` built. | -| `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 0.235s | `DISCOVERED_TEST_COUNT: 206`. | -| `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 9.908s | `100% tests passed out of 206`; labels: unit 182, integration 11, reference 13. | -| `ctest --test-dir .harness/build -C Debug -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | 1.260s | `100% tests passed out of 3`. | -| `git diff --check` | 0 | 0.199s | ``. | - -## Validation results - -| Validation | Result | -| --- | --- | -| Harness Python/policy tests | Pass in clean child process: 21/21. | -| LLVM tool availability/config | Pass. | -| clang-format repository dry-run | Pass: 163 files. | -| clang-tidy selected public-header check | Pass: 46 headers, exit 0, zero naming diagnostics outside the two documented contract exceptions. | -| Production Doxygen/header-guard policy | Pass: 63/63 headers; tests contain no imposed Doxygen boilerplate tags. | -| Header extension policy | Pass: 0 `.hpp` under `include`, `src`, `tests`. | -| Fresh MSVC x64 Debug configure | Pass. | -| MSVC x64 Debug build | Pass: `fesa_tests`. | -| CTest discovery | Pass: 206 tests. | -| Full CTest | Pass: 206/206. | -| Approved reference suites | Pass: 3/3. | -| Reference tree no-change | Pass before and after compare: `git diff --exit-code 1e5758f -- reference` exit 0. | - -## Failure classification and failed test inventory - -Blocking classification: `none`. - -Nonblocking diagnostics: - -- `environment`: inherited `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` caused the raw pytest command to fail one default-sandbox test. The same pytest command passed 21/21 in a child process with only that override removed. -- `style`: initial clang-format dry-run reported four whitespace/line-ending findings. Formatting normalization introduced no tracked source-content diff, and the rerun passed. -- `static-policy`: clang-tidy reported header-guard trailing underscores and two - `const` parameters because its generic macro/constant categories differ from the - higher-priority FESA guard and parameter conventions. It reported no other naming - diagnostics, and the required command exited 0. - -Failed blocking tests after clean verification: none. - -## Handoff recommendation - -Proceed to Physics Evaluation Agent. Build/test evidence is sufficient for the final -Implementation-owned gate; no compile, link, test, reference-comparison, or -environment blocker remains. - -## No-change assertion - -No production behavior, reference artifact, reference tolerance, comparator contract, -or generated Doxygen output was changed in Step 24. - -## Open issues - -None blocking. diff --git a/docs/cpp-object-oriented-modular-refactoring/implementation-plan.md b/docs/cpp-object-oriented-modular-refactoring/implementation-plan.md deleted file mode 100644 index d34710c..0000000 --- a/docs/cpp-object-oriented-modular-refactoring/implementation-plan.md +++ /dev/null @@ -1,410 +0,0 @@ -# C++ Object-Oriented Modular Refactoring Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use -> `superpowers:subagent-driven-development` (recommended) or -> `superpowers:executing-plans` to implement this plan task-by-task. Steps use -> checkbox (`- [ ]`) syntax for tracking. -> -> In FESA, those task-by-task semantics are mediated by the project Harness. Do not -> invoke an implementation skill or select a Step directly; a separate user request -> must start `scripts/execute.py`, which selects exactly one pending Step. - -**Goal:** Preserve the current B33, MITC4, and linear-static numerical and external -contracts while converting the FESA C++ production code to explicit object-oriented -boundaries, focused modules, shared utilities, Google C++ style, and production-only -Doxygen documentation. - -**Architecture:** Domain owns immutable polymorphic semantic definitions through -`std::unique_ptr` and stable `EntityIndex` positions. `ElementDefinition` remains -separate from runtime numerical `Element`, and load, boundary-condition, analysis, -material, and property abstractions each have independent hierarchies. Existing -deterministic assembly, result identity, HDF5 schema, and reference comparison -contracts remain unchanged. - -**Tech Stack:** C++17, MSVC x64 Debug, CMake, CTest, GoogleTest, Intel oneMKL, -Intel oneTBB, HDF5, clang-format, clang-tidy, and optional Doxygen configuration. - -## Global Constraints - -- Follow `/docs/CODINGSTYLE.md` and the official Google C++ Style Guide baseline. -- Use PascalCase for every C++ function and accessor; use `.h` production headers - with full-path include guards; retain `.cpp` as the FESA source-file exception. -- Add Doxygen comments only to production code. Do not add Doxygen coverage to tests. -- Keep C++17 and MSVC x64 Debug compatibility and add no compiler warnings under - `/W4 /WX`. -- Preserve the approved B33 and MITC4 formulations, signs, units, coordinate systems, - reduction order, result row identity, HDF5 schema, tolerances, and reference files. -- Do not implement MITC3, solid elements, dynamics, eigenvalue analysis, response - spectrum, random vibration, density, plasticity, anisotropy, distributed load, body - force, or MPC behavior. -- Do not expose MKL, TBB, HDF5, Win32, or vendor integer types from public solver-core - headers. -- Every C++ production change requires a related C++ test and an in-Step - `RED -> observed failure -> minimal GREEN -> focused/full VERIFY` cycle. -- Do not run `scripts/execute.py` until the user gives a separate explicit execution - request. -- Doxygen comments and `Doxyfile` configuration are in scope; generated Doxygen - output is deferred and is not a blocking command for this phase. - ---- - -## 1. Metadata - -| Field | Value | -| --- | --- | -| `feature_id` | `cpp-object-oriented-modular-refactoring` | -| `source_requirement` | `/docs/superpowers/specs/2026-08-16-cpp-object-oriented-modular-refactoring-design.md` | -| `source_research` | Existing repository duplication and ownership audit captured by the approved design; no new FEM research is required | -| `source_formulation` | `/docs/linear-static-3d-euler-beam/formulation.md`; `/docs/linear-static-mitc4-shell/formulation.md` | -| `source_numerical_review` | `/docs/linear-static-3d-euler-beam/numerical-review.md`; `/docs/linear-static-mitc4-shell/numerical-review.md` | -| `source_io_definition` | `/docs/linear-static-3d-euler-beam/io.md`; `/docs/linear-static-mitc4-shell/io.md` | -| `source_reference_models` | `/docs/linear-static-3d-euler-beam/reference-model.md`; `/docs/linear-static-mitc4-shell/reference-model.md` | -| `status` | `ready-for-implementation` | -| `owner_agent` | `implementation-planning-agent` | -| `date` | `2026-08-16` | - -## 2. Readiness Check - -- The written refactoring design and the 25-Step draft were explicitly approved on - 2026-08-16. -- B33 and MITC4 requirements, formulations, numerical reviews, I/O projections, and - reference contracts already exist and remain upstream read-only inputs. -- Required reference inputs and CSVs are present under - `/reference/cantilever beam/` and `/reference/shell/`. -- `clang-format.exe` and `clang-tidy.exe` are present at - `C:/Program Files/LLVM/bin/`; the current long-lived process PATH need not contain - that directory because the plan uses the absolute paths. -- Doxygen generation is intentionally deferred by user decision. The implementation - still adds production comments and a warning-strict `Doxyfile` for later use. -- No missing formulation, tolerance, HDF5 projection, or artifact decision prevents - implementation planning. - -## 3. Implementation Scope - -### Included - -- Repository policy/tooling and Implementation Agent enforcement. -- Mechanical `.hpp` to `.h`, header guard, PascalCase, formatting, and production - Doxygen conversion in reviewable module slices. -- Shared `Vector3`, dense-BLAS internal adapter, ASCII utilities, - `SourceTargetResolver`, and owner-based DOF invariant validation. -- Independent abstract boundaries for material, element property, semantic element - definition, runtime element, load, boundary condition, and analysis. -- Current concrete B33, MITC4, isotropic linear elasticity, beam/shell property, - concentrated nodal load, prescribed displacement, and linear-static behavior. -- Responsibility-based splits of domain mapping, result recovery, and HDF5 writing. -- Full MSVC/CTest and existing B33/MITC4 external reference verification. - -### Excluded and non-goals - -- New physics, input keywords, output datasets, tolerances, reference artifacts, or - runtime performance optimization. -- A common root base shared by unrelated element, load, material, and analysis types. -- A giant material interface containing density, plasticity, and anisotropy options. -- Registry/plugin frameworks, global static registration, speculative `Clone()`, or - unnecessary shared ownership. - -## 4. Refactoring Requirements - -| ID | Requirement | -| --- | --- | -| `R-PRESERVE-001` | Current B33/MITC4/linear-static numerical and external results shall remain unchanged within their approved contracts. | -| `R-STYLE-001` | Production and test C++ shall use approved Google-style naming and formatting; production headers shall use `.h` and header guards. | -| `R-DOC-001` | Production functions and classes shall carry useful Doxygen contracts; tests shall not require Doxygen comments. | -| `R-DUP-001` | Repeated fixed-size 3D vector operations shall be implemented once by `Vector3`. | -| `R-DUP-002` | Repeated dense-BLAS conversion/copy, ASCII/source resolution, and DOF invariant logic shall have one owner. | -| `R-MODEL-001` | Material, element-property, and element-definition semantic objects shall have independent abstractions and Domain-owned stable lifetime. | -| `R-ELEMENT-001` | Semantic `ElementDefinition` and runtime numerical `Element` shall remain separate and be connected by a fail-closed factory. | -| `R-PIPELINE-001` | DofManager, SparseAssembler, and ResultRecovery shall consume runtime `Element` interfaces without scattered B33/MITC4 type branches. | -| `R-LOAD-001` | A `Load` shall emit ordered contributions and only `LoadAssembler` shall accumulate the global vector. | -| `R-BC-001` | A `BoundaryCondition` shall emit definitions and an essential-constraint policy shall enforce prescribed displacement. | -| `R-ANALYSIS-001` | `Analysis` shall expose only `Run()` and `LinearStaticAnalysis` shall own its approved lifecycle. | -| `R-MODULE-001` | Domain mapping, recovery, and HDF5 writing shall be split by their approved responsibilities. | -| `R-AGENT-001` | Implementation Agent shall read `/docs/CODINGSTYLE.md` as a mandatory global input. | -| `R-SCOPE-001` | No excluded future feature or runtime-performance change shall be introduced. | - -## 5. Work Breakdown - -| Task | Name | Depends on | Deliverable | -| --- | --- | --- | --- | -| `T00` | coding-style-agent-contract | none | Agent profile and Python contract enforce `CODINGSTYLE.md`. | -| `T01` | cpp-style-tooling | `T00` | clang-format/tidy configuration and deferred Doxygen configuration. | -| `T02` | architecture-boundaries | `T00` | Architecture and ADR record the approved responsibility graph. | -| `T03` | foundation-google-style | `T01` | Core/math/linear-solver APIs use the approved style. | -| `T04` | model-element-google-style | `T03` | Model and current element APIs use the approved style. | -| `T05` | solver-workflow-google-style | `T04` | FEM/assembly/constraint/analysis/result APIs use the approved style. | -| `T06` | io-application-google-style | `T05` | I/O, application, and test helper APIs use the approved style. | -| `T07` | vector3-value-type | `T03` | Tested fixed-size vector value type. | -| `T08` | element-geometry-vector3 | `T04`, `T07` | Element/model geometry duplicate helpers removed. | -| `T09` | result-io-vector3 | `T06`, `T08` | Result/I/O vector duplicate helpers removed. | -| `T10` | dense-blas-adapter | `T03` | Matrix/Vector share private MKL conversion and copy helpers. | -| `T11` | source-target-resolver | `T06` | Shared ASCII and source-target resolution module. | -| `T12` | material-property-hierarchy | `T04` | Independent semantic material and property abstractions. | -| `T13` | element-definition-domain | `T11`, `T12` | Domain-owned polymorphic semantic element definitions. | -| `T14` | runtime-element-factory | `T08`, `T13` | Runtime element abstraction and fail-closed factory. | -| `T15` | generic-dof-manager | `T14` | DofManager consumes element DOF layouts and owns invariant checks. | -| `T16` | generic-sparse-assembler | `T15` | SparseAssembler consumes element stiffness contributions. | -| `T17` | generic-result-recovery | `T16` | ResultRecovery consumes element result bundles. | -| `T18` | load-hierarchy | `T11`, `T15` | Ordered load contribution hierarchy. | -| `T19` | boundary-condition-policy | `T15` | Constraint definition hierarchy and essential policy. | -| `T20` | analysis-hierarchy | `T17`, `T18`, `T19` | Minimal Analysis base and unchanged linear-static lifecycle. | -| `T21` | domain-mapper-modules | `T11`, `T13`, `T18`, `T19` | Mapper split by semantic responsibility. | -| `T22` | result-recovery-modules | `T17` | Recovery split into global, beam, shell, and commit responsibilities. | -| `T23` | hdf5-writer-modules | `T17`, `T22` | HDF5 writer split without schema changes. | -| `T24` | final-quality-reference-gate | all prior tasks | Full style, build/test, HDF5, determinism, and reference evidence. | - -Each task maps one-to-one to `/phases/cpp-object-oriented-modular-refactoring/stepN.md`. - -## 6. TDD Test Plan - -| Test ID | First failing evidence | GREEN evidence | -| --- | --- | --- | -| `P-AGENT-001` | Python contract reports missing mandatory `CODINGSTYLE.md` input. | Agent workflow contract passes. | -| `P-STYLE-001` | Policy test reports missing or incorrect clang/Doxygen configuration. | Policy and full Harness Python tests pass. | -| `C-STYLE-001..004` | Test includes/calls use `.h` and PascalCase before production conversion, causing a compile failure. | Focused module suites and full CTest pass. | -| `C-VEC3-001` | `vector3_test.cpp` cannot compile because `Vector3` is absent. | Arithmetic, finite, and normalization-boundary tests pass. | -| `C-DUP-001..004` | Tests reference the new shared seam before it exists. | Shared seam passes and old duplicate helper definitions are absent by `rg` checks. | -| `C-MODEL-001..002` | Polymorphic ownership and const stable-index tests fail before semantic bases exist. | Material/property/definition tests and Domain mapping tests pass. | -| `C-ELEMENT-001` | Base-interface creation and incompatibility tests fail before `ElementFactory`. | B33/MITC4 creation, rejection, stiffness, and recovery tests pass. | -| `C-DOF-001` | Fake runtime element layout is not accepted by DofManager. | Stable scatter/pattern and invariant tests pass. | -| `C-ASSEMBLY-001` | Fake runtime contribution is not assembled. | Serial/TBB/repeated CSR outputs remain byte-identical. | -| `C-RECOVERY-001` | Fake result bundle cannot flow through recovery. | Beam/shell identities, signs, energy, and atomic rollback pass. | -| `C-LOAD-001` | A fake Load cannot emit ordered full-DOF contributions. | Source-order accumulation and current load validation pass. | -| `C-BC-001` | A fake BoundaryCondition cannot resolve constraint definitions. | Nonzero prescribed displacement and reconstruction pass. | -| `C-ANALYSIS-001` | LinearStaticAnalysis cannot be invoked through `Analysis`. | Approved factorization/load/solve/recovery lifecycle passes. | -| `C-MODULE-001..003` | Tests reference extracted mapper/recovery/HDF5 responsibilities before their seams exist. | Existing public behavior and atomicity suites pass after extraction. | -| `C-REF-B33-001` | No new intentional failure; final gate reuses the approved external comparison. | B33 comparison passes under its existing component-scale tolerance. | -| `C-REF-MITC4-001` | No new intentional failure; final gate reuses the approved external comparison. | MITC4 translations pass at fixed `1.0e-5`; rotations remain warning-only. | - -RED and GREEN evidence, command, exit code, duration, output tail, and failed test names -must be recorded during execution in the Implementation-owned reports. A final reference -gate does not manufacture an artificial RED because it verifies an unchanged approved -external contract after all refactoring tasks. - -## 7. CMake/CTest Plan - -- Keep the existing `fesa_solver`, `fesa_cli`, `fesa_unit_tests`, - `fesa_integration_tests`, `fesa_reference_tests`, and `fesa_tests` targets. -- Register new production/test files in `/src/fesa/CMakeLists.txt` and - `/tests/CMakeLists.txt` in their owning task. -- Do not create a new test executable or change existing test labels. -- `.harness/config.json` is absent, so use `.harness/build`, MSVC x64, Debug, and the - explicit local dependency paths recorded in each Step. -- Every C++ task runs a focused CTest regular expression and the full CTest discovery - and execution sequence. -- Step `T24` performs a fresh configure and the final B33/MITC4 reference tests. - -## 8. Candidate Files and Ownership - -| Responsibility | Candidate files | -| --- | --- | -| Policy/tooling | `.codex/agents/implementation-agent.toml`, `.clang-format`, `.clang-tidy`, `Doxyfile`, `tests/test_agent_skill_workflow_contract.py`, `tests/test_cpp_policy_contract.py` | -| Fixed/dynamic math | `include/fesa/math/vector3.h`, `include/fesa/math/vector.h`, `include/fesa/math/matrix.h`, `src/fesa/math/dense_blas_internal.h`, matching `.cpp` and unit tests | -| Semantic material/property | `include/fesa/materials/*.h`, `include/fesa/properties/*.h`, `src/fesa/materials/*.cpp`, `src/fesa/properties/*.cpp`, matching unit tests | -| Semantic element definitions | `include/fesa/elements/element_definition.h`, concrete definition headers, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp` | -| Runtime elements | `include/fesa/elements/element.h`, `element_factory.h`, existing B33/MITC4 kernels and new factory implementation/tests | -| Source resolution | `include/fesa/model/source_target_resolver.h`, `src/fesa/model/source_target_resolver.cpp`, focused tests | -| Solver consumers | DofManager, SparseAssembler, ResultRecovery headers/sources/tests | -| Loads | `include/fesa/loads/load.h`, `concentrated_nodal_load.h`, sources, LoadAssembler and tests | -| Constraints | `boundary_condition.h`, `prescribed_displacement.h`, `essential_constraint_policy.h`, sources and tests | -| Analysis | `analysis.h`, `linear_static_analysis.h`, sources and integration tests | -| Mapper split | focused private mapper modules under `src/fesa/io/abaqus/` with one public `domain_mapper.h` facade | -| Recovery split | focused modules under `src/fesa/results/` with one public `result_recovery.h` facade | -| HDF5 split | private modules under `src/fesa/io/hdf5/` with one public `hdf5_results_writer.h` facade | - -These are implementation candidates, not permission to introduce extra public API. Each Step -must choose the minimum files consistent with the approved boundaries. - -## 9. Candidate Interface Contracts - -The implementation may refine parameter carrier names while preserving these semantic contracts: - -```cpp -struct AnalysisRequest { - std::filesystem::path input_path; - std::filesystem::path output_path; -}; - -class Analysis { - public: - virtual ~Analysis() = default; - virtual Status Run(const AnalysisRequest& request) = 0; -}; - -class ElementDefinition { - public: - virtual ~ElementDefinition() = default; - virtual ElementDefinitionKind Kind() const noexcept = 0; - virtual const SourceEntityId& SourceId() const noexcept = 0; - virtual const std::vector& NodeIndices() const noexcept = 0; - virtual EntityIndex PropertyIndex() const noexcept = 0; -}; - -class Element { - public: - virtual ~Element() = default; - virtual const ElementDofLayout& DofLayout() const noexcept = 0; - virtual Result ComputeStiffness() const = 0; - virtual Result Recover( - const Vector& full_displacement) const = 0; -}; - -class Load { - public: - virtual ~Load() = default; - virtual Result> ComputeContributions( - const LoadContext& context) const = 0; -}; - -class BoundaryCondition { - public: - virtual ~BoundaryCondition() = default; - virtual Result> ResolveConstraints( - const BoundaryConditionContext& context) const = 0; -}; -``` - -Do not add future-only methods to these bases. Factory compatibility may use a centralized, -explicit kind discriminator followed by a checked concrete access; consumers must not scatter -`dynamic_cast` or B33/MITC4 switches. - -## 10. Data Flow Contract - -```text -existing Abaqus .inp - -> syntax reader - -> responsibility-split semantic mappers - -> immutable Domain-owned definitions - -> AnalysisModel non-owning active view - -> ElementFactory runtime elements - -> DofManager / deterministic assembly / constraints - -> LinearStaticAnalysis - -> result recovery candidate and validation - -> authoritative results.h5 atomic commit - -> test-only deterministic projection - -> existing Abaqus CSV comparison by source identity and component -``` - -- B33 input and CSVs remain under `/reference/cantilever beam/` with their current - names and component-scale tolerance. -- Blocking MITC4 S4 input/displacement CSV remains under `/reference/shell/` with - fixed absolute tolerance `1.0e-5` for U1/U2/U3 and warning-only UR1/UR2/UR3. -- `/reference/shellR/` is not promoted into a blocking comparison. -- No reference artifact is renamed, rewritten, regenerated, or normalized. - -## 11. Acceptance Traceability Matrix - -| Requirement | Tasks | Tests/evidence | Acceptance | -| --- | --- | --- | --- | -| `R-PRESERVE-001` | `T03..T24` | all current suites, `C-REF-B33-001`, `C-REF-MITC4-001` | Full CTest and blocking references pass. | -| `R-STYLE-001` | `T01`, `T03..T06`, `T24` | `P-STYLE-001`, clang-format, clang-tidy config, legacy-header scan | Style commands and full build pass. | -| `R-DOC-001` | `T03..T24` | policy scan and configured warning-strict Doxyfile | Production comments exist; tests are excluded. | -| `R-DUP-001` | `T07..T09` | `C-VEC3-001`, element/result/I/O suites, duplicate scan | One Vector3 implementation remains. | -| `R-DUP-002` | `T10`, `T11`, `T15` | `C-DUP-001..004` | Shared owners pass focused tests. | -| `R-MODEL-001` | `T12`, `T13` | `C-MODEL-001..002` | Polymorphic stable ownership passes. | -| `R-ELEMENT-001` | `T13`, `T14` | `C-ELEMENT-001` | Factory creates current kinds and rejects incompatible combinations. | -| `R-PIPELINE-001` | `T15..T17` | `C-DOF-001`, `C-ASSEMBLY-001`, `C-RECOVERY-001` | Generic consumer and deterministic tests pass. | -| `R-LOAD-001` | `T18` | `C-LOAD-001` | Ordered accumulation and current validations pass. | -| `R-BC-001` | `T19` | `C-BC-001` | Prescribed displacement partition/reconstruction passes. | -| `R-ANALYSIS-001` | `T20` | `C-ANALYSIS-001` | Lifecycle and factorization count pass. | -| `R-MODULE-001` | `T21..T23` | `C-MODULE-001..003` | Facade behavior and atomicity suites pass. | -| `R-AGENT-001` | `T00` | `P-AGENT-001` | Python workflow contract passes. | -| `R-SCOPE-001` | every task | diff review and final reference/artifact checks | No excluded behavior or artifact change appears. | - -## 12. Validation Commands - -Harness Python and policy validation: - -```powershell -uv run --with pytest python -m pytest -v -rs -& "C:/Program Files/LLVM/bin/clang-format.exe" --version -& "C:/Program Files/LLVM/bin/clang-tidy.exe" --version -& "C:/Program Files/LLVM/bin/clang-tidy.exe" --verify-config -``` - -MSVC clean configure and full verification: - -```powershell -$requiredBuildPaths = @( - "C:/git/googletest", - "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl", - "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb", - "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake" -) -foreach ($requiredBuildPath in $requiredBuildPaths) { - if (-not (Test-Path -LiteralPath $requiredBuildPath)) { - throw "Missing $requiredBuildPath" - } -} -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" -cmake --build .harness/build --config Debug --target fesa_tests -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -ctest --test-dir .harness/build -C Debug ` - -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure -``` - -Repository style and artifact checks: - -```powershell -$cppFiles = @(rg --files include src tests -g "*.h" -g "*.cpp") -& "C:/Program Files/LLVM/bin/clang-format.exe" --dry-run --Werror $cppFiles -$publicHeaders = @(rg --files include/fesa -g "*.h") -foreach ($publicHeader in $publicHeaders) { - & "C:/Program Files/LLVM/bin/clang-tidy.exe" --config-file=.clang-tidy ` - $publicHeader -- -x c++ -std=c++17 -Iinclude - if ($LASTEXITCODE -ne 0) { - throw "clang-tidy failed for $publicHeader" - } -} -$legacyHeaders = @(rg --files include tests -g "*.hpp") -if ($legacyHeaders.Count -ne 0) { - $legacyHeaders - throw "Legacy .hpp headers remain" -} -git diff --exit-code 1e5758f -- reference -``` - -Doxygen generation is deliberately absent from the blocking commands. When the user -requests documentation generation later, execute `doxygen Doxyfile` and treat warnings -as failures without committing generated HTML. - -## 13. Risks and Downstream Handoff - -- Global API/header renaming has a wide compile blast radius. Mechanical style Steps - are isolated from semantic restructuring to keep failures attributable. -- Domain polymorphism can accidentally destabilize vector indices or lifetimes. Tests - must prove insertion order, const access, and AnalysisModel non-owning lifetime. -- Virtual element recovery can tempt a giant result record. Preserve distinct beam and - shell rows in a backend-neutral bundle rather than adding meaningless common fields. -- Moving vector helpers can change floating-point operation order. Preserve each - formulation expression order and use exact regression where no approved tolerance - applies. -- File splits can leak vendor dependencies through public headers. Keep all HDF5/MKL/TBB - types in private implementation modules. - -Downstream handoff is one bounded handoff to `implementation-agent` through the -Coordinator: execute only the Executor-selected `stepN.md`, read `/docs/CODINGSTYLE.md` -before C++ work, record RED/GREEN/VERIFY evidence, and do not advance another Step. - -## 14. Harness Step Draft - -- Task name: `cpp-object-oriented-modular-refactoring` -- Steps: `step0.md` through `step24.md` in dependency order shown in Work Breakdown. -- Every Step contains its own prerequisite files, test-first failure, candidate - interfaces, exact focused/full commands, and prohibitions. -- Stop conditions are an upstream contract conflict, a missing declared artifact at - final comparison, an unresolved environment dependency, or repeated build/test - failure. In each case only the current Step status payload is changed. -- Planning approval materializes these files but does not authorize - `python scripts/execute.py cpp-object-oriented-modular-refactoring`. - -## 15. Open Issues - -- No blocking architecture, formulation, I/O, reference, or tolerance issue remains. -- Doxygen executable use and generated documentation are deferred by explicit user - decision; this does not waive production Doxygen comments or `Doxyfile` configuration. diff --git a/docs/cpp-object-oriented-modular-refactoring/implementation-report.md b/docs/cpp-object-oriented-modular-refactoring/implementation-report.md deleted file mode 100644 index e400a54..0000000 --- a/docs/cpp-object-oriented-modular-refactoring/implementation-report.md +++ /dev/null @@ -1,120 +0,0 @@ -# C++ Object-Oriented Modular Refactoring Implementation Report - -## Metadata - -- feature_id: `cpp-object-oriented-modular-refactoring` -- owner_agent: `implementation-agent` -- final_step: `24 final-quality-reference-gate` -- source_plan: `docs/cpp-object-oriented-modular-refactoring/implementation-plan.md` -- phase_index: `phases/cpp-object-oriented-modular-refactoring/index.json` -- evidence_date: `2026-08-16` -- head: `f84ebb541f4717ab8300cf0d80497e1277d3bb48` -- reference_baseline: `1e5758f3e482fae4c3d58cac680abe0aac02e549` -- classification: `pass-for-physics-evaluation` - -## Scope and no-change assertion - -Step 24 added no production behavior, no comparator/tolerance changes, and no -reference artifact changes. The only implementation-owned source action during this -step was running `clang-format -i` on four files that the dry-run style gate reported; -`git diff --raw`, `git diff --numstat`, and `git diff --check` for those files were -empty after the run, so no tracked source-content diff was introduced. - -No Doxygen executable, hook entry point, `scripts/execute.py`, Abaqus, Nastran, -reference solver, commit, or push was run. - -## Prior Step RED/GREEN/VERIFY evidence - -The final gate reviewed the Executor-recorded Step 0-23 summaries. Each prior step is -already `completed` in the phase index and retains its Executor-owned timestamps. - -| Step | Task | Evidence summary | -| ---: | --- | --- | -| 0 | `coding-style-agent-contract` | RED missing mandatory `CODINGSTYLE.md`; GREEN/VERIFY pytest 13/13, clean-env pytest 20/20, VS18 Debug build and CTest 144/144. | -| 1 | `cpp-style-tooling` | RED missing style/Doxygen config; GREEN/VERIFY policy pytest, clean-env pytest 21/21, LLVM 22.1.8 config checks, VS18 Debug build, CTest 144/144. | -| 2 | `architecture-boundaries` | Documentation-only architecture/ADR update; contract grep, diff check, MSVC Debug build, CTest discovery and 144/144 passed. | -| 3 | `foundation-google-style` | RED missing `.h` header; GREEN/VERIFY focused build/CTest 22/22, format, full build, CTest 144/144. | -| 4 | `model-element-google-style` | RED missing model `.h`; GREEN/VERIFY focused build/CTest 37/37, format 14 files, full build, CTest 144/144. | -| 5 | `solver-workflow-google-style` | RED missing analysis model `.h`; GREEN/VERIFY focused build/CTest 57/57, format 31 files, full build, CTest 144/144. | -| 6 | `io-application-google-style` | RED missing input reader `.h`; GREEN/VERIFY focused I/O/HDF5/app/reference CTest 36/36, format 23 files, full build, CTest 144/144. | -| 7 | `vector3-value-type` | RED missing `vector3.h`; GREEN/VERIFY Vector3 tests 7/7, format/tidy, full build, CTest 151/151. | -| 8 | `element-geometry-vector3` | RED typed Vector3 seam compile failure; GREEN/VERIFY focused CTest 44/44, duplicate scan 0, format, full build, CTest 155/155. | -| 9 | `result-io-vector3` | RED duplicate helpers; GREEN/VERIFY ResultRecovery/InpDomainMapping/HDF5 33/33, duplicate scan 0, format, full build, CTest 156/156. | -| 10 | `dense-blas-adapter` | RED missing dense BLAS internal header; GREEN/VERIFY focused CTest 4/4, public vendor scan 0, format, full build, CTest 158/158. | -| 11 | `source-target-resolver` | RED missing ASCII/source-target modules and plus-label failure; GREEN/VERIFY targeted/focused tests 44/44, helper scan, format, full build, CTest 164/164. | -| 12 | `material-property-hierarchy` | RED missing material/property bases; GREEN/VERIFY focused CTest 11/11, format, full build, CTest 170/170. | -| 13 | `element-definition-domain` | RED missing element definition/ownership APIs; GREEN/VERIFY focused CTest 20/20, format, full build, CTest 172/172. | -| 14 | `runtime-element-factory` | RED missing runtime element API; GREEN/VERIFY focused CTest 35/35, dynamic_cast scan 0, format, full build, CTest 176/176. | -| 15 | `generic-dof-manager` | RED fake element/layout seam failures; GREEN/VERIFY focused CTest 21/21, concrete/helper branches 0, format, full build, CTest 178/178. | -| 16 | `generic-sparse-assembler` | RED fake runtime contribution seam missing; GREEN/VERIFY SparseAssembly 9/9, concrete branch count 0, format, full build, CTest 179/179. | -| 17 | `generic-result-recovery` | RED missing generic recovery seam; GREEN/VERIFY focused CTest 53/53, concrete branch count 0, format, full build, CTest 182/182. | -| 18 | `load-hierarchy` | RED missing Load APIs; GREEN/VERIFY focused CTest 29/29, format, full build, CTest 186/186. | -| 19 | `boundary-condition-policy` | RED missing BoundaryCondition APIs; GREEN/VERIFY focused CTest 29/29, format, full build, discovery/full CTest 191/191. | -| 20 | `analysis-hierarchy` | RED missing `analysis.h`; GREEN/VERIFY focused CTest 12/12, scans, full build, discovery/full CTest 193/193. | -| 21 | `domain-mapper-modules` | RED missing private mapper seam; GREEN/VERIFY focused CTest 17/17, format, full build, CTest 197/197. | -| 22 | `result-recovery-modules` | RED missing recovery component seam; GREEN/VERIFY focused CTest 28/28, format, full build, CTest 203/203. | -| 23 | `hdf5-writer-modules` | RED missing HDF5 component seam; GREEN/VERIFY focused schema/atomicity CTest 13/13, scans, format, full build, CTest 206/206. | - -Step 24 is a final verification gate and did not manufacture a new RED condition; -it reused the approved B33 and MITC4 reference comparisons after style and full -build/test verification. - -## Step 24 command evidence - -| Stage | Command | Exit | Duration | Result | -| --- | --- | ---: | ---: | --- | -| Environment diagnostic | `uv run --with pytest python -m pytest -v -rs` with inherited `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` | 1 | 2.700s | Environment-specific failure: default-sandbox test observed the explicit override. | -| Policy verify | `Remove FESA_HARNESS_CODEX_SANDBOX` in child process; `uv run --with pytest python -m pytest -v -rs` | 0 | 0.751s | 21/21 passed. | -| Tool verify | `& "C:/Program Files/LLVM/bin/clang-format.exe" --version` | 0 | 0.026s | clang-format 22.1.8. | -| Tool verify | `& "C:/Program Files/LLVM/bin/clang-tidy.exe" --version` | 0 | 0.030s | clang-tidy 22.1.8. | -| Tool verify | `& "C:/Program Files/LLVM/bin/clang-tidy.exe" --verify-config` | 0 | 0.028s | No config errors. | -| Style RED | `clang-format --dry-run --Werror` over 163 files | 1 | 0.892s | Four whitespace/line-ending format findings. | -| Style normalization | `clang-format -i` on the four reported files | 0 | tool wall 0.5s | No tracked content diff after formatting normalization. | -| Style verify | `clang-format --dry-run --Werror` over 163 files | 0 | 0.888s | Passed. | -| Public-header policy | `clang-tidy --config-file=.clang-tidy
-- -x c++ -std=c++17 -Iinclude` over 46 public headers | 0 | 41.822s | Passed. The 47 naming diagnostics were 45 required trailing-underscore header guards and two `const` parameter classifications; there were zero other naming diagnostics. | -| Doxygen/header-guard policy | Read-only scan of production headers and test Doxygen tags | 0 | 0.302s | 63/63 production headers had guards and Doxygen contracts; 0 test files contained imposed Doxygen tags. | -| Header extension | `.hpp` scan under `include src tests` | 0 | 0.162s | 0 legacy `.hpp` files. | -| Dependency precheck | Test declared GoogleTest/MKL/TBB/HDF5 paths | 0 | 0.165s | All paths found. | -| Fresh configure | `cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ...` | 0 | 6.204s | MSVC 19.51, VS18, build files generated. | -| Build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | 9.639s | Debug aggregate test target built. | -| Discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 0.235s | 206 tests discovered. | -| Full test | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 9.908s | 206/206 passed. | -| Artifact check | Exact declared artifact existence, SHA-256, line/row inventory | 0 | 0.218s | Six declared files present. | -| Artifact no-change | `git diff --exit-code 1e5758f -- reference` | 0 | 0.165s | No reference diff. | -| Artifact schema | Read-only type/header/key/finite precheck | 0 | 0.266s | B33/S4 type present; CSV headers/keys/finite checks passed. | -| Compare | `ctest --test-dir .harness/build -C Debug -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | 1.260s | 3/3 approved reference tests passed. | -| Generated result check | Required `results.h5` existence and hashes | 0 | 0.218s | B33 and MITC4 comparison `results.h5` present. | -| Post no-change | `git diff --exit-code 1e5758f -- reference` | 0 | 0.179s | No reference diff after compare. | -| Whitespace check | `git diff --check` | 0 | 0.199s | No whitespace errors. | - -## Requirement traceability - -| Requirement | Final-gate evidence | -| --- | --- | -| `R-PRESERVE-001` | Full CTest 206/206, B33 comparison 176/176 rows passed, MITC4 S4 comparison 147/147 blocking U rows passed; no tolerance/comparator/reference diff. | -| `R-STYLE-001` | `.h` header scan passed with zero `.hpp`; clang-format passed over 163 files; clang-tidy selected public-header check passed over 46 headers. | -| `R-DOC-001` | Policy pytest passed; 63/63 production headers had header guards and Doxygen contracts, while 0 test files contained imposed Doxygen tags. Doxygen generation was intentionally not run. | -| `R-DUP-001` | Step 7-9 summaries record the shared `Vector3`, element/result/I/O preservation tests, and duplicate-definition scans with zero remaining local definition families; full CTest 206/206 passed. | -| `R-DUP-002` | Steps 10, 11, and 15 record the single dense-BLAS adapter, shared ASCII/source resolver, and DofManager-owned invariant logic with focused tests and helper/branch scans; full CTest 206/206 passed. | -| `R-MODEL-001` | Steps 12-13 record polymorphic Material/ElementProperty/ElementDefinition ownership and stable Domain views; focused ownership tests and full CTest passed. | -| `R-ELEMENT-001` | Step 14 records semantic/runtime separation, fail-closed factory compatibility checks, virtual destruction, owner-bounded views, and zero `dynamic_cast` uses; full CTest passed. | -| `R-PIPELINE-001` | Steps 15-17 record generic DofManager, SparseAssembler, and ResultRecovery seams with fake runtime elements, deterministic/atomic tests, and zero concrete B33/MITC4 consumer branches; full CTest passed. | -| `R-LOAD-001` | Step 18 records Domain-owned Load objects, ordered contributions, validation-before-candidate accumulation, and focused LoadAssembler tests; full CTest passed. | -| `R-BC-001` | Step 19 records BoundaryCondition definitions and stable essential-constraint partition/reconstruction, including nonzero and `0 x 0 Kff` cases; full CTest passed. | -| `R-ANALYSIS-001` | Step 20 records minimal base `Run()` dispatch and procedure-owned lifecycle tests, including factorize-before-load, exactly-one factorization, all-constrained solve, and writer suppression on recovery failure; full CTest passed. | -| `R-MODULE-001` | Steps 21-23 record the approved Domain-mapper, result-recovery, and HDF5 private component splits with facade, diagnostic, identity, rollback, self-check, and atomic-finalization tests; full CTest passed. | -| `R-AGENT-001` | Step 0 records the mandatory `docs/CODINGSTYLE.md` implementation-agent contract; the final clean-environment policy suite passed 21/21. | -| `R-SCOPE-001` | No production behavior or future-feature changes in Step 24; reference tree diff against `1e5758f` is empty. | - -All acceptance traceability rows from the approved implementation plan are listed -above. Their owning task rows `T00..T23` retain the recorded RED/GREEN/VERIFY -summaries, and `T24` supplies the final style, build, CTest, artifact, HDF5, -comparison, and no-change evidence. - -## Handoff - -Implementation gate verdict: `pass-for-physics-evaluation`. - -Open issues: none blocking. The inherited `FESA_HARNESS_CODEX_SANDBOX` override is an -environment note only; the clean child-process policy command passed without code -changes. diff --git a/docs/cpp-object-oriented-modular-refactoring/reference-comparison.md b/docs/cpp-object-oriented-modular-refactoring/reference-comparison.md deleted file mode 100644 index 1de86c4..0000000 --- a/docs/cpp-object-oriented-modular-refactoring/reference-comparison.md +++ /dev/null @@ -1,165 +0,0 @@ -# C++ Object-Oriented Modular Refactoring Reference Comparison Report - -## Metadata - -- owner_agent: `implementation-agent` -- feature_id: `cpp-object-oriented-modular-refactoring` -- report_status: `passed` -- date: `2026-08-16` -- reference_baseline: `1e5758f3e482fae4c3d58cac680abe0aac02e549` -- command_order: `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` -- authoritative FESA output: generated `results.h5` -- reference artifacts: read-only existing files under `reference/` - -## ARTIFACT CHECK - -Exact declared artifact inventory: - -| Artifact | Bytes | Lines | Data rows | SHA-256 | -| --- | ---: | ---: | ---: | --- | -| `reference/cantilever beam/cantilever beam.inp` | 2330 | 106 | N/A | `E406EA9560321B791DBDB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | -| `reference/cantilever beam/cantilever beam displacements.csv` | 1790 | 12 | 11 | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | -| `reference/cantilever beam/cantilever beam elemental forces.csv` | 1396 | 12 | 11 | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | -| `reference/cantilever beam/cantilever beam reactions.csv` | 1780 | 12 | 11 | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | -| `reference/shell/shell.inp` | 4770 | 164 | N/A | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | -| `reference/shell/shell displacements.csv` | 5592 | 50 | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | - -Read-only schema precheck: - -| Check | Result | -| --- | --- | -| B33 input contains `TYPE=B33` | Pass | -| MITC4 S4 input contains `TYPE=S4` | Pass | -| B33 displacement CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values | -| B33 reaction CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values | -| B33 elemental-force CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values | -| MITC4 S4 displacement CSV header/key/finite precheck | Pass: 49 rows, 49 unique keys, 0 duplicate keys, 0 nonfinite values | -| Reference tree diff before compare | Pass: `git diff --exit-code 1e5758f -- reference`, exit 0 | - -## COMPARE - -Command: - -```powershell -ctest --test-dir .harness/build -C Debug ` - -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure -``` - -Result: exit 0 in 1.260s, 3/3 tests passed. - -Generated artifacts: - -| Artifact | Bytes | SHA-256 | -| --- | ---: | --- | -| `.harness/build/reference/cantilever-beam-b33/results.h5` | 25336 | `58CD358F68D8094079E9E525C35EE88AE0575A2962D93472BF0678D78A785247` | -| `.harness/build/reference/cantilever-beam-b33/comparison.json` | 128118 | `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` | -| `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | 95024 | `A8D2E12886E87BAA5D895B7E96278EA4B462718D13B985CA2688B505480F0195` | -| `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | 94349 | `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` | -| `.harness/build/reference/mitc4-shell-s4-metadata/results.h5` | 95024 | `8FD6609A2D3758365A2AC2E34692CC0EC982D8E67396BDFF03FAAF2539EF483C` | -| `.harness/build/reference/mitc4-shell-s4-metadata/comparison.json` | 94349 | `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` | - -The generated `comparison.json` files are the deterministic machine-readable -per-row decision records. The summaries below preserve row counts, worst rows, -precheck/tolerance decisions, and artifact hashes for audit. - -## HDF5-to-CSV projection and tolerance contracts - -### B33 - -- Model: `cantilever-beam-b33` -- HDF5 datasets: - - `/steps/Step-1/frames/0/nodal/displacement` - - `/steps/Step-1/frames/0/nodal/reaction` - - `/steps/Step-1/frames/0/element/section_resultant` -- Row identity: model, `Step-1`, frame `0`, instance `PART-1_1-1`, source node label, quantity, component. -- Components: - - displacement `UX/UY/UZ/URX/URY/URZ` - - reaction `RF1/RF2/RF3/RM1/RM2/RM3` - - section resultant `N/T/My/Mz` -- Tolerance: `absolute_floor + 1.0e-6 * reference_scale`, with reference scale from read-only Abaqus rows only; displacement/rotation floor `1.0e-9`, force/moment floor `1.0e-3`. -- Pre-tolerance policy: missing, extra, duplicate, nonfinite, schema-mismatched, or identity-mismatched rows fail before tolerance. - -### MITC4 S4 - -- Case: `shell-s4` -- Source element type: `S4` -- Internal formulation: `FESA-MITC4` -- Integration rule: `2x2x2-gauss; mitc4-edge-midpoint-shear` -- HDF5 dataset: `/steps/Step-1/frames/0/nodal/displacement` -- Row identity: case, instance, source node label, component. -- Components: `U1/U2/U3` blocking; `UR1/UR2/UR3` warning-only. -- Tolerance: fixed absolute `1.0e-5` for every U/UR row; no component scale, row denominator, zero clamp, omission, or averaging affects the decision. -- Pre-tolerance policy: missing, extra, duplicate, nonfinite, header-mismatched, or identity-mismatched projected rows fail before tolerance. - -## CLASSIFY - -Blocking classification: `pass`. - -No missing, extra, duplicate, nonfinite, schema-mismatched, identity-mismatched, or -tolerance-failed blocking row was reported by either generated comparison. - -### B33 row and metric decisions - -Overall: `passed=true`; row decisions: 176/176 passed; failed rows: 0; nonfinite row -metrics: 0; stress comparison applicable: `false` with N/A reason -`Abaqus beam stress comparison is N/A; analytical/unit and HDF5 schema tests provide stress evidence.` - -Physics evidence: endpoint consistency passed; free residual norm -`9.356339321107032e-07`. - -| Quantity | Component | Rows | Reference scale | Max abs error | Max normalized error | RMS error | Norm error | Worst row decision | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- | -| displacement | UX | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | -| displacement | UY | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | -| displacement | UZ | 11 | 0.0190476272 | 5.33322917078971e-10 | 0.026602795021995 | 2.79095304685767e-10 | 9.25654406392607e-10 | node 11, FESA -0.019047626666677083, reference -0.0190476272, tol `2.00476272e-08`, pass | -| displacement | URX | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | -| displacement | URY | 11 | 0.00285714399 | 1.00001394318094e-10 | 0.0259262798011579 | 5.80165854051178e-11 | 1.92419245406385e-10 | node 9, FESA 0.002742858240001394, reference 0.00274285814, tol `3.85714399e-09`, pass | -| displacement | URZ | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | -| reaction | RF1 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | -| reaction | RF2 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | -| reaction | RF3 | 11 | 1000000 | 8.19563865661621e-07 | 8.1874512054108e-07 | 3.62393833938394e-07 | 1.20192437351202e-06 | node 1, FESA 1000000.0000008196, reference 1000000, tol `1.001`, pass | -| reaction | RM1 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | -| reaction | RM2 | 11 | 10000000 | 5.05149364471436e-06 | 5.05098854585977e-07 | 1.52613777609191e-06 | 5.06162638168429e-06 | node 1, FESA -10000000.000005051, reference -10000000, tol `10.001`, pass | -| reaction | RM3 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | -| section_resultant | N | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | -| section_resultant | T | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | -| section_resultant | My | 11 | 10000000 | 0.0156002428611895 | 0.00155986829928902 | 0.00470365086790684 | 0.0156002450736765 | node 11, FESA 2.4286118949223834e-07, reference -0.0156, tol `10.001`, pass | -| section_resultant | Mz | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | - -### MITC4 S4 row and metric decisions - -Overall: `passed=true`; rows: 294/294 within tolerance; blocking U rows: 147/147 -passed; warning-only UR rows: 147/147 within tolerance; warning count: 0; vector -metrics: 49. - -| Component | Rows | Blocking rows | Reference scale | Tolerance | Max abs error | Max normalized error | RMS error | Vector norm error | Worst row decision | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | -| U1 | 49 | 49 | 3.11730945e-23 | 1e-05 | 3.11730945e-23 | 3.11730945e-18 | 1.13587076092006e-23 | 7.95109532644045e-23 | node 12, FESA 0, reference 3.11730945e-23, pass | -| U2 | 49 | 49 | 3.11730945e-23 | 1e-05 | 3.11730945e-23 | 3.11730945e-18 | 1.13587076092006e-23 | 7.95109532644045e-23 | node 11, FESA 0, reference 3.11730945e-23, pass | -| U3 | 49 | 49 | 2.37408203e-05 | 1e-05 | 1.90378534915144e-07 | 0.0190378534915144 | 4.24886125341252e-08 | 2.97420287738877e-07 | node 2, FESA -2.3550441765084857e-05, reference -2.37408203e-05, pass | -| UR1 | 49 | 0 | 7.60725743e-06 | 1e-05 | 6.88285496274043e-08 | 0.00688285496274043 | 2.7737837921291e-08 | 1.94164865449037e-07 | node 44, FESA 1.3985063203725957e-06, reference 1.46733487e-06, pass warning-only | -| UR2 | 49 | 0 | 7.60725743e-06 | 1e-05 | 6.8828549627399e-08 | 0.0068828549627399 | 2.77378379212909e-08 | 1.94164865449036e-07 | node 34, FESA 1.398506320372601e-06, reference 1.46733487e-06, pass warning-only | -| UR3 | 49 | 0 | 5.27113701e-25 | 1e-05 | 5.27113701e-25 | 5.27113701e-20 | 2.12986098533393e-25 | 1.49090268973375e-24 | node 34, FESA 0, reference -5.27113701e-25, pass warning-only | - -Overall worst MITC4 row: node 2, component U3, FESA -`-2.3550441765084857e-05`, reference `-2.37408203e-05`, absolute error -`1.903785349151439e-07`, tolerance `1e-05`, normalized error -`0.01903785349151439`, blocking pass. - -## Reference no-change assertion - -Post-compare command: - -```powershell -git diff --exit-code 1e5758f -- reference -``` - -Result: exit 0, ``. - -No reference input, CSV, tolerance, comparator contract, or generated reference -artifact was modified. Generated FESA outputs are confined to `.harness/build/`. - -## Open issues - -None blocking. Passing comparison is only an implementation handoff to physics -evaluation; it is not release readiness or physics approval. diff --git a/docs/cpp-object-oriented-modular-refactoring/verification.md b/docs/cpp-object-oriented-modular-refactoring/verification.md new file mode 100644 index 0000000..1a90129 --- /dev/null +++ b/docs/cpp-object-oriented-modular-refactoring/verification.md @@ -0,0 +1,389 @@ +# C++ 모듈화 구현·검증 결과 + +2026-08의 실제 구현·환경·검증 결과다. 현재 ownership은 [ARCHITECTURE](../ARCHITECTURE.md), 현재 naming/format 규칙은 [CODINGSTYLE](../CODINGSTYLE.md)가 원본이다. + + + + +## C++ Object-Oriented Modular Refactoring Implementation Report + + +### Metadata + +- feature_id: `cpp-object-oriented-modular-refactoring` +- final_step: `24 final-quality-reference-gate` +- source_plan: `docs/cpp-object-oriented-modular-refactoring/README.md` +- phase_index: `phases/cpp-object-oriented-modular-refactoring/index.json` +- evidence_date: `2026-08-16` +- head: `f84ebb541f4717ab8300cf0d80497e1277d3bb48` +- reference_baseline: `1e5758f3e482fae4c3d58cac680abe0aac02e549` +- classification: `pass-for-physics-evaluation` + + +### Prior Step RED/GREEN/VERIFY evidence + +The final gate reviewed the Executor-recorded Step 0-23 summaries. Each prior step is +already `completed` in the phase index and retains its Executor-owned timestamps. + +| Step | Task | Evidence summary | +| ---: | --- | --- | +| 0 | `coding-style-agent-contract` | RED missing mandatory `CODINGSTYLE.md`; GREEN/VERIFY pytest 13/13, clean-env pytest 20/20, VS18 Debug build and CTest 144/144. | +| 1 | `cpp-style-tooling` | RED missing style/Doxygen config; GREEN/VERIFY policy pytest, clean-env pytest 21/21, LLVM 22.1.8 config checks, VS18 Debug build, CTest 144/144. | +| 2 | `architecture-boundaries` | Documentation-only architecture/ADR update; contract grep, diff check, MSVC Debug build, CTest discovery and 144/144 passed. | +| 3 | `foundation-google-style` | RED missing `.h` header; GREEN/VERIFY focused build/CTest 22/22, format, full build, CTest 144/144. | +| 4 | `model-element-google-style` | RED missing model `.h`; GREEN/VERIFY focused build/CTest 37/37, format 14 files, full build, CTest 144/144. | +| 5 | `solver-workflow-google-style` | RED missing analysis model `.h`; GREEN/VERIFY focused build/CTest 57/57, format 31 files, full build, CTest 144/144. | +| 6 | `io-application-google-style` | RED missing input reader `.h`; GREEN/VERIFY focused I/O/HDF5/app/reference CTest 36/36, format 23 files, full build, CTest 144/144. | +| 7 | `vector3-value-type` | RED missing `vector3.h`; GREEN/VERIFY Vector3 tests 7/7, format/tidy, full build, CTest 151/151. | +| 8 | `element-geometry-vector3` | RED typed Vector3 seam compile failure; GREEN/VERIFY focused CTest 44/44, duplicate scan 0, format, full build, CTest 155/155. | +| 9 | `result-io-vector3` | RED duplicate helpers; GREEN/VERIFY ResultRecovery/InpDomainMapping/HDF5 33/33, duplicate scan 0, format, full build, CTest 156/156. | +| 10 | `dense-blas-adapter` | RED missing dense BLAS internal header; GREEN/VERIFY focused CTest 4/4, public vendor scan 0, format, full build, CTest 158/158. | +| 11 | `source-target-resolver` | RED missing ASCII/source-target modules and plus-label failure; GREEN/VERIFY targeted/focused tests 44/44, helper scan, format, full build, CTest 164/164. | +| 12 | `material-property-hierarchy` | RED missing material/property bases; GREEN/VERIFY focused CTest 11/11, format, full build, CTest 170/170. | +| 13 | `element-definition-domain` | RED missing element definition/ownership APIs; GREEN/VERIFY focused CTest 20/20, format, full build, CTest 172/172. | +| 14 | `runtime-element-factory` | RED missing runtime element API; GREEN/VERIFY focused CTest 35/35, dynamic_cast scan 0, format, full build, CTest 176/176. | +| 15 | `generic-dof-manager` | RED fake element/layout seam failures; GREEN/VERIFY focused CTest 21/21, concrete/helper branches 0, format, full build, CTest 178/178. | +| 16 | `generic-sparse-assembler` | RED fake runtime contribution seam missing; GREEN/VERIFY SparseAssembly 9/9, concrete branch count 0, format, full build, CTest 179/179. | +| 17 | `generic-result-recovery` | RED missing generic recovery seam; GREEN/VERIFY focused CTest 53/53, concrete branch count 0, format, full build, CTest 182/182. | +| 18 | `load-hierarchy` | RED missing Load APIs; GREEN/VERIFY focused CTest 29/29, format, full build, CTest 186/186. | +| 19 | `boundary-condition-policy` | RED missing BoundaryCondition APIs; GREEN/VERIFY focused CTest 29/29, format, full build, discovery/full CTest 191/191. | +| 20 | `analysis-hierarchy` | RED missing `analysis.h`; GREEN/VERIFY focused CTest 12/12, scans, full build, discovery/full CTest 193/193. | +| 21 | `domain-mapper-modules` | RED missing private mapper seam; GREEN/VERIFY focused CTest 17/17, format, full build, CTest 197/197. | +| 22 | `result-recovery-modules` | RED missing recovery component seam; GREEN/VERIFY focused CTest 28/28, format, full build, CTest 203/203. | +| 23 | `hdf5-writer-modules` | RED missing HDF5 component seam; GREEN/VERIFY focused schema/atomicity CTest 13/13, scans, format, full build, CTest 206/206. | + +Step 24 is a final verification gate and did not manufacture a new RED condition; +it reused the approved B33 and MITC4 reference comparisons after style and full +build/test verification. + + +### Step 24 command evidence + +| Stage | Command | Exit | Duration | Result | +| --- | --- | ---: | ---: | --- | +| Environment diagnostic | `uv run --with pytest python -m pytest -v -rs` with inherited `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` | 1 | 2.700s | Environment-specific failure: default-sandbox test observed the explicit override. | +| Policy verify | `Remove FESA_HARNESS_CODEX_SANDBOX` in child process; `uv run --with pytest python -m pytest -v -rs` | 0 | 0.751s | 21/21 passed. | +| Tool verify | `& "C:/Program Files/LLVM/bin/clang-format.exe" --version` | 0 | 0.026s | clang-format 22.1.8. | +| Tool verify | `& "C:/Program Files/LLVM/bin/clang-tidy.exe" --version` | 0 | 0.030s | clang-tidy 22.1.8. | +| Tool verify | `& "C:/Program Files/LLVM/bin/clang-tidy.exe" --verify-config` | 0 | 0.028s | No config errors. | +| Style RED | `clang-format --dry-run --Werror` over 163 files | 1 | 0.892s | Four whitespace/line-ending format findings. | +| Style normalization | `clang-format -i` on the four reported files | 0 | tool wall 0.5s | No tracked content diff after formatting normalization. | +| Style verify | `clang-format --dry-run --Werror` over 163 files | 0 | 0.888s | Passed. | +| Public-header policy | `clang-tidy --config-file=.clang-tidy
-- -x c++ -std=c++17 -Iinclude` over 46 public headers | 0 | 41.822s | Passed. The 47 naming diagnostics were 45 required trailing-underscore header guards and two `const` parameter classifications; there were zero other naming diagnostics. | +| Doxygen/header-guard policy | Read-only scan of production headers and test Doxygen tags | 0 | 0.302s | 63/63 production headers had guards and Doxygen contracts; 0 test files contained imposed Doxygen tags. | +| Header extension | `.hpp` scan under `include src tests` | 0 | 0.162s | 0 legacy `.hpp` files. | +| Dependency precheck | Test declared GoogleTest/MKL/TBB/HDF5 paths | 0 | 0.165s | All paths found. | +| Fresh configure | `cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ...` | 0 | 6.204s | MSVC 19.51, VS18, build files generated. | +| Build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | 9.639s | Debug aggregate test target built. | +| Discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 0.235s | 206 tests discovered. | +| Full test | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 9.908s | 206/206 passed. | +| Artifact check | Exact declared artifact existence, SHA-256, line/row inventory | 0 | 0.218s | Six declared files present. | +| Artifact no-change | `git diff --exit-code 1e5758f -- reference` | 0 | 0.165s | No reference diff. | +| Artifact schema | Read-only type/header/key/finite precheck | 0 | 0.266s | B33/S4 type present; CSV headers/keys/finite checks passed. | +| Compare | `ctest --test-dir .harness/build -C Debug -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | 1.260s | 3/3 approved reference tests passed. | +| Generated result check | Required `results.h5` existence and hashes | 0 | 0.218s | B33 and MITC4 comparison `results.h5` present. | +| Post no-change | `git diff --exit-code 1e5758f -- reference` | 0 | 0.179s | No reference diff after compare. | +| Whitespace check | `git diff --check` | 0 | 0.199s | No whitespace errors. | + + +### Requirement traceability + +| Requirement | Final-gate evidence | +| --- | --- | +| `R-PRESERVE-001` | Full CTest 206/206, B33 comparison 176/176 rows passed, MITC4 S4 comparison 147/147 blocking U rows passed; no tolerance/comparator/reference diff. | +| `R-STYLE-001` | `.h` header scan passed with zero `.hpp`; clang-format passed over 163 files; clang-tidy selected public-header check passed over 46 headers. | +| `R-DOC-001` | Policy pytest passed; 63/63 production headers had header guards and Doxygen contracts, while 0 test files contained imposed Doxygen tags. Doxygen generation was intentionally not run. | +| `R-DUP-001` | Step 7-9 summaries record the shared `Vector3`, element/result/I/O preservation tests, and duplicate-definition scans with zero remaining local definition families; full CTest 206/206 passed. | +| `R-DUP-002` | Steps 10, 11, and 15 record the single dense-BLAS adapter, shared ASCII/source resolver, and DofManager-owned invariant logic with focused tests and helper/branch scans; full CTest 206/206 passed. | +| `R-MODEL-001` | Steps 12-13 record polymorphic Material/ElementProperty/ElementDefinition ownership and stable Domain views; focused ownership tests and full CTest passed. | +| `R-ELEMENT-001` | Step 14 records semantic/runtime separation, fail-closed factory compatibility checks, virtual destruction, owner-bounded views, and zero `dynamic_cast` uses; full CTest passed. | +| `R-PIPELINE-001` | Steps 15-17 record generic DofManager, SparseAssembler, and ResultRecovery seams with fake runtime elements, deterministic/atomic tests, and zero concrete B33/MITC4 consumer branches; full CTest passed. | +| `R-LOAD-001` | Step 18 records Domain-owned Load objects, ordered contributions, validation-before-candidate accumulation, and focused LoadAssembler tests; full CTest passed. | +| `R-BC-001` | Step 19 records BoundaryCondition definitions and stable essential-constraint partition/reconstruction, including nonzero and `0 x 0 Kff` cases; full CTest passed. | +| `R-ANALYSIS-001` | Step 20 records minimal base `Run()` dispatch and procedure-owned lifecycle tests, including factorize-before-load, exactly-one factorization, all-constrained solve, and writer suppression on recovery failure; full CTest passed. | +| `R-MODULE-001` | Steps 21-23 record the approved Domain-mapper, result-recovery, and HDF5 private component splits with facade, diagnostic, identity, rollback, self-check, and atomic-finalization tests; full CTest passed. | +| `R-AGENT-001` | Step 0 records the mandatory `docs/CODINGSTYLE.md` implementation-agent contract; the final clean-environment policy suite passed 21/21. | +| `R-SCOPE-001` | No production behavior or future-feature changes in Step 24; reference tree diff against `1e5758f` is empty. | + +All acceptance traceability rows from the approved implementation plan are listed +above. Their owning task rows `T00..T23` retain the recorded RED/GREEN/VERIFY +summaries, and `T24` supplies the final style, build, CTest, artifact, HDF5, +comparison, and no-change evidence. + + +### Handoff + +Implementation gate verdict: `pass-for-physics-evaluation`. + +Open issues: none blocking. The inherited `FESA_HARNESS_CODEX_SANDBOX` override is an +environment note only; the clean child-process policy command passed without code +changes. + + + + +## C++ Object-Oriented Modular Refactoring Build/Test Report + + +### Metadata + +- feature_id: `cpp-object-oriented-modular-refactoring` +- report_status: `passed` +- date: `2026-08-16` +- branch: `feat-cpp-object-oriented-modular-refactoring` +- head: `f84ebb541f4717ab8300cf0d80497e1277d3bb48` +- `.harness/config.json`: absent; Harness/CMake defaults and Step 24 explicit commands used +- build generator: `Visual Studio 18 2026` +- platform/configuration: `x64` / `Debug` +- compiler observed by configure: `MSVC 19.51.36252.0` +- inherited environment note: `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` + + +### Execution environment + +Required dependency paths all existed: + +| Path | Status | +| --- | --- | +| `C:/git/googletest` | found | +| `C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl` | found | +| `C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb` | found | +| `C:/Program Files/HDF_Group/HDF5/2.1.1/cmake` | found | + +LLVM tools: + +- `clang-format version 22.1.8` +- `clang-tidy LLVM version 22.1.8` +- `clang-tidy --verify-config`: `No config errors detected.` + + +### Command log summary + +| Command | Exit | Duration | Output tail / result | +| --- | ---: | ---: | --- | +| `uv run --with pytest python -m pytest -v -rs` | 1 | 2.700s | 20 passed, 1 failed: `test_invoke_codex_uses_utf8_for_unicode_prompt` saw inherited sandbox override `danger-full-access` instead of default `workspace-write`. Classified as environment-specific diagnostic, not product failure. | +| Clean child process without `FESA_HARNESS_CODEX_SANDBOX`; `uv run --with pytest python -m pytest -v -rs` | 0 | 0.751s | `21 passed in 0.13s`. | +| `clang-format --dry-run --Werror` over `@(rg --files include src tests -g "*.h" -g "*.cpp")` | 1 | 0.892s | Reported four formatting findings in `src/fesa/math/sparse_matrix.cpp`, `tests/unit/math/sparse_matrix_test.cpp`, `tests/unit/solvers/linear/linear_solver_test.cpp`, `tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp`. | +| `clang-format -i` on the four reported files | 0 | tool wall 0.5s | Normalized formatting/stat state; `git diff --raw` and `git diff --numstat` remained empty for those files. | +| `clang-format --dry-run --Werror` over 163 C++ files | 0 | 0.888s | `CPP_FILE_COUNT: 163`; no violations. | +| `clang-tidy --config-file=.clang-tidy -- -x c++ -std=c++17 -Iinclude` | 0 | 41.822s | `PUBLIC_HEADER_COUNT: 46`; 45 diagnostics were required trailing-underscore header guards and two were `const` parameter classifications; zero other naming diagnostics. | +| Read-only production Doxygen/header-guard and test-tag scan | 0 | 0.302s | 63 production headers, 0 missing guards, 0 missing Doxygen-contract headers, and 0 test files with imposed Doxygen tags. | +| `.hpp` scan under `include src tests` | 0 | 0.162s | `LEGACY_HPP_COUNT: 0`; `rg` returned 1 for empty result but count-based AC passed. | +| Required dependency path check | 0 | 0.165s | All four declared dependency paths found. | +| `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 | 6.204s | Configure/generate complete; MKL 2026.1.0 found; build files written to `.harness/build`. | +| `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | 9.639s | `fesa_solver.lib`, `fesa_integration_tests.exe`, `fesa_reference_tests.exe`, and `fesa_unit_tests.exe` built. | +| `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 0.235s | `DISCOVERED_TEST_COUNT: 206`. | +| `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 9.908s | `100% tests passed out of 206`; labels: unit 182, integration 11, reference 13. | +| `ctest --test-dir .harness/build -C Debug -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | 1.260s | `100% tests passed out of 3`. | +| `git diff --check` | 0 | 0.199s | ``. | + + +### Validation results + +| Validation | Result | +| --- | --- | +| Harness Python/policy tests | Pass in clean child process: 21/21. | +| LLVM tool availability/config | Pass. | +| clang-format repository dry-run | Pass: 163 files. | +| clang-tidy selected public-header check | Pass: 46 headers, exit 0, zero naming diagnostics outside the two documented contract exceptions. | +| Production Doxygen/header-guard policy | Pass: 63/63 headers; tests contain no imposed Doxygen boilerplate tags. | +| Header extension policy | Pass: 0 `.hpp` under `include`, `src`, `tests`. | +| Fresh MSVC x64 Debug configure | Pass. | +| MSVC x64 Debug build | Pass: `fesa_tests`. | +| CTest discovery | Pass: 206 tests. | +| Full CTest | Pass: 206/206. | +| Approved reference suites | Pass: 3/3. | +| Reference tree no-change | Pass before and after compare: `git diff --exit-code 1e5758f -- reference` exit 0. | + + +### Failure classification and failed test inventory + +Blocking classification: `none`. + +Nonblocking diagnostics: + +- `environment`: inherited `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` caused the raw pytest command to fail one default-sandbox test. The same pytest command passed 21/21 in a child process with only that override removed. +- `style`: initial clang-format dry-run reported four whitespace/line-ending findings. Formatting normalization introduced no tracked source-content diff, and the rerun passed. +- `static-policy`: clang-tidy reported header-guard trailing underscores and two + `const` parameters because its generic macro/constant categories differ from the + higher-priority FESA guard and parameter conventions. It reported no other naming + diagnostics, and the required command exited 0. + +Failed blocking tests after clean verification: none. + + +### Handoff recommendation + +Proceed to Physics Evaluation Agent. Build/test evidence is sufficient for the final +Implementation-owned gate; no compile, link, test, reference-comparison, or +environment blocker remains. + + +### Open issues + +None blocking. + + + + +## C++ Object-Oriented Modular Refactoring Reference Comparison Report + + +### Metadata + +- feature_id: `cpp-object-oriented-modular-refactoring` +- report_status: `passed` +- date: `2026-08-16` +- reference_baseline: `1e5758f3e482fae4c3d58cac680abe0aac02e549` +- command_order: `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` +- authoritative FESA output: generated `results.h5` +- reference artifacts: read-only existing files under `reference/` + + +### ARTIFACT CHECK + +Exact declared artifact inventory: + +| Artifact | Bytes | Lines | Data rows | SHA-256 | +| --- | ---: | ---: | ---: | --- | +| `reference/cantilever beam/cantilever beam.inp` | 2330 | 106 | N/A | `E406EA9560321B791DBDB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | +| `reference/cantilever beam/cantilever beam displacements.csv` | 1790 | 12 | 11 | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | +| `reference/cantilever beam/cantilever beam elemental forces.csv` | 1396 | 12 | 11 | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | +| `reference/cantilever beam/cantilever beam reactions.csv` | 1780 | 12 | 11 | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | +| `reference/shell/shell.inp` | 4770 | 164 | N/A | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | +| `reference/shell/shell displacements.csv` | 5592 | 50 | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | + +Read-only schema precheck: + +| Check | Result | +| --- | --- | +| B33 input contains `TYPE=B33` | Pass | +| MITC4 S4 input contains `TYPE=S4` | Pass | +| B33 displacement CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values | +| B33 reaction CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values | +| B33 elemental-force CSV header/key/finite precheck | Pass: 11 rows, 11 unique keys, 0 duplicate keys, 0 nonfinite values | +| MITC4 S4 displacement CSV header/key/finite precheck | Pass: 49 rows, 49 unique keys, 0 duplicate keys, 0 nonfinite values | +| Reference tree diff before compare | Pass: `git diff --exit-code 1e5758f -- reference`, exit 0 | + + +### COMPARE + +Command: + +```powershell +ctest --test-dir .harness/build -C Debug ` + -R "B33ReferenceComparison|Mitc4S4Reference" --output-on-failure +``` + +Result: exit 0 in 1.260s, 3/3 tests passed. + +Generated artifacts: + +| Artifact | Bytes | SHA-256 | +| --- | ---: | --- | +| `.harness/build/reference/cantilever-beam-b33/results.h5` | 25336 | `58CD358F68D8094079E9E525C35EE88AE0575A2962D93472BF0678D78A785247` | +| `.harness/build/reference/cantilever-beam-b33/comparison.json` | 128118 | `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` | +| `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | 95024 | `A8D2E12886E87BAA5D895B7E96278EA4B462718D13B985CA2688B505480F0195` | +| `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | 94349 | `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` | +| `.harness/build/reference/mitc4-shell-s4-metadata/results.h5` | 95024 | `8FD6609A2D3758365A2AC2E34692CC0EC982D8E67396BDFF03FAAF2539EF483C` | +| `.harness/build/reference/mitc4-shell-s4-metadata/comparison.json` | 94349 | `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` | + +The generated `comparison.json` files are the deterministic machine-readable +per-row decision records. The summaries below preserve row counts, worst rows, +precheck/tolerance decisions, and artifact hashes for audit. + + +### HDF5-to-CSV projection and tolerance contracts + + +#### B33 + +- Model: `cantilever-beam-b33` +- HDF5 datasets: + - `/steps/Step-1/frames/0/nodal/displacement` + - `/steps/Step-1/frames/0/nodal/reaction` + - `/steps/Step-1/frames/0/element/section_resultant` +- Row identity: model, `Step-1`, frame `0`, instance `PART-1_1-1`, source node label, quantity, component. +- Components: + - displacement `UX/UY/UZ/URX/URY/URZ` + - reaction `RF1/RF2/RF3/RM1/RM2/RM3` + - section resultant `N/T/My/Mz` +- Tolerance: `absolute_floor + 1.0e-6 * reference_scale`, with reference scale from read-only Abaqus rows only; displacement/rotation floor `1.0e-9`, force/moment floor `1.0e-3`. +- Pre-tolerance policy: missing, extra, duplicate, nonfinite, schema-mismatched, or identity-mismatched rows fail before tolerance. + + +#### MITC4 S4 + +- Case: `shell-s4` +- Source element type: `S4` +- Internal formulation: `FESA-MITC4` +- Integration rule: `2x2x2-gauss; mitc4-edge-midpoint-shear` +- HDF5 dataset: `/steps/Step-1/frames/0/nodal/displacement` +- Row identity: case, instance, source node label, component. +- Components: `U1/U2/U3` blocking; `UR1/UR2/UR3` warning-only. +- Tolerance: fixed absolute `1.0e-5` for every U/UR row; no component scale, row denominator, zero clamp, omission, or averaging affects the decision. +- Pre-tolerance policy: missing, extra, duplicate, nonfinite, header-mismatched, or identity-mismatched projected rows fail before tolerance. + + +### CLASSIFY + +Blocking classification: `pass`. + +No missing, extra, duplicate, nonfinite, schema-mismatched, identity-mismatched, or +tolerance-failed blocking row was reported by either generated comparison. + + +#### B33 row and metric decisions + +Overall: `passed=true`; row decisions: 176/176 passed; failed rows: 0; nonfinite row +metrics: 0; stress comparison applicable: `false` with N/A reason +`Abaqus beam stress comparison is N/A; analytical/unit and HDF5 schema tests provide stress evidence.` + +Physics evidence: endpoint consistency passed; free residual norm +`9.356339321107032e-07`. + +| Quantity | Component | Rows | Reference scale | Max abs error | Max normalized error | RMS error | Norm error | Worst row decision | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- | +| displacement | UX | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | +| displacement | UY | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | +| displacement | UZ | 11 | 0.0190476272 | 5.33322917078971e-10 | 0.026602795021995 | 2.79095304685767e-10 | 9.25654406392607e-10 | node 11, FESA -0.019047626666677083, reference -0.0190476272, tol `2.00476272e-08`, pass | +| displacement | URX | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | +| displacement | URY | 11 | 0.00285714399 | 1.00001394318094e-10 | 0.0259262798011579 | 5.80165854051178e-11 | 1.92419245406385e-10 | node 9, FESA 0.002742858240001394, reference 0.00274285814, tol `3.85714399e-09`, pass | +| displacement | URZ | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `1e-09`, pass | +| reaction | RF1 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | +| reaction | RF2 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | +| reaction | RF3 | 11 | 1000000 | 8.19563865661621e-07 | 8.1874512054108e-07 | 3.62393833938394e-07 | 1.20192437351202e-06 | node 1, FESA 1000000.0000008196, reference 1000000, tol `1.001`, pass | +| reaction | RM1 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | +| reaction | RM2 | 11 | 10000000 | 5.05149364471436e-06 | 5.05098854585977e-07 | 1.52613777609191e-06 | 5.06162638168429e-06 | node 1, FESA -10000000.000005051, reference -10000000, tol `10.001`, pass | +| reaction | RM3 | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | +| section_resultant | N | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | +| section_resultant | T | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | +| section_resultant | My | 11 | 10000000 | 0.0156002428611895 | 0.00155986829928902 | 0.00470365086790684 | 0.0156002450736765 | node 11, FESA 2.4286118949223834e-07, reference -0.0156, tol `10.001`, pass | +| section_resultant | Mz | 11 | 0 | 0 | 0 | 0 | 0 | node 1, FESA 0, reference 0, tol `0.001`, pass | + + +#### MITC4 S4 row and metric decisions + +Overall: `passed=true`; rows: 294/294 within tolerance; blocking U rows: 147/147 +passed; warning-only UR rows: 147/147 within tolerance; warning count: 0; vector +metrics: 49. + +| Component | Rows | Blocking rows | Reference scale | Tolerance | Max abs error | Max normalized error | RMS error | Vector norm error | Worst row decision | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | +| U1 | 49 | 49 | 3.11730945e-23 | 1e-05 | 3.11730945e-23 | 3.11730945e-18 | 1.13587076092006e-23 | 7.95109532644045e-23 | node 12, FESA 0, reference 3.11730945e-23, pass | +| U2 | 49 | 49 | 3.11730945e-23 | 1e-05 | 3.11730945e-23 | 3.11730945e-18 | 1.13587076092006e-23 | 7.95109532644045e-23 | node 11, FESA 0, reference 3.11730945e-23, pass | +| U3 | 49 | 49 | 2.37408203e-05 | 1e-05 | 1.90378534915144e-07 | 0.0190378534915144 | 4.24886125341252e-08 | 2.97420287738877e-07 | node 2, FESA -2.3550441765084857e-05, reference -2.37408203e-05, pass | +| UR1 | 49 | 0 | 7.60725743e-06 | 1e-05 | 6.88285496274043e-08 | 0.00688285496274043 | 2.7737837921291e-08 | 1.94164865449037e-07 | node 44, FESA 1.3985063203725957e-06, reference 1.46733487e-06, pass warning-only | +| UR2 | 49 | 0 | 7.60725743e-06 | 1e-05 | 6.8828549627399e-08 | 0.0068828549627399 | 2.77378379212909e-08 | 1.94164865449036e-07 | node 34, FESA 1.398506320372601e-06, reference 1.46733487e-06, pass warning-only | +| UR3 | 49 | 0 | 5.27113701e-25 | 1e-05 | 5.27113701e-25 | 5.27113701e-20 | 2.12986098533393e-25 | 1.49090268973375e-24 | node 34, FESA 0, reference -5.27113701e-25, pass warning-only | + +Overall worst MITC4 row: node 2, component U3, FESA +`-2.3550441765084857e-05`, reference `-2.37408203e-05`, absolute error +`1.903785349151439e-07`, tolerance `1e-05`, normalized error +`0.01903785349151439`, blocking pass. + + +### Open issues + +None blocking. Passing comparison is only an implementation handoff to physics +evaluation; it is not release readiness or physics approval. diff --git a/docs/development-history.md b/docs/development-history.md new file mode 100644 index 0000000..27740b8 --- /dev/null +++ b/docs/development-history.md @@ -0,0 +1,38 @@ +# 개발 결정과 폐기된 운영 계획 + +## 적용 범위 + +현재 개발 규칙은 [standards](standards.md), 구조는 [ARCHITECTURE](ARCHITECTURE.md), +입출력은 [contracts](contracts.md), 수치 비교는 [TOLERANCE](TOLERANCE.md), 실행은 +[operations](operations.md)·[HARNESS](HARNESS.md)가 원본이다. 이 문서는 과거 선택의 +이유와 승인 출처를 연결하며 실행 계획이 아니다. 요구사항·ADR ID와 실제 실패는 보존한다. + +## 승인과 교훈 + +- 2026-08-08/09 Beam 설계 승인: [기능 요구·정식화·I/O](linear-static-3d-euler-beam/README.md)에 + 목적·범위·수학 계약을 보존한다. 옛18-step Harness phase 계획은 현행 구현 절차가 아니다. +- 2026-08-12 독립 reference validation: 입력·row identity 사전검사와 수치 비교·physics를 + 분리한다. [공통 정책](TOLERANCE.md), [reference 결정](tracking/decisions/0007-reference-evidence.md). +- 2026-08-16 C++ 모듈화: [구현·Handoff](cpp-object-oriented-modular-refactoring/README.md)와 + 현재 ARCHITECTURE/CODINGSTYLE에 책임·API·규약을 보존한다. +- 2026-08-17 공통 tolerance: row5%·near-zero absolute1% scale·family RMS1%·exact-zero와 + metadata 사전검사를 유지한다. 이후 eigen 첫 구현의 승인 예외는 TOLERANCE의 별도 policy다. +- 과거 고정8-stage·coordinator/Executor·자동 Stop hook·model override 작업 계획은 + [현재 전문 작업 원칙](SOLVER_AGENT_DESIGN.md)으로 대체됐다. 역할은 필요한 경우만 배정하고 + [명시 검증](HARNESS_WORKFLOW.md)을 사용한다. 과거 stage pass를 제품 완료로 승계하지 않는다. +- 2026-09의 경량 운영 정리: runtime 실행기와 개발 조정을 분리한다. 설정·trust·timeout의 + 과거 machine 값은 현재 공통 지침이 아니다. environment 실패를 source/physics 실패와 구분한다. +- 2026-09/10 Eigen의 trace→residual stopping, 첫 구현5%·S3 보류와 HHT consistent mass, + 열해석 원본 diagnostic 전환은 각각 해당 기능 PRD/ADR가 소유한다. + +## 이전 문서 조회와 보존 경계 + +삭제한 `docs/superpowers/{specs,plans}/`의 원문은 +Git `858e87b:<기존 경로>`에서 조회한다. 이는 이전 승인·실행의 원문이며 현재 상태를 덮어쓰지 않는다. +초기 작성 노트는 [ProjectInitialPlanNote](archive/ProjectInitialPlanNote.md)에 역사 자료로 남긴다. +논문·발췌와 이미지가 있는 `reference-papers/` 및 read-only `reference/`는 문서 정리에서 변경하지 않는다. +개인 ignored evidence가 현재 checkout에 없으면 당시 위치로 표시하고 실제 파일 링크로 가장하지 않는다. + +이전 공통 요구·결정·구조의 원문은 [개정 전 PRD](archive/pre-generalization/PRD.md), +[개정 전 ADR](archive/pre-generalization/ADR.md), [개정 전 구조](archive/pre-generalization/ARCHITECTURE.md)에 +남긴다. 기존 ID의 원래 의미·승인 범위를 보존하는 자료이며 현재 실행 지침이 아니다. diff --git a/docs/hht-implicit-dynamics/ADR.md b/docs/hht-implicit-dynamics/ADR.md index ef2bd6a..5398adb 100644 --- a/docs/hht-implicit-dynamics/ADR.md +++ b/docs/hht-implicit-dynamics/ADR.md @@ -33,7 +33,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen - 상태: `researched-input-interpretation`; FESA 정식화·전체 입력 지원 승인과 구별. - 날짜: 2026-09-22 - Owner: 메인 assistant; 근거 수집은 research-agent. -- 근거: [Research §3 및 S4–S7](research.md)의 공식 Abaqus 2025 공개 문서와 원본 INP 대조. +- 근거: [Research §3 및 S4–S7](research.md#research)의 공식 Abaqus 2025 공개 문서와 원본 INP 대조. - 해석: 무접촉 기본 application은 TRANSIENT FIDELITY/HHT-TF이고 `alpha=-0.05`, `beta=0.275625`, `gamma=0.55`다. 명시 amplitude가 없는 집중하중은 STEP이며 첫 증분부터 전체 크기다. DIRECT는 이 모델에서 고정 시간간격이고, 기본 INITIAL 의미는 초기 가속도 계산이다. - 영향: 이 공개 의미는 CSV fitting으로 정하지 않으며 기본값을 정하기 위한 반복 사용자 질문도 필요하지 않다. FESA 최초 old-force history, `t0-/t0+`와 frame 0, mass-null 초기화는 명시적으로 정식화해야 한다. 공개 의미만으로 reference를 생성한 solver의 내부 초기화·관성 알고리즘을 확인했다고 주장하지 않는다. @@ -49,7 +49,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen - 상태: `recommended-after-formulation-review`; 물리·구현 범위의 사용자 승인과 구별. - Owner: 메인 assistant; 수식 owner는 formulation-agent, 독립 검토는 numerical-review-agent. -- 근거: [정식화](formulation.md), [관성 상세](formulation-inertia.md), [독립 검토](numerical-review.md), [Brüls–Arnold (2008) 원문 식 (5)–(8)](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf). +- 근거: [정식화](formulation.md), [관성 상세](formulation-inertia.md), [독립 검토](numerical-review.md#numerical-review), [Brüls–Arnold (2008) 원문 식 (5)–(8)](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf). - 추천: `a`는 물리적 좌표 가속도, `A`는 Newmark에 쓰는 보조량으로 정의하고 `A_(n+1)=(1+alpha)a_(n+1)-alpha a_n`와 endpoint 동적 평형을 함께 푼다. `M(q)` 및 convective inertia의 정확한 미분을 접선에 포함한다. - 이유: 단순 current-mass 대입은 variable-mass 제조해에서 1차로 떨어졌다. 두 시점 질량의 가중은 회전하는 질량 영공간을 소실시킬 수 있다. 추천 후보는 제한된 variable-mass 및 moving-null 사례에서 2차 수렴을 보이고 일정 질량 HHT로 환원한다. - 영향: `A`를 physical acceleration으로 출력하지 않는다. 초기화는 전값 STEP force의 `0+` 동적 평형과 대수 일관성을 함께 만족하도록 제안한다. 원문 nonsingular-mass 수렴 결과를 실제 shell의 drilling DAE에 자동 적용하지 않으며 구현 후 별도 시간 수렴·관성·반력·에너지 검증이 필요하다. @@ -68,7 +68,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen - 상태: `accepted-for-current-task`; 수치 검증 설계와 실제 solver 통과를 구별. - Owner: 메인 assistant; 독립 수치 기준·검증 설계는 numerical-review-agent, 추가 근거는 research-agent. - 승인 근거: 사용자의 “numerical research 단계도 진행하세요” 요청과 프로젝트의 독립 수치 검토 원칙. -- 결정: [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [추가 연구](numerical-research.md), [reference 비교 계약](reference-model.md)을 작성한다. User-selected consistent mass에 대해 Newton·초기 대수조건·질량 영공간·conditioning·관성 접선·시간수렴의 반증 가능한 기준을 정의한다. +- 결정: [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [추가 연구](research.md#numerical-research), [reference 비교 계약](reference-model.md)을 작성한다. User-selected consistent mass에 대해 Newton·초기 대수조건·질량 영공간·conditioning·관성 접선·시간수렴의 반증 가능한 기준을 정의한다. - 이유·영향: 외부 reference 공통 tolerance를 유지하면서 내부 계산 정확도와 별도의 물리 coverage를 검증한다. 제한된 수식 probe의 실행 결과를 전체 shell·구현·reference 검증으로 승계하지 않는다. I/O field binding과 실제 구현·build/test·reference 비교는 후속 작업이다. ## HHT-ADR-009 — I/O·구현·Physics Evaluation 수행 @@ -77,7 +77,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen - Owner: 메인 assistant; I/O 정의·구현·독립 physics review는 각 할당 담당자. - 승인 근거: 사용자의 “I/O definition, implementation, physics evaluation gate 모두 진행하세요” 및 후속 “깃에 커밋 하면서 진행하세요”. - 결정: HHT-ADR-006의 검토된 physical a/auxiliary A 분리, 0+ full STEP 초기화, HHT-ADR-007의 consistent mass를 실제 구현 대상으로 채택한다. 공개 입력은 [I/O 계약](io-contract.md)의 단일 NLGEOM shell DIRECT·기본 계수·zero 초기조건/고정 BC·constant force CLOAD subset이다. 별도 dynamic state와 dynamic-only HDF5 schema v1을 추가하고 기존 static/eigen 계약은 보존한다. -- 영향: [구현 계획](implementation-plan.md)에 따라 MSVC Debug build/CTest, 독립 수치·물리 검증과 지정 원본 reference 비교를 수행한다. 확인된 문서·검증된 구현 묶음을 현 branch에서 순차 커밋한다. 외부 solver 실행·reference 보정·push/release는 포함하지 않는다. 실패·미실행 검증을 통과로 표시하지 않는다. +- 영향: [구현 계획](README.md#재사용-handoff)에 따라 MSVC Debug build/CTest, 독립 수치·물리 검증과 지정 원본 reference 비교를 수행한다. 확인된 문서·검증된 구현 묶음을 현 branch에서 순차 커밋한다. 외부 solver 실행·reference 보정·push/release는 포함하지 않는다. 실패·미실행 검증을 통과로 표시하지 않는다. ## HHT-ADR-010 — Newton 시작 형상과 영변형 산술 diff --git a/docs/hht-implicit-dynamics/FEATURED_AGENTS.md b/docs/hht-implicit-dynamics/FEATURED_AGENTS.md index 1a6cbfd..14a3193 100644 --- a/docs/hht-implicit-dynamics/FEATURED_AGENTS.md +++ b/docs/hht-implicit-dynamics/FEATURED_AGENTS.md @@ -1,43 +1,22 @@ -# HHT Implicit Dynamics 작업 지침 +# hht-implicit-dynamics 문서·작업 지침 - Feature ID: `hht-implicit-dynamics` -- Owner: 메인 assistant -- 목적: 지정 shell reference를 대상으로 HHT implicit 동적 해석의 요구사항·정식화·수치 검증 계약을 마련한다. -- 현재 작업 범위: I/O definition·implementation·physics evaluation 전체 수행 및 검증 묶음별 Git commit. -- 현재 상태와 유일한 checklist: [PRD](PRD.md#현재-checklist). +- 문서 진입점·목적·사용법·Handoff: [README](README.md). +- 현재 범위·checklist: [PRD](PRD.md); 결정·승인·대체 이력: [ADR](ADR.md). +- 적용 범위: 해당 기능의 문서. 자동 로드되는 코드 영역 `AGENTS.md`가 아니다. -기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), -[공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md), -[TOLERANCE](../TOLERANCE.md), [Feature 문서 관리](../FEATURE_DOCUMENTATION.md). +기준: [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md), +[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [공통 tolerance](../TOLERANCE.md). -## 지역 지침 +## 보존할 계약과 인계 -- 기준 코드는 `dev` commit `23b37ca644563b51472654af3b22811f077f15f6`다. `hht-implicit-dynamics` worktree에서 구현·검증한다. -- 사용자가 지정한 `reference/shellNL-dyn-meshfine`의 INP와 CSV를 그대로 조사한다. 원본 reference는 보존하고 FESA solver 구현·실행·비교를 수행한다. Reference 재생성·외부 solver 실행은 포함하지 않는다. -- 요구사항은 관찰 가능한 동작과 검증 의도를, 연구는 일차 출처의 사실·계산·추론·남은 공백을 소유한다. 연구식을 승인된 구현 정식화로 취급하지 않는다. -- 이전 논문 재현 실험의 drilling·질량·접선 변경과 dev 일관질량 eigen 진단은 이 기능의 물리 선택이나 구현 승인으로 이어지지 않는다. -- 사용자가 [HHT-ADR-007](ADR.md)에서 consistent kinetic mass를 선택했다. 이번 HHT 구현 범위는 일관질량이며 lumped는 비교 연구·기존 eigen 회귀의 경계에서만 다룬다. -- `NLGEOM=YES`, `DIRECT` 시간 의미와 전체 reference 이력을 보존한다. Abaqus 입력 subset 지원은 내부 요소·시간적분 구현 동등성 약속이 아니다. -- 공통 tolerance와 shell U blocking / UR warning-only 분류를 유지한다. Eigen 전용 RMS 5% 예외를 동적 해석에 확대하지 않는다. -- 미결정 물리 범위와 근거 부족을 명시하며 결과에 맞추어 alpha·질량·하중 이력을 변경하지 않는다. 공개 문헌으로 확정되는 입력 의미에는 불필요한 재승인 절차를 추가하지 않는다. +수식·I/O·수치 기준의 원본은 README에서 연결한 전문 문서를 따른다. 기능을 재개할 때 +관련 계약과 실제 실행 revision·미해결 항목을 함께 읽는다. 과거 stage pass나 현재 문서 +정리를 solver 검증 통과로 계산하지 않는다. 요구사항·ADR ID와 승인 이력을 유지한다. +메인은 PRD·ADR·진입점·문서 참조를 관리하고 전문 작업자는 할당한 본문과 관련 범위만 수정한다. +기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다. +문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다. -## 문서 소유권 - -[구현 계획](implementation-plan.md)은 메인 소유다. [I/O 계약](io-contract.md)은 io-definition-agent, 코드·시험은 메인이 지정한 input/inertia/state-output/procedure 소유권을 따른다. 최종 물리 평가는 독립 physics-evaluation-agent가 맡는다. - -| 문서 | Owner | 책임 | -| --- | --- | --- | -| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | 메인 assistant | 지역 지침과 할당 | -| [PRD.md](PRD.md) | 메인 assistant | 요청·범위·현재 checklist·현행 코드와의 차이 | -| [ADR.md](ADR.md) | 메인 assistant | 결정·승인 근거와 미결정 경계 | -| [requirements.md](requirements.md) | requirement-agent | 원자적 요구사항·acceptance intent·reference inventory | -| [research.md](research.md), [numerical-research.md](numerical-research.md) | research-agent | HHT·공개 입력 의미·수치 근거·검증 후보·근거 공백 | -| [formulation.md](formulation.md), [formulation-inertia.md](formulation-inertia.md) | formulation-agent | HHT 시간적분·초기화·shell 관성·잔차와 접선·검증 불변식 | -| [numerical-review.md](numerical-review.md), [numerical-review-probes.md](numerical-review-probes.md) | numerical-review-agent | 정식화와 수치 계약의 독립 검토·반례·재현 가능한 수식 검산 | -| [numerical-controls.md](numerical-controls.md), [verification-cases.md](verification-cases.md) | numerical-review-agent | 내부 수치 기준과 반증 가능한 검증 사례 | -| [reference-model.md](reference-model.md) | 메인 assistant; numerical-review-agent 검토 | 원본 inventory·시간·identity·수치 비교 계약; I/O binding은 후속 | -| [implementation-numerical-review.md](implementation-numerical-review.md) | numerical-review-agent | 구현 독립 검토·C08 실패 반례·복구 후보 검토 | -| [physics-evaluation.md](physics-evaluation.md) | physics-evaluation-agent | 실제 HDF5·독립 적분·reference와 물리 coverage 평가 | -| [formulation-acceleration-recovery.md](formulation-acceleration-recovery.md) | formulation-agent | HHT-ADR-011의 별도 가속도 복구 후보; 채택 전 정식화·불변식·한계 | - -담당자는 할당 문서만 수정하고 peer를 재위임하지 않는다. 현재 I/O·구현·solver 물리 검증을 수행하며 빈 보고서는 생성하지 않는다. 수식 검산은 solver build/test나 지정 reference의 동적 해석 통과 evidence와 구별한다. +Consistent kinetic mass, 물리적 a/보조 A, generalized/spatial moment, full residual을 구분한다. +C08a/C08b 실패·C04a SKIP과 가속도 복구 후보의 미채택을 유지한다. 원본 변위 비교 PASS와 +굽힘 단면력 계수 수정은 실제 shell 시간수렴 또는 동해석 전체 완료를 뜻하지 않는다. diff --git a/docs/hht-implicit-dynamics/PRD.md b/docs/hht-implicit-dynamics/PRD.md index db68a40..fe593dd 100644 --- a/docs/hht-implicit-dynamics/PRD.md +++ b/docs/hht-implicit-dynamics/PRD.md @@ -7,9 +7,9 @@ ## 사용자 요청과 범위 -사용자는 HHT implicit 적분법을 사용한 dynamic 해석 구현을 준비하기 위해 requirement/research, formulation, numerical research를 차례로 요청했고, 검증 모델로 `reference/shellNL-dyn-meshfine`을 지정했다. 현재 산출물은 요구사항·근거·정식화·독립 수치 검토와 검증 계약이다. 사용자의 후속 I/O definition·implementation·physics evaluation 전체 진행 요청에 따라 [I/O 계약](io-contract.md)과 [구현 계획](implementation-plan.md)을 작성하고 실제 solver 구현·검증을 진행한다. +사용자는 HHT implicit 적분법을 사용한 dynamic 해석 구현을 준비하기 위해 requirement/research, formulation, numerical research를 차례로 요청했고, 검증 모델로 `reference/shellNL-dyn-meshfine`을 지정했다. 현재 산출물은 요구사항·근거·정식화·독립 수치 검토와 검증 계약이다. 사용자의 후속 I/O definition·implementation·physics evaluation 전체 진행 요청에 따라 [I/O 계약](io-contract.md)과 [구현 계획](README.md#재사용-handoff)을 작성하고 실제 solver 구현·검증을 진행한다. -[시간적분 정식화](formulation.md)와 [shell 관성 상세](formulation-inertia.md)의 후속으로 [독립 수치 검토](numerical-review.md), [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [추가 연구](numerical-research.md)를 작성한다. 사용자가 **consistent kinetic mass**를 선택했으며 이번 HHT 구현 범위는 일관질량이다. 후속 전체 gate 진행 요청에 따른 구현 대상·공개 subset·출력 schema는 [HHT-ADR-009](ADR.md)에 기록한다. +[시간적분 정식화](formulation.md)와 [shell 관성 상세](formulation-inertia.md)의 후속으로 [독립 수치 검토](numerical-review.md#numerical-review), [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [추가 연구](research.md#numerical-research)를 작성한다. 사용자가 **consistent kinetic mass**를 선택했으며 이번 HHT 구현 범위는 일관질량이다. 후속 전체 gate 진행 요청에 따른 구현 대상·공개 subset·출력 schema는 [HHT-ADR-009](ADR.md)에 기록한다. 최소 구현 목표 후보는 기존 FESA-MITC4 shell의 선형 탄성 재료·기하비선형 동적 해석이다. 단일 step의 `*Dynamic,direct`, 초기 정지 상태, 고정 외곽 경계와 집중하중에 필요한 지원을 우선 정의한다. 질량·회전 관성·HHT 생략값·공식 동적 결과 범위는 근거를 확인하여 후속 정식화와 연결한다. 임의 amplitude, 시간변화 경계, 물리적 damping, contact, 소성, explicit, 다중 step/restart 또는 다른 요소의 dynamics는 이번 요청에서 지원을 약속하지 않는다. @@ -45,7 +45,7 @@ Density 허용과 HHT update 식 추가만으로 기능이 완성되는 것은 결정 기록은 [ADR](ADR.md), 결정 항목의 원본은 [requirements의 HHT-OPEN-001–006](requirements.md#범위-경계와-미결정-사항)이다. 질량 종류는 사용자 결정으로 확정했다. 수식과 수치 검증 계약을 연결하되 공개 parameter·결과 범위 및 I/O binding은 후속으로 확정한다. 문서 검토만으로 구현이 검증되었다고 표시하지 않는다. -이번 [Research](research.md)에서 확인한 공개 입력 의미는 무접촉 기본 HHT-TF 계수 `alpha=-0.05`, `beta=0.275625`, `gamma=0.55`, amplitude 생략 시 STEP 하중, DIRECT 고정 증분 및 기본 초기 가속도 계산이다. 최초 HHT force history와 초기 frame의 결합, FESA 질량·유한회전 관성 및 공개 결과 범위는 여전히 후속 계약이 필요하다. 원 HHT의 표준 결합 계수 범위와 vendor가 허용하는 전체 parameter 범위를 혼동하지 않는다. +이번 [Research](research.md#research)에서 확인한 공개 입력 의미는 무접촉 기본 HHT-TF 계수 `alpha=-0.05`, `beta=0.275625`, `gamma=0.55`, amplitude 생략 시 STEP 하중, DIRECT 고정 증분 및 기본 초기 가속도 계산이다. 최초 HHT force history와 초기 frame의 결합, FESA 질량·유한회전 관성 및 공개 결과 범위는 여전히 후속 계약이 필요하다. 원 HHT의 표준 결합 계수 범위와 vendor가 허용하는 전체 parameter 범위를 혼동하지 않는다. Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference에 대한 `dt/T1=7.4567`은 작은 응답과 성긴 시간간격을 보여준다. 이 CSV와의 일치만으로 큰 회전 관성, V/A 또는 시간 정확도를 검증할 수 없다. 단위계는 입력의 일관된 단위를 따르며 SI로 단정하지 않는다. @@ -53,7 +53,7 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference [정식화](formulation.md)의 추천 후보는 유한회전 kinetic energy의 정확한 관성력과 물리적 가속도 `a` / 적분용 보조 가속도 `A`의 분리다. `A_(n+1)=(1+alpha)a_(n+1)-alpha a_n`를 Newmark update에 사용하고 endpoint 물리 평형을 푼다. 일정 질량에서는 기존 HHT 식으로 환원한다. 비선형 내력은 현행 dev의 objective drilling을 포함한 에너지 미분을 보존하며 이전 논문 실험의 접선·drilling 변경을 도입하지 않는다. -[독립 수식 검토](numerical-review.md)와 [재현 가능한 검산](numerical-review-probes.md)은 일정 질량 HHT 식에 `M(q)`만 대입하면 일반적으로 1차 오차가 남음을 확인했다. 추천 후보는 smooth variable-mass 제조해와 영질량 방향이 회전하는 제한된 모델에서 U/V/물리적 a의 2차 수렴을 보였다. 메인도 공개된 재현 코드를 실행하여 표의 결과를 확인했다. 이는 실제 MITC4 shell의 동적 해석 또는 보편적인 singular-DAE 증명의 대체물이 아니다. +[독립 수식 검토](numerical-review.md#numerical-review)와 [재현 가능한 검산](numerical-review.md#numerical-review-probes)은 일정 질량 HHT 식에 `M(q)`만 대입하면 일반적으로 1차 오차가 남음을 확인했다. 추천 후보는 smooth variable-mass 제조해와 영질량 방향이 회전하는 제한된 모델에서 U/V/물리적 a의 2차 수렴을 보였다. 메인도 공개된 재현 코드를 실행하여 표의 결과를 확인했다. 이는 실제 MITC4 shell의 동적 해석 또는 보편적인 singular-DAE 증명의 대체물이 아니다. | 기존 open 항목 | 이번 정식화에서 구체화한 후보 | 남은 결정/검증 | | --- | --- | --- | @@ -72,7 +72,7 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference [검증 사례 C01–C12](verification-cases.md)는 oscillator·STEP 초기화·variable mass·moving null, 운동에너지 적분·관성 접선, 반력·에너지·실제 shell 유한회전, 실패 보존·결정론·전체 reference 이력을 포함한다. D3 회전 미분에는 독립 block-exponential oracle를 지정했다. 문서 gate 당시 신규 solver 사례는 모두 NOT RUN이었다. 현재 실행 결과는 아래 checklist와 [독립 수치 검토](implementation-numerical-review.md), [물리 평가](physics-evaluation.md)에 구분한다. -추가 full Cartesian moving-null 수식 probe는 전체 시점 최대 오차에서 q/v/물리적 a의 최종 refinement 차수 `1.99985/1.99992/1.99834`를 보였고 독립 reviewer가 재현했다. 이는 기하학적 normalization이나 각도 축약 없이 계산한 제한된 수식 evidence다. 전체 N1–N7 구현 검사와 실제 shell·reference 통과를 의미하지 않는다. 자세한 실행 범위는 [수식 검산](numerical-review-probes.md)에 기록한다. +추가 full Cartesian moving-null 수식 probe는 전체 시점 최대 오차에서 q/v/물리적 a의 최종 refinement 차수 `1.99985/1.99992/1.99834`를 보였고 독립 reviewer가 재현했다. 이는 기하학적 normalization이나 각도 축약 없이 계산한 제한된 수식 evidence다. 전체 N1–N7 구현 검사와 실제 shell·reference 통과를 의미하지 않는다. 자세한 실행 범위는 [수식 검산](numerical-review.md#numerical-review-probes)에 기록한다. ## 현재 checklist diff --git a/docs/hht-implicit-dynamics/README.md b/docs/hht-implicit-dynamics/README.md new file mode 100644 index 0000000..a1b7082 --- /dev/null +++ b/docs/hht-implicit-dynamics/README.md @@ -0,0 +1,36 @@ +# HHT implicit dynamics + +## 목적과 현재 상태 + +Consistent kinetic mass, 정확한 유한회전 관성·convective 항, HHT 잔차·접선·증분 state와 +HDF5를 구현했다. 원본 U의101-frame 비교 PASS와 UR 경고200건 기록이 있지만 실제 shell의 +C08a/C08b 시간수렴 실패는 미해결이다. 구현됨과 기능 검증 완료를 구분한다. + +## 계약과 사용법 + +- [PRD](PRD.md)·[ADR](ADR.md)·[요구사항](requirements.md): 범위·미해결·현재 checklist. +- [정식화](formulation.md), [유한회전 관성](formulation-inertia.md), + [가속도 복구 후보](formulation-acceleration-recovery.md): 채택식과 미채택 후보 구분. +- [I/O](io-contract.md), [reference 계약](reference-model.md), + [전체 변위 비교표](displacement-comparison-tables.md). +- [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), + [수학 검산](numerical-review.md#numerical-review), [연구](research.md#research). +- [구현 검토·실패·수정](implementation-numerical-review.md), [물리 평가](physics-evaluation.md). + +환경·명령은 [operations](../operations.md)를 따른다. I/O의 지원 `*DYNAMIC, DIRECT` subset과 고정 HHT 계수, +출력의 물리적 가속도와 보조 acceleration 구분을 확인한다. + +## 재사용 Handoff + +Eigen derived lumped mass와 HHT consistent kinetic mass는 목적이 다르다. Total rotation-vector +chart의 generalized moment와 spatial moment도 다르다. Physical a와 algorithmic A를 바꾸어 +쓰지 않으며 moving-null 제약과 동적·대수 초기평형을 유지한다. 같은 trial에서 full residual, +inertia와 tangent를 계산하고 실패 candidate가 accepted history를 변경하지 않게 한다. + +## 실패·시행착오·다음 작업 + +C08 두 실패는 열해석 전후 전체617개 회귀에서도 baseline metric과 동일했다. +가속도 복구 후보는 아직 채택하지 않았다. C09–C11의 잔여 coverage와 전체 physics 완료도 +남아 있다. 굽힘 단면력의 두께 계수 `M=t^3 C kappa/12` 수정은14 focused tests 및 원본 +HDF5 대조의 별도 evidence이며 동해석 전체의 완료를 뜻하지 않는다. +과거475 PASS/1 SKIP의 제외 실행과 최신 전체 회귀를 합치지 않는다. diff --git a/docs/hht-implicit-dynamics/formulation-inertia.md b/docs/hht-implicit-dynamics/formulation-inertia.md index 669f99a..6d27ae3 100644 --- a/docs/hht-implicit-dynamics/formulation-inertia.md +++ b/docs/hht-implicit-dynamics/formulation-inertia.md @@ -81,7 +81,7 @@ C_{ij}^{(1)}B_i^T&C_{ij}^{(2)}B_i^TB_j `rho`의 차원은 `mass/length³`, `(C0,C1,C2)` 및 `(m,s,j)`의 차원은 `(mass,mass·length,mass·length²)`다. `M_uu/M_uphi/M_phiphi`는 각각 같은 세 차원, residual translation은 force, rotation은 force·length이다. `v_u,a_u`는 `length/time,length/time²`; `v_phi,a_phi,omega,omega_dot`는 `1/time,1/time²`. 각도 단위는 rad이며 SI를 추정하지 않는다. -Moments는 현행 [eigen2 mass 계약 M2–M3](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md#m2-consistent-scalar-moments와-적분)의 `3×3×3` Gauss–Legendre를 기준으로 하며, 그 scalar-moment lumping은 비교식에만 사용한다. 긴 유도는 선행 [mass 계약 M3](../mitc4-shell-feast-eigen/formulation-mass.md#m3-consistent-matrix와-충분한-quadrature)에 있다. 점은 `−sqrt(3/5),0,+sqrt(3/5)`, weight는 `5/9,8/9,5/9`, 순서는 증가하는 `xi→eta→zeta`다. Geometry가 bilinear degenerated shell이고 rho/t가 일정할 때 `Ni Nj z^k J0`의 축별 차수는 최대 4여서 이 moment 적분은 정확하다. `B_i`와 그 도함수는 nodal 값이므로 현재 관성과 tangent도 같은 moment를 사용한다. +Moments는 현행 [eigen2 mass 계약 M2–M3](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md#m2-consistent-scalar-moments와-적분)의 `3×3×3` Gauss–Legendre를 기준으로 하며, 그 scalar-moment lumping은 비교식에만 사용한다. 긴 유도는 선행 [mass 계약 M3](../mitc4-shell-feast-eigen/formulation.md#formulation-mass--m3-consistent-matrix와-충분한-quadrature)에 있다. 점은 `−sqrt(3/5),0,+sqrt(3/5)`, weight는 `5/9,8/9,5/9`, 순서는 증가하는 `xi→eta→zeta`다. Geometry가 bilinear degenerated shell이고 rho/t가 일정할 때 `Ni Nj z^k J0`의 축별 차수는 최대 4여서 이 moment 적분은 정확하다. `B_i`와 그 도함수는 nodal 값이므로 현재 관성과 tangent도 같은 moment를 사용한다. 모든 27 mass 점에서 finite positive `J0`와 기존 geometry predicate를 확인한다. Current trial도 내력 8점·tying·center·recovery와 추가 inertia 평가점에서 허용 geometry를 만족해야 한다. `abs(J)`, 점 생략, 강제 평면화는 없다. 물리 내력·물리 에너지와 section recovery는 기존 `2×2×2` 적분, drill potential은 기존 element-level 합을 보존한다. @@ -196,7 +196,7 @@ v_{n+1}-v_n=h\{-\alpha(1-\gamma)a_{n-1} 세 coefficient 합은 1, `a_(n−1),a_n,a_(n+1)`의 시간 offset `−1,0,+1`에 대한 first moment는 `alpha+gamma=1/2`다. 여기에는 `Mdot` 잔여항이 없다. Endpoint equation이 nonsingular mass의 smooth `a=f(q,v,t)`를 정의하면 q/v의 2차 일관성과 안정성 검토를 할 수 있고 physical a도 같은 해의 정확도를 따른다. 이는 nonlinear mass의 smooth manufactured verification을 요구하는 근거이며 독립 수치 검토를 대신하지 않는다. -문헌의 nonsingular mechanical solve 및 regular index-3 조건과 달리 본 shell은 drilling direction에서 singular `M`을 가진다. §4의 `psi_qN` regularity와 constant rank의 실제 지원 범위, redundant full-coordinate 구현에서의 hidden-constraint drift·q/v/a 정확도는 **구현 후 필수 검증 항목**이다. 이 조건으로 reduced smooth dynamics를 설명할 수 있는 범위를 확인하되 모든 shell에 대한 보편 정리를 요구하지 않는다. [독립 검토](numerical-review.md)는 현 수식 후보를 대조했고, [독립 검산](numerical-review-probes.md)의 smooth variable-mass / moving-null 예제는 이를 지지한다. 이 제한된 evidence가 실제 shell/drilling 검증을 대신하지 않으며 유한회전 지원 범위를 축소하는 근거도 아니다. +문헌의 nonsingular mechanical solve 및 regular index-3 조건과 달리 본 shell은 drilling direction에서 singular `M`을 가진다. §4의 `psi_qN` regularity와 constant rank의 실제 지원 범위, redundant full-coordinate 구현에서의 hidden-constraint drift·q/v/a 정확도는 **구현 후 필수 검증 항목**이다. 이 조건으로 reduced smooth dynamics를 설명할 수 있는 범위를 확인하되 모든 shell에 대한 보편 정리를 요구하지 않는다. [독립 검토](numerical-review.md#numerical-review)는 현 수식 후보를 대조했고, [독립 검산](numerical-review.md#numerical-review-probes)의 smooth variable-mass / moving-null 예제는 이를 지지한다. 이 제한된 evidence가 실제 shell/drilling 검증을 대신하지 않으며 유한회전 지원 범위를 축소하는 근거도 아니다. ### 5.3 다른 후보와 채택하지 않은 이유 diff --git a/docs/hht-implicit-dynamics/formulation.md b/docs/hht-implicit-dynamics/formulation.md index c1ec22a..830ff44 100644 --- a/docs/hht-implicit-dynamics/formulation.md +++ b/docs/hht-implicit-dynamics/formulation.md @@ -2,7 +2,7 @@ - 상태: `independently-reviewed-candidate; physics-and-validation-pending`. - Owner: `formulation-agent`, 2026-09-22. 문서 gate 산출물이며 구현 승인이나 수치 검증 통과가 아니다. -- 기준: [프로젝트 지침](../../AGENTS.md), [제품 PRD](../PRD.md), [공통 ADR](../ADR.md#adr-028), [Feature PRD](PRD.md), [요구사항](requirements.md), [연구](research.md). +- 기준: [프로젝트 지침](../../AGENTS.md), [제품 PRD](../PRD.md), [공통 ADR](../ADR.md#adr-028), [Feature PRD](PRD.md), [요구사항](requirements.md), [연구](research.md#research). - 관성의 전개식·초기 일관성·정확도 근거는 [formulation-inertia](formulation-inertia.md)가 소유한다. 영속 schema, C++ 저장 구조와 tolerance는 정의하지 않는다. ## 1. 결론과 적용 범위 @@ -117,7 +117,7 @@ T_L=\frac12\sum_i\left(m_i|v_{ui}|^2+2s_i v_{ui}\cdot B_iv_{\phi i} \beta=\frac14(1-\alpha)^2. \] -기본값은 `alpha=−0.05`, `beta=0.275625`, `gamma=0.55`다. [공개 기본값 근거](research.md#3-reference-입력의-공개-의미)와 [Sandia의 결합계수](https://www.sandia.gov/files/sierra/SM_Users_5_20/main/implicit/integration.html)를 따른다. `alpha=0`은 평균가속도 Newmark다. 이 범위는 일반 유한회전 문제의 무조건 안정성이나 큰 시간간격의 정확도를 보증하지 않는다. 별도 `beta/gamma` 입력을 승인한 의미도 아니다. +기본값은 `alpha=−0.05`, `beta=0.275625`, `gamma=0.55`다. [공개 기본값 근거](research.md#research--3-reference-입력의-공개-의미)와 [Sandia의 결합계수](https://www.sandia.gov/files/sierra/SM_Users_5_20/main/implicit/integration.html)를 따른다. `alpha=0`은 평균가속도 Newmark다. 이 범위는 일반 유한회전 문제의 무조건 안정성이나 큰 시간간격의 정확도를 보증하지 않는다. 별도 `beta/gamma` 입력을 승인한 의미도 아니다. **FESA 초기화 후보 계약:** frame 0은 `t=0+`, `q_0=v_0=0`, 전값 `F_0=F*`다. `M_ff(q_0)a_f0=F_f0−f_int,f(q_0)`와 [mass-null 일관성](formulation-inertia.md#4-mass-null과-초기-일관성)을 함께 풀어 `a_0`를 구한다. `A_0=a_0`, `g_0=f_int(q_0)−F_0`를 정의한다. `g_0=0` 또는 `a_0=0`을 임의 대입하지 않는다. 이는 공개 STEP 의미에 맞춘 FESA 계약 제안이며 Abaqus의 숨은 첫 history 생성 절차를 확인한 주장이 아니다. @@ -210,6 +210,6 @@ W_{0\to n}=F^{\star T}(q_n-q_0),\quad | 구현 lifecycle | 동일 state tangent, 실패 rollback, time/frame 순서, deterministic assembly와 반복 결과 | | 외부 reference | 지정 원본 101 frames × 9 nodes, frame/instance/node/component의 exact mapping; U blocking / UR warning-only 및 공통 TOLERANCE. V/A/energy correctness는 해당 CSV에 coverage 없음 | -수식 후보의 [독립 검토](numerical-review.md)는 완료되었으며 표시된 수식에서 새 오류는 발견되지 않았다. 질량 선택은 consistent로 확정되었다. 구현 전 남은 계약은 (1) HHT 확장·초기화의 FESA 채택과 나머지 physics 범위, (2) initial algebraic regularity와 trial 실패 판정의 수치 기준, (3) 공식 output 의미의 공개 범위/I/O다. 이 선택 후 구현할 수 있는 수식 후보이며, 실제 유한회전 shell의 drilling DAE·관성 tangent·q/v/a 시간 수렴은 **구현 후 기능 acceptance에 필요한 검증**이다. 부모 문헌의 nonsingular-mass 조건을 shell mass-null에 자동 적용하지 않되, 모든 shell DAE의 보편적 수렴 증명을 코드 작성의 선행 조건으로 요구하지 않는다. 현재 문서 완료나 제한된 probe를 전체 solver 승인·검증 통과로 표시하지 않는다. +수식 후보의 [독립 검토](numerical-review.md#numerical-review)는 완료되었으며 표시된 수식에서 새 오류는 발견되지 않았다. 질량 선택은 consistent로 확정되었다. 구현 전 남은 계약은 (1) HHT 확장·초기화의 FESA 채택과 나머지 physics 범위, (2) initial algebraic regularity와 trial 실패 판정의 수치 기준, (3) 공식 output 의미의 공개 범위/I/O다. 이 선택 후 구현할 수 있는 수식 후보이며, 실제 유한회전 shell의 drilling DAE·관성 tangent·q/v/a 시간 수렴은 **구현 후 기능 acceptance에 필요한 검증**이다. 부모 문헌의 nonsingular-mass 조건을 shell mass-null에 자동 적용하지 않되, 모든 shell DAE의 보편적 수렴 증명을 코드 작성의 선행 조건으로 요구하지 않는다. 현재 문서 완료나 제한된 probe를 전체 solver 승인·검증 통과로 표시하지 않는다. -이번 owner 작업은 기존 정식화·source 대조, 일차 문헌 대조와 수식 유도 및 문서 정적 검토다. [독립 시간정확도 검산](numerical-review-probes.md)은 variable-mass SDOF와 moving-null 예제에서 추천 후보의 약 2차 q/v/physical-a 수렴을 관찰했고 naive 확대의 약 1차 오차를 구별했다. 이는 shell solver 검증이나 일반 drilling DAE 증명을 대신하지 않는다. Build/test·solver/reference 실행은 문서 작업 범위가 아니므로 미실행이다. 독립 검산과 Numerical Review 결과는 해당 owner의 보고서가 소유하며 본 문서가 스스로 승인하지 않는다. +이번 owner 작업은 기존 정식화·source 대조, 일차 문헌 대조와 수식 유도 및 문서 정적 검토다. [독립 시간정확도 검산](numerical-review.md#numerical-review-probes)은 variable-mass SDOF와 moving-null 예제에서 추천 후보의 약 2차 q/v/physical-a 수렴을 관찰했고 naive 확대의 약 1차 오차를 구별했다. 이는 shell solver 검증이나 일반 drilling DAE 증명을 대신하지 않는다. Build/test·solver/reference 실행은 문서 작업 범위가 아니므로 미실행이다. 독립 검산과 Numerical Review 결과는 해당 owner의 보고서가 소유하며 본 문서가 스스로 승인하지 않는다. diff --git a/docs/hht-implicit-dynamics/implementation-numerical-review.md b/docs/hht-implicit-dynamics/implementation-numerical-review.md index 098c1e2..26b957e 100644 --- a/docs/hht-implicit-dynamics/implementation-numerical-review.md +++ b/docs/hht-implicit-dynamics/implementation-numerical-review.md @@ -38,13 +38,13 @@ NR-006의 최소 exact 구현 경로는 공개 moment-load가 0이고 동일 nod Newmark의 q/v는 A를 사용하고 물리 a는 `(A+alpha*a_old)/(1+alpha)`로 회복한다. Effective tangent의 rate 계수, force/moment 별 uncancelled Newton scale, 네 correction gate, 100번째 correction 뒤 재평가, fixed DIRECT `n*h`, endpoint reaction 및 현재 arm/`Jl^-T` spatial moment balance를 대조했다. Constant STEP load의 work `F·q`와 `T+Uphys+Udrill−E0−W`는 현 하중 범위와 맞으며 energy 감소를 강제하지 않는다. 이것은 실제 moving-shell 시간 정확도 인증이 아니다. -메인 실행 로그를 독립 열람했다. [focused.log](../../.harness/build/hht-numerical/focused.log)는 관성 8 tests와 일반 finite-rotation internal D3 sweep, HHT helper 3 tests의 통과를 보인다. 같은 실행 전체는 당시 mapper/writer 7 failures가 있어 전체 PASS가 아니다. `DynamicRotation.*`의 inverse/null/D3 oracle suite는 이 로그에 없어 별도 실행 확인이 필요하다. 당시 없었던 internal 작은각 threshold fixture는 아래 후속 로그에서 통과했다. +메인 실행 로그를 독립 열람했다. focused.log(당시 경로: `../../.harness/build/hht-numerical/focused.log`, 현재 checkout에 없음)는 관성 8 tests와 일반 finite-rotation internal D3 sweep, HHT helper 3 tests의 통과를 보인다. 같은 실행 전체는 당시 mapper/writer 7 failures가 있어 전체 PASS가 아니다. `DynamicRotation.*`의 inverse/null/D3 oracle suite는 이 로그에 없어 별도 실행 확인이 필요하다. 당시 없었던 internal 작은각 threshold fixture는 아래 후속 로그에서 통과했다. -[focused-procedure.log](../../.harness/build/hht-numerical/focused-procedure.log)는 algebra 7/8, all-fixed procedure, state/writer/log 통과와 총 37개 중 2개 실패를 보인다. Algebra 경계 fixture는 이후 `W=I`, `diag(1,2^-k)`로 binary-exact threshold를 검사하도록 고쳤으나 이 보고서 시점 재실행 evidence는 대기다. 나머지 실패는 mapper diagnostic fixture다. 기존 로그를 새 소스 전체 통과로 소급하지 않는다. +focused-procedure.log(당시 경로: `../../.harness/build/hht-numerical/focused-procedure.log`, 현재 checkout에 없음)는 algebra 7/8, all-fixed procedure, state/writer/log 통과와 총 37개 중 2개 실패를 보인다. Algebra 경계 fixture는 이후 `W=I`, `diag(1,2^-k)`로 binary-exact threshold를 검사하도록 고쳤으나 이 보고서 시점 재실행 evidence는 대기다. 나머지 실패는 mapper diagnostic fixture다. 기존 로그를 새 소스 전체 통과로 소급하지 않는다. -후속 [focused-exact-constraint.log](../../.harness/build/hht-numerical/focused-exact-constraint.log)는 internal residual 7 tests의 통과를 보이며, NR-005의 작은각 4 fixtures와 NR-006의 finite/warped exact ψ·gradient·Hessian 검사를 포함한다. [zero-trial-red.log](../../.harness/build/hht-numerical/zero-trial-red.log)의 기존 영변형 spurious force 실패도 확인했다. 수정 `CovariantIncrement`의 `2E=G·δg+δg·G+δg·δg`, drilling `F=I+δg⊗Gdual`는 큰 기준값의 뺄셈을 피하는 동일 수식이다. `q=0`의 exact-zero 회복은 force clamp나 tolerance 완화가 아니다. 새 zero-trial test의 통과를 확인했다. Recovery·기존 정적 영향은 전체 회귀 검사 대상이다. +후속 focused-exact-constraint.log(당시 경로: `../../.harness/build/hht-numerical/focused-exact-constraint.log`, 현재 checkout에 없음)는 internal residual 7 tests의 통과를 보이며, NR-005의 작은각 4 fixtures와 NR-006의 finite/warped exact ψ·gradient·Hessian 검사를 포함한다. zero-trial-red.log(당시 경로: `../../.harness/build/hht-numerical/zero-trial-red.log`, 현재 checkout에 없음)의 기존 영변형 spurious force 실패도 확인했다. 수정 `CovariantIncrement`의 `2E=G·δg+δg·G+δg·δg`, drilling `F=I+δg⊗Gdual`는 큰 기준값의 뺄셈을 피하는 동일 수식이다. `q=0`의 exact-zero 회복은 force clamp나 tolerance 완화가 아니다. 새 zero-trial test의 통과를 확인했다. Recovery·기존 정적 영향은 전체 회귀 검사 대상이다. -C04a는 판정을 분리한다. 위 로그에서 finest binary64 full/reduced acceleration 차이 약 `3.079e-10`이 `1e-10`을 넘었지만 N7 해상도 약 `6.296e-10` 이하다. q/v/physical-a의 시간차수·오차/noise 검사와 coarse reduction은 별개다. N7에 따라 finest reduction은 **INCONCLUSIVE**로 남길 수 있으며 threshold를 바꾸지 않는다. [decimal80 독립 검산](../../.harness/build/hht-numerical/c04a-decimal-reduction.json)의 full 2×2/scalar recurrence 차이 `<=1.70e-73`은 수학적 reduction을 지지하지만 FESA binary64의 `1e-10` 통과를 대신하지 않는다. 새 test는 시간수렴/coarse gate와 finest `GTEST_SKIP`을 분리했으며 이 보고서에서는 새 바이너리 재실행을 아직 확인하지 않았다. C04a 전체를 무조건 PASS로 합치지 않는다. +C04a는 판정을 분리한다. 위 로그에서 finest binary64 full/reduced acceleration 차이 약 `3.079e-10`이 `1e-10`을 넘었지만 N7 해상도 약 `6.296e-10` 이하다. q/v/physical-a의 시간차수·오차/noise 검사와 coarse reduction은 별개다. N7에 따라 finest reduction은 **INCONCLUSIVE**로 남길 수 있으며 threshold를 바꾸지 않는다. decimal80 독립 검산(당시 경로: `../../.harness/build/hht-numerical/c04a-decimal-reduction.json`, 현재 checkout에 없음)의 full 2×2/scalar recurrence 차이 `<=1.70e-73`은 수학적 reduction을 지지하지만 FESA binary64의 `1e-10` 통과를 대신하지 않는다. 새 test는 시간수렴/coarse gate와 finest `GTEST_SKIP`을 분리했으며 이 보고서에서는 새 바이너리 재실행을 아직 확인하지 않았다. C04a 전체를 무조건 PASS로 합치지 않는다. Build/CTest는 메인/구현 owner가 담당하며 reviewer가 별도 C++ 실행을 했다고 주장하지 않는다. 문서 `git diff --check`는 exit 0이다. NR-008 문서 정합성, 새 algebra/rotation oracle 실행, 실제 shell의 시간수렴·energy·moving-null·reference 검증이 남는다. 본 보고서는 전체 기능/물리 gate 통과 판정이 아니다. @@ -119,7 +119,7 @@ print(json.dumps(result, indent=2)) [C08 source](../../tests/unit/analysis/hht_shell_physics_test.cpp)의 `RunPlate`, `InitializeNullVelocity`, `Differences`, `RecordNoise`를 대조했다. q0=0에서 null=e_phi3, f=0이므로 stiffness phi3 행으로 초기 ψ_q를 구성하는 식은 맞다. Initial physical director/null velocity, physical/hidden2 a0, A0=a0, old physical-a history, correction length scaling, `fine.history[2*frame]` 시간 대응과 T/T² normalization도 일치한다. `RecordNoise`의 free-vector nodal indexing은 이 all-free fixture에서는 유효하며 partial BC로 일반화하면 안 된다. **큰 rotational-rate 비수렴을 설명하는 구체적인 driver 인덱스·산술 오류는 찾지 못했다.** -[최신 optimized 진단](../../.harness/build/hht-numerical/c08-diagnostic-20260926.log)의 C08a finest angular-a 최대는 `n=10,t=.0390625`로 scalar transient peak와 일치한다. Total error `5.67565924e-4` 중 current-null 성분은 `5.58582318e-4`, physical complement는 `1.00582661e-4`다. Startup 가설을 지지하지만 physical 성분도 해당 node/time에서 이미 `1e-4`를 넘는다. 전체 node/time physical maximum 및 recovery 결과가 없으므로 null-only 회복으로 C08a가 통과한다고 예측할 수 없다. +최신 optimized 진단(당시 경로: `../../.harness/build/hht-numerical/c08-diagnostic-20260926.log`, 현재 checkout에 없음)의 C08a finest angular-a 최대는 `n=10,t=.0390625`로 scalar transient peak와 일치한다. Total error `5.67565924e-4` 중 current-null 성분은 `5.58582318e-4`, physical complement는 `1.00582661e-4`다. Startup 가설을 지지하지만 physical 성분도 해당 node/time에서 이미 `1e-4`를 넘는다. 전체 node/time physical maximum 및 recovery 결과가 없으므로 null-only 회복으로 C08a가 통과한다고 예측할 수 없다. 같은 로그의 C08b finest rotational q/v/a self difference는 `1.38700902e-4 / 1.15434080e-2 / .868938812`다. 마지막 acceleration noise 합은 약 `5.426e-6`이므로 큰 차이를 N7 산술/solve 해상도로 설명할 수 없다. Cubic 반례는 q가 exact하므로 C08b q plateau까지 증명한 원인은 아니다. 다음 진단은 처음/최대/후반/최종 오차의 node·시간과 analytic null/physical complement별 q/v/a 차이, 초기값 grid independence, 대표 frame의 residual/effective tangent 대조다. Alpha·grid·fixture를 바꿔 기존 FAIL을 지워서는 안 된다. @@ -143,9 +143,9 @@ Null acceleration correction은 `B*N=0`이므로 현재 q/v의 director accelera **HHT-IMP-NR-011 — source corrected; optimized focused regression passed.** Main이 식별한 [RecoverState](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 bending resultant 계수를 독립 검산했다. `z=t*zeta/2`, `dz=t/2*d(zeta)`이므로 `M=∫z*S*dz=(t²/4)*Σw*zeta*S`다. 기존 `t/4`는 두께 1개가 누락되어 moment per length의 단위 `[force]` 대신 membrane resultant와 같은 `[force/length]`가 된다. 현재 소스의 `0.25*thickness_*thickness_*thickness_sign*gauss*stress` 수정은 부호·단위·두께 적분과 맞는다. -[새 test](../../tests/unit/elements/nonlinear_mitc4_shell_test.cpp)의 flat reference, quadratic-through-thickness stress에서 `t²/12*(S_top-S_bottom)`은 odd first moment의 정확한 별도 샘플 oracle다. `t=.2,.5,2` 선택은 t=1이 누락 계수를 숨기는 문제를 피한다. [수정 전 로그](../../.harness/build/hht-numerical/bending-moment-red.log)의 t=2에서 계산값 `4.36084804185815`, oracle `8.72169608371628`의 factor2 실패도 식과 일치한다. 수정 후 실행 및 기존 static recovery 영향은 owner 검증 대기다. 이 변경은 recovery의 section resultant에 한정되며 internal force/tangent 식이나 HHT recurrence를 변경하지 않는다. C08 시간수렴 FAIL의 해결로 분류하면 안 된다. +[새 test](../../tests/unit/elements/nonlinear_mitc4_shell_test.cpp)의 flat reference, quadratic-through-thickness stress에서 `t²/12*(S_top-S_bottom)`은 odd first moment의 정확한 별도 샘플 oracle다. `t=.2,.5,2` 선택은 t=1이 누락 계수를 숨기는 문제를 피한다. 수정 전 로그(당시 경로: `../../.harness/build/hht-numerical/bending-moment-red.log`, 현재 checkout에 없음)의 t=2에서 계산값 `4.36084804185815`, oracle `8.72169608371628`의 factor2 실패도 식과 일치한다. 수정 후 실행 및 기존 static recovery 영향은 owner 검증 대기다. 이 변경은 recovery의 section resultant에 한정되며 internal force/tangent 식이나 HHT recurrence를 변경하지 않는다. C08 시간수렴 FAIL의 해결로 분류하면 안 된다. -후속 [optimized recovery 실행](../../.harness/build/hht-numerical/recovery-green-optimized.log)을 독립 열람하여 **13 tests PASS**를 확인했다. 새 thickness moment test와 기존 small-rotation/objectivity/recovery/patch가 포함된다. 위 “검증 대기”는 최초 검토 시점 기록이며, 현재 확인한 범위는 이 focused optimized 실행이다. 전체 Debug 및 다른 reference 검증의 대체 evidence는 아니다. +후속 optimized recovery 실행(당시 경로: `../../.harness/build/hht-numerical/recovery-green-optimized.log`, 현재 checkout에 없음)을 독립 열람하여 **13 tests PASS**를 확인했다. 새 thickness moment test와 기존 small-rotation/objectivity/recovery/patch가 포함된다. 위 “검증 대기”는 최초 검토 시점 기록이며, 현재 확인한 범위는 이 focused optimized 실행이다. 전체 Debug 및 다른 reference 검증의 대체 evidence는 아니다. ## 가속도 복구 후보 독립 검토 — HHT-ADR-011 @@ -179,7 +179,7 @@ NR-013의 **explicit-time post-check 수정은 source에서 확인**했다. Manu 별도 `RecoveredAcceleration` 저장, const assembly 입력과 copied frame 사용을 대조했으며 q/v/a_h/A에 recovered 값을 대입하는 경로는 없다. 기존 acceptance assertions는 원 a_h 결과를 계속 검사한다. `CheckLinearSolve`는 recovery solve의 N2-L backward check를 수행하지만 이것만으로 N7 forward noise/시간차수를 인증할 수 없다. `Mdeltaa=||M*delta a||/(||M||*||delta a||)`는 null-action 진단이며 large correction을 고려한 실제 full E/reaction의 전후 오차 평가를 대신하지 않는다. -[최초 recovery-probe 로그](../../.harness/build/hht-numerical/c08-recovery-probe-20260926.log)의 C08a 전체 recovered angular-a maximum은 h=1/16..1/256에서 `.01351694529 / .004558583885 / .001373166739 / .0004000031671 / .0001005829141`이다. 이 값으로 계산한 마지막 두 raw order는 **1.77942349 / 1.99162617**, finest는 **1.005829141e-4**다. 따라서 기존 `>=1.8`, `<=1e-4`를 충족하지 않으며 후보 PASS가 아니다. 이 숫자는 아직 N7로 인증된 차수 evidence도 아니다. +최초 recovery-probe 로그(당시 경로: `../../.harness/build/hht-numerical/c08-recovery-probe-20260926.log`, 현재 checkout에 없음)의 C08a 전체 recovered angular-a maximum은 h=1/16..1/256에서 `.01351694529 / .004558583885 / .001373166739 / .0004000031671 / .0001005829141`이다. 이 값으로 계산한 마지막 두 raw order는 **1.77942349 / 1.99162617**, finest는 **1.005829141e-4**다. 따라서 기존 `>=1.8`, `<=1e-4`를 충족하지 않으며 후보 PASS가 아니다. 이 숫자는 아직 N7로 인증된 차수 evidence도 아니다. 같은 로그의 C08a `angular_a_null=0,angular_a_physical=0`는 **무효 diagnostic**이다. Analytic frame의 비어 있는 `nodal_internal_order`로 loop가 0회 실행됐기 때문이다. Full recovered error를 계산하는 `FrameError`는 vector size를 사용하므로 위 maximum 숫자에는 이 문제가 없다. 수정 source는 `generalized_coordinates.Size()/6`와 vector-size guard를 사용한다. 수정 후 C08a split 실행 evidence는 별도 확인해야 하며 이전 0을 exact branch로 해석하면 안 된다. C08b의 실제 accepted frame metadata는 채워져 있어 이 특정 zero-loop 문제와 구별한다. @@ -189,7 +189,7 @@ NR-013의 **explicit-time post-check 수정은 source에서 확인**했다. Manu C08b post-hidden2 ratio는 네 pair에서 `6.06e-17..1.45e-16`, normalized Mdeltaa는 약 `5e-20`이다. 수정된 autonomous scale와 null correction의 제한 consistency evidence를 지지하지만 full N7 검증이나 a 정확도 PASS가 아니다. 회복 후보 자체의 후속 검증과 별도로 C08b의 physical dynamics/rate 비수렴 원인을 조사해야 한다. 이 결론은 production recovery 채택 또는 새 integrator 선택을 승인하지 않는다. -후속 [C08a split 수정 실행](../../.harness/build/hht-numerical/c08-recovery-split-spectrum-20260927.log)은 **2 tests / 1 PASS / 1 FAIL**로 완료됐고 C08a temporal FAIL을 유지했다. Recovered full maximum은 이전 실행과 같으며, finest exact-state common projector의 angular-a null/physical maximum은 각각 **`4.64641213e-7 / 1.00582661e-4`**다. False-zero split 문제는 이 실행으로 수정 확인했다. 남은 C08a recovered maximum도 physical complement가 지배하며 finest `1e-4` 초과는 그대로다. 별도 matrix dump test의 PASS는 spectral/시간해상도 결론을 뜻하지 않으며 이 검토에서 spectrum 계산을 수행하지 않았다. +후속 C08a split 수정 실행(당시 경로: `../../.harness/build/hht-numerical/c08-recovery-split-spectrum-20260927.log`, 현재 checkout에 없음)은 **2 tests / 1 PASS / 1 FAIL**로 완료됐고 C08a temporal FAIL을 유지했다. Recovered full maximum은 이전 실행과 같으며, finest exact-state common projector의 angular-a null/physical maximum은 각각 **`4.64641213e-7 / 1.00582661e-4`**다. False-zero split 문제는 이 실행으로 수정 확인했다. 남은 C08a recovered maximum도 physical complement가 지배하며 finest `1e-4` 초과는 그대로다. 별도 matrix dump test의 PASS는 spectral/시간해상도 결론을 뜻하지 않으며 이 검토에서 spectrum 계산을 수행하지 않았다. ### C08b 초기 spectrum 독립 재현 @@ -208,7 +208,7 @@ C08b post-hidden2 ratio는 네 pair에서 `6.06e-17..1.45e-16`, normalized Mdelt | Full generalized residual maximum | `2.62506622e-15` | | `||Phi^T*M*Phi-I||F` | `8.78577073e-15` | -Full residual metric은 각 mode의 `||K*phi-lambda*M*phi||2 / [(||K||2+abs(lambda)*||M||2)*||phi||2]`다. 독립 `eigh`의 최저 여섯 raw eigenvalue는 `[-1.63581e-11,-7.39169e-12,-7.29645e-12,2.01889e-12,3.26844e-12,8.09326e-12]`, 그 다음은 `44.22815124448042`였다. [Main eigvalsh JSON](../../.harness/build/hht-numerical/c08b-initial-spectrum-20260927.json)의 raw 값과 전체 최대 차이는 `7.276e-11`이며 최대 ω는 표시 precision에서 동일하다. 음수 값을 0으로 바꾸거나 그 제곱근을 계산하지 않았다. 별도로 3 translations와 `u=Omega×X,phi=Omega`의 3 analytic rigid fields는 `||K*R||F/(||K||F*||R||F)=2.27995067e-17`이었다. 이는 여섯 near-zero 값의 rigid-mode 해석을 지지하며 nonlinear stability 인증은 아니다. +Full residual metric은 각 mode의 `||K*phi-lambda*M*phi||2 / [(||K||2+abs(lambda)*||M||2)*||phi||2]`다. 독립 `eigh`의 최저 여섯 raw eigenvalue는 `[-1.63581e-11,-7.39169e-12,-7.29645e-12,2.01889e-12,3.26844e-12,8.09326e-12]`, 그 다음은 `44.22815124448042`였다. Main eigvalsh JSON(당시 경로: `../../.harness/build/hht-numerical/c08b-initial-spectrum-20260927.json`, 현재 checkout에 없음)의 raw 값과 전체 최대 차이는 `7.276e-11`이며 최대 ω는 표시 precision에서 동일하다. 음수 값을 0으로 바꾸거나 그 제곱근을 계산하지 않았다. 별도로 3 translations와 `u=Omega×X,phi=Omega`의 3 analytic rigid fields는 `||K*R||F/(||K||F*||R||F)=2.27995067e-17`이었다. 이는 여섯 near-zero 값의 rigid-mode 해석을 지지하며 nonlinear stability 인증은 아니다. | h | omega_max*h | | --- | ---: | diff --git a/docs/hht-implicit-dynamics/implementation-plan.md b/docs/hht-implicit-dynamics/implementation-plan.md deleted file mode 100644 index acef314..0000000 --- a/docs/hht-implicit-dynamics/implementation-plan.md +++ /dev/null @@ -1,43 +0,0 @@ -# HHT Implementation Plan - -**Goal:** 일관질량 HHT shell 동적 해석을 원본 입력부터 공식 HDF5·전체 reference 비교·독립 물리 평가까지 구현한다. - -**Architecture:** Domain의 별도 dynamic step과 별도 동적 state/procedure/writer를 연결한다. 기존 MITC4 내력·objective drilling은 보존하고 유한회전 consistent 관성을 정확히 미분한다. 물리적 a와 보조 A를 분리하고 candidate 검증 후에만 frame·최종 파일을 반영한다. - -**Tech Stack:** C++17, MSVC x64 Debug, CMake/Ninja/CTest, MKL/TBB/HDF5. - -**Spec:** [정식화](formulation.md), [관성](formulation-inertia.md), [내부 기준](numerical-controls.md), [검증 사례](verification-cases.md), [I/O](io-contract.md), [Reference](reference-model.md). - -## 실행 범위와 소유권 - -사용자가 I/O definition, implementation, physics evaluation을 모두 요청했으므로 기존 정식화의 추천 a/A 분리와 0+ 초기화를 구현 대상으로 채택한다. 메인은 통합·procedure·검증을 맡고 독립적인 kernel/input/writer 묶음만 구현 담당자에게 할당한다. 현재 checklist는 [PRD](PRD.md)에만 유지한다. 후속 사용자 요청에 따라 검증 묶음별 로컬 commit을 수행하며 push는 포함하지 않는다. - -| 묶음 | 파일·책임 | 검증 | -| --- | --- | --- | -| 입력 | `model_types.h`, `domain.h/.cpp`, Abaqus mapping: `DynamicStepDefinition`, `StepDefinition::Dynamic/IsDynamic`, `Domain::Dynamic` | 원본 INP, STEP·DIRECT·density·zero BC·force subset, unsupported·invalid input; static/eigen 회귀 | -| 관성 | `elements/nonlinear_mitc4_inertia.h/.cpp`: `Create(nodes,frames,section,material,density)`, `Evaluate(trial,v24,a24)` → M/I/c/DqI/DvI/T/P/L/rates | C05–C06 독립 volume·미분·null·좌표/단위 oracle | -| 상태·출력 | `analysis/dynamic_analysis_state.h/.cpp`, `results/dynamic_results_writer.h`, `io/hdf5/dynamic_hdf5_results_writer.h/.cpp` | frame0 포함 commit/rollback, finite/identity/schedule 검증, schema readback·atomic failure | -| 시간적분 | `analysis/hht_time_integration.h/.cpp`와 tests | C01–C04 정확해·HHT 환원·moving-null·초기화·소산 | -| 동적 절차 | `analysis/hht_dynamic_procedure.h/.cpp` 및 필요한 internal assembly/constraint helper | 초기 positive-range/null solve, 정확한 유효 접선, N1–N7, C07–C11 shell·관성반력·에너지·실패 | -| 통합 | `prepared_analysis.h/.cpp`, application, CMake 등록 | 원본 CLI 실행·진단·최종 HDF5; 기존 procedures 보존 | -| 비교·물리 | `tests/reference/hht_dynamic_reference_*`, 보고서와 ignored 실행 evidence | C12 202 comparison families, 101 frames 전부, 독립 physics evaluation | - -## 구현·검증 순서 - -각 묶음은 관찰 가능한 실패 사례를 먼저 추가하고 구현 후 관련 CMake target/CTest filter로 확인한다. 아직 없는 API의 컴파일 실패와 수치 oracle 실패를 구별해 기록한다. 코드 소유권이 겹치는 변경은 메인이 직렬로 통합한다. Build는 메인이 단일 경로에서 실행한다. - -1. I/O 계약의 필드·진단·source/time 연결을 정의하고 기존 문서와 대조한다. -2. Input/관성 kernel/동적 state를 구현한다. 관성의 director D3와 convective 항은 production finite difference로 대체하지 않는다. -3. HHT predictor와 물리적 endpoint 평형을 연결한다. `A=(q-q_p)/(beta*h*h)`, `v=v_p+gamma*(q-q_p)/(beta*h)`, `a=(A+alpha*a_n)/(1+alpha)`이며 tangent는 `DqI+gamma/(beta*h)*DvI+M/((1+alpha)*beta*h*h)+Kint`다. -4. N2 잔차·correction/rate AND 판정, N3 초기 대수조건, N4 analytic null·positive mass·regularity 및 실패 보존을 검증한다. Backend 성공만으로 frame을 commit하지 않는다. -5. Official HDF5 writer와 deterministic comparator를 연결한다. Reference의 source increment로 대응하고 시간 보간·행 평균·값 보정은 하지 않는다. -6. 수정 영향에 맞는 검사를 수행하고 최종 `python scripts/execute.py`로 전체 MSVC Debug build/CTest를 한 번 수행한다. 필수 원본 dynamic reference는 별도 비교 evidence를 남긴다. -7. 독립 physics reviewer가 실제 결과의 평형·운동량·에너지·coverage를 평가한다. 실패는 현 owner가 수정하며 tolerance를 결과에 맞추어 변경하지 않는다. - -## Review focus - -- a/A 혼동 또는 current M만의 naive HHT 확대: C01–C04와 output readback으로 검출한다. -- 질량 영공간을 작은 질량·fixed UR3 삭제로 처리: C04–C06의 초기·moving-null 사례로 검출한다. -- Initial full STEP force와 초기 acceleration 누락: C02와 원본 frame0의 U/V/A 의미를 대조한다. -- 실패 trial·불완전 HDF5 노출: state/writer 실패 주입 및 기존 최종 파일 보존을 검사한다. -- 101-frame identity·reference subset 오류: C12의 누락·추가·중복·nonfinite·wrong-time mutation을 사용한다. diff --git a/docs/hht-implicit-dynamics/io-contract.md b/docs/hht-implicit-dynamics/io-contract.md index bfc9911..4ccd260 100644 --- a/docs/hht-implicit-dynamics/io-contract.md +++ b/docs/hht-implicit-dynamics/io-contract.md @@ -6,7 +6,7 @@ ## 1. 입력과 호환성 -기존 [비선형 I/O](../nonlinear-static-newton-raphson/io.md)의 lexical parsing, source target resolution, part/identity instance, node/set, S4/S4R → FESA-MITC4, centered homogeneous shell, isotropic elastic material, geometry와 chart 검증을 상속한다. 아래 절차 차이만 dynamic에 적용한다. 기존 static/frequency 입력·결과의 의미나 schema는 바꾸지 않는다. Source S4/S4R 표기는 보존하며 Abaqus 내부 요소·관성·시간 알고리즘 동등성을 주장하지 않는다. 공개 Abaqus 관례의 근거는 이미 조사한 [research](research.md)의 관측 가능한 입력 의미에 한정한다. +기존 [비선형 I/O](../nonlinear-static-newton-raphson/io.md)의 lexical parsing, source target resolution, part/identity instance, node/set, S4/S4R → FESA-MITC4, centered homogeneous shell, isotropic elastic material, geometry와 chart 검증을 상속한다. 아래 절차 차이만 dynamic에 적용한다. 기존 static/frequency 입력·결과의 의미나 schema는 바꾸지 않는다. Source S4/S4R 표기는 보존하며 Abaqus 내부 요소·관성·시간 알고리즘 동등성을 주장하지 않는다. 공개 Abaqus 관례의 근거는 이미 조사한 [research](research.md#research)의 관측 가능한 입력 의미에 한정한다. | 구문 | 이번 지원 의미 / 검증 | | --- | --- | diff --git a/docs/hht-implicit-dynamics/numerical-controls.md b/docs/hht-implicit-dynamics/numerical-controls.md index f35de16..07dc82c 100644 --- a/docs/hht-implicit-dynamics/numerical-controls.md +++ b/docs/hht-implicit-dynamics/numerical-controls.md @@ -1,6 +1,6 @@ # HHT 내부 수치 판정 -[Numerical Review](numerical-review.md)의 구현용 계약이다. IEEE binary64를 기준으로 하며 [정식화](formulation.md), [관성 상세](formulation-inertia.md), [검증 사례](verification-cases.md)를 함께 적용한다. 사용자 결정 [HHT-ADR-007](ADR.md)에 따라 이번 HHT 구현은 **consistent kinetic mass**를 사용한다. 아래 lumped 대조는 기존 eigen/대안 evidence의 경계이며 새 HHT lumped 지원 요구가 아니다. 외부 reference는 [TOLERANCE](../TOLERANCE.md)만 따른다. +[Numerical Review](numerical-review.md#numerical-review)의 구현용 계약이다. IEEE binary64를 기준으로 하며 [정식화](formulation.md), [관성 상세](formulation-inertia.md), [검증 사례](verification-cases.md)를 함께 적용한다. 사용자 결정 [HHT-ADR-007](ADR.md)에 따라 이번 HHT 구현은 **consistent kinetic mass**를 사용한다. 아래 lumped 대조는 기존 eigen/대안 evidence의 경계이며 새 HHT lumped 지원 요구가 아니다. 외부 reference는 [TOLERANCE](../TOLERANCE.md)만 따른다. ## N1. Scale와 공통 규칙 diff --git a/docs/hht-implicit-dynamics/numerical-research.md b/docs/hht-implicit-dynamics/numerical-research.md deleted file mode 100644 index 230db88..0000000 --- a/docs/hht-implicit-dynamics/numerical-research.md +++ /dev/null @@ -1,152 +0,0 @@ -# HHT 수치 제어·검증 설계 추가 근거 - -- Feature: `hht-implicit-dynamics` -- Owner: `research-agent` -- Date: `2026-09-22` -- Status: `Evidence and verification candidates; numerical thresholds not selected` -- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR](../ADR.md#adr-028), [기존 연구](research.md). - -[관성 정식화](formulation-inertia.md)와 [독립 probe](numerical-review-probes.md)를 읽고 -남은 질문만 조사했다. 기존 SDOF/moving-null 계산은 재실행하지 않았다. -**사실**은 열람한 일차 자료, **도출**은 명시한 수학적 계산, **후보**는 검증 제안이다. -수치 threshold·질량 채택·물리 범위·입출력 계약은 이 문서에서 결정하지 않는다. -현재 질량 선택은 사용자 결정으로 consistent mass가 확정되었다. Shell 속도 보간의 -운동에너지를 그대로 적분하며, lumped는 이번 HHT 구현의 지원 요구에서 제외한다. - -## 1. Physical acceleration, startup와 DAE 적용 경계 - -**사실 [N1].** Brüls–Arnold (2008) author postprint pp.3–4, Eq. (5)–(8)은 -물리적 `q_ddot`와 보조 acceleration-like variable을 구분하고 보조 초기값을 -물리적 초기 가속도와 같게 둔다. 이 문서의 `A`가 논문의 보조 `a`에 대응한다. -`alpha_m=0`, `alpha_f=-alpha`를 대입하면 현재 후보의 -`A_(n+1)=(1+alpha)a_(n+1)-alpha a_n`이다. 같은 논문은 variable M일 때 이를 -force-level 가중 평형과 동일시할 수 없다고 명시한다. 이 질문에는 기존 출처가 충분하다. - -**사실 [N1]: 정리의 가정은 정확히 구분한다.** Printed p.6, “Equivalent model”은 -`[[M,-L],[-h_qddot,I-h_y]]` block의 비특이성과 index-3 조건 -`Phi_q g*_lambda`의 비특이성을 사용한다. 여기의 `h`는 논문 Eq. (4)의 algebraic -output function이며 시간간격이 아니다. Controller/algebraic coupling을 제거한 -특수형에서는 첫 조건이 M의 비특이성으로 줄어든다. 논문 전체가 무조건 “M만 -비특이이면 충분”하다고 읽어서는 안 된다. “Initial value condition”의 초기 오차 조건과 -“Constrained case”의 정칙성 하에서 얻은 수렴 결과를 singular drilling에 자동 적용할 수 없다. - -**도출/수치 제어에의 함의.** 현재 shell의 `psi=N(q)^T g=0`는 논문의 holonomic -`Phi=0`와 동일한 모델임이 아직 증명되지 않았다. 따라서 다음을 분리해서 관찰한다. - -| 관찰 대상 | 필요한 검증 후보 | 남은 한계 | -| --- | --- | --- | -| 첫 시점 | `a0`는 우측 물리 평형·초기 대수조건으로 결정한 뒤 `A0=a0`; 첫 step과 이후 오차를 분리 | 작은 Newton residual로 불일관 초기값이 정당화되지 않음 | -| 물리 a와 A | 동일 시각 정확해에 대한 q/v/physical a 차수와 `A-a`를 별도 측정 | A를 물리 출력·각운동량 미분에 대입하면 안 됨 | -| Current null | 매 configuration에서 `MN`, `N^T I`, `psi`, 양의 부분공간 mass 및 `psi_q N` 정칙성 | 이전 시점 null, 고정 UR3, 전체 M의 역행렬로 대체 불가 | -| Hidden constraints | `psi_q v+psi_t`와 `psi_q a+psi_qq[v,v]+2psi_qt v+psi_tt`의 최대·종단 결함과 dt 수렴 | 위치 평형만 만족해도 두 결함이 0인 것은 아님 | -| 반례 coverage | 현재 움직이는 영공간 예제를 full redundant coordinates로 풀어 기존 reduced-angle probe와 대조 | 기존 probe는 위치조건을 정확히 강제했으므로 full-coordinate Newton 구현 검증이 아님 | -| 고정 간격 | 기존 후보에서 dt를 줄여 같은 물리 종단시각 비교 | adaptive dt·startup 재설정은 별도 scope이며 이번 근거로 추가하지 않음 | - -**도출.** Chart 내부의 smooth q에서 projector와 null basis는 같은 물리 영공간을 나타내야 -한다. Null vector의 부호·정규화 변경 자체와 rank 손실을 구분해야 한다. -`psi_q`에는 `DN`이 들어가므로 basis를 고정한 finite difference는 별도 식을 검증하게 된다. -투영 오차·hidden defect가 큰 결과를 발견하면 정확한 projection/condensation의 채택 여부는 -formulation owner에게 돌린다. 여기서는 추가 projection을 자동 제안·채택하지 않는다. - -## 2. Double precision, conditioning 및 미분 검증 - -**사실 [N2–N4].** IEEE double의 정상수 significand는 53 bits다. LAPACK DGECON은 -선택한 1/∞ norm의 reciprocal condition number **추정값**을 반환한다. DGESVX는 -equilibration 여부를 구별하고, factor pivot이 정확히 0인 경우와 reciprocal condition이 -machine precision보다 작은 경우를 서로 다른 INFO로 보고한다. 후자는 해·오차 추정을 -계속 계산할 수 있는 warning이다. 이 공개 library 동작은 FESA failure threshold를 -자동 승인하지 않으며 vendor routine 채택 요구도 아니다. - -**도출.** Binary64에서 1의 다음 표현수 간격 `eps=2^-52`, round-to-nearest 정상 범위의 -unit roundoff `u=2^-53`를 구분한다. 문헌의 “machine epsilon” 정의와 library 반환 의미를 -확인하지 않고 두 값을 혼용하면 안 된다. 작은 perturbation의 forward error는 -대략 `condition × backward error`로 증폭되므로 residual 하나로 해의 정확도를 보장하지 못한다. - -| 질문 | 근거에 따른 분리 및 검사 후보 | -| --- | --- | -| Physical mass-null인가? | `n=[0;J_l^-1 d]`, admissible free-space intersection 같은 분석적 운동학을 원본으로 삼는다. `MN`의 수치 결함과 양의 complement의 conditioning을 각각 검사한다. | -| 작은 양의 eigenvalue인가? | 단위·두께 때문에 작은 inertia를 rcond 하나로 drilling null로 바꾸지 않는다. 예상 추가 null/geometry 이상과 positive-space accuracy loss를 구분한다. | -| 어느 rcond인가? | Full singular M의 rcond는 positive inertia 품질을 설명하지 못한다. Positive-space mass, 초기화 algebraic block, effective Newton matrix를 각각 이름 붙이고 norm·scaling을 기록한다. | -| 단위를 바꾸면? | 병진·회전 단위가 섞인 원행렬 condition은 단위 선택에 의존한다. `q=D qhat`, `Rhat=D^T R/Escale`이면 `Khat=D^T K D/Escale`라는 virtual-work 일관 scaling을 대조 후보로 삼는다. 기준 scale의 수치 선택은 NR 소유다. | -| Library equilibration이면 충분한가? | Row/column equilibration은 solver conditioning 도구다. 물리적 nondimensionalization이나 예상 null proof와 동일하지 않다. 원·scaled 행렬 중 무엇을 추정했는지 보존한다. | - -**사실 [N5].** GSL의 central differentiation은 truncation과 roundoff를 함께 추정하여 -step을 고르며, 5-point와 3-point 차이를 오차 추정에 쓴다. 따라서 가장 작은 step을 -항상 정답으로 간주하지 않는 독립 derivative 검사 설계가 공식 수치 library의 접근과 부합한다. - -**도출/후보.** Dimensionless direction p에 대해 scaled 잔차의 중심차분과 `Khat p`를 -비교하면 일반적인 smooth·비상쇄 구간에서 오차형은 `C_t delta²+C_r u/delta`다. -최적 step의 `u^(1/3)` 크기는 이 가정에서의 점근적 안내일 뿐 공통 고정값이 아니다. -Zero derivative, 큰 residual cancellation, branch 접근에서는 계수와 error floor가 달라진다. -여러 delta를 sweep하여 감소구간·최저 plateau·roundoff 증가구간을 기록하고, 모든 sample이 -같은 허용 chart와 geometry 안에 있는지 확인한다. Unit-aware scale을 쓰고 임의 -`max(1, norm)`로 작은 문제를 덮지 않는다. - -Inertia partial derivative 검사에서는 q/v/physical a 중 하나만 바꾸고 나머지는 고정한다. -Effective tangent 검사에서는 같은 trial q에 연동되는 v, A, physical a를 모두 갱신한다. -두 검사는 서로 다른 미분이므로 섞지 않는다. 작은 dt의 acceleration 재구성에는 -위치 차분 오차가 `1/dt²`로 증폭되므로 시간 차수 측정에서 너무 미세한 dt의 plateau를 -수학적 차수 저하로 오인하지 않는다. 기준 oracle 정밀도와 nonlinear solve 오차도 분리한다. - -## 3. 3차 회전 미분과 운동량·에너지 case 후보 - -**사실 [N6].** Higham–Relton의 Theorem 3.5/Algorithm 3.6은 고차 Fréchet derivative를 -재귀 block matrix function의 우상단 block으로 구한다. Matrix exponential은 smoothness -조건을 만족한다. `P=[phi]_cross` 및 세 방향 행렬에 적용하면 24×24 exponential 하나의 -3×3 우상단 block이 3차 혼합 미분을 준다. - -**후보.** 이 방식에 `d0`를 곱한 결과를 Rodrigues/회전 Jacobian의 해석 미분과 비교하면 -동일 scalar coefficient 도함수를 재사용하는 자기검증을 피할 수 있다. “Exact derivative”는 -수학적 항등식을 뜻하며 부동소수점 exp 계산까지 오차가 없다는 뜻은 아니다. -Production 의존성 추가나 24×24 exp의 runtime 사용은 요구하지 않는다. - -**자체 도출: 영회전의 유한 다항 oracle.** `H_p=[p]_cross` 등으로 쓰면 - -\[ -D^3d(0)[p,s,r]=\frac16\sum_{\sigma\in S_3} -H_{\sigma(p)}H_{\sigma(s)}H_{\sigma(r)}d_0. -\] - -이는 exponential Taylor series의 cubic 항에서 바로 얻는다. 방향 permutation 대칭, -각 방향의 선형성, 동일 방향 3회 `H_p³ d0`를 함께 검사할 수 있다. 비영 phi의 -block-exponential oracle와 `D²d`의 방향 중심차분을 추가해 영점 특례만 맞는 오류를 검출한다. -Chart 경계 안쪽, 작은 phi, 서로 비평행한 방향을 포함하되 경계를 넘어 차분하지 않는다. - -| ID | 실행 가능한 검증 설계 후보 | 판정에 필요한 한계 | -| --- | --- | --- | -| NR-E01 | 임의 유효 shell 상태에서 spatial rigid velocity를 부여하여 kinetic energy·총 P·총 L을 독립 volume integration과 대조 | Rigid velocity는 순간 운동학 검사다. 회전하는 탄성 shell이 자유운동에서도 강체를 유지한다는 가정은 하지 않음. Consistent/lumped 각각 자신의 measure를 사용 | -| NR-E02 | `I(q,v,a)`를 q/v/a별 미분하고 전체 effective tangent도 별도 directional check | 3차 director 항과 `D(H^T)` 누락을 분리 검출 | -| NR-E03 | 작은 smooth 회전 구간의 자유 shell에 일관된 initial velocity를 부여하거나 짧은 smooth loading 후 unload, P/L/총에너지·work와 dt 수렴 관찰 | 초기조건/시간하중이 CLI 범위 밖이면 kernel/procedure verification 후보로만 유지. 승인 input subset 확대 금지 | -| NR-E04 | 같은 spatial problem에 alpha=0 및 승인된 음수 alpha를 적용하고 저주파 해상 case와 높은 modal content case를 분리 | 일반 비선형 HHT의 총에너지 매 step 감소 또는 정확한 각운동량 보존을 무조건 요구하지 않음 | -| NR-E05 | 문헌 free-flying single-layer plate를 후속 benchmark 후보로 검토 | 아래 N7은 large rotation/energy 사례의 출처다. 현재 fixed chart를 넘어서는 tumble·장시간 운동은 그대로 채택할 수 없음 | - -**사실 [N7].** Vu-Quoc–Tan (2003), §5.1.2/Figs.9–12는 free-flying single-layer plate의 -큰 전체 운동과 P/L/에너지 및 dissipative/nondissipative integrator 결과를 비교한다. -해당 요소는 rotation DOF가 없는 solid-shell이므로 그 mass·응력 모델과 여기의 director shell은 -다르다. Author-uploaded 본문의 관련 절을 확인했으나 그림의 하중 위치·수치 history를 -독립 추출하지 않았다. 따라서 현 단계에서는 case family 근거이며 완성된 reference artifact가 아니다. - -**추론.** 현재 shell 운동학에서는 `Pdot/Ldot`에 physical a를 사용하고 numerical drill -potential을 포함한 에너지·내력 일을 일관되게 대조해야 한다. N7의 보존형 integrator가 -보이는 exact conservation을 HHT의 요구조건으로 옮길 수 없다. [기존 연구 S8](research.md#sources)의 -비선형 Newmark 보존 한계 근거는 그대로 충분하다. 추가 shell 연구는 기하·하중·시간 구간이 -승인된 chart와 입력 범위 안에 있는지 결정한 뒤에만 구체화할 필요가 있다. - -## 출처·열람 한계와 인계 - -`accessed: 2026-09-22`. 문서 정적 검사만 수행하며 solver/build/test/reference 생성은 수행하지 않았다. - -| ID | Stable citation / locator | 열람 범위 | -| --- | --- | --- | -| N1 | Brüls, O.; Arnold, M. (2008), *The generalized-alpha scheme as a linear multistep integrator: Toward a general mechatronic simulator*, J. Computational and Nonlinear Dynamics 3, 041007, [DOI:10.1115/1.2960475](https://doi.org/10.1115/1.2960475), [author PDF](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf) | Printed pp.3–6 Eq.5–8/Equivalent model, Initial value condition/Constrained case. Shell singular-mass 정리 아님 | -| N2 | Oracle, *Numerical Computation Guide*, [§2.2.3 Double Format](https://docs.oracle.com/cd/E37069_01/html/E39019/z4000ac019269.html) | 53-bit significand 설명. IEEE 표준 전체 적합성 시험을 수행한 것은 아님 | -| N3 | LAPACK, [DGECON](https://netlib.org/lapack/explore-html/d4/daf/group__gecon_ga4f9b830e19e12c7f082ddb497a57af18.html), Purpose/NORM/ANORM/RCOND | Normwise reciprocal condition estimate | -| N4 | LAPACK, [DGESVX](https://netlib.org/lapack/explore-html/d5/dbe/group__gesvx_ga82173a93234afc15d70b64233b3e5bc8.html), Description steps 1–6/INFO | Equilibration, singular pivot와 working-precision warning 구별 | -| N5 | GNU Scientific Library 2.8, [Numerical Differentiation](https://www.gnu.org/software/gsl/doc/html/diff.html), `gsl_deriv_central` | Truncation/roundoff 기반 step/error estimate. FESA tolerance 원본 아님 | -| N6 | Higham, N.J.; Relton, S.D. (2014), *Higher Order Fréchet Derivatives of Matrix Functions and the Level-2 Condition Number*, SIAM J. Matrix Anal. Appl. 35, 1019–1037, [DOI:10.1137/130945259](https://doi.org/10.1137/130945259), [author PDF](https://eprints.maths.manchester.ac.uk/2066/1/paper.pdf), Theorem 3.5/Algorithm 3.6 | 2013 author version printed pp.5–6; oracle identity와 계산법 | -| N7 | Vu-Quoc, L.; Tan, X.G. (2003), *Optimal solid shells for non-linear analyses of multilayer composites. II. Dynamics*, CMAME 192, 1017–1059, [DOI:10.1016/S0045-7825(02)00336-5](https://doi.org/10.1016/S0045-7825(02)00336-5), [author-uploaded text](https://www.researchgate.net/publication/222546721_Optimal_solid_shells_for_non-linear_analyses_of_multilayer_composites_II_Dynamics), §5.1.2/Figs.9–12 | Relevant text 확인; 하중 figure·곡선 digitization 미수행, exact benchmark reproduction 미정 | - -Numerical Review에 인계할 결정은 scaling·conditioning/hidden-defect 판정·FD sweep과 -시간 수렴 구간·case 최소 조합이다. Formulation에 남는 사항은 singular-mass regularity의 -실제 shell 적용과 full-coordinate hidden constraint 검증이다. 사용자 결정에 따라 이번 -HHT 구현은 consistent mass를 사용한다. 위 lumped 비교 근거는 연구 이력이며 현재 지원 요구가 아니다. diff --git a/docs/hht-implicit-dynamics/numerical-review-probes.md b/docs/hht-implicit-dynamics/numerical-review-probes.md deleted file mode 100644 index 6dce1a2..0000000 --- a/docs/hht-implicit-dynamics/numerical-review-probes.md +++ /dev/null @@ -1,162 +0,0 @@ -# HHT 독립 시간정확도 검산 - -[검토 보고서](numerical-review.md)의 상세 evidence다. 2026-09-22 Python 표준 라이브러리만 사용했다. FESA solver, Abaqus 또는 reference 비교 실행이 아니다. 아래 오차는 승인 tolerance를 새로 정하는 값이 아니라 정확해와의 수렴 관찰값이다. - -## 모델과 결과 - -1. Smooth SDOF: `T=.5(1+q²)v²`, `c=qv²`, `q_exact=.4+sin(t)`, `f=(1+q_exact²)a_exact+q_exact v_exact²`, `0≤t≤1`. 초기 `q=.4,v=1,a=0`. 입력은 일관된 무차원 검산 단위다. `alpha=-.05,beta=.275625,gamma=.55`. -2. Moving-null: `x(q)=q/|q|`, `T=.5|Dx(q)v|²`, `U=.5(|q|-1)²`, `q∈R²\{0}`. `r=|q|`, `d=q/r`, `M=(I-ddᵀ)/r²`, `c=-2(q·v)Mv/r²`, `f_int=(r-1)d`. `ker M=span(q)`가 회전한다. 정확해 `q=(cos t,sin t)`, `v=(-sin t,cos t)`, `a=-q`; 초기 위치·속도·가속도 대수조건은 일관된다. Endpoint 반경 대수조건 `r=1`은 각도 parameterization으로 정확하게 강제하며 tangent 평형만 Newton으로 푼다. 이 모델은 shell/drilling 구현이나 일반 singular-DAE 정리의 대체물이 아니다. - -| SDOF 방법 | `h=1/512` U 오차 | `h=1/1024` U 오차 | 관측 차수 | -| --- | ---: | ---: | ---: | -| Naive `M1 A1+(1+alpha)g1-alpha g0=0` | 1.0272820368e-5 | 5.2200068232e-6 | 0.976709 | -| Weighted mass `((1+alpha)M1-alpha M0)A1+(1+alpha)g1-alpha g0=0` | 3.2914014847e-7 | 8.2299941973e-8 | 1.999739 | -| Endpoint physical `M1 a1+g1=0`, `A1=(1+alpha)a1-alpha a0` | 2.7561411953e-7 | 6.8902116013e-8 | 2.000030 | - -`g=c-f`. 마지막 방법의 physical acceleration 오차는 `2.3176116737e-7 → 5.7545108678e-8`로 줄지만 algorithmic `A` 오차는 `5.2612378749e-5 → 2.6344436092e-5`다. 따라서 `A`를 endpoint physical acceleration으로 보고하면 안 된다. - -Moving-null 마지막 방법은 같은 두 h에서 U 오차 `4.0606413493e-7 → 1.0152120526e-7`, V 오차 `4.1505360817e-7 → 1.0376522277e-7`, physical a 오차 `4.1511310820e-7 → 1.0262747089e-7`를 보였다. `max|q·v|`는 `8.4282e-11 → 1.0594e-11`, `max|q·a+v²|`는 `7.9368e-7 → 1.9445e-7`다. Endpoint 위치 대수조건을 지켜도 미분된 속도·가속도 조건이 매 frame 정확히 0이 되는 것은 아니다. 이 결함의 시간수렴과 초기 일관성을 별도로 검증해야 한다. - -## 독립 수학 대조 - -Smooth 물리식 `M(q)a+g(q,v,t)=0`에서 Newmark 내부 가속도의 정확해 대응은 `A=a+alpha*h*adot+O(h²)`다. Naive 식의 일차 결함은 - -`alpha*h*(M*adot+gdot)=-alpha*h*Mdot*a`. - -따라서 `Mdot*a≠0`인 일반 문제에서 상수 M 증명을 그대로 사용할 수 없다. Weighted mass는 이 항을 상쇄하지만 `alpha∈(-1,0)`이면 서로 다른 두 시점의 양의 준정부호 질량의 양의 결합이다. 그 영공간은 두 영공간의 교집합이므로, 영공간이 회전하면 rank가 늘어날 수 있다. 단순 SDOF의 2차 결과가 이를 정당화하지 않는다. - -Physical/algorithmic 가속도 분리는 [Brüls–Arnold 원문](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf)의 Eq. (5), (7), (8)에 `alpha_m=0,alpha_f=-alpha`를 대입한 것이다. 원문의 p.6 equivalent-model/index-3 가정은 비특이 mass 및 제약 정칙성을 사용한다. Singular drilling mass에 그 증명을 직접 적용하지 않는다. 이 문서의 제조해와 결함 계산은 독립 검산이다. - -## 재현 코드와 명령 - -Workspace root에서 다음 명령으로 아래 Python block만 실행한다. 외부 package, 파일 생성 또는 solver 실행은 없다. - -```powershell -python -c 'from pathlib import Path; s=Path("docs/hht-implicit-dynamics/numerical-review-probes.md").read_text(encoding="utf-8"); exec(s.split(chr(96)*3+"python\n",1)[1].split(chr(96)*3,1)[0])' -``` - -```python -import math - -alpha = -.05 -beta = (1-alpha)**2/4 -gamma = .5-alpha - -def exact(t): - return .4+math.sin(t), math.cos(t), -math.sin(t) - -def force(t): - q, v, a = exact(t) - return (1+q*q)*a+q*v*v - -def scalar(h, variant): - q, v, ap = exact(0) - A = ap - for n in range(round(1/h)): - t = (n+1)*h - m0 = 1+q*q - g0 = q*v*v-force(n*h) - oldap = ap - pred = q+h*v+h*h*(.5-beta)*A - vpred = v+h*(1-gamma)*A - def calc(x): - an = (x-pred)/(beta*h*h) - vn = vpred+gamma*h*an - m = 1+x*x - if variant == 'physical': - pn = (an+alpha*oldap)/(1+alpha) - r = m*pn+x*vn*vn-force(t) - dr = 2*x*pn+m/((1+alpha)*beta*h*h)+vn*vn+2*x*vn*gamma/(beta*h) - else: - me = m if variant == 'naive' else (1+alpha)*m-alpha*m0 - dm = 2*x if variant == 'naive' else (1+alpha)*2*x - r = me*an+(1+alpha)*(x*vn*vn-force(t))-alpha*g0 - dr = dm*an+me/(beta*h*h)+(1+alpha)*(vn*vn+2*x*vn*gamma/(beta*h)) - pn = an - return r, dr, vn, an, pn - x = pred+beta*h*h*A - for _ in range(20): - r, dr, *_ = calc(x) - dx = -r/dr - x += dx - if abs(dx) < 1e-14: - break - else: - raise RuntimeError('scalar Newton failed') - q = x - _, _, v, A, ap = calc(q) - qe, ve, ae = exact(1) - return abs(q-qe), abs(v-ve), abs(ap-ae), abs(A-ae) - -def moving_null(h): - q, v, ap = [1.,0.], [0.,1.], [-1.,0.] - A = ap[:] - theta = 0. - max_cv = max_ca = 0. - dot = lambda x,y: sum(x[i]*y[i] for i in range(2)) - for _ in range(round(1/h)): - pred = [q[i]+h*v[i]+h*h*(.5-beta)*A[i] for i in range(2)] - vp = [v[i]+h*(1-gamma)*A[i] for i in range(2)] - old = ap[:] - theta += h - def calc(angle): - d = [math.cos(angle),math.sin(angle)] - tangent = [-d[1],d[0]] - an = [(d[i]-pred[i])/(beta*h*h) for i in range(2)] - vn = [vp[i]+gamma*h*an[i] for i in range(2)] - pn = [(an[i]+alpha*old[i])/(1+alpha) for i in range(2)] - dv, tv = dot(d,vn), dot(tangent,vn) - residual = dot(pn,tangent)-2*dv*tv - derivative = 1/((1+alpha)*beta*h*h)-dot(pn,d)-2*(tv*tv+dv*(-dv+gamma/(beta*h))) - return residual, derivative, d, vn, pn, an - for _ in range(15): - r, dr, *_ = calc(theta) - dx = -r/dr - theta += dx - if abs(dx) < 1e-14: - break - else: - raise RuntimeError('moving-null Newton failed') - _, _, q, v, ap, A = calc(theta) - max_cv = max(max_cv,abs(dot(q,v))) - max_ca = max(max_ca,abs(dot(q,ap)+dot(v,v))) - qe = [math.cos(1),math.sin(1)] - ve = [-math.sin(1),math.cos(1)] - ae = [-x for x in qe] - errors = [math.hypot(*[x[i]-y[i] for i in range(2)]) for x,y in ((q,qe),(v,ve),(ap,ae))] - return *errors, max_cv, max_ca - -for variant in ('naive','weighted_mass','physical','moving_null'): - print(variant) - previous = None - for k in range(5,11): - h = 2**(-k) - errors = moving_null(h) if variant == 'moving_null' else scalar(h,variant) - order = math.log(previous/errors[0],2) if previous else float('nan') - print(f'h={h:.9g} errors='+','.join(f'{x:.10e}' for x in errors)+f' pU={order:.6f}') - previous = errors[0] -``` - -Newton correction cutoff `1e-14`는 이 독립 double-precision probe의 반복 종료값이다. Solver convergence 또는 reference acceptance tolerance로 채택하지 않는다. 미세 h의 acceleration 오차에는 displacement 차분의 roundoff가 포함되므로 표의 관측값을 정확한 수학 상수로 해석하지 않는다. - -## 후속 full Cartesian moving-null 검산 - -추가 Numerical 작업에서 메인이 [full_coordinate_probe.py](../../.harness/build/hht-numerical/full_coordinate_probe.py)를 작성했고 수치 검토자가 residual/Jacobian 식을 읽고 아래 명령을 재실행했다. Exit `0`, 2026-09-22. 이 script는 ignored build evidence이며 FESA source가 아니다. 위 angle-reduced probe와 달리 q의 두 Cartesian 성분을 직접 Newton으로 풀며 radial projection·normalization을 하지 않는다. 같은 `x=q/|q|` 모델의 exact 2×2 Jacobian을 사용한다. - -```powershell -python .harness/build/hht-numerical/full_coordinate_probe.py -``` - -오차는 각 h의 **모든 시점**에서 q/v/physical a의 2-norm 최대다. 앞 절의 종단 오차와 다른 측정량이다. - -| h | max q error | max v error | max physical a error | 직전 h 대비 q/v/a 차수 | -| --- | ---: | ---: | ---: | --- | -| 1/128 | 6.4948801161e-6 | 6.6395874231e-6 | 1.2690547915e-5 | 1.99932 / 1.99962 / 2.01024 | -| 1/256 | 1.6240799623e-6 | 1.6601117645e-6 | 3.1667175260e-6 | 1.99968 / 1.99981 / 2.00269 | -| 1/512 | 4.0606299832e-7 | 4.1505196280e-7 | 7.9259171465e-7 | 1.99985 / 1.99992 / 1.99834 | - -마지막 grid의 최대 `||q|-1|=2.22045e-16`, `|q·v|=8.39836e-11`, `|q·a+v²|=7.91118e-7`. 상쇄 전 `Ma`의 entry products·c·f_int를 사용한 최대 normwise residual은 `7.94824e-11`, Newton 최대 3 corrections, 마지막 correction 최대 `4.00220e-16`이었다. 이 probe의 종료는 correction `<=1e-13`이며 N2의 모든 AND gate를 구현한 solver가 아니다. 위 관찰을 N2–N7 전체 통과나 실제 shell 통과로 확대하지 않는다. - -별도 trial `q=(.85,.52)`, predictor `(.83,.50)`, velocity predictor `(-.35,.71)`, old physical a `(-.7,-.3)`, h=.1, direction `(.6,-.8)`의 exact effective Jacobian을 중앙차분했다. N5의 j=8,10,12,14,16,18,20 순서에서 상대 오차는 `[3.13656e-5,1.96035e-6,1.22522e-7,7.65779e-9,4.77929e-10,3.25134e-11,1.04250e-11]`이다. 연속한 내부 sweep 점 j=12/14 등이 `1e-6`을 만족한다. 이는 이 2D trial/direction에 대한 미분 evidence이며 shell D3 oracle를 대체하지 않는다. - -Full-coordinate 결과는 새로운 [C04b](verification-cases.md)의 moving-null 구조와 max-time 측정을 지지한다. C04b의 전체 prescribed grids, 초기화 실패 mutation, regularity·scale·반복오차 분리 등 모든 판정을 실행한 것은 아니다. 더 미세한 h에서 residual이 증가할 수 있으므로 h=1/1024까지 같은 residual 기준으로 통과했다는 주장을 하지 않는다. diff --git a/docs/hht-implicit-dynamics/numerical-review.md b/docs/hht-implicit-dynamics/numerical-review.md index a059ed9..18d0735 100644 --- a/docs/hht-implicit-dynamics/numerical-review.md +++ b/docs/hht-implicit-dynamics/numerical-review.md @@ -1,11 +1,23 @@ -# HHT 독립 수치 검토·검증 계약 +# HHT 독립 정식화 검토와 제조해 검산 + +아래 상태와 미실행 표시는 각 검토 당시의 기록이다. 이후 reference 비교와 실제 shell +검증 결과는 [구현 수치 검토](implementation-numerical-review.md), 현재 실패·잔여 범위는 +[PRD](PRD.md)와 [전체 현황](../tracking/status.md)을 따른다. + + + + + + +## HHT 독립 수치 검토·검증 계약 - Feature: `hht-implicit-dynamics`; owner: `numerical-review-agent`; date: `2026-09-22`. - 상태: `numerical-contract-defined; io-binding-and-implementation-verification-pending`. 기존 정식화 검토에 후속 Numerical gate의 내부 판정·검증 사례·reference mapping 검토를 추가했다. Solver 기능 통과 또는 I/O schema 승인이 아니다. -- 기준: [프로젝트 지침](../../AGENTS.md), [Feature PRD](PRD.md), [요구사항](requirements.md), [연구 근거](research.md), [공통 tolerance](../TOLERANCE.md). -- 상세: [내부 수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [시간정확도 검산](numerical-review-probes.md), [추가 일차 근거](numerical-research.md), [reference mapping](reference-model.md). Solver source/tests/reference/상위 계약은 수정하지 않았다. +- 기준: [프로젝트 지침](../../AGENTS.md), [Feature PRD](PRD.md), [요구사항](requirements.md), [연구 근거](research.md#research), [공통 tolerance](../TOLERANCE.md). +- 상세: [내부 수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [시간정확도 검산](numerical-review.md#numerical-review-probes), [추가 일차 근거](research.md#numerical-research), [reference mapping](reference-model.md). Solver source/tests/reference/상위 계약은 수정하지 않았다. -## 결론 + +### 결론 [주 정식화](formulation.md)와 [관성 상세](formulation-inertia.md)를 독립 대조했다. **현재 physical/algorithmic 가속도 분리 후보의 표시된 수식에서 새 오류는 발견하지 않았다.** 사용자는 [HHT-ADR-007](ADR.md)에서 consistent kinetic mass를 선택했다. 내부 수치값과 반증 가능한 사례를 구체화했으며 Numerical 계약은 후속 I/O/구현에 인계할 수 있다. 실제 finite-rotation shell의 drilling DAE·시간수렴·reference 검증은 구현 후 필수 evidence다. 이 미실행을 수식 모순이나 코드 작성 금지로 해석하지 않는다. @@ -18,7 +30,8 @@ 숫자의 norm·zero branch·단위·실행 상태는 [numerical-controls](numerical-controls.md)가 원본이다. 위 요약의 값만 떼어 다른 metric에 적용하지 않는다. 기존 정적 외력 상대 1%/absolute `1e-3`나 eigen 외부 RMS 예외를 동적 Newton에 승계하지 않았다. -## 위험과 수정 반영 + +### 위험과 수정 반영 | ID | 판단 | 근거·필요 조치 | | --- | --- | --- | @@ -27,7 +40,8 @@ | HHT-NR-003 | Endpoint physical `a`와 auxiliary `A` 분리 **SUPPORTED CANDIDATE** | `A1=(1+alpha)a1-alpha*a0`, Newmark에는 A, endpoint balance에는 a. Smooth variable-mass와 한 moving-null 제조해에서 U/V/a의 2차 경향 확인. 일반 shell DAE 수렴 증명·구현 통과는 아니다. | | HHT-NR-004 | `A`를 physical acceleration으로 출력 **FAIL; 현 후보에서 구분 완료** | 위 후보에서도 A의 endpoint 오차는 1차다. 주 정식화 §§4–6이 a/A와 endpoint reaction을 구분한다. 영속 결과 선택은 I/O owner의 후속 계약이다. | -## 수식 대조 결과 + +### 수식 대조 결과 | 검토 항목 | 결과와 evidence | | --- | --- | @@ -39,7 +53,8 @@ | 반력·에너지·회복 | Endpoint `E=I+f_int-F`, reaction의 support-on-structure 부호, `M_spatial=Jl^-T m_phi`의 가상일 관계는 일관된다. `R_HHT,c`와 endpoint reaction을 구별한다. `T+U_phys+U_drill-W`는 이산 에너지 결함이며 물리 damping이 아니다. Numerical drill을 physical section stress에 넣지 않는다. | | State·안정성·coverage | 같은 trial의 q/v/a/A·tangent·recovery, 원자적 commit, 실패 history 보존 및 fixed dt 실패 종료는 수식과 일치한다. 기존 MITC의 locking/왜곡/chart 경계는 사라지지 않는다. U/UR reference만으로 V/A/에너지·큰 회전·hidden constraint를 검증할 수 없다. | -## 계약 결정과 후속 검증의 구분 + +### 계약 결정과 후속 검증의 구분 | ID | 영향·owner | 필요한 해소 | | --- | --- | --- | @@ -49,16 +64,188 @@ 후속 필수 검증은 정식화 §7과 연구 HHT-E01–E10을 따른다. 특히 실제 shell의 3차 director/관성 tangent directional derivative, 초기 drilling acceleration coupling, 좌표변환 후 동일 물리 모델, kinetic-energy derivative·관성 force/moment 평형, 선형 alpha=0 에너지 및 비선형 에너지 결함 시간수렴을 포함해야 한다. 일반 비선형 HHT에 정확 에너지 보존·매 frame 단조감소를 강제하지 않는다. -## Reference tolerance 적용 경계 + +### Reference tolerance 적용 경계 [reference-model](reference-model.md)을 독립 대조해 수치 비교 정의에 이견이 없음을 확인했다. 원본 inventory의 직접 재집계는 그 문서에 기록된 main evidence다. `Step-1/increment/instance/node/component` identity, frame별 `U-global`/`UR-global` 27 scalars씩 총202 families, 9-node projection 전후 사전검사를 사용한다. CSV decimal time `n/10`과 FESA scheduled binary64 `n*h`를 각각 검증한 뒤 integer increment로 연결하므로 표시 decimal과 부동소수점 곱의 차이를 nearest-time tolerance로 숨기지 않는다. 실제 HDF5 field/schema는 후속 I/O가 연결한다. -[TOLERANCE](../TOLERANCE.md)의 near-zero band `0.01S`, 일반 행 relative `0.05`, relative RMS `0.01`, `S=0` exact-zero를 그대로 사용한다. U blocking, UR warning-only이나 identity/finite 오류는 전체 실패다. Eigen RMS 예외는 적용하지 않는다. Reference 비교는 **미실행**이다. 9개 node가 중심 주변 3×3 patch라는 coverage 한계 및 성긴 `dt/T1≈7.4567`을 보존한다. +[TOLERANCE](../TOLERANCE.md)의 near-zero band `0.01S`, 일반 행 relative `0.05`, relative RMS `0.01`, `S=0` exact-zero를 그대로 사용한다. U blocking, UR warning-only이나 identity/finite 오류는 전체 실패다. Eigen RMS 예외는 적용하지 않는다. 이 정식화 검토 당시 Reference 비교는 **미실행**이었다. 9개 node가 중심 주변 3×3 patch라는 coverage 한계 및 성긴 `dt/T1≈7.4567`을 보존한다. -## 실행 evidence와 한계 + +### 실행 evidence와 한계 -[독립 검산](numerical-review-probes.md)의 기존 SDOF/angle-reduced moving-null은 **종단 오차** evidence로 재사용했다. 후속 main의 full Cartesian 2×2 residual/Jacobian probe를 읽고 한 번 재실행하여 exit `0` 및 **전체 시점 최대오차**를 확인했다. 마지막 refinement의 q/v/a 차수는 `1.99985/1.99992/1.99834`, full residual 최대 `7.94824e-11`, 최대 Newton3 corrections였다. 별도 Jacobian의 고정 step sweep도 연속한 내부 점에서 `1e-6` 이하를 보였다. 이 관찰은 N2–N7의 모든 gate나 실제 shell을 통과한 실행이 아니다. +[독립 검산](numerical-review.md#numerical-review-probes)의 기존 SDOF/angle-reduced moving-null은 **종단 오차** evidence로 재사용했다. 후속 main의 full Cartesian 2×2 residual/Jacobian probe를 읽고 한 번 재실행하여 exit `0` 및 **전체 시점 최대오차**를 확인했다. 마지막 refinement의 q/v/a 차수는 `1.99985/1.99992/1.99834`, full residual 최대 `7.94824e-11`, 최대 Newton3 corrections였다. 별도 Jacobian의 고정 step sweep도 연속한 내부 점에서 `1e-6` 이하를 보였다. 이 관찰은 N2–N7의 모든 gate나 실제 shell을 통과한 실행이 아니다. 본 owner의 4개 문서에서 로컬 링크 대상·trailing whitespace를 검사하여 문제 0개였다. Binary64 scalar 계산으로 `gamma4096=4.54747e-13`, `gamma64/(2^-32)=3.05176e-5` 및 `diag(1,c)`의 c=`2^-31,2^-32,2^-33,0`에 대한 conditioning 경계 판정 `pass,pass,fail,fail`을 확인했다. 이는 scalar 산술 확인이며 C05의 실제 mass/condition-estimator 실행 통과가 아니다. 잔여 위험은 선택 consistent mass의 실제 shell constant-rank/regularity, D3 구현과 small-angle 경계, 큰 h의 시간 alias, 초기·finite-dt hidden constraints, 조건수 추정의 forward-error 한계다. C01–C12가 이를 검출하도록 설계됐고 아직 solver 실행 결과는 없다. Build/CTest, FESA 동적 해석, Abaqus, 외부 reference comparison은 이번 문서 작업 범위에서 실행하지 않았다. + + + + +## HHT 독립 시간정확도 검산 + +[검토 보고서](numerical-review.md#numerical-review)의 상세 evidence다. 2026-09-22 Python 표준 라이브러리만 사용했다. FESA solver, Abaqus 또는 reference 비교 실행이 아니다. 아래 오차는 승인 tolerance를 새로 정하는 값이 아니라 정확해와의 수렴 관찰값이다. + + +### 모델과 결과 + +1. Smooth SDOF: `T=.5(1+q²)v²`, `c=qv²`, `q_exact=.4+sin(t)`, `f=(1+q_exact²)a_exact+q_exact v_exact²`, `0≤t≤1`. 초기 `q=.4,v=1,a=0`. 입력은 일관된 무차원 검산 단위다. `alpha=-.05,beta=.275625,gamma=.55`. +2. Moving-null: `x(q)=q/|q|`, `T=.5|Dx(q)v|²`, `U=.5(|q|-1)²`, `q∈R²\{0}`. `r=|q|`, `d=q/r`, `M=(I-ddᵀ)/r²`, `c=-2(q·v)Mv/r²`, `f_int=(r-1)d`. `ker M=span(q)`가 회전한다. 정확해 `q=(cos t,sin t)`, `v=(-sin t,cos t)`, `a=-q`; 초기 위치·속도·가속도 대수조건은 일관된다. Endpoint 반경 대수조건 `r=1`은 각도 parameterization으로 정확하게 강제하며 tangent 평형만 Newton으로 푼다. 이 모델은 shell/drilling 구현이나 일반 singular-DAE 정리의 대체물이 아니다. + +| SDOF 방법 | `h=1/512` U 오차 | `h=1/1024` U 오차 | 관측 차수 | +| --- | ---: | ---: | ---: | +| Naive `M1 A1+(1+alpha)g1-alpha g0=0` | 1.0272820368e-5 | 5.2200068232e-6 | 0.976709 | +| Weighted mass `((1+alpha)M1-alpha M0)A1+(1+alpha)g1-alpha g0=0` | 3.2914014847e-7 | 8.2299941973e-8 | 1.999739 | +| Endpoint physical `M1 a1+g1=0`, `A1=(1+alpha)a1-alpha a0` | 2.7561411953e-7 | 6.8902116013e-8 | 2.000030 | + +`g=c-f`. 마지막 방법의 physical acceleration 오차는 `2.3176116737e-7 → 5.7545108678e-8`로 줄지만 algorithmic `A` 오차는 `5.2612378749e-5 → 2.6344436092e-5`다. 따라서 `A`를 endpoint physical acceleration으로 보고하면 안 된다. + +Moving-null 마지막 방법은 같은 두 h에서 U 오차 `4.0606413493e-7 → 1.0152120526e-7`, V 오차 `4.1505360817e-7 → 1.0376522277e-7`, physical a 오차 `4.1511310820e-7 → 1.0262747089e-7`를 보였다. `max|q·v|`는 `8.4282e-11 → 1.0594e-11`, `max|q·a+v²|`는 `7.9368e-7 → 1.9445e-7`다. Endpoint 위치 대수조건을 지켜도 미분된 속도·가속도 조건이 매 frame 정확히 0이 되는 것은 아니다. 이 결함의 시간수렴과 초기 일관성을 별도로 검증해야 한다. + + +### 독립 수학 대조 + +Smooth 물리식 `M(q)a+g(q,v,t)=0`에서 Newmark 내부 가속도의 정확해 대응은 `A=a+alpha*h*adot+O(h²)`다. Naive 식의 일차 결함은 + +`alpha*h*(M*adot+gdot)=-alpha*h*Mdot*a`. + +따라서 `Mdot*a≠0`인 일반 문제에서 상수 M 증명을 그대로 사용할 수 없다. Weighted mass는 이 항을 상쇄하지만 `alpha∈(-1,0)`이면 서로 다른 두 시점의 양의 준정부호 질량의 양의 결합이다. 그 영공간은 두 영공간의 교집합이므로, 영공간이 회전하면 rank가 늘어날 수 있다. 단순 SDOF의 2차 결과가 이를 정당화하지 않는다. + +Physical/algorithmic 가속도 분리는 [Brüls–Arnold 원문](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf)의 Eq. (5), (7), (8)에 `alpha_m=0,alpha_f=-alpha`를 대입한 것이다. 원문의 p.6 equivalent-model/index-3 가정은 비특이 mass 및 제약 정칙성을 사용한다. Singular drilling mass에 그 증명을 직접 적용하지 않는다. 이 문서의 제조해와 결함 계산은 독립 검산이다. + + +### 재현 코드와 명령 + +Workspace root에서 다음 명령으로 아래 Python block만 실행한다. 외부 package, 파일 생성 또는 solver 실행은 없다. + +```powershell +python -c 'from pathlib import Path; s=Path("docs/hht-implicit-dynamics/numerical-review-probes.md").read_text(encoding="utf-8"); exec(s.split(chr(96)*3+"python\n",1)[1].split(chr(96)*3,1)[0])' +``` + +```python +import math + +alpha = -.05 +beta = (1-alpha)**2/4 +gamma = .5-alpha + +def exact(t): + return .4+math.sin(t), math.cos(t), -math.sin(t) + +def force(t): + q, v, a = exact(t) + return (1+q*q)*a+q*v*v + +def scalar(h, variant): + q, v, ap = exact(0) + A = ap + for n in range(round(1/h)): + t = (n+1)*h + m0 = 1+q*q + g0 = q*v*v-force(n*h) + oldap = ap + pred = q+h*v+h*h*(.5-beta)*A + vpred = v+h*(1-gamma)*A + def calc(x): + an = (x-pred)/(beta*h*h) + vn = vpred+gamma*h*an + m = 1+x*x + if variant == 'physical': + pn = (an+alpha*oldap)/(1+alpha) + r = m*pn+x*vn*vn-force(t) + dr = 2*x*pn+m/((1+alpha)*beta*h*h)+vn*vn+2*x*vn*gamma/(beta*h) + else: + me = m if variant == 'naive' else (1+alpha)*m-alpha*m0 + dm = 2*x if variant == 'naive' else (1+alpha)*2*x + r = me*an+(1+alpha)*(x*vn*vn-force(t))-alpha*g0 + dr = dm*an+me/(beta*h*h)+(1+alpha)*(vn*vn+2*x*vn*gamma/(beta*h)) + pn = an + return r, dr, vn, an, pn + x = pred+beta*h*h*A + for _ in range(20): + r, dr, *_ = calc(x) + dx = -r/dr + x += dx + if abs(dx) < 1e-14: + break + else: + raise RuntimeError('scalar Newton failed') + q = x + _, _, v, A, ap = calc(q) + qe, ve, ae = exact(1) + return abs(q-qe), abs(v-ve), abs(ap-ae), abs(A-ae) + +def moving_null(h): + q, v, ap = [1.,0.], [0.,1.], [-1.,0.] + A = ap[:] + theta = 0. + max_cv = max_ca = 0. + dot = lambda x,y: sum(x[i]*y[i] for i in range(2)) + for _ in range(round(1/h)): + pred = [q[i]+h*v[i]+h*h*(.5-beta)*A[i] for i in range(2)] + vp = [v[i]+h*(1-gamma)*A[i] for i in range(2)] + old = ap[:] + theta += h + def calc(angle): + d = [math.cos(angle),math.sin(angle)] + tangent = [-d[1],d[0]] + an = [(d[i]-pred[i])/(beta*h*h) for i in range(2)] + vn = [vp[i]+gamma*h*an[i] for i in range(2)] + pn = [(an[i]+alpha*old[i])/(1+alpha) for i in range(2)] + dv, tv = dot(d,vn), dot(tangent,vn) + residual = dot(pn,tangent)-2*dv*tv + derivative = 1/((1+alpha)*beta*h*h)-dot(pn,d)-2*(tv*tv+dv*(-dv+gamma/(beta*h))) + return residual, derivative, d, vn, pn, an + for _ in range(15): + r, dr, *_ = calc(theta) + dx = -r/dr + theta += dx + if abs(dx) < 1e-14: + break + else: + raise RuntimeError('moving-null Newton failed') + _, _, q, v, ap, A = calc(theta) + max_cv = max(max_cv,abs(dot(q,v))) + max_ca = max(max_ca,abs(dot(q,ap)+dot(v,v))) + qe = [math.cos(1),math.sin(1)] + ve = [-math.sin(1),math.cos(1)] + ae = [-x for x in qe] + errors = [math.hypot(*[x[i]-y[i] for i in range(2)]) for x,y in ((q,qe),(v,ve),(ap,ae))] + return *errors, max_cv, max_ca + +for variant in ('naive','weighted_mass','physical','moving_null'): + print(variant) + previous = None + for k in range(5,11): + h = 2**(-k) + errors = moving_null(h) if variant == 'moving_null' else scalar(h,variant) + order = math.log(previous/errors[0],2) if previous else float('nan') + print(f'h={h:.9g} errors='+','.join(f'{x:.10e}' for x in errors)+f' pU={order:.6f}') + previous = errors[0] +``` + +Newton correction cutoff `1e-14`는 이 독립 double-precision probe의 반복 종료값이다. Solver convergence 또는 reference acceptance tolerance로 채택하지 않는다. 미세 h의 acceleration 오차에는 displacement 차분의 roundoff가 포함되므로 표의 관측값을 정확한 수학 상수로 해석하지 않는다. + + +### 후속 full Cartesian moving-null 검산 + +추가 Numerical 작업에서 메인이 full_coordinate_probe.py(당시 경로: `../../.harness/build/hht-numerical/full_coordinate_probe.py`, 현재 checkout에 없음)를 작성했고 수치 검토자가 residual/Jacobian 식을 읽고 아래 명령을 재실행했다. Exit `0`, 2026-09-22. 이 script는 ignored build evidence이며 FESA source가 아니다. 위 angle-reduced probe와 달리 q의 두 Cartesian 성분을 직접 Newton으로 풀며 radial projection·normalization을 하지 않는다. 같은 `x=q/|q|` 모델의 exact 2×2 Jacobian을 사용한다. + +```powershell +python .harness/build/hht-numerical/full_coordinate_probe.py +``` + +오차는 각 h의 **모든 시점**에서 q/v/physical a의 2-norm 최대다. 앞 절의 종단 오차와 다른 측정량이다. + +| h | max q error | max v error | max physical a error | 직전 h 대비 q/v/a 차수 | +| --- | ---: | ---: | ---: | --- | +| 1/128 | 6.4948801161e-6 | 6.6395874231e-6 | 1.2690547915e-5 | 1.99932 / 1.99962 / 2.01024 | +| 1/256 | 1.6240799623e-6 | 1.6601117645e-6 | 3.1667175260e-6 | 1.99968 / 1.99981 / 2.00269 | +| 1/512 | 4.0606299832e-7 | 4.1505196280e-7 | 7.9259171465e-7 | 1.99985 / 1.99992 / 1.99834 | + +마지막 grid의 최대 `||q|-1|=2.22045e-16`, `|q·v|=8.39836e-11`, `|q·a+v²|=7.91118e-7`. 상쇄 전 `Ma`의 entry products·c·f_int를 사용한 최대 normwise residual은 `7.94824e-11`, Newton 최대 3 corrections, 마지막 correction 최대 `4.00220e-16`이었다. 이 probe의 종료는 correction `<=1e-13`이며 N2의 모든 AND gate를 구현한 solver가 아니다. 위 관찰을 N2–N7 전체 통과나 실제 shell 통과로 확대하지 않는다. + +별도 trial `q=(.85,.52)`, predictor `(.83,.50)`, velocity predictor `(-.35,.71)`, old physical a `(-.7,-.3)`, h=.1, direction `(.6,-.8)`의 exact effective Jacobian을 중앙차분했다. N5의 j=8,10,12,14,16,18,20 순서에서 상대 오차는 `[3.13656e-5,1.96035e-6,1.22522e-7,7.65779e-9,4.77929e-10,3.25134e-11,1.04250e-11]`이다. 연속한 내부 sweep 점 j=12/14 등이 `1e-6`을 만족한다. 이는 이 2D trial/direction에 대한 미분 evidence이며 shell D3 oracle를 대체하지 않는다. + +Full-coordinate 결과는 새로운 [C04b](verification-cases.md)의 moving-null 구조와 max-time 측정을 지지한다. C04b의 전체 prescribed grids, 초기화 실패 mutation, regularity·scale·반복오차 분리 등 모든 판정을 실행한 것은 아니다. 더 미세한 h에서 residual이 증가할 수 있으므로 h=1/1024까지 같은 residual 기준으로 통과했다는 주장을 하지 않는다. diff --git a/docs/hht-implicit-dynamics/physics-evaluation.md b/docs/hht-implicit-dynamics/physics-evaluation.md index 43df1e6..b4bef3c 100644 --- a/docs/hht-implicit-dynamics/physics-evaluation.md +++ b/docs/hht-implicit-dynamics/physics-evaluation.md @@ -17,7 +17,7 @@ ## 원본 HDF5 독립 계산 -현재 [공식 HDF5](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_results.h5)의 SHA256은 `f07beddaa232abe314e20210534a243d6deaf1f677c598c64f9334428bbecb56`이다. 9월 26일 volume·평형 계산의 원본은 [수정 전 보관본](../../.harness/build/hht-numerical/reference-before-recovery-fix.h5), SHA256 `23bac93d1f7998b2f74a0f68767ae98a9899ee92c53f5170d08a814d3ee936d4`다. 9월 27일 `uv run --with h5py python -B -`로 두 파일의 2033 datasets를 독립 대조했다. 값이 다른 dataset은 100개 noninitial section resultants뿐이다. 해당 dataset 안의 M 성분은 새 값이 옛 값의 정확히 `.5`배이며 N/Q 성분은 같다. 2025 floating datasets의 byte 비교에서도 그 100개 외 변경은 없다. 따라서 아래 평형·kinetic energy·운동학·stress 계산은 동일 데이터에 관한 근거로 유효하며, 굽힘 결과는 아래 새 재검산으로 대체한다. +현재 공식 HDF5(당시 경로: `../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_results.h5`, 현재 checkout에 없음)의 SHA256은 `f07beddaa232abe314e20210534a243d6deaf1f677c598c64f9334428bbecb56`이다. 9월 26일 volume·평형 계산의 원본은 수정 전 보관본(당시 경로: `../../.harness/build/hht-numerical/reference-before-recovery-fix.h5`, 현재 checkout에 없음), SHA256 `23bac93d1f7998b2f74a0f68767ae98a9899ee92c53f5170d08a814d3ee936d4`다. 9월 27일 `uv run --with h5py python -B -`로 두 파일의 2033 datasets를 독립 대조했다. 값이 다른 dataset은 100개 noninitial section resultants뿐이다. 해당 dataset 안의 M 성분은 새 값이 옛 값의 정확히 `.5`배이며 N/Q 성분은 같다. 2025 floating datasets의 byte 비교에서도 그 100개 외 변경은 없다. 따라서 아래 평형·kinetic energy·운동학·stress 계산은 동일 데이터에 관한 근거로 유효하며, 굽힘 결과는 아래 새 재검산으로 대체한다. Reviewer는 solver/build 및 artifact 재생성을 실행하지 않았다. 검토는 stdin Python/NumPy 계산과 실행 결과 열람이다. 모든 floating result 값의 finite 확인은 수정 전 audit와 수정 후 finite M 재검산·나머지 데이터 동일성으로 유지된다. 단위는 `consistent-input-units`; 이하 L/F/T는 입력 length/force/time이며 SI로 단정하지 않는다. @@ -49,17 +49,17 @@ Plane-stress `C=E/(1−nu²)[[1,nu,0],[nu,1,0],[0,0,(1−nu)/2]]`로 모든 101 Frame1, internal element `12`(0-based; source `Part-1-1`, element label `13`), GP2에서 `kappa11=kappa22=−1.72598199555e-5` L^-1이다. `t=.5,E=2.1e11,nu=.3`이면 `M11=M22=−53936.9373610` F다. 수정 전 저장값은 `−107873.8747221` F였고 수정 후 `−53936.93736103468` F로 일치한다. 같은 점의 `S11(bottom,middle,top)=(795234.504841,−499254.790420,−1793738.488372)` F/L²에서 독립 두께 moment `t²(S_top−S_bottom)/12`도 약 `−53936.93736` F다. Source identity는 HDF5 `/model/elements`의 해당 행으로 정한다. -전 frame의 face stress 차분 적분과 수정 M의 최대 절대차는 `4.07217431e-6` F, 위 symmetric relative metric은 `1.93401205e-10`이다. 한쪽 `max|M|`만 분모로 쓰는 [main audit](../../.harness/build/hht-numerical/reference-recovery-audit-20260927.json)의 metric은 `3.86802409e-10`으로 동일 차이를 표현한다. 고 E·작은 strain에서 별도 평가된 face stress의 차감은 curvature 대조보다 민감하다. **Face identity가 전역 `1e-12`로 일치한다고 주장하지 않는다.** 수정 전 2배 오류 해소와 유한정밀도 차감 차이를 구별한다. +전 frame의 face stress 차분 적분과 수정 M의 최대 절대차는 `4.07217431e-6` F, 위 symmetric relative metric은 `1.93401205e-10`이다. 한쪽 `max|M|`만 분모로 쓰는 main audit(당시 경로: `../../.harness/build/hht-numerical/reference-recovery-audit-20260927.json`, 현재 checkout에 없음)의 metric은 `3.86802409e-10`으로 동일 차이를 표현한다. 고 E·작은 strain에서 별도 평가된 face stress의 차감은 curvature 대조보다 민감하다. **Face identity가 전역 `1e-12`로 일치한다고 주장하지 않는다.** 수정 전 2배 오류 해소와 유한정밀도 차감 차이를 구별한다. Generalized strain은 midsurface 값이 아니라 두께 평균/moment다. 따라서 `C epsilon0`와 middle stress의 작은 차이, top/bottom 평균과 middle stress의 작은 차이를 오류로 판정하지 않았다. 최대 membrane strain `5.07413e-6`, curvature `1.72598e-5` L^-1, transverse shear strain `4.28336e-6`, stress `1.79377197e6` F/L²는 작은 탄성 변형률 규모와 일관된다. Numerical drill이 physical stress에 포함됐다고 단정할 근거는 없다. ## C08 및 제한 evidence -[9월 26일 C08 diagnostic 로그](../../.harness/build/hht-numerical/c08-diagnostic-20260926.log)는 195745 ms에 1 PASS/2 FAIL로 종료해 [이전 로그](../../.harness/build/hht-numerical/c08-optimized.log)의 실패를 재현했다. C08a pointwise 독립 volume force/power/momentum은 최대 회전 `.54757231145` rad에서 PASS다. 시간 이력의 acceleration 차수/오차 실패와 finest N7 noise 분리 미달은 별도로 남는다. +9월 26일 C08 diagnostic 로그(당시 경로: `../../.harness/build/hht-numerical/c08-diagnostic-20260926.log`, 현재 checkout에 없음)는 195745 ms에 1 PASS/2 FAIL로 종료해 이전 로그(당시 경로: `../../.harness/build/hht-numerical/c08-optimized.log`, 현재 checkout에 없음)의 실패를 재현했다. C08a pointwise 독립 volume force/power/momentum은 최대 회전 `.54757231145` rad에서 PASS다. 시간 이력의 acceleration 차수/오차 실패와 finest N7 noise 분리 미달은 별도로 남는다. C08b finest q_u/q_phi/v_u/v_phi/a_u/a_phi self-difference는 `(5.54743e-6,1.38701e-4,1.77613e-4,.0115434,.0119796,.868939)`다. q_u 외 채널은 finest `1e-4`를 넘는다. 최대 회전 약 `.27266` rad로 finite-rotation 범위는 도달했다. Energy/L error finest `9.55904e-7/4.29749e-7`, 마지막 refinement 비율 `.248198/.250140`은 C08b bounds와 일치한다. P error는 `3.85047e-14→4.82500e-14→2.00403e-13`으로 작지만 감소 조건에 실패했다. Roundoff 수준이라는 관찰로 승인 감소 조건을 면제하지 않는다. Finest hidden v/a defect `1.46403e-6/.00158291`은 진단량이며 N2 tolerance에 임의 대입하지 않는다. -후속 [회복 후보 probe](../../.harness/build/hht-numerical/c08-recovery-probe-20260926.log)는 3 tests/1 PASS/2 FAIL이며, [C08a split 수정 실행](../../.harness/build/hht-numerical/c08-recovery-split-spectrum-20260927.log)은 2 tests/1 PASS/1 FAIL이다. C08a recovered angular-a finest 최대오차 `1.005829141075e-4`, 마지막 두 raw 차수 `1.77942349/1.99162617`은 기존 bounds를 모두 충족하지 않는다. 수정된 split의 finest null/physical maximum은 `4.64641213e-7/1.00582661e-4`로 physical complement가 지배한다. 최초 probe의 C08a split=0은 loop 누락 diagnostic이므로 근거로 사용하지 않는다. +후속 회복 후보 probe(당시 경로: `../../.harness/build/hht-numerical/c08-recovery-probe-20260926.log`, 현재 checkout에 없음)는 3 tests/1 PASS/2 FAIL이며, C08a split 수정 실행(당시 경로: `../../.harness/build/hht-numerical/c08-recovery-split-spectrum-20260927.log`, 현재 checkout에 없음)은 2 tests/1 PASS/1 FAIL이다. C08a recovered angular-a finest 최대오차 `1.005829141075e-4`, 마지막 두 raw 차수 `1.77942349/1.99162617`은 기존 bounds를 모두 충족하지 않는다. 수정된 split의 finest null/physical maximum은 `4.64641213e-7/1.00582661e-4`로 physical complement가 지배한다. 최초 probe의 C08a split=0은 loop 누락 diagnostic이므로 근거로 사용하지 않는다. C08b recovered angular-a self-difference는 `.846306569/.881654308/.982191000/.868938661`로 수렴하지 않는다. Finest physical/null maximum은 `.868938153/.00286332558`이다. q/v를 유지하는 null-only recovery로 이 physical complement 오류가 해소되지 않는다는 근거다. Maximum들은 서로 다른 node/time일 수 있어 제곱합으로 합치지 않는다. Post-hidden2 ratio는 C08a finest `2.81779e-16`, C08b pair별 약 `6.06e-17..1.45e-16`으로 작아졌지만, [독립 수치 검토](implementation-numerical-review.md)의 explicit-time scale·recovery N7 noise qualification이 남는다. **Hidden2 개선은 시간 정확도·후보 채택 승인과 다르며 recovered-a order는 INCONCLUSIVE다.** 원 a_h의 FAIL은 그대로다. @@ -67,8 +67,8 @@ C08b recovered angular-a self-difference는 `.846306569/.881654308/.982191000/.8 ## Evidence와 잔여 위험 -- [원본 INP](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp), [CSV](<../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv>), [완료 Newton 로그](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_log.txt), [수정 후 비교 JSON](../../.harness/build/hht-numerical/reference-after-recovery-fix.json): U 101 families PASS/UR warnings 200. [수정 전 비교 JSON](../../.harness/build/hht-numerical/reference-comparison.json)의 precheck 441774 scalars, U RMS 최대 `.00227058974`, UR RMS 최대 `.02533113821` 근거도 U/UR 데이터 동일성 범위에서 유지된다. 원본 9 nodes의 U/UR projection만 비교한다. -- [Debug focused](../../.harness/build/hht-numerical/focused-debug-complete.log), [stable kernel](../../.harness/build/hht-numerical/focused-stable-kernel.log), [exact constraints](../../.harness/build/hht-numerical/focused-exact-constraint.log), [C04a Decimal80](../../.harness/build/hht-numerical/c04a-decimal-reduction.json), [독립 수치 검토](implementation-numerical-review.md). -- [Recovery 수정 후 optimized focused](../../.harness/build/hht-numerical/recovery-green-optimized.log): 13 tests PASS. 수정 전 HDF5를 소급하여 수정하지 않으며 공식 재생성 결과의 별도 검산은 위 SHA256과 수치로 구분한다. +- [원본 INP](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp), [CSV](<../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv>), 완료 Newton 로그(당시 경로: `../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_log.txt`, 현재 checkout에 없음), 수정 후 비교 JSON(당시 경로: `../../.harness/build/hht-numerical/reference-after-recovery-fix.json`, 현재 checkout에 없음): U 101 families PASS/UR warnings 200. 수정 전 비교 JSON(당시 경로: `../../.harness/build/hht-numerical/reference-comparison.json`, 현재 checkout에 없음)의 precheck 441774 scalars, U RMS 최대 `.00227058974`, UR RMS 최대 `.02533113821` 근거도 U/UR 데이터 동일성 범위에서 유지된다. 원본 9 nodes의 U/UR projection만 비교한다. +- Debug focused(당시 경로: `../../.harness/build/hht-numerical/focused-debug-complete.log`, 현재 checkout에 없음), stable kernel(당시 경로: `../../.harness/build/hht-numerical/focused-stable-kernel.log`, 현재 checkout에 없음), exact constraints(당시 경로: `../../.harness/build/hht-numerical/focused-exact-constraint.log`, 현재 checkout에 없음), C04a Decimal80(당시 경로: `../../.harness/build/hht-numerical/c04a-decimal-reduction.json`, 현재 checkout에 없음), [독립 수치 검토](implementation-numerical-review.md). +- Recovery 수정 후 optimized focused(당시 경로: `../../.harness/build/hht-numerical/recovery-green-optimized.log`, 현재 checkout에 없음): 13 tests PASS. 수정 전 HDF5를 소급하여 수정하지 않으며 공식 재생성 결과의 별도 검산은 위 SHA256과 수치로 구분한다. 실제 shell의 physical acceleration/무질량 좌표 시간 정확도와 C08b self-convergence는 미해결이다. 원본 굽힘 recovery 수정의 물리 대조는 완료했지만 HDF5에 없는 raw hidden vectors·regularity 조건수·N2-L 원 선형계는 이번 audit로 독립 확인하지 않았다. C09–C11 실패 보존·결정론·전체 rigid-motion coverage와 전체 Debug/CTest는 해당 실행 보고서에서 확인해야 한다. 완료 reference는 이 공백을 해소하지 않는다. 계약·수치 한계·artifact를 변경하지 않았으며 본 문서는 release 승인 문서가 아니다. diff --git a/docs/hht-implicit-dynamics/reference-model.md b/docs/hht-implicit-dynamics/reference-model.md index a46d75d..d4e69e6 100644 --- a/docs/hht-implicit-dynamics/reference-model.md +++ b/docs/hht-implicit-dynamics/reference-model.md @@ -2,7 +2,7 @@ - Feature: `hht-implicit-dynamics`; 정적 inventory·초안 작성: 메인 assistant; 수치 비교 검토: numerical-review-agent. - 상태: `numerical-contract-reviewed; io-binding-and-solver-execution-pending`. -- 기준: [요구사항](requirements.md), [정식화](formulation.md), [수치 검토](numerical-review.md), [공통 TOLERANCE](../TOLERANCE.md). +- 기준: [요구사항](requirements.md), [정식화](formulation.md), [수치 검토](numerical-review.md#numerical-review), [공통 TOLERANCE](../TOLERANCE.md). ## 1. 원본과 모델 의미 diff --git a/docs/hht-implicit-dynamics/requirements.md b/docs/hht-implicit-dynamics/requirements.md index 2b3991f..fe72187 100644 --- a/docs/hht-implicit-dynamics/requirements.md +++ b/docs/hht-implicit-dynamics/requirements.md @@ -54,7 +54,7 @@ HHT implicit dynamic analysis를 도입하기 위한 요구조건을 정의한 최소 목표는 원본 모델에 필요한 선형 탄성 shell의 기하비선형 implicit dynamics다. 원본의 Abaqus `S4` 이름을 처리하는 것은 FESA shell과 Abaqus 내부 정식화·적분·stabilization의 동등성 약속이 아니다. 현재 문서는 contact, 소성·손상, explicit dynamics, 다중 step/restart, 시간변화 구속, base excitation, 임의 amplitude, follower load, Rayleigh/modal damping, adaptive stepping 또는 다른 element의 동적 지원을 약속하지 않는다. -[Research](research.md)에서 공식 문서에 따른 원본 입력의 생략 의미를 확인했다. 이는 reference 입력의 해석 근거이며 FESA 구현 승인이나 신규 사용자 결정이 아니다. 아래에서는 확인된 공개 의미와 남은 FESA 계약 결정을 구분한다. +[Research](research.md#research)에서 공식 문서에 따른 원본 입력의 생략 의미를 확인했다. 이는 reference 입력의 해석 근거이며 FESA 구현 승인이나 신규 사용자 결정이 아니다. 아래에서는 확인된 공개 의미와 남은 FESA 계약 결정을 구분한다. 사용자는 이번 HHT 기본 질량으로 일관질량을 명시 선택했다([HHT-ADR-007](ADR.md)). 이번 HHT의 lumped mass 지원은 제외한다. 이 선택으로 다른 미결정 physics·지원 범위·공식 schema의 승인을 추정하지 않는다. diff --git a/docs/hht-implicit-dynamics/research.md b/docs/hht-implicit-dynamics/research.md index 4a96804..d60becb 100644 --- a/docs/hht-implicit-dynamics/research.md +++ b/docs/hht-implicit-dynamics/research.md @@ -1,7 +1,13 @@ -# HHT implicit dynamics 연구 근거 +# HHT 연구 근거와 수치 설계 + + + + + + +## HHT implicit dynamics 연구 근거 - Feature: `hht-implicit-dynamics` -- Owner: `research-agent` - Date: `2026-09-22` - Status: `Research evidence; formulation and acceptance not approved` - 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [ADR-028](../ADR.md#adr-028). @@ -13,17 +19,19 @@ Abaqus 자료는 공개 입력·출력 의미를 해석하는 근거이며 내 후속 사용자 결정으로 이번 HHT 구현의 질량은 consistent mass로 확정되었다. 아래 lumped 비교·검증 후보는 연구 이력이며 현재 지원 요구에서 제외한다. -## 1. 결론과 결정 후보 + +### 1. 결론과 결정 후보 | 질문 | 근거와 결론 | 후속 결정 경계 | | --- | --- | --- | -| HHT 계수 | 원래 음수 alpha 관례의 표준 후보는 `-1/3 ≤ alpha ≤ 0`, `gamma=1/2-alpha`, `beta=(1-alpha)^2/4`다. `alpha=0`이면 평균가속도 Newmark다. [S1](#sources), [S2](#sources) | beta/gamma 독립 입력을 허용할지, 기본 alpha와 허용 범위는 requirement/formulation에서 확정 | -| 안정성 | 선형 안정성은 큰 dt의 정확도, 비선형 Newton 수렴 또는 임의 유한회전 에너지 안정성을 보장하지 않는다. [S3](#sources), [S8](#sources) | 시간 수렴과 반복 수렴 evidence를 별도로 지정 | -| reference 하중 | 무접촉 기본 application은 transient fidelity이고 무 amplitude 하중은 STEP이다. 공개 기본 계수는 `(-0.05,0.275625,0.55)`다. [S4](#sources), [S5](#sources) | FESA의 지원 의미와 첫 시점 하중/초기 가속도 계약을 명시 | -| shell mass | 현재 eigen의 consistent 원본·derived nodal lumping·drilling null은 재사용 검토 근거다. [L1](#local-evidence) | 후속 사용자 결정: shell 속도 보간의 운동에너지를 그대로 적분하는 consistent mass 채택; lumped는 이번 지원 요구에서 제외 | +| HHT 계수 | 원래 음수 alpha 관례의 표준 후보는 `-1/3 ≤ alpha ≤ 0`, `gamma=1/2-alpha`, `beta=(1-alpha)^2/4`다. `alpha=0`이면 평균가속도 Newmark다. [S1](research.md#research), [S2](research.md#research) | beta/gamma 독립 입력을 허용할지, 기본 alpha와 허용 범위는 requirement/formulation에서 확정 | +| 안정성 | 선형 안정성은 큰 dt의 정확도, 비선형 Newton 수렴 또는 임의 유한회전 에너지 안정성을 보장하지 않는다. [S3](research.md#research), [S8](research.md#research) | 시간 수렴과 반복 수렴 evidence를 별도로 지정 | +| reference 하중 | 무접촉 기본 application은 transient fidelity이고 무 amplitude 하중은 STEP이다. 공개 기본 계수는 `(-0.05,0.275625,0.55)`다. [S4](research.md#research), [S5](research.md#research) | FESA의 지원 의미와 첫 시점 하중/초기 가속도 계약을 명시 | +| shell mass | 현재 eigen의 consistent 원본·derived nodal lumping·drilling null은 재사용 검토 근거다. [L1](research.md#research) | 후속 사용자 결정: shell 속도 보간의 운동에너지를 그대로 적분하는 consistent mass 채택; lumped는 이번 지원 요구에서 제외 | | reference coverage | 작은 변위, 성긴 dt, 9개 절점 U/UR만 확인한다. 큰 회전·가속도·에너지 검증은 부족하다. | 아래 독립 검증 후보와 함께 사용 | -## 2. HHT 이론 및 잔차 후보 + +### 2. HHT 이론 및 잔차 후보 **사실.** S1은 HHT 원논문의 서지·초록을 확인한 근거이고, 이번 열람에서는 본문 PDF가 초록 페이지로 이동했다. 계수 관계는 공식 S2 §4.11.1.3에서 교차 확인했다. @@ -69,7 +77,8 @@ Abaqus 공개 허용범위 `[-1/2,0]` 및 moderate-dissipation 기본값을 원 에너지 보존 검증 후보이나, 비선형에서 같은 결론을 자동 적용할 수 없다. S8은 Newmark 계열의 비선형 에너지·각운동량 보존 한계를 직접 다룬다. -## 3. reference 입력의 공개 의미 + +### 3. reference 입력의 공개 의미 **사실: Abaqus 2025 문서 기준.** 버전 metadata를 reference readiness의 추가 조건으로 요구하지 않는다. 아래 기본값을 기존 CSV에서 역으로 식별했다는 주장도 하지 않는다. @@ -91,9 +100,10 @@ history와 가속도 초기화의 결합은 formulation/I/O owner가 명시해 공개 STEP 문구와 U/UR CSV만으로 Abaqus의 첫 residual history 생성 절차는 확인할 수 없다. 초기 U/UR=0은 초기 a=0의 증거가 아니다. -## 4. shell mass와 유한회전 관성 + +### 4. shell mass와 유한회전 관성 -**사실: 기존 FESA 계약.** [L1](#local-evidence)의 M1–M7은 작은 회전의 +**사실: 기존 FESA 계약.** [L1](research.md#research)의 M1–M7은 작은 회전의 `v=H q_dot`, `M_C=integral rho H^T H dV`와 scalar thickness-moment 기반 nodal block lumping을 정의한다. 일반 global-component row sum이 아니다. Consistent와 lumped는 총질량·uniform translation energy를 공유하지만 일반 속도장의 @@ -122,7 +132,8 @@ Basis가 configuration에 따라 회전하면 그 시간미분도 검토해야 정한다. 후자를 지원한다면 기존 비선형 static internal force에 초기 M만 더하는 방식을 독립적으로 정당화해야 한다. 이 문서는 mass 종류·drilling 처리·회전 적분을 채택하지 않는다. -## 5. 현재 reference의 evidence와 한계 + +### 5. 현재 reference의 evidence와 한계 @@ -151,7 +162,8 @@ V/A/energy/reaction은 이 CSV에 없다. `UR1/UR2/UR3` warning-only 분류를 보존한다. Numerical Review는 이 분류와 [공통 tolerance 정책](../TOLERANCE.md) 안에서 구체적인 family와 mapping을 확정한다. -## 6. 독립 검증 후보 및 공백 + +### 6. 독립 검증 후보 및 공백 아래는 **검증 설계 후보**이며 실행·통과 기록이 아니다. 허용오차와 영속 schema는 정하지 않는다. @@ -177,7 +189,8 @@ Numerical Review: nonlinear convergence와 time convergence의 판정·reference -## 출처와 열람 범위 + +### 출처와 열람 범위 모든 web source의 `accessed: 2026-09-22`. ID는 본문에서 사용한 안정적인 locator다. @@ -192,3 +205,162 @@ Numerical Review: nonlinear convergence와 time convergence의 판정·reference | S7 | Dassault Systèmes, Abaqus 2025, [*CLOAD](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-cload.htm), AMPLITUDE/FOLLOWER | 입력 의미만 | | S8 | Simo, J.C., Tarnow, N., Wong, K.K. (1992), *Exact energy-momentum conserving algorithms and symplectic schemes for nonlinear dynamics*, CMAME 100, 63–116. [DOI:10.1016/0045-7825(92)90115-Z](https://doi.org/10.1016/0045-7825(92)90115-Z), Abstract | 비선형 보존 한계의 1차 논문 근거; 대체 integrator 채택 아님 | | S9 | Idaho National Laboratory, MASTODON, [Hilber-Hughes-Taylor (HHT) Time Integration Verification](https://mastodon.inl.gov/sqa/v_and_v/kernels/time_integration/hht.html), Problem Statement and Results/Complete Input File | 재현 가능한 검증 설계 후보; 외부 solver 실행하지 않음 | + + + + +## HHT 수치 제어·검증 설계 추가 근거 + +- Feature: `hht-implicit-dynamics` +- Date: `2026-09-22` +- Status: `Evidence and verification candidates; numerical thresholds not selected` +- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR](../ADR.md#adr-028), [기존 연구](research.md#research). + +[관성 정식화](formulation-inertia.md)와 [독립 probe](numerical-review.md#numerical-review-probes)를 읽고 +남은 질문만 조사했다. 기존 SDOF/moving-null 계산은 재실행하지 않았다. +**사실**은 열람한 일차 자료, **도출**은 명시한 수학적 계산, **후보**는 검증 제안이다. +수치 threshold·질량 채택·물리 범위·입출력 계약은 이 문서에서 결정하지 않는다. +현재 질량 선택은 사용자 결정으로 consistent mass가 확정되었다. Shell 속도 보간의 +운동에너지를 그대로 적분하며, lumped는 이번 HHT 구현의 지원 요구에서 제외한다. + + +### 1. Physical acceleration, startup와 DAE 적용 경계 + +**사실 [N1].** Brüls–Arnold (2008) author postprint pp.3–4, Eq. (5)–(8)은 +물리적 `q_ddot`와 보조 acceleration-like variable을 구분하고 보조 초기값을 +물리적 초기 가속도와 같게 둔다. 이 문서의 `A`가 논문의 보조 `a`에 대응한다. +`alpha_m=0`, `alpha_f=-alpha`를 대입하면 현재 후보의 +`A_(n+1)=(1+alpha)a_(n+1)-alpha a_n`이다. 같은 논문은 variable M일 때 이를 +force-level 가중 평형과 동일시할 수 없다고 명시한다. 이 질문에는 기존 출처가 충분하다. + +**사실 [N1]: 정리의 가정은 정확히 구분한다.** Printed p.6, “Equivalent model”은 +`[[M,-L],[-h_qddot,I-h_y]]` block의 비특이성과 index-3 조건 +`Phi_q g*_lambda`의 비특이성을 사용한다. 여기의 `h`는 논문 Eq. (4)의 algebraic +output function이며 시간간격이 아니다. Controller/algebraic coupling을 제거한 +특수형에서는 첫 조건이 M의 비특이성으로 줄어든다. 논문 전체가 무조건 “M만 +비특이이면 충분”하다고 읽어서는 안 된다. “Initial value condition”의 초기 오차 조건과 +“Constrained case”의 정칙성 하에서 얻은 수렴 결과를 singular drilling에 자동 적용할 수 없다. + +**도출/수치 제어에의 함의.** 현재 shell의 `psi=N(q)^T g=0`는 논문의 holonomic +`Phi=0`와 동일한 모델임이 아직 증명되지 않았다. 따라서 다음을 분리해서 관찰한다. + +| 관찰 대상 | 필요한 검증 후보 | 남은 한계 | +| --- | --- | --- | +| 첫 시점 | `a0`는 우측 물리 평형·초기 대수조건으로 결정한 뒤 `A0=a0`; 첫 step과 이후 오차를 분리 | 작은 Newton residual로 불일관 초기값이 정당화되지 않음 | +| 물리 a와 A | 동일 시각 정확해에 대한 q/v/physical a 차수와 `A-a`를 별도 측정 | A를 물리 출력·각운동량 미분에 대입하면 안 됨 | +| Current null | 매 configuration에서 `MN`, `N^T I`, `psi`, 양의 부분공간 mass 및 `psi_q N` 정칙성 | 이전 시점 null, 고정 UR3, 전체 M의 역행렬로 대체 불가 | +| Hidden constraints | `psi_q v+psi_t`와 `psi_q a+psi_qq[v,v]+2psi_qt v+psi_tt`의 최대·종단 결함과 dt 수렴 | 위치 평형만 만족해도 두 결함이 0인 것은 아님 | +| 반례 coverage | 현재 움직이는 영공간 예제를 full redundant coordinates로 풀어 기존 reduced-angle probe와 대조 | 기존 probe는 위치조건을 정확히 강제했으므로 full-coordinate Newton 구현 검증이 아님 | +| 고정 간격 | 기존 후보에서 dt를 줄여 같은 물리 종단시각 비교 | adaptive dt·startup 재설정은 별도 scope이며 이번 근거로 추가하지 않음 | + +**도출.** Chart 내부의 smooth q에서 projector와 null basis는 같은 물리 영공간을 나타내야 +한다. Null vector의 부호·정규화 변경 자체와 rank 손실을 구분해야 한다. +`psi_q`에는 `DN`이 들어가므로 basis를 고정한 finite difference는 별도 식을 검증하게 된다. +투영 오차·hidden defect가 큰 결과를 발견하면 정확한 projection/condensation의 채택 여부는 +formulation owner에게 돌린다. 여기서는 추가 projection을 자동 제안·채택하지 않는다. + + +### 2. Double precision, conditioning 및 미분 검증 + +**사실 [N2–N4].** IEEE double의 정상수 significand는 53 bits다. LAPACK DGECON은 +선택한 1/∞ norm의 reciprocal condition number **추정값**을 반환한다. DGESVX는 +equilibration 여부를 구별하고, factor pivot이 정확히 0인 경우와 reciprocal condition이 +machine precision보다 작은 경우를 서로 다른 INFO로 보고한다. 후자는 해·오차 추정을 +계속 계산할 수 있는 warning이다. 이 공개 library 동작은 FESA failure threshold를 +자동 승인하지 않으며 vendor routine 채택 요구도 아니다. + +**도출.** Binary64에서 1의 다음 표현수 간격 `eps=2^-52`, round-to-nearest 정상 범위의 +unit roundoff `u=2^-53`를 구분한다. 문헌의 “machine epsilon” 정의와 library 반환 의미를 +확인하지 않고 두 값을 혼용하면 안 된다. 작은 perturbation의 forward error는 +대략 `condition × backward error`로 증폭되므로 residual 하나로 해의 정확도를 보장하지 못한다. + +| 질문 | 근거에 따른 분리 및 검사 후보 | +| --- | --- | +| Physical mass-null인가? | `n=[0;J_l^-1 d]`, admissible free-space intersection 같은 분석적 운동학을 원본으로 삼는다. `MN`의 수치 결함과 양의 complement의 conditioning을 각각 검사한다. | +| 작은 양의 eigenvalue인가? | 단위·두께 때문에 작은 inertia를 rcond 하나로 drilling null로 바꾸지 않는다. 예상 추가 null/geometry 이상과 positive-space accuracy loss를 구분한다. | +| 어느 rcond인가? | Full singular M의 rcond는 positive inertia 품질을 설명하지 못한다. Positive-space mass, 초기화 algebraic block, effective Newton matrix를 각각 이름 붙이고 norm·scaling을 기록한다. | +| 단위를 바꾸면? | 병진·회전 단위가 섞인 원행렬 condition은 단위 선택에 의존한다. `q=D qhat`, `Rhat=D^T R/Escale`이면 `Khat=D^T K D/Escale`라는 virtual-work 일관 scaling을 대조 후보로 삼는다. 기준 scale의 수치 선택은 NR 소유다. | +| Library equilibration이면 충분한가? | Row/column equilibration은 solver conditioning 도구다. 물리적 nondimensionalization이나 예상 null proof와 동일하지 않다. 원·scaled 행렬 중 무엇을 추정했는지 보존한다. | + +**사실 [N5].** GSL의 central differentiation은 truncation과 roundoff를 함께 추정하여 +step을 고르며, 5-point와 3-point 차이를 오차 추정에 쓴다. 따라서 가장 작은 step을 +항상 정답으로 간주하지 않는 독립 derivative 검사 설계가 공식 수치 library의 접근과 부합한다. + +**도출/후보.** Dimensionless direction p에 대해 scaled 잔차의 중심차분과 `Khat p`를 +비교하면 일반적인 smooth·비상쇄 구간에서 오차형은 `C_t delta²+C_r u/delta`다. +최적 step의 `u^(1/3)` 크기는 이 가정에서의 점근적 안내일 뿐 공통 고정값이 아니다. +Zero derivative, 큰 residual cancellation, branch 접근에서는 계수와 error floor가 달라진다. +여러 delta를 sweep하여 감소구간·최저 plateau·roundoff 증가구간을 기록하고, 모든 sample이 +같은 허용 chart와 geometry 안에 있는지 확인한다. Unit-aware scale을 쓰고 임의 +`max(1, norm)`로 작은 문제를 덮지 않는다. + +Inertia partial derivative 검사에서는 q/v/physical a 중 하나만 바꾸고 나머지는 고정한다. +Effective tangent 검사에서는 같은 trial q에 연동되는 v, A, physical a를 모두 갱신한다. +두 검사는 서로 다른 미분이므로 섞지 않는다. 작은 dt의 acceleration 재구성에는 +위치 차분 오차가 `1/dt²`로 증폭되므로 시간 차수 측정에서 너무 미세한 dt의 plateau를 +수학적 차수 저하로 오인하지 않는다. 기준 oracle 정밀도와 nonlinear solve 오차도 분리한다. + + +### 3. 3차 회전 미분과 운동량·에너지 case 후보 + +**사실 [N6].** Higham–Relton의 Theorem 3.5/Algorithm 3.6은 고차 Fréchet derivative를 +재귀 block matrix function의 우상단 block으로 구한다. Matrix exponential은 smoothness +조건을 만족한다. `P=[phi]_cross` 및 세 방향 행렬에 적용하면 24×24 exponential 하나의 +3×3 우상단 block이 3차 혼합 미분을 준다. + +**후보.** 이 방식에 `d0`를 곱한 결과를 Rodrigues/회전 Jacobian의 해석 미분과 비교하면 +동일 scalar coefficient 도함수를 재사용하는 자기검증을 피할 수 있다. “Exact derivative”는 +수학적 항등식을 뜻하며 부동소수점 exp 계산까지 오차가 없다는 뜻은 아니다. +Production 의존성 추가나 24×24 exp의 runtime 사용은 요구하지 않는다. + +**자체 도출: 영회전의 유한 다항 oracle.** `H_p=[p]_cross` 등으로 쓰면 + +\[ +D^3d(0)[p,s,r]=\frac16\sum_{\sigma\in S_3} +H_{\sigma(p)}H_{\sigma(s)}H_{\sigma(r)}d_0. +\] + +이는 exponential Taylor series의 cubic 항에서 바로 얻는다. 방향 permutation 대칭, +각 방향의 선형성, 동일 방향 3회 `H_p³ d0`를 함께 검사할 수 있다. 비영 phi의 +block-exponential oracle와 `D²d`의 방향 중심차분을 추가해 영점 특례만 맞는 오류를 검출한다. +Chart 경계 안쪽, 작은 phi, 서로 비평행한 방향을 포함하되 경계를 넘어 차분하지 않는다. + +| ID | 실행 가능한 검증 설계 후보 | 판정에 필요한 한계 | +| --- | --- | --- | +| NR-E01 | 임의 유효 shell 상태에서 spatial rigid velocity를 부여하여 kinetic energy·총 P·총 L을 독립 volume integration과 대조 | Rigid velocity는 순간 운동학 검사다. 회전하는 탄성 shell이 자유운동에서도 강체를 유지한다는 가정은 하지 않음. Consistent/lumped 각각 자신의 measure를 사용 | +| NR-E02 | `I(q,v,a)`를 q/v/a별 미분하고 전체 effective tangent도 별도 directional check | 3차 director 항과 `D(H^T)` 누락을 분리 검출 | +| NR-E03 | 작은 smooth 회전 구간의 자유 shell에 일관된 initial velocity를 부여하거나 짧은 smooth loading 후 unload, P/L/총에너지·work와 dt 수렴 관찰 | 초기조건/시간하중이 CLI 범위 밖이면 kernel/procedure verification 후보로만 유지. 승인 input subset 확대 금지 | +| NR-E04 | 같은 spatial problem에 alpha=0 및 승인된 음수 alpha를 적용하고 저주파 해상 case와 높은 modal content case를 분리 | 일반 비선형 HHT의 총에너지 매 step 감소 또는 정확한 각운동량 보존을 무조건 요구하지 않음 | +| NR-E05 | 문헌 free-flying single-layer plate를 후속 benchmark 후보로 검토 | 아래 N7은 large rotation/energy 사례의 출처다. 현재 fixed chart를 넘어서는 tumble·장시간 운동은 그대로 채택할 수 없음 | + +**사실 [N7].** Vu-Quoc–Tan (2003), §5.1.2/Figs.9–12는 free-flying single-layer plate의 +큰 전체 운동과 P/L/에너지 및 dissipative/nondissipative integrator 결과를 비교한다. +해당 요소는 rotation DOF가 없는 solid-shell이므로 그 mass·응력 모델과 여기의 director shell은 +다르다. Author-uploaded 본문의 관련 절을 확인했으나 그림의 하중 위치·수치 history를 +독립 추출하지 않았다. 따라서 현 단계에서는 case family 근거이며 완성된 reference artifact가 아니다. + +**추론.** 현재 shell 운동학에서는 `Pdot/Ldot`에 physical a를 사용하고 numerical drill +potential을 포함한 에너지·내력 일을 일관되게 대조해야 한다. N7의 보존형 integrator가 +보이는 exact conservation을 HHT의 요구조건으로 옮길 수 없다. [기존 연구 S8](research.md#research)의 +비선형 Newmark 보존 한계 근거는 그대로 충분하다. 추가 shell 연구는 기하·하중·시간 구간이 +승인된 chart와 입력 범위 안에 있는지 결정한 뒤에만 구체화할 필요가 있다. + + +### 출처·열람 한계와 인계 + +`accessed: 2026-09-22`. 문서 정적 검사만 수행하며 solver/build/test/reference 생성은 수행하지 않았다. + +| ID | Stable citation / locator | 열람 범위 | +| --- | --- | --- | +| N1 | Brüls, O.; Arnold, M. (2008), *The generalized-alpha scheme as a linear multistep integrator: Toward a general mechatronic simulator*, J. Computational and Nonlinear Dynamics 3, 041007, [DOI:10.1115/1.2960475](https://doi.org/10.1115/1.2960475), [author PDF](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf) | Printed pp.3–6 Eq.5–8/Equivalent model, Initial value condition/Constrained case. Shell singular-mass 정리 아님 | +| N2 | Oracle, *Numerical Computation Guide*, [§2.2.3 Double Format](https://docs.oracle.com/cd/E37069_01/html/E39019/z4000ac019269.html) | 53-bit significand 설명. IEEE 표준 전체 적합성 시험을 수행한 것은 아님 | +| N3 | LAPACK, [DGECON](https://netlib.org/lapack/explore-html/d4/daf/group__gecon_ga4f9b830e19e12c7f082ddb497a57af18.html), Purpose/NORM/ANORM/RCOND | Normwise reciprocal condition estimate | +| N4 | LAPACK, [DGESVX](https://netlib.org/lapack/explore-html/d5/dbe/group__gesvx_ga82173a93234afc15d70b64233b3e5bc8.html), Description steps 1–6/INFO | Equilibration, singular pivot와 working-precision warning 구별 | +| N5 | GNU Scientific Library 2.8, [Numerical Differentiation](https://www.gnu.org/software/gsl/doc/html/diff.html), `gsl_deriv_central` | Truncation/roundoff 기반 step/error estimate. FESA tolerance 원본 아님 | +| N6 | Higham, N.J.; Relton, S.D. (2014), *Higher Order Fréchet Derivatives of Matrix Functions and the Level-2 Condition Number*, SIAM J. Matrix Anal. Appl. 35, 1019–1037, [DOI:10.1137/130945259](https://doi.org/10.1137/130945259), [author PDF](https://eprints.maths.manchester.ac.uk/2066/1/paper.pdf), Theorem 3.5/Algorithm 3.6 | 2013 author version printed pp.5–6; oracle identity와 계산법 | +| N7 | Vu-Quoc, L.; Tan, X.G. (2003), *Optimal solid shells for non-linear analyses of multilayer composites. II. Dynamics*, CMAME 192, 1017–1059, [DOI:10.1016/S0045-7825(02)00336-5](https://doi.org/10.1016/S0045-7825(02)00336-5), [author-uploaded text](https://www.researchgate.net/publication/222546721_Optimal_solid_shells_for_non-linear_analyses_of_multilayer_composites_II_Dynamics), §5.1.2/Figs.9–12 | Relevant text 확인; 하중 figure·곡선 digitization 미수행, exact benchmark reproduction 미정 | + +Numerical Review에 인계할 결정은 scaling·conditioning/hidden-defect 판정·FD sweep과 +시간 수렴 구간·case 최소 조합이다. Formulation에 남는 사항은 singular-mass regularity의 +실제 shell 적용과 full-coordinate hidden constraint 검증이다. 사용자 결정에 따라 이번 +HHT 구현은 consistent mass를 사용한다. 위 lumped 비교 근거는 연구 이력이며 현재 지원 요구가 아니다. diff --git a/docs/hht-implicit-dynamics/verification-cases.md b/docs/hht-implicit-dynamics/verification-cases.md index 740f042..d681c0a 100644 --- a/docs/hht-implicit-dynamics/verification-cases.md +++ b/docs/hht-implicit-dynamics/verification-cases.md @@ -1,6 +1,6 @@ # HHT 반증 가능한 검증 사례 -[Numerical Review](numerical-review.md)의 사례 계약이다. [N1–N7 내부 기준](numerical-controls.md)과 [reference 계약](reference-model.md)을 적용한다. 아래 synthetic 초기값·제조 하중은 kernel/procedure 검증용이며 공개 INP 지원을 확대하지 않는다. 사용자 결정 [HHT-ADR-007](ADR.md)의 **consistent kinetic mass**가 HHT 필수 검증 대상이다. Lumped 언급은 기존 mass/eigen 대조 또는 선택되지 않은 대안 설명이며 새 동적 지원 의무가 아니다. 모든 신규 solver 사례는 **NOT RUN**이다. +[Numerical Review](numerical-review.md#numerical-review)의 사례 계약이다. [N1–N7 내부 기준](numerical-controls.md)과 [reference 계약](reference-model.md)을 적용한다. 아래 synthetic 초기값·제조 하중은 kernel/procedure 검증용이며 공개 INP 지원을 확대하지 않는다. 사용자 결정 [HHT-ADR-007](ADR.md)의 **consistent kinetic mass**가 HHT 필수 검증 대상이다. Lumped 언급은 기존 mass/eigen 대조 또는 선택되지 않은 대안 설명이며 새 동적 지원 의무가 아니다. 모든 신규 solver 사례는 **NOT RUN**이다. ## 공통 측정과 실행 상태 @@ -10,7 +10,7 @@ C01–C04의 grid는 `h=1/16,1/32,1/64,1/128,1/256`, `T=1`이다. N7의 마지 | Evidence | 현재 상태와 적용 한계 | | --- | --- | -| [기존 SDOF·moving-null probe](numerical-review-probes.md) | **RUN / 제한된 독립 검산**. h=1/32..1/1024의 **종단 오차** 및 moving-null hidden-defect 최대를 기록했다. 아래 전체 시점 max-error 계약의 실행 통과를 뜻하지 않는다. | +| [기존 SDOF·moving-null probe](numerical-review.md#numerical-review-probes) | **RUN / 제한된 독립 검산**. h=1/32..1/1024의 **종단 오차** 및 moving-null hidden-defect 최대를 기록했다. 아래 전체 시점 max-error 계약의 실행 통과를 뜻하지 않는다. | | C01–C12의 FESA/kernel/procedure 실행 | **NOT RUN**. 구현 후 요구되는 검증 설계다. 기존 Python 수식 계산을 C++ solver 통과로 승계하지 않는다. | | 지정 reference inventory | [reference-model §5](reference-model.md)의 main 정적 조사 evidence. Solver/HDF5 comparison은 **NOT RUN**. | @@ -40,7 +40,7 @@ C04b는 position constraint `max|r-1|<=1e-10`. `max|q·v|`, `max|q·a+v²|`의 ## C06. D3·관성·접선 독립 미분 -C05 기본/warped geometry와 `phi=(0,0,0)`, `(1e-6,-2e-6,3e-6)`, `(.2,-.3,.4)`를 사용한다. Small-angle boundary에는 `phi=(1e-4*(1±2^-10),0,0)`를 추가한다. Direction은 e1/e2/e3, `(1,2,-1)/sqrt6`; 모든 distinct triple permutation과 pure/mixed actions를 포함한다. 영점 D3 oracle는 [추가 연구 N6](numerical-research.md)의 `sum_permutation H_p H_s H_r d0 / 6`, 비영점은 독립 24×24 block exponential의 high-precision evaluation을 사용한다. Production의 같은 Jl scalar derivative를 oracle에 재사용하지 않는다. +C05 기본/warped geometry와 `phi=(0,0,0)`, `(1e-6,-2e-6,3e-6)`, `(.2,-.3,.4)`를 사용한다. Small-angle boundary에는 `phi=(1e-4*(1±2^-10),0,0)`를 추가한다. Direction은 e1/e2/e3, `(1,2,-1)/sqrt6`; 모든 distinct triple permutation과 pure/mixed actions를 포함한다. 영점 D3 oracle는 [추가 연구 N6](research.md#numerical-research)의 `sum_permutation H_p H_s H_r d0 / 6`, 비영점은 독립 24×24 block exponential의 high-precision evaluation을 사용한다. Production의 같은 Jl scalar derivative를 oracle에 재사용하지 않는다. Element state는 `u_i=.01*(i,-i,.5i)`, `phi_i=(.05i,-.03i,.02i)`, `v_ui=(.1,.05i,-.03i)`, `v_phi_i=(.2,-.1i,.04i)`, `a_ui=(.3,-.2,.1i)`, `a_phi_i=(-.07i,.06,.05)`다. q/v/a 중 하나씩 perturb한 DqI/DvI/DaI와 같은 q에서 종속 rate를 갱신한 Keff를 **서로 다른 검사**로 실행한다. Keff에는 `h=.1,.025` 두 값과 N5의 고정 sweep을 쓴다. @@ -68,7 +68,7 @@ Element state는 `u_i=.01*(i,-i,.5i)`, `phi_i=(.05i,-.03i,.02i)`, `v_ui=(.1,.05i F=0의 positive E0에 대해 `e_E(h)=max|T+U_phys+U_drill-E0|/E0`를 기록한다. 마지막 두 refinement에서 감소, 마지막 ratio `e_E(h/2)/e_E(h)<=.6`, finest `e_E<=1e-3`를 요구한다. Momentum은 P0/L0 및 변화가 존재하는 각 quantity의 자연적인 초기 integrand norm 합으로 정규화해 같은 감소/finest `1e-3`를 확인한다. 초기 합 scale=0인 component는 scalar component floor 대신 vector integral의 sum-of-norm scale를 쓴다. 매 frame energy 단조감소·exact nonlinear momentum 보존은 요구하지 않는다. -문헌 free-flying plate는 [추가 연구 N7](numerical-research.md)의 case-family 근거일 뿐이다. 위 C08은 FESA의 별도 완전 지정 synthetic fixture이며 미열람 문헌 그림의 하중·곡선을 재현한다고 주장하지 않는다. +문헌 free-flying plate는 [추가 연구 N7](research.md#numerical-research)의 case-family 근거일 뿐이다. 위 C08은 FESA의 별도 완전 지정 synthetic fixture이며 미열람 문헌 그림의 하중·곡선을 재현한다고 주장하지 않는다. ## C09–C12. 경계·실패·결정론·reference diff --git a/docs/linear-static-3d-euler-beam/README.md b/docs/linear-static-3d-euler-beam/README.md new file mode 100644 index 0000000..c391136 --- /dev/null +++ b/docs/linear-static-3d-euler-beam/README.md @@ -0,0 +1,42 @@ +# 3D Euler–Bernoulli Beam + +## 목적과 현재 범위 + +B33 선형 정적 해석, 지정 변위·절점 하중과 endpoint 복구. 등분포 등가하중은 local 검산이며 공개 DLOAD 지원이 아니다를 구현한 기능이다. 역사적 기능 검증과 현재 통합 회귀의 범위를 구분한다. +최근 dev 통합 회귀는 [전체 현황](../tracking/status.md)에 연결하며, 과거 release 판정은 +[release.md](release.md)에 남긴다. 문서 정리는 새 기능 검증이나 재승인을 뜻하지 않는다. + +## 계약과 재사용 Handoff + +- [요구사항·acceptance](requirements.md): 지원·제외와 기존 요구사항 ID. +- [정식화](formulation.md): 수식·가정·부호·좌표계·복구 위치. +- [I/O](io.md): 입력 subset·진단·source identity·결과 schema. +- [Reference 모델](reference-model.md): 원본과 비교량·행 identity·적용 범위. +- [독립 수치 검토](numerical-review.md): 검산·위험·반례와 수정 확인. +- [검증·물리 결과](verification.md): 실제 실행한 명령·수치·실패·미실행·한계. +- [연구 근거](research.md): 정식화에 필요한 출처와 적용 경계. + +공통 소유권은 [ARCHITECTURE](../ARCHITECTURE.md)를 따른다. Element는 local 계산, +Assembly는 결정적 reduction, Procedure는 trial/commit, Recovery는 물리 의미, +Writer는 직렬화를 담당한다. 새 기능에서 기존 stage/phase 실행 계획을 재사용하지 않는다. +현재 공개 API는 `include/fesa/`, 실제 구현은 `src/fesa/`와 대응 검사를 확인한다. + +## 사용법 + +환경 준비·build·CTest·CLI 기본 사용은 [operations](../operations.md), 입력과 결과의 +공통 계약은 [contracts](../contracts.md)를 따른다. 이 기능의 keyword·option 허용 범위는 +위 I/O 계약을 확인한다. 과거 보고서의 machine 경로·임시 command를 현재 기본값으로 쓰지 않는다. + +## 개발 과정과 주의사항 + +기존 단계별 계획·coordination은 완료된 실행 운영 기록이어서 제거했다. 승인된 요구사항· +수식·검토·실제 검증 결과는 위 문서에 보존한다. Git `858e87b`의 이전 경로는 당시 원문을 +조회하는 용도로만 사용하며 현행 작업 지침이 아니다. + +- Dense Matrix 저장 크기 곱의 overflow가 실제 음성 검사에서 드러났다. 크기를 할당 전에 검사하도록 수정했다. +- 빌드 실패 뒤 `No tests were found`가 나온 실행은 통과 evidence가 아니다. discovery inventory와 실제 실행을 함께 확인한다. +- 여러 instance의 같은 source label과 공유 절점의 서로 다른 element endpoint를 합치지 않는다. +- Beam endpoint action 부호와 회전·local/global 좌표를 검산하며 displacement 일치로 stress/reaction 정확성을 추론하지 않는다. +- 초기 단계의 header 누락 RED는 예상 TDD 실패이고 위 overflow는 실제 결함이었다. 두 종류를 구분한다. + +실제 numerical·parser·solver·reaction·CLI 수정의 세부 evidence는 [수정 기록](lessons.md)에 남긴다. diff --git a/docs/linear-static-3d-euler-beam/build-test.md b/docs/linear-static-3d-euler-beam/build-test.md deleted file mode 100644 index ff0e82e..0000000 --- a/docs/linear-static-3d-euler-beam/build-test.md +++ /dev/null @@ -1,238 +0,0 @@ -# Linear Static 3D Euler Beam Build/Test Report - -## Metadata - -- feature_id: `linear-static-3d-euler-beam` -- source_commit: `400db191ce9f766ca6b34e5b609eaa13c54ccfa3` -- source_implementation_report: `docs/linear-static-3d-euler-beam/implementation-report.md` -- source_implementation_plan: `docs/linear-static-3d-euler-beam/implementation-plan.md` -- status: `pass-for-reference-verification` -- owner_agent: `build-test-executor-agent` -- date: `2026-08-09` -- evidence_window: `2026-08-09T23:16:20.8670416+09:00` through `2026-08-09T23:20:15.7264584+09:00` - -## Verdict - -Fresh Visual Studio 18 2026/MSVC x64 Debug configuration, a clean full rebuild, -the exact Step 25 configure/build commands, nonzero JSON discovery, the feature-label -CTest run, and the full CTest run all passed. CTest discovered the expected 83 tests -and both executed suites passed 83/83. The clean rebuild emitted no compiler or linker -warning line, and generated FESA product projects retain Level 4 plus warnings-as-errors. - -The build/test gate therefore passes for handoff to Step 26 Reference Verification. -This verdict does not approve reference tolerance, physics sanity, or release readiness. - -## Execution Environment - -- os: `Microsoft Windows 11 Home 10.0.26200 build 26200; 64-bit` -- source_head: `400db191ce9f766ca6b34e5b609eaa13c54ccfa3` -- generator: `Visual Studio 18 2026` -- Visual Studio: `Community 18.8.2` (`18.8.12023.21`) -- MSBuild: `18.8.2+ce25c0108` -- compiler: `MSVC 19.51.36252.0` -- compiler_architecture: `x64` -- Windows SDK: `10.0.26100.0` -- language: `C++17`, required, extensions disabled -- config: `Debug` -- build_dir: `.harness/build` -- harness_config: absent; repository auto-CMake defaults plus Step 25 explicit cache values -- project_selection: auto CMake from root `CMakeLists.txt` -- command_discovery_path: default CMake/MSVC x64 Debug with explicit local dependency paths -- CMake / CTest: `4.4.0 / 4.4.0` - -### Dependency Revisions - -| dependency | resolved revision or version | evidence | -| --- | --- | --- | -| GoogleTest | `04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4` | clean `C:/git/googletest` checkout HEAD | -| Intel oneMKL | `2026.1.0` | `MKLConfigVersion.cmake`; configure reported `MKL_VERSION: 2026.1.0`, dynamic ILP64, Intel threading | -| Intel oneTBB | `2023.1.0` | `TBBConfigVersion.cmake` from the configured `2023.1` package | -| HDF5 | `2.1.1` | `hdf5-config-version.cmake` from the configured `2.1.1` package | - -## Freshness and Configuration Resolution - -The ignored generated build tree already existed. Fresh evidence was obtained without -reusing its cache or products by running CMake `--fresh` with the generator explicitly -fixed to Visual Studio 18 2026, then running the generated `clean` target before the -full build. The literal no-`--fresh`, no-`-G` configure command from Step 25 was then -run against that resolved VS18 cache and followed by the literal build, discovery, -feature-label, and full-test commands. - -Post-configure metadata recorded: - -- `CMAKE_GENERATOR=Visual Studio 18 2026` -- `CMAKE_GENERATOR_PLATFORM=x64` -- `CMAKE_CXX_COMPILER_ID=MSVC` -- `CMAKE_CXX_COMPILER_VERSION=19.51.36252.0` -- `CMAKE_CXX_COMPILER_ARCHITECTURE_ID=x64` - -## Command Log Summary - -| order | command | start / end | exit code | duration | verdict and stdout/stderr tail | -| ---: | --- | --- | ---: | ---: | --- | -| 1 | `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"` | `23:16:20.867+09:00` / `23:16:27.706+09:00` | 0 | `6.836 s` | pass; MKL 2026.1.0 and required runtime libraries resolved; `Configuring done`, `Generating done`, build files written to `.harness/build` | -| 2 | `cmake --build .harness/build --config Debug --target clean` | `23:16:37.194+09:00` / `23:16:37.914+09:00` | 0 | `0.716 s` | pass; generated VS18 clean target completed | -| 3 | `cmake --build .harness/build --config Debug` | `23:16:47.054+09:00` / `23:18:01.769+09:00` | 0 | `74.713 s` | pass; clean compile/link produced `fesa.exe` and all three test executables; warning scan count `0` | -| 4 | `cmake -S . -B .harness/build -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"` | `23:19:10.210+09:00` / `23:19:10.861+09:00` | 0 | `0.649 s` | pass; exact Step 25 command selected Windows SDK 10.0.26100.0, retained VS18/x64, and completed configure/generate | -| 5 | `cmake --build .harness/build --config Debug` | `23:19:25.404+09:00` / `23:19:28.969+09:00` | 0 | `3.562 s` | pass; exact Step 25 build confirmed `fesa_solver`, `fesa.exe`, and all test executables; warning scan count `0` | -| 6 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `23:19:45.728+09:00` / `23:19:45.798+09:00` | 0 | `0.065 s` | pass; JSON kind `ctestInfo` version 1.0; 83 tests; every test has the feature label | -| 7 | `ctest --test-dir .harness/build -C Debug -L linear-static-3d-euler-beam --output-on-failure` | `23:20:00.199+09:00` / `23:20:04.163+09:00` | 0 | `3.961 s` | pass; `100% tests passed out of 83`; real test time `3.92 s` | -| 8 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | `23:20:11.899+09:00` / `23:20:15.726+09:00` | 0 | `3.825 s` | pass; `100% tests passed out of 83`; real test time `3.79 s` | - -An initial post-clean discovery/feature/full smoke was also run before the literal -configure replay: discovery exit 0 in `0.068 s` with 83 tests, feature-label CTest -exit 0 in `4.244 s` with 83/83, and full CTest exit 0 in `4.011 s` with 83/83. -Rows 4 through 8 are the final canonical Step 25 acceptance chain. - -## Validation Results - -| validation_stage | result | evidence | -| --- | --- | --- | -| harness self-test | skipped | No Harness Python, Hook, or agent-config file is part of HEAD `400db19` verification scope. | -| fresh configure | pass | Explicit VS18/x64 `--fresh` configure exit 0, followed by clean target exit 0. | -| exact configure | pass | Literal Step 25 configure exit 0; generated metadata is MSVC/x64. | -| clean full build | pass | Exit 0 after clean; all source and test translation units compiled and linked. | -| exact build | pass | Exit 0; product and three test executables confirmed. | -| compiler/warning policy | pass | `fesa_solver` and `fesa_cli` generated projects have `Level4` and `TreatWarningAsError=true`; clean and exact build scans found zero warning lines. | -| CTest discovery | pass | Exit 0; 83 tests, greater than zero and equal to the expected inventory. | -| feature-specific tests | pass | Label `linear-static-3d-euler-beam`: 83/83 passed. | -| full CTest | pass | 83/83 passed with zero failed tests. | -| reference immutability | pass | Pre/post `git diff --exit-code -- reference/` exit 0, status empty, and four exact SHA-256 values unchanged. | -| source worktree before report | pass | `git status --short` empty at HEAD `400db19`. | - -## CTest Inventory - -### Label Inventory - -| label | count | -| --- | ---: | -| `linear-static-3d-euler-beam` | 83 | -| `unit` | 73 | -| `integration` | 5 | -| `reference` | 5 | - -### Suite Inventory and Step Trace - -| implementation Step | CTest suite or suites | count | cumulative count | Step 7-24 report evidence audit | -| ---: | --- | ---: | ---: | --- | -| 7 | `BuildInfo` | 2 | 2 | pass | -| 8 | `CoreDiagnostics` | 3 | 5 | pass | -| 9 | `DenseMath` | 2 | 7 | pass | -| 10 | `DomainModel` | 3 | 10 | pass | -| 11 | `InpSyntax` | 4 | 14 | pass | -| 12 | `InpDomainMapping` | 5 | 19 | pass | -| 13 | `AnalysisModel` | 3 | 22 | pass | -| 14 | `DofManager` | 4 | 26 | pass | -| 15 | `AnalysisState` | 3 | 29 | pass | -| 16 | `EulerBeam3D` | 10 | 39 | pass | -| 17 | `ParallelFor` | 3 | 42 | pass | -| 18 | `SparseAssembly` | 5 | 47 | pass | -| 19 | `EssentialConstraints` | 4 | 51 | pass | -| 20 | `MklPardisoSolver` | 6 | 57 | pass | -| 21 | `LoadAssembly` | 5 | 62 | pass | -| 22 | `ResultRecovery` | 6 | 68 | pass | -| 23 | `Hdf5ResultsWriter` | 5 | 73 | pass | -| 24 | `LinearStaticCli` (5), `ReferenceComparisonContract` (4), `B33ReferenceComparison` (1) | 10 | 83 | pass | - -The JSON inventory contains every exact test name registered by GoogleTest discovery. -No duplicate CTest name was observed; the label partition is exactly 73 unit + 5 -integration + 5 reference = 83. - -## Step 7-24 Implementation Evidence Audit - -The cumulative implementation report was checked block-by-block against the implementation -plan and the phase index summaries. All 18 Step blocks are present and each records: - -- its matching `TASK-07` through `TASK-24`, `status: completed`, changed files, - requirement IDs, and test IDs; -- at least one implementation-owned nonzero RED command with the expected missing API - or named behavioral failure; -- a zero-exit GREEN build/test for the Step's targeted CTest suite; -- zero-exit MSVC x64 configure/build, nonzero JSON discovery, and zero-failure full CTest; -- `/W4 /WX` or equivalent generated warning-policy evidence and reference-tree - immutability evidence. - -Step 20 and Step 22 additionally retain valid behavioral RED/GREEN correction evidence. -Step 23 records its environment link incident separately from the valid missing-API RED, -so the environment incident was not counted as TDD evidence. The cumulative counts in the -implementation report and the Step 7-24 phase summaries progress exactly to the freshly -discovered 83-test inventory above. - -The implementation report's cumulative header still says `in-progress`; the audited -step-local evidence contract and phase index nevertheless mark every implementation Step -7-24 `completed`. This stale aggregate header is not a missing Step block, missing test, -or failed build/test gate and was not modified by the independent executor. - -## `/W4 /WX` and Warning Audit - -- `src/fesa/CMakeLists.txt` applies `/W4 /WX` privately to `fesa_solver` and `fesa_cli`. -- Generated `fesa_solver.vcxproj` and `fesa_cli.vcxproj` contain - `Level4` and - `true` for Debug and the other generated - configurations. -- The clean 74.713-second build recompiled the product and all test translation units; - its compiler/linker warning scan found `0` lines. -- The exact post-configure build also exited 0 and found `0` warning lines. - -Result: no product warning was emitted, and any MSVC product warning would have failed -the build under `/WX`. - -## Reference Read-Only Audit - -The following SHA-256 values were identical before and after all configure/build/test -commands, while both reference diff checks exited 0 and both reference status checks -were empty: - -| exact approved legacy path | SHA-256 | -| --- | --- | -| `reference/cantilever beam/cantilever beam.inp` | `E406EA9560321B791DB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | -| `reference/cantilever beam/cantilever beam displacements.csv` | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | -| `reference/cantilever beam/cantilever beam reactions.csv` | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | -| `reference/cantilever beam/cantilever beam elemental forces.csv` | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | - -## Failure Classification - -- classification: `N/A` -- primary_failure: `N/A` -- first_failed_command: `N/A` -- evidence_tail: All required configure, build, discovery, feature-label, and full-test - commands exited 0; no failed test exists. -- correction_handoff: `N/A`; no implementation-owned, environment, harness, or - upstream-contract failure requires correction. - -## Failed Test Inventory - -None. Feature-label CTest and full CTest both passed 83/83. - -## Handoff Recommendation - -| target_agent | reason | required_input | -| --- | --- | --- | -| Reference Verification Agent | Step 25 build/test gate is `pass-for-reference-verification`. | This report, HEAD `400db19`, `.harness/build/tests/Debug/fesa_reference_tests.exe`, and the unchanged exact legacy bundle. | - -The build-local Step 24 evidence exists at -`.harness/build/reference/cantilever-beam-b33/results.h5` and -`.harness/build/reference/cantilever-beam-b33/comparison.json`; the JSON is 128,118 bytes -with SHA-256 -`258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D`. -Step 26 must independently rerun and inspect the approved comparison evidence. Its -presence and CTest success here are not a reference-verification verdict. - -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_or_upstream_contracts_modified: `false` -- reference_artifacts_modified: `false` -- tolerance_policies_modified: `false` -- owned_report_modified: `true` -- phase_index_step25_modified: `true` -- notes: Before report/index creation the worktree was clean at the audited HEAD. Final - scope validation is limited to this report and the Step 25 fields in the phase index. - -## Open Issues - -- None blocking Reference Verification. -- The implementation report aggregate `in-progress` header is noted above but does not - contradict its 18 completed Step blocks, the phase index, or the fresh build/test result. diff --git a/docs/linear-static-3d-euler-beam/coordination.md b/docs/linear-static-3d-euler-beam/coordination.md deleted file mode 100644 index 1aba3be..0000000 --- a/docs/linear-static-3d-euler-beam/coordination.md +++ /dev/null @@ -1,41 +0,0 @@ -# Linear Static 3D Euler Beam Coordination Report - -## Metadata - -- feature_id: linear-static-3d-euler-beam -- status: completed -- owner_agent: coordinator-agent -- date: 2026-08-15 -- migration_note: Existing evidence was relocated without rerunning workflow gates. - -## Worklist - -| stage | owner | status | evidence | -| --- | --- | --- | --- | -| 1. requirements | requirement-agent | passed | `requirements.md` | -| 2. research | research-agent | passed | `research.md` | -| 3. formulation | formulation-agent | passed | `formulation.md` | -| 4. numerical and reference | numerical-review-agent | passed | `numerical-review.md`; `reference-model.md` | -| 5. I/O | io-definition-agent | passed | `io.md` | -| 6. implementation and verification | implementation-planning-agent; implementation-agent | passed | `implementation-plan.md`; `implementation-report.md`; `build-test.md`; `reference-comparison.md` | -| 7. physics | physics-evaluation-agent | passed | `physics-evaluation.md` | -| 8. release | release-agent | passed | `release.md` | - -## Current Progress - -- active_sub_agent: none -- next_handoff: none -- closure_evidence: `release.md` status `ready-for-release` -- workflow_disposition: completed - -## Decision Log - -| date | decision | evidence | rationale | -| --- | --- | --- | --- | -| 2026-08-15 | Record migrated workflow as completed | `release.md` | Preserve the existing release verdict without retroactive gate execution. | - -## Blockers and Rework - -- active_blockers: none -- correction_attempt_count: 0 -- needs_user_decision: false diff --git a/docs/linear-static-3d-euler-beam/formulation.md b/docs/linear-static-3d-euler-beam/formulation.md index dbe4b7b..6e64706 100644 --- a/docs/linear-static-3d-euler-beam/formulation.md +++ b/docs/linear-static-3d-euler-beam/formulation.md @@ -5,7 +5,7 @@ - feature_id: `3d-isoparametric-euler-beam` - source_requirement: `docs/linear-static-3d-euler-beam/requirements.md` - source_research: `docs/linear-static-3d-euler-beam/research.md` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` +- approved_design: `docs/development-history.md` - status: `ready-for-numerical-review` - owner_agent: `formulation-agent` - date: `2026-08-09` diff --git a/docs/linear-static-3d-euler-beam/implementation-plan.md b/docs/linear-static-3d-euler-beam/implementation-plan.md deleted file mode 100644 index 250eb62..0000000 --- a/docs/linear-static-3d-euler-beam/implementation-plan.md +++ /dev/null @@ -1,1138 +0,0 @@ -# Linear Static 3D Euler Beam Implementation Plan - -> **For agentic workers:** REQUIRED SKILL: use `fesa-cpp-msvc-tdd` for every Step 7-24 task and execute each task as one `RED -> GREEN -> VERIFY` cycle. The Harness executor, not the worker, owns commits and timestamps. - -**Goal:** Build the approved single-step Abaqus `TYPE=B33` linear-static pipeline from `.inp` parsing through deterministic sparse solution, result recovery, atomic HDF5 output, CLI execution, and a reusable read-only B33 reference-comparison test. - -**Architecture:** `Domain` owns the immutable semantic model; `AnalysisModel`, `DofManager`, and `AnalysisState` separate active views, equation ownership, and mutable solution state. Dense math, CSR storage, oneTBB, oneMKL PARDISO, and HDF5 remain behind focused adapter boundaries, while `Analysis::run()` fixes factorization-before-load orchestration. - -**Tech Stack:** C++17, MSVC x64 Debug, CMake, CTest, GoogleTest, Intel oneMKL, Intel oneTBB, and HDF5. - -## Metadata - -- feature_id: `linear-static-3d-euler-beam` -- source_requirement: `docs/linear-static-3d-euler-beam/requirements.md` -- source_research: `docs/linear-static-3d-euler-beam/research.md` -- source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` -- source_numerical_review: `docs/linear-static-3d-euler-beam/numerical-review.md` -- source_io_definition: `docs/linear-static-3d-euler-beam/io.md` -- source_reference_models: `docs/linear-static-3d-euler-beam/reference-model.md` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` -- phase_steps: `phases/linear-static-3d-euler-beam/step7.md` through `step24.md` -- status: `ready-for-implementation` -- owner_agent: `implementation-planning-agent` -- date: `2026-08-09` - -## Global Constraints - -- Implement only one `*STEP, *STATIC` and two-node `TYPE=B33`; reject B31, a second step, instance transforms, nested assembly, `I12!=0`, and `*DLOAD`. -- Preserve the exact lifecycle: stiffness assembly and partition, `Kff` factorization, load assembly, effective RHS, substitution, reconstruction, recovery, HDF5 write. -- Treat `reference/cantilever beam/` as a read-only four-file legacy baseline. Do not create, rename, rewrite, repair, restore, round, or clamp its files. -- Use C++17 and MSVC x64 Debug. Apply `/W4 /WX` only to FESA targets and add no new warnings. -- Keep each owned file focused on its listed responsibility and add reviewer-facing comments for the approved formula/sign, deterministic ordering, backend lifetime, and atomic-finalization decisions implemented there. -- Write and run the related GoogleTest first, observe the planned RED cause, implement the minimum production behavior, then run the targeted GREEN and full VERIFY in the same Step. -- Keep MKL, oneTBB, HDF5, and Windows file-replacement types out of public headers. -- Do not change requirements, formulation, numerical review, I/O contract, reference contract, or tolerance policy during implementation or correction. -- Do not execute Abaqus, Nastran, or another reference solver. -- Do not commit directly; `scripts/execute.py` owns commits and timestamps. - -## Readiness Check - -| input | required status | observed status | decision | -| --- | --- | --- | --- | -| requirements | approved | `approved`; 44 consecutive must requirements | proceed | -| research | sufficient evidence with implementation gaps identified | `ready-for-formulation`; PARDISO and deterministic reduction gaps explicitly handed off | proceed with the resolutions below | -| formulation | ready for independent numerical review | `ready-for-numerical-review`; no unresolved mathematical input | proceed | -| numerical review | pass for implementation planning | `pass-for-implementation-planning`; no confirmed defect | proceed | -| I/O definition | ready for implementation planning | `ready-for-implementation-planning`; `NR-O03` station normalization resolved | proceed | -| reference models | ready for implementation planning or planned analytical fixtures | `ready-for-implementation-planning`; legacy bundle inventory-ready and analytical fixtures planned | proceed | -| approved design and Step 7-24 | approved and mutually implementable | design `approved`; all 18 module steps present | proceed with the precedence notes below | - -### Readiness resolutions - -1. `NR-O01-PARDISO-CONTRACT` is closed for planning by Intel's official oneMKL C reference: real symmetric positive definite matrices use `mtype=2`; analysis, numerical factorization, solve, and release are phases `11`, `22`, `33`, and `-1`; `iparm[34]=1` selects zero-based CSR; a retained factorization can serve repeated right-hand sides; and zero/negative SPD pivots stop with error `-4`. Sources: [Intel oneMKL PARDISO](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2025-0/pardiso.html) and [PARDISO iparm parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2025-0/pardiso-iparm-parameter.html). -2. `NR-O02-DETERMINISTIC-REDUCTION` is fixed as a project algorithm: produce one index-addressed local contribution buffer per stable active-element order; enumerate each 12x12 local matrix in row-major `localOrder`; stable-sort COO by `(row,column,elementOrder,localOrder)`; sum duplicates in that order; emit the exact sorted-unique `SparsePattern`; and retain exact zero values for every structural pattern slot. Serial, TBB, and repeated runs must produce byte-identical CSR arrays. -3. `NR-O03-STATION-NORMALIZATION` is already resolved by the I/O/reference contracts: only unloaded, consistently oriented, two-endpoint interior stations are eligible; compare endpoints before choosing the smaller stable element ID; never average. -4. Approved upstream contracts take precedence over broader wording in Step 12. `*STATIC` has exactly one row of four finite positive fields, and material acceptance requires exactly `E,nu`, `E>0`, and derived `G=E/(2*(1+nu))>0`; do not add an unapproved `nu<0.5` rejection. - -No readiness item requires a user decision, an upstream edit, or a new reference artifact. - -## Implementation Scope - -### Included behavior - -- Single small-displacement, small-rotation, linear-elastic static analysis. -- Straight prismatic two-node 3D Euler-Bernoulli beam mapped only from Abaqus `TYPE=B33`. -- Global nodal order `[UX,UY,UZ,URX,URY,URZ]`; axial, two-plane bending, and Saint-Venant torsion. -- Approved Abaqus keyword subset, identity instances, stable source/internal identity, warning no-op output allowlist, nodal `*CLOAD`, and zero/nonzero prescribed displacement. -- Formulation-only constant local line-load equivalent nodal vector; no parser or CLI distributed load. -- Contiguous `Vector`, row-major contiguous `Matrix`, deterministic 0-based CSR `SparseMatrix`, element-local oneTBB work, SPD PARDISO factorization/substitution, and residual reactions. -- Mandatory HDF5 displacement, reaction, equilibrium end action, endpoint section resultant, two-Gauss generalized strain/resultant, axial `S11`, metadata, and diagnostics. -- `fesa.exe` CLI and a test-only HDF5-to-legacy-CSV comparison executable/test that Step 26 reruns unchanged. - -### Non-goals - -- Abaqus full compatibility, B31/Timoshenko behavior, multiple steps, instance transforms, nested assembly, dependent/independent mesh semantics. -- `I12!=0`, taper, offset, release, curved beams, warping, geometric/material nonlinearity, dynamics, contact, or thermal effects. -- `*DLOAD` parsing, a Domain distributed-load object, transverse/torsional shear stress, nodal stress averaging, or Abaqus beam-stress comparison. -- Automatic slenderness acceptance/rejection, arbitrary regularization of singular systems, expression templates, alternate sparse solvers, packaging, release approval, or reference generation. - -## Interface and Data-Flow Ledger - -The signatures below are the cross-task contract. A task may add private helpers in its owned `.cpp`, but later tasks must consume these names, ownership rules, and types without substituting parallel APIs. - -```cpp -// core -struct SourceLocation { std::filesystem::path file; std::size_t line; }; -struct SourceEntityId { - std::string instanceName; - std::int64_t sourceLabel; - std::string sourceLabelText; -}; -enum class Severity { warning, error }; -enum class FailureCategory { input, model, solver, output }; -struct Diagnostic { - Severity severity; - std::string code; - SourceLocation location; - std::string keyword; - std::string entityIdentity; - std::string message; -}; -class Status { -public: - static Status ok(); - static Status failure(std::vector diagnostics); - static Status failure(FailureCategory category, std::vector diagnostics); - bool isOk() const noexcept; - std::optional failureCategory() const noexcept; - const std::vector& diagnostics() const noexcept; -}; -template class Result { -public: - static Result success(T value); - static Result failure(Status status); - bool hasValue() const noexcept; - T& value(); - const T& value() const; - const Status& status() const noexcept; -}; - -// dense math -class Vector { -public: - explicit Vector(std::size_t size, double value = 0.0); - std::size_t size() const noexcept; - double* data() noexcept; - const double* data() const noexcept; - double& operator[](std::size_t index); - const double& operator[](std::size_t index) const; - double dot(const Vector& rhs) const; - double norm() const; - void scale(double alpha); - void axpy(double alpha, const Vector& x); -}; -class Matrix { -public: - Matrix(std::size_t rows, std::size_t columns, double value = 0.0); - std::size_t rows() const noexcept; - std::size_t columns() const noexcept; - double& operator()(std::size_t row, std::size_t column); - const double& operator()(std::size_t row, std::size_t column) const; - Vector multiply(const Vector& rhs) const; - Matrix multiply(const Matrix& rhs) const; -}; - -// immutable semantic model -using EntityIndex = std::uint32_t; -struct Node { - SourceEntityId sourceId; std::array coordinates; SourceLocation location; -}; -struct LinearElasticMaterial { - std::string name; double youngsModulus; double poissonRatio; SourceLocation location; -}; -struct GeneralBeamSection { - std::string name; double area; double i11; double i12; double i22; - double torsionalConstant; std::array firstAxis; - std::vector> sectionPoints; SourceLocation location; -}; -struct EulerBeam3DDefinition { - SourceEntityId sourceId; std::array nodeIndices; - EntityIndex materialIndex; EntityIndex sectionIndex; SourceLocation location; -}; -struct BoundaryCondition { - std::string target; int firstDof; int lastDof; double value; SourceLocation location; -}; -struct NodalLoad { - std::string target; int dof; double magnitude; SourceLocation location; -}; -struct StaticStepDefinition { - std::string name; std::vector boundaries; - std::vector loads; - double initialIncrement; - double timePeriod; - double minimumIncrement; - double maximumIncrement; - SourceLocation location; -}; -struct NodeSet { - std::string name; - std::optional instanceName; - std::vector nodeIndices; - SourceLocation location; -}; -struct ElementSet { - std::string name; - std::optional instanceName; - std::vector elementIndices; - SourceLocation location; -}; -struct PartDefinition { - std::string name; - std::vector nodeSourceLabels; - std::vector elementSourceLabels; - std::vector nodeSetNames; - std::vector elementSetNames; - SourceLocation location; -}; -struct SourceIndexMapping { - std::int64_t sourceLabel; - EntityIndex internalIndex; -}; -struct InstanceDefinition { - std::string name; - std::string partName; - std::vector nodeMappings; - std::vector elementMappings; - SourceLocation location; -}; -struct ModelDefinition { - std::filesystem::path sourcePath; - std::string sourceContentIdentity; - std::string heading; - std::vector nodes; - std::vector elements; - std::vector materials; - std::vector sections; - std::vector nodeSets; - std::vector elementSets; - std::vector parts; - std::vector instances; - std::vector steps; - std::vector warnings; -}; -class Domain { -public: - static Result create(ModelDefinition definition); - const std::vector& nodes() const noexcept; - const std::vector& elements() const noexcept; - const std::vector& materials() const noexcept; - const std::vector& sections() const noexcept; - const std::vector& nodeSets() const noexcept; - const std::vector& elementSets() const noexcept; - const std::vector& steps() const noexcept; - const std::vector& warnings() const noexcept; - const std::filesystem::path& sourcePath() const noexcept; - const std::string& sourceContentIdentity() const noexcept; -}; - -// parser and active analysis view -struct KeywordParameter { std::string name; std::optional value; }; -struct DataLine { std::vector fields; SourceLocation location; }; -struct KeywordBlock { - std::string canonicalName; - std::string originalLine; - std::vector parameters; - std::vector data; - SourceLocation location; -}; -struct ParsedInput { - std::filesystem::path sourcePath; - std::string sourceContentIdentity; - std::vector blocks; -}; -class AbaqusInputReader { -public: - Result read(const std::filesystem::path& inputPath) const; -}; -class AbaqusDomainMapper { -public: - Result map(const ParsedInput& input) const; -}; -class AnalysisModel { -public: - static Result create(const Domain& domain); - const Domain& domain() const noexcept; - const StaticStepDefinition& step() const noexcept; - const std::vector& activeElements() const noexcept; - const std::vector& activeMaterials() const noexcept; - const std::vector& activeSections() const noexcept; - const std::vector& activeBoundaryConditions() const noexcept; - const std::vector& activeLoads() const noexcept; -}; - -// equation and state ownership -enum class DofComponent : std::uint8_t { ux, uy, uz, urx, ury, urz }; -struct SparsePattern { - std::vector rowOffsets; - std::vector columnIndices; -}; -class DofManager { -public: - static Result create(const AnalysisModel& model); - std::size_t fullDofCount() const noexcept; - std::size_t freeDofCount() const noexcept; - std::size_t constrainedDofCount() const noexcept; - std::size_t fullDof(EntityIndex node, DofComponent component) const; - std::optional freeEquation(std::size_t fullDof) const; - const std::array& elementScatter(EntityIndex element) const; - const std::vector& freeDofs() const noexcept; - const std::vector& constrainedDofs() const noexcept; - const Vector& prescribedValues() const noexcept; - const SparsePattern& sparsePattern() const noexcept; -}; -struct StepFrameIdentity { std::string stepName; std::size_t frameIndex; }; -struct EndpointResultRow { - EntityIndex element; int endpoint; SourceEntityId node; - std::array endAction; - std::array sectionResultant; -}; -struct GaussResultRow { - EntityIndex element; int gaussPoint; - std::array generalizedStrain; - std::array generalizedResultant; -}; -struct StressS11Row { - EntityIndex element; int gaussPoint; std::size_t sectionPoint; - double x1; double x2; double s11; std::string source; -}; -class AnalysisState { -public: - static AnalysisState create(const DofManager& dofs, StepFrameIdentity identity); - Vector& displacement() noexcept; const Vector& displacement() const noexcept; - Vector& externalForce() noexcept; const Vector& externalForce() const noexcept; - Vector& internalForce() noexcept; const Vector& internalForce() const noexcept; - Vector& residual() noexcept; const Vector& residual() const noexcept; - Vector& reaction() noexcept; const Vector& reaction() const noexcept; - const StepFrameIdentity& identity() const noexcept; - std::vector& endpointResults() noexcept; - const std::vector& endpointResults() const noexcept; - std::vector& gaussResults() noexcept; - const std::vector& gaussResults() const noexcept; - std::vector& stressResults() noexcept; - const std::vector& stressResults() const noexcept; -}; - -// element, parallelism, and sparse assembly -struct ConstantLocalLineLoad { double px; double py; double pz; double mx; }; -struct BeamStressPoint { - int gaussPoint; std::size_t sectionPoint; double x1; double x2; - double s11; std::string source; -}; -struct BeamRecovery { - std::array, 2> equilibriumEndActions; - std::array, 2> endpointSectionResultants; - std::array, 2> gaussGeneralizedStrains; - std::array, 2> gaussGeneralizedResultants; - std::vector stressPoints; -}; -class EulerBeam3D { -public: - static Result create(const Node& firstNode, const Node& secondNode, - const GeneralBeamSection& section, - const LinearElasticMaterial& material); - Matrix localStiffness() const; - Matrix globalStiffness() const; - Vector localEquivalentLoad(const ConstantLocalLineLoad& load) const; - BeamRecovery recover(const Vector& globalElementDisplacement) const; -}; -class ParallelFor { -public: - virtual ~ParallelFor() = default; - virtual void execute(std::size_t count, - const std::function& body) const = 0; -}; -class SerialParallelFor final : public ParallelFor { -public: - void execute(std::size_t count, - const std::function& body) const override; -}; -class TbbParallelFor final : public ParallelFor { -public: - void execute(std::size_t count, - const std::function& body) const override; -}; -struct CooContribution { - std::size_t row; - std::size_t column; - double value; - std::size_t elementOrder; - std::size_t localOrder; -}; -class SparseMatrix { -public: - static Result fromCoo(std::size_t rows, std::size_t columns, - std::vector contributions, - const SparsePattern& expectedPattern); - std::size_t rows() const noexcept; - std::size_t columns() const noexcept; - const std::vector& rowOffsets() const noexcept; - const std::vector& columnIndices() const noexcept; - const std::vector& values() const noexcept; - Vector multiply(const Vector& rhs) const; - Status validate() const; -}; -class SparseAssembler { -public: - static Result assembleStiffness(const AnalysisModel& model, - const DofManager& dofs, - const ParallelFor& parallelFor); -}; - -// constraints, solver, load, recovery, and output -struct PartitionedStiffness { - SparseMatrix kff; - SparseMatrix kfc; - SparseMatrix kcf; - SparseMatrix kcc; -}; -class EssentialConstraints { -public: - static Result partition(const SparseMatrix& full, - const DofManager& dofs); - static Vector gatherFree(const Vector& full, const DofManager& dofs); - static Vector gatherConstrained(const Vector& full, const DofManager& dofs); - static Vector reconstructFull(const Vector& freeValues, - const Vector& constrainedValues, - const DofManager& dofs); -}; -class LinearSolver { -public: - virtual ~LinearSolver() = default; - virtual Status factorize(const SparseMatrix& matrix) = 0; - virtual Status solve(const Vector& rhs, Vector& solution) const = 0; -}; -class MklPardisoSolver final : public LinearSolver { -public: - MklPardisoSolver(); - ~MklPardisoSolver() override; - Status factorize(const SparseMatrix& matrix) override; - Status solve(const Vector& rhs, Vector& solution) const override; -private: - class Impl; - std::unique_ptr impl_; -}; -class LoadAssembler { -public: - static Result assembleFullNodalLoad(const AnalysisModel& model, - const DofManager& dofs); - static Result effectiveFreeRhs(const Vector& fullLoad, - const SparseMatrix& kfc, - const Vector& prescribedValues, - const DofManager& dofs); -}; -struct NodeStationResultRow { - SourceEntityId node; - EntityIndex representativeElement; - std::array sectionResultant; -}; -class ResultRecovery { -public: - static Status recover(const AnalysisModel& model, - const DofManager& dofs, - const SparseMatrix& fullStiffness, - AnalysisState& state); - static Result> normalizeSectionResultantsToNodeStations( - const AnalysisModel& model, - const std::vector& endpointRows, - const std::array& componentTolerances); // [N,T,My,Mz] -}; -class ResultsWriter { -public: - virtual ~ResultsWriter() = default; - virtual Status write(const std::filesystem::path& outputPath, - const Domain& domain, - const AnalysisState& state, - const std::vector& diagnostics) = 0; -}; -class Hdf5ResultsWriter final : public ResultsWriter { -public: - Status write(const std::filesystem::path& outputPath, - const Domain& domain, - const AnalysisState& state, - const std::vector& diagnostics) override; -}; - -// orchestration -struct AnalysisRequest { std::filesystem::path inputPath; std::filesystem::path outputPath; }; -class Analysis { -public: - virtual ~Analysis() = default; - Status run(const AnalysisRequest& request); -protected: - virtual Status initialize(const AnalysisRequest& request) = 0; - virtual Status buildAnalysisModel() = 0; - virtual Status buildDofMapAndSparsePattern() = 0; - virtual Status assembleAndPartitionStiffness() = 0; - virtual Status factorize() = 0; - virtual Status assembleLoadsAndEffectiveRhs() = 0; - virtual Status substituteAndReconstruct() = 0; - virtual Status recoverAndWriteResults() = 0; -}; -class LinearStaticAnalysis final : public Analysis { -public: - LinearStaticAnalysis(const ParallelFor& parallelFor, - LinearSolver& linearSolver, - ResultsWriter& resultsWriter); -protected: - Status initialize(const AnalysisRequest& request) override; - Status buildAnalysisModel() override; - Status buildDofMapAndSparsePattern() override; - Status assembleAndPartitionStiffness() override; - Status factorize() override; - Status assembleLoadsAndEffectiveRhs() override; - Status substituteAndReconstruct() override; - Status recoverAndWriteResults() override; -}; -class FesaApplication { -public: - int run(const std::vector& arguments); -}; -``` - -These records preserve raw names/source-label lexemes and stable declaration order but contain no equation IDs or analysis vectors. Step 12 rejects transforms before creating `InstanceDefinition`, so the record deliberately has no transform field. - -## Work Breakdown - -Every task below is one Harness Step and one independent review gate. Each task begins by registering the named GoogleTests in `tests/CMakeLists.txt`, observes the stated RED, adds only its owned production files, reaches the targeted GREEN, appends evidence to the implementation report, and runs its full VERIFY. - -### TASK-07: `cmake-test-foundation` - -**Files and single responsibilities** - -| action | file | responsibility | -| --- | --- | --- | -| create | `CMakeLists.txt` | C++17 project root, dependency entry, testing enablement, subdirectories | -| create | `cmake/FesaDependencies.cmake` | validate `FESA_GTEST_SOURCE_DIR`; normalize oneMKL, oneTBB, HDF5 imported targets | -| create | `include/fesa/build_info.hpp` | declare `std::string_view solverVersion() noexcept` only | -| create | `src/fesa/build_info.cpp` | define stable solver version string | -| create | `src/fesa/CMakeLists.txt` | `fesa_solver`, warning isolation, and later production source registration | -| create | `tests/CMakeLists.txt` | GoogleTest targets/discovery, common feature label, test meta-target | -| create | `tests/unit/build_info_test.cpp` | compile/runtime contract for solver version | -| create | `docs/linear-static-3d-euler-beam/implementation-report.md` | cumulative Step 7-24 evidence ledger | - -- Consumes: repository toolchain and approved dependency locations; no solver module. -- Produces: normalized dependency aliases `Fesa::MKL`, `Fesa::TBB`, and `Fesa::HDF5`; `fesa_solver`; `fesa_unit_tests`; custom target `fesa_tests`; common CTest label `linear-static-3d-euler-beam`; and `solverVersion()`. -- Tests: `T07-BUILD-001 = BuildInfo.VersionIsStableAndNonEmpty`; `T07-BUILD-002 = BuildInfo.PublicHeaderHasNoBackendDependency`. -- RED: configure the test target with `build_info_test.cpp` registered but before creating `build_info.hpp/.cpp`; the build must fail for the missing header or symbol. -- GREEN: `BuildInfo` CTest passes and GoogleTest revision equals `04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4`. -- Targeted command: - -```powershell -cmake --build .harness/build --config Debug --target fesa_tests -ctest --test-dir .harness/build -C Debug -R BuildInfo --output-on-failure -``` - -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R BuildInfo --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-08: `core-diagnostics` - -**Files:** create `include/fesa/core/source_identity.hpp` (identity/location values), `include/fesa/core/diagnostic.hpp` (diagnostic fields/order declaration), `include/fesa/core/status.hpp` (`Status`, `FailureCategory`, `Result`), `src/fesa/core/diagnostic.cpp` (stable ordering/formatting), `src/fesa/core/status.cpp` (status state); create `tests/unit/core/source_identity_test.cpp`, `diagnostic_test.cpp`, `status_test.cpp`; modify both CMake lists only for these sources/tests. - -- Consumes: `solverVersion()` and C++ standard library only. -- Produces: the core signatures in the ledger; stable sort tuple `(file,line,keyword,entityIdentity,code,discoveryOrder)`; backend-free success/failure transport. -- Tests: `T08-CORE-001 = CoreDiagnostics.SourceIdentityPreservesRawIdentity`; `T08-CORE-002 = CoreDiagnostics.DiagnosticsSortDeterministically`; `T08-CORE-003 = CoreDiagnostics.ResultEnforcesValueErrorExclusivity`. -- RED/GREEN: registered tests fail to compile for missing core headers, then pass value/error, copy/move, failed access, exact fields, category, and ordering cases. -- Targeted command: `cmake --build .harness/build --config Debug --target fesa_tests` then `ctest --test-dir .harness/build -C Debug -R CoreDiagnostics --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R CoreDiagnostics --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-09: `dense-math-adapters` - -**Files:** create `include/fesa/math/vector.hpp` and `matrix.hpp` for owning public types; create `src/fesa/math/vector.cpp` and `matrix.cpp` for MKL CBLAS calls; create `tests/unit/math/vector_test.cpp` and `matrix_test.cpp`; modify both CMake lists only for dense math. - -- Consumes: core exceptions/status conventions and normalized oneMKL target. -- Produces: the exact `Vector`/`Matrix` ledger signatures with deep copy, safe move, checked access, dimension checks, and row-major GEMV/GEMM. -- Tests: `T09-DENSE-001 = DenseMath.VectorOwnsAndChecksContiguousStorage`; `T09-DENSE-002 = DenseMath.RowMajorMatrixMatchesKnownGemvGemm`. -- RED/GREEN: missing headers/symbols produce RED; GREEN covers zero size, copy/move, bounds, mismatch, nonsquare operations, and known BLAS values. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-10: `domain-model` - -**Files:** create `include/fesa/model/model_types.hpp` for semantic records and `include/fesa/model/domain.hpp` for immutable ownership/lookups; create `src/fesa/model/domain.cpp` for construction/finalization; create `tests/unit/model/model_types_test.cpp` and `domain_test.cpp`; modify CMake lists only for the model. - -- Consumes: `SourceEntityId`, `Diagnostic`, `Result`. -- Produces: `EntityIndex`, all model records, `ModelDefinition`, and immutable `Domain`; stable indices follow declaration/instance/entity order; nodes/elements have no equation IDs. -- Tests: `T10-DOM-001 = DomainModel.SourceAndInternalIdentityRemainDistinct`; `T10-DOM-002 = DomainModel.ImmutableOwnershipPreservesStableOrder`; `T10-DOM-003 = DomainModel.MultipleIdentityInstancesDoNotMerge`. -- RED/GREEN: missing model types produce compile RED; GREEN proves raw identity, stable lookup/index, deep ownership, const access, one step storage, and absence of equation state. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-11: `inp-syntax-parser` - -**Files:** create `include/fesa/io/abaqus/input_syntax.hpp` for syntax records, `input_reader.hpp` for the reader boundary, `src/fesa/io/abaqus/input_reader.cpp` for lexical/syntax parsing; create `tests/unit/io/abaqus/input_syntax_test.cpp` and `input_reader_test.cpp`; modify CMake lists only for syntax parsing. - -- Consumes: `SourceLocation`, `Diagnostic`, `Result`. -- Produces: `KeywordParameter`, `DataLine`, `KeywordBlock`, `ParsedInput`, and `AbaqusInputReader::read`; it records normalized source path plus a deterministic `fnv1a64:` prefix followed by exactly 16 lowercase hexadecimal digits computed from the exact input bytes, and makes no B33 or keyword-policy decisions. -- Tests: `T11-SYN-001 = InpSyntax.CanonicalizesKeywordAndParameterNamesOnly`; `T11-SYN-002 = InpSyntax.PreservesDataAndSourceLocations`; `T11-SYN-003 = InpSyntax.RejectsMalformedOrOrphanData`; `T11-SYN-004 = InpSyntax.ReadsLegacyCantileverWithoutMutation`. -- RED/GREEN: registered parser tests fail for missing reader; GREEN covers mixed case, comments, blanks/trailing fields, valueless parameters, unreadable files, malformed syntax, and legacy syntax. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-12: `inp-domain-mapping` - -**Files:** create `include/fesa/io/abaqus/domain_mapper.hpp`, `src/fesa/io/abaqus/domain_mapper.cpp`, and `tests/unit/io/abaqus/domain_mapper_test.cpp`; modify CMake lists only for semantic mapping. - -- Consumes: `ParsedInput`, `ModelDefinition`, and `Domain::create`. -- Produces: `AbaqusDomainMapper::map` returning a complete immutable `Domain` or ordered diagnostics; maps only the approved keyword grammar, exact four-field `*STATIC`, B33, identity instances, exact section/material rules, warning no-ops, and stable expansions. -- Tests: `T12-MAP-001 = InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck`; `T12-MAP-002 = InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically`; `T12-MAP-003 = InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect`; `T12-MAP-004 = InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio`; `T12-MAP-005 = InpDomainMapping.RejectsDloadWithoutDistributedLoadObject`. -- RED/GREEN: positive and table-driven negative tests are registered before the mapper and fail RED; GREEN includes B31, second step, transform, nested assembly, coupled section, invalid geometry/property, duplicate, dangling, nonfinite, malformed arity, NLGEOM, unknown keyword, and `*DLOAD` diagnostics. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-13: `analysis-model` - -**Files:** create `include/fesa/analysis/analysis_model.hpp`, `src/fesa/analysis/analysis_model.cpp`, and `tests/unit/analysis/analysis_model_test.cpp`; modify CMake lists only for the active view. - -- Consumes: immutable `Domain` and its sole `StaticStepDefinition`. -- Produces: `AnalysisModel::create` and the exact active-ID/reference accessors in the ledger; reachable material/section IDs are deduplicated in stable internal-index order. -- Tests: `T13-MODEL-001 = AnalysisModel.ClassifiesActiveEntitiesInStableOrder`; `T13-MODEL-002 = AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain`; `T13-MODEL-003 = AnalysisModel.RejectsMissingOrMultipleStep`. -- RED/GREEN: missing class gives RED; GREEN proves address identity, stable deduplication, immutability, and cardinality diagnostics. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-14: `dof-manager` - -**Files:** create `include/fesa/fem/dof_manager.hpp`, `src/fesa/fem/dof_manager.cpp`, and `tests/unit/fem/dof_manager_test.cpp`; modify CMake lists only for DOF ownership. - -- Consumes: `AnalysisModel`, `Vector`, expanded boundary targets, active element connectivity. -- Produces: exact `DofManager`, `DofComponent`, and `SparsePattern` ledger contracts; `prescribedValues()` is ordered exactly like `constrainedDofs()`. -- Tests: `T14-DOF-001 = DofManager.NumbersSixDofsAndFreeEquationsStably`; `T14-DOF-002 = DofManager.ExpandsAndValidatesPrescribedValues`; `T14-DOF-003 = DofManager.BuildsTwelveDofScatterAndSortedUniquePattern`; `T14-DOF-004 = DofManager.ReconstructsFullReducedRoundTrip`. -- RED/GREEN: numbering/constraint/pattern tests fail before production; GREEN covers zero/nonzero prescriptions, equal overlap, conflicting overlap, element scatter, sorted-unique pattern, and no Node/Element equation ID. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-15: `analysis-state` - -**Files:** create `include/fesa/results/result_records.hpp` for row identities, `include/fesa/analysis/analysis_state.hpp` for state ownership, `src/fesa/analysis/analysis_state.cpp` for allocation/access; create `tests/unit/results/result_records_test.cpp` and `tests/unit/analysis/analysis_state_test.cpp`; modify CMake lists only for result records/state. - -- Consumes: `DofManager`, `Vector`, model identities. -- Produces: `StepFrameIdentity`, endpoint/Gauss/stress records, and exact `AnalysisState` accessors; every full vector is independently owned, full-size, and zero-initialized. -- Tests: `T15-STATE-001 = AnalysisState.AllocatesOnlyV0FullVectors`; `T15-STATE-002 = AnalysisState.PreservesStepFrameAndStableRowOrder`; `T15-STATE-003 = AnalysisState.CopiesOrMovesWithoutAliasing`. -- RED/GREEN: missing records/state produce RED; GREEN proves allocation, ownership, identity/order, reaction full-space semantics, and absence of velocity, acceleration, temperature, and nonlinear state APIs. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-16: `euler-beam-element` - -**Files:** create `include/fesa/elements/euler_beam_3d.hpp` for `ConstantLocalLineLoad`, stress/recovery records, and kernel API; create `src/fesa/elements/euler_beam_3d.cpp` for geometry, Gauss stiffness, transform, load, and recovery; create `tests/unit/elements/euler_beam_3d_test.cpp`; modify CMake lists only for the element. - -- Consumes: `Node`, `GeneralBeamSection`, `LinearElasticMaterial`, `Vector`, `Matrix`, formulation signs and tolerances. -- Produces: exact `EulerBeam3D` ledger contract and `BeamRecovery`; local order is `[u1,v1,w1,rx1,ry1,rz1,u2,v2,w2,rx2,ry2,rz2]`; `dl=T*dg`, `Kg=T^T*Kl*T`. -- Tests: `T16-BEAM-001 = EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns`; `T16-BEAM-002 = EulerBeam3D.TwoPointGaussMatchesClosedStiffness`; `T16-BEAM-003 = EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy`; `T16-BEAM-004 = EulerBeam3D.RotatedTransformPreservesWorkAndEnergy`; `T16-BEAM-005 = EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents`; `T16-BEAM-006 = EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover`; `T16-BEAM-007 = EulerBeam3D.RejectsInvalidGeometryAndProperties`; `T16-BEAM-008 = EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11`; `T16-BEAM-009 = EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches`; `T16-BEAM-010 = EulerBeam3D.OnePointNegativeControlHasRankFour`. -- RED/GREEN: all invariant/analytical tests are written before the kernel; GREEN enforces normalized `1e-12` matrices/transforms/end signs, `1e-10` rigid residual, relative `1e-9` analytical results, the length-scaled `Q^-T*K*Q^-1` six/six singular-value split, exact axial/twist/two-curvature patches, production rank 6, test-only one-point rank 4, two production Gauss points, exact geometry thresholds, and no fallback axis. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-17: `parallel-for-tbb` - -**Files:** create `include/fesa/assembly/parallel_for.hpp` for backend-free interface/serial/TBB classes, `src/fesa/assembly/parallel_for.cpp` for implementations, and `tests/unit/assembly/parallel_for_test.cpp`; modify CMake lists only for the adapter. - -- Consumes: `std::function` and normalized oneTBB target; it does not consume sparse storage. -- Produces: exact `ParallelFor`, `SerialParallelFor`, and `TbbParallelFor` contracts; each index executes exactly once and writes only its caller-owned indexed slot. -- Tests: `T17-PFOR-001 = ParallelFor.ZeroOneManyExecuteExactlyOnce`; `T17-PFOR-002 = ParallelFor.SerialAndTbbProduceStableIndexedOutput`; `T17-PFOR-003 = ParallelFor.PropagatesBodyExceptionByContract`. -- RED/GREEN: missing adapter gives RED; GREEN proves no-op zero count, exact-once semantics, stable output, and exception propagation without process-wide thread changes. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-18: `sparse-assembly` - -**Files:** create `include/fesa/math/sparse_matrix.hpp` and `src/fesa/math/sparse_matrix.cpp` for owning 0-based CSR; create `include/fesa/assembly/sparse_assembler.hpp` and `src/fesa/assembly/sparse_assembler.cpp` for element buffers and deterministic reduction; create `tests/unit/math/sparse_matrix_test.cpp` and `tests/unit/assembly/sparse_assembler_test.cpp`; modify CMake lists only for sparse math/assembly. - -- Consumes: `AnalysisModel`, `DofManager`, `EulerBeam3D`, `ParallelFor`, `SparsePattern`, `Vector`. -- Produces: exact `CooContribution`, `SparseMatrix`, and `SparseAssembler` ledger contracts; expected structural zero slots are retained; `SparseMatrix` is unrelated by inheritance to `Matrix`. -- Tests: `T18-SPARSE-001 = SparseAssembly.ValidatesKnownCsrAndMultiply`; `T18-SPARSE-002 = SparseAssembly.ReducesDuplicatesInFixedTupleOrder`; `T18-SPARSE-003 = SparseAssembly.RejectsInvalidIndexPatternAndShape`; `T18-SPARSE-004 = SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical`; `T18-SPARSE-005 = SparseAssembly.PreservesExpectedStructuralZeros`. -- RED/GREEN: CSR/determinism tests fail before implementation; GREEN produces sorted unique columns, valid offsets, fixed duplicate sums, empty rows when expected, symmetry, and byte-identical arrays across schedulers/runs. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-19: `essential-constraints` - -**Files:** create `include/fesa/constraints/essential_constraints.hpp`, `src/fesa/constraints/essential_constraints.cpp`, and `tests/unit/constraints/essential_constraints_test.cpp`; modify CMake lists only for partition/mapping. - -- Consumes: full `SparseMatrix`, `DofManager` order, full/reduced `Vector` values. -- Produces: `PartitionedStiffness {kff,kfc,kcf,kcc}` and exact `EssentialConstraints` ledger functions without assembling loads or RHS. -- Tests: `T19-CONSTRAINT-001 = EssentialConstraints.ExtractsHandComputedBlocksInStableOrder`; `T19-CONSTRAINT-002 = EssentialConstraints.HandlesNoAllAndMixedConstraints`; `T19-CONSTRAINT-003 = EssentialConstraints.ReconstructsNonzeroPrescribedValues`; `T19-CONSTRAINT-004 = EssentialConstraints.RejectsDimensionOrOrderMismatch`. -- RED/GREEN: block/round-trip tests fail before production; GREEN preserves numeric/order/CSR invariants and never assumes `dc=0`. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R EssentialConstraints --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R EssentialConstraints --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-20: `mkl-pardiso-solver` - -**Files:** create `include/fesa/solvers/linear/linear_solver.hpp` for the backend boundary, `include/fesa/solvers/linear/mkl_pardiso_solver.hpp` for the PImpl class, `src/fesa/solvers/linear/mkl_pardiso_solver.cpp` for all MKL calls/workspace lifetime; create `tests/unit/solvers/linear/linear_solver_test.cpp` and `mkl_pardiso_solver_test.cpp`; modify CMake lists only for the solver. - -- Consumes: validated square `SparseMatrix`, `Vector`, `Status`, `Diagnostic`, official PARDISO contract. -- Produces: exact `LinearSolver` and `MklPardisoSolver` signatures; `factorize()` validates the full public CSR, copies its upper triangle into private MKL CSR with every diagonal slot retained, then runs PARDISO phase `11` and `22` with `mtype=2`, `iparm[34]=1`, and matrix checking enabled; `solve()` runs phase `33`; re-factorization and destruction release with phase `-1` through RAII. -- Tests: `T20-PARDISO-001 = MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual`; `T20-PARDISO-002 = MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs`; `T20-PARDISO-003 = MklPardisoSolver.RefactorizesWithoutLeakingState`; `T20-PARDISO-004 = MklPardisoSolver.RejectsInvalidCsrStateAndDimensions`; `T20-PARDISO-005 = MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures`; `T20-PARDISO-006 = MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly`. -- RED/GREEN: adapter tests fail before implementation; GREEN meets residual `1e-10`, repeated RHS, solve-before-factorize, dimension, invalid CSR, zero/negative pivot, singular, and indefinite diagnostics without regularization. The documented valid-scale sweep requires residual `1e-10` and analytical error `1e-9` for resolved cases and a structured solver failure for numerically unresolved cases; it introduces no new conditioning threshold. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R MklPardisoSolver --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R MklPardisoSolver --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-21: `load-assembly` - -**Files:** create `include/fesa/assembly/load_assembler.hpp`, `src/fesa/assembly/load_assembler.cpp`, and `tests/unit/assembly/load_assembler_test.cpp`; modify CMake lists only for nodal load/RHS assembly. - -- Consumes: `AnalysisModel`, `DofManager`, `SparseMatrix kfc`, and prescribed `dc`. -- Produces: exact `LoadAssembler` ledger functions; multiple loads sum in source order; effective RHS is exactly `Ff-kfc*dc`. -- Tests: `T21-LOAD-001 = LoadAssembly.AssemblesNodeSetAndSixComponentLoads`; `T21-LOAD-002 = LoadAssembly.AccumulatesSignedLoadsInSourceOrder`; `T21-LOAD-003 = LoadAssembly.FormsNonzeroPrescribedEffectiveRhs`; `T21-LOAD-004 = LoadAssembly.RejectsNonfiniteOrDimensionMismatch`; `T21-LOAD-005 = LoadAssembly.ZeroLoadsRemainZero`. -- RED/GREEN: registered load/RHS tests fail before implementation; GREEN handles constrained loads and nonzero `dc` without factorization calls or distributed-load objects. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R LoadAssembly --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R LoadAssembly --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-22: `result-recovery` - -**Files:** create `include/fesa/results/result_recovery.hpp`, `src/fesa/results/result_recovery.cpp`, and `tests/unit/results/result_recovery_test.cpp`; modify CMake lists only for recovery and station normalization. - -- Consumes: `AnalysisModel`, `DofManager`, full `SparseMatrix`, solved `AnalysisState`, and `EulerBeam3D::recover`. -- Produces: exact `ResultRecovery::recover`; `internalForce=K*d`, `residual=internalForce-externalForce`, constrained reaction from residual, stable endpoint/Gauss/stress rows, and test-only reusable node-station projection semantics. -- Tests: `T22-RECOVERY-001 = ResultRecovery.ComputesResidualReactionForNonzeroPrescription`; `T22-RECOVERY-002 = ResultRecovery.EnforcesNormalizedFreeResidual`; `T22-RECOVERY-003 = ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct`; `T22-RECOVERY-004 = ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns`; `T22-RECOVERY-005 = ResultRecovery.OrdersStressPointsAndDefaultCentroid`; `T22-RECOVERY-006 = ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging`. -- RED/GREEN: reaction/sign/station tests fail before implementation; GREEN enforces free residual `1e-10`, nonfinite failure, source/stable order, and smaller-element representative only after endpoint agreement. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R ResultRecovery --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R ResultRecovery --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-23: `hdf5-results-writer` - -**Files:** create `include/fesa/results/results_writer.hpp` for the backend-free interface, `include/fesa/io/hdf5/hdf5_results_writer.hpp` for the concrete class, `src/fesa/io/hdf5/hdf5_results_writer.cpp` for HDF5 RAII/schema/temp-final replacement; create `tests/unit/results/results_writer_test.cpp` and `tests/unit/io/hdf5/hdf5_results_writer_test.cpp`; modify CMake lists only for output. - -- Consumes: immutable `Domain`, solved `AnalysisState`, diagnostics, `solverVersion()`. -- Produces: exact `ResultsWriter`/`Hdf5ResultsWriter` signatures; schema v0 at literal `Step-1/frame 0`, including the required `generalized_resultant` sibling; same-directory temporary write, flush/close/self-check, then a private `.cpp` finalizer that uses `ReplaceFileW` for an existing final and `MoveFileExW(..., MOVEFILE_WRITE_THROUGH)` for a new final, preserving the previous final and removing the temporary file when replacement fails. Win32 types never enter either public header. -- Tests: `T23-HDF5-001 = Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity`; `T23-HDF5-002 = Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests`; `T23-HDF5-003 = Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid`; `T23-HDF5-004 = Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal`; `T23-HDF5-005 = Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal`. -- RED/GREEN: schema/atomicity tests fail before the writer; GREEN verifies every exact path/component/location, UTF-8 identity, unit label, finite values, RAII closure, temporary cleanup, and replacement behavior. -- Targeted command: build `fesa_tests`, then `ctest --test-dir .harness/build -C Debug -R Hdf5ResultsWriter --output-on-failure`. -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R Hdf5ResultsWriter --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### TASK-24: `linear-static-cli` - -**Files and single responsibilities** - -| action | file | responsibility | -| --- | --- | --- | -| create | `include/fesa/analysis/linear_static_analysis.hpp` | Template Method and injected linear-static API | -| create | `src/fesa/analysis/linear_static_analysis.cpp` | exact stage order and state handoff | -| create | `include/fesa/app/fesa_application.hpp` | argument/exit-code application boundary | -| create | `src/fesa/app/fesa_application.cpp` | CLI parsing, default adapters, diagnostic output | -| create | `src/fesa/app/main.cpp` | minimal process entry point only | -| create | `tests/integration/analysis/linear_static_analysis_test.cpp` | spy/fake lifecycle and real analytical integration | -| create | `tests/integration/app/fesa_application_test.cpp` | CLI paths, exit codes, output-request no-op | -| create | `tests/reference/reference_comparison.hpp` | test-only row/metric contract without HDF5 types | -| create | `tests/reference/reference_comparison.cpp` | read-only CSV/HDF5 projection, precheck, compare, deterministic JSON | -| create | `tests/reference/reference_comparison_test.cpp` | comparison-policy positive/negative tests | -| create | `tests/reference/b33_reference_comparison_test.cpp` | approved B33 end-to-end run and artifact generation | -| modify | `src/fesa/CMakeLists.txt` | add `fesa` executable with `OUTPUT_NAME fesa` | -| modify | `tests/CMakeLists.txt` | add integration/reference executables, labels, and `fesa_tests` dependencies | - -- Consumes: every ledger interface from Tasks 08-23 and the exact four read-only files under `reference/cantilever beam/`. -- Produces: exact `Analysis`, `LinearStaticAnalysis`, `AnalysisRequest`, and `FesaApplication` ledger contracts; production defaults are `TbbParallelFor`, `MklPardisoSolver`, and `Hdf5ResultsWriter`; generated evidence is `.harness/build/reference/cantilever-beam-b33/results.h5` plus `comparison.json`. - -The test-only `reference_comparison.hpp` contract is: - -```cpp -namespace fesa::test { -enum class ComparisonQuantity { displacement, reaction, sectionResultant }; -struct CanonicalComparisonRow { - std::string modelId; - std::string stepName; - std::size_t frameIndex; - std::string instanceName; - std::int64_t sourceNodeLabel; - ComparisonQuantity quantity; - std::string component; - double value; - std::string unitDimension; - std::string coordinateSystem; - std::string hdf5DatasetPath; -}; -struct RowDecision { - CanonicalComparisonRow fesa; - CanonicalComparisonRow reference; - double absoluteError; - double tolerance; - bool passed; -}; -struct ComponentMetrics { - ComparisonQuantity quantity; - std::string component; - double referenceScale; - double maximumAbsoluteError; - double maximumNormalizedError; - double rmsError; - double normError; - std::size_t worstRow; -}; -struct PhysicsEvidence { - double freeResidualNorm; - std::array appliedForce; - std::array reactionForce; - std::array appliedMomentAboutOrigin; - std::array reactionMomentAboutOrigin; - bool endpointConsistencyPassed; -}; -struct ComparisonReport { - std::vector rows; - std::vector metrics; - PhysicsEvidence physicsEvidence; - bool stressComparisonApplicable; - std::string stressComparisonReason; - bool passed; -}; -class ReferenceComparison { -public: - static Result compare( - const std::filesystem::path& resultsHdf5, - const std::filesystem::path& legacyReferenceDirectory); - static Status writeDeterministicJson( - const ComparisonReport& report, - const std::filesystem::path& outputJson); -}; -} // namespace fesa::test -``` - -`stressComparisonApplicable` is always `false` for this approved bundle and is serialized with the reason that analytical/unit and HDF5 schema tests provide stress evidence. The comparator accepts only the literal legacy directory and exact filenames; it has no write operation for that directory. - -All malformed-reference negative cases operate on copies created under `.harness/build/reference/contract-fixtures/`; no test opens a legacy reference path for writing. - -- Tests: `T24-ORCH-001 = LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization`; `T24-ORCH-002 = LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription`; `T24-CLI-001 = LinearStaticCli.DefaultAndExplicitOutputProduceFesaHdf5`; `T24-CLI-002 = LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic`; `T24-CLI-003 = LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults`; `T24-REF-001 = ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows`; `T24-REF-002 = ReferenceComparisonContract.AppliesAbaqusOnlyComponentScaleWithoutClampOrDrop`; `T24-REF-003 = ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically`; `T24-REF-004 = ReferenceComparisonContract.NormalizesEligibleStationsWithoutAveraging`; `T24-B33-001 = B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence`. -- RED/GREEN: orchestration/CLI/reference tests are registered first and fail for missing APIs; GREEN fixes the exact event trace, all CLI forms/codes, artifact precheck, exact row sets, header/component/frame/station normalization, zero/near-zero/failure tolerance cases, and deterministic metrics/physics evidence. -- Step 26 handoff: `B33ReferenceComparison` is a completed test-only executable/test at the end of this task. Step 26 runs it and reads `comparison.json` without modifying source, tests, CMake, tolerances, or reference artifacts. Stress is recorded as N/A for Abaqus comparison while HDF5 `stress_s11` remains required. -- Targeted command: - -```powershell -cmake --build .harness/build --config Debug --target fesa_tests -ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure -``` - -- Full VERIFY: - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -git diff --exit-code -- reference/ -``` - -## TDD Test Plan - -| test group | test type | required RED condition | required GREEN condition | task | targeted regex | -| --- | --- | --- | --- | --- | --- | -| `T07-BUILD-*` | foundation | test target sees missing build-info API | version API, discovery, warning isolation pass | TASK-07 | `BuildInfo` | -| `T08-CORE-*` | unit | core type/header or behavior absent | identity, status/result, fields/order pass | TASK-08 | `CoreDiagnostics` | -| `T09-DENSE-*` | unit/backend | dense types absent | storage, checking, BLAS values pass | TASK-09 | `DenseMath` | -| `T10-DOM-*` | unit/model | semantic ownership types absent | immutable stable Domain passes | TASK-10 | `DomainModel` | -| `T11-SYN-*` | parser syntax | reader absent | lexical/syntax/source-location cases pass | TASK-11 | `InpSyntax` | -| `T12-MAP-*` | parser semantic | mapper absent | complete positive/negative inventory passes | TASK-12 | `InpDomainMapping` | -| `T13-MODEL-*` | unit/analysis | active view absent | stable non-copy view passes | TASK-13 | `AnalysisModel` | -| `T14-DOF-*` | unit/FEM | numbering/maps absent | DOF, constraint, scatter, pattern pass | TASK-14 | `DofManager` | -| `T15-STATE-*` | unit/state | records/state absent | exact V0 ownership/allocation passes | TASK-15 | `AnalysisState` | -| `T16-BEAM-*` | formulation/analytical | kernel absent or reviewed invariant fails | all NR-T01 through NR-T08 element criteria pass | TASK-16 | `EulerBeam3D` | -| `T17-PFOR-*` | adapter | parallel boundary absent | serial/TBB semantic equivalence passes | TASK-17 | `ParallelFor` | -| `T18-SPARSE-*` | unit/assembly | CSR/reducer absent | canonical byte-identical CSR passes | TASK-18 | `SparseAssembly` | -| `T19-CONSTRAINT-*` | unit/constraints | partition absent | exact blocks and nonzero reconstruction pass | TASK-19 | `EssentialConstraints` | -| `T20-PARDISO-*` | backend/solver | solver absent | SPD, repeated RHS, failure diagnostics pass | TASK-20 | `MklPardisoSolver` | -| `T21-LOAD-*` | unit/assembly | load/RHS assembler absent | nodal load and `Ff-Kfc*dc` pass | TASK-21 | `LoadAssembly` | -| `T22-RECOVERY-*` | unit/results | recovery absent | residual/end/Gauss/stress/station rules pass | TASK-22 | `ResultRecovery` | -| `T23-HDF5-*` | I/O | writer/schema absent | exact schema and atomicity pass | TASK-23 | `Hdf5ResultsWriter` | -| `T24-ORCH-*`, `T24-CLI-*` | integration | lifecycle/app absent | exact stage/CLI/HDF5 path passes | TASK-24 | `LinearStaticCli` | -| `T24-REF-*` | reference-contract | comparator absent | fail-fast row policy/tolerance/report pass | TASK-24 | `ReferenceComparisonContract` | -| `T24-B33-*` | end-to-end reference | approved run/comparison absent | HDF5 and deterministic JSON are generated, all rows pass | TASK-24 | `B33ReferenceComparison` | - -Every implementation report RED entry must show a nonzero exit and the expected missing API or failed behavior. A configure/environment failure is not acceptable RED evidence. Every GREEN entry must show the same targeted regex at exit 0 after the minimum implementation. - -## CMake and CTest Plan - -- Root project: C++17 required, extensions off, `enable_testing()`, dependencies loaded from `cmake/FesaDependencies.cmake`. -- Production library: `fesa_solver` static library. Apply `/W4 /WX` only when `MSVC`; never propagate it to GoogleTest, oneMKL, oneTBB, or HDF5 targets. -- Application: target may be internally named `fesa_app`, but `OUTPUT_NAME fesa` is mandatory so Debug emits `fesa.exe`. -- Tests: `fesa_unit_tests`, `fesa_integration_tests`, and `fesa_reference_tests` are GoogleTest executables. Custom target `fesa_tests` depends on all currently defined test executables so every Step's prescribed build command remains stable. -- Discovery: use `gtest_discover_tests`; every discovered test carries `linear-static-3d-euler-beam` plus one of `unit`, `parser`, `io`, `integration`, or `reference` as appropriate. The exact suite names in the TDD plan preserve targeted CTest regexes. -- Reference working directory: repository root so legacy relative paths remain exact; generated files go only under `.harness/build/reference/cantilever-beam-b33/`. -- Dependency configuration is explicit and local; do not fetch or vendor dependencies and do not hardcode `C:/git/googletest` as a CMake default. -- Harness auto-detection is used because `.harness/config.json` is absent. - -Baseline commands required by the project contract are: - -```powershell -cmake -S . -B .harness/build -A x64 -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -The executable phase commands add the approved local dependency cache variables exactly as shown in each task. At least one test must be present in CTest JSON at every completed implementation Step. - -Public dependency scans are additional Step evidence: - -```powershell -$denseLeaks = rg -n "mkl\.h|MKL_INT|CBLAS_" include/fesa -if ($LASTEXITCODE -eq 0) { throw "MKL API leaked into public headers:`n$denseLeaks" } -$pardisoLeaks = rg -n "mkl\.h|MKL_INT|pardiso" include/fesa -if ($LASTEXITCODE -eq 0) { throw "PARDISO API leaked into public headers:`n$pardisoLeaks" } -$tbbLeaks = rg -n "oneapi/tbb|tbb/" include/fesa -if ($LASTEXITCODE -eq 0) { throw "oneTBB API leaked into public headers:`n$tbbLeaks" } -$hdf5Leaks = rg -n "H5[A-Z_a-z0-9]*|hid_t" include/fesa -if ($LASTEXITCODE -eq 0) { throw "HDF5 API leaked into public headers:`n$hdf5Leaks" } -``` - -## Acceptance Traceability Matrix - -| requirement | implementation task | GoogleTest evidence | reference/acceptance evidence | -| --- | --- | --- | --- | -| `FESA-REQ-LS3DEB-001` | TASK-12, TASK-13, TASK-24 | `T12-MAP-004`, `T13-MODEL-003`, `T24-CLI-002` | single step runs; second step structured failure | -| `FESA-REQ-LS3DEB-002` | TASK-12, TASK-16, TASK-24 | `T12-MAP-004`, `T16-BEAM-006`, `T24-ORCH-002` | only straight prismatic small-linear B33 reaches solve | -| `FESA-REQ-LS3DEB-003` | TASK-14, TASK-15, TASK-23 | `T14-DOF-001`, `T15-STATE-001`, `T23-HDF5-001` | exact six-component nodal order | -| `FESA-REQ-LS3DEB-004` | TASK-16, TASK-22 | `T16-BEAM-006`, `T22-RECOVERY-004` | four analytical modes at relative `1e-9` | -| `FESA-REQ-LS3DEB-005` | TASK-12, TASK-24 | `T12-MAP-001`, `T24-B33-001` | B33 semantic object and artifact input precheck | -| `FESA-REQ-LS3DEB-006` | TASK-12 | `T12-MAP-004` | exact `unsupported-element-formulation` | -| `FESA-REQ-LS3DEB-007` | TASK-12, TASK-14, TASK-19, TASK-21 | `T12-MAP-001`, `T14-DOF-002`, `T19-CONSTRAINT-003`, `T21-LOAD-003` | DOF 1..6 and nonzero `dc` residual `1e-10` | -| `FESA-REQ-LS3DEB-008` | TASK-12, TASK-16 | `T12-MAP-005`, `T16-BEAM-005` | normalized `1e-12` kernel; `*DLOAD` rejected | -| `FESA-REQ-LS3DEB-009` | TASK-12 | `T12-MAP-001` | positive coverage for exact keyword inventory | -| `FESA-REQ-LS3DEB-010` | TASK-11, TASK-12 | `T11-SYN-001`, `T11-SYN-002`, `T12-MAP-001` | case-insensitive names/comments and raw identity | -| `FESA-REQ-LS3DEB-011` | TASK-12, TASK-14, TASK-21 | `T12-MAP-001`, `T12-MAP-004`, `T14-DOF-002`, `T21-LOAD-001` | exact row grammar and deterministic target expansion | -| `FESA-REQ-LS3DEB-012` | TASK-12, TASK-16 | `T12-MAP-001`, `T16-BEAM-004`, `T16-BEAM-007` | exact section/axis map, transform `1e-12` | -| `FESA-REQ-LS3DEB-013` | TASK-12, TASK-16 | `T12-MAP-004`, `T16-BEAM-007` | exact `E,nu`, derived positive `G`, positive properties | -| `FESA-REQ-LS3DEB-014` | TASK-12, TASK-16 | `T12-MAP-004`, `T16-BEAM-007` | both exact scale-aware thresholds | -| `FESA-REQ-LS3DEB-015` | TASK-10, TASK-12, TASK-23 | `T10-DOM-001`, `T12-MAP-002`, `T23-HDF5-001` | source/internal identity round-trip | -| `FESA-REQ-LS3DEB-016` | TASK-10, TASK-12 | `T10-DOM-003`, `T12-MAP-002` | same-part instances remain distinct | -| `FESA-REQ-LS3DEB-017` | TASK-12 | `T12-MAP-004` | exact `unsupported-instance-transform` | -| `FESA-REQ-LS3DEB-018` | TASK-12 | `T12-MAP-004` | nested/dependent semantics rejected | -| `FESA-REQ-LS3DEB-019` | TASK-12, TASK-23 | `T12-MAP-003`, `T23-HDF5-003` | exact warning no-op allowlist retained in diagnostics | -| `FESA-REQ-LS3DEB-020` | TASK-12, TASK-23, TASK-24 | `T12-MAP-004`, `T23-HDF5-002`, `T24-CLI-003` | unknown model keyword fails; mandatory output unchanged | -| `FESA-REQ-LS3DEB-021` | TASK-10, TASK-13 | `T10-DOM-002`, `T13-MODEL-002` | immutable Domain, non-copy active view | -| `FESA-REQ-LS3DEB-022` | TASK-14 | `T14-DOF-001`, `T14-DOF-003`, `T14-DOF-004` | sole equation/scatter/pattern ownership | -| `FESA-REQ-LS3DEB-023` | TASK-15, TASK-23 | `T15-STATE-001`, `T15-STATE-002`, `T23-HDF5-001` | exact required state connected to output; excluded state absent | -| `FESA-REQ-LS3DEB-024` | TASK-17, TASK-18 | `T17-PFOR-002`, `T18-SPARSE-004` | stable element-local work and deterministic CSR `1e-12` | -| `FESA-REQ-LS3DEB-025` | TASK-09, TASK-17, TASK-18, TASK-20, TASK-23 | `T09-DENSE-001`, `T09-DENSE-002`, `T17-PFOR-002`, `T18-SPARSE-001`, `T20-PARDISO-001`, `T23-HDF5-001` | storage contracts plus no-leak scans | -| `FESA-REQ-LS3DEB-026` | TASK-20, TASK-24 | `T20-PARDISO-002`, `T24-ORCH-001` | exact factorize-before-load event trace | -| `FESA-REQ-LS3DEB-027` | TASK-19, TASK-21, TASK-22 | `T19-CONSTRAINT-003`, `T21-LOAD-003`, `T22-RECOVERY-001` | exact RHS, full reconstruction, residual reaction | -| `FESA-REQ-LS3DEB-028` | TASK-23, TASK-24 | `T23-HDF5-004`, `T23-HDF5-005`, `T24-CLI-001` | authoritative HDF5 and atomic failure/success | -| `FESA-REQ-LS3DEB-029` | TASK-23 | `T23-HDF5-001` | every exact schema-v0 path; generalized-resultant sibling included | -| `FESA-REQ-LS3DEB-030` | TASK-07, TASK-10, TASK-23, TASK-24 | `T07-BUILD-001`, `T10-DOM-001`, `T23-HDF5-001`, `T24-B33-001` | metadata, stable identity, ordinary label, external SI provenance | -| `FESA-REQ-LS3DEB-031` | TASK-15, TASK-16, TASK-22, TASK-23 | `T15-STATE-002`, `T16-BEAM-006`, `T22-RECOVERY-003`, `T23-HDF5-001` | exact components/locations independent of requests | -| `FESA-REQ-LS3DEB-032` | TASK-16, TASK-22, TASK-23, TASK-24 | `T16-BEAM-008`, `T22-RECOVERY-005`, `T23-HDF5-003`, `T24-B33-001` | axial `S11`; no shear; reference stress explicit N/A | -| `FESA-REQ-LS3DEB-033` | TASK-08, TASK-24 | `T08-CORE-002`, `T24-CLI-001`, `T24-CLI-002` | exact CLI forms/codes/ordered diagnostic fields | -| `FESA-REQ-LS3DEB-034` | TASK-07 through TASK-24 | every `T07-*` through `T24-*` group | per-Step report RED/GREEN/VERIFY; discovery nonzero; `/W4 /WX` | -| `FESA-REQ-LS3DEB-035` | TASK-16, TASK-18, TASK-19, TASK-20, TASK-22 | `T16-BEAM-001` through `010`, `T18-SPARSE-004`, `T19-CONSTRAINT-003`, `T20-PARDISO-001`, `T20-PARDISO-006`, `T22-RECOVERY-002` | exact `1e-12`, `1e-10`, `1e-9` criteria and NR-T01..T11 coverage | -| `FESA-REQ-LS3DEB-036` | TASK-24 | `T24-REF-002`, `T24-B33-001` | Abaqus-only component scale and exact mixed formula | -| `FESA-REQ-LS3DEB-037` | TASK-24 | `T24-REF-002`, `T24-B33-001` | exact SI floors and zero-scale case | -| `FESA-REQ-LS3DEB-038` | TASK-24 | `T24-REF-001`, `T24-REF-002` | missing/extra/duplicate/nonfinite/schema/identity fail first; no clamp/drop | -| `FESA-REQ-LS3DEB-039` | TASK-24 | `T24-REF-003`, `T24-B33-001` | every row plus max absolute/normalized/RMS/norm/worst metrics | -| `FESA-REQ-LS3DEB-040` | TASK-11, TASK-24 | `T11-SYN-004`, `T24-REF-001`, `T24-B33-001` | exact four paths and `git diff --exit-code -- reference/` | -| `FESA-REQ-LS3DEB-041` | TASK-24 | `T24-REF-001`, `T24-B33-001` | four files, B33, exact headers, unique finite rows before compare | -| `FESA-REQ-LS3DEB-042` | TASK-22, TASK-24 | `T22-RECOVERY-006`, `T24-REF-004`, `T24-B33-001` | exact component mapping/station eligibility/no-average | -| `FESA-REQ-LS3DEB-043` | TASK-24 and Steps 25-28 gates | `T24-ORCH-001`, `T24-REF-003`, `T24-B33-001` | Step 25 build pass precedes Step 26 rerun; JSON carries Step 27 physics evidence | -| `FESA-REQ-LS3DEB-044` | TASK-12, TASK-16, TASK-24 | `T12-MAP-005`, `T16-BEAM-005`, `T24-REF-001` | no reference solver/artifact mutation and no out-of-scope support claim | - -## Implementation Report Evidence Contract - -`docs/linear-static-3d-euler-beam/implementation-report.md` is created in TASK-07 and appended in TASK-08 through TASK-24. It must use this fixed structure for every Step: - -```markdown -## Step 16 — euler-beam-element -- task_id: TASK-16 -- status: completed -- changed_files: exact repository-relative list -- requirement_ids: exact linked requirement IDs -- test_ids: exact linked test IDs - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | targeted build/test command | nonzero | missing API or named behavior failure | concise compiler/test tail | -| GREEN | targeted build/test command | 0 | named regex passes | passed test/count tail | -| VERIFY-configure | exact CMake configure | 0 | MSVC x64 Debug generated | generator/compiler tail | -| VERIFY-build | exact build command | 0 | no warning under FESA `/W4 /WX` | build tail | -| VERIFY-discovery | CTest JSON discovery | 0 | discovered count at least one | count/regex tail | -| VERIFY-full | full CTest command | 0 | zero failed tests | summary tail | - -- contract_checks: public dependency scan, numerical tolerance, ordering, or artifact check used by this Step -- generated_evidence: exact build-relative artifact paths or N/A -- reference_diff: unchanged or N/A; TASK-24 records `git diff --exit-code -- reference/` exit 0 -- handoff: exact types/files/tests available to the next Step -``` - -The actual report repeats this section with each real Step number/name; it must not copy the example values when they do not apply. RED is invalid if failure is caused by a missing dependency, bad generator, stale build cache, or unrelated regression. TASK-24 additionally records `results.h5`, `comparison.json`, matched-row counts, physics-evidence keys, and the unchanged reference diff. Build/Test Executor Step 25 independently records command, exit code, duration, output tail, and failure classification in its own report. - -## Correction and Failure Boundaries - -- Classify failures as `configure | compile | link | test | reference-comparison | harness | environment | upstream-contract` before editing. -- Correction may change only the source/header/test/CMake files owned by the failing task and must rerun that task's targeted command before full VERIFY. -- Do not correct a failure by changing a requirement, formula/sign, I/O grammar/schema, reference artifact, row identity, component mapping, tolerance coefficient/floor, or gate order. -- Do not regularize a singular PARDISO system, reinterpret B31, ignore transforms, add a fallback beam axis, clamp reference values, drop rows, average endpoint mismatch, or synthesize absent stress/`SF2`/`SF3` reference rows. -- Repeated environment failure is handed to the user; repeated implementation-owned failure is handed to the Correction Agent; any upstream contradiction is handed through the Coordinator Agent without contract edits. - -## Downstream Handoff - -### Implementation Agent - -- Execute TASK-07 through TASK-24 in order; do not pre-create later modules. -- Read this plan and the task's Step file completely, but use approved upstream contract precedence recorded in Readiness resolutions. -- End every Step green with implementation-report evidence and its exact phase-index summary. - -### Build/Test Executor Agent - -- Re-run the explicit dependency configure, Debug build, feature-label/regex tests, JSON discovery, and full CTest without source changes. -- Confirm MSVC, x64, Debug, nonzero tests, no warnings, and `reference/` unchanged. - -### Correction Agent - -- Use the failure classification and the task/test trace in the implementation report. -- Apply only a minimal implementation-owned repair; upstream contracts, reference artifacts, and tolerances are immutable. - -### Reference Verification Agent - -- After Step 25 passes, run the already-built `B33ReferenceComparison` CTest and inspect its existing deterministic `comparison.json`. -- Write the Step 26 report without modifying source, tests, CMake, reference files, matching rules, or tolerances. - -### Physics Evaluation Agent - -- Consume `comparison.json.physics_evidence` only after Step 26 passes; independently review force/moment equilibrium, reaction sign, displacement direction, symmetry, endpoint consistency, and residual. - -## Open Issues - -- No issue blocks implementation. The only permitted later escalation is a newly observed environment failure or an actual contradiction between implemented behavior and an approved upstream contract. diff --git a/docs/linear-static-3d-euler-beam/implementation-report.md b/docs/linear-static-3d-euler-beam/implementation-report.md deleted file mode 100644 index 4e300c1..0000000 --- a/docs/linear-static-3d-euler-beam/implementation-report.md +++ /dev/null @@ -1,1330 +0,0 @@ -# Linear Static 3D Euler Beam Implementation Report - -## Metadata - -- feature_id: `linear-static-3d-euler-beam` -- source_plan: `docs/linear-static-3d-euler-beam/implementation-plan.md` -- source_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` -- status: `in-progress` -- owner_agent: `implementation-agent` -- validation_environment: `Windows, MSVC 19.51.36252, Visual Studio 18 2026, x64 Debug` -- report_started: `2026-08-09` - -## Step 7 — cmake-test-foundation - -- task_id: `TASK-07` -- status: `completed` -- changed_files: `CMakeLists.txt`, `cmake/FesaDependencies.cmake`, - `include/fesa/build_info.hpp`, `src/fesa/build_info.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `tests/unit/build_info_test.cpp`, - `docs/linear-static-3d-euler-beam/implementation-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-030`, `FESA-REQ-LS3DEB-034` -- test_ids: `T07-BUILD-001`, `T07-BUILD-002` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | Temporarily move `include/fesa/build_info.hpp` to `.harness/build_info.hpp.red-backup`; run `cmake --build .harness/build --config Debug --target fesa_unit_tests`; restore the header in `finally` | 1 | Build fails because the public API is unavailable | `build_info.cpp(1,10): error C1083: 'fesa/build_info.hpp': No such file or directory` | -| GREEN | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R BuildInfo --output-on-failure` | 0 | Foundation target builds and both named BuildInfo tests pass | `BuildInfo.VersionIsStableAndNonEmpty` and `BuildInfo.PublicHeaderHasNoBackendDependency`: 2/2 passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | MSVC x64 Debug build tree generated and dependencies resolved | Visual Studio 18 2026; MSVC 19.51.36252; MKL 2026.1; TBB and HDF5 CONFIG packages resolved | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | FESA and GoogleTest targets build without FESA warnings | `fesa_solver.lib` and `fesa_unit_tests.exe` built; no warning emitted under FESA `/W4 /WX` | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers at least one test | 2 tests discovered, both carrying `linear-static-3d-euler-beam` and `unit` labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full suite has zero failures | 2/2 tests passed | - -- contract_checks: GoogleTest revision - `04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4`; no default - `C:/git/googletest` path in production CMake; `/W4 /WX` is private to - `fesa_solver`; public BuildInfo header exposes only `std::string_view`. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- environment_note: Native Codex Windows workspace sandboxes stalled in the - CMake compiler-id `cl.exe` child process. The identical approved configure, - build, and CTest commands were therefore executed by the root session's - authorized unrestricted shell; the same configure completed in 7.9 seconds. -- reference_diff: unchanged -- handoff: `fesa_solver`, `fesa_unit_tests`, `fesa_tests`, normalized - `Fesa::MKL`, `Fesa::TBB`, `Fesa::HDF5`, and `solverVersion()` are available - to Step 8. - -## Step 8 — core-diagnostics - -- task_id: `TASK-08` -- status: `completed` -- changed_files: `include/fesa/core/source_identity.hpp`, - `include/fesa/core/diagnostic.hpp`, `include/fesa/core/status.hpp`, - `src/fesa/core/diagnostic.cpp`, `src/fesa/core/status.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `tests/unit/core/source_identity_test.cpp`, - `tests/unit/core/diagnostic_test.cpp`, `tests/unit/core/status_test.cpp`, - `docs/linear-static-3d-euler-beam/implementation-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-033`, `FESA-REQ-LS3DEB-034` -- test_ids: `T08-CORE-001`, `T08-CORE-002`, `T08-CORE-003` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Tests are registered before production and fail for the three missing core headers | MSVC C1083 for `fesa/core/diagnostic.hpp`, `fesa/core/source_identity.hpp`, and `fesa/core/status.hpp` | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal core implementation and all test translation units build | `diagnostic.cpp`, `status.cpp`, and three core tests compile; `fesa_unit_tests.exe` links | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R CoreDiagnostics --output-on-failure` | 0 | Identity, deterministic ordering, and Result exclusivity pass | 3/3 `CoreDiagnostics` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved MSVC x64 build tree regenerates with normalized dependencies | Configure and generate completed; MKL 2026.1 resolved | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R CoreDiagnostics --output-on-failure` | 0 | Focused Step 8 suite remains green | 3/3 tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the existing and new named tests | 5 tests discovered with feature and unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 5/5 tests passed | -| VERIFY-harness | `uv run --with pytest python -m pytest -v -rs` | 0 | Harness regression suite remains green | 4/4 tests passed | - -- contract_checks: `SourceEntityId` preserves numeric and raw label forms; - `sortDiagnostics()` applies the fixed file/line/keyword/entity/code tuple with - stable discovery-order ties; `Status` owns sorted diagnostics and optional - failure category; `Result` owns either a value or failed status and rejects - both failed value access and construction from an OK status. Core public - headers include only FESA core or C++ standard-library headers; no - MKL/TBB/HDF5 names are present. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged -- handoff: `SourceLocation`, `SourceEntityId`, `Diagnostic`, deterministic - diagnostic sorting, `FailureCategory`, `Status`, and `Result` are available - to Step 9 and later parser/model/solver tasks. - -## Step 9 — dense-math-adapters - -- task_id: `TASK-09` -- status: `completed` -- changed_files: `include/fesa/math/vector.hpp`, - `include/fesa/math/matrix.hpp`, `src/fesa/math/vector.cpp`, - `src/fesa/math/matrix.cpp`, `tests/unit/math/vector_test.cpp`, - `tests/unit/math/matrix_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-025`, `FESA-REQ-LS3DEB-034` -- test_ids: `T09-DENSE-001`, `T09-DENSE-002` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` | 1 | Both planned tests are registered before production and the build fails for the missing dense-math API | MSVC C1083 for `fesa/math/matrix.hpp` and `fesa/math/vector.hpp`; DenseMath discovery is unavailable until the test executable builds | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal dense adapters, tests, and runtime staging compile, link, and complete GoogleTest discovery | `matrix.cpp`, `vector.cpp`, both math tests, `fesa_solver.lib`, and `fesa_unit_tests.exe` built; no FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` | 0 | Storage/ownership/checking and row-major BLAS contracts pass | 2/2 DenseMath tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved MSVC x64 build tree regenerates with explicit dependencies | Configure/generate completed; oneMKL 2026.1 dynamic ILP64 backend resolved | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` | 0 | Focused dense-math suite remains green | 2/2 tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated tests and both exact DenseMath names | 7 tests discovered with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 7/7 tests passed | -| VERIFY-public-header | `$leaks = rg -n "mkl\.h\|MKL_INT\|CBLAS_" include/fesa; if ($LASTEXITCODE -eq 0) { throw "MKL API leaked into public headers:`n$leaks" }; if ($LASTEXITCODE -ne 1) { throw 'Public-header dependency scan failed' }` | 0 | Public headers remain independent of oneMKL API and types | `rg` returned the required no-match exit 1; wrapper scan completed with zero leaks | - -- contract_checks: `Vector` accepts zero size, owns contiguous doubles, deep-copies, - leaves moved-from objects empty and usable, checks every index, and rejects dot/axpy - mismatches; `Matrix` accepts zero dimensions, owns row-major contiguous doubles, - deep-copies, leaves moved-from objects empty and usable, checks every index, and - rejects GEMV/GEMM mismatches. Hand-derived nonsquare GEMV `[50,122]` and GEMM - `[[58,64],[139,154]]` pass. All copy, dot, norm, scale, axpy, GEMV, and GEMM calls - cross CBLAS only inside `.cpp` files. Windows tests stage the package-resolved - oneMKL/OpenMP runtime before post-build discovery because the exact shell does not - assume oneAPI in `PATH`. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: backend-free `fesa::Vector` and `fesa::Matrix` public APIs, with owning - dense storage and checked BLAS operations, are available to Step 10 and later - DOF/element/assembly tasks. - -### Review Fix Round 1 — matrix-storage-size-overflow - -- regression_test: `tests/unit/math/matrix_test.cpp` now constructs - `Matrix{SIZE_MAX / 2 + 1, 2}` and requires `std::length_error`. -- RED: `cmake --build .harness/build --config Debug --target fesa_tests` exited 0; - `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` - exited 8 with 1/2 failures because the wraparound constructor threw nothing. -- fix: `Matrix` computes its storage size through a checked helper before vector - construction and rejects exactly `columns != 0 && rows > SIZE_MAX / columns`. -- GREEN: the same targeted build and DenseMath CTest commands exited 0; 2/2 passed. -- VERIFY: approved MSVC x64 configure and full Debug build exited 0; targeted - DenseMath passed 2/2, discovery found 7 tests, and the full suite passed 7/7. - The public-header MKL scan had zero matches, `git diff --check` exited 0, and - `git diff --exit-code -- reference/` exited 0. -- scope: the deferred empty-dot review minor was not changed, reference artifacts - remain untouched, and phase Step 9 status/timestamps were not modified. - -## Step 10 — domain-model - -- task_id: `TASK-10` -- status: `completed` -- changed_files: `include/fesa/model/model_types.hpp`, - `include/fesa/model/domain.hpp`, `src/fesa/model/domain.cpp`, - `tests/unit/model/model_types_test.cpp`, `tests/unit/model/domain_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-10-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-015`, `FESA-REQ-LS3DEB-016`, - `FESA-REQ-LS3DEB-021`, `FESA-REQ-LS3DEB-030`, - `FESA-REQ-LS3DEB-034` -- test_ids: `T10-DOM-001`, `T10-DOM-002`, `T10-DOM-003` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Both planned test translation units are registered before production and fail for the missing model API | MSVC C1083 for `fesa/model/domain.hpp` and `fesa/model/model_types.hpp`; the subsequent `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure` exited 0 with `No tests were found` because the new test executable could not build | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal model records, immutable Domain ownership, and both tests compile and link | `domain.cpp`, `domain_test.cpp`, and `model_types_test.cpp` built; `fesa_solver.lib` and `fesa_unit_tests.exe` linked without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure` | 0 | Source/internal identity, stable immutable ownership, and multiple-instance distinction pass | 3/3 exact `DomainModel` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved MSVC x64 build tree regenerates with explicit dependencies | Configure and generate completed; oneMKL 2026.1 and the existing dependency targets resolved | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R DomainModel --output-on-failure` | 0 | Focused Step 10 suite remains green | 3/3 `DomainModel` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all exact DomainModel names | 10 tests discovered with `linear-static-3d-euler-beam` and `unit` labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 10/10 tests passed | -| VERIFY-dependency-direction | Backend scan over `include/fesa`; upward-include scan from `include/fesa/model`; core-to-model include scan from `include/fesa/core` using `rg -n` and fail-on-match wrappers | 0 | Public headers expose no MKL/PARDISO/TBB/HDF5 API and preserve `core -> model` dependency direction | backend leaks 0; model upward dependencies 0; core-to-model dependencies 0 | -| VERIFY-diff | `git diff --check` | 0 | Patch has no whitespace errors | Exit 0; only Git LF-to-CRLF working-copy notices were emitted | -| VERIFY-reference | `git diff --exit-code -- reference/` | 0 | Approved reference artifacts remain unchanged | Exit 0 and `git status --short -- reference/` produced no entries | - -- contract_checks: every ledger record preserves `SourceLocation`; the static - step retains all four timing values; `PartDefinition`, `InstanceDefinition`, - and `SourceIndexMapping` retain source-to-internal identity; `ModelDefinition` - retains source path/content identity, heading, warnings, and all semantic - vectors. `Domain` owns the complete definition and returns const references; - declaration-order vector positions remain stable internal indices. Node and - beam definitions contain no equation-numbering state, and same-part identity - instances retain distinct source identities and connectivity. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: backend-free `EntityIndex`, semantic model records, - `ModelDefinition`, and immutable `Domain::create`/const accessors are - available to Step 11 syntax parsing and Step 12 semantic mapping. - -## Step 11 — inp-syntax-parser - -- task_id: `TASK-11` -- status: `completed` -- changed_files: `include/fesa/io/abaqus/input_syntax.hpp`, - `include/fesa/io/abaqus/input_reader.hpp`, - `src/fesa/io/abaqus/input_reader.cpp`, - `tests/unit/io/abaqus/input_syntax_test.cpp`, - `tests/unit/io/abaqus/input_reader_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-11-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-010`, `FESA-REQ-LS3DEB-034`, - `FESA-REQ-LS3DEB-040` -- test_ids: `T11-SYN-001`, `T11-SYN-002`, `T11-SYN-003`, `T11-SYN-004` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure` | 1 | Both planned test files are registered before production and fail for the missing reader API | MSVC C1083 for `fesa/io/abaqus/input_reader.hpp` in both new test translation units; CTest subsequently reported `No tests were found` because the executable could not build | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal syntax records, binary reader, and four tests compile and link | `input_reader.cpp`, both parser test files, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure` | 0 | All exact syntax parsing behaviors pass | 4/4 `InpSyntax` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved MSVC x64 build tree regenerates with explicit dependencies | Visual Studio 18 2026/MSVC environment selected; configure and generate completed; oneMKL 2026.1 resolved | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R InpSyntax --output-on-failure` | 0 | Focused Step 11 suite remains green | 4/4 exact `InpSyntax` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all four exact syntax tests | 14 tests discovered with all four `InpSyntax` names and feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 14/14 tests passed | -| VERIFY-dependency-direction | Backend, upward I/O, core-to-I/O, and semantic-policy scans over the Step 11 public/production files using `rg -n` fail-on-match wrappers | 0 | Public headers retain backend-free `core -> io/abaqus` direction and syntax parsing contains no Step 12 policy | backend leaks 0; upward I/O dependencies 0; core-to-I/O dependencies 0; semantic-policy matches 0; exactly four `InpSyntax` tests found | -| VERIFY-diff | `git diff --check` | 0 | Patch has no whitespace errors | Exit 0; only informational Git LF-to-CRLF working-copy notices were emitted | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain unchanged | Diff exit 0 and reference status empty | - -- contract_checks: `ParsedInput` records the absolute lexically normalized - source path and exact binary-byte FNV-1a identity formatted as - `fnv1a64:` plus 16 lowercase hexadecimal digits. Keyword and parameter names - alone become ASCII uppercase; parameter values, data label lexemes, empty - and trailing data fields, and each keyword `originalLine` preserve source - spelling. Comments and blanks remain excluded while physical 1-based file - line accounting is retained. Unreadable file, empty keyword, and orphan data - return categorized input diagnostics. No keyword allowlist, wrapper/nesting, - numeric conversion, B31/B33, or output-request decision exists in this Step. - The read-only legacy input parses as 30 keyword blocks with exact identity - `fnv1a64:04543464cc970405`, unchanged bytes, and unchanged modification time. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: backend-free `KeywordParameter`, `DataLine`, `KeywordBlock`, - `ParsedInput`, and `AbaqusInputReader::read` with syntax/source provenance are - available to Step 12 semantic mapping. - - -## Step 12 — inp-domain-mapping - -- task_id: `TASK-12` -- status: `completed` -- changed_files: `include/fesa/io/abaqus/domain_mapper.hpp`, - `src/fesa/io/abaqus/domain_mapper.cpp`, - `tests/unit/io/abaqus/domain_mapper_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-12-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-001`, `FESA-REQ-LS3DEB-002`, - `FESA-REQ-LS3DEB-005` through `FESA-REQ-LS3DEB-020`, - `FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-044` -- test_ids: `T12-MAP-001`, `T12-MAP-002`, `T12-MAP-003`, - `T12-MAP-004`, `T12-MAP-005` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED | `cmake --build .harness/build --config Debug --target fesa_tests`; `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` | 1 | All five planned tests were registered before production and the implementation-owned mapper API was absent | MSVC C1083 reported missing `fesa/io/abaqus/domain_mapper.hpp`; CTest then found no runnable mapper tests because the executable did not build | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | The mapper, five semantic tests, solver library, and unit executable compile and link | `domain_mapper.cpp` and `domain_mapper_test.cpp` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` | 0 | Exact supported inventory, deterministic expansion, no-op policy, negative portfolio, and DLOAD exclusion pass | 5/5 exact `InpDomainMapping` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved MSVC x64 build tree regenerates with explicit dependencies | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under the existing `/W4 /WX` policy | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` | 0 | Focused Step 12 suite remains green after review corrections | 5/5 `InpDomainMapping` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact mapper tests | 19 tests discovered with all five planned `InpDomainMapping` names and feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 19/19 tests passed | -| VERIFY-dependency-direction | Backend, upward-I/O, core-upward, distributed-load-object, unapproved-`nu`-gate, and exact-test-count scans over Step 12 files | 0 | Public dependencies and approved scope remain intact | backend leaks 0; upward dependencies 0; core upward dependencies 0; distributed-load objects 0; unapproved `nu` gates 0; mapper tests 5 | -| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 12 files have no whitespace errors | Git reported informational LF-to-CRLF notices only; new-file trailing whitespace matches 0 | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- contract_checks: the mapper consumes syntax-only `ParsedInput` and returns - one complete immutable `Domain` or a categorized diagnostic. It enforces the - monotonic top-level/part/assembly/step grammar, B33 only, identity instances - only, exact inclusive set generation, case-insensitive references, stable - declaration/instance-order internal IDs, and `SourceEntityId - {instance_name, source_label}`. Direct node labels, part and assembly sets, - ambiguous multi-instance labels/sets, and direct-versus-set constraint - overlap are resolved before Domain success. -- contract_checks: material and section mapping uses exact `E,nu`, - `G=E/(2*(1+nu))`, `A,I11,I12,I22,J`, exact `I12=0`, - `Iy=I11`, `Iz=I22`, and `n1 -> local y`. It requires positive - `E,G,A,I11,I22,J` without adding a `nu < 0.5` gate. Nonfinite material, - section, and guide data are model failures. Overflow-safe scaled norms apply - the exact length and guide-vector inequalities; equality fails, values above - pass, and valid finite geometry near `1e308` is accepted without a fallback - axis. -- contract_checks: model-level and step-level boundaries and sole-step CLOAD - targets are validated, conflicting expanded node/DOF prescriptions fail, the - exact four positive finite `*STATIC` fields are retained, and the sole - canonical result identity is `Step-1`, frame 0. The exact warning no-op - allowlist produces stable `ignored-input-keyword` diagnostics without - changing semantic objects. B31, transforms, nested/dependent assembly - semantics, second step, NLGEOM, unknown keywords, and `*DLOAD` fail; no - distributed-load Domain object, B31 alias, multi-step path, or transform - fallback exists. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; the legacy cantilever input maps successfully - while exact bytes and modification time remain unchanged, and - `git diff --exit-code -- reference/` exits 0 -- handoff: `AbaqusDomainMapper::map(const ParsedInput&)`, complete immutable - Domain objects, stable expanded node/element/set identities, validated - material/section indices, and the sole `StaticStepDefinition` are available - to Step 13 `AnalysisModel`. - -### Step 12 Review Corrections - -- A duplicate-`*ELASTIC` regression test first failed because a second - consecutive elasticity record lost the owning-material state. Preserving the - immediate material eligibility produced the exact `duplicate-entity` - diagnostic and restored targeted 5/5. -- Ten monotonic-order regressions first failed at the accepted late-`*PART` - case. Explicit phase state now rejects late model data, assembly sets before - or followed by instances, element-before-node, incomplete block closure, and - pre-`*STATIC` or out-of-order history data with - `invalid-keyword-location`. -- Review edge tests then failed for valid `1e308` geometry and for nonfinite - elasticity being classified as input. Context-specific model parsing, - overflow-safe scaled geometry comparisons, active beam-section context, - exact GENERATE landing, direct/ambiguous target resolution, and exact - threshold cases were added. The corrected focused suite passes 5/5 and the - full accumulated suite passes 19/19. -- Focused re-review returned Critical 0 and Important 0. Its sole remaining - minor requested an explicit negative transverse-shear context assertion; - that table case was added and passes without a production change. - -### Step 12 Root Review Fix Round 1 — same-token target ambiguity - -- finding: `resolveNodeTarget` returned one matching node set before computing - the direct numeric source-label candidates. A token such as `1` therefore - silently selected `NSET=1` even when node source label `1` was also a valid - interpretation. -- regression_scope: `RejectsUnsupportedAndInvalidPortfolio` now constructs an - `NSET` named `1` containing node `2` while node label `1` also exists, and - exercises the same token independently through both `*BOUNDARY` and - `*CLOAD`. It requires input-category `unresolved-reference` with exact - keyword, entity identity `1`, and original data-row file/line location. -- RED-build: `cmake --build .harness/build --config Debug --target fesa_tests` - exited 0 after registering the two regression paths. -- RED-test: `ctest --test-dir .harness/build -C Debug -R "InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio" --output-on-failure` - exited 8. The test failed at `same-token-boundary` - because `result.hasValue()` was true instead of the required structured - failure. -- fix: target resolution computes both name-matched node sets and numeric - direct-node candidates before returning either. Multiple candidates within - an interpretation or one valid candidate from each interpretation use the - existing input/`unresolved-reference` ambiguity contract; unique set-only - and direct-only paths remain unchanged. -- GREEN: the targeted build exited 0 and `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` - exited 0 with 5/5 passed. -- VERIFY: approved explicit-dependency MSVC x64 configure and full Debug build - exited 0; discovery found 19 tests including all five mapper names; full - CTest passed 19/19. Backend/upward/core-upward/distributed-load/unapproved - `nu` scans were 0, exactly five mapper tests remained, `git diff --check` - exited 0, and reference diff/status were clean. -- deferred_scope: the separate known-but-misplaced keyword diagnostic Minor was - deliberately not changed in this fix round. No phase-index change and no - commit were made. - -## Step 13 — analysis-model - -- task_id: `TASK-13` -- status: `completed` -- changed_files: `include/fesa/analysis/analysis_model.hpp`, - `src/fesa/analysis/analysis_model.cpp`, - `tests/unit/analysis/analysis_model_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-13-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-001`, `FESA-REQ-LS3DEB-021`, - `FESA-REQ-LS3DEB-034` -- test_ids: `T13-MODEL-001`, `T13-MODEL-002`, `T13-MODEL-003` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly three planned tests were registered before production and the AnalysisModel API was absent | MSVC C1083 reported missing `fesa/analysis/analysis_model.hpp` from `analysis_model_test.cpp` | -| RED-test | `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure` | 0 | No focused test was runnable because the test executable could not rebuild | CTest reported `No tests were found` after the implementation-owned compile RED | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal non-owning active view and all three tests compile and link | `analysis_model.cpp`, `analysis_model_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure` | 0 | Active classification, address identity/immutability, and cardinality diagnostics pass | 3/3 exact `AnalysisModel` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R AnalysisModel --output-on-failure` | 0 | Focused Step 13 suite remains green | 3/3 exact `AnalysisModel` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all three exact AnalysisModel names | 22 tests discovered with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 22/22 tests passed | -| VERIFY-dependency-direction | Backend public-header, upward-analysis dependency, DOF/numeric-state, exact-test-count, registration, and trailing-whitespace scans using fail-on-match `rg` wrappers | 0 | AnalysisModel stays backend-free and below later solver layers, with no DOF/state ownership | backend leaks 0; upward dependencies 0; DOF/numeric-state leaks 0; tests 3; CMake registrations 1/1; new-file trailing whitespace 0 | -| VERIFY-diff | `git diff --check` | 0 | Tracked patch has no whitespace errors | Exit 0; only informational Git LF-to-CRLF working-copy notices were emitted | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- contract_checks: `AnalysisModel` stores one non-owning `const Domain*` plus - stable `EntityIndex` vectors only. All Domain elements are active in stable - internal order; reachable material and section IDs are deduplicated by an - ascending internal-index scan; boundary/load IDs are the sole step's vector - positions. `domain()` and `step()` preserve exact address identity, and the - tests verify semantic storage addresses and values remain unchanged. Missing - and multiple steps return categorized `invalid-model-cardinality` and - `unsupported-multiple-step` diagnostics. No equation numbering, constraint - propagation, multi-step activation, or numeric analysis state was added. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: the exact AnalysisModel ledger API, sole-step reference, and stable - active element/material/section/boundary/load IDs are available to Step 14 - `DofManager` without copying or mutating Domain entities. - -## Step 14 — dof-manager - -- task_id: `TASK-14` -- status: `completed` -- changed_files: `include/fesa/fem/dof_manager.hpp`, - `src/fesa/fem/dof_manager.cpp`, `tests/unit/fem/dof_manager_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-14-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-003`, `FESA-REQ-LS3DEB-007`, - `FESA-REQ-LS3DEB-011`, `FESA-REQ-LS3DEB-022`, - `FESA-REQ-LS3DEB-034` -- test_ids: `T14-DOF-001`, `T14-DOF-002`, `T14-DOF-003`, - `T14-DOF-004` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly four planned tests are registered before production and fail for the missing DofManager API | MSVC C1083 reported missing `fesa/fem/dof_manager.hpp` from `dof_manager_test.cpp` after successful CMake regeneration | -| RED-test | `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure` | 0 | No focused test is runnable because the test executable cannot rebuild | CTest reported `No tests were found` after the implementation-owned compile RED | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal DofManager, its four tests, solver library, and unit executable compile and link | `dof_manager.cpp`, `dof_manager_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure` | 0 | Numbering, constraints, scatter/pattern, and mapping-owned round-trip pass | 4/4 exact `DofManager` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R DofManager --output-on-failure` | 0 | Focused Step 14 suite remains green | 4/4 exact `DofManager` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all four exact DofManager names | 26 tests discovered, including 4 `DofManager` tests, with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 26/26 tests passed | -| VERIFY-contract-scans | Backend public-header, upward-FEM dependency, model/analysis equation-state, out-of-scope feature, unledgered API, exact-test-count, and CMake-registration scans using fail-on-match `rg` wrappers | 0 | DofManager remains the sole equation/scatter/pattern owner and implements only the exact public ledger | backend leaks 0; upward dependencies 0; model/analysis equation state 0; penalty/MPC/RBE/numeric sparse storage 0; unledgered APIs 0; tests 4; registrations 1/1 | -| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 14 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- contract_checks: full DOFs follow stable node index and exact component order - `[UX,UY,UZ,URX,URY,URZ]`; free equations and constrained DOFs are ascending - full-index mappings. Case-insensitive node-set and direct source-label targets - expand deterministically; equal overlap is retained once, while different - values return `conflicting-boundary-condition` at the conflicting row's - source location. `prescribedValues()` has the same size/order as - `constrainedDofs()` and preserves zero and nonzero values. -- contract_checks: each active B33 definition has one 12-entry scatter in - endpoint/component order. The full-space CSR pattern has 19 row offsets and - 252 sorted-unique structural columns for the two-element chain fixture. - Stable free/constrained maps reconstruct the full vector without adding an - API absent from the exact ledger. Node and element records remain unchanged - and contain no equation IDs; no penalty, MPC, RBE, or sparse numeric storage - was added. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe`, - `.harness/build/step14-ctest-discovery.json` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: backend-free `DofComponent`, `SparsePattern`, and the exact - `DofManager` ledger API provide deterministic full/free/constrained maps, - prescribed `dc`, active-element scatter, and full structural CSR pattern to - Step 15 and later assembly/constraint tasks. - -## Step 15 — analysis-state - -- task_id: `TASK-15` -- status: `completed` -- changed_files: `include/fesa/results/result_records.hpp`, - `include/fesa/analysis/analysis_state.hpp`, - `src/fesa/analysis/analysis_state.cpp`, - `tests/unit/results/result_records_test.cpp`, - `tests/unit/analysis/analysis_state_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-15-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-003`, `FESA-REQ-LS3DEB-023`, - `FESA-REQ-LS3DEB-031`, `FESA-REQ-LS3DEB-034` -- test_ids: `T15-STATE-001`, `T15-STATE-002`, `T15-STATE-003` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly three planned tests were registered before production and the result-record/state API was absent | MSVC C1083 reported missing `fesa/analysis/analysis_state.hpp` from both new test translation units after successful CMake regeneration | -| RED-test | `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure` | 0 | No focused test was runnable because the unit test executable could not rebuild | CTest reported `No tests were found` after the implementation-owned compile RED | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal records/state implementation and all three tests compile and link | `analysis_state.cpp`, both test files, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure` | 0 | Allocation, identity/order, and copy/move ownership tests pass | 3/3 exact `AnalysisState` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK and oneMKL 2026.1 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R AnalysisState --output-on-failure` | 0 | Focused Step 15 suite remains green | 3/3 exact `AnalysisState` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all three exact AnalysisState names | 29 tests discovered with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 29/29 tests passed | -| VERIFY-contract-scans | Backend public-header, forbidden V0 state/API, Domain/AnalysisModel ownership, result-record upward dependency, exact-test-count, and CMake-registration scans using fail-on-match `rg` wrappers | 0 | State and row records implement only the exact backend-free V0 ledger | backend leaks 0; forbidden state/API 0; Domain/AnalysisModel ownership 0; result upward dependencies 0; tests 3; registrations 1/1/1 | -| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the five new files | 0 | Tracked and untracked Step 15 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- contract_checks: displacement, external force, internal force, residual, and - reaction are five independently owned `Vector` values sized to - `DofManager::fullDofCount()` and zero-initialized. Reaction remains in full - DOF index space even when only a subset is constrained, leaving free - components available for residual sanity checks. Mutable and const accessors - return the same owned vector storage. -- contract_checks: `StepFrameIdentity`, `EndpointResultRow`, `GaussResultRow`, - and `StressS11Row` match the public ledger field order. Owned endpoint, - Gauss, and stress vectors preserve append order and expose stable mutable and - const collections. Default copy/move operations follow the ledger: copies - deep-own vector/row storage, and moved-to state retains identity and values - without aliasing another live state. -- contract_checks: no velocity, acceleration, temperature, iteration history, - nonlinear element state, Domain copy/reference, equation numbering, HDF5, - MKL, or oneTBB API/storage was added. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: the exact backend-free result records and `AnalysisState` ledger API - provide full-space mutable solution vectors, step/frame identity, and stable - recovery-row collections to Step 16 and later result recovery/output tasks. - -## Step 16 — euler-beam-element - -- task_id: `TASK-16` -- status: `completed` -- changed_files: `include/fesa/elements/euler_beam_3d.hpp`, - `src/fesa/elements/euler_beam_3d.cpp`, - `tests/unit/elements/euler_beam_3d_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-16-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-002`, `FESA-REQ-LS3DEB-004`, - `FESA-REQ-LS3DEB-008`, `FESA-REQ-LS3DEB-012`, - `FESA-REQ-LS3DEB-013`, `FESA-REQ-LS3DEB-014`, - `FESA-REQ-LS3DEB-031`, `FESA-REQ-LS3DEB-032`, - `FESA-REQ-LS3DEB-035`, `FESA-REQ-LS3DEB-044` -- test_ids: `T16-BEAM-001`, `T16-BEAM-002`, `T16-BEAM-003`, - `T16-BEAM-004`, `T16-BEAM-005`, `T16-BEAM-006`, `T16-BEAM-007`, - `T16-BEAM-008`, `T16-BEAM-009`, `T16-BEAM-010` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly ten planned tests were registered before production and the EulerBeam3D public API was absent | MSVC C1083 reported missing `fesa/elements/euler_beam_3d.hpp` from `euler_beam_3d_test.cpp` after successful CMake regeneration | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | The minimum beam kernel, ten tests, solver library, and unit executable compile and link | `euler_beam_3d.cpp`, `euler_beam_3d_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | Reviewed signs, Gauss integration, rank, transform, loads, analytical modes, validation, recovery, patches, and negative control pass | 10/10 exact `EulerBeam3D` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | Focused Step 16 suite remains green | 10/10 exact `EulerBeam3D` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all ten exact EulerBeam3D names | 39 tests discovered, including 10 `EulerBeam3D` tests, with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 39/39 tests passed | -| VERIFY-contract-scans | Backend public-header, upward-dependency, out-of-scope formulation, production one-point path, two-point Gauss/invariant, exact-test-count, and CMake-registration scans using fail-on-match `rg` wrappers | 0 | The kernel implements only the approved exact ledger and numerical integration contract | backend leaks 0; upward dependencies 0; out-of-scope couplings 0; production one-point paths 0; two-point Gauss consumers 3; normalized closed-form invariant `1e-12`; tests 10; registrations 1/1 | -| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 16 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- green_triage: the first implementation build passed and the first focused - run was 9/10. The single failure was isolated to a large-coordinate test - fixture whose requested equality rounded to a represented length above the - threshold. The test fixture was replaced by an exactly representable unit - threshold equality plus below/above large-coordinate cases; the production - strict `>` comparison and formulation were unchanged before the 10/10 run. -- contract_checks: local DOF order is exactly - `[u1,v1,w1,rx1,ry1,rz1,u2,v2,w2,rx2,ry2,rz2]`. Rotation rows are - `(ex,ey,ez)`, `dl=T*dg`, and `Kg=T^T*Kl*T`. The B-matrix follows the reviewed - `theta_y=-w'`, `theta_z=v'` signs; two-point Gauss `B^T D B` is the sole - production stiffness path and is checked against the independent closed - matrix with normalized tolerance `1e-12`. The test-only one-point rule has - rank four while the production rule has rank six and six rigid modes. -- contract_checks: length and guide-vector tests use the exact scale-aware - strict thresholds with no fallback axis. `E`, derived `G`, `A`, `Iy`, `Iz`, - and `J` must be finite and positive and `I12` must be exactly zero. Constant - local `px,py,pz,mx` receives the consistent signed load only; no parser, - `*DLOAD`, B31, Timoshenko, shear correction, or transverse/torsional stress - support was added. -- contract_checks: recovery keeps local outward equilibrium end actions, - endpoint section resultants, and two-Gauss generalized strain/resultants - distinct. Axial stress is - `S11=E(epsilon0+x2*kappa_y-x1*kappa_z)` in input section-point order; absent - input points produce section point 0 at the centroid with source - `fesa-default`. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: the exact backend-free `EulerBeam3D` ledger API supplies global and - local stiffness, constant local equivalent load, and distinct recovery data - to Step 18 sparse assembly and Step 22 result recovery without owning element - identity, equation numbering, parser coupling, or result persistence. - -### Root numerical review — Fix Round 1 - -- scope: all three `Important` findings addressed in - `src/fesa/elements/euler_beam_3d.cpp` and the existing exact T16 tests; the - two `Minor` findings were intentionally not changed in this round. -- defect_RED: after adding finite-positive derived-overflow, - derived-underflow, and length-scaled-underflow fixtures to existing - `T16-BEAM-007`, - `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` - exited 8. All three invalid fixtures were accepted; the diagnostic path - observed respectively a nonfinite stiffness with maximum `inf`, an all-zero - stiffness, and a stiffness with a required bending coefficient underflowed - to zero. -- defect_GREEN: `cmake --build .harness/build --config Debug --target fesa_tests` - exited 0 and the same focused CTest exited 0 with 1/1 passed. `create()` now - requires derived `EA`, `GJ`, `EIy`, `EIz` and all ten distinct positive - length-scaled axial/torsion/bending block magnitudes to be finite and - strictly positive. This rejects arithmetic overflow/underflow as - `invalid-beam-property` without a conditioning threshold. -- invariant_hardening: production `normalizedMatrixError` now returns infinite - error for any nonfinite operand, difference, scale, or quotient, so the - two-point/closed-form `1e-12` invariant fails closed. -- analytical_hardening: every nonzero reference in existing `T16-BEAM-006` - now checks `abs(actual-reference)/abs(reference) <= 1e-9`; only the explicitly - zero free-end resultants retain an absolute check. This evidence-only change - was expected to remain GREEN and its focused test passed without a production - correction. -- convergence_hardening: existing `T16-BEAM-005` directly assembles aligned - 1/2/4-element `[v,rz]` cantilever systems from public `localStiffness()` and - `localEquivalentLoad()` only. It checks each exact signed constant transverse - element load, solves a test-only dense reduced system, and uses independent - five-point integration of interior cubic-Hermite displacement error against - the quartic uniform-load solution. Both refinements are monotone and each - observed order is 4 within `1e-8`. No `DLOAD`, parser, Domain, or production - assembly support was introduced. This evidence-only change was expected to - remain GREEN and the T16-005/T16-006 focused run passed 2/2. - -| stage | exact command | exit_code | observed_result | -| --- | --- | ---: | --- | -| FIX1-RED | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` | 8 | 0/1 passed; unexpected acceptance exposed nonfinite and zero stiffness outcomes | -| FIX1-GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | corrected source and unchanged ten test names compiled under `/W4 /WX` without a warning | -| FIX1-GREEN-defect | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` | 0 | 1/1 passed | -| FIX1-GREEN-evidence | `ctest --test-dir .harness/build -C Debug -R 'EulerBeam3D.(ConstantLineLoadMatchesAllSignedComponents|AnalyticalAxialTorsionAndTwoPlaneBendingRecover)' --output-on-failure` | 0 | 2/2 analytical/convergence hardening tests passed without another production change | -| FIX1-VERIFY-configure | `cmake -S . -B .harness/build -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 | exact MSVC x64 Debug tree configured and generated | -| FIX1-VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | full Debug build completed without a new warning | -| FIX1-VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | exact 10/10 passed | -| FIX1-VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 39 total tests discovered, including the same ten EulerBeam3D names | -| FIX1-VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 39/39 passed | -| FIX1-VERIFY-scans | fail-on-match numerical invariant, dependency, scope, exact-test-count, reference, phase-index, and diff/whitespace scans | 0 | derived rigidity/coefficient and fail-closed checks present; tests 10; leaks 0; reference and phase index unchanged; diff clean | - -## Step 17 — parallel-for-tbb - -- task_id: `TASK-17` -- status: `completed` -- changed_files: `include/fesa/assembly/parallel_for.hpp`, - `src/fesa/assembly/parallel_for.cpp`, - `tests/unit/assembly/parallel_for_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json`, - `.superpowers/sdd/linear-static-3d-euler-beam/task-17-report.md` -- requirement_ids: `FESA-REQ-LS3DEB-024`, `FESA-REQ-LS3DEB-025`, - `FESA-REQ-LS3DEB-034` -- test_ids: `T17-PFOR-001`, `T17-PFOR-002`, `T17-PFOR-003` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly three planned tests were registered before production and the ParallelFor public API was absent | MSVC C1083 reported missing `fesa/assembly/parallel_for.hpp` from `parallel_for_test.cpp` after successful CMake regeneration | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal serial/oneTBB adapters, three tests, solver library, and unit executable compile and link | `parallel_for.cpp`, `parallel_for_test.cpp`, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX`; oneTBB runtime staged for discovery | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | Zero/one/many exact-once, stable indexed output, and exception propagation pass | 3/3 exact `ParallelFor` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | Focused Step 17 suite remains green | 3/3 exact `ParallelFor` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all three exact ParallelFor names | 42 tests discovered, including 3 `ParallelFor` tests, with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 42/42 tests passed | -| VERIFY-contract-scans | Public oneTBB leak, private include, forbidden scheduler/assembly scope, exact-test-count, and CMake-registration scans using fail-on-match/count `rg` wrappers | 0 | The backend-free adapter implements only independent indexed work and retains the default caller-scoped scheduler policy | public TBB leaks 0; forbidden global/sparse/reduction policy 0; private TBB includes 1; tests 3; registrations 1/1/1 | -| VERIFY-diff | `git diff --check` plus trailing-whitespace scan over the three new files | 0 | Tracked and untracked Step 17 files have no whitespace errors | Diff check exit 0; new-file trailing whitespace matches 0 | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- contract_checks: `ParallelFor`, `SerialParallelFor`, and `TbbParallelFor` - expose only `std::size_t` and `std::function` in the public header. oneTBB - headers/types remain private to `parallel_for.cpp`, and the normalized - `Fesa::TBB` dependency is private to `fesa_solver`. -- contract_checks: both implementations execute `[0,count)` exactly once and - make `count==0` a no-op. Deterministic result ordering is caller-owned: - bodies write only their index-addressed slot, and this adapter performs no - global sparse write, COO/CSR reduction, mutex, or atomic accumulation. -- contract_checks: serial and oneTBB execution preserve the original body - exception type and message. oneTBB cancellation may allow already-running - indexed work to finish; callers receive the rethrown exception and must not - infer a deterministic partial-completion count. -- contract_checks: the adapter uses oneTBB's default caller-scoped scheduler; - it creates no process-wide thread setting, `global_control`, or task arena, - and does not override later MKL/TBB oversubscription coordination. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: Step 18 can inject either backend for independent element-local - computation into caller-owned stable element-order slots before its separate - deterministic COO-to-CSR reduction. - -### Step 17 Review Fix Round 1 — atomic test evidence - -- classification: test-evidence reliability hardening; no production defect - was observed or corrected. -- baseline_GREEN: before changing the test, - `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` - exited 0 with the existing production adapter passing 3/3. Because the - review changes only how a test observes duplicate callbacks, no - implementation-owned RED was expected or manufactured. -- reliability_issue: the prior `std::vector` scalar writes were race-free only - if the exact-once contract was already true. A duplicate concurrent callback - for one index could write the same non-atomic scalar concurrently, making the - negative case undefined instead of a deterministic test failure. -- correction: T17-PFOR-001 now uses an explicitly initialized atomic zero-count - counter and explicitly initialized per-index atomic visit counters. - T17-PFOR-002 uses explicitly initialized atomic serial/TBB output slots plus - per-index atomic visit counters. All callback increments use - `fetch_add(1, memory_order_relaxed)` and post-execution assertions require - every count to equal one, so duplicate same-index callbacks are observed - without a data race. Output stores/loads are relaxed atomics because only - per-slot observation is required after the blocking adapter returns. -- scope: only `tests/unit/assembly/parallel_for_test.cpp`, this cumulative - Step 17 section, and the ignored `task-17-report.md` changed. Production, - CMake, the phase index, upstream contracts, and reference artifacts were not - modified in this review round; the exact three test names remain unchanged. - -| stage | exact command | exit_code | observed_result | -| --- | --- | ---: | --- | -| REVIEW1-baseline-GREEN | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | existing correct production passed 3/3 before test hardening; no implementation RED expected | -| REVIEW1-VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | C++17 atomic test evidence compiled and linked under MSVC `/W4 /WX` without a warning | -| REVIEW1-VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | hardened exact three ParallelFor tests passed 3/3 | -| REVIEW1-VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 42 tests discovered, including the unchanged three exact ParallelFor names | -| REVIEW1-VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | full accumulated suite passed 42/42 | -| REVIEW1-VERIFY-scans | public TBB leak, production scope, atomic reliability, reference, and diff/whitespace scans | 0 | public leaks 0; forbidden production scope 0; atomic vectors 5; relaxed duplicate counters 4; legacy non-atomic visit/output paths 0; reference unchanged; diff clean | - -## Step 18 — sparse-assembly - -- task_id: `TASK-18` -- status: `completed` -- changed_files: `include/fesa/math/sparse_matrix.hpp`, - `src/fesa/math/sparse_matrix.cpp`, - `include/fesa/assembly/sparse_assembler.hpp`, - `src/fesa/assembly/sparse_assembler.cpp`, - `tests/unit/math/sparse_matrix_test.cpp`, - `tests/unit/assembly/sparse_assembler_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-024`, `FESA-REQ-LS3DEB-025`, - `FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-035` -- test_ids: `T18-SPARSE-001`, `T18-SPARSE-002`, `T18-SPARSE-003`, - `T18-SPARSE-004`, `T18-SPARSE-005` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly five planned tests were registered before production and both sparse public APIs were absent | CMake regenerated, then MSVC C1083 reported missing `fesa/assembly/sparse_assembler.hpp` and `fesa/math/sparse_matrix.hpp` from the two new test files | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum CSR owner, deterministic assembler, five tests, solver library, and unit executable compile and link | `sparse_assembler.cpp`, `sparse_matrix.cpp`, both tests, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | CSR validation/reduction/zero policy and serial/TBB deterministic beam assembly pass | 5/5 exact `SparseAssembly` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure and generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | Focused Step 18 suite remains green | 5/5 exact `SparseAssembly` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact SparseAssembly names | 47 tests discovered, including 5 `SparseAssembly` tests, with feature/unit labels | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 47/47 tests passed | -| VERIFY-contract-scans | Public backend/upward-dependency/PARDISO, assembler shared-CSR-member, dense inheritance, exact-test-count, and CMake registration scans using fail-on-match/count `rg` wrappers | 0 | Sparse storage and reduction remain behind the exact approved boundaries | public backend leaks 0; math-header upward dependencies 0; PARDISO matches 0; assembler CSR-member writes 0; dense inheritance 0; tests 5; registrations 2/2 | -| VERIFY-determinism | Exact bytes, reversed completion, serial/TBB, repeated TBB, tuple-cancellation, structural-zero, empty-row, multiply, validation, and symmetry assertions in the targeted suite | 0 | NR-O02 fixed-order reduction and NR-T11 scheduler independence are observable | one serial, one TBB, one reverse-order, and eight repeated TBB assemblies produced byte-identical row/column/value vectors; duplicate cancellation produced the tuple-ordered literal `1.0` | -| VERIFY-diff | `git diff --check 59da6c6` | 0 | The combined base-to-current-worktree Step 18 tracked range has no whitespace errors | Exact tracked scope is 10 files; generated discovery JSON and ignored scratch report are absent from the range | -| VERIFY-reference | `git diff --exit-code -- reference/`; `git status --short -- reference/` | 0 | Approved legacy reference artifacts remain read-only and unchanged | Reference diff exit 0 and reference status empty | - -- contract_checks: `SparseMatrix` is a separate owning CSR type with 0-based - row offsets and sorted-unique columns. It validates row-offset shape/range, - column range/order/uniqueness, COO dimensions, expected-pattern membership, - finite inputs, finite ordered sums, and multiply dimensions. Empty rows and - rectangular/zero structural layouts remain valid; every expected slot is - emitted even when its exact stored value is zero. -- contract_checks: COO contributions are stable-sorted by exactly - `(row,column,elementOrder,localOrder)` and duplicates are accumulated in - that sequence. The cancellation fixture distinguishes tuple order from - incoming vector order, and input permutation retains the same result. -- contract_checks: `SparseAssembler` validates model/DOF dimensions, - element references, and scatter ownership before work. It invokes the - injected `ParallelFor` once over stable active-element order; each worker - writes only its caller-indexed 144-entry row-major local buffer and failure - slot. CSR allocation and reduction occur only after the parallel call. -- contract_checks: the public headers expose no oneTBB, MKL, HDF5, or PARDISO - type. `SparseMatrix` neither includes nor inherits dense `Matrix`; the math - header forward-declares DofManager-owned `SparsePattern` to avoid a public - upward include. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: Step 19 can consume canonical full CSR arrays and deterministic - matrix-vector multiplication without depending on dense storage, oneTBB, - or a solver backend. Step 20 remains solely responsible for PARDISO - descriptors, indexing conversion, factorization, and substitution. -- concerns: none; no implementation, environment, backend, or upstream - contract conflict was found. - -### Step 18 Review Fix Round 1 — evidence artifact scope - -- classification: evidence/artifact-integrity correction only. Production, - public headers, tests, CMake, upstream contracts, and phase-index content - were not changed by this review fix. -- reproduced_finding: before correction, - `git diff --check 59da6c6..HEAD` exited 2 with - 191 findings (382 output lines), all for trailing whitespace in tracked file - `.harness/step18-discovery.json`. The cumulative `changed_files` list omitted - that tracked file while listing ignored scratch file - `.superpowers/sdd/linear-static-3d-euler-beam/task-18-report.md` as though it - were tracked. -- correction: deleted the generated discovery JSON with `apply_patch` and - reconciled `changed_files` to the exact 10-file combined tracked scope. The - ignored scratch report remains supplementary evidence and is not listed as - a tracked Step 18 file. -- phase_index_guard: `git hash-object - phases/linear-static-3d-euler-beam/index.json` was - `6808d3a8101f656e978b7e00df6cf1a4ad5f1711` before and after correction. - -| stage | exact command | exit_code | observed_result | -| --- | --- | ---: | --- | -| REVIEW1-reproduce | `git diff --check 59da6c6..HEAD` | 2 | 191 findings (382 output lines), all for trailing whitespace, were isolated to the accidental tracked discovery JSON | -| REVIEW1-scope | `git diff --name-status 59da6c6` | 0 | Combined base-to-worktree scope contains exactly 10 tracked Step 18 files; discovery JSON and ignored scratch report are absent | -| REVIEW1-diff | `git diff --check 59da6c6` | 0 | Combined committed plus worktree Step 18 range is whitespace-clean after artifact deletion | -| REVIEW1-configure | `cmake -S . -B .harness/build -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 | Exact MSVC x64 dependency-resolved configuration completed | -| REVIEW1-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build completed under `/W4 /WX` without a new warning | -| REVIEW1-targeted | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | Exact SparseAssembly suite passed 5/5 | -| REVIEW1-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated suite passed 47/47 | -| REVIEW1-reference | `git diff --exit-code 59da6c6 -- reference/`; `git status --short -- reference/` | 0 | Approved reference artifacts remain unchanged and reference status is empty | - -## Step 19 — essential-constraints - -- task_id: `TASK-19` -- status: `completed` -- changed_files: `include/fesa/constraints/essential_constraints.hpp`, - `src/fesa/constraints/essential_constraints.cpp`, - `tests/unit/constraints/essential_constraints_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-007`, `FESA-REQ-LS3DEB-022`, - `FESA-REQ-LS3DEB-027`, `FESA-REQ-LS3DEB-034`, - `FESA-REQ-LS3DEB-035` -- test_ids: `T19-CONSTRAINT-001`, `T19-CONSTRAINT-002`, - `T19-CONSTRAINT-003`, `T19-CONSTRAINT-004` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly four planned tests were registered before production and the public constraint API was absent | MSVC C1083 reported missing `fesa/constraints/essential_constraints.hpp` from `essential_constraints_test.cpp` | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum partition/mapping implementation and all four tests compiled and linked | `essential_constraints.cpp`, its test, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R EssentialConstraints --output-on-failure` | 0 | Hand-computed blocks, no/all/mixed constraints, nonzero reconstruction, and invalid dimensions passed | 4/4 exact `EssentialConstraints` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK, oneMKL 2026.1, oneTBB, and HDF5 resolved; configure/generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EssentialConstraints --output-on-failure` | 0 | Focused Step 19 suite remains green | 4/4 exact `EssentialConstraints` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all four exact names | 51 tests discovered, including 4 `EssentialConstraints` tests | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 51/51 tests passed | -| VERIFY-contract-scans | Public backend and forbidden load/RHS/penalty/MPC scans, exact-test-count scan, `git diff --check`, and reference status/diff checks | 0 | Essential partition remains isolated behind backend-free public types | backend leaks 0; forbidden scope 0; exact tests 4; whitespace clean; reference unchanged | - -- contract_checks: `partition` validates the input CSR, exact square/full-DOF - dimensions, stable increasing free/constrained order, disjoint complete - coverage, free-equation correspondence, and prescribed-vector size before - extracting any block. -- contract_checks: each full CSR slot maps at most once into - `Kff/Kfc/Kcf/Kcc`. Filtering the stable full rows and sorted columns retains - numeric values, local row/column order, and exact structural zeros; every - returned block revalidates through the canonical 0-based CSR constructor. -- contract_checks: no/all/mixed constraint cases include valid zero-sized - rectangular blocks. `gatherFree`, `gatherConstrained`, and - `reconstructFull` reject vector-size mismatch and preserve caller-supplied - constrained values exactly, including nonzero prescribed displacement. -- contract_checks: the module does not assemble loads, form an effective RHS, - implement penalty/MPC behavior, or expose MKL/oneTBB/HDF5/PARDISO types. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: Step 20 may factorize the validated `kff`; Step 21 may use `kfc` - with `DofManager::prescribedValues()` to form the nonzero prescribed - effective RHS without changing this module's mapping responsibility. -- concerns: none; no critical implementation or upstream contract conflict - was found. - -## Step 20 — mkl-pardiso-solver - -- task_id: `TASK-20` -- status: `completed` -- changed_files: `include/fesa/solvers/linear/linear_solver.hpp`, - `include/fesa/solvers/linear/mkl_pardiso_solver.hpp`, - `src/fesa/solvers/linear/mkl_pardiso_solver.cpp`, - `tests/unit/solvers/linear/linear_solver_test.cpp`, - `tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-025`, `FESA-REQ-LS3DEB-026`, - `FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-035` -- test_ids: `T20-PARDISO-001`, `T20-PARDISO-002`, - `T20-PARDISO-003`, `T20-PARDISO-004`, `T20-PARDISO-005`, - `T20-PARDISO-006` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly six planned tests were registered before production and both solver public APIs were absent | CMake regenerated with all dependencies resolved; MSVC C1083 reported missing `fesa/solvers/linear/linear_solver.hpp` and `fesa/solvers/linear/mkl_pardiso_solver.hpp` from the two new test files | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum backend boundary, private PARDISO state, six tests, solver library, and unit executable compile and link | `mkl_pardiso_solver.cpp`, both tests, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R MklPardisoSolver --output-on-failure` | 0 | SPD solution, repeated RHS, refactorization, validation/failures, and conditioning behavior pass | 6/6 exact `MklPardisoSolver` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK 10.0.26100.0, oneMKL 2026.1 ILP64/dynamic, oneTBB, and HDF5 resolved; configure/generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R MklPardisoSolver --output-on-failure` | 0 | Focused Step 20 suite remains green | 6/6 exact `MklPardisoSolver` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all six exact names | 57 tests discovered, including 6 `MklPardisoSolver` tests | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 57/57 tests passed | -| VERIFY-contract-scans | Fail-on-match public-header scan for `mkl.h`, `MKL_INT`, `pardiso`, oneTBB, and HDF5 symbols; exact-test-count, `git diff --check`, and reference diff/status checks | 0 | The solver backend remains private and Step scope/artifact invariants hold | public PARDISO leaks 0; solver-header backend leaks 0; exact tests 6; whitespace clean; reference unchanged | - -- contract_checks: `LinearSolver` exposes only the exact separate - `factorize(SparseMatrix)` and const `solve(rhs,solution)` boundary. - `MklPardisoSolver` exposes only its constructor, virtual destructor, - overrides, and `unique_ptr`; every MKL header/type/handle is confined - to the `.cpp` and private `Impl`. -- contract_checks: factorization first validates the full square, nonempty, - finite, sorted-unique public CSR, full symmetric structure/value tolerance, - every diagonal slot, and all `size_t` to `MKL_INT` conversions. It then - copies only the sorted upper triangle while retaining exact structural-zero - diagonals. -- contract_checks: the private adapter uses real SPD `mtype=2`, explicit - phases `11`, `22`, `33`, and `-1`, `iparm[26]=1` matrix checking, and - `iparm[34]=1` zero-based indexing. A successful factorization is retained - for repeated RHS; refactorization and destruction release the previous - PARDISO state through the same RAII path. No regularization or fallback is - present. -- contract_checks: solve-before-factorize, RHS/solution dimension mismatch, - nonfinite RHS/solution, nonsquare/empty/asymmetric/missing-diagonal input, - singular or indefinite SPD failure, checker/integer/backend errors, and - phase-specific `-4`/`-7` failures return one deterministic - `FailureCategory::solver` diagnostic. The known SPD system meets normalized - residual `1e-10` and relative analytical error `1e-9`; common-scale and - stiffness-ratio sweeps either meet both limits or return the structured - solver failure without adding a conditioning threshold. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: Step 21 can form the effective free RHS after this adapter has - factorized `Kff`, then call `solve` repeatedly without refactorization or - depending on MKL types. -- concerns: none; no critical implementation, environment, backend, or - upstream-contract conflict was found. - -### Step 20 Review Fix Round 1 — fully constrained lifecycle and normalized validation - -- review_classification: Important integration/correctness fixes. Step 19 - intentionally produces a valid `0x0 Kff` for an all-constrained model, so - rejecting that matrix contradicted the accumulated solver workflow. -- test_scope: the existing six `MklPardisoSolver` test names were retained. - The invalid-state test now covers trivial factorize/solve followed by a - nonempty refactor, unchanged caller output on failed solves, and a - small-scale asymmetric matrix. Numerical helpers now divide by the actual - nonzero RHS/expected norm and fail closed for zero or nonfinite norms. - -| stage | exact command | exit_code | observed_result | -| --- | --- | ---: | --- | -| RED-zero-equation | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 1 | Build passed; 5/6 tests passed and `RejectsInvalidCsrStateAndDimensions` failed because valid `0x0 Kff` factorization returned failure | -| TEST-hardening | same targeted command after replacing unit-floor norm helpers | 1 | The same zero-equation production defect remained the only failure; no artificial RED was claimed for already-correct numerical results | -| GREEN-zero-equation | same targeted command after the minimum production change | 0 | 6/6 passed; empty factorize/solve avoids PARDISO and a following nonempty refactor solves correctly | -| RED-scaled-symmetry | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 1 | Build passed; 5/6 tests passed and the existing invalid-state test showed that a scaled asymmetric matrix was incorrectly accepted | -| GREEN-scaled-symmetry | same targeted command after the minimum production change | 0 | 6/6 passed with symmetry normalized by the matrix's actual maximum absolute entry and no unit-size floor | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Explicit MSVC x64 dependencies configured and generated successfully | -| VERIFY-build/targeted | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 0 | Debug build completed without a new warning; exact Step 20 suite passed 6/6 | -| VERIFY-discovery/full | `ctest --test-dir .harness/build -C Debug --show-only=json-v1; ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 57 tests discovered and 57/57 passed | -| VERIFY-contract | backend API leak scan, exact-test count, forbidden fallback/regularization scan, `git diff --check`, and reference diff/status | 0 | backend API leaks 0; exact tests 6; forbidden implementation matches 0; whitespace clean; `reference/` unchanged | - -- production_fix: a successful zero-equation factorization is represented as - trivial private state without allocating or calling PARDISO; empty solve - succeeds only after that observable factorization. The ordinary `release()` - path safely clears this state before later refactorization or destruction. -- production_fix: symmetry requires every reverse structural pair and compares - `abs(aij-aji)` to `1e-12 * max(abs(A))`. An exactly zero matrix uses an exact - zero difference check; SparseMatrix validation remains responsible for - rejecting nonfinite values. -- failure_atomicity: solve-before-factorize, dimension mismatch, and nonfinite - RHS failures are asserted to leave the caller's solution values unchanged; - successful backend output is still copied from a private candidate only - after phase 33 and finite-result validation. -- evidence_hygiene: two intermediate symmetry RED attempts were discarded - because a concurrent clean build locked MSBuild files. The uncontended RED - above reproduced the production defect deterministically and is the recorded - evidence. -- phase_index: intentionally unchanged during this review fix; hash - `2cfb6ee5e0c49fbf6b06d27cb33ec9ac2c34dbc4`. -- supersession: this review section supersedes the original Step 20 statements - that the factorized CSR must be nonempty or that empty input is rejected. -- concerns: none; the transient build contention was resolved before recorded - RED/GREEN/VERIFY runs and no critical or upstream blocker remains. - -## Step 21 — load-assembly - -- task_id: `TASK-21` -- status: `completed` -- changed_files: `include/fesa/assembly/load_assembler.hpp`, - `src/fesa/assembly/load_assembler.cpp`, - `tests/unit/assembly/load_assembler_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-007`, `FESA-REQ-LS3DEB-011`, - `FESA-REQ-LS3DEB-027`, `FESA-REQ-LS3DEB-034` -- test_ids: `T21-LOAD-001`, `T21-LOAD-002`, `T21-LOAD-003`, - `T21-LOAD-004`, `T21-LOAD-005` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly five planned tests were registered before production and the public load API was absent | MSVC C1083 reported missing `fesa/assembly/load_assembler.hpp` from `load_assembler_test.cpp` | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum nodal load/effective RHS implementation and all five tests compiled and linked | `load_assembler.cpp`, its test, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R LoadAssembly --output-on-failure` | 0 | Node/set loads, source-order accumulation, nonzero prescribed RHS, rejection, and zero cases pass | 5/5 exact `LoadAssembly` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK 10.0.26100.0, oneMKL 2026.1 ILP64/dynamic, oneTBB, and HDF5 resolved; configure/generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R LoadAssembly --output-on-failure` | 0 | Focused Step 21 suite remains green | 5/5 exact `LoadAssembly` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact names | 62 tests discovered, including 5 `LoadAssembly` tests | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 62/62 tests passed | -| VERIFY-contract-scans | Exact-test-count, public-backend, factorization/solve/distributed-load, whitespace, and reference diff/status scans | 0 | Load/RHS scope and backend boundary remain isolated | exact tests 5; public backend leaks 0; forbidden scope 0; whitespace clean; reference unchanged | - -- contract_checks: semantic node label/node-set targets resolve case-insensitively - to unique stable node indices. All six global components use DofManager full - order, constrained loads remain in the full vector, and duplicate CLOAD rows - accumulate strictly in active source order; a cancellation fixture proves - that the implementation does not reorder floating-point additions. -- contract_checks: model/full/free/constrained/prescribed dimensions, stable - DOF partition/equation order, active-load order, target indices, component - range, and finite individual inputs are validated before use. Nonfinite - source-order load sums, `Kfc*dc` products/row sums, and final subtraction fail - closed with one structured model diagnostic. -- contract_checks: effective RHS is exactly the stable gather of `Ff` minus - CSR row-order `Kfc*dc`; hand-computed nonzero `dc`, zero-load, zero-free, and - zero-constrained cases pass. No factorization/substitution call, distributed - load object, `*DLOAD`, or line-load behavior was added. -- contract_checks: the public header exposes only the two approved static - `LoadAssembler` functions and no MKL, oneTBB, HDF5, or PARDISO type. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: Step 22 can consume the full external force and effective free RHS; - Step 24 retains ownership of factorize-before-load orchestration, - substitution, reconstruction, recovery, and output sequencing. -- concerns: none; no critical implementation, environment, backend, or - upstream-contract conflict was found. - -## Step 22 — result-recovery - -- task_id: `TASK-22` -- status: `completed` -- changed_files: `include/fesa/results/result_recovery.hpp`, - `src/fesa/results/result_recovery.cpp`, - `tests/unit/results/result_recovery_test.cpp`, `src/fesa/CMakeLists.txt`, - `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-004`, `FESA-REQ-LS3DEB-027`, - `FESA-REQ-LS3DEB-031`, `FESA-REQ-LS3DEB-032`, - `FESA-REQ-LS3DEB-034`, `FESA-REQ-LS3DEB-035`, - `FESA-REQ-LS3DEB-042` -- test_ids: `T22-RECOVERY-001`, `T22-RECOVERY-002`, - `T22-RECOVERY-003`, `T22-RECOVERY-004`, `T22-RECOVERY-005`, - `T22-RECOVERY-006` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exactly six planned tests were registered before production and the recovery public API was absent | MSVC C1083 reported missing `fesa/results/result_recovery.hpp` from `result_recovery_test.cpp` | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Recovery, station normalization, six tests, solver library, and unit executable compile and link | `result_recovery.cpp`, its test, `fesa_solver.lib`, and `fesa_unit_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R ResultRecovery --output-on-failure` | 0 | Residual reaction, residual criterion, distinct result types, signs, stress order, and station policy pass | 6/6 exact `ResultRecovery` tests passed | -| RED-state-consistency | `cmake --build .harness/build --config Debug --target fesa_tests; ctest --test-dir .harness/build -C Debug -R ResultRecovery.EnforcesNormalizedFreeResidual --output-on-failure` | 1 | A constrained displacement inconsistent with prescribed `dc` must fail before residual evaluation | Test expected `invalid-recovery-state` but observed later `free-residual-tolerance-failure`, proving missing prevalidation | -| GREEN-state-consistency | same focused build/test command after the minimum validation change | 0 | Prescribed-order/state consistency fails before recovery and the exact zero-load/zero-displacement equilibrium remains valid | Focused test passed; subsequent exact suite passed 6/6 | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Windows SDK 10.0.26100.0, oneMKL 2026.1 ILP64/dynamic, oneTBB, and HDF5 resolved; configure/generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ResultRecovery --output-on-failure` | 0 | Focused Step 22 suite remains green | 6/6 exact `ResultRecovery` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all six exact names | 68 tests discovered, including 6 `ResultRecovery` tests | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 68/68 tests passed | -| VERIFY-contract-scans | Exact-test-count, public-backend, forbidden shear/averaging, whitespace, and reference diff/status scans | 0 | Recovery scope and adapter/reference boundaries remain isolated | exact tests 6; public backend leaks 0; forbidden scope 0; whitespace clean; reference unchanged | - -- contract_checks: full `internalForce=K*d` and - `residual=internalForce-externalForce` are computed as private candidates; - the full residual is preserved in reaction so free residual evidence remains - visible and constrained entries are the physical support reactions. No - endpoint-action summation participates in reaction recovery. -- contract_checks: the free residual uses - `||r_f||/max(||Fint_f||,||Fext_f||)` with no unit floor. A positive physical - denominator must meet `1e-10`; exact zero numerator/denominator is accepted - as zero-load equilibrium, while nonfinite arithmetic fails closed. -- contract_checks: dimensions, finite input, stable free/constrained order, - exact prescribed displacement, active entity references, and twelve-DOF - scatters are checked before computing candidates. Internal/residual/reaction - vectors and endpoint/Gauss/stress rows replace AnalysisState only after all - elements recover finite results, so failure is atomic. -- contract_checks: active element order produces endpoint `0,1`, Gauss `1,2`, - and element/Gauss/section stress order. Equilibrium end action - `[FX,FY,FZ,MX,MY,MZ]`, endpoint `[N,T,My,Mz]`, Gauss strain/resultant, and - section-point/default-centroid `S11` remain distinct. -- contract_checks: node-station projection requires exact endpoint row - identity, a two-endpoint unloaded interior chain, identical section and - local axes, finite component tolerances `[N,T,My,Mz]`, and agreement before - selecting the smaller stable element ID. Positive-local-x section-cut rows - compare directly and are never averaged; reversed, branched, loaded, - section-jump, nonfinite, and mismatch cases fail structurally. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe` -- reference_diff: unchanged; `git diff --exit-code -- reference/` exit 0 -- handoff: Step 23 can serialize the stable nodal vectors and distinct - endpoint/Gauss/stress rows; Step 24 reference tooling can reuse - `normalizeSectionResultantsToNodeStations` without backend or HDF5 types. -- concerns: none; no critical implementation, environment, numerical, or - upstream-contract conflict was found. - -### Step 22 Review Fix Round 1 — full-space free-residual visibility - -- review_trigger: the approved I/O contract requires Reaction at every node - and component, including the accepted free-DOF residual; the AnalysisState - storage comment likewise makes reaction a full-index residual view. -- RED-test: `cmake --build .harness/build --config Debug --target fesa_tests; - ctest --test-dir .harness/build -C Debug -R - '^ResultRecovery.EnforcesNormalizedFreeResidual$' --output-on-failure` - built successfully and exited 1 in CTest. The accepted below-tolerance free - residual was `-1.000000082740371e-09`, while its reaction entry was `0`. -- production_fix: the private reaction candidate is now a full copy of - `residual=K*d-F`. Constrained entries remain the physical reactions, free - entries retain residual evidence, and element end actions are still never - summed into reaction. -- GREEN-focused: the same focused build/test command exited 0 and passed 1/1 - after the minimum production change. -- VERIFY-build: `cmake --build .harness/build --config Debug` exited 0 under - MSVC x64 Debug with no new FESA warning. -- VERIFY-targeted: `ctest --test-dir .harness/build -C Debug -R - ResultRecovery --output-on-failure` exited 0 and passed the unchanged exact - six names 6/6. -- VERIFY-discovery-full: `ctest --test-dir .harness/build -C Debug - --show-only=json-v1` discovered 68 tests, exactly six ResultRecovery tests; - full `ctest --test-dir .harness/build -C Debug --output-on-failure` exited 0 - and passed 68/68. -- failure_atomicity: the existing tolerance-failure branch in - `ResultRecovery.EnforcesNormalizedFreeResidual` still proves prior internal, - residual, reaction, and endpoint state remains unchanged on failure. -- supersession: this review section records the historical pre-fix finding - that implementation and report originally kept only constrained residual - entries. The final Step 22 contract above now states that reaction is the - full residual dataset; only constrained entries are physical reactions. -- phase_index: the review-fix worker intentionally left phase metadata - unchanged. After independent root verification, finalization preserved exact - `started_at=2026-08-09T20:42:15+0900`, added - `completed_at=2026-08-09T21:14:47+0900`, and updated the summary to state - the corrected full-residual reaction contract. -- evidence_hygiene: an initial parallel VERIFY/audit wrapper terminated before - product commands because its PowerShell count expression was malformed. It - is excluded from TDD and product VERIFY evidence; the recorded evidence is - the subsequent uncontended serial build, targeted, discovery, full sequence - followed by a separate successful audit command. -- concerns: none; no upstream-contract conflict or critical blocker remains. - -## Step 23 — hdf5-results-writer - -- task_id: `TASK-23` -- status: `completed` -- changed_files: `include/fesa/results/results_writer.hpp`, - `include/fesa/io/hdf5/hdf5_results_writer.hpp`, - `src/fesa/io/hdf5/hdf5_results_writer.cpp`, - `tests/unit/results/results_writer_test.cpp`, - `tests/unit/io/hdf5/hdf5_results_writer_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `cmake/FesaDependencies.cmake`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-003`, `FESA-REQ-LS3DEB-015`, - `FESA-REQ-LS3DEB-019`, `FESA-REQ-LS3DEB-020`, - `FESA-REQ-LS3DEB-023`, `FESA-REQ-LS3DEB-025`, - `FESA-REQ-LS3DEB-028`, `FESA-REQ-LS3DEB-029`, - `FESA-REQ-LS3DEB-030`, `FESA-REQ-LS3DEB-031`, - `FESA-REQ-LS3DEB-032`, `FESA-REQ-LS3DEB-034` -- test_ids: `T23-HDF5-001`, `T23-HDF5-002`, `T23-HDF5-003`, - `T23-HDF5-004`, `T23-HDF5-005` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | All five ledger tests were registered before either public production header existed | MSVC C1083 reported missing `fesa/results/results_writer.hpp` and `fesa/io/hdf5/hdf5_results_writer.hpp` | -| INFRA-link | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Production and tests compiled, but the packaged static HDF5 target could not link in this environment | LNK1104 reported missing `libircmt.lib`; this is infrastructure evidence, not the feature RED | -| INFRA-runtime-discovery | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Shared HDF5 linked after normalized-target repair, but post-build GoogleTest discovery could not load a transitive runtime | discovery exited `0xc0000135`; `dumpbin /dependents hdf5.dll` identified `libmmd.dll` | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimum schema-v0 writer, tests, solver library, and unit executable compile/link after the approved runtime repair | `hdf5_results_writer.cpp` and both tests built under `/W4 /WX`; required runtime DLLs were staged before discovery | -| GREEN-test | `ctest --test-dir .harness/build -C Debug -R Hdf5ResultsWriter --output-on-failure` | 0 | Exact schema, mandatory outputs, diagnostics/centroid, failure preservation, and successful replacement pass | 5/5 exact `Hdf5ResultsWriter` tests passed | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Visual Studio 18/MSVC x64, Windows SDK 10.0.26100.0, oneMKL, oneTBB, and shared HDF5 resolved; configure/generate completed | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build passes without a new FESA warning | `fesa_solver.lib` and `fesa_unit_tests.exe` built under `/W4 /WX` | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R Hdf5ResultsWriter --output-on-failure` | 0 | Focused Step 23 suite remains green | 5/5 exact `Hdf5ResultsWriter` tests passed | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | CTest discovers the accumulated suite and all five exact ledger names | 73 tests discovered, including exactly 5 `Hdf5ResultsWriter` tests | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 73/73 tests passed in 2.75 seconds | -| VERIFY-runtime | `& 'C:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.51.36231\bin\Hostx64\x64\dumpbin.exe' /dependents 'C:\Program Files\HDF_Group\HDF5\2.1.1\bin\hdf5.dll'` | 0 | The package DLL's undeclared Intel runtime requirement is traceable | dependencies include `libmmd.dll`; the WIN32 staging guard copies `${OMP_DLL_DIR}/libmmd.dll` | -| VERIFY-contract-scans | Public HDF5/Win32 type scan, exact-test count, finalizer/RAII scope scan, forbidden shear/averaging/filter scan, `git diff --check`, and reference diff/status | 0 | Backend boundary, exact mandatory-output scope, atomic finalization, and reference immutability remain isolated | public backend leaks 0; exact tests 5; checked file closes and exact Replace/Move split present; forbidden scope 0; whitespace clean; reference unchanged | - -- contract_checks: `ResultsWriter` and `Hdf5ResultsWriter` expose only the - approved backend-free signatures. HDF5, Win32 handles, macros, RAII wrappers, - schema construction, self-check, and atomic finalization stay private to the - implementation; `Fesa::HDF5` is linked privately. -- contract_checks: schema v0 writes every literal metadata, model, and - `/steps/Step-1/frames/0` path, including `generalized_resultant`. Numeric - fields use IEEE little-endian float64, stable identities use little-endian - uint64 compound members, text uses UTF-8 variable-length strings, and exact - component/unit/coordinate/location/step/frame attributes are pinned. -- contract_checks: non-axis-aligned element axes, node/element identity, - connectivity, and representative first/last nonzero values for displacement, - reaction, end action, section resultant, generalized strain, and generalized - resultant prove solved state is connected to output. Output requests do not - filter any mandatory field; shear/averaged stress was not added. -- contract_checks: diagnostics are stable-sorted and preserved, an empty input - produces an exact zero-row compound dataset, and the default centroid stress - row serializes axial `S11` only. Dimensions, row identity/order, source - identity, and all numeric values are validated before finalization. -- atomicity: a unique same-directory temporary file is fully written, flushed, - checked-closed, reopened read-only for exact schema self-check, and - checked-closed before finalization. Existing finals use only - `ReplaceFileW(final,temp,nullptr,...)`; new finals use only - `MoveFileExW(temp,final,MOVEFILE_WRITE_THROUGH)`. Failure removes the temp, - leaves no partial new final, and preserves pre-existing final bytes. -- infrastructure_resolution: the approved normalized HDF5 dependency now - prefers the package shared target, with static and `HDF5::HDF5` fallbacks. - Tests stage `$` plus the package DLL's - verified `${OMP_DLL_DIR}/libmmd.dll` dependency without directly naming an - HDF5 package target or hardcoding an Intel installation path. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa_solver.lib`, - `.harness/build/tests/Debug/fesa_unit_tests.exe`; all test HDF5/temp artifacts - are confined to build-tree temporary directories and cleaned by their owners. -- reference_diff: unchanged; `git diff --exit-code -- reference/` and - `git status --short -- reference/` both report no change. -- handoff: Step 24 can construct the backend-free writer and rely on mandatory - schema-v0 output and fail-atomic replacement. Its production executable must - stage the selected HDF5 target runtime DLLs and `${OMP_DLL_DIR}/libmmd.dll` - with the same portable target-expression/runtime-guard policy used by tests. -- concerns: no remaining critical implementation or upstream-contract blocker. - The HDF5 static-link and shared-runtime environment blockers were resolved - and are recorded separately from the valid missing-API RED. - -## Step 24 — linear-static-cli - -- task_id: `TASK-24` -- status: `completed` -- changed_files: `include/fesa/analysis/linear_static_analysis.hpp`, - `src/fesa/analysis/linear_static_analysis.cpp`, - `include/fesa/app/fesa_application.hpp`, - `src/fesa/app/fesa_application.cpp`, `src/fesa/app/main.cpp`, - `tests/integration/analysis/linear_static_analysis_test.cpp`, - `tests/integration/app/fesa_application_test.cpp`, - `tests/reference/reference_comparison.hpp`, - `tests/reference/reference_comparison.cpp`, - `tests/reference/reference_comparison_test.cpp`, - `tests/reference/b33_reference_comparison_test.cpp`, - `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, - `docs/linear-static-3d-euler-beam/implementation-report.md`, - `phases/linear-static-3d-euler-beam/index.json` -- requirement_ids: `FESA-REQ-LS3DEB-001`, `FESA-REQ-LS3DEB-002`, - `FESA-REQ-LS3DEB-005`, `FESA-REQ-LS3DEB-020`, - `FESA-REQ-LS3DEB-026`, `FESA-REQ-LS3DEB-028`, - `FESA-REQ-LS3DEB-030`, `FESA-REQ-LS3DEB-032`, - `FESA-REQ-LS3DEB-033`, `FESA-REQ-LS3DEB-034`, - `FESA-REQ-LS3DEB-036` through `FESA-REQ-LS3DEB-044` -- test_ids: `T24-ORCH-001`, `T24-ORCH-002`, `T24-CLI-001`, - `T24-CLI-002`, `T24-CLI-003`, `T24-REF-001`, `T24-REF-002`, - `T24-REF-003`, `T24-REF-004`, `T24-B33-001` - -| stage | exact command | exit_code | expected_or_observed_result | evidence_tail | -| --- | --- | ---: | --- | --- | -| RED-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 1 | Exact ten tests were registered while orchestration, CLI, and comparator APIs were absent | MSVC C1083 reported only missing `fesa/analysis/linear_static_analysis.hpp`, `fesa/app/fesa_application.hpp`, and `reference_comparison.hpp`; the pre-existing unit target still built | -| RED-targeted | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure` | 0 | Missing executables leave no runnable Step 24 tests after the valid compile RED | CTest reported `No tests were found`; this is secondary evidence, not the RED acceptance result | -| GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | Minimal production lifecycle, application boundary, test-only comparator, and all three test executables compile/link | `fesa_solver.lib`, `fesa_unit_tests.exe`, `fesa_integration_tests.exe`, and `fesa_reference_tests.exe` built without a FESA warning under `/W4 /WX` | -| GREEN-targeted | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure` | 0 | Exact lifecycle/CLI/reference contract is green | Exact Step 24 suite passed 10/10: integration 5 and reference 5 | -| VERIFY-configure | `cmake -S . -B .harness/build -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 | Approved explicit-dependency MSVC x64 build tree generates | Visual Studio 18/MSVC x64, Windows SDK 10.0.26100.0, oneMKL 2026.1, oneTBB, and shared HDF5 resolved | -| VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build includes the actual CLI and all test executables | `.harness/build/src/fesa/Debug/fesa.exe` built under `/W4 /WX`; selected MKL/TBB/HDF5/Intel runtime DLLs were staged beside it | -| VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|ReferenceComparisonContract|B33ReferenceComparison" --output-on-failure` | 0 | Focused Step 24 suite remains green after the full build | Exact tests passed 10/10 | -| VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` plus JSON count audit | 0 | All accumulated and exact Step 24 tests are discovered | 83 total tests, exactly 10 Step 24 names | -| VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated C++ suite has zero failures | 83/83 tests passed | -| VERIFY-cli | `.harness/build/src/fesa/Debug/fesa.exe "reference/cantilever beam/cantilever beam.inp" --output .harness/build/cli-smoke-step24/results.h5` | 0 | The actual executable strips argv[0], runs the approved pipeline, and writes HDF5 | Process exit 0; `results.h5` exists and is 25,336 bytes; an empty-argument process smoke test returned exact usage exit 2 | -| VERIFY-determinism | Run exact `B33ReferenceComparison` twice and hash `comparison.json` after each run | 0 | Build-local comparison evidence is byte deterministic | Both runs passed 1/1 and produced SHA-256 `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` | -| VERIFY-contract-scans | Exact-test count, public-backend, forbidden-scope, reference-write, whitespace, and reference diff/status scans | 0 | Approved module and artifact boundaries remain isolated | exact tests 10; public backend leaks 0; B31/DLOAD/fallback/averaging scope 0; comparator has only its JSON output writer; diff clean; reference unchanged | - -- contract_checks: `Analysis::run` invokes the exact eight hook stages and - returns immediately on failure. `LinearStaticAnalysis` keeps the immutable - Domain alive under the non-owning AnalysisModel, owns the DOF/state/matrix - handoff, and calls `factorize(Kff)` before any nodal load assembly. Solve is - substitution-only, followed by full reconstruction, recovery, and the - injected ResultsWriter. -- contract_checks: `FesaApplication::run` receives argv[0]-excluded operands, - accepts only `` or ` --output `, defaults to the current - directory `results.h5`, constructs TBB/MKL/HDF5 adapters behind their public - boundaries, emits seven deterministic diagnostic fields, and returns exact - process codes 0/2/3/4/5/6. Domain warnings remain in the HDF5 diagnostics and - output requests do not filter mandatory result datasets. -- contract_checks: the test-only comparator opens the exact legacy four-file - bundle and authoritative HDF5 read-only, requires B33/schema/source/row - identity/finite values before comparison, and produces exactly 176 stable - decisions plus 16 component metrics. It uses Abaqus-only component scales, - exact SI floors, no zero clamp/drop, and Step 22 endpoint consistency before - selecting the smaller element identity without averaging. -- generated_evidence: `.harness/build/src/fesa/Debug/fesa.exe`, - `.harness/build/reference/cantilever-beam-b33/results.h5` (25,336 bytes), - `.harness/build/reference/cantilever-beam-b33/comparison.json` (128,118 - bytes). The report has `passed=true`, 0 failed rows, 176 matched rows, 16 - metrics, stress comparison N/A, and worst normalized error - `0.026602795021994977` (`UZ`). -- physics_evidence: free residual norm `9.356339321107032e-7`; applied force - `[0,0,-1000000]`; reaction force `[0,0,999999.9999998808]`; applied moment - about origin `[0,10000000,0]`; reaction moment about origin - `[0,-9999999.999997258,0]`; endpoint consistency passed. -- reference_diff: unchanged; `git diff --exit-code -- reference/` and - `git status --short -- reference/` both report no change. Contract-fixture - mutations occur only under `.harness/build/reference/contract-fixtures/`. -- handoff: Step 25 can independently rebuild and execute all 83 tests. Step 26 - can rerun the already-built exact B33 CTest and consume the deterministic - `comparison.json` without changing source, tests, tolerances, or references; - Step 27 can consume only its `physics_evidence` after Step 26 passes. -- concerns: none; no critical implementation, environment, numerical, or - upstream-contract blocker remains. - -### Step 24 Review Fix Round 1 — option-token output rejection - -- review_trigger: the approved CLI contract classifies repeated `--output` - and every unknown option as usage error exit 2. The original three-argument - parser treated the value position as an arbitrary nonempty path, so an - option token could advance into input analysis instead. -- RED-repeated-option: after adding - `{missingInput,"--output","--output"}` to the existing exact - `LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic` test, - `cmake --build .harness/build --config Debug --target - fesa_integration_tests` exited 0 and the focused CTest exited 1. Actual exit - was 3 and stderr contained no `cli-usage`, rather than expected exit 2. -- GREEN-repeated-option: rejecting the literal repeated token made the same - focused test pass 1/1. -- RED-unknown-option: the reviewer then identified the general unknown-option - case. Adding `{missingInput,"--output","--bogus"}` before broadening the - production condition again produced build exit 0 and focused CTest exit 1; - actual exit was 3 with no `cli-usage`. -- production_fix: explicit output form now requires a nonempty third argument - that does not begin with `-`. Both a repeated known option and an unknown - option token are rejected before any input or output access, while ordinary - output paths retain the approved behavior. -- GREEN-focused: rebuilding `fesa_integration_tests` exited 0 under `/W4 /WX`; - the unchanged exact focused test passed 1/1 with both option cases pinned. -- independent_review: Critical 0, unresolved Important 0. The reviewer reran - exact Step 24 10/10, discovery 83, full 83/83, comparison 176 rows/16 - metrics passed, and reference diff/status clean. -- remaining_minor: the test-only comparator independently pins float64 result - file types but relies on the Step 23 writer self-check/full-suite schema test - for exact uint64 endianness and every compound member file dtype/UTF-8. This - is defense-in-depth negative coverage, not a reproducible approved-pipeline - false pass. -- remaining_minor: the inherited diagnostic sorter is not a literal - implementation of future multi-source declaration/internal-ID ordering, but - no V0 single-input CLI misordering is reproducible. -- remaining_minor: the Step 23 `libmmd.dll` guard remains unconditional across - alternate HDF5 targets; it is correct for the approved shared-HDF5 - environment and is an external portability limitation. diff --git a/docs/linear-static-3d-euler-beam/io.md b/docs/linear-static-3d-euler-beam/io.md index de05461..bdb7e27 100644 --- a/docs/linear-static-3d-euler-beam/io.md +++ b/docs/linear-static-3d-euler-beam/io.md @@ -7,7 +7,7 @@ - source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` - source_numerical_review: `docs/linear-static-3d-euler-beam/numerical-review.md` - source_research: `docs/linear-static-3d-euler-beam/research.md` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` +- approved_design: `docs/development-history.md` - status: `ready-for-implementation-planning` - owner_agent: `io-definition-agent` - date: `2026-08-09` diff --git a/docs/linear-static-3d-euler-beam/lessons.md b/docs/linear-static-3d-euler-beam/lessons.md new file mode 100644 index 0000000..bcc67c3 --- /dev/null +++ b/docs/linear-static-3d-euler-beam/lessons.md @@ -0,0 +1,338 @@ +# Beam 수정·실패와 재발 방지 + +당시 독립 검토의 실제 결함·RED/GREEN·수정 확인을 보존한다. 현재 ownership과 실행은 공통 문서를 따른다. + + + + +#### Review Fix Round 1 — matrix-storage-size-overflow + +- regression_test: `tests/unit/math/matrix_test.cpp` now constructs + `Matrix{SIZE_MAX / 2 + 1, 2}` and requires `std::length_error`. +- RED: `cmake --build .harness/build --config Debug --target fesa_tests` exited 0; + `ctest --test-dir .harness/build -C Debug -R DenseMath --output-on-failure` + exited 8 with 1/2 failures because the wraparound constructor threw nothing. +- fix: `Matrix` computes its storage size through a checked helper before vector + construction and rejects exactly `columns != 0 && rows > SIZE_MAX / columns`. +- GREEN: the same targeted build and DenseMath CTest commands exited 0; 2/2 passed. +- VERIFY: approved MSVC x64 configure and full Debug build exited 0; targeted + DenseMath passed 2/2, discovery found 7 tests, and the full suite passed 7/7. + The public-header MKL scan had zero matches, `git diff --check` exited 0, and + `git diff --exit-code -- reference/` exited 0. +- scope: the deferred empty-dot review minor was not changed, reference artifacts + remain untouched, and phase Step 9 status/timestamps were not modified. + + + +#### Step 12 Review Corrections + +- A duplicate-`*ELASTIC` regression test first failed because a second + consecutive elasticity record lost the owning-material state. Preserving the + immediate material eligibility produced the exact `duplicate-entity` + diagnostic and restored targeted 5/5. +- Ten monotonic-order regressions first failed at the accepted late-`*PART` + case. Explicit phase state now rejects late model data, assembly sets before + or followed by instances, element-before-node, incomplete block closure, and + pre-`*STATIC` or out-of-order history data with + `invalid-keyword-location`. +- Review edge tests then failed for valid `1e308` geometry and for nonfinite + elasticity being classified as input. Context-specific model parsing, + overflow-safe scaled geometry comparisons, active beam-section context, + exact GENERATE landing, direct/ambiguous target resolution, and exact + threshold cases were added. The corrected focused suite passes 5/5 and the + full accumulated suite passes 19/19. +- Focused re-review returned Critical 0 and Important 0. Its sole remaining + minor requested an explicit negative transverse-shear context assertion; + that table case was added and passes without a production change. + + + +#### Step 12 Root Review Fix Round 1 — same-token target ambiguity + +- finding: `resolveNodeTarget` returned one matching node set before computing + the direct numeric source-label candidates. A token such as `1` therefore + silently selected `NSET=1` even when node source label `1` was also a valid + interpretation. +- regression_scope: `RejectsUnsupportedAndInvalidPortfolio` now constructs an + `NSET` named `1` containing node `2` while node label `1` also exists, and + exercises the same token independently through both `*BOUNDARY` and + `*CLOAD`. It requires input-category `unresolved-reference` with exact + keyword, entity identity `1`, and original data-row file/line location. +- RED-build: `cmake --build .harness/build --config Debug --target fesa_tests` + exited 0 after registering the two regression paths. +- RED-test: `ctest --test-dir .harness/build -C Debug -R "InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio" --output-on-failure` + exited 8. The test failed at `same-token-boundary` + because `result.hasValue()` was true instead of the required structured + failure. +- fix: target resolution computes both name-matched node sets and numeric + direct-node candidates before returning either. Multiple candidates within + an interpretation or one valid candidate from each interpretation use the + existing input/`unresolved-reference` ambiguity contract; unique set-only + and direct-only paths remain unchanged. +- GREEN: the targeted build exited 0 and `ctest --test-dir .harness/build -C Debug -R InpDomainMapping --output-on-failure` + exited 0 with 5/5 passed. +- VERIFY: approved explicit-dependency MSVC x64 configure and full Debug build + exited 0; discovery found 19 tests including all five mapper names; full + CTest passed 19/19. Backend/upward/core-upward/distributed-load/unapproved + `nu` scans were 0, exactly five mapper tests remained, `git diff --check` + exited 0, and reference diff/status were clean. +- deferred_scope: the separate known-but-misplaced keyword diagnostic Minor was + deliberately not changed in this fix round. No phase-index change and no + commit were made. + + + +#### Root numerical review — Fix Round 1 + +- scope: all three `Important` findings addressed in + `src/fesa/elements/euler_beam_3d.cpp` and the existing exact T16 tests; the + two `Minor` findings were intentionally not changed in this round. +- defect_RED: after adding finite-positive derived-overflow, + derived-underflow, and length-scaled-underflow fixtures to existing + `T16-BEAM-007`, + `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` + exited 8. All three invalid fixtures were accepted; the diagnostic path + observed respectively a nonfinite stiffness with maximum `inf`, an all-zero + stiffness, and a stiffness with a required bending coefficient underflowed + to zero. +- defect_GREEN: `cmake --build .harness/build --config Debug --target fesa_tests` + exited 0 and the same focused CTest exited 0 with 1/1 passed. `create()` now + requires derived `EA`, `GJ`, `EIy`, `EIz` and all ten distinct positive + length-scaled axial/torsion/bending block magnitudes to be finite and + strictly positive. This rejects arithmetic overflow/underflow as + `invalid-beam-property` without a conditioning threshold. +- invariant_hardening: production `normalizedMatrixError` now returns infinite + error for any nonfinite operand, difference, scale, or quotient, so the + two-point/closed-form `1e-12` invariant fails closed. +- analytical_hardening: every nonzero reference in existing `T16-BEAM-006` + now checks `abs(actual-reference)/abs(reference) <= 1e-9`; only the explicitly + zero free-end resultants retain an absolute check. This evidence-only change + was expected to remain GREEN and its focused test passed without a production + correction. +- convergence_hardening: existing `T16-BEAM-005` directly assembles aligned + 1/2/4-element `[v,rz]` cantilever systems from public `localStiffness()` and + `localEquivalentLoad()` only. It checks each exact signed constant transverse + element load, solves a test-only dense reduced system, and uses independent + five-point integration of interior cubic-Hermite displacement error against + the quartic uniform-load solution. Both refinements are monotone and each + observed order is 4 within `1e-8`. No `DLOAD`, parser, Domain, or production + assembly support was introduced. This evidence-only change was expected to + remain GREEN and the T16-005/T16-006 focused run passed 2/2. + +| stage | exact command | exit_code | observed_result | +| --- | --- | ---: | --- | +| FIX1-RED | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` | 8 | 0/1 passed; unexpected acceptance exposed nonfinite and zero stiffness outcomes | +| FIX1-GREEN-build | `cmake --build .harness/build --config Debug --target fesa_tests` | 0 | corrected source and unchanged ten test names compiled under `/W4 /WX` without a warning | +| FIX1-GREEN-defect | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D.RejectsInvalidGeometryAndProperties --output-on-failure` | 0 | 1/1 passed | +| FIX1-GREEN-evidence | `ctest --test-dir .harness/build -C Debug -R 'EulerBeam3D.(ConstantLineLoadMatchesAllSignedComponents|AnalyticalAxialTorsionAndTwoPlaneBendingRecover)' --output-on-failure` | 0 | 2/2 analytical/convergence hardening tests passed without another production change | +| FIX1-VERIFY-configure | `cmake -S . -B .harness/build -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 | exact MSVC x64 Debug tree configured and generated | +| FIX1-VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | full Debug build completed without a new warning | +| FIX1-VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R EulerBeam3D --output-on-failure` | 0 | exact 10/10 passed | +| FIX1-VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 39 total tests discovered, including the same ten EulerBeam3D names | +| FIX1-VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 39/39 passed | +| FIX1-VERIFY-scans | fail-on-match numerical invariant, dependency, scope, exact-test-count, reference, phase-index, and diff/whitespace scans | 0 | derived rigidity/coefficient and fail-closed checks present; tests 10; leaks 0; reference and phase index unchanged; diff clean | + + + +#### Step 17 Review Fix Round 1 — atomic test evidence + +- classification: test-evidence reliability hardening; no production defect + was observed or corrected. +- baseline_GREEN: before changing the test, + `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` + exited 0 with the existing production adapter passing 3/3. Because the + review changes only how a test observes duplicate callbacks, no + implementation-owned RED was expected or manufactured. +- reliability_issue: the prior `std::vector` scalar writes were race-free only + if the exact-once contract was already true. A duplicate concurrent callback + for one index could write the same non-atomic scalar concurrently, making the + negative case undefined instead of a deterministic test failure. +- correction: T17-PFOR-001 now uses an explicitly initialized atomic zero-count + counter and explicitly initialized per-index atomic visit counters. + T17-PFOR-002 uses explicitly initialized atomic serial/TBB output slots plus + per-index atomic visit counters. All callback increments use + `fetch_add(1, memory_order_relaxed)` and post-execution assertions require + every count to equal one, so duplicate same-index callbacks are observed + without a data race. Output stores/loads are relaxed atomics because only + per-slot observation is required after the blocking adapter returns. +- scope: only `tests/unit/assembly/parallel_for_test.cpp`, this cumulative + Step 17 section, and the ignored `task-17-report.md` changed. Production, + CMake, the phase index, upstream contracts, and reference artifacts were not + modified in this review round; the exact three test names remain unchanged. + +| stage | exact command | exit_code | observed_result | +| --- | --- | ---: | --- | +| REVIEW1-baseline-GREEN | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | existing correct production passed 3/3 before test hardening; no implementation RED expected | +| REVIEW1-VERIFY-build | `cmake --build .harness/build --config Debug` | 0 | C++17 atomic test evidence compiled and linked under MSVC `/W4 /WX` without a warning | +| REVIEW1-VERIFY-targeted | `ctest --test-dir .harness/build -C Debug -R ParallelFor --output-on-failure` | 0 | hardened exact three ParallelFor tests passed 3/3 | +| REVIEW1-VERIFY-discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 42 tests discovered, including the unchanged three exact ParallelFor names | +| REVIEW1-VERIFY-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | full accumulated suite passed 42/42 | +| REVIEW1-VERIFY-scans | public TBB leak, production scope, atomic reliability, reference, and diff/whitespace scans | 0 | public leaks 0; forbidden production scope 0; atomic vectors 5; relaxed duplicate counters 4; legacy non-atomic visit/output paths 0; reference unchanged; diff clean | + + + +#### Step 18 Review Fix Round 1 — evidence artifact scope + +- classification: evidence/artifact-integrity correction only. Production, + public headers, tests, CMake, upstream contracts, and phase-index content + were not changed by this review fix. +- reproduced_finding: before correction, + `git diff --check 59da6c6..HEAD` exited 2 with + 191 findings (382 output lines), all for trailing whitespace in tracked file + `.harness/step18-discovery.json`. The cumulative `changed_files` list omitted + that tracked file while listing ignored scratch file + `.superpowers/sdd/linear-static-3d-euler-beam/task-18-report.md` as though it + were tracked. +- correction: deleted the generated discovery JSON with `apply_patch` and + reconciled `changed_files` to the exact 10-file combined tracked scope. The + ignored scratch report remains supplementary evidence and is not listed as + a tracked Step 18 file. +- phase_index_guard: `git hash-object + phases/linear-static-3d-euler-beam/index.json` was + `6808d3a8101f656e978b7e00df6cf1a4ad5f1711` before and after correction. + +| stage | exact command | exit_code | observed_result | +| --- | --- | ---: | --- | +| REVIEW1-reproduce | `git diff --check 59da6c6..HEAD` | 2 | 191 findings (382 output lines), all for trailing whitespace, were isolated to the accidental tracked discovery JSON | +| REVIEW1-scope | `git diff --name-status 59da6c6` | 0 | Combined base-to-worktree scope contains exactly 10 tracked Step 18 files; discovery JSON and ignored scratch report are absent | +| REVIEW1-diff | `git diff --check 59da6c6` | 0 | Combined committed plus worktree Step 18 range is whitespace-clean after artifact deletion | +| REVIEW1-configure | `cmake -S . -B .harness/build -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 | Exact MSVC x64 dependency-resolved configuration completed | +| REVIEW1-build | `cmake --build .harness/build --config Debug` | 0 | Full Debug build completed under `/W4 /WX` without a new warning | +| REVIEW1-targeted | `ctest --test-dir .harness/build -C Debug -R SparseAssembly --output-on-failure` | 0 | Exact SparseAssembly suite passed 5/5 | +| REVIEW1-full | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | Full accumulated suite passed 47/47 | +| REVIEW1-reference | `git diff --exit-code 59da6c6 -- reference/`; `git status --short -- reference/` | 0 | Approved reference artifacts remain unchanged and reference status is empty | + + + +#### Step 20 Review Fix Round 1 — fully constrained lifecycle and normalized validation + +- review_classification: Important integration/correctness fixes. Step 19 + intentionally produces a valid `0x0 Kff` for an all-constrained model, so + rejecting that matrix contradicted the accumulated solver workflow. +- test_scope: the existing six `MklPardisoSolver` test names were retained. + The invalid-state test now covers trivial factorize/solve followed by a + nonempty refactor, unchanged caller output on failed solves, and a + small-scale asymmetric matrix. Numerical helpers now divide by the actual + nonzero RHS/expected norm and fail closed for zero or nonfinite norms. + +| stage | exact command | exit_code | observed_result | +| --- | --- | ---: | --- | +| RED-zero-equation | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 1 | Build passed; 5/6 tests passed and `RejectsInvalidCsrStateAndDimensions` failed because valid `0x0 Kff` factorization returned failure | +| TEST-hardening | same targeted command after replacing unit-floor norm helpers | 1 | The same zero-equation production defect remained the only failure; no artificial RED was claimed for already-correct numerical results | +| GREEN-zero-equation | same targeted command after the minimum production change | 0 | 6/6 passed; empty factorize/solve avoids PARDISO and a following nonempty refactor solves correctly | +| RED-scaled-symmetry | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 1 | Build passed; 5/6 tests passed and the existing invalid-state test showed that a scaled asymmetric matrix was incorrectly accepted | +| GREEN-scaled-symmetry | same targeted command after the minimum production change | 0 | 6/6 passed with symmetry normalized by the matrix's actual maximum absolute entry and no unit-size floor | +| VERIFY-configure | `cmake -S . -B .harness/build -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 | Explicit MSVC x64 dependencies configured and generated successfully | +| VERIFY-build/targeted | `cmake --build .harness/build --config Debug; ctest --test-dir .harness/build -C Debug --output-on-failure -R MklPardisoSolver` | 0 | Debug build completed without a new warning; exact Step 20 suite passed 6/6 | +| VERIFY-discovery/full | `ctest --test-dir .harness/build -C Debug --show-only=json-v1; ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | 57 tests discovered and 57/57 passed | +| VERIFY-contract | backend API leak scan, exact-test count, forbidden fallback/regularization scan, `git diff --check`, and reference diff/status | 0 | backend API leaks 0; exact tests 6; forbidden implementation matches 0; whitespace clean; `reference/` unchanged | + +- production_fix: a successful zero-equation factorization is represented as + trivial private state without allocating or calling PARDISO; empty solve + succeeds only after that observable factorization. The ordinary `release()` + path safely clears this state before later refactorization or destruction. +- production_fix: symmetry requires every reverse structural pair and compares + `abs(aij-aji)` to `1e-12 * max(abs(A))`. An exactly zero matrix uses an exact + zero difference check; SparseMatrix validation remains responsible for + rejecting nonfinite values. +- failure_atomicity: solve-before-factorize, dimension mismatch, and nonfinite + RHS failures are asserted to leave the caller's solution values unchanged; + successful backend output is still copied from a private candidate only + after phase 33 and finite-result validation. +- evidence_hygiene: two intermediate symmetry RED attempts were discarded + because a concurrent clean build locked MSBuild files. The uncontended RED + above reproduced the production defect deterministically and is the recorded + evidence. +- phase_index: intentionally unchanged during this review fix; hash + `2cfb6ee5e0c49fbf6b06d27cb33ec9ac2c34dbc4`. +- supersession: this review section supersedes the original Step 20 statements + that the factorized CSR must be nonempty or that empty input is rejected. +- concerns: none; the transient build contention was resolved before recorded + RED/GREEN/VERIFY runs and no critical or upstream blocker remains. + + + +#### Step 22 Review Fix Round 1 — full-space free-residual visibility + +- review_trigger: the approved I/O contract requires Reaction at every node + and component, including the accepted free-DOF residual; the AnalysisState + storage comment likewise makes reaction a full-index residual view. +- RED-test: `cmake --build .harness/build --config Debug --target fesa_tests; + ctest --test-dir .harness/build -C Debug -R + '^ResultRecovery.EnforcesNormalizedFreeResidual$' --output-on-failure` + built successfully and exited 1 in CTest. The accepted below-tolerance free + residual was `-1.000000082740371e-09`, while its reaction entry was `0`. +- production_fix: the private reaction candidate is now a full copy of + `residual=K*d-F`. Constrained entries remain the physical reactions, free + entries retain residual evidence, and element end actions are still never + summed into reaction. +- GREEN-focused: the same focused build/test command exited 0 and passed 1/1 + after the minimum production change. +- VERIFY-build: `cmake --build .harness/build --config Debug` exited 0 under + MSVC x64 Debug with no new FESA warning. +- VERIFY-targeted: `ctest --test-dir .harness/build -C Debug -R + ResultRecovery --output-on-failure` exited 0 and passed the unchanged exact + six names 6/6. +- VERIFY-discovery-full: `ctest --test-dir .harness/build -C Debug + --show-only=json-v1` discovered 68 tests, exactly six ResultRecovery tests; + full `ctest --test-dir .harness/build -C Debug --output-on-failure` exited 0 + and passed 68/68. +- failure_atomicity: the existing tolerance-failure branch in + `ResultRecovery.EnforcesNormalizedFreeResidual` still proves prior internal, + residual, reaction, and endpoint state remains unchanged on failure. +- supersession: this review section records the historical pre-fix finding + that implementation and report originally kept only constrained residual + entries. The final Step 22 contract above now states that reaction is the + full residual dataset; only constrained entries are physical reactions. +- phase_index: the review-fix worker intentionally left phase metadata + unchanged. After independent root verification, finalization preserved exact + `started_at=2026-08-09T20:42:15+0900`, added + `completed_at=2026-08-09T21:14:47+0900`, and updated the summary to state + the corrected full-residual reaction contract. +- evidence_hygiene: an initial parallel VERIFY/audit wrapper terminated before + product commands because its PowerShell count expression was malformed. It + is excluded from TDD and product VERIFY evidence; the recorded evidence is + the subsequent uncontended serial build, targeted, discovery, full sequence + followed by a separate successful audit command. +- concerns: none; no upstream-contract conflict or critical blocker remains. + + + +#### Step 24 Review Fix Round 1 — option-token output rejection + +- review_trigger: the approved CLI contract classifies repeated `--output` + and every unknown option as usage error exit 2. The original three-argument + parser treated the value position as an arbitrary nonempty path, so an + option token could advance into input analysis instead. +- RED-repeated-option: after adding + `{missingInput,"--output","--output"}` to the existing exact + `LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic` test, + `cmake --build .harness/build --config Debug --target + fesa_integration_tests` exited 0 and the focused CTest exited 1. Actual exit + was 3 and stderr contained no `cli-usage`, rather than expected exit 2. +- GREEN-repeated-option: rejecting the literal repeated token made the same + focused test pass 1/1. +- RED-unknown-option: the reviewer then identified the general unknown-option + case. Adding `{missingInput,"--output","--bogus"}` before broadening the + production condition again produced build exit 0 and focused CTest exit 1; + actual exit was 3 with no `cli-usage`. +- production_fix: explicit output form now requires a nonempty third argument + that does not begin with `-`. Both a repeated known option and an unknown + option token are rejected before any input or output access, while ordinary + output paths retain the approved behavior. +- GREEN-focused: rebuilding `fesa_integration_tests` exited 0 under `/W4 /WX`; + the unchanged exact focused test passed 1/1 with both option cases pinned. +- independent_review: Critical 0, unresolved Important 0. The reviewer reran + exact Step 24 10/10, discovery 83, full 83/83, comparison 176 rows/16 + metrics passed, and reference diff/status clean. +- remaining_minor: the test-only comparator independently pins float64 result + file types but relies on the Step 23 writer self-check/full-suite schema test + for exact uint64 endianness and every compound member file dtype/UTF-8. This + is defense-in-depth negative coverage, not a reproducible approved-pipeline + false pass. +- remaining_minor: the inherited diagnostic sorter is not a literal + implementation of future multi-source declaration/internal-ID ordering, but + no V0 single-input CLI misordering is reproducible. +- remaining_minor: the Step 23 `libmmd.dll` guard remains unconditional across + alternate HDF5 targets; it is correct for the approved shared-HDF5 + environment and is an external portability limitation. diff --git a/docs/linear-static-3d-euler-beam/numerical-review.md b/docs/linear-static-3d-euler-beam/numerical-review.md index 88942c7..cc4780f 100644 --- a/docs/linear-static-3d-euler-beam/numerical-review.md +++ b/docs/linear-static-3d-euler-beam/numerical-review.md @@ -6,7 +6,7 @@ - source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` - source_requirements: `docs/linear-static-3d-euler-beam/requirements.md` - source_research: `docs/linear-static-3d-euler-beam/research.md` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` +- approved_design: `docs/development-history.md` - status: `pass-for-implementation-planning` - owner_agent: `numerical-review-agent` - date: `2026-08-09` diff --git a/docs/linear-static-3d-euler-beam/physics-evaluation.md b/docs/linear-static-3d-euler-beam/physics-evaluation.md deleted file mode 100644 index d80b842..0000000 --- a/docs/linear-static-3d-euler-beam/physics-evaluation.md +++ /dev/null @@ -1,268 +0,0 @@ -# Linear Static 3D Euler Beam Physics Evaluation Report - -## Metadata - -- feature_id: `linear-static-3d-euler-beam` -- model_id: `cantilever-beam-b33` -- evaluated_head: `d76d052456ec134a98bcd5aa3b3c18a6b0ad6ba4` -- source_reference_verification_report: `docs/linear-static-3d-euler-beam/reference-comparison.md` -- source_reference_model: `docs/linear-static-3d-euler-beam/reference-model.md` -- source_requirement: `docs/linear-static-3d-euler-beam/requirements.md` -- source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` -- source_numerical_review: `docs/linear-static-3d-euler-beam/numerical-review.md` -- source_io_definition: `docs/linear-static-3d-euler-beam/io.md` -- status: `pass-for-release-agent` -- owner_agent: `physics-evaluation-agent` -- date: `2026-08-09` - -This verdict means that the documented physical checks pass and the Release Agent may audit -release readiness. It does not approve release readiness and does not re-evaluate the Step 26 -reference tolerance decision. - -## Input Evidence - -The reference-verification prerequisite has status `pass-for-physics-evaluation`. Its checked -artifact identity was reproduced before the physics checks and again after the targeted CTest. - -| evidence | exact path or identity | status | notes | -| --- | --- | --- | --- | -| reference verification | `docs/linear-static-3d-euler-beam/reference-comparison.md` | pass-for-physics-evaluation | Required gate satisfied. | -| solver HDF5 | `.harness/build/reference/cantilever-beam-b33/results.h5` | present and readable | 25,336 bytes; post-acceptance-run SHA-256 `13ECCF68262C14BBDE0F63667C0F10896ACD40EFEC56E8C9121C298333FD9B6D`. | -| comparison evidence | `.harness/build/reference/cantilever-beam-b33/comparison.json` | present and passing | 128,118 bytes; SHA-256 `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D`; `passed=true`, 176 rows, 16 metrics. | -| reference input | `reference/cantilever beam/cantilever beam.inp` | exact read-only artifact | SHA-256 `E406EA9560321B791DB829E03BD24593B9875E0195D35B86BD931EDA122EF3`; `TYPE=B33`. | -| reference displacement | `reference/cantilever beam/cantilever beam displacements.csv` | exact read-only artifact | SHA-256 `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31`. | -| reference reaction | `reference/cantilever beam/cantilever beam reactions.csv` | exact read-only artifact | SHA-256 `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23`. | -| reference elemental force | `reference/cantilever beam/cantilever beam elemental forces.csv` | exact read-only artifact | SHA-256 `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA`. | -| solver CSV views | N/A | not used | No derived FESA CSV was generated or used. | -| stress reference CSV | N/A by approved contract | not applicable | `S11` is evaluated from HDF5 schema, formulation, and analytical/unit evidence only. | -| targeted physics tests | `.harness/build`, MSVC x64 Debug | pass | Exact Step 27 CTest passed 17/17: EulerBeam3D 10, ResultRecovery 6, B33ReferenceComparison 1. | - -Read-only HDF5 inspection confirmed schema `0`, solver `0.1.0`, feature identity, `Step-1` frame -`0`, formulation `B33-3D-Euler-Bernoulli`, source content identity -`fnv1a64:04543464cc970405`, and coordinate convention -`global-cartesian; beam-local=(t,n1,t-cross-n1)`. The file contains 11 nodes at -`(x,y,z)=(0..10,0,0)` m and 10 consecutive one-metre elements. Every element has identity local -axes, so local `(x,y,z)` equals global `(X,Y,Z)` for this model. - -The documented physical model is a 10 m cantilever with node 1 fixed in all six DOFs and a -free-end global/local `FZ=-1.0e6 N` at node 11. The section and material are SI: -`E=2.1e11 Pa`, `Iy=I11=0.0833333 m^4`, and the only expected deformation mode is local-`z` -translation with bending about local `y`. - -## Physics Checks - -All normalized physics criteria below come from the approved `1e-10` residual/equilibrium, -`1e-12` matrix/transform/end-sign, or `1e-9` analytical contracts. They are independent checks of -physical meaning, not a second application of the Abaqus row tolerance. - -### 1. global equilibrium - -In global Cartesian coordinates, force equilibrium is - -`r_F = sum(F_applied) + sum(R)`, - -with criterion - -`||r_F|| / max(||sum(F_applied)||, ||sum(R)||) <= 1e-10`. - -The comparison physics evidence records `sum(F_applied)=[0,0,-1000000] N` and -`sum(R)=[0,0,999999.9999998808] N`. Therefore -`r_F=[0,0,-1.1920928955078125e-7] N`, its norm is -`1.1920928955078125e-7 N`, and the normalized value is -`1.1920928955078125e-13`. Verdict: **pass**. - -Moment equilibrium about the global origin is - -`r_M = sum(M_applied) + sum(X cross F_applied) + sum(M_reaction) + sum(X cross R_force)`. - -The free-end force gives `[0,1.0e7,0] N*m`; the complete HDF5 reaction field gives -`[0,-9999999.999997258,0] N*m`. Thus `r_M=[0,2.7418136596679688e-6,0] N*m`, -with normalized norm `2.7418136596679688e-13` against `1.0e7 N*m`. Verdict: **pass**. - -### 2. reaction consistency and true free residual - -The constrained reaction contract is `R_c=(K*d-F)_c`. At fixed node 1 the observed global row is -`[RF1,RF2,RF3,RM1,RM2,RM3] = [0,0,1000000.0000008196,0,-10000000.000005051,0]` -in `[N,N,N,N*m,N*m,N*m]`. It opposes the applied `-Z` force and balances its positive origin -moment. Differences from the physical closed-form reactions are `8.195638656616211e-7 N` and -`5.0514936447143555e-6 N*m`, normalized to `8.195638656616211e-13` and -`5.0514936447143555e-13`. Verdict: **pass**. - -The reaction dataset intentionally preserves free residuals. The implementation uses - -`rho_f = ||(K*d-F)_f||_2 / max(||K*d||_f, ||F||_f)` - -with no artificial unit floor. The serialized true free residual norm is -`9.356339321107032e-7 N-equivalent`; the physical free scale is `1.0e6 N`, so -`rho_f=9.356339321107032e-13 <= 1e-10`. The largest observed free force-residual component is -`5.9604644775390625e-7 N`, and the largest free moment-residual component is -`2.0861625671386719e-7 N*m`. Verdict: **pass**. - -### 3. displacement direction and rotation sign - -For free-end local `Pz=-1.0e6 N`, the documented Euler-Bernoulli solution is - -`w(L)=Pz*L^3/(3*E*Iy)`, `theta_y(L)=-Pz*L^2/(2*E*Iy)`. - -The expected values are `-0.0190476266666697 m` and `+0.00285714400000046 rad`. -HDF5 gives tip `UZ=-0.019047626666677083 m` and `URY=+0.0028571440000013902 rad`, with relative -errors `3.87e-13` and `3.27e-13`, below the analytical `1e-9` criterion. All non-root `UZ` values -are negative and monotonically increase in magnitude toward the loaded tip; all non-root `URY` -values are positive, as required by `theta_y=-dw/dx`. Verdict: **pass**. - -### 4. expected zero and uncoupled symmetry - -The fixed-root displacement row is exactly zero in all six components. Across all nodes, -`UX`, `UY`, `URX`, and `URZ` are exactly zero. The only nonzero kinematic components are `UZ` and -`URY`, and the only physical constrained reactions are `RF3` and `RM2`. In the element recovery, -`epsilon0`, `kappa_x`, and `kappa_z`, and the corresponding `N`, `T`, and `Mz`, are exactly zero. -This is the documented uncoupled local-`z` bending symmetry, with no axial, torsional, or -cross-plane leakage. Verdict: **pass**. - -### 5. element force, adjacent endpoints, and boundary balance - -The HDF5 `end_force_local` rows are outward endpoint actions in -`[FX,FY,FZ,MX,MY,MZ]`; `section_resultant` rows are positive-local-`x` section cuts in -`[N,T,My,Mz]`. With no distributed load, - -`F_X=n*N`, `M_X=n*T`, `M_Y=n*My`, `M_Z=n*Mz`, -`F_Y=-n*dMz/dx`, and `F_Z=n*dMy/dx`, where `n=-1` at `xi=-1` and `n=+1` at `xi=+1`. - -Observed section `My` is positive and decreases linearly from -`10000000.000005048 N*m` at the root to `2.4286118949223834e-7 N*m` at the free end. The maximum -positive-face `My` mismatch between adjacent unloaded endpoints is -`2.73110345005989e-7 N*m`, normalized to `2.73110345005989e-14` against the model moment scale. -The comparison ledger independently records `endpoint_consistency_passed=true` without averaging. - -Adjacent outward actions cancel. The maximum interior `FZ_right+FZ_left` magnitude is -`5.364418029785156e-7 N` (`5.364418029785156e-13` normalized); the maximum interior -`MY_right+MY_left` magnitude is `2.682209014892578e-7 N*m` -(`2.682209014892578e-14` normalized). Both satisfy the documented end-sign/residual criteria. - -At the root, the first element action is exactly the constrained reaction evidence: -`FZ=+1000000.0000008196 N`, `MY=-10000000.000005051 N*m`. At the free boundary, the last element -has `FZ=-999999.9999998808 N` and `MY=-5.9604644775390625e-8 N*m`, balancing the applied end force -and the zero applied end moment to normalized residual scale. Verdict: **pass**. - -### 6. local/global mapping and section-force signs - -Every stored local-axis matrix is the identity. Therefore the global `-Z` load is local -`Pz=-1.0e6 N`, `UZ=w<0`, `URY=theta_y>0`, and the positive-face section resultant is -`My=-Pz*(L-x)>0`. The observed outward signs are `FZ>0, MY<0` at left endpoints and -`FZ<0, MY>0` at right endpoints, except for the physically zero free-end moment residue. These -values satisfy the documented `theta_y=-w'`, `My=-E*Iy*w''`, outward-normal, and -positive-face-section-cut conventions. Verdict: **pass**. - -### 7. stress location, unit, and sign sanity - -The stress contract is - -`S11(xi,y,z)=E*(epsilon0 + z*kappa_y - y*kappa_z)`, - -where `x1=y`, `x2=z`, the coordinate system is beam local, the unit is `force/length^2`, and the -location is a section point at each of two Gauss points. The reference input has no section -points, so HDF5 correctly contains 20 ordered `fesa-default` centroid rows -`(x1,x2)=(0,0)`, one at each Gauss point of ten elements. This model has pure bending with -`epsilon0=0`; consequently all 20 observed centroid `S11` values are exactly `0 Pa`. - -Nonzero location/sign evidence comes only from the approved analytical/unit portfolio, not from -an Abaqus stress comparison. `EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11` passed with -`epsilon0=0.01`, `kappa_y=0.02 1/m`, `kappa_z=-0.03 1/m`, `E=2.1e11 Pa`: the formula gives -`1.575e9 Pa` at `(y,z)=(0.25,-0.5)`, `8.4e8 Pa` at `(-0.4,0.3)`, and `2.1e9 Pa` at the default -centroid. The test enforces the formula at both Gauss points with normalized `1e-12` evidence. -Abaqus beam stress comparison remains explicitly N/A. Verdict: **pass**. - -### 8. nonfinite, rigid-body, abnormal-magnitude, and energy symptoms - -All mandatory numeric HDF5 rows inspected here are finite; `comparison.json` also records no -nonfinite row among the 176 compared rows and the 20 stress rows are finite. The fixed root is -exactly zero, factorization/solution completed, the normalized free residual is `9.36e-13`, and -the displacement field is smooth, so there is no rigid-body-mode symptom. - -For this one-load linear case, the recoverable strain energy is -`U=0.5*F^T*d=9523.81333333854 N*m`, which is finite and positive. The ratios -`|UZ_tip|/L=0.00190476266666771` and `|URY_tip|=0.00285714400000139 rad` agree with the analytical -solution and show no abnormal magnitude relative to the documented small-displacement/rotation -model. The targeted rank/energy test also passed the six-rigid-mode, rank-six, and positive -deformation-energy checks. Verdict: **pass**. - -### 9. model coverage - -The approved B33 bundle is one identity-axis local-`z` bending cantilever. It directly covers the -end-to-end parser/solver/HDF5 path, global equilibrium, reaction sign, `UZ/URY`, `My/FZ`, endpoint -continuity, and the centroid stress fallback. It does not by itself cover axial, torsion, local-`y` -bending, rotated space, nonzero fiber stress, prescribed displacement, or the formulation-only -line-load kernel. The targeted analytical/unit portfolio supplies the documented complementary -coverage: - -| coverage | targeted passing evidence | criterion | -| --- | --- | --- | -| axial, torsion, both bending planes | `EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover` and `ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns` | analytical relative `1e-9`; signed recovery contract | -| rotated local/global mapping | `EulerBeam3D.RotatedTransformPreservesWorkAndEnergy` | transform/work/energy normalized `1e-12` | -| constant local line-load kernel | `EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents` | all 12 signed components normalized `1e-12`; `*DLOAD` remains outside CLI scope | -| rigid modes, rank, and energy | `EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy` | rigid residual `1e-10`, rank six, positive deformation energy | -| prescribed displacement and residual | `ResultRecovery.ComputesResidualReactionForNonzeroPrescription`, `ResultRecovery.EnforcesNormalizedFreeResidual` | partition/reaction and normalized residual `1e-10` | -| result identity and continuity | `ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct`, `ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging` | distinct locations and no-average consistency | -| S11 location/sign/default | `EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11`, `ResultRecovery.OrdersStressPointsAndDefaultCentroid` | formula/schema normalized `1e-12` | - -The exact acceptance command passed all 17 selected tests. The single reference model plus this -analytical portfolio covers every documented physical expectation without attributing unsupported -coverage to the legacy CSV bundle. Verdict: **pass**. - -## Failure Classification - -- classification: `N/A` -- primary_failure: `N/A` -- evidence: all documented physics checks passed; no equilibrium, reaction, displacement, - symmetry, element-force, stress-location, rigid-body, nonfinite, coverage, contract, or - environment failure was found -- correction_handoff: `N/A` - -## Evaluation Verdict - -- verdict: `pass-for-release-agent` -- reason: the exact reference gate and artifact identity are valid; force and origin-moment - equilibrium, constrained reaction consistency, true free residual, deformation signs, expected - zeros, element force balance, local/global and section-force signs, S11 schema/analytical sanity, - finite/energy/mode checks, and complementary model coverage all satisfy their documented criteria -- release_approval: `not granted by this report` - -## Handoff Recommendation - -| target_agent | reason | required_input | -| --- | --- | --- | -| Release Agent | All documented physical checks passed. | This report, the Step 26 reference-verification report, exact build-local HDF5/comparison identities, targeted CTest evidence, and the limitations below. | - -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_modified: `false` -- formulations_modified: `false` -- numerical_review_modified: `false` -- io_contract_modified: `false` -- reference_model_contract_modified: `false` -- reference_verification_report_modified: `false` -- reference_artifacts_modified: `false` -- tolerance_policies_modified: `false` -- Abaqus_or_other_reference_solver_executed: `false` -- owned_report_created: `true` -- phase_index_step27_modified: `true` -- notes: HDF5, comparison JSON, and legacy reference artifacts were inspected read-only; the only - generated files were the ignored build-local evidence regenerated by the exact approved CTest. - -## Open Issues - -- Non-blocking coverage limitation: the approved Abaqus bundle is one identity-axis local-`z` - bending cantilever. Axial, torsion, local-`y`, rotated, prescribed-displacement, line-load, and - nonzero stress checks rely on the approved analytical/unit portfolio; no broader Abaqus reference - coverage is claimed. -- Non-blocking stress limitation: the B33 bundle has no section points, so its physical `S11` - evidence is the correct zero centroid result. Nonzero fiber location/sign evidence is analytical; - Abaqus beam stress comparison remains N/A. -- Non-blocking output limitation: HDF5 has no strain-energy dataset by contract. The positive energy - value in this report is calculated from `0.5*F^T*d` and is supported by the rank/energy unit test. -- Known formulation limitations remain: Euler-Bernoulli deep-beam applicability, transverse and - torsional shear stress, warping, `I12!=0`, B31/Timoshenko behavior, and CLI `*DLOAD` are outside V0. -- No open issue blocks Release Agent review. diff --git a/docs/linear-static-3d-euler-beam/reference-comparison.md b/docs/linear-static-3d-euler-beam/reference-comparison.md deleted file mode 100644 index 2af8948..0000000 --- a/docs/linear-static-3d-euler-beam/reference-comparison.md +++ /dev/null @@ -1,331 +0,0 @@ -# Linear Static 3D Euler Beam Reference Verification Report - -## Metadata - -- feature_id: `linear-static-3d-euler-beam` -- model_id: `cantilever-beam-b33` -- source_head: `451d9077ea70e3087454db3760e677da0095d27f` -- source_build_test_report: `docs/linear-static-3d-euler-beam/build-test.md` -- source_reference_models: `docs/linear-static-3d-euler-beam/reference-model.md` -- source_io_definition: `docs/linear-static-3d-euler-beam/io.md` -- source_implementation_plan: `docs/linear-static-3d-euler-beam/implementation-plan.md` -- source_implementation_report: `docs/linear-static-3d-euler-beam/implementation-report.md` -- historical_status: `pass-for-physics-evaluation` -- current_status: `pass-for-physics-evaluation` -- superseded_on: `2026-08-18` -- revalidated_on: `2026-08-18` -- owner_agent: `reference-verification-agent` -- date: `2026-08-09` -- review_fix_date: `2026-08-10` - -The 2026-08-09 evidence below is preserved as a historical record of the former 11-station, -component-scale comparison. ADR-022 and the regenerated 20-row element-endpoint CSV supersede -that identity and tolerance. The following revalidation is the current reference-gate evidence. - -## 2026-08-18 Common-policy Revalidation - -`cmake --build .harness/build --config Debug` passed, followed by -`ctest --test-dir .harness/build -C Debug --output-on-failure`: 214/214 tests passed. -The B33 reference test generated -`.harness/build/reference/cantilever-beam-b33/comparison.json` from the exact read-only -reference paths. - -- exact canonical rows: 212 = 66 displacement + 66 reaction + 80 direct element-endpoint - section-resultant rows -- exact families: 6; all row gates and family RMS gates passed -- direct section identity: 20 endpoint rows, 10 B33 elements x 2 connectivity-matched endpoints -- warnings, identity/schema/nonfinite failures: 0 -- overall verdict: `passed=true` - -| family | rows | scale | near-zero rows | max absolute error | scale-relative RMS | -| --- | ---: | ---: | ---: | ---: | ---: | -| translation `UX/UY/UZ` | 33 | `1.90476272e-2` | 23 | `5.333229170789711e-10` | `8.459623217000381e-9` | -| rotation `URX/URY/URZ` | 33 | `2.85714399e-3` | 23 | `1.000013943180944e-10` | `1.1723557271997219e-8` | -| reaction force `RF1/RF2/RF3` | 33 | `1.0e6` | 32 | `8.195638656616211e-7` | `2.0922817757699256e-13` | -| reaction moment `RM1/RM2/RM3` | 33 | `1.0e7` | 32 | `5.0514936447143555e-6` | `8.811160558471221e-14` | -| section force `N` | 20 | `0` | 20 | `0` | `0` | -| section moment `T/My/Mz` | 60 | `1.0e7` | 41 | `1.2499958951957524e-1` | `2.2910664449287597e-9` | - -All values above come from the generated JSON ledger. The historical report body starts below -and must not be read as the current identity/tolerance evidence. - -The prerequisite build/test report has status -`pass-for-reference-verification`. This report applies only the approved Abaqus -B33 reference tolerance. It does not approve physics sanity or release readiness. - -## Artifact Inventory - -The approved B33 exception overrides the generic new-bundle inventory. The exact -four legacy files with spaces are the complete read-only reference bundle; -`metadata.json` is absent-allowed under project-wide policy, while `README.md` and a -stress CSV are contractually N/A and are not missing artifacts. - -| item | exact path | status | direct audit evidence | -| --- | --- | --- | --- | -| reference directory | `reference/cantilever beam/` | present, exact inventory | Four regular files only; no extra entry. | -| reference input | `reference/cantilever beam/cantilever beam.inp` | present, valid | 2,330 bytes; exactly one `*ELEMENT, TYPE=B33` declaration at line 21. | -| displacement CSV | `reference/cantilever beam/cantilever beam displacements.csv` | present, valid | Exact 9-column CAE header; 11 unique rows; 66 finite values. | -| reaction CSV | `reference/cantilever beam/cantilever beam reactions.csv` | present, valid | Exact 9-column CAE header; 11 unique rows; 66 finite values. | -| elemental-force CSV | `reference/cantilever beam/cantilever beam elemental forces.csv` | present, valid | Exact 7-column CAE header; 11 unique rows; 44 finite values. | -| optional metadata | `reference/cantilever beam/metadata.json` | absent-allowed | Approved design, ADR-010, I/O definition, and reference-model contract supply provenance; absence is not a missing artifact. | -| legacy README | `reference/cantilever beam/README.md` | N/A | Approved B33 legacy exception. | -| reference stress CSV | N/A | N/A | Abaqus beam-stress comparison is outside the approved V0 scope. | -| authoritative solver output | `.harness/build/reference/cantilever-beam-b33/results.h5` | present, valid | 25,336 bytes; generated by the fresh exact CTest; HDF5 schema inspected read-only with HDF5 2.1.1 utilities. | -| comparison ledger | `.harness/build/reference/cantilever-beam-b33/comparison.json` | present, valid | 128,118 bytes; 176 row decisions, 16 component metrics, and `passed=true`. | -| solver debug CSV view | N/A | N/A | No derived FESA CSV was generated or used. | - -### Reference hashes - -Fresh pre-comparison and post-comparison SHA-256 values were identical: - -| exact approved legacy path | SHA-256 | -| --- | --- | -| `reference/cantilever beam/cantilever beam.inp` | `E406EA9560321B791DBDB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | -| `reference/cantilever beam/cantilever beam displacements.csv` | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | -| `reference/cantilever beam/cantilever beam reactions.csv` | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | -| `reference/cantilever beam/cantilever beam elemental forces.csv` | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | - -`git diff --exit-code -- reference/` exited 0 and -`git status --short -- reference/` was empty after both comparison runs. - -### Authoritative HDF5 audit - -`h5ls` and `h5dump` opened `results.h5` read-only and established: - -- schema version `0`, solver version `0.1.0`, feature - `linear-static-3d-euler-beam`, formulation `B33-3D-Euler-Bernoulli`, - `Step-1`, and frame `0`; -- metadata unit label `user-consistent-unspecified`, as required for ordinary - `.inp` interpretation; the approved reference-model contract supplies the - external SI provenance used by this comparison; -- coordinate convention - `global-cartesian; beam-local=(t,n1,t-cross-n1)`; -- source identity - `path=C:/Users/baram/orca/workspaces/FESADev/LinearStatic/reference/cantilever beam/cantilever beam.inp;content_identity=fnv1a64:04543464cc970405`; - a fresh FNV-1a calculation of the input bytes reproduced - `04543464cc970405`; -- 11 nodes with stable internal IDs 0 through 10, source labels 1 through 11, - instance `PART-1_1-1`, global coordinates `(0..10,0,0)`; -- 10 elements with stable IDs 0 through 9, source labels 1 through 10, - consecutive connectivity and identity local axes; -- displacement and reaction shapes `[11,6]`, section-resultant shape - `[10,2,4]`, exact component/unit/coordinate/location attributes, and finite - float64 values; -- mandatory `stress_s11` compound schema with 20 finite rows (10 elements x 2 - Gauss points), `S11`, `force/length^2`, beam-local section-point attributes, - and the required `fesa-default` centroid identity. - -Only `results.h5` and `comparison.json` exist in the build-local evidence -directory. - -## Comparison Contract - -- reference_csv_schema_version: `abaqus-cae-report-csv-v0` -- hdf5_schema_version: `0` -- model / frame normalization: CSV - `Increment 1: Step Time = 1.000` -> `(cantilever-beam-b33, Step-1, frame 0)` -- id_matching: exact preserved `instance_name` plus source node label; - section-resultant endpoints project to an eligible source-node station -- row-set policy: expected canonical keys are all 11 nodes crossed with 6 - displacement, 6 reaction, and 4 section-resultant components -- displacement normalization: - `U-U1/U-U2/U-U3/UR-UR1/UR-UR2/UR-UR3` -> - `UX/UY/UZ/URX/URY/URZ` -- reaction normalization: - `RF-RF1/RF-RF2/RF-RF3/RM-RM1/RM-RM2/RM-RM3` -> - `RF1/RF2/RF3/RM1/RM2/RM3` -- section normalization: `SF-SF1 -> N`, `SM-SM1 -> My`, - `SM-SM2 -> Mz`, `SM-SM3 -> T` -- coordinates: global Cartesian for nodal quantities; beam local for section - resultants -- output locations: nodal displacement/reaction and positive-local-x endpoint - section cut projected to node station -- interior-node policy: both incident endpoints must first pass the approved - component tolerance; the smaller stable element ID is selected without - averaging -- tolerance source: requirements 036-039, ADR-014, approved I/O definition, - and reference-model contract -- tolerance policy: `absolute_floor + 1e-6 * reference_scale` -- reference scale: maximum absolute value from read-only Abaqus rows in the - same model, step/frame, quantity, and component only -- SI floors: `1e-9` for displacement/rotation and `1e-3` for force/moment; - zero scale uses the floor alone -- fail-before-tolerance conditions: missing, extra, duplicate, nonfinite, - schema-mismatched, or identity-mismatched row -- zero-reference policy: no zero clamp, deletion, substitution, or omission - -The complete expected set of 176 canonical keys was reconstructed independently -from the contract and matched the 176 unique ledger rows exactly. The 16 expected -quantity/component keys matched the 16 unique metrics. Every serialized absolute -error, tolerance, pass decision, Abaqus-only reference scale, maximum error, -maximum tolerance-normalized error, RMS error, norm error, and worst-row index was -recalculated from the row ledger and matched exactly. Missing rows, extra rows, -duplicate rows, nonfinite rows, and failed rows were all zero. - -The authoritative TASK-24 `ComparisonReport`, test contract, serialized JSON, and -Step 26 acceptance probe all define the verdict as the boolean `passed`. Final -review reproduced that the former `$metrics.status` sample failed against the valid -artifact, corrected the phase probe to `$metrics.passed -eq $true`, and reran the -exact acceptance chain successfully. The generated JSON has `passed=true`. - -## Execution Evidence - -The exact command was run twice after the artifact precheck: - -```powershell -ctest --test-dir .harness/build -C Debug -R B33ReferenceComparison -V --output-on-failure -``` - -Both executions passed the single exact test -`B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence` 1/1. -Each run reset only `.harness/build/reference/cantilever-beam-b33/` and regenerated -the same two build-local files. The comparison ledger was byte deterministic on -both runs: - -- size: `128118` bytes -- SHA-256: `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` -- verdict: `passed=true` - -`results.h5` remains the authoritative solver output. The JSON is deterministic -review evidence derived directly from HDF5 and the read-only Abaqus CSV rows. - -## Quantity Results - -`maximum_relative_error` below is calculated only where the Abaqus reference is -nonzero. It is reported for audit completeness, but it is not the acceptance -rule: near-zero Abaqus residues make row-relative error ill-conditioned. The -approved component-scale normalized error is `absolute_error / row_tolerance`. - -| quantity | FESA HDF5 dataset | reference CSV | compared | missing | extra | nonfinite | max abs error | max relative error | max tolerance-normalized error | RMS error | norm error | worst ID/component by abs error | result | -| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | -| displacement | `/steps/Step-1/frames/0/nodal/displacement` | `reference/cantilever beam/cantilever beam displacements.csv` | 66 | 0 | 0 | 0 | `5.333229170789711e-10` | `1.0` | `0.026602795021994977` | `1.1637590907608428e-10` | `9.454423547085314e-10` | node 11 / `UZ` | pass | -| reaction | `/steps/Step-1/frames/0/nodal/reaction` | `reference/cantilever beam/cantilever beam reactions.csv` | 66 | 0 | 0 | 0 | `5.0514936447143555e-6` | `8.195638656616211e-13` | `8.187451205410801e-7` | `6.403678373262425e-7` | `5.202372903532068e-6` | node 1 / `RM2` | pass | -| section resultant | `/steps/Step-1/frames/0/element/section_resultant` | `reference/cantilever beam/cantilever beam elemental forces.csv` | 44 | 0 | 0 | 0 | `1.5600242861189492e-2` | `1.0000155680249674` | `0.0015598682992890203` | `0.0023518254339534184` | `0.015600245073676508` | node station 11 / `My` | pass | -| stress | `/steps/Step-1/frames/0/element/stress_s11` | N/A | N/A | N/A | N/A | 0 in 20 mandatory HDF5 rows | N/A | N/A | N/A | N/A | N/A | N/A | N/A for Abaqus comparison; HDF5 requirement passed | - -The displacement row-relative maximum occurs at node 1 `UZ`, where the stored -reference residue is `-1e-30`; the section row-relative maximum occurs at free-end -`My`, where the stored reference residue is `-1.56e-2`. Neither row was clamped or -omitted. Their approved mixed-tolerance decisions pass. - -### Component metrics - -Each group contains 11 matched rows. `worst_row` is the zero-based index in the -deterministic JSON row ledger. - -| quantity | component | reference scale | row tolerance | max abs error | max normalized error | RMS error | norm error | worst row | worst identity | result | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | -| displacement | `UX` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 0 | node 1 / `UX` | pass | -| displacement | `UY` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 1 | node 1 / `UY` | pass | -| displacement | `UZ` | `0.0190476272` | `2.00476272e-8` | `5.333229170789711e-10` | `0.026602795021994977` | `2.790953046857666e-10` | `9.256544063926071e-10` | 62 | node 11 / `UZ` | pass | -| displacement | `URX` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 3 | node 1 / `URX` | pass | -| displacement | `URY` | `0.00285714399` | `3.85714399e-9` | `1.000013943180944e-10` | `0.025926279801157852` | `5.801658540511775e-11` | `1.924192454063848e-10` | 52 | node 9 / `URY` | pass | -| displacement | `URZ` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 5 | node 1 / `URZ` | pass | -| reaction | `RF1` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 66 | node 1 / `RF1` | pass | -| reaction | `RF2` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 67 | node 1 / `RF2` | pass | -| reaction | `RF3` | `1e6` | `1.001` | `8.195638656616211e-7` | `8.187451205410801e-7` | `3.6239383393839433e-7` | `1.2019243735120167e-6` | 68 | node 1 / `RF3` | pass | -| reaction | `RM1` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 69 | node 1 / `RM1` | pass | -| reaction | `RM2` | `1e7` | `10.001` | `5.0514936447143555e-6` | `5.05098854585977e-7` | `1.5261377760919117e-6` | `5.061626381684292e-6` | 70 | node 1 / `RM2` | pass | -| reaction | `RM3` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 71 | node 1 / `RM3` | pass | -| section resultant | `N` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 132 | node 1 / `N` | pass | -| section resultant | `T` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 133 | node 1 / `T` | pass | -| section resultant | `My` | `1e7` | `10.001` | `0.015600242861189492` | `0.0015598682992890203` | `0.004703650867906837` | `0.015600245073676508` | 174 | node 11 / `My` | pass | -| section resultant | `Mz` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 135 | node 1 / `Mz` | pass | - -The largest normalized comparison error across all 176 rows is -`0.026602795021994977` at node 11 `UZ`, below the pass boundary of `1.0`. - -### Row decision ledger - -Every row decision is recorded in the deterministic build-local -`comparison.json` identified above. Its stable row order is displacement nodes -1-11 x six components, reaction nodes 1-11 x six components, then section node -stations 1-11 x `[N,T,My,Mz]`. Independent parsing confirmed: - -- rows: 176 -- unique canonical row keys: 176 -- row decisions with `passed=true`: 176 -- row decisions with `passed=false`: 0 -- finite FESA/reference/error/tolerance records: 176 -- missing / extra / duplicate / identity-mismatched rows: 0 / 0 / 0 / 0 -- metrics: 16 unique expected component groups - -## Stress Reference Status - -- Abaqus stress reference comparison: N/A -- reason: the approved V0 reference contract excludes beam-stress CSV - comparison and substitutes analytical/unit plus HDF5 schema evidence -- mandatory solver stress output: pass -- direct evidence: `stress_s11` exists with the exact compound schema, exact - unit/coordinate/location attributes, two Gauss rows for each of ten elements, - finite `S11`, and deterministic element/Gauss ordering - -No stress reference row was synthesized, and mandatory HDF5 stress was not -treated as optional. - -## Physics Evidence Handoff - -The comparator serialized the following evidence for independent Step 27 review: - -| evidence | value | -| --- | --- | -| free residual norm | `9.356339321107032e-7` | -| applied force | `[0, 0, -1000000]` | -| reaction force | `[0, 0, 999999.9999998808]` | -| applied moment about origin | `[0, 10000000, 0]` | -| reaction moment about origin | `[0, -9999999.999997258, 0]` | -| endpoint consistency | `passed=true` | - -These values are handed off as evidence only. This Step does not interpret them -as a physics-sanity verdict. - -## Failure Classification - -- classification: `N/A` -- primary_failure: `N/A` -- evidence: artifact precheck passed; exact comparison CTest passed twice; - 176/176 rows and 16/16 metric groups passed; no schema, identity, unit, - coordinate, nonfinite, missing/extra, or tolerance failure was found -- correction_handoff: `N/A` - -## Handoff Recommendation - -| target_agent | reason | required input | -| --- | --- | --- | -| Physics Evaluation Agent | All required reference comparisons passed the exact approved tolerance. | This report, authoritative build-local `results.h5`, deterministic `comparison.json`, and its `physics_evidence`. | - -The handoff status is `pass-for-physics-evaluation` only. Physics sanity remains -responsible for global force/moment equilibrium, reaction sign, displacement -direction, symmetry, section-force consistency, residual interpretation, and -model-coverage adequacy. - -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_modified: `false` -- formulations_modified: `false` -- io_contract_modified: `false` -- reference_model_contract_modified: `false` -- reference_artifacts_modified: `false` -- tolerance_policies_modified: `false` -- Abaqus_or_other_reference_solver_executed: `false` -- owned_report_created: `true` -- phase_index_step26_modified: `true` -- phase_step26_acceptance_modified_for_review_fix: `true` -- phase_index_step26_summary_modified_for_review_fix: `true` -- generated_build_local_evidence: `true`, ignored under `.harness/build/` -- notes: comparison and HDF5 inspection were read-only with respect to the - approved reference bundle; the final review fix changed only acceptance/report/index - documentation, and pre/post hashes, Git diff, and Git status agree - -## Open Issues - -- Non-blocking evidence typo: the Step 25 build/test report prints the input - SHA-256 without the second `DB` after `...1DB`; the fresh 64-character pre/post - value in this report matches the unchanged working-tree file. Reference Git - diff/status and the end-to-end reference snapshot check are clean. -- Resolved final-review finding: the Step 26 acceptance probe now reads the - authoritative boolean `passed`, and its exact command passes on the current artifact. -- No issue blocks Physics Evaluation. diff --git a/docs/linear-static-3d-euler-beam/reference-model.md b/docs/linear-static-3d-euler-beam/reference-model.md index f1277d5..17ab58e 100644 --- a/docs/linear-static-3d-euler-beam/reference-model.md +++ b/docs/linear-static-3d-euler-beam/reference-model.md @@ -8,7 +8,7 @@ - source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` - source_numerical_review: `docs/linear-static-3d-euler-beam/numerical-review.md` - source_io_definition: `docs/linear-static-3d-euler-beam/io.md` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` +- approved_design: `docs/development-history.md` - status: `ready-for-implementation-planning` - owner_agent: `reference-model-agent` - date: `2026-08-09` diff --git a/docs/linear-static-3d-euler-beam/release.md b/docs/linear-static-3d-euler-beam/release.md index 6963d9a..2f63e20 100644 --- a/docs/linear-static-3d-euler-beam/release.md +++ b/docs/linear-static-3d-euler-beam/release.md @@ -1,20 +1,24 @@ # Linear Static 3D Euler Beam Release Report +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + ## Metadata - feature_id: `linear-static-3d-euler-beam` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` (`status: approved`; approved 2026-08-08, amended 2026-08-09) +- approved_design: `docs/development-history.md` (`status: approved`; approved 2026-08-08, amended 2026-08-09) - source_requirement: `docs/linear-static-3d-euler-beam/requirements.md` - source_research: `docs/linear-static-3d-euler-beam/research.md` - source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` - source_numerical_review: `docs/linear-static-3d-euler-beam/numerical-review.md` - source_io_definition: `docs/linear-static-3d-euler-beam/io.md` - source_reference_model: `docs/linear-static-3d-euler-beam/reference-model.md` -- source_implementation_plan: `docs/linear-static-3d-euler-beam/implementation-plan.md` -- source_implementation_report: `docs/linear-static-3d-euler-beam/implementation-report.md` -- source_build_test_report: `docs/linear-static-3d-euler-beam/build-test.md` -- source_reference_verification_report: `docs/linear-static-3d-euler-beam/reference-comparison.md` -- source_physics_evaluation_report: `docs/linear-static-3d-euler-beam/physics-evaluation.md` +- source_implementation_plan: `docs/linear-static-3d-euler-beam/README.md` +- source_implementation_report: `docs/linear-static-3d-euler-beam/lessons.md` +- source_build_test_report: `docs/linear-static-3d-euler-beam/verification.md` +- source_reference_verification_report: `docs/linear-static-3d-euler-beam/verification.md` +- source_physics_evaluation_report: `docs/linear-static-3d-euler-beam/verification.md` - audited_head: `822b06be3d2128d5dfdc5e394078abbb9dcd5a50` - reference_model_id: `cantilever-beam-b33` - reference_schema: `abaqus-cae-report-csv-v0` @@ -22,7 +26,6 @@ - historical_status: `ready-for-release` - current_status: `superseded-pending-revalidation` - superseded_on: `2026-08-18` -- owner_agent: `release-agent` - date: `2026-08-10` - final_review_source_head: `b7a1258ce0f36a85b888e23470cf9d936a7595cd` @@ -33,140 +36,6 @@ verdict may be issued. This is an internal feature-readiness verdict. It authorizes no publish, deploy, package, tag, push, external release, or reference-artifact operation. -## Release Scope - -| item | included | excluded | notes | -| --- | --- | --- | --- | -| analysis | one small-displacement/small-rotation `*STEP, *STATIC` linear solve | multiple steps; geometric/material nonlinearity; dynamics; contact; thermal | Stiffness/partition and `Kff` factorization precede load assembly, effective RHS, and substitution. | -| element | straight, prismatic, two-node 3D Euler-Bernoulli beam mapped only from `TYPE=B33` | `TYPE=B31`, shear-deformable/Timoshenko, curved/tapered/released/offset/warping members | Axial, two-plane bending, and Saint-Venant torsion are included. | -| material/section | homogeneous isotropic linear elasticity; positive `E,G,A,Iy,Iz,J`; `I12=0` | `I12!=0`, anisotropy, plasticity, temperature dependence, warping data | Mapping is `n1 -> local y`, `t x n1 -> local z`, `Iy=I11`, `Iz=I22`. | -| Abaqus input subset | approved keyword inventory, identity part/assembly/instance wrappers, `*BOUNDARY`, nodal `*CLOAD` | full compatibility, instance transforms, nested assembly, dependent/independent mesh semantics, `*DLOAD` | Approved output-request allowlist is warning no-op and cannot filter FESA output. | -| solver/storage | deterministic COO-to-0-based-CSR, oneTBB element-local work, oneMKL PARDISO SPD factorization/substitution | alternate solver claims, automatic regularization, unsupported conditioning policy | Backend types remain behind adapters. | -| authoritative output | HDF5 `results.h5`: displacement, reaction, equilibrium end action, section/generalized results, axial `S11`, metadata, diagnostics | official FESA CSV output; transverse/torsional shear stress; warping stress; nodal stress averaging | Beam stress reference comparison is N/A; `S11` remains mandatory and is analytically/schema tested. | -| reference comparison | exact read-only legacy B33 four-file bundle; displacement, reaction, section resultant | Abaqus stress CSV; broad B33 compatibility; reference solver execution | 176/176 rows and 16/16 metrics passed the approved mixed tolerance. | - -## Gate Evidence Inventory - -| gate | source | expected status | observed status/evidence | verdict | -| --- | --- | --- | --- | --- | -| approved design | approved design | `approved` | `approved`; same feature and legacy baseline | pass | -| requirements | requirements baseline | `approved` | `approved`; 44 consecutive `must` rows | pass | -| research | research brief | `ready-for-formulation` | `ready-for-formulation`; applicability limits retained | pass | -| formulation | formulation document | `ready-for-numerical-review` | `ready-for-numerical-review`; exact requirement/design links | pass | -| numerical review | numerical review | `pass-for-implementation-planning` | `pass-for-implementation-planning`; no confirmed mathematical defect | pass | -| I/O definition | I/O contract | `ready-for-implementation-planning` | `ready-for-implementation-planning` | pass | -| reference model | reference-model contract | `ready-for-implementation-planning` | legacy inventory/provenance and analytical portfolio defined | pass | -| implementation plan | implementation plan | `ready-for-implementation` | `ready-for-implementation`; TASK-07 through TASK-24 defined | pass | -| implementation evidence | implementation report plus phase index | all Step 7-24 blocks completed | 18/18 Step blocks and index entries `completed`; final cumulative suite 83 tests | pass with stale-header note below | -| build/test | build/test report | `pass-for-reference-verification` | `pass-for-reference-verification`; fresh MSVC x64 Debug build, warning count 0, 83/83 | pass | -| reference verification | reference-verification report | `pass-for-physics-evaluation` | `pass-for-physics-evaluation`; 176/176 rows and 16/16 metrics | pass | -| physics evaluation | physics-evaluation report | `pass-for-release-agent` | `pass-for-release-agent`; all documented physics checks and 17/17 targeted tests pass | pass | -| phase sequence | phase index | Steps 0-27 `completed` | 28/28 prerequisite entries completed in gate order | pass | - -### Identity and contradiction audit - -- All feature-level reports use `linear-static-3d-euler-beam`, the same approved design path, - authoritative HDF5 contract, logical model `cantilever-beam-b33`, legacy schema, and exact - `reference/cantilever beam/` baseline from `2b34d0b`. -- The formulation metadata uses the narrower element-document identity - `3d-isoparametric-euler-beam`. This is not a competing release feature: it names the exact - formulation path referenced by the approved feature requirements, design, numerical review, - I/O contract, reference-model contract, and implementation plan. Its `source_requirement` and - `approved_design` links establish the same release lineage. -- The implementation report aggregate metadata still says `status: in-progress`. This is a stale - aggregate header, not an unresolved release gate: every TASK-07 through TASK-24 block is - `completed`, all corresponding phase-index entries are `completed`, Step 25 independently audited - all 18 blocks, and a fresh build/discovery/full CTest passed 83/83. The Step 25 report reaches the - same explicit nonblocking conclusion. The upstream implementation report was not modified. -- Final review reproduced that the former Step 26 sample acceptance probe rejected a valid - `passed=true` artifact because it read a nonexistent string `status`. The phase probe now reads - the authoritative boolean `passed`; its exact command was rerun successfully without changing - source, tests, tolerance, or reference artifacts. -- The Step 25 prose contains a typo in the input SHA-256. Fresh Step 26/27 hashes, Git diff/status, - exact row reconstruction, and passing comparison evidence preserve artifact identity. - -## Acceptance Traceability - -Evidence aliases used below are exact upstream identities: `BT25` is the build/test report; -`RV26` is the reference-verification report; `PE27` is the physics-evaluation report. Model IDs -(`an-*`, `cv-*`, `neg-b33-input-contract`, `cantilever-beam-b33`) and `NR-T01` through `NR-T11` -are defined by the approved reference-model and numerical-review documents. Every row has priority -`must` in the approved Requirement Verification Matrix. - -| requirement | acceptance criterion | exact test/evidence IDs | reference or analytical evidence | final disposition | -| --- | --- | --- | --- | --- | -| `FESA-REQ-LS3DEB-001` | One static step runs; a second step is rejected structurally. | `T12-MAP-001`, `T12-MAP-004`, `T13-MODEL-003`, `T24-CLI-001` | `smoke-b33-cli`; `neg-b33-input-contract`; `BT25` | released-in-V0 | -| `FESA-REQ-LS3DEB-002` | Accepted models obey the straight/prismatic/two-node, small linear-static scope and exclusions are not claimed. | `T12-MAP-001`, `T12-MAP-004`, `T16-BEAM-006`, `T24-ORCH-002` | `CB-AXIAL-TIP`, `CB-TORSION-TIP`, both bending candidates; `PE27` model coverage | released-in-V0 | -| `FESA-REQ-LS3DEB-003` | DOF and nodal-result order is exactly `[UX,UY,UZ,URX,URY,URZ]`. | `T14-DOF-001`, `T15-STATE-002`, `T23-HDF5-001` | `cantilever-beam-b33`; `RV26` HDF5 audit | released-in-V0 | -| `FESA-REQ-LS3DEB-004` | Axial, torsion, local-y bending, and local-z bending recover approved analytical quantities. | `T16-BEAM-006`, `T22-RECOVERY-004`, `NR-T08-ANALYTICAL` | `an-b33-axial-cantilever`, `an-b33-torsion-cantilever`, `an-b33-local-y-bending`, `an-b33-local-z-bending`; `PE27` | released-in-V0 | -| `FESA-REQ-LS3DEB-005` | Only B33 creates the approved Euler beam semantic object. | `T12-MAP-001`, `T24-B33-001` | `cantilever-beam-b33`; `RV26` confirms `TYPE=B33` | released-in-V0 | -| `FESA-REQ-LS3DEB-006` | B31 returns exact `unsupported-element-formulation` and creates no Euler beam. | `T12-MAP-004` | `CB-B31-NEGATIVE`; `neg-b33-input-contract` | released rejection behavior; B31 unsupported | -| `FESA-REQ-LS3DEB-007` | DOFs 1..6 map correctly and nonzero `dc` affects RHS and reaction. | `T14-DOF-002`, `T19-CONSTRAINT-003`, `T21-LOAD-001`, `T21-LOAD-003`, `T22-RECOVERY-001` | `an-b33-prescribed-displacement`; `NR-T09-PARTITION-SPD`; `PE27` | released-in-V0 | -| `FESA-REQ-LS3DEB-008` | Closed-form line-load vector passes while parser/CLI `*DLOAD` and Domain distributed load remain absent. | `T16-BEAM-005`, `T12-MAP-005`, `NR-T06-LINE-LOAD` | `an-b33-line-load-kernel`; `PE27` targeted portfolio | released kernel; `*DLOAD` unsupported | -| `FESA-REQ-LS3DEB-009` | Every approved keyword has positive coverage and no unlisted support claim exists. | `T12-MAP-001`, `T12-MAP-004` | `smoke-b33-cli`; exact I/O keyword inventory; legacy input | released approved subset only | -| `FESA-REQ-LS3DEB-010` | Case variants/comments behave correctly and raw source identity survives. | `T11-SYN-001`, `T11-SYN-002`, `T10-DOM-001` | legacy input exact-byte identity `fnv1a64:04543464cc970405`; `RV26` | released-in-V0 | -| `FESA-REQ-LS3DEB-011` | Only approved boundary/load arities and DOFs pass; target expansion is deterministic. | `T12-MAP-001`, `T12-MAP-002`, `T12-MAP-004`, `T14-DOF-002`, `T21-LOAD-001` | analytical load/BC fixtures; invalid-target portfolio | released-in-V0 | -| `FESA-REQ-LS3DEB-012` | Section properties and right-handed local-axis mapping match the contract. | `T12-MAP-001`, `T12-MAP-004`, `T16-BEAM-004`, `NR-T05-TRANSFORM` | both bending models; `an-b33-rotated-space`; `PE27` local/global signs | released-in-V0 | -| `FESA-REQ-LS3DEB-013` | Valid `E,nu`/derived `G` and positive section properties pass; malformed/nonpositive data fails. | `T12-MAP-001`, `T12-MAP-004`, `T16-BEAM-007` | analytical inventory; `neg-b33-input-contract` invalid properties | released-in-V0 | -| `FESA-REQ-LS3DEB-014` | Exact scale-aware length/guide thresholds reject boundary failures and valid geometry gives an orthonormal frame. | `T12-MAP-004`, `T16-BEAM-004`, `T16-BEAM-007`, `NR-T05-TRANSFORM` | `neg-b33-input-contract`; rotated-space analytical model | released-in-V0 | -| `FESA-REQ-LS3DEB-015` | Instance/source labels round-trip to stable unique internal IDs. | `T10-DOM-001`, `T10-DOM-002`, `T12-MAP-002`, `T23-HDF5-001` | multi-instance semantic fixture; `RV26` model identity audit | released-in-V0 | -| `FESA-REQ-LS3DEB-016` | Multiple identity instances remain distinct and deterministic. | `T10-DOM-003`, `T12-MAP-002` | multi-instance semantic fixture; reference CSV N/A | released-in-V0 | -| `FESA-REQ-LS3DEB-017` | Instance translation/rotation fails with exact `unsupported-instance-transform`. | `T12-MAP-004` | `neg-b33-input-contract` transform case | released rejection behavior; transforms unsupported | -| `FESA-REQ-LS3DEB-018` | Nested/dependent constructs fail structurally and produce no Domain model. | `T12-MAP-004` | `neg-b33-input-contract` nested/dependent cases | released rejection behavior; nested assembly unsupported | -| `FESA-REQ-LS3DEB-019` | Exact no-op allowlist emits deterministic warnings without semantic effect. | `T12-MAP-003`, `T23-HDF5-002`, `T23-HDF5-003` | legacy input/output requests; `RV26` mandatory-output audit | released-in-V0 | -| `FESA-REQ-LS3DEB-020` | Unlisted model keywords fail and allowed output requests cannot suppress mandatory HDF5 output. | `T12-MAP-004`, `T23-HDF5-002`, `T24-CLI-003` | `smoke-b33-cli`; `RV26` exact HDF5 inventory | released-in-V0 | -| `FESA-REQ-LS3DEB-021` | Active-step view neither copies nor mutates Domain. | `T10-DOM-002`, `T13-MODEL-002` | architecture/code-verification fixture; reference CSV N/A | released-in-V0 | -| `FESA-REQ-LS3DEB-022` | DofManager exclusively owns mapping/scatter/reconstruction; Node/Element have no equation IDs. | `T14-DOF-001`, `T14-DOF-003`, `T14-DOF-004`, `T19-CONSTRAINT-001` | code/dependency audit; reference CSV N/A | released-in-V0 | -| `FESA-REQ-LS3DEB-023` | Required V0 state is connected to output and excluded state is unallocated. | `T15-STATE-001`, `T15-STATE-002`, `T23-HDF5-001` | `smoke-b33-cli`; `RV26` HDF5 audit | released-in-V0 | -| `FESA-REQ-LS3DEB-024` | Repeated/thread-varied assembly has identical CSR order and values. | `T17-PFOR-002`, `T18-SPARSE-002`, `T18-SPARSE-004`, `T18-SPARSE-005`, `NR-T11-DETERMINISTIC-ASSEMBLY` | `cv-b33-patch-rigid-assembly`; reference CSV N/A | released-in-V0 | -| `FESA-REQ-LS3DEB-025` | Backend types do not leak and dense/sparse storage matches contract. | `T07-BUILD-002`, `T09-DENSE-001`, `T09-DENSE-002`, `T18-SPARSE-001`, `T20-PARDISO-004`; Step 25 dependency scans | adapter/code audit; `BT25` | released-in-V0 | -| `FESA-REQ-LS3DEB-026` | Event trace is stiffness/partition/factorize/load/RHS/solve with separate factorization. | `T20-PARDISO-002`, `T24-ORCH-001` | lifecycle event-trace fixture; `BT25` | released-in-V0 | -| `FESA-REQ-LS3DEB-027` | Effective RHS, full displacement, and residual reaction satisfy partition equations. | `T19-CONSTRAINT-001`, `T19-CONSTRAINT-003`, `T21-LOAD-003`, `T22-RECOVERY-001`, `T22-RECOVERY-002`, `NR-T09-PARTITION-SPD` | `an-b33-prescribed-displacement`; `PE27` residual/reaction checks | released-in-V0 | -| `FESA-REQ-LS3DEB-028` | Success atomically produces final HDF5 and failure leaves no incomplete final file. | `T23-HDF5-004`, `T23-HDF5-005`, `T24-CLI-001` | CLI writer success/failure fixtures; `RV26` authoritative output | released-in-V0 | -| `FESA-REQ-LS3DEB-029` | Every schema-v0 path exists at frame 0 with exact rank/component identity. | `T23-HDF5-001`, `T24-B33-001` | `RV26` read-only HDF5 schema audit | released-in-V0 | -| `FESA-REQ-LS3DEB-030` | Metadata fields, ordinary unit label, and external SI provenance are exact. | `T07-BUILD-001`, `T23-HDF5-001`, `T24-CLI-001`, `T24-B33-001` | `cantilever-beam-b33`; `RV26` metadata/source-identity audit | released-in-V0 | -| `FESA-REQ-LS3DEB-031` | Component order and endpoint/Gauss locations are exact and output-request independent. | `T15-STATE-002`, `T16-BEAM-006`, `T22-RECOVERY-003`, `T23-HDF5-001`, `T23-HDF5-002`, `T24-CLI-003` | all analytical models; `RV26`; `PE27` end/section checks | released-in-V0 | -| `FESA-REQ-LS3DEB-032` | Correct `S11` rows/default centroid exist, no shear stress is emitted, and stress reference is N/A. | `T16-BEAM-008`, `T22-RECOVERY-005`, `T23-HDF5-003`, `T24-B33-001` | axial/local-z analytical stress; `RV26` Stress Reference Status; `PE27` stress sanity | released; Abaqus stress reference N/A | -| `FESA-REQ-LS3DEB-033` | Default/explicit output and exact exit-code/ordered-diagnostic contract pass. | `T08-CORE-002`, `T24-CLI-001`, `T24-CLI-002` | CLI negative portfolio; `BT25` | released-in-V0 | -| `FESA-REQ-LS3DEB-034` | Every production step has RED, GREEN, focused/full VERIFY, discovery, and no warning. | `T07-*` through `T24-*`; TASK-07 through TASK-24 report blocks | `BT25`: 18/18 blocks audited, fresh warning count 0, 83 discovered, 83/83 pass | satisfied | -| `FESA-REQ-LS3DEB-035` | All matrix, mode, residual, transform, partition, and analytical thresholds pass. | `T16-BEAM-001` through `T16-BEAM-010`; `T18-SPARSE-004`; `T19-CONSTRAINT-003`; `T20-PARDISO-001`, `T20-PARDISO-006`; `T22-RECOVERY-002`; `NR-T01` through `NR-T11` | analytical portfolio; `PE27` exact targeted 17/17 | satisfied | -| `FESA-REQ-LS3DEB-036` | Abaqus-only component scale and exact mixed formula apply to every row. | `T24-REF-002`, `T24-B33-001` | `RV26`: 176 recalculated row decisions, 16 metrics | satisfied | -| `FESA-REQ-LS3DEB-037` | Exact SI floors and zero-scale behavior are applied. | `T24-REF-002`, `T24-B33-001` | `RV26` component table includes zero-scale groups and exact floors | satisfied | -| `FESA-REQ-LS3DEB-038` | Invalid row/schema/identity/nonfinite cases fail before tolerance; no clamp/drop occurs. | `T24-REF-001`, `T24-REF-002` | malformed contract fixtures; `RV26` zero missing/extra/duplicate/nonfinite rows | satisfied | -| `FESA-REQ-LS3DEB-039` | Every row decision and aggregate/worst metric is present. | `T24-REF-003`, `T24-B33-001` | `RV26`: 176 ledger rows, 16 component metrics, exact recomputation | satisfied | -| `FESA-REQ-LS3DEB-040` | Exact legacy filenames exist and reference content is unchanged. | `T11-SYN-004`, `T24-B33-001`; `BT25`/`RV26`/`PE27` reference diff/status checks | exact approved four-file bundle and pre/post hashes | satisfied legacy exception | -| `FESA-REQ-LS3DEB-041` | Four-file/B33/header/key/finite precheck passes before comparison with approved failure classes. | `T24-REF-001`, `T24-B33-001` | `RV26` Artifact Inventory: 4 files, 11/11/11 rows, finite/unique | satisfied | -| `FESA-REQ-LS3DEB-042` | Exact component/source identity and endpoint-consistency/no-average policy pass. | `T22-RECOVERY-006`, `T24-REF-004`, `T24-B33-001` | `RV26`: displacement 66, reaction 66, section 44; endpoint consistency true | satisfied | -| `FESA-REQ-LS3DEB-043` | Build precedes reference, reference precedes physics, and physics covers required checks. | `BT25`, `RV26`, `PE27`; phase Steps 25-27 | `PE27`: force/moment equilibrium, reaction, displacement, symmetry, section/end force, residual and coverage pass | satisfied | -| `FESA-REQ-LS3DEB-044` | No reference solver/artifact mutation occurs and release claims no excluded support. | `T12-MAP-004`, `T12-MAP-005`; `BT25`/`RV26`/`PE27` no-change assertions; Step 28 Git audit | exact legacy diff/status clean; this report's Release Scope and Known Limitations | satisfied | - -Audit result: all 44 expected `must` requirements have an acceptance criterion, exact executable -or gate evidence, reference/analytical evidence or an explicit applicable N/A, and a final -disposition. No must requirement is deferred or blocked. - -## Validation Evidence - -| command or report | expected | observed | result | -| --- | --- | --- | --- | -| Step 25 fresh MSVC x64 Debug configure/build | exit 0; `/W4 /WX`; no warnings | exit 0; warning scan 0 | pass | -| Step 25 CTest discovery/full | nonzero discovery; zero failures | 83 discovered; feature 83/83; full 83/83 | pass | -| exact Build/Test gate string | `status: pass-for-reference-verification` | present | pass | -| exact Reference Verification gate string and result probe | `status: pass-for-physics-evaluation`; `passed=true` | present; corrected exact acceptance command and comparison test pass | pass | -| exact Physics Evaluation gate string | `status: pass-for-release-agent` | present; targeted physics selection 17/17 | pass | -| reference comparison | exact rows/metrics; approved tolerance | 176/176 rows, 16/16 metrics, `passed=true`; largest normalized error `0.026602795021994977 < 1` | pass | -| physics sanity | equilibrium/sign/symmetry/section/residual/coverage pass | force `1.1921e-13`, moment `2.7418e-13`, free residual `9.3563e-13`; all checks pass | pass | -| phase prerequisites | Steps 0-27 completed | all 28 prerequisite entries completed | pass | - -## Release Checklist - -- [x] Approved design, requirements, research, formulation, numerical, I/O, and reference-model evidence is present. -- [x] TASK-07 through TASK-24 implementation evidence is complete and independently audited. -- [x] Exact three-gate status strings are present and passing. -- [x] All 44 `must` requirements are traced to acceptance, exact evidence, reference/analytical coverage, and disposition. -- [x] Reference bundle identity and read-only status are preserved. -- [x] Known limitations, accepted Minors, evidence limitations, and explicit N/A items are documented. -- [x] No Critical, unresolved Important, defect, missing artifact, failed command, or user decision blocks internal readiness. - ## Known Limitations | limitation | category | user impact | disposition | @@ -188,47 +57,6 @@ disposition. No must requirement is deferred or blocked. | HDF5 `libmmd.dll` staging guard (Minor) | environment portability | unconditional guard is correct for approved shared-HDF5 environment; alternate HDF5 targets may need adjustment | accepted external portability limit | | stale implementation aggregate header | documentation | top-level `in-progress` can confuse readers despite completed evidence | documented nonblocking stale header; upstream unchanged | -## Release Notes Draft - -### Feature Summary - -- Adds the internally release-ready FESA V0 end-to-end single-step linear-static 3D - Euler-Bernoulli beam pipeline for Abaqus `TYPE=B33` input. -- Supports stable identity instances, deterministic DOF/sparse assembly, separate PARDISO - factorization/substitution, nonzero prescribed displacement, residual reactions, and atomic - HDF5 `results.h5` output. -- Writes mandatory displacement, reaction, equilibrium end action, endpoint section resultant, - generalized strain/resultant, and axial `S11` regardless of Abaqus output requests. - -### Verification Scope - -- Fresh Visual Studio 18 2026/MSVC x64 Debug build passed under `/W4 /WX` with zero warnings and - all 83 discovered tests passing. -- The approved read-only `cantilever-beam-b33` bundle passed all 176 displacement/reaction/section - rows and all 16 metric groups under `absolute_floor + 1e-6 * reference_scale`. -- Physics evaluation passed force/moment equilibrium, reactions, displacement/rotation signs, - zero symmetry, end/section balance, local/global mapping, residual, `S11`, energy/modes, and - complementary analytical coverage. - -### Main Limitations - -- No B31, multiple steps, transforms/nested assembly, `I12!=0`, `*DLOAD`, nonlinear, dynamic, - contact, thermal, shear-stress, or warping-stress support. -- Abaqus beam stress reference comparison is N/A; nonzero `S11` evidence is analytical/unit-based. -- The legacy space-containing four-file reference bundle is a read-only exception. New bundles - must use canonical names and metadata. -- The single Abaqus cantilever is supplemented by analytical/unit models and does not establish - full Abaqus B33 compatibility or experimental validation. -- Accepted Minor test-depth and alternate-environment portability limits remain as documented in - Known Limitations. - -### Artifacts - -- Authoritative solver output for a run: HDF5 `results.h5`. -- Approved reference baseline: `reference/cantilever beam/` exact four-file legacy bundle. -- Gate evidence: the Build/Test, Reference Verification, and Physics Evaluation reports listed in - Metadata; deterministic build-local `comparison.json` is review evidence, not solver output. - ## Release Verdict - verdict: `ready-for-release` @@ -253,29 +81,6 @@ disposition. No must requirement is deferred or blocked. No release engineering, packaging, publication, tag, push, or external coordination was performed. Harness/root phase-evidence commits are internal workflow records, not an external release action. -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_or_upstream_contracts_modified: `false` -- implementation_report_modified: `false` -- build_report_modified: `false` -- reference_verification_report_modified_for_review_fix: `true` -- physics_report_modified: `false` -- reference_artifacts_modified: `false` -- tolerance_policies_modified: `false` -- Abaqus_or_other_reference_solver_executed: `false` -- release_agent_publish_deploy_package_tag_push_commit_performed: `false` -- harness_or_root_phase_evidence_commits_performed: `true` -- owned_release_report_created: `true` -- phase_index_step28_modified: `true` -- phase_step26_acceptance_modified_for_review_fix: `true` -- phase_index_step26_summary_modified_for_review_fix: `true` -- notes: The release audit initially created this report and changed only Step 28. Final review - then aligned the Step 26 acceptance probe/report/index summary with authoritative `passed=true`; - source, tests, tolerance, reference artifacts, and physical evidence remain unchanged. - ## Open Issues - Blocking issues: none. @@ -288,3 +93,5 @@ Harness/root phase-evidence commits are internal workflow records, not an extern - Nonblocking accepted Minors: comparator file-type defense-in-depth coverage, future multi-source diagnostic ordering, and alternate-HDF5 `libmmd.dll` staging portability remain as documented. - Deferred behavior is limited to the Known Limitations and is not claimed as supported. + +현재 build·reference·물리 실행 기록은 [검증 보고서](verification.md)에 통합했다. 과거 readiness와 현재 재검증 필요를 구분하며 이 정리는 새로운 release 감사가 아니다. diff --git a/docs/linear-static-3d-euler-beam/requirements.md b/docs/linear-static-3d-euler-beam/requirements.md index f43a407..475efd2 100644 --- a/docs/linear-static-3d-euler-beam/requirements.md +++ b/docs/linear-static-3d-euler-beam/requirements.md @@ -7,7 +7,7 @@ - status: `approved` - owner_agent: `requirement-agent` - date: `2026-08-09` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` +- approved_design: `docs/development-history.md` - approval_basis: design `status: approved`, user approval on `2026-08-08`, and amendment on `2026-08-09` - source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` - reference_baseline: exact read-only artifacts under `reference/cantilever beam/` diff --git a/docs/linear-static-3d-euler-beam/research.md b/docs/linear-static-3d-euler-beam/research.md index a55f577..b30af8b 100644 --- a/docs/linear-static-3d-euler-beam/research.md +++ b/docs/linear-static-3d-euler-beam/research.md @@ -4,7 +4,7 @@ - feature_id: `linear-static-3d-euler-beam` - source_requirement: `docs/linear-static-3d-euler-beam/requirements.md` -- approved_design: `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md` +- approved_design: `docs/development-history.md` - source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` - status: `ready-for-formulation` - owner_agent: `research-agent` diff --git a/docs/linear-static-3d-euler-beam/verification.md b/docs/linear-static-3d-euler-beam/verification.md new file mode 100644 index 0000000..de93aad --- /dev/null +++ b/docs/linear-static-3d-euler-beam/verification.md @@ -0,0 +1,849 @@ +# 3D Euler–Bernoulli Beam 검증과 한계 + +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + +아래 날짜·revision·명령·수치는 당시 실제 실행 기록이다. 문서 정리에서 solver를 다시 실행하지 않았다. +현재 계약은 [요구사항](requirements.md), [정식화](formulation.md), [I/O](io.md), [공통 tolerance](../TOLERANCE.md)를 따른다. [과거 release 판정](release.md)의 재검증 경계도 유지한다. + + + + +## Linear Static 3D Euler Beam Build/Test Report + + +### Metadata + +- feature_id: `linear-static-3d-euler-beam` +- source_commit: `400db191ce9f766ca6b34e5b609eaa13c54ccfa3` +- source_implementation_report: `docs/linear-static-3d-euler-beam/lessons.md` +- source_implementation_plan: `docs/linear-static-3d-euler-beam/README.md` +- status: `pass-for-reference-verification` +- date: `2026-08-09` +- evidence_window: `2026-08-09T23:16:20.8670416+09:00` through `2026-08-09T23:20:15.7264584+09:00` + + +### Verdict + +Fresh Visual Studio 18 2026/MSVC x64 Debug configuration, a clean full rebuild, +the exact Step 25 configure/build commands, nonzero JSON discovery, the feature-label +CTest run, and the full CTest run all passed. CTest discovered the expected 83 tests +and both executed suites passed 83/83. The clean rebuild emitted no compiler or linker +warning line, and generated FESA product projects retain Level 4 plus warnings-as-errors. + +The build/test gate therefore passes for handoff to Step 26 Reference Verification. +This verdict does not approve reference tolerance, physics sanity, or release readiness. + + +### Execution Environment + +- os: `Microsoft Windows 11 Home 10.0.26200 build 26200; 64-bit` +- source_head: `400db191ce9f766ca6b34e5b609eaa13c54ccfa3` +- generator: `Visual Studio 18 2026` +- Visual Studio: `Community 18.8.2` (`18.8.12023.21`) +- MSBuild: `18.8.2+ce25c0108` +- compiler: `MSVC 19.51.36252.0` +- compiler_architecture: `x64` +- Windows SDK: `10.0.26100.0` +- language: `C++17`, required, extensions disabled +- config: `Debug` +- build_dir: `.harness/build` +- harness_config: absent; repository auto-CMake defaults plus Step 25 explicit cache values +- project_selection: auto CMake from root `CMakeLists.txt` +- command_discovery_path: default CMake/MSVC x64 Debug with explicit local dependency paths +- CMake / CTest: `4.4.0 / 4.4.0` + + +#### Dependency Revisions + +| dependency | resolved revision or version | evidence | +| --- | --- | --- | +| GoogleTest | `04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4` | clean `C:/git/googletest` checkout HEAD | +| Intel oneMKL | `2026.1.0` | `MKLConfigVersion.cmake`; configure reported `MKL_VERSION: 2026.1.0`, dynamic ILP64, Intel threading | +| Intel oneTBB | `2023.1.0` | `TBBConfigVersion.cmake` from the configured `2023.1` package | +| HDF5 | `2.1.1` | `hdf5-config-version.cmake` from the configured `2.1.1` package | + + +### Freshness and Configuration Resolution + +The ignored generated build tree already existed. Fresh evidence was obtained without +reusing its cache or products by running CMake `--fresh` with the generator explicitly +fixed to Visual Studio 18 2026, then running the generated `clean` target before the +full build. The literal no-`--fresh`, no-`-G` configure command from Step 25 was then +run against that resolved VS18 cache and followed by the literal build, discovery, +feature-label, and full-test commands. + +Post-configure metadata recorded: + +- `CMAKE_GENERATOR=Visual Studio 18 2026` +- `CMAKE_GENERATOR_PLATFORM=x64` +- `CMAKE_CXX_COMPILER_ID=MSVC` +- `CMAKE_CXX_COMPILER_VERSION=19.51.36252.0` +- `CMAKE_CXX_COMPILER_ARCHITECTURE_ID=x64` + + +### Command Log Summary + +| order | command | start / end | exit code | duration | verdict and stdout/stderr tail | +| ---: | --- | --- | ---: | ---: | --- | +| 1 | `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"` | `23:16:20.867+09:00` / `23:16:27.706+09:00` | 0 | `6.836 s` | pass; MKL 2026.1.0 and required runtime libraries resolved; `Configuring done`, `Generating done`, build files written to `.harness/build` | +| 2 | `cmake --build .harness/build --config Debug --target clean` | `23:16:37.194+09:00` / `23:16:37.914+09:00` | 0 | `0.716 s` | pass; generated VS18 clean target completed | +| 3 | `cmake --build .harness/build --config Debug` | `23:16:47.054+09:00` / `23:18:01.769+09:00` | 0 | `74.713 s` | pass; clean compile/link produced `fesa.exe` and all three test executables; warning scan count `0` | +| 4 | `cmake -S . -B .harness/build -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"` | `23:19:10.210+09:00` / `23:19:10.861+09:00` | 0 | `0.649 s` | pass; exact Step 25 command selected Windows SDK 10.0.26100.0, retained VS18/x64, and completed configure/generate | +| 5 | `cmake --build .harness/build --config Debug` | `23:19:25.404+09:00` / `23:19:28.969+09:00` | 0 | `3.562 s` | pass; exact Step 25 build confirmed `fesa_solver`, `fesa.exe`, and all test executables; warning scan count `0` | +| 6 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `23:19:45.728+09:00` / `23:19:45.798+09:00` | 0 | `0.065 s` | pass; JSON kind `ctestInfo` version 1.0; 83 tests; every test has the feature label | +| 7 | `ctest --test-dir .harness/build -C Debug -L linear-static-3d-euler-beam --output-on-failure` | `23:20:00.199+09:00` / `23:20:04.163+09:00` | 0 | `3.961 s` | pass; `100% tests passed out of 83`; real test time `3.92 s` | +| 8 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | `23:20:11.899+09:00` / `23:20:15.726+09:00` | 0 | `3.825 s` | pass; `100% tests passed out of 83`; real test time `3.79 s` | + +An initial post-clean discovery/feature/full smoke was also run before the literal +configure replay: discovery exit 0 in `0.068 s` with 83 tests, feature-label CTest +exit 0 in `4.244 s` with 83/83, and full CTest exit 0 in `4.011 s` with 83/83. +Rows 4 through 8 are the final canonical Step 25 acceptance chain. + + +### Validation Results + +| validation_stage | result | evidence | +| --- | --- | --- | +| harness self-test | skipped | No Harness Python, Hook, or agent-config file is part of HEAD `400db19` verification scope. | +| fresh configure | pass | Explicit VS18/x64 `--fresh` configure exit 0, followed by clean target exit 0. | +| exact configure | pass | Literal Step 25 configure exit 0; generated metadata is MSVC/x64. | +| clean full build | pass | Exit 0 after clean; all source and test translation units compiled and linked. | +| exact build | pass | Exit 0; product and three test executables confirmed. | +| compiler/warning policy | pass | `fesa_solver` and `fesa_cli` generated projects have `Level4` and `TreatWarningAsError=true`; clean and exact build scans found zero warning lines. | +| CTest discovery | pass | Exit 0; 83 tests, greater than zero and equal to the expected inventory. | +| feature-specific tests | pass | Label `linear-static-3d-euler-beam`: 83/83 passed. | +| full CTest | pass | 83/83 passed with zero failed tests. | +| reference immutability | pass | Pre/post `git diff --exit-code -- reference/` exit 0, status empty, and four exact SHA-256 values unchanged. | +| source worktree before report | pass | `git status --short` empty at HEAD `400db19`. | + + +### CTest Inventory + + +#### Label Inventory + +| label | count | +| --- | ---: | +| `linear-static-3d-euler-beam` | 83 | +| `unit` | 73 | +| `integration` | 5 | +| `reference` | 5 | + + +#### Suite Inventory and Step Trace + +| implementation Step | CTest suite or suites | count | cumulative count | Step 7-24 report evidence audit | +| ---: | --- | ---: | ---: | --- | +| 7 | `BuildInfo` | 2 | 2 | pass | +| 8 | `CoreDiagnostics` | 3 | 5 | pass | +| 9 | `DenseMath` | 2 | 7 | pass | +| 10 | `DomainModel` | 3 | 10 | pass | +| 11 | `InpSyntax` | 4 | 14 | pass | +| 12 | `InpDomainMapping` | 5 | 19 | pass | +| 13 | `AnalysisModel` | 3 | 22 | pass | +| 14 | `DofManager` | 4 | 26 | pass | +| 15 | `AnalysisState` | 3 | 29 | pass | +| 16 | `EulerBeam3D` | 10 | 39 | pass | +| 17 | `ParallelFor` | 3 | 42 | pass | +| 18 | `SparseAssembly` | 5 | 47 | pass | +| 19 | `EssentialConstraints` | 4 | 51 | pass | +| 20 | `MklPardisoSolver` | 6 | 57 | pass | +| 21 | `LoadAssembly` | 5 | 62 | pass | +| 22 | `ResultRecovery` | 6 | 68 | pass | +| 23 | `Hdf5ResultsWriter` | 5 | 73 | pass | +| 24 | `LinearStaticCli` (5), `ReferenceComparisonContract` (4), `B33ReferenceComparison` (1) | 10 | 83 | pass | + +The JSON inventory contains every exact test name registered by GoogleTest discovery. +No duplicate CTest name was observed; the label partition is exactly 73 unit + 5 +integration + 5 reference = 83. + + +### Step 7-24 Implementation Evidence Audit + +The cumulative implementation report was checked block-by-block against the implementation +plan and the phase index summaries. All 18 Step blocks are present and each records: + +- its matching `TASK-07` through `TASK-24`, `status: completed`, changed files, + requirement IDs, and test IDs; +- at least one implementation-owned nonzero RED command with the expected missing API + or named behavioral failure; +- a zero-exit GREEN build/test for the Step's targeted CTest suite; +- zero-exit MSVC x64 configure/build, nonzero JSON discovery, and zero-failure full CTest; +- `/W4 /WX` or equivalent generated warning-policy evidence and reference-tree + immutability evidence. + +Step 20 and Step 22 additionally retain valid behavioral RED/GREEN correction evidence. +Step 23 records its environment link incident separately from the valid missing-API RED, +so the environment incident was not counted as TDD evidence. The cumulative counts in the +implementation report and the Step 7-24 phase summaries progress exactly to the freshly +discovered 83-test inventory above. + +The implementation report's cumulative header still says `in-progress`; the audited +step-local evidence contract and phase index nevertheless mark every implementation Step +7-24 `completed`. This stale aggregate header is not a missing Step block, missing test, +or failed build/test gate and was not modified by the independent executor. + + +### `/W4 /WX` and Warning Audit + +- `src/fesa/CMakeLists.txt` applies `/W4 /WX` privately to `fesa_solver` and `fesa_cli`. +- Generated `fesa_solver.vcxproj` and `fesa_cli.vcxproj` contain + `Level4` and + `true` for Debug and the other generated + configurations. +- The clean 74.713-second build recompiled the product and all test translation units; + its compiler/linker warning scan found `0` lines. +- The exact post-configure build also exited 0 and found `0` warning lines. + +Result: no product warning was emitted, and any MSVC product warning would have failed +the build under `/WX`. + + +### Reference Read-Only Audit + +The following SHA-256 values were identical before and after all configure/build/test +commands, while both reference diff checks exited 0 and both reference status checks +were empty: + +| exact approved legacy path | SHA-256 | +| --- | --- | +| `reference/cantilever beam/cantilever beam.inp` | `E406EA9560321B791DB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | +| `reference/cantilever beam/cantilever beam displacements.csv` | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | +| `reference/cantilever beam/cantilever beam reactions.csv` | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | +| `reference/cantilever beam/cantilever beam elemental forces.csv` | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | + + +### Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- first_failed_command: `N/A` +- evidence_tail: All required configure, build, discovery, feature-label, and full-test + commands exited 0; no failed test exists. +- correction_handoff: `N/A`; no implementation-owned, environment, harness, or + upstream-contract failure requires correction. + + +### Failed Test Inventory + +None. Feature-label CTest and full CTest both passed 83/83. + + +### Handoff Recommendation + +| target_agent | reason | required_input | +| --- | --- | --- | +| Reference Verification Agent | Step 25 build/test gate is `pass-for-reference-verification`. | This report, HEAD `400db19`, `.harness/build/tests/Debug/fesa_reference_tests.exe`, and the unchanged exact legacy bundle. | + +The build-local Step 24 evidence exists at +`.harness/build/reference/cantilever-beam-b33/results.h5` and +`.harness/build/reference/cantilever-beam-b33/comparison.json`; the JSON is 128,118 bytes +with SHA-256 +`258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D`. +Step 26 must independently rerun and inspect the approved comparison evidence. Its +presence and CTest success here are not a reference-verification verdict. + + +### Open Issues + +- None blocking Reference Verification. +- The implementation report aggregate `in-progress` header is noted above but does not + contradict its 18 completed Step blocks, the phase index, or the fresh build/test result. + + + + +## Linear Static 3D Euler Beam Reference Verification Report + + +### Metadata + +- feature_id: `linear-static-3d-euler-beam` +- model_id: `cantilever-beam-b33` +- source_head: `451d9077ea70e3087454db3760e677da0095d27f` +- source_build_test_report: `docs/linear-static-3d-euler-beam/verification.md` +- source_reference_models: `docs/linear-static-3d-euler-beam/reference-model.md` +- source_io_definition: `docs/linear-static-3d-euler-beam/io.md` +- source_implementation_plan: `docs/linear-static-3d-euler-beam/README.md` +- source_implementation_report: `docs/linear-static-3d-euler-beam/lessons.md` +- historical_status: `pass-for-physics-evaluation` +- current_status: `pass-for-physics-evaluation` +- superseded_on: `2026-08-18` +- revalidated_on: `2026-08-18` +- date: `2026-08-09` +- review_fix_date: `2026-08-10` + +The 2026-08-09 evidence below is preserved as a historical record of the former 11-station, +component-scale comparison. ADR-022 and the regenerated 20-row element-endpoint CSV supersede +that identity and tolerance. The following revalidation is the current reference-gate evidence. + + +### 2026-08-18 Common-policy Revalidation + +`cmake --build .harness/build --config Debug` passed, followed by +`ctest --test-dir .harness/build -C Debug --output-on-failure`: 214/214 tests passed. +The B33 reference test generated +`.harness/build/reference/cantilever-beam-b33/comparison.json` from the exact read-only +reference paths. + +- exact canonical rows: 212 = 66 displacement + 66 reaction + 80 direct element-endpoint + section-resultant rows +- exact families: 6; all row gates and family RMS gates passed +- direct section identity: 20 endpoint rows, 10 B33 elements x 2 connectivity-matched endpoints +- warnings, identity/schema/nonfinite failures: 0 +- overall verdict: `passed=true` + +| family | rows | scale | near-zero rows | max absolute error | scale-relative RMS | +| --- | ---: | ---: | ---: | ---: | ---: | +| translation `UX/UY/UZ` | 33 | `1.90476272e-2` | 23 | `5.333229170789711e-10` | `8.459623217000381e-9` | +| rotation `URX/URY/URZ` | 33 | `2.85714399e-3` | 23 | `1.000013943180944e-10` | `1.1723557271997219e-8` | +| reaction force `RF1/RF2/RF3` | 33 | `1.0e6` | 32 | `8.195638656616211e-7` | `2.0922817757699256e-13` | +| reaction moment `RM1/RM2/RM3` | 33 | `1.0e7` | 32 | `5.0514936447143555e-6` | `8.811160558471221e-14` | +| section force `N` | 20 | `0` | 20 | `0` | `0` | +| section moment `T/My/Mz` | 60 | `1.0e7` | 41 | `1.2499958951957524e-1` | `2.2910664449287597e-9` | + +All values above come from the generated JSON ledger. The historical report body starts below +and must not be read as the current identity/tolerance evidence. + +The prerequisite build/test report has status +`pass-for-reference-verification`. This report applies only the approved Abaqus +B33 reference tolerance. It does not approve physics sanity or release readiness. + + +### Artifact Inventory + +The approved B33 exception overrides the generic new-bundle inventory. The exact +four legacy files with spaces are the complete read-only reference bundle; +`metadata.json` is absent-allowed under project-wide policy, while `README.md` and a +stress CSV are contractually N/A and are not missing artifacts. + +| item | exact path | status | direct audit evidence | +| --- | --- | --- | --- | +| reference directory | `reference/cantilever beam/` | present, exact inventory | Four regular files only; no extra entry. | +| reference input | `reference/cantilever beam/cantilever beam.inp` | present, valid | 2,330 bytes; exactly one `*ELEMENT, TYPE=B33` declaration at line 21. | +| displacement CSV | `reference/cantilever beam/cantilever beam displacements.csv` | present, valid | Exact 9-column CAE header; 11 unique rows; 66 finite values. | +| reaction CSV | `reference/cantilever beam/cantilever beam reactions.csv` | present, valid | Exact 9-column CAE header; 11 unique rows; 66 finite values. | +| elemental-force CSV | `reference/cantilever beam/cantilever beam elemental forces.csv` | present, valid | Exact 7-column CAE header; 11 unique rows; 44 finite values. | +| optional metadata | `reference/cantilever beam/metadata.json` | absent-allowed | Approved design, ADR-010, I/O definition, and reference-model contract supply provenance; absence is not a missing artifact. | +| legacy README | `reference/cantilever beam/README.md` | N/A | Approved B33 legacy exception. | +| reference stress CSV | N/A | N/A | Abaqus beam-stress comparison is outside the approved V0 scope. | +| authoritative solver output | `.harness/build/reference/cantilever-beam-b33/results.h5` | present, valid | 25,336 bytes; generated by the fresh exact CTest; HDF5 schema inspected read-only with HDF5 2.1.1 utilities. | +| comparison ledger | `.harness/build/reference/cantilever-beam-b33/comparison.json` | present, valid | 128,118 bytes; 176 row decisions, 16 component metrics, and `passed=true`. | +| solver debug CSV view | N/A | N/A | No derived FESA CSV was generated or used. | + + +#### Reference hashes + +Fresh pre-comparison and post-comparison SHA-256 values were identical: + +| exact approved legacy path | SHA-256 | +| --- | --- | +| `reference/cantilever beam/cantilever beam.inp` | `E406EA9560321B791DBDB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | +| `reference/cantilever beam/cantilever beam displacements.csv` | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | +| `reference/cantilever beam/cantilever beam reactions.csv` | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | +| `reference/cantilever beam/cantilever beam elemental forces.csv` | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | + +`git diff --exit-code -- reference/` exited 0 and +`git status --short -- reference/` was empty after both comparison runs. + + +#### Authoritative HDF5 audit + +`h5ls` and `h5dump` opened `results.h5` read-only and established: + +- schema version `0`, solver version `0.1.0`, feature + `linear-static-3d-euler-beam`, formulation `B33-3D-Euler-Bernoulli`, + `Step-1`, and frame `0`; +- metadata unit label `user-consistent-unspecified`, as required for ordinary + `.inp` interpretation; the approved reference-model contract supplies the + external SI provenance used by this comparison; +- coordinate convention + `global-cartesian; beam-local=(t,n1,t-cross-n1)`; +- source identity + `path=C:/Users/baram/orca/workspaces/FESADev/LinearStatic/reference/cantilever beam/cantilever beam.inp;content_identity=fnv1a64:04543464cc970405`; + a fresh FNV-1a calculation of the input bytes reproduced + `04543464cc970405`; +- 11 nodes with stable internal IDs 0 through 10, source labels 1 through 11, + instance `PART-1_1-1`, global coordinates `(0..10,0,0)`; +- 10 elements with stable IDs 0 through 9, source labels 1 through 10, + consecutive connectivity and identity local axes; +- displacement and reaction shapes `[11,6]`, section-resultant shape + `[10,2,4]`, exact component/unit/coordinate/location attributes, and finite + float64 values; +- mandatory `stress_s11` compound schema with 20 finite rows (10 elements x 2 + Gauss points), `S11`, `force/length^2`, beam-local section-point attributes, + and the required `fesa-default` centroid identity. + +Only `results.h5` and `comparison.json` exist in the build-local evidence +directory. + + +### Comparison Contract + +- reference_csv_schema_version: `abaqus-cae-report-csv-v0` +- hdf5_schema_version: `0` +- model / frame normalization: CSV + `Increment 1: Step Time = 1.000` -> `(cantilever-beam-b33, Step-1, frame 0)` +- id_matching: exact preserved `instance_name` plus source node label; + section-resultant endpoints project to an eligible source-node station +- row-set policy: expected canonical keys are all 11 nodes crossed with 6 + displacement, 6 reaction, and 4 section-resultant components +- displacement normalization: + `U-U1/U-U2/U-U3/UR-UR1/UR-UR2/UR-UR3` -> + `UX/UY/UZ/URX/URY/URZ` +- reaction normalization: + `RF-RF1/RF-RF2/RF-RF3/RM-RM1/RM-RM2/RM-RM3` -> + `RF1/RF2/RF3/RM1/RM2/RM3` +- section normalization: `SF-SF1 -> N`, `SM-SM1 -> My`, + `SM-SM2 -> Mz`, `SM-SM3 -> T` +- coordinates: global Cartesian for nodal quantities; beam local for section + resultants +- output locations: nodal displacement/reaction and positive-local-x endpoint + section cut projected to node station +- interior-node policy: both incident endpoints must first pass the approved + component tolerance; the smaller stable element ID is selected without + averaging +- tolerance source: requirements 036-039, ADR-014, approved I/O definition, + and reference-model contract +- tolerance policy: `absolute_floor + 1e-6 * reference_scale` +- reference scale: maximum absolute value from read-only Abaqus rows in the + same model, step/frame, quantity, and component only +- SI floors: `1e-9` for displacement/rotation and `1e-3` for force/moment; + zero scale uses the floor alone +- fail-before-tolerance conditions: missing, extra, duplicate, nonfinite, + schema-mismatched, or identity-mismatched row +- zero-reference policy: no zero clamp, deletion, substitution, or omission + +The complete expected set of 176 canonical keys was reconstructed independently +from the contract and matched the 176 unique ledger rows exactly. The 16 expected +quantity/component keys matched the 16 unique metrics. Every serialized absolute +error, tolerance, pass decision, Abaqus-only reference scale, maximum error, +maximum tolerance-normalized error, RMS error, norm error, and worst-row index was +recalculated from the row ledger and matched exactly. Missing rows, extra rows, +duplicate rows, nonfinite rows, and failed rows were all zero. + +The authoritative TASK-24 `ComparisonReport`, test contract, serialized JSON, and +Step 26 acceptance probe all define the verdict as the boolean `passed`. Final +review reproduced that the former `$metrics.status` sample failed against the valid +artifact, corrected the phase probe to `$metrics.passed -eq $true`, and reran the +exact acceptance chain successfully. The generated JSON has `passed=true`. + + +### Execution Evidence + +The exact command was run twice after the artifact precheck: + +```powershell +ctest --test-dir .harness/build -C Debug -R B33ReferenceComparison -V --output-on-failure +``` + +Both executions passed the single exact test +`B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence` 1/1. +Each run reset only `.harness/build/reference/cantilever-beam-b33/` and regenerated +the same two build-local files. The comparison ledger was byte deterministic on +both runs: + +- size: `128118` bytes +- SHA-256: `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` +- verdict: `passed=true` + +`results.h5` remains the authoritative solver output. The JSON is deterministic +review evidence derived directly from HDF5 and the read-only Abaqus CSV rows. + + +### Quantity Results + +`maximum_relative_error` below is calculated only where the Abaqus reference is +nonzero. It is reported for audit completeness, but it is not the acceptance +rule: near-zero Abaqus residues make row-relative error ill-conditioned. The +approved component-scale normalized error is `absolute_error / row_tolerance`. + +| quantity | FESA HDF5 dataset | reference CSV | compared | missing | extra | nonfinite | max abs error | max relative error | max tolerance-normalized error | RMS error | norm error | worst ID/component by abs error | result | +| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | +| displacement | `/steps/Step-1/frames/0/nodal/displacement` | `reference/cantilever beam/cantilever beam displacements.csv` | 66 | 0 | 0 | 0 | `5.333229170789711e-10` | `1.0` | `0.026602795021994977` | `1.1637590907608428e-10` | `9.454423547085314e-10` | node 11 / `UZ` | pass | +| reaction | `/steps/Step-1/frames/0/nodal/reaction` | `reference/cantilever beam/cantilever beam reactions.csv` | 66 | 0 | 0 | 0 | `5.0514936447143555e-6` | `8.195638656616211e-13` | `8.187451205410801e-7` | `6.403678373262425e-7` | `5.202372903532068e-6` | node 1 / `RM2` | pass | +| section resultant | `/steps/Step-1/frames/0/element/section_resultant` | `reference/cantilever beam/cantilever beam elemental forces.csv` | 44 | 0 | 0 | 0 | `1.5600242861189492e-2` | `1.0000155680249674` | `0.0015598682992890203` | `0.0023518254339534184` | `0.015600245073676508` | node station 11 / `My` | pass | +| stress | `/steps/Step-1/frames/0/element/stress_s11` | N/A | N/A | N/A | N/A | 0 in 20 mandatory HDF5 rows | N/A | N/A | N/A | N/A | N/A | N/A | N/A for Abaqus comparison; HDF5 requirement passed | + +The displacement row-relative maximum occurs at node 1 `UZ`, where the stored +reference residue is `-1e-30`; the section row-relative maximum occurs at free-end +`My`, where the stored reference residue is `-1.56e-2`. Neither row was clamped or +omitted. Their approved mixed-tolerance decisions pass. + + +#### Component metrics + +Each group contains 11 matched rows. `worst_row` is the zero-based index in the +deterministic JSON row ledger. + +| quantity | component | reference scale | row tolerance | max abs error | max normalized error | RMS error | norm error | worst row | worst identity | result | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | +| displacement | `UX` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 0 | node 1 / `UX` | pass | +| displacement | `UY` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 1 | node 1 / `UY` | pass | +| displacement | `UZ` | `0.0190476272` | `2.00476272e-8` | `5.333229170789711e-10` | `0.026602795021994977` | `2.790953046857666e-10` | `9.256544063926071e-10` | 62 | node 11 / `UZ` | pass | +| displacement | `URX` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 3 | node 1 / `URX` | pass | +| displacement | `URY` | `0.00285714399` | `3.85714399e-9` | `1.000013943180944e-10` | `0.025926279801157852` | `5.801658540511775e-11` | `1.924192454063848e-10` | 52 | node 9 / `URY` | pass | +| displacement | `URZ` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 5 | node 1 / `URZ` | pass | +| reaction | `RF1` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 66 | node 1 / `RF1` | pass | +| reaction | `RF2` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 67 | node 1 / `RF2` | pass | +| reaction | `RF3` | `1e6` | `1.001` | `8.195638656616211e-7` | `8.187451205410801e-7` | `3.6239383393839433e-7` | `1.2019243735120167e-6` | 68 | node 1 / `RF3` | pass | +| reaction | `RM1` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 69 | node 1 / `RM1` | pass | +| reaction | `RM2` | `1e7` | `10.001` | `5.0514936447143555e-6` | `5.05098854585977e-7` | `1.5261377760919117e-6` | `5.061626381684292e-6` | 70 | node 1 / `RM2` | pass | +| reaction | `RM3` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 71 | node 1 / `RM3` | pass | +| section resultant | `N` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 132 | node 1 / `N` | pass | +| section resultant | `T` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 133 | node 1 / `T` | pass | +| section resultant | `My` | `1e7` | `10.001` | `0.015600242861189492` | `0.0015598682992890203` | `0.004703650867906837` | `0.015600245073676508` | 174 | node 11 / `My` | pass | +| section resultant | `Mz` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 135 | node 1 / `Mz` | pass | + +The largest normalized comparison error across all 176 rows is +`0.026602795021994977` at node 11 `UZ`, below the pass boundary of `1.0`. + + +#### Row decision ledger + +Every row decision is recorded in the deterministic build-local +`comparison.json` identified above. Its stable row order is displacement nodes +1-11 x six components, reaction nodes 1-11 x six components, then section node +stations 1-11 x `[N,T,My,Mz]`. Independent parsing confirmed: + +- rows: 176 +- unique canonical row keys: 176 +- row decisions with `passed=true`: 176 +- row decisions with `passed=false`: 0 +- finite FESA/reference/error/tolerance records: 176 +- missing / extra / duplicate / identity-mismatched rows: 0 / 0 / 0 / 0 +- metrics: 16 unique expected component groups + + +### Stress Reference Status + +- Abaqus stress reference comparison: N/A +- reason: the approved V0 reference contract excludes beam-stress CSV + comparison and substitutes analytical/unit plus HDF5 schema evidence +- mandatory solver stress output: pass +- direct evidence: `stress_s11` exists with the exact compound schema, exact + unit/coordinate/location attributes, two Gauss rows for each of ten elements, + finite `S11`, and deterministic element/Gauss ordering + +No stress reference row was synthesized, and mandatory HDF5 stress was not +treated as optional. + + +### Physics Evidence Handoff + +The comparator serialized the following evidence for independent Step 27 review: + +| evidence | value | +| --- | --- | +| free residual norm | `9.356339321107032e-7` | +| applied force | `[0, 0, -1000000]` | +| reaction force | `[0, 0, 999999.9999998808]` | +| applied moment about origin | `[0, 10000000, 0]` | +| reaction moment about origin | `[0, -9999999.999997258, 0]` | +| endpoint consistency | `passed=true` | + +These values are handed off as evidence only. This Step does not interpret them +as a physics-sanity verdict. + + +### Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- evidence: artifact precheck passed; exact comparison CTest passed twice; + 176/176 rows and 16/16 metric groups passed; no schema, identity, unit, + coordinate, nonfinite, missing/extra, or tolerance failure was found +- correction_handoff: `N/A` + + +### Handoff Recommendation + +| target_agent | reason | required input | +| --- | --- | --- | +| Physics Evaluation Agent | All required reference comparisons passed the exact approved tolerance. | This report, authoritative build-local `results.h5`, deterministic `comparison.json`, and its `physics_evidence`. | + +The handoff status is `pass-for-physics-evaluation` only. Physics sanity remains +responsible for global force/moment equilibrium, reaction sign, displacement +direction, symmetry, section-force consistency, residual interpretation, and +model-coverage adequacy. + + +### Open Issues + +- Non-blocking evidence typo: the Step 25 build/test report prints the input + SHA-256 without the second `DB` after `...1DB`; the fresh 64-character pre/post + value in this report matches the unchanged working-tree file. Reference Git + diff/status and the end-to-end reference snapshot check are clean. +- Resolved final-review finding: the Step 26 acceptance probe now reads the + authoritative boolean `passed`, and its exact command passes on the current artifact. +- No issue blocks Physics Evaluation. + + + + +## Linear Static 3D Euler Beam Physics Evaluation Report + + +### Metadata + +- feature_id: `linear-static-3d-euler-beam` +- model_id: `cantilever-beam-b33` +- evaluated_head: `d76d052456ec134a98bcd5aa3b3c18a6b0ad6ba4` +- source_reference_verification_report: `docs/linear-static-3d-euler-beam/verification.md` +- source_reference_model: `docs/linear-static-3d-euler-beam/reference-model.md` +- source_requirement: `docs/linear-static-3d-euler-beam/requirements.md` +- source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` +- source_numerical_review: `docs/linear-static-3d-euler-beam/numerical-review.md` +- source_io_definition: `docs/linear-static-3d-euler-beam/io.md` +- status: `pass-for-release-agent` +- date: `2026-08-09` + +This verdict means that the documented physical checks pass and the Release Agent may audit +release readiness. It does not approve release readiness and does not re-evaluate the Step 26 +reference tolerance decision. + + +### Input Evidence + +The reference-verification prerequisite has status `pass-for-physics-evaluation`. Its checked +artifact identity was reproduced before the physics checks and again after the targeted CTest. + +| evidence | exact path or identity | status | notes | +| --- | --- | --- | --- | +| reference verification | `docs/linear-static-3d-euler-beam/verification.md` | pass-for-physics-evaluation | Required gate satisfied. | +| solver HDF5 | `.harness/build/reference/cantilever-beam-b33/results.h5` | present and readable | 25,336 bytes; post-acceptance-run SHA-256 `13ECCF68262C14BBDE0F63667C0F10896ACD40EFEC56E8C9121C298333FD9B6D`. | +| comparison evidence | `.harness/build/reference/cantilever-beam-b33/comparison.json` | present and passing | 128,118 bytes; SHA-256 `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D`; `passed=true`, 176 rows, 16 metrics. | +| reference input | `reference/cantilever beam/cantilever beam.inp` | exact read-only artifact | SHA-256 `E406EA9560321B791DB829E03BD24593B9875E0195D35B86BD931EDA122EF3`; `TYPE=B33`. | +| reference displacement | `reference/cantilever beam/cantilever beam displacements.csv` | exact read-only artifact | SHA-256 `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31`. | +| reference reaction | `reference/cantilever beam/cantilever beam reactions.csv` | exact read-only artifact | SHA-256 `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23`. | +| reference elemental force | `reference/cantilever beam/cantilever beam elemental forces.csv` | exact read-only artifact | SHA-256 `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA`. | +| solver CSV views | N/A | not used | No derived FESA CSV was generated or used. | +| stress reference CSV | N/A by approved contract | not applicable | `S11` is evaluated from HDF5 schema, formulation, and analytical/unit evidence only. | +| targeted physics tests | `.harness/build`, MSVC x64 Debug | pass | Exact Step 27 CTest passed 17/17: EulerBeam3D 10, ResultRecovery 6, B33ReferenceComparison 1. | + +Read-only HDF5 inspection confirmed schema `0`, solver `0.1.0`, feature identity, `Step-1` frame +`0`, formulation `B33-3D-Euler-Bernoulli`, source content identity +`fnv1a64:04543464cc970405`, and coordinate convention +`global-cartesian; beam-local=(t,n1,t-cross-n1)`. The file contains 11 nodes at +`(x,y,z)=(0..10,0,0)` m and 10 consecutive one-metre elements. Every element has identity local +axes, so local `(x,y,z)` equals global `(X,Y,Z)` for this model. + +The documented physical model is a 10 m cantilever with node 1 fixed in all six DOFs and a +free-end global/local `FZ=-1.0e6 N` at node 11. The section and material are SI: +`E=2.1e11 Pa`, `Iy=I11=0.0833333 m^4`, and the only expected deformation mode is local-`z` +translation with bending about local `y`. + + +### Physics Checks + +All normalized physics criteria below come from the approved `1e-10` residual/equilibrium, +`1e-12` matrix/transform/end-sign, or `1e-9` analytical contracts. They are independent checks of +physical meaning, not a second application of the Abaqus row tolerance. + + +#### 1. global equilibrium + +In global Cartesian coordinates, force equilibrium is + +`r_F = sum(F_applied) + sum(R)`, + +with criterion + +`||r_F|| / max(||sum(F_applied)||, ||sum(R)||) <= 1e-10`. + +The comparison physics evidence records `sum(F_applied)=[0,0,-1000000] N` and +`sum(R)=[0,0,999999.9999998808] N`. Therefore +`r_F=[0,0,-1.1920928955078125e-7] N`, its norm is +`1.1920928955078125e-7 N`, and the normalized value is +`1.1920928955078125e-13`. Verdict: **pass**. + +Moment equilibrium about the global origin is + +`r_M = sum(M_applied) + sum(X cross F_applied) + sum(M_reaction) + sum(X cross R_force)`. + +The free-end force gives `[0,1.0e7,0] N*m`; the complete HDF5 reaction field gives +`[0,-9999999.999997258,0] N*m`. Thus `r_M=[0,2.7418136596679688e-6,0] N*m`, +with normalized norm `2.7418136596679688e-13` against `1.0e7 N*m`. Verdict: **pass**. + + +#### 2. reaction consistency and true free residual + +The constrained reaction contract is `R_c=(K*d-F)_c`. At fixed node 1 the observed global row is +`[RF1,RF2,RF3,RM1,RM2,RM3] = [0,0,1000000.0000008196,0,-10000000.000005051,0]` +in `[N,N,N,N*m,N*m,N*m]`. It opposes the applied `-Z` force and balances its positive origin +moment. Differences from the physical closed-form reactions are `8.195638656616211e-7 N` and +`5.0514936447143555e-6 N*m`, normalized to `8.195638656616211e-13` and +`5.0514936447143555e-13`. Verdict: **pass**. + +The reaction dataset intentionally preserves free residuals. The implementation uses + +`rho_f = ||(K*d-F)_f||_2 / max(||K*d||_f, ||F||_f)` + +with no artificial unit floor. The serialized true free residual norm is +`9.356339321107032e-7 N-equivalent`; the physical free scale is `1.0e6 N`, so +`rho_f=9.356339321107032e-13 <= 1e-10`. The largest observed free force-residual component is +`5.9604644775390625e-7 N`, and the largest free moment-residual component is +`2.0861625671386719e-7 N*m`. Verdict: **pass**. + + +#### 3. displacement direction and rotation sign + +For free-end local `Pz=-1.0e6 N`, the documented Euler-Bernoulli solution is + +`w(L)=Pz*L^3/(3*E*Iy)`, `theta_y(L)=-Pz*L^2/(2*E*Iy)`. + +The expected values are `-0.0190476266666697 m` and `+0.00285714400000046 rad`. +HDF5 gives tip `UZ=-0.019047626666677083 m` and `URY=+0.0028571440000013902 rad`, with relative +errors `3.87e-13` and `3.27e-13`, below the analytical `1e-9` criterion. All non-root `UZ` values +are negative and monotonically increase in magnitude toward the loaded tip; all non-root `URY` +values are positive, as required by `theta_y=-dw/dx`. Verdict: **pass**. + + +#### 4. expected zero and uncoupled symmetry + +The fixed-root displacement row is exactly zero in all six components. Across all nodes, +`UX`, `UY`, `URX`, and `URZ` are exactly zero. The only nonzero kinematic components are `UZ` and +`URY`, and the only physical constrained reactions are `RF3` and `RM2`. In the element recovery, +`epsilon0`, `kappa_x`, and `kappa_z`, and the corresponding `N`, `T`, and `Mz`, are exactly zero. +This is the documented uncoupled local-`z` bending symmetry, with no axial, torsional, or +cross-plane leakage. Verdict: **pass**. + + +#### 5. element force, adjacent endpoints, and boundary balance + +The HDF5 `end_force_local` rows are outward endpoint actions in +`[FX,FY,FZ,MX,MY,MZ]`; `section_resultant` rows are positive-local-`x` section cuts in +`[N,T,My,Mz]`. With no distributed load, + +`F_X=n*N`, `M_X=n*T`, `M_Y=n*My`, `M_Z=n*Mz`, +`F_Y=-n*dMz/dx`, and `F_Z=n*dMy/dx`, where `n=-1` at `xi=-1` and `n=+1` at `xi=+1`. + +Observed section `My` is positive and decreases linearly from +`10000000.000005048 N*m` at the root to `2.4286118949223834e-7 N*m` at the free end. The maximum +positive-face `My` mismatch between adjacent unloaded endpoints is +`2.73110345005989e-7 N*m`, normalized to `2.73110345005989e-14` against the model moment scale. +The comparison ledger independently records `endpoint_consistency_passed=true` without averaging. + +Adjacent outward actions cancel. The maximum interior `FZ_right+FZ_left` magnitude is +`5.364418029785156e-7 N` (`5.364418029785156e-13` normalized); the maximum interior +`MY_right+MY_left` magnitude is `2.682209014892578e-7 N*m` +(`2.682209014892578e-14` normalized). Both satisfy the documented end-sign/residual criteria. + +At the root, the first element action is exactly the constrained reaction evidence: +`FZ=+1000000.0000008196 N`, `MY=-10000000.000005051 N*m`. At the free boundary, the last element +has `FZ=-999999.9999998808 N` and `MY=-5.9604644775390625e-8 N*m`, balancing the applied end force +and the zero applied end moment to normalized residual scale. Verdict: **pass**. + + +#### 6. local/global mapping and section-force signs + +Every stored local-axis matrix is the identity. Therefore the global `-Z` load is local +`Pz=-1.0e6 N`, `UZ=w<0`, `URY=theta_y>0`, and the positive-face section resultant is +`My=-Pz*(L-x)>0`. The observed outward signs are `FZ>0, MY<0` at left endpoints and +`FZ<0, MY>0` at right endpoints, except for the physically zero free-end moment residue. These +values satisfy the documented `theta_y=-w'`, `My=-E*Iy*w''`, outward-normal, and +positive-face-section-cut conventions. Verdict: **pass**. + + +#### 7. stress location, unit, and sign sanity + +The stress contract is + +`S11(xi,y,z)=E*(epsilon0 + z*kappa_y - y*kappa_z)`, + +where `x1=y`, `x2=z`, the coordinate system is beam local, the unit is `force/length^2`, and the +location is a section point at each of two Gauss points. The reference input has no section +points, so HDF5 correctly contains 20 ordered `fesa-default` centroid rows +`(x1,x2)=(0,0)`, one at each Gauss point of ten elements. This model has pure bending with +`epsilon0=0`; consequently all 20 observed centroid `S11` values are exactly `0 Pa`. + +Nonzero location/sign evidence comes only from the approved analytical/unit portfolio, not from +an Abaqus stress comparison. `EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11` passed with +`epsilon0=0.01`, `kappa_y=0.02 1/m`, `kappa_z=-0.03 1/m`, `E=2.1e11 Pa`: the formula gives +`1.575e9 Pa` at `(y,z)=(0.25,-0.5)`, `8.4e8 Pa` at `(-0.4,0.3)`, and `2.1e9 Pa` at the default +centroid. The test enforces the formula at both Gauss points with normalized `1e-12` evidence. +Abaqus beam stress comparison remains explicitly N/A. Verdict: **pass**. + + +#### 8. nonfinite, rigid-body, abnormal-magnitude, and energy symptoms + +All mandatory numeric HDF5 rows inspected here are finite; `comparison.json` also records no +nonfinite row among the 176 compared rows and the 20 stress rows are finite. The fixed root is +exactly zero, factorization/solution completed, the normalized free residual is `9.36e-13`, and +the displacement field is smooth, so there is no rigid-body-mode symptom. + +For this one-load linear case, the recoverable strain energy is +`U=0.5*F^T*d=9523.81333333854 N*m`, which is finite and positive. The ratios +`|UZ_tip|/L=0.00190476266666771` and `|URY_tip|=0.00285714400000139 rad` agree with the analytical +solution and show no abnormal magnitude relative to the documented small-displacement/rotation +model. The targeted rank/energy test also passed the six-rigid-mode, rank-six, and positive +deformation-energy checks. Verdict: **pass**. + + +#### 9. model coverage + +The approved B33 bundle is one identity-axis local-`z` bending cantilever. It directly covers the +end-to-end parser/solver/HDF5 path, global equilibrium, reaction sign, `UZ/URY`, `My/FZ`, endpoint +continuity, and the centroid stress fallback. It does not by itself cover axial, torsion, local-`y` +bending, rotated space, nonzero fiber stress, prescribed displacement, or the formulation-only +line-load kernel. The targeted analytical/unit portfolio supplies the documented complementary +coverage: + +| coverage | targeted passing evidence | criterion | +| --- | --- | --- | +| axial, torsion, both bending planes | `EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover` and `ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns` | analytical relative `1e-9`; signed recovery contract | +| rotated local/global mapping | `EulerBeam3D.RotatedTransformPreservesWorkAndEnergy` | transform/work/energy normalized `1e-12` | +| constant local line-load kernel | `EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents` | all 12 signed components normalized `1e-12`; `*DLOAD` remains outside CLI scope | +| rigid modes, rank, and energy | `EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy` | rigid residual `1e-10`, rank six, positive deformation energy | +| prescribed displacement and residual | `ResultRecovery.ComputesResidualReactionForNonzeroPrescription`, `ResultRecovery.EnforcesNormalizedFreeResidual` | partition/reaction and normalized residual `1e-10` | +| result identity and continuity | `ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct`, `ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging` | distinct locations and no-average consistency | +| S11 location/sign/default | `EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11`, `ResultRecovery.OrdersStressPointsAndDefaultCentroid` | formula/schema normalized `1e-12` | + +The exact acceptance command passed all 17 selected tests. The single reference model plus this +analytical portfolio covers every documented physical expectation without attributing unsupported +coverage to the legacy CSV bundle. Verdict: **pass**. + + +### Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- evidence: all documented physics checks passed; no equilibrium, reaction, displacement, + symmetry, element-force, stress-location, rigid-body, nonfinite, coverage, contract, or + environment failure was found +- correction_handoff: `N/A` + + +### Evaluation Verdict + +- verdict: `pass-for-release-agent` +- reason: the exact reference gate and artifact identity are valid; force and origin-moment + equilibrium, constrained reaction consistency, true free residual, deformation signs, expected + zeros, element force balance, local/global and section-force signs, S11 schema/analytical sanity, + finite/energy/mode checks, and complementary model coverage all satisfy their documented criteria +- release_approval: `not granted by this report` + + +### Handoff Recommendation + +| target_agent | reason | required_input | +| --- | --- | --- | +| Release Agent | All documented physical checks passed. | This report, the Step 26 reference-verification report, exact build-local HDF5/comparison identities, targeted CTest evidence, and the limitations below. | + + +### Open Issues + +- Non-blocking coverage limitation: the approved Abaqus bundle is one identity-axis local-`z` + bending cantilever. Axial, torsion, local-`y`, rotated, prescribed-displacement, line-load, and + nonzero stress checks rely on the approved analytical/unit portfolio; no broader Abaqus reference + coverage is claimed. +- Non-blocking stress limitation: the B33 bundle has no section points, so its physical `S11` + evidence is the correct zero centroid result. Nonzero fiber location/sign evidence is analytical; + Abaqus beam stress comparison remains N/A. +- Non-blocking output limitation: HDF5 has no strain-energy dataset by contract. The positive energy + value in this report is calculated from `0.5*F^T*d` and is supported by the rank/energy unit test. +- Known formulation limitations remain: Euler-Bernoulli deep-beam applicability, transverse and + torsional shear stress, warping, `I12!=0`, B31/Timoshenko behavior, and CLI `*DLOAD` are outside V0. +- No open issue blocks Release Agent review. diff --git a/docs/linear-static-mitc4-shell/README.md b/docs/linear-static-mitc4-shell/README.md new file mode 100644 index 0000000..44170e8 --- /dev/null +++ b/docs/linear-static-mitc4-shell/README.md @@ -0,0 +1,40 @@ +# MITC4 선형 정적 Shell + +## 목적과 현재 범위 + +S4/S4R 승인 subset, director·MITC4 shear·drilling 분리와 단면력 복구를 구현한 기능이다. 역사적 기능 검증과 현재 통합 회귀의 범위를 구분한다. +최근 dev 통합 회귀는 [전체 현황](../tracking/status.md)에 연결하며, 과거 release 판정은 +[release.md](release.md)에 남긴다. 문서 정리는 새 기능 검증이나 재승인을 뜻하지 않는다. + +## 계약과 재사용 Handoff + +- [요구사항·acceptance](requirements.md): 지원·제외와 기존 요구사항 ID. +- [정식화](formulation.md): 수식·가정·부호·좌표계·복구 위치. +- [I/O](io.md): 입력 subset·진단·source identity·결과 schema. +- [Reference 모델](reference-model.md): 원본과 비교량·행 identity·적용 범위. +- [독립 수치 검토](numerical-review.md): 검산·위험·반례와 수정 확인. +- [검증·물리 결과](verification.md): 실제 실행한 명령·수치·실패·미실행·한계. +- [연구 근거](research.md): 정식화에 필요한 출처와 적용 경계. + +공통 소유권은 [ARCHITECTURE](../ARCHITECTURE.md)를 따른다. Element는 local 계산, +Assembly는 결정적 reduction, Procedure는 trial/commit, Recovery는 물리 의미, +Writer는 직렬화를 담당한다. 새 기능에서 기존 stage/phase 실행 계획을 재사용하지 않는다. +현재 공개 API는 `include/fesa/`, 실제 구현은 `src/fesa/`와 대응 검사를 확인한다. + +## 사용법 + +환경 준비·build·CTest·CLI 기본 사용은 [operations](../operations.md), 입력과 결과의 +공통 계약은 [contracts](../contracts.md)를 따른다. 이 기능의 keyword·option 허용 범위는 +위 I/O 계약을 확인한다. 과거 보고서의 machine 경로·임시 command를 현재 기본값으로 쓰지 않는다. + +## 개발 과정과 주의사항 + +기존 단계별 계획·coordination은 완료된 실행 운영 기록이어서 제거했다. 승인된 요구사항· +수식·검토·실제 검증 결과는 위 문서에 보존한다. Git `858e87b`의 이전 경로는 당시 원문을 +조회하는 용도로만 사용하며 현행 작업 지침이 아니다. + +- [MITC4 시행착오와 수정 기록](../MITC4_SUPP.md)을 함께 읽는다. +- 아래 원래 정식화의 최소 대각 drilling scale은 당시 계약이다. 현재 공변 trace-average 변경은 + [고유치 기능의 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을 따른다. + 물리 strain/MITC4 정의와 수치 stabilization 변경을 분리한다. S3 partial-BC 충돌의 보류도 함께 확인한다. +- `S4R` spelling은 FESA의 적분법 선택 스위치가 아니며 section resultant의 위치·단위·두께 계수를 유지한다. diff --git a/docs/linear-static-mitc4-shell/build-test.md b/docs/linear-static-mitc4-shell/build-test.md deleted file mode 100644 index 3b418fa..0000000 --- a/docs/linear-static-mitc4-shell/build-test.md +++ /dev/null @@ -1,193 +0,0 @@ -# Linear Static MITC4 Shell Build/Test Report - -## Metadata - -- feature_id: `linear-static-mitc4-shell` -- source_commit: `820ba30c717b3d0e113775608e20dfd5fbc05d53` -- source_implementation_report: `N/A`; Harness completion evidence is recorded in - `phases/linear-static-mitc4-shell/index.json` -- source_implementation_plan: - `docs/linear-static-mitc4-shell/implementation-plan.md` -- status: `pass-for-reference-verification` -- owner_agent: `build-test-executor-agent` -- date: `2026-08-13` - -## Verdict - -The formal build/test gate passes. A fresh Visual Studio 18 2026/MSVC x64 Debug -configuration, clean full rebuild, three implementation-plan-focused CTest runs, -nonzero JSON discovery, full CTest regression, and the required Harness Python -self-test all completed successfully. - -- clean full rebuild: exit `0`; compiler/linker warning scan `0`; error scan `0` -- focused kernel/model/assembly/recovery regex: `87/87` passed -- focused linear-static lifecycle regex: `10/10` passed -- focused MITC4 reference-test regex: `8/8` passed -- CTest discovery: `144` tests, including `32` names containing `Mitc4` -- full CTest after clean rebuild: `144/144` passed -- Harness Python self-test: `7/7` passed -- failed tests: `0` -- required S4 reference hash mismatches or Git changes: `0` - -This verdict authorizes handoff to Reference Verification only. It does not approve -reference tolerance results, physics sanity, or release readiness. - -## Execution Environment - -- os: `Microsoft Windows 11 Home 10.0.26200 build 26200` -- branch: `feat-linear-static-mitc4-shell` -- source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` -- generator: `Visual Studio 18 2026` -- MSBuild: `18.8.2+ce25c0108` -- compiler: `MSVC 19.51.36252.0` -- compiler_architecture: `x64` -- Windows SDK: `10.0.26100.0` -- language/config: `C++17 / Debug` -- CMake: `4.4.0` -- build_dir: `.harness/build` -- harness_config: absent -- project_selection: auto CMake from root `CMakeLists.txt` -- command_discovery_path: default CMake/MSVC x64 Debug with implementation-plan - generator and dependency paths -- resolved dependencies: GoogleTest `C:/git/googletest`; oneMKL `2026.1.0`; - oneTBB package path `2023.1`; HDF5 package path `2.1.1` - -The generated compiler metadata at -`.harness/build/CMakeFiles/4.4.0/CMakeCXXCompiler.cmake` independently confirms -`CMAKE_CXX_COMPILER_ID=MSVC` and version `19.51.36252.0`. - -## Command Log Summary - -All durations below are wall-clock durations measured for the command. The initial -green chain was retained as corroborating evidence; the later clean-rebuild chain is -the canonical acceptance evidence. - -| order | command | exit_code | duration | relevant stdout/stderr tail | -| ---: | --- | ---: | ---: | --- | -| 1 | `git status --short --branch; git rev-parse HEAD` | 0 | `0.8 s` | Clean `feat-linear-static-mitc4-shell`; HEAD matched `820ba30...`. | -| 2 | Required dependency `Test-Path` precheck from the implementation plan | 0 | `0.215 s` | All four GoogleTest/MKL/TBB/HDF5 paths returned `True`. | -| 3 | `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 | `8.684 s` | MSVC `19.51.36252.0`, MKL `2026.1.0`; `Configuring done`, `Generating done`. The failed pthread probes were normal CMake feature probes; `Found Threads: TRUE`. | -| 4 | `cmake --build .harness/build --config Debug` | 0 | `4.382 s` | Initial incremental build produced `fesa.exe` and all three test executables; warning/error scan `0/0`. | -| 5 | `ctest --test-dir .harness/build -C Debug -R "DomainModel|InpDomainMapping|Mitc4Geometry|Mitc4Shell|DofManager|EssentialConstraints|SparseAssembly|LoadAssembly|ResultRecovery|Hdf5ResultsWriter" --output-on-failure` | 0 | `5.743 s` | `100% tests passed out of 87`; failed `0`. | -| 6 | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure` | 0 | `1.442 s` | `100% tests passed out of 10`; failed `0`. | -| 7 | `ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | `1.377 s` | `100% tests passed out of 8`; failed `0`. | -| 8 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | `0.208 s` | Discovered `144` tests; `32` test names contained `Mitc4`. | -| 9 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | `9.789 s` | Initial full regression: `144/144` passed; failed `0`. | -| 10 | First environment/reference audit helper | 1 | `0.9 s` | Non-gating report-generation error: it hardcoded nonexistent CMake internal directory `CMakeFiles/4.3.0`; both S4 hashes had already matched before the helper stopped. No build or test failed. | -| 11 | Corrected dynamic environment/reference audit helper | 0 | `0.583 s` | Located `CMakeFiles/4.4.0/CMakeCXXCompiler.cmake`; confirmed MSVC/version, both S4 hashes, no S4 diff, and clean worktree. | -| 12 | `cmake --build .harness/build --config Debug --target clean` | 0 | `1.251 s` | Generated Visual Studio clean target completed. | -| 13 | `cmake --build .harness/build --config Debug` | 0 | `94.616 s` | Canonical clean rebuild compiled/linked the solver, CLI, and all test executables; `89` output lines, warning scan `0`, error scan `0`. | -| 14 | `cmake --build .harness/build --config Debug --target fesa_unit_tests` | 0 | `1.943 s` | `fesa_solver`, GoogleTest, and `fesa_unit_tests.exe` confirmed. | -| 15 | Focused kernel/model/assembly/recovery regex from order 5 | 0 | `4.863 s` | Canonical focused run: `87/87` passed; failed `0`. | -| 16 | `cmake --build .harness/build --config Debug --target fesa_integration_tests` | 0 | `1.712 s` | `fesa_solver`, GoogleTest, and `fesa_integration_tests.exe` confirmed. | -| 17 | Focused lifecycle regex from order 6 | 0 | `1.531 s` | Canonical focused run: `10/10` passed; failed `0`. | -| 18 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | 0 | `1.769 s` | `fesa_solver`, GoogleTest, and `fesa_reference_tests.exe` confirmed. | -| 19 | Focused reference regex from order 7 | 0 | `1.511 s` | Canonical focused run: `8/8` passed; failed `0`; S4 end-to-end tests were included. | -| 20 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | `0.080 s` | Canonical discovery: `144` total, `32` MITC4-named; unit/integration/reference labels `121/10/13`. | -| 21 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | `9.669 s` | Canonical full regression: `100% tests passed out of 144`; failed `0`; CTest real time `9.62 s`. | -| 22 | Full `reference/` Git scope and worktree audit | 0 | `0.362 s` | `reference_diff_count=0`, `reference_status_count=0`; branch and HEAD unchanged. | -| 23 | `git merge-base dev HEAD` plus changed-file scope audit | 0 | `0.321 s` | Merge base `a058ef7...`; detected `scripts/execute.py`, so Harness Python self-test was required. | -| 24 | `uv run --with pytest python -m pytest -v -rs` | 0 | `4.651 s` | Python `3.11.15`, pytest `9.1.1`; `7 passed in 0.11s`; failed `0`. | - -## Validation Results - -| validation_stage | result | evidence | -| --- | --- | --- | -| clean baseline | pass | Branch and HEAD matched the requested baseline; worktree was clean before report creation. | -| dependency precheck | pass | All four implementation-plan dependency paths existed. | -| fresh configure | pass | VS18/x64 configure exit `0`; compiler metadata is MSVC x64. | -| clean full build | pass | Exit `0`; solver, CLI, unit, integration, and reference targets compiled/linked. | -| compiler warning policy | pass | Clean rebuild emitted zero warning lines and zero compiler/linker error lines; product CMake uses warnings-as-errors. | -| feature-specific tests | pass | Approved focused regexes passed `87/87`, `10/10`, and `8/8`. | -| CTest discovery | pass | Nonzero inventory: `144` tests, including `32` MITC4-named tests. | -| full CTest | pass | `144/144` passed after the clean rebuild. | -| Harness self-test | pass | Required because `scripts/execute.py` differs from the `dev` merge base; `7/7` passed. | -| reference immutability | pass | Required S4 SHA-256 values match; entire `reference/` tree has no Git diff or status entry. | - -## CTest Inventory - -| inventory | count | -| --- | ---: | -| all discovered tests | 144 | -| unit label | 121 | -| integration label | 10 | -| reference label | 13 | -| test names containing `Mitc4` | 32 | -| failed tests | 0 | - -The `32` MITC4-named tests comprise `30` tests in `Mitc4*` suites plus -`DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity` and -`InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity`. The broader focused regex -also exercises shared Domain, DOF, constraints, assembly, recovery, and HDF5 seams. - -CTest currently applies the target-wide legacy label -`linear-static-3d-euler-beam` to all `144` tests and has no separate MITC4 label. -The approved implementation plan explicitly permits exact suite regex filtering, -which was used here, so this labeling limitation is nonblocking. - -## Warning and Failure Audit - -- Clean rebuild warning lines: `0`. -- Clean rebuild compiler/linker error lines: `0`. -- Focused CTest failures: `0`. -- Full CTest failures: `0`. -- Harness Python failures: `0`. -- Configure probes for POSIX pthread symbols reported expected negative probe - results on MSVC before CMake resolved `Threads: TRUE`; this is not a configure - warning or failure. -- One report-generation helper failed because it assumed a CMake internal versioned - directory. The corrected dynamic lookup passed. This incident did not affect - configure, compile, link, test, reference artifacts, or the gate verdict. - -## Reference Read-Only Audit - -| exact approved path | observed SHA-256 | expected match | -| --- | --- | --- | -| `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | yes | -| `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | yes | - -The post-test audit found zero changed paths anywhere under `reference/`. No Abaqus -or other reference solver was run. - -## Failure Classification - -- classification: `N/A` -- primary_failure: `N/A` -- first_failed_build_or_test_command: `N/A` -- failed_target_or_test: `N/A` -- correction_handoff: `N/A` -- non_gating_incident: report-only environment metadata lookup used the wrong CMake - internal directory and was rerun successfully; no product correction is required - -## Failed Test Inventory - -None. All focused, full CTest, and Harness Python tests passed. - -## Handoff Recommendation - -| target_agent | reason | required_input | -| --- | --- | --- | -| Reference Verification Agent | Build/test status is `pass-for-reference-verification`. | This report, source HEAD `820ba30...`, `.harness/build/tests/Debug/fesa_reference_tests.exe`, and the unchanged declared S4 input/CSV pair. | - -The focused reference CTest generated/used build-local comparison evidence, but the -Build/Test Executor does not interpret that evidence as the formal reference -tolerance verdict. Reference Verification must independently inspect and report it. - -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_formulation_io_numerical_reference_documents_modified: `false` -- phase_files_modified: `false` -- tolerance_policies_modified: `false` -- reference_artifacts_modified: `false` -- owned_report_modified: `true` -- notes: The worktree was clean at the requested source HEAD before this report was - created. Build products remained under the ignored `.harness/build/` directory. - -## Open Issues - -- None blocking Reference Verification. -- The target-wide legacy CTest label prevents a precise MITC4 label count; exact - implementation-plan suite regexes provide the approved focused test entry point. diff --git a/docs/linear-static-mitc4-shell/coordination.md b/docs/linear-static-mitc4-shell/coordination.md deleted file mode 100644 index 077b7b1..0000000 --- a/docs/linear-static-mitc4-shell/coordination.md +++ /dev/null @@ -1,42 +0,0 @@ -# Linear Static MITC4 Shell Coordination Report - -## Metadata - -- feature_id: linear-static-mitc4-shell -- status: completed -- owner_agent: coordinator-agent -- date: 2026-08-15 -- migration_note: Existing evidence was relocated without rerunning workflow gates. - -## Worklist - -| stage | owner | status | evidence | -| --- | --- | --- | --- | -| 1. requirements | requirement-agent | passed | `requirements.md` | -| 2. research | research-agent | passed | `research.md` | -| 3. formulation | formulation-agent | passed | `formulation.md` | -| 4. numerical and reference | numerical-review-agent | passed | `numerical-review.md`; `reference-model.md` | -| 5. I/O | io-definition-agent | passed | `io.md` | -| 6. implementation and verification | implementation-planning-agent; implementation-agent | passed | `implementation-plan.md`; `build-test.md`; `reference-comparison.md` | -| 7. physics | physics-evaluation-agent | passed | `physics-evaluation.md` | -| 8. release | release-agent | passed | `release.md` | - -## Current Progress - -- active_sub_agent: none -- next_handoff: none -- closure_evidence: `release.md` status `ready-for-release` -- workflow_disposition: completed -- historical_gap: No standalone `implementation-report.md` existed before migration; no replacement was fabricated. - -## Decision Log - -| date | decision | evidence | rationale | -| --- | --- | --- | --- | -| 2026-08-15 | Record migrated workflow as completed | `release.md` | Preserve the existing release verdict without retroactive gate execution. | - -## Blockers and Rework - -- active_blockers: none -- correction_attempt_count: 0 -- needs_user_decision: false diff --git a/docs/linear-static-mitc4-shell/formulation.md b/docs/linear-static-mitc4-shell/formulation.md index 7635dda..a5bf629 100644 --- a/docs/linear-static-mitc4-shell/formulation.md +++ b/docs/linear-static-mitc4-shell/formulation.md @@ -1,5 +1,9 @@ # FESA Linear Static MITC4 Shell Formulation +> 적용 경계: 물리 정식화와 당시 수치 stabilization 유도를 구분한다. 현재 공변 trace-average +> scale·frozen lifecycle은 [고유치 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을 +> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않으며 S3 partial-BC 보류를 유지한다. + ## Metadata - feature_id: `linear-static-mitc4-shell` diff --git a/docs/linear-static-mitc4-shell/implementation-plan.md b/docs/linear-static-mitc4-shell/implementation-plan.md deleted file mode 100644 index 4ae32f5..0000000 --- a/docs/linear-static-mitc4-shell/implementation-plan.md +++ /dev/null @@ -1,921 +0,0 @@ -# Linear Static MITC4 Shell Implementation Plan - -> **For agentic implementation workers:** 이 문서는 사용자 승인 전 `draft`다. 승인 후 -> Implementation Planning Agent가 같은 내용으로 Harness phase planning files만 -> materialize한다. Implementation Agent는 승인된 phase의 pending Step을 -> `docs/HARNESS.md`와 `docs/HARNESS_WORKFLOW.md`에 따라 하나씩 실행해야 하며, -> Harness hook/runner lifecycle을 우회해서는 안 된다. - -## 1. Metadata - -- feature_id: `linear-static-mitc4-shell` -- document_type: `implementation-plan` -- status: `ready-for-implementation` -- approval_state: `harness-step-draft-approved-2026-08-12` -- owner_agent: `implementation-planning-agent` -- date: `2026-08-13` -- source_requirement: `docs/linear-static-mitc4-shell/requirements.md` -- source_research: `docs/linear-static-mitc4-shell/research.md` -- source_formulation: `docs/linear-static-mitc4-shell/formulation.md` -- source_numerical_review: - `docs/linear-static-mitc4-shell/numerical-review.md` -- source_io_definition: - `docs/linear-static-mitc4-shell/io.md` -- source_reference_models: - `docs/linear-static-mitc4-shell/reference-model.md` -- target_platform: `Windows x64 / MSVC / C++17` -- build_system: `CMake + CTest` -- execution_infrastructure: `Python Harness` -- current_numerical_verdict: `pass-for-implementation-planning` -- harness_task_name_candidate: `linear-static-mitc4-shell` -- implementation_authorized: `true-user-requested-2026-08-12` -- harness_execution_authorized: `true-user-requested-2026-08-12` -- phase_files_authorized: `true-user-approved-2026-08-12` - -### Goal - -승인된 Abaqus `.inp` subset의 `S4` 및 `S4R` source element를 하나의 FESA -`FESA-MITC4` 선형 정적 shell formulation으로 해석하고, 물리적으로 분리된 fixed -drilling stabilization, deterministic sparse assembly, mandatory HDF5 shell results, -sole declared S4 displacement reference case를 end-to-end로 연결한다. - -### Architecture - -기존 B33 경로를 파괴하거나 speculative common element hierarchy를 만들지 않는다. -Domain에 shell semantic records를 추가하고, 별도 concrete `Mitc4Shell` kernel과 -shell-specific recovery를 만든다. 기존 `Analysis` lifecycle, six-DOF nodal -load/constraint, sparse COO reduction, `LinearSolver`, generic `ResultsWriter` 경계, -HDF5 temporary/self-check/atomic replacement는 재사용한다. - -### Tech Stack - -- C++17, MSVC `/W4 /WX` -- CMake 3.25+, Visual Studio 18 2026 generator, x64 Debug -- GoogleTest/CTest -- Intel oneAPI MKL and TBB -- HDF5 schema version 0 -- Python 3 Harness runner and repository hooks - -### Global Constraints - -1. 모든 production behavior는 같은 Step 안에서 `RED -> observed failure -> - minimal GREEN -> focused VERIFY -> full VERIFY`를 닫는다. -2. production C++ 파일 변경은 관련 C++ test와 함께 수행한다. -3. public solver headers에 MKL, TBB, HDF5, Win32/vendor type을 노출하지 않는다. -4. Node/Element에 equation ID를 저장하지 않고 `DofManager`만 numbering, scatter, - constrained/free mapping 및 sparse pattern을 소유한다. -5. `S4`와 `S4R`은 같은 FESA numerical path를 사용하며 source metadata만 다르다. -6. physical 20-DOF kernel과 four numerical drilling coordinates를 recovery/output에서 - 분리한다. -7. reference files를 생성, 수정, rename, repair, normalize하지 않으며 Abaqus를 - 실행하지 않는다. -8. future geometrically nonlinear residual/tangent, distributed loads, mixed beam-shell - models, reduced integration/hourglass, drilling calibration/energy output, - `NR-O03`/`NR-O04`는 구현 범위 밖이다. -9. 이 `draft`의 승인은 phase planning files 작성만 허용한다. Harness 실행은 별도의 - 명시적 사용자 요청이 있어야 한다. - -## 2. Readiness Check - -| gate | evidence | status | planning consequence | -| --- | --- | --- | --- | -| Requirements | `docs/linear-static-mitc4-shell/requirements.md`, 001-072 approved | pass | 모든 must를 task/test에 추적 | -| Research | `docs/linear-static-mitc4-shell/research.md` | pass | source-backed MITC4 tying/director/drilling 경계 유지 | -| Formulation | `docs/linear-static-mitc4-shell/formulation.md`, `approved-for-implementation-planning` | pass | linear sections만 구현; Section 15 future nonlinear 제외 | -| Numerical Review | `docs/linear-static-mitc4-shell/numerical-review.md` | pass | critical blocker 없음; planning authorized | -| I/O | `docs/linear-static-mitc4-shell/io.md`, `approved-for-implementation-planning` | pass | keyword, diagnostic, HDF5 schema를 그대로 구현 | -| Reference Model | `docs/linear-static-mitc4-shell/reference-model.md` | pass | sole S4 input/CSV pair만 read-only acceptance input으로 사용 | -| Repository seams | parser/model, element/analysis, result/reference 영역 read-only 조사 | pass | candidate files와 current signatures 확인 | -| Toolchain paths | GoogleTest/MKL/TBB/HDF5 config directories 존재 | pass | Section 10의 exact configure command 사용 가능 | - -Toolchain path evidence was resolved in this workspace on `2026-08-12`with -`Test-Path -LiteralPath`returning `True`for all four literal directories used in -Sections 10 and 12. They are environment-resolved paths, not placeholders. Each Step -copies the fail-fast path precheck before CMake so a changed machine configuration -stops before RED/GREEN evidence is recorded. - -Declared read-only reference inventory: - -| case | source | displacement CSV | SHA-256 | -| --- | --- | --- | --- | -| S4 | `reference/shell/shell.inp` | `reference/shell/shell displacements.csv` | input `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF`; CSV `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | - -README, `metadata.json`, Abaqus provenance/version, canonical naming 및 추가 portfolio는 -readiness gate가 아니다. 현재 열린 product/numerical 결정은 없다. 남은 승인 항목은 -Section 12의 multi-Step Harness draft뿐이다. - -## 3. Implementation Scope - -### Included behavior - -- exactly one `*STEP, *STATIC`, small displacement/small rotation -- four-node `S4`/`S4R` parsing and one internal `FESA-MITC4` identity -- stable source instance/label/type and four-node source ordering -- homogeneous isotropic `E,nu` and centered single-layer constant `t` -- deterministic positive-thickness nodal directors and right-handed frames -- six global nodal DOFs; 24-entry shell scatter -- physical membrane, bending, transverse shear with MITC edge-midpoint tying -- common `2x2x2` Gauss integration for S4 and S4R -- fixed `k_d=10^-3 min(R+)` drilling stabilization from the eight physical - tangent-rotation diagonals only -- nodal BC and global CLOAD; aggregate director-parallel moment rejection -- deterministic global stiffness, constrained partition, factorize-before-load, - effective RHS, solve, full residual/reaction -- physical-only shell recovery, energy/equilibrium/verification metrics -- exact mandatory HDF5 model/result schema and failure-atomic finalization -- direct HDF5-to-Abaqus-displacement comparison: U blocking, UR warning-only - -### Non-goals - -- Abaqus `S4`/`S4R` algorithm equivalence -- B31 mapping, mixed B33/MITC4 model execution or common public element hierarchy -- `*DLOAD`, pressure, gravity, body/edge/follower load -- composite, offsets, variable thickness, explicit normal/orientation -- reduced integration, hourglass control, MITC4+ -- nonlinear state, finite director update, nonlinear residual/tangent execution -- drilling physical strain/load/result/stress/energy, coefficient sweep or calibration -- `NR-O03` smooth-angle and `NR-O04` warp/distortion threshold sweeps -- extra shell benchmarks as a completion gate -- Abaqus execution or reference artifact mutation - -## 4. Work Breakdown - -Tasks are ordered by implementation dependency. Harness executes Steps 0-13 in strict -order even when the minimal dependency set below is smaller. - -| task | depends on | -| --- | --- | -| TASK-00 | none | -| TASK-01 | TASK-00 | -| TASK-02 | TASK-01 | -| TASK-03 | TASK-02 | -| TASK-04 | TASK-03 | -| TASK-05 | TASK-04 | -| TASK-06 | TASK-00; executed after TASK-05 | -| TASK-07 | TASK-04, TASK-06 | -| TASK-08 | TASK-02, TASK-07 | -| TASK-09 | TASK-05, TASK-08 | -| TASK-10 | TASK-05, TASK-09 | -| TASK-11 | TASK-09, TASK-10 | -| TASK-12 | TASK-01, TASK-07, TASK-08, TASK-10, TASK-11 | -| TASK-13 | TASK-11, TASK-12 | -| TASK-14 | TASK-13 | -| TASK-15 | TASK-01, TASK-07, TASK-11 | -| TASK-16 | TASK-00 through TASK-15 | - -### TASK-00: `shell-semantic-model` - -- Own only model semantic records and immutable Domain access. -- Candidate additions: `Mitc4ShellDefinition`, `ShellSection`, source type enum/value, - internal formulation identity, four-node indices, material/section indices, node - director/frame storage. -- Preserve current B33 records and stable source/internal identity; reject mixed models - at mapping rather than designing a heterogeneous solver hierarchy. -- Tests: `MITC4-MODEL-001`, `MITC4-MODEL-002`. - -### TASK-01: `shell-domain-mapping` - -- Extend `AbaqusDomainMapper::map(const ParsedInput&)`; keep `AbaqusInputReader` - syntax-only. -- Accept exact S4/S4R and single-layer SHELL SECTION grammar, resolve ELSET/material, - identity wrappers and six-DOF BC/CLOAD. -- Fail closed with exact I/O diagnostic classes for connectivity, assignment, - unsupported option/procedure/mixed model/distributed load. -- Tests: `MITC4-MAP-001` through `MITC4-MAP-004`. - -### TASK-02: `shell-director-geometry` - -- Add deterministic geometry preprocessing after instance expansion: element normal - candidates, area-weighted nodal director, pairwise orientation validation and nodal - frame tie-break. -- Validate center, eight stiffness points, four tying points and committed recovery - points for finite bases, nonzero surface measure and positive finite Jacobian. -- Do not introduce calibrated angle, warp or distortion thresholds. -- Tests: `MITC4-GEO-001` through `MITC4-GEO-004`. - -### TASK-03: `mitc4-kinematics-constitutive` - -- Create concrete candidate `Mitc4Shell` without a public base hierarchy. -- Implement shape identities, local frames, `T_p`/`T_d` channel maps, direct - membrane/bending terms, all four covariant MITC tying samples/interpolation, - engineering-shear factors, `C_ps/C_5/A/D/A_s` and fixed point order. -- Keep all intermediate physical coordinates at 20 DOFs. -- Tests: `MITC4-KIN-001` through `MITC4-KIN-005`. - -### TASK-04: `mitc4-stiffness-drilling` - -- Form physical `K20` with common `2x2x2` integration and embed by congruence. -- Build `R+` only from the eight physical tangent-rotation diagonals, use exact - `k_d=10^-3 min(R+)` and `T_d^T(k_d I4)T_d`; fail empty/nonfinite `R+`. -- Tests: `MITC4-KERNEL-001` through `MITC4-KERNEL-006`. - -### TASK-05: `mitc4-physical-recovery` - -- Add only the element-kernel physical recovery seam for generalized strain/resultant, - bottom/middle/top stress and physical element energy. -- Prove pure numerical drill action contributes zero to every physical recovery value. -- Tests: `MITC4-KERNEL-007`, `MITC4-PHYSREC-001`. - -### TASK-06: `shell-dof-scatter` - -- Retain six per-node full DOFs and add typed 24-entry shell scatter/pattern access; - preserve existing 12-entry B33 behavior. -- Preserve stable full/free/constrained numbering and all-constrained `0x0 Kff`. -- Tests: `MITC4-DOF-001` through `MITC4-DOF-003`. - -### TASK-07: `shell-sparse-assembly` - -- Dispatch shell topology to `Mitc4Shell::globalStiffness()`. -- Emit 576 element-local COO entries with stable `elementOrder`/`localOrder` into - worker-owned buffers; preserve canonical fixed reduction and diagonal slots. -- Tests: `MITC4-ASM-001` through `MITC4-ASM-003`. - -### TASK-08: `shell-load-validation` - -- Reuse global six-DOF `LoadAssembler` and existing constraint partition. -- Aggregate CLOAD deterministically before testing exact-zero or - `rho_M=abs(dot(d,M))/norm(M)<=1e-12`; rejected moments never reach stabilization. -- Preserve force/moment units and factorization-before-load lifecycle. -- Tests: `MITC4-LOAD-001` through `MITC4-LOAD-004`. - -### TASK-09: `shell-analysis-state` - -- Add shell result rows to `AnalysisState` and `result_records.hpp`: four fixed - midsurface locations, local frames, eight generalized strains/resultants, - bottom/middle/top stress, physical energy, equilibrium and verification metrics. -- Preserve stable row order and expose candidate-owned containers only; perform no - element calculation in this task. -- Tests: `MITC4-STATE-001` through `MITC4-STATE-003`. - -### TASK-10: `shell-result-recovery` - -- Recover full residual `K*d-F` for nodal reaction/equilibrium evidence but call the - kernel physical-only recovery for shell quantities. -- Validate candidates fully before committing state; keep stable row order. -- Tests: `MITC4-REC-001` through `MITC4-REC-005`. - -### TASK-11: `shell-hdf5-output` - -- Extend `Hdf5ResultsWriter` behind the unchanged generic `ResultsWriter::write` - boundary. -- Add exact schema paths/shapes/component attributes from the I/O contract without - changing B33 dataset meaning. -- Reuse temporary write, finite/schema self-check, close/reopen and atomic replace. -- Tests: `MITC4-H5-001` through `MITC4-H5-004`. - -### TASK-12: `shell-linear-static-flow` - -- Route a shell Domain through the existing eight-hook `Analysis::run()` lifecycle. -- Preserve assemble/partition, factorize, load/effective RHS, substitute, - reconstruct, full residual/recover, atomic write order and single factorization. -- Validate nonzero prescribed values, singular support and valid all-constrained solve. -- Tests: `MITC4-FLOW-001` through `MITC4-FLOW-004`. - -### TASK-13: `shell-reference-comparison` - -- Add a test-only MITC4 comparator rather than widening beam-specific assumptions. -- Consume exactly one declared input and displacement CSV per case; map instance, - source node and six displacement components directly to HDF5. -- Precheck header/row set/duplicates/nonfinite/schema/identity before numeric work. -- Apply fixed absolute `1.0e-5` to every U/UR row without a scale-dependent decision - term; U blocks, UR only emits deterministic warning; record all required metrics - and worst row. -- Tests: `MITC4-REF-001` through `MITC4-REF-006`. - -### TASK-14: `shell-s4-end-to-end` - -- This is declared-case sub-work owned by TASK-13/Step 13's test-only reference module, - not an independent production-module Step. -- Run the declared S4 deck through CLI, authoritative HDF5, schema checks and - read-only comparator. -- Assert source type `S4`, internal `FESA-MITC4` and U pass/UR report behavior. -- Tests: `MITC4-E2E-S4-001`, `MITC4-E2E-S4-002`. - -### TASK-15: `shell-s4r-common-path-verification` - -- This is non-reference coverage distributed across the existing domain-mapping, - sparse-assembly and HDF5 tests; Step 13 does not consume an S4R Abaqus artifact. -- Assert S4R selects the same FESA-MITC4 integration/kernel/assembly path as an - otherwise identical S4 semantic fixture while preserving only source metadata. -- Tests: `InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity`, - `SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness`, and the - existing shell HDF5 source-type metadata coverage. - -### TASK-16: `mitc4-full-verification` - -- Run MSVC x64 Debug full build, CTest discovery, focused feature suites and full CTest. -- Audit warnings, deterministic repeat evidence, required HDF5 inventory, reference - immutability and git diff scope. -- Produce only downstream implementation evidence; do not claim reference verification, - physics sanity or release readiness. -- Tests/audits: `MITC4-VERIFY-001` through `MITC4-VERIFY-004`. - -## 5. TDD Test Plan - -| test id | initial RED assertion | minimal GREEN behavior | focused verification | -| --- | --- | --- | --- | -| MITC4-MODEL-001 | four-node S4/S4R records/director/source identity do not exist | immutable shell records preserve source and internal identity | `DomainModel.*` | -| MITC4-MODEL-002 | shell section/material/thickness ownership unavailable | one resolved centered homogeneous assignment per element | `DomainModel.*` | -| MITC4-MAP-001 | valid S4/S4R and SHELL SECTION reject | both source types map to FESA-MITC4 | `InpDomainMapping.*` | -| MITC4-MAP-002 | duplicate/unresolved/conflicting section cases lack exact errors | exact assignment/material validation | `InpDomainMapping.*` | -| MITC4-MAP-003 | excluded shell options/mixed models may be ignored | exact fail-closed diagnostics | `InpDomainMapping.*` | -| MITC4-MAP-004 | second/nonstatic/NLGEOM/DLOAD cases lack shell boundary tests | exact procedure/load rejection; no-op output unchanged | `InpDomainMapping.*` | -| MITC4-GEO-001 | planar/rotated/warped directors unavailable | deterministic unit director and right-handed frame | `Mitc4Geometry.*` | -| MITC4-GEO-002 | incident orientation/tie-break is untested | stable area-weighted result across repeated order | `Mitc4Geometry.*` | -| MITC4-GEO-003 | duplicate/bow-tie/zero/reversed/nonfinite geometry may pass | exact geometry failures | `Mitc4Geometry.*` | -| MITC4-GEO-004 | required-point Jacobian inventory absent | every required point finite and positive | `Mitc4Geometry.*` | -| MITC4-KIN-001 | shape/derivative identities unavailable | partition/unity/derivative identities | `Mitc4ShellKinematics.*` | -| MITC4-KIN-002 | frame/T transforms unavailable | orthonormal/right-handed frames and channel selection | `Mitc4ShellKinematics.*` | -| MITC4-KIN-003 | tying values/weights unavailable | four hand-computed covariant tying values | `Mitc4ShellKinematics.*` | -| MITC4-KIN-004 | constitutive/section matrices unavailable | exact coefficients, symmetry, positivity, unit rescaling | `Mitc4ShellConstitutive.*` | -| MITC4-KIN-005 | quadrature order not fixed | exact common 2x2x2 points/weights | `Mitc4ShellKinematics.*` | -| MITC4-KERNEL-001 | no 24x24 shell stiffness | finite symmetric 24x24 stiffness | `Mitc4ShellKernel.*` | -| MITC4-KERNEL-002 | energy congruence unavailable | 20/24 virtual work and energy equal within 1e-12 | `Mitc4ShellKernel.*` | -| MITC4-KERNEL-003 | rigid/rank checks fail | six physical rigid modes, physical rank 14, stabilized rank 18 | `Mitc4ShellKernel.*` | -| MITC4-KERNEL-004 | deformation energy/patch fields unavailable | positive membrane/bending/shear/twist modes | `Mitc4ShellPatch.*` | -| MITC4-KERNEL-005 | R+ membership/coefficient not implemented | exact rotational-only min and 1e-3 factor | `Mitc4ShellDrilling.*` | -| MITC4-KERNEL-006 | empty R+ and pure drill behavior unspecified | deterministic failure; pure drill stabilized | `Mitc4ShellDrilling.*` | -| MITC4-KERNEL-007 | drilling contaminates recovery/energy | physical recovery/energy exact zero for pure drill | `Mitc4ShellDrilling.*` | -| MITC4-PHYSREC-001 | kernel recovery contract is not independently callable | exact physical strain/resultant/stress/energy for hand field | `Mitc4ShellPhysicalRecovery.*` | -| MITC4-DOF-001 | shell scatter fixed at 12 | stable 24-entry scatter in node/component order | `DofManager.*` | -| MITC4-DOF-002 | shell pattern unavailable | sorted unique pattern with all diagonals | `DofManager.*` | -| MITC4-DOF-003 | constraint roundtrip lacks shell-sized system | no/mixed/all constraints and nonzero values roundtrip | `DofManager.*; EssentialConstraints.*` | -| MITC4-ASM-001 | assembler rejects four-node element | 576 stable local contributions assemble | `SparseAssembly.*` | -| MITC4-ASM-002 | thread/repetition may reorder | serial/TBB/repeated CSR bytes and values match | `SparseAssembly.*` | -| MITC4-ASM-003 | S4/S4R could branch numerically | identical semantic fixtures produce identical K | `SparseAssembly.*` | -| MITC4-LOAD-001 | shell force/moment fixture unavailable | six global components aggregate stably | `LoadAssembly.*` | -| MITC4-LOAD-002 | director-parallel exact-zero branch untested | zero aggregate moment accepted | `LoadAssembly.*` | -| MITC4-LOAD-003 | rho boundary/rejection untested | <=1e-12 accepted; >1e-12 exact diagnostic | `LoadAssembly.*` | -| MITC4-LOAD-004 | rejected moment might enter drill channel | failure occurs before RHS/substitution | `LoadAssembly.*` | -| MITC4-STATE-001 | AnalysisState has no shell row containers | exact shell row/component/location types are owned | `AnalysisState.*` | -| MITC4-STATE-002 | physical energy/equilibrium/metrics are absent | finite candidate global evidence is stored | `AnalysisState.*` | -| MITC4-STATE-003 | shell candidate rollback is unavailable | invalid candidate leaves prior state unchanged | `AnalysisState.*` | -| MITC4-REC-001 | shell row types absent | four ordered location/frame/strain/resultant rows | `ResultRecovery.*` | -| MITC4-REC-002 | bottom/middle/top stress absent | direct S11/S22/S12 recovery in fixed order | `ResultRecovery.*` | -| MITC4-REC-003 | energy may include drilling | physical strain energy excludes stabilization | `ResultRecovery.*` | -| MITC4-REC-004 | reaction/equilibrium semantics may diverge | full residual, force/moment balance, normalized metrics | `ResultRecovery.*` | -| MITC4-REC-005 | invalid partial rows may commit | nonfinite/inventory failure preserves old state | `ResultRecovery.*` | -| MITC4-H5-001 | shell metadata/model schema missing | exact metadata, elements, director/frame, material/section | `Hdf5ResultsWriter.*` | -| MITC4-H5-002 | mandatory shell result paths missing | exact displacement/reaction/frame/strain/resultant/stress/global rows | `Hdf5ResultsWriter.*` | -| MITC4-H5-003 | output request could filter or drilling paths appear | inventory unconditional; forbidden paths absent | `Hdf5ResultsWriter.*` | -| MITC4-H5-004 | invalid shell candidate may replace final file | self-check failure preserves prior final | `Hdf5ResultsWriter.*` | -| MITC4-FLOW-001 | shell cannot traverse Analysis lifecycle | exact hook order and one factorization | `LinearStaticCli.*` | -| MITC4-FLOW-002 | prescribed shell RHS/reconstruction absent | Ff-Kfc*dc and full displacement correct | `LinearStaticCli.*` | -| MITC4-FLOW-003 | singular/all-constrained behavior unproven | singular fails; 0x0 Kff succeeds | `LinearStaticCli.*` | -| MITC4-FLOW-004 | failed output may commit state | candidate state/output commits only after validation | `LinearStaticCli.*` | -| MITC4-REF-001 | six-column CSV header unsupported | exact MITC4 header maps instance/node/U/UR | `Mitc4ReferenceComparison.*` | -| MITC4-REF-002 | invalid row inventory may be ignored | missing/extra/duplicate/nonfinite/schema mismatch fails first | `Mitc4ReferenceComparison.*` | -| MITC4-REF-003 | tolerance could remain scale-dependent or clamp/row-normalize | exact fixed absolute `1.0e-5` for every U/UR row | `Mitc4ReferenceComparison.*` | -| MITC4-REF-004 | UR may block verdict | U blocks; UR only warns | `Mitc4ReferenceComparison.*` | -| MITC4-REF-005 | report metrics/order incomplete | row decisions, max, normalized, RMS, vector, worst row deterministic | `Mitc4ReferenceComparison.*` | -| MITC4-REF-006 | comparator may require administrative files | only declared input/CSV/HDF5 required | `Mitc4ReferenceComparison.*` | -| MITC4-E2E-S4-001 | S4 deck cannot produce valid shell HDF5 | CLI succeeds with exact S4 metadata/schema | `Mitc4S4Reference.*` | -| MITC4-E2E-S4-002 | S4 U comparison unavailable | all U rows pass; UR fully reported | `Mitc4S4Reference.*` | -| MITC4-VERIFY-001 | feature tests not discoverable | all planned suites discovered/labeled | CTest JSON inventory | -| MITC4-VERIFY-002 | warnings/regressions unknown | MSVC Debug full build passes /W4 /WX | full build | -| MITC4-VERIFY-003 | nondeterminism unknown | repeated focused/full tests pass | full CTest | -| MITC4-VERIFY-004 | artifact governance unknown | reference hashes/path and git diff unchanged | read-only audit | - -Numerical thresholds are fixed: frame/symmetry/transformation-energy `<=1e-12`; -rigid action, linear residual and global equilibrium `<=1e-10`. Patch tests compare -against independently hand-computed analytical fields and signs, not the production -routine itself. - -## 6. CMake/CTest Plan - -### Existing topology to preserve - -- production library: `fesa_solver` -- CLI: `fesa_cli` -- unit: `fesa_unit_tests` -- integration: `fesa_integration_tests` -- reference: `fesa_reference_tests` -- aggregate: `fesa_tests` - -No new executable target is required. New kernel/test/comparator source files are -explicitly registered in existing source lists. Add `linear-static-mitc4-shell` as an -additive CTest label without removing the B33 label. Because -`gtest_discover_tests()` currently applies target-wide labels, focused Step -verification uses exact suite regexes; label-based MITC4 filtering is enabled only -if per-test labeling can be added without relabeling unrelated B33 tests. - -Candidate registrations: - -- `src/fesa/CMakeLists.txt`: candidate `model/shell_geometry.cpp`, - `elements/mitc4_shell.cpp` and any separate shell recovery implementation. -- `tests/CMakeLists.txt`: candidate `shell_geometry_test.cpp`, - `mitc4_shell_test.cpp`, optional focused shell recovery/HDF5 tests, and MITC4 - reference comparator/test sources. -- Preserve existing runtime staging for MKL/TBB/HDF5 on all three test executables. - -CTest discovery must show every suite named in Section 5 before implementation is -considered verified. - -## 7. Candidate Files and Ownership - -All signatures in this section are candidates for the Implementation Agent to confirm -against the approved contracts during the owning Step; they are not new approved APIs. - -| owner/module | candidate files | candidate interface/direction | -| --- | --- | --- | -| model | `include/fesa/model/model_types.hpp`, `include/fesa/model/domain.hpp`, `src/fesa/model/domain.cpp` | separate shell records/accessors; no equation IDs | -| shell semantic geometry | candidate new `include/fesa/model/shell_geometry.hpp`, `src/fesa/model/shell_geometry.cpp` | director/frame and required-point geometry validation without parser/kernel dependency | -| Abaqus semantic map | `include/fesa/io/abaqus/domain_mapper.hpp`, `src/fesa/io/abaqus/domain_mapper.cpp` | keep `map(const ParsedInput&) -> Result` | -| analysis view | `include/fesa/analysis/analysis_model.hpp`, `src/fesa/analysis/analysis_model.cpp` | non-owning active shell view only if record representation requires | -| shell kernel | new `include/fesa/elements/mitc4_shell.hpp`, `src/fesa/elements/mitc4_shell.cpp` | concrete create/stiffness/physical-recover API | -| DOF | `include/fesa/fem/dof_manager.hpp`, `src/fesa/fem/dof_manager.cpp` | typed `array` shell scatter beside B33 scatter | -| sparse assembly | `src/fesa/assembly/sparse_assembler.cpp` | topology dispatch; unchanged public assemble signature | -| load | `src/fesa/assembly/load_assembler.cpp` only if aggregate director projection cannot live in semantic validation | reuse full six-DOF assembly | -| state/results | `include/fesa/analysis/analysis_state.hpp`, `src/fesa/analysis/analysis_state.cpp`, `include/fesa/results/result_records.hpp` | additive shell rows/global metrics | -| recovery | `include/fesa/results/result_recovery.hpp`, `src/fesa/results/result_recovery.cpp` or new shell-specific cpp | candidate-then-commit; physical/drill split | -| HDF5 | `src/fesa/io/hdf5/hdf5_results_writer.cpp` | generic public writer unchanged | -| lifecycle | `src/fesa/analysis/linear_static_analysis.cpp` | preserve existing hook order | -| app | `tests/integration/app/fesa_application_test.cpp`; production app only if feature dispatch needs it | CLI syntax unchanged | -| reference tests | new `tests/reference/mitc4_reference_comparison.hpp/.cpp` and tests | test-only direct HDF5/CSV comparator | -| build graph | `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt` | explicit additive source/test registration | - -Candidate kernel seam: - -```cpp -class Mitc4Shell { -public: - static Result create( - std::array nodes, - std::array initialDirectors, - const ShellSection& section, - const LinearElasticMaterial& material); - - [[nodiscard]] Matrix physicalLocalStiffness20() const; - [[nodiscard]] Matrix globalStiffness24() const; - [[nodiscard]] Result recoverPhysical( - const Vector& globalElementDisplacement24) const; -}; -``` - -This candidate explicitly avoids returning drill energy/results and avoids a common -public `Element` hierarchy. Exact value/reference ownership and math types are decided -inside TASK-03 after compiling the first RED test. - -## 8. Data Flow Contract - -```text -.inp bytes - -> AbaqusInputReader (syntax/source locations only) - -> AbaqusDomainMapper (approved semantics, S4/S4R provenance, section/material) - -> geometry/director preprocessing - -> immutable Domain - -> non-owning AnalysisModel - -> DofManager (6 DOF/node, 24-entry shell scatter, free/constrained maps) - -> Mitc4Shell physical K20 + fixed drill embedding -> global K24 - -> worker-local COO -> stable SparseMatrix reduction - -> Kff/Kfc/Kcf/Kcc partition -> Kff factorize - -> aggregate CLOAD/director check -> Ff-Kfc*dc - -> substitute -> full displacement - -> full residual K*d-F - -> physical-only shell recovery + global evidence - -> validated candidate AnalysisState - -> temporary results.h5 -> schema self-check -> atomic finalization - -authoritative results.h5 - -> test-only MITC4 HDF5 projection - -> exact source instance/node/component row-set precheck - -> read-only declared Abaqus displacement CSV - -> U blocking / UR warning-only deterministic report -``` - -Invariants: - -- Domain outlives AnalysisModel; no Domain copying. -- Source labels/instances/types never become equation indices. -- `S4`/`S4R` source type is metadata; both call the same kernel/quadrature. -- full residual uses stabilized global K; shell strain/resultant/stress/physical energy - use physical recovery only. -- HDF5 `nodal/reaction` is full residual; constraint mask decides reaction versus free - residual evidence. -- result rows use fixed GP1..GP4 and BOTTOM/MIDDLE/TOP identity; no averaging or Abaqus - integration-point relabeling. -- state/output mutation occurs only after complete validation. - -## 9. Acceptance Traceability Matrix - -The inclusive ranges below cover every must requirement `001` through `072` exactly -once without gap or overlapping requirement range. - -| requirement range | owning tasks | test/evidence id | reference model id | acceptance | -| --- | --- | --- | --- | --- | -| 001 | TASK-01, TASK-12 | MAP-004, FLOW-001 | N/A | one static step only; deterministic rejection otherwise | -| 002-004 | TASK-00, TASK-01, TASK-11, TASK-14, TASK-15 | MODEL-001, MAP-001, H5-001, S4 E2E plus S4R common-path tests | `shell-s4` for reference; S4R N/A | S4/S4R one kernel; distinct stable source identity | -| 005 | TASK-00, TASK-06, TASK-11 | MODEL-001, DOF-001/003, H5-001/002 | N/A | exact six-component order; no distributed equation ownership | -| 006-010 | TASK-00, TASK-01 | MODEL-002, MAP-002/003 | N/A | finite E,nu,t; one assignment; unsupported meanings fail | -| 011-016 | TASK-02, TASK-03 | GEO-001..004, KIN-002 | N/A | deterministic unit directors; exact geometry predicates | -| 017-020 | TASK-01, TASK-08 | MAP-004, LOAD-001..004 | N/A | six-DOF BC/CLOAD; drilling/distributed load fails | -| 021-023 | TASK-01 | MAP-001..004 and existing no-op regression | N/A | approved parser subset/identity wrappers/no-op policy | -| 024-030 | TASK-00, TASK-06, TASK-07, TASK-09, TASK-10, TASK-12, TASK-16 | MODEL, DOF, ASM, STATE, REC, FLOW, VERIFY suites | N/A | ownership, deterministic assembly, lifecycle, residual reaction | -| 031-038 | TASK-03, TASK-04, TASK-05, TASK-07, TASK-10 | KIN, KERNEL, PHYSREC, ASM-003, REC-003 | N/A | physical 5-DOF embedding, exact drilling, same quadrature, invariants | -| 039-048 | TASK-09, TASK-10, TASK-11, TASK-12 | STATE-001..003, REC-001..005, H5-001..004, FLOW-004 | N/A | mandatory finite schema/results and atomic commit | -| 049 | TASK-00 through TASK-16 | every production Task records RED/failure/GREEN/focused/full VERIFY; VERIFY-001..003 | `shell-s4` where reference-dependent | TDD evidence, related C++ tests, MSVC Debug no-warning build and full CTest | -| 050 | TASK-02 through TASK-05, TASK-07 | GEO-001/002, KIN-001/002, KERNEL-001..004, ASM-002 | N/A | frames, Jacobian, symmetry, transformation, six modes, positivity and repeatability | -| 051 | TASK-02 through TASK-05, TASK-10, TASK-12 | GEO-001, KERNEL-001..003, REC-004, FLOW-002 | N/A | exact normalized 1e-12 and 1e-10 algebraic thresholds | -| 052 | TASK-03 through TASK-05, TASK-10 | KIN-003/004, KERNEL-004, PHYSREC-001, REC-001/002 | N/A | independent membrane, bending, shear, twist fields and recovery signs/order | -| 053 | TASK-04, TASK-05, TASK-14 | KERNEL-001..007, PHYSREC-001, declared S4 E2E suite | `shell-s4` | formulation invariants/patches and the S4 reference case pass | -| 054 | TASK-02 | GEO-001..004 | N/A | exact valid/rejected geometry inventory; no NR-O03/O04 | -| 055 | TASK-16 | VERIFY scope audit | N/A | extra benchmark portfolio is explicitly nonblocking and absent from completion gate | -| 056 | TASK-04, TASK-05, TASK-07, TASK-10 | KERNEL-005..007, PHYSREC-001, ASM-001/002, REC-003 | N/A | exact fixed drilling, deterministic rank/action and physical-output exclusion | -| 057 | TASK-10, TASK-12, downstream Physics Evaluation | REC-002..004, FLOW-002, later physics report | `shell-s4` | implementation exposes equilibrium/sign/energy evidence; physical plausibility verdict is downstream | -| 058-060 | TASK-13, TASK-14 | REF-003 and S4 E2E comparison | `shell-s4` | exact fixed absolute U tolerance `1.0e-5` without scale/clamp | -| 061-062 | TASK-13, TASK-14 | REF-004/005 and S4 E2E test | `shell-s4` | UR fixed absolute `1.0e-5`, deterministic warning only | -| 063-064 | TASK-13 | REF-001/002/005 | `shell-s4` | schema/row failure before numeric comparison; full metrics | -| 065-068 | TASK-13, TASK-14, TASK-15 | REF-001/002/006, S4 case precheck and S4R non-consumption/common-path evidence | `shell-s4` | exact two S4 paths; unique finite mapped rows; no S4R artifact consumption | -| 069-071 | TASK-14, TASK-15 | S4 E2E suite and S4R common-path tests | `shell-s4` | S4 U blocks/UR warns; S4R mapping has no Abaqus equality gate | -| 072 | TASK-13 through TASK-16 | REF-006, VERIFY-004 and git/hash audit | `shell-s4` | no reference solver run or artifact mutation | - -## 10. Validation Commands - -These commands are the environment-resolved Windows x64 Debug baseline. Planning does -not execute build/tests. Each approved Harness Step first runs this literal path -precheck and then repeats the relevant build/test subset after its RED and GREEN -changes. - -```powershell -$requiredBuildPaths = @( - "C:/git/googletest", - "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl", - "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb", - "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake" -) -foreach ($requiredBuildPath in $requiredBuildPaths) { - if (-not (Test-Path -LiteralPath $requiredBuildPath)) { - throw "Required configured build path is absent: $requiredBuildPath" - } -} - -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" - -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -Focused commands: - -```powershell -cmake --build .harness/build --config Debug --target fesa_unit_tests -ctest --test-dir .harness/build -C Debug -R "DomainModel|InpDomainMapping|Mitc4Geometry|Mitc4Shell|DofManager|EssentialConstraints|SparseAssembly|LoadAssembly|ResultRecovery|Hdf5ResultsWriter" --output-on-failure - -cmake --build .harness/build --config Debug --target fesa_integration_tests -ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure - -cmake --build .harness/build --config Debug --target fesa_reference_tests -ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference" --output-on-failure -``` - -Planning-document verification: - -```powershell -git diff --check -- docs/linear-static-mitc4-shell/implementation-plan.md -git status --short -git diff --name-only -``` - -Reference immutability audit is read-only and fails on any mismatch: - -```powershell -$expectedReferenceHashes = [ordered]@{ - "reference/shell/shell.inp" = "4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF" - "reference/shell/shell displacements.csv" = "C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B" -} -foreach ($referencePath in $expectedReferenceHashes.Keys) { - $actualHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $referencePath).Hash - if ($actualHash -ne $expectedReferenceHashes[$referencePath]) { - throw "Reference artifact changed: $referencePath" - } -} -``` - -Do not invoke `scripts/hooks/*.py` manually. Harness runner installs/uses the configured -PreToolUse and Stop hooks automatically. Do not invoke `scripts/execute.py` until the -user separately authorizes execution. - -## 11. Risks and Downstream Handoff - -| risk | controlling plan decision | stop condition | -| --- | --- | --- | -| beam-only ModelDefinition leaks through every layer | add shell semantic records first; preserve B33 access | stop if a Step requires unapproved mixed-model hierarchy | -| fixed 12-DOF scatter breaks B33 | typed beam/shell scatter paths and B33 regressions | stop on any B33 focused/full regression | -| drilling contaminates physical output | separate physical recovery from stabilized full K | stop if pure-drill recovery/energy is nonzero | -| director/frame sign nondeterminism | source-order, area-weight and tie-break tests | stop on repeat/order/thread difference | -| S4R accidentally selects reduced integration | one internal formulation and ASM/E2E equality tests | stop if source type reaches quadrature dispatch | -| full residual confused with element resultants | keep reaction from Kd-F, physical recovery separately | stop if reaction is reconstructed from shell resultants | -| writer expansion changes B33 schema | additive shell branches plus full B33 CTest | stop on B33 schema regression | -| comparator inherits B33 four-file/Frame assumptions | dedicated test-only MITC4 comparator | stop if administrative files become required | -| reference artifacts staged by Harness | clean isolated worktree, hash/diff audit | stop immediately on any reference path change | -| future nonlinear equations enter production | scope and code review prohibition | stop if nonlinear state/tangent is allocated or called | - -### Implementation Agent - -- Read the approved implementation plan, `docs/HARNESS.md` and - `docs/HARNESS_WORKFLOW.md` before every Step. -- Execute only the Harness-selected pending Step and use the repository hooks/scripts - through the documented runner lifecycle. -- Never choose the next Step, edit executor-owned timestamps/statuses, batch multiple - Steps, or implement outside the Step's file ownership. -- Record the RED command and observed failure before GREEN. - -### Build/Test Executor Agent - -- Use Section 10 exact CMake/MSVC/CTest baseline after implementation Steps finish. -- Report new warnings, discovery gaps and exact failing test names without changing - upstream contracts. - -### Correction Agent - -- Apply only minimal failure-driven corrections inside approved file ownership. -- Do not reinterpret MITC4 mathematics, I/O schema or tolerance. - -### Reference Verification Agent - -- Consume authoritative HDF5 and declared read-only CSV directly. -- Create the separate reference-verification report; only U affects pass/fail and every - UR warning remains visible. - -### Physics Evaluation and Release Agents - -- Physics evaluates equilibrium, directions, symmetry, energy and result signs after - reference verification. -- Release readiness remains blocked until implementation, build/test, reference and - physics gates all provide evidence. - -## 12. Harness Step Draft - -This approved draft is materialized under `phases/linear-static-mitc4-shell/`. -Every Step is zero-based, kebab-case and closes RED/GREEN/VERIFY before the -Executor advances it. TASK-14 is declared-case sub-work inside Step 13's single -test-only reference module; TASK-15 is non-reference coverage already owned by -Steps 1/7/11; TASK-16 is downstream Build/Test Executor evidence, -not an Implementation Agent phase Step. During materialization, the exact required-reading -paths, configure block, focused command and full VERIFY block shown here are copied -verbatim into every `stepN.md`; a materialized Step never refers back to this draft or -to an external conversation. - -Every materialized Step copies this mandatory reading inventory before its -Step-specific paths: - -- `AGENTS.md` -- `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md` -- `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md` -- this approved implementation plan and all source contracts listed in Metadata -- `.codex/hooks.json` -- `phases/index.json`, `phases/linear-static-mitc4-shell/index.json` and its own - `phases/linear-static-mitc4-shell/stepN.md` -- every path created/modified by prerequisite Steps and their step output/status - -If any mandatory or Step-specific path is missing or contradicts the approved plan, -the Implementation Agent records `blocked` for the Executor-selected current Step and -stops; it does not invent the missing contract. - -Step-specific path ledger copied into the corresponding materialized Step: - -| Step | exact source/prerequisite paths | -| ---: | --- | -| 0 | `include/fesa/model/model_types.hpp`; `include/fesa/model/domain.hpp`; `src/fesa/model/domain.cpp`; `tests/unit/model/model_types_test.cpp`; `tests/unit/model/domain_test.cpp` | -| 1 | Step 0 paths; `include/fesa/io/abaqus/domain_mapper.hpp`; `src/fesa/io/abaqus/domain_mapper.cpp`; `tests/unit/io/abaqus/domain_mapper_test.cpp` | -| 2 | Step 0-1 paths; candidate new `include/fesa/model/shell_geometry.hpp`; `src/fesa/model/shell_geometry.cpp`; `tests/unit/model/shell_geometry_test.cpp`; `src/fesa/CMakeLists.txt`; `tests/CMakeLists.txt` | -| 3 | Step 2 paths; candidate new `include/fesa/elements/mitc4_shell.hpp`; `src/fesa/elements/mitc4_shell.cpp`; `tests/unit/elements/mitc4_shell_test.cpp`; `src/fesa/CMakeLists.txt`; `tests/CMakeLists.txt` | -| 4 | Step 3 MITC4 kernel/header/test paths | -| 5 | Step 3-4 MITC4 kernel/header/test paths | -| 6 | Step 0 paths; `include/fesa/fem/dof_manager.hpp`; `src/fesa/fem/dof_manager.cpp`; `tests/unit/fem/dof_manager_test.cpp`; `tests/unit/constraints/essential_constraints_test.cpp` | -| 7 | Steps 4/6 paths; `include/fesa/assembly/sparse_assembler.hpp`; `src/fesa/assembly/sparse_assembler.cpp`; `tests/unit/assembly/sparse_assembler_test.cpp` | -| 8 | Steps 2/7 paths; `include/fesa/assembly/load_assembler.hpp`; `src/fesa/assembly/load_assembler.cpp`; `tests/unit/assembly/load_assembler_test.cpp` | -| 9 | Step 5 paths; `include/fesa/results/result_records.hpp`; `include/fesa/analysis/analysis_state.hpp`; `src/fesa/analysis/analysis_state.cpp`; `tests/unit/results/result_records_test.cpp` | -| 10 | Steps 5/9 paths; `include/fesa/results/result_recovery.hpp`; `src/fesa/results/result_recovery.cpp`; `tests/unit/results/result_recovery_test.cpp` | -| 11 | Steps 9/10 paths; `include/fesa/io/hdf5/hdf5_results_writer.hpp`; `src/fesa/io/hdf5/hdf5_results_writer.cpp`; `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` | -| 12 | Steps 7-11 paths; `include/fesa/analysis/linear_static_analysis.hpp`; `src/fesa/analysis/linear_static_analysis.cpp`; `tests/integration/analysis/linear_static_analysis_test.cpp`; `tests/integration/app/fesa_application_test.cpp` | -| 13 | Steps 11/12 paths; candidate new `tests/reference/mitc4_reference_comparison.hpp`, `tests/reference/mitc4_reference_comparison.cpp`, `tests/reference/mitc4_reference_comparison_test.cpp`, `tests/reference/mitc4_reference_cases_test.cpp`; `tests/CMakeLists.txt`; the two exact read-only S4 reference paths in Section 2 | - -The configure command copied before each Step's RED build is: - -```powershell -$requiredBuildPaths = @( - "C:/git/googletest", - "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl", - "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb", - "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake" -) -foreach ($requiredBuildPath in $requiredBuildPaths) { - if (-not (Test-Path -LiteralPath $requiredBuildPath)) { - throw "Required configured build path is absent: $requiredBuildPath" - } -} - -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" -``` - -The full VERIFY block copied at the end of every Step is: - -```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -### Step 0 — `shell-semantic-model` - -- Required reading: requirements 002-016/024, I/O Sections 3/5, architecture model - ownership, current `model_types.hpp`/`domain.*` and their tests. -- Prerequisite: approved plan only; no production dependency on a prior Step. -- RED: add MODEL-001/002 tests and CMake registration if needed; run: - `cmake --build .harness/build --config Debug --target fesa_unit_tests` then - `ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure`. - Record the missing shell type/accessor failure. Unexpected pass is a stop. -- GREEN: minimally add shell semantic records/Domain const access; no parser/kernel. -- VERIFY: rerun the focused commands and common full VERIFY. -- Prohibitions: no equation IDs, element hierarchy, mixed-model execution, parser edits. - -### Step 1 — `shell-domain-mapping` - -- Required reading: Step 0 outputs, requirements 001-010/017-023, I/O Sections 1-3/8-9, - current `domain_mapper.*` and parser/model tests. -- Prerequisite: Step 0 `completed`. -- RED: add MAP-001..004; build `fesa_unit_tests` and run - `ctest --test-dir .harness/build -C Debug -R "InpDomainMapping" --output-on-failure`. - Record valid S4/S4R rejection and exact negative diagnostic failures. -- GREEN: minimally extend semantic mapping; keep `input_reader` syntax-only. -- VERIFY: focused parser/model tests, then common full VERIFY. -- Prohibitions: no element math, no silent unsupported keyword, no reference edits. - -### Step 2 — `shell-director-geometry` - -- Required reading: requirements 011-016, formulation Sections 4/9/17, Numerical Review - 5.2/5.5/6.1, I/O 3.3/9, completed semantic model/mapping. -- Prerequisite: Step 1 `completed`. -- RED: add GEO-001..004; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "Mitc4Geometry" --output-on-failure`. -- GREEN: implement deterministic director/frame and exact geometry inventory validation. -- VERIFY: focused geometry/mapping tests, then common full VERIFY. -- Prohibitions: no calibrated angle/warp/distortion threshold; no NR-O03/O04. - -### Step 3 — `mitc4-kinematics-constitutive` - -- Required reading: formulation Sections 3-11/17, Numerical Review 5.1-5.6/6.1, - current math adapters and Euler kernel style. -- Prerequisite: Step 2 `completed`. -- RED: add KIN-001..005 in new `mitc4_shell_test.cpp`, register it, build unit target, - run `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKinematics|Mitc4ShellConstitutive" --output-on-failure`. -- GREEN: minimally add concrete shell kernel kinematics/constitutive seams; no global - assembly or drilling. -- VERIFY: focused kernel tests, then common full VERIFY. -- Prohibitions: no public base hierarchy, no S4R branch, no nonlinear tangent code. - -### Step 4 — `mitc4-stiffness-drilling` - -- Required reading: formulation Sections 10-14/17, requirements 031-038/050-056, - Numerical Review 5.7/6.1-6.2, completed Step 3 kernel. -- Prerequisite: Step 3 `completed`. -- RED: add KERNEL-001..006; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling" --output-on-failure`. -- GREEN: implement K20, 20-to-24 congruence and exact fixed drilling only. -- VERIFY: focused kernel suite, then common full VERIFY. -- Prohibitions: translations in R+, coefficient sweep, recovery/result output, future nonlinear. - -### Step 5 — `mitc4-physical-recovery` - -- Required reading: formulation Sections 14/16, requirements 035/042-046/052/056, - I/O result component/location order, completed Step 4 kernel. -- Prerequisite: Step 4 `completed`. -- RED: add KERNEL-007 and PHYSREC-001; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery" --output-on-failure`. -- GREEN: minimally add kernel-local physical recovery and physical energy API only. -- VERIFY: focused physical recovery/drilling tests, then common full VERIFY. -- Prohibitions: no AnalysisState/global result rows, no drilling contribution or HDF5. - -### Step 6 — `shell-dof-scatter` - -- Required reading: requirements 005/025, architecture DofManager ownership, current - `dof_manager.*` and constraint tests, completed shell model. -- Prerequisite: Step 5 `completed`. -- RED: add DOF-001..003; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "DofManager|EssentialConstraints" --output-on-failure`. -- GREEN: minimally add typed 24-entry scatter/pattern while preserving 12-entry B33. -- VERIFY: focused DOF/constraint tests, then common full VERIFY. -- Prohibitions: no equation IDs in model, no constraint/load ownership move. - -### Step 7 — `shell-sparse-assembly` - -- Required reading: requirements 027/030/037, architecture deterministic COO rule, - current `sparse_assembler.cpp`/`sparse_matrix.cpp` tests, completed kernel/scatter. -- Prerequisite: Step 6 `completed`. -- RED: add ASM-001..003; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "SparseAssembly" --output-on-failure`. -- GREEN: minimally dispatch shell and emit stable 576-entry local buffers. -- VERIFY: focused assembly tests, then common full VERIFY. -- Prohibitions: no worker global CSR mutation, unordered reduction or S4R integration branch. - -### Step 8 — `shell-load-validation` - -- Required reading: requirements 017-020/028, formulation 8/13, I/O 4.2-4.3, - current `load_assembler.*` and constraint lifecycle. -- Prerequisite: Step 7 `completed`. -- RED: add LOAD-001..004; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "LoadAssembly|EssentialConstraints" --output-on-failure`. -- GREEN: minimally add aggregate nodal moment/director validation and reuse full DOF load. -- VERIFY: focused load/constraint tests, then common full VERIFY. -- Prohibitions: no distributed/equivalent/follower load; no drill load channel. - -### Step 9 — `shell-analysis-state` - -- Required reading: requirements 026/041-046/048, I/O 6.3-6.5, - current `analysis_state.*`/`result_records.hpp` and completed physical recovery types. -- Prerequisite: Step 8 `completed`. -- RED: add STATE-001..003; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "AnalysisState" --output-on-failure`. -- GREEN: minimally add candidate-owned shell row/global evidence containers and - validation/commit mechanics. -- VERIFY: focused AnalysisState tests, then common full VERIFY. -- Prohibitions: no element calculation, ResultRecovery orchestration or HDF5 writing. - -### Step 10 — `shell-result-recovery` - -- Required reading: requirements 029/035/041-046/048, formulation 14/16, I/O 6.3-6.5, - current `result_recovery.*` and completed Steps 5/9. -- Prerequisite: Step 9 `completed`. -- RED: add REC-001..005; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "ResultRecovery" --output-on-failure`. -- GREEN: minimally orchestrate full-residual evidence and physical shell recovery into - a fully validated candidate, then commit it. -- VERIFY: focused recovery tests, then common full VERIFY. -- Prohibitions: no new result record type, location averaging, drill recovery or writer edit. - -### Step 11 — `shell-hdf5-output` - -- Required reading: requirements 039-048, I/O Section 6 exact schema, ADR atomic output, - current HDF5 writer/self-check tests, completed recovery records. -- Prerequisite: Step 10 `completed`. -- RED: add H5-001..004; build unit target and run - `ctest --test-dir .harness/build -C Debug -R "Hdf5ResultsWriter" --output-on-failure`. -- GREEN: add exact additive shell schema behind unchanged ResultsWriter boundary. -- VERIFY: focused HDF5 tests, then common full VERIFY. -- Prohibitions: no B33 schema reinterpretation, CSV solver output, partial final file. - -### Step 12 — `shell-linear-static-flow` - -- Required reading: requirements 024-030, architecture eight-hook lifecycle, I/O CLI - contract, current `linear_static_analysis.*`/application integration tests. -- Prerequisite: Step 11 `completed`. -- RED: add FLOW-001..004; build integration target and run - `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure`. -- GREEN: minimally route shell through existing lifecycle; preserve one factorization. -- VERIFY: focused integration tests, then common full VERIFY. -- Prohibitions: no analysis lifecycle reorder, no 0x0 singular conversion, no early state commit. - -### Step 13 — `shell-reference-comparison` - -- Required reading: requirements 058-072, I/O Section 7, Reference Model contract, - the sole declared S4 paths and hashes, and current B33 comparator only as reusable - identity/report precedent. -- Scope ownership: this one test-only reference module owns TASK-13 comparator behavior - plus TASK-14 declared-case tests; it owns no solver production module. -- Prerequisite: Step 12 `completed` and valid MITC4 HDF5 fixture. -- RED: update REF-003 first so the existing scale-dependent comparator fails against - literal fixed-boundary cases around `1.0e-5`; build the reference target and run - `ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference" --output-on-failure`. - Record the expected old-tolerance assertion failure. -- GREEN: minimally replace only the MITC4 comparator decision value with fixed absolute - `1.0e-5`; keep reference scale as diagnostic report data only. -- If a declared case exposes a production defect outside this reference-test module, - stop the Step and route a focused correction to the owning prior module; do not patch - unrelated production layers inside this Step. -- VERIFY: focused comparator and the declared S4 tests, then common full VERIFY. -- Prohibitions: no reference artifact writes/Abaqus run, no metadata/README gate, no UR - blocking, no B33 comparator change, and no scale/clamp substitution for fixed `1.0e-5`. - -After explicit approval, planning may create only: - -- `phases/index.json` with task status `pending` and no creation timestamp; -- `phases/linear-static-mitc4-shell/index.json` with Steps 0-13 initially `pending` and - no executor-owned timestamps; -- `phases/linear-static-mitc4-shell/stepN.md` containing the approved self-contained - directions. - -Approval does not authorize `python scripts/execute.py linear-static-mitc4-shell` or -`--push`. - -## 13. Open Issues - -| id | item | blocking now | resolution owner | -| --- | --- | --- | --- | -| OI-001 | Section 12 multi-Step Harness draft was explicitly approved on 2026-08-12 and materialized. | resolved | user | -| OI-002 | Candidate shell semantic representation and exact C++ value/reference types are not public API decisions. | no | owning RED test in Steps 0/3 | -| OI-003 | Per-test MITC4 CTest label can be added without relabeling B33 tests인지 확인한다. Exact suite regex remains sufficient. | no | Step 0 and downstream TASK-14 CMake verification | - -No mathematical, I/O, reference-inventory or tolerance decision remains open for -implementation planning. The user separately authorized implementation and Harness -execution on 2026-08-12; the Executor still owns branch, Step selection, timestamps, -commits and advancement. diff --git a/docs/linear-static-mitc4-shell/physics-evaluation.md b/docs/linear-static-mitc4-shell/physics-evaluation.md deleted file mode 100644 index 9b466a3..0000000 --- a/docs/linear-static-mitc4-shell/physics-evaluation.md +++ /dev/null @@ -1,331 +0,0 @@ -# Linear Static MITC4 Shell Physics Evaluation Report - -## Metadata - -- feature_id: `linear-static-mitc4-shell` -- model_id: `shell-s4` -- evaluated_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` -- source_build_test_report: - `docs/linear-static-mitc4-shell/build-test.md` -- source_reference_verification_report: - `docs/linear-static-mitc4-shell/reference-comparison.md` -- source_reference_model: - `docs/linear-static-mitc4-shell/reference-model.md` -- source_requirement: `docs/linear-static-mitc4-shell/requirements.md` -- source_formulation: `docs/linear-static-mitc4-shell/formulation.md` -- source_numerical_review: - `docs/linear-static-mitc4-shell/numerical-review.md` -- source_io_definition: `docs/linear-static-mitc4-shell/io.md` -- status: `pass-for-release-agent` -- owner_agent: `physics-evaluation-agent` -- date: `2026-08-13` - -This verdict means that the documented physical checks pass and the Release Agent -may audit release readiness. It does not approve release readiness, re-approve the -reference comparison, or change its tolerance decision. - -## Input Evidence - -The prerequisite reference-verification report has status -`pass-for-physics-evaluation`. The existing S4 reference-test route was rebuilt and -executed to regenerate fresh FESA evidence. Abaqus and other reference solvers were -not executed. - -| evidence | exact path or identity | status | notes | -| --- | --- | --- | --- | -| build/test report | `docs/linear-static-mitc4-shell/build-test.md` | `pass-for-reference-verification` | Clean MSVC x64 Debug build, focused `87/87`, lifecycle `10/10`, reference `8/8`, and full `144/144` CTest passed. | -| reference verification | `docs/linear-static-mitc4-shell/reference-comparison.md` | `pass-for-physics-evaluation` | Required prerequisite satisfied; 147/147 blocking U rows passed and no UR warning was emitted. | -| solver HDF5 | `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | present and readable | Freshly generated, 95,024 bytes; observed raw SHA-256 `E102D80E82BA133EBDF1C5532F3A0A4FE9984AB6CC36D00264399F7308D9230F` (inventory only). | -| comparison ledger | `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | present and passing | 94,349 bytes; SHA-256 `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6`; `passed=true`. | -| declared S4 input | `reference/shell/shell.inp` | present, unchanged, read-only | SHA-256 `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF`. | -| declared displacement CSV | `reference/shell/shell displacements.csv` | present, unchanged, read-only | SHA-256 `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B`. | -| optional Abaqus reaction/stress CSVs | `reference/shell/shell reactions.csv`, `reference/shell/shell stresses.csv` | not used as equality gates | Their presence did not expand the approved U-only blocking boundary. | -| solver CSV views | N/A | not generated | HDF5 was inspected directly. | -| fresh S4 route | `.harness/build`, MSVC x64 Debug | pass | `Mitc4S4Reference.*` passed `2/2`. | - -The HDF5 contains 49 nodes, 36 source-`S4` elements, internal formulation -`FESA-MITC4`, and the required full `2 x 2 x 2` result inventory. All inspected -numeric model and result values were finite. The diagnostics dataset contains four -approved warning rows for ignored `PREPRINT`, `RESTART`, and `OUTPUT` keywords and -no error diagnostic. - -Raw HDF5 bytes are not a physics decision identity and may change across valid -regenerations. The projected values and deterministic comparison ledger are the -relevant evidence. - -### Documented model expectation - -The reference input is a flat `10 x 10`, thickness `0.5`, homogeneous isotropic -square plate with `E=2.1e11` and `nu=0.3`. Its 24 perimeter nodes are fully clamped -in all six global DOFs, and center node 2 at the global origin carries one -`F3=-100000` concentrated force. The geometry, boundary, material, and load are -symmetric about both global `x=0` and `y=0` planes. - -The documented physical expectations are therefore: - -- total constrained reaction force opposes the applied `-Z` force; -- total force and moment about the global origin balance within the approved - normalized `1e-10` limit; -- perimeter displacements are zero and the interior deflects in `-Z`, with the - largest magnitude at the center; -- the displacement and rotation field obeys the polar/axial-vector reflection - parity about both symmetry planes; -- a linear, flat transverse plate response has no membrane strain/resultant or - middle-surface in-plane stress, while bottom and top in-plane stresses reverse; -- stored physical strain energy is finite, strictly positive, and consistent with - the recovered generalized fields and `0.5 F^T d`; -- free residual, finite results, rank/rigid-mode evidence, and the approved - one-case coverage show no rigid-body or unsupported-mode symptom. - -## Physics Checks - -| check | documented expectation | observed evidence | verdict | classification | -| --- | --- | --- | --- | --- | -| global equilibrium | Applied plus constrained reaction force/moment about origin; normalized metrics `<=1e-10` | force residual `[0,0,-1.12049747258425e-9]`; moment residual `[6.45741238258779e-10,-2.63753463514149e-10,0]`; normalized force/moment `1.12049747258425e-14` / `2.35981341581908e-15` | pass | N/A | -| reaction consistency | Perimeter-only reactions from full residual oppose `F3=-100000`; constrained motion is zero | summed constrained force `[0,0,99999.9999999989]`; constrained displacement exactly zero | pass | N/A | -| displacement direction | Interior bends in `-Z`; center is maximum; no in-plane or drilling leakage | center `U3=-2.35504417650849e-5`; all 25 free-node U3 values nonpositive; `U1/U2/UR3` exactly zero | pass | N/A | -| symmetry | Correct polar/axial reflection parity about `x=0` and `y=0` | max absolute reflection mismatch `4.27126230127111e-20` / `2.29087480670778e-20` | pass | N/A | -| element force balance | No documented direct element-end-action output exists for shell GP resultants | Global assembled residual/equilibrium passed; direct element-end-action balance is skipped rather than inferred from mismatched locations | skipped | N/A | -| recovered resultant consistency | `N=A*epsilon0`, `M=D*kappa`, `Q=As*gamma0` at each of 144 GP rows | absolute L2 residual `9.9301874551584e-12`; normalized L2 `5.56240926027087e-17` | pass | N/A | -| stress/location/sign sanity | Local `[S11,S22,S12]` at bottom/middle/top; middle zero and faces reverse for this linear flat bending field | absolute L2 constitutive residual `1.29488994752188e-9`; normalized `3.05323934859307e-16`; middle stress exactly zero; face reversal exact | pass | N/A | -| rigid body/nonfinite | Complete constraints, finite solution, acceptable residual, no abnormal uncontrolled mode | zero nonfinite values; `FREE_RESIDUAL_NORMALIZED=1.07747756058988e-14`; rank/rigid-mode tests passed upstream | pass | N/A | -| physical energy | Positive and consistent physical-only energy; no drilling-energy gate | `1.17752208825422`; independently recovered value identical to relative `1.88569375589575e-16`; `0.5F^Td=1.17752208825424` | pass | N/A | -| model coverage | Approved sole S4 case plus declared invariant/patch/common-path portfolio | S4 case covers end-to-end symmetric plate response; focused build/test portfolio passed; expanded models are explicitly nonblocking | pass | N/A | - -### 1. Global force and moment equilibrium - -The reaction dataset is the assembled full residual `K*d-F`. Applying the -constraint mask gives - -```text -sum constrained RF = [0, 0, 99999.9999999989] -sum applied F = [0, 0, -100000] -force residual = [0, 0, -1.12049747258425e-9] -``` - -The load acts at the global origin and therefore contributes no origin moment. -The constrained force and moment rows give - -```text -moment residual = [ 6.45741238258779e-10, - -2.63753463514149e-10, - 0 ] -``` - -These independently reconstructed values match the stored HDF5 equilibrium vector -exactly. The serialized normalized metrics are: - -| metric | value | threshold | result | -| --- | ---: | ---: | --- | -| `FREE_RESIDUAL_NORMALIZED` | `1.07747756058988e-14` | `1.0e-10` | pass | -| `FORCE_BALANCE_NORMALIZED` | `1.12049747258425e-14` | `1.0e-10` | pass | -| `MOMENT_BALANCE_NORMALIZED` | `2.35981341581908e-15` | `1.0e-10` | pass | - -### 2. Reaction consistency and constrained/free meaning - -The 24 perimeter nodes provide 144 constrained DOFs; the remaining 150 DOFs are -free. The HDF5 constraint mask agrees with the input set exactly, all prescribed -values are zero, and the maximum constrained displacement is exactly zero. - -The total positive `RF3=99999.9999999989` opposes the center `F3=-100000`. The -nearly zero total `RF1/RF2` and origin `RM1/RM2/RM3` are required by the centered -load and double symmetry. The largest raw free residual component is -`7.62156560085714e-10`; because translational and rotational entries have different -dimensions, the decision uses the documented normalized metric rather than this -raw maximum. The normalized free residual passes by more than three orders of -magnitude. - -### 3. Displacement direction and deformation mode - -Center node 2 has - -```text -[U1,U2,U3,UR1,UR2,UR3] -= [0, 0, -2.35504417650849e-5, 0, 0, 0] -``` - -Every free-node `U3` is nonpositive, the center is the maximum-magnitude -translation, and every clamped boundary displacement is zero. Across the complete -model, maximum absolute `U1`, `U2`, and `UR3` are exactly zero. Maximum absolute -`UR1` and `UR2` are `7.55060026636931e-6` and -`7.55060026636933e-6`, respectively. This is the expected symmetric plate-bending -mode under a negative transverse center load, with no in-plane or drilling -deformation leakage. - -### 4. Reflection symmetry and expected zeros - -For reflection through `x=0`, polar displacement components transform as -`[-U1,+U2,+U3]`, while the axial rotation vector transforms as -`[+UR1,-UR2,-UR3]`. Reflection through `y=0` similarly uses -`[+U1,-U2,+U3,-UR1,+UR2,-UR3]`. - -All 294 scalar nodal component comparisons per reflection were paired by source -coordinates. The maximum absolute mismatch was `4.27126230127111e-20` for the -`x` reflection and `2.29087480670778e-20` for the `y` reflection. The equality -evidence is numerical roundoff, not a new acceptance tolerance. - -### 5. Shell generalized resultants and physical work signs - -At every one of 36 elements times four midsurface Gauss locations, an independent -constitutive reconstruction applied the documented centered-section identities: - -```text -N = A * epsilon0 -M = D * kappa -Q = As * gamma0 -``` - -The complete 1,152-component resultant comparison has absolute L2 residual -`9.9301874551584e-12` and normalized L2 residual -`5.56240926027087e-17`. All membrane strains and `N` resultants are exactly zero, -as required for this linear flat plate bending response. - -The generalized work density `generalized_strain dot section_resultant` is strictly -positive at all 144 locations: minimum `4.46321446508071e-4`, maximum -`1.27059464107458e-1`, negative count `0`. This supports the physical sign and -component-order interpretation. - -The shell contract does not expose element-end nodal actions and explicitly forbids -averaging mismatched result locations. Consequently a separate GP-to-element-end -force-balance assertion is not documented and is marked `skipped`; the assembled -global residual and equilibrium checks provide the required force-balance evidence. - -### 6. Stress component, location, and sign sanity - -HDF5 stores local in-plane `[S11,S22,S12]` directly at each GP and ordered section -positions `BOTTOM(-1), MIDDLE(0), TOP(+1)`. Independent reconstruction used -`Cps*(epsilon0+z*kappa)` at all 432 section locations. The absolute L2 residual is -`1.29488994752188e-9`, or normalized `3.05323934859307e-16`, against a maximum -absolute stored stress of `313250.779137971`. - -All middle-surface in-plane stresses are exactly zero. For every component and GP, -bottom and top stresses are equal in magnitude and opposite in sign. This is the -documented curvature/stress-location convention for a centered homogeneous section. -No `S33`, `S13`, `S23`, nodal stress, or Abaqus stress equality was inferred. - -### 7. Physical energy, residual, and rigid-body symptoms - -The stored `PHYSICAL_STRAIN_ENERGY` is finite and positive: - -```text -HDF5 physical energy = 1.17752208825422 -independent GP generalized energy = 1.17752208825422 -0.5 * F^T * d = 1.17752208825424 -``` - -The HDF5-versus-recovered normalized difference is -`1.88569375589575e-16`; the final fresh HDF5-versus-external-work normalized -difference is `9.14561471609432e-15`. The HDF5 value excludes numerical drilling stabilization, -as required. No drilling-energy ratio, calibration, or warning criterion was -introduced. - -The solution is finite, the full perimeter support is enforced, the expected -deformation mode is smooth and symmetric, all three normalized verification -metrics pass `1e-10`, and the build/test evidence passes six-rigid-mode, -stabilized-rank, non-rigid positive-energy, and pure-drill separation tests. No -rigid-body, singular, nonfinite, or abnormal-mode symptom is present. - -### 8. Approved model coverage - -The sole approved reference model provides end-to-end evidence for the -full-integration `S4 -> FESA-MITC4` path, a nonzero transverse bending response, -fully constrained reaction recovery, global force/moment balance, two-axis -symmetry, physical energy, and shell result recovery. - -The prerequisite focused `87/87` build/test portfolio supplies the documented -complementary element evidence: membrane, bending, transverse-shear and twist patch -fields; six physical rigid modes; expected physical/stabilized rank; frame and -energy invariance; fixed numerical drilling and physical-recovery separation; and -S4/S4R common-kernel/source-metadata behavior. The reference verification supplies -the approved external displacement comparison. - -This is the complete approved coverage for the feature. Pinched-cylinder, -hemisphere, Scordelis-Lo, locking/convergence sequences, drilling calibration, -expanded distorted/curved portfolios, and `NR-O01` through `NR-O04` are explicitly -nonblocking or out of scope and were not invented as new physics gates. - -## Execution Evidence - -| order | exact command or read-only operation | exit code | result | -| ---: | --- | ---: | --- | -| 1 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | `0` | Existing S4 reference route rebuilt. | -| 2 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Fresh S4 tests `2/2` passed; FESA HDF5 and ledger regenerated. | -| 3 | `h5dump.exe -n .harness/build/reference/mitc4-shell-s4-comparison/results.h5` with HDF5/oneAPI runtime on `PATH` | `0` | Required HDF5 inventory inspected read-only. | -| 4 | `h5dump.exe -y -w 0 -m '%.17g' -d .harness/build/reference/mitc4-shell-s4-comparison/results.h5` for model nodes/elements/mask/prescribed values, nodal U/R, shell frames/strain/resultant/stress, energy/equilibrium/metrics/diagnostics | `0` | High-precision read-only numerical audit supplied all reported values. | -| 5 | PowerShell independent input/mask, reaction/equilibrium, reflection, constitutive recovery, stress-location, energy, finite, and diagnostics audit over the `h5dump` values | `0` | All documented physics assertions passed. | -| 6 | `cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_reference_tests`, then `ctest --test-dir .harness/build -C Debug -R 'Mitc4Shell(Kernel|Patch|Drilling|PhysicalRecovery)|ResultRecovery\..*Shell|Mitc4S4Reference' --output-on-failure` | `0` | Final focused verification passed `17/17`; the regenerated ledger retained `passed=true`, 294 rows, and zero warnings. | - -Three intermediate audit-helper incidents were diagnostic-only and did not alter -the product or verdict: a compound-record regular expression initially omitted the -last node, a PowerShell array-expression initially bound subtraction to an array, -and a final optional `h5ls` operand-order probe exited `1`. The root causes were -confirmed as audit-command/parser usage, while successful high-precision HDF5 -inspection established 49/49 nodes and the complete evidence above. They are not -solver, HDF5-schema, reference, or physics failures. - -## Failure Classification - -- classification: `N/A` -- primary_failure: `N/A` -- evidence: all documented force/moment equilibrium, reaction, displacement, - symmetry, recovery, stress-location, physical-energy, residual, finite-result, - rigid-mode and approved coverage checks passed -- correction_handoff: `N/A` -- non_gating_incident: resolved read-only audit helper parsing/usage errors only - -## Evaluation Verdict - -- verdict: `pass-for-release-agent` -- reason: the prerequisite reference status is valid and fresh FESA S4 evidence - satisfies every documented physical expectation under its approved threshold; - no implementation, formulation, I/O, model-coverage, nonfinite, rigid-body, or - environment failure remains -- release_approval: `not granted by this report` -- reference_reapproval: `not performed by this report` - -## Handoff Recommendation - -| target_agent | reason | required_input | -| --- | --- | --- | -| Release Agent | All documented MITC4 physics checks passed. | This report, the build/test and reference-verification reports, the fresh build-local HDF5/comparison evidence, and the nonblocking limitations below. | - -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_modified: `false` -- formulation_modified: `false` -- numerical_review_modified: `false` -- io_contract_modified: `false` -- reference_model_contract_modified: `false` -- build_test_report_modified: `false` -- reference_verification_report_modified: `false` -- phase_files_modified: `false` -- tolerance_policies_modified: `false` -- reference_artifacts_modified: `false` -- Abaqus_or_other_reference_solver_executed: `false` -- owned_report_created: `true` -- generated_build_local_evidence: `true`, ignored under `.harness/build/` -- pre_existing_untracked_build_test_report_preserved: `true` -- pre_existing_untracked_reference_verification_report_preserved: `true` - -## Open Issues - -- Nonblocking coverage limitation: the approved external reference inventory is one - flat, symmetric, fully clamped S4 plate. The approved analytical/unit portfolio - supplies membrane, shear, twist, rigid-mode, rank, drilling-separation and S4R - common-path evidence. No broader Abaqus or benchmark portfolio is claimed. -- Known original-MITC4 limitations remain: transverse-shear locking is mitigated by - the tying field, but distorted-curved membrane locking and broader thin/thick mesh - convergence are not characterized by this release gate. -- Source `S4R` maps to the same full-integration FESA kernel and is not compared to - the optional Abaqus S4R artifacts. This is an approved boundary, not missing - physics evidence. -- The fixed numerical drilling stiffness is not a physical stress/resultant/energy - channel. No drilling calibration, coefficient sweep, energy-ratio gate, or - director-parallel moment support is claimed. -- Geometrically nonlinear execution remains outside the current feature even though - future-only residual/tangent equations are documented. No nonlinear release claim - is made. -- No open issue blocks Release Agent review. diff --git a/docs/linear-static-mitc4-shell/reference-comparison.md b/docs/linear-static-mitc4-shell/reference-comparison.md deleted file mode 100644 index 5d5b974..0000000 --- a/docs/linear-static-mitc4-shell/reference-comparison.md +++ /dev/null @@ -1,271 +0,0 @@ -# Linear Static MITC4 Shell Reference Verification Report - -## Metadata - -- feature_id: `linear-static-mitc4-shell` -- model_id: `shell-s4` -- source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` -- source_build_test_report: - `docs/linear-static-mitc4-shell/build-test.md` -- source_reference_models: - `docs/linear-static-mitc4-shell/reference-model.md` -- source_io_definition: `docs/linear-static-mitc4-shell/io.md` -- source_requirements: `docs/linear-static-mitc4-shell/requirements.md` -- historical_status: `pass-for-physics-evaluation` -- current_status: `pass-for-physics-evaluation` -- superseded_on: `2026-08-18` -- revalidated_on: `2026-08-18` -- owner_agent: `reference-verification-agent` -- date: `2026-08-13` - -The fixed-absolute-tolerance evidence below is preserved as a historical record. ADR-022 -supersedes that decision with the common family-scale row/RMS policy. The following revalidation -is the current reference-gate evidence. - -## 2026-08-18 Common-policy Revalidation - -`cmake --build .harness/build --config Debug` passed, followed by -`ctest --test-dir .harness/build -C Debug --output-on-failure`: 214/214 tests passed. -The S4 reference test generated -`.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` from the declared -read-only input/CSV pair. - -- exact canonical rows: 294 -- blocking translation family: 147 rows, all row/RMS gates passed -- warning-only rotation family: 147 rows, all row/RMS gates passed; warnings 0 -- identity/schema/nonfinite failures: 0 -- overall verdict: `passed=true` - -| family | rows | scale | near-zero rows | max absolute error | scale-relative RMS | -| --- | ---: | ---: | ---: | ---: | ---: | -| translation `U1/U2/U3` | 147 | `2.37408203e-5` | 122 | `1.903785349151439e-7` | `1.0332756650397166e-3` | -| rotation `UR1/UR2/UR3` | 147 | `7.60725743e-6` | 107 | `6.882854962740428e-8` | `2.9771372973060382e-3` | - -All values above come from the generated JSON ledger. The historical report body starts below -and must not be read as the current identity/tolerance evidence. - -The prerequisite build/test report has status `pass-for-reference-verification`. -This report verifies only the approved full-integration S4 displacement case. It -does not compare S4R artifacts, claim Abaqus formulation equivalence, approve -physics sanity, or approve release readiness. - -## Verdict - -The reference-comparison gate passes. The fresh FESA result has an exact -294-row identity match to the read-only Abaqus displacement CSV. All 147 blocking -`U1/U2/U3` rows satisfy the fixed absolute tolerance `1.0e-5`. All 147 -warning-only `UR1/UR2/UR3` rows also satisfy `1.0e-5`, so no rotational warning -was emitted. - -- declared cases compared: `1/1` -- blocking rows passed: `147/147` -- blocking failures: `0` -- warning-only rows compared: `147/147` -- warning-only exceedances and warnings: `0/0` -- missing / extra / duplicate / nonfinite rows: `0 / 0 / 0 / 0` -- largest blocking normalized error: `0.0190378534915144` -- comparison verdict: `passed=true` - -## Artifact Inventory - -| item | exact path | status | direct evidence | -| --- | --- | --- | --- | -| declared S4 input | `reference/shell/shell.inp` | present, unchanged | 4,770 bytes; SHA-256 `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | -| required displacement CSV | `reference/shell/shell displacements.csv` | present, unchanged | 5,592 bytes; SHA-256 `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B`; 49 wide rows and six finite components per row | -| authoritative solver output | `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | present, valid | 95,024 bytes after a fresh verification run; observed raw SHA-256 `E88E5E5E1F83AB95CAE545AD1F28F896D3FCB82F3EA2B8006A3A703FED07A5CB` (non-decision inventory only) | -| deterministic comparison ledger | `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | present, valid | 94,349 bytes; SHA-256 `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6`; `passed=true` | -| S4R reference artifacts | `reference/shellR/` | not consumed | Excluded from the approved acceptance comparison. | -| reaction and stress CSVs | other files under `reference/shell/` | not consumed | Optional inspection evidence only; not an equality gate. | -| FESA-derived CSV | N/A | not generated | HDF5 was compared directly to the Abaqus CSV. | - -The input and required CSV had identical SHA-256 values and identical UTC -modification times (`2026-08-11T11:44:40.9520527Z`) before and after the fresh -comparison runs. `git diff --name-only -- reference` and -`git status --short -- reference` each returned zero paths. - -The HDF5 hash above inventories one fresh generation, not a stable content -identity. Raw HDF5 bytes changed across regenerations while the projected values -and deterministic JSON ledger remained identical; concurrent executions of the -same ignored build-local route may replace the file again. This report does not -claim byte-identical HDF5 container output. - -### Authoritative HDF5 projection audit - -The comparator and a read-only HDF5 2.1.1 inspection established: - -- `/metadata`: schema version `0`, feature `linear-static-mitc4-shell`, solver - version `0.1.0`, `Step-1`, frame `0`, internal formulation `FESA-MITC4`, and - integration rule `2x2x2-gauss; mitc4-edge-midpoint-shear`; -- source input identity: - `path=C:/Users/baram/orca/workspaces/FESADev/MITC4/reference/shell/shell.inp;content_identity=fnv1a64:cf0795df753d377e`; -- `/model/nodes`: 49 compound rows with ordered fields - `internal_node_id`, `instance_name`, `source_label`, and `coordinates`; -- `/model/elements`: 36 compound rows, source element type `S4`, and internal - formulation `FESA-MITC4`; -- `/steps/Step-1/frames/0/nodal/displacement`: float64 shape `[49,6]`, global - nodal components `[UX,UY,UZ,URX,URY,URZ]`, mapped to - `[U1,U2,U3,UR1,UR2,UR3]`; -- all projected source identities and displacement values are unique and finite. - -## Comparison Contract - -- case identity: `shell-s4` -- authoritative FESA dataset: - `/steps/Step-1/frames/0/nodal/displacement` -- HDF5 node identity source: `/model/nodes.instance_name` and - `/model/nodes.source_label` -- normalized key: - `(case_id, instance_name, source_node_label, component)` -- observed instance: `Part-1-1` -- observed source nodes: 49 unique labels -- CSV projection: trimmed `Part Instance Name`, `Node Label`, `U-U1`, `U-U2`, - `U-U3`, `UR-UR1`, `UR-UR2`, and `UR-UR3` -- stable component order: `[U1,U2,U3,UR1,UR2,UR3]` -- blocking inventory: `U1/U2/U3` -- warning-only inventory: `UR1/UR2/UR3` -- row precheck: exact key set, unique rows, finite HDF5/reference values, and - exact required HDF5 schema before tolerance evaluation -- tolerance source: requirements `FESA-REQ-LSMITC4-058` through `064`, the I/O - definition Section 7, and the approved reference-model contract Section 5 -- row tolerance: `abs(fesa-reference) <= 1.0e-5` -- tolerance-normalized error: `absolute_error / 1.0e-5` -- `reference_scale`: diagnostic only; it does not alter the tolerance or verdict -- zero policy: no clamp, substitution, omission, averaging, or row-order matching - -Independent ledger reconstruction found 294 projected CSV keys, 294 comparison -keys, zero duplicate keys, and exact set equality. All 294 serialized row -tolerances equal `1.0e-5`. The complete per-row decisions remain in the -identified deterministic `comparison.json`. - -## Execution Evidence - -The existing FESA S4 reference route was used; Abaqus and other reference solvers -were not executed. The first run regenerated the evidence after its test-owned -output directory cleanup. Further exact reruns confirmed the ledger bytes and the -final verification assertions. - -| order | exact command | exit code | result | -| ---: | --- | ---: | --- | -| 1 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | `0` | Reference test executable built; duration `1.830 s`. | -| 2 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Fresh S4 E2E tests `2/2` passed; duration `0.760 s`. | -| 3 | PowerShell CSV/JSON identity and metric audit | `0` | 294 exact keys; missing/extra/duplicate/nonfinite/nonfixed-tolerance counts all zero. | -| 4 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Repeat S4 E2E tests `2/2` passed; duration `0.911 s`; JSON hash unchanged. | -| 5 | `h5dump.exe -A -g '/metadata' ` with HDF5 and Intel oneAPI 2026.1 runtime directories prepended to `PATH` | `0` | Required metadata values inspected read-only. | -| 6 | `h5dump.exe -H -d '/model/nodes' ` | `0` | Compound schema and shape `[49]` inspected. | -| 7 | `h5dump.exe -H -d '/model/elements' ` | `0` | Compound schema and shape `[36]` inspected. | -| 8 | `h5dump.exe -H -d '/steps/Step-1/frames/0/nodal/displacement' ` | `0` | Float64 displacement schema and shape `[49,6]` inspected. | -| 9 | Final `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` plus report/metric assertion script | `0` | S4 E2E tests `2/2`; `verification=PASS`; final generated artifacts retained. | -| 10 | `git diff --check` | `0` | Report patch has no whitespace errors. | -| 11 | target-only Git scope and reference no-change audit | `0` | Only this owned report and the pre-existing untracked build/test report are visible; reference scope remains clean. | - -An initial optional `h5dump` probe without the Intel runtime directory exited -`-1073741515` because `libmmd.dll` was not on that process's `PATH`. The same -read-only inspection passed after adding the installed oneAPI runtime path. This -was an inspection-environment incident, not a solver, schema, comparison, or -reference-artifact failure. - -The repeated JSON ledger was byte-identical: - -- size: `94,349` bytes -- SHA-256 before and after repeat: `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` -- row decisions: `294` -- component metrics: `6` -- node vector metrics: `49` -- warnings: `0` -- verdict: `passed=true` - -## Quantity Results - -`max_rel` is calculated only for nonzero Abaqus values and is diagnostic. Tiny -reference residues make it ill-conditioned; the acceptance decision uses only -the fixed absolute tolerance and its fixed-tolerance-normalized error. - -| quantity | components | behavior | compared | missing | extra | duplicate | nonfinite | max abs | max rel | max normalized | RMS | L2 norm | worst ID/component by abs error | result | -| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | -| displacement | `U1/U2/U3` | blocking | 147 | 0 | 0 | 0 | 0 | `1.90378534915144e-7` | `1.0` | `0.0190378534915144` | `2.45308118840709e-8` | `2.97420287738877e-7` | `Part-1-1`, node 2, `U3` | pass | -| rotation | `UR1/UR2/UR3` | warning-only | 147 | 0 | 0 | 0 | 0 | `6.88285496274043e-8` | `35.7165926082675` | `0.00688285496274043` | `2.26478498250615e-8` | `2.74590586054375e-7` | `Part-1-1`, node 44, `UR1` | pass, no warning | - -The translational maximum relative error `1.0` occurs on near-zero reference -residue, including node 1 `U3=-1.17769804e-32`. The rotational maximum relative -error `35.7165926082675` occurs at node 2 `UR2`, where the reference is -`1.3860685e-22` and the absolute error is only `4.95056439416524e-21`. -Neither value was clamped or omitted, and neither relative diagnostic controls -the verdict. - -### Component metrics - -Each component contains 49 matched rows. `reference_scale` is retained only as -diagnostic information. `L2 norm` is the comparator's component -`vector_norm_error`, and `worst_row` is the zero-based index in the JSON ledger. - -| component | behavior | reference scale | tolerance | max abs | max rel | max normalized | RMS | L2 norm | worst row | worst identity | result | -| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | -| `U1` | blocking | `3.11730945e-23` | `1.0e-5` | `3.11730945e-23` | `1.0` | `3.11730945e-18` | `1.13587076092006e-23` | `7.95109532644045e-23` | 66 | node 12 / `U1` | pass | -| `U2` | blocking | `3.11730945e-23` | `1.0e-5` | `3.11730945e-23` | `1.0` | `3.11730945e-18` | `1.13587076092006e-23` | `7.95109532644045e-23` | 61 | node 11 / `U2` | pass | -| `U3` | blocking | `2.37408203e-5` | `1.0e-5` | `1.90378534915144e-7` | `1.0` | `0.0190378534915144` | `4.24886125341252e-8` | `2.97420287738877e-7` | 8 | node 2 / `U3` | pass | -| `UR1` | warning-only | `7.60725743e-6` | `1.0e-5` | `6.88285496274043e-8` | `11.9344619221920` | `0.00688285496274043` | `2.77378379212910e-8` | `1.94164865449037e-7` | 261 | node 44 / `UR1` | pass, no warning | -| `UR2` | warning-only | `7.60725743e-6` | `1.0e-5` | `6.88285496273990e-8` | `35.7165926082675` | `0.00688285496273990` | `2.77378379212909e-8` | `1.94164865449036e-7` | 202 | node 34 / `UR2` | pass, no warning | -| `UR3` | warning-only | `5.27113701e-25` | `1.0e-5` | `5.27113701e-25` | `1.0` | `5.27113701e-20` | `2.12986098533393e-25` | `1.49090268973375e-24` | 203 | node 34 / `UR3` | pass, no warning | - -### Worst rows and node-vector metrics - -- global worst and worst blocking row: `shell-s4`, `Part-1-1`, node 2, - `U3`; FESA `-2.35504417650849e-5`, Abaqus `-2.37408203e-5`, absolute - error `1.90378534915144e-7`, tolerance `1.0e-5`, normalized error - `0.0190378534915144`, within tolerance; -- worst warning-only row: `shell-s4`, `Part-1-1`, node 44, `UR1`; FESA - `1.39850632037260e-6`, Abaqus `1.46733487e-6`, absolute error - `6.88285496274043e-8`, normalized error `0.00688285496274043`, within - tolerance; -- maximum per-node displacement-vector error: `1.90378534915144e-7` at - `Part-1-1`, node 2; -- maximum per-node rotation-vector error: `7.21144690026432e-8` at - `Part-1-1`, node 39. - -## Failure Classification - -- classification: `N/A` -- primary_failure: `N/A` -- evidence: declared artifacts exist; the authoritative HDF5 projection passed - schema and identity checks; 294/294 exact row keys are unique and finite; - 147/147 blocking rows pass; zero rotational exceedances or warnings occurred -- correction_handoff: `N/A` - -The optional first `h5dump` runtime-path incident is classified as a resolved -inspection-environment incident and does not affect this gate. - -## Handoff Recommendation - -| target_agent | reason | required input | -| --- | --- | --- | -| Physics Evaluation Agent | All declared blocking reference rows passed the exact approved tolerance, and the warning-only inventory has no exceedance. | This report, `.harness/build/reference/mitc4-shell-s4-comparison/results.h5`, and its deterministic `comparison.json`. | - -The handoff status is `pass-for-physics-evaluation` only. Physics Evaluation -remains responsible for equilibrium, reaction sign, displacement direction, -symmetry, physical energy, result signs, and model-coverage adequacy. - -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_modified: `false` -- formulation_modified: `false` -- numerical_review_modified: `false` -- io_contract_modified: `false` -- reference_model_contract_modified: `false` -- phase_files_modified: `false` -- tolerance_policies_modified: `false` -- reference_artifacts_modified: `false` -- Abaqus_or_other_reference_solver_executed: `false` -- owned_report_created: `true` -- generated_build_local_evidence: `true`, ignored under `.harness/build/` -- pre_existing_untracked_build_test_report_preserved: `true` - -## Open Issues - -- None blocking Physics Evaluation. -- Nonblocking audit note: raw HDF5 container hashes differed across fresh - regenerations, while the authoritative projected rows and serialized comparison - ledger were stable and the JSON was byte-identical. No HDF5 byte-determinism - claim is made by this report. diff --git a/docs/linear-static-mitc4-shell/release.md b/docs/linear-static-mitc4-shell/release.md index 24edf9d..e441ef8 100644 --- a/docs/linear-static-mitc4-shell/release.md +++ b/docs/linear-static-mitc4-shell/release.md @@ -1,5 +1,9 @@ # Linear Static MITC4 Shell Release Report +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + ## Metadata - feature_id: `linear-static-mitc4-shell` @@ -9,19 +13,18 @@ - source_numerical_review: `docs/linear-static-mitc4-shell/numerical-review.md` - source_io_definition: `docs/linear-static-mitc4-shell/io.md` - source_reference_model: `docs/linear-static-mitc4-shell/reference-model.md` -- source_implementation_plan: `docs/linear-static-mitc4-shell/implementation-plan.md` +- source_implementation_plan: `docs/linear-static-mitc4-shell/README.md` - source_implementation_evidence: `phases/linear-static-mitc4-shell/index.json` - source_implementation_report: `N/A`; the project Harness phase index is the implementation completion ledger for this execution - source_correction_report: `N/A`; no final Build/Test, Reference Verification, or Physics Evaluation failure was handed to Correction Agent -- source_build_test_report: `docs/linear-static-mitc4-shell/build-test.md` -- source_reference_verification_report: `docs/linear-static-mitc4-shell/reference-comparison.md` -- source_physics_evaluation_report: `docs/linear-static-mitc4-shell/physics-evaluation.md` +- source_build_test_report: `docs/linear-static-mitc4-shell/verification.md` +- source_reference_verification_report: `docs/linear-static-mitc4-shell/verification.md` +- source_physics_evaluation_report: `docs/linear-static-mitc4-shell/verification.md` - audited_source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` - audited_branch: `feat-linear-static-mitc4-shell` - historical_status: `ready-for-release` - current_status: `superseded-pending-revalidation` - superseded_on: `2026-08-18` -- owner_agent: `release-agent` - date: `2026-08-13` - release_boundary: internal FESA feature release readiness only; no publish, deploy, package, tag, commit, or external release was performed @@ -29,181 +32,6 @@ The readiness evidence below is historical. The 2026-08-18 common-policy referen passed, but fresh physics and release audits are still required before a current `ready-for-release` verdict may be issued. -## Release Scope - -| item | included | excluded | notes | -| --- | --- | --- | --- | -| analysis type | One small-displacement, small-rotation `*STEP, *STATIC` | Multiple steps, geometric/material nonlinearity, buckling, modal, dynamic, contact, thermal | Existing factorize-before-load linear-static lifecycle is retained. | -| element type | Four-node source `S4` and `S4R` mapped to one full-integration `FESA-MITC4` path | `S3`, `S8`, `S8R`, continuum/solid/axisymmetric shells, MITC4+, MITC4/D, reduced integration/hourglass behavior | Source type is preserved as metadata; no Abaqus formulation-equivalence claim is made. | -| nodal degrees of freedom | Global `[UX,UY,UZ,URX,URY,URZ]`; 20 physical element coordinates plus four numerical drilling coordinates | Physical drilling strain/load/result channel | Director-parallel nodal moment is rejected. | -| material and section | Centered, single-layer, homogeneous isotropic linear elasticity with finite valid `E`, `nu`, and constant positive thickness | Composite/laminated or orthotropic sections, offsets, variable/nodal thickness, user orientation | Multiple valid materials/sections/element sets are allowed with exactly one assignment per element. | -| geometry | Valid four-node quadrilaterals and smooth shell patches with deterministic geometry-derived directors | Explicit normals/directors, shared-node sharp folds, hinges, shell-beam joints, calibrated distortion/warp thresholds | A physical fold requires duplicated source nodes. | -| loads and constraints | Nodal `*BOUNDARY` and global nodal `*CLOAD` on DOFs 1-6, subject to the drilling-moment projection rule | `*DLOAD`, pressure, gravity, body/edge/follower load | Output-request keywords in the allowlist remain warning no-ops. | -| authoritative output | HDF5 `results.h5`: nodal displacement/full residual, shell frames, generalized strain/resultant, bottom/middle/top in-plane stress, physical energy, equilibrium, verification metrics, diagnostics | Official CSV solver output, drilling output/energy, `S33`, pointwise `S13/S23`, nodal shell-stress averaging | HDF5 schema version remains `0` and is extended additively. | -| external acceptance | Read-only `reference/shell/shell.inp` and `reference/shell/shell displacements.csv`; `U1/U2/U3` blocking at fixed absolute `1.0e-5`; `UR1/UR2/UR3` warning-only at the same value | S4R artifact consumption; Abaqus reaction/stress/strain/resultant equality | Direct HDF5-to-CSV source identity mapping is authoritative. | - -## Gate Evidence Inventory - -| gate | source | expected status/evidence | observed status/evidence | verdict | -| --- | --- | --- | --- | --- | -| requirements | `docs/linear-static-mitc4-shell/requirements.md` | approved scope, acceptance criteria, tolerance and reference boundary | `approved`; requirements `001-072` are all `must` and covered without gaps | pass | -| research | `docs/linear-static-mitc4-shell/research.md` | approved evidence with applicability limits | `approved`; no research-owned blocking decision remains | pass | -| formulation | `docs/linear-static-mitc4-shell/formulation.md` | implementation-ready current linear formulation | `approved-for-implementation-planning`; future nonlinear Section 15 remains explicitly non-executable | pass | -| numerical review | `docs/linear-static-mitc4-shell/numerical-review.md` | `pass-for-implementation-planning` | `pass-for-implementation-planning`; no current-scope blocker | pass | -| I/O definition | `docs/linear-static-mitc4-shell/io.md` | approved input/HDF5/comparison contract | `approved-for-implementation-planning`; exact S4-only acceptance boundary and fixed tolerance are present | pass | -| reference model | `docs/linear-static-mitc4-shell/reference-model.md` | approved exact artifact inventory and row mapping | `approved-for-implementation-planning`; both declared files exist and match hashes | pass | -| implementation plan | `docs/linear-static-mitc4-shell/implementation-plan.md` | approved TDD plan tracing every `must` requirement | `ready-for-implementation`; ranges cover `001-072` exactly once | pass | -| implementation | `phases/linear-static-mitc4-shell/index.json` at source HEAD | completed RED/GREEN/VERIFY execution | Steps `0-13` are `completed`; all 14 `stepN-output.json` records have `exitCode=0`; top-level phase is `completed` | pass | -| correction | final downstream reports and commit/Harness history | no unresolved implementation-owned failure | `N/A`; final Build/Test and Reference Verification classify correction handoff as `N/A`; historical pre-gate Step 13 retries are closed | pass | -| build/test | `docs/linear-static-mitc4-shell/build-test.md` | `pass-for-reference-verification` | `pass-for-reference-verification`; clean MSVC x64 Debug build, focused `87/87`, `10/10`, `8/8`, full `144/144`, Harness Python `7/7`, zero warnings | pass | -| reference verification | `docs/linear-static-mitc4-shell/reference-comparison.md` | `pass-for-physics-evaluation` | `pass-for-physics-evaluation`; exact `294/294` row identity, blocking U `147/147`, UR warnings `0`, invalid rows `0` | pass | -| physics evaluation | `docs/linear-static-mitc4-shell/physics-evaluation.md` | `pass-for-release-agent` | `pass-for-release-agent`; equilibrium, reaction, direction, symmetry, recovery, stress signs, residual and physical energy pass | pass | - -### Gate Consistency and Staleness Audit - -- Every gate uses `feature_id=linear-static-mitc4-shell`. Build/Test, Reference Verification, and Physics Evaluation all identify source HEAD `820ba30c717b3d0e113775608e20dfd5fbc05d53`, which is the audited current HEAD. -- The requirements metadata value `current_product_state=requirements-approved-not-implemented` records the product state when the requirements gate was authored. It is not the requirements gate status and does not alter the later implementation evidence. -- Numerical Review values `implementation_complete=false`, `build_test_complete=false`, `reference_comparison_complete=false`, `physics_evaluation_complete=false`, and `release_ready=false` are explicit pre-implementation review boundaries. Later same-feature reports at the audited HEAD supply those downstream decisions. They are phase-time markers, not contradictory live statuses. -- No contract meaning, reference inventory, tolerance, or source identity in those earlier documents conflicts with the final reports. The phase-time markers are therefore nonblocking and are not silently treated as current completion claims. -- A separate implementation report is nonblocking under the current workflow because the Build/Test report explicitly declares `source_implementation_report=N/A` and points to the Harness index. The index records each RED failure, GREEN behavior, focused/full verification summary and completion timestamp, while all 14 generated step-output records have `exitCode=0`. -- A correction report is nonblocking `N/A`: Correction Agent reporting is required after a formal downstream failure handoff. The final formal Build/Test, Reference Verification, and Physics Evaluation gates report no such failure or unresolved defect. Historical implementation-phase retries and correction commits precede the clean independent gates and are closed by the final phase ledger and source HEAD. -- The Numerical Review metadata contains two historical commit references (`reviewed_head=cf769aa` and a downstream note naming `a058ef7`). This is a document-history inconsistency, but its mathematical verdict was re-audited against the current tracked requirements/formulation/I/O/reference contracts and independently exercised at `820ba30...`; it does not create a scope, tolerance, or acceptance contradiction. - -## Evidence Hash Inventory - -SHA-256 values are lowercase. The build-local HDF5 container is intentionally not a decision identity because valid regenerations can change raw container bytes; the deterministic projected ledger is the stable comparison evidence. - -| evidence | bytes | SHA-256 | audit role | -| --- | ---: | --- | --- | -| requirements | 35,124 | `c8966f667ee42c3d35d0bf2f1bc1662a93784a2037d5b191b59793fb5ad66c64` | approved must-requirement baseline | -| research | 37,197 | `45f02291c8b2fdc7066cdb938cf6662a97dd3dceb9023fa743fe1c356a7970b4` | theory/benchmark/applicability evidence | -| formulation | 57,593 | `117932a112b2ad7f1cb6a8084304733fcd529a675a93cca6364c2f6a16c57cd0` | mathematical implementation contract | -| numerical review | 24,406 | `c82bd7b4f14f7664fb082d9a860dc443bf76571affa24caa8a7a9acfba04af1e` | independent formulation gate | -| I/O definition | 41,327 | `6f362b16625e61c85949648e6bc1f215c92ff31e99654f6efd9787b428dd54c4` | input/HDF5/comparison contract | -| reference model | 6,112 | `978e18485a627b6abf83373f74929cfe564952d29f68574e0cab75ef5e689c44` | exact S4 inventory and row mapping | -| implementation plan | 56,316 | `8d269455d0d5fe9bb9dc32f140d1ea6f105bab60ebfe73d368ad8c5225af6482` | TDD task/test traceability | -| Harness implementation index | 7,392 | `8c0a7369bc81fc7a12f9f3a49158a9534d4727b9a924c95b1ece7e915d16880d` | 14-step completion ledger | -| Build/Test report | 11,970 | `d261e13eb1c6dc20cf24f85ee97a3fcb6b667420486ad12725030e3eebf8dcd1` | independent MSVC/CMake/CTest evidence | -| Reference Verification report | 14,362 | `2c69814eeb265bd47672c46e17e2c63d55a0f8d834325c2b0d78e0500a83bade` | fixed-tolerance comparison evidence | -| Physics Evaluation report | 19,596 | `d753521c73ac8509fe2d3e2896e2f6dd23a362c0f17f153fadbeb6227b8ed4c6` | physical plausibility evidence | -| declared S4 input | 4,770 | `4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf` | immutable reference input | -| declared S4 displacement CSV | 5,592 | `c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b` | immutable required reference quantity | -| deterministic comparison ledger | 94,349 | `8e8dea51b6f7c663bacc41fda6103a4596db26e02f1ead6069d458f51e0102e6` | `294` row decisions, `passed=true`, zero warnings | - -## Acceptance Traceability - -Evidence abbreviations: `PH` = Harness phase index; `BT` = Build/Test report; `RV` = Reference Verification report; `PE` = Physics Evaluation report. `shell-s4` means the sole declared read-only S4 comparison model. Every row below has priority `must` in the approved requirements baseline. - -| requirement_id | acceptance criterion | test/phase evidence | reference/physics evidence | release disposition | -| --- | --- | --- | --- | --- | -| `001` | Exactly one supported static step; unsupported procedure or second step fails deterministically. | `InpDomainMapping.*Procedure*`; `Mitc4ShellCli.*`; PH Steps 1/12; BT | N/A | released | -| `002` | S4 and S4R map to one FESA MITC4 path without equivalence claim. | `InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity`; PH Steps 0/1/7; BT | S4R is intentionally non-reference | released | -| `003` | Source element type and internal formulation remain separate metadata. | `DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity`; `Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity`; BT | RV HDF5 projection audit | released | -| `004` | Four distinct ordered nodes and stable source element identity are enforced. | `InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels`; Domain/HDF5 tests; BT | RV observed 36 uniquely identified S4 elements | released | -| `005` | Six global DOFs use the exact order and equation ownership remains in DofManager. | `DofManager.BuildsShellScatterInSourceNodeAndComponentOrder`; HDF5 schema tests; PH Steps 0/6/11; BT | RV `[UX,UY,UZ,URX,URY,URZ]` projection | released | -| `006` | Valid homogeneous isotropic `E,nu` is accepted and invalid/unsupported material data fails. | `InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties`; `Mitc4ShellConstitutive.*`; BT | PE material audit | released | -| `007` | One finite positive constant thickness is accepted for a centered single-layer shell section. | Domain/model/mapping tests; `Mitc4ShellConstitutive.*`; BT | PE thickness/model audit | released | -| `008` | Each element resolves to exactly one section and material; missing/conflicting/duplicate assignments fail. | `DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames`; `InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties`; BT | N/A | released | -| `009` | Multiple valid sets/sections/materials are allowed while each element remains homogeneous and single-layer. | Domain/model/mapping suites; PH Steps 0/1; BT | N/A | released | -| `010` | Composite, offset, variable thickness, explicit normal and orientation meanings fail closed. | `InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels`; BT | N/A | released | -| `011` | Nodal director is a unit vector separate from scalar thickness. | `Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements`; HDF5 director tests; BT | PE finite/model audit | released | -| `012` | Element normal candidate follows deterministic source order and tangent cross product. | `Mitc4Geometry.*`; PH Step 2; BT | N/A | released | -| `013` | Smooth shared-node directors use deterministic area-weighted averaging. | `Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder`; BT | N/A | released | -| `014` | Nonfinite/zero/opposed normals fail without an invented smooth-angle threshold. | `Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases`; BT | N/A | released | -| `015` | Discontinuous shared-node director fields are not silently averaged; folds require duplicate nodes. | Geometry negative tests and mapper unsupported-scope tests; BT | Documented limitation | released | -| `016` | Duplicate, bow-tie, nonfinite, zero-area and nonpositive-J geometry fails at every required point. | `Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases`; `.ExposesTheCompleteRequiredValidationPointInventory`; BT | PE finite-result audit | released | -| `017` | Nodal label/set boundary targets support global DOFs 1-6 and zero/nonzero prescribed values. | `EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips`; `Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement`; BT | PE constraint-mask audit | released | -| `018` | Global nodal force/moment CLOAD components aggregate deterministically. | `LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder`; BT | PE load/reaction audit | released | -| `019` | Aggregate director-parallel moment fails as `unsupported-drilling-load`. | `LoadAssembly.AcceptsExactlyZeroAggregateShellMoment`; `.EnforcesAggregateShellMomentDirectorProjectionThreshold`; PH Step 8; BT | N/A | released | -| `020` | Distributed/follower/body/edge load inputs remain unsupported. | `InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells`; BT | Documented limitation | released | -| `021` | Only the approved identity-preserving keyword subset plus S4/S4R and shell section is accepted. | `InpDomainMapping.*`; full CTest regression; BT | `shell-s4` parsed end-to-end | released | -| `022` | Identity wrappers/multiple instances preserve source identity; transforms/nesting remain unsupported. | `InpDomainMapping.*`; Domain identity tests; BT | RV exact instance/node identity | released | -| `023` | Allowlisted output requests do not affect mandatory results; other model-affecting meanings fail. | `InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells`; `Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths`; BT | PE observed warning-only diagnostics | released | -| `024` | Domain owns shell semantics and AnalysisModel remains a non-owning active view. | `DomainModel.*`; PH Step 0 and full lifecycle Step 12; BT | N/A | released | -| `025` | DofManager solely owns six-DOF numbering, maps, scatter and sparse pattern. | `DofManager.*`; `EssentialConstraints.*`; PH Step 6; BT | N/A | released | -| `026` | AnalysisState owns only required linear-static shell solution/recovery/evidence rows. | `AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder`; `.CommitsFiniteShellGlobalEvidence`; BT | PE required-result audit | released | -| `027` | Element buffers and stable COO/fixed reduction are deterministic across thread paths. | `SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical`; PH Step 7; BT | N/A | released | -| `028` | Stiffness/partition/factorization precedes load/effective RHS/substitution/recovery/commit. | `Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization`; `.AppliesKfcForNonzeroPrescribedDisplacement`; `.DoesNotWriteAnInvalidRecoveryCandidate`; BT | PE final-state evidence | released | -| `029` | Reaction/free equilibrium derives from full residual `K*d-F`. | `ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium`; BT | PE reaction and equilibrium reconstruction | released | -| `030` | S4/S4R use the same numerical path and may differ only in source metadata. | Mapper identity test; `SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness`; HDF5 metadata tests; BT | S4R reference intentionally N/A | released | -| `031` | Physical kernel uses three translations plus two tangent rotations; drilling is not physical strain. | `Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps`; drill/recovery tests; BT | PE no drilling leakage | released | -| `032` | Deterministic right-handed frames transform global rotations to tangent/drilling coordinates. | `Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps`; `Mitc4Geometry.*`; BT | PE symmetry/direction evidence | released | -| `033` | Drilling is a symmetric positive numerical stabilization only. | `Mitc4ShellDrilling.*`; `Mitc4ShellKernel.*`; BT | PE physical-energy audit | released | -| `034` | `R+`, `k_ref`, `k_d=1e-3*k_ref`, and `I4` use only eight positive physical rotational diagonals. | `Mitc4ShellDrilling.UsesOnlyEightPositivePhysicalRotationDiagonalsAndFixedFactor`; BT | N/A | released | -| `035` | Drilling contributes to no physical generalized strain/resultant/stress/output. | `Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy`; HDF5 forbidden-path test; BT | PE physical-only recovery/energy | released | -| `036` | Empty/nonfinite valid `R+` fails; no coefficient/energy calibration gate or output exists. | `Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate`; BT | Documented limitation/boundary | released | -| `037` | S4 and S4R share the approved full `2x2x2` rule; no reduced integration/hourglass selection. | `Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder`; S4/S4R assembly parity; BT | RV S4-only boundary | released | -| `038` | Stabilized element keeps six physical rigid modes, symmetry, energy invariance and positive non-rigid modes. | `Mitc4ShellKernel.*`; `Mitc4ShellPatch.*`; BT | PE rigid/rank/energy evidence | released | -| `039` | HDF5 is authoritative and invalid candidates cannot replace a valid final result. | `Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal`; CLI invalid-candidate test; BT | RV/PE read authoritative HDF5 | released | -| `040` | Required metadata/model identities, frames, directors, section/material and source/internal types are written. | `Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity`; BT | RV HDF5 schema audit | released | -| `041` | Every node has global six-component displacement and full-residual reaction rows in stable order. | HDF5 mandatory inventory; `ResultRecovery.*`; BT | RV 49x6 displacement; PE reaction audit | released | -| `042` | Four shell locations contain ordered eight-component generalized strain with correct dimensions. | `Mitc4ShellPhysicalRecovery.*`; `ResultRecovery.RecoversShellRowsInStableElementAndGpOrder`; HDF5 tests; BT | PE 144-GP reconstruction | released | -| `043` | The same locations contain ordered `N/M/Q` section resultants with correct dimensions. | Physical recovery/result recovery/HDF5 suites; BT | PE 1,152-component resultant reconstruction | released | -| `044` | Bottom/middle/top local `[S11,S22,S12]` is emitted; S33/S13/S23 is not. | `ResultRecovery.RecoversDirectBottomMiddleTopShellStress`; HDF5 inventory/forbidden paths; BT | PE stress/location/sign reconstruction | released | -| `045` | Rows preserve source element, exact natural/section location, frame and component order without averaging. | AnalysisState, ResultRecovery stable-order and HDF5 schema tests; BT | PE location-specific audit | released | -| `046` | Free residual, force/moment balance and deterministic physical shell energy are output without drilling datasets. | `ResultRecovery.*ShellEquilibrium`; `.SumsOnlyPhysicalShellEnergyInSourceOrder`; HDF5 global rows; BT | PE equilibrium and energy checks | released | -| `047` | Abaqus output requests neither suppress nor expand mandatory HDF5; CSV remains auxiliary. | Mapper output-request test; `Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths`; BT | RV compared HDF5 directly; no FESA CSV | released | -| `048` | Nonfinite/incomplete recovery or HDF5 inventory fails without partial success. | `AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged`; `ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged`; HDF5 invalid-inventory test; BT | N/A | released | -| `049` | Each production behavior has RED/GREEN/VERIFY evidence, related C++ tests, clean MSVC Debug build and no new warning. | PH Steps 0-13 and outputs; BT clean build, zero warnings, `144/144` | N/A | released | -| `050` | Frames, Jacobians, symmetry, transform energy, six modes, positivity and repeatability are tested. | Geometry, Kinematics, Kernel, Patch and SparseAssembly suites; BT | PE rigid/rank summary | released | -| `051` | Approved normalized `1e-12` and `1e-10` algebraic/equilibrium criteria are applied. | Kernel/frame tests; `ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess`; BT | PE verification metrics all below `1e-10` | released | -| `052` | Independent membrane, bending, shear and twist patch/sign/component checks pass. | `Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields`; PhysicalRecovery tests; BT | PE recovery sign checks | released | -| `053` | Formulation invariants/patches and declared S4 displacement reference case pass; expanded portfolio is not required. | Kernel/Patch/PhysicalRecovery suites; `Mitc4S4Reference.*`; BT | RV blocking U `147/147`; PE coverage audit | released | -| `054` | Exact geometry acceptance/rejection tests pass without NR-O03/NR-O04 calibration. | `Mitc4Geometry.*`; BT | N/A | released | -| `055` | Additional curved/locking/convergence benchmarks remain optional and nonblocking. | Implementation-plan scope audit; BT/PE coverage inventory | PE records limitation and approved coverage | released | -| `056` | Exact drilling formula, symmetry/positivity/rank/determinism and recovery exclusion are verified. | `Mitc4ShellDrilling.*`; Kernel/Sparse/Recovery suites; BT | PE drilling separation evidence | released | -| `057` | Physics verifies equilibrium, direction, symmetry, energy, signs and resultant consistency. | ResultRecovery/CLI suites; BT | PE all documented checks pass | released | -| `058` | Every matched U row uses fixed absolute `1.0e-5` and blocks on exceedance. | `Mitc4ReferenceComparison.AppliesFixedAbsoluteToleranceWithoutScaleClampOrRowDenominator`; `Mitc4S4Reference.*`; BT | RV U `147/147` pass | released | -| `059` | Reference scale, row denominator, component magnitude and zero clamp never alter MITC4 tolerance. | Fixed-tolerance comparator test; BT | RV all 294 tolerances exactly `1.0e-5` | released | -| `060` | U tolerance is in user-consistent length units and independent of B33 policy. | Comparator contract test and scope audit; BT | RV reports independent fixed policy | released | -| `061` | UR uses fixed absolute `1.0e-5`; exceedance warns deterministically and never blocks. | `Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict`; BT | RV UR `147/147`, zero warnings | released | -| `062` | UR tolerance is dimensionless and no extra UR/drilling threshold is required. | Comparator/report tests; BT | RV fixed-tolerance metrics | released | -| `063` | Missing/extra/duplicate/nonfinite/schema/identity mismatch fails before tolerance. | `Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison`; BT | RV all invalid counts zero | released | -| `064` | Report contains every U/UR decision, maximum, normalized, RMS, vector and worst-row evidence. | `Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically`; BT | RV complete quantity/component/worst-row tables | released | -| `065` | Exact S4 input and displacement CSV paths are used without mutation. | `Mitc4S4Reference.*`; comparator required-file test; BT hash audit | `shell-s4`; immutable hashes match | released | -| `066` | S4R artifacts are not required/consumed; parser/common-kernel/assembly/HDF5 tests cover S4R. | Mapper identity, S4/S4R assembly parity, HDF5 source-type tests; BT | RV confirms `reference/shellR/` not consumed | released | -| `067` | Only declared input/CSV, FESA HDF5, mapping and tolerance/precheck rules gate readiness. | `Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5`; BT | RV no administrative artifact gate | released | -| `068` | Reference rows are unique, finite and deterministically source-mapped without internal-equivalence inference. | Comparator mapping and invalid-inventory tests; BT | RV exact `294/294` key set | released | -| `069` | Sole Abaqus case is full-integration S4; S4R coverage remains non-reference. | Common quadrature/S4R mapping tests and `Mitc4S4Reference.*`; BT | RV one declared case, S4R excluded | released | -| `070` | Authoritative FESA HDF5 rows are compared directly by model/step/frame/source/component. | Comparator mapping/E2E tests; BT | RV direct HDF5 projection, no FESA CSV | released | -| `071` | Reaction/stress/strain/resultants do not become undeclared equality gates. | Comparator only projects U/UR; BT | RV and PE keep optional CSVs out of pass/fail | released | -| `072` | No Abaqus/reference-solver execution or reference artifact mutation occurs. | PH/BT Git and hash audits | RV and PE no-change assertions; immutable hashes match | released | - -No requirement is deferred or blocked. Out-of-scope behavior is documented as a limitation rather than silently accepted. - -## Validation Evidence - -| command or report | expected | observed | verdict | -| --- | --- | --- | --- | -| config-resolved VS18/MSVC x64 Debug fresh configure and clean build | exit `0`, no new warning | exit `0`; warning/error scan `0/0` | pass | -| focused model/kernel/assembly/recovery CTest | pass | `87/87` | pass | -| focused linear-static lifecycle CTest | pass | `10/10` | pass | -| focused MITC4 reference CTest | pass | `8/8` | pass | -| CTest discovery and full regression | nonzero inventory and all pass | `144` discovered; `144/144` pass; current read-only discovery includes 57 test names containing `Mitc4` or `Shell` | pass | -| Harness Python verification | pass because Harness runner changed on the feature branch | `7/7` pass | pass | -| final release-stage confirmation | current HEAD build, full CTest and Harness self-test pass | fresh `cmake --build` exit `0`; CTest `144/144`; Harness pytest `7/7` | pass | -| Harness implementation ledger | every Step completed successfully | Steps `0-13` completed; `14/14` output `exitCode=0` | pass | -| reference verification | `pass-for-physics-evaluation` | exact 294 rows; U `147/147`; invalid rows/warnings `0` | pass | -| physics evaluation | `pass-for-release-agent` | all equilibrium/direction/symmetry/recovery/energy checks pass | pass | -| immutable reference audit | exact expected hashes, no Git reference diff/status | both hashes match; zero changed reference paths | pass | - -The Release Agent did not run Abaqus. It independently read the complete upstream evidence chain, enumerated current CTest discovery read-only, checked all Harness output exit codes, verified source HEAD/branch/status, and recomputed the declared artifact/report hashes. The primary audit then performed a fresh current-HEAD incremental full build, full CTest run and Harness self-test as the final completion check; all passed as recorded above. - -## Release Checklist - -- [x] One `feature_id` across all required gate documents. -- [x] Requirements, research, formulation, numerical review, I/O, reference-model and implementation-plan gates are approved/passing for their intended downstream phase. -- [x] Harness implementation is complete at the audited source HEAD with 14 successful Step outputs. -- [x] Independent Build/Test status is `pass-for-reference-verification`. -- [x] Reference Verification status is `pass-for-physics-evaluation`. -- [x] Physics Evaluation status is `pass-for-release-agent`. -- [x] All `must` requirements `001-072` trace to acceptance criteria, test/phase evidence, reference/physics evidence where applicable, and a released disposition. -- [x] Sole required comparison files exist, match approved hashes, and were not modified. -- [x] Fixed MITC4 tolerance and U-blocking/UR-warning-only policy are unchanged. -- [x] No unresolved build, test, reference, physics, schema, identity, nonfinite or environment failure remains. -- [x] Known limitations, unsupported Abaqus meanings and accepted risks are documented below and in the Release Notes Draft. -- [x] Release Agent changed only this report and performed no external release action. - ## Known Limitations | limitation | category | user impact | disposition | @@ -221,36 +49,6 @@ The Release Agent did not run Abaqus. It independently read the complete upstrea | Raw HDF5 container bytes are not a declared deterministic identity | output/evidence | Regeneration may change the raw file hash; ordered projected rows and the JSON comparison ledger are deterministic evidence. | documented, nonblocking | | Target-wide CTest label remains the legacy beam label | test infrastructure | MITC4 selection uses the approved exact suite regexes instead of a dedicated label. | documented, nonblocking | -## Release Notes Draft - -### Feature Summary - -- Adds end-to-end single-step linear-static analysis for four-node shell inputs labeled `S4` or `S4R`, both mapped to the independent full-integration `FESA-MITC4` formulation. -- Adds deterministic geometry-derived nodal directors, six global nodal DOFs, MITC4 transverse-shear tying, fixed nonphysical drilling stabilization, deterministic sparse assembly, full-residual reactions, physical shell recovery and failure-atomic HDF5 output. -- Adds mandatory HDF5 nodal displacement/reaction, shell local frames, generalized strain/resultant, bottom/middle/top in-plane stress, physical energy, equilibrium and verification metrics. - -### Verification Scope - -- Clean Visual Studio 18 2026/MSVC x64 Debug build and full `144/144` CTest regression passed with zero compiler/linker warnings. -- All 14 Harness implementation Steps completed with recorded RED/GREEN/VERIFY evidence and successful output exit codes. -- The sole declared S4 case matched all `147` blocking translational rows within fixed absolute `1.0e-5`; all `147` rotation rows were within the warning threshold and produced no warnings. -- Physics checks passed for global force/moment equilibrium, full-residual reactions, displacement direction, double symmetry, generalized resultant/stress consistency, free residual, finite results and positive physical energy. - -### Main Limitations - -- The released scope is linear static, small deformation, homogeneous isotropic single-layer MITC4 with nodal loads and constraints only. -- Abaqus compatibility and Abaqus S4/S4R formulation equivalence are not claimed. S4R uses the same FESA full-integration kernel and is not an Abaqus reference gate. -- Broader curved/distorted/thin-thick convergence, original-MITC4 membrane-locking characterization, nonlinear execution, distributed loads, composites, physical drilling behavior and expanded stress output remain outside this release. - -### Artifacts - -- Release report: `docs/linear-static-mitc4-shell/release.md` -- Build/Test report: `docs/linear-static-mitc4-shell/build-test.md` -- Reference Verification report: `docs/linear-static-mitc4-shell/reference-comparison.md` -- Physics Evaluation report: `docs/linear-static-mitc4-shell/physics-evaluation.md` -- Declared reference pair: `reference/shell/shell.inp`, `reference/shell/shell displacements.csv` -- Build-local deterministic ledger: `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` - ## Release Verdict - verdict: `ready-for-release` @@ -267,29 +65,6 @@ The Release Agent did not run Abaqus. It independently read the complete upstrea | Reference Verification Agent | N/A; the required S4 comparison is complete and passing. | N/A | | Physics Evaluation Agent | N/A; physics evaluation is complete and passing. | N/A | -## No-Change Assertion - -- source_files_modified: `false` -- test_files_modified: `false` -- cmake_files_modified: `false` -- requirements_modified: `false` -- research_modified: `false` -- formulation_modified: `false` -- numerical_review_modified: `false` -- io_contract_modified: `false` -- reference_model_contract_modified: `false` -- implementation_plan_or_phase_files_modified: `false` -- build_test_report_modified: `false` -- reference_verification_report_modified: `false` -- physics_evaluation_report_modified: `false` -- reference_artifacts_modified: `false` -- tolerance_policies_modified: `false` -- Abaqus_or_other_reference_solver_executed: `false` -- publish_deploy_package_tag_commit_performed: `false` -- owned_report_created: `true` -- pre_existing_untracked_reports_preserved: `true` -- notes: before this report was created, the worktree had no tracked/staged diff and contained only the three upstream gate reports as untracked files. This audit adds only `docs/linear-static-mitc4-shell/release.md`; generated build-local evidence remains ignored under `.harness/build/`. - ## Open Issues - blocking: `none` @@ -298,3 +73,5 @@ The Release Agent did not run Abaqus. It independently read the complete upstrea - missing required comparison files or mappings: `none` - nonblocking administrative note: the Build/Test, Reference Verification, Physics Evaluation and this Release report are untracked workspace reports pending whatever repository-integration action the user or Coordinator Agent separately authorizes. Their untracked state does not invalidate their content or the current internal readiness verdict. - nonblocking evidence note: raw `results.h5` hashes can differ across valid regenerations; no byte-identical HDF5 container claim is made. + +현재 build·reference·물리 실행 기록은 [검증 보고서](verification.md)에 통합했다. 과거 readiness와 현재 재검증 필요를 구분하며 이 정리는 새로운 release 감사가 아니다. diff --git a/docs/linear-static-mitc4-shell/verification.md b/docs/linear-static-mitc4-shell/verification.md new file mode 100644 index 0000000..2883187 --- /dev/null +++ b/docs/linear-static-mitc4-shell/verification.md @@ -0,0 +1,802 @@ +# MITC4 선형 정적 Shell 검증과 한계 + +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + +아래 날짜·revision·명령·수치는 당시 실제 실행 기록이다. 문서 정리에서 solver를 다시 실행하지 않았다. +현재 계약은 [요구사항](requirements.md), [정식화](formulation.md), [I/O](io.md), [공통 tolerance](../TOLERANCE.md)를 따른다. [과거 release 판정](release.md)의 재검증 경계도 유지한다. + + + + +## Linear Static MITC4 Shell Build/Test Report + + +### Metadata + +- feature_id: `linear-static-mitc4-shell` +- source_commit: `820ba30c717b3d0e113775608e20dfd5fbc05d53` +- source_implementation_report: `N/A`; Harness completion evidence is recorded in + `phases/linear-static-mitc4-shell/index.json` +- source_implementation_plan: + `docs/linear-static-mitc4-shell/README.md` +- status: `pass-for-reference-verification` +- date: `2026-08-13` + + +### Verdict + +The formal build/test gate passes. A fresh Visual Studio 18 2026/MSVC x64 Debug +configuration, clean full rebuild, three implementation-plan-focused CTest runs, +nonzero JSON discovery, full CTest regression, and the required Harness Python +self-test all completed successfully. + +- clean full rebuild: exit `0`; compiler/linker warning scan `0`; error scan `0` +- focused kernel/model/assembly/recovery regex: `87/87` passed +- focused linear-static lifecycle regex: `10/10` passed +- focused MITC4 reference-test regex: `8/8` passed +- CTest discovery: `144` tests, including `32` names containing `Mitc4` +- full CTest after clean rebuild: `144/144` passed +- Harness Python self-test: `7/7` passed +- failed tests: `0` +- required S4 reference hash mismatches or Git changes: `0` + +This verdict authorizes handoff to Reference Verification only. It does not approve +reference tolerance results, physics sanity, or release readiness. + + +### Execution Environment + +- os: `Microsoft Windows 11 Home 10.0.26200 build 26200` +- branch: `feat-linear-static-mitc4-shell` +- source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` +- generator: `Visual Studio 18 2026` +- MSBuild: `18.8.2+ce25c0108` +- compiler: `MSVC 19.51.36252.0` +- compiler_architecture: `x64` +- Windows SDK: `10.0.26100.0` +- language/config: `C++17 / Debug` +- CMake: `4.4.0` +- build_dir: `.harness/build` +- harness_config: absent +- project_selection: auto CMake from root `CMakeLists.txt` +- command_discovery_path: default CMake/MSVC x64 Debug with implementation-plan + generator and dependency paths +- resolved dependencies: GoogleTest `C:/git/googletest`; oneMKL `2026.1.0`; + oneTBB package path `2023.1`; HDF5 package path `2.1.1` + +The generated compiler metadata at +`.harness/build/CMakeFiles/4.4.0/CMakeCXXCompiler.cmake` independently confirms +`CMAKE_CXX_COMPILER_ID=MSVC` and version `19.51.36252.0`. + + +### Command Log Summary + +All durations below are wall-clock durations measured for the command. The initial +green chain was retained as corroborating evidence; the later clean-rebuild chain is +the canonical acceptance evidence. + +| order | command | exit_code | duration | relevant stdout/stderr tail | +| ---: | --- | ---: | ---: | --- | +| 1 | `git status --short --branch; git rev-parse HEAD` | 0 | `0.8 s` | Clean `feat-linear-static-mitc4-shell`; HEAD matched `820ba30...`. | +| 2 | Required dependency `Test-Path` precheck from the implementation plan | 0 | `0.215 s` | All four GoogleTest/MKL/TBB/HDF5 paths returned `True`. | +| 3 | `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 | `8.684 s` | MSVC `19.51.36252.0`, MKL `2026.1.0`; `Configuring done`, `Generating done`. The failed pthread probes were normal CMake feature probes; `Found Threads: TRUE`. | +| 4 | `cmake --build .harness/build --config Debug` | 0 | `4.382 s` | Initial incremental build produced `fesa.exe` and all three test executables; warning/error scan `0/0`. | +| 5 | `ctest --test-dir .harness/build -C Debug -R "DomainModel|InpDomainMapping|Mitc4Geometry|Mitc4Shell|DofManager|EssentialConstraints|SparseAssembly|LoadAssembly|ResultRecovery|Hdf5ResultsWriter" --output-on-failure` | 0 | `5.743 s` | `100% tests passed out of 87`; failed `0`. | +| 6 | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure` | 0 | `1.442 s` | `100% tests passed out of 10`; failed `0`. | +| 7 | `ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | `1.377 s` | `100% tests passed out of 8`; failed `0`. | +| 8 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | `0.208 s` | Discovered `144` tests; `32` test names contained `Mitc4`. | +| 9 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | `9.789 s` | Initial full regression: `144/144` passed; failed `0`. | +| 10 | First environment/reference audit helper | 1 | `0.9 s` | Non-gating report-generation error: it hardcoded nonexistent CMake internal directory `CMakeFiles/4.3.0`; both S4 hashes had already matched before the helper stopped. No build or test failed. | +| 11 | Corrected dynamic environment/reference audit helper | 0 | `0.583 s` | Located `CMakeFiles/4.4.0/CMakeCXXCompiler.cmake`; confirmed MSVC/version, both S4 hashes, no S4 diff, and clean worktree. | +| 12 | `cmake --build .harness/build --config Debug --target clean` | 0 | `1.251 s` | Generated Visual Studio clean target completed. | +| 13 | `cmake --build .harness/build --config Debug` | 0 | `94.616 s` | Canonical clean rebuild compiled/linked the solver, CLI, and all test executables; `89` output lines, warning scan `0`, error scan `0`. | +| 14 | `cmake --build .harness/build --config Debug --target fesa_unit_tests` | 0 | `1.943 s` | `fesa_solver`, GoogleTest, and `fesa_unit_tests.exe` confirmed. | +| 15 | Focused kernel/model/assembly/recovery regex from order 5 | 0 | `4.863 s` | Canonical focused run: `87/87` passed; failed `0`. | +| 16 | `cmake --build .harness/build --config Debug --target fesa_integration_tests` | 0 | `1.712 s` | `fesa_solver`, GoogleTest, and `fesa_integration_tests.exe` confirmed. | +| 17 | Focused lifecycle regex from order 6 | 0 | `1.531 s` | Canonical focused run: `10/10` passed; failed `0`. | +| 18 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | 0 | `1.769 s` | `fesa_solver`, GoogleTest, and `fesa_reference_tests.exe` confirmed. | +| 19 | Focused reference regex from order 7 | 0 | `1.511 s` | Canonical focused run: `8/8` passed; failed `0`; S4 end-to-end tests were included. | +| 20 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | `0.080 s` | Canonical discovery: `144` total, `32` MITC4-named; unit/integration/reference labels `121/10/13`. | +| 21 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | `9.669 s` | Canonical full regression: `100% tests passed out of 144`; failed `0`; CTest real time `9.62 s`. | +| 22 | Full `reference/` Git scope and worktree audit | 0 | `0.362 s` | `reference_diff_count=0`, `reference_status_count=0`; branch and HEAD unchanged. | +| 23 | `git merge-base dev HEAD` plus changed-file scope audit | 0 | `0.321 s` | Merge base `a058ef7...`; detected `scripts/execute.py`, so Harness Python self-test was required. | +| 24 | `uv run --with pytest python -m pytest -v -rs` | 0 | `4.651 s` | Python `3.11.15`, pytest `9.1.1`; `7 passed in 0.11s`; failed `0`. | + + +### Validation Results + +| validation_stage | result | evidence | +| --- | --- | --- | +| clean baseline | pass | Branch and HEAD matched the requested baseline; worktree was clean before report creation. | +| dependency precheck | pass | All four implementation-plan dependency paths existed. | +| fresh configure | pass | VS18/x64 configure exit `0`; compiler metadata is MSVC x64. | +| clean full build | pass | Exit `0`; solver, CLI, unit, integration, and reference targets compiled/linked. | +| compiler warning policy | pass | Clean rebuild emitted zero warning lines and zero compiler/linker error lines; product CMake uses warnings-as-errors. | +| feature-specific tests | pass | Approved focused regexes passed `87/87`, `10/10`, and `8/8`. | +| CTest discovery | pass | Nonzero inventory: `144` tests, including `32` MITC4-named tests. | +| full CTest | pass | `144/144` passed after the clean rebuild. | +| Harness self-test | pass | Required because `scripts/execute.py` differs from the `dev` merge base; `7/7` passed. | +| reference immutability | pass | Required S4 SHA-256 values match; entire `reference/` tree has no Git diff or status entry. | + + +### CTest Inventory + +| inventory | count | +| --- | ---: | +| all discovered tests | 144 | +| unit label | 121 | +| integration label | 10 | +| reference label | 13 | +| test names containing `Mitc4` | 32 | +| failed tests | 0 | + +The `32` MITC4-named tests comprise `30` tests in `Mitc4*` suites plus +`DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity` and +`InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity`. The broader focused regex +also exercises shared Domain, DOF, constraints, assembly, recovery, and HDF5 seams. + +CTest currently applies the target-wide legacy label +`linear-static-3d-euler-beam` to all `144` tests and has no separate MITC4 label. +The approved implementation plan explicitly permits exact suite regex filtering, +which was used here, so this labeling limitation is nonblocking. + + +### Warning and Failure Audit + +- Clean rebuild warning lines: `0`. +- Clean rebuild compiler/linker error lines: `0`. +- Focused CTest failures: `0`. +- Full CTest failures: `0`. +- Harness Python failures: `0`. +- Configure probes for POSIX pthread symbols reported expected negative probe + results on MSVC before CMake resolved `Threads: TRUE`; this is not a configure + warning or failure. +- One report-generation helper failed because it assumed a CMake internal versioned + directory. The corrected dynamic lookup passed. This incident did not affect + configure, compile, link, test, reference artifacts, or the gate verdict. + + +### Reference Read-Only Audit + +| exact approved path | observed SHA-256 | expected match | +| --- | --- | --- | +| `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | yes | +| `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | yes | + +The post-test audit found zero changed paths anywhere under `reference/`. No Abaqus +or other reference solver was run. + + +### Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- first_failed_build_or_test_command: `N/A` +- failed_target_or_test: `N/A` +- correction_handoff: `N/A` +- non_gating_incident: report-only environment metadata lookup used the wrong CMake + internal directory and was rerun successfully; no product correction is required + + +### Failed Test Inventory + +None. All focused, full CTest, and Harness Python tests passed. + + +### Handoff Recommendation + +| target_agent | reason | required_input | +| --- | --- | --- | +| Reference Verification Agent | Build/test status is `pass-for-reference-verification`. | This report, source HEAD `820ba30...`, `.harness/build/tests/Debug/fesa_reference_tests.exe`, and the unchanged declared S4 input/CSV pair. | + +The focused reference CTest generated/used build-local comparison evidence, but the +Build/Test Executor does not interpret that evidence as the formal reference +tolerance verdict. Reference Verification must independently inspect and report it. + + +### Open Issues + +- None blocking Reference Verification. +- The target-wide legacy CTest label prevents a precise MITC4 label count; exact + implementation-plan suite regexes provide the approved focused test entry point. + + + + +## Linear Static MITC4 Shell Reference Verification Report + + +### Metadata + +- feature_id: `linear-static-mitc4-shell` +- model_id: `shell-s4` +- source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` +- source_build_test_report: + `docs/linear-static-mitc4-shell/verification.md` +- source_reference_models: + `docs/linear-static-mitc4-shell/reference-model.md` +- source_io_definition: `docs/linear-static-mitc4-shell/io.md` +- source_requirements: `docs/linear-static-mitc4-shell/requirements.md` +- historical_status: `pass-for-physics-evaluation` +- current_status: `pass-for-physics-evaluation` +- superseded_on: `2026-08-18` +- revalidated_on: `2026-08-18` +- date: `2026-08-13` + +The fixed-absolute-tolerance evidence below is preserved as a historical record. ADR-022 +supersedes that decision with the common family-scale row/RMS policy. The following revalidation +is the current reference-gate evidence. + + +### 2026-08-18 Common-policy Revalidation + +`cmake --build .harness/build --config Debug` passed, followed by +`ctest --test-dir .harness/build -C Debug --output-on-failure`: 214/214 tests passed. +The S4 reference test generated +`.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` from the declared +read-only input/CSV pair. + +- exact canonical rows: 294 +- blocking translation family: 147 rows, all row/RMS gates passed +- warning-only rotation family: 147 rows, all row/RMS gates passed; warnings 0 +- identity/schema/nonfinite failures: 0 +- overall verdict: `passed=true` + +| family | rows | scale | near-zero rows | max absolute error | scale-relative RMS | +| --- | ---: | ---: | ---: | ---: | ---: | +| translation `U1/U2/U3` | 147 | `2.37408203e-5` | 122 | `1.903785349151439e-7` | `1.0332756650397166e-3` | +| rotation `UR1/UR2/UR3` | 147 | `7.60725743e-6` | 107 | `6.882854962740428e-8` | `2.9771372973060382e-3` | + +All values above come from the generated JSON ledger. The historical report body starts below +and must not be read as the current identity/tolerance evidence. + +The prerequisite build/test report has status `pass-for-reference-verification`. +This report verifies only the approved full-integration S4 displacement case. It +does not compare S4R artifacts, claim Abaqus formulation equivalence, approve +physics sanity, or approve release readiness. + + +### Verdict + +The reference-comparison gate passes. The fresh FESA result has an exact +294-row identity match to the read-only Abaqus displacement CSV. All 147 blocking +`U1/U2/U3` rows satisfy the fixed absolute tolerance `1.0e-5`. All 147 +warning-only `UR1/UR2/UR3` rows also satisfy `1.0e-5`, so no rotational warning +was emitted. + +- declared cases compared: `1/1` +- blocking rows passed: `147/147` +- blocking failures: `0` +- warning-only rows compared: `147/147` +- warning-only exceedances and warnings: `0/0` +- missing / extra / duplicate / nonfinite rows: `0 / 0 / 0 / 0` +- largest blocking normalized error: `0.0190378534915144` +- comparison verdict: `passed=true` + + +### Artifact Inventory + +| item | exact path | status | direct evidence | +| --- | --- | --- | --- | +| declared S4 input | `reference/shell/shell.inp` | present, unchanged | 4,770 bytes; SHA-256 `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | +| required displacement CSV | `reference/shell/shell displacements.csv` | present, unchanged | 5,592 bytes; SHA-256 `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B`; 49 wide rows and six finite components per row | +| authoritative solver output | `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | present, valid | 95,024 bytes after a fresh verification run; observed raw SHA-256 `E88E5E5E1F83AB95CAE545AD1F28F896D3FCB82F3EA2B8006A3A703FED07A5CB` (non-decision inventory only) | +| deterministic comparison ledger | `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | present, valid | 94,349 bytes; SHA-256 `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6`; `passed=true` | +| S4R reference artifacts | `reference/shellR/` | not consumed | Excluded from the approved acceptance comparison. | +| reaction and stress CSVs | other files under `reference/shell/` | not consumed | Optional inspection evidence only; not an equality gate. | +| FESA-derived CSV | N/A | not generated | HDF5 was compared directly to the Abaqus CSV. | + +The input and required CSV had identical SHA-256 values and identical UTC +modification times (`2026-08-11T11:44:40.9520527Z`) before and after the fresh +comparison runs. `git diff --name-only -- reference` and +`git status --short -- reference` each returned zero paths. + +The HDF5 hash above inventories one fresh generation, not a stable content +identity. Raw HDF5 bytes changed across regenerations while the projected values +and deterministic JSON ledger remained identical; concurrent executions of the +same ignored build-local route may replace the file again. This report does not +claim byte-identical HDF5 container output. + + +#### Authoritative HDF5 projection audit + +The comparator and a read-only HDF5 2.1.1 inspection established: + +- `/metadata`: schema version `0`, feature `linear-static-mitc4-shell`, solver + version `0.1.0`, `Step-1`, frame `0`, internal formulation `FESA-MITC4`, and + integration rule `2x2x2-gauss; mitc4-edge-midpoint-shear`; +- source input identity: + `path=C:/Users/baram/orca/workspaces/FESADev/MITC4/reference/shell/shell.inp;content_identity=fnv1a64:cf0795df753d377e`; +- `/model/nodes`: 49 compound rows with ordered fields + `internal_node_id`, `instance_name`, `source_label`, and `coordinates`; +- `/model/elements`: 36 compound rows, source element type `S4`, and internal + formulation `FESA-MITC4`; +- `/steps/Step-1/frames/0/nodal/displacement`: float64 shape `[49,6]`, global + nodal components `[UX,UY,UZ,URX,URY,URZ]`, mapped to + `[U1,U2,U3,UR1,UR2,UR3]`; +- all projected source identities and displacement values are unique and finite. + + +### Comparison Contract + +- case identity: `shell-s4` +- authoritative FESA dataset: + `/steps/Step-1/frames/0/nodal/displacement` +- HDF5 node identity source: `/model/nodes.instance_name` and + `/model/nodes.source_label` +- normalized key: + `(case_id, instance_name, source_node_label, component)` +- observed instance: `Part-1-1` +- observed source nodes: 49 unique labels +- CSV projection: trimmed `Part Instance Name`, `Node Label`, `U-U1`, `U-U2`, + `U-U3`, `UR-UR1`, `UR-UR2`, and `UR-UR3` +- stable component order: `[U1,U2,U3,UR1,UR2,UR3]` +- blocking inventory: `U1/U2/U3` +- warning-only inventory: `UR1/UR2/UR3` +- row precheck: exact key set, unique rows, finite HDF5/reference values, and + exact required HDF5 schema before tolerance evaluation +- tolerance source: requirements `FESA-REQ-LSMITC4-058` through `064`, the I/O + definition Section 7, and the approved reference-model contract Section 5 +- row tolerance: `abs(fesa-reference) <= 1.0e-5` +- tolerance-normalized error: `absolute_error / 1.0e-5` +- `reference_scale`: diagnostic only; it does not alter the tolerance or verdict +- zero policy: no clamp, substitution, omission, averaging, or row-order matching + +Independent ledger reconstruction found 294 projected CSV keys, 294 comparison +keys, zero duplicate keys, and exact set equality. All 294 serialized row +tolerances equal `1.0e-5`. The complete per-row decisions remain in the +identified deterministic `comparison.json`. + + +### Execution Evidence + +The existing FESA S4 reference route was used; Abaqus and other reference solvers +were not executed. The first run regenerated the evidence after its test-owned +output directory cleanup. Further exact reruns confirmed the ledger bytes and the +final verification assertions. + +| order | exact command | exit code | result | +| ---: | --- | ---: | --- | +| 1 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | `0` | Reference test executable built; duration `1.830 s`. | +| 2 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Fresh S4 E2E tests `2/2` passed; duration `0.760 s`. | +| 3 | PowerShell CSV/JSON identity and metric audit | `0` | 294 exact keys; missing/extra/duplicate/nonfinite/nonfixed-tolerance counts all zero. | +| 4 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Repeat S4 E2E tests `2/2` passed; duration `0.911 s`; JSON hash unchanged. | +| 5 | `h5dump.exe -A -g '/metadata' ` with HDF5 and Intel oneAPI 2026.1 runtime directories prepended to `PATH` | `0` | Required metadata values inspected read-only. | +| 6 | `h5dump.exe -H -d '/model/nodes' ` | `0` | Compound schema and shape `[49]` inspected. | +| 7 | `h5dump.exe -H -d '/model/elements' ` | `0` | Compound schema and shape `[36]` inspected. | +| 8 | `h5dump.exe -H -d '/steps/Step-1/frames/0/nodal/displacement' ` | `0` | Float64 displacement schema and shape `[49,6]` inspected. | +| 9 | Final `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` plus report/metric assertion script | `0` | S4 E2E tests `2/2`; `verification=PASS`; final generated artifacts retained. | +| 10 | `git diff --check` | `0` | Report patch has no whitespace errors. | +| 11 | target-only Git scope and reference no-change audit | `0` | Only this owned report and the pre-existing untracked build/test report are visible; reference scope remains clean. | + +An initial optional `h5dump` probe without the Intel runtime directory exited +`-1073741515` because `libmmd.dll` was not on that process's `PATH`. The same +read-only inspection passed after adding the installed oneAPI runtime path. This +was an inspection-environment incident, not a solver, schema, comparison, or +reference-artifact failure. + +The repeated JSON ledger was byte-identical: + +- size: `94,349` bytes +- SHA-256 before and after repeat: `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` +- row decisions: `294` +- component metrics: `6` +- node vector metrics: `49` +- warnings: `0` +- verdict: `passed=true` + + +### Quantity Results + +`max_rel` is calculated only for nonzero Abaqus values and is diagnostic. Tiny +reference residues make it ill-conditioned; the acceptance decision uses only +the fixed absolute tolerance and its fixed-tolerance-normalized error. + +| quantity | components | behavior | compared | missing | extra | duplicate | nonfinite | max abs | max rel | max normalized | RMS | L2 norm | worst ID/component by abs error | result | +| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | +| displacement | `U1/U2/U3` | blocking | 147 | 0 | 0 | 0 | 0 | `1.90378534915144e-7` | `1.0` | `0.0190378534915144` | `2.45308118840709e-8` | `2.97420287738877e-7` | `Part-1-1`, node 2, `U3` | pass | +| rotation | `UR1/UR2/UR3` | warning-only | 147 | 0 | 0 | 0 | 0 | `6.88285496274043e-8` | `35.7165926082675` | `0.00688285496274043` | `2.26478498250615e-8` | `2.74590586054375e-7` | `Part-1-1`, node 44, `UR1` | pass, no warning | + +The translational maximum relative error `1.0` occurs on near-zero reference +residue, including node 1 `U3=-1.17769804e-32`. The rotational maximum relative +error `35.7165926082675` occurs at node 2 `UR2`, where the reference is +`1.3860685e-22` and the absolute error is only `4.95056439416524e-21`. +Neither value was clamped or omitted, and neither relative diagnostic controls +the verdict. + + +#### Component metrics + +Each component contains 49 matched rows. `reference_scale` is retained only as +diagnostic information. `L2 norm` is the comparator's component +`vector_norm_error`, and `worst_row` is the zero-based index in the JSON ledger. + +| component | behavior | reference scale | tolerance | max abs | max rel | max normalized | RMS | L2 norm | worst row | worst identity | result | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | +| `U1` | blocking | `3.11730945e-23` | `1.0e-5` | `3.11730945e-23` | `1.0` | `3.11730945e-18` | `1.13587076092006e-23` | `7.95109532644045e-23` | 66 | node 12 / `U1` | pass | +| `U2` | blocking | `3.11730945e-23` | `1.0e-5` | `3.11730945e-23` | `1.0` | `3.11730945e-18` | `1.13587076092006e-23` | `7.95109532644045e-23` | 61 | node 11 / `U2` | pass | +| `U3` | blocking | `2.37408203e-5` | `1.0e-5` | `1.90378534915144e-7` | `1.0` | `0.0190378534915144` | `4.24886125341252e-8` | `2.97420287738877e-7` | 8 | node 2 / `U3` | pass | +| `UR1` | warning-only | `7.60725743e-6` | `1.0e-5` | `6.88285496274043e-8` | `11.9344619221920` | `0.00688285496274043` | `2.77378379212910e-8` | `1.94164865449037e-7` | 261 | node 44 / `UR1` | pass, no warning | +| `UR2` | warning-only | `7.60725743e-6` | `1.0e-5` | `6.88285496273990e-8` | `35.7165926082675` | `0.00688285496273990` | `2.77378379212909e-8` | `1.94164865449036e-7` | 202 | node 34 / `UR2` | pass, no warning | +| `UR3` | warning-only | `5.27113701e-25` | `1.0e-5` | `5.27113701e-25` | `1.0` | `5.27113701e-20` | `2.12986098533393e-25` | `1.49090268973375e-24` | 203 | node 34 / `UR3` | pass, no warning | + + +#### Worst rows and node-vector metrics + +- global worst and worst blocking row: `shell-s4`, `Part-1-1`, node 2, + `U3`; FESA `-2.35504417650849e-5`, Abaqus `-2.37408203e-5`, absolute + error `1.90378534915144e-7`, tolerance `1.0e-5`, normalized error + `0.0190378534915144`, within tolerance; +- worst warning-only row: `shell-s4`, `Part-1-1`, node 44, `UR1`; FESA + `1.39850632037260e-6`, Abaqus `1.46733487e-6`, absolute error + `6.88285496274043e-8`, normalized error `0.00688285496274043`, within + tolerance; +- maximum per-node displacement-vector error: `1.90378534915144e-7` at + `Part-1-1`, node 2; +- maximum per-node rotation-vector error: `7.21144690026432e-8` at + `Part-1-1`, node 39. + + +### Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- evidence: declared artifacts exist; the authoritative HDF5 projection passed + schema and identity checks; 294/294 exact row keys are unique and finite; + 147/147 blocking rows pass; zero rotational exceedances or warnings occurred +- correction_handoff: `N/A` + +The optional first `h5dump` runtime-path incident is classified as a resolved +inspection-environment incident and does not affect this gate. + + +### Handoff Recommendation + +| target_agent | reason | required input | +| --- | --- | --- | +| Physics Evaluation Agent | All declared blocking reference rows passed the exact approved tolerance, and the warning-only inventory has no exceedance. | This report, `.harness/build/reference/mitc4-shell-s4-comparison/results.h5`, and its deterministic `comparison.json`. | + +The handoff status is `pass-for-physics-evaluation` only. Physics Evaluation +remains responsible for equilibrium, reaction sign, displacement direction, +symmetry, physical energy, result signs, and model-coverage adequacy. + + +### Open Issues + +- None blocking Physics Evaluation. +- Nonblocking audit note: raw HDF5 container hashes differed across fresh + regenerations, while the authoritative projected rows and serialized comparison + ledger were stable and the JSON was byte-identical. No HDF5 byte-determinism + claim is made by this report. + + + + +## Linear Static MITC4 Shell Physics Evaluation Report + + +### Metadata + +- feature_id: `linear-static-mitc4-shell` +- model_id: `shell-s4` +- evaluated_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` +- source_build_test_report: + `docs/linear-static-mitc4-shell/verification.md` +- source_reference_verification_report: + `docs/linear-static-mitc4-shell/verification.md` +- source_reference_model: + `docs/linear-static-mitc4-shell/reference-model.md` +- source_requirement: `docs/linear-static-mitc4-shell/requirements.md` +- source_formulation: `docs/linear-static-mitc4-shell/formulation.md` +- source_numerical_review: + `docs/linear-static-mitc4-shell/numerical-review.md` +- source_io_definition: `docs/linear-static-mitc4-shell/io.md` +- status: `pass-for-release-agent` +- date: `2026-08-13` + +This verdict means that the documented physical checks pass and the Release Agent +may audit release readiness. It does not approve release readiness, re-approve the +reference comparison, or change its tolerance decision. + + +### Input Evidence + +The prerequisite reference-verification report has status +`pass-for-physics-evaluation`. The existing S4 reference-test route was rebuilt and +executed to regenerate fresh FESA evidence. Abaqus and other reference solvers were +not executed. + +| evidence | exact path or identity | status | notes | +| --- | --- | --- | --- | +| build/test report | `docs/linear-static-mitc4-shell/verification.md` | `pass-for-reference-verification` | Clean MSVC x64 Debug build, focused `87/87`, lifecycle `10/10`, reference `8/8`, and full `144/144` CTest passed. | +| reference verification | `docs/linear-static-mitc4-shell/verification.md` | `pass-for-physics-evaluation` | Required prerequisite satisfied; 147/147 blocking U rows passed and no UR warning was emitted. | +| solver HDF5 | `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | present and readable | Freshly generated, 95,024 bytes; observed raw SHA-256 `E102D80E82BA133EBDF1C5532F3A0A4FE9984AB6CC36D00264399F7308D9230F` (inventory only). | +| comparison ledger | `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | present and passing | 94,349 bytes; SHA-256 `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6`; `passed=true`. | +| declared S4 input | `reference/shell/shell.inp` | present, unchanged, read-only | SHA-256 `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF`. | +| declared displacement CSV | `reference/shell/shell displacements.csv` | present, unchanged, read-only | SHA-256 `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B`. | +| optional Abaqus reaction/stress CSVs | `reference/shell/shell reactions.csv`, `reference/shell/shell stresses.csv` | not used as equality gates | Their presence did not expand the approved U-only blocking boundary. | +| solver CSV views | N/A | not generated | HDF5 was inspected directly. | +| fresh S4 route | `.harness/build`, MSVC x64 Debug | pass | `Mitc4S4Reference.*` passed `2/2`. | + +The HDF5 contains 49 nodes, 36 source-`S4` elements, internal formulation +`FESA-MITC4`, and the required full `2 x 2 x 2` result inventory. All inspected +numeric model and result values were finite. The diagnostics dataset contains four +approved warning rows for ignored `PREPRINT`, `RESTART`, and `OUTPUT` keywords and +no error diagnostic. + +Raw HDF5 bytes are not a physics decision identity and may change across valid +regenerations. The projected values and deterministic comparison ledger are the +relevant evidence. + + +#### Documented model expectation + +The reference input is a flat `10 x 10`, thickness `0.5`, homogeneous isotropic +square plate with `E=2.1e11` and `nu=0.3`. Its 24 perimeter nodes are fully clamped +in all six global DOFs, and center node 2 at the global origin carries one +`F3=-100000` concentrated force. The geometry, boundary, material, and load are +symmetric about both global `x=0` and `y=0` planes. + +The documented physical expectations are therefore: + +- total constrained reaction force opposes the applied `-Z` force; +- total force and moment about the global origin balance within the approved + normalized `1e-10` limit; +- perimeter displacements are zero and the interior deflects in `-Z`, with the + largest magnitude at the center; +- the displacement and rotation field obeys the polar/axial-vector reflection + parity about both symmetry planes; +- a linear, flat transverse plate response has no membrane strain/resultant or + middle-surface in-plane stress, while bottom and top in-plane stresses reverse; +- stored physical strain energy is finite, strictly positive, and consistent with + the recovered generalized fields and `0.5 F^T d`; +- free residual, finite results, rank/rigid-mode evidence, and the approved + one-case coverage show no rigid-body or unsupported-mode symptom. + + +### Physics Checks + +| check | documented expectation | observed evidence | verdict | classification | +| --- | --- | --- | --- | --- | +| global equilibrium | Applied plus constrained reaction force/moment about origin; normalized metrics `<=1e-10` | force residual `[0,0,-1.12049747258425e-9]`; moment residual `[6.45741238258779e-10,-2.63753463514149e-10,0]`; normalized force/moment `1.12049747258425e-14` / `2.35981341581908e-15` | pass | N/A | +| reaction consistency | Perimeter-only reactions from full residual oppose `F3=-100000`; constrained motion is zero | summed constrained force `[0,0,99999.9999999989]`; constrained displacement exactly zero | pass | N/A | +| displacement direction | Interior bends in `-Z`; center is maximum; no in-plane or drilling leakage | center `U3=-2.35504417650849e-5`; all 25 free-node U3 values nonpositive; `U1/U2/UR3` exactly zero | pass | N/A | +| symmetry | Correct polar/axial reflection parity about `x=0` and `y=0` | max absolute reflection mismatch `4.27126230127111e-20` / `2.29087480670778e-20` | pass | N/A | +| element force balance | No documented direct element-end-action output exists for shell GP resultants | Global assembled residual/equilibrium passed; direct element-end-action balance is skipped rather than inferred from mismatched locations | skipped | N/A | +| recovered resultant consistency | `N=A*epsilon0`, `M=D*kappa`, `Q=As*gamma0` at each of 144 GP rows | absolute L2 residual `9.9301874551584e-12`; normalized L2 `5.56240926027087e-17` | pass | N/A | +| stress/location/sign sanity | Local `[S11,S22,S12]` at bottom/middle/top; middle zero and faces reverse for this linear flat bending field | absolute L2 constitutive residual `1.29488994752188e-9`; normalized `3.05323934859307e-16`; middle stress exactly zero; face reversal exact | pass | N/A | +| rigid body/nonfinite | Complete constraints, finite solution, acceptable residual, no abnormal uncontrolled mode | zero nonfinite values; `FREE_RESIDUAL_NORMALIZED=1.07747756058988e-14`; rank/rigid-mode tests passed upstream | pass | N/A | +| physical energy | Positive and consistent physical-only energy; no drilling-energy gate | `1.17752208825422`; independently recovered value identical to relative `1.88569375589575e-16`; `0.5F^Td=1.17752208825424` | pass | N/A | +| model coverage | Approved sole S4 case plus declared invariant/patch/common-path portfolio | S4 case covers end-to-end symmetric plate response; focused build/test portfolio passed; expanded models are explicitly nonblocking | pass | N/A | + + +#### 1. Global force and moment equilibrium + +The reaction dataset is the assembled full residual `K*d-F`. Applying the +constraint mask gives + +```text +sum constrained RF = [0, 0, 99999.9999999989] +sum applied F = [0, 0, -100000] +force residual = [0, 0, -1.12049747258425e-9] +``` + +The load acts at the global origin and therefore contributes no origin moment. +The constrained force and moment rows give + +```text +moment residual = [ 6.45741238258779e-10, + -2.63753463514149e-10, + 0 ] +``` + +These independently reconstructed values match the stored HDF5 equilibrium vector +exactly. The serialized normalized metrics are: + +| metric | value | threshold | result | +| --- | ---: | ---: | --- | +| `FREE_RESIDUAL_NORMALIZED` | `1.07747756058988e-14` | `1.0e-10` | pass | +| `FORCE_BALANCE_NORMALIZED` | `1.12049747258425e-14` | `1.0e-10` | pass | +| `MOMENT_BALANCE_NORMALIZED` | `2.35981341581908e-15` | `1.0e-10` | pass | + + +#### 2. Reaction consistency and constrained/free meaning + +The 24 perimeter nodes provide 144 constrained DOFs; the remaining 150 DOFs are +free. The HDF5 constraint mask agrees with the input set exactly, all prescribed +values are zero, and the maximum constrained displacement is exactly zero. + +The total positive `RF3=99999.9999999989` opposes the center `F3=-100000`. The +nearly zero total `RF1/RF2` and origin `RM1/RM2/RM3` are required by the centered +load and double symmetry. The largest raw free residual component is +`7.62156560085714e-10`; because translational and rotational entries have different +dimensions, the decision uses the documented normalized metric rather than this +raw maximum. The normalized free residual passes by more than three orders of +magnitude. + + +#### 3. Displacement direction and deformation mode + +Center node 2 has + +```text +[U1,U2,U3,UR1,UR2,UR3] += [0, 0, -2.35504417650849e-5, 0, 0, 0] +``` + +Every free-node `U3` is nonpositive, the center is the maximum-magnitude +translation, and every clamped boundary displacement is zero. Across the complete +model, maximum absolute `U1`, `U2`, and `UR3` are exactly zero. Maximum absolute +`UR1` and `UR2` are `7.55060026636931e-6` and +`7.55060026636933e-6`, respectively. This is the expected symmetric plate-bending +mode under a negative transverse center load, with no in-plane or drilling +deformation leakage. + + +#### 4. Reflection symmetry and expected zeros + +For reflection through `x=0`, polar displacement components transform as +`[-U1,+U2,+U3]`, while the axial rotation vector transforms as +`[+UR1,-UR2,-UR3]`. Reflection through `y=0` similarly uses +`[+U1,-U2,+U3,-UR1,+UR2,-UR3]`. + +All 294 scalar nodal component comparisons per reflection were paired by source +coordinates. The maximum absolute mismatch was `4.27126230127111e-20` for the +`x` reflection and `2.29087480670778e-20` for the `y` reflection. The equality +evidence is numerical roundoff, not a new acceptance tolerance. + + +#### 5. Shell generalized resultants and physical work signs + +At every one of 36 elements times four midsurface Gauss locations, an independent +constitutive reconstruction applied the documented centered-section identities: + +```text +N = A * epsilon0 +M = D * kappa +Q = As * gamma0 +``` + +The complete 1,152-component resultant comparison has absolute L2 residual +`9.9301874551584e-12` and normalized L2 residual +`5.56240926027087e-17`. All membrane strains and `N` resultants are exactly zero, +as required for this linear flat plate bending response. + +The generalized work density `generalized_strain dot section_resultant` is strictly +positive at all 144 locations: minimum `4.46321446508071e-4`, maximum +`1.27059464107458e-1`, negative count `0`. This supports the physical sign and +component-order interpretation. + +The shell contract does not expose element-end nodal actions and explicitly forbids +averaging mismatched result locations. Consequently a separate GP-to-element-end +force-balance assertion is not documented and is marked `skipped`; the assembled +global residual and equilibrium checks provide the required force-balance evidence. + + +#### 6. Stress component, location, and sign sanity + +HDF5 stores local in-plane `[S11,S22,S12]` directly at each GP and ordered section +positions `BOTTOM(-1), MIDDLE(0), TOP(+1)`. Independent reconstruction used +`Cps*(epsilon0+z*kappa)` at all 432 section locations. The absolute L2 residual is +`1.29488994752188e-9`, or normalized `3.05323934859307e-16`, against a maximum +absolute stored stress of `313250.779137971`. + +All middle-surface in-plane stresses are exactly zero. For every component and GP, +bottom and top stresses are equal in magnitude and opposite in sign. This is the +documented curvature/stress-location convention for a centered homogeneous section. +No `S33`, `S13`, `S23`, nodal stress, or Abaqus stress equality was inferred. + + +#### 7. Physical energy, residual, and rigid-body symptoms + +The stored `PHYSICAL_STRAIN_ENERGY` is finite and positive: + +```text +HDF5 physical energy = 1.17752208825422 +independent GP generalized energy = 1.17752208825422 +0.5 * F^T * d = 1.17752208825424 +``` + +The HDF5-versus-recovered normalized difference is +`1.88569375589575e-16`; the final fresh HDF5-versus-external-work normalized +difference is `9.14561471609432e-15`. The HDF5 value excludes numerical drilling stabilization, +as required. No drilling-energy ratio, calibration, or warning criterion was +introduced. + +The solution is finite, the full perimeter support is enforced, the expected +deformation mode is smooth and symmetric, all three normalized verification +metrics pass `1e-10`, and the build/test evidence passes six-rigid-mode, +stabilized-rank, non-rigid positive-energy, and pure-drill separation tests. No +rigid-body, singular, nonfinite, or abnormal-mode symptom is present. + + +#### 8. Approved model coverage + +The sole approved reference model provides end-to-end evidence for the +full-integration `S4 -> FESA-MITC4` path, a nonzero transverse bending response, +fully constrained reaction recovery, global force/moment balance, two-axis +symmetry, physical energy, and shell result recovery. + +The prerequisite focused `87/87` build/test portfolio supplies the documented +complementary element evidence: membrane, bending, transverse-shear and twist patch +fields; six physical rigid modes; expected physical/stabilized rank; frame and +energy invariance; fixed numerical drilling and physical-recovery separation; and +S4/S4R common-kernel/source-metadata behavior. The reference verification supplies +the approved external displacement comparison. + +This is the complete approved coverage for the feature. Pinched-cylinder, +hemisphere, Scordelis-Lo, locking/convergence sequences, drilling calibration, +expanded distorted/curved portfolios, and `NR-O01` through `NR-O04` are explicitly +nonblocking or out of scope and were not invented as new physics gates. + + +### Execution Evidence + +| order | exact command or read-only operation | exit code | result | +| ---: | --- | ---: | --- | +| 1 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | `0` | Existing S4 reference route rebuilt. | +| 2 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Fresh S4 tests `2/2` passed; FESA HDF5 and ledger regenerated. | +| 3 | `h5dump.exe -n .harness/build/reference/mitc4-shell-s4-comparison/results.h5` with HDF5/oneAPI runtime on `PATH` | `0` | Required HDF5 inventory inspected read-only. | +| 4 | `h5dump.exe -y -w 0 -m '%.17g' -d .harness/build/reference/mitc4-shell-s4-comparison/results.h5` for model nodes/elements/mask/prescribed values, nodal U/R, shell frames/strain/resultant/stress, energy/equilibrium/metrics/diagnostics | `0` | High-precision read-only numerical audit supplied all reported values. | +| 5 | PowerShell independent input/mask, reaction/equilibrium, reflection, constitutive recovery, stress-location, energy, finite, and diagnostics audit over the `h5dump` values | `0` | All documented physics assertions passed. | +| 6 | `cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_reference_tests`, then `ctest --test-dir .harness/build -C Debug -R 'Mitc4Shell(Kernel|Patch|Drilling|PhysicalRecovery)|ResultRecovery\..*Shell|Mitc4S4Reference' --output-on-failure` | `0` | Final focused verification passed `17/17`; the regenerated ledger retained `passed=true`, 294 rows, and zero warnings. | + +Three intermediate audit-helper incidents were diagnostic-only and did not alter +the product or verdict: a compound-record regular expression initially omitted the +last node, a PowerShell array-expression initially bound subtraction to an array, +and a final optional `h5ls` operand-order probe exited `1`. The root causes were +confirmed as audit-command/parser usage, while successful high-precision HDF5 +inspection established 49/49 nodes and the complete evidence above. They are not +solver, HDF5-schema, reference, or physics failures. + + +### Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- evidence: all documented force/moment equilibrium, reaction, displacement, + symmetry, recovery, stress-location, physical-energy, residual, finite-result, + rigid-mode and approved coverage checks passed +- correction_handoff: `N/A` +- non_gating_incident: resolved read-only audit helper parsing/usage errors only + + +### Evaluation Verdict + +- verdict: `pass-for-release-agent` +- reason: the prerequisite reference status is valid and fresh FESA S4 evidence + satisfies every documented physical expectation under its approved threshold; + no implementation, formulation, I/O, model-coverage, nonfinite, rigid-body, or + environment failure remains +- release_approval: `not granted by this report` +- reference_reapproval: `not performed by this report` + + +### Handoff Recommendation + +| target_agent | reason | required_input | +| --- | --- | --- | +| Release Agent | All documented MITC4 physics checks passed. | This report, the build/test and reference-verification reports, the fresh build-local HDF5/comparison evidence, and the nonblocking limitations below. | + + +### Open Issues + +- Nonblocking coverage limitation: the approved external reference inventory is one + flat, symmetric, fully clamped S4 plate. The approved analytical/unit portfolio + supplies membrane, shear, twist, rigid-mode, rank, drilling-separation and S4R + common-path evidence. No broader Abaqus or benchmark portfolio is claimed. +- Known original-MITC4 limitations remain: transverse-shear locking is mitigated by + the tying field, but distorted-curved membrane locking and broader thin/thick mesh + convergence are not characterized by this release gate. +- Source `S4R` maps to the same full-integration FESA kernel and is not compared to + the optional Abaqus S4R artifacts. This is an approved boundary, not missing + physics evidence. +- The fixed numerical drilling stiffness is not a physical stress/resultant/energy + channel. No drilling calibration, coefficient sweep, energy-ratio gate, or + director-parallel moment support is claimed. +- Geometrically nonlinear execution remains outside the current feature even though + future-only residual/tangent equations are documented. No nonlinear release claim + is made. +- No open issue blocks Release Agent review. diff --git a/docs/mitc4-shell-feast-eigen/ADR.md b/docs/mitc4-shell-feast-eigen/ADR.md index a0c5350..5d46c00 100644 --- a/docs/mitc4-shell-feast-eigen/ADR.md +++ b/docs/mitc4-shell-feast-eigen/ADR.md @@ -6,14 +6,16 @@ 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md). -문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)에 있다. +이 문서는 이전 MFE baseline의 승인·운영 결정 이력이다. 현재 구현 상태는 +[eigen2 PRD](../mitc4-shell-feast-eigen2/PRD.md), 이전 환경 실패는 +[개발 교훈](development-notes.md#실패와-재발-방지)을 따른다. 과거 stage/Hook 결정을 현행 실행 절차로 복원하지 않는다. ## MFE-ADR-001 — 사용자 지정 backend와 reference 범위 - 상태: 사용자 요청으로 확정된 intake 범위. - 결정 owner: user; 기록 owner: coordinator-agent. - 결정: MITC4 질량행렬 및 고유치해석을 구현하고 고유치 계산에는 MKL FEAST를 사용한다. 지정된 `reference/shellNL-eigen-meshfine` reference에서 외부 비교는 고유치만 수행한다. -- 근거: 2026-09-06 사용자 요청; [Feature PRD 사용자 요구](PRD.md#사용자-요구). +- 근거: 2026-09-06 사용자 요청; [Feature PRD 사용자 요구](PRD.md#사용자-요구와-승계-경계). - 영향: backend 대체, 외부 mode-shape acceptance 추가 또는 reference 변경으로 요구를 우회하지 않는다. ## MFE-ADR-002 — MITC4 질량 이산화 @@ -21,7 +23,7 @@ - 상태: 사용자 후속 요구로 확정됨; 상세 lumping 수식은 Research/Formulation 소유. - 결정 owner: user; 선택지 검토 owner: requirement-agent; 상세 수식 owner: formulation-agent. - 결정: `consistent mass`를 계산하고 이를 이용하여 `lumped mass`도 계산한다. 앞서 제안한 둘 중 하나의 선택이 아니라 두 계산의 연결이 사용자 요구이다. -- 근거: 2026-09-06 사용자 후속 답변 “mass matrix는 consistent mass를 계산하고 이를 이용해서 lumped mass를 계산합니다.”; [원래 질문 evidence](requirements-evidence.md#중요한-결정). +- 근거: 2026-09-06 사용자 후속 답변 “mass matrix는 consistent mass를 계산하고 이를 이용해서 lumped mass를 계산합니다.”; [원래 질문 evidence](requirements.md#requirements-evidence--중요한-결정). - 영향: Requirement owner는 r1에서 두 계산과 관계를 baseline에 반영한다. 실제 FEAST 질량은 후속 명시 답변으로 lumped로 확정되었으며 MFE-ADR-004를 따른다. - 경계: 기존 비물리 drilling DOF에 인공 관성을 추가하지 않는 방향을 권고한다. FEAST generalized problem의 mass SPD 조건과 질량 없는 drilling 처리는 Research와 Formulation이 물리 spectrum 보존 근거를 제시해야 한다. 축소 수식은 이 관리문서에서 정하지 않는다. @@ -42,7 +44,7 @@ - 결정 owner: user; 대안·영향 owner: requirement-agent. - 결정: `consistent mass -> lumped mass -> 고유치 해석` 순서로 수행하고 FEAST/reference baseline의 `M`은 derived lumped mass를 사용한다. Consistent는 lumping 원본과 내부 질량 검증 대상으로 유지한다. - 이유와 영향: 사용자가 최종 계산 흐름과 해석 사용 질량을 직접 명시했다. Modal residual, normalization 및 orthogonality의 기준 `M`도 실제 사용한 lumped mass이다. -- 근거: 2026-09-06 사용자 답변 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”; [Requirement owner r1 결정 evidence](requirements-evidence.md#중요한-결정)의 `MFE-OQ-002`를 해소한다. +- 근거: 2026-09-06 사용자 답변 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”; [Requirement owner r1 결정 evidence](requirements.md#requirements-evidence--중요한-결정)의 `MFE-OQ-002`를 해소한다. - 경계: 두 mass variant 외부 비교 또는 사용자 선택 API를 추가 요구하지 않는다. Lumping 수식은 Research/Formulation이 계약과 evidence로 구체화한다. ## MFE-ADR-005 — 요청 고유치 개수의 입력 권위 @@ -50,7 +52,7 @@ - 상태: 사용자 명시 확인; 기존 r1 요구사항의 의미 유지. - 결정 owner: user; 기록 owner: coordinator-agent. - 결정: 고유치 개수는 `.inp`의 `*FREQUENCY` data를 사용한다. 지정 input의 요청은 `10`개이며 reference 행수나 FEAST 내부 count 추정으로 요청 개수를 역추론하지 않는다. -- 근거: 2026-09-06 사용자 답변 “inp 파일의 고유치 개수를 사용합니다”; [r1 FEM-REQ-MITC4-EIGEN-009/015](requirements.md#requirement-verification-matrix). +- 근거: 2026-09-06 사용자 답변 “inp 파일의 고유치 개수를 사용합니다”; [r1 FEM-REQ-MITC4-EIGEN-009/015](requirements.md#requirements--requirement-verification-matrix). - 영향: 기존 mode-count 의미의 확인이므로 contract revision은 `r1`을 유지한다. FEAST interval/subspace는 입력 요청의 낮은 N개와 multiplicity·누락 검증을 충족하기 위한 내부 처리이다. 새 입력 설정 기능을 추가하지 않는다. ## MFE-ADR-006 — 질량 lumping과 질량 없는 좌표의 정식화 @@ -58,39 +60,39 @@ - 상태: Formulation owner 수학 계약 및 r2 독립 Numerical Review gate 확인. - 결정 owner: formulation-agent; 기록 owner: coordinator-agent. - 결정: Consistent scalar moments를 같은 `3×3×3` volume quadrature로 계산하고 moment row-sum에서 nodal `6×6` block lumped mass를 유도한다. 기존 global 제약 뒤 analytic director null과 기존 stabilization의 decoupling을 이용해 finite 공간을 투영하고 sparse nodal whitening으로 FEAST에 연결한다. -- 근거: [Formulation 핵심 계약](formulation.md#핵심-계약), [mass M1~M10](formulation-mass.md), [eigen E1~E8](formulation-eigen.md). +- 근거: [Formulation 핵심 계약](formulation.md#formulation--핵심-계약), [mass M1~M10](formulation.md#formulation-mass), [eigen E1~E8](formulation.md#formulation-eigen). - 영향: 곡면 coupling 및 mass/centroid·energy 차이를 명시하고 인공 drilling mass와 일반 dense Schur는 도입하지 않는다. Numerical Review는 수식·conditioning·FEAST controls·reference 준비를 독립 검토한다. -- 후속 검토: r1 NR-MFE-001로 확인된 기존 basis-dependent stabilization과 REQ-014 충돌은 MFE-ADR-007의 사용자 승인 개선 범위로 해결한다. r2 [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)는 complete K와 supported partial BC 검증을 명시하며 수식의 독립 판정은 NR가 수행한다. +- 후속 검토: r1 NR-MFE-001로 확인된 기존 basis-dependent stabilization과 REQ-014 충돌은 MFE-ADR-007의 사용자 승인 개선 범위로 해결한다. r2 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)는 complete K와 supported partial BC 검증을 명시하며 수식의 독립 판정은 NR가 수행한다. ## MFE-ADR-007 — 기존 stabilization과 좌표 불변성 acceptance 정합 - 상태: 사용자 명시 승인; `MFE-OQ-003`의 좌표 공변적인 stabilization 개선 및 영향받는 정적/eigen 재검증 범위 추가안 선택. - 발견 owner: numerical-review-agent; requirement intent owner: requirement-agent; 기록 owner: coordinator-agent. -- 근거: [NR-MFE-001](numerical-review.md#blocking-finding), [재현 가능한 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례). +- 근거: [NR-MFE-001](numerical-review.md#numerical-review--blocking-finding), [재현 가능한 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례). - 발견: 동일 물리 partial rotation BC를 유지한 회전에서 기존 basis-dependent `kd=min(tangent diagonals)` 때문에 고유치가 상대 `1.1291343961675893e-5`만큼 달라진다. 새 mass 또는 analytic reduction의 확인된 결함은 아니다. -- 판단 근거: [Requirement owner 검토](requirements-evidence.md#nr-mfe-001-requirements-intent-검토)는 `FEM-REQ-MITC4-EIGEN-002/008/014`와 기존 shell의 fixed `kd` 계약을 대조했다. 알려진 지원 모델 반례를 제외하는 것은 acceptance 변경이며 기존 강성의 교체·삭제도 묵시적으로 승인되지 않았다. +- 판단 근거: [Requirement owner 검토](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토)는 `FEM-REQ-MITC4-EIGEN-002/008/014`와 기존 shell의 fixed `kd` 계약을 대조했다. 알려진 지원 모델 반례를 제외하는 것은 acceptance 변경이며 기존 강성의 교체·삭제도 묵시적으로 승인되지 않았다. - 검토했던 대안: 기존 stabilization과 partial BC 지원을 유지하며 좌표 의존성을 한계로 수용하고 `014` 적용 범위를 변경하는 안과, 좌표 공변적인 stabilization 개선 및 영향받는 기존 정적/eigen 계약·회귀 검증을 추가하는 안을 비교했다. - 권고 owner와 이유: requirement-agent는 같은 물리 모델의 축 선택 의존성을 해결하는 후자를 권고한다. 기존 강성 계약 영향 검토와 정식화·회귀 검증 작업이 늘어나며 대체 수식은 Formulation 소유이다. - 승인 근거: 2026-09-06 사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함해주세요.” Root가 원문과 권고안 B 승인 사실을 Coordinator에 전달했다. - 결정 owner: user; 상세 요구 owner: requirement-agent; 개선 수식 owner: formulation-agent. - 영향: 승인된 scope 변경으로 contract revision을 `r2`로 올린다. Requirement owner가 기존 물리 kernel 재사용과 개선된 stabilized pencil 보존을 구분하고 해당 static/eigen 회귀 요구를 명시한다. 영향받는 Research/Formulation/NR evidence는 owner별 최소 delta 검토 후 갱신한다. - 경계: Partial BC 지원, 질량 흐름·FEAST 사용 mass·입력 N, reference 원본과 공통 tolerance를 유지한다. 기존 feature 보고서는 읽기 전용 이력으로 참조하며 현재 feature에서 대체되는 stabilization 계약의 범위를 명시한다. 사용자 승인으로 NR의 수치 gate나 구현 검증을 대신 통과시키지 않는다. -- 후속 근거: [Research R07](research-evidence.md#r07--r2-stabilization-근거와-영향)에 trace/spectral 기반의 기저 불변 scale 후보와 초기 고정 nonlinear 미분 구조, linear positive/null 조건을 기록했다. 이는 연구 후보이며 수식 채택은 Formulation owner가 수행한다. +- 후속 근거: [Research R07](research.md#research-evidence--r07--r2-stabilization-근거와-영향)에 trace/spectral 기반의 기저 불변 scale 후보와 초기 고정 nonlinear 미분 구조, linear positive/null 조건을 기록했다. 이는 연구 후보이며 수식 채택은 Formulation owner가 수행한다. ## MFE-ADR-008 — 초기 physical trace 평균 stabilization scale - 상태: r2 승인 개선 범위 안의 Formulation owner 수학 계약; 독립 NR에서 반례 해소 및 적용 경계 확인. - 결정 owner: formulation-agent; 기록 owner: coordinator-agent. - 결정: 초기 physical `K20`의 여덟 접평면 회전 대각 전체를 평균해 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 사용한다. Zero 대각도 포함하며 기존 numerical map과 nonlinear 초기 고정 lifecycle을 유지한다. -- 근거: [S1~S7](formulation-stabilization.md), [V8의 exact arithmetic·정적 evidence](formulation-verification.md#v8-r2-영향-확인과-bounded-evidence). +- 근거: [S1~S7](formulation.md#formulation-stabilization), [V8의 exact arithmetic·정적 evidence](formulation.md#formulation-verification--v8-r2-영향-확인과-bounded-evidence). - 이유·경계: 접평면 기저의 scalar invariant를 쓰면서 spectral subtraction과 positive nodal block 선별을 피한다. 양성 inventory·단위·연산 순서·invalid 실패, partial BC에 남는 stabilization 및 기존 physical/nonphysical 구분은 해당 수학 계약을 따른다. 계수나 mass를 reference에 맞추어 조정하지 않는다. -- 검증 인계: NR-MFE-001의 새 algebraic target `k_d=19/4800`, `lambda=10369/450` 및 물리 tangent moment의 정적 response를 NR가 독립 직접 적분으로 확인했다. [r2 evidence](numerical-review-evidence.md)는 기존 실패와 새 complete K/질량/response/reaction 공변성 결과를 보존한다. 실제 C++/FEAST/reference 통과나 release evidence는 아니다. +- 검증 인계: NR-MFE-001의 새 algebraic target `k_d=19/4800`, `lambda=10369/450` 및 물리 tangent moment의 정적 response를 NR가 독립 직접 적분으로 확인했다. [r2 evidence](numerical-review.md#numerical-review-evidence)는 기존 실패와 새 complete K/질량/response/reaction 공변성 결과를 보존한다. 실제 C++/FEAST/reference 통과나 release evidence는 아니다. ## MFE-ADR-009 — NR 내부 controls와 외부 비교의 분리 - 상태: r2 Numerical Review owner가 고정한 수치·검증 계약; gate evidence audit 완료. - 결정 owner: numerical-review-agent; 기록 owner: coordinator-agent. -- 결정: [Controls C1~C7](numerical-review-controls.md)의 같은 단위 metric/zero branch·analytic rank/conditioning·modal residual/Gram·FEAST parameter/seed/thread/storage/budget과 [27개 필수 case](numerical-review-cases.md)를 적용한다. 구체 수치의 원본은 해당 owner 문서다. +- 결정: [Controls C1~C7](numerical-review.md#numerical-review-controls)의 같은 단위 metric/zero branch·analytic rank/conditioning·modal residual/Gram·FEAST parameter/seed/thread/storage/budget과 [27개 필수 case](numerical-review.md#numerical-review-cases)를 적용한다. 구체 수치의 원본은 해당 owner 문서다. - 외부 비교: [reference-model](reference-model.md)의 source Step-2/mode-frame 1~10, Value=`omega²[T^-2]`, 10개 singleton family와 공통 TOLERANCE를 유지한다. 현재 양수 값의 실효 mode별 1%는 공통 RMS 정책의 결과이며 새 tolerance 변경이 아니다. - 영향: I/O와 Planning/Implementation은 수치 threshold·mass·source identity를 임의로 바꾸지 않는다. 실제 FEAST known spectra·fresh reference 및 영향받은 static 회귀는 아직 수행할 필수 작업이다. 기존 static U/UR·reaction 역할을 새 eigen Value-only와 혼동하지 않는다. @@ -98,25 +100,25 @@ - 상태: r2 I/O owner의 계약과 정적 evidence gate 확인. - 결정 owner: io-definition-agent; 기록 owner: coordinator-agent. -- 결정: [입력 I1~I6](io-input.md)의 constant density·단일 frequency·입력 N·부수 옵션 subset을 적용한다. [O1~O5](io-schema.md)의 eigen procedure discriminant와 source step identity, 공개 N개 scalar/vector 및 전체 c 검증·FEAST call evidence를 저장한다. +- 결정: [입력 I1~I6](io.md#io-input)의 constant density·단일 frequency·입력 N·부수 옵션 subset을 적용한다. [O1~O5](io.md#io-schema)의 eigen procedure discriminant와 source step identity, 공개 N개 scalar/vector 및 전체 c 검증·FEAST call evidence를 저장한다. - 이유·영향: 기존 static schema0/1의 의미와 mandatory inventory는 유지한다. 새 eigen은 `(schema_version=0, eigen_schema_version=1, analysis_procedure=linear-frequency)`와 Feature ID로 구분한다. Raw negative lambda와 unavailable real frequency를 명시적으로 분리하며 기존 non-Newton log lifecycle은 보존한다. -- 근거·경계: [M1~M5](io-mapping.md)의 책임·candidate replace 후 no-fail swap·원본 TXT full grammar 및 27개 요구 mapping을 따른다. 외부 projection은 공개 modes의 Value만 사용하고 10개 singleton family의 공통 판정을 유지한다. 영속 N개 vector는 내부 재현용이며 외부 mode-shape gate를 추가하지 않는다. 실제 parser/HDF5/FEAST/comparator 성공은 아직 미실행이다. +- 근거·경계: [M1~M5](io.md#io-mapping)의 책임·candidate replace 후 no-fail swap·원본 TXT full grammar 및 27개 요구 mapping을 따른다. 외부 projection은 공개 modes의 Value만 사용하고 10개 singleton family의 공통 판정을 유지한다. 영속 N개 vector는 내부 재현용이며 외부 mode-shape gate를 추가하지 않는다. 실제 parser/HDF5/FEAST/comparator 성공은 아직 미실행이다. ## MFE-ADR-011 — 유한 실행 준비와 검증 단위 - 상태: r2 Planning owner의 실행 계약 및 정적 gate 확인; 실제 실행은 미완료. - 결정 owner: implementation-planning-agent; 사용자 실행 권한 해석: Root; 기록 owner: coordinator-agent. -- 결정: [계획](implementation-plan.md)의 별도 prep 1개 step 뒤 새 invocation으로 main 8개 step을 실행한다. 결합된 API/data 단위를 통합해 불필요한 full VERIFY 반복을 줄이고 각 step의 TDD·focused/full VERIFY·등록 Stop은 유지한다. -- 운영 근거: 기존 전체 검증의 약27.9분 합산 추정과 여러 1800초 deadline, nonlinear helper의 매번 solve 및 이미 로드된 Executor/Stop의 activation 경계를 [환경 E2/E3](implementation-environment.md)에 대조했다. 준비에서는 단일 유한 class timeout만 지정 후 실제 Executor main을 호출하며 runtime default의 최소 변경과 대응 Harness tests를 수행한다. +- 결정: [계획](development-notes.md#실패와-재발-방지)의 별도 prep 1개 step 뒤 새 invocation으로 main 8개 step을 실행한다. 결합된 API/data 단위를 통합해 불필요한 full VERIFY 반복을 줄이고 각 step의 TDD·focused/full VERIFY·등록 Stop은 유지한다. +- 운영 근거: 기존 전체 검증의 약27.9분 합산 추정과 여러 1800초 deadline, nonlinear helper의 매번 solve 및 이미 로드된 Executor/Stop의 activation 경계를 [환경 E2/E3](development-notes.md#실패와-재발-방지)에 대조했다. 준비에서는 단일 유한 class timeout만 지정 후 실제 Executor main을 호출하며 runtime default의 최소 변경과 대응 Harness tests를 수행한다. - 경계: Bootstrap은 기존 CLI option이나 sandbox 확대가 아니다. 정확한 값/명령은 Planning 문서의 원본을 따르고 Hook state·reentry·실행 메서드·retry·ownership guard를 override하지 않는다. Root/Coordinator도 active invocation 동안 non-owned 편집·커밋을 멈춘다. 보고 시점의 manual evidence와 Executor 종료 뒤 registered Stop/actual exit 사후 확인을 구분하며 성공 전 main activation을 하지 않는다. -- 실제 결과: [prep attempt1](coordination.md#execution-prep-attempt-1-실제-결과)은 기본 workspace-write에서 지정 `.codex/hooks.json` 변경을 거부당해 `blocked-environment`로 종료했다. Partial runtime/test/doc 변경과 마지막 test 수정 미검증을 보존한다. 현재 결정은 sandbox 확대나 성공 판정 권한을 포함하지 않으며, guarded Executor checkpoint 복구 계획 후 해당 실행 직전 명시적 사용자 승인 경계를 적용한다. +- 실제 결과: [prep attempt1](development-notes.md#실패와-재발-방지)은 기본 workspace-write에서 지정 `.codex/hooks.json` 변경을 거부당해 `blocked-environment`로 종료했다. Partial runtime/test/doc 변경과 마지막 test 수정 미검증을 보존한다. 현재 결정은 sandbox 확대나 성공 판정 권한을 포함하지 않으며, guarded Executor checkpoint 복구 계획 후 해당 실행 직전 명시적 사용자 승인 경계를 적용한다. ## MFE-ADR-012 — Source echo 분류 오탐의 bounded 운영 correction - 상태: 실제 최소 Correction1회와 targeted GREEN37 확인; 전체 prep gate는 환경 차단으로 미완료. - 발견·재현 owner: Root; 계획 owner: implementation-planning-agent; correction dispatch owner: coordinator-agent. -- 근거: [실제 raw/순수함수 재현](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json), [복구 R4](implementation-recovery.md#r4-조건부-exact-dfa-invocation과-후속-검증), [prep TDD](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md). +- 근거: 실제 raw/순수함수 재현(당시 경로: `../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json`, 현재 checkout에 없음), [복구 R4](development-notes.md#실패와-재발-방지), [prep TDD](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md). - 결정: 성공한 source-read 출력의 helper marker를 실제 runtime failure로 오인하는 분류 결함만 기존 `scripts/execute.py`/`tests/test_execute.py` 안에서 먼저 수정한다. 진짜 helper 진단, 명시 terminal/history, 실제 wrapper timeout만 허용되는 retry 및 sandbox/ownership 보호를 유지한다. - 순서·이유: 기존 timeout-only AST guard로 현재 blocked/WIP를 먼저 보존하고 별도 Correction 뒤 새 Executor process를 시작한다. 이미 import된 classifier는 child source 수정만으로 바뀌지 않으며 reload/guard override로 성공을 만들지 않는다. 실제 Hook 쓰기 거부는 별도 환경 blocker로 보존한다. - 경계: Physics/schema/tolerance `r2`와 선행6개 기술 계약을 바꾸지 않는다. Correction은 별도 signature의 unused allowance 확인 후 명시 dispatch하며 성공·검증·커밋은 실제 결과 뒤에만 기록한다. Exact-run sandbox 사용자 승인과 full VERIFY는 유지한다. -- 실제 evidence: [Correction owner 보고서](corrections.md)는 RED21fail/16pass 후 GREEN37pass, full Python152pass/Hook assertion1fail, manual build의 FileTracker TEMP 접근 거부 및 CTest 미실행을 기록한다. [Coordinator 사후 관찰](coordination.md#현재-bounded-dispatch)은 native/registered Stop/CTest의 실제 exit0, 별도 자동362pass와 비소유 bytes 보존을 확인했다. Source/test 교정은 아직 checkpoint 전이며 두 번째 Correction을 허용하지 않는다. 확인된 process-local workspace 환경과 unchanged Executor 보존 절차는 Planning의 후속 delta에서 고정한다. +- 실제 evidence: [Correction owner 보고서](development-notes.md#실패와-재발-방지)는 RED21fail/16pass 후 GREEN37pass, full Python152pass/Hook assertion1fail, manual build의 FileTracker TEMP 접근 거부 및 CTest 미실행을 기록한다. [Coordinator 사후 관찰](development-notes.md#실패와-재발-방지)은 native/registered Stop/CTest의 실제 exit0, 별도 자동362pass와 비소유 bytes 보존을 확인했다. Source/test 교정은 아직 checkpoint 전이며 두 번째 Correction을 허용하지 않는다. 확인된 process-local workspace 환경과 unchanged Executor 보존 절차는 Planning의 후속 delta에서 고정한다. diff --git a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md index d5e9e6d..e64afa7 100644 --- a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md @@ -1,76 +1,22 @@ -# MITC4 Shell Mass Matrix와 FEAST 고유치해석 +# mitc4-shell-feast-eigen 문서·작업 지침 - Feature ID: `mitc4-shell-feast-eigen` -- Owner: `coordinator-agent` -- Input contract revision: `r2` (사용자 승인 stabilization 개선 범위 반영) -- 목적: MITC4 shell의 질량행렬과 MKL FEAST 고유치해석을 입력부터 HDF5 결과와 독립 검증까지 연결한다. -- 현재 workflow 상태 원본: [coordination.md](coordination.md) +- 문서 진입점·목적·사용법·Handoff: [README](README.md). +- 현재 범위·checklist: [PRD](PRD.md); 결정·승인·대체 이력: [ADR](ADR.md). +- 적용 범위: 해당 기능의 문서. 자동 로드되는 코드 영역 `AGENTS.md`가 아니다. -## 기준과 지역 지침 +기준: [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md), +[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [공통 tolerance](../TOLERANCE.md). -[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), -[ARCHITECTURE](../ARCHITECTURE.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), -[FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md), [TOLERANCE](../TOLERANCE.md)를 읽기 전용으로 적용한다. +## 보존할 계약과 인계 -사용자는 requirements부터 release-readiness까지 9개 stage의 문서·계획·구현·local 검증을 요청했다. -중요한 physics, scope, acceptance, 비호환 public contract 결정만 사용자에게 묶어서 요청한다. -일반 문서나 stage handoff의 반복 승인은 요구하지 않는다. -Reference는 `reference/shellNL-eigen-meshfine`의 기존 경로와 내용을 그대로 사용한다. -외부 reference 비교량은 고유치만이며 mode shape를 외부 acceptance로 추가하지 않는다. -내부 수학적·물리적 검증은 별도 evidence로 요구한다. 사용자 후속 요구는 consistent mass 계산 후 이를 이용한 lumped mass 계산이다. -Actual FEAST mass는 사용자 명시 승인에 따라 derived lumped mass이다. `consistent -> lumped -> FEAST` 순서와 lumped 기준 modal 검증을 유지하고 상세 lumping 수식은 owner가 evidence와 함께 정의한다. -사용자는 기존 drilling stabilization의 좌표 공변적 개선과 영향받는 기존 정적/eigen 재검증까지 범위에 포함하도록 승인했다. 기존 물리 kernel·질량·reference·공통 tolerance는 유지하며 승인된 변경의 상세 계약과 증거는 각 owner가 갱신한다. +수식·I/O·수치 기준의 원본은 README에서 연결한 전문 문서를 따른다. 기능을 재개할 때 +관련 계약과 실제 실행 revision·미해결 항목을 함께 읽는다. 과거 stage pass나 현재 문서 +정리를 solver 검증 통과로 계산하지 않는다. 요구사항·ADR ID와 승인 이력을 유지한다. +메인은 PRD·ADR·진입점·문서 참조를 관리하고 전문 작업자는 할당한 본문과 관련 범위만 수정한다. +기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다. +문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다. -Specialist는 하나의 assigned stage만 수행하고 peer dispatch, workflow 전이 또는 자기 최종 승인을 하지 않는다. -각 dispatch와 Harness step은 이 폴더와 [이 문서](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)를 필수 입력으로 명시한다. -기본 보고서는 간결하게 작성하고 긴 상세 계약은 같은 Feature 폴더에 상대 링크로 분리한다. -Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실행 및 push/tag/publish/deploy/package는 범위 밖이다. - -## 문서 목록 - -| 경로 | Owner | Revision | 검토 상태 | -| --- | --- | --- | --- | -| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | coordinator-agent | r2 | 후속 승인 범위 반영 | -| [PRD.md](PRD.md) | coordinator-agent | r2 | 사용자 요구 요약 | -| [ADR.md](ADR.md) | coordinator-agent | r2 | MFE-ADR-007 사용자 승인 기록 | -| [coordination.md](coordination.md) | coordinator-agent | r2 | workflow 상태 원본 | -| [requirements.md](requirements.md) | requirement-agent | r2 | 27개 must; 승인 범위 delta baseline gate pass | -| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r2 | fixed kd 대체 경계·기존 static 회귀·승인 evidence audit 완료 | -| [research.md](research.md) | research-agent | r2 | 27개 coverage·승인 delta evidence gate pass | -| [research-evidence.md](research-evidence.md) | research-agent | r2 | R07 공변 scale 후보·nonlinear lifecycle·null 조건; 기존 근거 보존 확인 | -| [formulation.md](formulation.md) | formulation-agent | r2 | 27개 coverage·수학 handoff 및 독립 NR gate pass | -| [formulation-mass.md](formulation-mass.md) | formulation-agent | r2 | 질량 수학 근거 보존 확인; numerical scale만 r2 연결 | -| [formulation-eigen.md](formulation-eigen.md) | formulation-agent | r2 | 개선된 K의 null 처리·finite spectrum·복원 수학 계약 | -| [formulation-verification.md](formulation-verification.md) | formulation-agent | r2 | complete K/partial BC·static 회귀 갱신; NR controls와 함께 적용 | -| [formulation-stabilization.md](formulation-stabilization.md) | formulation-agent | r2 | trace 평균 scale·positivity·covariance·nonlinear lifecycle·반례 exact target | -| [numerical-review.md](numerical-review.md) | numerical-review-agent | r2 | 독립 수학·controls·logical reference readiness gate pass | -| [numerical-review-evidence.md](numerical-review-evidence.md) | numerical-review-agent | r2 | r1 실패 보존 및 r2 독립 반례 해소·정적 audit | -| [numerical-review-controls.md](numerical-review-controls.md) | numerical-review-agent | r2 | 내부 metric/zero/conditioning·FEAST parameter/budget/seed·정적 회귀 기준 고정 | -| [numerical-review-cases.md](numerical-review-cases.md) | numerical-review-agent | r2 | 27개 requirement와 27개 필수 logical case mapping | -| [reference-model.md](reference-model.md) | numerical-review-agent | r2 | 10개 Value·singleton family·공통 policy logical readiness; 실제 비교 미실행 | -| [io.md](io.md) | io-definition-agent | r2 | 입력·별도 eigen lifecycle·additive schema·projection gate pass | -| [io-input.md](io-input.md) | io-definition-agent | r2 | density/frequency exact subset·source N·warning/진단 및 공식 syntax 근거 | -| [io-schema.md](io-schema.md) | io-definition-agent | r2 | 기존 static 보존·eigen discriminant·N vectors/all-c evidence·self-check | -| [io-mapping.md](io-mapping.md) | io-definition-agent | r2 | 책임·candidate 보존·TXT Value-only·27개 요구/11개 I/O 검증 obligation | -| [implementation-plan.md](implementation-plan.md) | implementation-planning-agent | r2 | Prep 1/main 8개 step 및 실행 계획 gate pass | -| [implementation-environment.md](implementation-environment.md) | implementation-planning-agent | r2 | E10 local 복구·E11 invocation 및 canonical7500/trusted 확인; attempt5 수동 명령 미준수와 registered 실제 결과는 coordination | -| [implementation-recovery.md](implementation-recovery.md) | implementation-planning-agent | r2 | R11 완료·R13 attempt5 WIP 보존/별도 status-only/control 계획 감사 완료; 실제 R13 미실행 | -| [implementation-interfaces.md](implementation-interfaces.md) | implementation-planning-agent | r2 | 기존 확장점·API/source-test·vendor/state/transaction 책임 | -| [implementation-verification.md](implementation-verification.md) | implementation-planning-agent | r2 | 요구27/NR27/I/O11·신규 test40·독립 oracle·fresh evidence·실제 validator | -| [implementation-prep-evidence.md](implementation-prep-evidence.md) | implementation-agent | r2 | attempt5 수동 과거 VS 명령 실패·manual full 미충족; actual focused3회/registered362·Stop0 및 owner 표기 차이는 coordination 참조 | -| [msvc-build-access-error.md](msvc-build-access-error.md) | Root (사용자 요청 설명문서) | r2 | 접근 오류·E10 local 복구·canonical exact1 commit 및 공식 API7500/trusted 실제 근거; native 검증은 별도 | -| [corrections.md](corrections.md) | correction-agent | r2 | source echo 최소 교정1회·RED/GREEN37 확인; full Python Hook1실패와 manual build 환경 차단 보존, registered Stop362 pass는 coordination 후속 evidence | -| [phases/index.json](../../phases/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | 기존5개 보존; prep blocked/main pending | -| [prep index](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | actual attempt5 blocked/history5; 이전 history4 보존·수동 명령 정합 owner 반환 | -| [prep step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md) | implementation-planning-agent | r2 | 현재 local preset·직렬 clean-first·세 discovery·전체 검증/종료 poll 직접 명시; 기존 RED/GREEN 보존 | -| [main index](../../phases/mitc4-shell-feast-eigen/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | Step0~7 pending; exact owned paths 검증 | -| [main step0](../../phases/mitc4-shell-feast-eigen/step0.md) | implementation-planning-agent | r2 | Frequency model/parser | -| [main step1](../../phases/mitc4-shell-feast-eigen/step1.md) | implementation-planning-agent | r2 | 공변 stabilization/static 회귀 | -| [main step2](../../phases/mitc4-shell-feast-eigen/step2.md) | implementation-planning-agent | r2 | Consistent/lumped/assembly | -| [main step3](../../phases/mitc4-shell-feast-eigen/step3.md) | implementation-planning-agent | r2 | Actual BC/null/whitening | -| [main step4](../../phases/mitc4-shell-feast-eigen/step4.md) | implementation-planning-agent | r2 | FEAST call/search | -| [main step5](../../phases/mitc4-shell-feast-eigen/step5.md) | implementation-planning-agent | r2 | All-c validation/frequency procedure | -| [main step6](../../phases/mitc4-shell-feast-eigen/step6.md) | implementation-planning-agent | r2 | HDF5/CLI transaction | -| [main step7](../../phases/mitc4-shell-feast-eigen/step7.md) | implementation-planning-agent | r2 | Comparator/fresh eigen/static/구현 evidence | - -아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다. +이 폴더는 이전 MFE 요구·유도·반례의 이력이다. 현재 구현은 [eigen2](../mitc4-shell-feast-eigen2/README.md)가 +소유한다. 이전 controls/schema/reference portfolio의 자동 승계와 prep/Hook 복원을 금지한다. +이전 MFE ID와 새 MFE2 ID의 대응·채택/비채택 범위를 확인한다. diff --git a/docs/mitc4-shell-feast-eigen/PRD.md b/docs/mitc4-shell-feast-eigen/PRD.md index e8707f5..dad8162 100644 --- a/docs/mitc4-shell-feast-eigen/PRD.md +++ b/docs/mitc4-shell-feast-eigen/PRD.md @@ -1,24 +1,16 @@ -# MITC4 Shell Mass Matrix와 FEAST 고유치해석 PRD +# 이전 MITC4 질량·FEAST 요구 baseline -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `coordinator-agent` -- Input contract revision: `r2` -- 검토 상태: r2 requirements부터 implementation-planning까지 6개 gate pass; execution-prep attempt1은 지정 Hook 설정 쓰기 거부로 blocked-environment. 부분 runtime/test 변경과 미검증 test 수정을 보존하며 solver 구현·실제 reference 비교는 미실행이다. +- Feature ID: `mitc4-shell-feast-eigen`; 이전 input contract revision: `r2`. +- 현재 용도: MFE 요구사항·승인·유도·반례의 이력. 새 구현 상태는 [eigen2 PRD](../mitc4-shell-feast-eigen2/PRD.md)가 소유한다. +- 진입점과 이전 실행 실패: [README](README.md), [개발 교훈](development-notes.md). +- 승인 이력: [ADR](ADR.md); 요구 ID·근거: [requirements](requirements.md). -기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md). -지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다. +## 사용자 요구와 승계 경계 -## 사용자 요구 - -1. MITC4 Shell 요소의 Mass Matrix를 구현한다. -2. 고유치해석 procedure를 구현하며 고유치 계산 backend는 Intel MKL FEAST로 한다. -3. `reference/shellNL-eigen-meshfine`에 있는 모델과 결과를 검증 기준으로 사용한다. -4. 외부 reference 검증은 고유치만 비교한다. -5. Coordinator 주도 requirements부터 release-readiness까지 9개 stage를 수행하며 중요한 사안만 인터뷰·검토를 요청한다. -6. Consistent mass를 먼저 계산하고 이를 이용하여 lumped mass를 계산하며, 고유치해석에는 lumped mass를 사용한다. -7. `FESA_GTEST_SOURCE_DIR=C:\git\googletest`를 사용하고 작업 중 완료된 변경을 Git에 커밋한다. -8. 고유치 개수는 `.inp`의 `*FREQUENCY` data를 사용한다. 지정 모델의 요청은 `10`개이다. -9. 기존 drilling stabilization을 좌표 공변적으로 개선하고 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함한다. +Consistent mass로부터 lumped mass를 유도하고 실제 FEAST·입력 N·Value-only 원본 비교를 +구현하며 공변 drilling 개선과 영향받는 정적/eigen 재검증을 요구했던 baseline이다. +과거9-stage·Hook prep는 현재 실행 절차가 아니다. 수학 근거의 채택/비채택과 MFE→MFE2 +대응은 새 baseline에서 명시하며 이전 pass·controls·test 수를 자동 승계하지 않는다. ## 범위와 acceptance @@ -26,32 +18,32 @@ 구체적인 질량 정식화, 해석 기준 상태, 모드 요청 의미, 출력량 및 지원 subset은 Requirement Agent가 evidence를 조사하고 후속 owner와 critical decision 절차로 고정한다. 외부 mode-shape 비교, reference 생성·수정·복원과 외부 배포는 요청된 범위에 포함되지 않는다. MSVC x64 Debug CMake/CTest, TDD, common tolerance, failure preservation과 독립 physics 검토를 적용한다. -Requirement ID별 원본 계약과 검증 matrix는 [requirements.md](requirements.md#requirement-verification-matrix)가 소유한다. +Requirement ID별 원본 계약과 검증 matrix는 [requirements.md](requirements.md#requirements--requirement-verification-matrix)가 소유한다. | Requirement IDs (`FEM-REQ-MITC4-EIGEN-`) | Acceptance 요약 및 원본 계약 | | --- | --- | -| `001`~`004` | [원형상 procedure, 기존 shell mapping, material density와 section 연결](requirements.md#requirement-verification-matrix) | -| `005`~`008` | [질량 이산화 선택, 물리 관성, 조립, massless 좌표 admissibility](requirements.md#requirement-verification-matrix) | -| `009`~`014` | [낮은 모드, multiplicity, FEAST, 실패 처리, 내부 eigenpair 및 physics evidence](requirements.md#requirement-verification-matrix) | -| `015`~`019` | [입력 subset, 진단, HDF5, source/modal identity 및 candidate 보존](requirements.md#requirement-verification-matrix) | -| `020`~`022` | [고유치-only 외부 비교, identity 사전검사 및 common tolerance](requirements.md#requirement-verification-matrix) | -| `023`~`025` | [TDD·MSVC 검증, 기존 정적 회귀 및 동일 revision의 독립 closure](requirements.md#requirement-verification-matrix) | -| `026` | [Consistent에서 lumped 유도 및 질량·관성 불변식](requirements.md#requirement-verification-matrix) | -| `027` | [좌표 공변적인 numerical stabilization 및 영향받는 static/eigen 검증](requirements.md#requirement-verification-matrix) | +| `001`~`004` | [원형상 procedure, 기존 shell mapping, material density와 section 연결](requirements.md#requirements--requirement-verification-matrix) | +| `005`~`008` | [질량 이산화 선택, 물리 관성, 조립, massless 좌표 admissibility](requirements.md#requirements--requirement-verification-matrix) | +| `009`~`014` | [낮은 모드, multiplicity, FEAST, 실패 처리, 내부 eigenpair 및 physics evidence](requirements.md#requirements--requirement-verification-matrix) | +| `015`~`019` | [입력 subset, 진단, HDF5, source/modal identity 및 candidate 보존](requirements.md#requirements--requirement-verification-matrix) | +| `020`~`022` | [고유치-only 외부 비교, identity 사전검사 및 common tolerance](requirements.md#requirements--requirement-verification-matrix) | +| `023`~`025` | [TDD·MSVC 검증, 기존 정적 회귀 및 동일 revision의 독립 closure](requirements.md#requirements--requirement-verification-matrix) | +| `026` | [Consistent에서 lumped 유도 및 질량·관성 불변식](requirements.md#requirements--requirement-verification-matrix) | +| `027` | [좌표 공변적인 numerical stabilization 및 영향받는 static/eigen 검증](requirements.md#requirements--requirement-verification-matrix) | Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상세 관찰과 단위 의미는 -[requirements evidence](requirements-evidence.md#원본-reference-관찰)에 있다. +[requirements evidence](requirements.md#requirements-evidence--원본-reference-관찰)에 있다. 두 질량 계산의 연결에 관한 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)는 사용자 후속 요구로 확정되었다. 실제 FEAST mass는 [MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 따라 lumped로 승인되었다. 상세 lumping 수식은 Research/Formulation owner가 정의한다. -Primary-source 근거와 적용 한계는 [research](research.md), 상세 근거는 [research-evidence](research-evidence.md)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다. -구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md), 고정된 내부 수치 기준은 [NR controls](numerical-review-controls.md), 필수 검증은 [27개 cases](numerical-review-cases.md)에 있다. +Primary-source 근거와 적용 한계는 [research](research.md#research), 상세 근거는 [research-evidence](research.md#research-evidence)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다. +구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md#formulation), 고정된 내부 수치 기준은 [NR controls](numerical-review.md#numerical-review-controls), 필수 검증은 [27개 cases](numerical-review.md#numerical-review-cases)에 있다. [Reference artifact·logical readiness](reference-model.md)와 독립 수학/controls evidence를 함께 확인하여 r2 NR gate를 통과했다. -[I/O 계약](io.md)은 [exact 입력 subset](io-input.md), [additive HDF5와 내부 modal evidence](io-schema.md), [책임·failure·Value projection](io-mapping.md)을 정의했다. Source Step-2와 canonical storage Step-1, 입력 요청 N과 전체 검증 c를 구분하며 기존 static 계약은 보존한다. 구현 계획은 27개 요구와 I/O 검증 obligation을 실제 TDD·full VERIFY·fresh reference 경로에 연결해야 한다. -[실행 계획](implementation-plan.md)은 운영 준비 1개와 main 8개 step으로 구체화했고 [verification mapping](implementation-verification.md)에 요구27/NR27/I/O11 및 필수 test40개를 연결했다. 정확한 owned paths·actual backend·유한 실행시간·fresh solve·등록 Stop 사후 확인은 [환경 계약](implementation-environment.md)과 각 phase step을 따른다. 실제 실행 성공과 독립 physics/release gate는 아직 남아 있다. -r1의 [NR-MFE-001 실패 이력](numerical-review-evidence.md)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계였다. +[I/O 계약](io.md#io)은 [exact 입력 subset](io.md#io-input), [additive HDF5와 내부 modal evidence](io.md#io-schema), [책임·failure·Value projection](io.md#io-mapping)을 정의했다. Source Step-2와 canonical storage Step-1, 입력 요청 N과 전체 검증 c를 구분하며 기존 static 계약은 보존한다. 구현 계획은 27개 요구와 I/O 검증 obligation을 실제 TDD·full VERIFY·fresh reference 경로에 연결해야 한다. +[실행 계획](development-notes.md#실패와-재발-방지)은 운영 준비 1개와 main 8개 step으로 구체화했고 [verification mapping](development-notes.md#실패와-재발-방지)에 요구27/NR27/I/O11 및 필수 test40개를 연결했다. 정확한 owned paths·actual backend·유한 실행시간·fresh solve·등록 Stop 사후 확인은 [환경 계약](development-notes.md#실패와-재발-방지)과 각 phase step을 따른다. 실제 실행 성공과 독립 physics/release gate는 아직 남아 있다. +r1의 [NR-MFE-001 실패 이력](numerical-review.md#numerical-review-evidence)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계였다. Requirement owner는 알려진 partial-BC 반례를 단순 clarification으로 제외할 수 없다고 판단했다. -[MFE-OQ-003 대안·영향](requirements-evidence.md#nr-mfe-001-requirements-intent-검토) 중 좌표 공변적인 stabilization 개선과 영향받는 정적/eigen 재검증 범위 추가가 사용자에게 승인되었다. 단순 한계 수용 및 acceptance 축소안은 선택되지 않았다. +[MFE-OQ-003 대안·영향](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토) 중 좌표 공변적인 stabilization 개선과 영향받는 정적/eigen 재검증 범위 추가가 사용자에게 승인되었다. 단순 한계 수용 및 acceptance 축소안은 선택되지 않았다. 사용자가 확정한 질량 계산 흐름·FEAST 사용 mass·입력 N·외부 Value-only 범위는 유지한다. 개선 수식과 실제 구현·검증은 해당 owner의 후속 gate를 거쳐야 한다. -기존 fixed scale의 [대체 경계](requirements.md#r2의-기존-계약-대체-범위)와 [필수 static 회귀 포트폴리오](requirements-evidence.md#r2-승인-범위와-정적-재검증)는 Requirement owner r2에 명시되어 있다. 과거 정적 reference의 U/UR 및 reaction 검토 정책은 해당 기존 계약으로 재검증하고 새 eigen 비교량은 Value로 유지한다. -[r2 research delta](research-evidence.md#r07--r2-stabilization-근거와-영향)는 기저 불변 scale 후보, 초기 고정 nonlinear lifecycle 및 linear massless 처리의 조건을 구분한다. 최종 수식 채택과 반례 해소 판정은 후속 owner 소유이다. -[r2 stabilization 정식화](formulation-stabilization.md)는 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 채택하고 양성 inventory·complete K의 공변성·nonlinear 고정 lifecycle 및 반례의 고유치/정적 exact target을 정의한다. NR는 반례를 독립 직접 적분으로 재검산해 r2 수학 계약의 해소를 확인했다. 실제 C++/FEAST 구현 및 fresh reference 재검증은 후속 필수 gate다. +기존 fixed scale의 [대체 경계](requirements.md#requirements--r2의-기존-계약-대체-범위)와 [필수 static 회귀 포트폴리오](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)는 Requirement owner r2에 명시되어 있다. 과거 정적 reference의 U/UR 및 reaction 검토 정책은 해당 기존 계약으로 재검증하고 새 eigen 비교량은 Value로 유지한다. +[r2 research delta](research.md#research-evidence--r07--r2-stabilization-근거와-영향)는 기저 불변 scale 후보, 초기 고정 nonlinear lifecycle 및 linear massless 처리의 조건을 구분한다. 최종 수식 채택과 반례 해소 판정은 후속 owner 소유이다. +[r2 stabilization 정식화](formulation.md#formulation-stabilization)는 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 채택하고 양성 inventory·complete K의 공변성·nonlinear 고정 lifecycle 및 반례의 고유치/정적 exact target을 정의한다. NR는 반례를 독립 직접 적분으로 재검산해 r2 수학 계약의 해소를 확인했다. 실제 C++/FEAST 구현 및 fresh reference 재검증은 후속 필수 gate다. diff --git a/docs/mitc4-shell-feast-eigen/README.md b/docs/mitc4-shell-feast-eigen/README.md new file mode 100644 index 0000000..5264021 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/README.md @@ -0,0 +1,9 @@ +# 이전 MITC4 질량·FEAST baseline + +현재 기능은 [mitc4-shell-feast-eigen2](../mitc4-shell-feast-eigen2/README.md)를 따른다. +이 폴더는 이전 요구·결정과 채택된 유도 근거를 보존하며 미완료 prep를 재개하는 계획이 아니다. + +- [PRD](PRD.md), [ADR](ADR.md), [요구사항](requirements.md#requirements): 기존 ID와 승인 이력. +- [정식화](formulation.md#formulation), [수치 검산](numerical-review.md#numerical-review), [연구](research.md#research): 채택·비채택을 구분할 근거. +- [이전 I/O](io.md#io), [이전 reference 계약](reference-model.md): 당시 의미; 현재 schema/portfolio 아님. +- [환경 실패·교훈·Handoff](development-notes.md): 재발 방지와 실제 실패/미실행의 구분. diff --git a/docs/mitc4-shell-feast-eigen/coordination.md b/docs/mitc4-shell-feast-eigen/coordination.md deleted file mode 100644 index c70ed72..0000000 --- a/docs/mitc4-shell-feast-eigen/coordination.md +++ /dev/null @@ -1,515 +0,0 @@ -# MITC4 Shell Mass Matrix와 FEAST 고유치해석 coordination - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `coordinator-agent` -- Contract revision: `r2` (사용자 승인 stabilization 개선·영향받는 정적/eigen 재검증 범위) -- Stage: `implementation` (E11 attempt5 보존 및 정합된 Step 재개) -- Outcome: `retry` -- Next owner: `implementation-agent` (R13 WIP 보존·별도 Planning status-only/control checkpoint·clean 확인 후 정상 E11) -- Attempt: `5` (actual Step0 blocked/history5; 이전 history4 보존) -- Completion: 미완료 -- Failure classification: `environment` -- Retry key: `mitc4-shell-feast-eigen|implementation|environment|r2` -- Escalation class: `null` -- Blocker: `null` (실패 보존·status-only/control checkpoint는 실행 전 필수이고 manual full VERIFY는 여전히 미충족이다.) - -기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), -[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md). -문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 범위는 [PRD.md](PRD.md), 결정은 [ADR.md](ADR.md)를 따른다. - -## Gate evidence - -| Gate | Evidence | Coordinator 판정 | -| --- | --- | --- | -| intake | 사용자 요청, 공통 운영 계약 및 관리문서 4개 생성 | pass | -| requirements r0 초안 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md) | needs-user-decision; 질량 선택 미승인으로 baseline pass 보류 | -| requirements r1 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md), MFE-ADR-002/004 사용자 명시 결정 | pass; 26개 must와 owner/revision/hash 검증, 미결정 0 | -| research r1 | [research](research.md), [primary-source 상세 근거](research-evidence.md) | pass; primary source 11개 그룹·프로젝트 근거2개, 26개 requirement coverage 및 API 보장 한계 확인 | -| formulation r1 | [기본 수학 계약](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md) | pass; owner/revision/상세 수식·26개 coverage·정적 evidence 확인, 독립 수치판정은 NR 소유 | -| numerical-review r1 | [NR verdict](numerical-review.md), [반례·독립 evidence](numerical-review-evidence.md), [reference-model](reference-model.md) | return-upstream; NR-MFE-001, 전체 internal controls 미확정, gate 미통과 | -| requirements r1 intent 재검토 | [Requirement 판단](requirements.md), [MFE-OQ-003 대안·영향](requirements-evidence.md#nr-mfe-001-requirements-intent-검토) | needs-user-decision; 원래 26개 matrix 행 유지, 단순 clarification으로 반례 제외 불가 | -| requirements r2 | [27개 must](requirements.md), [승인 delta·회귀 범위](requirements-evidence.md#r2-승인-범위와-정적-재검증), MFE-ADR-007 | pass; 사용자 승인 반영, owner/revision/27개 ID/43 local links 및 미결정 0 확인 | -| research r2 | [research](research.md), [R07 delta](research-evidence.md#r07--r2-stabilization-근거와-영향) | pass; 27개 coverage/32 local links, 추가 primary S12/S13 및 r1 질량·FEAST·reference 근거 보존 확인 | -| formulation r2 | [main](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md), [stabilization](formulation-stabilization.md) | pass; 5개 문서/27개 coverage/57개 상대 경로 및 단일 scale·수학 적용 경계 확인; 독립 판정은 NR 소유 | -| numerical-review r2 | [verdict](numerical-review.md), [독립 evidence](numerical-review-evidence.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [reference-model](reference-model.md) | pass; NR-MFE-001 수학적 해소, 내부 수치 기준/27개 case/27개 requirement 및 logical reference readiness 모두 확인 | -| io-definition r2 | [main](io.md), [input](io-input.md), [schema](io-schema.md), [mapping](io-mapping.md) | pass; 4개 owner/r2 문서·27개 requirement·66개 상대 링크 및 원본 grammar/identity·additive schema·failure 보존 확인 | -| implementation-planning r2 | [main](implementation-plan.md), [environment](implementation-environment.md), [interfaces](implementation-interfaces.md), [verification](implementation-verification.md), [prep](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json), [main phase](../../phases/mitc4-shell-feast-eigen/index.json) | pass; 실제 read-only StepExecutor validator·16산출물·1+8 steps·owned128회/고유110·요구27/NR27/I/O11·신규test40·links575/anchor0 확인 | -| implementation r2 prep attempt 1 | [작성 시점 보고서](implementation-prep-evidence.md), [실제 terminal 상태](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json), [원시 Codex 결과](../../phases/mitc4-shell-feast-eigen-execution-prep/step0-output.json) | blocked-environment; Hook 설정 미변경, 마지막 test 수정 미검증, 수동 full VERIFY 및 solver 구현/reference 미실행 | -| correction r2 attempt 1 | [owner 보고서](corrections.md), [실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-result.json), [검증 inventory](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json) | blocked-environment; source echo RED 21 fail/16 pass 후 GREEN 37 pass. Full Python 152 pass/Hook assertion1 fail, manual build 접근 거부/CTest 미실행. 별도 registered Stop/CTest는 실제 exit0·362 pass. 전체 prep gate는 미통과 | -| implementation-planning r2 recovery delta | [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건), [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp), [main](implementation-plan.md) | pass; owner 3문서/hash/67 links/기존 AST 보존 확인, Python code AST3·PowerShell9 blocks/errors0. Actual source checkpoint·status reset·DFA·추가 검증은 미실행이며 environment block 유지 | - -공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다. -확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다. -Root의 intake 시작 Git 조사에서는 worktree clean을 확인했다. 당시 구현·build/test·외부 reference comparison은 미실행이었다. 이후 실제 실행 결과는 아래 prep attempt 기록으로 구분한다. -관리문서 상대 링크 검사 결과는 `4`문서, 끊긴 local link `0`, exit code `0`이며 `git diff --check`도 exit code `0`이다. - -## 현재 bounded dispatch - -Planning의 정확11개 반환을 수용했다. Prep/main9개 Step의 active CMake/CTest 명령68개를 local preset으로 직접 정합했고, 세 실제 discovery 파일과 긴 tool session의 종료 poll을 본문에 명시했다. Owner 정적 감사는 regex16·pytest 대상·owned_path128회 보존, local links500 누락0, PowerShell32 오류0/Python AST11, 보호12hash·canonical/history5/이전 Recovery 이력 불변 및 diff-check exit0이다. Coordinator는 실제 Step 명령과 [R13 보존·재개 blocks](implementation-recovery.md#r13-attempt5-명령-정합과-실패-보존)의 current hashes/정확 경로/unchanged Executor/분리 commit·상태 보존을 대조했다. 정확13개 관리/Planning/Step checkpoint 뒤 R13 첫 block(report1/controls2 WIP), 별도 할당된 Planning의 status1값 복구, R13 두 번째 control checkpoint, clean 확인과 E11 기본 workspace-write 한 번을 순서대로 실행한다. 실제 WIP/복구/native 결과는 아직 미실행이며 이후 원시 evidence로 감사한다. Source Correction budget과 r2 수치·schema·tolerance는 바뀌지 않았다. - -E11 attempt5는 native exit2/`2325.465`초, raw Codex exit0/transportFailure=null, Step blocked/history5로 종료됐다. [terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/terminal-archive.json), [실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/e11-result.json), [Coordinator 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/coordinator-terminal-audit.json), [수동 command events](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/manual-command-events-observation.json)를 보존했다. 직전 R11 control1 commit은 `c051adc9c3feb4ff85758eeaf06ae08be277b097`이며 terminal HEAD도 같다. Report1/control2만 변경됐고 다른 tracked bytes와 이전 history4는 그대로다. - -Owner는 E11 대체 명령 대신 `cmake -S . -B .harness/build -A x64`(exit0), `cmake --build .harness/build --config Debug`(exit1 FileTracker)를 실행했다. 이는 현재 local Ninja backend의 실패 증거가 아니다. Actual classifier37/deadline4는 exit0이며 focused136은 raw completed events에서 세 실행 모두 exit0으로 확인됐다. 보고서의 summary 미관찰·attempt2 표기는 실제 attempt5/raw 결과와 구분한다. Manual CTest와 full pytest는 미실행이다. 이후 실제 local preset registered CTest는362 pass/0 fail/End testing과 exit0, Stop Python2개/wrapper도 actual exit0으로 종료됐다. Wrapper 수명 약1954초는 이전1800초를 넘었다. [Root observer](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-process-observations-resumed.jsonl)의 중단 구간 build exit는 미관찰이고 PID 재사용/command-null row는 판정에서 제외한다. 기존 Executor argv의 `--dangerously-bypass-hook-trust`는 변경하지 않았으며 [적용 Hook10개 상태](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-all-hook-trust-observation.json)는 모두 enabled/trusted였다. - -다음 bounded Planning은 prep Step0와 main8 Step의 active 명령을 실제 `mfe-workspace-msvc-ninja-debug`로 직접 정합하고 session 결과는 poll로 수집하도록 명시한다. 기존 exact owned_paths/TDD 대상/전체 검증/physics·schema·tolerance를 유지한다. 새 source Correction이나 사용자 승인 요청 없이 실제 실패 report/control 보존 → 별도 owner status-only → unchanged Executor checkpoint → 정상 E11 재개를 구체화한다. 현재는 status를 바꾸거나 새 native를 시작하지 않는다. 아래 기존 승인/재개 문단은 attempt5 이전 이력이며 현재 결과는 이 문단과 terminal evidence가 우선한다. - -Root는 승인된 canonical Stop `1800 -> 7500` 한 값만 적용하고 exact1 commit `42a4847da54b525ab62a746bee06525ad28aab4b`로 보존했다. [공식 API 신뢰 검토 결과](../../.harness/build/mitc4-eigen-evidence/prep/hook-timeout-activation/trust-review-official-api.json)는 native exit0, exact Stop `trusted_hash` 한 필드의 변경 및 `hooks/list`의 canonical source/timeout7500/enabled=true/trustStatus=trusted를 확인한다. File SHA-256은 `c8065e7b60882da5db3f90d57b265da25b3c25980bf669d0b1da863e621871ca`, definition hash는 `sha256:a6bfcf3553d81e134065da4e66e8124e245d302c11e90b09ecdf07ff79b034a8`이다. MFE-OQ-004 승인·설정 확인 조건은 해소됐으며 이 설정 조회는 registered Hook 실행/통과 증거가 아니다. - -Planning의 별도 status-only 반환을 audit했다. Step0 `error -> pending`만 변경했고 history4/나머지 JSON·bytes/보호11hash·HEAD를 보존했다. Index SHA-256은 `389fa3d16015187903a7b194bd68f59629a63ee897738fd1233dd2ff2f8bc047`, owner 정적 검사와 diff-check exit0이다. Coordinator는 이 bounded 반환을 수용한다. 다음 순서는 관리문서 checkpoint 뒤 [R11](implementation-recovery.md#r11-r10-뒤의-별도-status-only-복구)의 unchanged Executor `_commit_paths`로 control1만 실제 commit하고 clean/protected-byte 조건을 확인한 다음, [E11](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation) 첫 block의 기본 `workspace-write` prep1회 실행이다. Actual R11/E11 결과는 별도 ignored evidence에 보존하며 성공을 미리 기록하지 않는다. Source Correction budget은 그대로이고 실패 history를 지우거나 강한 sandbox/remote 권한을 추가하지 않는다. Active Executor 동안 Root/Coordinator/Planning의 비소유 tracked 편집과 Git은 동결한다. Prep gate가 실제 통과한 뒤 같은 E11의 승인된 main8 steps 및 stages8~9를 계속한다. - -최신 사용자 원문은 **“작업을 계속 해주세요”**다. Root는 앞선 구체적 MFE-OQ-004 질문과 직전 공유 Hook 승인 대기 안내에 대한 이 응답을, 제시한 canonical Stop `1800 -> 7500` 한 값과 변경 정의의 정상 신뢰 검토 진행 승인으로 해석했다. Coordinator는 이 사용자 응답과 문맥·Root 판단을 승인 근거로 기록하며 같은 질문을 반복하지 않는다. 이전 E6의 한 번 승인된 workspace 실행은 이미 소비됐고 이번 승인은 새 DFA/remote/publish 권한으로 확대하지 않는다. 앞서 들어온 configure 실패 Hook prompt 자체는 승인 근거가 아니었다. 세부 대상·공유 영향은 Root 소유 [MSVC 접근 오류와 설정 경계](msvc-build-access-error.md)를 따른다. - -현재 Root는 canonical 파일의 현재 hash와 공식 신뢰 처리 방법을 확인하고 승인된 한 값의 정상 변경을 소유한다. Planning은 실제 E10 local hashes/선행 `.gitignore` commit을 반영한 [R11](implementation-recovery.md#r11-r10-뒤의-별도-status-only-복구)과 [E11 정상 invocation](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 반환했다. Coordinator는 exact ignore commit/현재 local hashes·unchanged Executor guards·workspace-write/terra/xhigh/finite14400 및 local preset preflight를 대조하고 이 문서 delta를 pass로 수용했다. Owner 정적 감사는 PowerShell26 오류0/Python AST9/links114 누락0/보호12hash·Executor AST·HEAD/error-history4 불변·diff-check exit0이다. E11의 prep gate 뒤 main 시작 순서도 owner가 한 문구 정정했다. Source/Hook/config/phase 변경은 이 Planning에 없었다. Actual `7500`/enabled/trusted 확인과 동결 문서 checkpoint 전 status reset/native는 실행하지 않는다. Source Correction budget과 error/history4는 유지한다. - -이 결정과 독립적으로 Planning은 소유 세 문서의 [E10 정상 local setup](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)과 [R12 stale hash 경계](implementation-recovery.md#r12-user-preset-setup-이후의-stale-hash-경계)를 반환했다. Coordinator는 owner/revision/명령·수명·소유를 대조하고 이 문서 delta를 pass로 수용했다. Owner 정적 감사는 PowerShell25 오류0/Python AST9/local links110 누락0/보호11hash·HEAD·error-history4 불변 및 actual adapter4 명령·7200 cap 대조 exit0이다. 기존 preset-contract test가 tracked public/example만 검사한다는 read-only 대조도 완료했으며 test 실행 증거로 취급하지 않는다. - -완료된 Root bounded assignment는 **E10.1 첫 PowerShell block 그대로의 local setup/configure-only**였다. 선행 exact5 문서 commit `72f566cf44b006ca323bc747aff63dc0fffaf2bc`/clean과 활성 build/test 부재를 확인하고 원본 bytes/hash를 backup했다. Root 소유 tracked 변경은 `.gitignore`의 `/CMakeUserPresets.json` 한 줄이며 ignored UserPresets/local config·새 짧은 TEMP·Ninja cache만 준비했다. Public preset/source/test/Hook/trust/reference/phase/기존 VS cache와 parent 환경 복원 경계를 유지했다. Build/test/Hook/nativephase 실행은 이 assignment에 포함하지 않았고 실행 동안 Coordinator/Planning은 tracked 편집/Git을 동결했다. - -| E10 실제 evidence | 결과와 한계 | -| --- | --- | -| [최초 exact setup](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/result.json) | exit1, `4.672`초. Preset/config·ignore1줄 생성 뒤 compiler 경로의 `Hostx64`/`HostX64` 차이를 CMake가 변경으로 인식해 cache를 재초기화했고 dependency cache를 잃어 configure가 실패했다. 원시 warning/실패와 보호8·canonical·HEAD 불변을 보존했다. | -| [별도 bounded configure 후속](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configure-followup/result.json) | compiler cache와 preset 문자열 동일성을 먼저 확인하고 기존 설정을 그대로 사용하는 새 env4-unset process에서 동일 local preset configure1회만 할당했다. Exit0, `1.656`초, stderr0·보호11·HEAD 불변이다. 전체 setup/삭제/rollback/build/CTest는 반복하지 않았다. | -| [설정/adapter 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configuration-observation.json) | dependency4 복원, Ninja/Debug/MSVC19.51·pointer8, 기존 Debug archive 경로, adapter configure/build/discovery/test4 명령의 `mfe-workspace-msvc-ninja-debug` 선택을 확인했다. Adapter plan 실행은 미실행이고 실제 solver library SHA `679db6...04d4`도 그대로다. | -| Root exact ignore commit | `3cfbefb000dfbe8afc7a743213146ab7253cbbc0`; `/CMakeUserPresets.json` 한 줄, commit 뒤 clean. Canonical Hook/trust/phase/history4 변경0이며 prep 통과 또는 새 attempt를 뜻하지 않는다. | - -실제 local UserPreset SHA-256은 `c4665b004be903c4beb913967143c0b0ac4da7e7d857a8c2f09e48754e865e9c`, config는 `47ea5f1da7f6c0312429ead5a3d6d1c71fa884c49e511c1608e7fcccd90d796d`, Ninja cache는 `4c2ad564d2f84deb1b8f5e055941ff18f8ba1826b4cd7f197f0bdfbdafe074b5`다. 설정의 짧은 TEMP는70자이고 dependency4를 parent env에 두지 않은 실제 configure가 성공했다. R12대로 이후 Planning이 R11의 stale hashes와 선행 `.gitignore` commit 허용 경로를 갱신하기 전 기존 checkpoint 명령을 실행하지 않는다. 이 정상 로컬 복구는 MFE-OQ-004의 공유 Hook 변경·재신뢰 승인이나 실제 native 전체 검증을 대신하지 않는다. - -Root의 [별도 outer Stop 실패 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)은 실제 `cmake --preset windows-msvc-ninja-debug` configure exit1과 parent dependency4 unset을 기록했다. Preset의 env cache 치환으로 새 Ninja cache의 dependency4가 모두 빈 값이 됐으며 [당시 cache](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/CMakeCache.txt) SHA-256은 `125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e`다. 이는 phase attempt5가 아니며 history4와 미승인 상태를 유지한다. 이전 R11 cache hash는 stale이므로 정상 local setup의 실제 결과 전 재사용하지 않는다. `CMakeUserPresets.json`은 현재 없고 ignore되지 않았다는 Root 관찰도 계획 입력이다. 최소 MSVC 환경과 짧은 workspace TEMP의 지속 적용을 구성하되 pytest basetemp의 새 경로, test 자체의 고유 하위 경로와 기존 evidence 보존을 유지한다. - -| 결정 가능한 경로 | 영향 | -| --- | --- | -| 권고: 실제 canonical `.codex/hooks.json`의 Stop timeout `1800 -> 7500` 한 값과 변경된 Hook의 정상 재신뢰를 명시 승인 | 현재 resolver가 이 파일을 공유하는 다른 worktree에도 outer timeout이 적용된다. 나머지 Hook 내용·full validation·sandbox/재시도/소유 guard는 유지하고, 정상 workspace-write E9 준비 및 실제 재검증을 이어갈 수 있다. | -| 현재 공유 설정 유지 | 현재1800초 경계를 그대로 유지한다. 실제 required 전체 검증의 wrapper 성공을 보장할 정상 대안이 아직 없어 environment block을 유지하고 실행을 시작하지 않는다. | - -승인된 검토 대상은 `C:/git/FESADev/.codex/hooks.json`이며 승인 요청 때 SHA-256은 `0ab23dad4643f45238f4a60402083e32d8801f5c41fd6ba12b68ef6a9fc5fc28`이었다. Root는 현재 파일을 재확인한 뒤 한 값만 적용한다. 이는 current feature owned_paths 밖의 공유 설정·신뢰 경계 결정이고 일반 계획/검증의 반복 승인이 아니다. 승인 사실만으로 실제 변경·신뢰 완료·검증 성공을 주장하지 않으며 새 native/DFA나 phase status를 자동 변경하지 않는다. Feature physics/schema/reference/tolerance와 contract `r2`는 그대로다. - -### R10 실제 보존과 다음 실행 준비 - -Root exact5 문서 commit `87ffa4f4e5556d002f4f5e8e68bb879fff93c38d` 뒤 [R10 actual unchanged Executor](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/r10-wip-checkpoint-result.json)는 native/managed exit0, `1.641`초로 완료했다. Report1 WIP commit은 `fc032212f75b9008f0a46e0f2d9f3736f184b05f`, controls2 error/history4 보존 commit은 `aa03fc3d049b82f519db1962b5da592524a1c496`이다. 명령 내부 exact commit 경로·모든 tracked bytes·raw·history4 불변과 clean preflight를 확인했으며 status reset이나 prep 성공을 기록하지 않았다. - -다음은 위 중요 결정 수신과 정확한 정상 설정 적용 evidence가 확보된 뒤에만 R11 status-only/Executor control checkpoint/E9 native 순서로 별도 할당한다. 아래 Planning 문서 판정은 이 조건부 준비를 의미한다. - -E8.2 native는 자연 종료했다. Planning은 소유 세 문서의 [R10 실패 보존](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)과 [E9 조건부 직렬 환경](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)을 반환했다. R10은 기존 unchanged guarded Executor의 report1/control2 WIP 보존을 current exact hash/history4로 고정하고 Root [MSVC 접근 오류 설명](msvc-build-access-error.md)의 exact1 선행 문서 commit을 허용 경로에 포함한다. E9는 `CMAKE_BUILD_PARALLEL_LEVEL=1`의 parent/manual/registered 공통 적용과 한 번의 정상 clean-first/verbose build에서 실제 세 discovery 및 등록 identity 검증을 정의한다. Installed module, source/test, discovery guard, timeout 또는 sandbox 정책은 수정하지 않는다. Planning 정적 감사는 PowerShell24 오류0/Python AST9/local links101 누락0/보호11hash·Executor AST·HEAD/error-history4 보존과 diff-check exit0이며, Coordinator는 R10 명령·소유·현재 hash와 조건부 activation 경계를 대조해 문서 delta를 pass로 수용했다. 이는 prep gate 통과가 아니다. 계획된 R10의 실제 완료는 위에 기록했으며 status-only recovery/추가 native는 아직 할당하지 않는다. - -Root의 [현재 Hook 설정 해석](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json)은 설치 CLI0.153.2의 config-only `hooks/list`에서 현재 worktree cwd의 enabled/trusted Stop source를 canonical checkout `.codex/hooks.json`, `timeoutSec=1800`으로 확인했다(exit0). Linked 파일7500과 달라 실제 wrapper 수명 약1802.6초를 설명하는 근거이며, 과거 native raw에 설정 로드 경로 event가 없다는 한계는 유지한다. Inline Hook 추가는 additive라 기존1800을 대체한다고 가정하지 않는다. Root는 정상 per-invocation/worktree 설정 지원 여부만 마지막 bounded read-only로 확인하며 canonical/Hook/trust 파일을 변경하지 않는다. 이 확인은 실패 WIP 보존과 독립적으로 진행한다. 현재 추가 native, status reset, main8steps 또는 downstream gate 전이는 없다. - -Root의 [최종 bounded 설정 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-source-audit.json)는 공식 지원 `project_root_markers`를 이용한 strict-config 목록조회도 같은 canonical1800을 선택함을 확인했다(server exit0). 조사한 문서/schema에서는 기존 sourcePath/timeout을 대체하는 정상 per-invocation 방법을 찾지 못했다. 두 Hook 파일은 Stop timeout 외 의미가 같지만 canonical 파일은 현재 exact ownership 밖이다. Root의 권한 해석에 따라 공유 설정 변경·재신뢰는 위 MFE-OQ-004로 요청하며 임의 변경·새 DFA 실행·Hook 생략을 하지 않는다. 독립적인 실패 보존 R10은 완료했다. - -### E8.2 이전 dispatch와 activation 경계 - -Root exact5문서 commit `7d714c2713bf945f07fc78f85e49ec27e3184134` 뒤 [E8.1 실제 setup](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/result.json)은 native exit `0`, `7.446`초로 완료했다. Tracked 변경0/HEAD·clean·기존 VS cache 불변이다. [설정 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/configuration-observation.json)은 새 Ninja/Debug/MSVC Hostx64/x64, 승인된 dependency4, 실제 archive 경로와 config=example 동일성을 확인한다. 이는 configure-only이며 library/build/CTest는 아직 미실행이다. 이어 별도 Planning이 status 한 값만 `blocked`→`pending`으로 바꾸고 나머지 bytes/JSON/history3·보호10hash 보존을 확인했다(exit `0`, phase SHA-256 `6d0bfcfe89ebaee0f76d27c8917da91085069c92a55e1088dc05bd3053e37e32`). [R9 actual Executor checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r9-status-checkpoint-result.json)는 native/managed exit `0`, `1.531`초이며 commit `9766724a5d363fc9ff8800a99726a63bdba55314`의 exact index1·pending/history3·protected bytes·clean을 검증했다. Top blocked/history3는 보존했다. - -현재 actual dispatch는 **E8.2 첫 PowerShell block 그대로의 prep1회**다. Required inputs는 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 원래 prep Step0 및 E8/R9와 attempt3 evidence다. Official implementation-agent profile, 원래 owned9, 기본 workspace-write와 finite14400/Stop7500/shared7200 및 existing terminal/retry/ownership guards를 유지한다. E8.3의 정확한 Ninja preset mapping이 과거 VS 고정 명령을 명시 대체한다. 이미 GREEN인 source를 되돌리지 않고 classifier37/focused/full Python, native MSVC/x64/Debug configure/build/discovery/full CTest, 실제 library 위치/hash/mtime·fresh reference 및 registered same graph를 검증한다. 과거 manual 실패·미실행/automatic pass와 report reference 문구 정정은 Implementation owner가 맡는다. Native error/blocked 또는 guard/contract 실패 시 실제 terminal을 보존하며 두 번째 source Correction이나 무단 transport retry를 하지 않는다. Root/Coordinator는 이번 관리 checkpoint 뒤 active invocation 동안 non-owned 편집/Git을 동결한다. Actual prep pass 전 main/physics/release 전이는 없다. - -Root outer Stop/일반 후속 사용 환경에는 이 process-local setup이 지속된다고 가정하지 않는다. 이번 native와 그 registered Stop의 명시 환경은 E8.2로 고정하며, feature closure에서 local 설정 수명과 일반 사용 환경을 별도로 대조한다. 전역 env 또는 Hook state를 변경하지 않는다. - -### E8.2 attempt4 실제 terminal 감사 - -[Actual Executor 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/executor-result.json)는 PowerShell exit `1`, `2833.812`초, 시작/종료 HEAD `23c4ebe526260d584247804d8cbe2f7aa8cc60ac` 및 branch 불변, 비소유 tracked/config/기존 VS cache 변경0을 확인했다. [원시·상태·보고서·CTest archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/terminal-archive.json)에 raw SHA-256 `c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61`, Step0 `error`/history4, top 및 owner report를 보존했다. Raw Codex exit `0`, `transportFailure=null`이며 explicit error는 transport retry가 아니다. 이 시점 dirty는 report1/control2뿐이다. - -[Coordinator terminal audit](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/coordinator-terminal-audit.json)는 exit0으로 이전 history3의 JSON 동일성, source/test/Hook 8개 불변 및 관리문서 local links 191개/누락0을 확인했다. - -| 실제 검증 경계 | 판정과 한계 | -| --- | --- | -| 현재 Python regression | classifier37 exit0; focused136은 raw상 3회 모두 exit0, `45.510/45.390/45.635`초. 다음 실행에서 이미 통과한 같은 대상을 근거 없이 반복할 필요는 없다. | -| Manual Ninja full VERIFY | configure0/build1. MSVC x64 compile/link 뒤 integration GoogleTest JSON parse failure. 순차 CTest/full pytest는 미실행이며 후속 diagnostic으로 대체하지 않는다. | -| Registered validation | incremental Ninja build0, 실제 CTest21912 exit0/362 pass. LastTest SHA-256 `4d9c71b7caa4ca58f81ee5670f6a0c5af323a0fe20b6ac0195a0420a7a8784d9`, 616282 bytes. 실제 pwsh23560은 약1802.6초 후 exit1, Python3492/24968은 각각0이므로 registered wrapper 전체 성공으로 보고하지 않는다. | -| Solver feature gate | prep와 별개인 MITC4 mass/FEAST 본 구현·고유치 reference comparison·physics/release는 미실행이다. | - -[선택 raw events](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/raw-audit-selected-events.json)와 [실제 process exits](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json)를 대조했다. Parent DevShell 성공 뒤 child tool-shell의 script 실행은 policy로 거부됐지만 상속된 MSVC x64 환경을 확인하고 compile/link를 실행했다. `integration-discovery-rerun.log`는 stdout이 없었던 native cmake exit0을 나중에 쓴 관찰 메모다. 원시 item67은 cmake0 뒤 로그 조회 실패로 shell1, item68은 메모 작성/hash0이며 메모를 원시 stdout으로 취급하지 않는다. 역사상 reference를 "읽지 않았다"는 owner 표현은 full CTest 내부 기존 reference 읽기와 구분해 다음 owner가 정정한다. - -[Root의 installed/generated module 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json)은 `TEST_TARGET` 누락으로 세 discovery가 같은 empty-target hash JSON을 REMOVE/run/READ하는 구조를 확인했다. 이는 병렬 경합을 강하게 뒷받침하지만 최초 race를 재현한 실험은 아니다. Owner의 `test`/`harness` 라벨과 반환 attempt2는 그대로 보존하고, Coordinator는 실제 실행 history4와 환경 근거를 기준으로 기존 `environment|r2`에 정규화한다. 새 source Correction 또는 tolerance/계약 revision 변경은 허용하지 않는다. - -사용자 요청 설명문서는 Root가 exact1 commit `b81f7cf636e890d7c144a8b1857e58d7d0a5d4c3`으로 추가했다. SHA-256 `0722dff075e706977d55eb1ac2514d4318b1341adab30a51fc82c744315f1c9f`이며 정적 links/whitespace/fences와 staged diff-check는 exit0이다. 이 문서 commit은 Solver/Hook/source gate 통과를 뜻하지 않는다. - -### E8 설정 및 계획 감사 이력 - -Owner의 [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)·[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint) 상세를 owner/r2/현재 hash와 대조해 계획 gate `pass`로 수락했다. 실제 adapter의 preset 명령4/7200 cap·기존 guard, PowerShell18 blocks/errors0, Python AST7, local links91/missing0, 고정 hash7·Executor AST·blocked/history3 보존과 diffcheck가 exit `0`이다. Root는 설치 DevShell의 실제 인수, config.example/preset의 `.harness/build-ninja-msvc-debug`, load_config 필드 및 process 환경 전체 finally 복원을 read-only 확인했다. Native Ninja 성공은 아직 미검증이다. - -동결된 management2/Planning3 정확5문서의 Root checkpoint 이후 **E8.1 첫 PowerShell block 그대로**를 Root 환경 지원에 할당한다. Owned 범위는 기존 예시와 같은 ignored `.harness/config.json`, 새 `.harness/build-ninja-msvc-debug` cache 및 새 짧은 ignored TEMP뿐이다. Source/Hook/reference/기존 VS cache/phase/status/Git은 setup에서 변경하지 않는다. Actual configure 및 config-selected graph/exit·전후 tracked bytes/clean 확인이 setup gate다. 이 prepare configure를 native build/full 검증으로 대체하지 않는다. 실패하면 실제 결과와 남은 ignored 설정을 보존하고 재실행하지 않는다. 성공 후 Coordinator가 audit하고 별도 Planning의 R9 status 한 값 복구와 actual Executor checkpoint를 할당한다. E8.2 native invocation은 그 이후 clean 상태에서 별도로 시작한다. - -Root exact5문서 commit `c0f3dc7c11eca7959a10ca9f8aecb5343b831d13` 뒤 [R8 실제 보존 실행](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r8-wip-checkpoint-result.json)은 native/managed exit `0`, `2.094`초로 완료했다. Actual unchanged Executor가 report1을 `9601b1f53e8a11d3e08d49cf9528fa6f028108cf`, blocked controls2를 `96efbffa425ff5ce9cd1b7cebe673555273122b9`로 구분 commit했다. [실제 stdout](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r8-wip-checkpoint-stdout.log)은 exact paths, 전후 bytes/전체 JSON/history3/raw/branch 보존과 clean을 확인한다. `_commit_step` 또는 성공 전환은 없었다. - -후속 Planning의 소유는 기존 plan/environment/recovery 3문서다. 이미 확인한 정상 Ninja preset과 표준 archive output 설정의 exact Root local setup, 별도 build directory, Step0/main8·registered Stop의 같은 graph 명령 mapping 및 실제 library 존재/hash/mtime 확인을 구체화한다. Source/기존 VS cache/reference 및 검사 guard를 보존하고, default workspace-write·명시 DevShell/dependency/Python/짧은 TEMP 환경과 기존 finite14400/7500/7200 한도를 유지한다. 이후 별도 할당의 status 한 값 복구/actual Executor checkpoint와 native 검증 순서도 문서화한다. 현재 config/status/재실행은 미할당이며 이 상세 delta의 syntax·owner·경로/명령 감사 전에는 실행하지 않는다. Root는 정확히 동결된 local 환경 설정만 수행하고 Coordinator는 실제 Executor invocation/전이·audit를 맡는다. - -Owner의 [R8 실패 보존 명령](implementation-recovery.md#r8-attempt3의-blocked-기록-보존)을 현재 hash/role/guard와 대조해 계획 gate `pass`로 수락했다. 정적 결과는 local links82/missing0·Python AST6·R8 PowerShell errors0·고정 hash7/Executor AST/blocked history3 불변, exit `0`이다. Coordinator 관리2문서는 local links175/missing0·diffcheck exit `0`을 확인했다. Root가 동결된 management2/Planning3 정확5문서를 checkpoint한 뒤 R8 actual unchanged Executor가 report1과 controls2를 별도 WIP commit한다. 이는 실제 prep 검증 통과가 아니다. [E8 정상 Ninja 대안](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)은 현재 미실행 요약이며 WIP 보존/clean 이후 별도 Planning이 exact local config/bootstrap·같은 graph의 명령 mapping·status-only/activation을 확정한다. 지금 config/status를 변경하거나 재실행하지 않는다. - -E7 attempt3는 [실제 wrapper result](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/executor-result.json)의 native PowerShell/managed exit `2`, `1372.328`초로 종료했다. HEAD `dc6b9b1cf70b0ca1685eb1ac5476aa6f8cd3dab6`와 branch, 모든 비소유 bytes는 불변이다. Dirty는 Implementation report1/control2뿐이며 source/tests/Hook은 변하지 않았다. [Terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/terminal-archive.json)는 raw SHA-256 `d106f7ade2d678b6e0b383439b1b9b8d25f5ec32e883aed50c6fb4949a8983f1`, blocked/history3와 이전 history2 equality를 보존한다(exit `0`). Actual Codex exit `0`, 명시 reported-blocked 및 transportFailure null을 별도로 기록하며 transport retry로 재분류하지 않는다. Owner의 attempt1 표기는 전이 요청 이력으로 보존하고 Coordinator 원본은 실제 history3다. - -Native classifier `37 passed`, focused `136 passed`, configure exit `0` 뒤 Debug build가 FileTracker 초기화 `UnauthorizedAccessException/0x80070005`로 exit `1`이었다. Manual CTest discovery/run 및 full pytest는 순차 검증 때문에 미실행이다. [Root의 실제 build shell 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-manual-build-environment-observation.json) SHA-256 `3013fbe0afd85b25450ddcec9257ee31f809f4fd471f144c3aad04b728fedff5`는 raw item14가 같은 shell 안에서 새 짧은 TEMP 경로/80자 이하를 검사하고 TEMP/TMP를 명시 대입한 사실을 확인한다. 따라서 대입 누락 가설은 배제한다. 실패 뒤의 경로 출력은 미도달이므로 실제 GetTempPath 문자열을 관찰했다고 주장하지 않는다. - -별도 [등록 process 실제 exits](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-process-observations.json)는 Stop wrapper/Python·Debug build·CTest 모두 exit `0`이다. [등록 CTest 원시 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/registered-LastTest.log)는 `362 passed/0 failed`, SHA-256 `256f5380dbdab51059bd499d37d9558563d47fb302ff1b5b791884f4cbf15cbe`다. 이는 native manual build 접근 거부나 미실행 검증을 대체하지 않으며 prep gate는 미통과다. - -현재 Planning 할당은 기존 plan/environment/recovery 3문서의 최소 delta다. Required inputs는 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, Step0/phase 및 실제 attempt3 raw/환경 감사다. Report1 및 blocked controls2의 unchanged Executor WIP 보존 명령과 그 이후 별도 status-only 복구를 먼저 구체화한다. 프로젝트가 이미 지원하는 CMake/MSVC/x64/Debug Ninja preset이 기본 workspace-write에서 사용할 정상 backend 대안인지 read-only로 제한 검토한다. 실제 성공 증거 없이 해소됐다고 주장하거나 FileTracker/test/Hook guard를 끄지 않는다. 정상 대안이 없다면 실제 필요한 exact-run 권한 결정만 구체화하며 이미 사용된 E6 one-time 승인을 확장하지 않는다. Planning은 source/tests/Hook/report/phase/status/Git 및 실제 실행을 변경하지 않는다. Syntax·경로·hash·guard 감사와 frozen3 반환이 이번 gate이며, 관리문서 checkpoint→실제 실패 WIP 보존 전에는 reset/재실행을 하지 않는다. 두 번째 source Correction은 금지하며 r2 수치 계약은 유지한다. - -### E7 실제 실행 전 handoff 이력 - -Root의 정확5문서 checkpoint `2f7103ac37559563279fc8fe384fba568a9891e5` 뒤 [R7 WIP 실행](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/r7-wip-checkpoint-result.json)은 native/managed exit `0`, `2.109`초로 완료했다. Actual unchanged Executor는 Hook/report2를 `3ce0e4eb0aa3b395e4aa0dc442bea990b2302fe5`, error controls2를 `858aab2adc9e4e563952148040f0320f64fbf603`로 분리 commit했고 모든 bytes/history2/raw/error와 branch 보존 및 clean을 검증했다. 이후 별도 할당한 Planning은 Step0.status 한 문자열만 `error`→`pending`으로 바꾸고 나머지 JSON equality를 확인했다(exit `0`, hash `78922f3eb5597f095e385d428efc5ca87de89bc0f2c847aac7a56d8741192d22`). [R7 status checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/r7-status-checkpoint-result.json)는 native/managed exit `0`, `1.453`초이며 actual Executor commit `ab34ac77005eafa905862c517ead0fcde2209363`의 exact index1·pending/history2·raw/top 보존·clean을 검증했다. Top error는 과거 결과로 그대로 남는다. - -현재 할당은 [E7 첫 PowerShell block](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개)의 실제 prep1회다. Required inputs는 Feature 폴더, FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 기존 Step0 및 R7/E7와 원시 실패 evidence다. Official implementation-agent profile과 원래 owned9를 유지하며 기본 workspace-write, short TEMP/TMP, short pytest basetemp, 기존 finite14400/full VERIFY/등록 Stop/terminal 및 retry guards를 사용한다. 이미 실제 확인한 RED/GREEN을 보존하고 focused/full Python·MSVC/x64/Debug CMake/CTest 전체를 다시 확인한다. Report reference 문구와 실패 이력 정정은 Implementation owner가 맡는다. Explicit error/blocked, ownership 또는 계약 실패가 발생하면 terminal을 보존하고 무단 재시도하지 않는다. Source Correction 재할당이나 새 DFA 승인은 없다. Root/Coordinator는 이번 관리 checkpoint 뒤 active invocation 동안 non-owned 편집과 Git을 동결한다. 실제 prep gate 통과 전 main/physics/release 전이는 없다. - -### R7 계획 및 attempt2 판정 이력 - -Planning의 [R7](implementation-recovery.md#r7-attempt2-실패-보존과-정상-workspace-write-재개)·[E7](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개) 최소 delta는 owner/revision 및 현재 hash/정확 실행 순서를 확인해 계획 gate `pass`로 수락했다. Owner 정적 결과는 Python AST5·PowerShell13 blocks/errors0·link74·고정 artifact hash7·Executor AST 불변, exit `0`이다. Coordinator의 변경5문서 경로 검사는 local links239/missing0, exit `0`이다. 이는 실제 prep 검증 통과가 아니다. Root가 동결된 management2/Planning3 정확5문서를 먼저 checkpoint한 뒤 R7 첫 block을 unchanged Executor로 실행한다. 이때 source/tests·Hook/report·phase/raw는 지금 실제 실패 bytes 그대로 보존되며, 다음 status-only 편집은 그 WIP commit과 clean 확인 뒤에만 별도 할당한다. - -E6 실제 실행은 `2655.156`초 뒤 native PowerShell/managed exit `1`, Codex actual exit `0`으로 종료했다. [wrapper result](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/executor-result.json)는 HEAD `d64cd1403ac41fb1397dfb088361ce18ad1d59bd` 및 branch 유지, 비소유 bytes 변경 `0`, dirty가 Hook/report와 control2의 정확4개임을 확인한다. [보존 원시 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/step0-output.json) SHA-256은 `8852e0ddae9ef94d885e8b4ae4b8a3b2e3a9d9161a3801bc7e56ea157e9411f4`다. Phase는 `error`, history2이며 첫 history의 JSON equality를 원래 attempt1 archive와 확인했다(exit `0`). `transportFailure=null`이며 명시 `reported-error`를 transport retry로 바꾸지 않는다. Owner가 요청한 `test` 분류/attempt1은 전이 권한이 없으므로 원시 반환으로 보존하고, Coordinator는 실제 환경 pair와 history에 따라 `environment`/attempt2로 기록한다. - -수동 CTest는 `1086.77`초, 등록 CTest는 `982.52`초이며 둘 다 `361 passed/1 failed`, 실제 exit `8`이다. 등록 Stop wrapper와 Python의 실제 exit `0`은 test pass가 아니다. [수동 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/manual-ctest-observation.json)와 [등록 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/registered-ctest-observation.json)를 분리했다. Full Python은 순차 VERIFY의 CTest 실패 때문에 이번 실행에서 미실행이다. 승인된 Hook7500만 적용됐고 classifier source/test hashes는 이전 Correction 이후 불변이다. 기존 full CTest는 저장된 정적 reference를 읽고 비교하므로 owner report의 포괄적 reference 미열람 문구는 다음 Implementation에서 직접 원본 편집·새 eigen 비교 부재라는 정확한 의미로 정정하도록 인계한다. - -Raw item18의 첫 focused는 깊은 pytest basetemp에서 exit `1`, `130 passed/6 failed`였고 item20은 짧은 `.harness/build/mfe-focus-<8자>`로 바꾼 동일 대상에서 exit `0`, `136 passed`였다. 앞선 실패를 지우거나 최초부터 통과했다고 기록하지 않는다. 새 환경 명령은 C++ TEMP/TMP와 pytest basetemp를 모두 짧게 지정하며, 통과한 기존 assertion을 변경하지 않는다. - -Root에 할당한 동일 binary의 단일 test323 환경 probe는 새 긴 TEMP152자에서 결과251자/lock261자로 exit `1`, 새 짧은 TEMP70자에서 같은 test exit `0`을 기록했다. [Probe observation](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/path-length-probe-e15c1747/observation.json) SHA-256은 `511b30e183759b378e6f33f30aa3be4c940b58d1eabde12068151173a0a91979`이며 기존 CTest shared log/source/control/reference를 변경하지 않았다. 이 증거는 전체 gate를 대체하지 않는다. 실제 Win32 `GetLastError`를 관찰했다고 주장하지 않는다. - -현재 Planning 소유 작업은 기존 implementation-plan/environment/recovery 3문서의 최소 delta다. Required inputs는 Feature 폴더 및 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 원래 Step0/phase, [attempt2 terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/terminal-archive.json)와 TEMP pair다. 실패 Hook/report 및 controls의 정확 bytes/hash/history를 unchanged Executor `_commit_paths`로 구분 보존하는 명령, 이후 별도 할당의 status-only 복구, 짧은 새 workspace TEMP/TMP를 native와 등록 Stop에 함께 상속하는 기본 workspace-write 명령만 구체화한다. Root는 먼저 frozen 관리/계획 문서만 checkpoint한다. Planning은 source/test/Hook/Implementation report/phase/status/Git을 수정하거나 실행하지 않는다. Syntax·ownership·hash 정적 검증과 exact frozen 경로 반환이 이번 gate이며, status reset은 실패 보존 commit 뒤 별도 할당한다. 새 DFA 승인, solver 계약 변경, 두 번째 source Correction 또는 framework 확대는 필요 없다. 현재 한 번의 DFA 승인은 이미 사용됐고 후속 prep/main은 기본 workspace-write다. - -### E6 실제 실행 전 handoff 이력 - -R3 Planning은 prep index의 Step0.status 한 값만 `blocked`→`pending`으로 변경했다. Coordinator가 나머지 JSON·history1 보존과 hash `10de90d5cde92797a0dfeedc716a5d5a267000304260c063d55ae6bc53bb4cf5`를 확인했다(exit `0`). [실제 R3 checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r3-approved-status-checkpoint-result.json)는 unchanged Executor 호출 native PowerShell/managed exit `0`, `1.531`초이며, control commit `671feb7c620d0f4e5d13d48cf7f312a02067c6aa`의 정확 index1개·pending·history/raw/top 보존·clean을 [stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r3-approved-status-checkpoint-stdout.log)에 확인했다. Top은 blocked 그대로다. - -다음 실제 dispatch는 E6의 정확 prep1회이며 Execution owner는 공식 implementation-agent profile이다. Required inputs는 이 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 선행 계약, prep Step0, implementation-plan/environment/recovery 및 실제 corrections evidence다. Owned outputs는 Step0의 원래 exact9개이고 result payload는 `completed`와 nonempty summary 또는 명시 error/blocked다. Existing RED/GREEN을 보존한 재검증, 남은 Hook7500, 원래 implementation-prep-evidence 보고서 정정, full Python/MSVC/x64/Debug CMake/CTest 및 실제 registered Stop/terminal evidence가 gate다. Source echo Correction의 후속 Implementation rerun은 이번 1회만 할당하며 두 번째 Correction은 금지한다. Guard/ownership/upstream 실패나 명시 terminal 발생 시 원시 결과를 보존하고 무단 재시도하지 않는다. Root/Coordinator는 active invocation 동안 모든 non-owned 편집과 Git을 동결한다. 실제 gate audit 전 main/physics/release 전이는 없다. - -사용자는 Root가 전달한 E6 exact prep 1회 승인 요청에 **“네 허용합니다. 작업을 계속 진행해주세요”**라고 응답했다. 이는 `mitc4-shell-feast-eigen-execution-prep`의 이번 한 번에만 적용되며 main은 기본 workspace-write다. Root의 재개 확인은 HEAD `83e15818bd025b6557d4af9940f6c6a7b8148f7f`, linked branch `feat-mitc4-shell-feast-eigen-execution-prep`, clean worktree였다. 별도 일반 승인을 추가하지 않고 [R3](implementation-recovery.md#r3-승인-후에만-가능한-status-only-checkpoint)의 exact phase index에서 step0 `blocked`→`pending` 한 field만 Planning owner에게 할당한다. 기존 timestamp/reason/attempt_history 및 top index·raw는 보존한다. Owner 반환 audit 뒤 unchanged Executor control checkpoint와 clean 검사를 거쳐 [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)의 명시 환경·유한14400·승인 flag로 실행한다. 이번 실행의 실제 결과가 나오기 전 성공·main 전이·추가 Correction을 기록하지 않는다. - -### Exact-run 승인 요청 당시의 보존 기록 - -Root는 정확7문서를 `0a98b2c4fa708c1110e423c3ab3997e58dd81846`로 checkpoint했다. Ack 후 Coordinator가 소유 계획 [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)의 PowerShell block을 그대로 실제 호출했다. [보존 실행 기록](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r6-source-checkpoint-result.json)의 native PowerShell/managed exit는 `0`, 실제 block 실행 `1.765`초다. Unchanged Executor `_commit_paths`가 `scripts/execute.py`, `tests/test_execute.py` 정확2개를 `2641d2787586c3fdfe769415fb9f129c7d3d2751`로 WIP commit했다. [실제 stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r6-source-checkpoint-stdout.log)은 linked branch 유지, clean, blocked/history1 및 source/report/phase/raw/Hook bytes 불변을 확인한다. `_commit_step`이나 상태 성공 전환은 없었다. - -남은 중요 결정은 [E6의 exact prep invocation](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp) **한 번**에 대한 명시 sandbox 승인이다. [기본 workspace-write 실제 실패](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/step0-output.json)의 assigned `.codex/hooks.json` 쓰기 거부는 classifier 교정 뒤에도 원래 `reported-blocked` 사유로 보존된다. 사용자 일반 계속·commit 승인을 이 별도 승인으로 해석하지 않는다. - -- 권고안: 이번 `mitc4-shell-feast-eigen-execution-prep` 실행에만 `danger-full-access`와 `--approve-danger-full-access`를 명시 승인한다. E6의 유한14400초·workspace Python/cache/TEMP/TMP·환경 복원, 원래 exact ownership/등록 Stop/전체 VERIFY/terminal·retry 보호를 유지한다. 이후 main은 기본 workspace-write다. -- 대안: 기본 workspace-write에서 지정 Hook 경로 편집이 가능하도록 환경 정책을 해소한 뒤 재개한다. 현재 변경과 blocked/history evidence는 보존하며 실행 성공으로 전환하지 않는다. - -이는 [프로젝트 sandbox 조항](../../AGENTS.md), [Harness skill](../../.agents/skills/harness/SKILL.md), [SOLVER_AGENT_DESIGN §7](../SOLVER_AGENT_DESIGN.md#7-자율-진행과-사용자-escalation)의 신뢰 경계 승인이다. 승인 후에만 별도 Planning 할당의 R3 status-only 변경·Executor checkpoint 및 E6의 새 process 실행이 가능하다. 이번 기록을 포함한 마지막 문서 checkpoint 뒤 clean linked 상태를 다시 확보하여 Root가 결정 요청을 전달한다. - -Correction owner가 반환한 source/test/report와 실제 명령·hash·27개 상대 링크를 audit했다(exit `0`, missing link `0`). Native continuation3는 `1914.797`초 뒤 native/wrapper exit `0`으로 끝났고 branch/HEAD와 비소유 bytes가 모두 불변이었다. [등록 process 종료](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-registered-exits.json)의 Stop 두 process 및 CTest exit는 모두 `0`이다. [보존 archive](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-archive.json)의 완료 CTest는 `362 passed/0 failed`, log SHA-256 `58abb8e4ad1c826c796ab2fd274081b6c6e9e8966c27b7d6c9dd69792693bee6`이며 보고서 SHA-256은 `d4ea3fb18accc2b2316eb439f56f5106d8ae6640fe79452cef6cb341b1933ee4`다. 보고서 작성 후 실제 관찰이므로 당시 미관찰 서술을 덮어쓰지 않는다. 이 자동 검증은 owner의 별도 manual build failure/CTest 미실행을 대체하지 않는다. - -Planning은 기존 `implementation-plan.md`, `implementation-environment.md`, `implementation-recovery.md`의 최소 delta를 완료했다. Root가 frozen 관리/계획 문서와 독립 owner의 `corrections.md` 정확7개를 먼저 checkpoint하고, 원래 prep owned_paths의 `scripts/execute.py`, `tests/test_execute.py`만 unchanged Executor `_commit_paths`로 보존하는 [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)를 확정했다. 기존 R2와 blocked/history/raw는 그대로 둔다. [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)는 확인된 workspace Python/pytest cache·고유 basetemp와 process-local UV offline/TEMP/TMP recipe를 실제 후속 invocation 및 복원 경계에 묶었다. Root의 [FileTracker IL 관찰](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/filetracker-initialization-observation.json)은 `Path.GetTempPath()`에서 얻은 경로가 관찰된 `GetLongFilePath` 접근 거부 위치임을 입증했다(SHA-256 `8d47f96ba913a9adc2d89772cef4b27ea2187f613416912d894608be9730c5cc`). 새 TEMP/TMP remedy의 실제 native build 성공은 아직 검증하지 않았다. Source/Hook/phase 제어 수정·status reset·test/Executor 실행은 이번 Planning에서 수행하지 않았다. - -### 이전 실제 보존과 native dispatch 이력 - -Root가 아래 정확8개 문서를 `7dca487da1790c167058cc4fc07b7afc902fe31f`로 checkpoint했다. 이후 Coordinator는 문서 [R2](implementation-recovery.md#r2-root-checkpoint-이후의-정확한-wip-보존-명령)의 PowerShell block을 그대로 실제 실행했다. Python native exit를 즉시 전파한 managed command exit는 `0`, 약1.90초였다. 실제 Executor `_commit_paths`가 구현8개를 `6e00dba117d836fce02c6918abec06cbae9dbdeb`, blocked control2개를 `5dfbea7e543b64fdefcea292de43237adb790a72`로 각각 보존했다. 모든 owned/control/step/raw bytes, blocked/history1 및 branch가 전후 동일했고 최종 clean/정상 preflight를 확인했다. 변경을 통과 상태로 바꾸지 않았으며 보호된 Hook은 그대로다. -`mitc4-shell-feast-eigen|implementation|harness|r2`의 unused Correction allowance에 대한 첫 bounded dispatch를 요청했다. 그러나 `collaboration.spawn_agent(agent_type=correction-agent, task_name=classifier_correction)`는 `agent thread limit reached`를 반환했고 새 agent/session이 생성되지 않았다. 실제 source/test 수정·RED/GREEN/full 검증은 시작되지 않았으며 allowance를 소비하지 않는다. 현재 root/Coordinator와 완료된 Formulation/Planning thread가 보이고 사용 가능한 tool에는 agent close 기능이 없다. 기존 specialist의 hard role을 대리 Correction으로 바꾸지 않고 Root에 서비스 capacity 문제를 전달했다. -Capacity 해소 후 처음 할당할 정확한 수정 소유는 `scripts/execute.py`, `tests/test_execute.py`, 현재 Feature의 `corrections.md`다. 실제 source-echo reproducer와 prep의 classifier 회귀3개를 RED→최소 GREEN→focused/configured full 검증하며 true helper·terminal/history·실제 timeout retry 보호를 유지한다. Hook/index/status/Git/타 owner 보고서/reference는 읽기 전용이다. 미적용 Hook의 환경 실패도 실제 결과와 미실행을 정확히 분리하며 검사 제외나 성공 대체를 하지 않는다. -현재 Planning task는 종료되었다. Correction 실제 결과를 받은 뒤에만 Planning을 재개해 수정 source/report checkpoint를 구체화하고 사용자 exact-run 승인 준비를 완료한다. 이 Correction의 결과와 후속 Implementation rerun 전에는 main/physics/release를 진행하지 않는다. -Root도 collaboration close 기능이 없음을 확인했고, 기존 Harness와 같은 native `codex exec` 경로로 공식 [Correction profile](../../.codex/agents/correction-agent.toml)을 그대로 주입하는 bounded 대안을 확인했다. Local `codex exec --help`는 exit `0`; 실제 Harness의 profile prompt 주입·xhigh/workspace-write/등록 Hook flags·stdin 전달 경로를 읽었다. 해당 profile은 model을 지정하지 않으므로 CLI의 기존 model 설정을 임의 변경하지 않는다. -별도 one-time native Correction은 유한14400초·재시도0으로 실행하고 stdout/stderr/native exit와 branch/HEAD·비소유 bytes·phase/history/raw 불변을 ignored `.../prep/classifier-correction/`에 보존한다. Phase Executor나 그 transport attempt가 아니며 현재 phase index를 쓰지 않는다. Source/Hook runtime을 이 실행 wrapper에서 고치거나 classifier를 override하지 않는다. Root/Coordinator도 해당 세션 중 non-owned 편집·커밋을 멈춘다. -첫 native thread `01a07476-082e-7863-b5be-3ca71003d70d`, managed session `76065`는 461.218초 뒤 native/wrapper exit `0`으로 종료했다. [실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-result.json)는 branch/HEAD와 비소유 bytes 불변, source/test 변경0을 확인한다. Owner [corrections](corrections.md)의 outcome은 `blocked-environment`이며 pytest entry가 collection 전에 uv cache 접근 거부로 exit `2`였다. 따라서 RED/GREEN/전체 검증과 실제 classifier 수정은 모두0이다. 작성 당시 보고서 SHA-256 `6bd03c4336d2958eb668d1bf07ef55059c317e4fc105bed0e16dd5179d3c3263`와 [원본 보고서 복사본](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-entry-blocked-report.md)을 보존한다. -Root가 정상 도구 설정으로 새 workspace ignored `.../classifier-correction/uv-cache`와 실제 절대 `uv.exe`/hermes venv `python.exe`를 지정해 pytest 실행 진입을 준비했다(exit `0`, 4.17초, pytest9.1.1). 기존 거부 cache/Hook/source/test는 변경하지 않았으며 native 접근 가능이나 RED/검증 증거를 대신하지 않는다. 이제 **동일 thread·동일 Correction attempt1**을 이 환경 해소로 이어간다. 새 classifier 수정 회차·새 retry key·추가 allowance를 만들지 않으며 아직 한 번도 수정하지 않은 bounded 결함만 수행한다. 다음 native command는 `codex exec ... resume <해당 thread> -`와 동일 profile/xhigh/workspace-write/유한14400초를 사용하고 첫 진입 실패와 후속 실제 결과를 각각 보존한다. - -### 복구계획 감사와 WIP 실행 이력 - -Planning owner의 복구계획 반환4개를 감사했다. [R2](implementation-recovery.md#r2-root-checkpoint-이후의-정확한-wip-보존-명령)의 unchanged `_commit_paths` 호출은 timeout-only AST·origin 이후 정확8개 문서 경로·linked identity·role·default sandbox·source8/control2 dirty 범위·blocked/history/raw/모든 파일 bytes 불변을 확인한다. 구현 WIP와 blocked metadata를 별도 commit하고 성공 상태를 만들지 않는다. [R3/R4](implementation-recovery.md#r3-승인-후에만-가능한-status-only-checkpoint)는 실제 Correction/후속 checkpoint/해당 실행 직전 사용자 승인 뒤에만 조건부 실행한다. -Owner 정적 검증은 Python checkpoint AST2/local links107/EOF·whitespace와 PowerShell block3 syntax errors0, 각 exit `0`이다. Coordinator는 반환4개 owner/r2/hash·links107/AST2를 재확인했고 exit `0`, 실제 read-only Executor constructor/identity/profile/linked/default sandbox 확인도 exit `0`이었다. `implementation-verification.md`, source/tests/index/top/raw는 이 Planning 작업에서 변경하지 않았다. 이 audit는 복구계획만 수용하며 implementation outcome은 `blocked-environment`를 유지한다. -실행 순서는 Root의 정확8문서 checkpoint → Coordinator가 R2의 실제 Executor WIP 두 commit을 할당 → 공식 Correction Agent가 재현된 classifier 결함만 수정·검증 → 실제 결과에 대한 Planning의 후속 checkpoint 감사 → 사용자 exact-run 승인 및 status-only recovery → 새 prep process다. 이미 로드된 classifier를 reload/override하지 않는다. 현재는 Correction 미실행이고 별도 allowance를 아직 사용하지 않았다. R2 실행 중에는 모든 non-owned 문서/코드 편집과 Root Git 작업을 동결한다. - -아래는 완료된 bounded Planning dispatch 이력이다. Native prep attempt가 종료되어 관리문서 동결을 해제하고 Planning owner에게 실제 실패를 보존하는 복구 계획과 아래 classifier 결함의 최소 TDD 계획만 할당했다. 할당 범위는 `implementation-plan.md`, `implementation-environment.md`, 필요한 같은 폴더 `implementation-recovery.md`, `implementation-verification.md` 및 prep `step0.md`였으며 source/test/Implementation 보고서/phase index·status/Git은 수정하지 않았다. -기존 unchanged Executor의 guarded `_commit_paths`로 부분 구현과 control metadata를 별도 blocked/WIP commit하는 최소 절차를 구체화한다. 새 관리/계획 문서는 Root가 정확 경로로 먼저 checkpoint하여 현재 Step의 경로 검사 밖 dirty 파일을 남기지 않아야 한다. 이 작업은 `_commit_step`이나 성공 판정·pending reset을 호출하지 않으며 Hook 설정 거부를 우회하는 편집을 하지 않는다. -실제 native 실패, clean linked worktree와 해당 실행 직전 사용자 명시 승인이 필요한 sandbox 경계는 [Harness skill](../../.agents/skills/harness/SKILL.md#elevated-and-remote-execution)을 따른다. 권한 결정 이전에는 기존 failure history를 보존한 채 중단한다. 별도 사용자 승인은 아직 없다. - -### Execution-prep attempt 1 실제 결과 - -Root는 최종 Planning checkpoint를 `d533b61`로 커밋했고 exact20 paths/staged check/commit/status를 확인했다. 재개 직전 clean, Git root 일치, 기본 sandbox 및 활성 중복 process 없음을 확인한 뒤 아래 승인된 E3 명령을 실행했다. - -```powershell -python -B -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" mitc4-shell-feast-eigen-execution-prep -``` - -Managed session `27453`은 shell exit `1`로 종료했다. 별도로 측정하지 않은 Python Executor exit를 추정하지 않는다. Raw Codex `exitCode=0`, `transportFailure=null`, 명시적 `blocked`가 보존되었고 Executor는 transport retry 없이 prep/top phase를 `blocked`로 기록했다. 실제 시작은 `2026-09-06T10:04:44+0900`, terminal history는 `2026-09-06T10:28:44+0900`이다. Branch는 `feat-mitc4-shell-feast-eigen-execution-prep`, HEAD는 여전히 `d533b615410751fe023dc73ac2be994f05d37d30`이며 Executor가 생성한 새 commit은 없다. -Raw JSON SHA-256은 `0d5c0fe0aeba5604c5289764e7aad1834902548ca02158f8feac03484b195941`이다. Stderr에는 `patch rejected: writing outside of the project; rejected by user approval settings`가 3회 기록되었다. Native report의 대상은 `.codex/hooks.json`이며 실제 해당 파일은 변경되지 않았다. Executor의 일반 분류 문구 `Codex Windows sandbox helper를 실행할 수 없습니다.`를 모든 도구의 실행 불능으로 확대하지 않는다. - -Focused command는 `uv run --with pytest python -B -m pytest -v -rs tests/test_harness_timeouts.py`였다. Raw JSONL event62에서 첫 test fixture 오류를 포함해 4 failures, event64 test-only 수정 뒤 event66에서 의도한 1800 기본값에 대한 4 failures를 확인했다(각 exit `1`, 약0.40초). 이후 runtime 값 변경 뒤 event78은 exit `1`, `2 passed, 2 failed`, 1.86초였다. - -- `test_stop_passes_one_shared_deadline_to_root_toolchain_and_plan`: 7200 값과 deadline 전파는 도달했지만 서로 다른 import의 `ProjectKind.CMAKE` 객체 비교가 실패했다. Event80에서 `.value` 비교로 test-only 수정했으며 이후 pytest 실행은 없다. 적용된 수정은 미검증이다. -- `test_registered_hook_and_one_time_invocation_contract`: Hook timeout `1800 != 7500` 실패다. 지정 `.codex/hooks.json` 쓰기 거부와 연결되며 설정은 1800으로 남아 있다. - -[Implementation 작성 시점 보고서](implementation-prep-evidence.md)는 두 실패와 후속 test-only 수정의 검증 상태를 충분히 구분하지 않는다. Coordinator는 본문을 수정하지 않고 raw 순서로 gate를 판정하며 재개 Implementation owner에게 정확한 보고서 갱신을 요구한다. Python·Hook의 runtime 일부와 tests/doc 변경은 owned 범위에 있으나 manual configure/build/CTest/full pytest는 실행하지 않았다. 뒤의 aggregate shell exit `0`에는 `python` CommandNotFound가 섞여 있어 개별 command 성공 증거가 아니다. 추가 `uv run python -B -c ...` 상태 확인은 사용자 uv cache 접근 거부로 exit `1`이었다. - -Native Codex의 실제 등록 Stop process `21804`와 CTest child `21716`를 관찰했다. 명령은 `python -X utf8 .../scripts/hooks/stop_validation.py`, `ctest --test-dir .../.harness/build -C Debug --output-on-failure`였고 실제 Debug/x64 build process도 관찰했다. 이는 수동 full VERIFY가 아니다. [CTest LastTest.log](../../.harness/build/Testing/Temporary/LastTest.log)는 362 `Test Passed`, 0 `Test Failed`, 시작10:12/종료10:28을 기록했다. 크기606010 bytes, SHA-256 `f32e535ba6d6b8b8ed7910b0790600698cfa5f20035d12ec5c6821c76df2291f`다. 별도 Stop/CTest process exit는 측정하지 못했으므로 `exit 0`으로 기록하지 않는다. 이 로그는 이후 실행으로 교체될 수 있는 ignored generated evidence다. -Root가 workspace 내부의 ignored [attempt1 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/observation.json)에 `LastTest.log`, `step0-output.json`, `phase-index.json`, `top-index.json`을 복사하고 원본/복사본 hash 일치를 확인했다(exit `0`). [보존 CTest 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/LastTest.log)와 [보존 raw 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/step0-output.json)를 이후 audit의 안정 경로로 사용한다. Source/control/reference와 Hook state는 변경하지 않았다. -Root의 추가 read-only/pure-function 재현은 [classifier observation](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json)에 있다(SHA-256 `74c80fbdfc1eb5d4e28c5e1c77caf33d23af30858bbb7fb9742358e0d8df7eb5`, exit `0`). Raw stdout의 `orchestrator_helper_launch_failed` 7회는 성공한 source/test read command 4개(JSONL lines20/28/44/58, 각 exit `0`)에만 있고 stderr에는 없다. 기존 `_codex_environment_failure`는 성공한 source excerpt 문자열만 있는 exit0 payload도 helper failure로 반환했다. 따라서 현재 helper-launch reason은 source echo에 의한 Harness 분류 오탐이며 실제 도구 launch 실패의 evidence가 아니다. `.codex/hooks.json`의 실제 승인 설정 거부와 명시적 `blocked`는 여전히 유효하고 history를 수정하지 않는다. -같은 source read가 재실행의 성공 결과도 막을 수 있으므로 Planning에 기존 prep 소유 `scripts/execute.py`/`tests/test_execute.py` 안의 최소 TDD 회귀 계획을 추가로 할당했다. 실제 helper failure, 명시 terminal, sandbox·transport retry·ownership 보호를 유지하는 분류 수정만 다음 Implementation에 포함하며 Coordinator/Root는 source를 수정하지 않는다. 이는 운영 결함의 계획 delta로 physics/schema/tolerance `r2`를 바꾸거나 Correction budget을 새로 만들지 않는다. -Main Step0~7, solver C++ 변경, FEAST/reference 비교, physics/release는 미실행이다. Prep의 현재 outcome으로 구현 gate나 timeout activation을 통과시키지 않는다. Failure history·부분 구현을 보존하는 checkpoint 계획은 routine local 준비이며, 환경/사용자 결정 해소 후에만 Planning의 명시적 status-only recovery와 정확한 재실행을 허용한다. - -### 최초 Implementation dispatch 이력 - -Planning owner의 r2 `pass` envelope와 계획 main/detail 4개 및 phase 제어문서 12개를 감사하여 implementation으로 전이한다. Source 변경·C++/FEAST/reference 성공을 뜻하지 않는다. -초기 14개 main 단위를 결합된 API/data 경계 기준으로 8개로 통합했고 각 step의 behavior별 RED/GREEN·focused/full VERIFY·등록 Stop은 유지한다. 운영 prep 1개는 다섯 deadline default와 관련 Harness tests만 소유하며 physics·schema·sandbox·retry·ownership을 바꾸지 않는다. -Owner는 첫 감사에서 Step2 대응 test owned 누락과 anchor 두 곳을 찾아 index/Markdown·정확한 링크를 수정했다. Actual `StepExecutor` read-only schema/owned validator와 최종 정적 감사는 exit `0`이다. Coordinator도 [V7의 실제 command](implementation-verification.md#v7-계획-정적-감사)를 읽은 뒤 재실행해 같은 결과와 16개 bundle SHA-256 `a28b78ad52a7e9606d026100934fea3ff324218be4210aa772e89cbaae42b413`를 확인했다. -결과는 prep1/main8, owned paths128회/고유110, Step별 upstream22 필수입력, 요구27/NR27/I/O11, 신규 필수 test40, local links575/anchor warning0, 기존 top index5개 entry/history 보존, `git diff --check` exit `0`이다. `fesa_tests` aggregate가 unit/integration/reference targets 모두를 의존한다는 실제 graph와 각 필수 새 test의 discovery 확인도 계획에 명시되어 있다. -Root의 최초 `git diff --cached --check`는 새 plan/verification/prep index의 EOF blank 3개를 검출해 exit `1`이었다. Planning owner가 해당 3개만 수정하고 V7에 unstaged diff의 신규파일 검사 한계 및 EOF 검사를 보완했다. Coordinator의 V7 재실행은 전체 EOF 검사·동일 coverage·위 갱신 hash를 확인하며 exit `0`이다. Phase JSON 의미·metadata·계약은 변하지 않았고 구현 correction/revision 변경으로 취급하지 않는다. Root의 재staging/checkpoint 완료 전 실행하지 않는다. -실행 dispatch는 `feature_id=mitc4-shell-feast-eigen`, `stage=implementation`, `outcome=pass`(Planning gate), `next_owner=implementation-agent`, `contract_revision=r2`, `attempt=0`, failure/retry/escalation/blocker=`null`을 적용한다. 필수 evidence inputs는 Feature 폴더/관리3개·승인 upstream22개·Planning4개 및 assigned prep index/step0이며 정확한 경로는 [prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md)에 포함된다. -Root의 정확 경로 checkpoint와 clean/active process/sandbox preflight 후 [E3의 one-time module invocation](implementation-environment.md#e3-one-time-bootstrap와-새-process-activation)으로 execution-prep Step0를 할당한다. Implementation은 그 Step의 exact code/tests/evidence paths와 terminal result만 소유하고 Executor가 branch/attempt/commit/phase 진행을 소유한다. 이 invocation 동안 Root/Coordinator는 관리문서를 포함한 non-owned 편집·커밋을 동결한다. -종료 뒤 actual manual evidence·raw Executor result·등록 Stop/actual exit·정확 source/control commits/clean을 감사한 다음에만 새 main invocation을 할당한다. 실패 시 상태/로그를 보존하고 실제 분류로 반환하며 pending reset/즉시 재실행을 하지 않는다. 실제 구현/전체 검증/reference 및 physics/release gate는 아직 미완료다. - -### Implementation Planning r2 이력 - -I/O owner의 r2 `pass` envelope와 실제 기본 1개/상세 3개 문서를 감사하여 implementation-planning으로 전이한다. -Constant density와 frequency options/data의 exact subset, 공식 공개 syntax 근거와 source warning, 별도 eigen procedure, 기존 static을 보존하는 additive schema 및 candidate/state 보존을 확인했다. Source Step-2/canonical Step-1과 공개 N/all-c 검증을 분리하고 raw lambda·frequency validity·실제 lumped mass/backend를 보존한다. -Owner의 `python -B -` 정적 audit은 owned 4개 metadata, relative links 66개/anchors 13개, requirement 27행, 원본 N10/data fields6 및 TXT full grammar 10행/hash 일치, exit `0`이었다. Owned paths의 `git diff --check`와 별도 untracked whitespace/table 검사도 exit `0`이다. 잘못된 초기 directory/glob 검색과 해소는 owner evidence에 기록되어 있다. -Coordinator는 전체 22문서의 local-link 누락 0, I/O 4개 owner/r2 metadata·반환 SHA-256 일치 및 coverage 27행을 확인했다(`python -B -`, exit `0`). External Value-only/10 singleton/common tolerance 및 기존 static U/UR·reaction 역할은 유지한다. -Planning은 모든 승인 문서와 27개 NR cases/11개 I/O obligations를 실행 가능한 정확한 owned paths, RED/GREEN/focused/full VERIFY와 fresh reference evidence에 연결한다. 실제 MSVC/x64/Debug backend, dependency cache, Executor/Stop의 1800초 경계 및 Git·sandbox·retry 소유권은 아래 준비 evidence와 현재 Harness 구현을 대조한다. 아직 C++/FEAST/eigen reference 비교는 미실행이다. -Root는 I/O r2 exact 8개 경로 checkpoint를 `1d4f5ac` (`docs: define MITC4 eigen input and result contracts`)로 커밋했고 staged path set/diff/commit exit `0`, 이후 clean을 확인했다. -Planning owner에게 `implementation-plan.md`와 필요한 같은 폴더 상세, `phases/index.json`의 신규 entry 및 `phases/mitc4-shell-feast-eigen/`의 index/연속 step 문서를 할당했다. 운영 준비를 별도 invocation으로 완료해야 한다고 판단하는 경우에만 `phases/mitc4-shell-feast-eigen-execution-prep/`의 index/step과 entry도 할당했다. 기존 phase 이력과 모든 runtime/source/test/config는 read-only이며 실행은 아직 할당하지 않았다. -이미 로드된 Executor는 자기 source 수정 후에도 최초 timeout 값을 유지할 수 있으므로 계획에서 새 process activation 경계를 명시해야 한다. 이 관찰은 timeout·sandbox·Hook 정책의 임의 우회 승인이 아니다. - -### I/O r2 이력 - -NR owner의 r2 `pass` envelope와 실제 5개 기본/상세 문서를 감사하여 io-definition으로 전이한다. -NR-MFE-001의 r1 실패를 보존하고 독립 직접 적분의 r2 complete K/질량/고유치/정적 response·reaction covariance 결과로 수학 계약의 해소를 확인했다. 문서에서 추출한 `python -B -` 재현도 exit `0`이다. -V1~V6의 단위·zero branch·analytic rank/conditioning·원 residual/Gram·FEAST controls/seed/QR/thread/정수·memory/budget과 27개 필수 case/요구 mapping이 고정되었다. MFE-C13의 BC 조합은 실제 global component BC로 표현 가능한 경우만 적용함을 owner가 명시했다. -Owner 정적 audit은 5문서/64 local links/27개 요구/27개 cases/8개 기존 static artifacts, exit `0`; `git diff --check` exit `0`이다. 최초 audit의 encoding/URL-decoding 오류와 수정 후 재확인은 전문 evidence에 보존했다. -Coordinator는 18문서의 local-link 누락 0, NR 5개 문서 owner/r2 metadata·반환 hash, 27개 case/27개 requirement mapping 행을 확인했다(`python -B -`, exit `0`). 원본 input/TXT hash와 외부 Value-only/10 singleton/common policy는 유지한다. -I/O owner는 승인된 입력 subset·부수 옵션·density mapping, 별도 eigen procedure state와 additive HDF5/source/modal identity·failure preservation·deterministic 비교 projection을 고정한다. 수식/수치 기준을 다시 선택하지 않으며 실제 C++/FEAST/fresh reference 비교는 Implementation의 후속 필수 작업이다. -Root는 NR r2 exact 9개 경로 checkpoint를 `ea883ad` (`docs: complete MITC4 eigen numerical review`)로 커밋했고 staged path set/diff/commit exit `0`, 이후 clean을 확인했다. - -### Numerical-review r2 이력 - -Formulation owner의 r2 `pass` envelope와 실제 5개 문서의 변경·상세 수식/단위/ordering/실패/검증 경계를 감사하여 numerical-review로 전이한다. -Owner가 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 확정했고 S1~S8에 positivity, complete K 공변성, partial BC, physical rigid/null 및 nonlinear 초기 고정 potential/Hessian의 적용 경계를 명시했다. -Exact arithmetic `python -B -`는 exit `0`, `kd=19/4800`, `lambda=10369/450`, 단위 tangent moment 응답 `7500/10369`이며 formulation 식의 산술 확인이다. NR의 독립 반례 해소나 runtime 결과로 취급하지 않는다. -Owner 정적 검사는 5문서/57개 상대 경로/27개 coverage/issues 0, exit `0`; `git diff --check` exit `0`이다. Coordinator는 16문서 local-link 누락 0, 5개 owner/r2 metadata와 반환 SHA-256 일치를 확인했다(`python -B -`, exit `0`). -NR는 r1의 비충돌 mass oracle/API/reference 근거를 보존하고 새 stabilization을 독립 재검토한다. 이어 미완료 V1~V6 내부 threshold·conditioning·FEAST controls/endpoint/count/solve budget·seed 및 27개 요구의 필수 case matrix를 모두 고정해야 한다. 논리 reference readiness도 r2로 확인한 뒤에만 I/O로 전이할 수 있다. -Root는 formulation r2의 exact 9개 경로를 `4d30383` (`docs: define covariant MITC4 stabilization formulation`)로 커밋했고 staged diff/commit exit `0`, 이후 clean을 확인했다. -NR owner의 중간 독립 계산은 기존 R block을 입력하지 않고 평판 membrane/curvature/MITC shear work를 직접 적분해 complete `24×24 K`를 구성했다. 회전 전후 `lambda=23.04222222222223`, `thetaZ=0.7233098659465717`이 같고 K/M/response/reaction covariance 오차는 각각 `7.90e-17`/`4.66e-17`/`0`/`1.15e-16`이었다(`python -B -`, exit `0`). 최종 보고서/controls/coverage 반환 후 gate를 감사하며 C++/FEAST runtime evidence와 구분한다. - -### Formulation r2 이력 - -Research owner의 r2 `pass` envelope, 두 owned 문서와 추가 R07 상세 근거를 감사하여 formulation으로 전이한다. -Trace/spectral scale 후보, 초기 고정 nonlinear potential의 미분 구조 및 linear `Kzz>0`/`Kpz=0` 전제를 구분했고 특정 수식이나 수치 반례 해소를 연구 gate로 승인하지 않았다. -Owner의 Python 정적 검사는 2문서/32 local links/27개 coverage/issues 0, exit `0`; 기존 S01~S11/R01/R02/R04/R05 보존 비교와 `git diff --check`도 exit `0`이다. -Coordinator는 15문서 local-link 누락 0, owner/r2 metadata·반환 hash 일치를 확인했다(`python -B -`, exit `0`). -`research.md` SHA-256은 `8b552b35342a1e0c81ee8c4effd03f240ea88c7553a5e3eee523b1c0f3cf55f6`, `research-evidence.md`는 `b1825090886ca71510d33c335fc0048f61a53f5f58441fc3d36fffe0e894c492`이다. -Formulation owner는 승인된 범위 안에서 하나의 공변 scale을 정하고 positivity·완전 K 변환·partial BC·initial-fixed nonlinear 계약 및 finite/null 처리 증명을 최소 delta로 갱신한다. 아직 외부 수치 comparison·새 구현·r2 NR gate는 미실행이다. -Root는 research r2 checkpoint 6개 exact paths를 `b99a5e5` (`docs: record covariant MITC4 stabilization research`)로 커밋하고 diff/commit exit `0`, clean을 확인했다. - -### Research r2 이력 - -Requirement owner의 r2 `pass` envelope와 두 owned 문서 delta를 감사하여 research로 전이한다. -기존 26개 ID를 보존하고 `002/008/014/020/024`를 승인 범위에 정합시켰으며 `027`을 추가했다. 기존 fixed scale의 대체 경계와 linear/nonlinear 정적 회귀 portfolio·identity·정책을 연결했고 물리 kernel·source/schema·공통 tolerance는 변경하지 않았다. -Owner의 `Get-Content`/`rg`와 Python audit은 exit `0`, 27개 요구/43 local links/깨진 링크 0이다. Coordinator audit은 15문서/깨진 링크 0/27 unique IDs, exit `0`이다. -`requirements.md` SHA-256은 `bcc17774190cc19b28595b3d0151c0202f4470a14aa90947c5cba6188c9ef909`, `requirements-evidence.md`는 `452ea5ed49b43ffaea3f6065fecf62003ea74f0e6bb3eae7812b9af8e7b8d514`이다. -Research owner는 r1 근거를 보존하며 승인된 stabilization 공변성, 기존 static scale lifecycle과 finite-null 처리에 필요한 근거만 최소 delta로 보완한다. 수식·threshold·NR 판정은 후속 owner 소유이며 실제 구현·수치 재검증은 미실행이다. -Root는 r2 requirements checkpoint 6개 exact paths를 `adef07e` (`docs: baseline covariant MITC4 stabilization requirements`)로 커밋하고 `git diff --check`/commit/status exit `0`, worktree clean을 확인했다. - -### Requirements r2 갱신 이력 - -사용자가 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함해주세요.”라고 답하여 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)의 개선안을 명시적으로 승인했다. -Coordinator는 승인된 scope 변경에 따라 `r2`로 전이하고 Requirement owner에게 필요한 요구·검증 matrix와 기존 fixed `kd` 계약의 대체 범위를 최소 delta로 갱신하도록 할당한다. -기존 질량 흐름·입력 N·reference Value-only·공통 tolerance는 유지한다. r1 NR 반례는 개선 후 필수 회귀 evidence로 연결하며 사용자 승인 자체를 NR gate 통과로 해석하지 않는다. -이후 Research, Formulation, NR의 영향받는 evidence를 순서대로 owner 검토하고 5~9단계로 진행한다. 새 r2 실패는 아직 없고 r1 retry signature의 correction 사용은 0회다. -Root는 앞선 결정 요청 6개 exact paths를 `78d2943` (`docs: record MITC4 stabilization decision request`)로 커밋했고 재개 시 clean 및 기존 VS18/x64 dependency cache를 확인했다. -Root가 이전 자동 Stop으로 보이는 실행 중 CTest를 read-only 추적하고 있다. 수동 중복 build/test/Hook를 실행하지 않으며 최종 결과가 확인되면 환경 evidence로 별도 기록한다. -Requirement owner의 중간 검토는 기존 physical kernel/director/mapping을 유지하면서 numerical stabilization 개선을 분리하고, 개선된 constrained pencil의 spectrum 보존 및 NR 부분 BC 반례의 blocking 좌표 검증을 명시하는 방향이다. 보고서 반환 전 r2 requirements gate를 통과로 처리하지 않는다. - -### Requirements 사용자 결정 대기 이력 - -Requirement owner의 두 owned 보고서와 `needs-user-decision` envelope를 감사했다. -원래 r1의 지원 partial BC 반례를 acceptance에서 제외하는 것은 실제 변경이며, 기존 stabilization 개선 또한 scope/physics 변경이라는 판단과 두 대안·권고를 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)에 기록했다. -질량·FEAST·입력 N의 승인 선택은 유지하고 Root에 한 건의 결정 묶음을 전달했다. 사용자 응답 전 계약 변경·다음 stage 통과는 보류한다. -Requirement owner의 `Get-Content`/`rg` 및 Python 정적 검사는 exit `0`, matrix 26행은 기존 HEAD와 동일하고 링크 누락이 없다. 수식 유도·수치 재실행·source 변경은 하지 않았다. -당시 SHA-256은 `requirements.md`: `ae08d2c7a52cce5261e3420618e5b84b3f25c20258d0992b1b6941511baa7d09`, -`requirements-evidence.md`: `528bdf8a948a964f269cc100c2072d68e65ebaff333b9246b1f718a2052d408e`이다. -Coordinator의 `python -B -` 정적 audit은 15문서/끊긴 local link 0, matrix 26행과 HEAD 동일, exit `0`이다. 최초 audit helper는 ID의 backtick을 잘못 가정하여 0행/exit `1`을 반환했고 실제 문서 형식에 맞춘 패턴으로 수정해 재확인했다. 문서나 계약을 변경하여 검사에 맞추지 않았다. -`git diff --check`는 exit `0`; 변경 경로는 관리 4문서와 Requirement owner 2문서뿐이다. -Root는 NR finding 7개 exact paths checkpoint를 `c8876da` (`docs: record MITC4 numerical review contract finding`)로 커밋하고 clean을 확인했다. - -### Requirements return-upstream 이력 - -NR owner의 실제 보고서 3개와 `return-upstream` envelope를 확인하여 정확한 Requirement owner로 반환한다. -같은 지원 partial BC를 보존한 45도 회전의 직접 계산에서 `lambda=23.04088888888889 -> 23.040628726287263`, -상대차 `1.1291343961675893e-5`가 재현되었다(`python -B -`, exit `0`). 기존 `kd` 규칙과 REQ-014의 acceptance intent 사이의 발견이다. -NR의 independent rational mass oracle, Intel API/count/trace 검토와 reference 원본/10-mode logical readiness evidence는 보존한다. -Owner 정적 검사는 3문서/35 local links/issues0, exit `0`; 수치 reference comparison·FEAST runtime·구현은 미실행이다. -`014`에 영향을 받는 research R06 coverage와 formulation V5/coverage를 부분 stale로 표시하고, 나머지 수학·reference evidence는 향후 revision 영향 검토 후 재사용한다. -Requirement owner는 기존 literal intent의 기술적 정합 가능성과 실제 critical acceptance/physics 선택을 구분한다. 새로운 사용자 결정을 이미 필요하거나 승인된 것으로 표시하지 않는다. -이번 건은 upstream 계약 문제이며 Implementation/Correction Agent로 보내지 않는다. Correction 및 transport 재시도 budget은 사용하지 않았다. - -### Numerical-review 이력 - -Formulation owner의 r1 `pass` envelope와 실제 기본/상세 문서 4개를 감사하여 numerical-review로 전이한다. -Owner 정적 검사는 `4`문서, `38` local links, requirement coverage `26`, issues `0`, `python -B -` exit `0` 및 `git diff --check` exit `0`이다. -Coordinator는 모든 상세 문서의 metadata·수식/단위/identity/오류/검증/한계 절과 링크를 읽고 필수 항목 존재를 확인했으며 수학적 correctness verdict를 대신하지 않았다. -NR는 수학 correctness와 reference-model readiness를 모두 검토하고 명시된 metric/zero branch의 수치값, FEAST controls·bounded budgets 및 필수 verification portfolio를 고정한다. -Root의 두 독립 감사 포인트를 필수 handoff로 포함한다: count 기능의 실제 API 보장보다 강한 completeness를 주장하지 않을 것; -기존 basis-dependent drilling stabilization과 `FEM-REQ-MITC4-EIGEN-014`의 coordinate-invariance coverage 관계를 명시하여 acceptance의 조용한 축소를 막을 것. -현재 새 사용자 미결정이나 implementation correction은 없다. -Formulation checkpoint는 Root가 `2c3a86a` (`docs: define MITC4 mass and FEAST formulation`)로 8개 exact paths를 커밋했고 이후 clean을 확인했다. - -### Formulation 이력 - -Research owner의 r1 `pass` 반환을 Coordinator가 감사하여 formulation으로 전이한다. -연구 기본/상세 문서의 owner, r1, source locators, Fact/Derivation/Candidate 구분, 실제 명령 exit code 및 미실행 항목을 확인했다. -연구 문서 SHA-256: `research.md` = `c044031f844798f32bedc95fd998c181f965fbac00c3ed8f594a48d0164b8956`, -`research-evidence.md` = `aa7cf3be8c3858a9358ca2bd3d117ca0e85a6a0d42c1b439bd812f4ee3d3120f`. -Coordinator local-link audit은 Feature 8문서/끊긴 링크0, exit code `0`; `git diff --check`도 exit code `0`이다. -설치 header와 공식 count 기능 존재는 runtime 또는 완전성의 자동 통과 증거가 아니다. 실제 API의 수치적 한계, endpoint/count 실패, 독립 작은 spectrum 검증이 연구 보고서에 기록되었다. -Formulation owner는 approved MITC4 geometry에 대한 consistent 적분, derived block lumping·물리 관성·massless drilling/constraints, -FEAST의 낮은 N개 계산·복원·실패 보존 및 modal evidence 식을 구현 가능한 계약으로 작성한다. 최종 numerical/reference acceptance는 다음 NR가 독립 검토한다. -Research checkpoint는 Root가 `a7c13ff` (`docs: record MITC4 mass and FEAST research evidence`)로 완료 문서 6개를 커밋했고 이후 clean을 확인했다. -Formulation owner의 중간 관찰은 기존 `Tphys/Tdrill`과 양의 nodal drilling 강성에 기반한 `Kpz=0` 증명, -곡면의 `C1` coupling을 유지하는 derived block lumping과 `3×3×3` mass 적분 차수 검토이다. -이는 작성 중인 정식화의 owner 관찰이며 formulation 또는 numerical gate 통과를 뜻하지 않는다. - -### Research 및 baseline 이력 - -Requirement owner의 최종 r1 `pass` 반환을 Coordinator가 감사하여 requirements gate를 통과시키고 research로 전이한다. -당시 SHA-256은 `requirements.md`: `1ebe65f231e49ffc15a9a1985dcdbbb7e6fc47b9e1ddb5a76f2c2489e5982690`, -`requirements-evidence.md`: `2241ef8dacc7e07d40c731667e202bd9c104ae43b1a5f6eab4530a6831fea918`이다. -Coordinator 정적 audit은 Feature 6문서, 끊긴 local link 0, must rows/unique IDs `26/26`, exit code `0`; `git diff --check` exit code `0`이다. -Research owner는 승인된 consistent→lumped→FEAST, 물리 관성·massless drilling·제약·최저 모드 완전성 및 독립 verification의 primary-source evidence를 수집한다. -연구 계약은 다음 stage의 수식을 대신 승인하지 않는다. Reference 비교량, tolerance 및 사용자 mass 선택은 변경하지 않는다. -요구조건 checkpoint는 Root가 `29d88b4` (`docs: baseline MITC4 lumped-mass FEAST requirements`)로 6개 exact paths를 커밋했고 이후 clean을 확인했다. -사용자가 “inp 파일의 고유치 개수를 사용합니다”라고 확인했다. 기존 r1의 `FEM-REQ-MITC4-EIGEN-009/015`와 일치하므로 [MFE-ADR-005](ADR.md#mfe-adr-005--요청-고유치-개수의-입력-권위)에 설명을 기록하고 r1을 유지한다. -Research와 후속 Formulation/NR은 FEAST interval count 기능의 exact guarantee와 stochastic estimate를 구분하고 공식 API가 보장하는 범위를 넘는 completeness 주장을 하지 않는다. - -### Requirements 이력 - -2026-09-06 사용자 후속 답변을 수신했다. Consistent mass를 계산하고 이를 이용한 lumped mass도 계산한다는 요구로 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)를 갱신했다. -`r1` 입력을 Requirement owner에게 반환하여 양자택일 초안과 matrix를 수정하고 actual FEAST mass/lumping 의미의 중요 미결정 여부를 확인한다. -Requirement owner는 두 mass의 계산 관계만으로 FEAST의 실제 `M`이 유일하게 결정되지 않는다고 판단했다. -[MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 derived lumped 사용 권고와 consistent 사용 대안, spectrum·residual 영향 및 질문을 기록하고 Root에 전달했다. -Detailed lumping 수식은 Research/Formulation이 담당하며 현재 질문은 FEAST 사용 질량 한 건이다. -같은 날 사용자 명시 답변으로 `consistent mass -> lumped mass -> 고유치 해석` 순서와 FEAST의 lumped mass 사용이 확정되었다. -`MFE-OQ-001`과 `MFE-OQ-002`는 해소되었으며 Requirement owner에게 r1 baseline 확정과 pass 검토 요청을 전달했다. -FEAST 및 내부 modal residual/normalization/orthogonality는 사용된 lumped `M`을 기준으로 한다. 같은 선택에 대한 재질문은 하지 않는다. -아래 r0 기록은 이력이며 현재 승인을 뜻하지 않는다. r0 requirements 결정 항목은 stale이고 후속 stage 산출물은 아직 없다. - -Requirement Agent는 r0 입력에서 요구사항과 검증 matrix, reference 관찰 사실 및 중요한 미결정 사항을 작성한다. -질량 정식화나 reference 해석 의미를 승인으로 추정하지 않으며 질문이 필요하면 선택지·영향·권고를 하나로 묶어 Coordinator에게 반환한다. -일반 문서·계획·local 실행은 사용자 요청으로 승인되었으며 반복적인 stage 승인을 추가하지 않는다. - -Requirement owner의 중간 조사에서 단일 `Step-2`의 `nlgeom=NO, perturbation`, `*Frequency` 요청 `10`모드, -선행 정적 step·하중·preload 없음이 확인되었다. 이 관찰은 무하중 원형상 procedure 의미를 뒷받침하며 최종 requirements 보고서에서 추적한다. -`Value`와 `Freq(cycles/time)`가 별도로 있는 원본 txt는 Mode `1..10`을 포함한다. 수치 비교는 아직 수행하지 않았다. - -Requirement owner는 `consistent mass`와 `nodal lumped mass`가 유한 mesh의 고유치·운동에너지 의미를 달리하는 critical 선택임을 반환했다. -[MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)의 권고/대안/영향을 Root에 전달하여 사용자에게 하나의 질문으로 요청한다. -Requirements 기본·상세 보고서 2개의 owner `requirement-agent`, input revision `r0`를 확인했다. -Coordinator 정적 audit: 전체 Feature `6`문서, 끊긴 local link `0`, must matrix `25`행 및 고유 ID `25`, exit code `0`. -원본 reference 2개 SHA-256이 specialist 기록과 일치했다. Requirements 초안은 질량 선택 대기를 명시하며 연구 이후 gate의 빈 보고서는 없다. -기본 보고서 SHA-256: `8d5fbcb8ba2c2bd25d736418450b1b69e7aba7a84c8370d6e2a89e4e259daa66`. -상세 보고서 SHA-256: `85ee91dd745f74cc65ef8e660227465a8fa5ad302e639a51464d0ba31f449d22`. -결정에 의존하는 baseline pass 및 다음 stage는 보류한다. 응답 수신 뒤 Requirement owner가 승인 선택을 반영하고 Coordinator가 revision과 gate를 다시 감사한다. - -## 후속 실행 준비 관찰 - -후속 사용자 지정 `FESA_GTEST_SOURCE_DIR=C:\git\googletest`에 대해 Root가 `CMakeLists.txt` 존재를 확인했다. -Root는 다른 dependency·Harness 환경을 별도로 조사하며 완료 문서 checkpoint와 사용자 수정 `AGENTS.md` 커밋을 담당한다. -실제 implementation 실행 전 환경 준비와 configure/build/test 성공이 필요하며 아래 과거 Stop failure를 소급 변경하지 않는다. -사용자 수정 `AGENTS.md`의 경로 예시 한 줄은 Root가 `fab168b` (`docs: document local GoogleTest source path`)로 커밋했다. -Root read-only 환경 조사에서 다음 설치 경로를 확인했다. 이 목록은 설치 존재 evidence이며 configure/build/test 성공은 아니다. - -| 항목 | 확인 경로 | -| --- | --- | -| GoogleTest | `C:/git/googletest` | -| MKL CMake config | `C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl` | -| TBB CMake config | `C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb` | -| HDF5 CMake config | `C:/Program Files/HDF_Group/HDF5/2.1.1/cmake` | -| Ninja executable | `C:/Program Files/Microsoft Visual Studio/18/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe` | - -VS `18/Community` DevShell script/dll이 존재하며 Ninja는 현재 PATH에 없다. Planning/Executor는 각 실행 subprocess의 MSVC x64 Developer 환경과 dependency 환경을 명시해야 한다. -Root는 global environment, Hook state/code를 변경하지 않았다. -후속 Root read-only `Get-Command`에서 `python`, `uv`, `cmake`, `ctest`, `codex`가 해석되었다. Codex launcher는 `C:/Users/baram/AppData/Local/Programs/OpenAI/Codex/bin/codex.exe`다. Launcher 실행·로그인·설정 변경은 없었고 tool availability는 Harness transport 성공 evidence가 아니다. -추가 Root read-only 확인: Python `3.11.15`, oneMKL `mkl_rt.lib`/`bin/mkl_rt.3.dll` 및 FEAST 선언이 존재한다. -현재 작업 경로는 primary `C:/git/FESADev`의 linked worktree이며 branch는 `Eigen`이다. -Implementation profile은 `gpt-5.6-terra` / `xhigh` / `workspace-write`이고 당시 configure/link/runtime는 미실행이었다. -Root가 읽은 현재 config schema는 dependency environment/cacheVariables를 직접 받지 않으며, root preset은 dependency `$env{...}` 값을 cacheVariables로 지정한다. -개별 subprocess environment가 부모 Stop process에 전파된다고 가정하지 않는다. Planning은 실제 Hook backend/환경과 CMake cache·preset을 함께 대조한다. -AGENTS의 Ninja preset은 예시이며 필수 검증은 MSVC/x64/Debug CMake/CTest다. 자동 감지의 VS18 cache 재사용도 현재 환경에서 가능한지 평가할 수 있으나, -과거 native sandbox의 FileTracker 한계와 현재 runner 정책까지 확인해야 한다. 당시 backend 선택·config 변경·실행은 하지 않았으며 이후 Root의 configure 환경 교정은 아래에 구분해 기록한다. - -현재 `.harness/config.json`은 없고 preset과 `.harness/config.example.json`은 있다. -Planning은 자동 감지 결과와 승인 MSVC preset을 대조하여 실행명령 및 Hook backend를 명시해야 한다. -`scripts/execute.py`의 preflight는 selected phase 제어 파일 외의 dirty 경로를 거부한다. -따라서 구현 실행 전에 Feature 문서 baseline과 Executor의 path-scoped Git 처리 경계를 Planning에서 구체화한다. -이 관찰은 환경 실패 판정이나 별도 사용자 승인 요청이 아니다. - -Root가 전달한 자동 Stop hook configure 실패는 별도의 실제 환경 evidence로 보존한다. -실행 명령은 `C:/Program Files/CMake/bin/cmake.exe -S C:/Users/baram/orca/workspaces/FESADev/Eigen -B C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build -A x64`, exit code `1`이며 -`cmake/FesaDependencies.cmake:9`에서 `FESA_GTEST_SOURCE_DIR` 미설정을 보고했다. -Root의 read-only 원인 조사에서 현재 process의 `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`가 모두 미설정이고, -자동 감지는 `Visual Studio 18` generator를 사용하며 local config가 없어 승인 Ninja/MSVC preset과 맞지 않음이 확인되었다. -당시 수동 Hook·CMake·CTest 재실행, config 변경 또는 Hook state 조작은 하지 않았다. -당시 requirements gate의 critical 질량 선택과 별개로 Implementation Planning에서 dependency 경로·설정된 backend를 준비하고 검증하도록 보존한 기록이다. -이 실패를 build/test 통과로 보고하거나 현 단계의 미실행 검증을 대체하는 증거로 사용하지 않는다. - -### Root의 configure 환경 교정 확인 - -2026-09-06 Root는 사용자 지정 GoogleTest와 확인된 dependency 경로로 기존 자동 감지 backend의 cache를 구성하고 이전 실패 명령을 재확인했다. - -```powershell -cmake -S . -B .harness/build -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" -cmake -S C:/Users/baram/orca/workspaces/FESADev/Eigen -B C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build -A x64 -``` - -각 명령 exit `0`이며 실행 시간은 약 5초와 1.5초였다. `CMakeCache.txt`의 dependency 경로 4개 및 `Visual Studio 18 2026`/x64를 확인했고 MKL `2026.1`, dynamic/`intel_ilp64`/`intel_thread`가 선택되었다. -Cache는 Git ignored이며 source·설정·Hook code/state를 변경하지 않았다. 수동 Hook·build·CTest·FEAST 실행은 없었다. -이전 configure 원인은 해소되었지만 build/link/test 또는 feature TDD gate 통과 evidence는 아니다. Planning은 실제 backend와 cache를 대조하고 Debug를 build `--config Debug` 및 CTest `-C Debug`로 명시해야 한다. - -### 자동 Stop baseline 중단 관찰 - -Root가 기존 CTest PID `21104`의 `--test-dir .harness/build -C Debug --output-on-failure` 실행을 read-only로 관찰했다. -362개 중 test 355 `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame`는 약 193.43초 뒤 `Test Failed`를 기록했고, test 356 `Projects729WideRowsTo2187LogicalRowsPerFamily`는 보고 시점에 진행 중이었다. -원시 출력은 `.harness/build/Testing/Temporary/LastTest.log.tmpe803a`에 있다. 실패 출력은 RUN 이후 종료되어 원인을 아직 단정하지 않는다. 최종 CTest exit code도 아직 없다. -이 관찰은 신규 source 변경 없는 baseline 실행이며 feature correction budget을 사용하지 않는다. Root가 최종 결과·환경 원인을 추적하고 Planning/Implementation 전에 분류할 evidence로 전달한다. -일부 앞선 nonlinear reference test가 약 460초 뒤 통과한 사실은 전체 suite 통과를 뜻하지 않는다. 수동 중복 test·Hook 또는 source 수정은 수행하지 않았다. -Root의 후속 관찰에서 CTest와 parent/test process는 종료되었다. Observer shell은 exit `0`이지만 관찰한 `ctest.ExitCode`는 빈 값이어서 CTest 실제 종료 코드는 확인하지 못했다. -Raw log 집계는 `354 Test Passed`, `1 Test Failed`, 요청 362개 중 완료 기록 355개로 suite가 미완료다. 첫 실패의 solver log는 target 0.3 iteration 2 continue에서, 후속 test는 target 0.5 iteration 3 accepted에서 끝났고 후속 test의 완결 HDF5는 없다. -이 evidence만으로 코드 결함, timeout 또는 turn interruption 중 원인을 선택하지 않는다. 관련 Windows ApplicationError 기록도 확인되지 않았다. -Root가 원시 CTest 기록을 Git ignored `.harness/build/baseline-before-mitc4-eigen/`에 복사 보존했다. `LastTest.log.tmpe803a` 크기는 `592656` bytes이며 현재 활성 build/test process는 없다. -Planning/Implementation은 이 중단 baseline과 구분되는 실제 전체 suite exit code 및 완전한 결과를 확보해야 한다. 관찰 shell의 성공을 CTest 성공으로 대체하지 않는다. - -Root는 활성 중복 실행이 없음을 확인한 뒤 아래 단독 재현을 같은 source/test/환경으로 실행했다. - -```powershell -ctest --test-dir .harness/build -C Debug -R '^ShellSurfacePressureReference\.SelectsUniqueSchemaOneFactorOneAcceptedFrame$' --output-on-failure -``` - -Managed session `2839`의 실제 exit는 `0`, `1/1 passed`, 전체 실행 시간 `636.99`초였다. 이전 실패는 동일 조건에서 재현되지 않았지만 최초 중단 원인을 확정하지 않는다. -기록은 Git ignored `.harness/build/baseline-before-mitc4-eigen/focused-rerun/`의 로그 및 `observation.json`에 있고, `LastTest.log` SHA-256은 `56e13949bf6af8b43c9a9177d1e261d1a13b115ac688c4f86318aa8156ae3690`이다. -전체 362개 suite 통과나 새 feature TDD evidence는 아니다. 현재 해당 단독 실행은 종료되었다. -Root의 read-only 관찰에서 이 test는 `fesa_solver.lib` mtime에 따라 기존 HDF5를 재사용한다. Planning/Implementation은 영향받는 최종 reference 검증이 새 binary에 대한 fresh solve인지 명시적으로 확인해야 한다. - -Root는 이전 중단에서 미관찰된 나머지 pressure 7개를 같은 binary와 위 단독 재현의 fresh HDF5로 확인했다. - -```powershell -ctest --test-dir .harness/build -C Debug -R '^ShellSurfacePressureReference\.' -E '(AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts|SelectsUniqueSchemaOneFactorOneAcceptedFrame)$' --output-on-failure -``` - -Exit `0`, `7/7 passed`, `1.09`초이며 Git ignored `.harness/build/baseline-before-mitc4-eigen/remaining-pressure-tests/`의 `LastTest.log`/`observation.json`에 보존했다. -로그 SHA-256은 `60823270ffc3c9386a5936ddc8f3ac3fb89a5895412046b2689216ec7a50472f`다. 변경 전 baseline의 중단 실행 354 pass, 단독 재현 1 pass, 나머지 7 pass를 각각 확보했으나 단일 전체 suite 성공으로 합쳐 보고하지 않는다. -Root의 baseline 분류 작업은 종료되었고 source/test/환경/reference 변경은 없었다. 새 binary의 TDD·전체 suite·fresh reference 검증은 Implementation owner의 필수 작업이다. -Root의 read-only 시간 집계는 보존된 355개 duration 합 `1228.04`초에서 중단된 pressure `193.43`초를 성공 단독 실행 `636.97`초로 대체하고 나머지 7개 `1.09`초를 더한 `1672.67`초(약 27.9분)다. -이는 서로 다른 관찰의 합산 추정이며 실제 단일 전체 suite wall time 또는 pass evidence가 아니다. Planning은 full VERIFY와 fresh reference solve의 실제 소요를 고려하되 이 추정으로 timeout 변경·test 생략·검증 축소를 승인받았다고 해석하지 않는다. - -### Executor와 등록 Stop의 실행시간 경계 - -Coordinator의 read-only `rg`/`Get-Content`(exit `0`)에서 [Executor](../../scripts/execute.py)의 `CODEX_TIMEOUT_SECONDS=1800`이 각 Codex `subprocess.run`의 전체 coding/RED/build/VERIFY session에 적용되고 별도 CLI timeout 인수가 없음을 확인했다. -Root의 후속 read-only 조사(실제 adapter 구성 import `python -B -`, exit `0`)는 다음 경계를 확인했다. - -| 경계 | 현재 실제 설정 | -| --- | --- | -| [.codex/hooks.json](../../.codex/hooks.json) 등록 Stop | outer timeout 1800초 | -| [stop_validation.py](../../scripts/hooks/stop_validation.py) | `TOTAL_TIMEOUT_SECONDS=1800`; repo/toolchain/configure/build/discovery/CTest 전체 shared deadline | -| [models.py](../../scripts/msvc_harness/models.py) | `CommandSpec.timeout_seconds=1800` | -| [process.py](../../scripts/msvc_harness/process.py) | 각 command cap과 shared remaining의 최솟값 사용 | -| [config.py](../../scripts/msvc_harness/config.py) 및 실제 adapter | local config 없음, timeout field 지원 없음/unknown key 거부; 자동 CMake/VS18/x64/Debug plan은 각 command cap1800, preset 없음 | - -이 관찰은 Hook 실행이나 실제 timeout 실패가 아니다. 전체 VERIFY 합산 추정과 비교하면 coding/RED/build 및 등록 Stop까지 포함할 여유가 작으며 Executor만 변경해도 다른 cap은 늘지 않는다. -Planning은 기존 지원 설정 유무와 실제 full/fresh VERIFY를 대조해 최소 실행 방식을 구체화해야 한다. 기존 knob가 없다면 Root가 확인한 사용자 실행 승인 범위 안의 필요한 가역적 운영 개선으로, 대응 Harness tests를 갖춘 bounded timeout 설정/수정을 검토할 수 있다. 정확한 변경·owned paths·검증은 계획이 확정하며 현재 어떤 runtime/config/source도 수정하지 않았다. -Sandbox, transport retry 횟수·증거, ownership, full VERIFY 및 Hook 검증 의미는 유지한다. Cached reference를 새 실행으로 주장하거나 unobserved process로 deadline을 피하지 않는다. Runtime 변경 자체로 새 사용자 승인 gate를 만들지 않되 별도의 명시 critical boundary가 생기면 그 규칙을 따른다. - -Planning의 실제 helper 대조에서 nonlinear `RunFesaApplicationOnCopiedInput()`은 매번 FESA application을 호출하므로 pressure 일부 helper의 cache로 전체 prep VERIFY가 빨라진다고 가정할 수 없음이 확인되었다. 또한 `process.execute_plan`의 default shared fallback과 prep Codex launch 당시 등록된 Stop outer cap의 수명도 대조해야 한다. -Root는 사용자 승인된 가역적 운영준비 범위 안에서, 실제 repository `StepExecutor`/`main`을 호출하기 직전 **단 하나의 유한 `CODEX_TIMEOUT_SECONDS` 값만 지정하는 one-time Python module invocation**을 계획에 명시할 수 있다고 판단했다. 이는 기존 CLI timeout option이 아니며 아직 실행하지 않았다. 정확한 값·명령·activation 경계는 Planning owner가 고정한다. -해당 준비 실행도 기본 `workspace-write`, native failure 뒤 별도 승인이 필요한 확대 경계, exact ownership, Executor branch/commit, full VERIFY, registered Stop, terminal result와 retry budget을 유지한다. Hook state/reentry flag, 실행 메서드, tests 또는 다른 guard를 override하지 않는다. Prep process가 이전 Stop outer 1800초를 유지할 가능성을 기록하고 실제 성공 evidence 없이 활성화를 주장하지 않는다. Active Executor 동안 Root/Coordinator의 관리문서 편집·커밋도 중지한다. - -## Retry 기록 - -`mitc4-shell-feast-eigen|implementation|environment|r2`: actual attempt `1`, native terminal `blocked`, transport retry `0`, Correction `0`, Implementation rerun `0`이다. Specialist가 반환한 `focused-verify` 문구를 implementation gate로 정규화했으며 새로운 실패 key를 만들지 않았다. -Focused test의 마지막 적용 수정은 미검증으로 남는다. 이를 환경 실패로 통과 처리하거나 새 correction allowance로 취급하지 않는다. 환경 해소 후 같은 Step owner가 해당 test와 전체 필수 검증을 완료해야 한다. -`mitc4-shell-feast-eigen|implementation|harness|r2`: collaboration spawn 요청은 서비스 thread 한도로 거부되어 실행/allowance를 소비하지 않았다. 공식 profile의 첫 native Correction `1회`를 할당하며 같은 key의 추가 Correction은 금지한다. Implementation rerun은 아직 `0회`다. 실제 Hook 환경 key를 문구만 바꾸어 재발급한 것이 아니라 독립 재현된 분류 결함을 분리한 것이다. -동일 native thread의 continuation3에서 실제 최소 source 교정 `1회`와 새 37개 GREEN을 완료했다. 따라서 harness key의 Correction allowance는 사용되었고 두 번째 source correction은 금지한다. 전체 gate의 environment block과 향후 한 번의 Implementation rerun은 별도로 유지한다. Native/등록 Stop 종료 전후 추가 source cycle, phase transport retry 또는 history reset은 없었다. -첫 native는 collection 이전 환경 진입에서 끝나 실제 수정0이었다. Root의 새 local cache/interpreter 준비 뒤 동일 thread를 resume하는 것은 이 한 Correction의 미완료 작업을 계속하는 것이며 두 번째 corrective change나 phase transport retry가 아니다. 첫 결과와 비용·실패 이력은 삭제하지 않는다. -첫 environment continuation도 제공된 hermes interpreter의 metadata 접근 거부로 collection 이전 exit `2`였다. Owner는 source/test 수정0과 미실행 검증을 보고서에 추가했고 [native continuation1 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-result.json)는 native/wrapper exit `0`, 1243.328초, branch/HEAD·비소유 bytes 불변을 확인했다. 별도 등록 Stop/CTest를 실행 중 process handle로 관찰하여 각각 exit `0`을 확보했다([실제 종료 코드](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-registered-exits.json)). 이는 classifier 수정 전 자동 검증이며 수동 full 또는 RED/GREEN 증거가 아니다. [완료 로그·보고서 archive](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-archive.json)에 당시 파일과 hash를 보존했다. -Root가 거부된 interpreter를 복사하거나 다른 방식으로 읽지 않고 Python3.11.15의 독립 배포본을 새 workspace ignored `.../classifier-correction/python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe`에 설치했다(`uv python install --no-bin --no-registry`, exit `0`, 5.42초). 새 `workspace-python-cache`를 이용한 Root 실행 진입도 exit `0`, 2.59초, pytest9.1.1 및 해당 workspace base prefix를 확인했다. 동일 미수정 Correction/thread의 environment continuation2는 uv의 PyPI 재확인에서 network `os10051`, entry exit `2`로 collection 전에 종료했다. [실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-2-result.json)는 native/wrapper exit `0`, 227.593초, branch/HEAD·비소유 bytes 불변을 확인했다. [당시 owner 보고서](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-2-blocked-report.md)를 보존했으며 source/test 변경 및 RED 실행은 여전히 없다. -Root는 같은 독립 workspace Python을 base로 영속 `.../classifier-correction/pytest-venv/Scripts/python.exe`를 만들고 cached pytest9.1.1을 offline 설치했다. 생성·설치·직접 import는 exit `0`, 1.49초이며 별도 PowerShell의 직접 import도 exit `0`, 0.89초다. 동일 thread의 environment continuation3는 이 영속 interpreter를 직접 사용한다. 정상적인 대안은 같은 workspace runtime/cache의 `uv run --offline`이며, 필요 시 새 ignored pytest cache 및 고유 `--basetemp` 경로를 사용한다. 두 정상 진입 대안을 같은 작업 안에서 확인하되 거부된 기존 cache/interpreter 접근·network·권한 확대·test skip은 허용하지 않는다. 준비된 Root 환경 성공은 native RED/GREEN 증거가 아니며 실제 실행을 기다린다. 같은 미완료 Correction attempt `1`과 원시 이력을 유지한다. diff --git a/docs/mitc4-shell-feast-eigen/corrections.md b/docs/mitc4-shell-feast-eigen/corrections.md deleted file mode 100644 index be39026..0000000 --- a/docs/mitc4-shell-feast-eigen/corrections.md +++ /dev/null @@ -1,112 +0,0 @@ -# Source echo classifier 최소 교정 결과 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `correction-agent` -- Input contract revision: `r2` -- Outcome: `blocked-environment`; 다음 owner: `coordinator-agent` -- Dispatched failure_classification: `harness` -- Retry key: `mitc4-shell-feast-eigen|implementation|harness|r2` -- Attempt: `1`; 동일 unfinished assignment에서 ONE minimal correction을 수행했다. 이전 환경 continuation은 추가 allowance 또는 phase transport retry가 아니다. - -기준: [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [MFE-ADR-012](ADR.md#mfe-adr-012--source-echo-분류-오탐의-bounded-운영-correction), -[dispatch](coordination.md), [implementation-plan](implementation-plan.md), [환경](implementation-environment.md), -[복구 R4](implementation-recovery.md#r4-조건부-exact-dfa-invocation과-후속-검증), [verification](implementation-verification.md), -[prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md). -Trace: `FEM-REQ-MITC4-EIGEN-023/025`, `MFE-C27`, `IO-T11`. - -## 핵심 결과 - -**Source echo 오탐은 교정됐고 신규 37개 회귀가 통과했다.** -전체 gate는 MSVC build의 환경 접근 거부와 protected Hook timeout 불일치로 미완료다. -Full pytest는 `152 passed, 1 failed`이며 실패 assertion을 변경하거나 제외하지 않았다. - -Production 변경은 [execute.py](../../scripts/execute.py)의 기존 `_codex_environment_failure`와 -새 private `_stdout_has_helper_failure`뿐이다. Stderr helper 검사를 유지하고 stdout은 -runtime prefix 또는 구조화된 `error/turn.failed`를 판별한다. Failed command의 출력도 -runtime prefix를 확인한다. 성공 command의 source/command payload와 agent의 source 설명을 -runtime failure로 사용하지 않는다. Auth/CLI 진단, terminal/history, retry, sandbox, ownership 함수는 변경하지 않았다. - -[사전 재현](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-baseline.json)은 수정 전 synthetic source excerpt와 archive raw 모두의 잘못된 helper 판정을 기록한다. -[교정 후 audit](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-corrected-audit.json)은 같은 archive에서 helper 판정 `null` 및 -원래 명시적 Hook 쓰기 거부 사유의 `reported-blocked`를 확인한다. Historical phase/history/raw를 수정한 것이 아니다. -AST 비교도 위 두 method만의 변경을 확인했다. - -## RED → GREEN 및 검증 - -실행 Python은 workspace의 -`C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe`이며 -Python `3.11.15` / pytest `9.1.1`이다. Direct entry는 성공했고 uv/network fallback은 사용하지 않았다. -Python 명령은 `-B -X utf8 -m pytest -v -rs`, 허용된 workspace `cache_dir`와 실행별 새 `--basetemp`를 사용했다. -최초 RED만 기본 temp와 UTF-8 옵션 전 명령이었다. 실제 absolute command, stdout/stderr 경로·hash 및 -전체 parameter inventory는 [검증 summary](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json)와 각 실행 JSON에 있다. - -| 실행 / exact command record | Exit | Wall seconds | 실제 결과 | -| --- | ---: | ---: | --- | -| [최초 RED](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-red.json) | 1 | 4.2882233 | 6 failed, 16 passed, 15 setup errors; 기본 `pytest-of-Mimi` temp 접근 거부를 별도 분류 | -| [새 workspace temp RED](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-red-workspace-temp.json) | 1 | 8.1127850 | **21 failed, 16 passed**, 37 selected/36 deselected; setup errors 0 | -| [같은 targeted GREEN](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-green.json) | 0 | 8.8222791 | **37 passed**, 36 deselected; pytest 자체 duration 8.03 s | -| [Step0 전체 focused](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-focused.json) | 1 | 45.3687980 | 135 passed, 1 failed; pytest duration 44.58 s | -| [`cmake -S . -B .harness/build -A x64`](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-configure.json) | 0 | 0.8602958 | VS18/MSVC/x64 cache configure 완료 | -| [`cmake --build .harness/build --config Debug`](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-build.json) | 1 | 0.5442108 | FileTracker 초기화 접근 거부 | -| [전체 pytest](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-full-pytest.json) | 1 | 45.8682791 | **152 passed, 1 failed**, skip 0; pytest duration 45.03 s | - -새 필수 tests는 [test_execute.py](../../tests/test_execute.py)의 -`test_environment_classifier_ignores_successful_source_echo` 6 cases, -`test_environment_classifier_retains_runtime_helper_failure` 16 cases, -`test_successful_source_echo_preserves_terminal_and_retry` 15 cases다. -RED에서 6개 echo 오판과 15개 terminal/retry 오판을 관찰한 **뒤** production을 수정했다. -처음부터 통과한 true-runtime 16개를 새 RED로 주장하지 않는다. - -GREEN은 stdout/stderr의 실제 helper failure를 exit0/1에서 유지하고 mixed echo+failure도 차단한다. -Completed/exit0, explicit error/blocked의 원래 reason/history, pending missing-result, -nonzero/124만으로 retry 금지, 실제 wrapper timeout의 최대2회 시도 및 terminal 우선 처리를 확인했다. -Focused는 지정된 timeout/Executor/ownership/Hook scope/preset 전체 targets를 포함한다. -기존 timeout tests의 마지막 `.value` 수정도 focused/full에서 실제 통과했으며 해당 파일은 수정하지 않았다. - -## 남은 환경 blocker와 미실행 gate - -[Build stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-build.stdout.log)의 결정적 실패는 -`ZERO_CHECK.vcxproj`의 `GetOutOfDateItems` → `Microsoft.Build.Utilities.FileTracker` -type initializer에서 발생한 `MSB4018 / UnauthorizedAccessException / 0x80070005 (E_ACCESSDENIED)`다. -Source compile correctness 실패로 재해석하거나 build guard를 변경하지 않았다. -선행 full build 실패에 따라 아래 CTest 명령은 미실행이며 count/exit/duration을 주장하지 않는다. - -- `ctest --test-dir .harness/build -C Debug --show-only=json-v1` -- `ctest --test-dir .harness/build -C Debug --output-on-failure` - -[Focused/full pytest failure](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-full-pytest.stdout.log)는 -`tests/test_harness_timeouts.py:175 / test_registered_hook_and_one_time_invocation_contract`의 -`assert 1800 == 7500` 한 건이다. Protected `.codex/hooks.json`은 편집하지 않았고 해당 test도 유지했다. -두 환경 blocker 해소 후 승인된 full build/CTest와 전체 pytest 검증이 남아 있다. -기존 registered Stop/CTest의 source 변경 전 `362 tests / exit0` 관찰은 이번 manual full evidence를 대신하지 않는다. -등록 Stop은 활성 상태 그대로이며 수동 호출·state 조작 없이 이번 최종 결과는 보고 시점 미관찰이다. -이 운영 correction에는 별도 eigen/reference comparison이 적용되지 않는다. - -## 이전 환경 진입 이력 - -| Entry | 보존된 결과 | -| --- | --- | -| [최초 기본 uv entry](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906020757Z-red-entry.json) | exit2 / 0.0395046 s; 사용자 cache 접근 거부, collection 전 중단 | -| [continuation1](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906021629Z-continuation-entry-failure.json) | exit2 / managed 0.133794 s; hermes interpreter metadata 접근 거부 | -| [continuation2](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906024054Z-continuation2-entry.json) | exit2 / 11.5178819 s; PyPI network os10051, Python 실행 전 중단 | - -각 환경-only entry와 이전 blocked 보고서/native records는 보존했다. -이번 named venv 및 새 temp 선택은 Coordinator가 허용한 동일 correction의 환경 해소이며 -접근 거부된 cache/interpreter 재접근, network 사용 또는 sandbox 확대는 없었다. - -## 소유 파일과 인계 - -| Changed artifact | SHA-256 | -| --- | --- | -| `scripts/execute.py` | `64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0` | -| `tests/test_execute.py` | `0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6` | - -이 보고서의 hash와 non-owned byte/branch/HEAD/link 검토는 [최종 audit](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-final-audit.json)에 둔다. -정확히 지정된 source/test/report 3개와 허용된 ignored evidence/cache/temp만 변경했다. -Coordinator의 dirty management 2개, upstream, phase/status/history, reference와 native records는 보존한다. -Branch `feat-mitc4-shell-feast-eigen-execution-prep`, HEAD `5dfbea7e543b64fdefcea292de43237adb790a72`를 유지한다. -Root Git writes, phase Executor, peer dispatch, 외부 solver, physics/release 승인 또는 workflow 전이는 없다. - -ONE minimal correction 이후 추가 수정 cycle은 수행하지 않는다. Targeted 교정 성공과 전체 gate의 -`blocked-environment`를 구분하여 Coordinator에 반환한다. 환경 해소·exact-run 조건 감사와 -한 번의 후속 Implementation rerun dispatch는 Coordinator 소유이며 즉시 `retry`로 전이시키지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/development-notes.md b/docs/mitc4-shell-feast-eigen/development-notes.md new file mode 100644 index 0000000..b50651d --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/development-notes.md @@ -0,0 +1,33 @@ +# 이전 MFE 실행 실패와 Handoff + +## 현재 위치 + +이전 `mitc4-shell-feast-eigen`의 준비 작업은 현행 구현 절차가 아니다. 재시도 계획· +Hook/Stop trust 설정·bounded dispatch·stage 소유권과 개인 workspace 복구 명령은 제거했다. +실제 구현은 [mitc4-shell-feast-eigen2](../mitc4-shell-feast-eigen2/README.md)에서 완료됐다. +이전 pass/timeout/test 수를 새 기능의 완료 evidence로 승계하지 않는다. + +## 실패와 재발 방지 + +- Source를 출력한 stdout를 runtime error로 오분류한 문제가 있었다. exit 0의 source echo와 + 실제 helper failure를 구분하도록 교정했다. 당시 targeted RED 21 failed/16 passed → GREEN 37 passed. +- 교정 시 전체 pytest는 152 passed/1 failed였고 MSVC build는 FileTracker 접근 거부로 실패했다. + targeted pass를 전체 pass로 표시하지 않는다. Hook 쓰기 거부는 승인된 수식의 실패가 아니다. +- `FileTracker`의 `UnauthorizedAccessException`/`0x80070005`와 CMake discovery 실패는 별도로 진단한다. + 같은 환경 실패를 반복하지 말고 실제 실행 argv·compiler·dependency·exit를 확인한다. +- MSVC x64+Ninja preset을 사용하며 compiler 경로의 `Hostx64`/`HostX64` 문자열 차이로 cache가 + 재초기화된 사례가 있었다. 부모 환경 설정과 child 설정의 유효 범위를 확인한다. +- 과거 자동 실행은 362 tests/exit0 기록이 있지만 수동 build는 여전히 실패한 시점이 있었다. + 서로 다른 실행을 하나의 성공으로 합치지 않는다. 프로세스 PID/출력만으로 native exit를 추정하지 않는다. +- 출력 파일 lease 경합의 `output-busy`는 수식 오류나 reference 불일치와 다르다. + 병렬 검사끼리 같은 최종 경로를 공유하지 않는지 확인한다. +- 개인 `.harness/config.json`·`CMakeUserPresets.json`과 당시 14400/7500/7200초의 timeout은 + 그 workspace 실행 이력이다. 현재 Hook를 복원하거나 공통 기본값으로 강제하지 않는다. + +## 재사용과 evidence 경계 + +MFE 요구사항 ID·ADR, 질량·stabilization·축소 유도 및 rational 반례는 이 폴더에 남긴다. +현재의 FEAST residual stopping·모드별5%·S3 보류와 실제 실행은 eigen2가 소유한다. +환경 준비와 검사 명령은 [operations](../operations.md)·[HARNESS](../HARNESS.md)를 따른다. +원문 실행 로그·복구 계획은 Git `858e87b`의 기존 경로에 남아 있다. 현재 checkout에 +존재하지 않는 ignored artifact는 당시 evidence 위치이며 재실행·검증 근거가 새로 생긴 것은 아니다. diff --git a/docs/mitc4-shell-feast-eigen/formulation-eigen.md b/docs/mitc4-shell-feast-eigen/formulation-eigen.md deleted file mode 100644 index 7d29c8e..0000000 --- a/docs/mitc4-shell-feast-eigen/formulation-eigen.md +++ /dev/null @@ -1,286 +0,0 @@ -# 제약 후 질량 공간, 유한 spectrum과 FEAST - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `formulation-agent` -- Input contract revision: `r2` -- 기본 보고서: [formulation.md](formulation.md) - -[질량 유도 M1~M10](formulation-mass.md), [research evidence](research-evidence.md)의 -`S03`~`S08`, `P01`, `R03/R04/R07`를 적용한다. 아래 reduction은 -[r2 scale](formulation-stabilization.md)로 개선된 원형상 stabilized stiffness와 -**derived lumped mass**의 pencil에 정확히 대응한다. 기존 nonlinear trial tangent와는 별개다. - -## E1. 조립, 단위 scaling과 실제 global 제약 - -Element gather `A_e`를 stable source node/component 순서로 정의하면 -`K=sum A_e^T K_e A_e`, `M=sum A_e^T M_L,e A_e`이다. 이하 `M`은 항상 lumped이다. -Element contribution→stable COO key→고정 순서 reduction으로 두 행렬을 조립한다. -Lumped nodal block이므로 `M`의 node 간 block은 0이다. Worker는 global storage를 -동시에 갱신하지 않는다. Source identity와 equation index는 다른 번호다. - -혼합 단위를 가진 6 DOF를 그대로 Euclidean norm으로 합하지 않는다. -활성 shell의 기존 최대 edge 길이들 중 최대값 `ell>0 [L]`을 characteristic length로 -선택하고 `D=blockdiag(ell I3,I3)`를 node마다 둔다. `q=D y`에서 `y`는 무차원, -`Khat=D^T K D [ML²/T²]`, `Mhat=D^T M D [ML²]`이다. -이는 congruence이며 physics와 lambda를 변경하지 않는다. - -원 global homogeneous BC의 free injection을 `C`라 한다. 고정 DOF의 행은 0, -free DOF의 행은 하나의 1이며 free 순서는 DofManager의 stable 순서다. - -\[ -y=C y_f,\qquad K_f=C^TKhat C,\qquad M_f=C^TMhat C. \tag{E1} -\] - -Nonzero prescribed base state는 이 procedure의 입력 오류다. 먼저 local 회전을 임의 -삭제한 뒤 global BC를 적용하지 않는다. 특히 global `UR3`와 drilling은 같지 않다. - -## E2. Null/positive basis를 node마다 결정 - -각 active node의 원 질량 null은 M8로부터 `z_i=[0;d_i]` 한 방향이다. -따라서 node별 실제 free 좌표에서 null이 존재하는 필요충분조건은 -**constrained rotational component마다 해당 `d_i` 성분이 정확히 0**인 것이다. -그때 `Z_i=C_i^T z_i`는 unit null vector이며 otherwise null dimension은 0이다. -Translation constraint는 이 판정에 영향을 주지 않는다. 모든 회전이 고정이면 null도 없다. - -이 판정은 analytic nullspace와 실제 입력 BC의 교집합이다. 작은 nonzero constrained -director 성분을 임계값으로 0으로 바꾸지 않는다. 거의 정렬된 경우 작은 양의 physical -mass가 남을 수 있으며 이를 보존한다. Numerical conditioning 검증을 통과하지 못하면 -명시적 실패로 처리하고 free DOF를 추가 삭제하지 않는다. - -각 node에서 `Z_i`의 Euclidean 직교 여공간 basis를 `P_i^f`라 한다. -회전 3개가 free이면 기존 tangent basis `(a_i,b_i)`를 사용할 수 있다. Free 회전 2개 -안에 null이 있으면 그 평면에서 `d_i`에 수직인 단위벡터 하나, 회전 1개가 null이면 -positive 회전 basis는 없다. Free translation axis는 그대로 유지한다. -Null이 없으면 `P_i^f=I`다. Source component 순서, basis sign/tie는 고정한다. -Householder 등 동등한 작은 orthogonal construction을 쓸 수 있으나 physical rank를 -수치 eigenvalue cutoff로 정하지 않는다. - -\[ -P=\operatorname{blockdiag}(P_i^f),\quad Z=\operatorname{blockdiag}(Z_i),\quad -[P\ Z]^T[P\ Z]=I,\quad M_p=P^TM_fP\succ0,\quad M_fZ=0. \tag{E2} -\] - -여기서 `P_i^f`와 [M2의 tangent projector](formulation-mass.md)는 서로 다른 기호다. -실제 positive dimension `n=cols(P)`, null dimension `nz=cols(Z)`이다. -Reference의 full clamped flat mesh에서는 625개 interior node, -`nf=3750`, `nz=625`, `n=3125`가 예상된다. 실제 assembly와 rank evidence로 확인한다. - -## E3. 개선된 stiffness에서 decoupling의 정확한 증명 - -공통 node director는 [shell geometry](../../src/fesa/model/shell_geometry.cpp)가 한 번 -정의하고 [ElementFactory::CreateShell](../../src/fesa/elements/element_factory.cpp)이 -node identity로 각 element에 전달한다. [MITC4 kernel](../../src/fesa/elements/mitc4_shell.cpp)의 -`PhysicalTransformation20`, `DrillingTransformation4`, `Stiffness`에서 M4의 구조를 확인했다. -옛 계수만 [S1/S2](formulation-stabilization.md)로 대체하며 모든 incident element의 -`k_d,e`는 finite positive다. Physical kernel과 공통 director·nodal drill map은 그대로다. - -한 node에만 `[0;d_i]`가 있는 full vector `z_i`에 대해 `T_p A_e z_i=0`이다. -Drilling 부분은 해당 node에만 작용하므로 - -\[ -Khat z_i=\kappa_i z_i,\qquad -\kappa_i=\sum_{e\ni i}k_{d,e}>0,\qquad -K_f Z=Z\operatorname{diag}(\kappa_i). \tag{E3} -\] - -마지막 등식은 E2에서 `z_i`가 **실제로 free space에 있을 때** 성립한다. -따라서 - -\[ -K_{pz}=P^TK_fZ=0,\quad K_{zz}=Z^TK_fZ=\operatorname{diag}(\kappa_i)\succ0, -\quad K_p=P^TK_fP,\qquad K_p p=\lambda M_p p. \tag{E4} -\] - -Finite mode의 massless 성분은 `z=0`이다. 이 projection은 arbitrary small coupling을 -버리는 근사가 아니라 승인된 physical/drilling separation의 항등식이다. -Null이 없는 부분 제약 node에서는 `P=I`이고 개선된 drilling contribution이 `K_p`에 -그대로 남는다. 이를 빼면 원 constrained stabilized pencil을 바꾸므로 금지한다. -여기서 원 pencil은 r2의 실제 BC 적용 후 K/M이다. 옛 K와 새 K의 spectrum 동일성은 -요구하지 않는다. S3의 complete K 공변성은 이 partial-BC contribution까지 포함한다. - -실제 floating-point matrix와 basis의 `M_f Z`, `K_fZ-Z diag(kappa)`, `P^T Z`를 -별도 evidence로 남긴다. 증명된 analytic null만 구조적으로 제거하고 계산된 tiny coupling을 -근거 없이 threshold로 버리지 않는다. 이 항등식의 roundoff 검증 및 복원 후 full free -residual이 NR 기준을 넘으면 assembly/director/conditioning 실패로 중단한다. -추가 massless mode를 찾아 제거하거나 개선된 K를 재조정하지 않는다. -S5의 nonlinear Hessian에는 corotation coupling이 있으므로 E3/E4를 모든 nonlinear -상태, preload 또는 prestressed eigenproblem에 적용하지 않는다. - -## E4. 일반 Schur 식과 비정상 rank의 의미 - -E3의 구조가 없는 일반 symmetric pencil을 비교하면, `Kzz`가 가역일 때만 - -\[ -z=-K_{zz}^{-1}K_{zp}p,\quad -(K_{pp}-K_{pz}K_{zz}^{-1}K_{zp})p=\lambda M_p p. \tag{E5} -\] - -이는 massless row를 푼 정확한 elimination이며 massive DOF의 근사 Guyan reduction이 -아니다. 예를 들어 `K=[[6,2],[2,4]]`, `M=diag(2,0)`이면 -`lambda=5/2`, `z=-p/2`이다. 첫 행만 남기는 `lambda=3`은 잘못이다. -E5는 independent small-pencil 검산과 잘못된 projection을 잡는 기준이다. -이 Feature의 production shell 경로에는 E3이 적용되므로 일반 dense Schur 구현을 요구하지 -않는다. E3과 불일치하는 input을 E5로 자동 fallback하여 승인 geometry 문제를 숨기지 않는다. - -- `nz=0`: null 처리 없이 실제 constrained `Kf,Mf`의 문제다. -- Local positive rank 0: 모든 free DOF가 null이면 해당 node의 finite 좌표는 없고 - 양의 `Kzz`에 의해 그 free coordinate는 0으로 복원한다. Fully constrained node도 - finite 좌표 0개다. 다른 node의 유효 finite 좌표는 계속 보존한다. -- Global `n=0` 또는 `N>n`: 요청 모드가 존재할 수 없으므로 명시적 model/solve 실패다. - 정적 해석의 유효 `0×0 Kff` 계약과 이 양의 mode-count 요구를 혼동하지 않는다. -- 예상 `Kzz`가 singular/nonpositive이거나 활성 node에 mass contribution이 없음: - 유효 shell의 E3 전제가 깨진 것이다. Common `K/M` null이면 임의 lambda에 대한 - indeterminate direction이며 ordinary finite eigenmode가 아니다. 제거하거나 pseudoinverse, - stiffness/mass epsilon으로 정규화하지 않고 진단한다. -- 일반 indefinite `Kzz`의 singular/nonzero `Kpz` case는 descriptor-pencil의 추가 - constraint를 요구한다. 이번 positive stabilized shell과 다른 문제이며 자동 해석하지 않는다. - -## E5. SPD whitening, 복원과 sparsity - -`M_p`는 node별 최대 `6×6` SPD block이다. 각 block을 Cholesky하여 -`M_p=L L^T`를 얻고 다음을 정의한다. - -\[ -A=L^{-1}K_pL^{-T},\quad p=L^{-T}x,\quad -A x=\lambda I x,\quad -\phi=D C P L^{-T}x. \tag{E6} -\] - -Inverse를 dense global matrix로 만들지 않고 작은 block triangular solve로 congruence를 -구성한다. `phi`는 source node의 global 6 DOF로 복원되고 constrained entries는 정확히 0이다. -`phi^T M phi=x^T x`다. Identity mass를 전달하는 E6도 실제 lumped mass에서 얻은 -generalized SPD 문제다. Consistent mass 또는 인공 unit physical mass로 바꾼 것이 아니다. - -Projection/whitening은 node 간 topology를 늘리지 않는다. 기존 node coupling마다 작은 -dense block만 생기며 전체 `O(n²)` Schur matrix와 dense inverse를 피한다. -Sparse shifted FEAST factorization 자체의 fill은 별도 존재한다. Full `M_C`는 element별 -`24×24`와 세 `4×4` moment로 검증할 수 있고 global dense consistent matrix는 불필요하다. -Allocation/nnz/factorization memory 실패는 불완전 모드의 성공이 아니라 명시적 failure다. - -## E6. 유한 search interval과 요청 개수 - -요청 `N`은 `.inp *FREQUENCY`의 양의 정수이며 현재 reference는 10이다. -Reference Value/Freq/행수는 interval, scale, count 또는 parameter 선정에 사용하지 않는다. - -먼저 `s=||A||inf [T^-2]`를 안정된 합으로 계산한다. `s>0`이면 `B=A/s`로 두고, -반환값은 `lambda=s mu`다. `A=0`이면 `s=min_e E_e/(rho_e ell²)>0`라는 -모델 유래 time scale을 사용하며 `B=0`이다. 이 zero-matrix case도 N개의 0 모드를 -FEAST에서 계산·검증한다. Invalid/underflow/overflow scale을 임의 1로 바꾸지 않는다. - -각 행의 off-diagonal absolute sum을 `r_i`라 하면 Gershgorin에 의해 -`min_i(Bii-ri)<=mu<=max_i(Bii+ri)`다. 안정된 directed-outward accumulation 또는 -동등하게 증명된 roundoff bound를 포함하여 finite enclosure `[gL,gU]`를 만든다. -`B=0`에서는 알고리즘용 dimensionless enclosure `[-1,1]`을 사용한다. -Nonzero B의 endpoint margin은 NR가 정할 dimensionless coefficient와 `||B||inf` 및 -endpoint ULP로 결정하고, outward `nextafter`를 적용해 `a0=N`인 마지막 safe upper를 쓴다. - Representable midpoint가 없거나 NR endpoint separation 폭에 도달하면 subdivision을 - 끝낸다. 경계에 있는 반복 고유치의 일부만 count하도록 tolerance를 조정하지 않는다. -3. 불필요하게 먼 lower bound를 줄이기 위해 `a=a0`, 위에서 얻은 `b=hi`로 시작한다. - `v=(a+b)/2`의 prefix count가 0이면 `a=v`로 이동하고, 양수이면 이 하한 축소를 끝낸다. - 따라서 `(a0,a)`의 empty-prefix evidence를 잃지 않는다. 아주 작은 고립 cluster에서 - 넓은 구간이 검색 실패를 유발하는 Intel의 경고를 이 과정과 후검증으로 다룬다. -4. 최종 `(a,b)`에서 다시 count하여 `c>=N`이고 알려진 prefix와 일치함을 확인한다. - Capacity는 `m0=min(n,max(c+8,ceil(3c/2)))`로 한다. `c=n`이면 `m0=n`이다. - Checked integer arithmetic을 쓰며 큰 multiplicity도 전체 count를 수용한다. -5. Solve 성공 후 모든 `c`개를 독립 검증하고 정렬하여 첫 N개를 결과 candidate에 넣는다. - 같은 eigenvalue의 multiplicity를 지우거나 평균내지 않는다. N번째가 repeated/cluster의 - 내부에 있으면 내부 계산 group은 보존하고 출력 row는 정확히 N개다. - -Midpoint·endpoint 이동은 overflow-safe하게 수행한다. NR는 count-call budget, -endpoint separation coefficient와 perturbation 횟수를 구현 전에 고정한다. Budget은 -각 search 및 endpoint 재시도까지 포함하는 유한 정수다. `-5` 등의 endpoint 실패 시 -기록된 bracket 안에서 NR가 정한 간격으로 양옆의 endpoint 후보를 순서대로 평가하며, -성공한 prefix/count evidence 없이는 bracket을 갱신하지 않는다. 마지막 valid bracket이 -없거나 count monotonicity/total count가 맞지 않으면 실패다. Search 최적화 budget에 -도달하면 이미 검증된 enclosing bracket을 쓸 수 있으나 실패한 count를 성공으로 바꾸지 않는다. - -Postsolve에서는 returned `m=c`, finite paired vectors/values, Gram rank, interval 내부 -및 endpoints와의 separation을 확인한다. Endpoint에 너무 가깝거나 `info=1/2/3`, -count/solve mismatch이면 NR가 정한 유한 회수 안에서 safe bracket 확대·재count·capacity -확대만 허용한다. 매번 count/solve history를 보존한다. 그 뒤에도 불일치하면 실패하고 -부분 모드 또는 다른 eigensolver로 fallback하지 않는다. Formulation은 이 수학적 알고리즘을 -NR에 인계한다. 구현 진입 bundle은 다음 stage가 수치값·budget을 고정한 뒤 완성된다. - -Full enclosing bound, empty-prefix, interval count와 solve-count/Gram 검증은 낮은 N개의 -누락을 탐지하는 서로 다른 evidence다. Intel의 documented total count를 모든 conditioning, -endpoint 및 floating-point 상황의 completeness theorem으로 확대하지 않는다. -독립 known-spectrum의 zero/negative/cluster/repeated/size1/request=n case와 실제 -설치 runtime 검증이 필수 연결점이며 선택 및 수치 기준은 NR가 소유한다. - -## E7. FEAST 경계와 deterministic 실행 - -Actual eigenpairs는 `dfeast_scsrgv`로 E6의 `(A,I)` 또는 E6에서 동일하게 scale한 -`(B,I)`를 풀어 구한다. Real symmetric, SPD second matrix, `n>0`, -`00 [L]`, section의 material에서 결정된 일정 density `rho>0 [M/L³]`를 사용한다. -`E>0 [M/(LT²)]`, `-1=0`이다. Interpolated director를 normalization하여 M1의 geometry를 -변경하지 않는다. 기존 kernel의 `EvaluateGeometry`와 같은 Jacobian 및 부호를 사용한다. -기존 [정식화](../linear-static-mitc4-shell/formulation.md)의 §§3~5, 8~11이 -director 생성, tangent frame `(a_i,b_i,d_i)`, 기하 허용 조건과 MITC strain을 소유한다. - -전역 nodal 좌표는 `q_i=[u_X,u_Y,u_Z,theta_X,theta_Y,theta_Z]^T`이다. -`u [L]`, `theta [1]`이고 양의 director 변화는 `theta cross d`이다. 다음 map을 정의한다. - -\[ -S_i=-[d_i]_\times,\quad P_i=I-d_i d_i^T=S_i^TS_i,\quad -G_i(z)=[I_3\ \ zS_i],\quad H=[N_1G_1\ \cdots\ N_4G_4]. \tag{M2} -\] - -따라서 입자 변위/속도는 `u(X)=Hq`, `v(X)=H q_dot`이다. Physical nodal coordinates -`[u_X,u_Y,u_Z,alpha,beta]`에서 회전 열은 `[-z b_i, z a_i]`이다. -`alpha=a_i^T theta`, `beta=b_i^T theta`, `gamma=d_i^T theta`이며 -`S_i d_i=0`이다. 20↔24 변환은 기존 `PhysicalTransformation20`/`DrillingTransformation4` -그대로이다. MITC assumed shear와 `5/6` shear factor는 strain/stiffness에만 작용한다. -속도 보간과 질량에 이 factor를 적용하지 않는다. - -## M2. Strong/weak form과 기존 stiffness - -원형상·무응력 상태의 소변형 무감쇠 자유진동에 대해 continuum parent는 -`rho u_ddot = div sigma`, `sigma=C_ps:epsilon`, `sigma_33=0`이다. -자유 표면·자유 edge의 generalized traction은 0이고 essential data는 동차 global DOF -제약이다. 허용한 thickness 운동학과 MITC projection에 제한한 약형은 - -\[ -\int_{\Omega_0}\rho\,\delta u^T\ddot u\,dV+ -\int_{\Omega_0}\delta\bar e^T C_5\bar e\,dV+ -\delta\gamma^T K_d\gamma=0. \tag{M3} -\] - -원형상 physical elastic Hessian과 quadrature는 기존 stiffness 계약을 유지한다. - -\[ -C_5=\operatorname{diag}\left( -\frac{E}{1-\nu^2}\begin{bmatrix}1&\nu&0\\\nu&1&0\\0&0&(1-\nu)/2\end{bmatrix}, -\frac56\frac{E}{2(1+\nu)}I_2\right), -\quad K_{20}=\sum_{g\in2\times2\times2}\bar B_g^TC_5\bar B_gJ_gw_g, -\] -\[ -K_e=T_p^TK_{20}T_p+T_d^T(k_d I_4)T_d,\quad -k_d=10^{-3}k_{ref,e}. \tag{M4} -\] - -`bar e=[epsilon11,epsilon22,gamma12,gamma13,gamma23]`이다. `k_ref,e`는 -[r2 scale S1](formulation-stabilization.md#s1-초기-physical-trace로-고정하는-단일-scale)으로 계산한다. -기존 [정식화 §12](../linear-static-mitc4-shell/formulation.md)의 physical kernel·변환· -drilling map은 유지하고 옛 최소 대각 scale만 사용자 승인 범위에서 대체한다. -[현재 source](../../src/fesa/elements/mitc4_shell.cpp)는 아직 옛 식이며 구현 완료 근거가 아니다. -Drilling energy는 수치 stabilization이며 물리 strain/stress가 아니다. -`K_e q_e`는 내부 elastic generalized force, `M_L,e q_ddot,e`는 inertia다. -최종 반이산식은 `M_L q_ddot + Kq=0`이다. Harmonic ansatz -`q(phi,tau)=phi cos(omega tau)`에서 `Kphi=lambda M_L phi`, `lambda=omega² [T^-2]`를 얻는다. -새 constitutive/history state, geometric stiffness, damping, preload, nonlinear tangent, -time integrator 또는 modal stress/reaction recovery는 없다. - -## M3. Consistent matrix와 충분한 quadrature - -`T_C=1/2 integral rho |H q_dot|² dV`에서 - -\[ -C^{(k)}_{ij}=\int_{\Omega_0}\rho N_iN_j z^k dV\quad(k=0,1,2), -\qquad -(M_C)_{ij}=\begin{bmatrix} -C^{(0)}_{ij}I_3&C^{(1)}_{ij}S_j\\ -C^{(1)}_{ij}S_i^T&C^{(2)}_{ij}S_i^TS_j -\end{bmatrix}. \tag{M5} -\] - -세 scalar moment matrix는 각각 symmetric `4×4`이다. 차원은 `C(k) [M L^k]`, -mass의 `uu/u-theta/theta-theta` block은 각각 `M/ML/ML²`이다. -`M_C [24×24]`는 global block 형식이며 20 physical mass의 congruence와 동일하다. -원본 `M_C`와 그것을 구성한 `C(0..2)`를 완성·검증한 후 lumping 입력으로 사용한다. -Global consistent sparse matrix를 eigen solve에 조립할 필요는 없지만 계산 원본을 -lumped 결과로 덮어쓰거나 별도의 mass를 생성한 뒤 consistent에서 유도했다고 부르지 않는다. - -M1은 각 자연 좌표에 최대 1차이다. Jacobian의 세 열의 최대 다항 차수는 각각 -`(0,1,1)`, `(1,0,1)`, `(1,1,0)`이므로 determinant의 성분별 최대 차수는 `(2,2,2)`다. -`Ni Nj z^k J`의 차수는 최대 `(4,4,k+2)`, 즉 `(4,4,4)`이다. 따라서 **질량에는 -3×3×3 Gauss–Legendre**를 사용한다. 각 축의 points는 -`[-sqrt(3/5),0,+sqrt(3/5)]`, weights는 `[5/9,8/9,5/9]`이다. -3-point rule의 5차 정확성으로 M5의 모든 항을 이 geometry에서 정확 적분한다 -(floating-point roundoff 제외). 추가 density/thickness 변화를 가정한 결론이 아니다. - -Loop 순서는 증가하는 `xi`, 그 안의 `eta`, 가장 안의 `zeta`, 이후 `i<=j`, `k=0,1,2`로 -고정하고 대칭 항을 복사한다. Mass 계산의 27개 실제 평가점에서도 기존 geometry -predicate를 적용한다. `J<=0`, nonfinite frame/basis 등의 실패를 weight 절댓값, -점 생략이나 flat replacement로 수리하지 않는다. 기존 stiffness 8-point 경로는 변경하지 -않는다. 이 검사는 27점에서의 positivity를 보장하며 volume 모든 위치의 injectivity에 -대한 새 theorem이나 기존 warp/curvature 범위의 확대를 주장하지 않는다. - -왜곡된 flat element라도 같은 식을 쓴다. 서로 다른 director가 있으면 `J(zeta)`의 1차 항 -때문에 `C(1)`이 0이 아닐 수 있다. Centered section만을 이유로 coupling을 버리거나 -`C(2)=t² C(0)/12`를 일반식으로 사용하지 않는다. - -## M4. 계산된 consistent moment에서 nodal block 유도 - -각 node의 세 row sum과 질량 block을 정의한다. - -\[ -m_i=\sum_j C^{(0)}_{ij},\quad h_i=\sum_j C^{(1)}_{ij},\quad -j_i=\sum_j C^{(2)}_{ij},\qquad -L_i=\begin{bmatrix}m_iI_3&h_iS_i\\h_iS_i^T&j_iP_i\end{bmatrix}, -\quad M_{L,e}=\operatorname{blockdiag}(L_1,L_2,L_3,L_4). \tag{M6} -\] - -이는 scalar moment row sum 후 tensor로 재구성하는 **nodal block lumping**이다. -Global 전체 행의 합, absolute row sum, diagonal scaling 또는 nodal quadrature와 -혼용하지 않는다. 같은 source node의 incident element block은 기존 source element 순서로 -합한다. 공통 `d_i` 때문에 조립 후에도 M6 형태다. Local와 global에서 diagonal이 아닌 -`6×6` coupling은 허용한 lumped mass의 일부다. - -`sum Nj=1`을 M5에 대입하면 정확히 - -\[ -(m_i,h_i,j_i)=\int\rho N_i(1,z,z^2)dV,\quad -L_i=\int\rho N_i G_i(z)^TG_i(z)dV. \tag{M7} -\] - -`m_i>0`, `j_i>0`, `m_i j_i-h_i²>0`이다. 마지막 부등식은 양의 measure에 대해 -`z`가 상수가 아닌 점(양의 두께 및 서로 다른 thickness Gauss점)과 strict -Cauchy–Schwarz에서 따른다. 이를 이용하면 - -\[ -q_i^TL_iq_i=m_i\left|u_i+\frac{h_i}{m_i}S_i\theta_i\right|^2+ -\left(j_i-\frac{h_i^2}{m_i}\right)|S_i\theta_i|^2. \tag{M8} -\] - -따라서 `L_i`의 rank는 5, null은 정확히 `[0;d_i]`의 span이다. -`zbar_i=h_i/m_i [L]`, `j_i-h_i²/m_i [ML²]`는 node에 할당된 thickness -measure의 centroid와 central tangent inertia다. 음/영 variance나 nonfinite를 clamp하지 -않고 mass 검증 실패로 처리한다. 모든 노드에 최소 한 활성 shell이 연결되어야 한다. - -M6의 유도 연결은 `C(k)` 원본→row sum→block reconstruction으로 추적한다. -동시에 M7을 독립 직접 적분하여 두 결과의 일치를 검증할 수 있다. -서로 다른 nodal frame의 rotary component를 직접 더하지 않는다. - -## M5. 보존되는 양과 근사되는 양 - -모든 등식은 동일 원형상·density와 quadrature measure에 관한 것이다. - -1. 총 병진 질량 `m=sum mi=integral rho dV` 및 모든 uniform translation의 kinetic - energy가 consistent와 정확히 같다. 각 방향의 total mass가 `m`이며 `trace(Muu)`를 - 총 질량이라고 정의하지 않는다. -2. Thickness scalar moment는 `sum hi=integral rho z dV`, - `sum ji=integral rho z² dV`다. 각 nodal tangent tensor는 `ji Pi`이고 drilling inertia는 - 0이다. 이는 물리 director의 회전 관성 정의이며 모든 rigid rotation의 전체 tensor를 - consistent와 같게 만드는 계약은 아니다. -3. Lumping measure의 위치를 `x_i(z)=X_i+z d_i`로 보면 spatial first moment - `sum_i(mi Xi+hi di)=integral rho X dV`이므로 center of mass가 보존된다. - Node의 `Xi`에만 `mi`를 놓고 `hi di`를 누락하면 곡면에서 이 등식이 깨진다. -4. `v_i(z)=u_dot_i+z S_i theta_dot_i`에 대해 Jensen identity가 다음을 준다. - -\[ -\dot q^T(M_L-M_C)\dot q= -\frac12\int\rho\sum_{i,j}N_iN_j|v_i-v_j|^2dV\ \ge0. \tag{M9} -\] - -두 kinetic energy의 차이는 M9의 절반이다. Equality는 positive-weight point마다 모든 -`v_i`가 같을 때 성립한다. 일반 속도장 및 rigid angular motion의 orbital inertia는 -달라질 수 있으며 lumped 값이 그 quadratic form에서 작아지지 않는다. -Rigid spatial rotation은 `u_i=Omega cross Xi`, `theta_i=Pi Omega`로 재현된다. -이때 M9는 nodal 위치 분산으로 생기는 angular-inertia 차이를 정확히 설명한다. -두 spectrum의 동일성, arbitrary mesh의 특정 수렴 차수 또는 Abaqus lumping 동등성을 -acceptance로 요구하지 않는다. Smooth refinement에서 차이가 감소하는지는 독립 evidence다. - -Proper orthogonal global rotation `Q`에 대해 `D_Q=blockdiag(Q,Q)`를 두면 -`S(Qd)=Q S(d) Q^T`, `L'_i=D_Q L_i D_Q^T`이며 consistent에도 같은 congruence가 -성립한다. 이는 tangent basis 선택과 독립적이다. Constraint도 같은 물리 공간으로 변환한 -경우에만 spectrum의 좌표 불변성을 비교한다. - -## M6. 직접 적분 가능한 평판 oracle - -평행 director와 affine 직사각형 면적 `A`에서는 - -\[ -C^{(0)}=\frac{\rho t A}{36} -\begin{bmatrix}4&2&1&2\\2&4&2&1\\1&2&4&2\\2&1&2&4\end{bmatrix}, -\quad C^{(1)}=0,\quad C^{(2)}=\frac{t^2}{12}C^{(0)}. \tag{M10} -\] - -각 node는 `mi=rho t A/4`, `hi=0`, `ji=rho t³ A/48`이다. -이는 production quadrature를 호출하지 않고 다항 적분으로 얻는 oracle다. -곡면에서는 M5~M9와 independent volume integration을 사용한다. -두께 `t` 변경 시 stiffness와 rotary inertia는 다른 차수로 변하므로 전체 spectrum에 -하나의 thickness power law를 강제하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/formulation-stabilization.md b/docs/mitc4-shell-feast-eigen/formulation-stabilization.md deleted file mode 100644 index f56e989..0000000 --- a/docs/mitc4-shell-feast-eigen/formulation-stabilization.md +++ /dev/null @@ -1,243 +0,0 @@ -# 좌표 공변적인 drilling scale과 적용 경계 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `formulation-agent` -- Input contract revision: `r2` -- 기본 보고서: [formulation.md](formulation.md) - -승인 근거는 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합), -`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및 [기존 계약 대체 범위](requirements.md#r2의-기존-계약-대체-범위)다. -[연구 R07](research-evidence.md#r07--r2-stabilization-근거와-영향)의 후보에서 아래 하나를 선택한다. -식 S1~S8은 FESA 계약에 대한 유도이며 외부 solver의 stabilization과 동일하다는 주장이 아니다. - -## S1. 초기 physical trace로 고정하는 단일 scale - -[M4](formulation-mass.md#m2-strongweak-form과-기존-stiffness)의 원형상 physical matrix를 -`K20^0`라 한다. 각 source node i의 local physical 순서는 `[uX,uY,uZ,alpha,beta]`이고, -`R_i [2×2]`는 그 matrix에서 `alpha,beta`에 해당하는 principal block이다. 두 회전은 -orthonormal tangent basis의 무차원 성분이다. Element별로 - -\[ -k_{ref,e}=\frac18\sum_{i=1}^4\operatorname{tr}R_i, -\qquad k_{d,e}=\eta_d k_{ref,e},\qquad \eta_d=10^{-3}, -\qquad K_d^l=k_{d,e}I_4. \tag{S1} -\] - -`k_ref,k_d,R_i`의 단위는 force·length=`ML²/T²`다. Translation 대각, lumped/consistent -mass, density, constrained tangent, trial tangent 또는 reference 오차는 이 식의 입력이 아니다. -초기 physical K의 **여덟 회전 대각 전체**를 평균하며 양수인 항만 선별해 분모를 바꾸지 않는다. -기존 coefficient `10^-3`와 네 node에 같은 scalar를 쓰는 numerical 역할을 유지한다. -새 사용자 parameter·coefficient sweep·reference tuning은 없다. - -Trace 평균은 모든 방향의 회전 강성을 사용하면서 eigenvalue subtraction과 positive -nodal-block 선별을 피한다. 최소 spectral 값도 불변량이지만 이번 scale에 필요하지 않은 -작은 고유값 conditioning 문제를 추가한다. 이는 R07 후보의 단순성에 따른 선택이며, -LAPACK이 FESA의 평균 규칙을 제안한다는 뜻이 아니다. 작은 고유값의 상쇄 한계는 -[LAPACK DLAEV2 원문, Further Details](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html)에 있다. - -## S2. Positive inventory, 유효 geometry와 계산 순서 - -기존 승인 geometry·director·section·material 검증을 먼저 적용한다. 기존 8개 stiffness -점에서 `J_g>0,w_g>0`, `t>0,E>0,-10`이고 nodal director가 incident element 사이에 공통이므로 -[E3/E4](formulation-eigen.md#e3-개선된-stiffness에서-decoupling의-정확한-증명)의 -`K_f Z=Z diag(sum_e k_d,e)`, `Kzz≻0`, `Kpz=0`가 그대로 성립한다. E2의 실제 -global BC와 null의 교집합을 먼저 구한다. Finite mode의 null coefficient는 0이며 -positive 공간으로의 투영은 개선된 원 pencil의 모든 finite spectrum을 보존한다. -Null이 없는 partial BC에는 개선된 drilling term이 finite 공간에 남는다. 이 항을 제거하거나 -옛 spectrum과 같게 조정하지 않는다. Consistent→lumped의 spectrum equality는 별개로 요구하지 않는다. - -## S5. Nonlinear objective potential와 초기 고정 lifecycle - -기존 [nonlinear §10.1~10.4](../nonlinear-static-newton-raphson/formulation.md#10-objective-numerical-drilling-contract)의 -polar element corotation `R_e`, total nodal rotation `R_i`, minimal swing `S_ei` 및 -`gamma_i=atan2(s_gamma,i,c_gamma,i)`를 그대로 사용한다. 초기 reference physical K20만으로 -S1을 한 번 계산하고 모든 trial/commit/increment/iteration 및 rollback 동안 같은 scalar를 쓴다. -State-dependent scale·trial 재선정·기존 objective gamma의 교체는 승인 범위 밖이다. - -\[ -Dk_{d,e}=D^2k_{d,e}=0,\quad -\Pi_d^e=\tfrac12 k_{d,e}\gamma^T\gamma,\quad -r_d^e=k_{d,e}D_\gamma^T\gamma, -\] -\[ -K_d^e=k_{d,e}\left(D_\gamma^TD_\gamma+ -\sum_i\gamma_i H_i^\gamma\right),\qquad -D_\gamma=D\gamma,\quad H_i^\gamma=D^2\gamma_i. \tag{S6} -\] - -모든 polar/swing/rotation/atan2 미분과 branch validation은 기존 계약을 유지한다. -Positive k_d는 potential 비음성과 pure-drill 양의 작용을 뜻한다. 일반 nonlinear Hessian은 -`sum gamma_i H_i` 때문에 모든 상태에서 SPD라는 결론이 없다. 초기 `gamma=0`에서도 -`D_gamma`에는 corotation coupling이 있으므로 이를 linear `T_d`와 동일시하지 않는다. -기존 pure-drill directional quadratic form과 physical 선형극한·Newton tangent consistency를 -각자의 계약대로 재검증하며 complete nonlinear Hessian의 모든 entry가 linear M4와 같다고 요구하지 않는다. - -같은 물리 nonlinear 상태를 G로 표현하면 모든 rotation tensor와 initial director가 -conjugation/rotation되고 scalar gamma는 같다. Initial S1도 같으므로 potential은 불변이다. -Work-conjugate Cartesian perturbation에 대해 chain rule로 residual과 tangent의 공변성이 따른다. -Superposed finite rigid motion에서는 기존 `R_e^+=R R_e`, `R_i^+=R R_i`에 의해 gamma가 -같고, stress-free rigid state에는 gamma=0·physical strain=0이다. 따라서 finite rigid motion의 -영에너지 및 objective rigid orbit를 따른 변분 검증을 유지한다. S4의 linear tangent-projected -UR field를 nonlinear total triad 회전에 대신 넣지 않는다. - -현재 [nonlinear 생성 경로](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 -`NonlinearMitc4Shell::Create`는 초기 linear `Stiffness()`의 `drilling_stiffness`를 받아 저장한다. -이 경계에서 S1의 같은 값을 사용해야 한다. 물리 strain/material, exact external moment work, -Newton/line-search/cutback, accepted state 및 physical output은 기존 계약이다. -S4/E3 projection은 이 nonlinear Hessian·preload·prestressed eigen으로 확장하지 않는다. - -## S6. NR-MFE-001의 새 algebraic target과 정적 대응 - -[NR 소유 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례)의 독립 적분 block을 -입력 근거로 사용한다. 그 geometry·source BC·material 및 옛 실패 이력은 보존한다. -각 corner에서 `R_aa=49/12`, `R_bb=23/6`, `R_ab=±1/8`이므로 - -\[ -k_{ref}=95/24,\quad k_d=19/4800,\quad -M_{ff}=3/50,\quad K_{ff}=10369/7500,\quad -\lambda=10369/450=23.042222\ldots . \tag{S7} -\] - -Global Z축 45° 회전 뒤 재생성한 tangent basis에서도 trace는 `95/12`이므로 같은 식이다. -이는 production/FEAST 실행 결과가 아닌 r2 formula의 exact target이다. 독립 재계산과 -runtime에서 반례가 해소되는지는 NR/Implementation이 각각 검증한다. - -정적 대응에는 node1에 `m=(5/3)M0 b`, 다른 load는 0을 사용한다. 여기서 -`b=(-4/5,0,3/5)`와 `M0`는 finite 비영 moment amplitude `[force·length]`다. -`d·m=0`, `mZ=M0`이므로 기존 physical moment admissibility를 지킨다. 단순 `m=M0 eZ`는 -drilling 성분을 가져 기존 load 계약을 위반하므로 사용하지 않는다. 같은 모든 DOF 고정, -node1 URZ만 free에서 - -\[ -\theta_{1Z}=\frac{M0}{K_{ff}},\quad -q_{constrained}=0,\quad r=Kq-F. \tag{S8} -\] - -회전된 input에서는 `m'=Gm`을 component load로 주고, `mZ'=M0`와 같은 BC를 유지한다. -Supported component BC/load만으로 `thetaZ`, complete response·full reaction의 공변성을 -검증할 수 있다. Physical recovery와 numerical contribution의 의미는 합치지 않는다. - -## S7. 대체·보존 범위와 필수 verification - -기존 linear `FESA-REQ-LSMITC4-034`, `056`의 최소 positive diagonal 선정·그 공식 검증만 -S1/S2로 대체한다. 기존 `036`의 invalid positive inventory 의미는 S2로 유지한다. -Nonlinear §10.3은 초기 scale 식만 대체하고 §10.1/10.2/10.4 및 frozen lifecycle은 유지한다. -기존 feature 문서·과거 실패 evidence를 소급 수정하지 않는다. - -필수 수학 검증은 S1 직접 평균/단위/zero inventory·잘못된 finite/sign 처리, -독립 node별 tangent 재생성과 global geometry 회전의 S3/S4, S7/S8의 supported partial BC, -physical six rigid modes와 pure drilling rank/separation, E3의 KZ/MZ/Kpz/Kzz 및 원 free -residual이다. Nonlinear은 같은 초기 scale·immutability, objective rigid motion, -exact first/second directional derivatives·물리 선형극한·정적 평형/reaction/energy·rollback을 -기존 계약으로 재검증한다. Density 없는 기존 static 모델도 계속 유효하다. - -실행해야 하는 기존 `shell`, `shellNL`, `shellNL-meshfine` 및 linear-limit closure portfolio와 -후속 meshfine-02 이력의 구분, source identity, U blocking/UR warning-only, reaction review-only는 -[requirements evidence의 단일 portfolio](requirements-evidence.md#r2-승인-범위와-정적-재검증)를 따른다. -새 eigen 외부 비교는 지정 input/TXT의 10개 Value만 사용한다. Static reference를 eigen -mode-shape gate로 추가하거나 기존 static 회귀를 Value-only를 이유로 삭제하지 않는다. -Numerical threshold·필수 case 구체화·FEAST control/budget/seed와 독립 반례 해소 판정은 NR, -TDD/runtime/reference 실행은 Implementation, 독립 물리 판단은 Physics 소유다. diff --git a/docs/mitc4-shell-feast-eigen/formulation-verification.md b/docs/mitc4-shell-feast-eigen/formulation-verification.md deleted file mode 100644 index 11fd636..0000000 --- a/docs/mitc4-shell-feast-eigen/formulation-verification.md +++ /dev/null @@ -1,298 +0,0 @@ -# 질량과 modal candidate의 검증식 및 Numerical Review 인계 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `formulation-agent` -- Input contract revision: `r2` -- 기본 보고서: [formulation.md](formulation.md) - -[질량 식 M1~M10](formulation-mass.md), [축소·복원 식 E1~E8](formulation-eigen.md), -[개선된 scale·공변성 S1~S8](formulation-stabilization.md)의 -기호를 사용한다. 이 문서는 측정량과 zero branch를 정의하며 수치 acceptance 값과 -필수 benchmark 선정은 Numerical Review가 독립 검토하여 고정한다. -외부 기준의 수치는 [TOLERANCE](../TOLERANCE.md)를 그대로 적용한다. - -## V1. 공통 scale과 zero branch - -행렬·벡터 norm을 계산하기 전에 E1의 길이 congruence를 적용한다. 질량은 모두 -`ML²`, stiffness는 `ML²/T²` 단위가 된 행렬에서 norm을 계산한다. Element-only -oracle에서는 `ell=Le`를 사용하고 assembled 비교에는 동일 global `ell`을 사용한다. -Norm과 sum-of-squares는 overflow/underflow를 피하는 scaled accumulation을 사용한다. -입력/행렬/각 eigenpair가 finite인지 먼저 검사한다. - -이 문서의 모든 ratio `a/b`는 `b>0`에서만 계산한다. `a=b=0`이면 해당 항등식의 -zero-case metric은 0이다. `b=0,a!=0`이면 named zero-scale failure이며 무한값/NaN -metric으로 성공 결과를 만들지 않는다. `max(1,b)`, arbitrary floor 또는 zero clamp는 없다. - -대칭성은 `eta_sym(Q)=||Q-Q^T||F/||Q||F`이다. Diagonal copy로 생성한 symmetry와 -독립 quadratic-work 검증은 구분한다. Cross-basis equality `R=S`는 -`||R-S||F/(||R||F+||S||F)`로 측정한다. Mass/stiffness를 같은 norm의 분모에 직접 더하지 -않고 필요한 lambda나 시간 scale을 곱한다. - -## V2. 질량, rank와 보존 검증 - -- M10의 entrywise scalar oracle와 `M_C` quadratic form을 독립 적분과 비교한다. - 계수·부호/두께 차수가 같은지를 component별 확인한 뒤 전체 norm을 사용한다. -- M5에서 구성한 `M_C`와 원본 moment, M6의 row-sum 결과, M7의 independent direct - integration을 따로 비교한다. 변조한 C(1)/C(2)가 lumped 결과 및 검증에 반영되는지 - 확인하여 두 mass 계산이 끊긴 우회 경로를 잡는다. -- Mass original과 derived 모두 `d_i` 방향의 null action을 검사한다. - Element/global scaled matrix에서 `eta_null=||Mhat z||2/(||Mhat||F ||z||2)`를 쓴다. - Lumped는 M8의 양의 두 항 및 physical positive-space Cholesky로 rank5를 검증한다. - Consistent physical 20-coordinate matrix도 positive여야 한다. 잘못된 quadrature에 - 의한 추가 hourglass/null mass를 허용하지 않는다. -- `mi>0`, `ji>0`, `zi=hi/mi`, `vi=ji/mi-zi²>0`를 검사한다. - `vi/ell²`, `|hi|/sqrt(mi ji)`는 dimensionless conditioning evidence다. - 양의 `vi`를 낮은 rank로 바꾸는 기준을 두지 않는다. Direct centered integral - `integral rho Ni (z-zi)² dV`와 `ji-hi²/mi`의 일치는 cancellation을 드러낸다. -- Scaled node positive mass의 Cholesky reconstruction error와 reciprocal condition - estimate를 기록한다. 후자는 작은 block inverse action의 norm으로 계산할 수 있다. - 물리 positive/null rank는 E2로 정하고 ill-conditioning은 별도 실패다. -- 총 질량은 uniform translation의 `q^TMq/|u|²`, geometry 적분의 `m=sum mi`를 - 비교한다. Spatial centroid는 M5의 scalar moment로 얻은 - `sum(mi Xi+hi di)`와 독립 `integral rho X dV`를 비교한다. - 좌표 원점으로 인한 cancellation을 피하려면 한 source node `Xref`를 공통 원점으로 - 잡고 first moment 차이를 `m ell`로 나눈다. -- M9의 `Delta=q_dot^T(M_L-M_C)q_dot`와 nonnegative pairwise integral을 독립 비교한다. - Scale은 `q_dot^T M_L q_dot + q_dot^T M_C q_dot`이며 zero motion/null-only field는 - 별도 zero branch다. Arbitrary velocity에서 equality를 요구하지 않는다. - -## V3. Reduction과 full modal residual - -`y_f=C^T D^-1 phi`, `k=||Kf||F`, `m=||Mf||F`라 두면 - -\[ -r_f=K_f y_f-\lambda M_f y_f,\qquad -\eta_r=\frac{\|r_f\|_2}{(k+|\lambda|m)\|y_f\|_2}. \tag{V1} -\] - -이것이 **모든 원 free DOF**의 inertia/elastic force balance다. 물리 공간에 -project한 residual만으로 drilling/null 복원 오류를 놓치지 않는다. -`Kf y_f` 및 `Mf y_f`를 solve에 사용한 축소 matrix를 재사용하지 않고 원 조립값에서 -검산한다. `Mf`는 actual lumped이며 consistent로 바꾸면 잘못된 metric이다. -`lambda=0`에서도 `k>0`이면 유효한 denominator가 있다. `Kf=0,lambda=0`은 zero branch, -zero eigenvector는 normalization 이전부터 실패다. - -Whitened solve의 추가 metric은 `eta_w=||A x-lambda x||2 / -((||A||F+|lambda|)||x||2)`다. Backend `res/epsout`, eta_w, eta_r은 서로 다른 evidence다. -E3의 identity도 다음으로 검산한다. - -\[ -\eta_{KZ}=\frac{\|K_fZ-Z\operatorname{diag}(\kappa)\|_F} -{\|K_f\|_F\|Z\|_F+\|Z\operatorname{diag}(\kappa)\|_F},\quad -\eta_{MZ}=\frac{\|M_fZ\|_F}{\|M_f\|_F\|Z\|_F},\quad -\eta_{PZ}=\|P^TZ\|_F. \tag{V2} -\] - -`nz=0`이면 V2는 적용 대상 없음으로 기록한다. M8/E3의 analytic proof가 먼저이고 -V2 threshold만으로 새로운 nullspace를 발견하거나 coupling을 생략하지 않는다. -Kzz positivity와 `n/nz/nf`를 source node별 예상 null 여부와 연결한다. -Constraint metric은 `||(I-CC^T)D^-1 phi||2/||D^-1 phi||2`이며 source에 복원한 -constrained components 자체도 exact zero를 확인한다. - -## V4. Mass normalization, Gram, energy와 Rayleigh - -각 mode의 generalized mass `g_i=phi_i^T M phi_i=y_i^T Mf y_i`는 finite, strictly -positive여야 한다. `phi_i <- phi_i/sqrt(g_i)`로 normalization한 뒤 재계산한다. -계산된 전체 c개 column에 대해 - -\[ -G_{ij}=\phi_i^T M\phi_j,\quad -\eta_{norm,i}=|G_{ii}-1|,\quad -\eta_{orth,ij}=\frac{|G_{ij}|}{\sqrt{G_{ii}G_{jj}}}\ (i\ne j),\quad -\eta_G=\frac{\|G-I\|_F}{\sqrt c}. \tag{V3} -\] - -Column pairing과 linear independence를 확인하며 FEAST의 c와 N을 구분한다. -부족한 rank를 같은 vector 복사로 채우면 V3에서 실패한다. - -\[ -h_i=y_i^TK_fy_i,\quad R_i=h_i/g_i,\qquad -\eta_{energy,i}=\frac{|h_i-\lambda_i g_i|} -{(k+|\lambda_i|m)\|y_i\|_2^2}. \tag{V4} -\] - -`R_i [T^-2]`는 Rayleigh quotient다. V4는 eigenvalue가 0인 경우에도 쓸 수 있고 -`|R_i-lambda_i|/|lambda_i|`만을 강제하지 않는다. 단위 modal amplitude에서 elastic -energy는 `h_i/2`, peak kinetic energy는 `lambda_i g_i/2`다. Physical/drilling 분해가 -필요한 내부 검산에서는 `h_phys+h_drill=h_i`를 확인하되 별도의 drilling-energy -acceptance나 output quantity를 추가하지 않는다. - -## V5. Rigid mode, coordinate 및 density 불변식 - -Free valid shell/patch의 rigid fields는 `u_i=c+Omega cross Xi`, -`theta_i=(I-di di^T)Omega`이다. 그 span에는 세 병진과 세 회전이 있다. -각 vector의 scaled K action을 `||Khat y||2/(||Khat||F ||y||2)`로 검증하고 -mass Gram rank로 여섯 물리 움직임의 independence를 확인한다. -`Omega`의 full normal 성분을 UR에 넣어 drilling energy를 자극한 field는 이 테스트가 아니다. -Physical rigid zero eigenvalues는 finite mass 모드이고 E2의 massless drilling과 다르다. -Clamped reference에 여섯 zero mode를 요구하지 않는다. - -Global rigid coordinate rotation과 독립 node별 tangent 재생성에서 두 질량, -physical/numerical contribution 및 **complete stiffness**의 congruence와 E1~E6 spectrum -불변성을 검사한다. S1의 scale을 새 geometry/frame에서 다시 계산하여 S3/S4를 검증한다. -고정된 tensor에 회전행렬만 곱하는 검사로 대체하지 않는다. Norm은 V1의 same-unit -congruence ratio, scalar scale은 `|kd'-kd|/(|kd'|+|kd|)`다. Spectrum은 같은 operator -time scale `s`로 `|lambda_i'-lambda_i|/s`를 측정하며 repeated 그룹은 아래 projector를 쓴다. - -같은 물리 BC가 양쪽에서 지원되는 **partial rotation BC**를 포함하고, -[S6](formulation-stabilization.md#s6-nr-mfe-001의-새-algebraic-target과-정적-대응)의 -NR-MFE-001 geometry/45° 회전 및 대응 정적 response/reaction을 필수 통과 사례로 둔다. -Full-free/full-clamp만으로 대체하거나 반례를 warning-only로 내리지 않는다. -Partial BC에 남는 개선된 stabilization도 포함하며 기존 K와 새 K의 값이 같을 필요는 없다. -Rotation 후 다른 물리 component BC를 같은 문제로 비교하거나 새 MPC 입력을 추가하지 않는다. - -Nonlinear rigid motion은 기존 total triad의 finite rotation과 objective gamma를 사용한다. -S5의 potential/residual/Hessian을 검증하며 위 linear tangent-projected UR field 및 -massless projection을 nonlinear 상태에 적용하지 않는다. 개선 전 scale 공식만을 기대한 -기존 검사는 S1로 갱신하고 나머지 rigid/patch/physical positivity acceptance는 보존한다. - -모든 density를 동일 `c_rho>0`로 바꾸고 geometry/material stiffness/BC를 유지하면 - -\[ -M_C'=c_\rho M_C,\quad M_L'=c_\rho M_L,\quad -\lambda_i'=\lambda_i/c_\rho,\quad -\Phi'=\Phi Q/\sqrt{c_\rho}. \tag{V5} -\] - -단일 simple eigenvalue에서는 Q가 sign이고 repeated group에서는 orthogonal mixing이다. -Eigenvalue scaling error는 `|c_rho lambda_i'-lambda_i|/s`로 측정한다 -(`s`는 baseline E6 operator time scale). Group vector 비교는 -`U=L^T P^T C^T D^-1 Phi`, `U'=L^T P^T C^T D^-1(sqrt(c_rho) Phi')`로 정의한 -projector 차이 `||UU^T-U'U'^T||F/sqrt(2r)`를 사용한다. r은 group dimension이다. -Dense projector를 구성하지 않고 orthonormal U/U'의 cross-Gram으로 같은 norm을 계산할 -수 있다. Arbitrary clustered-but-distinct vectors를 회전하여 다른 eigenpairs로 만들지 않는다. - -## V6. Lowest N, cluster, near-zero와 오류 판정 소유권 - -E6 count/solve history는 각 `(a,b)`, prefix empty evidence, status, count, m0, -returned m, loop/epsout, bounds source와 final selected ranks를 보존한다. -모든 returned pair에 interval separation을 검사하고 requested N개만 검사하지 않는다. -Near-zero/negative 분류 scale은 `s` 또는 그와 동등한 E6 operator scale이며 reference -최소값이나 arbitrary absolute frequency가 아니다. Raw lambda는 바꾸지 않는다. - -NR가 구현 전에 결정해야 할 항목은 다음과 같다. - -| 대상 | 수치값/필수 검사 소유권과 필요한 scale | -| --- | --- | -| Matrix symmetry, moment/oracle/centroid/M9 | V1/V2의 same-unit norm, total mass 및 `m ell`; roundoff/독립 적분 오차 분리 | -| Null/orthogonal basis, KZ/MZ, mass conditioning | M8/E2 analytic rank, V2 및 작은 positive block condition; near-null 삭제 금지 | -| Residual, Gram, energy, rigid modes | V1~V4, V5 K-action; machine precision·차원·conditioning 근거 | -| Near-zero/negative/cluster 분류 | `|lambda|/s`, pairwise `|lambda_i-lambda_j|/s`; raw value 보존 | -| FEAST control | Contour points/precision exponent/refinement bound, finite count/endpoint/solve retry budget | -| Endpoint safety | Operator scale와 ULP, count monotonicity, enclosing total n, solve/count 및 full-rank Gram | -| Independent test portfolio | 평판 M10, warped/director-varying M5~M9, 비축정렬/부분 BC/E5 오류 case, FEAST known spectra, density/rigid/좌표 tests | -| r2 stabilization/static | S1~S8의 positivity/재계산 공변성·partial BC eigen/static, nonlinear 고정 scale·exact variation과 기존 static portfolio | -| External reference | r1 NR의 원본 input+TXT 10개 Value·singleton family·모두 blocking 논리 계약을 r2 영향 확인 후 유지 | - -Small independent pencil은 손으로 대각화 가능한 값을 사용하고 동일 production -mass/reduction/eigensolver를 기대값 계산에 호출하지 않는다. API wrapper의 injected status -검사와 실제 FEAST runtime known-spectrum 검사는 모두 필요하다. Size1, N=n, repeated -group>N, tight cluster, zero/negative, empty interval, insufficient subspace, count collision, -unresolved conditioning 및 allocation/index failure가 해당 공식 계약을 검증한다. -Case의 구체적 목록·숫자는 NR가 정하고 Planning이 tests와 TDD steps에 연결한다. - -외부 비교는 지정 [원본 input](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp)과 -[원본 TXT](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt)의 -`Value`만 사용한다. `lambda [T^-2]`, source `Step-2`, mode 1..10이 의미적 대응이다. -Frequency 재계산, mode shape correlation이나 다른 mass variant의 더 가까운 결과 선택으로 -이를 대체하지 않는다. Mode/frame은 NR/I/O가 common same-frame family 규칙에 맞춰 -정의하고 missing/extra/duplicate/nonfinite를 tolerance 전에 거부한다. -[r1 reference-model](reference-model.md)의 10개 singleton family·모두 blocking 계약과 -공통 정책에 따른 실효 mode별 1%는 보존할 근거다. Formulation이 이를 재선택하지 않으며 -r2 영향 재확인은 NR 소유다. V1~V6의 내부 수치 기준은 아직 NR에서 최종 고정하지 않았다. -Schema 경로/저장 field/public diagnostic 이름은 I/O owner의 계약이다. - -## V7. 실행 evidence와 남는 위험 - -이 절의 명령·hash·4문서 검사는 **r1 이력**이다. r2 갱신 evidence는 V8에 둔다. -Formulation 단계에서는 승인 문서와 실제 source를 read-only로 대조하고 자체 수식을 -전개했다. 다음 입력은 변경하지 않았다: requirements/research, 관리문서, source/tests/build, -Harness, 공통 tolerance 및 원본 reference. External solver, CMake/CTest, Harness, FEAST -runtime, numerical reference comparison은 실행하지 않았다. 이 문서는 수치 통과 evidence가 아니다. - -`Get-Content`, scoped `rg`로 M4의 변환·stabilization과 공통 nodal frame 전달을 확인했다. -한 scoped `rg` 호출은 존재하지 않는 `runtime_element_factory.cpp`와 PowerShell literal -glob 경로 때문에 exit `1`이었다. `rg --files`/`rg -n ... src/fesa`로 실제 -`element_factory.cpp`, `shell_geometry.cpp`를 찾아 재조회했고 exit `0`이었다. -Intel parameter/API/status의 공식 문서를 2026-09-06 다시 열어 count 의미, -endpoint/count failure와 m0 capacity를 확인했다(E7의 URL 및 research S05~S07). - -`Get-FileHash`는 exit `0`이며 원본 SHA-256은 upstream과 같다. -Input: `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`. -TXT: `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`. - -Owned 4개 문서를 `python -B -` read-only here-script(`pathlib`, `re`, -`urllib.parse.unquote`)로 정적 검사했다. Owner/Feature/revision, 26개 requirement -coverage, 상대 링크 실재, trailing whitespace/final newline, display-math delimiter와 -언어 혼입을 검사했다. Exit `0`, documents `4`, local links `38`, requirements `26`, -issues `0`이다. `git diff --check`도 exit `0`이며 Coordinator 소유 `coordination.md`의 -LF/CRLF warning만 출력되었다. 새 untracked owned 문서의 whitespace는 위 Python 검사로 -별도 확인했다. `git status --short`에서 owned 4개와 타 owner coordination 변경을 구분했으며 -stage/commit 또는 타 owner 수정은 하지 않았다. - -잔여 위험은 매우 얇은 shell/거의 정렬된 부분 BC의 mass conditioning, geometry quadrature -검사점 밖의 전역 injectivity 한계, floating-point FEAST count/endpoint와 repeated subspace, -count scratch 및 shifted factorization memory다. NR가 위 metric·수치 기준·case를 고정하고 -Implementation이 실제 설치 backend와 reference evidence를 제시해야 해소된다. - -## V8. r2 영향 확인과 bounded evidence - -r2에서는 M4의 scale, E3의 개선된 pencil 명시, V5의 complete K/partial-BC coverage와 -정적 회귀 연결을 갱신했다. Mass M1/M2/M5~M10 및 FEAST E6~E8, V1~V4의 검증식은 -numerical scale 선정과 독립이거나 동일 개선된 K를 대입하는 식이므로 보존한다. -r1 NR의 curved rational mass oracle·27점 degree 결과, count/trace API 근거와 reference -identity는 읽고 재사용 범위를 확인했으며 새 실행 결과로 바꾸지 않았다. - -`Get-Content`와 scoped `rg`로 r2 승인 요구/연구·기존 선형 요구 034/036/038/056, -nonlinear §10.1~10.4 및 아래 실제 source를 대조했다. 이 조회는 exit `0`이었다. - -```powershell -rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_reference|drilling_stiffness' src/fesa/elements/mitc4_shell.cpp -rg -n 'drilling|Drilling|Stiffness\(' src/fesa/elements -g '*nonlinear*' -``` - -처음 nonlinear source 검색에 literal `src/fesa/elements/*nonlinear*`를 사용한 호출은 -PowerShell 경로 오류를 출력했다. 해당 검색을 위 `-g` 방식으로 고쳐 exit `0`을 확인했다. -원본 reference 및 기존 NR mass oracle/옛 반례를 다시 실행하지 않았다. -2026-09-06 web `open`으로 S1의 LAPACK 공식 문서상 작은 eigenvalue 상쇄 경고를 확인했다. -Configured vault grounding 요청이 없으므로 `fem-theory-query`는 별도 적용하지 않았다. - -다음은 NR의 R block을 사용해 **새 scale 식의 exact arithmetic만** 확인한 명령이다. -Production source prototype, C++ test, FEAST 또는 독립 NR 판정을 대체하지 않는다. - -```powershell -@' -from fractions import Fraction as F -aa,bb=F(49,12),F(23,6) -base=[]; rotated=[] -for ab in [F(1,8),-F(1,8),F(1,8),-F(1,8)]: - base.extend([aa,bb]) - rotated.extend([(25*aa+16*bb+40*ab)/41, - (16*aa+25*bb-40*ab)/41]) -ref=sum(base)/8 -assert ref == sum(rotated)/8 == F(95,24) -kd=ref/1000 -mass=F(3,50) -stiffness=F(9,25)*bb+F(16,25)*kd -assert kd == F(19,4800) -assert stiffness == F(10369,7500) -assert stiffness/mass == F(10369,450) -assert F(3,5)*(-F(4,3))+F(4,5) == 0 # d dot (5b/3) -print('k_ref=',ref,'k_d=',kd,'Mff=',mass,'Kff=',stiffness, - 'lambda=',stiffness/mass,'theta_per_unit_moment=',1/stiffness) -'@ | python -B - -``` - -실제 위 here-script를 문서에서 추출해 `python -B -`로 실행했다. Exit `0`, -`k_ref=95/24`, `k_d=19/4800`, `Mff=3/50`, `Kff=10369/7500`, -`lambda=10369/450`, 단위 moment 응답 `7500/10369`를 얻었다. -Owned 5개 문서의 metadata·27 requirement coverage·57개 상대 경로·whitespace·final newline· -display-math delimiter·언어 혼입을 read-only Python으로 검사했고 exit `0`, issues `0`이었다. -`git diff --check`도 exit `0`; LF/CRLF 안내만 있었으며 compiler warning 검증과는 별개다. -Stage/commit은 하지 않았고 `git status --short`의 Coordinator 변경은 보존했다. - -이 exact 식에 수치 tolerance를 추가하지 않는다. NR가 S1~S8을 독립 검토하고 V6의 내부 기준· -FEAST budget/seed·mandatory matrix를 완성해야 한다. Implementation은 승인된 기존 static -portfolio와 새 eigen Value-only 비교의 실제 TDD/runtime evidence를 생성해야 한다. -Source/tests/build/phase/Hook/reference/Git 및 다른 owner 문서를 편집하지 않았다. -CMake/CTest·Harness·FEAST·외부 solver·reference numerical comparison은 이 단계에서 미실행이다. diff --git a/docs/mitc4-shell-feast-eigen/formulation.md b/docs/mitc4-shell-feast-eigen/formulation.md index f4c673d..9635c8c 100644 --- a/docs/mitc4-shell-feast-eigen/formulation.md +++ b/docs/mitc4-shell-feast-eigen/formulation.md @@ -1,45 +1,53 @@ -# MITC4 질량행렬과 FEAST 고유치 정식화 +# MITC4 질량·축소·stabilization 유도 근거 + +이 폴더는 이전 MFE baseline의 유도·반례 근거다. 현재 구현 계약은 [eigen2](../mitc4-shell-feast-eigen2/README.md)이며 채택·비채택 범위는 그 정식화에서 명시한다. 아래 과거 controls·reference portfolio·pass를 자동 승계하지 않는다. + + + + +## MITC4 질량행렬과 FEAST 고유치 정식화 - Feature ID: `mitc4-shell-feast-eigen` -- Owner: `formulation-agent` - Input contract revision: `r2` - 요청 outcome: `pass`; 다음 owner: `numerical-review-agent`. - 상태: 독립 numerical review 요청이며 자기 승인이나 workflow 전이가 아니다. 필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), -[requirements](requirements.md), [requirements evidence](requirements-evidence.md), -[research](research.md), [research evidence](research-evidence.md)이다. +[requirements](requirements.md#requirements), [requirements evidence](requirements.md#requirements-evidence), +[research](research.md#research), [research evidence](research.md#research-evidence)이다. [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용했다. -## 핵심 계약 + +### 핵심 계약 1. 기존 원형상 MITC4 운동학·physical stiffness·director·global 6 DOF 의미를 유지한다. Physical 3 translation/2 tangent rotation의 consistent mass와 구성 scalar moments를 같은 Jacobian으로 계산한다. Trilinear mapping의 mass integrand는 각 축 최대 4차이므로 mass는 3×3×3 Gauss로 충분하며 곡면의 odd-thickness coupling을 유지한다. - 식과 단위·strong/weak form: [mass M1~M5](formulation-mass.md). + 식과 단위·strong/weak form: [mass M1~M5](formulation.md#formulation-mass). 2. 계산된 consistent moment를 row-sum하여 global nodal 6×6 block lumped mass를 만든다. 총 병진 질량·spatial centroid·할당된 thickness moments를 보존하고 drilling은 정확한 null이다. 일반 운동에너지 차이는 nonnegative Jensen identity로 명시한다. - 보존/근사 범위와 독립 평판 oracle: [mass M6~M10](formulation-mass.md). + 보존/근사 범위와 독립 평판 oracle: [mass M6~M10](formulation.md#formulation-mass). 3. 실제 homogeneous global constraints를 먼저 적용한다. Free space에 완전히 포함된 director null만 분리한다. 개선된 nodal stabilization에서도 Kpz=0, Kzz>0임을 입증하여 finite spectrum을 nodal projection으로 보존하며 부분 BC에 남는 stabilization은 유지한다. - Sparse block whitening, rank 예외와 global 복원: [eigen E1~E5](formulation-eigen.md). + Sparse block whitening, rank 예외와 global 복원: [eigen E1~E5](formulation.md#formulation-eigen). 4. Actual FEAST mass와 모든 modal 검증은 derived lumped다. `.inp`의 N을 유지하고 finite enclosure·prefix count·cluster capacity·count/solve 일치와 독립 eigenpair 검증을 결합한다. Endpoint/conditioning 한계를 count theorem으로 과장하지 않는다. - Backend 경계와 bounded search, 상태 보존: [eigen E6~E8](formulation-eigen.md). + Backend 경계와 bounded search, 상태 보존: [eigen E6~E8](formulation.md#formulation-eigen). 5. 사용자 승인 r2의 numerical scale은 초기 physical K20의 여덟 접평면 회전 대각의 평균 `k_ref=sum_i tr(R_i)/8`, `k_d=10^-3 k_ref`로 고정한다. Zero diagonal을 포함한 전체 inventory를 사용하며 접평면 기저·전역 좌표에 불변이다. 선형/eigen의 nodal drill map과 nonlinear의 objective potential·초기 고정 lifecycle은 각각 유지한다. 양의 inventory, 재계산 공변성, rigid modes, 반례의 exact target과 적용 경계는 - [stabilization S1~S7](formulation-stabilization.md)에 있다. + [stabilization S1~S7](formulation.md#formulation-stabilization)에 있다. -## Requirement coverage + +### Requirement coverage 아래 ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사다. Requirements matrix의 acceptance 원본을 복제하지 않으며 formulation의 기여와 다음 owner를 구분한다. @@ -58,20 +66,1108 @@ | `023`, `024`, `025` | stabilization S5/S7, verification V8: 기존 linear/nonlinear scale 적용·correctness/reference 재검증 | Planning TDD/MSVC/회귀, Physics/Release closure | | `027` | stabilization S1~S7: 단일 공변 scale·positive/null/rigid 역할과 기존 고정식 대체 경계 | NR 독립 검토, Implementation/Physics | -## Evidence와 handoff + +### Evidence와 handoff 실제 linear의 kd 선정 및 nonlinear 생성 시 초기 계수 전달·저장 경로를 대조했다. r1의 mass M5~M10, FEAST E6~E8, full residual·transaction 수식과 NR의 독립 mass oracle 근거를 영향 확인 후 보존한다. 원본 reference hash는 r1 관찰 이력이며 재조회하지 않았다. -출처·명령·미실행은 [verification V7/V8](formulation-verification.md)에 있다. +출처·명령·미실행은 [verification V7/V8](formulation.md#formulation-verification)에 있다. Source/reference/upstream을 편집하지 않았고 수치 실행 결과를 통과로 보고하지 않는다. 현재 새 physics/scope/compatibility 선택이나 사용자 미결정은 없다. r2 수식은 NR-MFE-001에 대한 algebraic target을 제공하며 그 반례의 독립 해소 판정이나 runtime 통과를 주장하지 않는다. -Numerical Review는 [verification V6](formulation-verification.md)의 dimensionless metric, +Numerical Review는 [verification V6](formulation.md#formulation-verification)의 dimensionless metric, zero branch, analytic rank와 finite algorithm을 독립 검토하여 threshold, FEAST control/budget, 필수 benchmark 및 reference mode/frame family를 고정한다. I/O는 영속 schema를 정의한다. 이번 formulation stage는 완결된 수학 계약을 NR에 인계하며, 실제 구현 진입에 필요한 전체 계약 bundle은 NR의 수치 기준과 후속 I/O/planning 이후 완성된다. Count의 floating-point 한계, near-null conditioning, shifted sparse fill와 보수적 count scratch 비용은 아직 실제 runtime evidence가 필요하다. Release readiness를 주장하지 않는다. + + + + +## MITC4 consistent mass와 nodal block lumping 유도 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [formulation.md](formulation.md#formulation) + +근거는 [research evidence](research.md#research-evidence)의 `S01`, `S02`, `P01`, `R01`~`R03`이다. +아래 유도는 FESA의 승인된 운동학에 대한 것이며 Abaqus 내부 질량과의 동등성 주장이 아니다. +r2는 M4의 numerical scale만 [S1](formulation.md#formulation-stabilization--s1-초기-physical-trace로-고정하는-단일-scale)로 +대체한다. M1/M2 및 M5~M10의 질량·quadrature·moment·lumping 식은 영향 확인 후 보존했다. + + +### M1. 변수, 원형상과 운동학 + +길이·질량·시간 차원을 각각 `L`, `M`, `T`라 한다. 각 element는 원형상 좌표 +`X_i [L]`, 기존 patch에서 얻은 공통 unit nodal director `d_i`, 일정한 centered thickness +`t>0 [L]`, section의 material에서 결정된 일정 density `rho>0 [M/L³]`를 사용한다. +`E>0 [M/(LT²)]`, `-1=0`이다. Interpolated director를 normalization하여 M1의 geometry를 +변경하지 않는다. 기존 kernel의 `EvaluateGeometry`와 같은 Jacobian 및 부호를 사용한다. +기존 [정식화](../linear-static-mitc4-shell/formulation.md)의 §§3~5, 8~11이 +director 생성, tangent frame `(a_i,b_i,d_i)`, 기하 허용 조건과 MITC strain을 소유한다. + +전역 nodal 좌표는 `q_i=[u_X,u_Y,u_Z,theta_X,theta_Y,theta_Z]^T`이다. +`u [L]`, `theta [1]`이고 양의 director 변화는 `theta cross d`이다. 다음 map을 정의한다. + +\[ +S_i=-[d_i]_\times,\quad P_i=I-d_i d_i^T=S_i^TS_i,\quad +G_i(z)=[I_3\ \ zS_i],\quad H=[N_1G_1\ \cdots\ N_4G_4]. \tag{M2} +\] + +따라서 입자 변위/속도는 `u(X)=Hq`, `v(X)=H q_dot`이다. Physical nodal coordinates +`[u_X,u_Y,u_Z,alpha,beta]`에서 회전 열은 `[-z b_i, z a_i]`이다. +`alpha=a_i^T theta`, `beta=b_i^T theta`, `gamma=d_i^T theta`이며 +`S_i d_i=0`이다. 20↔24 변환은 기존 `PhysicalTransformation20`/`DrillingTransformation4` +그대로이다. MITC assumed shear와 `5/6` shear factor는 strain/stiffness에만 작용한다. +속도 보간과 질량에 이 factor를 적용하지 않는다. + + +### M2. Strong/weak form과 기존 stiffness + +원형상·무응력 상태의 소변형 무감쇠 자유진동에 대해 continuum parent는 +`rho u_ddot = div sigma`, `sigma=C_ps:epsilon`, `sigma_33=0`이다. +자유 표면·자유 edge의 generalized traction은 0이고 essential data는 동차 global DOF +제약이다. 허용한 thickness 운동학과 MITC projection에 제한한 약형은 + +\[ +\int_{\Omega_0}\rho\,\delta u^T\ddot u\,dV+ +\int_{\Omega_0}\delta\bar e^T C_5\bar e\,dV+ +\delta\gamma^T K_d\gamma=0. \tag{M3} +\] + +원형상 physical elastic Hessian과 quadrature는 기존 stiffness 계약을 유지한다. + +\[ +C_5=\operatorname{diag}\left( +\frac{E}{1-\nu^2}\begin{bmatrix}1&\nu&0\\\nu&1&0\\0&0&(1-\nu)/2\end{bmatrix}, +\frac56\frac{E}{2(1+\nu)}I_2\right), +\quad K_{20}=\sum_{g\in2\times2\times2}\bar B_g^TC_5\bar B_gJ_gw_g, +\] +\[ +K_e=T_p^TK_{20}T_p+T_d^T(k_d I_4)T_d,\quad +k_d=10^{-3}k_{ref,e}. \tag{M4} +\] + +`bar e=[epsilon11,epsilon22,gamma12,gamma13,gamma23]`이다. `k_ref,e`는 +[r2 scale S1](formulation.md#formulation-stabilization--s1-초기-physical-trace로-고정하는-단일-scale)으로 계산한다. +기존 [정식화 §12](../linear-static-mitc4-shell/formulation.md)의 physical kernel·변환· +drilling map은 유지하고 옛 최소 대각 scale만 사용자 승인 범위에서 대체한다. +이 유도 작성 당시 source는 옛 scale을 사용했다. 현재 [source](../../src/fesa/elements/mitc4_shell.cpp)의 +채택식과 구현 검증은 [eigen2 정식화](../mitc4-shell-feast-eigen2/formulation.md)와 +[구현 검증](../mitc4-shell-feast-eigen2/implementation-verification.md)을 따른다. +Drilling energy는 수치 stabilization이며 물리 strain/stress가 아니다. +`K_e q_e`는 내부 elastic generalized force, `M_L,e q_ddot,e`는 inertia다. +최종 반이산식은 `M_L q_ddot + Kq=0`이다. Harmonic ansatz +`q(phi,tau)=phi cos(omega tau)`에서 `Kphi=lambda M_L phi`, `lambda=omega² [T^-2]`를 얻는다. +새 constitutive/history state, geometric stiffness, damping, preload, nonlinear tangent, +time integrator 또는 modal stress/reaction recovery는 없다. + + +### M3. Consistent matrix와 충분한 quadrature + +`T_C=1/2 integral rho |H q_dot|² dV`에서 + +\[ +C^{(k)}_{ij}=\int_{\Omega_0}\rho N_iN_j z^k dV\quad(k=0,1,2), +\qquad +(M_C)_{ij}=\begin{bmatrix} +C^{(0)}_{ij}I_3&C^{(1)}_{ij}S_j\\ +C^{(1)}_{ij}S_i^T&C^{(2)}_{ij}S_i^TS_j +\end{bmatrix}. \tag{M5} +\] + +세 scalar moment matrix는 각각 symmetric `4×4`이다. 차원은 `C(k) [M L^k]`, +mass의 `uu/u-theta/theta-theta` block은 각각 `M/ML/ML²`이다. +`M_C [24×24]`는 global block 형식이며 20 physical mass의 congruence와 동일하다. +원본 `M_C`와 그것을 구성한 `C(0..2)`를 완성·검증한 후 lumping 입력으로 사용한다. +Global consistent sparse matrix를 eigen solve에 조립할 필요는 없지만 계산 원본을 +lumped 결과로 덮어쓰거나 별도의 mass를 생성한 뒤 consistent에서 유도했다고 부르지 않는다. + +M1은 각 자연 좌표에 최대 1차이다. Jacobian의 세 열의 최대 다항 차수는 각각 +`(0,1,1)`, `(1,0,1)`, `(1,1,0)`이므로 determinant의 성분별 최대 차수는 `(2,2,2)`다. +`Ni Nj z^k J`의 차수는 최대 `(4,4,k+2)`, 즉 `(4,4,4)`이다. 따라서 **질량에는 +3×3×3 Gauss–Legendre**를 사용한다. 각 축의 points는 +`[-sqrt(3/5),0,+sqrt(3/5)]`, weights는 `[5/9,8/9,5/9]`이다. +3-point rule의 5차 정확성으로 M5의 모든 항을 이 geometry에서 정확 적분한다 +(floating-point roundoff 제외). 추가 density/thickness 변화를 가정한 결론이 아니다. + +Loop 순서는 증가하는 `xi`, 그 안의 `eta`, 가장 안의 `zeta`, 이후 `i<=j`, `k=0,1,2`로 +고정하고 대칭 항을 복사한다. Mass 계산의 27개 실제 평가점에서도 기존 geometry +predicate를 적용한다. `J<=0`, nonfinite frame/basis 등의 실패를 weight 절댓값, +점 생략이나 flat replacement로 수리하지 않는다. 기존 stiffness 8-point 경로는 변경하지 +않는다. 이 검사는 27점에서의 positivity를 보장하며 volume 모든 위치의 injectivity에 +대한 새 theorem이나 기존 warp/curvature 범위의 확대를 주장하지 않는다. + +왜곡된 flat element라도 같은 식을 쓴다. 서로 다른 director가 있으면 `J(zeta)`의 1차 항 +때문에 `C(1)`이 0이 아닐 수 있다. Centered section만을 이유로 coupling을 버리거나 +`C(2)=t² C(0)/12`를 일반식으로 사용하지 않는다. + + +### M4. 계산된 consistent moment에서 nodal block 유도 + +각 node의 세 row sum과 질량 block을 정의한다. + +\[ +m_i=\sum_j C^{(0)}_{ij},\quad h_i=\sum_j C^{(1)}_{ij},\quad +j_i=\sum_j C^{(2)}_{ij},\qquad +L_i=\begin{bmatrix}m_iI_3&h_iS_i\\h_iS_i^T&j_iP_i\end{bmatrix}, +\quad M_{L,e}=\operatorname{blockdiag}(L_1,L_2,L_3,L_4). \tag{M6} +\] + +이는 scalar moment row sum 후 tensor로 재구성하는 **nodal block lumping**이다. +Global 전체 행의 합, absolute row sum, diagonal scaling 또는 nodal quadrature와 +혼용하지 않는다. 같은 source node의 incident element block은 기존 source element 순서로 +합한다. 공통 `d_i` 때문에 조립 후에도 M6 형태다. Local와 global에서 diagonal이 아닌 +`6×6` coupling은 허용한 lumped mass의 일부다. + +`sum Nj=1`을 M5에 대입하면 정확히 + +\[ +(m_i,h_i,j_i)=\int\rho N_i(1,z,z^2)dV,\quad +L_i=\int\rho N_i G_i(z)^TG_i(z)dV. \tag{M7} +\] + +`m_i>0`, `j_i>0`, `m_i j_i-h_i²>0`이다. 마지막 부등식은 양의 measure에 대해 +`z`가 상수가 아닌 점(양의 두께 및 서로 다른 thickness Gauss점)과 strict +Cauchy–Schwarz에서 따른다. 이를 이용하면 + +\[ +q_i^TL_iq_i=m_i\left|u_i+\frac{h_i}{m_i}S_i\theta_i\right|^2+ +\left(j_i-\frac{h_i^2}{m_i}\right)|S_i\theta_i|^2. \tag{M8} +\] + +따라서 `L_i`의 rank는 5, null은 정확히 `[0;d_i]`의 span이다. +`zbar_i=h_i/m_i [L]`, `j_i-h_i²/m_i [ML²]`는 node에 할당된 thickness +measure의 centroid와 central tangent inertia다. 음/영 variance나 nonfinite를 clamp하지 +않고 mass 검증 실패로 처리한다. 모든 노드에 최소 한 활성 shell이 연결되어야 한다. + +M6의 유도 연결은 `C(k)` 원본→row sum→block reconstruction으로 추적한다. +동시에 M7을 독립 직접 적분하여 두 결과의 일치를 검증할 수 있다. +서로 다른 nodal frame의 rotary component를 직접 더하지 않는다. + + +### M5. 보존되는 양과 근사되는 양 + +모든 등식은 동일 원형상·density와 quadrature measure에 관한 것이다. + +1. 총 병진 질량 `m=sum mi=integral rho dV` 및 모든 uniform translation의 kinetic + energy가 consistent와 정확히 같다. 각 방향의 total mass가 `m`이며 `trace(Muu)`를 + 총 질량이라고 정의하지 않는다. +2. Thickness scalar moment는 `sum hi=integral rho z dV`, + `sum ji=integral rho z² dV`다. 각 nodal tangent tensor는 `ji Pi`이고 drilling inertia는 + 0이다. 이는 물리 director의 회전 관성 정의이며 모든 rigid rotation의 전체 tensor를 + consistent와 같게 만드는 계약은 아니다. +3. Lumping measure의 위치를 `x_i(z)=X_i+z d_i`로 보면 spatial first moment + `sum_i(mi Xi+hi di)=integral rho X dV`이므로 center of mass가 보존된다. + Node의 `Xi`에만 `mi`를 놓고 `hi di`를 누락하면 곡면에서 이 등식이 깨진다. +4. `v_i(z)=u_dot_i+z S_i theta_dot_i`에 대해 Jensen identity가 다음을 준다. + +\[ +\dot q^T(M_L-M_C)\dot q= +\frac12\int\rho\sum_{i,j}N_iN_j|v_i-v_j|^2dV\ \ge0. \tag{M9} +\] + +두 kinetic energy의 차이는 M9의 절반이다. Equality는 positive-weight point마다 모든 +`v_i`가 같을 때 성립한다. 일반 속도장 및 rigid angular motion의 orbital inertia는 +달라질 수 있으며 lumped 값이 그 quadratic form에서 작아지지 않는다. +Rigid spatial rotation은 `u_i=Omega cross Xi`, `theta_i=Pi Omega`로 재현된다. +이때 M9는 nodal 위치 분산으로 생기는 angular-inertia 차이를 정확히 설명한다. +두 spectrum의 동일성, arbitrary mesh의 특정 수렴 차수 또는 Abaqus lumping 동등성을 +acceptance로 요구하지 않는다. Smooth refinement에서 차이가 감소하는지는 독립 evidence다. + +Proper orthogonal global rotation `Q`에 대해 `D_Q=blockdiag(Q,Q)`를 두면 +`S(Qd)=Q S(d) Q^T`, `L'_i=D_Q L_i D_Q^T`이며 consistent에도 같은 congruence가 +성립한다. 이는 tangent basis 선택과 독립적이다. Constraint도 같은 물리 공간으로 변환한 +경우에만 spectrum의 좌표 불변성을 비교한다. + + +### M6. 직접 적분 가능한 평판 oracle + +평행 director와 affine 직사각형 면적 `A`에서는 + +\[ +C^{(0)}=\frac{\rho t A}{36} +\begin{bmatrix}4&2&1&2\\2&4&2&1\\1&2&4&2\\2&1&2&4\end{bmatrix}, +\quad C^{(1)}=0,\quad C^{(2)}=\frac{t^2}{12}C^{(0)}. \tag{M10} +\] + +각 node는 `mi=rho t A/4`, `hi=0`, `ji=rho t³ A/48`이다. +이는 production quadrature를 호출하지 않고 다항 적분으로 얻는 oracle다. +곡면에서는 M5~M9와 independent volume integration을 사용한다. +두께 `t` 변경 시 stiffness와 rotary inertia는 다른 차수로 변하므로 전체 spectrum에 +하나의 thickness power law를 강제하지 않는다. + + + + +## 좌표 공변적인 drilling scale과 적용 경계 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [formulation.md](formulation.md#formulation) + +승인 근거는 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합), +`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및 [기존 계약 대체 범위](requirements.md#requirements--r2의-기존-계약-대체-범위)다. +[연구 R07](research.md#research-evidence--r07--r2-stabilization-근거와-영향)의 후보에서 아래 하나를 선택한다. +식 S1~S8은 FESA 계약에 대한 유도이며 외부 solver의 stabilization과 동일하다는 주장이 아니다. + + +### S1. 초기 physical trace로 고정하는 단일 scale + +[M4](formulation.md#formulation-mass--m2-strongweak-form과-기존-stiffness)의 원형상 physical matrix를 +`K20^0`라 한다. 각 source node i의 local physical 순서는 `[uX,uY,uZ,alpha,beta]`이고, +`R_i [2×2]`는 그 matrix에서 `alpha,beta`에 해당하는 principal block이다. 두 회전은 +orthonormal tangent basis의 무차원 성분이다. Element별로 + +\[ +k_{ref,e}=\frac18\sum_{i=1}^4\operatorname{tr}R_i, +\qquad k_{d,e}=\eta_d k_{ref,e},\qquad \eta_d=10^{-3}, +\qquad K_d^l=k_{d,e}I_4. \tag{S1} +\] + +`k_ref,k_d,R_i`의 단위는 force·length=`ML²/T²`다. Translation 대각, lumped/consistent +mass, density, constrained tangent, trial tangent 또는 reference 오차는 이 식의 입력이 아니다. +초기 physical K의 **여덟 회전 대각 전체**를 평균하며 양수인 항만 선별해 분모를 바꾸지 않는다. +기존 coefficient `10^-3`와 네 node에 같은 scalar를 쓰는 numerical 역할을 유지한다. +새 사용자 parameter·coefficient sweep·reference tuning은 없다. + +Trace 평균은 모든 방향의 회전 강성을 사용하면서 eigenvalue subtraction과 positive +nodal-block 선별을 피한다. 최소 spectral 값도 불변량이지만 이번 scale에 필요하지 않은 +작은 고유값 conditioning 문제를 추가한다. 이는 R07 후보의 단순성에 따른 선택이며, +LAPACK이 FESA의 평균 규칙을 제안한다는 뜻이 아니다. 작은 고유값의 상쇄 한계는 +[LAPACK DLAEV2 원문, Further Details](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html)에 있다. + + +### S2. Positive inventory, 유효 geometry와 계산 순서 + +기존 승인 geometry·director·section·material 검증을 먼저 적용한다. 기존 8개 stiffness +점에서 `J_g>0,w_g>0`, `t>0,E>0,-1 +### S3. 독립 재계산한 complete K와 제약의 공변성 + +`U_i=[a_i b_i]`, `G∈SO(3)`를 전역 좌표 회전이라 하자. 새 geometry에서 tangent를 +독립 생성하면 `U_i'=G U_i O_i`, `d_i'=Gd_i`인 orthogonal `O_i`가 존재한다. +오른손 frame끼리는 `O_i∈SO(2)`다. 각 node의 physical 좌표 변환을 +`A_i=diag(G,O_i^T)`, 전체 `A=blockdiag(A_i)`, global 24 DOF 변환을 +`S_G=blockdiag_i(G,G)`라 두면 `q20'=A q20`, `q24'=S_G q24`다. + +MITC strain은 같은 물리 tensor를 보간하고 isotropic C5의 quadratic work와 J는 회전에 +불변이다. 따라서 물리 운동학으로 독립 재계산한 `K20'^0=A K20^0 A^T`이며 + +\[ +R_i'=O_i^T R_i O_i,\quad \operatorname{tr}R_i'=\operatorname{tr}R_i, +\quad k_{d,e}'=k_{d,e},\quad +T_p'S_G=A T_p,\quad T_d'S_G=T_d. \tag{S3} +\] + +이 등식을 M4에 대입하면 + +\[ +K_{phys,e}'=S_G K_{phys,e}S_G^T,\quad +K_{drill,e}'=S_G K_{drill,e}S_G^T,\quad +K_e'=S_G K_e S_G^T. \tag{S4} +\] + +`G=I`인 독립 node별 tangent basis 변경에도 같다. Element의 local strain frame이 +재생성되더라도 isotropic work는 같다. Frame 생성 tie로 basis가 달라지는 것도 포함한다. +이미 계산한 old K에 S를 곱하는 검사만으로 S3를 검증할 수 없다. 새 geometry·frame에서 +physical K와 S1을 다시 계산해야 한다. Translation of origin도 geometry derivatives, +K 및 M를 바꾸지 않는다. Mirror reflection·source connectivity reversal은 이 SO(3) 증명의 대상이 아니다. + +전체 model의 block rotation을 `S`라 하면 stable assembly 뒤 `K'=S K S^T`, `M'=S M S^T`다. +E1의 `ell`은 회전에 불변이고 D와 S는 commute한다. 같은 물리 free space를 나타내는 +`C,C'`에는 `SC=C'W`인 orthogonal W가 있어 + +\[ +K_f'=W K_f W^T,\quad M_f'=W M_f W^T, +\quad y_f'=W y_f,\quad\lambda'=\lambda. \tag{S5} +\] + +이는 supported partial rotation BC에도 적용된다. 비교 대상 양쪽의 같은 물리 subspace가 +현재 component BC로 표현되어야 한다. 임의 회전 뒤 BC component를 그대로 유지하여 다른 +문제를 비교하거나 새 MPC 기능을 요구하지 않는다. NR-MFE-001의 global Z축 회전은 그 +URZ free space를 유지하므로 필수 사례다. Complete K 안의 partial-BC stabilization을 +삭제하거나 acceptance를 full-free/full-clamp로 한정하지 않는다. + +Static load도 `F'=SF`, prescribed displacement도 같은 물리량으로 변환하면 기존 +partition/effective RHS의 해와 full residual/reaction이 함께 변환한다. Unique free 해의 +경우 `q'=Sq`, `r'=Sr`, physical strain energy는 불변이다. S5는 eigen 근사식이 아니라 +개선된 실제 constrained K/M의 congruence다. + + +### S4. Linear rigid modes와 massless drilling의 다른 의미 + +Linear/eigen 물리 rigid field는 `u_i=c+Omega×X_i`, +`theta_i=(I-d_i d_i^T)Omega`다. M2에 넣으면 입자 변위는 `c+Omega×X`이고 +물리 strain 및 `T_d q`가 모두 0이다. 따라서 S1의 양수 값과 관계없이 `K_e q=0`이다. +비퇴화 shell의 여섯 물리 rigid motions는 positive lumped mass를 가진다. 기존 physical +non-rigid positivity와 함께 complete free element의 nullity가 여섯이라는 검증을 유지한다. + +반면 한 node의 pure numerical drill `z_i=[0;d_i]`는 `T_p z_i=0`, `M z_i=0`이고 +numerical stiffness만 양수다. Physical recovery에는 strain/stress/resultant를 만들지 않는다. +Full spatial Omega를 linear UR에 넣어 numerical drill까지 가진 field는 위 five-DOF +rigid 대표값과 다르다. 이 구분은 기존 물리 계약이며 새 eigen rigid acceptance의 축소가 아니다. + +S1에서 모든 element의 `k_d,e>0`이고 nodal director가 incident element 사이에 공통이므로 +[E3/E4](formulation.md#formulation-eigen--e3-개선된-stiffness에서-decoupling의-정확한-증명)의 +`K_f Z=Z diag(sum_e k_d,e)`, `Kzz≻0`, `Kpz=0`가 그대로 성립한다. E2의 실제 +global BC와 null의 교집합을 먼저 구한다. Finite mode의 null coefficient는 0이며 +positive 공간으로의 투영은 개선된 원 pencil의 모든 finite spectrum을 보존한다. +Null이 없는 partial BC에는 개선된 drilling term이 finite 공간에 남는다. 이 항을 제거하거나 +옛 spectrum과 같게 조정하지 않는다. Consistent→lumped의 spectrum equality는 별개로 요구하지 않는다. + + +### S5. Nonlinear objective potential와 초기 고정 lifecycle + +기존 [nonlinear §10.1~10.4](../nonlinear-static-newton-raphson/formulation.md#10-objective-numerical-drilling-contract)의 +polar element corotation `R_e`, total nodal rotation `R_i`, minimal swing `S_ei` 및 +`gamma_i=atan2(s_gamma,i,c_gamma,i)`를 그대로 사용한다. 초기 reference physical K20만으로 +S1을 한 번 계산하고 모든 trial/commit/increment/iteration 및 rollback 동안 같은 scalar를 쓴다. +State-dependent scale·trial 재선정·기존 objective gamma의 교체는 승인 범위 밖이다. + +\[ +Dk_{d,e}=D^2k_{d,e}=0,\quad +\Pi_d^e=\tfrac12 k_{d,e}\gamma^T\gamma,\quad +r_d^e=k_{d,e}D_\gamma^T\gamma, +\] +\[ +K_d^e=k_{d,e}\left(D_\gamma^TD_\gamma+ +\sum_i\gamma_i H_i^\gamma\right),\qquad +D_\gamma=D\gamma,\quad H_i^\gamma=D^2\gamma_i. \tag{S6} +\] + +모든 polar/swing/rotation/atan2 미분과 branch validation은 기존 계약을 유지한다. +Positive k_d는 potential 비음성과 pure-drill 양의 작용을 뜻한다. 일반 nonlinear Hessian은 +`sum gamma_i H_i` 때문에 모든 상태에서 SPD라는 결론이 없다. 초기 `gamma=0`에서도 +`D_gamma`에는 corotation coupling이 있으므로 이를 linear `T_d`와 동일시하지 않는다. +기존 pure-drill directional quadratic form과 physical 선형극한·Newton tangent consistency를 +각자의 계약대로 재검증하며 complete nonlinear Hessian의 모든 entry가 linear M4와 같다고 요구하지 않는다. + +같은 물리 nonlinear 상태를 G로 표현하면 모든 rotation tensor와 initial director가 +conjugation/rotation되고 scalar gamma는 같다. Initial S1도 같으므로 potential은 불변이다. +Work-conjugate Cartesian perturbation에 대해 chain rule로 residual과 tangent의 공변성이 따른다. +Superposed finite rigid motion에서는 기존 `R_e^+=R R_e`, `R_i^+=R R_i`에 의해 gamma가 +같고, stress-free rigid state에는 gamma=0·physical strain=0이다. 따라서 finite rigid motion의 +영에너지 및 objective rigid orbit를 따른 변분 검증을 유지한다. S4의 linear tangent-projected +UR field를 nonlinear total triad 회전에 대신 넣지 않는다. + +현재 [nonlinear 생성 경로](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 +`NonlinearMitc4Shell::Create`는 초기 linear `Stiffness()`의 `drilling_stiffness`를 받아 저장한다. +이 경계에서 S1의 같은 값을 사용해야 한다. 물리 strain/material, exact external moment work, +Newton/line-search/cutback, accepted state 및 physical output은 기존 계약이다. +S4/E3 projection은 이 nonlinear Hessian·preload·prestressed eigen으로 확장하지 않는다. + + +### S6. NR-MFE-001의 새 algebraic target과 정적 대응 + +[NR 소유 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례)의 독립 적분 block을 +입력 근거로 사용한다. 그 geometry·source BC·material 및 옛 실패 이력은 보존한다. +각 corner에서 `R_aa=49/12`, `R_bb=23/6`, `R_ab=±1/8`이므로 + +\[ +k_{ref}=95/24,\quad k_d=19/4800,\quad +M_{ff}=3/50,\quad K_{ff}=10369/7500,\quad +\lambda=10369/450=23.042222\ldots . \tag{S7} +\] + +Global Z축 45° 회전 뒤 재생성한 tangent basis에서도 trace는 `95/12`이므로 같은 식이다. +이는 production/FEAST 실행 결과가 아닌 r2 formula의 exact target이다. 독립 재계산과 +runtime에서 반례가 해소되는지는 NR/Implementation이 각각 검증한다. + +정적 대응에는 node1에 `m=(5/3)M0 b`, 다른 load는 0을 사용한다. 여기서 +`b=(-4/5,0,3/5)`와 `M0`는 finite 비영 moment amplitude `[force·length]`다. +`d·m=0`, `mZ=M0`이므로 기존 physical moment admissibility를 지킨다. 단순 `m=M0 eZ`는 +drilling 성분을 가져 기존 load 계약을 위반하므로 사용하지 않는다. 같은 모든 DOF 고정, +node1 URZ만 free에서 + +\[ +\theta_{1Z}=\frac{M0}{K_{ff}},\quad +q_{constrained}=0,\quad r=Kq-F. \tag{S8} +\] + +회전된 input에서는 `m'=Gm`을 component load로 주고, `mZ'=M0`와 같은 BC를 유지한다. +Supported component BC/load만으로 `thetaZ`, complete response·full reaction의 공변성을 +검증할 수 있다. Physical recovery와 numerical contribution의 의미는 합치지 않는다. + + +### S7. 대체·보존 범위와 필수 verification + +기존 linear `FESA-REQ-LSMITC4-034`, `056`의 최소 positive diagonal 선정·그 공식 검증만 +S1/S2로 대체한다. 기존 `036`의 invalid positive inventory 의미는 S2로 유지한다. +Nonlinear §10.3은 초기 scale 식만 대체하고 §10.1/10.2/10.4 및 frozen lifecycle은 유지한다. +기존 feature 문서·과거 실패 evidence를 소급 수정하지 않는다. + +필수 수학 검증은 S1 직접 평균/단위/zero inventory·잘못된 finite/sign 처리, +독립 node별 tangent 재생성과 global geometry 회전의 S3/S4, S7/S8의 supported partial BC, +physical six rigid modes와 pure drilling rank/separation, E3의 KZ/MZ/Kpz/Kzz 및 원 free +residual이다. Nonlinear은 같은 초기 scale·immutability, objective rigid motion, +exact first/second directional derivatives·물리 선형극한·정적 평형/reaction/energy·rollback을 +기존 계약으로 재검증한다. Density 없는 기존 static 모델도 계속 유효하다. + +실행해야 하는 기존 `shell`, `shellNL`, `shellNL-meshfine` 및 linear-limit closure portfolio와 +후속 meshfine-02 이력의 구분, source identity, U blocking/UR warning-only, reaction review-only는 +[requirements evidence의 단일 portfolio](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)를 따른다. +새 eigen 외부 비교는 지정 input/TXT의 10개 Value만 사용한다. Static reference를 eigen +mode-shape gate로 추가하거나 기존 static 회귀를 Value-only를 이유로 삭제하지 않는다. +Numerical threshold·필수 case 구체화·FEAST control/budget/seed와 독립 반례 해소 판정은 NR, +TDD/runtime/reference 실행은 Implementation, 독립 물리 판단은 Physics 소유다. + + + + +## 제약 후 질량 공간, 유한 spectrum과 FEAST + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [formulation.md](formulation.md#formulation) + +[질량 유도 M1~M10](formulation.md#formulation-mass), [research evidence](research.md#research-evidence)의 +`S03`~`S08`, `P01`, `R03/R04/R07`를 적용한다. 아래 reduction은 +[r2 scale](formulation.md#formulation-stabilization)로 개선된 원형상 stabilized stiffness와 +**derived lumped mass**의 pencil에 정확히 대응한다. 기존 nonlinear trial tangent와는 별개다. + + +### E1. 조립, 단위 scaling과 실제 global 제약 + +Element gather `A_e`를 stable source node/component 순서로 정의하면 +`K=sum A_e^T K_e A_e`, `M=sum A_e^T M_L,e A_e`이다. 이하 `M`은 항상 lumped이다. +Element contribution→stable COO key→고정 순서 reduction으로 두 행렬을 조립한다. +Lumped nodal block이므로 `M`의 node 간 block은 0이다. Worker는 global storage를 +동시에 갱신하지 않는다. Source identity와 equation index는 다른 번호다. + +혼합 단위를 가진 6 DOF를 그대로 Euclidean norm으로 합하지 않는다. +활성 shell의 기존 최대 edge 길이들 중 최대값 `ell>0 [L]`을 characteristic length로 +선택하고 `D=blockdiag(ell I3,I3)`를 node마다 둔다. `q=D y`에서 `y`는 무차원, +`Khat=D^T K D [ML²/T²]`, `Mhat=D^T M D [ML²]`이다. +이는 congruence이며 physics와 lambda를 변경하지 않는다. + +원 global homogeneous BC의 free injection을 `C`라 한다. 고정 DOF의 행은 0, +free DOF의 행은 하나의 1이며 free 순서는 DofManager의 stable 순서다. + +\[ +y=C y_f,\qquad K_f=C^TKhat C,\qquad M_f=C^TMhat C. \tag{E1} +\] + +Nonzero prescribed base state는 이 procedure의 입력 오류다. 먼저 local 회전을 임의 +삭제한 뒤 global BC를 적용하지 않는다. 특히 global `UR3`와 drilling은 같지 않다. + + +### E2. Null/positive basis를 node마다 결정 + +각 active node의 원 질량 null은 M8로부터 `z_i=[0;d_i]` 한 방향이다. +따라서 node별 실제 free 좌표에서 null이 존재하는 필요충분조건은 +**constrained rotational component마다 해당 `d_i` 성분이 정확히 0**인 것이다. +그때 `Z_i=C_i^T z_i`는 unit null vector이며 otherwise null dimension은 0이다. +Translation constraint는 이 판정에 영향을 주지 않는다. 모든 회전이 고정이면 null도 없다. + +이 판정은 analytic nullspace와 실제 입력 BC의 교집합이다. 작은 nonzero constrained +director 성분을 임계값으로 0으로 바꾸지 않는다. 거의 정렬된 경우 작은 양의 physical +mass가 남을 수 있으며 이를 보존한다. Numerical conditioning 검증을 통과하지 못하면 +명시적 실패로 처리하고 free DOF를 추가 삭제하지 않는다. + +각 node에서 `Z_i`의 Euclidean 직교 여공간 basis를 `P_i^f`라 한다. +회전 3개가 free이면 기존 tangent basis `(a_i,b_i)`를 사용할 수 있다. Free 회전 2개 +안에 null이 있으면 그 평면에서 `d_i`에 수직인 단위벡터 하나, 회전 1개가 null이면 +positive 회전 basis는 없다. Free translation axis는 그대로 유지한다. +Null이 없으면 `P_i^f=I`다. Source component 순서, basis sign/tie는 고정한다. +Householder 등 동등한 작은 orthogonal construction을 쓸 수 있으나 physical rank를 +수치 eigenvalue cutoff로 정하지 않는다. + +\[ +P=\operatorname{blockdiag}(P_i^f),\quad Z=\operatorname{blockdiag}(Z_i),\quad +[P\ Z]^T[P\ Z]=I,\quad M_p=P^TM_fP\succ0,\quad M_fZ=0. \tag{E2} +\] + +여기서 `P_i^f`와 [M2의 tangent projector](formulation.md#formulation-mass)는 서로 다른 기호다. +실제 positive dimension `n=cols(P)`, null dimension `nz=cols(Z)`이다. +Reference의 full clamped flat mesh에서는 625개 interior node, +`nf=3750`, `nz=625`, `n=3125`가 예상된다. 실제 assembly와 rank evidence로 확인한다. + + +### E3. 개선된 stiffness에서 decoupling의 정확한 증명 + +공통 node director는 [shell geometry](../../src/fesa/model/shell_geometry.cpp)가 한 번 +정의하고 [ElementFactory::CreateShell](../../src/fesa/elements/element_factory.cpp)이 +node identity로 각 element에 전달한다. [MITC4 kernel](../../src/fesa/elements/mitc4_shell.cpp)의 +`PhysicalTransformation20`, `DrillingTransformation4`, `Stiffness`에서 M4의 구조를 확인했다. +옛 계수만 [S1/S2](formulation.md#formulation-stabilization)로 대체하며 모든 incident element의 +`k_d,e`는 finite positive다. Physical kernel과 공통 director·nodal drill map은 그대로다. + +한 node에만 `[0;d_i]`가 있는 full vector `z_i`에 대해 `T_p A_e z_i=0`이다. +Drilling 부분은 해당 node에만 작용하므로 + +\[ +Khat z_i=\kappa_i z_i,\qquad +\kappa_i=\sum_{e\ni i}k_{d,e}>0,\qquad +K_f Z=Z\operatorname{diag}(\kappa_i). \tag{E3} +\] + +마지막 등식은 E2에서 `z_i`가 **실제로 free space에 있을 때** 성립한다. +따라서 + +\[ +K_{pz}=P^TK_fZ=0,\quad K_{zz}=Z^TK_fZ=\operatorname{diag}(\kappa_i)\succ0, +\quad K_p=P^TK_fP,\qquad K_p p=\lambda M_p p. \tag{E4} +\] + +Finite mode의 massless 성분은 `z=0`이다. 이 projection은 arbitrary small coupling을 +버리는 근사가 아니라 승인된 physical/drilling separation의 항등식이다. +Null이 없는 부분 제약 node에서는 `P=I`이고 개선된 drilling contribution이 `K_p`에 +그대로 남는다. 이를 빼면 원 constrained stabilized pencil을 바꾸므로 금지한다. +여기서 원 pencil은 r2의 실제 BC 적용 후 K/M이다. 옛 K와 새 K의 spectrum 동일성은 +요구하지 않는다. S3의 complete K 공변성은 이 partial-BC contribution까지 포함한다. + +실제 floating-point matrix와 basis의 `M_f Z`, `K_fZ-Z diag(kappa)`, `P^T Z`를 +별도 evidence로 남긴다. 증명된 analytic null만 구조적으로 제거하고 계산된 tiny coupling을 +근거 없이 threshold로 버리지 않는다. 이 항등식의 roundoff 검증 및 복원 후 full free +residual이 NR 기준을 넘으면 assembly/director/conditioning 실패로 중단한다. +추가 massless mode를 찾아 제거하거나 개선된 K를 재조정하지 않는다. +S5의 nonlinear Hessian에는 corotation coupling이 있으므로 E3/E4를 모든 nonlinear +상태, preload 또는 prestressed eigenproblem에 적용하지 않는다. + + +### E4. 일반 Schur 식과 비정상 rank의 의미 + +E3의 구조가 없는 일반 symmetric pencil을 비교하면, `Kzz`가 가역일 때만 + +\[ +z=-K_{zz}^{-1}K_{zp}p,\quad +(K_{pp}-K_{pz}K_{zz}^{-1}K_{zp})p=\lambda M_p p. \tag{E5} +\] + +이는 massless row를 푼 정확한 elimination이며 massive DOF의 근사 Guyan reduction이 +아니다. 예를 들어 `K=[[6,2],[2,4]]`, `M=diag(2,0)`이면 +`lambda=5/2`, `z=-p/2`이다. 첫 행만 남기는 `lambda=3`은 잘못이다. +E5는 independent small-pencil 검산과 잘못된 projection을 잡는 기준이다. +이 Feature의 production shell 경로에는 E3이 적용되므로 일반 dense Schur 구현을 요구하지 +않는다. E3과 불일치하는 input을 E5로 자동 fallback하여 승인 geometry 문제를 숨기지 않는다. + +- `nz=0`: null 처리 없이 실제 constrained `Kf,Mf`의 문제다. +- Local positive rank 0: 모든 free DOF가 null이면 해당 node의 finite 좌표는 없고 + 양의 `Kzz`에 의해 그 free coordinate는 0으로 복원한다. Fully constrained node도 + finite 좌표 0개다. 다른 node의 유효 finite 좌표는 계속 보존한다. +- Global `n=0` 또는 `N>n`: 요청 모드가 존재할 수 없으므로 명시적 model/solve 실패다. + 정적 해석의 유효 `0×0 Kff` 계약과 이 양의 mode-count 요구를 혼동하지 않는다. +- 예상 `Kzz`가 singular/nonpositive이거나 활성 node에 mass contribution이 없음: + 유효 shell의 E3 전제가 깨진 것이다. Common `K/M` null이면 임의 lambda에 대한 + indeterminate direction이며 ordinary finite eigenmode가 아니다. 제거하거나 pseudoinverse, + stiffness/mass epsilon으로 정규화하지 않고 진단한다. +- 일반 indefinite `Kzz`의 singular/nonzero `Kpz` case는 descriptor-pencil의 추가 + constraint를 요구한다. 이번 positive stabilized shell과 다른 문제이며 자동 해석하지 않는다. + + +### E5. SPD whitening, 복원과 sparsity + +`M_p`는 node별 최대 `6×6` SPD block이다. 각 block을 Cholesky하여 +`M_p=L L^T`를 얻고 다음을 정의한다. + +\[ +A=L^{-1}K_pL^{-T},\quad p=L^{-T}x,\quad +A x=\lambda I x,\quad +\phi=D C P L^{-T}x. \tag{E6} +\] + +Inverse를 dense global matrix로 만들지 않고 작은 block triangular solve로 congruence를 +구성한다. `phi`는 source node의 global 6 DOF로 복원되고 constrained entries는 정확히 0이다. +`phi^T M phi=x^T x`다. Identity mass를 전달하는 E6도 실제 lumped mass에서 얻은 +generalized SPD 문제다. Consistent mass 또는 인공 unit physical mass로 바꾼 것이 아니다. + +Projection/whitening은 node 간 topology를 늘리지 않는다. 기존 node coupling마다 작은 +dense block만 생기며 전체 `O(n²)` Schur matrix와 dense inverse를 피한다. +Sparse shifted FEAST factorization 자체의 fill은 별도 존재한다. Full `M_C`는 element별 +`24×24`와 세 `4×4` moment로 검증할 수 있고 global dense consistent matrix는 불필요하다. +Allocation/nnz/factorization memory 실패는 불완전 모드의 성공이 아니라 명시적 failure다. + + +### E6. 유한 search interval과 요청 개수 + +요청 `N`은 `.inp *FREQUENCY`의 양의 정수이며 현재 reference는 10이다. +Reference Value/Freq/행수는 interval, scale, count 또는 parameter 선정에 사용하지 않는다. + +먼저 `s=||A||inf [T^-2]`를 안정된 합으로 계산한다. `s>0`이면 `B=A/s`로 두고, +반환값은 `lambda=s mu`다. `A=0`이면 `s=min_e E_e/(rho_e ell²)>0`라는 +모델 유래 time scale을 사용하며 `B=0`이다. 이 zero-matrix case도 N개의 0 모드를 +FEAST에서 계산·검증한다. Invalid/underflow/overflow scale을 임의 1로 바꾸지 않는다. + +각 행의 off-diagonal absolute sum을 `r_i`라 하면 Gershgorin에 의해 +`min_i(Bii-ri)<=mu<=max_i(Bii+ri)`다. 안정된 directed-outward accumulation 또는 +동등하게 증명된 roundoff bound를 포함하여 finite enclosure `[gL,gU]`를 만든다. +`B=0`에서는 알고리즘용 dimensionless enclosure `[-1,1]`을 사용한다. +Nonzero B의 endpoint margin은 NR가 정할 dimensionless coefficient와 `||B||inf` 및 +endpoint ULP로 결정하고, outward `nextafter`를 적용해 `a0=N`인 마지막 safe upper를 쓴다. + Representable midpoint가 없거나 NR endpoint separation 폭에 도달하면 subdivision을 + 끝낸다. 경계에 있는 반복 고유치의 일부만 count하도록 tolerance를 조정하지 않는다. +3. 불필요하게 먼 lower bound를 줄이기 위해 `a=a0`, 위에서 얻은 `b=hi`로 시작한다. + `v=(a+b)/2`의 prefix count가 0이면 `a=v`로 이동하고, 양수이면 이 하한 축소를 끝낸다. + 따라서 `(a0,a)`의 empty-prefix evidence를 잃지 않는다. 아주 작은 고립 cluster에서 + 넓은 구간이 검색 실패를 유발하는 Intel의 경고를 이 과정과 후검증으로 다룬다. +4. 최종 `(a,b)`에서 다시 count하여 `c>=N`이고 알려진 prefix와 일치함을 확인한다. + Capacity는 `m0=min(n,max(c+8,ceil(3c/2)))`로 한다. `c=n`이면 `m0=n`이다. + Checked integer arithmetic을 쓰며 큰 multiplicity도 전체 count를 수용한다. +5. Solve 성공 후 모든 `c`개를 독립 검증하고 정렬하여 첫 N개를 결과 candidate에 넣는다. + 같은 eigenvalue의 multiplicity를 지우거나 평균내지 않는다. N번째가 repeated/cluster의 + 내부에 있으면 내부 계산 group은 보존하고 출력 row는 정확히 N개다. + +Midpoint·endpoint 이동은 overflow-safe하게 수행한다. NR는 count-call budget, +endpoint separation coefficient와 perturbation 횟수를 구현 전에 고정한다. Budget은 +각 search 및 endpoint 재시도까지 포함하는 유한 정수다. `-5` 등의 endpoint 실패 시 +기록된 bracket 안에서 NR가 정한 간격으로 양옆의 endpoint 후보를 순서대로 평가하며, +성공한 prefix/count evidence 없이는 bracket을 갱신하지 않는다. 마지막 valid bracket이 +없거나 count monotonicity/total count가 맞지 않으면 실패다. Search 최적화 budget에 +도달하면 이미 검증된 enclosing bracket을 쓸 수 있으나 실패한 count를 성공으로 바꾸지 않는다. + +Postsolve에서는 returned `m=c`, finite paired vectors/values, Gram rank, interval 내부 +및 endpoints와의 separation을 확인한다. Endpoint에 너무 가깝거나 `info=1/2/3`, +count/solve mismatch이면 NR가 정한 유한 회수 안에서 safe bracket 확대·재count·capacity +확대만 허용한다. 매번 count/solve history를 보존한다. 그 뒤에도 불일치하면 실패하고 +부분 모드 또는 다른 eigensolver로 fallback하지 않는다. Formulation은 이 수학적 알고리즘을 +NR에 인계한다. 구현 진입 bundle은 다음 stage가 수치값·budget을 고정한 뒤 완성된다. + +Full enclosing bound, empty-prefix, interval count와 solve-count/Gram 검증은 낮은 N개의 +누락을 탐지하는 서로 다른 evidence다. Intel의 documented total count를 모든 conditioning, +endpoint 및 floating-point 상황의 completeness theorem으로 확대하지 않는다. +독립 known-spectrum의 zero/negative/cluster/repeated/size1/request=n case와 실제 +설치 runtime 검증이 필수 연결점이며 선택 및 수치 기준은 NR가 소유한다. + + +### E7. FEAST 경계와 deterministic 실행 + +Actual eigenpairs는 `dfeast_scsrgv`로 E6의 `(A,I)` 또는 E6에서 동일하게 scale한 +`(B,I)`를 풀어 구한다. Real symmetric, SPD second matrix, `n>0`, +`0 +### E8. Mode identity, normalization과 상태 + +모든 returned eigenpair를 lambda 오름차순으로 함께 정렬한다. Equal lambda의 tie는 +original solver column order로 안정 정렬한다. Near-equal 값을 평균하거나 merge하지 않는다. +양의 modal mass로 column별 normalize하고, 가장 큰 absolute scaled global component의 +sign이 양수가 되도록 한다(source DOF 순서로 tie 결정). 서로 다른 eigenvalues의 벡터를 +Gram 보정 목적으로 임의 혼합하지 않는다. Failed orthogonality는 solve/validation 실패다. +정확한 repeated eigenspace의 다른 orthonormal basis는 같은 해이고 mode-shape external +matching은 없다. Density scaling/좌표 테스트는 repeated group의 projector로 비교한다. + +Normalized `phi^T M phi=1`의 수치 convention에서 `phi_u`의 차원은 `M^-1/2`, +`phi_theta`는 `M^-1/2 L^-1`이고 modal amplitude가 `M^1/2 L`를 가진다. +Mode vector는 실제 응답 변위가 아니다. Scalar `lambda [T^-2]`와 source step/mode +identity를 분리하고 internal node/equation number를 source label로 노출하지 않는다. + +원형상·density 검증→consistent/moment 검증→lumped 검증→K/M 조립→실제 BC→E2~E6 +admissibility→E6~E7 FEAST→global 복원/독립 검증→candidate 결과 순서다. +반환 lambda는 부호를 보존한다. NR 기준상 유의한 음수는 불안정/invalid spectrum 실패, +near-zero는 분류와 raw value를 함께 유지하며 0으로 clamp하지 않는다. +양수에서만 `f=sqrt(lambda)/(2pi)`를 파생한다. 정확한 0은 f=0이고 작은 음수에는 +실수 frequency를 만들지 않는다. 이 validity의 저장 방식은 I/O owner가 정한다. + +N개 검증이 끝나기 전에 accepted state를 바꾸지 않는다. 검증된 candidate HDF5를 +완성·검증·close한 뒤 final replacement를 수행하고 성공 뒤 준비된 state를 교환한다. +Replacement 이후 state 교환은 실패하지 않도록 준비한다. 제어된 solve/validation/write/ +finalization failure에서 이전 accepted state와 기존 final HDF5를 보존한다. +Crash/power loss까지 원자성을 새로 주장하지 않는다. Live log lifecycle은 별도다. +Modal residual의 constrained 성분을 static reaction으로 출력하지 않는다. + + + + +## 질량과 modal candidate의 검증식 및 Numerical Review 인계 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [formulation.md](formulation.md#formulation) + +[질량 식 M1~M10](formulation.md#formulation-mass), [축소·복원 식 E1~E8](formulation.md#formulation-eigen), +[개선된 scale·공변성 S1~S8](formulation.md#formulation-stabilization)의 +기호를 사용한다. 이 문서는 측정량과 zero branch를 정의하며 수치 acceptance 값과 +필수 benchmark 선정은 Numerical Review가 독립 검토하여 고정한다. +외부 기준의 수치는 [TOLERANCE](../TOLERANCE.md)를 그대로 적용한다. + + +### V1. 공통 scale과 zero branch + +행렬·벡터 norm을 계산하기 전에 E1의 길이 congruence를 적용한다. 질량은 모두 +`ML²`, stiffness는 `ML²/T²` 단위가 된 행렬에서 norm을 계산한다. Element-only +oracle에서는 `ell=Le`를 사용하고 assembled 비교에는 동일 global `ell`을 사용한다. +Norm과 sum-of-squares는 overflow/underflow를 피하는 scaled accumulation을 사용한다. +입력/행렬/각 eigenpair가 finite인지 먼저 검사한다. + +이 문서의 모든 ratio `a/b`는 `b>0`에서만 계산한다. `a=b=0`이면 해당 항등식의 +zero-case metric은 0이다. `b=0,a!=0`이면 named zero-scale failure이며 무한값/NaN +metric으로 성공 결과를 만들지 않는다. `max(1,b)`, arbitrary floor 또는 zero clamp는 없다. + +대칭성은 `eta_sym(Q)=||Q-Q^T||F/||Q||F`이다. Diagonal copy로 생성한 symmetry와 +독립 quadratic-work 검증은 구분한다. Cross-basis equality `R=S`는 +`||R-S||F/(||R||F+||S||F)`로 측정한다. Mass/stiffness를 같은 norm의 분모에 직접 더하지 +않고 필요한 lambda나 시간 scale을 곱한다. + + +### V2. 질량, rank와 보존 검증 + +- M10의 entrywise scalar oracle와 `M_C` quadratic form을 독립 적분과 비교한다. + 계수·부호/두께 차수가 같은지를 component별 확인한 뒤 전체 norm을 사용한다. +- M5에서 구성한 `M_C`와 원본 moment, M6의 row-sum 결과, M7의 independent direct + integration을 따로 비교한다. 변조한 C(1)/C(2)가 lumped 결과 및 검증에 반영되는지 + 확인하여 두 mass 계산이 끊긴 우회 경로를 잡는다. +- Mass original과 derived 모두 `d_i` 방향의 null action을 검사한다. + Element/global scaled matrix에서 `eta_null=||Mhat z||2/(||Mhat||F ||z||2)`를 쓴다. + Lumped는 M8의 양의 두 항 및 physical positive-space Cholesky로 rank5를 검증한다. + Consistent physical 20-coordinate matrix도 positive여야 한다. 잘못된 quadrature에 + 의한 추가 hourglass/null mass를 허용하지 않는다. +- `mi>0`, `ji>0`, `zi=hi/mi`, `vi=ji/mi-zi²>0`를 검사한다. + `vi/ell²`, `|hi|/sqrt(mi ji)`는 dimensionless conditioning evidence다. + 양의 `vi`를 낮은 rank로 바꾸는 기준을 두지 않는다. Direct centered integral + `integral rho Ni (z-zi)² dV`와 `ji-hi²/mi`의 일치는 cancellation을 드러낸다. +- Scaled node positive mass의 Cholesky reconstruction error와 reciprocal condition + estimate를 기록한다. 후자는 작은 block inverse action의 norm으로 계산할 수 있다. + 물리 positive/null rank는 E2로 정하고 ill-conditioning은 별도 실패다. +- 총 질량은 uniform translation의 `q^TMq/|u|²`, geometry 적분의 `m=sum mi`를 + 비교한다. Spatial centroid는 M5의 scalar moment로 얻은 + `sum(mi Xi+hi di)`와 독립 `integral rho X dV`를 비교한다. + 좌표 원점으로 인한 cancellation을 피하려면 한 source node `Xref`를 공통 원점으로 + 잡고 first moment 차이를 `m ell`로 나눈다. +- M9의 `Delta=q_dot^T(M_L-M_C)q_dot`와 nonnegative pairwise integral을 독립 비교한다. + Scale은 `q_dot^T M_L q_dot + q_dot^T M_C q_dot`이며 zero motion/null-only field는 + 별도 zero branch다. Arbitrary velocity에서 equality를 요구하지 않는다. + + +### V3. Reduction과 full modal residual + +`y_f=C^T D^-1 phi`, `k=||Kf||F`, `m=||Mf||F`라 두면 + +\[ +r_f=K_f y_f-\lambda M_f y_f,\qquad +\eta_r=\frac{\|r_f\|_2}{(k+|\lambda|m)\|y_f\|_2}. \tag{V1} +\] + +이것이 **모든 원 free DOF**의 inertia/elastic force balance다. 물리 공간에 +project한 residual만으로 drilling/null 복원 오류를 놓치지 않는다. +`Kf y_f` 및 `Mf y_f`를 solve에 사용한 축소 matrix를 재사용하지 않고 원 조립값에서 +검산한다. `Mf`는 actual lumped이며 consistent로 바꾸면 잘못된 metric이다. +`lambda=0`에서도 `k>0`이면 유효한 denominator가 있다. `Kf=0,lambda=0`은 zero branch, +zero eigenvector는 normalization 이전부터 실패다. + +Whitened solve의 추가 metric은 `eta_w=||A x-lambda x||2 / +((||A||F+|lambda|)||x||2)`다. Backend `res/epsout`, eta_w, eta_r은 서로 다른 evidence다. +E3의 identity도 다음으로 검산한다. + +\[ +\eta_{KZ}=\frac{\|K_fZ-Z\operatorname{diag}(\kappa)\|_F} +{\|K_f\|_F\|Z\|_F+\|Z\operatorname{diag}(\kappa)\|_F},\quad +\eta_{MZ}=\frac{\|M_fZ\|_F}{\|M_f\|_F\|Z\|_F},\quad +\eta_{PZ}=\|P^TZ\|_F. \tag{V2} +\] + +`nz=0`이면 V2는 적용 대상 없음으로 기록한다. M8/E3의 analytic proof가 먼저이고 +V2 threshold만으로 새로운 nullspace를 발견하거나 coupling을 생략하지 않는다. +Kzz positivity와 `n/nz/nf`를 source node별 예상 null 여부와 연결한다. +Constraint metric은 `||(I-CC^T)D^-1 phi||2/||D^-1 phi||2`이며 source에 복원한 +constrained components 자체도 exact zero를 확인한다. + + +### V4. Mass normalization, Gram, energy와 Rayleigh + +각 mode의 generalized mass `g_i=phi_i^T M phi_i=y_i^T Mf y_i`는 finite, strictly +positive여야 한다. `phi_i <- phi_i/sqrt(g_i)`로 normalization한 뒤 재계산한다. +계산된 전체 c개 column에 대해 + +\[ +G_{ij}=\phi_i^T M\phi_j,\quad +\eta_{norm,i}=|G_{ii}-1|,\quad +\eta_{orth,ij}=\frac{|G_{ij}|}{\sqrt{G_{ii}G_{jj}}}\ (i\ne j),\quad +\eta_G=\frac{\|G-I\|_F}{\sqrt c}. \tag{V3} +\] + +Column pairing과 linear independence를 확인하며 FEAST의 c와 N을 구분한다. +부족한 rank를 같은 vector 복사로 채우면 V3에서 실패한다. + +\[ +h_i=y_i^TK_fy_i,\quad R_i=h_i/g_i,\qquad +\eta_{energy,i}=\frac{|h_i-\lambda_i g_i|} +{(k+|\lambda_i|m)\|y_i\|_2^2}. \tag{V4} +\] + +`R_i [T^-2]`는 Rayleigh quotient다. V4는 eigenvalue가 0인 경우에도 쓸 수 있고 +`|R_i-lambda_i|/|lambda_i|`만을 강제하지 않는다. 단위 modal amplitude에서 elastic +energy는 `h_i/2`, peak kinetic energy는 `lambda_i g_i/2`다. Physical/drilling 분해가 +필요한 내부 검산에서는 `h_phys+h_drill=h_i`를 확인하되 별도의 drilling-energy +acceptance나 output quantity를 추가하지 않는다. + + +### V5. Rigid mode, coordinate 및 density 불변식 + +Free valid shell/patch의 rigid fields는 `u_i=c+Omega cross Xi`, +`theta_i=(I-di di^T)Omega`이다. 그 span에는 세 병진과 세 회전이 있다. +각 vector의 scaled K action을 `||Khat y||2/(||Khat||F ||y||2)`로 검증하고 +mass Gram rank로 여섯 물리 움직임의 independence를 확인한다. +`Omega`의 full normal 성분을 UR에 넣어 drilling energy를 자극한 field는 이 테스트가 아니다. +Physical rigid zero eigenvalues는 finite mass 모드이고 E2의 massless drilling과 다르다. +Clamped reference에 여섯 zero mode를 요구하지 않는다. + +Global rigid coordinate rotation과 독립 node별 tangent 재생성에서 두 질량, +physical/numerical contribution 및 **complete stiffness**의 congruence와 E1~E6 spectrum +불변성을 검사한다. S1의 scale을 새 geometry/frame에서 다시 계산하여 S3/S4를 검증한다. +고정된 tensor에 회전행렬만 곱하는 검사로 대체하지 않는다. Norm은 V1의 same-unit +congruence ratio, scalar scale은 `|kd'-kd|/(|kd'|+|kd|)`다. Spectrum은 같은 operator +time scale `s`로 `|lambda_i'-lambda_i|/s`를 측정하며 repeated 그룹은 아래 projector를 쓴다. + +같은 물리 BC가 양쪽에서 지원되는 **partial rotation BC**를 포함하고, +[S6](formulation.md#formulation-stabilization--s6-nr-mfe-001의-새-algebraic-target과-정적-대응)의 +NR-MFE-001 geometry/45° 회전 및 대응 정적 response/reaction을 필수 통과 사례로 둔다. +Full-free/full-clamp만으로 대체하거나 반례를 warning-only로 내리지 않는다. +Partial BC에 남는 개선된 stabilization도 포함하며 기존 K와 새 K의 값이 같을 필요는 없다. +Rotation 후 다른 물리 component BC를 같은 문제로 비교하거나 새 MPC 입력을 추가하지 않는다. + +Nonlinear rigid motion은 기존 total triad의 finite rotation과 objective gamma를 사용한다. +S5의 potential/residual/Hessian을 검증하며 위 linear tangent-projected UR field 및 +massless projection을 nonlinear 상태에 적용하지 않는다. 개선 전 scale 공식만을 기대한 +기존 검사는 S1로 갱신하고 나머지 rigid/patch/physical positivity acceptance는 보존한다. + +모든 density를 동일 `c_rho>0`로 바꾸고 geometry/material stiffness/BC를 유지하면 + +\[ +M_C'=c_\rho M_C,\quad M_L'=c_\rho M_L,\quad +\lambda_i'=\lambda_i/c_\rho,\quad +\Phi'=\Phi Q/\sqrt{c_\rho}. \tag{V5} +\] + +단일 simple eigenvalue에서는 Q가 sign이고 repeated group에서는 orthogonal mixing이다. +Eigenvalue scaling error는 `|c_rho lambda_i'-lambda_i|/s`로 측정한다 +(`s`는 baseline E6 operator time scale). Group vector 비교는 +`U=L^T P^T C^T D^-1 Phi`, `U'=L^T P^T C^T D^-1(sqrt(c_rho) Phi')`로 정의한 +projector 차이 `||UU^T-U'U'^T||F/sqrt(2r)`를 사용한다. r은 group dimension이다. +Dense projector를 구성하지 않고 orthonormal U/U'의 cross-Gram으로 같은 norm을 계산할 +수 있다. Arbitrary clustered-but-distinct vectors를 회전하여 다른 eigenpairs로 만들지 않는다. + + +### V6. Lowest N, cluster, near-zero와 오류 판정 소유권 + +E6 count/solve history는 각 `(a,b)`, prefix empty evidence, status, count, m0, +returned m, loop/epsout, bounds source와 final selected ranks를 보존한다. +모든 returned pair에 interval separation을 검사하고 requested N개만 검사하지 않는다. +Near-zero/negative 분류 scale은 `s` 또는 그와 동등한 E6 operator scale이며 reference +최소값이나 arbitrary absolute frequency가 아니다. Raw lambda는 바꾸지 않는다. + +NR가 구현 전에 결정해야 할 항목은 다음과 같다. + +| 대상 | 수치값/필수 검사 소유권과 필요한 scale | +| --- | --- | +| Matrix symmetry, moment/oracle/centroid/M9 | V1/V2의 same-unit norm, total mass 및 `m ell`; roundoff/독립 적분 오차 분리 | +| Null/orthogonal basis, KZ/MZ, mass conditioning | M8/E2 analytic rank, V2 및 작은 positive block condition; near-null 삭제 금지 | +| Residual, Gram, energy, rigid modes | V1~V4, V5 K-action; machine precision·차원·conditioning 근거 | +| Near-zero/negative/cluster 분류 | `|lambda|/s`, pairwise `|lambda_i-lambda_j|/s`; raw value 보존 | +| FEAST control | Contour points/precision exponent/refinement bound, finite count/endpoint/solve retry budget | +| Endpoint safety | Operator scale와 ULP, count monotonicity, enclosing total n, solve/count 및 full-rank Gram | +| Independent test portfolio | 평판 M10, warped/director-varying M5~M9, 비축정렬/부분 BC/E5 오류 case, FEAST known spectra, density/rigid/좌표 tests | +| r2 stabilization/static | S1~S8의 positivity/재계산 공변성·partial BC eigen/static, nonlinear 고정 scale·exact variation과 기존 static portfolio | +| External reference | r1 NR의 원본 input+TXT 10개 Value·singleton family·모두 blocking 논리 계약을 r2 영향 확인 후 유지 | + +Small independent pencil은 손으로 대각화 가능한 값을 사용하고 동일 production +mass/reduction/eigensolver를 기대값 계산에 호출하지 않는다. API wrapper의 injected status +검사와 실제 FEAST runtime known-spectrum 검사는 모두 필요하다. Size1, N=n, repeated +group>N, tight cluster, zero/negative, empty interval, insufficient subspace, count collision, +unresolved conditioning 및 allocation/index failure가 해당 공식 계약을 검증한다. +Case의 구체적 목록·숫자는 NR가 정하고 Planning이 tests와 TDD steps에 연결한다. + +외부 비교는 지정 [원본 input](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp)과 +[원본 TXT](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt)의 +`Value`만 사용한다. `lambda [T^-2]`, source `Step-2`, mode 1..10이 의미적 대응이다. +Frequency 재계산, mode shape correlation이나 다른 mass variant의 더 가까운 결과 선택으로 +이를 대체하지 않는다. Mode/frame은 NR/I/O가 common same-frame family 규칙에 맞춰 +정의하고 missing/extra/duplicate/nonfinite를 tolerance 전에 거부한다. +[r1 reference-model](reference-model.md)의 10개 singleton family·모두 blocking 계약과 +공통 정책에 따른 실효 mode별 1%는 보존할 근거다. Formulation이 이를 재선택하지 않으며 +r2 영향 재확인은 NR 소유다. V1~V6의 내부 수치 기준은 아직 NR에서 최종 고정하지 않았다. +Schema 경로/저장 field/public diagnostic 이름은 I/O owner의 계약이다. + + +### V7. 실행 evidence와 남는 위험 + +이 절의 명령·hash·4문서 검사는 **r1 이력**이다. r2 갱신 evidence는 V8에 둔다. +Formulation 단계에서는 승인 문서와 실제 source를 read-only로 대조하고 자체 수식을 +전개했다. 다음 입력은 변경하지 않았다: requirements/research, 관리문서, source/tests/build, +Harness, 공통 tolerance 및 원본 reference. External solver, CMake/CTest, Harness, FEAST +runtime, numerical reference comparison은 실행하지 않았다. 이 문서는 수치 통과 evidence가 아니다. + +`Get-Content`, scoped `rg`로 M4의 변환·stabilization과 공통 nodal frame 전달을 확인했다. +한 scoped `rg` 호출은 존재하지 않는 `runtime_element_factory.cpp`와 PowerShell literal +glob 경로 때문에 exit `1`이었다. `rg --files`/`rg -n ... src/fesa`로 실제 +`element_factory.cpp`, `shell_geometry.cpp`를 찾아 재조회했고 exit `0`이었다. +Intel parameter/API/status의 공식 문서를 2026-09-06 다시 열어 count 의미, +endpoint/count failure와 m0 capacity를 확인했다(E7의 URL 및 research S05~S07). + +`Get-FileHash`는 exit `0`이며 원본 SHA-256은 upstream과 같다. +Input: `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`. +TXT: `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`. + +Owned 4개 문서를 `python -B -` read-only here-script(`pathlib`, `re`, +`urllib.parse.unquote`)로 정적 검사했다. Owner/Feature/revision, 26개 requirement +coverage, 상대 링크 실재, trailing whitespace/final newline, display-math delimiter와 +언어 혼입을 검사했다. Exit `0`, documents `4`, local links `38`, requirements `26`, +issues `0`이다. `git diff --check`도 exit `0`이며 Coordinator 소유 `coordination.md`의 +LF/CRLF warning만 출력되었다. 새 untracked owned 문서의 whitespace는 위 Python 검사로 +별도 확인했다. `git status --short`에서 owned 4개와 타 owner coordination 변경을 구분했으며 +stage/commit 또는 타 owner 수정은 하지 않았다. + +잔여 위험은 매우 얇은 shell/거의 정렬된 부분 BC의 mass conditioning, geometry quadrature +검사점 밖의 전역 injectivity 한계, floating-point FEAST count/endpoint와 repeated subspace, +count scratch 및 shifted factorization memory다. NR가 위 metric·수치 기준·case를 고정하고 +Implementation이 실제 설치 backend와 reference evidence를 제시해야 해소된다. + + +### V8. r2 영향 확인과 bounded evidence + +r2에서는 M4의 scale, E3의 개선된 pencil 명시, V5의 complete K/partial-BC coverage와 +정적 회귀 연결을 갱신했다. Mass M1/M2/M5~M10 및 FEAST E6~E8, V1~V4의 검증식은 +numerical scale 선정과 독립이거나 동일 개선된 K를 대입하는 식이므로 보존한다. +r1 NR의 curved rational mass oracle·27점 degree 결과, count/trace API 근거와 reference +identity는 읽고 재사용 범위를 확인했으며 새 실행 결과로 바꾸지 않았다. + +`Get-Content`와 scoped `rg`로 r2 승인 요구/연구·기존 선형 요구 034/036/038/056, +nonlinear §10.1~10.4 및 아래 실제 source를 대조했다. 이 조회는 exit `0`이었다. + +```powershell +rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_reference|drilling_stiffness' src/fesa/elements/mitc4_shell.cpp +rg -n 'drilling|Drilling|Stiffness\(' src/fesa/elements -g '*nonlinear*' +``` + +처음 nonlinear source 검색에 literal `src/fesa/elements/*nonlinear*`를 사용한 호출은 +PowerShell 경로 오류를 출력했다. 해당 검색을 위 `-g` 방식으로 고쳐 exit `0`을 확인했다. +원본 reference 및 기존 NR mass oracle/옛 반례를 다시 실행하지 않았다. +2026-09-06 web `open`으로 S1의 LAPACK 공식 문서상 작은 eigenvalue 상쇄 경고를 확인했다. +Configured vault grounding 요청이 없으므로 `fem-theory-query`는 별도 적용하지 않았다. + +다음은 NR의 R block을 사용해 **새 scale 식의 exact arithmetic만** 확인한 명령이다. +Production source prototype, C++ test, FEAST 또는 독립 NR 판정을 대체하지 않는다. + +```powershell +@' +from fractions import Fraction as F +aa,bb=F(49,12),F(23,6) +base=[]; rotated=[] +for ab in [F(1,8),-F(1,8),F(1,8),-F(1,8)]: + base.extend([aa,bb]) + rotated.extend([(25*aa+16*bb+40*ab)/41, + (16*aa+25*bb-40*ab)/41]) +ref=sum(base)/8 +assert ref == sum(rotated)/8 == F(95,24) +kd=ref/1000 +mass=F(3,50) +stiffness=F(9,25)*bb+F(16,25)*kd +assert kd == F(19,4800) +assert stiffness == F(10369,7500) +assert stiffness/mass == F(10369,450) +assert F(3,5)*(-F(4,3))+F(4,5) == 0 # d dot (5b/3) +print('k_ref=',ref,'k_d=',kd,'Mff=',mass,'Kff=',stiffness, + 'lambda=',stiffness/mass,'theta_per_unit_moment=',1/stiffness) +'@ | python -B - +``` + +실제 위 here-script를 문서에서 추출해 `python -B -`로 실행했다. Exit `0`, +`k_ref=95/24`, `k_d=19/4800`, `Mff=3/50`, `Kff=10369/7500`, +`lambda=10369/450`, 단위 moment 응답 `7500/10369`를 얻었다. +Owned 5개 문서의 metadata·27 requirement coverage·57개 상대 경로·whitespace·final newline· +display-math delimiter·언어 혼입을 read-only Python으로 검사했고 exit `0`, issues `0`이었다. +`git diff --check`도 exit `0`; LF/CRLF 안내만 있었으며 compiler warning 검증과는 별개다. +Stage/commit은 하지 않았고 `git status --short`의 Coordinator 변경은 보존했다. + +이 exact 식에 수치 tolerance를 추가하지 않는다. NR가 S1~S8을 독립 검토하고 V6의 내부 기준· +FEAST budget/seed·mandatory matrix를 완성해야 한다. Implementation은 승인된 기존 static +portfolio와 새 eigen Value-only 비교의 실제 TDD/runtime evidence를 생성해야 한다. +Source/tests/build/phase/Hook/reference/Git 및 다른 owner 문서를 편집하지 않았다. +CMake/CTest·Harness·FEAST·외부 solver·reference numerical comparison은 이 단계에서 미실행이다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-environment.md b/docs/mitc4-shell-feast-eigen/implementation-environment.md deleted file mode 100644 index 4f63c83..0000000 --- a/docs/mitc4-shell-feast-eigen/implementation-environment.md +++ /dev/null @@ -1,1003 +0,0 @@ -# 구현 환경·실행시간·evidence 운영 계획 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `implementation-planning-agent` -- Input contract revision: `r2` -- 기본 보고서: [implementation-plan](implementation-plan.md) - -E1/E2의 현재 값과 실행 전 표현은 최초 계획 시점 기록이다. Prep attempt1 종료 뒤 네 runtime -상수만 부분 변경되었고 Hook1800은 남았다. [복구 계획](implementation-recovery.md)의 WIP -보존·명시 승인·status-only checkpoint가 실제 완료되기 전 재실행하거나 main을 활성화하지 않는다. -실제 source echo의 classifier 오판도 prep의 최소 TDD 범위다. 이미 import된 Executor에는 -Codex의 classifier source 수정이 자동 반영되지 않는다. 새 process activation과 재차 terminal -차단의 처리 경계는 [복구 계획](implementation-recovery.md)을 따른다. - -## E1. 실제 backend와 preflight - -[현재 환경 evidence](coordination.md#후속-실행-준비-관찰)를 적용한다. 이 계획 단계에서는 -Harness, CMake/CTest, C++ 또는 FEAST를 실행하지 않는다. Root의 과거 관찰은 신규 gate 성공이 아니다. - -| 선택 | 실제 값 | -| --- | --- | -| Repository | linked worktree, `C:/Users/baram/orca/workspaces/FESADev/Eigen`; Git top-level과 Harness ROOT 동일 | -| Baseline | I/O checkpoint `1d4f5ac`; 사용자 branch `Eigen`에서 계획 작성 | -| Harness config | `.harness/config.json` 없음; autodetect CMake | -| Build | Visual Studio 18 2026 / MSVC / x64 / Debug / `.harness/build` | -| GoogleTest | `C:/git/googletest` | -| MKL_DIR | `C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl` | -| TBB_DIR | `C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb` | -| HDF5_DIR | `C:/Program Files/HDF_Group/HDF5/2.1.1/cmake` | -| Observed MKL configuration | 2026.1 / dynamic / intel_ilp64 / intel_thread; 실제 FEAST 실행에서 version/ABI를 다시 기록 | -| Python / CLI | Python3.11.15; python/uv/cmake/ctest/codex resolved. Codex transport/login은 아직 실행 검증 전 | -| Executor role | `.codex/agents/implementation-agent.toml`, gpt-5.6-terra / xhigh / workspace-write | - -개인 설치 경로를 C++/CMake source에 고정하지 않는다. 아래는 이 workstation의 local cache -구성 명령이며 이미 Root가 exit0으로 확인했다. 실제 실행 전 cache의 경로/compilers/platform을 -다시 읽고 stale/missing이면 동일 환경 준비 명령을 실행한다. - -```powershell -cmake -S . -B .harness/build -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" -``` - -다음부터는 Step의 unadorned configure/build/CTest 명령을 사용한다. Preset은 dependency -환경변수4개를 참조하므로 현재 미설정된 부모 환경에서 preset을 호출하는 계획은 선택하지 않는다. -VS generator는 CMake가 MSVC를 선택하고 `--config Debug`/`-C Debug`로 검증한다. -필수는 CMake/MSVC/x64/Debug이며 Ninja 예시 자체가 필수는 아니다. Hook도 같은 absent-config -autodetect를 사용한다. Subprocess 환경을 부모 Stop에 전파했다고 가정하지 않는다. - -## E2. 최소 deadline 변경과 근거 - -Actual code의 다음 모두가 유한 제한을 적용한다. 지원되는 CLI/config timeout option은 없다. - -| 경계 | 현재 | prep 후 | -| --- | ---: | ---: | -| StepExecutor Codex wrapper | 1800 | 14400 | -| 등록 Stop outer | 1800 | 7500 | -| Stop discovery/configure/build/discovery/CTest shared | 1800 | 7200 | -| CommandSpec default per-command | 1800 | 7200 | -| execute_plan의 명시 deadline 없는 default shared | 1800 | 7200 | - -전체 regression duration의 기존 합산 추정은1672.67초(약27.9분)다. 이는 여러 run의 값이며 -단일 full suite wall time/pass가 아니다. 추가 eigensolver tests와 fresh reference 비용은 -미측정이다. 7200초는 기존 약28분 검증에 초기 실행/신규 numerical tests 여유를 두되 유한하게 -중단하는 운영 상한이다. Registered7500은 shared7200 종료/진단을 위한300초 여유, -wrapper14400은 coding·RED/GREEN·focused·수동 full VERIFY와 등록 Stop을 함께 감싼다. -상한을 더한 값을 실제 소요 시간이라고 보고하지 않는다. - -Main은8개 Step이다. 각 Step은 하나의 완결된 API/data boundary를 담당하고 동일 session에서 -작은 behavior별 RED/GREEN을 반복한다. 통상 coding/focused 약2시간 안, 수동 full과 Stop 각 -약30~45분을 고려한 분해다. 이는 실행 예산 설계이며 소요 보장이나 시험 결과가 아니다. -예상보다 늦거나 failure이면 terminal evidence를 남기고 Coordinator가 원인을 분류한다. -Timeout을 무한대로 만들거나 test/Hook를 생략하지 않는다. - -14개 초기 소단위를8개로 합쳐 불필요한 전체 검증 반복6회를 줄였다. Model+parser는 같은 -frequency/density 정의, consistent+lumped+assembly는 같은 moment snapshot, call+search는 -하나의 FEAST result/history, validation+procedure는 한 candidate, writer+CLI는 한 transaction, -comparator+fresh execution은 한 source matching 결과를 완성한다. Stabilization과 reduction은 -각각 기존 static 영향과 analytic positive/null 경계라 독립 Step으로 유지한다. - -## E3. One-time bootstrap와 새 process activation - -일반1800초 invocation은 prep 중 source self-edit로 이미 시작된 wrapper의 timeout을 늘리지 -못한다. Pressure 일부는 same-binary HDF5 cache를 사용하지만 -`RunFesaApplicationOnCopiedInput()`은 nonlinear reference solver를 매번 직접 호출한다. -따라서 full VERIFY+registered Stop을 모두 cached/빠르다고 가정하지 않는다. - -Root와 Coordinator가 사용자 승인된 가역적 운영 준비로 해석한 **one-time module invocation**을 -prep에만 사용한다. 기존 CLI option이 아니다. 실제 module을 import하고 한 유한 class timeout만 -설정한 뒤 unchanged `main()`을 호출하므로 기존 argparse/preflight/branch/ownership/sandbox/ -terminal result/transport retry/commit/finalization 경로를 그대로 실행한다. - -```powershell -python -B -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" mitc4-shell-feast-eigen-execution-prep -``` - -Bootstrap은 Hook state/reentry flag/execution method를 override하지 않는다. Prep에서 -`.codex/hooks.json`을 수정해도 이미 launch된 Codex의 registered Stop outer1800이 유지될 -수 있다. 그 세션에 새7500이 반영됐다고 단정하지 않는다. Prep의 actual manual full/registered -Stop/Codex exit와 source/control commits를 확인해야 한다. Stop이 실제 cap을 넘거나 실패하면 -원시 log와 terminal 상태를 보존한 채 환경 분류로 반환한다. 성공으로 덮어쓰기/즉시 재실행하지 않는다. - -Prep Executor가 **정상 종료하고 Step0 completed·Codex exit0·등록 Stop 성공·정확 경로 commits· -clean 및 Coordinator의 사후 감사 완료**를 확인한 뒤 새 process에서 정상 main invocation을 실행한다. - -```powershell -python scripts/execute.py mitc4-shell-feast-eigen -``` - -새 Executor는 source14400을 새로 읽고 새 Codex session은 변경된 등록7500/Stop7200/command7200 -구성으로 시작한다. Source상 cap과 실제 검증 evidence를 함께 기록한다. Prep/main은 -`feat-mitc4-shell-feast-eigen-execution-prep`와 `feat-mitc4-shell-feast-eigen` branch를 -Executor가 차례로 소유한다. Main branch는 prep 완료 HEAD를 포함해야 한다. - -## E4. Git와 활성 실행의 경계 - -1. Coordinator가 계획 gate를 감사한 뒤 Root가 완료 Feature 문서/계획 및 두 phase 제어 파일의 - 정확 목록을 checkpoint한다. 두 phase를 만들었으므로 선택되지 않은 phase files까지 미리 - commit해 selected-phase allowlist 밖 dirty 파일이 없게 한다. 기존 unrelated pending beam - phase/history는 보존하며 invocation 대상으로 삼지 않는다. -2. 실행 직전 `git rev-parse --show-toplevel`, `git status --porcelain=v1 --untracked-files=all`, - actual role/config를 읽는다. Linked worktree와 Harness ROOT 동일성을 확인한다. -3. Active Executor 동안 Root/Coordinator/다른 specialist는 non-owned edits/commits를 멈춘다. - Implementation은 선택 Step paths와 해당 Step result fields만 수정한다. Commit/branch/ - timestamp/attempt_history/phase 진전은 Executor 소유다. -4. Terminal failure는 raw payload·history·logs를 보존한다. Coordinator의 assigned recovery가 - 없으면 pending reset/재시작하지 않는다. Correction budget과 transport retry는 별개다. -5. Default workspace-write를 사용한다. Danger-full-access는 같은 native command의 실제 실패, - 해당 실행 직전 사용자 명시 승인, clean linked worktree, 승인 flag를 모두 요구한다. - 이번 timeout 준비는 sandbox 확대 권한이 아니다. Remote push/tag/publish/deploy/package는 없다. - -## E5. 실제 실행 evidence 보존 - -각 Step raw evidence root는 ignored `.harness/build/mitc4-eigen-evidence/stepN/`, prep은 -`.../prep/`다. `New-Item -ItemType Directory -Force`와 `Copy-Item -LiteralPath`는 해당 -resolved workspace 하위 generated 경로만 대상으로 한다. Recursive delete/move는 계획하지 않는다. -긴 command는 managed process/session으로 실제 exit까지 관찰하며 약60초마다 Coordinator에 -의미 있는 진행을 보낸다. Detached/unobserved execution으로 deadline을 피하지 않는다. - -RED/focused/full command stdout/stderr·actual exit·wall time·CTest discovery JSON·LastTest.log를 -각각 고유 이름으로 보존한다. Tee/pipeline 사용 시 `$LASTEXITCODE`를 즉시 보존한다. -CTest observer shell exit0을 CTest exit0으로 기록하지 않는다. Hook state를 조작하거나 -수동 hook 실행으로 evidence를 만들지 않는다. 등록 Stop 이후의 실제 실패는 manual full pass로 -덮어쓰지 않는다. Implementation 보고 시점의 실제 manual evidence와 마지막 Stop/exit 확인 대기를 구분하며 미래 성공을 보고서에 쓰지 않는다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 감사한다. Coordinator는 specialist 보고서 본문을 대신 수정하지 않는다. Prep→main activation은 이 사후 감사까지 완료된 뒤에만 가능하다. - -C++ source 변경 없는 prep의 same-binary 회귀와 새 binary의 fresh eigen/static 비교는 다른 -evidence다. Final Step7는 직접 solver invocation·unique generated directory·원본 bytes/hash· -binary/lib hash·result/log mtime/hash·call count를 남겨 freshness를 증명한다. 기존 helper가 -파일 존재/mtime로 cache를 사용한 사실만으로 fresh라고 주장하지 않는다. - -## E6. Correction 후의 Python/pytest와 process TEMP - -[Correction 실제 기록](corrections.md)의 named venv `pytest-venv/Scripts/python.exe`는 -Python3.11.15/pytest9.1.1로 native GREEN37개와 전체153개 collection/실행에 성공했다. -아래 모든 경로의 기준은 workspace의 -`.harness/build/mitc4-eigen-evidence/prep/classifier-correction/`다. - -| 용도 | 확인된 상대 경로 | -| --- | --- | -| 직접 pytest 및 후속 Executor Python | `pytest-venv/Scripts/python.exe` | -| venv의 base runtime | `python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe` | -| uv의 workspace cache | `workspace-python-cache` | -| pytest cache | `pytest-cache` | - -Native에서는 direct venv entry를 사용했다. Root의 uv offline 진입도 별도로 관찰됐지만 -그 사실을 native uv 실행 성공으로 합치지 않는다. 후속 process의 PATH 앞에 named venv와 -base directory를 두고 UV_PYTHON/UV_CACHE_DIR/UV_OFFLINE을 정상 설정하여 child의 기본 -python/uv에도 전파한다. Global config·source·Hook command/guard는 바꾸지 않는다. - -[설치된 FileTracker IL 관찰](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/filetracker-initialization-observation.json)의 -SHA-256은 `8d47f96ba913a9adc2d89772cef4b27ea2187f613416912d894608be9730c5cc`다. -Initializer의 Path.GetTempPath→s_tempPath→GetLongFilePath 유일 호출과 실제 접근 거부 -stack이 대응하므로 새 workspace TEMP/TMP가 정상 운영 개선 후보라는 근거가 있다. -**이 변경으로 native build가 성공한 evidence는 아직 없다.** FileTracker를 끄거나 DFA가 -build 실패까지 해결한다고 추정하지 않는다. - -아래 전체 block은 [R6 source checkpoint](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건), -R3 status-only checkpoint와 **해당 exact prep DFA run 직전 명시 사용자 승인** 후에만 실행한다. -이 turn에는 어느 것도 실행하지 않는다. 새 ignored TEMP 경로는 workspace 안에서 생성하고 -기존 temp/evidence를 지우지 않는다. 기존 finite wrapper14400 및 모든 Executor guard를 유지한다. -Process 환경은 native 종료/오류 때 finally로 원래 값(미설정 포함)으로 복원한다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeRoot = (Get-Location).Path -$mfeEvidence = Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' -$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfeBasePython = Join-Path $mfeEvidence 'python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe' -$mfeUvCache = Join-Path $mfeEvidence 'workspace-python-cache' -foreach ($mfeFile in @($mfePython, $mfeBasePython)) { - if (-not (Test-Path -LiteralPath $mfeFile -PathType Leaf)) { throw "Missing Python: $mfeFile" } -} -Get-Command uv -ErrorAction Stop | Out-Null -$mfeGitRoot = git rev-parse --show-toplevel -$mfeIdentityExit = $LASTEXITCODE -if ($mfeIdentityExit -ne 0 -or [IO.Path]::GetFullPath($mfeGitRoot) -ne [IO.Path]::GetFullPath($mfeRoot)) { - throw 'Workspace root mismatch' -} -$mfeRunTemp = Join-Path $mfeEvidence ('native-temp-' + [guid]::NewGuid().ToString('N')) -if (-not [IO.Path]::GetFullPath($mfeRunTemp).StartsWith([IO.Path]::GetFullPath($mfeEvidence) + [IO.Path]::DirectorySeparatorChar)) { - throw 'Temp path outside approved workspace evidence' -} -$null = New-Item -ItemType Directory -Path $mfeRunTemp -$mfeEnvNames = @('PATH', 'UV_PYTHON', 'UV_CACHE_DIR', 'UV_OFFLINE', 'TEMP', 'TMP', 'FEM_HARNESS_CODEX_SANDBOX') -$mfeBeforeEnv = @{} -foreach ($mfeName in $mfeEnvNames) { - $mfeBeforeEnv[$mfeName] = [Environment]::GetEnvironmentVariable($mfeName, 'Process') -} -if ($null -ne $mfeBeforeEnv['FEM_HARNESS_CODEX_SANDBOX'] -and $mfeBeforeEnv['FEM_HARNESS_CODEX_SANDBOX'] -ne 'workspace-write') { - throw 'Unexpected pre-existing sandbox environment' -} -$mfeNativeExit = $null -try { - $env:PATH = (Split-Path $mfePython) + ';' + (Split-Path $mfeBasePython) + ';' + $mfeBeforeEnv['PATH'] - $env:UV_PYTHON = $mfePython - $env:UV_CACHE_DIR = $mfeUvCache - $env:UV_OFFLINE = 'true' - $env:TEMP = $mfeRunTemp - $env:TMP = $mfeRunTemp - $env:FEM_HARNESS_CODEX_SANDBOX = 'danger-full-access' - & $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" mitc4-shell-feast-eigen-execution-prep --approve-danger-full-access - $mfeNativeExit = $LASTEXITCODE - if ($null -eq $mfeNativeExit) { throw 'Native Executor exit unavailable' } -} -finally { - foreach ($mfeName in $mfeEnvNames) { - [Environment]::SetEnvironmentVariable($mfeName, $mfeBeforeEnv[$mfeName], 'Process') - } -} -exit $mfeNativeExit -``` - -재개 Implementation은 inherited 환경을 확인한 뒤 pytest entry를 아래 direct venv 방식으로 -사용한다. 기존 Step0의 대상/모든 assertions를 유지하며 collection에서3개 classifier test의 -6/16/15 parameter inventory를 확인한다. 각 **호출마다 새** basetemp를 만들어 pytest가 기존 -evidence directory를 정리하지 않게 한다. 이전 GREEN은 새 RED가 아니다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeEvidence = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' -$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfePytestRuns = @( - @{ label = 'classifier'; targets = @('tests/test_execute.py', '-k', 'environment_classifier or successful_source_echo') }, - @{ label = 'focused'; targets = @('tests/test_harness_timeouts.py', 'tests/test_execute.py', 'tests/test_execute_ownership.py', 'tests/test_hook_validation_scope.py', 'tests/test_harness_preset_contract.py') }, - @{ label = 'full'; targets = @() } -) -foreach ($mfeRun in $mfePytestRuns) { - $mfeFreshBase = Join-Path $mfeEvidence ('pytest-' + $mfeRun.label + '-' + [guid]::NewGuid().ToString('N')) - $mfeCache = Join-Path $mfeEvidence 'pytest-cache' - $mfeTargets = $mfeRun.targets - & $mfePython -B -X utf8 -m pytest -v -rs -o "cache_dir=$mfeCache" "--basetemp=$mfeFreshBase" @mfeTargets - $mfePytestExit = $LASTEXITCODE - Write-Output ("pytest {0}: exit {1}; basetemp {2}" -f $mfeRun.label, $mfePytestExit, $mfeFreshBase) - if ($null -eq $mfePytestExit -or $mfePytestExit -ne 0) { throw 'pytest verification failed' } -} -``` - - - -CMake/MSVC/x64/Debug configure/build와 전체 CTest discovery/run은 기존 Step0의 정확한 -명령을 같은 inherited TEMP/TMP에서 별도로 실행한다. 실패 시 actual command/exit와 남은 -검증을 기록한다. Registered Stop을 수동 full 검증으로 대체하지 않으며 원 보고서 갱신은 -Implementation owner, 종료 뒤 사후 감사는 Coordinator 소유다. - -## E7. 짧은 TEMP를 사용하는 정상 재개 - -E6의 긴 TEMP 이름은 attempt2의 -`ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior` -실패를 재현했다. [같은 binary의 짧은 경로 비교](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/path-length-probe-e15c1747/observation.json) -SHA-256은 `511b30e183759b378e6f33f30aa3be4c940b58d1eabde12068151173a0a91979`다. -TEMP152에서 만들어진 result251/lock261과 실패1, TEMP70에서 실제 생성된 lock179와 성공0을 -구분한다. 새 `.harness/build/t-<8hex>`는 이 workspace에서70자이며 **TEMP80자 이하**를 -검사한다. 관찰된 해당 fixture suffix109자를 더하면 lock189자 이하라는 운영 여유다. -이는 모든 미래 fixture의 길이 보장이 아니므로 기존 전체 suite를 실제 수행한다. - -Attempt2의 focused도 처음에는 긴 pytest basetemp에서130pass/6fail(exit1)이었고, -같은136대상을 짧은 `.harness/build/mfe-focus-<8guid>`로 바꾼 뒤136pass(exit0)였다. -확인된 named venv/base/UVoffline/cache와 direct pytest entry/대상은 유지하되 TEMP/TMP와 -pytest basetemp를 모두 짧게 만든다. Native child와 -registered Stop도 같은 process 환경을 상속한다. 기존 temp/evidence 삭제·test skip·FileTracker -비활성화·source/reference 변경은 없다. Full pytest는 attempt2에서 미실행이므로 필수로 남는다. - -[R7 WIP 및 별도 status checkpoint](implementation-recovery.md#r7-attempt2-실패-보존과-정상-workspace-write-재개) -완료 뒤 Coordinator가 아래 정상 workspace-write invocation을 할당한다. 추가 사용자 -승인이나 DFA flag는 없다. 오류·정상 종료 모두 환경을 finally에서 원래 값으로 복원하고 -native exit를 즉시 전파한다. 유한14400과 기존 registered Stop7500/shared7200은 유지한다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeRoot = (Get-Location).Path -$mfePhase = 'mitc4-shell-feast-eigen-execution-prep' -$mfeEvidence = Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' -$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfeBasePython = Join-Path $mfeEvidence 'python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe' -$mfeUvCache = Join-Path $mfeEvidence 'workspace-python-cache' -foreach ($mfeFile in @($mfePython, $mfeBasePython)) { - if (-not (Test-Path -LiteralPath $mfeFile -PathType Leaf)) { throw "Missing Python: $mfeFile" } -} -Get-Command uv -ErrorAction Stop | Out-Null -$mfeGitRoot = git rev-parse --show-toplevel -$mfeIdentityExit = $LASTEXITCODE -if ($mfeIdentityExit -ne 0 -or [IO.Path]::GetFullPath($mfeGitRoot) -ne [IO.Path]::GetFullPath($mfeRoot)) { - throw 'Workspace root mismatch' -} -$mfeTempParent = Join-Path $mfeRoot '.harness/build' -$mfeRunTemp = Join-Path $mfeTempParent ('t-' + [guid]::NewGuid().ToString('N').Substring(0, 8)) -if ($mfeRunTemp.Length -gt 80) { throw 'TEMP exceeds the approved 80-character budget' } -if (-not [IO.Path]::GetFullPath($mfeRunTemp).StartsWith([IO.Path]::GetFullPath($mfeTempParent) + [IO.Path]::DirectorySeparatorChar)) { - throw 'Temp path outside approved workspace evidence' -} -$null = New-Item -ItemType Directory -Path $mfeRunTemp -$mfeEnvNames = @('PATH', 'UV_PYTHON', 'UV_CACHE_DIR', 'UV_OFFLINE', 'TEMP', 'TMP', 'FEM_HARNESS_CODEX_SANDBOX') -$mfeBeforeEnv = @{} -foreach ($mfeName in $mfeEnvNames) { - $mfeBeforeEnv[$mfeName] = [Environment]::GetEnvironmentVariable($mfeName, 'Process') -} -if ($null -ne $mfeBeforeEnv['FEM_HARNESS_CODEX_SANDBOX'] -and $mfeBeforeEnv['FEM_HARNESS_CODEX_SANDBOX'] -ne 'workspace-write') { - throw 'Unexpected pre-existing sandbox environment' -} -$mfeNativeExit = $null -try { - $env:PATH = (Split-Path $mfePython) + ';' + (Split-Path $mfeBasePython) + ';' + $mfeBeforeEnv['PATH'] - $env:UV_PYTHON = $mfePython - $env:UV_CACHE_DIR = $mfeUvCache - $env:UV_OFFLINE = 'true' - $env:TEMP = $mfeRunTemp - $env:TMP = $mfeRunTemp - $env:FEM_HARNESS_CODEX_SANDBOX = 'workspace-write' - & $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" $mfePhase - $mfeNativeExit = $LASTEXITCODE - if ($null -eq $mfeNativeExit) { throw 'Native Executor exit unavailable' } -} -finally { - foreach ($mfeName in $mfeEnvNames) { - [Environment]::SetEnvironmentVariable($mfeName, $mfeBeforeEnv[$mfeName], 'Process') - } -} -exit $mfeNativeExit -``` - -현재 block은 미실행이다. Prep 성공·full manual VERIFY·actual registered Stop/CTest exit와 -Coordinator 사후 감사 뒤 main을 별도 할당할 때는 같은 block의 `$mfePhase` 값만 -`mitc4-shell-feast-eigen`으로 지정한다. Main도 workspace-write이며 해당8개 Step의 -실제 C++ TDD/focused/full/reference gate를 그대로 수행한다. Hook7500이 이미 적용됐다는 -사실이나 단독 경로 재현 성공을 전체 prep/main 성공으로 보고하지 않는다. - -현재 pytest의 정확한 recipe는 아래다. E6의 긴 basetemp 예시는 과거 이력으로 남기고, -각 호출마다 새 `.harness/build/p-<8guid>`(현재70자, 상한80자)를 사용한다. 기존 directory를 -재사용하거나 지우지 않는다. 같은 tests/assertions와 실제 exit 확인을 유지한다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeBuild = Join-Path (Get-Location).Path '.harness/build' -$mfeEvidence = Join-Path $mfeBuild 'mitc4-eigen-evidence/prep/classifier-correction' -$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfePytestRuns = @( - @{ label = 'classifier'; targets = @('tests/test_execute.py', '-k', 'environment_classifier or successful_source_echo') }, - @{ label = 'focused'; targets = @('tests/test_harness_timeouts.py', 'tests/test_execute.py', 'tests/test_execute_ownership.py', 'tests/test_hook_validation_scope.py', 'tests/test_harness_preset_contract.py') }, - @{ label = 'full'; targets = @() } -) -foreach ($mfeRun in $mfePytestRuns) { - $mfeFreshBase = Join-Path $mfeBuild ('p-' + [guid]::NewGuid().ToString('N').Substring(0, 8)) - if ($mfeFreshBase.Length -gt 80 -or (Test-Path -LiteralPath $mfeFreshBase)) { throw 'Pytest basetemp must be short and new' } - $mfeCache = Join-Path $mfeEvidence 'pytest-cache' - $mfeTargets = $mfeRun.targets - & $mfePython -B -X utf8 -m pytest -v -rs -o "cache_dir=$mfeCache" "--basetemp=$mfeFreshBase" @mfeTargets - $mfePytestExit = $LASTEXITCODE - Write-Output ("pytest {0}: exit {1}; basetemp {2}" -f $mfeRun.label, $mfePytestExit, $mfeFreshBase) - if ($null -eq $mfePytestExit -or $mfePytestExit -ne 0) { throw 'pytest verification failed' } -} -``` - -## E8. Attempt3 후의 정상 backend 대안 - -이 절은 R8 보존 뒤의 **현재 backend 명령 계약**이다. E1~E7의 당시 실행·실패 기록은 유지한다. -[R8 실제 checkpoint 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r8-wip-checkpoint-result.json)에서 -report1 commit `9601b1f53e8a11d3e08d49cf9528fa6f028108cf`, controls2 commit -`96efbffa425ff5ce9cd1b7cebe673555273122b9`와 native exit0을 확인했다. -이후 status 변경·Ninja 설정·native 검증은 아직 미실행이다. - -[기존 preset](../../CMakePresets.json)과 [local config 예시](../../.harness/config.example.json)를 -사용한다. 새 binaryDir는 `.harness/build-ninja-msvc-debug`이며 source, 기존 VS -`.harness/build` cache와 모든 attempt evidence를 보존한다. -[CMake adapter](../../scripts/msvc_harness/adapters/cmake.py)가 지원하는 이 세 preset을 함께 -선택하면 manual CMake/CTest와 registered Stop이 같은 graph를 사용한다. 기존 config에 -없는 Multi-Config 선택이나 public preset/API를 추가하지 않는다. - -Single-config에서도 기존 reference helper가 확인하는 실제 library 경로가 -`/src/fesa/Debug/fesa_solver.lib`가 되도록 표준 -`CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG`를 지정한다. Local CMake help가 설명한 -per-configuration archive target 속성 초기화를 사용하며 fake cache 파일·복사·mtime 조작은 -허용하지 않는다. 이 정상 MSVC/x64/Debug 대안의 **actual native 성공은 미검증**이다. - -### E8.1. Root의 ignored 환경 준비 - -순서는 Root frozen 관리2/Planning3문서 checkpoint와 clean 확인 → 아래 Root setup의 -actual configure/config 검증 → Coordinator의 setup 감사 → 별도 Planning status-only -할당과 [R9 control checkpoint](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint) -→ clean 확인 → E8.2 새 native invocation이다. 현재 문서 할당은 아래 setup 실행을 포함하지 않는다. - -Root는 별도 할당을 받은 뒤 repository root의 PowerShell에서 아래 block만 수행한다. -Local config는 예시와 정확히 같은 기존 지원 설정만 생성하며 예상 밖 기존 config를 덮어쓰지 -않는다. New CMake cache에 archive 경로를 고정하고 native/Stop의 후속 preset configure가 -같은 값을 유지하게 한다. Root configure는 준비 evidence이며 native manual VERIFY의 대체가 아니다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeRoot = (Get-Location).Path -$mfeVs = 'C:/Program Files/Microsoft Visual Studio/18/Community' -$mfeNinja = Join-Path $mfeVs 'Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja' -$mfeEvidence = Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' -$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfeBasePython = Join-Path $mfeEvidence 'python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe' -foreach ($mfeFile in @($mfePython, $mfeBasePython)) { - if (-not (Test-Path -LiteralPath $mfeFile -PathType Leaf)) { throw 'Named Python missing' } -} -Get-Command uv -ErrorAction Stop | Out-Null -$mfeNewBuild = Join-Path $mfeRoot '.harness/build-ninja-msvc-debug' -$mfeArchive = (Join-Path $mfeNewBuild 'src/fesa/Debug').Replace('\','/') -$mfeTempParent = Join-Path $mfeRoot '.harness/build' -$mfeTemp = Join-Path $mfeTempParent ('t-' + [guid]::NewGuid().ToString('N').Substring(0,8)) -if ($mfeTemp.Length -gt 80 -or (Test-Path -LiteralPath $mfeTemp)) { throw 'TEMP must be short and new' } -$null = New-Item -ItemType Directory -Path $mfeTemp -$mfeEnvBefore = [Environment]::GetEnvironmentVariables('Process') -$mfeExit = $null -try { - & $mfePython -B -X utf8 -c "from scripts import execute; e=execute.StepExecutor('mitc4-shell-feast-eigen-execution-prep'); assert not e._worktree_paths(); assert e._is_isolated_worktree(); e._preflight_repository(); print('Clean linked worktree verified')" - $mfePreflightExit = $LASTEXITCODE - if ($mfePreflightExit -ne 0) { exit $mfePreflightExit } - $mfeConfig = Join-Path $mfeRoot '.harness/config.json' - $mfeExample = Join-Path $mfeRoot '.harness/config.example.json' - if (Test-Path -LiteralPath $mfeConfig) { - if ((Get-Content -LiteralPath $mfeConfig -Raw | ConvertFrom-Json | ConvertTo-Json -Depth 10 -Compress) -ne (Get-Content -LiteralPath $mfeExample -Raw | ConvertFrom-Json | ConvertTo-Json -Depth 10 -Compress)) { throw 'Preserve unexpected existing local config' } - } else { Copy-Item -LiteralPath $mfeExample -Destination $mfeConfig } - if ($null -ne $env:FEM_HARNESS_CODEX_SANDBOX -and $env:FEM_HARNESS_CODEX_SANDBOX -ne 'workspace-write') { - throw 'Unexpected sandbox environment' - } - & (Join-Path $mfeVs 'Common7/Tools/Launch-VsDevShell.ps1') -VsInstallationPath $mfeVs -Arch amd64 -HostArch amd64 -SkipAutomaticLocation -NoLogo - $env:PATH = (Split-Path $mfePython) + ';' + (Split-Path $mfeBasePython) + ';' + $mfeNinja + ';' + $env:PATH - $env:FESA_GTEST_SOURCE_DIR = 'C:/git/googletest' - $env:MKL_DIR = 'C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl' - $env:TBB_DIR = 'C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb' - $env:HDF5_DIR = 'C:/Program Files/HDF_Group/HDF5/2.1.1/cmake' - $env:UV_PYTHON = $mfePython - $env:UV_CACHE_DIR = Join-Path $mfeEvidence 'workspace-python-cache' - $env:UV_OFFLINE = 'true' - $env:TEMP = $mfeTemp - $env:TMP = $mfeTemp - $env:FEM_HARNESS_CODEX_SANDBOX = 'workspace-write' - Get-Command cl.exe, ninja.exe, cmake.exe, ctest.exe -ErrorAction Stop | Select-Object Name, Source - if ($env:VSCMD_ARG_TGT_ARCH -notin @('x64','amd64')) { throw 'MSVC target must be x64' } - git check-ignore --quiet .harness/config.json - if ($LASTEXITCODE -ne 0) { throw 'Local config must remain ignored' } - git check-ignore --quiet .harness/build-ninja-msvc-debug/ - if ($LASTEXITCODE -ne 0) { throw 'New build must remain ignored' } - cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive" - $mfePrepareExit = $LASTEXITCODE - if ($mfePrepareExit -ne 0) { exit $mfePrepareExit } - & $mfePython -B -X utf8 -c "from pathlib import Path; from scripts.msvc_harness.config import load_config; c=load_config(Path.cwd()); assert c.cmake.configure_preset=='windows-msvc-ninja-debug'; assert c.cmake.build_preset==c.cmake.test_preset==c.cmake.configure_preset; assert c.cmake.binary_dir==Path.cwd()/'.harness/build-ninja-msvc-debug'; print('Ninja local config validated')" - $mfeConfigExit = $LASTEXITCODE - if ($mfeConfigExit -ne 0) { exit $mfeConfigExit } - $mfeExit = $mfeConfigExit - if ($null -eq $mfeExit) { throw 'Root setup exit unavailable' } -} -finally { - foreach ($mfeName in @([Environment]::GetEnvironmentVariables('Process').Keys)) { - if (-not $mfeEnvBefore.Contains($mfeName)) { [Environment]::SetEnvironmentVariable($mfeName, $null, 'Process') } - } - foreach ($mfeName in $mfeEnvBefore.Keys) { - [Environment]::SetEnvironmentVariable($mfeName, $mfeEnvBefore[$mfeName], 'Process') - } -} -exit $mfeExit -``` - -Installed VS x64 DevShell이 설정하는 INCLUDE/LIB/PATH 등을 포함해 process 환경 전체를 -snapshot/finally 복원한다. Config와 새 cache는 ignored 상태로 feature 동안 유지한다. -Root setup process의 종료가 다른 parent/tool shell의 환경을 갱신하지는 않는다. -Native의 **각 tool shell**도 E8.2의 동일 VS/dependency/Python/TEMP 설정을 실제 적용한 -상태에서 명령을 실행해야 한다. 이전 attempt3의 명시적 짧은 TEMP 적용 실패를 환경 누락으로 -재분류하지 않는다. Setup 실패 시 실제 exit와 남은 ignored 파일을 보존하고 재실행을 멈춘다. - -### E8.2. Coordinator의 새 정상 invocation과 native shell 환경 - -Root setup과 R9의 실제 완료를 감사한 Coordinator만 다음 invocation을 할당한다. -`StepExecutor/main`과 모든 guard는 그대로이며 승인된 유한14400 module invocation을 -사용한다. Registered Stop7500/shared·command7200, terminal 보존, transport budget, -terra/xhigh 및 workspace-write를 유지한다. 기존 one-time DFA 승인은 소진됐으며 flag가 없다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeRoot = (Get-Location).Path -$mfePhase = 'mitc4-shell-feast-eigen-execution-prep' -$mfeVs = 'C:/Program Files/Microsoft Visual Studio/18/Community' -$mfeNinja = Join-Path $mfeVs 'Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja' -$mfeEvidence = Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' -$mfePython = Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfeBasePython = Join-Path $mfeEvidence 'python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe' -foreach ($mfeFile in @($mfePython, $mfeBasePython)) { - if (-not (Test-Path -LiteralPath $mfeFile -PathType Leaf)) { throw 'Named Python missing' } -} -Get-Command uv -ErrorAction Stop | Out-Null -$mfeNewBuild = Join-Path $mfeRoot '.harness/build-ninja-msvc-debug' -$mfeArchive = (Join-Path $mfeNewBuild 'src/fesa/Debug').Replace('\','/') -$mfeTempParent = Join-Path $mfeRoot '.harness/build' -$mfeTemp = Join-Path $mfeTempParent ('t-' + [guid]::NewGuid().ToString('N').Substring(0,8)) -if ($mfeTemp.Length -gt 80 -or (Test-Path -LiteralPath $mfeTemp)) { throw 'TEMP must be short and new' } -$null = New-Item -ItemType Directory -Path $mfeTemp -$mfeEnvBefore = [Environment]::GetEnvironmentVariables('Process') -$mfeExit = $null -try { - if ($null -ne $env:FEM_HARNESS_CODEX_SANDBOX -and $env:FEM_HARNESS_CODEX_SANDBOX -ne 'workspace-write') { - throw 'Unexpected sandbox environment' - } - & (Join-Path $mfeVs 'Common7/Tools/Launch-VsDevShell.ps1') -VsInstallationPath $mfeVs -Arch amd64 -HostArch amd64 -SkipAutomaticLocation -NoLogo - $env:PATH = (Split-Path $mfePython) + ';' + (Split-Path $mfeBasePython) + ';' + $mfeNinja + ';' + $env:PATH - $env:FESA_GTEST_SOURCE_DIR = 'C:/git/googletest' - $env:MKL_DIR = 'C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl' - $env:TBB_DIR = 'C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb' - $env:HDF5_DIR = 'C:/Program Files/HDF_Group/HDF5/2.1.1/cmake' - $env:UV_PYTHON = $mfePython - $env:UV_CACHE_DIR = Join-Path $mfeEvidence 'workspace-python-cache' - $env:UV_OFFLINE = 'true' - $env:TEMP = $mfeTemp - $env:TMP = $mfeTemp - $env:FEM_HARNESS_CODEX_SANDBOX = 'workspace-write' - Get-Command cl.exe, ninja.exe, cmake.exe, ctest.exe -ErrorAction Stop | Select-Object Name, Source - if ($env:VSCMD_ARG_TGT_ARCH -notin @('x64','amd64')) { throw 'MSVC target must be x64' } - if (-not (Test-Path -LiteralPath (Join-Path $mfeNewBuild 'CMakeCache.txt'))) { throw 'Root cache preparation missing' } - & $mfePython -B -X utf8 -c "from pathlib import Path; from scripts.msvc_harness.config import load_config; c=load_config(Path.cwd()); assert c.cmake.configure_preset=='windows-msvc-ninja-debug'; assert c.cmake.build_preset==c.cmake.test_preset==c.cmake.configure_preset; assert c.cmake.binary_dir==Path.cwd()/'.harness/build-ninja-msvc-debug'; print('Ninja local config validated')" - $mfeConfigExit = $LASTEXITCODE - if ($mfeConfigExit -ne 0) { exit $mfeConfigExit } - & $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" $mfePhase - $mfeExit = $LASTEXITCODE - if ($null -eq $mfeExit) { throw 'Native Executor exit unavailable' } -} -finally { - foreach ($mfeName in @([Environment]::GetEnvironmentVariables('Process').Keys)) { - if (-not $mfeEnvBefore.Contains($mfeName)) { [Environment]::SetEnvironmentVariable($mfeName, $null, 'Process') } - } - foreach ($mfeName in $mfeEnvBefore.Keys) { - [Environment]::SetEnvironmentVariable($mfeName, $mfeEnvBefore[$mfeName], 'Process') - } -} -exit $mfeExit -``` - -이 block의 환경 설정은 Executor child와 그 registered Stop에 상속된다. Implementation -tool shell이 이를 상속하지 않았거나 별도 shell을 시작했다면 동일 block의 환경 설정과 -finally를 그 shell에서 적용한다. **Manual 검증용 정확한 composition**은 위 block에서 -`& $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" $mfePhase` -한 줄을 E8.3의 해당 검증 명령들로 교체하는 것이다. 나머지 config 검사/DevShell/환경 -복원은 그대로 두며 manual shell에서 Executor를 중첩 호출하지 않는다. 각 명령 직후 -`$LASTEXITCODE`를 캡처하고 0이 아니면 해당 native exit로 종료하여 finally를 실행한다. - -Active Executor 동안 Root/Coordinator는 non-owned 편집과 commit을 멈춘다. 구현 owner는 -Step0 보고서와 result payload만 할당 범위에서 작성하며 phase/timestamps/history/Git을 -변경하지 않는다. 실제 manual evidence와 아직 발생하지 않은 final registered Stop을 -구분하고 Coordinator가 native 종료 뒤 raw/Hook/CTest actual exit를 사후 감사한다. -Prep 전체 gate를 통과한 뒤 별도 main invocation은 위 block의 `$mfePhase`만 -`mitc4-shell-feast-eigen`으로 바꾼다. Main도 workspace-write와 같은 환경/graph를 사용한다. - -### E8.3. Prep와 main8의 정확한 명령 대응 및 evidence - -Prep [Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md)와 -[main8](../../phases/mitc4-shell-feast-eigen/index.json)의 모든 Step은 현재 environment를 -필수 입력으로 읽는다. 해당 문서의 과거 config absent/VS 고정 명령은 이번 Coordinator -E8 dispatch에서 아래 대응으로 **명시 대체**한다. 이는 선택 backend 변경이며 승인된 -owned_paths, TDD 순서, target/test regex/mandatory names, full VERIFY 범위는 그대로다. -Phase 파일을 임의 수정하거나 예전 VS 명령과 새 graph를 섞지 않는다. - -| 기존 Step 명령 | E8에서 실행할 명령 | -| --- | --- | -| `cmake -S . -B .harness/build -A x64` | `cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive"` | -| `cmake --build .harness/build --config Debug --target fesa_tests` | `cmake --build --preset windows-msvc-ninja-debug --target fesa_tests` | -| `cmake --build .harness/build --config Debug` | `cmake --build --preset windows-msvc-ninja-debug` | -| `ctest --test-dir .harness/build -C Debug -R '' --show-only=json-v1` | `ctest --preset windows-msvc-ninja-debug -R '<같은 원문 regex>' --show-only=json-v1` | -| `ctest --test-dir .harness/build -C Debug -R '' --output-on-failure` | `ctest --preset windows-msvc-ninja-debug -R '<같은 원문 regex>' --output-on-failure` | -| `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | -| `ctest --test-dir .harness/build -C Debug --output-on-failure` | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | - -Table의 regex 표시는 새 선택값이 아니다. 현재 Step 명령의 `-R` 인수 문자열 전체를 -byte 의미 그대로 유지한다. Combined selection이 0보다 크다는 것만 확인하지 않고 -[V1~V6](implementation-verification.md)의 새 mandatory test 이름도 discovery에서 확인한다. -`fesa_tests`는 기존 unit/integration/reference 세 executable을 포함하는 aggregate target이다. - -Manual full C++ 검증에 넣을 정확한 명령 bundle은 다음과 같다. E8.2의 `$mfeArchive`는 -새 binaryDir의 absolute forward-slash 경로다. Ninja preset은 Debug를 명시하므로 VS 전용 -`-A x64`나 이전 `--test-dir`를 추가하지 않는다. - -```powershell -cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive" -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit -or $mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -cmake --build --preset windows-msvc-ninja-debug -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit -or $mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit -or $mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -ctest --preset windows-msvc-ninja-debug --output-on-failure -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit -or $mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -``` - -Python은 E7 말미의 정확한 classifier/focused/full 세 호출을 같은 환경 wrapper 안에서 -수행한다. Named venv, UV offline/cache, 기존 대상/assertions, 새 -`.harness/build/p-<8hex>` basetemp80자 이하와 TEMP80자 이하를 유지한다. -Already GREEN인 timeout/classifier source를 RED로 되돌리지 않는다. 실제 보존된 RED/GREEN을 -읽고 classifier37/focused136 및 남은 full pytest를 현재 code로 재검증한다. r2 harness -Correction1회는 사용 완료됐으며 두 번째 source correction을 시작하지 않는다. - -Native configure/build evidence에는 actual MSVC compiler/x64/Debug와 Ninja cache, -CMake/CTest 명령·binaryDir, 새 warning0, 실제 -`src/fesa/Debug/fesa_solver.lib`의 존재·SHA256·mtime를 기록한다. -Library가 계획 위치에 없으면 환경 gate 실패로 반환한다. 기존 helper의 실제 mtime 판단을 -유지하고 새 binary에 대한 fresh solve 및 정확 입력복사/hash를 확인한다. 기존 VS 결과를 -새 graph의 fresh evidence로 옮기지 않는다. 새 graph의 최초 전체 suite 시간도 실제 측정하며, -이전 약27.9분 추정이나 finite cap을 성공/소요 보장으로 해석하지 않는다. - -각 Step의 focused/full 및 registered Stop에 같은 graph가 사용됐는지 실제 raw를 대조한다. -기존 static reference 비교와 새 eigen Value10 비교의 승인 기준은 그대로다. 다음 -Implementation은 보고서의 광범위한 reference 미사용 문장을 정정해 static full CTest가 -원본 reference를 읽고 비교한다는 사실, 원본 직접 수정 없음, 새 eigen 비교 미실행을 -구분한다. 과거 manual build 실패/미실행과 automatic pass도 보존한다. -Source·수식·schema·tolerance·reference를 이 환경 준비에서 변경하지 않는다. -정상 native 대안이 실제 실패하면 결과를 보존해 Coordinator에 반환하며, 새 exact-run DFA -결정이 필요한지는 그 evidence로 판단한다. 지금 main까지 권한을 확대하지 않는다. - -## E9. Attempt4 후의 직렬 Ninja 검증 - -[R10](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)이 우선이다. -[설치 모듈·생성 경로 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json) -SHA256 `9d383f04a347df95b742403ceca4732b331ddf4ec96437993f0ceffaa060bf59`에서 -세 POST_BUILD discovery가 누락된 TEST_TARGET 때문에 같은 JSON을 REMOVE/run/READ한다. -이는 병렬 공유 파일 경쟁을 뒷받침하며 최초 interleaving을 재현한 것은 아니다. -정상 환경 변수 `CMAKE_BUILD_PARALLEL_LEVEL=1`로 같은 Ninja build의 discovery를 직렬화한다. -CMake 설치 모듈, generated discovery, source/test/Hook/config와 timeout은 수정하지 않는다. - -**Activation 미확정:** Root의 config-only [현재 resolver 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json)은 -canonical Stop1800 해석을 확인했다(server exit0, SHA256 -`5deb9a701388605a14868198276993af3884f0cc76c48928831968b272f46de4`). -실제 native raw의 source event는 없으며 현재 resolver 결과와 외부 pwsh 약1802초 관찰을 구분한다. -남은 쟁점은 정상 override 지원·적용 방법이다. 이를 Coordinator가 검토하기 전 status reset/다음 -실행을 할당하지 않는다. Canonical Hook 쓰기나 DFA·추가 timeout을 승인으로 추정하지 않는다. -아래는 이 조건 해소 후의 실행 계약이며 현재 실행 준비 완료 또는 실제 성공이 아니다. - -부모 Coordinator invocation은 E8.2 block 전체를 사용하되 -`$env:FEM_HARNESS_CODEX_SANDBOX = 'workspace-write'` 바로 다음에 다음 한 줄을 추가한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -``` - -나머지 named Python/UVoffline/cache, dependency4, 새 짧은 TEMP/TMP와 E7 pytest basetemp, -Root에서 실제 성공한 installed x64 DevShell, 유한14400 module invocation과 finally의 -전체 process 환경 복원은 그대로다. 따라서 registered Stop에도 같은 병렬도1과 graph가 -상속된다. Actual configured outer Stop7500/shared·command7200 계약은 유지하지만 실제 -설정 출처·종료 evidence를 확인해야 하며 새 cap을 만들지 않는다. -원래 invocation line은 그대로다. - -```powershell -& $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" $mfePhase -$mfeExit = $LASTEXITCODE -if ($null -eq $mfeExit) { throw 'Native Executor exit unavailable' } -``` - -Native child tool shell에서는 E8.2 manual composition의 DevShell script 호출 한 줄을 -아래 **상속 환경 검사**로 대체한다. 나머지 dependency/Python/짧은 TEMP·병렬도1 설정과 -finally는 그대로 적용한다. 실행 정책 변경이나 우회 인수를 사용하지 않는다. -부모가 제공한 x64 환경이 없으면 검증 명령을 시작하지 않고 blocked-environment로 반환한다. - -```powershell -if ($env:VSCMD_ARG_TGT_ARCH -notin @('x64','amd64') -or - [string]::IsNullOrWhiteSpace($env:VSINSTALLDIR) -or - [string]::IsNullOrWhiteSpace($env:INCLUDE) -or - [string]::IsNullOrWhiteSpace($env:LIB)) { throw 'Inherited MSVC x64 environment missing' } -$mfeCl = (Get-Command cl.exe -ErrorAction Stop).Source -$mfeNinjaExe = (Get-Command ninja.exe -ErrorAction Stop).Source -if ($mfeCl -notmatch '[\\/]Hostx64[\\/]x64[\\/]cl.exe$') { throw 'Unexpected compiler architecture' } -Write-Output ("Inherited compiler={0}; Ninja={1}" -f $mfeCl, $mfeNinjaExe) -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -``` - -새 prep의 첫 manual build는 아래 **한 번의 clean-first full build**다. 새 Ninja graph의 -기존 성공 후 no-op build를 경쟁 해소 evidence로 보고하지 않도록, 실제 세 executable -link와 POST_BUILD discovery를 같은 직렬 build에서 다시 실행한다. CMake의 기존 -clean-first만 사용하며 기존 VS cache나 reference/evidence를 삭제하지 않는다. -Registered Stop과 후속 통상 build는 E8의 일반 build 명령에 병렬도1을 상속한다. - -```powershell -cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive" -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit) { throw 'Configure exit unavailable' } -if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -cmake --build --preset windows-msvc-ninja-debug --clean-first --verbose -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit) { throw 'Build exit unavailable' } -if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit) { throw 'Discovery exit unavailable' } -if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -ctest --preset windows-msvc-ninja-debug --output-on-failure -$mfeVerifyExit = $LASTEXITCODE -if ($null -eq $mfeVerifyExit) { throw 'CTest exit unavailable' } -if ($mfeVerifyExit -ne 0) { exit $mfeVerifyExit } -``` - -Verbose log에는 `fesa_unit_tests_576e7e9d_discovery.cmake`, -`fesa_integration_tests_d537bc73_discovery.cmake`, -`fesa_reference_tests_ac7cf2f0_discovery.cmake`의 실제 세 호출과 성공을 보존한다. -세 `*_tests.cmake`의 새 mtime/hash·등록 identity와 full discovery JSON을 대조한다. -현재 prep inventory는 unit289/integration34/reference39, 총362다. 명령이 실제 각 target의 -올바른 tests를 등록했는지 확인하며 합계나 leftover JSON의 존재만으로 통과하지 않는다. -Generated suffix가 바뀌면 actual build graph의 각 target 매핑을 기록하고 임의 파일을 만들지 않는다. - -새 `src/fesa/Debug/fesa_solver.lib`와 세 executable의 hash/mtime를 기록한다. -이 새 binary에 대한 required manual full CTest의 fresh reference solve, 입력 복사/hash와 -결과 생성 시각을 확인하고 그 뒤 registered same-binary full의 정상 cache 재사용과 구분한다. -Manual fresh solve를 cached-only 자동 실행으로 대체하지 않는다. 각 raw log를 덮어쓰기 전에 -새 attempt evidence로 보존한다. No-op 관찰·단독 진단·합산 duration은 full gate가 아니다. - -E7의 classifier37/focused136/full pytest 대상과 모든 assertion은 유지한다. 새 invocation에서 -각 필수 검증을 수행하되 현재 code에서 한 번 통과한 focused136을 근거 없이 반복하지 않는다. -과거 attempt4의 focused136 실제 세 반복이 모두 exit0이었다는 사실도 보존한다. -이미 GREEN인 source를 RED로 되돌리지 않으며 두 번째 source Correction을 시작하지 않는다. -기존 전체 Python, native configure/build/discovery/CTest와 실제 registered Stop 성공이 모두 -필수다. Full pytest/CTest의 미실행 상태를 다음 owner가 실제 evidence로 해소한다. - -Implementation owner는 보고서의 역사적 reference 미사용 문장을 정정해 full CTest의 기존 -static reference 읽기·비교, 원본 직접 수정 없음과 새 eigen 비교 미실행을 구분한다. -과거 manual failure와 registered pwsh1/Python0/CTest0도 각각 보존한다. -Result payload는 manual 결과와 아직 미관찰인 Stop을 구분하며 Coordinator가 실제 종료 후 -검토한다. Active Executor 동안 Root/Coordinator는 non-owned edits/commits를 멈춘다. -Main은 prep 전체 gate 뒤 별도 workspace-write invocation만 허용하며 E9의 병렬도1을 -같이 사용한다. 새로운 동일 실패는 원시 evidence와 기존 retry key로 반환한다. - -## E10. 부모 환경과 독립적인 workspace user preset - -[Root Stop 실패](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)는 -parent env4 미설정과 public preset의 cache4 빈 값 overwrite/configure1을 보존한다. -현재 실패 cache hash는 `125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e`다. -이는 MFE-OQ-004 승인 답변이 아니다. Canonical Hook·재신뢰는 계속 미승인이고 새 native/ -status reset도 미할당이다. 아래는 별도 Root 실행을 위한 문서 계획이며 현재 setup은 미실행이다. - -[Toolchain](../../scripts/msvc_harness/toolchain.py)은 executable 경로만 찾으며 -[Stop](../../scripts/hooks/stop_validation.py)은 parent env를 복사한다. 따라서 root -`CMakeUserPresets.json`의 `mfe-workspace-msvc-ninja-debug`가 public preset을 상속하고 -dependency4 literal cache와 최소 MSVC INCLUDE/LIB/tool PATH를 제공하도록 한다. -Installed CMake4.4 `Help/manual/cmake-presets.7.rst`의 user/common 자동 include, -`$penv{PATH}`, build/test `inheritConfigureEnvironment`를 사용한다. Public preset, -Harness API/config schema와 source/test/Hook은 바꾸지 않는다. - -Build/test는 configure 환경을 상속한다. 같은 Ninja binaryDir·MSVC Hostx64/x64·Debug, -실제 Debug archive 경로와 직렬 병렬도1을 유지한다. Root의 정상 DevShell에서 INCLUDE/LIB, -cl/rc/mt/Ninja directory만 capture하고 전체 env·비밀값은 preset에 저장하지 않는다. -Parent process는 finally에서 복원한다. 이후 arbitrary Root process에도 CMake child가 -자체 preset 환경을 적용하므로 parent env4/DevShell 지속성을 전제로 삼지 않는다. - -Preset TEMP/TMP는 setup에서 만든 새80자 이하 ignored 디렉터리를 **설정 수명 동안** -사용한다. CMake child에서는 이 값이 E7/E9의 매회 parent TEMP를 대체한다. 기존 model/test의 -고유 child directory 생성은 유지하고 동시 build/test가 없는지 Root가 setup 전에 실제 확인한다. -Python/pytest는 기존 per-invocation 새 짧은 TEMP와 basetemp를 유지한다. 기존 디렉터리/ -evidence 삭제, 권한·실행 정책 변경이나 Hook 우회는 없다. - -### E10.1. Root의 exact setup과 configure-only 확인 - -순서는 Planning3 동결 → Root docs checkpoint → 아래 setup → 실제 observation/최소 문서 -갱신과 Root exact commit이다. 현재 UserPresets는 미존재·미ignore다. Root가 별도 소유하는 -tracked 변경은 [.gitignore](../../.gitignore)의 `/CMakeUserPresets.json` 한 줄뿐이다. -그 줄을 Root가 검토·commit하며 public preset과 Implementation owned9/phase 범위는 유지한다. -UserPresets/local config/TEMP/backup/Ninja configure output은 ignored로 둔다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeRoot=(Get-Location).Path -$mfePython=Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -$mfeCmake=(Get-Command cmake.exe -ErrorAction Stop).Source -$mfePreset='mfe-workspace-msvc-ninja-debug' -$mfeGitRoot=git rev-parse --show-toplevel -if ($LASTEXITCODE -ne 0 -or [IO.Path]::GetFullPath($mfeGitRoot) -ne [IO.Path]::GetFullPath($mfeRoot)) { throw 'Repository mismatch' } -$mfeDirty=git status --porcelain -if ($LASTEXITCODE -ne 0 -or $mfeDirty) { throw 'Root docs checkpoint and clean required' } -if (Test-Path -LiteralPath 'CMakeUserPresets.json') { throw 'Preserve existing UserPresets' } -$mfeInputs=@{ - '.gitignore'='b81d422ee0185f16714e3218369689b808701e5e398a6f687a22784da2290842' - '.harness/config.json'='3ebdfa80124f1eb96909b2738d6f2a96fecd55cce61150a9cd7ef27d7c5fd892' - '.harness/build-ninja-msvc-debug/CMakeCache.txt'='125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e' -} -foreach ($mfePath in $mfeInputs.Keys) { - if ((Get-FileHash -LiteralPath $mfePath).Hash.ToLower() -ne $mfeInputs[$mfePath]) { throw "Changed input: $mfePath" } -} -$mfeBackup=Join-Path $mfeRoot ('.harness/build/mfe-preset-'+[guid]::NewGuid().ToString('N').Substring(0,8)) -$mfeTemp=Join-Path $mfeRoot ('.harness/build/t-'+[guid]::NewGuid().ToString('N').Substring(0,8)) -if ($mfeTemp.Length -gt 80 -or (Test-Path -LiteralPath $mfeTemp) -or (Test-Path -LiteralPath $mfeBackup)) { throw 'Fresh short paths required' } -$null=New-Item -ItemType Directory -Path $mfeBackup -$null=New-Item -ItemType Directory -Path $mfeTemp -Copy-Item -LiteralPath '.gitignore' -Destination (Join-Path $mfeBackup 'gitignore.before') -Copy-Item -LiteralPath '.harness/config.json' -Destination (Join-Path $mfeBackup 'config.before.json') -Copy-Item -LiteralPath '.harness/build-ninja-msvc-debug/CMakeCache.txt' -Destination (Join-Path $mfeBackup 'CMakeCache.before.txt') -$mfeUtf8=[Text.UTF8Encoding]::new($false) -[IO.File]::WriteAllText((Join-Path $mfeBackup 'before.json'),(@{hashes=$mfeInputs; userPresetsExisted=$false; temp=$mfeTemp}|ConvertTo-Json -Depth 6),$mfeUtf8) -$mfeProtected=@('CMakePresets.json','.codex/hooks.json','scripts/execute.py','tests/test_execute.py','phases/index.json','phases/mitc4-shell-feast-eigen-execution-prep/index.json','phases/mitc4-shell-feast-eigen-execution-prep/step0-output.json','.harness/build/CMakeCache.txt') -$mfeHashes=@{} -foreach ($mfePath in $mfeProtected) { $mfeHashes[$mfePath]=(Get-FileHash -LiteralPath $mfePath).Hash } -$mfeBeforeEnv=[Environment]::GetEnvironmentVariables('Process') -try { - $mfeVs='C:/Program Files/Microsoft Visual Studio/18/Community' - & (Join-Path $mfeVs 'Common7/Tools/Launch-VsDevShell.ps1') -VsInstallationPath $mfeVs -Arch amd64 -HostArch amd64 -SkipAutomaticLocation -NoLogo - $mfeCl=(Get-Command cl.exe -ErrorAction Stop).Source - $mfeRc=(Get-Command rc.exe -ErrorAction Stop).Source - $mfeMt=(Get-Command mt.exe -ErrorAction Stop).Source - $mfeNinja=Join-Path $mfeVs 'Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe' - if ($env:VSCMD_ARG_TGT_ARCH -notin @('x64','amd64') -or $mfeCl -notmatch '[\\/]Hostx64[\\/]x64[\\/]cl\.exe$') { throw 'MSVC x64 required' } - if (-not(Test-Path -LiteralPath $mfeNinja) -or [string]::IsNullOrWhiteSpace($env:INCLUDE) -or [string]::IsNullOrWhiteSpace($env:LIB)) { throw 'Toolchain incomplete' } - $mfeDirs=@((Split-Path $mfeCl),(Split-Path $mfeNinja),(Split-Path $mfeRc),(Split-Path $mfeMt))|Select-Object -Unique - $mfeEnv=@{INCLUDE=$env:INCLUDE; LIB=$env:LIB; PATH=($mfeDirs -join ';')+';$penv{PATH}'; TEMP=$mfeTemp.Replace('\','/'); TMP=$mfeTemp.Replace('\','/'); CMAKE_BUILD_PARALLEL_LEVEL='1'} - $mfeCache=@{ - FESA_GTEST_SOURCE_DIR='C:/git/googletest' - MKL_DIR='C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl' - TBB_DIR='C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb' - HDF5_DIR='C:/Program Files/HDF_Group/HDF5/2.1.1/cmake' - CMAKE_CXX_COMPILER=$mfeCl.Replace('\','/') - CMAKE_MAKE_PROGRAM=$mfeNinja.Replace('\','/') - CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=('$'+'{sourceDir}/.harness/build-ninja-msvc-debug/src/fesa/Debug') - } - $mfeUser=@{ - version=3 - configurePresets=@(@{name=$mfePreset; inherits='windows-msvc-ninja-debug'; cacheVariables=$mfeCache; environment=$mfeEnv}) - buildPresets=@(@{name=$mfePreset; inherits='windows-msvc-ninja-debug'; configurePreset=$mfePreset; inheritConfigureEnvironment=$true}) - testPresets=@(@{name=$mfePreset; inherits='windows-msvc-ninja-debug'; configurePreset=$mfePreset; inheritConfigureEnvironment=$true}) - } -} -finally { - foreach ($mfeName in @([Environment]::GetEnvironmentVariables('Process').Keys)) { - if (-not $mfeBeforeEnv.Contains($mfeName)) { [Environment]::SetEnvironmentVariable($mfeName,$null,'Process') } - } - foreach ($mfeName in $mfeBeforeEnv.Keys) { [Environment]::SetEnvironmentVariable($mfeName,$mfeBeforeEnv[$mfeName],'Process') } -} -$mfeOriginalIgnore=[IO.File]::ReadAllBytes((Join-Path $mfeRoot '.gitignore')) -if ($mfeOriginalIgnore[-1] -ne 10) { throw 'Unexpected ignore EOF' } -$mfeSuffix=$mfeUtf8.GetBytes('/CMakeUserPresets.json'+[Environment]::NewLine) -[IO.File]::WriteAllBytes((Join-Path $mfeRoot '.gitignore'),[byte[]]($mfeOriginalIgnore+$mfeSuffix)) -git check-ignore --quiet CMakeUserPresets.json -if ($LASTEXITCODE -ne 0) { throw 'UserPresets must be ignored' } -[IO.File]::WriteAllText((Join-Path $mfeRoot 'CMakeUserPresets.json'),($mfeUser|ConvertTo-Json -Depth 10)+[Environment]::NewLine,$mfeUtf8) -$mfeConfig=Get-Content -LiteralPath '.harness/config.json' -Raw|ConvertFrom-Json -$mfeConfig.cmake.configurePreset=$mfePreset -$mfeConfig.cmake.buildPreset=$mfePreset -$mfeConfig.cmake.testPreset=$mfePreset -[IO.File]::WriteAllText((Join-Path $mfeRoot '.harness/config.json'),($mfeConfig|ConvertTo-Json -Depth 10)+[Environment]::NewLine,$mfeUtf8) -foreach ($mfeName in @('FESA_GTEST_SOURCE_DIR','MKL_DIR','TBB_DIR','HDF5_DIR')) { - if (-not [string]::IsNullOrEmpty([Environment]::GetEnvironmentVariable($mfeName,'Process'))) { throw 'Separate env4-unset configure verification required' } -} -$mfeExit=$null -try { - & $mfeCmake --list-presets=all - $mfeExit=$LASTEXITCODE - if ($null -eq $mfeExit) { throw 'Preset validation exit unavailable' } - if ($mfeExit -ne 0) { exit $mfeExit } - & $mfePython -B -X utf8 -c "from pathlib import Path; from scripts.msvc_harness.config import load_config; c=load_config(Path.cwd()); assert c.cmake.configure_preset==c.cmake.build_preset==c.cmake.test_preset=='mfe-workspace-msvc-ninja-debug'; assert c.cmake.binary_dir==Path.cwd()/'.harness/build-ninja-msvc-debug'; print('Local config valid')" - $mfeExit=$LASTEXITCODE - if ($null -eq $mfeExit) { throw 'Config validation exit unavailable' } - if ($mfeExit -ne 0) { exit $mfeExit } - & $mfeCmake --preset mfe-workspace-msvc-ninja-debug - $mfeExit=$LASTEXITCODE - if ($null -eq $mfeExit) { throw 'Configure exit unavailable' } -} -finally { - $mfeAfter=@{} - foreach ($mfePath in @('.gitignore','CMakeUserPresets.json','.harness/config.json','.harness/build-ninja-msvc-debug/CMakeCache.txt')) { - $mfeAfter[$mfePath]=(Get-FileHash -LiteralPath $mfePath).Hash.ToLower() - } - [IO.File]::WriteAllText((Join-Path $mfeBackup 'after.json'),(@{hashes=$mfeAfter; lastNativeExit=$mfeExit}|ConvertTo-Json -Depth 6),$mfeUtf8) - foreach ($mfePath in $mfeProtected) { - if ((Get-FileHash -LiteralPath $mfePath).Hash -ne $mfeHashes[$mfePath]) { throw "Non-owned change: $mfePath" } - } -} -$mfeFinalDirty=git status --porcelain -if ($LASTEXITCODE -ne 0 -or @($mfeFinalDirty).Count -ne 1 -or $mfeFinalDirty -ne ' M .gitignore') { throw 'Unexpected tracked changes' } -git diff --check -- .gitignore -if ($LASTEXITCODE -ne 0) { throw 'Ignore whitespace check failed' } -Write-Output ("Setup evidence: {0}; configure exit {1}" -f $mfeBackup,$mfeExit) -exit $mfeExit -``` - -Original3파일 bytes/hash와 UserPresets 부재를 mutation 전에 backup하고, 실제 CMake -`--list-presets=all` schema/inheritance 해석 및 `load_config` 뒤 **env4 unset 상태의 -configure만** 수행한다. Root는 after cache의 dependency4, Ninja/Debug, compiler 경로· -pointer size8, archive 경로와 새 user/config/cache hash를 기록한다. Actual adapter plan의 -configure/build/discovery/test 네 명령도 같은 local preset으로 대조한다. -Library/build/CTest 성공은 configure evidence가 아니다. HEAD/phase history4/source/ -reference/old VS cache 불변, tracked diff가 ignore1줄뿐인지 감사한 뒤 Root가 exact commit한다. -자동 Root outer Stop이 발생하면 실제 결과를 따로 관찰하며 manual Hook으로 대체하지 않는다. - -### E10.2. 기존 명령의 명시 대체와 수명 - -Setup 성공을 별도 감사한 뒤 E8/E9 및 모든 prep/main 명령의 preset 인수를 아래로 대체한다. -Configure의 archive는 user cache가 고정하므로 예전 추가 `-D`가 필요 없다. - -| 목적 | 정확한 새 명령 | -| --- | --- | -| Configure | `cmake --preset mfe-workspace-msvc-ninja-debug` | -| E9 최초 실제 직렬 재검증 build | `cmake --build --preset mfe-workspace-msvc-ninja-debug --clean-first --verbose` | -| 일반 full/registered build | `cmake --build --preset mfe-workspace-msvc-ninja-debug` | -| Main focused target build | `cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests` | -| Discovery | `ctest --preset mfe-workspace-msvc-ninja-debug --show-only=json-v1` | -| Full CTest | `ctest --preset mfe-workspace-msvc-ninja-debug --output-on-failure` | - -Focused CTest는 원 Step의 `-R` 문자열을 그대로 유지하고 preset 인수만 위 이름으로 바꾼다. -E9 세 discovery의 실제 실행/등록 identity·새 binary hash/mtime·fresh manual solve 및 -registered same-binary full 구분, 전체 Python/CTest, 수치/reference 계약은 유지한다. -CMake 검증에 한해 E8/E9의 외부 shell DevShell 재호출·cl/Ninja 사전 검색 조건을 user preset과 -actual compiler/cache evidence로 대체한다. Python/UV recipe와 finite14400/7500/7200 -계약, workspace-write 및 모든 Hook/retry/ownership guard는 그대로다. -실제 canonical outer1800·재신뢰 문제는 이 local setup으로 해결됐다고 주장하지 않는다. - -[Preset contract test](../../tests/test_harness_preset_contract.py)는 tracked public preset/ -config.example과 tmp_path에 복사한 example을 검사하며 실제 local config/UserPresets를 -읽지 않는다. Public/example 불변과 기존 ignore 항목 보존 시 이 선택과 모순되지 않는다. -테스트 소스/대상/assertions는 수정하지 않았고 이 Planning에서 테스트를 실행하지 않았다. - -Rollback은 active 실행이 없고 after hash와 현재 파일이 동일한 경우에 Root가 수행한다. -`.gitignore`와 local config는 backup bytes로 복원하고, 원래 없었던 정확한 -`CMakeUserPresets.json`만 `Remove-Item -LiteralPath`로 비재귀 제거한다. -필요 시 `CMakeCache.before.txt`를 원래 exact cache 경로에 복사하되 **기존 실패 cache -복원**임을 기록한다. Generated outputs/TEMP/evidence는 삭제하지 않고 graph 유효성이나 -검증 성공을 주장하지 않는다. 이미 ignore1줄을 commit했다면 Root의 exact inverse commit을 -사용하고 history reset은 하지 않는다. 타 owner 변경이 있으면 덮어쓰지 않고 반환한다. -설정은 해당 workspace에 유지하며 feature 종료·설치 경로 변경 때 Root가 수명을 검토한다. - -## E11. 실제 local 설정에 대한 정상 invocation - -Root E10 최초 setup은 compiler 경로의 Hostx64/HostX64 cache 재검사에서 exit1이었다. -[같은 preset 후속 configure](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configure-followup/result.json)는 -parent env4 unset 상태에서 exit0/1.656초를 기록했다. Actual 설정/adapter4명령은 local -`mfe-workspace-msvc-ninja-debug`, MSVC19.51/pointer8/Debug, 동일 archive/병렬도1이다. -이는 configure evidence이며 build/CTest 또는 prep 성공이 아니다. - -Root가 사용자 후속 응답을 MFE-OQ-004의 제시된 canonical timeout 한 값·정상 재신뢰 -승인으로 해석했다. **Actual canonical Stop7500/enabled/trusted** 확인은 Root 소유이며 -현재 미관찰이다. 그 evidence와 최종 문서 checkpoint를 감사한 뒤에만 Coordinator가 -별도 status-only 할당 → 갱신 R11 actual control checkpoint → clean → 아래 새 invocation -순서로 진행한다. 이번 Planning은 status나 설정을 바꾸거나 실행하지 않았다. - -```powershell -$ErrorActionPreference='Stop' -$mfeRoot=(Get-Location).Path -$mfePhase='mitc4-shell-feast-eigen-execution-prep' -$mfeEvidence=Join-Path $mfeRoot '.harness/build/mitc4-eigen-evidence/prep/classifier-correction' -$mfePython=Join-Path $mfeEvidence 'pytest-venv/Scripts/python.exe' -$mfeBase=Join-Path $mfeEvidence 'python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe' -foreach ($mfeFile in @($mfePython,$mfeBase)) { if (-not(Test-Path -LiteralPath $mfeFile)) { throw 'Named Python missing' } } -Get-Command uv -ErrorAction Stop | Out-Null -$mfeNames=@('PATH','UV_PYTHON','UV_CACHE_DIR','UV_OFFLINE','TEMP','TMP','FEM_HARNESS_CODEX_SANDBOX','CMAKE_BUILD_PARALLEL_LEVEL') -$mfeBefore=@{} -foreach ($mfeName in $mfeNames) { $mfeBefore[$mfeName]=[Environment]::GetEnvironmentVariable($mfeName,'Process') } -if ($null -ne $mfeBefore['FEM_HARNESS_CODEX_SANDBOX'] -and $mfeBefore['FEM_HARNESS_CODEX_SANDBOX'] -ne 'workspace-write') { throw 'Unexpected sandbox environment' } -$mfeTemp=Join-Path $mfeRoot ('.harness/build/t-'+[guid]::NewGuid().ToString('N').Substring(0,8)) -if ($mfeTemp.Length -gt 80 -or (Test-Path -LiteralPath $mfeTemp)) { throw 'Fresh short Python TEMP required' } -$null=New-Item -ItemType Directory -Path $mfeTemp -$mfeExit=$null -try { - $env:PATH=(Split-Path $mfePython)+';'+(Split-Path $mfeBase)+';'+$mfeBefore['PATH'] - $env:UV_PYTHON=$mfePython - $env:UV_CACHE_DIR=Join-Path $mfeEvidence 'workspace-python-cache' - $env:UV_OFFLINE='true' - $env:TEMP=$mfeTemp - $env:TMP=$mfeTemp - $env:FEM_HARNESS_CODEX_SANDBOX='workspace-write' - $env:CMAKE_BUILD_PARALLEL_LEVEL='1' - & $mfePython -B -X utf8 -c "import sys; from pathlib import Path; from scripts import execute; from scripts.msvc_harness.config import load_config; r=Path.cwd(); c=load_config(r); assert c.cmake.configure_preset==c.cmake.build_preset==c.cmake.test_preset=='mfe-workspace-msvc-ninja-debug'; assert c.cmake.binary_dir==r/'.harness/build-ninja-msvc-debug'; e=execute.StepExecutor(sys.argv[1]); assert e._is_isolated_worktree(); assert not e._worktree_paths(); assert e._implementation_agent_settings()==('gpt-5.6-terra','xhigh'); e._preflight_repository(); print('Local preset and clean linked profile preflight valid')" $mfePhase - $mfeExit=$LASTEXITCODE - if ($null -eq $mfeExit) { throw 'Preflight exit unavailable' } - if ($mfeExit -ne 0) { exit $mfeExit } - & $mfePython -B -X utf8 -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" $mfePhase - $mfeExit=$LASTEXITCODE - if ($null -eq $mfeExit) { throw 'Native Executor exit unavailable' } -} -finally { - foreach ($mfeName in $mfeNames) { [Environment]::SetEnvironmentVariable($mfeName,$mfeBefore[$mfeName],'Process') } -} -exit $mfeExit -``` - -기존 E8의 public preset assertion과 DevShell/클라이언트 shell tool 검색은 이 preflight로 -명시 대체한다. E10 user preset이 CMake child의 INCLUDE/LIB/PATH·병렬도1·영속 짧은 -TEMP를 제공하며 Python은 새 짧은 TEMP와 E7의 새 pytest basetemp를 쓴다. -실제 local user/config/cache hash는 R11에서 확인하고 달라지면 보존·재검토한다. -Actual prep gate 뒤 별도 main invocation은 위 `$mfePhase`만 `mitc4-shell-feast-eigen`으로 -변경한다. 모든 invocation은 workspace-write/terra/xhigh/유한14400이고 DFA flag가 없다. - -Manual/registered의 configure/build/CTest는 **모두 E10.2의 local preset 명령**을 쓴다. -E9 첫 clean-first/verbose 직렬 build에서 세 실제 discovery 호출·등록 identity를 확인하고, -classifier37/focused136/full pytest, native configure/build/discovery/full CTest 및 registered -Stop actual 성공을 모두 확보한다. 이미 통과한 focused를 근거 없이 반복하지 않는다. -새 library/executable hash·mtime, fresh manual reference solve와 그 뒤 same-binary registered -full의 정상 cache 재사용을 구분한다. Static reference 읽기/비교와 원본 직접 수정 없음, -새 eigen comparison 미실행의 보고서 정정도 기존 owner 요구대로 남는다. - -Source Correction1회는 소진됐고 자동 재시도·새 key·test 축소는 없다. 공유 Hook의 실제 -적용/신뢰가 확인되지 않으면 native를 시작하지 않는다. 실행 중 Root/Coordinator의 non-owned -편집·commit을 멈추며 보고 시점 manual evidence와 이후 native/registered raw exit를 -Coordinator가 사후 대조한다. Canonical7500 확인을 실제 full 검증 성공으로 해석하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-interfaces.md b/docs/mitc4-shell-feast-eigen/implementation-interfaces.md deleted file mode 100644 index a3b479d..0000000 --- a/docs/mitc4-shell-feast-eigen/implementation-interfaces.md +++ /dev/null @@ -1,110 +0,0 @@ -# 구현 경계와 source/test 대응 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `implementation-planning-agent` -- Input contract revision: `r2` -- 기본 보고서: [implementation-plan](implementation-plan.md) - -## 실제 repository 확장점 - -기존 `DomainMappingContext::Impl`이 syntax·material/property·sole step candidate를 소유하고 -thin mapper들이 finalize를 호출한다. 이 범위를 확장하며 parallel parser/새 registry를 만들지 -않는다. `KeywordBlock`에는 physical_lines가 있지만 `DataLine`에는 fields/location만 있어 -I/O의 raw count/density data를 보존하려면 `original_line`이 필요하다. - -`Domain::Steps()`와 `AnalysisModel::Step()`은 기존 static API다. 별도 frequency 정의를 -추가하고 active boundary/location view로 DofManager를 연결한다. StaticStep의 미사용 time/load -fields에 frequency 의미를 끼워 넣지 않는다. FrequencyStep은 boundaries/source options/N을 -소유하고 density는 material identity에 연결된 Domain composition record다. Concrete material -base를 optional capability로 늘리지 않는다. - -현재 `ElementFactory::CreateShell`은 private이고 `unique_ptr`를 반환한다. 승인 -shell-only procedure에 필요한 typed `CreateMitc4Shell` 생성 seam을 추가하되 기존 generic -Create도 같은 checked construction을 사용한다. Consumer의 downcast/type-switch 없이 -typed mass contribution과 기존 ElementView stiffness contribution을 같은 layout/scatter에 준다. -Global equation/index/pattern은 끝까지 DofManager 소유다. - -`Mitc4Shell::Stiffness`는 현재 min rotary diagonal을 사용하고 -`NonlinearMitc4Shell::Create`는 그 초기 kd를 저장한다. 새 private trace helper로 앞 경계만 -바꾸면 nonlinear은 기존 frozen path를 재사용한다. Tests는 formula 값 변경뿐 아니라 -완전한 geometry/frame 재생성·partial BC·반력·objective tangent를 검증한다. - -`hdf5_internal::WriteModel`은 model datasets와 static metadata를 함께 쓴다. Model-only seam을 -분리하고 기존 WriteModel이 같은 static metadata와 datasets를 호출하도록 유지한다. Eigen은 -그 model-only 함수와 eigen-only metadata/schema를 사용한다. 기존 static reader inventory는 -그대로 두며 eigen discriminant 없이 새 파일을 static으로 읽지 않게 테스트한다. - -## Step별 API와 책임 - -| Step | 완성되는 경계 | 소유 데이터와 호출 규칙 | -| --- | --- | --- | -| 0 | FrequencyStep, Domain::FrequencySteps/Densities, active view, exact mapping | Raw syntax→validated immutable records; density/t/source resolution; static API/순서 보존 | -| 1 | ComputeDrillingScale→Mitc4Shell::Stiffness | 초기 physical20만 입력, eight diagonals scaled mean; nonlinear 초기 저장 경로 재사용 | -| 2 | ConsistentMass→DeriveLumpedMass→ShellMassAssembler | Original24/C0..2 snapshot 보존, nodal6 blocks, stable COO/reduction; same source scatter | -| 3 | ReduceEigenSystem/RestoreEigenvector, DofManager finite layout | Original free K/ML 별도 보존, node P/Z/L/rcond와 finite pattern, sparse block whitening | -| 4 | FeastBackend/InitialSpace/Search→EigenSolver::SolveLowest | Vendor-private actual calls, neutral scalar/vector/history output; actual N/n/c/m0 각각 구분 | -| 5 | ValidateEigenpairs→LinearFrequencyProcedureExecutor::Execute | All-c 검증 후 paired N candidate, 전체 c metrics/history, Domain/view 수명, 아직 accepted commit 아님 | -| 6 | EigenResultsWriter/WriteEigenSchema/SelfCheckEigen→prepared CLI finalization | Log close, candidate close/readback, final replacement 뒤 nofail state swap | -| 7 | EigenReferenceComparison와 fresh-run portfolio | Source-key Value-only join/common policy, raw/new-binary evidence, canonical3 보고서 | - -Private helper names는 Step에 지정한 책임·signature 역할을 지킨다. Parameter type의 상세 배치와 -작은 private structs는 Implementation이 routine 선택할 수 있지만 승인 owned files 밖 확장, -physics/schema/tolerance 변경은 Coordinator에 반환한다. Public header는 standard/FESA value -type만 노출하고 MKL_INT, HDF5 hid_t, Win32 handle/header는 private source에 둔다. - -## TDD file boundary - -각 Step index는 tests/build/reports를 포함한 정확한 path 목록을 가진다. 현재 -`scripts/msvc_harness/tdd_policy.py`는 production basename에 대응하는 test basename을 -찾으므로 새 C++ header/source의 test를 반드시 먼저 생성한다. 아래는 새 경계별 대응이며 -기존 production은 해당 existing test와 추가 feature suite를 함께 사용한다. - -| Production basename | Related test path | -| --- | --- | -| frequency_step | `tests/unit/model/frequency_step_test.cpp` | -| domain_mapping_context | `tests/unit/io/abaqus/domain_mapping_context_test.cpp` | -| mitc4_drilling_scale | `tests/unit/elements/mitc4_drilling_scale_test.cpp` | -| mitc4_shell_mass | `tests/unit/elements/mitc4_shell_mass_test.cpp` | -| shell_mass_assembler | `tests/unit/assembly/shell_mass_assembler_test.cpp` | -| eigen_reduction | `tests/unit/analysis/eigen_reduction_test.cpp` | -| feast_backend | `tests/unit/solvers/eigen/feast_backend_test.cpp` | -| feast_initial_space | `tests/unit/solvers/eigen/feast_initial_space_test.cpp` | -| feast_search | `tests/unit/solvers/eigen/feast_search_test.cpp` | -| eigen_solver | `tests/unit/solvers/eigen/eigen_solver_test.cpp` | -| mkl_feast_eigen_solver | `tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | -| eigen_analysis_state | `tests/unit/analysis/eigen_analysis_state_test.cpp` | -| eigen_validation | `tests/unit/analysis/eigen_validation_test.cpp` | -| linear_frequency_procedure | `tests/integration/analysis/linear_frequency_procedure_test.cpp` | -| eigen_results_writer | `tests/unit/results/eigen_results_writer_test.cpp` | -| eigen_hdf5_results_writer | `tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp` | -| eigen_hdf5_schema | `tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp` | -| hdf5_model_writer | `tests/unit/io/hdf5/hdf5_model_writer_test.cpp` | -| prepared_analysis | `tests/unit/analysis/prepared_analysis_test.cpp` | - -Existing stem의 `model_types/domain/analysis_model/dof_manager/input_syntax/input_reader/ -mitc4_shell/element_factory/fesa_application`은 현재 대응 tests가 있고 각 Step의 관련 test와 -함께 검증한다. 새 test registration은 `tests/CMakeLists.txt`, 새 library cpp는 -`src/fesa/CMakeLists.txt`만 소유한다. Root CMake/dependency/preset 변경은 필요하지 않다. -Vendor link/runtime는 기존 Fesa::MKL/HDF5/TBB target closure로 실제 API를 실행해 확인한다. -명백한 missing runtime가 발견되면 임의 PATH 우회나 scope 확대 대신 exact evidence를 반환한다. - -현재 `tests/CMakeLists.txt`의 `fesa_tests`는 세 executable `fesa_unit_tests`, -`fesa_integration_tests`, `fesa_reference_tests`에 의존하는 aggregate target이다. -따라서 Step의 `--target fesa_tests`는 reference까지 빌드한다. 새 `tests/unit/` 파일은 -unit executable, `tests/integration/` 파일은 integration executable, `tests/reference/` -파일은 reference executable에 등록한다. 각 executable의 기존 runtime staging과 -`gtest_discover_tests`를 유지한다. Focused inventory에서 새 이름 모두가 존재해야 한다. - -## Candidate commit과 테스트 주입 - -별도 `EigenAnalysisState`는 N vectors와 raw scalars/source, all-c checks/history만 소유한다. -Working reduction/solver scratch는 procedure 실행 동안 유지되고 accepted state에 global dense -matrix나 미래 dynamics state를 남기지 않는다. `Swap`은 `noexcept`이고 소유 vector/record -교환만 수행한다. Execute 반환 candidate를 accepted state라고 보고하지 않는다. - -Prepared/static 기존 overload는 보존하고 frequency executor/result/writer가 있는 overload를 -추가하여 procedure 선택을 한 경계에 둔다. Output finalization은 candidate를 완성/검증/close하고 -final replacement 성공 뒤 state swap을 수행한다. 이 순서에 fallible callback/allocation을 -남기지 않는다. Failure injection은 EigenSolver/EigenResultsWriter 및 private backend/schema -seam에 제한한다. 새로운 public CLI failure flags는 없다. Raw HDF5 mutation은 test-local -generated file에서만 하고 저장 reference input/TXT/CSV는 read-only다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-plan.md b/docs/mitc4-shell-feast-eigen/implementation-plan.md deleted file mode 100644 index 0744dbf..0000000 --- a/docs/mitc4-shell-feast-eigen/implementation-plan.md +++ /dev/null @@ -1,110 +0,0 @@ -# MITC4 질량·FEAST 구현 계획 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `implementation-planning-agent` -- Input contract revision: `r2` -- 요청 outcome: `pass`; 다음 owner: `implementation-agent` -- 의미: 실행 가능한 계획의 Coordinator gate 검토 요청이다. 구현/검증 완료 판정이 아니다. - -최초 prep attempt1은 지정 Hook 설정 쓰기 거부로 종료되었다. 부분 구현·blocked 기록의 -보존과 승인 후 조건부 재개는 [복구 계획](implementation-recovery.md)을 따른다. -원 6단계 gate와 아래 main 계획은 유지하며 WIP 보존을 구현 성공으로 판정하지 않는다. -Prep에는 성공한 source echo를 helper failure로 오판한 재현 결함의 최소 classifier TDD도 -포함한다. 기존 scripts/execute.py/tests/test_execute.py 소유 안에서 수행한다. - -별도 Correction은 실제 RED21fail/16pass 뒤 GREEN37pass를 확보했다. 전체 pytest의 Hook -불일치와 manual build의 TEMP 접근 거부는 남아 있다. [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)의 -source2 보존 뒤 [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)의 -확인된 Python 및 정상 TEMP/TMP 설정으로 후속 검증을 준비한다. 현재 source checkpoint, -status reset과 DFA 실행은 미실행이며 exact-run 명시 승인도 아직 없다. - -위 E6 승인·재개는 이후 실제 attempt2로 수행됐다. Hook7500/focused136pass와 build는 -완료됐지만 긴 inherited TEMP의 test323 실패로 전체 gate는 미완료다. 현재 복구는 -[R7](implementation-recovery.md#r7-attempt2-실패-보존과-정상-workspace-write-재개)의 -error/history2 WIP 보존 뒤 [E7](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개)의 -짧은 TEMP와 정상 workspace-write를 사용한다. 이번에는 추가 DFA 승인이나 source Correction이 없다. - -이후 attempt3은 짧은 TEMP를 같은 shell에 지정해도 manual build의 FileTracker 접근 거부로 -종료됐다. 현재 작업은 [R8](implementation-recovery.md#r8-attempt3의-blocked-기록-보존)의 -report1/controls2 blocked/history3 WIP 보존이다. [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)의 -정상 Ninja 대안은 후속 bounded delta에서 명령을 확정하며 이번에는 설정·status reset·재실행하지 않는다. - -R8 report/controls 보존은 실제 두 commit과 clean 확인까지 완료됐다. 현재 -[E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)은 Root의 ignored 설정 준비와 -Coordinator의 별도 정상 Ninja invocation, 기존 Step 명령 대응을 확정한다. -[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint)의 status-only 변경·checkpoint는 -후속 할당으로 남는다. 이번 delta는 문서/정적 확인이며 native Ninja 성공은 아직 미검증이다. - -Attempt4의 최초 manual Ninja build는 GoogleTest discovery JSON 오류로 실패했다. -[R10](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)이 report1/controls2의 -error/history4 보존을 고정한다. [E9](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)는 -정상 병렬도1·실제 clean-first 검증을 계획한다. 현재 resolver의 canonical Stop1800 해석은 -확인됐지만 정상 override 지원·적용 방법은 미확정이다. R11 status-only 변경과 재실행은 별도 할당 전 수행하지 않는다. - -새 Root configure 실패는 parent env4에 의존한 cache overwrite다. -[E10](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)은 Root 소유의 -ignore1줄·ignored UserPresets/local config를 계획한다. 실제 setup은 아직 미실행이고 -[R12](implementation-recovery.md#r12-user-preset-setup-이후의-stale-hash-경계)의 R11 hash 갱신은 -actual setup 뒤 별도 할당한다. MFE-OQ-004 공유 Hook·재신뢰 결정은 계속 별도 미승인이다. - -이후 E10 configure 복구와 ignore1줄 commit은 실제 완료됐다. 현재 R11은 관찰된 local -hash를 반영했고 [E11](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)이 -local preset preflight/정상 invocation을 고정한다. MFE-OQ-004는 사용자 후속 응답으로 -Root가 승인 해석했으며, actual canonical7500/enabled/trusted 확인 전 native는 시작하지 않는다. - -현재 attempt5는 과거 VS 수동 명령 실행으로 blocked/history5다. Prep와 main8의 Step 본문을 -local preset 명령으로 직접 정합했고 [R13](implementation-recovery.md#r13-attempt5-명령-정합과-실패-보존)에 -report1/controls2 보존과 별도 status-only 복구를 고정했다. 첫4 history·현재 raw는 보존하며 -registered local 성공을 미완료 manual full VERIFY로 대체하지 않는다. 이번 delta는 계획/정적 확인뿐이다. - -[FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)와 -[coordination](coordination.md), 승인된 [requirements](requirements.md), [research](research.md), -[formulation](formulation.md), [NR](numerical-review.md), [I/O](io.md) 및 각 상세 r2를 적용한다. -공통 [architecture](../ARCHITECTURE.md), [tolerance](../TOLERANCE.md), -[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md), -[harness](../../.agents/skills/harness/SKILL.md), -[fem-implementation-tdd](../../.codex/skills/fem-implementation-tdd/SKILL.md)가 실행 기준이다. - -## 실행 구성 - -별도 execution-prep1 Step을 마친 뒤 새 invocation에서 main8 Steps를 수행한다. -각 Step은 behavior별 RED→observed failure→minimal GREEN→focused VERIFY를 끝내고 -전체 MSVC/x64/Debug CMake/CTest와 등록 Stop을 통과한다. 새 compiler warning은0이다. - -| 순서 | 완결되는 범위 | 실행 artifact | -| --- | --- | --- | -| Prep0 | 다섯 유한 deadline 설정·Harness regression·activation | [prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md) | -| 0 | Frequency semantic model과 exact 입력 subset | [Step0](../../phases/mitc4-shell-feast-eigen/step0.md) | -| 1 | 공변 drilling scale과 정적 회귀 | [Step1](../../phases/mitc4-shell-feast-eigen/step1.md) | -| 2 | Consistent→lumped 질량과 deterministic 조립 | [Step2](../../phases/mitc4-shell-feast-eigen/step2.md) | -| 3 | 실제 제약의 null 공간과 sparse whitening | [Step3](../../phases/mitc4-shell-feast-eigen/step3.md) | -| 4 | MKL FEAST adapter와 bounded lowest-N 검색 | [Step4](../../phases/mitc4-shell-feast-eigen/step4.md) | -| 5 | 전체 c 검증과 별도 frequency procedure | [Step5](../../phases/mitc4-shell-feast-eigen/step5.md) | -| 6 | Additive HDF5와 CLI candidate transaction | [Step6](../../phases/mitc4-shell-feast-eigen/step6.md) | -| 7 | Value-only comparator·fresh reference·구현 evidence | [Step7](../../phases/mitc4-shell-feast-eigen/step7.md) | - -[실행 환경](implementation-environment.md)은 actual autodetect VS18/x64/Debug cache/dependencies, -one-time prep module invocation과 새 main activation, 유한 timeout·Git ownership을 고정한다. -8개로 합친 이유와 시간 추정의 한계도 명시했다. [API/source-test 경계](implementation-interfaces.md)는 -기존 확장점과 vendor 격리·별도 state/procedure·candidate commit을 정한다. -[Verification mapping](implementation-verification.md)은 must27/NR27/I/O11 및 formulation/schema -items를 독립 oracle·mutation·실제 test discovery/full evidence에 연결한다. - -## 계약과 handoff - -계산은 `consistent -> moment-derived lumped -> actual MKL FEAST`이며 all-c residual/Gram도 -같은 ML을 사용한다. 입력 N은 원본 FREQUENCY의10, 공개 N과 검증 c를 구분한다. -공변 trace stabilization과 영향 static 재검증을 포함한다. 새 eigen external comparison은 원본 -TXT의 Value10개와10singleton common families이며 기존 static U/UR/reaction 역할은 유지한다. - -모든 exact implementation/test/build/report paths는 [main index](../../phases/mitc4-shell-feast-eigen/index.json)와 -[prep index](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json)에 있다. -미래 보고서를 미리 생성하지 않았다. Planning 소유는 이 main/detail4문서와 할당된 phase files뿐이다. -Solver C++·FEAST·reference comparison은 미실행이다. 운영 prep의 부분 변경과 실제 검증 -관찰은 [현재 상태](coordination.md)와 [복구 계획](implementation-recovery.md)에 구분한다. -계획 정적 감사 명령/exit/coverage는 [V7](implementation-verification.md#v7-계획-정적-감사)에 기록한다. - -현재 upstream physics/schema/tolerance 미결정은 없다. Native Codex sandbox/runtime와 실제 -FEAST count/condition/메모리/외부 오차는 실행 전 성공을 보장할 수 없다. Actual failure는 계약된 -owner/환경 경로로 반환하고 수치 기준을 바꾸지 않는다. Workflow 전이·독립 Physics/Release와 -closure는 Coordinator/각 owner 소유이며 push/tag/publish/deploy/package 권한은 없다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md b/docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md deleted file mode 100644 index 6d7ecf2..0000000 --- a/docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md +++ /dev/null @@ -1,219 +0,0 @@ -# Execution-prep evidence - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `implementation-agent` -- Input contract revision: `r2` -- Step: `mitc4-shell-feast-eigen-execution-prep` / `0 bounded-execution-deadlines` -- Outcome: `blocked-environment` — R7 재검증에서 MSVC `FileTracker` 접근 거부가 - 다시 발생하여 Full VERIFY를 완료할 수 없다. - -## RED - -`uv run --with pytest python -B -m pytest -v -rs tests/test_harness_timeouts.py` -returned exit code `1` twice. The first run exposed one test-double setup issue; after -that test-only correction, the second run failed `4/4` on the intended pre-change -defaults: Executor `1800`, Stop shared deadline `1800`, `CommandSpec` `1800`, and -registered Stop `1800`. - -## Applied scope and partial GREEN - -The following owned runtime defaults now match the approved finite limits: - -- `scripts/execute.py`: `StepExecutor.CODEX_TIMEOUT_SECONDS = 14400` -- `scripts/hooks/stop_validation.py`: `TOTAL_TIMEOUT_SECONDS = 7200` -- `scripts/msvc_harness/models.py`: `CommandSpec.timeout_seconds = 7200` -- `scripts/msvc_harness/process.py`: `execute_plan(... total_timeout_seconds=7200)` -- `docs/HARNESS_WORKFLOW.md`: shared `7200`-second deadline and `7500`-second - registered Stop explanation - -The next focused command returned exit code `1`: `2 passed, 2 failed`. The executor -and shared-deadline/process tests passed. The remaining hook contract test fails -because `.codex/hooks.json` still contains registered Stop timeout `1800`. - -## Blocker and unexecuted verification - -The assigned `apply_patch` edit for `.codex/hooks.json` was rejected twice by the -workspace sandbox as outside the writable project scope. The file is therefore -unchanged; no alternate write mechanism was used. This is an `environment` failure, -not a tolerance, contract, or implementation reinterpretation. - -Focused verification cannot reach exit `0` until the approved `1800 -> 7500` hook -edit is writable. Consequently the prescribed CMake configure/build/CTest and full -pytest verification were not run. No reference comparison is applicable to this -operational Step. The source currently loads an Executor wrapper deadline of `14400`, -but this session's actual registered Stop/Codex exit remains unobserved and the -registered config still declares `1800`. - -`git diff --check` completed with exit code `0`. A later read-only JSON status check -through `uv run python -B -c ...` could not initialize the user `uv` cache because -access to `C:\Users\baram\AppData\Local\uv\cache\sdists-v9\.git` was denied; it did -not modify the Step status and is additional environment evidence rather than a -replacement for the required verification. - -## Handoff - -Required environment action: make the owned repository file `.codex/hooks.json` -writable to this Step, then apply only its registered Stop timeout change to `7500` -and rerun Focused VERIFY followed by Full VERIFY. Existing `started_at` is preserved; -no `attempt_history`, timestamp, branch, commit, upstream contract, or reference -artifact was changed. - -## 재개 실행 결과 (authoritative) - -이 절은 위 attempt 1의 historical record를 대체하는 현재 Step 0 실행 결과다. -Feature/owner/revision은 `mitc4-shell-feast-eigen` / `implementation-agent` / `r2`이며, -요구 trace는 `FEM-REQ-MITC4-EIGEN-023/025`, `MFE-C27`, `IO-T11`이다. - -### RED → GREEN - -- 최초 `uv run --with pytest python -B -m pytest -v -rs - tests/test_harness_timeouts.py`는 exit `1`이었다. 등록 Stop `1800` 대 `7500`의 - intended RED와, 상속된 `FEM_HARNESS_CODEX_SANDBOX=danger-full-access` 때문에 - 발생한 test-double setup failure를 구분했다. -- workspace-write와 짧은 새 `--basetemp`를 사용한 direct venv 재현은 exit `1`, - `3 passed, 1 failed`였다. 유일한 failure는 `stop["timeout"] == 7500`에 대한 - 실제 `1800` 값으로, 승인된 intended RED다. -- 최소 GREEN은 [.codex/hooks.json](../../.codex/hooks.json)의 Stop `timeout`만 - `1800`에서 `7500`으로 변경했다. 이전 Correction의 `scripts/execute.py` classifier - 변경과 `tests/test_execute.py`는 재변경하지 않았다. -- 같은 timeout test는 exit `0`, `4 passed`였다. 새로운 short workspace - `--basetemp`로 Focused VERIFY를 재실행해 exit `0`, `136 passed`, `45.05 s`를 - 확인했다. classifier inventory는 - `test_environment_classifier_ignores_successful_source_echo` 6 cases, - `test_environment_classifier_retains_runtime_helper_failure` 16 cases, - `test_successful_source_echo_preserves_terminal_and_retry` 15 cases로 통과했다. - -### Full VERIFY와 terminal failure - -| Command | Exit | Result | -| --- | ---: | --- | -| `cmake -S . -B .harness/build -A x64` | 0 | MSVC x64 cache configure, 3.79 s | -| `cmake --build .harness/build --config Debug` | 0 | Debug build, 5.88 s | -| `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 362 tests discovered, 2.14 s | -| `ctest --test-dir .harness/build -C Debug --output-on-failure` | 8 | 361/362 passed, 1086.77 s | - -`ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior` -한 건이 `output-busy` (application exit `6`)로 실패했다. 실패 output identity는 -이전 classifier-correction workspace `TEMP/TMP` 아래였고, 실행 종료 뒤 live -`fesa`, `fesa_integration_tests`, `fesa_reference_tests` process 및 해당 output -directory는 없었다. 이 Step의 owned path 밖인 nonlinear application/integration -failure이므로 source나 test를 변경하거나 terminal failure를 즉시 재실행하지 않았다. - -순차 Full VERIFY는 CTest nonzero에서 중단했으므로 전체 pytest는 이번 실행에서 -**미실행**이다. 이 operating-prep Step에는 external reference comparison이 적용되지 -않으며, reference artifact를 읽거나 변경하지 않았다. 현재 source의 wrapper value는 -`14400`, 등록 Stop JSON은 `7500`, shared validation/default command deadline은 각각 -`7200`이다. 수동 test/build evidence와 registered Stop/Codex process exit는 별개이며, -후자는 이 보고서 시점에 미관찰이다. - -Raw logs와 copied CTest `LastTest.log`는 ignored -`.harness/build/mitc4-eigen-evidence/prep/manual-20260906143832/`에 보존했다. -현재 실행에서 변경한 tracked implementation artifact는 -`.codex/hooks.json`과 이 보고서뿐이다. Phase Step result는 Executor history/timestamp를 -보존한 채 `error`로 반환한다. - -### 등록 Stop 관찰 - -후속 registered Stop (`stop:9`)도 같은 build directory에서 -`ctest --test-dir C:\\Users\\baram\\orca\\workspaces\\FESADev\\Eigen\\.harness\\build -C Debug --output-on-failure`를 -실행했다. 종료는 exit `8`, `361/362 passed`, real `982.52 s`였고 동일한 -`ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior` -만 실패했다. 따라서 새 등록 Stop deadline이 CTest 실행을 차단하지는 않았지만, -이 Step은 정상 terminal validation을 통과하지 못했다. Codex process의 최종 exit는 이 -hook observation 자체로 주장하지 않는다. - -## R7 재개 재검증 - -이 재개는 [corrections.md](corrections.md)의 이미 완료된 classifier RED/GREEN을 읽고 -현재 source를 재검증한 것이다. GREEN source를 다시 변경하여 RED를 만들지 않았다. -모든 Python 실행은 기존 workspace venv(Python 3.11.15/pytest 9.1.1)와 새 짧은 -workspace `TEMP` 및 `--basetemp`(각각 80자 이하)를 사용했다. - -| Command | Exit | Result | -| --- | ---: | --- | -| `tests/test_execute.py -k 'environment_classifier or successful_source_echo'` | 0 | `37 passed, 36 deselected`, 8.02 s; 신규 test inventory는 6/16/15 case다. | -| Step 0 Focused VERIFY의 5개 Python target | 0 | `136 passed`; timeout, terminal, ownership, hook scope와 preset contract를 유지했다. | -| `cmake -S . -B .harness/build -A x64` | 0 | MSVC x64 configure 완료. | -| `cmake --build .harness/build --config Debug` | 1 | `ZERO_CHECK`의 `Microsoft.Build.Utilities.FileTracker` 초기화에서 `UnauthorizedAccessException` / `0x80070005 (E_ACCESSDENIED)`가 발생했다. | - -configure부터 build failure까지의 실제 wall time은 3.4 s였다. Full VERIFY의 순차 계약에 -따라 CTest discovery, CTest run, full pytest는 실행하지 않았다. 이 실패는 C++ compile 또는 -테스트 assertion 실패가 아니라 기존 correction evidence와 같은 MSVC host-access 환경 -차단이다. 이 Step에는 external reference comparison이 적용되지 않으며 reference artifact는 -읽거나 변경하지 않았다. - -이번 재검증에서 source, test, Hook configuration은 변경하지 않았다. `scripts/execute.py`의 -wrapper deadline `14400`, registered Stop `7500`, shared/default command deadline `7200`은 -그대로 확인했다. 현재 process의 registered Stop/Codex terminal exit는 미관찰이며, hook을 -수동 실행하지 않았다. 환경이 `FileTracker` 초기화에 필요한 접근을 허용한 뒤 동일한 Full -VERIFY를 configure부터 재실행해야 한다. - -## E8.2 Ninja 재개 결과 - -Feature/owner/revision은 `mitc4-shell-feast-eigen` / `implementation-agent` / `r2`이며, -이 절은 E8.1 configure 및 R9 `pending` checkpoint 뒤의 actual prep 재개 결과다. -`Launch-VsDevShell.ps1`은 현재 PowerShell execution policy로 실행할 수 없었지만, 이 tool -shell에는 이미 `VSINSTALLDIR`, `VSCMD_ARG_TGT_ARCH=x64`, `INCLUDE`, `LIB`, `cl.exe`와 -`ninja.exe`가 설정돼 있음을 확인했다. E8이 고정한 dependency 4개와 짧은 새 -`TEMP`/`TMP`(80자 이하)는 각 manual command에 process-local로 설정하고 복원했다. - -### 현재 Harness regression - -| Command | Exit | Duration | Result | -| --- | ---: | ---: | --- | -| `tests/test_execute.py -k 'environment_classifier or successful_source_echo'` | 0 | 8.850 s | `37 passed, 36 deselected`; classifier inventory `6/16/15` 확인 | -| Step 0 Focused VERIFY의 5개 Python target | 0 | 45.635 s | `136 passed`; timeout, terminal, ownership, hook scope와 preset contract 유지 | -| `cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG="` | 0 | configure/build sequence의 첫 단계 | MSVC x64 Debug Ninja cache configure 완료 | -| `cmake --build --preset windows-msvc-ninja-debug` | 1 | 68.894 s (configure 시작부터 build 종료까지) | `fesa_integration_tests` GoogleTest discovery JSON parse failure | - -보존된 correction의 `RED 21 fail / 16 pass -> GREEN 37 pass`는 새 RED로 주장하지 않았다. -이 재개에서 현재 source의 Green regression만 다시 확인했다. 새 source/test/Hook 수정은 없다. - -### Full VERIFY terminal failure - -Build는 `fesa_solver.lib`와 세 test executable을 link했지만, -`fesa_integration_tests_d537bc73_discovery.cmake`의 CMake 4.4 -`GoogleTest/ParseTestList.cmake:96`에서 empty JSON parse로 exit `1`이 됐다. 따라서 -필수 순차 흐름에 따라 CTest discovery/run과 full pytest는 **미실행**이다. external -reference comparison은 이 운영 prep Step에 적용되지 않는다. - -새 Ninja library는 `src/fesa/Debug/fesa_solver.lib`에 존재하며 68,759,340 bytes, -`mtime_utc_ns=1788680681336813300`, -SHA-256 `679db6fade801c4f0d106c3d1ef90af54fc24798195a401aff83fac92b9704d4`다. - -진단은 source 변경 없이 수행했다. 같은 `fesa_integration_tests`의 -`--gtest_list_tests --gtest_output=json:`는 exit `0`과 유효한 34-test JSON을 -생성했고, 동일 generated discovery CMake script의 별도 실행도 exit `0`으로 -`fesa_integration_tests_d537bc73_tests.cmake`(30,420 bytes)를 만들었다. 최초 required -build command가 nonzero였으므로 이 후속 관찰을 Full VERIFY pass로 대체하지 않는다. - -Raw configure/build 및 rerun-discovery logs는 ignored -`.harness/build/mitc4-eigen-evidence/prep/attempt4/manual-cmake-d2d41bcf6bb242f4b484ea02850d762e/` -및 `.harness/build/mitc4-eigen-evidence/prep/attempt4/integration-discovery-rerun.log`에 -있다. `failure_classification`은 `test`이며, Coordinator가 same-r2 test-discovery -failure의 recovery/correction authority를 판정해야 한다. - -## R11 status-only 재개 결과 - -Feature/owner/revision은 `mitc4-shell-feast-eigen` / `implementation-agent` / `r2`이다. -이 재개는 기존 Correction의 RED/GREEN을 읽고 Green source를 재변경하지 않았다. -`phases/index.json`과 이 phase의 Step 0 status-only `pending` 변경은 -Planning/Executor 소유로 보존했다. - -| Command | Exit | Duration | Result | -| --- | ---: | ---: | --- | -| `tests/test_execute.py -k 'environment_classifier or successful_source_echo'` | 0 | 10.611 s | `37 passed, 36 deselected`; source echo 6 cases, runtime helper diagnostic 16 cases, terminal/retry 15 cases | -| `tests/test_harness_timeouts.py` | 0 | 0.844 s | `4 passed`; 14400/7500/7200 deadline contract 유지 | -| Step 0 Focused VERIFY의 5개 Python target | terminal summary 미관찰 | - | 첫 실행에서 `136` items를 collection했고 failure output은 관찰되지 않았으나, tool output이 terminal summary/exit를 반환하지 않아 exit-0 evidence로 사용하지 않았다. | -| `cmake -S . -B .harness/build -A x64` | 0 | 2.238 s | MSVC x64 configure 완료 | -| `cmake --build .harness/build --config Debug` | 1 | 0.445 s | `ZERO_CHECK`에서 `Microsoft.Build.Utilities.FileTracker` 초기화가 `UnauthorizedAccessException` / `0x80070005 (E_ACCESSDENIED)`로 실패 | - -Full VERIFY는 build nonzero에서 중단했다. 따라서 CTest discovery/run과 full pytest는 -이번 재개에서 **미실행**이다. 이 operating-prep Step에는 external reference comparison이 -적용되지 않으며 reference artifact를 읽거나 변경하지 않았다. 등록 Stop/Codex terminal -exit도 이 manual command evidence에서 관찰되지 않았다. - -이 실패는 C++ source, Hook default, Python assertion 또는 upstream contract가 아니라 MSVC -`FileTracker` host-access 환경에 해당한다. `scripts/execute.py`의 wrapper deadline `14400`, -등록 Stop `7500`, shared/default command deadline `7200`은 그대로 확인했다. Full VERIFY를 -`cmake -S`부터 재개할 수 있도록 FileTracker 초기화 권한이 있는 MSVC 환경이 필요하다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-recovery.md b/docs/mitc4-shell-feast-eigen/implementation-recovery.md deleted file mode 100644 index 107d794..0000000 --- a/docs/mitc4-shell-feast-eigen/implementation-recovery.md +++ /dev/null @@ -1,1073 +0,0 @@ -# 차단된 prep의 보존과 조건부 재개 계획 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `implementation-planning-agent` -- Input contract revision: `r2` -- 기본 보고서: [implementation-plan](implementation-plan.md) -- 범위: 문서와 정적 검토만 완료한다. 아래 Git mutation/status edit/재실행은 아직 실행하지 않는다. - -## R1. 실제 상태와 변경 없는 경계 - -필수 입력은 Feature 폴더와 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), -[ADR](ADR.md), [현재 Coordinator 감사](coordination.md#execution-prep-attempt-1-실제-결과), -기존 [환경](implementation-environment.md), [interfaces](implementation-interfaces.md), -[verification](implementation-verification.md) 및 그 upstream r2 links다. -[AGENTS](../../AGENTS.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), -[문서 관리](../FEATURE_DOCUMENTATION.md), [harness](../../.agents/skills/harness/SKILL.md), -[fem-implementation-tdd](../../.codex/skills/fem-implementation-tdd/SKILL.md)를 적용한다. - -Prep attempt1은 종료되었고 Step0/top은 blocked, history1이다. -[원 보고서](implementation-prep-evidence.md)의 미검증 test 수정/실패 횟수 서술은 후속 -Implementation owner가 실제 raw 순서에 맞춰 갱신한다. Planning은 본문을 수정하지 않는다. -[보존된 raw](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/step0-output.json)와 -[observation](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/observation.json)을 사용한다. -Raw SHA-256은 `0d5c0fe0aeba5604c5289764e7aad1834902548ca02158f8feac03484b195941`이다. -마지막 focused run은2pass/2fail, 이후 test-only 수정은 미실행이다. Registered CTest의 -362pass 기록은 manual full VERIFY/별도 process exit를 대신하지 않는다. - -[현재 Executor](../../scripts/execute.py)의 constructor는 경로/schema를 읽고 field를 설정한다. -`_stop_step`은 blocked/history/top을 저장한 뒤 종료하며 커밋하지 않는다. -`_commit_paths`는 자체 `_assert_step_scope`, trusted path 검증, exact staged 경로 검사와 -commit 직전 재검사를 수행한다. 내부 index reset은 검사된 dirty 경로의 staging만 정리하며 -worktree bytes는 보존한다. 아래 명령은 이 method를 변경 없이 호출한다. -`run/_commit_step/_finalize/_stop_step`, status reset, Hook writes 또는 guard overrides는 없다. -일반 실행용 clean preflight는 dirty WIP 보존 전에 성립하지 않으므로 이 전용 checkpoint는 -constructor/identity/scope/commit 경로를 사용하고 마지막 clean 상태에서 정상 preflight를 확인한다. -이는 새로운 recovery CLI가 아니다. - -## R2. Root checkpoint 이후의 정확한 WIP 보존 명령 - -1. 모든 실행이 종료된 상태에서 Coordinator가 이 계획을 감사한다. Root는 management4문서와 - 이 변경3문서, classifier delta를 반영한 prep step0.md의 정확한8경로만 먼저 checkpoint한다. - Partial runtime/tests/report와 phase index/top의 - controls는 stage하거나 커밋하지 않는다. Root checkpoint 후 staging은 비어 있어야 한다. -2. Branch `feat-mitc4-shell-feast-eigen-execution-prep`, linked root, origin - `d533b615410751fe023dc73ac2be994f05d37d30`의 descendant, origin 이후 commit path가 - 해당8계획/관리 파일 이내임을 아래 명령이 검증한다. 현재 partial implementation8경로와 control2경로가 - 정확히 남아야 한다. `.codex/hooks.json`은 이 WIP commit의 변경 대상이 아니다. -3. Coordinator가 실행을 할당하면 **실제 Executor method**가 두 개의 local commit을 만든다. - Root/Coordinator는 실행 동안 추가 편집·커밋을 멈춘다. 성공 명칭이나 completed를 쓰지 않는다. - 첫 commit 후 두 번째가 실패할 수 있으며 두 commit은 하나의 transaction이 아니다. - 실패 시 현재 HEAD/index/worktree/log를 그대로 감사하고 자동 재시도나 rollback을 하지 않는다. - -Workspace root의 별도 managed PowerShell process에서 아래 전체 block을 실행하도록 계획한다. -Python native exit를 즉시 저장하여 동일 shell exit로 전파한다. CommandNotFound는 terminating -error이며 나중 명령의 exit0으로 덮이지 않는다. 이 block은 **현재 planning turn에서 미실행**이다. - -```powershell -$ErrorActionPreference = 'Stop' -Get-Command python -ErrorAction Stop | Out-Null -@' -import ast, hashlib, json, os -from pathlib import Path -from scripts import execute -phase = "mitc4-shell-feast-eigen-execution-prep" -origin = "d533b615410751fe023dc73ac2be994f05d37d30" -ex = execute.StepExecutor(phase) -root = Path(ex._root) -assert Path.cwd().resolve() == root -assert Path(ex._run_git_checked("rev-parse", "--show-toplevel").stdout.strip()).resolve() == root -assert ex._is_isolated_worktree() -assert ex._codex_sandbox_mode() == "workspace-write" -assert ex._implementation_agent_settings() == ("gpt-5.6-terra", "xhigh") -branch, before_head = ex._git_execution_identity() -assert branch == "refs/heads/feat-" + phase -ex._run_git_checked("merge-base", "--is-ancestor", origin, "HEAD") -doc_names = ("FEATURED_AGENTS.md", "PRD.md", "ADR.md", "coordination.md", - "implementation-plan.md", "implementation-environment.md", "implementation-recovery.md") -doc_paths = {"docs/mitc4-shell-feast-eigen/" + n for n in doc_names} -doc_paths.add("phases/" + phase + "/step0.md") -committed = ex._run_git_checked("diff", "--name-only", "--no-renames", origin, "HEAD").stdout.splitlines() -assert set(committed) <= doc_paths -assert not ex._run_git_checked("diff", "--cached", "--name-only").stdout.strip() -current_source = (root / "scripts/execute.py").read_text(encoding="utf-8") -original_source = ex._run_git_checked("show", origin + ":scripts/execute.py").stdout -assert ast.dump(ast.parse(current_source.replace("CODEX_TIMEOUT_SECONDS = 14400", - "CODEX_TIMEOUT_SECONDS = 1800"))) == ast.dump(ast.parse(original_source)) -idx = ex._read_phase_index() -top = ex._read_top_index() -assert len(idx["steps"]) == 1 and idx["steps"][0]["status"] == "blocked" -assert len(idx["steps"][0]["attempt_history"]) == 1 -assert next(p for p in top["phases"] if p["dir"] == phase)["status"] == "blocked" -owned = ex._step_owned_paths(idx["steps"][0]) -expected_owned = ("scripts/execute.py", ".codex/hooks.json", - "scripts/hooks/stop_validation.py", "scripts/msvc_harness/models.py", - "scripts/msvc_harness/process.py", "tests/test_execute.py", - "tests/test_harness_timeouts.py", "docs/HARNESS_WORKFLOW.md", - "docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md") -assert owned == expected_owned -control = ["phases/index.json", "phases/" + phase + "/index.json"] -code = [p for p in owned if p != ".codex/hooks.json"] -assert set(ex._assert_step_scope(owned)) == set(code + control) -raw_path = "phases/" + phase + "/step0-output.json" -raw = (root / raw_path).read_bytes() -assert hashlib.sha256(raw).hexdigest() == "0d5c0fe0aeba5604c5289764e7aad1834902548ca02158f8feac03484b195941" -frozen_paths = list(owned) + control + ["phases/" + phase + "/step0.md", raw_path] -frozen = {p: (root / p).read_bytes() for p in frozen_paths} -def verify_frozen(): - assert all((root / p).read_bytes() == data for p, data in frozen.items()) - assert ex._read_phase_index() == idx and ex._read_top_index() == top - assert ex._git_execution_identity()[0] == branch -verify_frozen() -previous = before_head -for paths, message in ( - (code, "chore(mitc4-shell-feast-eigen-execution-prep): WIP blocked partial deadline preparation"), - (control, "chore(mitc4-shell-feast-eigen-execution-prep): preserve blocked attempt 1 metadata"), -): - verify_frozen() - assert ex._commit_paths(paths, message, owned_paths=owned) - current = ex._git_execution_identity()[1] - assert current != previous - actual = ex._run_git_checked("diff-tree", "--no-commit-id", "--name-only", - "--no-renames", "-r", current).stdout.splitlines() - assert set(actual) == set(paths), (current, actual) - verify_frozen() - print(json.dumps({"commit": current, "paths": sorted(actual), "status": "blocked"})) - previous = current -assert not ex._worktree_paths() -ex._preflight_repository() -verify_frozen() -print(json.dumps({"clean": True, "branch": branch, "head": previous, - "raw_sha256": hashlib.sha256(raw).hexdigest(), - "phase_status": "blocked", "history_count": 1})) -'@ | python -B - -$mfeCheckpointExit = $LASTEXITCODE -if ($mfeCheckpointExit -ne 0) { exit $mfeCheckpointExit } -exit $mfeCheckpointExit -``` - -상태/history/timestamps/다른 step/top/step markdown/raw/owned file bytes는 전후 동일해야 한다. -출력 commit SHA와 actual path set, clean/branch/root 및 실제 process exit를 Coordinator가 -관리문서에 감사한다. 이 두 commit은 blocked WIP 보존이며 구현/검증 통과가 아니다. -Raw archive는 ignored 상태로 유지하고 Git에 추가하지 않는다. - -## R3. 승인 후에만 가능한 status-only checkpoint - -현재 exact DFA run의 명시적 사용자 승인은 없다. WIP checkpoint에는 별도 사용자 질문이 -필요하지 않지만 DFA는 [harness elevated rule](../../.agents/skills/harness/SKILL.md#elevated-and-remote-execution)에 따라 -동일 native 명령 실패 evidence, clean linked worktree, **해당 실행 직전 명시적 사용자 승인**, -approval flag가 모두 필요하다. 과거 일반 구현 승인이나 이 문서 작성은 그 승인이 아니다. - -그 승인이 실제로 도착한 경우에만 다음 순서를 같은 bounded 복구 준비로 진행한다. - -1. Coordinator가 승인된 exact command와 recovery dispatch를 management에 기록하고 Root가 - 그 문서만 checkpoint하여 clean을 유지한다. 원시 attempt1 archive는 그대로 보존한다. -2. Coordinator의 별도 명시 할당을 받은 Planning만 - `phases/mitc4-shell-feast-eigen-execution-prep/index.json`의 **현재 Step0 status 한 값** - `blocked -> pending`을 바꾼다. `blocked_reason/blocked_at/started_at/created_at/ - attempt_history`, owned paths, 다른 Step/top은 그대로 둔다. 현재 dispatch는 이 편집을 허용하지 않는다. -3. Coordinator가 할당한 실제 Executor method는 아래 control-only checkpoint를 수행한다. - Staged HEAD의 blocked JSON과 working pending JSON의 차이가 status 한 값뿐인지 검증한다. - Top은 계속 blocked다. 기존 `_check_blockers`는 phase의 첫 미완료 Step을 판별하므로 - pending을 실행할 수 있으며 top을 미리 성공/초기화할 필요가 없다. -4. Clean checkpoint 확인 뒤 별도 변경 없이 R4의 승인된 invocation을 시작한다. - 필요한 준비 사이에 실행 범위나 환경이 달라지면 재개하지 않고 Coordinator에 반환한다. - -```powershell -$ErrorActionPreference = 'Stop' -Get-Command python -ErrorAction Stop | Out-Null -@' -import json -from pathlib import Path -from scripts import execute -phase = "mitc4-shell-feast-eigen-execution-prep" -ex = execute.StepExecutor(phase) -root = Path(ex._root) -assert Path.cwd().resolve() == root -assert Path(ex._run_git_checked("rev-parse", "--show-toplevel").stdout.strip()).resolve() == root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode() == "workspace-write" -branch, before_head = ex._git_execution_identity() -assert branch == "refs/heads/feat-" + phase -path = "phases/" + phase + "/index.json" -before = json.loads(ex._run_git_checked("show", "HEAD:" + path).stdout) -after = ex._read_phase_index() -expected = json.loads(json.dumps(before)) -assert len(expected["steps"]) == 1 and expected["steps"][0]["status"] == "blocked" -expected["steps"][0]["status"] = "pending" -assert after == expected -assert set(ex._assert_step_scope(())) == {path} -assert not ex._run_git_checked("diff", "--cached", "--name-only").stdout.strip() -top_before = ex._read_control_bytes(ex._top_index_file) -raw_path = root / "phases" / phase / "step0-output.json" -raw_before = raw_path.read_bytes() -phase_before = ex._read_control_bytes(ex._index_file) -assert ex._commit_paths([path], - "chore(mitc4-shell-feast-eigen-execution-prep): queue approved recovery preserving attempt history") -current = ex._git_execution_identity() -assert current[0] == branch and current[1] != before_head -assert ex._run_git_checked("diff-tree", "--no-commit-id", "--name-only", "-r", - current[1]).stdout.splitlines() == [path] -assert ex._read_control_bytes(ex._index_file) == phase_before -assert ex._read_control_bytes(ex._top_index_file) == top_before -assert raw_path.read_bytes() == raw_before -assert ex._read_phase_index() == after and not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"commit": current[1], "clean": True, - "step_status": "pending", "history_preserved": True})) -'@ | python -B - -$mfeStatusExit = $LASTEXITCODE -if ($mfeStatusExit -ne 0) { exit $mfeStatusExit } -exit $mfeStatusExit -``` - -이 단계도 `_commit_step`이나 완료 처리를 부르지 않는다. 이후 실행에서 추가 attempt 기록과 -terminal outcome/timestamp 정리는 Executor 소유다. Planning/Root가 과거 failure를 지우지 않는다. - -## R4. 조건부 exact DFA invocation과 후속 검증 - -Prep에 실제 classifier 결함의 TDD delta가 추가되었다. 상세 RED/GREEN/신규 test3개 및 전체 -VERIFY는 [prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md)에 있다. -[순수함수 재현](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json)은 -성공한 source read stdout의 marker7회가 오판 원인이었음을 보여 준다. 실제 protected Hook -쓰기 거부/명시 blocked는 별개의 실제 failure로 보존한다. Root/Coordinator가 확정한 순서는 -이번 계획 종료 → 정확 문서 checkpoint → R2의 unchanged Executor WIP 두 commit → 별도 -Correction Agent dispatch다. Correction 소유는 scripts/execute.py, tests/test_execute.py와 -`docs/mitc4-shell-feast-eigen/corrections.md`이며 Hook/index/status/Git은 변경하지 않는다. -Correction은 Step0에 정의한 최소 RED/GREEN·focused/full acceptance를 수행한다. -Checkpoint/recovery bootstrap이 classifier를 monkeypatch하거나 진단을 지우지 않는다. - -이미 시작된 Executor는 source 수정 뒤에도 예전 classifier를 유지하므로 Correction은 다음 -실제 prep invocation보다 먼저 완료되어야 한다. 실제 Correction 결과가 반환된 뒤 Coordinator는 -Planning을 별도 재개하여 source/report의 정확 checkpoint 계획을 감사한다. 현재 문서는 미래 -Correction 성공/hash/commit이나 그 checkpoint를 미리 승인하지 않는다. 해당 검증·checkpoint와 -새 process가 수정 classifier를 읽는 activation 확인이 끝나기 전 R3/R4 재개를 실행하지 않는다. -현재 timeout-only AST guard는 최초 WIP 보존에 그대로 유지한다. 수정된 classifier를 현재 -Executor에 reload/override하거나 old classifier의 terminal을 성공으로 바꾸지 않는다. - -R3과 사용자 승인까지 실제 완료된 경우에만, workspace root의 새 managed PowerShell -process에서 아래 실행을 허용한다. E3의 실제 `main()`과 단일 유한14400 timeout assignment를 -유지하며 flag와 process-local sandbox 값만 승인 범위에 맞춘다. 이전 환경 값은 `finally`에서 -복원하고 native exit를 즉시 저장한다. transport/ownership/Hook/verification guard는 변경하지 않는다. - -```powershell -$ErrorActionPreference = 'Stop' -Get-Command python -ErrorAction Stop | Out-Null -$mfePriorSandbox = [Environment]::GetEnvironmentVariable('FEM_HARNESS_CODEX_SANDBOX', 'Process') -if ($null -ne $mfePriorSandbox -and $mfePriorSandbox -ne 'workspace-write') { - throw 'Unexpected pre-existing sandbox environment' -} -$mfeNativeExit = $null -try { - $env:FEM_HARNESS_CODEX_SANDBOX = 'danger-full-access' - python -B -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" mitc4-shell-feast-eigen-execution-prep --approve-danger-full-access - $mfeNativeExit = $LASTEXITCODE - if ($null -eq $mfeNativeExit) { throw 'Native Executor exit was not captured' } -} -finally { - [Environment]::SetEnvironmentVariable('FEM_HARNESS_CODEX_SANDBOX', $mfePriorSandbox, 'Process') -} -exit $mfeNativeExit -``` - -Implementation은 선행 Correction의 실제 RED/GREEN evidence를 읽고 같은 classifier regression, -남은 Hook 변경, 미검증 test 수정의 focused 재검증, 전체 pytest와 -MSVC/x64/Debug CMake/CTest, actual registered Stop을 모두 수행한다. 기존 보고서의 실제 -2개 실패와 미검증 수정도 owner가 바로잡는다. 실패 이력을 새 RED 성공이나 correction으로 -바꾸지 않는다. Native Exit/Stop 사후 감사까지 prep gate가 완료되기 전 main activation은 금지다. -Push/tag/publish/release 또는 다른 sandbox/guard 변경 권한은 없다. - -## R5. 계획 정적 검증 - -Command AST/PowerShell syntax와 현 상태의 read-only 검사를 수행했다. Python `ast.parse`로 -WIP/status checkpoint code2개를 검증했고 PowerShell `Parser::ParseInput`으로 실행 block3개의 -syntax errors0을 확인했다(각 exit0). 현재 execute.py는 origin 대비 timeout 상수 외 AST가 같아 -checkpoint에 사용되는 guard가 변경되지 않았음을 확인했다. Phase/top/raw는 보존 archive와 -동일하며 상태 blocked/history1이다. 문서 EOF/trailing whitespace·local links와 -`git diff --check`도 확인했다. Commit/status edit/DFA/CMake/CTest/pytest는 미실행이다. -최종 scope/link count·hash는 handoff에 기록한다. - -## R6. 실제 Correction source2의 보존과 남은 실행 조건 - -R2는 실제 WIP commit `6e00dba1`과 blocked metadata commit -`5dfbea7e543b64fdefcea292de43237adb790a72`을 만든 **과거 명령**이다. -이후 classifier가 바뀌었으므로 그 timeout-only AST guard를 다시 쓰거나 완화하지 않는다. -[Correction 보고서](corrections.md)와 [검증 summary](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json)는 -실제 RED21fail/16pass 뒤 GREEN37pass, 전체 pytest152pass/1fail을 기록한다. -Manual configure0/build1의 FileTracker TEMP 접근 거부 뒤 manual CTest는 미실행이다. -[실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-result.json)는 -native/wrapper0,1914.797초이며, [등록 process exits](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-registered-exits.json)의 -Stop2개/CTest exit0 및362pass는 별도 자동 검증이다. 이를 manual full 성공으로 합치지 않는다. - -Classifier key의 Correction1회는 사용됐고 추가 source correction은 허용하지 않는다. -재개 Implementation은 확보된 RED/GREEN을 읽고 현재 source의 focused/full을 재검증한다. -GREEN source를 다시 망가뜨려 RED를 만들지 않는다. 과거 timeout RED와 마지막 enum fix의 -당시 미검증 기록은 보존하며, enum fix가 이번 focused/full에서 통과했다는 새 evidence를 구분한다. -Protected Hook1800!=7500과 manual build 환경 문제는 아직 해소되지 않았다. - -Root는 frozen management `FEATURED_AGENTS.md/ADR.md/coordination.md`, Planning의 -`implementation-plan.md/implementation-environment.md/implementation-recovery.md`, -독립 Correction의 `corrections.md` **정확7문서만** 먼저 checkpoint한다. -Correction 보고서는 prep owned_paths 밖이므로 이 선행 문서 commit으로 clean하게 만든다. -Root ack 뒤에만 Coordinator가 아래 실제 unchanged Executor method 호출을 할당한다. -Dirty 경로는 source2만 허용하며 phase/top/raw/Hook/status/history와 report는 불변이다. -아래 AST normalization은 검사에만 사용하고 실행 module/method를 교체하지 않는다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfeCheckpointPython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfeCheckpointPython -PathType Leaf)) { throw 'Named Python missing' } -@' -import ast, hashlib, json -from pathlib import Path -from scripts import execute -phase = "mitc4-shell-feast-eigen-execution-prep" -origin = "5dfbea7e543b64fdefcea292de43237adb790a72" -ex = execute.StepExecutor(phase) -root = Path(ex._root) -assert Path.cwd().resolve() == root -assert Path(ex._run_git_checked("rev-parse", "--show-toplevel").stdout.strip()).resolve() == root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode() == "workspace-write" -assert ex._implementation_agent_settings() == ("gpt-5.6-terra", "xhigh") -branch, before_head = ex._git_execution_identity() -assert branch == "refs/heads/feat-" + phase -ex._run_git_checked("merge-base", "--is-ancestor", origin, "HEAD") -docs = {"docs/mitc4-shell-feast-eigen/" + p for p in ( - "FEATURED_AGENTS.md", "ADR.md", "coordination.md", "implementation-plan.md", - "implementation-environment.md", "implementation-recovery.md", "corrections.md")} -assert set(ex._run_git_checked("diff", "--name-only", "--no-renames", - origin, "HEAD").stdout.splitlines()) <= docs -assert not ex._run_git_checked("diff", "--cached", "--name-only").stdout.strip() -sources = {"scripts/execute.py": "64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py": "0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"} -fixed = {".codex/hooks.json": "0ab23dad4643f45238f4a60402083e32d8801f5c41fd6ba12b68ef6a9fc5fc28", - "phases/index.json": "2e4dfef44cd76b7ae447d0e2186a8a949ec29627df9c573646162b92348f1edb", - "phases/" + phase + "/index.json": "e23269a5518a8dbffbbf2e4706431d7f8af67e43706dcc9086aa6c8991d24262", - "phases/" + phase + "/step0-output.json": "0d5c0fe0aeba5604c5289764e7aad1834902548ca02158f8feac03484b195941", - "docs/mitc4-shell-feast-eigen/corrections.md": "d4ea3fb18accc2b2316eb439f56f5106d8ae6640fe79452cef6cb341b1933ee4"} -def check_hashes(): - for path, expected in {**sources, **fixed}.items(): - assert hashlib.sha256((root / path).read_bytes()).hexdigest() == expected, path -check_hashes() -old_tree = ast.parse(ex._run_git_checked("show", origin + ":scripts/execute.py").stdout) -new_tree = ast.parse((root / "scripts/execute.py").read_text(encoding="utf-8")) -old_cls = next(n for n in old_tree.body if isinstance(n, ast.ClassDef) and n.name == "StepExecutor") -new_cls = next(n for n in new_tree.body if isinstance(n, ast.ClassDef) and n.name == "StepExecutor") -old_methods = {n.name: n for n in old_cls.body if isinstance(n, ast.FunctionDef)} -new_methods = {n.name: n for n in new_cls.body if isinstance(n, ast.FunctionDef)} -assert set(new_methods) - set(old_methods) == {"_stdout_has_helper_failure"} -assert not set(old_methods) - set(new_methods) -assert {n for n in old_methods if ast.dump(old_methods[n]) != ast.dump(new_methods[n])} == {"_codex_environment_failure"} -new_cls.body = [old_methods["_codex_environment_failure"] if isinstance(n, ast.FunctionDef) - and n.name == "_codex_environment_failure" else n for n in new_cls.body - if not (isinstance(n, ast.FunctionDef) and n.name == "_stdout_has_helper_failure")] -assert ast.dump(new_tree) == ast.dump(old_tree) -idx = ex._read_phase_index() -top = ex._read_top_index() -assert len(idx["steps"]) == 1 and idx["steps"][0]["status"] == "blocked" -assert len(idx["steps"][0]["attempt_history"]) == 1 -assert next(p for p in top["phases"] if p["dir"] == phase)["status"] == "blocked" -owned = ex._step_owned_paths(idx["steps"][0]) -assert set(sources) <= set(owned) -assert set(ex._assert_step_scope(owned)) == set(sources) -snapshot = {p: (root / p).read_bytes() for p in - list(owned) + list(fixed) + ["phases/" + phase + "/step0.md", - "phases/mitc4-shell-feast-eigen/index.json"]} -assert ex._commit_paths(list(sources), - "chore(mitc4-shell-feast-eigen-execution-prep): WIP classifier correction with full verification blocked", - owned_paths=owned) -after_branch, after_head = ex._git_execution_identity() -assert after_branch == branch and after_head != before_head -actual = ex._run_git_checked("diff-tree", "--no-commit-id", "--name-only", - "--no-renames", "-r", after_head).stdout.splitlines() -assert set(actual) == set(sources) -assert all((root / p).read_bytes() == value for p, value in snapshot.items()) -check_hashes() -assert ex._read_phase_index() == idx and ex._read_top_index() == top -assert not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"commit": after_head, "paths": sorted(actual), "clean": True, - "status": "blocked", "history_count": 1, "branch": branch})) -'@ | & $mfeCheckpointPython -B -X utf8 - -$mfeCorrectionCommitExit = $LASTEXITCODE -if ($null -eq $mfeCorrectionCommitExit) { throw 'Native exit unavailable' } -exit $mfeCorrectionCommitExit -``` - -이 명령은 아직 미실행이다. Native exit와 commit path/hash/clean 결과를 실제 관찰한 뒤 -Coordinator가 감사한다. 실패하면 현재 bytes/index/HEAD를 보존하고 자동 재시도하지 않는다. -새 source commit은 WIP와 전체 검증의 제한을 명시하며 `_commit_step`/completed를 호출하지 않는다. - -성공 뒤에도 R3의 별도 status-only 할당과 해당 실행 직전 exact DFA 사용자 승인이 필요하다. -DFA는 아직 승인되지 않았다. 후속 native process에는 [E6의 실제 환경 recipe](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)를 적용하고, -그 환경에서 R4와 동일한 phase/finite14400/approval flag를 사용한다. 새 process는 corrected -classifier를 로드한다. Protected Hook 권한과 TEMP/TMP 운영 설정의 근거를 혼동하지 않는다. -Prep full gate·등록 Stop 실제 exit·Coordinator 사후 감사 전 main activation은 금지다. - -정적 검증은 command AST/PowerShell syntax, source2/report hash, 변경 method2와 나머지 -Executor AST 불변, local links/EOF/whitespace와 blocked archive 동일성을 대상으로 했다. -정확 결과와 갱신3문서 hash는 handoff에 기록한다. Source/tests/Hook/phase/status/Git과 -Correction 본문은 이번 Planning 작업에서 수정하지 않았다. - -## R7. Attempt2 실패 보존과 정상 workspace-write 재개 - -R2/R6/R3와 E6은 과거 실행·승인 이력으로 보존한다. 이번 actual attempt2는 종료됐으며 -[terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/terminal-archive.json)에 -native PowerShell1/Codex0, Step error/history2와 이전 history1이 남아 있다. -Hook RED3pass/1fail→GREEN4pass, focused136pass(기존 classifier37 포함), -configure/build/discovery0 뒤 manual CTest와 registered CTest는 각각 exit8, -361/362pass였다. Stop wrapper/Python0은 검증 성공이 아니다. Full pytest는 미실행이다. - -[동일 binary의 경로 길이 비교](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/path-length-probe-e15c1747/observation.json)는 -TEMP152/result251/lock261에서 해당 test exit1, TEMP70/관찰 lock179에서 exit0을 기록한다. -Binary SHA-256 `d52ed2538be8f66e076f25ae44f073aea8486c5f543fbc7c179b7a5610dc3209`는 같고 -source/shared CTest log/reference 변경은 없다. 이 결과는 정상 환경 설정의 근거이며 -solver defect 또는 직접 관찰하지 않은 GetLastError를 주장하지 않는다. - -### 실패 상태의 WIP checkpoint - -Root는 frozen management4문서와 Planning3문서의 실제 변경 경로만 먼저 checkpoint한다. -Hook/report/phase controls는 그 문서 commit에 섞지 않는다. Root ack 뒤 Coordinator가 아래 -unchanged Executor 호출을 할당한다. Origin은 `d64cd1403ac41fb1397dfb088361ce18ad1d59bd`, -dirty는 Hook+report2 및 controls2뿐이어야 한다. 두 commit은 WIP/실패 기록이며 성공 전환이 아니다. -모든 bytes/history/raw/error는 유지한다. 중간 실패 시 원래 HEAD/index/worktree를 보존하며 -자동 재시도나 rollback을 하지 않는다. `_commit_step`/runtime override는 사용하지 않는다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import ast,hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -origin="d64cd1403ac41fb1397dfb088361ce18ad1d59bd" -ex=execute.StepExecutor(phase); root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -assert ex._implementation_agent_settings()==("gpt-5.6-terra","xhigh") -branch,head=ex._git_execution_identity() -assert branch=="refs/heads/feat-"+phase -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md", - "coordination.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -expected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md":"90d104423af2971837a38eb632c8a4aa54b8acf6f6cd96b5a193dbd4ba4e083f", - "phases/index.json":"c2d98e5bcb96bb781f687e696083076a3f5bea2d095f4c7264bb4a6415b6cc38", - "phases/"+phase+"/index.json":"7990530b4d259850f614ae68036c551b3c11539c90673512c6515d3f87ad1ebe", - "phases/"+phase+"/step0-output.json":"8852e0ddae9ef94d885e8b4ae4b8a3b2e3a9d9161a3801bc7e56ea157e9411f4", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"} -for p,h in expected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -assert ast.dump(ast.parse((root/"scripts/execute.py").read_text(encoding="utf-8")))==ast.dump(ast.parse(ex._run_git_checked("show",origin+":scripts/execute.py").stdout)) -old_hook=json.loads(ex._run_git_checked("show",origin+":.codex/hooks.json").stdout) -old_hook["hooks"]["Stop"][0]["hooks"][0]["timeout"]=7500 -assert json.loads((root/".codex/hooks.json").read_bytes())==old_hook -idx=ex._read_phase_index();top=ex._read_top_index() -assert idx["steps"][0]["status"]=="error" and len(idx["steps"][0]["attempt_history"])==2 -assert next(p for p in top["phases"] if p["dir"]==phase)["status"]=="error" -owned=ex._step_owned_paths(idx["steps"][0]) -code=[".codex/hooks.json","docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md"] -control=["phases/index.json","phases/"+phase+"/index.json"] -assert set(ex._assert_step_scope(owned))==set(code+control) -frozen={p:(root/p).read_bytes() for p in list(owned)+list(expected)+["phases/"+phase+"/step0.md","phases/mitc4-shell-feast-eigen/index.json"]} -for paths,message in ( - (code,"chore(mitc4-shell-feast-eigen-execution-prep): WIP Hook update with verification failure"), - (control,"chore(mitc4-shell-feast-eigen-execution-prep): preserve attempt 2 error metadata")): - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._git_execution_identity()==(branch,head) - assert ex._commit_paths(paths,message,owned_paths=owned) - new_branch,new_head=ex._git_execution_identity() - assert new_branch==branch and new_head!=head - actual=ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",new_head).stdout.splitlines() - assert set(actual)==set(paths) - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._read_phase_index()==idx and ex._read_top_index()==top - print(json.dumps({"commit":new_head,"paths":actual,"status":"error","history_count":2})) - head=new_head -assert not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"head":head,"branch":branch,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeWipExit = $LASTEXITCODE -if ($null -eq $mfeWipExit) { throw 'Native exit unavailable' } -exit $mfeWipExit -``` - -### 별도 할당 뒤 status-only checkpoint - -위 terminal WIP 보존이 실제 완료되기 전에는 status를 바꾸지 않는다. -그 후 Coordinator의 별도 할당을 받은 Planning만 prep index의 현재 Step0.status를 -`error -> pending` 한 값으로 바꾼다. error_message/failed_at/started_at/created_at/ -attempt_history2/owned_paths와 다른 fields/top/raw는 그대로 둔다. 현재 Planning dispatch는 -이 status edit를 허용하지 않는다. 반환 감사 뒤 Coordinator가 다음 Executor control -checkpoint를 할당하고 clean을 확인한다. 일반 환경 복구이므로 새 사용자 승인은 필요하지 않다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -ex=execute.StepExecutor(phase);root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -branch,head=ex._git_execution_identity();assert branch=="refs/heads/feat-"+phase -path="phases/"+phase+"/index.json" -before=json.loads(ex._run_git_checked("show","HEAD:"+path).stdout) -assert before["steps"][0]["status"]=="error" and len(before["steps"][0]["attempt_history"])==2 -expected=json.loads(json.dumps(before));expected["steps"][0]["status"]="pending" -assert ex._read_phase_index()==expected -assert set(ex._assert_step_scope(()))=={path} -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -frozen={p:(root/p).read_bytes() for p in (path,"phases/index.json","phases/"+phase+"/step0-output.json")} -assert ex._commit_paths([path],"chore(mitc4-shell-feast-eigen-execution-prep): queue short-temp environment recovery") -new_branch,new_head=ex._git_execution_identity() -assert new_branch==branch and new_head!=head -assert ex._run_git_checked("diff-tree","--no-commit-id","--name-only","-r",new_head).stdout.splitlines()==[path] -assert all((root/p).read_bytes()==v for p,v in frozen.items()) -assert ex._read_phase_index()==expected and not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"commit":new_head,"status":"pending","history_count":2,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeStatusExit = $LASTEXITCODE -if ($null -eq $mfeStatusExit) { throw 'Native exit unavailable' } -exit $mfeStatusExit -``` - -이어 [E7의 짧은 TEMP와 정상 sandbox](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개)로 -prep를 재개한다. 이전 E6의 one-time DFA 승인은 사용 완료됐고 Hook7500은 안전하게 -보존되므로 이번에는 DFA flag나 danger-full-access 환경을 사용하지 않는다. -Main도 full prep gate/Coordinator 사후 감사 뒤 같은 짧은 환경과 workspace-write로 실행한다. -Source classifier의 harness r2 Correction allowance는 이미 사용됐으며 두 번째 source -Correction은 허용하지 않는다. 같은 테스트·전체 VERIFY·Hook·retry/ownership guard를 유지한다. - -재개 Implementation은 기존 RED/GREEN을 읽고 focused/full을 실제 재검증한다. Full CTest는 -기존 정적 reference를 읽고 비교하므로 보고서의 'reference를 읽거나 비교하지 않았다' 문장은 -owner가 바로잡아야 한다. 원본 reference의 직접 수정 없음, 새 eigen reference 비교 없음과 -기존 static regression 비교 수행을 구분하고 당시 실패·미실행 기록도 보존한다. -Planning은 implementation-prep-evidence.md를 수정하지 않는다. - -이 R7의 commit/status edit/재실행은 아직 미실행이다. 정적 검사 결과와 갱신3문서 hash는 -handoff에 기록하며 실제 실행 exit·commit path/bytes·clean 확인은 Coordinator가 감사한다. - -## R8. Attempt3의 blocked 기록 보존 - -현재 경계는 [attempt3 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/terminal-archive.json)와 -[Root 환경 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-manual-build-environment-observation.json)이다. -E7 native는 짧은 TEMP/TMP를 같은 build shell에 실제 지정했지만 FileTracker 접근 거부로 -manual build가 실패했다. Classifier37/focused136은 통과했으며 manual CTest/full pytest는 -미실행이다. Registered Stop의 build/CTest 성공은 이 manual 실패를 대체하지 않는다. -현재 Step0은 blocked/history3이며 이전 두 history와 원시 기록을 보존한다. - -이번 할당은 보존 명령의 문서화와 정적 확인뿐이다. Root가 동결된 관리2문서 -`FEATURED_AGENTS.md`, `coordination.md`와 Planning3문서를 exact-path checkpoint한 뒤, -Coordinator가 아래 unchanged Executor method invocation을 실행한다. 첫 commit은 -Implementation 보고서1개의 WIP, 둘째는 phase/top controls2개의 blocked metadata이다. -완료 판정·`_commit_step`·status reset·Hook/source 변경·guard override는 없다. -현재 origin 이후 수정 가능한 선행 commit 경로도 이5문서로 제한한다. Source2와 Hook은 -현재 hash/내용 그대로이며, staging은 비어 있어야 한다. Linked root/branch, 실제 -`_assert_step_scope`, staged-path guard와 실행 전후 bytes/전체 JSON 비교를 유지한다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import ast,hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -origin="dc6b9b1cf70b0ca1685eb1ac5476aa6f8cd3dab6" -ex=execute.StepExecutor(phase); root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -assert ex._implementation_agent_settings()==("gpt-5.6-terra","xhigh") -branch,head=ex._git_execution_identity() -assert branch=="refs/heads/feat-"+phase -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","coordination.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -expected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md":"1e4d61997817b84b1df3933c6aa6518f030ca413edcda74393e0a0cf805e6732", - "phases/index.json":"42c9581868cc3f552ea3b42764a291098f648352f31021c7bdd7b4bebcdcf91e", - "phases/"+phase+"/index.json":"f863def2d19869ccb0cdc058b32c240b786a6d94a4a761cc98f9eeae62cd4c36", - "phases/"+phase+"/step0-output.json":"d106f7ade2d678b6e0b383439b1b9b8d25f5ec32e883aed50c6fb4949a8983f1", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"} -for p,h in expected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -assert ast.dump(ast.parse((root/"scripts/execute.py").read_text(encoding="utf-8")))==ast.dump(ast.parse(ex._run_git_checked("show",origin+":scripts/execute.py").stdout)) -old_hook=json.loads(ex._run_git_checked("show",origin+":.codex/hooks.json").stdout) -assert json.loads((root/".codex/hooks.json").read_bytes())==old_hook -idx=ex._read_phase_index();top=ex._read_top_index() -assert idx["steps"][0]["status"]=="blocked" and len(idx["steps"][0]["attempt_history"])==3 -assert next(p for p in top["phases"] if p["dir"]==phase)["status"]=="blocked" -owned=ex._step_owned_paths(idx["steps"][0]) -code=["docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md"] -control=["phases/index.json","phases/"+phase+"/index.json"] -assert set(ex._assert_step_scope(owned))==set(code+control) -frozen={p:(root/p).read_bytes() for p in list(owned)+list(expected)+["phases/"+phase+"/step0.md","phases/mitc4-shell-feast-eigen/index.json"]} -for paths,message in ( - (code,"chore(mitc4-shell-feast-eigen-execution-prep): WIP prep report with native build blocked"), - (control,"chore(mitc4-shell-feast-eigen-execution-prep): preserve attempt 3 blocked metadata")): - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._git_execution_identity()==(branch,head) - assert ex._commit_paths(paths,message,owned_paths=owned) - new_branch,new_head=ex._git_execution_identity() - assert new_branch==branch and new_head!=head - actual=ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",new_head).stdout.splitlines() - assert set(actual)==set(paths) - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._read_phase_index()==idx and ex._read_top_index()==top - print(json.dumps({"commit":new_head,"paths":actual,"status":"blocked","history_count":3})) - head=new_head -assert not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"head":head,"branch":branch,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeWipExit = $LASTEXITCODE -if ($null -eq $mfeWipExit) { throw 'Native exit unavailable' } -exit $mfeWipExit -``` - -각 실제 commit 직후 경로와 전체 snapshot을 확인하고, 마지막 clean preflight와 native -exit를 즉시 보존·전파한다. 중간 실패 시 이미 생성된 commit과 남은 dirty 내용을 보존해 -Coordinator로 반환하며 명령을 무조건 반복하지 않는다. 원시 archive와 report의 당시 실패를 -삭제하거나 WIP commit을 full VERIFY 통과로 해석하지 않는다. - -이 보존과 Coordinator 감사가 실제 완료된 뒤에만 별도 Planning dispatch로 -`steps[0].status`의 `blocked -> pending` 한 값 변경을 할당할 수 있다. 당시 history3, -blocked_reason/blocked_at/started_at/created_at 및 모든 다른 값, top/raw를 보존한다. -그 status-only edit의 actual Executor checkpoint와 재실행 명령은 다음 bounded delta에서 -확정한다. 이번에는 reset하거나 실행하지 않는다. 현재 정상 backend 대안과 미완료 -활성화 경계는 [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)에 있다. - -다음 Implementation은 기존 RED/GREEN과 실패 기록을 읽고 전체 검증을 다시 수행해야 한다. -기존 full CTest는 static reference를 읽고 비교한다. 보고서 owner는 원본의 직접 수정 없음, -새 eigen comparison 미실행, 기존 static regression 비교를 구분하도록 현재 광범위한 -reference 미사용 문장을 바로잡는다. Planning은 해당 보고서를 수정하지 않는다. -Harness r2 source Correction1회는 사용 완료됐으며 두 번째 source correction은 허용하지 않는다. - -## R9. E8 활성화 전의 status-only checkpoint - -R8의 실제 두 commit과 clean/blocked/history3 보존은 -[실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r8-wip-checkpoint-result.json)에 -있다. R8 본문은 당시 명령과 경계로 남긴다. 현재 activation은 -[E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)의 Root setup → -Coordinator 감사 → 별도 Planning status-only 할당 → 아래 actual Executor checkpoint → -clean → 새 workspace-write native 순서다. 이번 Planning 문서 작업에서는 status를 바꾸지 않는다. - -별도 할당을 받은 Planning은 `phases/mitc4-shell-feast-eigen-execution-prep/index.json`의 -`steps[0].status` 한 값만 `blocked -> pending`으로 바꾼다. 기존 history3, 모든 -timestamp/block 필드, owned_paths와 다른 JSON값/형식, top/raw는 그대로 둔다. -Gate는 HEAD 불변·한 값 외 deep-equal·exact dirty1·보호 hash·diff check다. -이 결과를 감사한 Coordinator만 아래 unchanged `_commit_paths` 명령을 수행한다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -ex=execute.StepExecutor(phase);root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -branch,head=ex._git_execution_identity();assert branch=="refs/heads/feat-"+phase -origin="96efbffa425ff5ce9cd1b7cebe673555273122b9" -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","coordination.md", - "implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs -protected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6", - "docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md":"1e4d61997817b84b1df3933c6aa6518f030ca413edcda74393e0a0cf805e6732", - "phases/index.json":"42c9581868cc3f552ea3b42764a291098f648352f31021c7bdd7b4bebcdcf91e", - "phases/"+phase+"/step0-output.json":"d106f7ade2d678b6e0b383439b1b9b8d25f5ec32e883aed50c6fb4949a8983f1"} -for p,h in protected.items(): assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -path="phases/"+phase+"/index.json" -before=json.loads(ex._run_git_checked("show","HEAD:"+path).stdout) -assert before["steps"][0]["status"]=="blocked" and len(before["steps"][0]["attempt_history"])==3 -expected=json.loads(json.dumps(before));expected["steps"][0]["status"]="pending" -assert ex._read_phase_index()==expected -assert set(ex._assert_step_scope(()))=={path} -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -frozen={p:(root/p).read_bytes() for p in [path,*protected]} -assert ex._commit_paths([path],"chore(mitc4-shell-feast-eigen-execution-prep): queue MSVC Ninja environment recovery") -new_branch,new_head=ex._git_execution_identity() -assert new_branch==branch and new_head!=head -assert ex._run_git_checked("diff-tree","--no-commit-id","--name-only","-r",new_head).stdout.splitlines()==[path] -assert all((root/p).read_bytes()==v for p,v in frozen.items()) -assert ex._read_phase_index()==expected and not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"commit":new_head,"status":"pending","history_count":3,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeStatusExit = $LASTEXITCODE -if ($null -eq $mfeStatusExit) { throw 'Native exit unavailable' } -exit $mfeStatusExit -``` - -명령은 origin 이후 Root의 관리2/Planning3 선행 문서 checkpoint만 허용하고 source/Hook/ -report/top/raw의 현재 hash를 확인한다. Phase control 한 경로만 commit하며 -`_commit_step`, 완료/status 자동변경, guard override나 직접 Git commit은 사용하지 않는다. -Native exit를 즉시 전파하고 commit 전후 snapshot 및 clean preflight를 감사한다. -실패하면 bytes/원시 로그/이미 생성된 commit을 보존하고 다음 invocation을 시작하지 않는다. -E8 setup 또는 native 성공을 이 status checkpoint 성공에서 추론하지 않는다. - -## R10. Attempt4의 error/history4 보존 - -[Executor 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/executor-result.json)와 -[terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/terminal-archive.json)는 -native PowerShell1, Codex0, transportFailure null과 report1/controls2만의 변경을 기록한다. -현재 Step0/top은 error/history4다. Classifier37/focused136은 통과했지만 required manual -build는 GoogleTest JSON parsing에서 실패했고 manual CTest/full pytest는 미실행이다. -후속 단독 discovery와 등록 CTest 성공으로 최초 실패를 대체하지 않는다. - -[프로세스 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json)의 -registered Ninja build/CTest0·362pass 및 Python 두 개0과 외부 pwsh1은 별개의 실제 결과다. -Whole Stop0으로 합치지 않는다. [원시 선택 이벤트](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/raw-audit-selected-events.json)의 -item67 direct discovery0은 뒤의 빈 log 조회 때문에 전체 shell1이고 item68은 memo/hash0이다. -176-byte log는 후속 관찰 메모이며 해당 direct 실행 stdout 원본으로 치환하지 않는다. - -Root가 frozen 관리/Planning 문서만 exact checkpoint한 뒤 Coordinator가 아래 unchanged -Executor method invocation으로 report1 WIP와 controls2 error 보존을 분리 commit한다. -사용자 요청 [Root 설명문서](msvc-build-access-error.md)의 기존 commit도 origin 이후 -허용 문서에 포함하며 현재 bytes/hash를 보존한다. Source/Hook/config/cache 변경, -`_commit_step`, 상태 성공·reset, guard override와 직접 Git commit은 없다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import ast,hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -origin="23c4ebe526260d584247804d8cbe2f7aa8cc60ac" -ex=execute.StepExecutor(phase); root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -assert ex._implementation_agent_settings()==("gpt-5.6-terra","xhigh") -branch,head=ex._git_execution_identity() -assert branch=="refs/heads/feat-"+phase -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md","coordination.md","msvc-build-access-error.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -expected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md":"fc88f1c943f7f25d7eeece87dbbd967a6007b14b0adce342ced9aa78f4cd20b2", - "phases/index.json":"33d911587305cc96148a3e60f9ca32f9ec114ce75e49118391bcc1ef3a6692c3", - "phases/"+phase+"/index.json":"3f4ce6178172819f3e1ab4310db61bc318348aeea822b806d4dcca676b53a60f", - "phases/"+phase+"/step0-output.json":"c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"} -expected.update({ - "docs/mitc4-shell-feast-eigen/msvc-build-access-error.md":"0722dff075e706977d55eb1ac2514d4318b1341adab30a51fc82c744315f1c9f", - ".harness/config.json":"3ebdfa80124f1eb96909b2738d6f2a96fecd55cce61150a9cd7ef27d7c5fd892", - ".harness/build-ninja-msvc-debug/CMakeCache.txt":"bf024961a7469672d1fd4f9e8b6606fc1ccaac3fa40dea25709ec4c00ddd5d0e", - ".harness/build/CMakeCache.txt":"d880104fdc3f1411119ce787c0ddb9a63db23de3f571ba2fedce1c56cb91085b"}) -for p,h in expected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -assert ast.dump(ast.parse((root/"scripts/execute.py").read_text(encoding="utf-8")))==ast.dump(ast.parse(ex._run_git_checked("show",origin+":scripts/execute.py").stdout)) -old_hook=json.loads(ex._run_git_checked("show",origin+":.codex/hooks.json").stdout) -assert json.loads((root/".codex/hooks.json").read_bytes())==old_hook -idx=ex._read_phase_index();top=ex._read_top_index() -assert idx["steps"][0]["status"]=="error" and len(idx["steps"][0]["attempt_history"])==4 -assert next(p for p in top["phases"] if p["dir"]==phase)["status"]=="error" -owned=ex._step_owned_paths(idx["steps"][0]);assert len(owned)==9 -code=["docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md"] -control=["phases/index.json","phases/"+phase+"/index.json"] -assert set(ex._assert_step_scope(owned))==set(code+control) -frozen={p:(root/p).read_bytes() for p in list(owned)+list(expected)+["phases/"+phase+"/step0.md","phases/mitc4-shell-feast-eigen/index.json"]} -for paths,message in ( - (code,"chore(mitc4-shell-feast-eigen-execution-prep): WIP prep report with discovery build failure"), - (control,"chore(mitc4-shell-feast-eigen-execution-prep): preserve attempt 4 error metadata")): - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._git_execution_identity()==(branch,head) - assert ex._commit_paths(paths,message,owned_paths=owned) - new_branch,new_head=ex._git_execution_identity() - assert new_branch==branch and new_head!=head - actual=ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",new_head).stdout.splitlines() - assert set(actual)==set(paths) - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._read_phase_index()==idx and ex._read_top_index()==top - print(json.dumps({"commit":new_head,"paths":actual,"status":"error","history_count":4})) - head=new_head -assert not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"head":head,"branch":branch,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeWipExit = $LASTEXITCODE -if ($null -eq $mfeWipExit) { throw 'Native exit unavailable' } -exit $mfeWipExit -``` - -검사 실패 시 이미 생성된 commit, 남은 dirty 파일과 원시 기록을 보존하고 반환한다. -이 명령 성공은 실패의 안전한 보존일 뿐 prep gate 통과가 아니다. -R11 status edit와 E9 실행은 별도 할당 전 미실행이다. 현재 resolver의 canonical Stop1800 -해석은 확인됐지만 정상 override 지원·적용 방법이 미확정이므로 현재는 보존만 진행한다. -기존 exact owned9와 r2 source Correction1회 소진을 유지한다. - -## R11. R10 뒤의 별도 status-only 복구 - -R10 실제 두 commit/clean 감사와 [E9 환경 진입 조건](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)이 -해소된 뒤 Coordinator가 별도 할당할 때만 Planning이 Step0의 `status` 한 값을 -`error -> pending`으로 바꾼다. 나머지 모든 JSON/bytes, error_message/failed_at/started_at, -created_at, history4, owned_paths, top/raw는 보존한다. 이번 문서 작업에서는 바꾸지 않는다. -그 한 값 diff/HEAD/staging/hash 감사를 받은 Coordinator만 아래 control checkpoint를 실행한다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -ex=execute.StepExecutor(phase);root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -branch,head=ex._git_execution_identity();assert branch=="refs/heads/feat-"+phase -origin="23c4ebe526260d584247804d8cbe2f7aa8cc60ac" -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -report="docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md" -controls={"phases/index.json","phases/"+phase+"/index.json"} -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md", - "coordination.md","msvc-build-access-error.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs|controls|{report,".gitignore"} -ignore_commit="3cfbefb000dfbe8afc7a743213146ab7253cbbc0" -ex._run_git_checked("merge-base","--is-ancestor",ignore_commit,"HEAD") -assert ex._run_git_checked("log","-1","--format=%H","--",".gitignore").stdout.strip()==ignore_commit -assert ex._run_git_checked("diff-tree","--no-commit-id","--name-only","-r",ignore_commit).stdout.splitlines()==[".gitignore"] -for paths,probe in ((controls,"phases/"+phase+"/index.json"),({report},report)): - commit=ex._run_git_checked("log","-1","--format=%H","--",probe).stdout.strip() - actual=set(ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",commit).stdout.splitlines()) - assert actual==paths -protected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6", - report:"fc88f1c943f7f25d7eeece87dbbd967a6007b14b0adce342ced9aa78f4cd20b2", - "phases/index.json":"33d911587305cc96148a3e60f9ca32f9ec114ce75e49118391bcc1ef3a6692c3", - "phases/"+phase+"/step0-output.json":"c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61", - ".gitignore":"e9a67c202173c7b049429bb3eddc6dd921a4a76e7a5d248604fa8bdfb2ecdd68", - "CMakeUserPresets.json":"c4665b004be903c4beb913967143c0b0ac4da7e7d857a8c2f09e48754e865e9c", - ".harness/config.json":"47ea5f1da7f6c0312429ead5a3d6d1c71fa884c49e511c1608e7fcccd90d796d", - ".harness/build-ninja-msvc-debug/CMakeCache.txt":"4c2ad564d2f84deb1b8f5e055941ff18f8ba1826b4cd7f197f0bdfbdafe074b5", - ".harness/build/CMakeCache.txt":"d880104fdc3f1411119ce787c0ddb9a63db23de3f571ba2fedce1c56cb91085b"} -for p,h in protected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -path="phases/"+phase+"/index.json" -before=json.loads(ex._run_git_checked("show","HEAD:"+path).stdout) -assert before["steps"][0]["status"]=="error" and len(before["steps"][0]["attempt_history"])==4 -expected=json.loads(json.dumps(before));expected["steps"][0]["status"]="pending" -assert ex._read_phase_index()==expected -assert set(ex._assert_step_scope(()))=={path} -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -frozen={p:(root/p).read_bytes() for p in [path,*protected]} -assert ex._commit_paths([path],"chore(mitc4-shell-feast-eigen-execution-prep): queue serial Ninja environment recovery") -new_branch,new_head=ex._git_execution_identity() -assert new_branch==branch and new_head!=head -assert ex._run_git_checked("diff-tree","--no-commit-id","--name-only","-r",new_head).stdout.splitlines()==[path] -assert all((root/p).read_bytes()==v for p,v in frozen.items()) -assert ex._read_phase_index()==expected and not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"commit":new_head,"status":"pending","history_count":4,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeStatusExit = $LASTEXITCODE -if ($null -eq $mfeStatusExit) { throw 'Native exit unavailable' } -exit $mfeStatusExit -``` - -R10 report1/controls2 commit 경로와 HEAD의 error/history4를 검사하므로 미보존 상태에서 -pending 재실행을 시작하지 않는다. 실제 source/Hook/config 및 기존 cache는 그대로다. -각 native exit와 clean을 확인하고, 다음 E9 invocation은 Coordinator가 새 process로 -별도 할당한다. 실패를 재분류해 새 Correction budget을 만들거나 자동 재시도하지 않는다. - -## R12. User preset setup 이후의 stale hash 경계 - -R10은 실제 report `fc032212f75b9008f0a46e0f2d9f3736f184b05f`/controls -`aa03fc3d049b82f519db1962b5da592524a1c496`로 완료됐다. 과거 R10 명령을 다시 실행하지 않는다. -[E10](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)의 최초 setup1과 -[같은 preset configure 후속0](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configure-followup/result.json)을 -구분한다. 이번 read-only 확인에서 실제 UserPresets/config/cache/ignore hash는 Root 관찰과 같았다. -그 값과 exact ignore1줄 commit만 R11에 반영했다. Source/Hook/control/history4/raw 및 -unchanged `_commit_paths` guard를 유지하며 R10 보존 명령을 재실행하지 않는다. - -사용자의 후속 응답은 Root가 MFE-OQ-004의 제시된 한 값 변경·정상 재신뢰 승인으로 해석했다. -Root의 **actual canonical7500/enabled/trusted** evidence가 확인되기 전에는 R11 status 변경과 -새 native를 할당하지 않는다. 새 DFA/remote 권한은 없다. 현재 정상 invocation은 -[E11](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 따른다. -이번 task는 Planning3문서뿐이며 phase/status/Git/설정/실행 권한이 아니다. - -## R13. Attempt5 명령 정합과 실패 보존 - -[실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/e11-result.json)와 -[terminal audit](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/coordinator-terminal-audit.json)는 -native2/Codex0·blocked/history5를 보존한다. Manual37/4와 focused136 세 실행은 통과했지만 -과거 VS configure/build를 실행해 build1이었다. Manual CTest/full pytest는 미실행이다. -Registered local Ninja의 full362/CTest·Stop Python·wrapper0은 별도 자동 결과이며 -registered build exit의 관찰 공백도 남긴다. 이는 새 local Ninja 실패나 source Correction이 아니다. -[명령 원시 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/manual-command-events-observation.json)을 -유지하고 r.output-only 표시 때문에 결과가 보이지 않았던 실행을 미실행으로 바꾸지 않는다. - -현재 prep/main9 Step 본문의 active CMake/CTest를 local preset으로 직접 고쳤다. -Root가 frozen 관리/Planning/9 Step definitions/사용자 설명문서를 먼저 exact checkpoint한 뒤, -Coordinator가 아래 unchanged Executor로 report1 WIP와 controls2 blocked metadata를 분리 commit한다. -Source/config/reference/Hook, current history5/첫4 history 및 raw는 보존하고 -`_commit_step`, 완료 판정·reset·guard override는 하지 않는다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import ast,hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -origin="c051adc9c3feb4ff85758eeaf06ae08be277b097" -ex=execute.StepExecutor(phase); root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -assert ex._implementation_agent_settings()==("gpt-5.6-terra","xhigh") -branch,head=ex._git_execution_identity() -assert branch=="refs/heads/feat-"+phase -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md","coordination.md","msvc-build-access-error.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -definitions={"phases/"+phase+"/step0.md"}|{"phases/mitc4-shell-feast-eigen/step"+str(i)+".md" for i in range(8)} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs|definitions -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -expected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md":"7789386f17c416fb21cd82514e71f1504e6ee8998bc9e886931d55bb76eeec62", - "phases/index.json":"b291eebdf5782763bcad37d7c22de91c813c44922c76b8cbdd0b019f71b3b612", - "phases/"+phase+"/index.json":"6d4ba8f2960bf55169b1ffac740151014bf5d8a47673ecdec5c557c65629cf0e", - "phases/"+phase+"/step0-output.json":"915c56af488d477cbff46b24d1744e46305d50cac71d77466a8fcf49508302c9", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6"} -expected.update({ - ".gitignore":"e9a67c202173c7b049429bb3eddc6dd921a4a76e7a5d248604fa8bdfb2ecdd68", - "CMakeUserPresets.json":"c4665b004be903c4beb913967143c0b0ac4da7e7d857a8c2f09e48754e865e9c", - ".harness/config.json":"47ea5f1da7f6c0312429ead5a3d6d1c71fa884c49e511c1608e7fcccd90d796d", - ".harness/build-ninja-msvc-debug/CMakeCache.txt":"f58c337fc09fccd29c088b2a65859f6c925322dfc8eb7bea9d1509518a2b3d87", - ".harness/build/CMakeCache.txt":"d880104fdc3f1411119ce787c0ddb9a63db23de3f571ba2fedce1c56cb91085b"}) -for p,h in expected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -assert ast.dump(ast.parse((root/"scripts/execute.py").read_text(encoding="utf-8")))==ast.dump(ast.parse(ex._run_git_checked("show",origin+":scripts/execute.py").stdout)) -old_hook=json.loads(ex._run_git_checked("show",origin+":.codex/hooks.json").stdout) -assert json.loads((root/".codex/hooks.json").read_bytes())==old_hook -canonical=Path("C:/git/FESADev/.codex/hooks.json") -canonical_bytes=canonical.read_bytes() -assert hashlib.sha256(canonical_bytes).hexdigest()=="c8065e7b60882da5db3f90d57b265da25b3c25980bf669d0b1da863e621871ca" -idx=ex._read_phase_index();top=ex._read_top_index() -assert idx["steps"][0]["status"]=="blocked" and len(idx["steps"][0]["attempt_history"])==5 -assert next(p for p in top["phases"] if p["dir"]==phase)["status"]=="blocked" -owned=ex._step_owned_paths(idx["steps"][0]);assert len(owned)==9 -code=["docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md"] -control=["phases/index.json","phases/"+phase+"/index.json"] -assert set(ex._assert_step_scope(owned))==set(code+control) -frozen={p:(root/p).read_bytes() for p in list(owned)+list(expected)+list(definitions)+["phases/mitc4-shell-feast-eigen/index.json","docs/mitc4-shell-feast-eigen/msvc-build-access-error.md"]} -for paths,message in ( - (code,"chore(mitc4-shell-feast-eigen-execution-prep): WIP prep report with manual backend mismatch"), - (control,"chore(mitc4-shell-feast-eigen-execution-prep): preserve attempt 5 blocked metadata")): - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._git_execution_identity()==(branch,head) - assert ex._commit_paths(paths,message,owned_paths=owned) - new_branch,new_head=ex._git_execution_identity() - assert new_branch==branch and new_head!=head - actual=ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",new_head).stdout.splitlines() - assert set(actual)==set(paths) - assert all((root/p).read_bytes()==v for p,v in frozen.items()) - assert ex._read_phase_index()==idx and ex._read_top_index()==top - assert canonical.read_bytes()==canonical_bytes - print(json.dumps({"commit":new_head,"paths":actual,"status":"blocked","history_count":5})) - head=new_head -assert not ex._worktree_paths() -ex._preflight_repository() -print(json.dumps({"head":head,"branch":branch,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeWipExit = $LASTEXITCODE -if ($null -eq $mfeWipExit) { throw 'Native exit unavailable' } -exit $mfeWipExit -``` - -실제 두 commit/clean 감사 뒤 **별도 Planning 할당**에서 Step0.status의 -`blocked -> pending` 한 값만 바꾼다. 다른 bytes/JSON·timestamp·blocked fields·owned_paths· -history5·top/raw를 보존한다. 그 한 값 diff를 감사한 Coordinator만 아래 control checkpoint를 실행한다. -이번 Planning은 status를 바꾸거나 어느 명령도 실행하지 않았다. - -```powershell -$ErrorActionPreference = 'Stop' -$mfePython = Join-Path (Get-Location).Path '.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe' -if (-not (Test-Path -LiteralPath $mfePython -PathType Leaf)) { throw 'Named Python missing' } -@' -import hashlib,json -from pathlib import Path -from scripts import execute -phase="mitc4-shell-feast-eigen-execution-prep" -ex=execute.StepExecutor(phase);root=Path(ex._root) -assert Path.cwd().resolve()==root -assert Path(ex._run_git_checked("rev-parse","--show-toplevel").stdout.strip()).resolve()==root -assert ex._is_isolated_worktree() and ex._codex_sandbox_mode()=="workspace-write" -branch,head=ex._git_execution_identity();assert branch=="refs/heads/feat-"+phase -origin="c051adc9c3feb4ff85758eeaf06ae08be277b097" -ex._run_git_checked("merge-base","--is-ancestor",origin,"HEAD") -report="docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md" -controls={"phases/index.json","phases/"+phase+"/index.json"} -docs={"docs/mitc4-shell-feast-eigen/"+n for n in ("FEATURED_AGENTS.md","PRD.md","ADR.md", - "coordination.md","msvc-build-access-error.md","implementation-plan.md","implementation-environment.md","implementation-recovery.md")} -definitions={"phases/"+phase+"/step0.md"}|{"phases/mitc4-shell-feast-eigen/step"+str(i)+".md" for i in range(8)} -assert set(ex._run_git_checked("diff","--name-only","--no-renames",origin,"HEAD").stdout.splitlines())<=docs|definitions|controls|{report} -for paths,probe in ((controls,"phases/"+phase+"/index.json"),({report},report)): - commit=ex._run_git_checked("log","-1","--format=%H","--",probe).stdout.strip() - actual=set(ex._run_git_checked("diff-tree","--no-commit-id","--name-only","--no-renames","-r",commit).stdout.splitlines()) - assert actual==paths -protected={".codex/hooks.json":"e7e5d3c0c4fcd1e33b60680122ea7c42298d5cbde78a7f87d9e0007bf60a0fa4", - "scripts/execute.py":"64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0", - "tests/test_execute.py":"0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6", - report:"7789386f17c416fb21cd82514e71f1504e6ee8998bc9e886931d55bb76eeec62", - "phases/index.json":"b291eebdf5782763bcad37d7c22de91c813c44922c76b8cbdd0b019f71b3b612", - "phases/"+phase+"/step0-output.json":"915c56af488d477cbff46b24d1744e46305d50cac71d77466a8fcf49508302c9", - ".gitignore":"e9a67c202173c7b049429bb3eddc6dd921a4a76e7a5d248604fa8bdfb2ecdd68", - "CMakeUserPresets.json":"c4665b004be903c4beb913967143c0b0ac4da7e7d857a8c2f09e48754e865e9c", - ".harness/config.json":"47ea5f1da7f6c0312429ead5a3d6d1c71fa884c49e511c1608e7fcccd90d796d", - ".harness/build-ninja-msvc-debug/CMakeCache.txt":"f58c337fc09fccd29c088b2a65859f6c925322dfc8eb7bea9d1509518a2b3d87", - ".harness/build/CMakeCache.txt":"d880104fdc3f1411119ce787c0ddb9a63db23de3f571ba2fedce1c56cb91085b"} -for p,h in protected.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p -canonical=Path("C:/git/FESADev/.codex/hooks.json") -canonical_bytes=canonical.read_bytes() -assert hashlib.sha256(canonical_bytes).hexdigest()=="c8065e7b60882da5db3f90d57b265da25b3c25980bf669d0b1da863e621871ca" -path="phases/"+phase+"/index.json" -before=json.loads(ex._run_git_checked("show","HEAD:"+path).stdout) -assert before["steps"][0]["status"]=="blocked" and len(before["steps"][0]["attempt_history"])==5 -expected=json.loads(json.dumps(before));expected["steps"][0]["status"]="pending" -assert ex._read_phase_index()==expected -assert set(ex._assert_step_scope(()))=={path} -assert not ex._run_git_checked("diff","--cached","--name-only").stdout.strip() -frozen={p:(root/p).read_bytes() for p in [path,*protected,*definitions]} -assert ex._commit_paths([path],"chore(mitc4-shell-feast-eigen-execution-prep): queue aligned local preset verification") -new_branch,new_head=ex._git_execution_identity() -assert new_branch==branch and new_head!=head -assert ex._run_git_checked("diff-tree","--no-commit-id","--name-only","-r",new_head).stdout.splitlines()==[path] -assert all((root/p).read_bytes()==v for p,v in frozen.items()) -assert ex._read_phase_index()==expected and not ex._worktree_paths() -assert canonical.read_bytes()==canonical_bytes -ex._preflight_repository() -print(json.dumps({"commit":new_head,"status":"pending","history_count":5,"clean":True})) -'@ | & $mfePython -B -X utf8 - -$mfeStatusExit = $LASTEXITCODE -if ($null -eq $mfeStatusExit) { throw 'Native exit unavailable' } -exit $mfeStatusExit -``` - -Root/Coordinator는 actual invocation 동안 non-owned 편집·commit을 멈춘다. -WIP나 checkpoint 실패 시 이미 만든 commit과 dirty bytes/원시 evidence를 보존하고 반환한다. -이후 같은 [E11](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)의 -workspace-write/terra/xhigh/유한14400 새 process를 별도 할당한다. Step에 직접 적힌 -local preset·직렬 clean-first·세 discovery·모든 Python/full CTest·fresh manual/reference· -registered actual evidence를 완료해야 하며 자동 결과로 manual 실패를 대체하지 않는다. -새 source key/DFA/policy/runner 변경이나 자동 재시도는 없다. diff --git a/docs/mitc4-shell-feast-eigen/implementation-verification.md b/docs/mitc4-shell-feast-eigen/implementation-verification.md deleted file mode 100644 index 063d7ea..0000000 --- a/docs/mitc4-shell-feast-eigen/implementation-verification.md +++ /dev/null @@ -1,285 +0,0 @@ -# 구현 검증과 계약 traceability - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `implementation-planning-agent` -- Input contract revision: `r2` -- 기본 보고서: [implementation-plan](implementation-plan.md) -- 권위: [requirements](requirements.md), [NR cases](numerical-review-cases.md), - [NR controls](numerical-review-controls.md), [I/O obligations](io-mapping.md#m5-구현test-obligations와-requirement-연결). -- 아래 테스트는 계획 이름이다. 실제 discovery/실행 전 통과 또는 구현 완료를 뜻하지 않는다. - -## V1. 의미 있는 RED와 전체 suite - -각 Step은 소단위별 test-first RED/expected failure 기록→최소 GREEN→focused VERIFY 뒤 -full CMake/MSVC/x64/Debug CTest 및 Python regression을 완료한다. 기존 회귀가 이미 통과한 -사실은 새 RED가 아니다. 부재 API로 인한 정확한 compile/link error는 RED로 기록할 수 있으나 -환경/import/dependency failure와 구분한다. Mutations는 test-local data/fixture/injected -backend에서 수행하며 stored reference나 production을 임시로 오염시키지 않는다. - -아래 mandatory test names는 해당 Step이 완성될 때 CTest discovery inventory에 **각각 존재**해야 -한다. 같은 combined regex가 기존 tests 몇 개만 선택했다고 성공시키지 않는다. New production -basename의 대응 test 파일과 등록된 해당 behavior assertion도 함께 대조한다. 실제 test를 -parameterized tests로 쪼갠 경우 원 named obligation→실제 discovered names의 일대일/일대다 -대응을 step evidence에 기록한다. Case를 test 이름만 등록하고 assertions를 비워 두지 않는다. - -## V2. NR cases의 구체 실행 대응 - -Threshold와 전체 fixture inventory는 NR 원문이다. 표의 요약을 이유로 그 inventory를 축소하지 않는다. -각 row의 primary test 외 관련 단계의 preprocessing/injection/schema tests를 함께 수행한다. - -| Case ID | Steps | Mandatory primary test / file | 독립 oracle·오류 검출 | -| --- | --- | --- | --- | -| MFE-C01 | 2 | `Mitc4ShellMass.MfeC01FlatMomentOracle`
`tests/unit/elements/mitc4_shell_mass_test.cpp` | 4x2, rho3,t1/2의 exact C0/C1/C2; node m3,j1/16; direct energy/physical20 Cholesky/null; rho4/t2 powers. Wrong shear factor/rotary scaling을 검출. | -| MFE-C02 | 2 | `Mitc4ShellMass.MfeC02CurvedParticleOracle`
`tests/unit/elements/mitc4_shell_mass_test.cpp` | NR rational X/d의 independent polynomial 또는 고차 direct particle integral. C1 zero/2-point/flat C2 mutation의 error가 기준을 넘는지 확인. | -| MFE-C03 | 2 | `Mitc4ShellMass.MfeC03DerivedSnapshotAndJensen`
`tests/unit/elements/mitc4_shell_mass_test.cpp` | C1/C2 symmetric perturbation→moment snapshot/consistent/derived block을 각각 대조. Independent nodal integral, central variance, spatial first moment, four velocity families의 Jensen work. | -| MFE-C04 | 2 | `ShellMassAssembler.MfeC04RefinementEnergy`
`tests/unit/assembly/shell_mass_assembler_test.cpp` | m1/2/4 square mesh, velocity(x,0,0); direct MC work4/3, ML-MC8/(3m²), constant velocity total4. Spectrum convergence 주장은 하지 않음. | -| MFE-C05 | 2 | `Mitc4ShellMass.MfeC05RotatedMassAndCentroid`
`tests/unit/elements/mitc4_shell_mass_test.cpp` | NR rational proper Q+shift(7,-3,5), geometry/directors 새 생성; two mass congruence/centroid/null. d=(1,1,1)/sqrt3에서 global scalar-row lump mutation 검출. | -| MFE-C06 | 0, 2, 5 | `ShellMassAssembler.MfeC06SourceAndParallelOrder`
`tests/unit/assembly/shell_mass_assembler_test.cpp` | Shared nodes와 두 rho/t, 선언/label permutation, independent source/scatter mapping. Fixed input sequential/TBB 재실행의 CSR/reduction exact order와 source-renumbered 대응 결과를 구분. | -| MFE-C07 | 0, 2 | `FrequencyDomain.MfeC07DensityFailures`
`tests/unit/io/abaqus/frequency_domain_test.cpp` | Density scope/arity/duplicate/unresolved/missing/zero/negative/NaN/Inf/temperature/dependencies. Kernel 27-point invalid·geometry/t/material 거부는 Mitc4ShellMass에서 별도; density 없는 static 유지. | -| MFE-C08 | 1, 3, 5 | `Mitc4Covariance.MfeC08PartialBcCovariance`
`tests/integration/analysis/mitc4_covariance_test.cpp` | NR001 rectangle/Z45에서 새 K/kd와 two mass, actual BC URZ-only. kd19/4800,Kff10369/7500,Mff3/50; Step5 actual FEAST lambda10369/450/full residual. Old min mutation 실패. | -| MFE-C09 | 1, 7 | `Mitc4Covariance.MfeC09StaticReactionCovariance`
`tests/integration/analysis/mitc4_covariance_test.cpp` | Admissible physical moment (5/3)b, thetaZ7500/10369. Fresh geometry/load 재생성 후 full Kq-F의 모든 reaction component와 physical projection 기준 확인. | -| MFE-C10 | 1 | `Mitc4DrillingScale.MfeC10TraceInventory`
`tests/unit/elements/mitc4_drilling_scale_test.cpp` | [0,0,2,4,0,6,0,4]→kref2, zero/negative/nonfinite/large/subnormal; node별 독립 tangent rotation angles. Positive-only mean/min/floor mutation 검출. | -| MFE-C11 | 1, 2, 3, 5 | `LinearFrequencyProcedure.MfeC11SixPhysicalRigidModes`
`tests/integration/analysis/linear_frequency_procedure_test.cpp` | Free element/patch six tangent-projected rigid fields vs four massless drills. PhysicalK20 rank14/MC20PD/K24rank18, finite20·six near-zero actual modes와 mass Gram; preprocessing tests도 포함. | -| MFE-C12 | 1, 7 | `NonlinearMitc4Tangent.MfeC12FrozenCovariantScale`
`tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp` | Initial S1 scale의 trial/commit/rollback 불변, existing gamma의 full FD schedule/index3/tangent/objectivity/physical linear limit/recovery. 기존 tests는 회귀이며 새 RED로 가장하지 않음. | -| MFE-C13 | 0, 3, 5 | `EigenReduction.MfeC13ExactBoundaryNullIntersection`
`tests/unit/analysis/eigen_reduction_test.cpp` | NR 세 director와 supported mask 조합, drill-only는 axis-aligned URZ만; per-node rank0를 global failure로 오인하지 않음. Global n0/N>n, source constraint exact0. | -| MFE-C14 | 3, 5 | `EigenReduction.MfeC14NearNullConditioning`
`tests/unit/analysis/eigen_reduction_test.cpp` | p1/2000 analytic5 pass, p1e-8 analytic5 conditioning/Cholesky fail, p0 null1. rcond2^-32 equality/nextafter tests; tiny positive를 삭제하면 failure. | -| MFE-C15 | 3 | `EigenReduction.MfeC15RejectsInvalidDecoupling`
`tests/unit/analysis/eigen_reduction_test.cpp` | Test-local K[[6,2],[2,4]],Mdiag2,0 finite2.5/z=-p/2. Production Kpz nonzero/Kzz nonpositive injected rejection; 삭제3 또는 general Schur fallback 금지. | -| MFE-C16 | 3, 5 | `EigenValidation.MfeC16OriginalMassAndPairing`
`tests/unit/analysis/eigen_validation_test.cpp` | M[[2,1],[1,2]],K[[6,4],[4,6]]→2,10/3; triangular whitening/restoration. Wrong M/lambda/vector/null/constraint corruption을 full original-space 검사로 탐지. | -| MFE-C17 | 4, 5 | `MklFeastEigenSolver.MfeC17KnownLowestSpectra`
`tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | Actual API+production search: n1; [0,0,0,2,5,9] N1/4/6; [1,2,4,8] N1/2/4; allzero n4 N1/4. Matrix-derived enclosure/count history와 independent ordered spectrum. | -| MFE-C18 | 4, 5 | `MklFeastEigenSolver.MfeC18RepeatedAndTightClusters`
`tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | Actual n64 fortyfold1+2..25 N1/41; tight[1,1+2^-28,1+2^-27,8] N2; fixed Givens dense CSR. c>N/all-c Gram와 gap/8, repeated projector 기준. 개별 repeated vector equality 아님. | -| MFE-C19 | 4, 5, 6 | `EigenValidation.MfeC19RawSignedEigenvalues`
`tests/unit/analysis/eigen_validation_test.cpp` | Actual [-2,0,3],[-1e-12,0,1] backend raw; procedure significant negative failure. ±tauzero 및 nextafter, frequency ID subset/finite/underflow. Small positive도 N에 포함. | -| MFE-C20 | 2, 3, 5 | `LinearFrequencyProcedure.MfeC20DensityAndUnits`
`tests/integration/analysis/linear_frequency_procedure_test.cpp` | TwoM×4,lambda/4,amplitude1/2; repeated projector; length1024/rho1024^-3/E1024^-1/t1024의 lambda invariance. Baseline s와 동일 물리 BC. | -| MFE-C21 | 4, 5, 6 | `FeastSearch.MfeC21StatusAndHistoryFailures`
`tests/unit/solvers/eigen/feast_search_test.cpp` | C21 전체 raw status inventory, endpoint/zero count/nonmonotonicity/total!=n/m!=c, invalidCSR/fpm/SPD/QR/pair/residual. c>N의 뒤 column 손상과 false-lowest success를 검출; 허용 retry 외 즉시 실패. | -| MFE-C22 | 4, 6 | `FeastSearch.MfeC22FiniteBudgetsAndCapacity`
`tests/unit/solvers/eigen/feast_search_test.cpp` | 512count/3solve inclusive와 초과,384 optimization+128reserve, certified fallback. n²/n*m0/nnz+1/byte overflow 및 allocation injected failure; 큰 allocation 실제 고갈을 유발하지 않음. | -| MFE-C23 | 0, 5, 6, 7 | `FrequencyDomain.MfeC23ExactReferenceSubset`
`tests/unit/io/abaqus/frequency_domain_test.cpp` | 원본729/676/Step-2/N10, density/t/S4R/warnings/source records. N invalid·fields2~7 nonempty0/eighth empty·unsupported enum/procedure/load/acoustic/mixed/nonzero BC; I1~I6 전 inventory. | -| MFE-C24 | 5, 6, 7 | `EigenHdf5Schema.MfeC24RoundTripAndRejection`
`tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp` | O1~O5 independent reader/mutation, N/c/source/units/backend/ML/flags/types/ranks. FrequencyApplication failure matrix는 이전 final/state hash와 최초final부재를 각각 확인. | -| MFE-C25 | 7 | `EigenReferenceCases.MfeC25FreshTenValueFamilies`
`tests/reference/eigen_reference_cases_test.cpp` | 원본TXT full grammar+source join/10singleton 실제fresh eigen 비교. EigenReferenceComparison 음성/1%RMS·5%row·near-zero·S0 boundaries, Freq mutation 판정불변. | -| MFE-C26 | 1, 6, 7 | `Mitc4EigenStaticRegression.MfeC26FreshApprovedPortfolio`
`tests/reference/mitc4_eigen_static_regression_test.cpp` | shell/shellNL/shellNL-meshfine와 linear-limit 역할. 원본copy→actualrun→기존 Ublocking/URwarning/localreactionreview+factor1 internalbalance. Existing meshfine-02 post-closure·pressure fullsuite 유지. | -| MFE-C27 | 0, 1, 2, 3, 4, 5, 6, 7 | `EigenReferenceCases.MfeC27FreshAndRepeatedEvidence`
`tests/reference/eigen_reference_cases_test.cpp` | 모든 Step RED/GREEN/full 실제exits/warnings/identity; 같은 binary/runtime/thread/input3회 CSR/row/diagnostic exact와 scalar/projector. Fresh binary/source/result evidence·canonical reports, 독립Physics/Release는 후속gate. | - -C07은 추가 `Mitc4ShellMass.MfeC07InvalidMassGeometry`, C08은 -`LinearFrequencyProcedure.MfeC08PartialBcEigenvalue`, C24는 -`FrequencyApplication.MfeC24PreservesFinalAndState`, comparator 음성/경계는 -`EigenReferenceComparison.MfeC25PrechecksAndToleranceBoundaries`를 mandatory로 둔다. -각 companion은 해당 Step의 discovery에서 확인하고 record한다. - -## V3. 전체 must requirement 대응 - -전27개 requirement의 NR case mapping을 그대로 옮겨 실행 Step에 연결했다. Requirement025의 -Implementation evidence는 여기서 준비하되 독립 Physics/Release gate는 후속 owner가 수행한다. - -| Requirement ID | Required NR cases | Implementation steps | -| --- | --- | --- | -| FEM-REQ-MITC4-EIGEN-001 | MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-003 | MFE-C06, MFE-C07, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-004 | MFE-C01, MFE-C02, MFE-C07 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md) | -| FEM-REQ-MITC4-EIGEN-005 | MFE-C01, MFE-C02, MFE-C03 | [2](../../phases/mitc4-shell-feast-eigen/step2.md) | -| FEM-REQ-MITC4-EIGEN-006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) | -| FEM-REQ-MITC4-EIGEN-007 | MFE-C06, MFE-C13, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) | -| FEM-REQ-MITC4-EIGEN-009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 | [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md) | -| FEM-REQ-MITC4-EIGEN-014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) | -| FEM-REQ-MITC4-EIGEN-015 | MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-016 | MFE-C07, MFE-C21, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-017 | MFE-C24, MFE-C25 | [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-019 | MFE-C21, MFE-C22, MFE-C24 | [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-020 | MFE-C25, MFE-C26 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-021 | MFE-C25 | [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-022 | MFE-C25 | [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-023 | MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-025 | MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | -| FEM-REQ-MITC4-EIGEN-026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 | [2](../../phases/mitc4-shell-feast-eigen/step2.md) | -| FEM-REQ-MITC4-EIGEN-027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) | - -## V4. I/O obligation 대응 - -| Obligation ID | Steps | Positive/negative evidence | -| --- | --- | --- | -| IO-T01 | 0, 5, 6, 7 | C23; 원본 unchanged semantic snapshot/source warnings→actual backend→HDF5. | -| IO-T02 | 0, 2 | C01/02/06/07; material/section/rho/t 관계와 semantic/kernel negative inventory. | -| IO-T03 | 0, 6 | C07/13/23; exact parameter/slot/count/procedure/BC 실패와 exit category. | -| IO-T04 | 0, 2, 3, 5 | C06/13/14/24; source renumbering/ambiguity와 actual BC의 rank/복원. | -| IO-T05 | 3, 5, 6, 7 | C16/19/24; O1~O5/Nvectors/all-c raw metrics, source identity와 sameML replay. | -| IO-T06 | 4, 5, 6 | C17/18/19/21/22; actual API와 injected failure/budget/availability history. | -| IO-T07 | 5, 6 | C24; solve/validation/log/lease/write/flush/close/reopen/selfcheck/replace 전 failure matrix. | -| IO-T08 | 7 | C25; all-row parser/schema/identity finite prechecks, Freq structure-only mutation. | -| IO-T09 | 7 | C25; existing policy inclusive boundaries/near-zero/S0·singleton RMS independently checked. | -| IO-T10 | 0, 1, 6, 7 | C26/27; density없는static/parser/schema 보존·fresh portfolio·mode-shape reference 미요구. | -| IO-T11 | 0, 1, 2, 3, 4, 5, 6, 7 | C27; step별 meaningfulRED/실제fullcounts/새warning0/3repeat·freshhash. | - -## V5. 수학·backend·schema의 누락 방지 - -| Upstream item | Implementation / independent evidence | -| --- | --- | -| Mass M1~M10 | Step2 C01~07; sign S=-[d]x, exact quadrature order, original moments, two matrix energy/centroid/Jensen, no artificial drill | -| Stabilization S1~S8 | Step1 C08~12, Step3/5 partial-BC original pencil, Step7 static fresh portfolio; old formula만 대체 | -| Eigen E1~E5 | Step3 C13~16; D,C,P,Z,L과 DOF pattern owner, exact ranks/rcond/zero branches/original residual 보존 | -| Eigen E6/E7 + C5/C6 | Step4 actual FEAST·all count/status history, per-call fpm128·seed/QR·thread restore·index/allocation/capacity·유한 budgets | -| V1~V5 + C1~C4 | Step5 all-c original ML residual/Gram/energy/rhoB/rigid/scale/projector; Step7 N persistent replay | -| Eigen E8 + IO-M2 | Step5 candidate, Step6 final replacement 후 noexcept swap, all failure matrix/oldfinal hash; zero-byte log 독립 | -| I1~I6 | Step0 grammar/source/semantic positives+negatives, Step6 actual CLI exits/stable warnings; sourceN와 internalc 분리 | -| O1/O2 | Step6 discriminant/types/mandatory metadata/model identities/source_records/densities; Step7 input-byte identity | -| O3 | Step5 raw paired N/cluster/classification/frequency subset/sign, Step6 N×nn×6 persistence/units/constraint0 | -| O4/O5 | Step4/5 all-c evidence source, Step6 exact schema/fpm128/available flags/readback/relations/self-check | -| IO-M3/M4 + common tolerance | Step7 full-row TXT/source join10singleton/Value only; external Freq/vector gate 없음; static roles 보존 | - -원 full K/M 및 independent particle/polynomial 기대값은 solve의 reduced A나 serializer 자기 -복사에서 생성하지 않는다. Self-check는 저장 일관성 검사이며 independent physics를 대신하지 않는다. -FEAST의 documented count는 무조건 completeness theorem이 아니다. Count/empty-prefix/guard/ -solve-count/전체 c residual·Gram 및 known spectra를 함께 확보한다. - -## V6. Fresh reference 실행과 보고서 - -새 eigen 원본은 [reference-model](reference-model.md)의 input/TXT를 그대로 사용한다. -Step7의 unique generated execution directories 아래 bytes를 복사하고 FesaApplication을 실제 -호출한다. Reference 전후 SHA-256/byte size/mtime, copied input exact bytes, actual binary/lib -SHA-256, start/end/exit, final h5/log hash를 기록한다. Metadata source path는 실제 copied lexical -input path와 맞아야 하며 원본과는 byte identity를 따로 확인한다. - -Fresh eigen 세 run은 같은 input bytes/runtime/thread/settings를 사용한다. 각 run10modes, -nf3750/nz625/n3125와 all-c checks/call histories, N persistent vectors의 sameML 원 residual을 -확인한다. Same-input deterministic replay는 각 run을 같은 lexical input path에서 직접 solver로 -재실행한 뒤 run별 결과를 고유 evidence directory로 복사해 비교할 수 있다. 복사본 schema의 -source path는 원 실행 path 그대로 보존한다. 모드 벡터 외부 reference는 요구하지 않는다. - -Count x의3125²×8=78,125,000bytes는 한 scratch allocation 크기다. 실제 reference test process의 -peak working set/private memory를 관찰해 peak 측정 범위와 PID/command를 기록한다. -이 수를 전체 peak나 sparse shifted fill로 대체하지 않는다. Process 전체 peak는 solver-only -allocation peak의 upper bound임을 구분한다. 관찰은 managed test process의 actual exit까지 -연결하고 unobserved detached 실행은 하지 않는다. - -Static portfolio는 [기존 요구](requirements-evidence.md#필수-회귀-포트폴리오와-identity)의 -8개 required/review-only artifacts와 같은 input/source identity를 사용한다. Existing comparator의 -artifact disposition을 적용하여 제외 stress/RM3를 새 mandatory로 만들지 않는다. -`shell-s4`/`shell-s4-linear-limit`는 같은 fresh solve를 두 역할에 쓸 수 있으나 보고서는 -분리한다. Nonlinear final factor1 accepted-state/U blocking/UR warning/RF1..3와 spatial RM1..2 -review-only, internal force/moment balance blocking은 보존한다. Registered -`shellnl-meshfine-02-s4-final`는 별도 post-closure 역할이며 pressure를 포함한 기존 full suite도 -실행한다. 기존 reports는 수정하지 않고 현재 r2 새 evidence를 남긴다. - -Future outputs는 Step7의 `implementation-report.md`, `build-test.md`, -`reference-comparison.md`, `reference-comparison-detail.md`다. Step별 -`implementation-stepN-evidence.md`와 prep evidence는 실제 실행 때만 생성한다. -Final canonical3 보고서는 같은 r2의 실제 command/exit/count/수치·원본보존·실제 미실행 내역·전체 -requirement trace를 연결한다. 마지막 registered Stop/actual exit가 아직 미관찰이면 확인 대기로 -구분하며 Executor 종료 뒤 Coordinator의 management 사후 감사를 받는다. Physics/Release -판정과 외부 release 권한을 대신하지 않는다. - -## V7. 계획 정적 감사 - -정적 감사에서 actual `StepExecutor`의 read/validation methods만 호출했다. Executor 실행, -CMake/CTest/Python tests, 실제 FEAST 또는 reference solve는 호출하지 않았다. -첫 감사는 Step2의 `mitc4_shell.h`에 대응하는 기존 C++ test의 owned 목록 누락을 찾아 exit1이었다. -`mitc4_shell_test.cpp`를 같은 Step index/Markdown에 추가한 뒤 전체 audit exit0을 확인했다. -Local link target 검사에서 발견한 I/O M1 anchor 두 곳도 실제 heading으로 수정했다. - -최종 read-only command의 actual exit0 결과: prep1/main8, 계획 산출물16, owned path128회 -(고유110), 모든 Step의 upstream22 입력, must27/NR27/I/O11, 필수 신규 test 이름40개, -local Markdown links575개, 누락/anchor warning0. 기존 top index의5개 entry/status/history는 -HEAD와 deep equality다. 모든 새 Step은 pending이며 JSON/Markdown owned 목록이 동일하다. -최초 `git diff --check` exit0은 unstaged diff만 검사하여 당시 untracked 신규 파일을 -포함하지 않았다. 별도 line trailing whitespace 검사도 여분 EOF blank를 검출하지 못했다. -Root의 checkpoint staged 검사에서 EOF blank3개를 발견하여 지정된3파일만 정리했다. -아래 전체 산출물 검사는 EOF newline/여분 blank 검사까지 보완한 뒤 actual exit0을 확인했다. -Root의 재staging과 staged 검사는 별도 소유 작업이며 여기서 그 성공을 선기록하지 않는다. -Hash는 아래 command가 산출한 SHA-256을 handoff에 기록한다. Bundle digest는 sorted path, -NUL, raw bytes를 이어 hash하며 자기 digest를 이 문서에 삽입하지 않는다. - -아래는 workspace root에서 수행한 정확한 read-only 감사 command다. Test 이름 검사는 -**계획 inventory/regex/등록 target의 정적 일관성**이며 아직 존재하지 않는 C++ test의 실제 -discovery/실행 성공을 주장하지 않는다. 해당 실제 검증은 각 Implementation Step의 AC다. - -```powershell -@' -import hashlib,json,re,subprocess -from pathlib import Path -from urllib.parse import unquote -from scripts.execute import StepExecutor -root=Path.cwd(); feature="mitc4-shell-feast-eigen"; doc=root/"docs"/feature -phases=[feature+"-execution-prep",feature] -artifacts=[doc/n for n in ("implementation-plan.md","implementation-environment.md","implementation-interfaces.md","implementation-verification.md")] -artifacts += [root/"phases"/"index.json"] -counts=[]; owners=[]; names=[]; steps=[] -required=["FEATURED_AGENTS.md","PRD.md","ADR.md","coordination.md","requirements.md","requirements-evidence.md","research.md","research-evidence.md","formulation.md","formulation-mass.md","formulation-eigen.md","formulation-verification.md","formulation-stabilization.md","numerical-review.md","numerical-review-evidence.md","numerical-review-controls.md","numerical-review-cases.md","reference-model.md","io.md","io-input.md","io-schema.md","io-mapping.md"] -assert all((doc/n).is_file() for n in required) -for phase in phases: - ex=StepExecutor(phase); ex._read_top_index(); data=ex._read_phase_index() - assert all(s["status"]=="pending" for s in data["steps"]) - artifacts.append(root/"phases"/phase/"index.json"); counts.append(len(data["steps"])) - for step in data["steps"]: - path=root/"phases"/phase/f'step{step["step"]}.md' - artifacts.append(path); steps.append((phase,step,path)) - body=path.read_text(encoding="utf-8"); owned=ex._step_owned_paths(step) - for p in owned: ex._validate_owned_file(p) - assert list(owned)==json.loads(re.search(r"\x60{3}json\n(.*?)\n\x60{3}",body,re.S)[1]),path - assert all(f"docs/{feature}/{p}" in body for p in required),path - assert all(x in body for x in ("Input contract revision:","implementation-interfaces.md","RED","GREEN","Full VERIFY","error_message","blocked_reason","actual exit","사후 감사")),path - assert len(owned)>0 - owners.extend(owned) - if phase==feature: - inv=body.split("### 필수 신규 test discovery inventory\n",1)[1].split("## Full VERIFY",1)[0] - planned=re.findall(r"^- \x60([^\x60]+)\x60",inv,re.M) - regex=re.search(r"-R '([^']+)'",body)[1] - assert planned and all(re.search(regex,n) for n in planned),(path,planned,regex) - names.extend(planned); assert "--target fesa_tests" in body - for p in owned: - if p.startswith(("src/fesa/","include/fesa/")) and Path(p).suffix in (".cpp",".h"): - stem=Path(p).stem+"_test.cpp" - assert any(Path(t).name==stem and t.startswith("tests/") for t in owned),(path,p) -base=json.loads(subprocess.check_output(["git","show","HEAD:phases/index.json"],text=True)) -top=json.loads((root/"phases/index.json").read_text(encoding="utf-8")) -assert top["phases"][:-2]==base["phases"] -assert [p["dir"] for p in top["phases"][-2:]]==phases -assert counts==[1,8] and len(artifacts)==16 -v=(doc/"implementation-verification.md").read_text(encoding="utf-8") -nr=(doc/"numerical-review-cases.md").read_text(encoding="utf-8") -reqmap={m[0]:re.findall(r"MFE-C\d{2}",m[1]) for m in re.findall(r"^\| (\d{3}) \| ([^|]+) \|",nr,re.M)} -planmap={m[0]:re.findall(r"MFE-C\d{2}",m[1]) for m in re.findall(r"^\| FEM-REQ-MITC4-EIGEN-(\d{3}) \| ([^|]+) \|",v,re.M)} -assert reqmap==planmap and len(planmap)==27 -assert len(re.findall(r"^\| MFE-C\d{2} \|",v,re.M))==27 -assert len(re.findall(r"^\| IO-T\d{2} \|",v,re.M))==11 -primary=re.findall(r"^\| MFE-C\d{2} \| [^|]+\| \x60([^\x60]+)\x60",v,re.M) -assert len(primary)==27 and set(primary)<=set(names) -links=0; anchor_warnings=[] -def slug(s): - s=s.replace(chr(96),"").strip().lower() - s=re.sub(r"[^\w\- ]","",s) - return s.replace(" ","-") -for p in artifacts: - body=p.read_text(encoding="utf-8") - assert body.endswith("\n") and not body.endswith("\n\n"),p - assert not any(line.rstrip()!=line for line in body.splitlines()),p - if p.suffix!=".md": continue - for target in re.findall(r"\[[^\]]+\]\(([^)]+)\)",body): - if re.match(r"^[a-z]+://",target): continue - pathpart,_,anchor=unquote(target.strip("<>")).partition("#") - linked=(p.parent/pathpart).resolve() if pathpart else p - assert linked.is_file(),(p,target) - links+=1 - if anchor and linked.suffix==".md": - headings=[slug(h) for h in re.findall(r"^#+ (.+)$",linked.read_text(encoding="utf-8"),re.M)] - if anchor not in headings: anchor_warnings.append((p.relative_to(root).as_posix(),target)) -for p in ("implementation-report.md","build-test.md","reference-comparison.md","physics-evaluation.md","release.md"): - assert not (doc/p).exists(),p -cm=(root/"tests/CMakeLists.txt").read_text(encoding="utf-8") -assert re.search(r"add_custom_target\(\s*fesa_tests\s+DEPENDS\s+fesa_unit_tests\s+fesa_integration_tests\s+fesa_reference_tests",cm) -diff=subprocess.run(["git","diff","--check","--"]+[p.relative_to(root).as_posix() for p in artifacts],capture_output=True,text=True) -assert diff.returncode==0,diff.stdout+diff.stderr -digest=hashlib.sha256() -for p in sorted(artifacts): - digest.update(p.relative_to(root).as_posix().encode());digest.update(b"\0");digest.update(p.read_bytes()) -print(json.dumps({"phase_steps":counts,"artifacts":len(artifacts),"owned_path_occurrences":len(owners),"unique_owned_paths":len(set(owners)),"required_inputs":len(required),"requirement_rows":len(planmap),"nr_cases":len(primary),"io_obligations":11,"mandatory_test_names":len(names),"local_links":links,"anchor_warnings":anchor_warnings,"git_diff_check":diff.returncode,"bundle_sha256":digest.hexdigest()},ensure_ascii=False)) -for p in artifacts[:4]: print(p.name,hashlib.sha256(p.read_bytes()).hexdigest()) -'@ | python -B - -``` - -관리 문서 `coordination.md`의 동시 owner 변경은 이 계획 patch에 포함하지 않았다. -현재 실행 준비 완료는 계획 materialization을 뜻한다. Native transport, prep 실제 full VERIFY/ -등록 Stop 및 새 main invocation의 구현·FEAST/reference 성공은 후속 execution evidence가 필요하다. diff --git a/docs/mitc4-shell-feast-eigen/io-input.md b/docs/mitc4-shell-feast-eigen/io-input.md deleted file mode 100644 index 79ca360..0000000 --- a/docs/mitc4-shell-feast-eigen/io-input.md +++ /dev/null @@ -1,197 +0,0 @@ -# MITC4 eigen 입력 subset과 진단 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `io-definition-agent` -- Input contract revision: `r2` -- 기본 보고서: [io.md](io.md) - -## I1. 문법과 source identity - -기존 [linear shell I/O §1](../linear-static-mitc4-shell/io.md), -[현재 pressure I/O §3](../shell-surface-pressure-load/io.md)의 공통 lexical 계약을 재사용한다. -현재 [input reader](../../src/fesa/io/abaqus/input_reader.cpp)와 -[mapping context](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 읽기 전용 대조했다. -예전 nonlinear 문서의 continuation 미지원 설명보다 후속 승인된 pressure lexical 규칙이 우선한다. - -- CRLF/LF를 수용한다. Physical line은 종결자를 제외해 최대 256 ASCII bytes이며 printable - ASCII와 horizontal tab만 허용한다. `**` comment와 blank line은 semantic effect가 없다. - Inline comment, data continuation, include, substitution, quoted/escaped 이름은 지원하지 않는다. -- Keyword/parameter/enum/name lookup은 ASCII case-insensitive다. Parameter 순서는 무관하지만 - duplicate name은 값이 같아도 실패한다. Raw spelling, keyword physical lines, data fields와 - normalized lexical input path/1-based line을 보존한다. Keyword terminal comma는 기존 - parameter continuation이며 직후 comment/blank/new keyword/EOF interruption은 실패한다. -- Comma split은 빈 필드를 보존한다. 각 token 주변 space/tab만 trim한다. 아래 명시된 - 공란 외에 arbitrary trailing-empty 제거를 적용하지 않는다. -- Source node/element label은 positive decimal int64이고 raw digits와 numeric identity를 - 분리한다. Scope 내 같은 numeric label은 duplicate다. Name/target는 기존 shell의 - 비어 있지 않은 ASCII 이름·qualification 규칙을 재사용한다. 새 step name도 같은 - name token이며 생략 시 source name은 `Step-1`이다. HDF5 path에 raw name을 삽입하지 않는다. -- 새 `rho` numeric token은 `[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?`다. - C-locale full consumption과 binary64 finite conversion을 요구한다. NaN/Inf, hex, D exponent, - overflow/underflow conversion error는 실패한다. N은 `[0-9]+`와 checked int64 범위이며 - 값이 양수여야 한다. 기존 keyword의 승인된 numeric parsing은 이 기능 때문에 바꾸지 않는다. - -## I2. 지원 keyword와 위치 - -Eigen input의 문법은 `heading? preprint? part+ assembly material+ model-boundary* step EOF`다. -Comments/blank는 블록 사이에 허용한다. 기존 mesh/set nesting과 forward material/section -resolution은 유지한다. 활성 모델은 S4/S4R shell만 포함한다. - -| Keyword | Eigen subset·data | 의미와 validation | -| --- | --- | --- | -| `*HEADING` | Optional 첫 keyword, parameter 없음, text rows | Heading provenance. Duplicate/nesting 오류 거부 | -| `*PART`, `*END PART` | `NAME` 하나; close parameter/data 없음 | Part-local topology. 중첩/중복/미종결 거부 | -| `*NODE` | Part scope, parameter 없음; `label,x,y,z` | Finite initial global midsurface coordinates. 중복·잘못된 arity 거부 | -| `*ELEMENT` | Part scope, `TYPE=S4` 또는 `TYPE=S4R`만; `label,n1,n2,n3,n4` | 같은 MITC4 physical/mass path와 별도 source type. 네 distinct resolved nodes 필요 | -| `*NSET`, `*ELSET` | Part/assembly scope; 해당 `NSET=name` 또는 `ELSET=name`, optional flag `GENERATE`; assembly는 `INSTANCE=name` 필수. 기존 assembly ELSET의 `INTERNAL` flag도 유지 | Explicit positive labels, 또는 `first,last,increment` inclusive generate. 기존 set row trailing comma 허용. Nonpositive/역순/도달 불가능 range·empty·duplicate definition·dangling/cyclic/mixed-instance 거부 | -| `*SHELL SECTION` | Part scope, `ELSET`, `MATERIAL` 필수; 한 row `t[,integration_points]` | Centered homogeneous layer, constant finite t>0, element별 유일 assignment. Optional second field가 있으면 positive decimal integer; 아래 예외 적용 | -| `*ASSEMBLY`, `*END ASSEMBLY` | Top-level 하나, `NAME`; close parameter/data 없음 | Assembly scope, nested/duplicate 거부 | -| `*INSTANCE`, `*END INSTANCE` | Assembly scope, `NAME`, `PART`; data 없음 | Identity instances; 같은 part의 여러 identity instance 허용. Transform/dangling/duplicate 거부 | -| `*MATERIAL` | Top-level model data, `NAME`; data 없음 | Named material 소유. Case-insensitive unique | -| `*ELASTIC` | Current material, parameter 없음; 한 row `E,nu` | 기존 finite E>0, -10이어야 한다. Material scope 밖 Density도 실패다. - -모든 활성 shell의 `element -> section -> material -> rho`가 정확히 하나로 결정되어야 한다. -Missing rho를 0이나 기본값으로 채우지 않는다. 서로 다른 material/section의 rho/t를 -global 평균으로 바꾸지 않는다. 사용하지 않은 material의 Density가 존재하면 문법·양성 검증은 -동일하며, rho 존재의 필수성은 활성 material에 적용한다. Material/section reference 오류는 -밀도가 있는 다른 material로 fallback하지 않는다. 단위는 `mass/length^3`, 변환 없음. - -Density의 새 입력 허용은 이 eigen procedure에 속한다. 기존 static parser의 Density 지원 -범위를 넓히지 않고, density가 없는 기존 static input과 material 생성 경로를 보존한다. -Material의 내부 optional density를 만들더라도 static에 필수값을 요구하지 않는다. - -## I4. Step와 Frequency의 exact options - -`*STEP` 허용 parameter는 optional `NAME=`, optional `NLGEOM=NO`, optional -value 없는 `PERTURBATION`뿐이며 data는 없다. NLGEOM 생략은 NO다. PERTURBATION이 없어도 -FREQUENCY가 원형상 linear perturbation procedure를 결정하고 source flag 유무를 보존한다. -`NLGEOM=YES`, flag NLGEOM, `PERTURBATION=...`, `INC`, 다른 option은 eigen에서 거부한다. -Frequency 외 procedure, step description data, 두 번째 procedure/step, 선행 상태는 지원하지 않는다. - -| FREQUENCY parameter | 허용·기본 의미 | Observable mapping | -| --- | --- | --- | -| `EIGENSOLVER` | 생략 또는 `LANCZOS` | Source default=LANCZOS; actual=`MKL FEAST`. Explicit/omitted provenance와 backend mapping warning 기록 | -| `SIM` | 생략, value 없는 flag, `YES` | Source effective=YES. FESA SIM architecture 기능을 만들지 않음. Explicit일 때 no-op warning | -| `ACOUSTIC COUPLING` | 생략 또는 `ON` | Acoustic/ASI/TIE/coupling 정의가 전혀 없는 structural-only 모델에서만 적용 대상 없음. Explicit일 때 no-op warning | -| `NORMALIZATION` | 생략 또는 `MASS` | Source SIM=YES의 mass default를 적용. FESA 실제 ML로 phi^T ML phi=1; 값 변경 warning 없음 | - -`SIM=NO`, `NORMALIZATION=DISPLACEMENT`, `AMS/SUBSPACE/FEAST` source enum, -`ACOUSTIC COUPLING=OFF|PROJECTION`, `DAMPING PROJECTION`, `RESIDUAL MODES`, -`PROPERTY EVALUATION`, `NSET` 및 다른 parameter는 지원하지 않는다. -사용자 backend 요구를 Abaqus 문법의 새 `EIGENSOLVER=FEAST` 지원으로 바꾸지 않는다. - -Data는 정확히 한 physical row, comma split 후 **1~7 fields**다. 첫 field N은 mandatory -positive decimal integer이며 2~7은 존재하면 모두 empty여야 한다. 생략된 trailing fields도 -unspecified다. 원본 `10, , , , ,`는 여섯 fields로 유효하다. Fields 2/3은 frequency bounds, -4는 shift, 5/6은 Lanczos controls, 7은 acoustic range factor의 source slot이다. -공란은 숫자0이 아니다. 어느 slot의 nonempty `0`도 지원하지 않으며, eighth empty field도 -arity 오류다. 추가 row는 residual-mode input으로 해석하지 않고 거부한다. -이 제한은 [공식 FREQUENCY syntax](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의 -선택된 부분집합이다. N은 마지막까지 input authority이고 TXT 행수/count scratch/returned m과 다르다. -`N>finite_dimension` 및 빈 finite problem은 equation 구성 뒤 명시적으로 실패한다. - -## I5. Result-neutral allowlist와 warning - -아래 keyword는 parameter 순서만 자유이며 duplicate/추가 parameter·data row는 거부한다. -동일 조합의 반복 output request는 각 keyword당 warning 한 개를 남기며 결과를 바꾸지 않는다. - -| Keyword | 정확한 조합·위치 | Warning code | -| --- | --- | --- | -| `*PREPRINT` | Optional top-level; `ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO` 정확히 네 개, data 없음 | `ignored-input-keyword` | -| `*RESTART` | FREQUENCY/BC 뒤; flag WRITE와 FREQUENCY=0, data 없음 | `ignored-input-keyword` | -| `*OUTPUT` | FREQUENCY/BC 뒤; FIELD 또는 HISTORY flag 하나; optional VARIABLE=PRESELECT; data 없음 | `ignored-input-keyword` | -| `*NODE OUTPUT` | 활성 OUTPUT FIELD 아래; VARIABLE=PRESELECT 하나, data 없음 | `ignored-input-keyword` | -| `*ENERGY OUTPUT` | 활성 OUTPUT HISTORY 아래; VARIABLE=ALL 하나, data 없음 | `ignored-input-keyword` | - -새 OUTPUT root는 앞의 output scope를 닫고, RESTART/END STEP도 닫는다. Child scope mismatch는 -거부한다. Restart READ/nonzero write frequency, output variables data, element/contact output, -node history request 등 표 밖 조합은 eigen에서는 fail-closed다. 기존 static allowlist를 축소하지 않는다. -Warning message는 raw keyword와 `mandatory-eigen-output-unchanged` 이유를 포함한다. -RESTART frequency0은 write 중단 옵션이고 출력 요청들은 model equations를 바꾸지 않는 -output selection이다. FESA는 이 selection을 구현하지 않는다는 차이를 알린다. - -FREQUENCY에는 `source-eigensolver-mapped-to-feast` warning을 항상 하나 기록한다. -Explicit SIM에는 `source-sim-option-not-applied`, explicit acoustic ON에는 -`acoustic-option-inapplicable-structural-only`를 기록한다. -위 세 code를 포함한 출력 순서는 기존 source tuple의 code 정렬을 따른다. Invalid model은 -이 warning을 근거로 acoustic/coupling semantics를 버려서는 안 된다. - -## I6. Fail-closed validation과 diagnostics - -표 밖 model/history keyword는 eigen analysis 전에 거부한다. 특히 어떤 위치의 -`CLOAD/DLOAD/DSLOAD`, initial condition/stress/temperature, damping, acoustic/ASI elements, -TIE/contact/MPC, transform/orientation/explicit director, surface/beam/solid/mixed model, -concentrated/nonstructural mass, composite/offset/variable thickness, amplitudes, restart read와 -다중 step은 지원하지 않는다. Zero-valued load/damping 입력도 지원되는 무하중 모델로 바꾸지 않는다. - -진단 record는 기존 `severity,code,file,line,keyword,entity_identity,message`를 사용한다. -file은 lexical normalized path, line은 source 1-based다. Material/section/node/element/step, -DOF 또는 invalid parameter/field ordinal을 가능한 한 entity/message에 포함한다. -Numerical scale·threshold·observed value는 binary64 round-trip 가능한 decimal로 보고한다. -Source location 없는 backend failure도 sole Frequency location과 step을 연결한다. -기존 SortDiagnostics 순서와 same-key discovery order를 유지한다. - -| Condition | Stable code | CLI exit | -| --- | --- | --- | -| Lexical/arity/duplicate parameter/name/unresolved source | 기존 `invalid-input-character`, `input-line-too-long`, `invalid-data-arity`, `invalid-keyword-parameter`, `unresolved-reference` 등 해당 기존 code | 3 | -| Density scope/data/dependency/duplicate | `invalid-density-data` / `unsupported-density-option` / `duplicate-density` | 3 | -| Active rho missing / numeric nonfinite 또는 nonpositive | `missing-material-density` / `invalid-material-density` | 4 | -| New rho malformed numeric token | `invalid-density-data` | 3 | -| Frequency parameter/count/data mismatch | `unsupported-frequency-option` / `invalid-frequency-data` | 3 | -| Multiple/preload/unsupported procedure | `unsupported-analysis-procedure` | 3 | -| Nonzero base/prescribed BC | `unsupported-eigen-boundary` | 3 | -| Model-affecting exclusion / unsupported element | `unsupported-keyword` / `unsupported-element-formulation` / `unsupported-mixed-element-model` | 3 | -| Invalid geometry/section/material | 기존 model code; mass27-point invalid는 `invalid-shell-mass-geometry` | 4 | -| Global finite n=0 / N>n | `empty-eigenproblem` / `insufficient-finite-modes` | 4 | -| Analytic/null/positive mass or conditioning 실패 | `invalid-eigen-mass-space` / `eigen-mass-conditioning` | 5 | -| Index/storage/allocation/FEAST/count/budget/negative/validation 실패 | [M2 diagnostic mapping](io-mapping.md#m2-backend와-failure-lifecycle) | 5 | -| Candidate/write/close/self-check/replace/log/lock 실패 | 기존 output category와 [M2](io-mapping.md#m2-backend와-failure-lifecycle) | 6 | - -`NaN/Inf` rho는 nonfinite model value(4)로 분류하고 그 외 malformed token은 syntax(3)다. -같은 실패를 여러 code로 중복 보고하지 않고 첫 발견 원인을 유지한다. Fatal 뒤 solve/commit을 -실행하지 않는다. CLI usage2/success0과 stderr format은 기존 공통 계약을 유지한다. - -## 공개 근거와 적용 한계 - -2026-09-06 공식 Abaqus 2025 문서를 `web.open`으로 확인했다. 사실은 syntax/외부 의미이고, -위 exact subset/default/warning policy는 승인된 FESA 요구에 대한 I/O mapping이다. - -| Source | Locator와 사용 | -| --- | --- | -| [DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm) | Data lines 1~2와 optional dependencies; constant rho 및 ML^-3 차원. 온도·distribution 지원은 포함하지 않음 | -| [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm) | Optional parameters와 Lanczos data line 1~7. Source defaults·bounds/shift 공란을 구분; FESA Lanczos 내부 동작의 근거가 아님 | -| [STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm) | NAME/NLGEOM/PERTURBATION. 선행 history 전달은 제외 | -| [RESTART](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-restart.htm) | WRITE/FREQUENCY=0 및 no-data. Restart 지원을 주장하지 않음 | -| [OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-output.htm) | Output selection root | -| [NODE OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-nodeoutput.htm) | FIELD와 VARIABLE=PRESELECT | -| [ENERGY OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-energyoutput.htm) | HISTORY와 VARIABLE=ALL; 새 modal energy output 요청으로 확대하지 않음 | -| [Input Syntax Rules](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-inputsyntax.htm) | Keyword/data/256-byte/continuation convention; FESA bounded 차이와 기존 정책은 I1이 권위 | - -질량 정식화·private parser/model·solution algorithm·ODB internals의 동등성을 추론하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/io-mapping.md b/docs/mitc4-shell-feast-eigen/io-mapping.md deleted file mode 100644 index 92ea2b2..0000000 --- a/docs/mitc4-shell-feast-eigen/io-mapping.md +++ /dev/null @@ -1,234 +0,0 @@ -# MITC4 eigen 책임·실패·비교 대응 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `io-definition-agent` -- Input contract revision: `r2` -- 기본 보고서: [io.md](io.md) -- 입력 원본: [io-input.md](io-input.md); 영속 schema 원본: [io-schema.md](io-schema.md) - -## M1. Input에서 equation/result까지 - -아래는 implementation-neutral 책임 계약이며 정확한 C++ 타입/파일 분해는 Planning 소유다. -현행 [Domain](../../include/fesa/model/domain.h), -[model records](../../include/fesa/model/model_types.h), -[syntax records](../../include/fesa/io/abaqus/input_syntax.h), -[AnalysisModel](../../include/fesa/analysis/analysis_model.h)의 수명·의존성을 따른다. - -| 경계 | 소유·전달할 최소 의미 | 금지되는 의미 혼합 | -| --- | --- | --- | -| Input adapter | 원본 path/content identity, keyword/parameter/data raw text와 line; validated density/step/options/count, unresolved targets | TXT row수로 N 생성, source enum으로 actual backend 변경 | -| Domain | Topology/source instance/labels, E/nu, section/t, optional material rho, initial director/frame, 유일 frequency 정의와 resolved homogeneous BC, warnings/provenance | Mutable mode/equation/vendor handle 소유 | -| Frequency definition | Raw/canonical source step, source option presence/effective values, count data N, source locations, procedure=linear-frequency | Static increment/time/frame state를 frequency count에 재사용 | -| AnalysisModel | Domain lifetime 아래 활성 shells/materials/sections/BC/frequency 정의의 const non-owning view | Domain copy 또는 새로운 geometry/material ownership | -| DofManager | Source node×UX/UY/UZ/URX/URY/URZ, full/free/constrained injection과 stable equation indices, scatter/sparse pattern | Element/Node 내부에 equation ID 저장 | -| Element/assembly | M1~M10 consistent/moments snapshot→nodal lumped blocks, r2 K contribution, source ordered reduction. 같은 source scatter와 실제 BC | Global scalar row lumping, artificial drilling mass, source S4R의 별도 kernel | -| Eigen procedure | Candidate workspace/state, [E1~E8](formulation-eigen.md) 순서, analytic rank/positive/null projection, whitening, actual FEAST, all-c validation, N개 global 복원/결과와 commit | 기존 LinearStaticAnalysis::Run에 eigen lifecycle 누적, pretrained/preloaded state, static reaction/modal stress 복구 | -| Private backend | C5/C6 controls, checked CSR/index conversion, vendor resources/thread guard, actual values/vectors/count/status와 call history | MKL_INT/HDF5/Win32 types 또는 vendor headers를 public solver core에 노출 | -| Result/Output adapter | Validated source/global modal pair와 O1~O5 serialization/self-check/replacement | Near-zero clamp, physical 수치 또는 identity 재계산으로 실패 은폐 | - -Density/property lookup은 element마다 확정된 material identity를 사용한다. Consistent 원본을 -lumped 저장으로 덮어쓰지 않고 element-wise snapshot+moments로 검사 가능하게 한다. -Full dense global MC나 일반 dense Schur는 필수가 아니다. 실제 global BC를 먼저 적용하고 -director null은 [E2](formulation-eigen.md#e2-nullpositive-basis를-node마다-결정)의 exact intersection으로만 -결정한다. Tiny positive mass는 정식화/NR conditioning 실패이며 input 지원에서 제거하지 않는다. - -Source `(instance_name, numeric label)`과 raw label spelling은 전체 경로에서 보존한다. -Internal row order는 기존 identity-instance expansion/declaration order이며 DOF order는 고정이다. -Renumbering은 geometry/connectivity/BC를 같이 대응하여 검사한다. 숫자가 우연히 같은 -source label/internal ID/equation ID를 비교키로 대체하지 않는다. 새로운 source order의 결과를 -행 위치끼리 비교하거나 repeated eigenspace의 특정 vector 방향을 동일하다고 요구하지 않는다. - -Accepted eigen state는 input/source step identity, N개의 paired raw scalar/global vector, -source mapping 및 전체 c의 validation/call evidence만 소유한다. Domain·AnalysisModel·DOF -정의와 수명 관계를 복사로 숨기지 않는다. Persistent N vectors로 같은 입력의 K/ML를 -재조립해 constraint/normalization/원 residual을 다시 검사할 수 있어 REQ-018을 충족한다. -반복군의 개별 벡터 비유일성과 외부 mode-shape 비교 제외는 유지한다. - -## M2. Backend와 failure lifecycle - -FEAST fpm/interval/seed/thread/storage와 내부 수치 한계의 유일 원본은 -[NR C1~C6](numerical-review-controls.md)다. I/O나 CLI에서 parameter override를 만들지 않는다. -Source N, reduced finite dimension n, prefix count, allocated m0, returned m, validated c, -public N을 각각 유지한다. 전체 c eigenpairs의 full original free residual/ML Gram/energy 및 -endpoint/count consistency 뒤 첫 N개만 선택한다. Wrong mass·count·residual을 tolerance나 -다른 solver로 우회하지 않는다. - -| Failure | Code / exit5 | 보존할 context | -| --- | --- | --- | -| Checked CSR/index/capacity 산술 실패 | `eigen-index-overflow` 또는 `invalid-eigen-csr` | n/nnz/N/m0, 실패한 bound와 stage | -| Allocation 실패 | `eigen-allocation-failed` | allocation 역할·checked requested bytes; N 축소 없음 | -| FEAST non-success / forbidden retry | `eigen-feast-failed` | raw info, count/solve kind, interval/m0, C5 허용 재시도 여부 | -| Count/returned m/monotonicity·endpoint mismatch | `eigen-count-inconsistent` 또는 `eigen-endpoint-separation` | actual count history와 마지막 certified bracket | -| 유한 budget 소진 | `eigen-search-budget-exhausted` | count/solve attempts·마지막 valid bracket; optimization fallback 가능 여부는 C5 그대로 | -| Significant negative spectrum | `negative-eigenvalue-spectrum` | raw lambda/mu/s, mode rank, C3 threshold | -| Nonfinite/underflow conversion 또는 invalid frequency | `invalid-eigenvalue-result` | raw scalar·stage·source step | -| Raw pair/Gram/원 free residual/energy 검증 실패 | `eigenpair-validation-failed` | metric name, observed value, C3 limit, solver column/rank; failed raw values를 accepted result에 넣지 않음 | - -위 code는 기존 FailureCategory::kSolver로 전달하며 새로운 exit category를 추가하지 않는다. -Model/preflight 오류는 [I6](io-input.md#i6-fail-closed-validation과-diagnostics)를 따른다. -Eigen backend failure의 returned Status는 실패까지의 call history를 message에 round-trip -decimal/ordinal 순으로 포함한다. 한 leading fatal diagnostic에 history를 부속하고 성공 count -call에 fictitious error severity를 붙이지 않는다. CLI는 기존 ordered stderr diagnostic 경로로 -반환하며 caller는 Status에서 evidence를 읽을 수 있다. Allocation failure 시 추가 문자열 -allocation을 보장할 수 없는 한계는 기존 best-effort stderr 범위를 따른다. - -Public CLI는 기존 `fesa.exe `뿐이다. Output override 부재, `.inp` lexical -stem/대소문자/여러 dot/path 규칙, same-derived-pair nonblocking exclusive lock와 usage2는 -[공통 lifecycle §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 유지한다. - -1. CLI usage validation→lexical output pair→exclusive ownership 뒤 `_log.txt`를 - open/truncate한다. Non-Newton eigen은 log에 Newton iteration/FEAST 행을 만들지 않는다. - 정상 log는 기존 계약대로 zero-byte다. Log open/close failure는 output exit6다. -2. Input/model/eigen solve와 all-c validation은 candidate에 수행한다. Existing accepted - state와 final HDF5는 건드리지 않는다. Controlled failure는 기존 state와 final hash를 보존한다. -3. Successful candidate를 준비하고 log close 성공을 확인한다. 같은 directory에 exclusive-create - private HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다. -4. Final replacement가 성공한 뒤 **이미 준비된 state의 no-fail swap**을 수행한다. - Swap에 allocation/validation/fallible callback을 남겨 두지 않는다. 순서는 [E8](formulation-eigen.md#e8-mode-identity-normalization과-상태)다. -5. Write/flush/close/reopen/self-check/replace 실패는 exit6이며 이전 final/state를 보존한다. - Failed candidate는 authoritative가 아니다. 정리는 best effort이고 다른 run의 파일을 지우지 않는다. - Current log는 rollback하지 않는다. 잠금 실패는 log/final도 변경하지 않는다. - -과거 final이 없으면 controlled failure 후 final도 생성하지 않는다. Directory collision, -nonregular destination, lock/replacement refusal는 성공으로 처리하지 않는다. Process crash나 -power-loss 전체 원자성을 약속하지 않는다. Reference artifact는 읽기 전용이며 solver의 -새 HDF5/log는 별도 generated output이다. Reference 원본을 덮어쓸 output path는 없다. - -## M3. 원본 TXT grammar와 deterministic Value projection - -Case `shellNL-eigen-meshfine`의 input/TXT 경로·hash와 logical quantity/family 원본은 -[reference-model](reference-model.md)이다. TMP/CSV 변환·filename alias·추가 provenance 파일을 -reference readiness 조건으로 만들지 않는다. TXT에는 source step이 없으므로 **지정 input의 -유일한 source frequency step Step-2**를 연결한다. ODB storage frame index는 추정하지 않는다. - -각 LF/CRLF logical line에서 공백-only 행만 생략한다. 모든 다른 행은 아래 full-match다. -`ws`는 ASCII space/tab 0개 이상, `ws1`은 1개 이상이며 literal의 대소문자는 정확하다. - -```text -number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)? -id := [0-9]+ # positive checked decimal integer -row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number - ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws -``` - -Header/footer, BOM, comment, 잘못된 Value/Freq label·추가 token·malformed number는 schema -failure다. `Value`는 finite binary64로 full conversion하고 overflow/underflow parsing error를 -거부한다. NaN/Inf spelling은 grammar부터 실패한다. `Freq`는 숫자 token 구조만 검사하고 -수치 변환/물리 일치/오차 비교에 사용하지 않는다. 반올림된 Freq로 Value를 재계산하지 않는다. -같은 숫자의 다른 mode ID는 정상이며 같은 numeric ID의 재등장은 duplicate다. - -다음 순서를 tolerance 전에 완료한다. - -1. 지정 input/TXT와 O1 eigen HDF5의 존재·source_input_identity·procedure/schema/unit/mass/ - actual backend를 검사한다. `mass_variant=derived-lumped`, `mass_origin=consistent-moment-row-sum`, - normalization mass 및 runtime FEAST metadata가 필수다. 다른 mass의 좋은 오차를 선택하지 않는다. -2. Input의 유일 source step/N=10을 직접 확인하고 HDF5 source name/요청수/공개수에 대응한다. - TXT row count에서 N을 추정하거나 HDF5 내부 c를 공개 모드 수로 사용하지 않는다. -3. TXT 모든 nonempty row를 먼저 parse하면서 duplicate를 검사한다. Dictionary overwrite - 또는 malformed-row skip은 금지다. Required identity는 양쪽 모두 정확히 mode1..10이다. -4. HDF5 `modes`의 field/type/shape/단위/순서와 모든 eigenvalue의 finiteness를 확인한다. - Wrong quantity/mass/schema·missing/extra/duplicate/nonfinite를 먼저 실패시킨다. -5. 유일 source key로 join한 뒤 mode ID ascending으로 projection한다. TXT 행 재배열은 - 허용하지만 HDF5 sort contract 위반은 reader가 재정렬하여 숨기지 않는다. - -Projection row는 -`(case_id,source_step_name,mode_id,component=Value,reference_value,fesa_value)`다. -FESA value는 `/steps/Step-1/eigen/modes.eigenvalue`만 사용한다. Diagnostic all-c table, -frequencies/vectors 또는 static fields를 fallback으로 읽지 않는다. 현재 component는 scalar -eigenvalue=`omega^2`, `time^-2`, coordinates=`scalar`, impact=`blocking`이다. - -## M4. 판정·보고와 기존 static의 역할 - -Family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue,dimension=time^-2, -coordinates=scalar,impact=blocking)`다. **10개의 singleton family**에 -[common-reference-tolerance](../TOLERANCE.md)를 그대로 적용한다. 각 family의 -`S=max|r|`, `B=0.01S`, near-zero inclusive row branch 또는 5% relative row branch와 -1% relative RMS를 모두 계산한다. 현재 양수 singleton은 실효 mode별1%다. -S=0이면 exact-zero FESA만 성공이며 불일치는 `zero-reference-scale-nonzero-error`다. -Source modal frame이 다르면 한 table에 저장되어도 family를 합치지 않는다. - -Comparator report는 input/reference/result identity와 freshness evidence, prechecks, -family/source key/component/count/S, raw r/f/error, 적용 branch·row verdict, RMS/verdict, -blocking failure와 전체 verdict를 mode order로 남긴다. Undefined zero-scale metric은 named -state로 표현하고 NaN/Inf나 absolute floor를 넣지 않는다. CSV view가 필요하면 이 projection을 -HDF5에서 추출한 보조 artifact라고 표시하며 공식 output/원본 reference를 대체하지 않는다. - -기존 static의 r2 재검증은 [Requirement portfolio](requirements-evidence.md#필수-회귀-포트폴리오와-identity), -[NR C7](numerical-review-controls.md#c7-승인된-정적-회귀-기준), [C26](numerical-review-cases.md)을 따른다. -기존 linear source node/static frame와 nonlinear factor-one accepted-state identity를 유지한다. -U1/U2/U3 length/global blocking, UR1/UR2/UR3 rotation warning-only는 기존 common families다. -Nonlinear RF1/RF2/RF3·physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 -유지하는 review-only다. RM3/stress와 eigen vector는 새 external gate가 아니다. -Internal force/moment equilibrium은 별도의 blocking physical evidence다. -`shellnl-meshfine-02-s4-final`의 별도 post-closure 역할도 유지한다. -과거 cache/static 수치를 새 binary의 fresh solve로 표시해서는 안 된다. - -## M5. 구현·test obligations와 requirement 연결 - -아래 표의 `nn` 등 fixture 수를 제외한 threshold는 [NR cases/controls](numerical-review-cases.md)의 -원본을 사용한다. Parser/mapper/schema/comparator의 실제 tests는 Planning/Implementation 소유다. - -| Obligation ID | 필수 positive/negative 검증 | NR cases | -| --- | --- | --- | -| IO-T01 | 원본 unchanged input의 729 nodes/676 S4, source Step-2/N10, rho2700/t0.5, source options/no-op warnings와 실제 FEAST 선택. S4R source-only 변경도 같은 semantic physical path | MFE-C23 | -| IO-T02 | 두 material·두께의 element-section-density 연결, missing/duplicate/unresolved/0/negative/NaN/Inf/temperature/dependencies/extra row·field, section/geometry/27-point invalid 거부; static density 부재 허용 | MFE-C06, MFE-C07, MFE-C23, MFE-C26 | -| IO-T03 | N의 blank/0/negative/fraction/overflow, fields2~7에 nonempty0, eighth empty field, duplicate parameter, unsupported enums/procedure/preload/load/damping/acoustic/mixed/非영 BC 거부 | MFE-C07, MFE-C13, MFE-C23 | -| IO-T04 | Source labels/instance/set renumbering·중복/모호함, partial rotations/fullfree/fullclamp/drill-only/fully constrained source mask 복원; tiny nonzero director rank 보존·conditioning 실패, n0/N>n 명시 실패 | MFE-C06, MFE-C13, MFE-C14, MFE-C24 | -| IO-T05 | O1~O5 schema round-trip, input byte identity, N/c/source step/rank/units/actual backend/mass pairing, N vectors의 원 residual·normalization 재현. Near-zero positive/negative/exact0/±threshold 및 lambda conversion 경계 | MFE-C16, MFE-C19, MFE-C24 | -| IO-T06 | Invalid index/CSR/SPD/parameter/capacity/count/endpoint/NaN/Gram/residual/budget; actual FEAST known zero/repeated/cluster cases의 all-c history와 returned-N 분리. Output diagnostic unavailable와 raw λ 보존 | MFE-C17, MFE-C18, MFE-C19, MFE-C21, MFE-C22 | -| IO-T07 | 이전 accepted state/final hash를 준비하고 solve/validation/log/lock/write/flush/close/reopen/self-check/replace 실패를 각각 주입. 처음 실행의 실패에서 final 미생성. 성공 final 후 no-fail state swap | MFE-C24 | -| IO-T08 | TXT reorder/equal Value distinct modes 허용. Missing/extra/duplicate/nonfinite/malformed/wrong field/step/quantity/units/mass/backend/schema 실패를 tolerance 전에 확인. Freq 변화가 Value 판정을 바꾸지 않음 | MFE-C25 | -| IO-T09 | 공통 policy의 inclusive 1% RMS·5% row 경계와 양옆, generic near-zero \|r\|=B 경계·zero-scale 양성/음성. Singleton이므로5% row pass라도1% RMS fail임을 확인 | MFE-C25 | -| IO-T10 | Density 없는 기존 linear/nonlinear input·model/static output reader 불변, r2 scale 영향 portfolio를 fresh binary로 재검증. Mode-shape reference 미요구 | MFE-C26, MFE-C27 | -| IO-T11 | 세 반복의 exact sparse/row/diagnostic order 및 scalar/projector C4 기준. RED→observed failure→GREEN→focused/full MSVC x64 Debug 검증·새 warning 없음·fresh reference identity/hash | MFE-C27 | - -Coverage ID 접두사는 모두 `FEM-REQ-MITC4-EIGEN-`다. 아래 표는 requirement 원문을 대체하지 -않고 I/O의 기여와 다른 owner evidence를 구분한다. - -| Requirement suffix | I/O 연결·verification obligation | -| --- | --- | -| 001 | I2/I4/M1; IO-T01/T03 | -| 002 | I2/O2 source type와 r2 stabilization identity; IO-T01/T10; physical kernel C01/C08/C12는 해당 owner | -| 003 | I3/O2 densities; IO-T02 | -| 004 | I2/I6/M1; IO-T02; geometry oracle C01/C02는 NR 원본 | -| 005 | M1 consistent snapshot 의미, O2 mass_origin; C01~03 구현 evidence | -| 006 | M1/O4 node rank와 restored vector; IO-T04; inertia/null C01/C03/C11 | -| 007 | M1 source/DOF/reduction ordering; IO-T04/T11 | -| 008 | M1/O4 analytic counts/conditioning, M2; IO-T04/T05; C15 spectrum oracle | -| 009 | I4/O2 N·n·c/O3 rank; IO-T03/T04/T06 | -| 010 | O3 stable paired sort/cluster identity, M3 join; IO-T05/T08/T11 | -| 011 | I4/O2/M2 actual mass/backend discriminant; IO-T01/T05/T06 | -| 012 | I6/M2/O4 validity and bounded failure; IO-T06/T07 | -| 013 | O3 vectors/O4 all-c metrics; IO-T05/T06; C11/C16~18 independent evidence | -| 014 | M1 units/source transformation/O3 replay; IO-T04/T05; C01~05/C08/C11/C20 physics | -| 015 | I4/I5/O2 source_records; IO-T01/T03 | -| 016 | I2~I6/M2; IO-T02/T03/T06 | -| 017 | O1~O5/M3 authoritative additive schema; IO-T05/T08 | -| 018 | M1/O3 persistent N vectors/source replay; IO-T04/T05; external shapes 제외 | -| 019 | M2 candidate/commit/log lifecycle; IO-T07 | -| 020 | M3/M4 Value-only + 별도 static policy; IO-T08/T10 | -| 021 | O5/M3 full prechecks; IO-T08 | -| 022 | M4 공통 family/policy/report; IO-T09 | -| 023 | IO-T11; 실행 계획/RED/GREEN/full 증거는 Planning/Implementation 소유 | -| 024 | I3/M4 existing static compatibility/portfolio; IO-T10/T11 | -| 025 | M5 coverage + 동일 r2 handoff; Physics/Release closure 소유권 유지 | -| 026 | M1 consistent→lumped/O2 mass_origin; C01~05 independent mass evidence | -| 027 | O2 stabilization_rule/M4 static 역할; IO-T10; C08~12/C26 물리 검증 | - -## 정적 감사 evidence - -실제 조사 명령은 `Get-Content`, `rg --files`, scoped `rg -n`, `web.open`이었다. -입력 keyword inventory와 TXT 10개 행을 읽었고 numerical quantity/formulation 계산을 -재실행하지 않았다. 한 번의 `rg docs/shell-surface-pressure/io*.md`는 잘못된 directory/glob로 -exit1이었고 `rg --files docs`로 실제 `docs/shell-surface-pressure-load/io.md`를 확인해 -읽기 전용 대조를 완료했다(exit0). 이 검색 오류는 feature numerical failure가 아니다. - -최종 감사 `python -B -` here-script는 exit0으로 owned4 metadata/66개 relative links/ -requirement suffix1..27, reference10 rows/full grammar/finite Value/ID1..10 및 두 원본 SHA-256 -일치를 확인했다. `git diff --check -- docs/mitc4-shell-feast-eigen/io.md -docs/mitc4-shell-feast-eigen/io-input.md docs/mitc4-shell-feast-eigen/io-schema.md -docs/mitc4-shell-feast-eigen/io-mapping.md`도 exit0이었다. 아직 untracked인 owned 문서는 -별도 Python whitespace/Markdown table 검사로 확인하며 diff만으로 내용 검증했다고 하지 않는다. -실제 final audit 결과와 owned hashes는 I/O handoff에 보고한다. -이는 문서·원본 inventory 검증이며 parser/comparator 구현 test 또는 실제 수치 비교가 아니다. -CMake/CTest/Harness/FEAST/외부 solver는 이 문서 단계에서 실행하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/io-schema.md b/docs/mitc4-shell-feast-eigen/io-schema.md deleted file mode 100644 index 3fe47fa..0000000 --- a/docs/mitc4-shell-feast-eigen/io-schema.md +++ /dev/null @@ -1,219 +0,0 @@ -# MITC4 eigen authoritative HDF5 schema - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `io-definition-agent` -- Input contract revision: `r2` -- 기본 보고서: [io.md](io.md) -- 수학: [E1~E8](formulation-eigen.md), [V1~V6](formulation-verification.md) -- Numerical authority: [C1~C6](numerical-review-controls.md) - -## O1. Container, version과 공통 규칙 - -공식 결과는 input lexical sibling `_results.h5`다. 기존 linear schema0와 nonlinear -schema1은 각각의 [현행 static 계약](../shell-surface-pressure-load/io.md#71-version-and-filename-decision)을 -유지한다. Eigen은 기존 shell model container에 새 procedure를 추가하며 discriminant는 -`(schema_version=0, feature_id=mitc4-shell-feast-eigen, analysis_procedure=linear-frequency, -eigen_schema_version=1)`이다. `eigen_schema_version`은 새 procedure 전용 revision이다. -Static reader가 schema_version만 보고 eigen을 static으로 해석해서는 안 된다. -기존 static 파일에 새 eigen mandatory fields를 요구하거나 재작성/migration하지 않는다. -앞으로 unknown additive optional field는 무시할 수 있지만 known field의 type/의미 변경, -unknown procedure 또는 eigen_schema_version은 reader의 명시적 unsupported schema 실패다. - -Float는 `H5T_IEEE_F64LE`, unsigned/signed integer는 명시된 `H5T_STD_U{8,64}LE`/ -`H5T_STD_I64LE`, string은 variable-length UTF-8이다. Compound field의 byte offset/padding은 -private이며 field name/type/array extent가 authoritative다. Shape의 `nn,ne,nmat`는 model -node/element/material 수, `N`은 입력 요청, `c`는 최종 solve의 전체 검증 column 수, -`Lcalls`는 모든 actual FEAST calls 수다. 모든 shape/capacity는 checked integer다. - -새 numeric dataset의 required attrs는 `schema_version=0`, `eigen_schema_version=1`, -`component_names`, `component_unit_dimensions`, `coordinate_system`, `location`이다. -Compound에서 component attrs는 수치 quantity fields만 table의 명시 순서로 나열하고 -identity/flag/counter는 schema 정의를 따른다. 새 modal result에는 추가로 -`step_name=Step-1`, `source_step_name=`, `domain=mode`를 기록한다. -Tokenized dimension은 아래 `mass`, `length`, `time`를 사용하며 SI label을 붙이지 않는다. -모든 mandatory physical/검증 real 값은 finite다. Optional backend diagnostic의 -unavailable는 O4의 명시적 validity flag만 사용한다. NaN payload를 공개하지 않는다. - -## O2. Metadata, 모델과 source 요청 - -`/metadata`의 아래 attributes는 mandatory다. - -| Attribute | Type / 값 | -| --- | --- | -| `schema_version`, `eigen_schema_version` | uint64 `0`, `1` | -| `feature_id`, `analysis_procedure` | UTF-8 `mitc4-shell-feast-eigen`, `linear-frequency` | -| `solver_version` | 실제 실행 binary의 기존 version string | -| `source_input_identity` | 기존 `path=;content_identity=fnv1a64:<16 lower hex>`; parser가 실제 읽은 원본 bytes 기준 | -| `unit_system_label` | `user-consistent-unspecified` | -| `coordinate_convention` | `global-cartesian; shell-local=initial-reference; positive-thickness=+zeta` | -| `internal_formulation` | `FESA-MITC4` | -| `integration_rule`, `mass_integration_rule` | `2x2x2-gauss; mitc4-edge-midpoint-shear`, `3x3x3-gauss` | -| `stabilization_rule` | `initial-physical-rotary-trace-mean-r2` | -| `step_name`, `source_step_name`, `frame_indexing` | `Step-1`, raw input name(현재 Step-2), `mode-rank-one-based` | -| `mass_variant`, `mass_origin`, `normalization` | `derived-lumped`, `consistent-moment-row-sum`, `mass` | -| `eigensolver_backend`, `eigensolver_routine` | `MKL FEAST`, `dfeast_scsrgv` | -| `backend_problem` | `scaled-whitened-lumped-with-identity-mass` | -| `numerical_contract` | `mitc4-shell-feast-eigen:r2` | - -Source identity는 [현재 writer primitive](../../src/fesa/io/hdf5/hdf5_primitives.cpp)의 byte -identity와 동일하다. SHA-256 reference audit와 FNV source identity는 다른 목적이다. -Filename만으로 동일 input이라고 간주하지 않는다. Comparator는 실제 지정 input bytes의 -content identity와 lexical input path를 metadata에 대조한다. - -| Dataset | Shape/type와 fields | Identity·단위·ordering | -| --- | --- | --- | -| `/model/nodes` | `[nn]` 기존 compound: `internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3]` | Internal ID 0..nn-1, 기존 instance expansion/declaration order; coordinates length, global-cartesian | -| `/model/elements` | `[ne]` 기존 shell compound: `internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64` | Internal ID order; source S4/S4R 구별; formulation FESA-MITC4 | -| `/model/shell/materials` | `[nmat]` 기존 compound: `internal_material_id:u64,name:utf8,E:f64,nu:f64` | Declaration order; E force/length^2, nu1. 기존 field에 rho를 끼워 넣지 않음 | -| `/model/shell/sections` | 기존 compound: `internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64` | Declaration order, thickness length, centered-single-layer | -| `/model/shell/nodal_director`, `/model/shell/nodal_frame` | `[nn,3]`, `[nn,3,3]` f64 | 기존 source node rows; D components, frame axes A/B/D×global X/Y/Z, dimension1 | -| `/model/nodal_constraint_mask` | `[nn,6]` u8 | Existing DOF order UX,UY,UZ,URX,URY,URZ; free0/constrained1 | -| `/model/prescribed_displacement` | `[nn,6]` f64 | 같은 DOF order, 모든 값 exact0; units length×3,radian×3 | -| `/model/shell/densities` | `[density_count]` 새 compound: `material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64` | Material ID ascending, rho mass/length^3, location model-material; declared density별 한 row, 활성 material 모두 존재 | -| `/model/eigen/source_records` | `[record_count]` compound: `ordinal:u64,source_line:u64,keyword:utf8,physical_text:utf8` | 아래 source provenance 대상의 실제 physical line 순서, ordinal0부터 | -| `/diagnostics` | `[diagnostic_count]` 기존 compound: `severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8` | 기존 SortDiagnostics 순서. 성공 파일에는 warning만 존재 | - -공통 model dataset의 기존 attrs는 [linear model schema](../linear-static-mitc4-shell/io.md)와 -[현재 writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)를 따른다. Eigen-specific attrs는 -새 dataset에만 필수이며 기존 static dataset type/attrs를 바꾸지 않는다. -기존 model-only midsurface_locations/section_positions를 공유 writer가 추가 저장해도 허용하나 -eigen result/acceptance quantity는 아니며 eigen의 mandatory replay dataset이 아니다. - -`source_records` 대상은 STEP, FREQUENCY(그 count data 포함), DENSITY(data 포함), I5 -no-op keyword와 그 parameter-continuation physical lines다. Comments는 포함하지 않는다. -`keyword`는 canonical parent keyword이고 `physical_text`는 CR/LF를 제거한 원문이다. -Frequency 선언 유무·blank slot 수·raw values를 여기서 보존한다. 물리 domain의 기준은 -validated semantic fields이며 output consumer가 raw text를 다시 실행하지 않는다. - -`/steps/Step-1` group attrs는 아래와 같다. Canonical group명과 source name을 구분한다. - -| Attribute | Type / 의미 | -| --- | --- | -| `source_step_name`, `source_step_name_canonical` | utf8 raw name / ASCII uppercase key | -| `step_source_line`, `frequency_source_line`, `frequency_data_line` | u64 실제 source1-based line | -| `source_nlgeom`, `source_perturbation_present` | u8 effective NO=0 / explicit flag 유무0 또는1 | -| `source_eigensolver`, `source_sim`, `source_acoustic_coupling`, `source_normalization` | utf8 effective `LANCZOS,YES,ON,MASS`; explicit/omitted는 source_records에서 구분 | -| `requested_mode_count`, `returned_mode_count` | u64 N,N; table row수로 입력 N을 덮어쓰지 않음 | -| `full_dof_count`, `free_dof_count`, `mass_null_dimension`, `finite_dimension` | u64 6nn,nf,nz,n, nf=n+nz | -| `validated_eigenpair_count` | u64 c, N<=c<=n; publicly returned mode 수와 구별 | - -## O3. 고유치와 modal vectors - -Path prefix는 `/steps/Step-1/eigen`이다. `modes`만 공개 eigenvalue row authority다. - -| Relative dataset | Shape/type/fields | 의미·attrs | -| --- | --- | --- | -| `modes` | `[N]` compound `mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64` | Row k는 mode_id=k+1; quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame | -| `frequencies` | `[Nv]` compound `mode_id:u64,frequency:f64` | 정확히 lambda>=0인 modes의 ID subset, mode ID ascending. quantity=cycle-frequency, component_names=Freq, dimension=time^-1, scalar/modal-frame; mandatory dataset이며 Nv=0도 유효 | -| `vectors` | `[N,nn,6]` f64 | mode axis는 modes와 동일, node axis는 model/nodes, component_names=UX,UY,UZ,URX,URY,URZ; global-cartesian, location=nodal-modal-vector | - -`vectors.component_unit_dimensions`는 `mass^-1/2` 세 개와 `mass^-1/2*length^-1` 세 개다. -추가 attrs `normalization=mass`, `amplitude_unit_dimension=mass^1/2*length`, -`mass_variant=derived-lumped`, `interpretation=normalized-mode-not-response-displacement`를 둔다. -각 node의 세 회전 성분은 initial global infinitesimal rotation coordinates다. Constrained -component는 exact0이며 source node label을 internal/equation index로 바꾸지 않는다. -기존 `/nodal/displacement`, reaction, stress, nonlinear accepted_frames를 modal 결과로 생성하지 않는다. -Full matrices/consistent matrix/modal stress를 영속 mandatory output으로 추가하지 않는다. - -Raw lambda의 오름차순 stable paired sort와 exact tie의 original FEAST column 순서를 따른다. -Sign은 [C4](numerical-review-controls.md#c4-repeated-subspace와-결정론)대로 largest absolute -scaled global component(translation/ell,rotation)의 양수, tie는 source DOF 순서다. -여기서 source DOF 순서는 model/nodes의 stable row order×정해진 component order다. -Cluster는 전체 c sorted columns에서 C4의 connected rule로 1부터 매기고 첫 N개에 같은 ID를 -투영한다. Cluster ID는 진단용이며 값을 평균하거나 결과 multiplicity를 줄이지 않는다. - -`operator_scale=s`는 O4에 저장한다. `mu=lambda/s`에서 `mu<-1e-9`는 성공 파일을 만들 수 -없는 negative spectrum failure다. `abs(mu)<=1e-9`이면 classification=0(`near-zero`), -그 외는 classification=1(`positive`)이다. Raw lambda와 부호를 그대로 기록하며 ±boundary는 -near-zero다. Frequency는 classification이 아닌 raw lambda 부호로 결정한다: -lambda>0이면 sqrt(lambda)/(2pi), lambda==0이면 exact0, lambda<0이면 row가 없다. -따라서 small positive near-zero에도 real frequency가 있고 small negative에는 없다. -Negative row의 부재 이유는 `frequencies@unavailable_rule=negative-raw-eigenvalue`로 명시한다. -Frequency overflow/양수의 underflow-to-zero도 파생 결과 실패로 처리한다. Mandatory lambda -및 mu→lambda conversion은 C3의 finite/underflow 조건을 그대로 따른다. - -## O4. Backend와 검증 evidence - -Prefix `/steps/Step-1/eigen/verification`의 attrs: - -| Attribute | Type / 의미 | -| --- | --- | -| `characteristic_length`, `operator_scale` | positive finite f64 ell[length], s[time^-2] | -| `eta_gram`, `max_eta_orth` | finite f64, 전체 c의 V3 Gram와 pairwise 최대 metric; c=1이면 max_eta_orth=0 | -| `eta_mz`, `eta_kz`, `eta_pz`, `null_checks_applicable` | f64×3 및 u8; nz=0이면 applicable0와 storage값0, N/A이지 수행 통과로 보고하지 않음 | -| `validation_scope`, `numerical_contract` | utf8 `all-computed-c-columns`, `mitc4-shell-feast-eigen:r2` | - -| Dataset | Fields / shape | 의미 | -| --- | --- | --- | -| `verification/nodal_reduction` | `[nn]` compound `free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64` | Source node row 대응; E2 analytic counts. Nonempty positive block에 rcond_available1, C2 cutoff 통과; 빈 block은0/0 storage. nf/nz/n과 합 일치 | -| `verification/eigenpair_checks` | `[c]` compound `sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64` | sorted_rank1..c, solver_column은 원 FEAST column0-based unique; 실제 ML의 V3/V4/C3 metrics. 첫 N ranks의 lambda는 modes와 exact equal | - -Nodal reduction의 quantity component는 `rcond_inf`, dimension1, coordinates=scalar, -location=nodal-mass-reduction이다. Eigenpair checks의 component_names는 표의 f64 fields -순서이고 dimensions는 eigenvalue와 rayleigh_quotient만 time^-2, 나머지는1이다. -Coordinates=scalar, location=eigenpair-verification이며 mandatory finite 검증량과 -optional backend_res의 validity를 구분한다. - -`eigenpair_checks`는 내부 count/검증 evidence다. c>N 진단행은 추가 공개 modal frame이 -아니며 comparator는 여기서 Value를 추출하지 않는다. c개 vector 전부는 검사 동안 유지하고 -accepted state에는 공개 N개 vector와 전체 c의 check evidence를 보존한다. 전체 c Gram의 -runtime/독립 검증은 C17/18 evidence로 확인하며 N개 persistent vectors만으로 full-c Gram를 -재검산했다고 주장하지 않는다. N개 원 residual/normalization은 model 데이터에서 K/ML를 -독립 재구성하여 재현할 수 있다. Consistent/lumped 독립 oracle는 NR cases의 내부 테스트다. - -Backend `res`가 0-eigenvalue의 상대분모 때문에 unavailable인 경우만 -backend_res_available0, backend_res storage0을 사용하고 dataset attr -`unavailable_reason=zero-eigenvalue-relative-residual`를 둔다. Available 값은 finite이고, -nonzero eigenvalue의 nonfinite backend diagnostic은 failure다. Storage0을 residual evidence0으로 -해석하지 않는다. mandatory eta_*는 모든 경우 자체 zero branch와 함께 finite다. - -Prefix `/steps/Step-1/eigen/backend` attrs는 `runtime_version:utf8`(실제 MKL query), -`integer_abi:utf8`(`LP64|ILP64` 실제 linked ABI), `thread_count:u64=1`, -`seed:u64=0x4D495443344D4645`, `count_calls:u64`, `solve_calls:u64`, -`final_count:u64=c`, `final_solve_ordinal:u64`, `selected_ranks:utf8=1..N`, -`enclosure_lower:f64`, `enclosure_upper:f64`, `solve_lower:f64`, `solve_upper:f64`다. -Bounds는 모두 dimensionless B-space이며 physical frequency bound가 아니다. - -| Relative dataset | Shape / fields | 의미 | -| --- | --- | --- | -| `calls` | `[Lcalls]` compound `ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64` | ordinal0-based 실제 call 순서; kind=count/solve, strict bounds, 실제 allocated capacity. Count의 overwritten m0와 solve의 m을 count로 구분 저장 | -| `fpm` | `[Lcalls,128]` i64 | 각 call 직전 feastinit 이후의 exact parameter snapshot; vendor type을 public core에 노출하지 않음 | - -`purpose`는 `total-enclosure`, `upper-prefix`, `lower-prefix`, `endpoint-guard`, -`final-prefix`, `final-interval`, `solve` 중 하나이며 실제 C5 단계에 대응한다. -Calls의 component_names는 `lower,upper,epsout`, dimensions는 `1,1,1`, -coordinates=scalar, location=backend-call이다. Fpm은 component_names=fpm, -dimension1, coordinates=none, location=backend-parameter이며 128개 C-index 순서다. -Calls의 unavailable output은 flag0+storage0이고 원인을 info로 해석한다. Undefined vendor -output을 읽거나 garbage를 저장하지 않는다. `info=0`이면 count_available1; 성공 solve는 -loop/epsout도 available1이고 epsout finite. 내부 허용 재시도의 실패 call도 삭제하지 않는다. -최종 성공과 C5 guard/prefix/total count 관계는 chronological calls/bounds로 재구성 가능해야 한다. -Allocated_m0와 input N은 독립이다. Effective fpm와 seed/budget은 C5/C6와 일치해야 한다. -Count-only res/epsout을 fabricated physical result로 사용하지 않는다. - -## O5. Self-check와 compatibility tests - -Writer는 candidate를 flush/close한 뒤 read-only reopen하여 type/field/shape/required attrs, -finite required values, enum/validity domains 및 다음 관계를 확인하고 검사용 handle도 닫는다. - -1. Source identity·input semantic snapshot이 writer 입력과 일치한다. Node/element/material IDs, - connectivity/section/material/density links가 unique/in-range이고 모든 활성 material rho>0이다. -2. Source step은 한 개이고 canonical Step-1과 raw name의 관계가 유일하다. Input N, - requested N, returned N, modes/vector row수가 같다. mode IDs는 정확히1..N이다. -3. Modes가 raw 오름차순이며 classification/cluster는 C3/C4 규칙과 맞는다. Frequencies의 - ID set은 lambda>=0 set과 exact equal이며 각 값은 candidate 파생값과 같고 finite다. -4. Vectors는 finite, source constraint component exact0, scalar/vector pair는 candidate와 - 일치한다. Selected vectors의 ML normalization/원 residual은 serializer 전 C3 gate에서 - 검증되었고 해당 metrics 및 read-back values를 대조한다. Serializer 자기복사를 독립 physics로 부르지 않는다. -5. `nf=n+nz`, node별 counts 합, N<=c<=n, 전체 c check rows와 solver-column uniqueness, - 첫 N lambda exact equality, modal_mass>0, 모든 적용 C2/C3 metric 한계가 맞는다. -6. Calls/fpm row수·ordinals·strict endpoints·finite available diagnostics, fpm controls, - counts/budgets(<=512 count, <=3 solve), final solve info0/returned m=c와 selected1..N이 맞는다. - 증거 없는 성공 bool 하나로 대체하지 않는다. -7. `/diagnostics`는 기존 compound `severity,code,file,line,keyword,entity_identity,message`를 - 유지하며 source order warnings를 저장한다. 성공 파일에 fatal error diagnostic은 없다. - -이 mandatory inventory는 reader version dispatch, round-trip, 누락/extra mode/duplicate ID, -nonfinite/wrong dimension/type/mass/backend/source, close/reopen/self-check failure tests의 기준이다. -Optional unknown dataset의 존재를 extra-mode로 오인하지 않는다. Static 파일은 기존 schema -inventory로 계속 검증하고, eigen reader는 static 또는 unknown eigen revision을 명시적으로 거부한다. diff --git a/docs/mitc4-shell-feast-eigen/io.md b/docs/mitc4-shell-feast-eigen/io.md index 469a5a2..0f5ddee 100644 --- a/docs/mitc4-shell-feast-eigen/io.md +++ b/docs/mitc4-shell-feast-eigen/io.md @@ -1,51 +1,59 @@ -# MITC4 mass와 FEAST I/O 계약 +# 이전 MFE 입력·결과·mapping 계약 + +이전 baseline의 계약 이력이다. 현재 입력·schema·controls는 [eigen2 I/O](../mitc4-shell-feast-eigen2/io.md#io)가 원본이다. + + + + +## MITC4 mass와 FEAST I/O 계약 - Feature ID: `mitc4-shell-feast-eigen` -- Owner: `io-definition-agent` - Input contract revision: `r2` - 요청 outcome: `pass`; 다음 owner: `implementation-planning-agent` - 의미: Stage 5 계약 검토 요청이며 workflow 전이·구현 완료 판정이 아니다. 지역 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), -[coordination](coordination.md)이다. [Requirements](requirements.md)와 -[승인 evidence](requirements-evidence.md), [research](research.md)/[상세 근거](research-evidence.md), -[formulation](formulation.md), [NR](numerical-review.md)/[독립 evidence](numerical-review-evidence.md), -[controls](numerical-review-controls.md), [cases](numerical-review-cases.md), +[coordination](development-notes.md#실패와-재발-방지)이다. [Requirements](requirements.md#requirements)와 +[승인 evidence](requirements.md#requirements-evidence), [research](research.md#research)/[상세 근거](research.md#research-evidence), +[formulation](formulation.md#formulation), [NR](numerical-review.md#numerical-review)/[독립 evidence](numerical-review.md#numerical-review-evidence), +[controls](numerical-review.md#numerical-review-controls), [cases](numerical-review.md#numerical-review-cases), [reference-model](reference-model.md)의 r2를 적용했다. [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md), [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)가 공통 기준이다. -## 핵심 계약 + +### 핵심 계약 -1. [입력·validation](io-input.md)은 constant material density, 원형상 단일 frequency step, +1. [입력·validation](io.md#io-input)은 constant material density, 원형상 단일 frequency step, 입력 requested N, homogeneous global BC와 원본의 부수 옵션을 고정한다. Source Lanczos/SIM과 actual FEAST를 구분한다. 기존 static은 density 없이 계속 동작한다. -2. [결과 schema](io-schema.md)는 기존 static schema를 보존하고 eigen procedure 전용 +2. [결과 schema](io.md#io-schema)는 기존 static schema를 보존하고 eigen procedure 전용 additive 계약을 정의한다. 공식 파일은 lexical sibling `_results.h5`이고, source step과 mode 1..N, raw lambda, actual lumped mass/backend 및 내부 검증 증거를 저장한다. N개 global modal vectors는 내부 검증 재현을 위해 mandatory다. -3. [책임·failure·comparison mapping](io-mapping.md)은 Domain/view/DOF/별도 eigen state의 +3. [책임·failure·comparison mapping](io.md#io-mapping)은 Domain/view/DOF/별도 eigen state의 경계, candidate commit, source identity, 원본 TXT의 Value-only projection과 27개 requirement 및 I/O test obligations를 연결한다. 외부 mode-shape gate는 없다. -`consistent -> derived lumped -> MKL FEAST` 및 [mass](formulation-mass.md), -[reduction/commit](formulation-eigen.md), [verification](formulation-verification.md), -[r2 stabilization](formulation-stabilization.md)의 수학을 변경하지 않는다. +`consistent -> derived lumped -> MKL FEAST` 및 [mass](formulation.md#formulation-mass), +[reduction/commit](formulation.md#formulation-eigen), [verification](formulation.md#formulation-verification), +[r2 stabilization](formulation.md#formulation-stabilization)의 수학을 변경하지 않는다. FEAST 수치 controls와 외부 10개 singleton family의 공통 판정도 그대로다. Routine field layout·새 procedure의 additive schema를 정의했으며 기존 public 계약의 비호환 변경 또는 새 사용자 결정은 발견하지 않았다. -## Evidence와 한계 + +### Evidence와 한계 `Get-Content`, scoped `rg`로 원본 input/TXT, 기존 linear/nonlinear/pressure I/O, 실제 syntax/model mapping, HDF5 writer, source identity 및 diagnostics 경계를 대조했다. 새 keyword 의미는 공식 Abaqus 2025 공개 문서를 확인했고 locator·적용 한계를 -[입력 출처](io-input.md#공개-근거와-적용-한계)에 기록했다. Abaqus는 외부 syntax/quantity +[입력 출처](io.md#io-input--공개-근거와-적용-한계)에 기록했다. Abaqus는 외부 syntax/quantity convention이며 내부 parser, mass, integration, stabilization 또는 ODB와 동등성을 주장하지 않는다. 정적 검증 명령·exit, owned metadata/links/coverage와 원본 inventory는 -[감사 evidence](io-mapping.md#정적-감사-evidence)에 기록한다. +[감사 evidence](io.md#io-mapping--정적-감사-evidence)에 기록한다. 새로 작성한 문서는 이 보고서와 `io-input.md`, `io-schema.md`, `io-mapping.md`뿐이다. Source/tests/build/phase/Hook/Git 및 upstream/reference는 수정하지 않았다. 문서 단계이므로 C++ build/test, Harness, 실제 FEAST, 외부 solver 및 FESA/reference @@ -54,5 +62,682 @@ Source/tests/build/phase/Hook/Git 및 upstream/reference는 수정하지 않았 Planning은 각 test obligation을 정확한 owned paths와 RED/GREEN/focused/full VERIFY에 연결하고, Implementation/Physics는 fresh eigen 결과 및 승인된 static 회귀를 검증해야 한다. Ill-conditioned positive mass의 명시적 실패, FEAST floating-point count/cluster 한계, -count scratch와 shifted factorization 비용은 [NR controls](numerical-review-controls.md)의 +count scratch와 shifted factorization 비용은 [NR controls](numerical-review.md#numerical-review-controls)의 잔여 위험이며 I/O가 cutoff·fallback·새 tolerance로 우회하지 않는다. + + + + +## MITC4 eigen 입력 subset과 진단 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [io.md](io.md#io) + + +### I1. 문법과 source identity + +기존 [linear shell I/O §1](../linear-static-mitc4-shell/io.md), +[현재 pressure I/O §3](../shell-surface-pressure-load/io.md)의 공통 lexical 계약을 재사용한다. +현재 [input reader](../../src/fesa/io/abaqus/input_reader.cpp)와 +[mapping context](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 읽기 전용 대조했다. +예전 nonlinear 문서의 continuation 미지원 설명보다 후속 승인된 pressure lexical 규칙이 우선한다. + +- CRLF/LF를 수용한다. Physical line은 종결자를 제외해 최대 256 ASCII bytes이며 printable + ASCII와 horizontal tab만 허용한다. `**` comment와 blank line은 semantic effect가 없다. + Inline comment, data continuation, include, substitution, quoted/escaped 이름은 지원하지 않는다. +- Keyword/parameter/enum/name lookup은 ASCII case-insensitive다. Parameter 순서는 무관하지만 + duplicate name은 값이 같아도 실패한다. Raw spelling, keyword physical lines, data fields와 + normalized lexical input path/1-based line을 보존한다. Keyword terminal comma는 기존 + parameter continuation이며 직후 comment/blank/new keyword/EOF interruption은 실패한다. +- Comma split은 빈 필드를 보존한다. 각 token 주변 space/tab만 trim한다. 아래 명시된 + 공란 외에 arbitrary trailing-empty 제거를 적용하지 않는다. +- Source node/element label은 positive decimal int64이고 raw digits와 numeric identity를 + 분리한다. Scope 내 같은 numeric label은 duplicate다. Name/target는 기존 shell의 + 비어 있지 않은 ASCII 이름·qualification 규칙을 재사용한다. 새 step name도 같은 + name token이며 생략 시 source name은 `Step-1`이다. HDF5 path에 raw name을 삽입하지 않는다. +- 새 `rho` numeric token은 `[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?`다. + C-locale full consumption과 binary64 finite conversion을 요구한다. NaN/Inf, hex, D exponent, + overflow/underflow conversion error는 실패한다. N은 `[0-9]+`와 checked int64 범위이며 + 값이 양수여야 한다. 기존 keyword의 승인된 numeric parsing은 이 기능 때문에 바꾸지 않는다. + + +### I2. 지원 keyword와 위치 + +Eigen input의 문법은 `heading? preprint? part+ assembly material+ model-boundary* step EOF`다. +Comments/blank는 블록 사이에 허용한다. 기존 mesh/set nesting과 forward material/section +resolution은 유지한다. 활성 모델은 S4/S4R shell만 포함한다. + +| Keyword | Eigen subset·data | 의미와 validation | +| --- | --- | --- | +| `*HEADING` | Optional 첫 keyword, parameter 없음, text rows | Heading provenance. Duplicate/nesting 오류 거부 | +| `*PART`, `*END PART` | `NAME` 하나; close parameter/data 없음 | Part-local topology. 중첩/중복/미종결 거부 | +| `*NODE` | Part scope, parameter 없음; `label,x,y,z` | Finite initial global midsurface coordinates. 중복·잘못된 arity 거부 | +| `*ELEMENT` | Part scope, `TYPE=S4` 또는 `TYPE=S4R`만; `label,n1,n2,n3,n4` | 같은 MITC4 physical/mass path와 별도 source type. 네 distinct resolved nodes 필요 | +| `*NSET`, `*ELSET` | Part/assembly scope; 해당 `NSET=name` 또는 `ELSET=name`, optional flag `GENERATE`; assembly는 `INSTANCE=name` 필수. 기존 assembly ELSET의 `INTERNAL` flag도 유지 | Explicit positive labels, 또는 `first,last,increment` inclusive generate. 기존 set row trailing comma 허용. Nonpositive/역순/도달 불가능 range·empty·duplicate definition·dangling/cyclic/mixed-instance 거부 | +| `*SHELL SECTION` | Part scope, `ELSET`, `MATERIAL` 필수; 한 row `t[,integration_points]` | Centered homogeneous layer, constant finite t>0, element별 유일 assignment. Optional second field가 있으면 positive decimal integer; 아래 예외 적용 | +| `*ASSEMBLY`, `*END ASSEMBLY` | Top-level 하나, `NAME`; close parameter/data 없음 | Assembly scope, nested/duplicate 거부 | +| `*INSTANCE`, `*END INSTANCE` | Assembly scope, `NAME`, `PART`; data 없음 | Identity instances; 같은 part의 여러 identity instance 허용. Transform/dangling/duplicate 거부 | +| `*MATERIAL` | Top-level model data, `NAME`; data 없음 | Named material 소유. Case-insensitive unique | +| `*ELASTIC` | Current material, parameter 없음; 한 row `E,nu` | 기존 finite E>0, -1 +### I3. Density material mapping + +`*DENSITY`는 한 material에 최대 한 번, 정확히 한 data row이며 첫 field는 rho다. +`rho` 또는 `rho,`만 허용한다. 후자는 원본 `2700.,`의 빈 temperature slot이며 +temperature dependence가 없는 constant 값으로 대응한다. Nonempty temperature/field variable, +두 개 이상의 추가 comma, 추가 data row, `DEPENDENCIES`(0 포함), `PORE FLUID`, `SLURRY`, +distribution 이름과 다른 parameter는 거부한다. Elastic과 Density의 상대 선언 순서는 자유다. +Numeric rho가 finite이며 strict >0이어야 한다. Material scope 밖 Density도 실패다. + +모든 활성 shell의 `element -> section -> material -> rho`가 정확히 하나로 결정되어야 한다. +Missing rho를 0이나 기본값으로 채우지 않는다. 서로 다른 material/section의 rho/t를 +global 평균으로 바꾸지 않는다. 사용하지 않은 material의 Density가 존재하면 문법·양성 검증은 +동일하며, rho 존재의 필수성은 활성 material에 적용한다. Material/section reference 오류는 +밀도가 있는 다른 material로 fallback하지 않는다. 단위는 `mass/length^3`, 변환 없음. + +Density의 새 입력 허용은 이 eigen procedure에 속한다. 기존 static parser의 Density 지원 +범위를 넓히지 않고, density가 없는 기존 static input과 material 생성 경로를 보존한다. +Material의 내부 optional density를 만들더라도 static에 필수값을 요구하지 않는다. + + +### I4. Step와 Frequency의 exact options + +`*STEP` 허용 parameter는 optional `NAME=`, optional `NLGEOM=NO`, optional +value 없는 `PERTURBATION`뿐이며 data는 없다. NLGEOM 생략은 NO다. PERTURBATION이 없어도 +FREQUENCY가 원형상 linear perturbation procedure를 결정하고 source flag 유무를 보존한다. +`NLGEOM=YES`, flag NLGEOM, `PERTURBATION=...`, `INC`, 다른 option은 eigen에서 거부한다. +Frequency 외 procedure, step description data, 두 번째 procedure/step, 선행 상태는 지원하지 않는다. + +| FREQUENCY parameter | 허용·기본 의미 | Observable mapping | +| --- | --- | --- | +| `EIGENSOLVER` | 생략 또는 `LANCZOS` | Source default=LANCZOS; actual=`MKL FEAST`. Explicit/omitted provenance와 backend mapping warning 기록 | +| `SIM` | 생략, value 없는 flag, `YES` | Source effective=YES. FESA SIM architecture 기능을 만들지 않음. Explicit일 때 no-op warning | +| `ACOUSTIC COUPLING` | 생략 또는 `ON` | Acoustic/ASI/TIE/coupling 정의가 전혀 없는 structural-only 모델에서만 적용 대상 없음. Explicit일 때 no-op warning | +| `NORMALIZATION` | 생략 또는 `MASS` | Source SIM=YES의 mass default를 적용. FESA 실제 ML로 phi^T ML phi=1; 값 변경 warning 없음 | + +`SIM=NO`, `NORMALIZATION=DISPLACEMENT`, `AMS/SUBSPACE/FEAST` source enum, +`ACOUSTIC COUPLING=OFF|PROJECTION`, `DAMPING PROJECTION`, `RESIDUAL MODES`, +`PROPERTY EVALUATION`, `NSET` 및 다른 parameter는 지원하지 않는다. +사용자 backend 요구를 Abaqus 문법의 새 `EIGENSOLVER=FEAST` 지원으로 바꾸지 않는다. + +Data는 정확히 한 physical row, comma split 후 **1~7 fields**다. 첫 field N은 mandatory +positive decimal integer이며 2~7은 존재하면 모두 empty여야 한다. 생략된 trailing fields도 +unspecified다. 원본 `10, , , , ,`는 여섯 fields로 유효하다. Fields 2/3은 frequency bounds, +4는 shift, 5/6은 Lanczos controls, 7은 acoustic range factor의 source slot이다. +공란은 숫자0이 아니다. 어느 slot의 nonempty `0`도 지원하지 않으며, eighth empty field도 +arity 오류다. 추가 row는 residual-mode input으로 해석하지 않고 거부한다. +이 제한은 [공식 FREQUENCY syntax](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의 +선택된 부분집합이다. N은 마지막까지 input authority이고 TXT 행수/count scratch/returned m과 다르다. +`N>finite_dimension` 및 빈 finite problem은 equation 구성 뒤 명시적으로 실패한다. + + +### I5. Result-neutral allowlist와 warning + +아래 keyword는 parameter 순서만 자유이며 duplicate/추가 parameter·data row는 거부한다. +동일 조합의 반복 output request는 각 keyword당 warning 한 개를 남기며 결과를 바꾸지 않는다. + +| Keyword | 정확한 조합·위치 | Warning code | +| --- | --- | --- | +| `*PREPRINT` | Optional top-level; `ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO` 정확히 네 개, data 없음 | `ignored-input-keyword` | +| `*RESTART` | FREQUENCY/BC 뒤; flag WRITE와 FREQUENCY=0, data 없음 | `ignored-input-keyword` | +| `*OUTPUT` | FREQUENCY/BC 뒤; FIELD 또는 HISTORY flag 하나; optional VARIABLE=PRESELECT; data 없음 | `ignored-input-keyword` | +| `*NODE OUTPUT` | 활성 OUTPUT FIELD 아래; VARIABLE=PRESELECT 하나, data 없음 | `ignored-input-keyword` | +| `*ENERGY OUTPUT` | 활성 OUTPUT HISTORY 아래; VARIABLE=ALL 하나, data 없음 | `ignored-input-keyword` | + +새 OUTPUT root는 앞의 output scope를 닫고, RESTART/END STEP도 닫는다. Child scope mismatch는 +거부한다. Restart READ/nonzero write frequency, output variables data, element/contact output, +node history request 등 표 밖 조합은 eigen에서는 fail-closed다. 기존 static allowlist를 축소하지 않는다. +Warning message는 raw keyword와 `mandatory-eigen-output-unchanged` 이유를 포함한다. +RESTART frequency0은 write 중단 옵션이고 출력 요청들은 model equations를 바꾸지 않는 +output selection이다. FESA는 이 selection을 구현하지 않는다는 차이를 알린다. + +FREQUENCY에는 `source-eigensolver-mapped-to-feast` warning을 항상 하나 기록한다. +Explicit SIM에는 `source-sim-option-not-applied`, explicit acoustic ON에는 +`acoustic-option-inapplicable-structural-only`를 기록한다. +위 세 code를 포함한 출력 순서는 기존 source tuple의 code 정렬을 따른다. Invalid model은 +이 warning을 근거로 acoustic/coupling semantics를 버려서는 안 된다. + + +### I6. Fail-closed validation과 diagnostics + +표 밖 model/history keyword는 eigen analysis 전에 거부한다. 특히 어떤 위치의 +`CLOAD/DLOAD/DSLOAD`, initial condition/stress/temperature, damping, acoustic/ASI elements, +TIE/contact/MPC, transform/orientation/explicit director, surface/beam/solid/mixed model, +concentrated/nonstructural mass, composite/offset/variable thickness, amplitudes, restart read와 +다중 step은 지원하지 않는다. Zero-valued load/damping 입력도 지원되는 무하중 모델로 바꾸지 않는다. + +진단 record는 기존 `severity,code,file,line,keyword,entity_identity,message`를 사용한다. +file은 lexical normalized path, line은 source 1-based다. Material/section/node/element/step, +DOF 또는 invalid parameter/field ordinal을 가능한 한 entity/message에 포함한다. +Numerical scale·threshold·observed value는 binary64 round-trip 가능한 decimal로 보고한다. +Source location 없는 backend failure도 sole Frequency location과 step을 연결한다. +기존 SortDiagnostics 순서와 same-key discovery order를 유지한다. + +| Condition | Stable code | CLI exit | +| --- | --- | --- | +| Lexical/arity/duplicate parameter/name/unresolved source | 기존 `invalid-input-character`, `input-line-too-long`, `invalid-data-arity`, `invalid-keyword-parameter`, `unresolved-reference` 등 해당 기존 code | 3 | +| Density scope/data/dependency/duplicate | `invalid-density-data` / `unsupported-density-option` / `duplicate-density` | 3 | +| Active rho missing / numeric nonfinite 또는 nonpositive | `missing-material-density` / `invalid-material-density` | 4 | +| New rho malformed numeric token | `invalid-density-data` | 3 | +| Frequency parameter/count/data mismatch | `unsupported-frequency-option` / `invalid-frequency-data` | 3 | +| Multiple/preload/unsupported procedure | `unsupported-analysis-procedure` | 3 | +| Nonzero base/prescribed BC | `unsupported-eigen-boundary` | 3 | +| Model-affecting exclusion / unsupported element | `unsupported-keyword` / `unsupported-element-formulation` / `unsupported-mixed-element-model` | 3 | +| Invalid geometry/section/material | 기존 model code; mass27-point invalid는 `invalid-shell-mass-geometry` | 4 | +| Global finite n=0 / N>n | `empty-eigenproblem` / `insufficient-finite-modes` | 4 | +| Analytic/null/positive mass or conditioning 실패 | `invalid-eigen-mass-space` / `eigen-mass-conditioning` | 5 | +| Index/storage/allocation/FEAST/count/budget/negative/validation 실패 | [M2 diagnostic mapping](io.md#io-mapping--m2-backend와-failure-lifecycle) | 5 | +| Candidate/write/close/self-check/replace/log/lock 실패 | 기존 output category와 [M2](io.md#io-mapping--m2-backend와-failure-lifecycle) | 6 | + +`NaN/Inf` rho는 nonfinite model value(4)로 분류하고 그 외 malformed token은 syntax(3)다. +같은 실패를 여러 code로 중복 보고하지 않고 첫 발견 원인을 유지한다. Fatal 뒤 solve/commit을 +실행하지 않는다. CLI usage2/success0과 stderr format은 기존 공통 계약을 유지한다. + + +### 공개 근거와 적용 한계 + +2026-09-06 공식 Abaqus 2025 문서를 `web.open`으로 확인했다. 사실은 syntax/외부 의미이고, +위 exact subset/default/warning policy는 승인된 FESA 요구에 대한 I/O mapping이다. + +| Source | Locator와 사용 | +| --- | --- | +| [DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm) | Data lines 1~2와 optional dependencies; constant rho 및 ML^-3 차원. 온도·distribution 지원은 포함하지 않음 | +| [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm) | Optional parameters와 Lanczos data line 1~7. Source defaults·bounds/shift 공란을 구분; FESA Lanczos 내부 동작의 근거가 아님 | +| [STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm) | NAME/NLGEOM/PERTURBATION. 선행 history 전달은 제외 | +| [RESTART](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-restart.htm) | WRITE/FREQUENCY=0 및 no-data. Restart 지원을 주장하지 않음 | +| [OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-output.htm) | Output selection root | +| [NODE OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-nodeoutput.htm) | FIELD와 VARIABLE=PRESELECT | +| [ENERGY OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-energyoutput.htm) | HISTORY와 VARIABLE=ALL; 새 modal energy output 요청으로 확대하지 않음 | +| [Input Syntax Rules](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-inputsyntax.htm) | Keyword/data/256-byte/continuation convention; FESA bounded 차이와 기존 정책은 I1이 권위 | + +질량 정식화·private parser/model·solution algorithm·ODB internals의 동등성을 추론하지 않는다. + + + + +## MITC4 eigen authoritative HDF5 schema + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [io.md](io.md#io) +- 수학: [E1~E8](formulation.md#formulation-eigen), [V1~V6](formulation.md#formulation-verification) +- Numerical authority: [C1~C6](numerical-review.md#numerical-review-controls) + + +### O1. Container, version과 공통 규칙 + +공식 결과는 input lexical sibling `_results.h5`다. 기존 linear schema0와 nonlinear +schema1은 각각의 [현행 static 계약](../shell-surface-pressure-load/io.md#71-version-and-filename-decision)을 +유지한다. Eigen은 기존 shell model container에 새 procedure를 추가하며 discriminant는 +`(schema_version=0, feature_id=mitc4-shell-feast-eigen, analysis_procedure=linear-frequency, +eigen_schema_version=1)`이다. `eigen_schema_version`은 새 procedure 전용 revision이다. +Static reader가 schema_version만 보고 eigen을 static으로 해석해서는 안 된다. +기존 static 파일에 새 eigen mandatory fields를 요구하거나 재작성/migration하지 않는다. +앞으로 unknown additive optional field는 무시할 수 있지만 known field의 type/의미 변경, +unknown procedure 또는 eigen_schema_version은 reader의 명시적 unsupported schema 실패다. + +Float는 `H5T_IEEE_F64LE`, unsigned/signed integer는 명시된 `H5T_STD_U{8,64}LE`/ +`H5T_STD_I64LE`, string은 variable-length UTF-8이다. Compound field의 byte offset/padding은 +private이며 field name/type/array extent가 authoritative다. Shape의 `nn,ne,nmat`는 model +node/element/material 수, `N`은 입력 요청, `c`는 최종 solve의 전체 검증 column 수, +`Lcalls`는 모든 actual FEAST calls 수다. 모든 shape/capacity는 checked integer다. + +새 numeric dataset의 required attrs는 `schema_version=0`, `eigen_schema_version=1`, +`component_names`, `component_unit_dimensions`, `coordinate_system`, `location`이다. +Compound에서 component attrs는 수치 quantity fields만 table의 명시 순서로 나열하고 +identity/flag/counter는 schema 정의를 따른다. 새 modal result에는 추가로 +`step_name=Step-1`, `source_step_name=`, `domain=mode`를 기록한다. +Tokenized dimension은 아래 `mass`, `length`, `time`를 사용하며 SI label을 붙이지 않는다. +모든 mandatory physical/검증 real 값은 finite다. Optional backend diagnostic의 +unavailable는 O4의 명시적 validity flag만 사용한다. NaN payload를 공개하지 않는다. + + +### O2. Metadata, 모델과 source 요청 + +`/metadata`의 아래 attributes는 mandatory다. + +| Attribute | Type / 값 | +| --- | --- | +| `schema_version`, `eigen_schema_version` | uint64 `0`, `1` | +| `feature_id`, `analysis_procedure` | UTF-8 `mitc4-shell-feast-eigen`, `linear-frequency` | +| `solver_version` | 실제 실행 binary의 기존 version string | +| `source_input_identity` | 기존 `path=;content_identity=fnv1a64:<16 lower hex>`; parser가 실제 읽은 원본 bytes 기준 | +| `unit_system_label` | `user-consistent-unspecified` | +| `coordinate_convention` | `global-cartesian; shell-local=initial-reference; positive-thickness=+zeta` | +| `internal_formulation` | `FESA-MITC4` | +| `integration_rule`, `mass_integration_rule` | `2x2x2-gauss; mitc4-edge-midpoint-shear`, `3x3x3-gauss` | +| `stabilization_rule` | `initial-physical-rotary-trace-mean-r2` | +| `step_name`, `source_step_name`, `frame_indexing` | `Step-1`, raw input name(현재 Step-2), `mode-rank-one-based` | +| `mass_variant`, `mass_origin`, `normalization` | `derived-lumped`, `consistent-moment-row-sum`, `mass` | +| `eigensolver_backend`, `eigensolver_routine` | `MKL FEAST`, `dfeast_scsrgv` | +| `backend_problem` | `scaled-whitened-lumped-with-identity-mass` | +| `numerical_contract` | `mitc4-shell-feast-eigen:r2` | + +Source identity는 [현재 writer primitive](../../src/fesa/io/hdf5/hdf5_primitives.cpp)의 byte +identity와 동일하다. SHA-256 reference audit와 FNV source identity는 다른 목적이다. +Filename만으로 동일 input이라고 간주하지 않는다. Comparator는 실제 지정 input bytes의 +content identity와 lexical input path를 metadata에 대조한다. + +| Dataset | Shape/type와 fields | Identity·단위·ordering | +| --- | --- | --- | +| `/model/nodes` | `[nn]` 기존 compound: `internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3]` | Internal ID 0..nn-1, 기존 instance expansion/declaration order; coordinates length, global-cartesian | +| `/model/elements` | `[ne]` 기존 shell compound: `internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64` | Internal ID order; source S4/S4R 구별; formulation FESA-MITC4 | +| `/model/shell/materials` | `[nmat]` 기존 compound: `internal_material_id:u64,name:utf8,E:f64,nu:f64` | Declaration order; E force/length^2, nu1. 기존 field에 rho를 끼워 넣지 않음 | +| `/model/shell/sections` | 기존 compound: `internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64` | Declaration order, thickness length, centered-single-layer | +| `/model/shell/nodal_director`, `/model/shell/nodal_frame` | `[nn,3]`, `[nn,3,3]` f64 | 기존 source node rows; D components, frame axes A/B/D×global X/Y/Z, dimension1 | +| `/model/nodal_constraint_mask` | `[nn,6]` u8 | Existing DOF order UX,UY,UZ,URX,URY,URZ; free0/constrained1 | +| `/model/prescribed_displacement` | `[nn,6]` f64 | 같은 DOF order, 모든 값 exact0; units length×3,radian×3 | +| `/model/shell/densities` | `[density_count]` 새 compound: `material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64` | Material ID ascending, rho mass/length^3, location model-material; declared density별 한 row, 활성 material 모두 존재 | +| `/model/eigen/source_records` | `[record_count]` compound: `ordinal:u64,source_line:u64,keyword:utf8,physical_text:utf8` | 아래 source provenance 대상의 실제 physical line 순서, ordinal0부터 | +| `/diagnostics` | `[diagnostic_count]` 기존 compound: `severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8` | 기존 SortDiagnostics 순서. 성공 파일에는 warning만 존재 | + +공통 model dataset의 기존 attrs는 [linear model schema](../linear-static-mitc4-shell/io.md)와 +[현재 writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)를 따른다. Eigen-specific attrs는 +새 dataset에만 필수이며 기존 static dataset type/attrs를 바꾸지 않는다. +기존 model-only midsurface_locations/section_positions를 공유 writer가 추가 저장해도 허용하나 +eigen result/acceptance quantity는 아니며 eigen의 mandatory replay dataset이 아니다. + +`source_records` 대상은 STEP, FREQUENCY(그 count data 포함), DENSITY(data 포함), I5 +no-op keyword와 그 parameter-continuation physical lines다. Comments는 포함하지 않는다. +`keyword`는 canonical parent keyword이고 `physical_text`는 CR/LF를 제거한 원문이다. +Frequency 선언 유무·blank slot 수·raw values를 여기서 보존한다. 물리 domain의 기준은 +validated semantic fields이며 output consumer가 raw text를 다시 실행하지 않는다. + +`/steps/Step-1` group attrs는 아래와 같다. Canonical group명과 source name을 구분한다. + +| Attribute | Type / 의미 | +| --- | --- | +| `source_step_name`, `source_step_name_canonical` | utf8 raw name / ASCII uppercase key | +| `step_source_line`, `frequency_source_line`, `frequency_data_line` | u64 실제 source1-based line | +| `source_nlgeom`, `source_perturbation_present` | u8 effective NO=0 / explicit flag 유무0 또는1 | +| `source_eigensolver`, `source_sim`, `source_acoustic_coupling`, `source_normalization` | utf8 effective `LANCZOS,YES,ON,MASS`; explicit/omitted는 source_records에서 구분 | +| `requested_mode_count`, `returned_mode_count` | u64 N,N; table row수로 입력 N을 덮어쓰지 않음 | +| `full_dof_count`, `free_dof_count`, `mass_null_dimension`, `finite_dimension` | u64 6nn,nf,nz,n, nf=n+nz | +| `validated_eigenpair_count` | u64 c, N<=c<=n; publicly returned mode 수와 구별 | + + +### O3. 고유치와 modal vectors + +Path prefix는 `/steps/Step-1/eigen`이다. `modes`만 공개 eigenvalue row authority다. + +| Relative dataset | Shape/type/fields | 의미·attrs | +| --- | --- | --- | +| `modes` | `[N]` compound `mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64` | Row k는 mode_id=k+1; quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame | +| `frequencies` | `[Nv]` compound `mode_id:u64,frequency:f64` | 정확히 lambda>=0인 modes의 ID subset, mode ID ascending. quantity=cycle-frequency, component_names=Freq, dimension=time^-1, scalar/modal-frame; mandatory dataset이며 Nv=0도 유효 | +| `vectors` | `[N,nn,6]` f64 | mode axis는 modes와 동일, node axis는 model/nodes, component_names=UX,UY,UZ,URX,URY,URZ; global-cartesian, location=nodal-modal-vector | + +`vectors.component_unit_dimensions`는 `mass^-1/2` 세 개와 `mass^-1/2*length^-1` 세 개다. +추가 attrs `normalization=mass`, `amplitude_unit_dimension=mass^1/2*length`, +`mass_variant=derived-lumped`, `interpretation=normalized-mode-not-response-displacement`를 둔다. +각 node의 세 회전 성분은 initial global infinitesimal rotation coordinates다. Constrained +component는 exact0이며 source node label을 internal/equation index로 바꾸지 않는다. +기존 `/nodal/displacement`, reaction, stress, nonlinear accepted_frames를 modal 결과로 생성하지 않는다. +Full matrices/consistent matrix/modal stress를 영속 mandatory output으로 추가하지 않는다. + +Raw lambda의 오름차순 stable paired sort와 exact tie의 original FEAST column 순서를 따른다. +Sign은 [C4](numerical-review.md#numerical-review-controls--c4-repeated-subspace와-결정론)대로 largest absolute +scaled global component(translation/ell,rotation)의 양수, tie는 source DOF 순서다. +여기서 source DOF 순서는 model/nodes의 stable row order×정해진 component order다. +Cluster는 전체 c sorted columns에서 C4의 connected rule로 1부터 매기고 첫 N개에 같은 ID를 +투영한다. Cluster ID는 진단용이며 값을 평균하거나 결과 multiplicity를 줄이지 않는다. + +`operator_scale=s`는 O4에 저장한다. `mu=lambda/s`에서 `mu<-1e-9`는 성공 파일을 만들 수 +없는 negative spectrum failure다. `abs(mu)<=1e-9`이면 classification=0(`near-zero`), +그 외는 classification=1(`positive`)이다. Raw lambda와 부호를 그대로 기록하며 ±boundary는 +near-zero다. Frequency는 classification이 아닌 raw lambda 부호로 결정한다: +lambda>0이면 sqrt(lambda)/(2pi), lambda==0이면 exact0, lambda<0이면 row가 없다. +따라서 small positive near-zero에도 real frequency가 있고 small negative에는 없다. +Negative row의 부재 이유는 `frequencies@unavailable_rule=negative-raw-eigenvalue`로 명시한다. +Frequency overflow/양수의 underflow-to-zero도 파생 결과 실패로 처리한다. Mandatory lambda +및 mu→lambda conversion은 C3의 finite/underflow 조건을 그대로 따른다. + + +### O4. Backend와 검증 evidence + +Prefix `/steps/Step-1/eigen/verification`의 attrs: + +| Attribute | Type / 의미 | +| --- | --- | +| `characteristic_length`, `operator_scale` | positive finite f64 ell[length], s[time^-2] | +| `eta_gram`, `max_eta_orth` | finite f64, 전체 c의 V3 Gram와 pairwise 최대 metric; c=1이면 max_eta_orth=0 | +| `eta_mz`, `eta_kz`, `eta_pz`, `null_checks_applicable` | f64×3 및 u8; nz=0이면 applicable0와 storage값0, N/A이지 수행 통과로 보고하지 않음 | +| `validation_scope`, `numerical_contract` | utf8 `all-computed-c-columns`, `mitc4-shell-feast-eigen:r2` | + +| Dataset | Fields / shape | 의미 | +| --- | --- | --- | +| `verification/nodal_reduction` | `[nn]` compound `free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64` | Source node row 대응; E2 analytic counts. Nonempty positive block에 rcond_available1, C2 cutoff 통과; 빈 block은0/0 storage. nf/nz/n과 합 일치 | +| `verification/eigenpair_checks` | `[c]` compound `sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64` | sorted_rank1..c, solver_column은 원 FEAST column0-based unique; 실제 ML의 V3/V4/C3 metrics. 첫 N ranks의 lambda는 modes와 exact equal | + +Nodal reduction의 quantity component는 `rcond_inf`, dimension1, coordinates=scalar, +location=nodal-mass-reduction이다. Eigenpair checks의 component_names는 표의 f64 fields +순서이고 dimensions는 eigenvalue와 rayleigh_quotient만 time^-2, 나머지는1이다. +Coordinates=scalar, location=eigenpair-verification이며 mandatory finite 검증량과 +optional backend_res의 validity를 구분한다. + +`eigenpair_checks`는 내부 count/검증 evidence다. c>N 진단행은 추가 공개 modal frame이 +아니며 comparator는 여기서 Value를 추출하지 않는다. c개 vector 전부는 검사 동안 유지하고 +accepted state에는 공개 N개 vector와 전체 c의 check evidence를 보존한다. 전체 c Gram의 +runtime/독립 검증은 C17/18 evidence로 확인하며 N개 persistent vectors만으로 full-c Gram를 +재검산했다고 주장하지 않는다. N개 원 residual/normalization은 model 데이터에서 K/ML를 +독립 재구성하여 재현할 수 있다. Consistent/lumped 독립 oracle는 NR cases의 내부 테스트다. + +Backend `res`가 0-eigenvalue의 상대분모 때문에 unavailable인 경우만 +backend_res_available0, backend_res storage0을 사용하고 dataset attr +`unavailable_reason=zero-eigenvalue-relative-residual`를 둔다. Available 값은 finite이고, +nonzero eigenvalue의 nonfinite backend diagnostic은 failure다. Storage0을 residual evidence0으로 +해석하지 않는다. mandatory eta_*는 모든 경우 자체 zero branch와 함께 finite다. + +Prefix `/steps/Step-1/eigen/backend` attrs는 `runtime_version:utf8`(실제 MKL query), +`integer_abi:utf8`(`LP64|ILP64` 실제 linked ABI), `thread_count:u64=1`, +`seed:u64=0x4D495443344D4645`, `count_calls:u64`, `solve_calls:u64`, +`final_count:u64=c`, `final_solve_ordinal:u64`, `selected_ranks:utf8=1..N`, +`enclosure_lower:f64`, `enclosure_upper:f64`, `solve_lower:f64`, `solve_upper:f64`다. +Bounds는 모두 dimensionless B-space이며 physical frequency bound가 아니다. + +| Relative dataset | Shape / fields | 의미 | +| --- | --- | --- | +| `calls` | `[Lcalls]` compound `ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64` | ordinal0-based 실제 call 순서; kind=count/solve, strict bounds, 실제 allocated capacity. Count의 overwritten m0와 solve의 m을 count로 구분 저장 | +| `fpm` | `[Lcalls,128]` i64 | 각 call 직전 feastinit 이후의 exact parameter snapshot; vendor type을 public core에 노출하지 않음 | + +`purpose`는 `total-enclosure`, `upper-prefix`, `lower-prefix`, `endpoint-guard`, +`final-prefix`, `final-interval`, `solve` 중 하나이며 실제 C5 단계에 대응한다. +Calls의 component_names는 `lower,upper,epsout`, dimensions는 `1,1,1`, +coordinates=scalar, location=backend-call이다. Fpm은 component_names=fpm, +dimension1, coordinates=none, location=backend-parameter이며 128개 C-index 순서다. +Calls의 unavailable output은 flag0+storage0이고 원인을 info로 해석한다. Undefined vendor +output을 읽거나 garbage를 저장하지 않는다. `info=0`이면 count_available1; 성공 solve는 +loop/epsout도 available1이고 epsout finite. 내부 허용 재시도의 실패 call도 삭제하지 않는다. +최종 성공과 C5 guard/prefix/total count 관계는 chronological calls/bounds로 재구성 가능해야 한다. +Allocated_m0와 input N은 독립이다. Effective fpm와 seed/budget은 C5/C6와 일치해야 한다. +Count-only res/epsout을 fabricated physical result로 사용하지 않는다. + + +### O5. Self-check와 compatibility tests + +Writer는 candidate를 flush/close한 뒤 read-only reopen하여 type/field/shape/required attrs, +finite required values, enum/validity domains 및 다음 관계를 확인하고 검사용 handle도 닫는다. + +1. Source identity·input semantic snapshot이 writer 입력과 일치한다. Node/element/material IDs, + connectivity/section/material/density links가 unique/in-range이고 모든 활성 material rho>0이다. +2. Source step은 한 개이고 canonical Step-1과 raw name의 관계가 유일하다. Input N, + requested N, returned N, modes/vector row수가 같다. mode IDs는 정확히1..N이다. +3. Modes가 raw 오름차순이며 classification/cluster는 C3/C4 규칙과 맞는다. Frequencies의 + ID set은 lambda>=0 set과 exact equal이며 각 값은 candidate 파생값과 같고 finite다. +4. Vectors는 finite, source constraint component exact0, scalar/vector pair는 candidate와 + 일치한다. Selected vectors의 ML normalization/원 residual은 serializer 전 C3 gate에서 + 검증되었고 해당 metrics 및 read-back values를 대조한다. Serializer 자기복사를 독립 physics로 부르지 않는다. +5. `nf=n+nz`, node별 counts 합, N<=c<=n, 전체 c check rows와 solver-column uniqueness, + 첫 N lambda exact equality, modal_mass>0, 모든 적용 C2/C3 metric 한계가 맞는다. +6. Calls/fpm row수·ordinals·strict endpoints·finite available diagnostics, fpm controls, + counts/budgets(<=512 count, <=3 solve), final solve info0/returned m=c와 selected1..N이 맞는다. + 증거 없는 성공 bool 하나로 대체하지 않는다. +7. `/diagnostics`는 기존 compound `severity,code,file,line,keyword,entity_identity,message`를 + 유지하며 source order warnings를 저장한다. 성공 파일에 fatal error diagnostic은 없다. + +이 mandatory inventory는 reader version dispatch, round-trip, 누락/extra mode/duplicate ID, +nonfinite/wrong dimension/type/mass/backend/source, close/reopen/self-check failure tests의 기준이다. +Optional unknown dataset의 존재를 extra-mode로 오인하지 않는다. Static 파일은 기존 schema +inventory로 계속 검증하고, eigen reader는 static 또는 unknown eigen revision을 명시적으로 거부한다. + + + + +## MITC4 eigen 책임·실패·비교 대응 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [io.md](io.md#io) +- 입력 원본: [io-input.md](io.md#io-input); 영속 schema 원본: [io-schema.md](io.md#io-schema) + + +### M1. Input에서 equation/result까지 + +아래는 implementation-neutral 책임 계약이며 정확한 C++ 타입/파일 분해는 Planning 소유다. +현행 [Domain](../../include/fesa/model/domain.h), +[model records](../../include/fesa/model/model_types.h), +[syntax records](../../include/fesa/io/abaqus/input_syntax.h), +[AnalysisModel](../../include/fesa/analysis/analysis_model.h)의 수명·의존성을 따른다. + +| 경계 | 소유·전달할 최소 의미 | 금지되는 의미 혼합 | +| --- | --- | --- | +| Input adapter | 원본 path/content identity, keyword/parameter/data raw text와 line; validated density/step/options/count, unresolved targets | TXT row수로 N 생성, source enum으로 actual backend 변경 | +| Domain | Topology/source instance/labels, E/nu, section/t, optional material rho, initial director/frame, 유일 frequency 정의와 resolved homogeneous BC, warnings/provenance | Mutable mode/equation/vendor handle 소유 | +| Frequency definition | Raw/canonical source step, source option presence/effective values, count data N, source locations, procedure=linear-frequency | Static increment/time/frame state를 frequency count에 재사용 | +| AnalysisModel | Domain lifetime 아래 활성 shells/materials/sections/BC/frequency 정의의 const non-owning view | Domain copy 또는 새로운 geometry/material ownership | +| DofManager | Source node×UX/UY/UZ/URX/URY/URZ, full/free/constrained injection과 stable equation indices, scatter/sparse pattern | Element/Node 내부에 equation ID 저장 | +| Element/assembly | M1~M10 consistent/moments snapshot→nodal lumped blocks, r2 K contribution, source ordered reduction. 같은 source scatter와 실제 BC | Global scalar row lumping, artificial drilling mass, source S4R의 별도 kernel | +| Eigen procedure | Candidate workspace/state, [E1~E8](formulation.md#formulation-eigen) 순서, analytic rank/positive/null projection, whitening, actual FEAST, all-c validation, N개 global 복원/결과와 commit | 기존 LinearStaticAnalysis::Run에 eigen lifecycle 누적, pretrained/preloaded state, static reaction/modal stress 복구 | +| Private backend | C5/C6 controls, checked CSR/index conversion, vendor resources/thread guard, actual values/vectors/count/status와 call history | MKL_INT/HDF5/Win32 types 또는 vendor headers를 public solver core에 노출 | +| Result/Output adapter | Validated source/global modal pair와 O1~O5 serialization/self-check/replacement | Near-zero clamp, physical 수치 또는 identity 재계산으로 실패 은폐 | + +Density/property lookup은 element마다 확정된 material identity를 사용한다. Consistent 원본을 +lumped 저장으로 덮어쓰지 않고 element-wise snapshot+moments로 검사 가능하게 한다. +Full dense global MC나 일반 dense Schur는 필수가 아니다. 실제 global BC를 먼저 적용하고 +director null은 [E2](formulation.md#formulation-eigen--e2-nullpositive-basis를-node마다-결정)의 exact intersection으로만 +결정한다. Tiny positive mass는 정식화/NR conditioning 실패이며 input 지원에서 제거하지 않는다. + +Source `(instance_name, numeric label)`과 raw label spelling은 전체 경로에서 보존한다. +Internal row order는 기존 identity-instance expansion/declaration order이며 DOF order는 고정이다. +Renumbering은 geometry/connectivity/BC를 같이 대응하여 검사한다. 숫자가 우연히 같은 +source label/internal ID/equation ID를 비교키로 대체하지 않는다. 새로운 source order의 결과를 +행 위치끼리 비교하거나 repeated eigenspace의 특정 vector 방향을 동일하다고 요구하지 않는다. + +Accepted eigen state는 input/source step identity, N개의 paired raw scalar/global vector, +source mapping 및 전체 c의 validation/call evidence만 소유한다. Domain·AnalysisModel·DOF +정의와 수명 관계를 복사로 숨기지 않는다. Persistent N vectors로 같은 입력의 K/ML를 +재조립해 constraint/normalization/원 residual을 다시 검사할 수 있어 REQ-018을 충족한다. +반복군의 개별 벡터 비유일성과 외부 mode-shape 비교 제외는 유지한다. + + +### M2. Backend와 failure lifecycle + +FEAST fpm/interval/seed/thread/storage와 내부 수치 한계의 유일 원본은 +[NR C1~C6](numerical-review.md#numerical-review-controls)다. I/O나 CLI에서 parameter override를 만들지 않는다. +Source N, reduced finite dimension n, prefix count, allocated m0, returned m, validated c, +public N을 각각 유지한다. 전체 c eigenpairs의 full original free residual/ML Gram/energy 및 +endpoint/count consistency 뒤 첫 N개만 선택한다. Wrong mass·count·residual을 tolerance나 +다른 solver로 우회하지 않는다. + +| Failure | Code / exit5 | 보존할 context | +| --- | --- | --- | +| Checked CSR/index/capacity 산술 실패 | `eigen-index-overflow` 또는 `invalid-eigen-csr` | n/nnz/N/m0, 실패한 bound와 stage | +| Allocation 실패 | `eigen-allocation-failed` | allocation 역할·checked requested bytes; N 축소 없음 | +| FEAST non-success / forbidden retry | `eigen-feast-failed` | raw info, count/solve kind, interval/m0, C5 허용 재시도 여부 | +| Count/returned m/monotonicity·endpoint mismatch | `eigen-count-inconsistent` 또는 `eigen-endpoint-separation` | actual count history와 마지막 certified bracket | +| 유한 budget 소진 | `eigen-search-budget-exhausted` | count/solve attempts·마지막 valid bracket; optimization fallback 가능 여부는 C5 그대로 | +| Significant negative spectrum | `negative-eigenvalue-spectrum` | raw lambda/mu/s, mode rank, C3 threshold | +| Nonfinite/underflow conversion 또는 invalid frequency | `invalid-eigenvalue-result` | raw scalar·stage·source step | +| Raw pair/Gram/원 free residual/energy 검증 실패 | `eigenpair-validation-failed` | metric name, observed value, C3 limit, solver column/rank; failed raw values를 accepted result에 넣지 않음 | + +위 code는 기존 FailureCategory::kSolver로 전달하며 새로운 exit category를 추가하지 않는다. +Model/preflight 오류는 [I6](io.md#io-input--i6-fail-closed-validation과-diagnostics)를 따른다. +Eigen backend failure의 returned Status는 실패까지의 call history를 message에 round-trip +decimal/ordinal 순으로 포함한다. 한 leading fatal diagnostic에 history를 부속하고 성공 count +call에 fictitious error severity를 붙이지 않는다. CLI는 기존 ordered stderr diagnostic 경로로 +반환하며 caller는 Status에서 evidence를 읽을 수 있다. Allocation failure 시 추가 문자열 +allocation을 보장할 수 없는 한계는 기존 best-effort stderr 범위를 따른다. + +Public CLI는 기존 `fesa.exe `뿐이다. Output override 부재, `.inp` lexical +stem/대소문자/여러 dot/path 규칙, same-derived-pair nonblocking exclusive lock와 usage2는 +[공통 lifecycle §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 유지한다. + +1. CLI usage validation→lexical output pair→exclusive ownership 뒤 `_log.txt`를 + open/truncate한다. Non-Newton eigen은 log에 Newton iteration/FEAST 행을 만들지 않는다. + 정상 log는 기존 계약대로 zero-byte다. Log open/close failure는 output exit6다. +2. Input/model/eigen solve와 all-c validation은 candidate에 수행한다. Existing accepted + state와 final HDF5는 건드리지 않는다. Controlled failure는 기존 state와 final hash를 보존한다. +3. Successful candidate를 준비하고 log close 성공을 확인한다. 같은 directory에 exclusive-create + private HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다. +4. Final replacement가 성공한 뒤 **이미 준비된 state의 no-fail swap**을 수행한다. + Swap에 allocation/validation/fallible callback을 남겨 두지 않는다. 순서는 [E8](formulation.md#formulation-eigen--e8-mode-identity-normalization과-상태)다. +5. Write/flush/close/reopen/self-check/replace 실패는 exit6이며 이전 final/state를 보존한다. + Failed candidate는 authoritative가 아니다. 정리는 best effort이고 다른 run의 파일을 지우지 않는다. + Current log는 rollback하지 않는다. 잠금 실패는 log/final도 변경하지 않는다. + +과거 final이 없으면 controlled failure 후 final도 생성하지 않는다. Directory collision, +nonregular destination, lock/replacement refusal는 성공으로 처리하지 않는다. Process crash나 +power-loss 전체 원자성을 약속하지 않는다. Reference artifact는 읽기 전용이며 solver의 +새 HDF5/log는 별도 generated output이다. Reference 원본을 덮어쓸 output path는 없다. + + +### M3. 원본 TXT grammar와 deterministic Value projection + +Case `shellNL-eigen-meshfine`의 input/TXT 경로·hash와 logical quantity/family 원본은 +[reference-model](reference-model.md)이다. TMP/CSV 변환·filename alias·추가 provenance 파일을 +reference readiness 조건으로 만들지 않는다. TXT에는 source step이 없으므로 **지정 input의 +유일한 source frequency step Step-2**를 연결한다. ODB storage frame index는 추정하지 않는다. + +각 LF/CRLF logical line에서 공백-only 행만 생략한다. 모든 다른 행은 아래 full-match다. +`ws`는 ASCII space/tab 0개 이상, `ws1`은 1개 이상이며 literal의 대소문자는 정확하다. + +```text +number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)? +id := [0-9]+ # positive checked decimal integer +row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number + ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws +``` + +Header/footer, BOM, comment, 잘못된 Value/Freq label·추가 token·malformed number는 schema +failure다. `Value`는 finite binary64로 full conversion하고 overflow/underflow parsing error를 +거부한다. NaN/Inf spelling은 grammar부터 실패한다. `Freq`는 숫자 token 구조만 검사하고 +수치 변환/물리 일치/오차 비교에 사용하지 않는다. 반올림된 Freq로 Value를 재계산하지 않는다. +같은 숫자의 다른 mode ID는 정상이며 같은 numeric ID의 재등장은 duplicate다. + +다음 순서를 tolerance 전에 완료한다. + +1. 지정 input/TXT와 O1 eigen HDF5의 존재·source_input_identity·procedure/schema/unit/mass/ + actual backend를 검사한다. `mass_variant=derived-lumped`, `mass_origin=consistent-moment-row-sum`, + normalization mass 및 runtime FEAST metadata가 필수다. 다른 mass의 좋은 오차를 선택하지 않는다. +2. Input의 유일 source step/N=10을 직접 확인하고 HDF5 source name/요청수/공개수에 대응한다. + TXT row count에서 N을 추정하거나 HDF5 내부 c를 공개 모드 수로 사용하지 않는다. +3. TXT 모든 nonempty row를 먼저 parse하면서 duplicate를 검사한다. Dictionary overwrite + 또는 malformed-row skip은 금지다. Required identity는 양쪽 모두 정확히 mode1..10이다. +4. HDF5 `modes`의 field/type/shape/단위/순서와 모든 eigenvalue의 finiteness를 확인한다. + Wrong quantity/mass/schema·missing/extra/duplicate/nonfinite를 먼저 실패시킨다. +5. 유일 source key로 join한 뒤 mode ID ascending으로 projection한다. TXT 행 재배열은 + 허용하지만 HDF5 sort contract 위반은 reader가 재정렬하여 숨기지 않는다. + +Projection row는 +`(case_id,source_step_name,mode_id,component=Value,reference_value,fesa_value)`다. +FESA value는 `/steps/Step-1/eigen/modes.eigenvalue`만 사용한다. Diagnostic all-c table, +frequencies/vectors 또는 static fields를 fallback으로 읽지 않는다. 현재 component는 scalar +eigenvalue=`omega^2`, `time^-2`, coordinates=`scalar`, impact=`blocking`이다. + + +### M4. 판정·보고와 기존 static의 역할 + +Family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue,dimension=time^-2, +coordinates=scalar,impact=blocking)`다. **10개의 singleton family**에 +[common-reference-tolerance](../TOLERANCE.md)를 그대로 적용한다. 각 family의 +`S=max|r|`, `B=0.01S`, near-zero inclusive row branch 또는 5% relative row branch와 +1% relative RMS를 모두 계산한다. 현재 양수 singleton은 실효 mode별1%다. +S=0이면 exact-zero FESA만 성공이며 불일치는 `zero-reference-scale-nonzero-error`다. +Source modal frame이 다르면 한 table에 저장되어도 family를 합치지 않는다. + +Comparator report는 input/reference/result identity와 freshness evidence, prechecks, +family/source key/component/count/S, raw r/f/error, 적용 branch·row verdict, RMS/verdict, +blocking failure와 전체 verdict를 mode order로 남긴다. Undefined zero-scale metric은 named +state로 표현하고 NaN/Inf나 absolute floor를 넣지 않는다. CSV view가 필요하면 이 projection을 +HDF5에서 추출한 보조 artifact라고 표시하며 공식 output/원본 reference를 대체하지 않는다. + +기존 static의 r2 재검증은 [Requirement portfolio](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity), +[NR C7](numerical-review.md#numerical-review-controls--c7-승인된-정적-회귀-기준), [C26](numerical-review.md#numerical-review-cases)을 따른다. +기존 linear source node/static frame와 nonlinear factor-one accepted-state identity를 유지한다. +U1/U2/U3 length/global blocking, UR1/UR2/UR3 rotation warning-only는 기존 common families다. +Nonlinear RF1/RF2/RF3·physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 +유지하는 review-only다. RM3/stress와 eigen vector는 새 external gate가 아니다. +Internal force/moment equilibrium은 별도의 blocking physical evidence다. +`shellnl-meshfine-02-s4-final`의 별도 post-closure 역할도 유지한다. +과거 cache/static 수치를 새 binary의 fresh solve로 표시해서는 안 된다. + + +### M5. 구현·test obligations와 requirement 연결 + +아래 표의 `nn` 등 fixture 수를 제외한 threshold는 [NR cases/controls](numerical-review.md#numerical-review-cases)의 +원본을 사용한다. Parser/mapper/schema/comparator의 실제 tests는 Planning/Implementation 소유다. + +| Obligation ID | 필수 positive/negative 검증 | NR cases | +| --- | --- | --- | +| IO-T01 | 원본 unchanged input의 729 nodes/676 S4, source Step-2/N10, rho2700/t0.5, source options/no-op warnings와 실제 FEAST 선택. S4R source-only 변경도 같은 semantic physical path | MFE-C23 | +| IO-T02 | 두 material·두께의 element-section-density 연결, missing/duplicate/unresolved/0/negative/NaN/Inf/temperature/dependencies/extra row·field, section/geometry/27-point invalid 거부; static density 부재 허용 | MFE-C06, MFE-C07, MFE-C23, MFE-C26 | +| IO-T03 | N의 blank/0/negative/fraction/overflow, fields2~7에 nonempty0, eighth empty field, duplicate parameter, unsupported enums/procedure/preload/load/damping/acoustic/mixed/非영 BC 거부 | MFE-C07, MFE-C13, MFE-C23 | +| IO-T04 | Source labels/instance/set renumbering·중복/모호함, partial rotations/fullfree/fullclamp/drill-only/fully constrained source mask 복원; tiny nonzero director rank 보존·conditioning 실패, n0/N>n 명시 실패 | MFE-C06, MFE-C13, MFE-C14, MFE-C24 | +| IO-T05 | O1~O5 schema round-trip, input byte identity, N/c/source step/rank/units/actual backend/mass pairing, N vectors의 원 residual·normalization 재현. Near-zero positive/negative/exact0/±threshold 및 lambda conversion 경계 | MFE-C16, MFE-C19, MFE-C24 | +| IO-T06 | Invalid index/CSR/SPD/parameter/capacity/count/endpoint/NaN/Gram/residual/budget; actual FEAST known zero/repeated/cluster cases의 all-c history와 returned-N 분리. Output diagnostic unavailable와 raw λ 보존 | MFE-C17, MFE-C18, MFE-C19, MFE-C21, MFE-C22 | +| IO-T07 | 이전 accepted state/final hash를 준비하고 solve/validation/log/lock/write/flush/close/reopen/self-check/replace 실패를 각각 주입. 처음 실행의 실패에서 final 미생성. 성공 final 후 no-fail state swap | MFE-C24 | +| IO-T08 | TXT reorder/equal Value distinct modes 허용. Missing/extra/duplicate/nonfinite/malformed/wrong field/step/quantity/units/mass/backend/schema 실패를 tolerance 전에 확인. Freq 변화가 Value 판정을 바꾸지 않음 | MFE-C25 | +| IO-T09 | 공통 policy의 inclusive 1% RMS·5% row 경계와 양옆, generic near-zero \|r\|=B 경계·zero-scale 양성/음성. Singleton이므로5% row pass라도1% RMS fail임을 확인 | MFE-C25 | +| IO-T10 | Density 없는 기존 linear/nonlinear input·model/static output reader 불변, r2 scale 영향 portfolio를 fresh binary로 재검증. Mode-shape reference 미요구 | MFE-C26, MFE-C27 | +| IO-T11 | 세 반복의 exact sparse/row/diagnostic order 및 scalar/projector C4 기준. RED→observed failure→GREEN→focused/full MSVC x64 Debug 검증·새 warning 없음·fresh reference identity/hash | MFE-C27 | + +Coverage ID 접두사는 모두 `FEM-REQ-MITC4-EIGEN-`다. 아래 표는 requirement 원문을 대체하지 +않고 I/O의 기여와 다른 owner evidence를 구분한다. + +| Requirement suffix | I/O 연결·verification obligation | +| --- | --- | +| 001 | I2/I4/M1; IO-T01/T03 | +| 002 | I2/O2 source type와 r2 stabilization identity; IO-T01/T10; physical kernel C01/C08/C12는 해당 owner | +| 003 | I3/O2 densities; IO-T02 | +| 004 | I2/I6/M1; IO-T02; geometry oracle C01/C02는 NR 원본 | +| 005 | M1 consistent snapshot 의미, O2 mass_origin; C01~03 구현 evidence | +| 006 | M1/O4 node rank와 restored vector; IO-T04; inertia/null C01/C03/C11 | +| 007 | M1 source/DOF/reduction ordering; IO-T04/T11 | +| 008 | M1/O4 analytic counts/conditioning, M2; IO-T04/T05; C15 spectrum oracle | +| 009 | I4/O2 N·n·c/O3 rank; IO-T03/T04/T06 | +| 010 | O3 stable paired sort/cluster identity, M3 join; IO-T05/T08/T11 | +| 011 | I4/O2/M2 actual mass/backend discriminant; IO-T01/T05/T06 | +| 012 | I6/M2/O4 validity and bounded failure; IO-T06/T07 | +| 013 | O3 vectors/O4 all-c metrics; IO-T05/T06; C11/C16~18 independent evidence | +| 014 | M1 units/source transformation/O3 replay; IO-T04/T05; C01~05/C08/C11/C20 physics | +| 015 | I4/I5/O2 source_records; IO-T01/T03 | +| 016 | I2~I6/M2; IO-T02/T03/T06 | +| 017 | O1~O5/M3 authoritative additive schema; IO-T05/T08 | +| 018 | M1/O3 persistent N vectors/source replay; IO-T04/T05; external shapes 제외 | +| 019 | M2 candidate/commit/log lifecycle; IO-T07 | +| 020 | M3/M4 Value-only + 별도 static policy; IO-T08/T10 | +| 021 | O5/M3 full prechecks; IO-T08 | +| 022 | M4 공통 family/policy/report; IO-T09 | +| 023 | IO-T11; 실행 계획/RED/GREEN/full 증거는 Planning/Implementation 소유 | +| 024 | I3/M4 existing static compatibility/portfolio; IO-T10/T11 | +| 025 | M5 coverage + 동일 r2 handoff; Physics/Release closure 소유권 유지 | +| 026 | M1 consistent→lumped/O2 mass_origin; C01~05 independent mass evidence | +| 027 | O2 stabilization_rule/M4 static 역할; IO-T10; C08~12/C26 물리 검증 | + + +### 정적 감사 evidence + +실제 조사 명령은 `Get-Content`, `rg --files`, scoped `rg -n`, `web.open`이었다. +입력 keyword inventory와 TXT 10개 행을 읽었고 numerical quantity/formulation 계산을 +재실행하지 않았다. 한 번의 `rg docs/shell-surface-pressure/io*.md`는 잘못된 directory/glob로 +exit1이었고 `rg --files docs`로 실제 `docs/shell-surface-pressure-load/io.md`를 확인해 +읽기 전용 대조를 완료했다(exit0). 이 검색 오류는 feature numerical failure가 아니다. + +최종 감사 `python -B -` here-script는 exit0으로 owned4 metadata/66개 relative links/ +requirement suffix1..27, reference10 rows/full grammar/finite Value/ID1..10 및 두 원본 SHA-256 +일치를 확인했다. `git diff --check -- docs/mitc4-shell-feast-eigen/io.md +docs/mitc4-shell-feast-eigen/io-input.md docs/mitc4-shell-feast-eigen/io-schema.md +docs/mitc4-shell-feast-eigen/io-mapping.md`도 exit0이었다. 아직 untracked인 owned 문서는 +별도 Python whitespace/Markdown table 검사로 확인하며 diff만으로 내용 검증했다고 하지 않는다. +실제 final audit 결과와 owned hashes는 I/O handoff에 보고한다. +이는 문서·원본 inventory 검증이며 parser/comparator 구현 test 또는 실제 수치 비교가 아니다. +CMake/CTest/Harness/FEAST/외부 solver는 이 문서 단계에서 실행하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/msvc-build-access-error.md b/docs/mitc4-shell-feast-eigen/msvc-build-access-error.md deleted file mode 100644 index b35e687..0000000 --- a/docs/mitc4-shell-feast-eigen/msvc-build-access-error.md +++ /dev/null @@ -1,160 +0,0 @@ -# MSVC 빌드 접근 오류와 Ninja 전환 - -- 작성 목적: MITC4 질량행렬·FEAST 구현 준비 중 발생한 Windows 빌드 환경 오류와 조치 기록 -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `Root` (사용자 요청 설명문서) -- 입력 계약: `r2`, `E8` 실행 결과, `E9` 미실행 검증 계획과 `E10` 로컬 설정 결과 -- 작성일: 2026-09-06 -- 상태: MSVC 컴파일·링크 및 후속 CTest 통과 확인. 최초 GoogleTest discovery 오류와 wrapper 비정상 종료로 전체 준비 검증 미완료 - -MSVC 컴파일러와 x64/Debug 조건을 유지하면서 CMake의 빌드 generator를 Visual Studio에서 프로젝트가 이미 지원하는 Ninja로 바꿨다. 기본 `workspace-write` 권한에서 MSVC 컴파일·링크까지 진행했고, 이후 별도 GoogleTest discovery 문제를 확인했다. 최초 manual 빌드가 실패했으므로 전체 준비 검증은 아직 완료되지 않았다. - -## 관찰된 오류 - -Visual Studio generator의 다음 명령이 native `workspace-write` 실행에서 실패했다. - -```powershell -cmake --build .harness/build --config Debug -``` - -오류는 C++ 컴파일 전에 `ZERO_CHECK`의 `GetOutOfDateItems` 작업에서 발생했다. - -```text -MSB4018: GetOutOfDateItems -System.TypeInitializationException: Microsoft.Build.Utilities.FileTracker -System.UnauthorizedAccessException: 0x80070005 (E_ACCESSDENIED) -Microsoft.Build.Framework.NativeMethods.GetLongFilePath -Microsoft.Build.Utilities.FileTracker..cctor() -``` - -같은 실행에서 configure는 성공했지만 manual Debug build는 exit 1이었다. 별도로 등록된 Stop의 build와 CTest는 성공했다. 따라서 자동 검증의 성공으로 native manual build 실패를 통과 처리하지 않았다. - -확인된 범위는 MSBuild의 FileTracker 초기화에서 발생하는 접근 오류다. 어떤 Windows 접근 규칙과 정확한 내부 경로가 거부됐는지까지 확정한 것은 아니다. - -## 앞선 조치와 구분해야 할 문제 - -1. 최초 configure의 `FESA_GTEST_SOURCE_DIR` 누락은 사용자 지정 `C:/git/googletest`와 설치된 MKL/TBB/HDF5 경로로 해결했다. -2. 긴 TEMP 경로에서 기존 pressure 테스트의 결과 잠금 파일 생성이 실패했다. 동일 binary의 TEMP 경로만 바꾼 비교에서 긴 경로는 실패하고 짧은 경로는 통과했다. 이후 TEMP/TMP는 새 `.harness/build/t-<8hex>`, pytest basetemp는 새 `.harness/build/p-<8hex>`를 사용하고 각각 80자 이하를 확인한다. -3. 짧은 TEMP/TMP를 build와 같은 native shell에 직접 설정해도 FileTracker 접근 오류가 재발했다. 따라서 TEMP 대입 누락이나 경로 길이 문제만으로 이 빌드 오류를 설명하지 않는다. - -## 적용한 Ninja 구성 - -- 기존 `windows-msvc-ninja-debug` configure/build/test preset을 함께 사용한다. -- `.harness/config.example.json`의 설정을 ignored `.harness/config.json`으로 사용한다. 예상 밖 기존 설정은 덮어쓰지 않는다. -- 새 binary directory는 `.harness/build-ninja-msvc-debug`다. 기존 VS `.harness/build` cache와 실행 기록을 보존한다. -- Harness를 시작하는 부모 shell에서 설치된 `Launch-VsDevShell.ps1`로 MSVC host/target x64 환경을 설정하고 Ninja 및 승인된 dependency 경로를 적용한다. 이번 실행의 자식 tool shell에서는 해당 스크립트 호출이 PowerShell 실행 정책으로 거부됐다. 실행 정책을 우회하지 않고 부모에서 상속된 `VSINSTALLDIR`, `VSCMD_ARG_TGT_ARCH=x64`, `INCLUDE`, `LIB`, `cl.exe`, `ninja.exe`를 확인한 뒤 컴파일·링크를 진행했다. -- 기존 reference helper가 실제 library의 수정 시각을 확인할 수 있도록 `CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG`를 새 build의 `src/fesa/Debug`로 지정한다. Library를 복사하거나 수정 시각을 조작하지 않는다. -- 환경 변수는 해당 process에서만 설정하고 `finally`에서 복원한다. 정확한 설정·복원과 실행 순서는 [구현 환경 문서 E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)에 있다. - -아래는 `E8`에서 사용한 핵심 검증 명령이다. 후속 재검증은 아직 실행하지 않은 [E9 계획](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)의 병렬도 설정과 진입 조건을 함께 따른다. - -```powershell -$mfeArchive = (Join-Path (Get-Location).Path '.harness/build-ninja-msvc-debug/src/fesa/Debug').Replace('\', '/') -cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive" -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -실제 실행에서는 각 명령의 종료 코드를 즉시 확인하고 실패 시 다음 검증으로 진행하지 않는다. Registered Stop도 같은 preset과 binary directory를 사용한다. Test selection, assertion, source, 수치 계약, reference 원본과 검증 기준은 이 환경 전환에서 변경하지 않는다. - -## 검증 결과 - -| 확인 항목 | 결과 | -| --- | --- | -| 짧은 TEMP를 직접 적용한 기존 native MSBuild | configure exit 0, build exit 1 (`E_ACCESSDENIED`) | -| 위 실행의 별도 registered Stop/CTest | exit 0, 362/362 통과 | -| Root의 새 Ninja 준비 configure | exit 0, 7.446초; MSVC Hostx64/x64, Debug, Ninja 및 dependency 경로 확인 | -| Root configure 전후 보존 확인 | tracked 변경 0, 기존 VS cache 동일, Git clean | -| 새 Ninja native Debug build | 컴파일 경고 0개; 컴파일·링크 이후 integration GoogleTest discovery의 JSON parsing 오류로 exit 1 | -| 새 Ninja manual CTest/full pytest | 최초 manual build 실패 뒤 미실행 | -| 새 Ninja registered 검증의 CMake/CTest | build exit 0, CTest exit 0, 362/362 통과 | -| 위 registered 검증을 감싼 프로세스 | Python 두 프로세스 exit 0, 외부 PowerShell wrapper exit 1; 전체 Hook 성공으로 합치지 않음 | -| E8.2 Harness invocation | native PowerShell exit 1; manual build 실패를 보존 | - -Root의 configure 성공이나 후속 CTest 통과는 최초 manual build 실패를 대체하지 않는다. 이 결과만으로 전체 준비 단계의 통과를 주장하지 않는다. 세부 구현 담당 보고서는 [implementation-prep-evidence.md](implementation-prep-evidence.md)를 참조한다. - -## Ninja에서 추가로 발견된 검증 장애 - -새 Ninja 빌드에서는 기존 FileTracker 접근 오류 대신, 컴파일·링크 후 CMake의 GoogleTest 목록 생성에서 `ParseTestList.cmake:96` JSON parsing 오류가 발생했다. 현재 설치된 모듈 조합을 읽어 다음을 확인했다. - -- `GoogleTestAddTests.cmake`는 `TEST_TARGET`의 SHA-256 앞 10자를 JSON 파일명으로 사용한다. -- `GoogleTest.cmake`와 실제 생성된 세 discovery 스크립트에는 `TEST_TARGET` 인수가 없다. -- 세 스크립트가 같은 디렉터리의 `cmake_test_discovery_e3b0c44298.json`을 삭제·생성·읽는 구조다. -- 동일 integration binary의 단독 목록 생성은 34개 테스트를 반환했고, 생성된 discovery 스크립트도 단독 실행에서는 통과했다. - -이 관찰은 병렬 POST_BUILD discovery의 공유 파일 경쟁을 뒷받침한다. 정확한 최초 경쟁 순서를 재현한 것은 아니며, 단독 진단의 성공으로 최초 전체 빌드 실패를 통과 처리하지 않았다. 후속 `E9` 계획은 `CMAKE_BUILD_PARALLEL_LEVEL=1`과 한 번의 `--clean-first --verbose` 빌드로 세 discovery의 실제 직렬 실행을 검증한다. 설치된 모듈·생성된 JSON·테스트 소스와 discovery guard는 그대로이며, 이 후속 계획은 아직 미실행이다. - -## 자동 검증의 별도 제한 시간 문제와 적용 결과 - -설치된 Codex CLI `0.153.2`의 `hooks/list`·`config/read`를 모델 실행 없이 조회했다. 현재 worktree의 project config는 읽지만, 실제 enabled/trusted Stop Hook은 원본 checkout의 `C:\git\FESADev\.codex\hooks.json`에서 `1800`초로 선택됐다. 현재 worktree 파일의 `7500`초는 실제 Hook 선택에 반영되지 않았다. 공식 지원 `project_root_markers`를 해당 조회에만 지정해도 결과는 같았다. - -이번 native raw에는 Hook 설정 출처 이벤트가 없으므로, 현재 resolver 결과와 당시 외부 PowerShell wrapper가 약 1802초 뒤 exit 1인 관찰을 대조한 진단이다. Python/CTest의 후속 exit 0과 wrapper exit 1은 계속 별도로 보존한다. - -사용자가 공유 설정 변경과 신뢰 검토를 설명받은 뒤 작업 계속을 지시한 범위에 따라 다음 한 값을 적용했다. - -```text -대상: C:\git\FESADev\.codex\hooks.json -필드: hooks.Stop[0].hooks[0].timeout -변경: 1800 -> 7500 (초) -``` - -- 변경 전 파일 SHA-256: `0ab23dad4643f45238f4a60402083e32d8801f5c41fd6ba12b68ef6a9fc5fc28` -- 나머지 bytes를 보존하고 한 번 치환한 적용 파일 SHA-256: `c8065e7b60882da5db3f90d57b265da25b3c25980bf669d0b1da863e621871ca`; 원본 checkout의 로컬 커밋 `42a4847` -- 영향: 이 원본 Hook을 선택하는 다른 worktree에도 제한 시간 변경이 적용된다. Hook 명령, 검증 범위, assertion과 sandbox 권한은 그대로다. -- 승인 경계: 현재 feature worktree 밖의 공유 설정에 대한 이번 지시로 처리했다. 기존 단일 `E6` 실행 승인과는 별개이며, 새 sandbox 우회 또는 원격 작업을 허용하지 않는다. - -공식 문서는 여러 Hook source를 함께 로드하며 상위 layer가 기존 Hook을 대체하지 않는다고 설명한다. 또한 정의가 바뀌면 새 hash에 대한 신뢰 검토가 필요하다. 따라서 inline Hook 추가나 trust 상태의 임의 수정으로 해결하지 않는다. [공식 Hook 문서](https://learn.chatgpt.com/docs/hooks) - -최초 조회 근거는 [기본 설정 해석](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json), [정상 root marker 지정 조회](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-root-marker-observation.json), [두 파일의 읽기 전용 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-source-audit.json)에 있다. - -대화형 CLI는 Windows ConPTY 프로세스 생성 오류로 시작하지 못했다. 공식 app-server `config/value/write`를 사용해 검토한 Stop 정의의 `trusted_hash` 한 필드만 등록했다. `expectedVersion`으로 동시 변경을 검사했고, 설정 전체의 의미를 메모리에서 비교해 다른 필드가 같음을 확인했다. 최초 API 조회에서는 해시의 `sha256:` 접두사를 예상하지 못해 write 전에 중단했으며 그 기록도 보존했다. - -후속 `hooks/list`에서 canonical source, `timeoutSec=7500`, `enabled=true`, `trustStatus=trusted` 및 현재 정의 해시 `sha256:a6bfcf3553d81e134065da4e66e8124e245d302c11e90b09ecdf07ff79b034a8`을 확인했다. [공식 API 적용·확인 기록](../../.harness/build/mitc4-eigen-evidence/prep/hook-timeout-activation/trust-review-official-api.json)은 exit 0이다. 이 조회·설정 과정에서는 Hook을 실행하지 않았고, 실제 전체 검증 통과 여부는 후속 prep 실행에서 판정한다. - -## 근거 기록 - -- [동일 native build shell의 TEMP/TMP 설정과 FileTracker 실패](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-manual-build-environment-observation.json) -- [새 Ninja 환경 준비 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/result.json), [실제 선택된 compiler·dependency·archive 경로](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/configuration-observation.json) -- [최초 Ninja manual build 원시 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/manual-cmake-d2d41bcf6bb242f4b484ea02850d762e/build.log): UTF-16LE, SHA-256 `47484e659a73977626c549fb56783ad5416ff14260e48e559b37b6b93f358f96` -- [설치된 CMake 모듈과 생성된 discovery 경로의 읽기 전용 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json): SHA-256 `9d383f04a347df95b742403ceca4732b331ddf4ec96437993f0ceffaa060bf59` -- [실제 프로세스 종료 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json): CMake PID `1916`, CTest `21912`, Python `3492`/`24968`, 외부 wrapper `23560`, Harness 부모 `21996`을 command·parent와 함께 대조했다. 파일의 `role`은 탐색용 분류다. `rg` 소스 조회 shell인 PID `10528`은 Hook 실행에서 제외한다. - -이 원시 로그는 해당 workspace의 ignored 검증 artifact다. 장기 workflow 상태와 후속 실행 판정은 [coordination.md](coordination.md)를 기준으로 한다. - -## E10: 자동 Stop의 의존성 경로 누락 해결 - -초기 `E8` 설정은 process 단위였다. 설명문서 커밋 뒤 별도 자동 Stop에서는 부모 환경의 의존성 변수 네 개가 없었고, 공통 preset의 `$env{...}`가 cache를 빈 값으로 덮어써 `FESA_GTEST_SOURCE_DIR` 오류가 재발했다. [당시 cache와 관찰 기록](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)을 보존했다. - -이를 해결하기 위해 workspace 전용 `CMakeUserPresets.json`에 `mfe-workspace-msvc-ninja-debug`를 만들었다. - -- 공통 preset을 상속하면서 GoogleTest `C:/git/googletest`와 MKL/TBB/HDF5 설치 경로를 cache 값으로 직접 지정한다. -- 정상 MSVC x64 개발 환경에서 얻은 INCLUDE/LIB 및 cl/rc/mt/Ninja 실행 경로를 담고, build/test가 configure 환경을 상속하도록 한다. -- CMake child의 TEMP/TMP는 설정 수명 동안 전용 70자 경로를 사용하고 빌드 병렬도는 `1`로 지정한다. Python/pytest의 새 basetemp 규칙은 유지한다. -- ignored `.harness/config.json`의 configure/build/test preset을 모두 같은 로컬 이름으로 맞춘다. `/CMakeUserPresets.json` 한 줄을 `.gitignore`에 추가해 `3cfbefb`로 커밋했다. - -이제 해당 workspace에서는 부모 환경에 의존성 변수 네 개가 없어도 다음 명령이 설정을 읽는다. 전체 명령 대응과 복원 절차는 [E10 환경 문서](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)에 있다. - -```powershell -cmake --preset mfe-workspace-msvc-ninja-debug -``` - -| 확인 항목 | 실제 결과 | -| --- | --- | -| 새 preset 목록·local config 해석 | 통과 | -| 최초 E10 configure | exit 1. 의존성은 찾았지만 compiler 경로의 `Hostx64`/`HostX64` 표기 차이로 CMake가 cache를 재초기화했고, 내부 재configure에서 의존성 값이 사라짐 | -| compiler 문자열 일치 확인 뒤 동일 preset의 configure 한 번 | exit 0, 1.656초, stderr 0 bytes; 부모의 의존성 변수 네 개는 미설정 | -| 후속 cache·adapter 대조 | 의존성 네 경로, MSVC 19.51/x64, pointer 8 bytes, Ninja/Debug, Debug archive 경로 및 네 검증 명령의 local preset 일치 확인 | -| E10의 production build/CTest | 미실행; configure 성공을 전체 구현 준비 통과로 대체하지 않음 | - -근거는 [최초 실행 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/result.json), [후속 configure 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configure-followup/result.json), [최종 설정·명령 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configuration-observation.json)에 있다. 기존 solver library hash, source, phase history와 원본 checkout의 Hook은 보존했다. - -로컬 preset·설정·전용 TEMP는 workspace에 유지한다. 설치 경로 변경이나 feature 종료 때 설정 수명을 검토한다. E10 의존성 설정과 위 공유 Hook의 제한 시간·신뢰 수정은 별도로 적용·검증했다. - -## E11: 실제 자동 검증 결과 - -후속 실행의 등록 Stop은 `mfe-workspace-msvc-ninja-debug`와 Ninja `-j 1`을 사용했고, CTest **362개 통과·실패 0개**로 끝났다. CTest PID `8112`, Stop Python `20788`/`25272`, 외부 wrapper `24308`의 실제 exit 0을 관찰했다. Wrapper는 13:04:39Z부터 13:37:13Z까지 약 1,954초 실행돼 이전 1,800초 제한을 넘겨 정상 종료했다. 근거는 [보존된 CTest 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/registered-LastTest.log), [실제 종료 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-process-observations-resumed.jsonl), [Coordinator terminal 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/coordinator-terminal-audit.json)에 있다. - -이때 수동 검증 담당은 이전 VS 명령을 사용해 FileTracker 오류를 다시 만났으므로, 수동 검증과 prep 전체는 통과하지 않았다. Native Executor exit 2와 `blocked` 결과도 보존했다. 다음 조치는 prep/main Step 문서에 현재 preset 명령을 직접 명시하는 계획 정합이며, 자동 검증 성공을 mass/FEAST 구현 완료로 해석하지 않는다. 첫 관찰기는 로그 파일 공유 충돌로 중단돼 재연결했으므로, 그 공백의 build exit는 직접 관찰했다고 주장하지 않는다. PID 재사용 또는 handle 확보 실패 행도 성공 종료 근거에서 제외한다. - -기존 Executor가 실제 argv에 `--dangerously-bypass-hook-trust`를 넣는 사실도 확인했다. 이번 수정에서 추가한 옵션은 아니며, 별도 read-only [전체 Hook 조회](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-all-hook-trust-observation.json)에서는 적용 대상 10개 모두 `enabled/trusted`였다. 따라서 옵션이 없었다고 보고하지 않으며, 검토한 정의의 정상 신뢰 등록 근거를 별도로 보존한다. diff --git a/docs/mitc4-shell-feast-eigen/numerical-review-cases.md b/docs/mitc4-shell-feast-eigen/numerical-review-cases.md deleted file mode 100644 index 5ef55b7..0000000 --- a/docs/mitc4-shell-feast-eigen/numerical-review-cases.md +++ /dev/null @@ -1,122 +0,0 @@ -# MITC4 eigen 필수 verification portfolio - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `numerical-review-agent` -- Input contract revision: `r2` -- 기본 보고서: [numerical-review.md](numerical-review.md) -- 수치 기준: [controls C1~C7](numerical-review-controls.md) - -아래는 Planning이 RED→observed failure→GREEN→focused/full VERIFY에 연결할 **필수 -logical cases**다. C++ test 이름·파일과 final schema는 각 owner가 정한다. 새로운 reference -생성/수정 없이 synthetic test inputs는 tests의 승인 소유 경로에 둔다. Expected value를 -production mass/reduction/FEAST 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다. - -## P1. Mass·좌표·조립 - -| Case ID | 입력·독립 oracle·필수 관찰 | 판정 | -| --- | --- | --- | -| MFE-C01 | Affine rectangle `4×2`, rho=3, t=1/2, parallel unit director. M10: C0=`(rho t A/36)*[4,2,1,2;...]`, C1=0, C2=t²C0/12, node m=3, h=0, j=1/16. Full24와 physical20·각 translation energy·tangent inertia/drill null을 검사. rho×4, t×2의 C0/C2 scaling도 검사 | C2 모든 관련 scalar/matrix/rank 기준 | -| MFE-C02 | [r1 rational warped/director-varying fixture](numerical-review-evidence.md#독립-mass-oracle)의 X,d,rho,t와 exact coefficient/row/first-moment oracle. Independent coefficient integration 또는 별도 고차 direct integration을 사용. C1을 강제0, 2-point mass, flat C2 비례식 mutation은 실패해야 함. 같은 shape/J production 호출만으로 oracle 구성 금지 | C2-02~10; 기존 geometry predicate를 먼저 적용. Custom-director kernel fixture를 input explicit normals 지원으로 확대하지 않음 | -| MFE-C03 | Consistent/moment snapshot을 유지하고 row-sum→lumped 연결 검사. C1/C2의 controlled symmetric perturbation이 원 mass와 derived block에 모두 반영됨. Independent nodal `integral rho Ni Gi^T Gi` 및 고정 velocities의 pairwise Jensen work와 비교. Uniform translation, drill-only, nonuniform translation, tangent rotation을 각각 검사 | C2-02~10; nonnegative kinetic energy, zero branch 및 총질량·centroid 보존 | -| MFE-C04 | Square `[-1,1]^2`, rho=t=1, uniform m×m grid m=1,2,4, velocity `(x,0,0)`, theta=0. Direct polynomial gives `q^T MC q=4/3`, `q^T(ML-MC)q=8/(3m²)`. Independent constant velocity의 두 energy는 모두 총질량4 | Exact sequence에 C2-03/04/06. 이는 이 smooth field의 lumping error 검산이며 일반 spectrum 수렴 차수 약속 아님 | -| MFE-C05 | C01/C02의 global proper rotation과 origin translation. Q는 rational proper rotation `[[0,-1,0],[3/5,0,-4/5],[4/5,0,3/5]]`, shift=(7,-3,5). Geometry/director/frame/mass를 새로 계산. Scalar full-row lumping이 실패하는 d=(1,1,1)/sqrt3도 사용 | 두 mass congruence와 kinetic work C2-02; moment는 common Xref, drilling null 보존 | -| MFE-C06 | 공유 node·서로 다른 rho/thickness section의 shell patch. Element 순서와 source labels가 다른 입력의 대응 결과, sequential/병렬 contribution 및 stable reduction을 검사. 실제 constraints와 source indices를 독립 expected map으로 대조 | Exact structure/order/identity, C2 matrix equality. Input permutation 자체와 fixed source-order determinism을 구분 | -| MFE-C07 | rho=0/negative/NaN/Inf/missing/duplicate/unresolved/dependent, invalid t/material, inverted/degenerate/기존 미지원 geometry 및 27점 중 invalid evaluation을 각각 거부. Density가 없는 기존 static case는 허용 | Semantic/geometry/model failure, 상태·output 미반영. Mass zero 우회 금지 | - -## P2. Stabilization·partial BC·정적 영향 - -| Case ID | 입력·독립 oracle·필수 관찰 | 판정 | -| --- | --- | --- | -| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례)와 Z45° 회전. S1을 새 frame에서 계산. Expected kd=19/4800, Mff=3/50, Kff=10369/7500, lambda=10369/450. 모든 DOF fixed, node1 URZ만 free. Old min rule은 이 case를 실패시켜야 함 | Complete K·두 mass·kd congruence C2, exact eigenvalue C3-07, 원 free residual. Full-free/clamp 대체 금지 | -| MFE-C09 | C08에 admissible moment `m=(5/3)M0 b`, M0=1, b=(-4/5,0,3/5). 각 geometry에서 load도 변환. Expected thetaZ=7500/10369. 원 full `Kq-F`의 모든 reaction 성분을 회전해 비교 | C7 static response/full residual/reaction covariance, physical moment projection<=1e-12 | -| MFE-C10 | Eight diagonal inventory `[0,0,2,4,0,6,0,4]`이면 kref=2,kd=.002. All-zero, 한 negative, NaN/Inf는 failure. DBL_MAX 근방 양성 inventory는 scaled mean이 가능한 경우 finite; subnormal kd underflow는 failure. Independent node별 tangent changes O angles=(0,pi/6,pi/4,pi/3)에서도 trace 동일 | C2-11/12; 분모8 고정, clamp/positive-only mean/min 금지 | -| MFE-C11 | Free affine element와 smooth patch의 세 rigid translation·세 tangent-projected rigid rotation. Pure drill은 별도 4개. Physical K20 rank14, consistent physical mass rank20, complete K24 rank18/nullity6; positive-space dimension20. Full massless reduction 후 six near-zero physical modes가 남음 | C2/C3 analytic rank·rigid K action·mass Gram; drill에 관성을 주거나 physical zero mode 삭제 금지 | -| MFE-C12 | 기존 nonlinear fixture에서 초기 scale=S1, trial/commit/rollback에 exact unchanged. 기존 objective gamma potential의 first/second directional variations, finite rigid motion, linear physical limit, physical recovery 제외와 reaction conversion | [기존 nonlinear 계약](../nonlinear-static-newton-raphson/numerical-review.md) 및 C7. Trial scale 재선정·nonlinear Hessian SPD·linear Td entry equality를 요구하지 않음 | - -## P3. 실제 BC·mass whitening·FEAST - -| Case ID | 입력·독립 oracle·필수 관찰 | 판정 | -| --- | --- | --- | -| MFE-C13 | Nodal M6 h=0,m=j=1의 manufactured block. d=(0,0,1), d=(3/5,0,4/5), d=(1,1,1)/sqrt3에 full free, URX fixed, URZ only free, all rotations fixed, drill-only free, fully constrained 조합. 조합은 Cartesian product가 아니라 지원되는 global component BC로 표현 가능한 경우만 적용하며, drill-only free는 d=(0,0,1)에서 URZ만 free이고 나머지5 DOF constrained인 경우로 한정한다(MPC 없음). Expected null은 constrained director 성분의 exact-zero 교집합. Mixed nodes에는 local finite rank0가 있어도 다른 finite node 보존 | E2 analytic dimension, C2-07~14, recovered source mask. Global n=0 또는 N>n은 failure | -| MFE-C14 | `d=(2p/(1+p²),0,(1-p²)/(1+p²))`, p=1/2000와1e-8. m=j=1,h=0; URX만 fixed, 세 translation과 URY/URZ free. 첫 case positive rank5와 conditioning pass; 두 번째는 여전히 analytic rank5이나 conditioning/Cholesky failure. p=0은 정확한 null1 | C2 rcond cutoff의 양옆 및 exact equality branch. Tiny positive mass를 rank4로 바꾸는 구현은 실패 | -| MFE-C15 | 독립 singular pencil K=[[6,2],[2,4]], M=diag(2,0)에서 finite lambda=5/2,z=-p/2. 단순 삭제의3은 오답. Production shell projection path에 nonzero Kpz 또는 nonpositive Kzz 주입 시 실패. 일반 dense Schur 기능을 구현할 필요 없음 | Original residual oracle와 E3 admissibility rejection, 임의 fallback 금지 | -| MFE-C16 | SPD nodal whitening `M=[[2,1],[1,2]]`, `K=[[6,4],[4,6]]`의 eigenvalues 2,10/3. Dense inverse 없이 congruence·복원·original-M normalization. 같은 eigenvectors에 틀린 lambda·mass variant·null coordinate/constraint를 각각 주입 | C2/C3, injected wrong pairing/mass/full residual이 실패해야 함 | -| MFE-C17 | Actual FEAST diagonal known spectra: n1 λ=2,N1; `[0,0,0,2,5,9]`에 N1/4/6; `[1,2,4,8]` N1/2/4; n4 all-zero N1/4. 요청 N은 별도 input count이고 count output과 분리 | C3/C5, lowest N/multiplicity/zero/N=n, count/guard/solve history; mock만으로 대체 금지 | -| MFE-C18 | Actual FEAST n64 spectrum: 앞40개 λ=1, 나머지 λ=2..25, N1 및N41. n4 tight spectrum `[1,1+2^-28,1+2^-27,8]`, N2. B=Q diag(lambda) Q^T의 dense-pattern test도 추가; Q는 고정 Givens(pi/6,pi/4) 곱 | C3-07/08, repeated group>N에서 c/m0가 N보다 커짐, 전체 c Gram, partial cluster merge 금지 | -| MFE-C19 | Actual backend에 `[ -2,0,3 ]`, `[ -1e-12,0,1 ]`. Backend raw negative 보존; procedure는 첫 spectrum의 유의한 음수 실패, near-zero negative는 classification·frequency-validity/raw 보존. Exact `±tau_zero*s` 및 그 양옆은 arithmetic/injection 경계 test | C3 분류와 실패 보존. 부적합 물리 K를 accepted shell이라고 주장하지 않음 | -| MFE-C20 | Density×4에서 두 M×4, λ/4, normalized vector amplitude 1/2; C08과 simple/repeated known-spectrum fixture 사용. 길이×1024, rho/1024³,E/1024,t×1024의 일관 단위 변환에서도 λ 불변 | C2/C3/C4; baseline s·same physical BC, 단위 mixing/floor 검출 | -| MFE-C21 | Endpoint=eigenvalue collision, prefix0 반환, nonmonotone count, total!=n, m!=c, info1/2/3/4/-1..-5/200..202·invalid fpm, missing/duplicate/nonfinite CSR, B-not-SPD를 각각 주입. QR rank/Gram failure·insufficient capacity·nonfinite pair·wrong residual도 주입 | C5의 정확한 retry 대상·budget/최종 failure. Error를 empty interval 또는 부분 성공으로 바꾸지 않음 | -| MFE-C22 | 실제 operator에 near endpoint/repeated cluster의 C5 history 검증과 adapter-mock count-call512/solve-call3 최대 경계, budget 직전 certified bracket fallback. Index/nnz+1/n²/n*m0 overflow 및 allocation 실패 injection | 정수 exact checks, 유한 종료, controlled failure. 큰 메모리를 실제 할당해 실패시킬 필요 없음 | - -MFE-C17/18 actual FEAST case에서 bounds를 expected eigenvalues로 설정하지 않는다. -Production E6/C5 search를 실행하고 independent diagonal spectrum의 prefix count와 -postsolve 결과로 history를 검증한다. Synthetic rotated pencil은 sparse CSR에 전 dense -pattern을 저장할 수 있지만 다른 eigensolver로 expected values를 계산하지 않는다. -False count/solve success가 lowest-N를 검증하지 못하는 mock도 포함해 missing low eigenpair를 -Gram/residual만으로 성공시키는 경로를 잡는다. - -## P4. I/O·reference·운영 closure - -| Case ID | 필수 관찰 | 판정 | -| --- | --- | --- | -| MFE-C23 | 원본 input의 density/section mapping·S4/S4R common physical path·Step-2/N10·blank bounds·Lanczos/SIM/acoustic-free no-op·mass normalization. Unsupported fields, prior step/preload, nonzero BC, damping/acoustic/mixed elements는 fail-closed | I/O가 fixed syntax allowlist·진단으로 구체화. Source count와 actual FEAST count/backend 구분 | -| MFE-C24 | Source renumbering과 output self-check; logical mode/source identity·lambda dimension·actual mass/backend·candidate를 HDF5에서 복원. 기존 final hash/accepted state를 준비하고 solve/validation/write/close/replace failure 주입 | 정확한 schema는 I/O 소유. 모든 failure에서 계약 범위의 이전 state/final 보존, log는 별도 lifecycle | -| MFE-C25 | [새 eigen reference](reference-model.md) 10개 Value, 10 singleton families, comparator prechecks/1% RMS·5% row·near-zero·zero-scale inclusive 경계. Equal values의 distinct IDs와 reordered TXT는 허용, missing/extra/duplicate/NaN/Inf/wrong quantity/mass/schema는 실패 | 공통 policy 그대로, 모든 Value blocking. Actual FESA fresh binary 결과로 실행 | -| MFE-C26 | 아래 기존 linear/nonlinear static portfolio·configured 전체 regression suite·새 warning 없음. Density 없는 기존 static, source mapping·partial-BC response·Newton objective/tangent·평형·reaction·energy·rollback | C7와 기존 reference identity/policy. Old kd 수치 equality는 대체하되 다른 기준 유지 | -| MFE-C27 | RED가 변경 동작 때문에 실패했는지 확인, GREEN/focused/full MSVC x64 Debug CMake/CTest 실제 exit, actual FEAST/backend identity, fresh reference timestamps/hashes. 세 반복 구조/order/diagnostic 및 scalar 재현성 | C4, 전27개 requirement evidence 및 동일 r2 Physics/Release closure. 누락·실패·stale를 통과 처리 금지 | - -기존 정적 포트폴리오의 원본 목록은 -[Requirement evidence](requirements-evidence.md#필수-회귀-포트폴리오와-identity)와 -[현재 nonlinear reference-model](../nonlinear-static-newton-raphson/reference-model.md)이다. -`shell`/`shellNL`/`shellNL-meshfine`의 해당 `.inp`와 같은 폴더의 원본 -` displacements.csv`, nonlinear의 required review-only reactions를 그대로 사용한다. -Linear `shell-s4`와 `shell-s4-linear-limit`는 같은 input의 서로 다른 검토 역할이며 -같은 fresh solve를 재사용할 수 있어도 각 identity/회귀 증거를 생략하지 않는다. - -U1/U2/U3는 global length blocking, UR1/UR2/UR3는 fixed-initial global rotation-vector -warning-only이며 같은 step/accepted state·case·dimension·coordinates·impact별 공통 family다. -Nonlinear RF1/RF2/RF3와 physical spatial RM1/RM2는 기존 source-key·finite·inventory 및 -error/RMS report를 유지하는 review-only다. RM3/stress는 기존 numerical gate에 넣지 않는다. -Factor-one 내부 force/moment equilibrium은 별도 blocking이고 C7를 따른다. -`shellnl-meshfine-02-s4-final`의 post-closure 역할은 그대로 유지하며 등록 suite의 해당 -실행·영향 evidence를 기록한다. 과거 세 case의 closure로 소급 합치지 않는다. - -Root가 관찰한 중단 baseline/단독 재현/나머지 pressure tests는 새 binary 전체 suite의 -성공 evidence가 아니다. Reference 테스트의 HDF5 cache가 이전 library보다 새롭다는 -이유로 옛 solve를 재사용하지 않았는지 확인하고, r2 영향을 받는 final comparison은 새 binary의 -fresh solve evidence로 남긴다. Reference input/results를 수정하거나 Hook state를 조작하지 않는다. - -## Requirement coverage - -아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다. -Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md)가 원본이다. - -| Requirement suffix | 필수 cases | -| --- | --- | -| 001 | MFE-C23, MFE-C25 | -| 002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 | -| 003 | MFE-C06, MFE-C07, MFE-C23 | -| 004 | MFE-C01, MFE-C02, MFE-C07 | -| 005 | MFE-C01, MFE-C02, MFE-C03 | -| 006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 | -| 007 | MFE-C06, MFE-C13, MFE-C27 | -| 008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 | -| 009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 | -| 010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 | -| 011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 | -| 012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 | -| 013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 | -| 014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 | -| 015 | MFE-C23, MFE-C25 | -| 016 | MFE-C07, MFE-C21, MFE-C23 | -| 017 | MFE-C24, MFE-C25 | -| 018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 | -| 019 | MFE-C21, MFE-C22, MFE-C24 | -| 020 | MFE-C25, MFE-C26 | -| 021 | MFE-C25 | -| 022 | MFE-C25 | -| 023 | MFE-C27 | -| 024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 | -| 025 | MFE-C27 | -| 026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 | -| 027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 | diff --git a/docs/mitc4-shell-feast-eigen/numerical-review-controls.md b/docs/mitc4-shell-feast-eigen/numerical-review-controls.md deleted file mode 100644 index 4633e3b..0000000 --- a/docs/mitc4-shell-feast-eigen/numerical-review-controls.md +++ /dev/null @@ -1,232 +0,0 @@ -# MITC4 eigen 내부 수치 기준 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `numerical-review-agent` -- Input contract revision: `r2` -- 기본 보고서: [numerical-review.md](numerical-review.md) -- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증. - -[V1~V6](formulation-verification.md), [E1~E8](formulation-eigen.md), -[S1~S8](formulation-stabilization.md)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부 -수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통 -tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다. - -## C1. Scale, 공통 zero branch와 근거 - -`ell`, `D`, `Khat/Mhat`, `Kf/Mf`, `A`, `s`, `B=A/s`는 E1/E6대로 사용한다. -같은 비교의 두 행렬에는 같은 ell을 적용한다. Matrix norms는 Frobenius, -vector norms는 Euclidean이며 별도 inf 표기만 infinity norm이다. Mixed force/moment 또는 -translation/rotation 원값을 직접 더하지 않는다. Scaled sum-of-squares와 stable ordered sum을 -쓰고 finite-first로 검사한다. 모든 ratio는 분모가 양수일 때 계산한다. -`numerator=denominator=0`은 metric 0, `denominator=0,numerator!=0`은 named failure다. -Zero eigenvector, nonpositive modal mass 및 invalid scale은 이 zero-pass의 대상이 아니다. -어떤 branch에도 `max(1,physical_scale)`, mass/eigenvalue floor나 clamp를 추가하지 않는다. - -공통 기본값은 `tau_alg=1e-12`, `tau_modal=1e-10`이다. 기존 -[linear NR-D02](../linear-static-mitc4-shell/numerical-review.md)의 algebraic/rigid 기준을 -유지하며 mass polynomial과 trace의 같은 단위 항등식에도 적용한다. -Unit roundoff `u=2^-53`에서 `gamma_k=ku/(1-ku)`이다. 4096개의 단순 연산을 가정한 -`gamma_4096≈4.55e-13`에 비해 `1e-12`는 작은 dense block·27점 적분의 정상 산술 오차를 -구분할 여유가 있다. 이는 모든 geometry의 forward-error theorem이 아니다. -Rank·conditioning·원 residual·독립 oracle를 따로 요구한다. 현재 rational oracle 및 -r2 covariance 오차는 이 기준보다 충분히 작지만 기준을 그 결과에 맞춰 고른 것은 아니다. - -`tau_modal`은 `1e-12` 내부 FEAST stopping보다 100배 큰 후검증 한계다. -외부 1% 판정을 내부 residual 허용값으로 쓰지 않는다. 같은 계산의 재실행 구조/row/ -diagnostic 순서는 exact이고, eigenvector의 repeated-basis 비유일성은 C4를 따른다. - -## C2. Matrix, mass, stabilization와 reduction - -| ID | Metric / exact predicate | 한계·zero 처리 | -| --- | --- | --- | -| C2-01 | V1 `eta_sym(Q)`; mass·physical K·linear complete K·whitened A | `<=1e-12`; Q=0이면 C1. 대칭 copy 자체만 독립 evidence로 사용하지 않음 | -| C2-02 | V1 `\|\|R-S\|\|F/(\|\|R\|\|F+\|\|S\|\|F)`; congruence, moment→matrix, 직접 적분, Cholesky reconstruction | `<=1e-12`; 단위·같은 scale 필수 | -| C2-03 | Scalar moment entry oracle: `\|Ck_ij-Ck*_ij\|/[m_e(t/2)^k]` | k=0,1,2 각각 `<=1e-12`; positive `m_e=integral rho dV`. Exact C1=0도 이 차원 일치 scale로 검사 | -| C2-04 | Mass total `\|m-m*\|/(\|m\|+\|m*\|)`; uniform translation energy | `<=1e-12`; 각 방향을 따로 검사, trace(Muu)를 총질량으로 쓰지 않음 | -| C2-05 | Shifted spatial first moment difference divided by `m_e ell` | `<=1e-12`; 한 source node를 공통 Xref로 사용. `hi di` 포함 | -| C2-06 | M9 difference vs independent pairwise integral / `(q^T ML q+q^T MC q)` | absolute mismatch `<=1e-12`; raw Delta/scale `>=-1e-12`. Zero motion/drill-only는 C1. Negative roundoff를 값을 0으로 바꾸는 데 사용하지 않음 | -| C2-07 | V2 mass-null action, MZ, KZ | 각각 `<=1e-12`; nz=0은 N/A. 정확한 analytic null만 대상 | -| C2-08 | `\|\|P^T Z\|\|F`, `\|\|[P Z]^T[P Z]-I\|\|F/sqrt(nf)` | `<=1e-12`; 각 node basis의 해당 norm도 `<=1e-12` | -| C2-09 | `mi>0,ji>0,ji-hi²/mi>0`; consistent physical20 및 모든 nonempty Mp nodal block Cholesky | strict, finite. Zero/negative pivot·variance는 실패. Consistent rank20/lumped rank5는 analytic expected rank로 검증 | -| C2-10 | `\|(ji-hi²/mi)-integral rho Ni(z-hi/mi)²dV\|/(ji+hi²/mi)` | `<=1e-12`; `vi/ell²`, `\|hi\|/sqrt(mi ji)`도 기록하며 별도 rank cutoff로 쓰지 않음 | -| C2-11 | S2 여덟 초기 rotation diagonals | 모두 finite `>=0`, 하나 이상 `>0`; zero 포함 분모8. `kd>0` finite. Negative를 허용오차로 0 처리하지 않음 | -| C2-12 | `\|kd'-kd\|/(\|kd'\|+\|kd\|)` 및 직접 trace oracle | `<=1e-12`; global 회전/독립 tangent 재생성 후 계산. Trial별 frozen kd는 exact unchanged | -| C2-13 | E3 `Kzz=diag(kappa_i)`, `kappa_i=sum incident kd,e` | 각 kappa finite `>0`, expected diagonal relation C2-02; Kpz 검사와 원 free residual을 함께 요구 | -| C2-14 | Scaled constrained component norm V3 | `0` exact; 복원한 source constrained entries도 exact zero | - -Positive/null dimension은 **E2의 constrained director component exact-zero 교집합**으로만 -정한다. Constrained director의 tiny nonzero 성분을 축정렬이라고 반올림하지 않는다. -각 nonempty dimension≤6 scaled nodal Mp에 - -`rcond_inf = 1/(||Mp||inf ||Mp^-1||inf) >= 2^-32 = 2.3283064365386963e-10` - -을 요구한다. 작은 block의 Cholesky triangular solves로 inverse action norm을 구하며 -global inverse는 만들지 않는다. Product overflow를 피하는 동치 ratio로 계산한다. -이 조건은 physical rank 변경이 아니라 binary64 whitening의 numerical admissibility다. -64 연산의 `gamma_64/rcond`를 약 `3.06e-5` 이하로 제한하는 최소 guard이며 -모든 eigenvalue의 상대 정확도를 보장하지 않는다. Cholesky reconstruction과 full modal -residual을 통과해야 한다. 한계 미만·unresolvable estimate는 conditioning failure이고 -좌표 삭제, 더 큰 mass, 다른 solver로 우회하지 않는다. 빈 nodal block은 skip하지만 -global n=0 또는 요청 N>n은 명시적 failure다. - -## C3. Eigenpair 및 물리 내부 판정 - -계산된 c개 **전체** eigenpair를 검사한 뒤 첫 N개만 공개한다. V3/V4의 actual M은 ML다. - -| ID | Metric | 한계 | -| --- | --- | --- | -| C3-01 | V1 full original free residual `eta_r`; V3 whitened `eta_w` | 각각 `<=1e-10` | -| C3-02 | 추가 operator-scale residual `rho_B=\|\|Bx-mu x\|\|2/\|\|x\|\|2` | `<=1e-10`; dimensionless. Frobenius norm의 크기로 오류가 희석되는 것을 방지 | -| C3-03 | V3 `eta_norm,i`, pairwise `eta_orth,ij`, `eta_G` | 각각 `<=1e-10`; positive mass를 먼저 확인. Gram full rank는 이 bound와 독립 column 수로 확인 | -| C3-04 | V4 energy/Rayleigh consistency `eta_energy,i` | `<=1e-10`; zero lambda도 C1/V4 분모 사용 | -| C3-05 | V5 rigid K action | 각 6개 field `<=1e-10`; physical rigid mass Gram는 Cholesky 성공, vector 수6. Drill과 혼동하지 않음 | -| C3-06 | `\|c_rho lambda_i'-lambda_i\|/s` 또는 coordinate `\|lambda_i'-lambda_i\|/s` | `<=1e-10`; repeated group 내부 pairing은 C4. 동일 물리 BC·loads 사용 | -| C3-07 | Exact known-spectrum test eigenvalue error / known s | `<=1e-10`이고, 알려진 인접 distinct gap이 있으면 absolute error도 `<=gap/8` | -| C3-08 | Simple/반복군 C4 projector error V5 | `<=1e-6`; 테스트의 해당 군과 나머지 spectrum 사이 known gap은 `>=1e-3 s`로 선택 | - -C3-02는 symmetric B에서 computed mu가 실제 spectrum으로부터 residue norm 이내에 -있다는 직접 spectral-decomposition bound를 사용한다. 가장 낮은 mode인지, 올바른 -multiplicity인지는 증명하지 않으므로 C5 count/endpoint evidence가 별도로 필수다. - -FEAST의 `res`는 backend diagnostic이고 C3의 독립 residual을 대신하지 않는다. -Zero eigenvalue에서 backend relative-residual의 분모가 0이면 해당 diagnostic은 unavailable로 -기록하고 이유를 남긴다. Raw e/x, 자체 metric 및 최종 scalar 결과는 finite여야 한다. -Undefined backend diagnostic을 physical residual=0으로 바꾸거나 mandatory finite 결과에 -NaN을 저장하지 않는다. Trace `epsout`은 strict interval에서 finite여야 한다. - -Raw `mu=lambda/s`에서 `tau_zero=1e-9`, `tau_cluster=1e-8`로 고정한다. -`mu<-tau_zero`는 유의한 negative spectrum으로 procedure failure, -`|mu|<=tau_zero`는 near-zero classification, 그 외 양수는 positive다. -Boundary equality는 near-zero에 포함한다. Returned lambda는 부호와 raw 수치를 보존한다. -양수에서만 frequency를 파생하고 exact zero는 f=0, 작은 음수에서는 실수 frequency를 -만들지 않는다. C3-02보다 10배 큰 near-zero band와 100배 큰 cluster band는 수치 분류용이다. -양의 작은 mode를 제거하거나 N을 세는 방식에 쓰지 않는다. s/λ의 nonfinite 또는 -nonzero mu의 λ 환산 underflow-to-zero는 실패하고 physical scale을 1로 바꾸지 않는다. - -## C4. Repeated subspace와 결정론 - -Raw lambda 오름차순의 stable sort, exact equal tie는 original solver column 순서다. -인접 `|lambda_i-lambda_(i-1)|/s<=1e-8`의 connected group은 diagnostic cluster일 뿐, -distinct 값을 merge/평균하거나 vector를 섞을 권한이 아니다. 알려진 exact repeated 군의 -density/rotation tests에서 V5의 mass-whitened projector norm을 사용한다. -Known gap≥1e-3 s와 C3-02이면 first-order invariant-subspace sensitivity는 약1e-7 -수준이므로 C3-08의 1e-6은 방향 비유일성을 허용하면서 잘못된 공간을 검출한다. -이 조건 밖 실제 cluster는 raw eigenpair·Gram/residual을 계속 검사하고 특정 개별 vector -방향의 정확도를 새로 약속하지 않는다. Mode shape 외부 comparison은 없다. - -Source DOF 순서로 largest absolute scaled global component를 찾고 sign을 양수로 -정한다. 동률은 첫 source DOF다. Zero vector는 실패다. 동일 binary/runtime/thread/입력의 -세 반복에서는 sparse structure·COO reduction·row/diagnostic identity가 exact 동일해야 한다. -Scalar 재현 오차는 C3-06, repeated vector는 C4를 적용한다. CPU/runtime를 바꾼 bitwise -eigenvalue/vector equality를 요구하지 않는다. - -## C5. FEAST controls와 bounded interval 정책 - -Actual call은 `dfeast_scsrgv`, `(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR다. -각 call은 `feastinit`하고 아래 C-index fpm을 설정한다. 명시하지 않은 값은 해당 설치의 -초기값을 유지·기록한다. Private backend를 넘어 vendor type을 노출하지 않는다. - -| fpm | 값 | 근거·역할 | -| --- | ---: | --- | -| `[0]` | 0 | Status를 deterministic diagnostic으로 수집 | -| `[1]` | 16 | 공식 허용 contour 값; 기본8보다 적분 resolution에 여유, 모든 attempt 고정 | -| `[2]` | 12 | `1e-12` double stopping; 독립 C3 residual 필수 | -| `[3]` | 20 | 유한 refinement 한계; 미수렴 성공 금지 | -| `[4]` | 1 | 아래 고정 initial subspace 사용 | -| `[5]` | 1 | Endpoint-scaled trace stopping; zero mode에서 C3-02로 독립 검증 | -| `[13]` | 0 | Eigenpairs가 아닌 subspace-only 결과 금지 | -| `[26]`, `[27]` | 1, 1 | CSR validity와 second-matrix SPD check | -| `[49]` | count 1, solve 0 | Total interval count와 실제 eigenpair solve 분리 | -| `[63]` | 0 | 초기 PARDISO 정책 사용; 임의 iparm tuning 금지 | - -근거는 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)과 -[E7의 API/status 출처](formulation-eigen.md#e7-feast-경계와-deterministic-실행)다. -Count는 documented total이며 stochastic estimate로 부르지 않는다. 공식 count/status의 -floating-point 한계가 있으므로 아래 redundant evidence와 실제 known spectra가 필수다. - -Gershgorin 각 off-diagonal absolute sum은 매 덧셈 뒤 `nextafter(+infinity)`로 outward -누적한다. `Bii-ri`/`Bii+ri`도 각각 바깥으로 한 ULP 이동한다. Overflow는 실패다. -`beta=||B||inf`를 같은 outward 방식으로 구한다. Nonzero B에서는 beta>0; -정확한 B=0은 E6의 algorithmic enclosure `[-1,1]`에 대응하여 beta=1로 둔다. -이는 physical mass/λ floor가 아니다. `ulp(v)`는 v의 두 finite adjacent spacing 중 큰 값이며 - -`delta(v)=1e-8 beta + 64 ulp(v)` - -로 정의한다. 초기 endpoints는 `a0=nextafter(gL-16delta(gL),-infinity)`, -`b0=nextafter(gU+16delta(gU),+infinity)`다. Finite strict enclosure와 total count=n을 -확인한 뒤 E6의 upper-prefix search와 empty-prefix lower 축소를 한다. - -Interior endpoint v를 bracket에 반영하려면 `(a0,v-delta(v))`, `(a0,v)`, -`(a0,v+delta(v))`의 count가 모두 `info=0`이고 같아야 한다. 이 guard count는 eigenvalue -근처의 endpoint를 피하는 추가 evidence다. Guard가 enclosure 밖이면 그 부분은 알려진 -outside bound를 이용하며 실제 interval이 strict하지 않으면 평가하지 않는다. -Zero count는 성공 count=0일 때만 믿고 `info=1`을 empty proof로 바꾸지 않는다. -이미 알려진 prefix count와 monotonicity가 맞지 않으면 전체 실패다. - -| 제어 | 유한 값 / 정확한 처리 | -| --- | --- | -| Total count API calls | 전체 analysis 최대512. 성공·실패·guard·최종확인·retry 모두 포함 | -| Search optimization | Upper/lower 각각 최대32 midpoint 단계; optimization count calls 최대384로 남은128 예약 | -| Endpoint collision | 같은 midpoint에서 offsets `0,+1,-1,+2,-2,+4,-4` times delta, 이 순서 최대7후보. 현재 bracket 내부 후보만 사용 | -| Search 종료 | E6의 count target `N<=c<=min(n,2N+8)` 또는 폭 `<=8delta(mid)`/새 representable midpoint 없음/위 budget. 마지막 certified c>=N bracket 사용 | -| 최종 확인 | Enclosure 안의 a에 prefix0, b에 prefix c>=N, 두 endpoint guard, actual `(a,b)` count=c. 불일치/예약 budget 부족이면 실패 | -| Initial solve capacity | E6 그대로 `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n | -| Actual solve calls | 최초 포함 최대3; 각 call loops≤20, control/seed 동일 | -| 허용 solver retry | info1/2/3, count/returned-m mismatch 또는 endpoint separation failure만. 저장된 더 넓은 certified bracket으로 확대·재count, `m0=min(n,max(new formula,2*previous m0))` | -| Retry bracket 순서 | Upper search에 저장된 현재 b보다 큰 성공 b를 오름차순으로 선택, lower는 이전의 더 작은 certified prefix0 또는 a0; 최종 fallback은 원 enclosure | -| 금지 retry | Nonfinite eigenpair, wrong Gram/residual, negative spectrum, invalid/SPD/index/allocation/inner-solver 오류는 즉시 실패. Seed·mass·solver·threshold 변경 금지 | - -새 유효 bracket이 없으면 같은 실패 call을 무조건 반복하지 않는다. Optimization 한계에서는 -이미 certified enclosure를 사용할 수 있지만 실제 solve·최종 count가 실패하면 부분 결과를 -공개하지 않는다. Returned m=c, interval 내부와 `mu-a>=delta(a)`, `b-mu>=delta(b)`, -모든 c columns C3 통과를 확인한다. N번째가 cluster 내부여도 전체 c를 검사하고 출력은 N개다. -Bounds·prefix/guard/status/count/m0/m/loop/epsout·chosen ranks 및 모든 실패를 보존한다. -후속 tolerance 완화나 reference Value를 bounds 설정에 사용하는 것은 금지한다. - -## C6. Initial subspace, thread와 storage - -Count scratch는 E7의 conservative n×n, identity initial x다. 실제 solve에서 m0=n도 -identity다. m0>11)*2^-53)-1`이다. Overflow wrap은 이 generator에만 의도적이며 -size/index 산술에는 허용하지 않는다. Seed를 바꾸며 성공을 찾지 않는다. - -Column ascending의 nonpivoted Householder QR를 사용한다. Scaled norm, `sign(0)=+1`, -`v1=x1+sign(x1)||x||`로 cancellation을 피하고 최종 R diagonal이 양수인 Q를 선택한다. -Original column norm에 대한 `|Rjj|/||input_col_j||2<=1e-12` 또는 zero는 initial-space -rank failure다. Post-QR `||Q^TQ-I||F/sqrt(m0)<=1e-12`를 요구한다. 이것은 모든 -eigenspace overlap의 보장이 아니며 C5 count와 C3 Gram/residual이 계속 필요하다. - -Backend call 동안 oneMKL thread-local count=1을 설정하고 모든 exit에서 이전 값을 복원한다. -[공식 mkl_set_num_threads_local](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의 -반환 previous setting을 사용한다. 전역 설정을 바꾸거나 vendor workspace를 동시 공유하지 -않는다. 설치 runtime/ABI/유효 thread count·seed·controls를 기록한다. Element contribution -병렬 생성은 허용하되 stable reduction 순서는 유지한다. - -Mode cap을 임의의 상수로 만들지 않는다. 정량 representation 경계는 -`1<=N<=n<=MKL_INT_MAX`, `nnz+1<=MKL_INT_MAX`, 모든 row/column in-range, -`n+1`, `6*nodes`, `n*m0`, `n*n`, 각 `count*sizeof(T)`가 internal index 및 -`min(SIZE_MAX,PTRDIFF_MAX)` 안에 있고 해당 container max_size를 넘지 않는 것이다. -곱/합은 overflow 전에 검사하며 double의 정수 근삿값으로 capacity를 계산하지 않는다. -Conservative double n×n scratch는 Win64에서 표현상 n≤`1073741823`이고 실제 사용 가능 -메모리 한계는 훨씬 작다. Allocation/factorization 실패는 명시적으로 종료하며 N을 줄이지 않는다. -Reference n=3125의 count x만 `78,125,000` bytes다. 이를 전체 peak memory라고 부르지 않고 -CSR, FEAST reduced storage 및 complex shifted sparse fill을 따로 기록한다. - -## C7. 승인된 정적 회귀 기준 - -새 scale을 적용하되 기존 [linear NR](../linear-static-mitc4-shell/numerical-review.md)의 -symmetry/frame/energy `1e-12`, rigid/full residual/global equilibrium `1e-10`을 유지한다. -NR-MFE-001 static response는 C2 congruence `1e-12`와 complete full residual `1e-10`이다. -Static moment admissibility는 기존 `|d·m|/||m||<=1e-12`, zero moment는 별도 branch다. - -기존 [nonlinear NR §6](../nonlinear-static-newton-raphson/numerical-review.md)는 그대로다: -rotation/frame 및 no-applied-moment tangent symmetry `1e-12`, directional tangent error -`1e-6`(zero analytical direction `1e-10`), finite-rigid objectivity `1e-10`, factor-one -global force/moment balance 각 `1e-8`. 기존 finite-difference schedule -`[1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7]` 및 interior index3 기준을 유지한다. -근거는 [등록된 tangent test](../../tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp)와 -기존 승인 numerical contract다. 새 scale의 Dkd=D²kd=0 및 gamma derivative를 검산한다. -Nonlinear Hessian 전체의 SPD 또는 linear Tdrill과의 entry equality를 추가하지 않는다. -NSNR-069/070의 네 채널·typed zero-scale·100 iteration·no cutback/retry 종료 정책도 -기존 계약을 보존한다. 새 eigen C1 zero branch로 해당 승인 typed absolute branch를 덮어쓰지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/numerical-review-evidence.md b/docs/mitc4-shell-feast-eigen/numerical-review-evidence.md deleted file mode 100644 index d932d49..0000000 --- a/docs/mitc4-shell-feast-eigen/numerical-review-evidence.md +++ /dev/null @@ -1,386 +0,0 @@ -# MITC4 독립 수치 검토 evidence - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `numerical-review-agent` -- Input contract revision: `r2` -- 기본 보고서: [numerical-review.md](numerical-review.md) -- 검토일 / web access date: `2026-09-06` - -## NR-MFE-001 직접 계산 반례 - -이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은 -아래 [r2 공변성 검산](#r2-독립-공변성-검산)에 있다. 기존 실패를 통과로 소급 변경하지 않는다. - -관련 원문은 [requirements](requirements.md)의 `002`(기존 kernel 유지), -`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance -evidence)와 [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)다. -실제 [kernel](../../src/fesa/elements/mitc4_shell.cpp)의 -`PhysicalTransformation20`(line 488), `DrillingTransformation4`(505), -`Stiffness`의 minimum tangent diagonal(633~653)을 읽기 전용으로 대조했다. - -다음은 production 함수를 재호출한 expected value가 아니라 평판 다항식의 직접 적분이다. -Tangent axes `a=(0,1,0)`, `b=(-4/5,0,3/5)`, normal `d=(3/5,0,4/5)`를 둔다. -Node 순서는 `X1=-2a-b`, `X2=2a-b`, `X3=2a+b`, `X4=-2a+b`다. -`a×b=d`, 면적 8, 두께 1이고 constant director·positive Jacobian의 직사각형이다. -단일 element의 geometry-derived director와도 같다. `E=12, nu=0, rho=1`로 둔다. -모든 DOF를 고정하되 node1의 global `URZ` 하나만 free로 한다. - -직사각형 `Lx=4,Ly=2`에서 `integral Nx² dA=1/6`, -`integral Ny² dA=2/3`, `|integral Nx Ny dA|=1/4`이다. -`D=Et³/[12(1-nu²)]=1`, `G=6`이며 MITC tying으로 각 nodal rotary -shear square integral은 `A/12`다. 따라서 각 node의 tangent rotary physical block은 - -\[ -R=\begin{bmatrix}49/12&\pm1/8\\\pm1/8&23/6\end{bmatrix}, -\quad j=\rho t^3A/48=1/6,\quad k_d=10^{-3}(23/6). -\] - -Off-diagonal 부호는 corner의 `Nx Ny` 부호에 따라 달라지고 두 부호 모두 존재한다. -Global `eZ`의 tangent 성분은 `(0,3/5)`이고 drilling 성분은 `4/5`다. -Free mass는 `j(1-dZ²)=0.06>0`이므로 E2는 이 DOF를 삭제하지 않는다. -이 1차원 constrained pencil의 정확한 유한 eigenvalue는 - -\[ -\lambda=\frac{(9/25)(23/6)+(16/25)k_d}{(9/25)(1/6)} -=23+(32/3)k_d. -\] - -이제 전체 geometry를 global Z축으로 45° 회전한다. Free axis `eZ`와 모든 나머지 -fixed subspace는 그대로이므로 동일 물리 BC가 계속 지원 component BC로 표현된다. -새 director는 `(3/(5 sqrt2),3/(5 sqrt2),4/5)`다. Least-aligned global-axis 규칙의 -새 tangent와 회전 전 tangent 사이의 cosine/sine은 `-5/sqrt41,-4/sqrt41`이다. -모든 corner의 두 tangent diagonal 중 최소는 `937/246`으로 달라진다. -Physical `eZ^T Kphys eZ`와 질량은 불변이지만 `kd'=10^-3(937/246)`다. - -| 값 | 회전 전 | 회전 후 | -| --- | ---: | ---: | -| `kd` | `0.0038333333333333336` | `0.003808943089430893` | -| `lambda` | `23.04088888888889` | `23.040628726287263` | - -상대 차이는 `1.1291343961675893e-5`다. Tangent tie가 반대 axis를 선택해도 -모든 corner/두 tangent diagonal의 minimum은 같다. 좌표변환으로 constraints를 바꾼 -오류, input explicit director/MPC 기능, mass cutoff 또는 FEAST 오차를 이용한 반례가 아니다. -크기가 외부 tolerance보다 작다는 사실은 내부 coordinate-invariance 항등식의 근거가 아니다. - -실행 명령은 아래 read-only here-script, `python -B -`, exit `0`이었다. - -```powershell -@' -from math import sqrt -from fractions import Fraction as F -def dot(a,b): return sum(x*y for x,y in zip(a,b)) -def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) -def rot(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) -d=(.6,0,.8); a=(0.,1.,0.); b=cross(d,a) -Raa=F(49,12); Rbb=F(23,6); Rab=F(1,8); j=F(1,6) -k0=.001*min(Raa,Rbb) -dp=rot(d); ap0=(1-dp[0]**2,-dp[0]*dp[1],-dp[0]*dp[2]) -ap=tuple(v/sqrt(dot(ap0,ap0)) for v in ap0) -u=dot(ap,rot(a)); v=dot(ap,rot(b)) -diags=[float(Raa)*u*u+float(Rbb)*v*v+2*c*u*v for c in [-float(Rab),float(Rab)]] -diags += [float(Raa)*v*v+float(Rbb)*u*u-2*c*u*v for c in [-float(Rab),float(Rab)]] -k1=.001*min(diags) -l0=float(Rbb/j)+k0*.64/(float(j)*.36) -l1=float(Rbb/j)+k1*.64/(float(j)*.36) -print(float(k0),k1,l0,l1,abs(l1-l0)/l0) -assert abs(l1-l0)>1e-6 -'@ | python -B - -``` - -이 계산은 기존 C++ kernel 실행 evidence가 아니다. 기존 승인 수식과 source의 계수 -규칙이 갖는 mathematical counterexample이다. Runtime 회귀 test는 이후 Planning 소유다. - -## 비충돌 수학 검토 - -아래 표는 r1의 검토 기록이다. Mass·geometry·unit·BC·whitening·FEAST의 비충돌 항목은 -r2 영향 확인 후 재사용한다. E3의 scalar는 r2 S1로 바뀌며 positivity/decoupling의 재검토와 -V5의 complete K/partial-BC 해소는 아래 별도로 기록한다. - -| 대상 | 독립 검토 결과와 한계 | -| --- | --- | -| M1/M2 | `S=-[d]x`이므로 `S theta=theta×d`; global DOF `[u,theta]`와 20↔24 transformation의 부호가 일치한다. Shear factor는 mass에 들어가지 않는다. | -| M3~M5 | `C0/C1/C2` 차원은 `M/ML/ML²`; symmetric cross block은 transpose 관계다. Trilinear map의 J degree≤(2,2,2), integrand≤(4,4,4)이므로 3×3×3의 degree5 정확성이 충분하다. | -| Consistent positivity | Positive weights/J에서 quadratic form=0이면 모든 27점에서 Hq=0. Hq는 각 자연좌표 degree≤1이므로 다항식 자체가 0이다. z=0에서 bilinear 독립성으로 모든 ui=0, z 계수에서 `Si theta_i=0`. Null은 정확히 네 drilling이며 physical20은 PD다. | -| M6~M8 | Scalar moment row-sum→nodal block은 partition of unity와 일치한다. Thickness points가 서로 달라 strict Cauchy–Schwarz이고 central inertia>0, rank5다. Tiny nonzero director component를 0으로 만드는 근거는 없다. | -| M9/M10 | Jensen 차이의 1/2 double sum과 kinetic-energy의 추가 1/2를 구분한 식이 맞다. Total mass·spatial first moment·allocated thickness moments는 보존하지만 일반 orbital inertia나 consistent spectrum은 보존하지 않는다. | -| Geometry | 기존 `EvaluateGeometry`는 실제 J>0와 finite reciprocal/frame을 검사한다. 추가 27점에도 같은 predicate를 적용하면 그 점의 부적합을 거부한다. Stiffness 8점과 validation을 바꾸지 않는다. 기존 8점만 통과한 input의 mass failure는 감추지 않으며 전역 injectivity/warp 허용 확대를 주장하지 않는다. | -| E1/E2 | Length congruence의 단위는 맞다. 실제 global free space와 director null의 교집합으로 null dimension을 정하는 조건은 정확하다. Partial BC의 full-rank local mass는 허용되며 near-null은 conditioning failure와 구분해야 한다. | -| E3/E4 | 공통 director와 element별 positive nodal scalar kd로 `KZ=Z diag(kappa)`, `Kpz=0`, `Kzz>0`이 성립한다. Partial BC에 남는 kd를 제거하면 원 pencil을 바꾼다. 일반 Schur 예제의 5/2 대 단순 삭제의 3은 옳고 general dense fallback은 필요하지 않다. | -| E5/E8 | `Mp=LL^T`, `A=L^-1 Kp L^-T`, `phi=DCP L^-T x`는 exact congruence다. Identity B의 FEAST도 actual lumped 문제다. Mass normalization 단위, constrained exact zero 및 candidate commit 의미가 맞다. | -| V1~V4 | 원 assembled free `Kf y-lambda Mf y`를 복원 후 검산해야 null 복원 오류를 잡는다. Mixed-unit norm을 직접 섞지 않고 zero denominator branch를 정의한 식은 일관된다. Gram/energy/residual은 lowest-N completeness를 대신하지 않는다. | -| Rigid/density | 기존 tangent-projected rigid field는 continuum interpolation의 rigid motion을 재현한다. Massless drilling과 6 physical rigid modes는 다르다. Density scaling과 repeated-group projector 정의는 일관된다. Eigen coordinate suite의 적용 범위는 NR-MFE-001 해결 전 확정하지 않는다. | - -## 독립 mass oracle - -`rho=3,t=1/2`에서 아래 kernel-level geometry/director fixture를 사용했다. -이는 현재 input의 explicit normal 기능을 추가하는 제안이 아니다. Unit rational directors와 -warped coordinates를 이용한 독립 moment 적분 사례다. 전체 patch input 생성이나 기존 -geometry validator 실행을 대신하지 않는다. - -```text -X = [(-1,-1,1/10), (1,-1,-1/10), (1,1,1/5), (-1,1,-1/10)] -d = [(0,0,1), (3/5,0,4/5), (2/3,1/3,2/3), (0,3/5,4/5)] -``` - -`fractions.Fraction`으로 coefficient dictionary `(xi power,eta power,zeta power)`를 -만들고 M1의 trilinear map을 미분·determinant 전개했다. Monomial integral은 홀수 차수면 -0, 모든 차수가 짝수면 `8/[(p+1)(q+1)(r+1)]`다. Production shape/J/mass 함수를 -호출하지 않았다. 이 exact rational 결과를 별도의 3-point 및 2-point Gauss 평가와 대조했다. -실제 read-only here-script `python -B -`, exit `0`, wall time 약 `0.52 s`였다. - -| 관찰 | 결과 | -| --- | --- | -| 실제 maximum integrand degree | `(4,4,4)` | -| 27점 J 범위 | `[0.12859919221615254, 0.27013414111718076]` | -| 3-point 최대 scalar entry absolute error | `1.1102230246251565e-16` | -| 2-point 최대 scalar entry absolute error | `0.0006018518518518257` | -| `C0_11, C1_11, C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` | -| `sum mi, sum hi, sum ji` | `7743/1600`, `739/12000`, `517/5120` | -| First moment, two independent rational expressions exactly equal | `(-79747/360000, -685951/2880000, 49651/320000)` | -| Minimum nodal `ji-hi²/mi` | `0.022318161338791092 > 0` | - -Independent row-sum oracle는 다음과 같으며 C1의 강제 zero나 flat rotary 비례식을 잡는다. - -```text -m = [298/225, 1759/1440, 6211/5760, 2333/1920] -h = [3191/192000, 1061/72000, 337/24000, 9323/576000] -j = [5969/216000, 8807/345600, 155527/6912000, 779/30720] -``` - -현재 수치값은 정식화의 독립 계산 evidence다. C++ test 통과, reference spectrum 통과 또는 -양의 J가 전체 volume에서 보장된다는 실행 결과로 바꾸지 않는다. - -## FEAST 독립 source 대조 - -Intel C 2026.0 URL edition의 [parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)를 -2026-09-06 재확인했다. `fpm[49]=1`은 CSR interval의 total count를 `m0`로 반환하고 flag를 -reset한다. Stochastic estimate라는 설명은 없다. 다른 standalone FEAST의 옵션 번호나 -확률적 count 설명을 이 API에 대입하지 않는다. 값의 conditioning-independent 정확성은 -문서가 보장하지 않으므로 이것만으로 implementation completeness를 승인하지 않는다. - -[API의 epsout 정의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)는 -trace 변화량을 endpoint absolute maximum으로 나눈다. 따라서 strict nonzero-width -finite interval이면 zero eigenvalue만 있다는 이유로 trace 분모가 0이 되지 않는다. -Size1, N=n, B=0 문제는 실제 backend test가 여전히 필요하다. -Count scratch와 solve m0를 분리한 E7은 output overwrite와 용량을 혼동하지 않는다. - -[Output status 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html)는 -endpoint 근접 count failure와 넓은 구간 내 작은 cluster를 놓칠 수 있는 경우를 명시한다. -E6의 enclosure total n, monotone prefix/empty-prefix, safe bracket, multiplicity capacity, -returned count/Gram/full residual을 결합하는 방향은 이 한계를 숨기지 않는다. -Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정해서는 안 된다. -이 대조는 runtime 통과나 후속 numerical-control 값의 승인이 아니다. - -## 재검토 범위 - -이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을 -[controls C1~C7](numerical-review-controls.md)와 -[27개 case·requirement matrix](numerical-review-cases.md)로 고정했다. -이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다. - -- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/ - full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch. -- Positive block reciprocal-condition limit, thickness central-inertia cancellation, - tiny nonzero director의 analytic rank 유지와 명시적 ill-conditioning failure. -- Operator-scale near-zero/negative/cluster classification, raw-value 보존과 endpoint ULP - margin, contour/precision/refinement, finite count/search/endpoint/solve-retry budget. -- Deterministic initial integer generator/seed/QR sign·rank 규칙, thread/runtime boundary, - n*m0/nnz/index overflow 및 count scratch/shifted factorization memory 검사. -- 필수 포트폴리오: affine M10와 위 curved moment, Jensen·rigid·density·source identity, - 비축정렬/부분 BC/near-null/null dimension, 일반 Schur의 오삭제 반례, - 실제 FEAST의 size1/N=n/zero/negative/repeated group>N/tight cluster/endpoint/ - insufficient subspace/count mismatch/Gram rank/overflow/allocation failure. -- 요구사항 정합 후 coordinate-invariance coverage와 NR-MFE-001 사례의 정확한 판정 역할. - 기존 K 수정, partial BC exclusion 또는 tolerance 완화로 임의 해결하지 않는다. - -## 실행 evidence - -다음 read-only 조사 명령은 exit `0`이었다. 원본 reference를 쓰거나 실행하지 않았다. - -```powershell -Get-Content .codex/skills/fem-numerical-review/SKILL.md -rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness|EvaluateGeometry' src/fesa/elements/mitc4_shell.cpp -rg -n 'CreateShell|nodal_frames|directors' src/fesa/elements/element_factory.cpp src/fesa/model/shell_geometry.cpp -Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 90 -Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' -Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' -``` - -`python -B -` read-only inventory script도 exit `0`: `pathlib`와 keyword별 state로 -nodes/elements/Set-2를 세고, 모든 nonempty TXT row에 fullmatch regex -`Frame:\s*Mode\s+(\d+):\s*Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s*\(cycles/time\)`를 -적용했다. `1..10` identity, finite positive Value, 104 unique boundary labels, -유일한 source step 및 input frequency data를 검사했다. -결과는 [reference-model](reference-model.md)의 inventory/hash와 같다. - -필수 project/feature/skill reference 문서는 `Get-Content`와 scoped `rg`로 읽었다. -Web `open/find`로 위 공식 Intel 3개 page의 parameter/status/epsout을 확인했다. -Configured vault는 이번 자료의 readiness 조건이 아니므로 추가 조회를 요구하지 않았다. -External solver, production implementation, CMake/CTest, Harness, FEAST runtime 및 -FESA-vs-reference 수치 비교는 단계 범위 밖이며 미실행이다. -Owner 경계 밖 파일·Hook state·reference artifact를 수정하거나 stage/commit하지 않았다. - -Owned 3개 문서를 read-only `python -B -`로 metadata·상대 링크·trailing whitespace· -final newline·display-math delimiter 검사했다. Exit `0`, documents `3`, local links `35`, -issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python으로 재실행했고 exit `0`, -위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의 -`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도 -검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다. - - -## r2 독립 공변성 검산 - -새 [S1~S8](formulation-stabilization.md)는 초기 physical rotary block의 trace를 -사용하므로 각 node의 orthogonal tangent 기저 변화와 SO(3) 회전에 불변이다. -Trace 평균은 PSD inventory에 zero가 있어도 같은 여덟 항을 포함하고, 기존 양의 inventory -전제에서 strictly positive다. Positive kd와 공통 director로 E3의 Kzz>0/Kpz=0을 유지한다. -Partial BC의 numerical contribution을 보존하므로 개선된 원 pencil의 reduction이다. - -Nonlinear에서는 초기 scalar의 Dkd=D²kd=0이므로 기존 objective gamma의 first/second -variations에 같은 상수를 곱한다. Positive potential가 모든 상태의 Hessian SPD를 뜻하지 -않으며 corotation coupling을 linear Td와 동일시하지 않는다. 기존 accepted branch·moment -work·state lifecycle과 [현재 nonlinear NR](../nonlinear-static-newton-raphson/numerical-review.md)을 -대조했고 scale 개선 밖 physics 변경을 발견하지 않았다. - -NR는 S7의 R block을 입력으로 재사용하지 않고, rectangle의 membrane/curvature/MITC -edge shear work를 직접 적분하여 **global 24×24 physical K를 독립 구성**했다. -기존 반례와 동일한 geometry에서 director 기반 tangent를 새로 생성해 trace scale을 계산하고 -complete K/ML를 만들었다. 회전 뒤에도 새 geometry axes로 처음부터 적분했다. -정적 load는 d에 수직인 (5/3)b이고, 모든 full reaction을 Kq-F로 재계산했다. - -실제 read-only command는 아래와 같으며 exit `0`, 약 `0.34 s`였다. -Production C++ 함수, vendor solver, reference 수치를 호출하지 않았다. - -```powershell -@' -from math import sqrt, fsum -from fractions import Fraction as F - -def dot(a,b): return fsum(x*y for x,y in zip(a,b)) -def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) -def norm(v): return sqrt(dot(v,v)) -def Rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) -def tangent(d): - k=min(range(3),key=lambda k:(abs(d[k]),k)) - a=tuple((1. if j==k else 0.)-d[k]*d[j] for j in range(3)) - a=tuple(v/norm(a) for v in a) - return a,cross(d,a) -def action(K,v): return [dot(row,v) for row in K] -def rotate_vector(v): return [x for off in range(0,len(v),3) for x in Rz(v[off:off+3])] -def rotate_matrix(K): - cols=[rotate_vector(col) for col in zip(*K)] - left=[list(row) for row in zip(*cols)] - return [rotate_vector(row) for row in left] -def error(a,b): return norm([x-y for x,y in zip(a,b)])/(norm(a)+norm(b)) -def matrix_error(A,B): return error(sum(A,[]),sum(B,[])) -def matrices(ex,ey,d): - # Independent planar polynomial work: membrane, curvature and MITC edge shear. - signs=[(-1,-1),(1,-1),(1,1),(-1,1)] - K=[[0.]*24 for _ in range(24)] - for xi in [-1/sqrt(3),1/sqrt(3)]: - for eta in [-1/sqrt(3),1/sqrt(3)]: - fields=[] - for sx,sy in signs: - Nx=sx*(1+sy*eta)/8.; Ny=sy*(1+sx*xi)/4. - tx=(1+sy*eta)/4.; ty=(1+sx*xi)/4. - for c in range(3): fields.append(([Nx*ex[c],Ny*ey[c],Ny*ex[c]+Nx*ey[c]],[0,0,0],[Nx*d[c],Ny*d[c]])) - for c in range(3): fields.append(([0,0,0],[Nx*ey[c],-Ny*ex[c],Ny*ey[c]-Nx*ex[c]],[tx*ey[c],-ty*ex[c]])) - for i,(mi,bi,si) in enumerate(fields): - for j,(mj,bj,sj) in enumerate(fields): - K[i][j]+=2*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj)) - ta,tb=tangent(d); diagonals=[] - for i in range(4): - for t in [ta,tb]: - v=[0.]*24;v[6*i+3:6*i+6]=t - diagonals.append(dot(v,action(K,v))) - kd=fsum(diagonals)/8000. - M=[[0.]*24 for _ in range(24)] - for i in range(4): - for a in range(3): - M[6*i+a][6*i+a]=2. - for b in range(3): - K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b] - M[6*i+3+a][6*i+3+b]=((1. if a==b else 0.)-d[a]*d[b])/6. - return K,M,kd,diagonals -ex=(0.,1.,0.);ey=(-.8,0.,.6);d=(.6,0.,.8) -K,M,kd,diags=matrices(ex,ey,d) -Kr,Mr,kdr,diagsr=matrices(Rz(ex),Rz(ey),Rz(d)) -load=[0.]*24; load[3:6]=[5*v/3 for v in ey]; loadr=rotate_vector(load) -q=[0.]*24;qr=[0.]*24;q[5]=load[5]/K[5][5];qr[5]=loadr[5]/Kr[5][5] -reaction=[x-y for x,y in zip(action(K,q),load)]; rr=[x-y for x,y in zip(action(Kr,qr),loadr)] -print('independent rotary diagonals=',diags) -print('kd=',kd,kdr,'expected=',float(F(19,4800))) -print('Kff/Mff/lambda/thetaZ=',K[5][5],M[5][5],K[5][5]/M[5][5],q[5]) -print('rotated Kff/Mff/lambda/thetaZ=',Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5]) -print('complete K/M/response/reaction covariance errors=',matrix_error(Kr,rotate_matrix(K)),matrix_error(Mr,rotate_matrix(M)),error(qr,rotate_vector(q)),error(rr,rotate_vector(reaction))) -print('load drill projection/free residual=',dot(d,load[3:6]),reaction[5],rr[5]) -assert abs(K[5][5]/M[5][5]-float(F(10369,450)))<1e-12 -assert matrix_error(Kr,rotate_matrix(K))<1e-12 -assert matrix_error(Mr,rotate_matrix(M))<1e-12 -assert error(rr,rotate_vector(reaction))<1e-12 -'@ | python -B - -``` - -| 관찰 | 결과 | -| --- | --- | -| 독립 physical rotary diagonals | 각 corner 약 49/12,23/6 | -| kd before/after | 0.003958333333333333 / 0.003958333333333332 | -| Kff, Mff | 1.3825333333333332, 0.05999999999999998 | -| lambda before/after | 둘 다 23.04222222222223 | -| thetaZ per unit moment before/after | 둘 다 0.7233098659465717 | -| Complete K covariance ratio | 7.895168813539929e-17 | -| ML covariance ratio | 4.6611822355981756e-17 | -| Static response covariance ratio | 0 | -| Full reaction covariance ratio | 1.1535337419041683e-16 | -| d dot load / both free residuals | 1.1102230246251565e-16 / 0,0 | - -따라서 NR-MFE-001은 **r2 수학 계약에서 해소**되었다. C2/C3/C7 기준을 만족하는 -독립 계산 evidence이고 실제 C++/FEAST/기존 정적 회귀의 통과 판정은 아니다. - -## r2 보존·변경 audit와 근거 - -`git diff c8876da --`로 r1 checkpoint와 r2 requirements/research/formulation을 대조했다. -M1/M2/M5~M10, E6~E8, V1~V4의 식은 유지되고 변경은 scale·그 적용 대상·coordinate -coverage와 정적 회귀다. r1 rational mass oracle와 API count/trace·reference identity는 -수식 영향이 없어 재계산 없이 재사용한다. Reference 두 SHA-256도 현재 원본에서 재확인했다. -AGENTS, agent/documentation 계약, NR skill 및 TOLERANCE의 같은 checkpoint 대비 diff는 없다. - -기존 linear/nonlinear numerical-review/reference-model, r2 requirements 27개와 -Research R07을 읽었고, 필요한 current nonlinear tangent test의 perturbation schedule을 -확인했다. 최초 검색의 존재하지 않는 `numerical-methods.md` 및 -`tests/fesa/elements/nonlinear_mitc4_shell_test.cpp`는 경로 오류였다. -`rg --files`로 실제 `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`를 -확인하고 scoped `rg`를 exit `0`으로 재실행했다. 이를 test 실행 실패 또는 성공으로 -취급하지 않는다. Source/test 파일은 변경하지 않았다. - -새로 확인한 vendor 사실은 thread-local 설정/복원뿐이며 -[Intel 2026.0 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)를 -2026-09-06 `search_query/open/find`로 확인했다. FEAST count/trace/API는 r1의 primary -근거를 재사용했다. 수치 기준의 선택·단위·근거·zero branch는 -[controls](numerical-review-controls.md), 요구별 falsifiable coverage는 -[cases](numerical-review-cases.md)에 있고 변경한 외부 tolerance는 없다. - -## r2 최종 정적 검증 - -2026-09-06 workspace root에서 PowerShell here-string을 `python -B -`에 전달한 -read-only audit의 실제 exit는 `0`이다. `pathlib`의 UTF-8 읽기, Markdown 상대 링크의 -`urllib.parse.unquote`, requirement/case ID의 정규식 집합 대조, `hashlib.sha256`, -위 r2 재현 코드의 `subprocess.run([sys.executable,'-B','-'], ...)`를 사용했다. -문서 owner/revision·마지막 newline·trailing whitespace·표 내부 code span의 pipe escape도 -함께 검사했다. 실제 stdout은 다음과 같다. - -```text -AUDIT documents=5 local_links=64 requirements=27 cases=27 static_artifacts=8 all_pass -``` - -문서에서 추출한 공변성 재현 코드의 별도 process exit도 `0`이며 위 표의 모든 수치를 -재현했다. 지정 input/TXT의 SHA-256은 reference-model의 두 값과 일치했다. -초기 audit의 exit `1`은 Python 기본 cp949 decode와 링크의 `%20`을 실제 경로로 -해석하지 않은 audit-script 문제였다. 명시적 UTF-8과 URL decoding으로 수정해 재실행했으며 -제품·reference·수치 기준을 변경하지 않았다. - -`git diff --check` exit `0`을 확인했다. 소유 변경은 이 evidence와 numerical-review, -reference-model, controls, cases의 Markdown 5개이며 `coordination.md`의 동시 변경은 -Coordinator 소유다. 본 단계에서 C++ build/test, FEAST runtime, 외부 solver 실행, -새 reference comparison은 수행하지 않았다. 이 필수 실행은 case matrix에 따라 -Implementation이 새 binary와 r2 계약으로 증명해야 한다. diff --git a/docs/mitc4-shell-feast-eigen/numerical-review.md b/docs/mitc4-shell-feast-eigen/numerical-review.md index facbaf5..9049375 100644 --- a/docs/mitc4-shell-feast-eigen/numerical-review.md +++ b/docs/mitc4-shell-feast-eigen/numerical-review.md @@ -1,7 +1,13 @@ -# MITC4 질량·FEAST 독립 수치 검토 +# 이전 MFE 검산·반례·수치 기준 + +독립 rational 검산·NR-MFE-001 반례와 당시 판정을 보존한다. 과거 수치 기준을 새 baseline에 자동 적용하지 않는다. + + + + +## MITC4 질량·FEAST 독립 수치 검토 - Feature ID: `mitc4-shell-feast-eigen` -- Owner: `numerical-review-agent` - Input contract revision: `r2` - 요청 outcome: `pass` - Next owner: `io-definition-agent` @@ -10,18 +16,19 @@ - 의미: 수학·numerical controls·logical reference readiness의 I/O 인계 요청. Workflow 전이는 Coordinator 소유다. 필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), -[requirements](requirements.md), [requirements evidence](requirements-evidence.md), -[research](research.md), [research evidence](research-evidence.md), -[formulation](formulation.md)과 연결된 mass/eigen/verification/stabilization 상세 문서다. +[requirements](requirements.md#requirements), [requirements evidence](requirements.md#requirements-evidence), +[research](research.md#research), [research evidence](research.md#research-evidence), +[formulation](formulation.md#formulation)과 연결된 mass/eigen/verification/stabilization 상세 문서다. [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)를 적용했다. -## Blocking finding + +### Blocking finding 현재 unresolved blocking finding은 없다. **NR-MFE-001의 r1 실패는 보존하고 r2 수학 계약에서 해소되었음을 독립 확인했다.** 사용자 승인 MFE-ADR-007에 따라 초기 physical rotary trace -평균을 사용하는 [S1~S8](formulation-stabilization.md)을 검토했다. Positive inventory, +평균을 사용하는 [S1~S8](formulation.md#formulation-stabilization)을 검토했다. Positive inventory, 기저·좌표 공변성, partial-BC numerical contribution, linear massless decoupling 및 nonlinear frozen objective potential의 경계가 일관된다. @@ -30,12 +37,13 @@ shear work를 직접 적분했다. 동일 물리 URZ-only BC의 Z축 45° 회전 `lambda=23.04222222222223`, 단위 tangent moment의 `thetaZ=0.7233098659465717`로 같다. Complete K/ML/response/reaction covariance error는 각각 `7.90e-17 / 4.66e-17 / 0 / 1.15e-16`이다. -[원래 실패·r2 독립 재계산과 실제 명령](numerical-review-evidence.md)을 보존한다. +[원래 실패·r2 독립 재계산과 실제 명령](numerical-review.md#numerical-review-evidence)을 보존한다. Actual C++/FEAST 실행을 대신한 판정은 아니다. -## 고정한 수치·검증 계약 + +### 고정한 수치·검증 계약 -- [Controls C1~C7](numerical-review-controls.md)에 V1~V6의 단위·scale·zero branch와 +- [Controls C1~C7](numerical-review.md#numerical-review-controls)에 V1~V6의 단위·scale·zero branch와 matrix/mass/null/conditioning/full residual/Gram/energy/rigid/density/coordinate 기준을 고정했다. Physical rank는 analytic BC/director intersection으로만 정하고 tiny positive mass는 삭제하지 않는다. Frobenius residual 외 operator-scale residual도 필수다. @@ -43,7 +51,7 @@ Actual C++/FEAST 실행을 대신한 판정은 아니다. 전체 `512` count calls/`3` solve attempts 상한을 같은 상세 문서에 고정했다. Enclosure/empty-prefix/count/solve-count/Gram/독립 residual을 결합하며 count만으로 무조건 lowest-N completeness를 주장하지 않는다. 요청 N은 항상 `.inp` authority다. -- [필수 cases와 27개 requirement coverage](numerical-review-cases.md)는 독립 mass oracle, +- [필수 cases와 27개 requirement coverage](numerical-review.md#numerical-review-cases)는 독립 mass oracle, lumping refinement, partial BC/near-null/반례 해소, actual FEAST known spectra, negative/zero/repeated/cluster/endpoint/capacity/failure, I/O/state 및 기존 static 회귀를 포함한다. 정확한 tests/owned paths/TDD commands는 Planning에 인계한다. @@ -58,7 +66,8 @@ r2 식의 변경 영향을 확인해 재사용했다. 같은 실험을 새로 Reference 두 SHA-256은 r2에서도 일치한다. 원본·upstream·source/test/build/phase/Hook/Git를 수정하지 않았고 다른 owner 변경을 보존했다. -## Handoff와 잔여 위험 + +### Handoff와 잔여 위험 I/O는 고정된 quantity·source/mode/frame·backend/mass·failure 의미와 numerical controls를 minimum syntax 및 additive persistent schema에 연결한다. Planning/Implementation은 @@ -67,8 +76,778 @@ case matrix의 관찰된 RED, 전체 configured MSVC x64 Debug suite, actual FEA 이후 Physics/Release가 같은 r2 evidence를 독립 평가한다. 이번 단계의 수학 계산과 문서 정적 검증은 실제 `python -B -`/`git diff --check` exit `0`으로 -확인했고 상세 결과는 [evidence](numerical-review-evidence.md)에 있다. +확인했고 상세 결과는 [evidence](numerical-review.md#numerical-review-evidence)에 있다. CMake/CTest·Harness·외부 solver·FEAST runtime·FESA reference comparison은 이 stage에서 미실행이다. Ill-conditioned thin/near-aligned mass의 명시적 실패, sampling 밖 geometry injectivity, FEAST floating-point count/cluster 한계 및 shifted fill/peak memory는 기록된 적용 한계다. 이 한계를 숨기는 cutoff·fallback·tolerance 완화는 허용하지 않는다. + + + + +## MITC4 독립 수치 검토 evidence + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review) +- 검토일 / web access date: `2026-09-06` + + +### NR-MFE-001 직접 계산 반례 + +이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은 +아래 [r2 공변성 검산](numerical-review.md#numerical-review)에 있다. 기존 실패를 통과로 소급 변경하지 않는다. + +관련 원문은 [requirements](requirements.md#requirements)의 `002`(기존 kernel 유지), +`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance +evidence)와 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)다. +실제 [kernel](../../src/fesa/elements/mitc4_shell.cpp)의 +`PhysicalTransformation20`(line 488), `DrillingTransformation4`(505), +`Stiffness`의 minimum tangent diagonal(633~653)을 읽기 전용으로 대조했다. + +다음은 production 함수를 재호출한 expected value가 아니라 평판 다항식의 직접 적분이다. +Tangent axes `a=(0,1,0)`, `b=(-4/5,0,3/5)`, normal `d=(3/5,0,4/5)`를 둔다. +Node 순서는 `X1=-2a-b`, `X2=2a-b`, `X3=2a+b`, `X4=-2a+b`다. +`a×b=d`, 면적 8, 두께 1이고 constant director·positive Jacobian의 직사각형이다. +단일 element의 geometry-derived director와도 같다. `E=12, nu=0, rho=1`로 둔다. +모든 DOF를 고정하되 node1의 global `URZ` 하나만 free로 한다. + +직사각형 `Lx=4,Ly=2`에서 `integral Nx² dA=1/6`, +`integral Ny² dA=2/3`, `|integral Nx Ny dA|=1/4`이다. +`D=Et³/[12(1-nu²)]=1`, `G=6`이며 MITC tying으로 각 nodal rotary +shear square integral은 `A/12`다. 따라서 각 node의 tangent rotary physical block은 + +\[ +R=\begin{bmatrix}49/12&\pm1/8\\\pm1/8&23/6\end{bmatrix}, +\quad j=\rho t^3A/48=1/6,\quad k_d=10^{-3}(23/6). +\] + +Off-diagonal 부호는 corner의 `Nx Ny` 부호에 따라 달라지고 두 부호 모두 존재한다. +Global `eZ`의 tangent 성분은 `(0,3/5)`이고 drilling 성분은 `4/5`다. +Free mass는 `j(1-dZ²)=0.06>0`이므로 E2는 이 DOF를 삭제하지 않는다. +이 1차원 constrained pencil의 정확한 유한 eigenvalue는 + +\[ +\lambda=\frac{(9/25)(23/6)+(16/25)k_d}{(9/25)(1/6)} +=23+(32/3)k_d. +\] + +이제 전체 geometry를 global Z축으로 45° 회전한다. Free axis `eZ`와 모든 나머지 +fixed subspace는 그대로이므로 동일 물리 BC가 계속 지원 component BC로 표현된다. +새 director는 `(3/(5 sqrt2),3/(5 sqrt2),4/5)`다. Least-aligned global-axis 규칙의 +새 tangent와 회전 전 tangent 사이의 cosine/sine은 `-5/sqrt41,-4/sqrt41`이다. +모든 corner의 두 tangent diagonal 중 최소는 `937/246`으로 달라진다. +Physical `eZ^T Kphys eZ`와 질량은 불변이지만 `kd'=10^-3(937/246)`다. + +| 값 | 회전 전 | 회전 후 | +| --- | ---: | ---: | +| `kd` | `0.0038333333333333336` | `0.003808943089430893` | +| `lambda` | `23.04088888888889` | `23.040628726287263` | + +상대 차이는 `1.1291343961675893e-5`다. Tangent tie가 반대 axis를 선택해도 +모든 corner/두 tangent diagonal의 minimum은 같다. 좌표변환으로 constraints를 바꾼 +오류, input explicit director/MPC 기능, mass cutoff 또는 FEAST 오차를 이용한 반례가 아니다. +크기가 외부 tolerance보다 작다는 사실은 내부 coordinate-invariance 항등식의 근거가 아니다. + +실행 명령은 아래 read-only here-script, `python -B -`, exit `0`이었다. + +```powershell +@' +from math import sqrt +from fractions import Fraction as F +def dot(a,b): return sum(x*y for x,y in zip(a,b)) +def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) +def rot(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) +d=(.6,0,.8); a=(0.,1.,0.); b=cross(d,a) +Raa=F(49,12); Rbb=F(23,6); Rab=F(1,8); j=F(1,6) +k0=.001*min(Raa,Rbb) +dp=rot(d); ap0=(1-dp[0]**2,-dp[0]*dp[1],-dp[0]*dp[2]) +ap=tuple(v/sqrt(dot(ap0,ap0)) for v in ap0) +u=dot(ap,rot(a)); v=dot(ap,rot(b)) +diags=[float(Raa)*u*u+float(Rbb)*v*v+2*c*u*v for c in [-float(Rab),float(Rab)]] +diags += [float(Raa)*v*v+float(Rbb)*u*u-2*c*u*v for c in [-float(Rab),float(Rab)]] +k1=.001*min(diags) +l0=float(Rbb/j)+k0*.64/(float(j)*.36) +l1=float(Rbb/j)+k1*.64/(float(j)*.36) +print(float(k0),k1,l0,l1,abs(l1-l0)/l0) +assert abs(l1-l0)>1e-6 +'@ | python -B - +``` + +이 계산은 기존 C++ kernel 실행 evidence가 아니다. 기존 승인 수식과 source의 계수 +규칙이 갖는 mathematical counterexample이다. Runtime 회귀 test는 이후 Planning 소유다. + + +### 비충돌 수학 검토 + +아래 표는 r1의 검토 기록이다. Mass·geometry·unit·BC·whitening·FEAST의 비충돌 항목은 +r2 영향 확인 후 재사용한다. E3의 scalar는 r2 S1로 바뀌며 positivity/decoupling의 재검토와 +V5의 complete K/partial-BC 해소는 아래 별도로 기록한다. + +| 대상 | 독립 검토 결과와 한계 | +| --- | --- | +| M1/M2 | `S=-[d]x`이므로 `S theta=theta×d`; global DOF `[u,theta]`와 20↔24 transformation의 부호가 일치한다. Shear factor는 mass에 들어가지 않는다. | +| M3~M5 | `C0/C1/C2` 차원은 `M/ML/ML²`; symmetric cross block은 transpose 관계다. Trilinear map의 J degree≤(2,2,2), integrand≤(4,4,4)이므로 3×3×3의 degree5 정확성이 충분하다. | +| Consistent positivity | Positive weights/J에서 quadratic form=0이면 모든 27점에서 Hq=0. Hq는 각 자연좌표 degree≤1이므로 다항식 자체가 0이다. z=0에서 bilinear 독립성으로 모든 ui=0, z 계수에서 `Si theta_i=0`. Null은 정확히 네 drilling이며 physical20은 PD다. | +| M6~M8 | Scalar moment row-sum→nodal block은 partition of unity와 일치한다. Thickness points가 서로 달라 strict Cauchy–Schwarz이고 central inertia>0, rank5다. Tiny nonzero director component를 0으로 만드는 근거는 없다. | +| M9/M10 | Jensen 차이의 1/2 double sum과 kinetic-energy의 추가 1/2를 구분한 식이 맞다. Total mass·spatial first moment·allocated thickness moments는 보존하지만 일반 orbital inertia나 consistent spectrum은 보존하지 않는다. | +| Geometry | 기존 `EvaluateGeometry`는 실제 J>0와 finite reciprocal/frame을 검사한다. 추가 27점에도 같은 predicate를 적용하면 그 점의 부적합을 거부한다. Stiffness 8점과 validation을 바꾸지 않는다. 기존 8점만 통과한 input의 mass failure는 감추지 않으며 전역 injectivity/warp 허용 확대를 주장하지 않는다. | +| E1/E2 | Length congruence의 단위는 맞다. 실제 global free space와 director null의 교집합으로 null dimension을 정하는 조건은 정확하다. Partial BC의 full-rank local mass는 허용되며 near-null은 conditioning failure와 구분해야 한다. | +| E3/E4 | 공통 director와 element별 positive nodal scalar kd로 `KZ=Z diag(kappa)`, `Kpz=0`, `Kzz>0`이 성립한다. Partial BC에 남는 kd를 제거하면 원 pencil을 바꾼다. 일반 Schur 예제의 5/2 대 단순 삭제의 3은 옳고 general dense fallback은 필요하지 않다. | +| E5/E8 | `Mp=LL^T`, `A=L^-1 Kp L^-T`, `phi=DCP L^-T x`는 exact congruence다. Identity B의 FEAST도 actual lumped 문제다. Mass normalization 단위, constrained exact zero 및 candidate commit 의미가 맞다. | +| V1~V4 | 원 assembled free `Kf y-lambda Mf y`를 복원 후 검산해야 null 복원 오류를 잡는다. Mixed-unit norm을 직접 섞지 않고 zero denominator branch를 정의한 식은 일관된다. Gram/energy/residual은 lowest-N completeness를 대신하지 않는다. | +| Rigid/density | 기존 tangent-projected rigid field는 continuum interpolation의 rigid motion을 재현한다. Massless drilling과 6 physical rigid modes는 다르다. Density scaling과 repeated-group projector 정의는 일관된다. Eigen coordinate suite의 적용 범위는 NR-MFE-001 해결 전 확정하지 않는다. | + + +### 독립 mass oracle + +`rho=3,t=1/2`에서 아래 kernel-level geometry/director fixture를 사용했다. +이는 현재 input의 explicit normal 기능을 추가하는 제안이 아니다. Unit rational directors와 +warped coordinates를 이용한 독립 moment 적분 사례다. 전체 patch input 생성이나 기존 +geometry validator 실행을 대신하지 않는다. + +```text +X = [(-1,-1,1/10), (1,-1,-1/10), (1,1,1/5), (-1,1,-1/10)] +d = [(0,0,1), (3/5,0,4/5), (2/3,1/3,2/3), (0,3/5,4/5)] +``` + +`fractions.Fraction`으로 coefficient dictionary `(xi power,eta power,zeta power)`를 +만들고 M1의 trilinear map을 미분·determinant 전개했다. Monomial integral은 홀수 차수면 +0, 모든 차수가 짝수면 `8/[(p+1)(q+1)(r+1)]`다. Production shape/J/mass 함수를 +호출하지 않았다. 이 exact rational 결과를 별도의 3-point 및 2-point Gauss 평가와 대조했다. +실제 read-only here-script `python -B -`, exit `0`, wall time 약 `0.52 s`였다. + +| 관찰 | 결과 | +| --- | --- | +| 실제 maximum integrand degree | `(4,4,4)` | +| 27점 J 범위 | `[0.12859919221615254, 0.27013414111718076]` | +| 3-point 최대 scalar entry absolute error | `1.1102230246251565e-16` | +| 2-point 최대 scalar entry absolute error | `0.0006018518518518257` | +| `C0_11, C1_11, C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` | +| `sum mi, sum hi, sum ji` | `7743/1600`, `739/12000`, `517/5120` | +| First moment, two independent rational expressions exactly equal | `(-79747/360000, -685951/2880000, 49651/320000)` | +| Minimum nodal `ji-hi²/mi` | `0.022318161338791092 > 0` | + +Independent row-sum oracle는 다음과 같으며 C1의 강제 zero나 flat rotary 비례식을 잡는다. + +```text +m = [298/225, 1759/1440, 6211/5760, 2333/1920] +h = [3191/192000, 1061/72000, 337/24000, 9323/576000] +j = [5969/216000, 8807/345600, 155527/6912000, 779/30720] +``` + +현재 수치값은 정식화의 독립 계산 evidence다. C++ test 통과, reference spectrum 통과 또는 +양의 J가 전체 volume에서 보장된다는 실행 결과로 바꾸지 않는다. + + +### FEAST 독립 source 대조 + +Intel C 2026.0 URL edition의 [parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)를 +2026-09-06 재확인했다. `fpm[49]=1`은 CSR interval의 total count를 `m0`로 반환하고 flag를 +reset한다. Stochastic estimate라는 설명은 없다. 다른 standalone FEAST의 옵션 번호나 +확률적 count 설명을 이 API에 대입하지 않는다. 값의 conditioning-independent 정확성은 +문서가 보장하지 않으므로 이것만으로 implementation completeness를 승인하지 않는다. + +[API의 epsout 정의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)는 +trace 변화량을 endpoint absolute maximum으로 나눈다. 따라서 strict nonzero-width +finite interval이면 zero eigenvalue만 있다는 이유로 trace 분모가 0이 되지 않는다. +Size1, N=n, B=0 문제는 실제 backend test가 여전히 필요하다. +Count scratch와 solve m0를 분리한 E7은 output overwrite와 용량을 혼동하지 않는다. + +[Output status 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html)는 +endpoint 근접 count failure와 넓은 구간 내 작은 cluster를 놓칠 수 있는 경우를 명시한다. +E6의 enclosure total n, monotone prefix/empty-prefix, safe bracket, multiplicity capacity, +returned count/Gram/full residual을 결합하는 방향은 이 한계를 숨기지 않는다. +Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정해서는 안 된다. +이 대조는 runtime 통과나 후속 numerical-control 값의 승인이 아니다. + + +### 재검토 범위 + +이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을 +[controls C1~C7](numerical-review.md#numerical-review-controls)와 +[27개 case·requirement matrix](numerical-review.md#numerical-review-cases)로 고정했다. +이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다. + +- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/ + full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch. +- Positive block reciprocal-condition limit, thickness central-inertia cancellation, + tiny nonzero director의 analytic rank 유지와 명시적 ill-conditioning failure. +- Operator-scale near-zero/negative/cluster classification, raw-value 보존과 endpoint ULP + margin, contour/precision/refinement, finite count/search/endpoint/solve-retry budget. +- Deterministic initial integer generator/seed/QR sign·rank 규칙, thread/runtime boundary, + n*m0/nnz/index overflow 및 count scratch/shifted factorization memory 검사. +- 필수 포트폴리오: affine M10와 위 curved moment, Jensen·rigid·density·source identity, + 비축정렬/부분 BC/near-null/null dimension, 일반 Schur의 오삭제 반례, + 실제 FEAST의 size1/N=n/zero/negative/repeated group>N/tight cluster/endpoint/ + insufficient subspace/count mismatch/Gram rank/overflow/allocation failure. +- 요구사항 정합 후 coordinate-invariance coverage와 NR-MFE-001 사례의 정확한 판정 역할. + 기존 K 수정, partial BC exclusion 또는 tolerance 완화로 임의 해결하지 않는다. + + +### 실행 evidence + +다음 read-only 조사 명령은 exit `0`이었다. 원본 reference를 쓰거나 실행하지 않았다. + +```powershell +Get-Content .codex/skills/fem-numerical-review/SKILL.md +rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness|EvaluateGeometry' src/fesa/elements/mitc4_shell.cpp +rg -n 'CreateShell|nodal_frames|directors' src/fesa/elements/element_factory.cpp src/fesa/model/shell_geometry.cpp +Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 90 +Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' +Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' +``` + +`python -B -` read-only inventory script도 exit `0`: `pathlib`와 keyword별 state로 +nodes/elements/Set-2를 세고, 모든 nonempty TXT row에 fullmatch regex +`Frame:\s*Mode\s+(\d+):\s*Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s*\(cycles/time\)`를 +적용했다. `1..10` identity, finite positive Value, 104 unique boundary labels, +유일한 source step 및 input frequency data를 검사했다. +결과는 [reference-model](reference-model.md)의 inventory/hash와 같다. + +필수 project/feature/skill reference 문서는 `Get-Content`와 scoped `rg`로 읽었다. +Web `open/find`로 위 공식 Intel 3개 page의 parameter/status/epsout을 확인했다. +Configured vault는 이번 자료의 readiness 조건이 아니므로 추가 조회를 요구하지 않았다. +External solver, production implementation, CMake/CTest, Harness, FEAST runtime 및 +FESA-vs-reference 수치 비교는 단계 범위 밖이며 미실행이다. +Owner 경계 밖 파일·Hook state·reference artifact를 수정하거나 stage/commit하지 않았다. + +Owned 3개 문서를 read-only `python -B -`로 metadata·상대 링크·trailing whitespace· +final newline·display-math delimiter 검사했다. Exit `0`, documents `3`, local links `35`, +issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python으로 재실행했고 exit `0`, +위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의 +`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도 +검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다. + + + +### r2 독립 공변성 검산 + +새 [S1~S8](formulation.md#formulation-stabilization)는 초기 physical rotary block의 trace를 +사용하므로 각 node의 orthogonal tangent 기저 변화와 SO(3) 회전에 불변이다. +Trace 평균은 PSD inventory에 zero가 있어도 같은 여덟 항을 포함하고, 기존 양의 inventory +전제에서 strictly positive다. Positive kd와 공통 director로 E3의 Kzz>0/Kpz=0을 유지한다. +Partial BC의 numerical contribution을 보존하므로 개선된 원 pencil의 reduction이다. + +Nonlinear에서는 초기 scalar의 Dkd=D²kd=0이므로 기존 objective gamma의 first/second +variations에 같은 상수를 곱한다. Positive potential가 모든 상태의 Hessian SPD를 뜻하지 +않으며 corotation coupling을 linear Td와 동일시하지 않는다. 기존 accepted branch·moment +work·state lifecycle과 [현재 nonlinear NR](../nonlinear-static-newton-raphson/numerical-review.md)을 +대조했고 scale 개선 밖 physics 변경을 발견하지 않았다. + +NR는 S7의 R block을 입력으로 재사용하지 않고, rectangle의 membrane/curvature/MITC +edge shear work를 직접 적분하여 **global 24×24 physical K를 독립 구성**했다. +기존 반례와 동일한 geometry에서 director 기반 tangent를 새로 생성해 trace scale을 계산하고 +complete K/ML를 만들었다. 회전 뒤에도 새 geometry axes로 처음부터 적분했다. +정적 load는 d에 수직인 (5/3)b이고, 모든 full reaction을 Kq-F로 재계산했다. + +실제 read-only command는 아래와 같으며 exit `0`, 약 `0.34 s`였다. +Production C++ 함수, vendor solver, reference 수치를 호출하지 않았다. + +```powershell +@' +from math import sqrt, fsum +from fractions import Fraction as F + +def dot(a,b): return fsum(x*y for x,y in zip(a,b)) +def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) +def norm(v): return sqrt(dot(v,v)) +def Rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) +def tangent(d): + k=min(range(3),key=lambda k:(abs(d[k]),k)) + a=tuple((1. if j==k else 0.)-d[k]*d[j] for j in range(3)) + a=tuple(v/norm(a) for v in a) + return a,cross(d,a) +def action(K,v): return [dot(row,v) for row in K] +def rotate_vector(v): return [x for off in range(0,len(v),3) for x in Rz(v[off:off+3])] +def rotate_matrix(K): + cols=[rotate_vector(col) for col in zip(*K)] + left=[list(row) for row in zip(*cols)] + return [rotate_vector(row) for row in left] +def error(a,b): return norm([x-y for x,y in zip(a,b)])/(norm(a)+norm(b)) +def matrix_error(A,B): return error(sum(A,[]),sum(B,[])) +def matrices(ex,ey,d): + # Independent planar polynomial work: membrane, curvature and MITC edge shear. + signs=[(-1,-1),(1,-1),(1,1),(-1,1)] + K=[[0.]*24 for _ in range(24)] + for xi in [-1/sqrt(3),1/sqrt(3)]: + for eta in [-1/sqrt(3),1/sqrt(3)]: + fields=[] + for sx,sy in signs: + Nx=sx*(1+sy*eta)/8.; Ny=sy*(1+sx*xi)/4. + tx=(1+sy*eta)/4.; ty=(1+sx*xi)/4. + for c in range(3): fields.append(([Nx*ex[c],Ny*ey[c],Ny*ex[c]+Nx*ey[c]],[0,0,0],[Nx*d[c],Ny*d[c]])) + for c in range(3): fields.append(([0,0,0],[Nx*ey[c],-Ny*ex[c],Ny*ey[c]-Nx*ex[c]],[tx*ey[c],-ty*ex[c]])) + for i,(mi,bi,si) in enumerate(fields): + for j,(mj,bj,sj) in enumerate(fields): + K[i][j]+=2*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj)) + ta,tb=tangent(d); diagonals=[] + for i in range(4): + for t in [ta,tb]: + v=[0.]*24;v[6*i+3:6*i+6]=t + diagonals.append(dot(v,action(K,v))) + kd=fsum(diagonals)/8000. + M=[[0.]*24 for _ in range(24)] + for i in range(4): + for a in range(3): + M[6*i+a][6*i+a]=2. + for b in range(3): + K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b] + M[6*i+3+a][6*i+3+b]=((1. if a==b else 0.)-d[a]*d[b])/6. + return K,M,kd,diagonals +ex=(0.,1.,0.);ey=(-.8,0.,.6);d=(.6,0.,.8) +K,M,kd,diags=matrices(ex,ey,d) +Kr,Mr,kdr,diagsr=matrices(Rz(ex),Rz(ey),Rz(d)) +load=[0.]*24; load[3:6]=[5*v/3 for v in ey]; loadr=rotate_vector(load) +q=[0.]*24;qr=[0.]*24;q[5]=load[5]/K[5][5];qr[5]=loadr[5]/Kr[5][5] +reaction=[x-y for x,y in zip(action(K,q),load)]; rr=[x-y for x,y in zip(action(Kr,qr),loadr)] +print('independent rotary diagonals=',diags) +print('kd=',kd,kdr,'expected=',float(F(19,4800))) +print('Kff/Mff/lambda/thetaZ=',K[5][5],M[5][5],K[5][5]/M[5][5],q[5]) +print('rotated Kff/Mff/lambda/thetaZ=',Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5]) +print('complete K/M/response/reaction covariance errors=',matrix_error(Kr,rotate_matrix(K)),matrix_error(Mr,rotate_matrix(M)),error(qr,rotate_vector(q)),error(rr,rotate_vector(reaction))) +print('load drill projection/free residual=',dot(d,load[3:6]),reaction[5],rr[5]) +assert abs(K[5][5]/M[5][5]-float(F(10369,450)))<1e-12 +assert matrix_error(Kr,rotate_matrix(K))<1e-12 +assert matrix_error(Mr,rotate_matrix(M))<1e-12 +assert error(rr,rotate_vector(reaction))<1e-12 +'@ | python -B - +``` + +| 관찰 | 결과 | +| --- | --- | +| 독립 physical rotary diagonals | 각 corner 약 49/12,23/6 | +| kd before/after | 0.003958333333333333 / 0.003958333333333332 | +| Kff, Mff | 1.3825333333333332, 0.05999999999999998 | +| lambda before/after | 둘 다 23.04222222222223 | +| thetaZ per unit moment before/after | 둘 다 0.7233098659465717 | +| Complete K covariance ratio | 7.895168813539929e-17 | +| ML covariance ratio | 4.6611822355981756e-17 | +| Static response covariance ratio | 0 | +| Full reaction covariance ratio | 1.1535337419041683e-16 | +| d dot load / both free residuals | 1.1102230246251565e-16 / 0,0 | + +따라서 NR-MFE-001은 **r2 수학 계약에서 해소**되었다. C2/C3/C7 기준을 만족하는 +독립 계산 evidence이고 실제 C++/FEAST/기존 정적 회귀의 통과 판정은 아니다. + + +### r2 보존·변경 audit와 근거 + +`git diff c8876da --`로 r1 checkpoint와 r2 requirements/research/formulation을 대조했다. +M1/M2/M5~M10, E6~E8, V1~V4의 식은 유지되고 변경은 scale·그 적용 대상·coordinate +coverage와 정적 회귀다. r1 rational mass oracle와 API count/trace·reference identity는 +수식 영향이 없어 재계산 없이 재사용한다. Reference 두 SHA-256도 현재 원본에서 재확인했다. +AGENTS, agent/documentation 계약, NR skill 및 TOLERANCE의 같은 checkpoint 대비 diff는 없다. + +기존 linear/nonlinear numerical-review/reference-model, r2 requirements 27개와 +Research R07을 읽었고, 필요한 current nonlinear tangent test의 perturbation schedule을 +확인했다. 최초 검색의 존재하지 않는 `numerical-methods.md` 및 +`tests/fesa/elements/nonlinear_mitc4_shell_test.cpp`는 경로 오류였다. +`rg --files`로 실제 `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`를 +확인하고 scoped `rg`를 exit `0`으로 재실행했다. 이를 test 실행 실패 또는 성공으로 +취급하지 않는다. Source/test 파일은 변경하지 않았다. + +새로 확인한 vendor 사실은 thread-local 설정/복원뿐이며 +[Intel 2026.0 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)를 +2026-09-06 `search_query/open/find`로 확인했다. FEAST count/trace/API는 r1의 primary +근거를 재사용했다. 수치 기준의 선택·단위·근거·zero branch는 +[controls](numerical-review.md#numerical-review-controls), 요구별 falsifiable coverage는 +[cases](numerical-review.md#numerical-review-cases)에 있고 변경한 외부 tolerance는 없다. + + +### r2 최종 정적 검증 + +2026-09-06 workspace root에서 PowerShell here-string을 `python -B -`에 전달한 +read-only audit의 실제 exit는 `0`이다. `pathlib`의 UTF-8 읽기, Markdown 상대 링크의 +`urllib.parse.unquote`, requirement/case ID의 정규식 집합 대조, `hashlib.sha256`, +위 r2 재현 코드의 `subprocess.run([sys.executable,'-B','-'], ...)`를 사용했다. +문서 owner/revision·마지막 newline·trailing whitespace·표 내부 code span의 pipe escape도 +함께 검사했다. 실제 stdout은 다음과 같다. + +```text +AUDIT documents=5 local_links=64 requirements=27 cases=27 static_artifacts=8 all_pass +``` + +문서에서 추출한 공변성 재현 코드의 별도 process exit도 `0`이며 위 표의 모든 수치를 +재현했다. 지정 input/TXT의 SHA-256은 reference-model의 두 값과 일치했다. +초기 audit의 exit `1`은 Python 기본 cp949 decode와 링크의 `%20`을 실제 경로로 +해석하지 않은 audit-script 문제였다. 명시적 UTF-8과 URL decoding으로 수정해 재실행했으며 +제품·reference·수치 기준을 변경하지 않았다. + +`git diff --check` exit `0`을 확인했다. 소유 변경은 이 evidence와 numerical-review, +reference-model, controls, cases의 Markdown 5개이며 `coordination.md`의 동시 변경은 +Coordinator 소유다. 본 단계에서 C++ build/test, FEAST runtime, 외부 solver 실행, +새 reference comparison은 수행하지 않았다. 이 필수 실행은 case matrix에 따라 +Implementation이 새 binary와 r2 계약으로 증명해야 한다. + + + + +## MITC4 eigen 내부 수치 기준 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review) +- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증. + +[V1~V6](formulation.md#formulation-verification), [E1~E8](formulation.md#formulation-eigen), +[S1~S8](formulation.md#formulation-stabilization)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부 +수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통 +tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다. + + +### C1. Scale, 공통 zero branch와 근거 + +`ell`, `D`, `Khat/Mhat`, `Kf/Mf`, `A`, `s`, `B=A/s`는 E1/E6대로 사용한다. +같은 비교의 두 행렬에는 같은 ell을 적용한다. Matrix norms는 Frobenius, +vector norms는 Euclidean이며 별도 inf 표기만 infinity norm이다. Mixed force/moment 또는 +translation/rotation 원값을 직접 더하지 않는다. Scaled sum-of-squares와 stable ordered sum을 +쓰고 finite-first로 검사한다. 모든 ratio는 분모가 양수일 때 계산한다. +`numerator=denominator=0`은 metric 0, `denominator=0,numerator!=0`은 named failure다. +Zero eigenvector, nonpositive modal mass 및 invalid scale은 이 zero-pass의 대상이 아니다. +어떤 branch에도 `max(1,physical_scale)`, mass/eigenvalue floor나 clamp를 추가하지 않는다. + +공통 기본값은 `tau_alg=1e-12`, `tau_modal=1e-10`이다. 기존 +[linear NR-D02](../linear-static-mitc4-shell/numerical-review.md)의 algebraic/rigid 기준을 +유지하며 mass polynomial과 trace의 같은 단위 항등식에도 적용한다. +Unit roundoff `u=2^-53`에서 `gamma_k=ku/(1-ku)`이다. 4096개의 단순 연산을 가정한 +`gamma_4096≈4.55e-13`에 비해 `1e-12`는 작은 dense block·27점 적분의 정상 산술 오차를 +구분할 여유가 있다. 이는 모든 geometry의 forward-error theorem이 아니다. +Rank·conditioning·원 residual·독립 oracle를 따로 요구한다. 현재 rational oracle 및 +r2 covariance 오차는 이 기준보다 충분히 작지만 기준을 그 결과에 맞춰 고른 것은 아니다. + +`tau_modal`은 `1e-12` 내부 FEAST stopping보다 100배 큰 후검증 한계다. +외부 1% 판정을 내부 residual 허용값으로 쓰지 않는다. 같은 계산의 재실행 구조/row/ +diagnostic 순서는 exact이고, eigenvector의 repeated-basis 비유일성은 C4를 따른다. + + +### C2. Matrix, mass, stabilization와 reduction + +| ID | Metric / exact predicate | 한계·zero 처리 | +| --- | --- | --- | +| C2-01 | V1 `eta_sym(Q)`; mass·physical K·linear complete K·whitened A | `<=1e-12`; Q=0이면 C1. 대칭 copy 자체만 독립 evidence로 사용하지 않음 | +| C2-02 | V1 `\|\|R-S\|\|F/(\|\|R\|\|F+\|\|S\|\|F)`; congruence, moment→matrix, 직접 적분, Cholesky reconstruction | `<=1e-12`; 단위·같은 scale 필수 | +| C2-03 | Scalar moment entry oracle: `\|Ck_ij-Ck*_ij\|/[m_e(t/2)^k]` | k=0,1,2 각각 `<=1e-12`; positive `m_e=integral rho dV`. Exact C1=0도 이 차원 일치 scale로 검사 | +| C2-04 | Mass total `\|m-m*\|/(\|m\|+\|m*\|)`; uniform translation energy | `<=1e-12`; 각 방향을 따로 검사, trace(Muu)를 총질량으로 쓰지 않음 | +| C2-05 | Shifted spatial first moment difference divided by `m_e ell` | `<=1e-12`; 한 source node를 공통 Xref로 사용. `hi di` 포함 | +| C2-06 | M9 difference vs independent pairwise integral / `(q^T ML q+q^T MC q)` | absolute mismatch `<=1e-12`; raw Delta/scale `>=-1e-12`. Zero motion/drill-only는 C1. Negative roundoff를 값을 0으로 바꾸는 데 사용하지 않음 | +| C2-07 | V2 mass-null action, MZ, KZ | 각각 `<=1e-12`; nz=0은 N/A. 정확한 analytic null만 대상 | +| C2-08 | `\|\|P^T Z\|\|F`, `\|\|[P Z]^T[P Z]-I\|\|F/sqrt(nf)` | `<=1e-12`; 각 node basis의 해당 norm도 `<=1e-12` | +| C2-09 | `mi>0,ji>0,ji-hi²/mi>0`; consistent physical20 및 모든 nonempty Mp nodal block Cholesky | strict, finite. Zero/negative pivot·variance는 실패. Consistent rank20/lumped rank5는 analytic expected rank로 검증 | +| C2-10 | `\|(ji-hi²/mi)-integral rho Ni(z-hi/mi)²dV\|/(ji+hi²/mi)` | `<=1e-12`; `vi/ell²`, `\|hi\|/sqrt(mi ji)`도 기록하며 별도 rank cutoff로 쓰지 않음 | +| C2-11 | S2 여덟 초기 rotation diagonals | 모두 finite `>=0`, 하나 이상 `>0`; zero 포함 분모8. `kd>0` finite. Negative를 허용오차로 0 처리하지 않음 | +| C2-12 | `\|kd'-kd\|/(\|kd'\|+\|kd\|)` 및 직접 trace oracle | `<=1e-12`; global 회전/독립 tangent 재생성 후 계산. Trial별 frozen kd는 exact unchanged | +| C2-13 | E3 `Kzz=diag(kappa_i)`, `kappa_i=sum incident kd,e` | 각 kappa finite `>0`, expected diagonal relation C2-02; Kpz 검사와 원 free residual을 함께 요구 | +| C2-14 | Scaled constrained component norm V3 | `0` exact; 복원한 source constrained entries도 exact zero | + +Positive/null dimension은 **E2의 constrained director component exact-zero 교집합**으로만 +정한다. Constrained director의 tiny nonzero 성분을 축정렬이라고 반올림하지 않는다. +각 nonempty dimension≤6 scaled nodal Mp에 + +`rcond_inf = 1/(||Mp||inf ||Mp^-1||inf) >= 2^-32 = 2.3283064365386963e-10` + +을 요구한다. 작은 block의 Cholesky triangular solves로 inverse action norm을 구하며 +global inverse는 만들지 않는다. Product overflow를 피하는 동치 ratio로 계산한다. +이 조건은 physical rank 변경이 아니라 binary64 whitening의 numerical admissibility다. +64 연산의 `gamma_64/rcond`를 약 `3.06e-5` 이하로 제한하는 최소 guard이며 +모든 eigenvalue의 상대 정확도를 보장하지 않는다. Cholesky reconstruction과 full modal +residual을 통과해야 한다. 한계 미만·unresolvable estimate는 conditioning failure이고 +좌표 삭제, 더 큰 mass, 다른 solver로 우회하지 않는다. 빈 nodal block은 skip하지만 +global n=0 또는 요청 N>n은 명시적 failure다. + + +### C3. Eigenpair 및 물리 내부 판정 + +계산된 c개 **전체** eigenpair를 검사한 뒤 첫 N개만 공개한다. V3/V4의 actual M은 ML다. + +| ID | Metric | 한계 | +| --- | --- | --- | +| C3-01 | V1 full original free residual `eta_r`; V3 whitened `eta_w` | 각각 `<=1e-10` | +| C3-02 | 추가 operator-scale residual `rho_B=\|\|Bx-mu x\|\|2/\|\|x\|\|2` | `<=1e-10`; dimensionless. Frobenius norm의 크기로 오류가 희석되는 것을 방지 | +| C3-03 | V3 `eta_norm,i`, pairwise `eta_orth,ij`, `eta_G` | 각각 `<=1e-10`; positive mass를 먼저 확인. Gram full rank는 이 bound와 독립 column 수로 확인 | +| C3-04 | V4 energy/Rayleigh consistency `eta_energy,i` | `<=1e-10`; zero lambda도 C1/V4 분모 사용 | +| C3-05 | V5 rigid K action | 각 6개 field `<=1e-10`; physical rigid mass Gram는 Cholesky 성공, vector 수6. Drill과 혼동하지 않음 | +| C3-06 | `\|c_rho lambda_i'-lambda_i\|/s` 또는 coordinate `\|lambda_i'-lambda_i\|/s` | `<=1e-10`; repeated group 내부 pairing은 C4. 동일 물리 BC·loads 사용 | +| C3-07 | Exact known-spectrum test eigenvalue error / known s | `<=1e-10`이고, 알려진 인접 distinct gap이 있으면 absolute error도 `<=gap/8` | +| C3-08 | Simple/반복군 C4 projector error V5 | `<=1e-6`; 테스트의 해당 군과 나머지 spectrum 사이 known gap은 `>=1e-3 s`로 선택 | + +C3-02는 symmetric B에서 computed mu가 실제 spectrum으로부터 residue norm 이내에 +있다는 직접 spectral-decomposition bound를 사용한다. 가장 낮은 mode인지, 올바른 +multiplicity인지는 증명하지 않으므로 C5 count/endpoint evidence가 별도로 필수다. + +FEAST의 `res`는 backend diagnostic이고 C3의 독립 residual을 대신하지 않는다. +Zero eigenvalue에서 backend relative-residual의 분모가 0이면 해당 diagnostic은 unavailable로 +기록하고 이유를 남긴다. Raw e/x, 자체 metric 및 최종 scalar 결과는 finite여야 한다. +Undefined backend diagnostic을 physical residual=0으로 바꾸거나 mandatory finite 결과에 +NaN을 저장하지 않는다. Trace `epsout`은 strict interval에서 finite여야 한다. + +Raw `mu=lambda/s`에서 `tau_zero=1e-9`, `tau_cluster=1e-8`로 고정한다. +`mu<-tau_zero`는 유의한 negative spectrum으로 procedure failure, +`|mu|<=tau_zero`는 near-zero classification, 그 외 양수는 positive다. +Boundary equality는 near-zero에 포함한다. Returned lambda는 부호와 raw 수치를 보존한다. +양수에서만 frequency를 파생하고 exact zero는 f=0, 작은 음수에서는 실수 frequency를 +만들지 않는다. C3-02보다 10배 큰 near-zero band와 100배 큰 cluster band는 수치 분류용이다. +양의 작은 mode를 제거하거나 N을 세는 방식에 쓰지 않는다. s/λ의 nonfinite 또는 +nonzero mu의 λ 환산 underflow-to-zero는 실패하고 physical scale을 1로 바꾸지 않는다. + + +### C4. Repeated subspace와 결정론 + +Raw lambda 오름차순의 stable sort, exact equal tie는 original solver column 순서다. +인접 `|lambda_i-lambda_(i-1)|/s<=1e-8`의 connected group은 diagnostic cluster일 뿐, +distinct 값을 merge/평균하거나 vector를 섞을 권한이 아니다. 알려진 exact repeated 군의 +density/rotation tests에서 V5의 mass-whitened projector norm을 사용한다. +Known gap≥1e-3 s와 C3-02이면 first-order invariant-subspace sensitivity는 약1e-7 +수준이므로 C3-08의 1e-6은 방향 비유일성을 허용하면서 잘못된 공간을 검출한다. +이 조건 밖 실제 cluster는 raw eigenpair·Gram/residual을 계속 검사하고 특정 개별 vector +방향의 정확도를 새로 약속하지 않는다. Mode shape 외부 comparison은 없다. + +Source DOF 순서로 largest absolute scaled global component를 찾고 sign을 양수로 +정한다. 동률은 첫 source DOF다. Zero vector는 실패다. 동일 binary/runtime/thread/입력의 +세 반복에서는 sparse structure·COO reduction·row/diagnostic identity가 exact 동일해야 한다. +Scalar 재현 오차는 C3-06, repeated vector는 C4를 적용한다. CPU/runtime를 바꾼 bitwise +eigenvalue/vector equality를 요구하지 않는다. + + +### C5. FEAST controls와 bounded interval 정책 + +Actual call은 `dfeast_scsrgv`, `(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR다. +각 call은 `feastinit`하고 아래 C-index fpm을 설정한다. 명시하지 않은 값은 해당 설치의 +초기값을 유지·기록한다. Private backend를 넘어 vendor type을 노출하지 않는다. + +| fpm | 값 | 근거·역할 | +| --- | ---: | --- | +| `[0]` | 0 | Status를 deterministic diagnostic으로 수집 | +| `[1]` | 16 | 공식 허용 contour 값; 기본8보다 적분 resolution에 여유, 모든 attempt 고정 | +| `[2]` | 12 | `1e-12` double stopping; 독립 C3 residual 필수 | +| `[3]` | 20 | 유한 refinement 한계; 미수렴 성공 금지 | +| `[4]` | 1 | 아래 고정 initial subspace 사용 | +| `[5]` | 1 | Endpoint-scaled trace stopping; zero mode에서 C3-02로 독립 검증 | +| `[13]` | 0 | Eigenpairs가 아닌 subspace-only 결과 금지 | +| `[26]`, `[27]` | 1, 1 | CSR validity와 second-matrix SPD check | +| `[49]` | count 1, solve 0 | Total interval count와 실제 eigenpair solve 분리 | +| `[63]` | 0 | 초기 PARDISO 정책 사용; 임의 iparm tuning 금지 | + +근거는 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)과 +[E7의 API/status 출처](formulation.md#formulation-eigen--e7-feast-경계와-deterministic-실행)다. +Count는 documented total이며 stochastic estimate로 부르지 않는다. 공식 count/status의 +floating-point 한계가 있으므로 아래 redundant evidence와 실제 known spectra가 필수다. + +Gershgorin 각 off-diagonal absolute sum은 매 덧셈 뒤 `nextafter(+infinity)`로 outward +누적한다. `Bii-ri`/`Bii+ri`도 각각 바깥으로 한 ULP 이동한다. Overflow는 실패다. +`beta=||B||inf`를 같은 outward 방식으로 구한다. Nonzero B에서는 beta>0; +정확한 B=0은 E6의 algorithmic enclosure `[-1,1]`에 대응하여 beta=1로 둔다. +이는 physical mass/λ floor가 아니다. `ulp(v)`는 v의 두 finite adjacent spacing 중 큰 값이며 + +`delta(v)=1e-8 beta + 64 ulp(v)` + +로 정의한다. 초기 endpoints는 `a0=nextafter(gL-16delta(gL),-infinity)`, +`b0=nextafter(gU+16delta(gU),+infinity)`다. Finite strict enclosure와 total count=n을 +확인한 뒤 E6의 upper-prefix search와 empty-prefix lower 축소를 한다. + +Interior endpoint v를 bracket에 반영하려면 `(a0,v-delta(v))`, `(a0,v)`, +`(a0,v+delta(v))`의 count가 모두 `info=0`이고 같아야 한다. 이 guard count는 eigenvalue +근처의 endpoint를 피하는 추가 evidence다. Guard가 enclosure 밖이면 그 부분은 알려진 +outside bound를 이용하며 실제 interval이 strict하지 않으면 평가하지 않는다. +Zero count는 성공 count=0일 때만 믿고 `info=1`을 empty proof로 바꾸지 않는다. +이미 알려진 prefix count와 monotonicity가 맞지 않으면 전체 실패다. + +| 제어 | 유한 값 / 정확한 처리 | +| --- | --- | +| Total count API calls | 전체 analysis 최대512. 성공·실패·guard·최종확인·retry 모두 포함 | +| Search optimization | Upper/lower 각각 최대32 midpoint 단계; optimization count calls 최대384로 남은128 예약 | +| Endpoint collision | 같은 midpoint에서 offsets `0,+1,-1,+2,-2,+4,-4` times delta, 이 순서 최대7후보. 현재 bracket 내부 후보만 사용 | +| Search 종료 | E6의 count target `N<=c<=min(n,2N+8)` 또는 폭 `<=8delta(mid)`/새 representable midpoint 없음/위 budget. 마지막 certified c>=N bracket 사용 | +| 최종 확인 | Enclosure 안의 a에 prefix0, b에 prefix c>=N, 두 endpoint guard, actual `(a,b)` count=c. 불일치/예약 budget 부족이면 실패 | +| Initial solve capacity | E6 그대로 `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n | +| Actual solve calls | 최초 포함 최대3; 각 call loops≤20, control/seed 동일 | +| 허용 solver retry | info1/2/3, count/returned-m mismatch 또는 endpoint separation failure만. 저장된 더 넓은 certified bracket으로 확대·재count, `m0=min(n,max(new formula,2*previous m0))` | +| Retry bracket 순서 | Upper search에 저장된 현재 b보다 큰 성공 b를 오름차순으로 선택, lower는 이전의 더 작은 certified prefix0 또는 a0; 최종 fallback은 원 enclosure | +| 금지 retry | Nonfinite eigenpair, wrong Gram/residual, negative spectrum, invalid/SPD/index/allocation/inner-solver 오류는 즉시 실패. Seed·mass·solver·threshold 변경 금지 | + +새 유효 bracket이 없으면 같은 실패 call을 무조건 반복하지 않는다. Optimization 한계에서는 +이미 certified enclosure를 사용할 수 있지만 실제 solve·최종 count가 실패하면 부분 결과를 +공개하지 않는다. Returned m=c, interval 내부와 `mu-a>=delta(a)`, `b-mu>=delta(b)`, +모든 c columns C3 통과를 확인한다. N번째가 cluster 내부여도 전체 c를 검사하고 출력은 N개다. +Bounds·prefix/guard/status/count/m0/m/loop/epsout·chosen ranks 및 모든 실패를 보존한다. +후속 tolerance 완화나 reference Value를 bounds 설정에 사용하는 것은 금지한다. + + +### C6. Initial subspace, thread와 storage + +Count scratch는 E7의 conservative n×n, identity initial x다. 실제 solve에서 m0=n도 +identity다. m0>11)*2^-53)-1`이다. Overflow wrap은 이 generator에만 의도적이며 +size/index 산술에는 허용하지 않는다. Seed를 바꾸며 성공을 찾지 않는다. + +Column ascending의 nonpivoted Householder QR를 사용한다. Scaled norm, `sign(0)=+1`, +`v1=x1+sign(x1)||x||`로 cancellation을 피하고 최종 R diagonal이 양수인 Q를 선택한다. +Original column norm에 대한 `|Rjj|/||input_col_j||2<=1e-12` 또는 zero는 initial-space +rank failure다. Post-QR `||Q^TQ-I||F/sqrt(m0)<=1e-12`를 요구한다. 이것은 모든 +eigenspace overlap의 보장이 아니며 C5 count와 C3 Gram/residual이 계속 필요하다. + +Backend call 동안 oneMKL thread-local count=1을 설정하고 모든 exit에서 이전 값을 복원한다. +[공식 mkl_set_num_threads_local](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의 +반환 previous setting을 사용한다. 전역 설정을 바꾸거나 vendor workspace를 동시 공유하지 +않는다. 설치 runtime/ABI/유효 thread count·seed·controls를 기록한다. Element contribution +병렬 생성은 허용하되 stable reduction 순서는 유지한다. + +Mode cap을 임의의 상수로 만들지 않는다. 정량 representation 경계는 +`1<=N<=n<=MKL_INT_MAX`, `nnz+1<=MKL_INT_MAX`, 모든 row/column in-range, +`n+1`, `6*nodes`, `n*m0`, `n*n`, 각 `count*sizeof(T)`가 internal index 및 +`min(SIZE_MAX,PTRDIFF_MAX)` 안에 있고 해당 container max_size를 넘지 않는 것이다. +곱/합은 overflow 전에 검사하며 double의 정수 근삿값으로 capacity를 계산하지 않는다. +Conservative double n×n scratch는 Win64에서 표현상 n≤`1073741823`이고 실제 사용 가능 +메모리 한계는 훨씬 작다. Allocation/factorization 실패는 명시적으로 종료하며 N을 줄이지 않는다. +Reference n=3125의 count x만 `78,125,000` bytes다. 이를 전체 peak memory라고 부르지 않고 +CSR, FEAST reduced storage 및 complex shifted sparse fill을 따로 기록한다. + + +### C7. 승인된 정적 회귀 기준 + +새 scale을 적용하되 기존 [linear NR](../linear-static-mitc4-shell/numerical-review.md)의 +symmetry/frame/energy `1e-12`, rigid/full residual/global equilibrium `1e-10`을 유지한다. +NR-MFE-001 static response는 C2 congruence `1e-12`와 complete full residual `1e-10`이다. +Static moment admissibility는 기존 `|d·m|/||m||<=1e-12`, zero moment는 별도 branch다. + +기존 [nonlinear NR §6](../nonlinear-static-newton-raphson/numerical-review.md)는 그대로다: +rotation/frame 및 no-applied-moment tangent symmetry `1e-12`, directional tangent error +`1e-6`(zero analytical direction `1e-10`), finite-rigid objectivity `1e-10`, factor-one +global force/moment balance 각 `1e-8`. 기존 finite-difference schedule +`[1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7]` 및 interior index3 기준을 유지한다. +근거는 [등록된 tangent test](../../tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp)와 +기존 승인 numerical contract다. 새 scale의 Dkd=D²kd=0 및 gamma derivative를 검산한다. +Nonlinear Hessian 전체의 SPD 또는 linear Tdrill과의 entry equality를 추가하지 않는다. +NSNR-069/070의 네 채널·typed zero-scale·100 iteration·no cutback/retry 종료 정책도 +기존 계약을 보존한다. 새 eigen C1 zero branch로 해당 승인 typed absolute branch를 덮어쓰지 않는다. + + + + +## MITC4 eigen 필수 verification portfolio + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review) +- 수치 기준: [controls C1~C7](numerical-review.md#numerical-review-controls) + +아래는 Planning이 RED→observed failure→GREEN→focused/full VERIFY에 연결할 **필수 +logical cases**다. C++ test 이름·파일과 final schema는 각 owner가 정한다. 새로운 reference +생성/수정 없이 synthetic test inputs는 tests의 승인 소유 경로에 둔다. Expected value를 +production mass/reduction/FEAST 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다. + + +### P1. Mass·좌표·조립 + +| Case ID | 입력·독립 oracle·필수 관찰 | 판정 | +| --- | --- | --- | +| MFE-C01 | Affine rectangle `4×2`, rho=3, t=1/2, parallel unit director. M10: C0=`(rho t A/36)*[4,2,1,2;...]`, C1=0, C2=t²C0/12, node m=3, h=0, j=1/16. Full24와 physical20·각 translation energy·tangent inertia/drill null을 검사. rho×4, t×2의 C0/C2 scaling도 검사 | C2 모든 관련 scalar/matrix/rank 기준 | +| MFE-C02 | [r1 rational warped/director-varying fixture](numerical-review.md#numerical-review-evidence--독립-mass-oracle)의 X,d,rho,t와 exact coefficient/row/first-moment oracle. Independent coefficient integration 또는 별도 고차 direct integration을 사용. C1을 강제0, 2-point mass, flat C2 비례식 mutation은 실패해야 함. 같은 shape/J production 호출만으로 oracle 구성 금지 | C2-02~10; 기존 geometry predicate를 먼저 적용. Custom-director kernel fixture를 input explicit normals 지원으로 확대하지 않음 | +| MFE-C03 | Consistent/moment snapshot을 유지하고 row-sum→lumped 연결 검사. C1/C2의 controlled symmetric perturbation이 원 mass와 derived block에 모두 반영됨. Independent nodal `integral rho Ni Gi^T Gi` 및 고정 velocities의 pairwise Jensen work와 비교. Uniform translation, drill-only, nonuniform translation, tangent rotation을 각각 검사 | C2-02~10; nonnegative kinetic energy, zero branch 및 총질량·centroid 보존 | +| MFE-C04 | Square `[-1,1]^2`, rho=t=1, uniform m×m grid m=1,2,4, velocity `(x,0,0)`, theta=0. Direct polynomial gives `q^T MC q=4/3`, `q^T(ML-MC)q=8/(3m²)`. Independent constant velocity의 두 energy는 모두 총질량4 | Exact sequence에 C2-03/04/06. 이는 이 smooth field의 lumping error 검산이며 일반 spectrum 수렴 차수 약속 아님 | +| MFE-C05 | C01/C02의 global proper rotation과 origin translation. Q는 rational proper rotation `[[0,-1,0],[3/5,0,-4/5],[4/5,0,3/5]]`, shift=(7,-3,5). Geometry/director/frame/mass를 새로 계산. Scalar full-row lumping이 실패하는 d=(1,1,1)/sqrt3도 사용 | 두 mass congruence와 kinetic work C2-02; moment는 common Xref, drilling null 보존 | +| MFE-C06 | 공유 node·서로 다른 rho/thickness section의 shell patch. Element 순서와 source labels가 다른 입력의 대응 결과, sequential/병렬 contribution 및 stable reduction을 검사. 실제 constraints와 source indices를 독립 expected map으로 대조 | Exact structure/order/identity, C2 matrix equality. Input permutation 자체와 fixed source-order determinism을 구분 | +| MFE-C07 | rho=0/negative/NaN/Inf/missing/duplicate/unresolved/dependent, invalid t/material, inverted/degenerate/기존 미지원 geometry 및 27점 중 invalid evaluation을 각각 거부. Density가 없는 기존 static case는 허용 | Semantic/geometry/model failure, 상태·output 미반영. Mass zero 우회 금지 | + + +### P2. Stabilization·partial BC·정적 영향 + +| Case ID | 입력·독립 oracle·필수 관찰 | 판정 | +| --- | --- | --- | +| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례)와 Z45° 회전. S1을 새 frame에서 계산. Expected kd=19/4800, Mff=3/50, Kff=10369/7500, lambda=10369/450. 모든 DOF fixed, node1 URZ만 free. Old min rule은 이 case를 실패시켜야 함 | Complete K·두 mass·kd congruence C2, exact eigenvalue C3-07, 원 free residual. Full-free/clamp 대체 금지 | +| MFE-C09 | C08에 admissible moment `m=(5/3)M0 b`, M0=1, b=(-4/5,0,3/5). 각 geometry에서 load도 변환. Expected thetaZ=7500/10369. 원 full `Kq-F`의 모든 reaction 성분을 회전해 비교 | C7 static response/full residual/reaction covariance, physical moment projection<=1e-12 | +| MFE-C10 | Eight diagonal inventory `[0,0,2,4,0,6,0,4]`이면 kref=2,kd=.002. All-zero, 한 negative, NaN/Inf는 failure. DBL_MAX 근방 양성 inventory는 scaled mean이 가능한 경우 finite; subnormal kd underflow는 failure. Independent node별 tangent changes O angles=(0,pi/6,pi/4,pi/3)에서도 trace 동일 | C2-11/12; 분모8 고정, clamp/positive-only mean/min 금지 | +| MFE-C11 | Free affine element와 smooth patch의 세 rigid translation·세 tangent-projected rigid rotation. Pure drill은 별도 4개. Physical K20 rank14, consistent physical mass rank20, complete K24 rank18/nullity6; positive-space dimension20. Full massless reduction 후 six near-zero physical modes가 남음 | C2/C3 analytic rank·rigid K action·mass Gram; drill에 관성을 주거나 physical zero mode 삭제 금지 | +| MFE-C12 | 기존 nonlinear fixture에서 초기 scale=S1, trial/commit/rollback에 exact unchanged. 기존 objective gamma potential의 first/second directional variations, finite rigid motion, linear physical limit, physical recovery 제외와 reaction conversion | [기존 nonlinear 계약](../nonlinear-static-newton-raphson/numerical-review.md) 및 C7. Trial scale 재선정·nonlinear Hessian SPD·linear Td entry equality를 요구하지 않음 | + + +### P3. 실제 BC·mass whitening·FEAST + +| Case ID | 입력·독립 oracle·필수 관찰 | 판정 | +| --- | --- | --- | +| MFE-C13 | Nodal M6 h=0,m=j=1의 manufactured block. d=(0,0,1), d=(3/5,0,4/5), d=(1,1,1)/sqrt3에 full free, URX fixed, URZ only free, all rotations fixed, drill-only free, fully constrained 조합. 조합은 Cartesian product가 아니라 지원되는 global component BC로 표현 가능한 경우만 적용하며, drill-only free는 d=(0,0,1)에서 URZ만 free이고 나머지5 DOF constrained인 경우로 한정한다(MPC 없음). Expected null은 constrained director 성분의 exact-zero 교집합. Mixed nodes에는 local finite rank0가 있어도 다른 finite node 보존 | E2 analytic dimension, C2-07~14, recovered source mask. Global n=0 또는 N>n은 failure | +| MFE-C14 | `d=(2p/(1+p²),0,(1-p²)/(1+p²))`, p=1/2000와1e-8. m=j=1,h=0; URX만 fixed, 세 translation과 URY/URZ free. 첫 case positive rank5와 conditioning pass; 두 번째는 여전히 analytic rank5이나 conditioning/Cholesky failure. p=0은 정확한 null1 | C2 rcond cutoff의 양옆 및 exact equality branch. Tiny positive mass를 rank4로 바꾸는 구현은 실패 | +| MFE-C15 | 독립 singular pencil K=[[6,2],[2,4]], M=diag(2,0)에서 finite lambda=5/2,z=-p/2. 단순 삭제의3은 오답. Production shell projection path에 nonzero Kpz 또는 nonpositive Kzz 주입 시 실패. 일반 dense Schur 기능을 구현할 필요 없음 | Original residual oracle와 E3 admissibility rejection, 임의 fallback 금지 | +| MFE-C16 | SPD nodal whitening `M=[[2,1],[1,2]]`, `K=[[6,4],[4,6]]`의 eigenvalues 2,10/3. Dense inverse 없이 congruence·복원·original-M normalization. 같은 eigenvectors에 틀린 lambda·mass variant·null coordinate/constraint를 각각 주입 | C2/C3, injected wrong pairing/mass/full residual이 실패해야 함 | +| MFE-C17 | Actual FEAST diagonal known spectra: n1 λ=2,N1; `[0,0,0,2,5,9]`에 N1/4/6; `[1,2,4,8]` N1/2/4; n4 all-zero N1/4. 요청 N은 별도 input count이고 count output과 분리 | C3/C5, lowest N/multiplicity/zero/N=n, count/guard/solve history; mock만으로 대체 금지 | +| MFE-C18 | Actual FEAST n64 spectrum: 앞40개 λ=1, 나머지 λ=2..25, N1 및N41. n4 tight spectrum `[1,1+2^-28,1+2^-27,8]`, N2. B=Q diag(lambda) Q^T의 dense-pattern test도 추가; Q는 고정 Givens(pi/6,pi/4) 곱 | C3-07/08, repeated group>N에서 c/m0가 N보다 커짐, 전체 c Gram, partial cluster merge 금지 | +| MFE-C19 | Actual backend에 `[ -2,0,3 ]`, `[ -1e-12,0,1 ]`. Backend raw negative 보존; procedure는 첫 spectrum의 유의한 음수 실패, near-zero negative는 classification·frequency-validity/raw 보존. Exact `±tau_zero*s` 및 그 양옆은 arithmetic/injection 경계 test | C3 분류와 실패 보존. 부적합 물리 K를 accepted shell이라고 주장하지 않음 | +| MFE-C20 | Density×4에서 두 M×4, λ/4, normalized vector amplitude 1/2; C08과 simple/repeated known-spectrum fixture 사용. 길이×1024, rho/1024³,E/1024,t×1024의 일관 단위 변환에서도 λ 불변 | C2/C3/C4; baseline s·same physical BC, 단위 mixing/floor 검출 | +| MFE-C21 | Endpoint=eigenvalue collision, prefix0 반환, nonmonotone count, total!=n, m!=c, info1/2/3/4/-1..-5/200..202·invalid fpm, missing/duplicate/nonfinite CSR, B-not-SPD를 각각 주입. QR rank/Gram failure·insufficient capacity·nonfinite pair·wrong residual도 주입 | C5의 정확한 retry 대상·budget/최종 failure. Error를 empty interval 또는 부분 성공으로 바꾸지 않음 | +| MFE-C22 | 실제 operator에 near endpoint/repeated cluster의 C5 history 검증과 adapter-mock count-call512/solve-call3 최대 경계, budget 직전 certified bracket fallback. Index/nnz+1/n²/n*m0 overflow 및 allocation 실패 injection | 정수 exact checks, 유한 종료, controlled failure. 큰 메모리를 실제 할당해 실패시킬 필요 없음 | + +MFE-C17/18 actual FEAST case에서 bounds를 expected eigenvalues로 설정하지 않는다. +Production E6/C5 search를 실행하고 independent diagonal spectrum의 prefix count와 +postsolve 결과로 history를 검증한다. Synthetic rotated pencil은 sparse CSR에 전 dense +pattern을 저장할 수 있지만 다른 eigensolver로 expected values를 계산하지 않는다. +False count/solve success가 lowest-N를 검증하지 못하는 mock도 포함해 missing low eigenpair를 +Gram/residual만으로 성공시키는 경로를 잡는다. + + +### P4. I/O·reference·운영 closure + +| Case ID | 필수 관찰 | 판정 | +| --- | --- | --- | +| MFE-C23 | 원본 input의 density/section mapping·S4/S4R common physical path·Step-2/N10·blank bounds·Lanczos/SIM/acoustic-free no-op·mass normalization. Unsupported fields, prior step/preload, nonzero BC, damping/acoustic/mixed elements는 fail-closed | I/O가 fixed syntax allowlist·진단으로 구체화. Source count와 actual FEAST count/backend 구분 | +| MFE-C24 | Source renumbering과 output self-check; logical mode/source identity·lambda dimension·actual mass/backend·candidate를 HDF5에서 복원. 기존 final hash/accepted state를 준비하고 solve/validation/write/close/replace failure 주입 | 정확한 schema는 I/O 소유. 모든 failure에서 계약 범위의 이전 state/final 보존, log는 별도 lifecycle | +| MFE-C25 | [새 eigen reference](reference-model.md) 10개 Value, 10 singleton families, comparator prechecks/1% RMS·5% row·near-zero·zero-scale inclusive 경계. Equal values의 distinct IDs와 reordered TXT는 허용, missing/extra/duplicate/NaN/Inf/wrong quantity/mass/schema는 실패 | 공통 policy 그대로, 모든 Value blocking. Actual FESA fresh binary 결과로 실행 | +| MFE-C26 | 아래 기존 linear/nonlinear static portfolio·configured 전체 regression suite·새 warning 없음. Density 없는 기존 static, source mapping·partial-BC response·Newton objective/tangent·평형·reaction·energy·rollback | C7와 기존 reference identity/policy. Old kd 수치 equality는 대체하되 다른 기준 유지 | +| MFE-C27 | RED가 변경 동작 때문에 실패했는지 확인, GREEN/focused/full MSVC x64 Debug CMake/CTest 실제 exit, actual FEAST/backend identity, fresh reference timestamps/hashes. 세 반복 구조/order/diagnostic 및 scalar 재현성 | C4, 전27개 requirement evidence 및 동일 r2 Physics/Release closure. 누락·실패·stale를 통과 처리 금지 | + +기존 정적 포트폴리오의 원본 목록은 +[Requirement evidence](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity)와 +[현재 nonlinear reference-model](../nonlinear-static-newton-raphson/reference-model.md)이다. +`shell`/`shellNL`/`shellNL-meshfine`의 해당 `.inp`와 같은 폴더의 원본 +` displacements.csv`, nonlinear의 required review-only reactions를 그대로 사용한다. +Linear `shell-s4`와 `shell-s4-linear-limit`는 같은 input의 서로 다른 검토 역할이며 +같은 fresh solve를 재사용할 수 있어도 각 identity/회귀 증거를 생략하지 않는다. + +U1/U2/U3는 global length blocking, UR1/UR2/UR3는 fixed-initial global rotation-vector +warning-only이며 같은 step/accepted state·case·dimension·coordinates·impact별 공통 family다. +Nonlinear RF1/RF2/RF3와 physical spatial RM1/RM2는 기존 source-key·finite·inventory 및 +error/RMS report를 유지하는 review-only다. RM3/stress는 기존 numerical gate에 넣지 않는다. +Factor-one 내부 force/moment equilibrium은 별도 blocking이고 C7를 따른다. +`shellnl-meshfine-02-s4-final`의 post-closure 역할은 그대로 유지하며 등록 suite의 해당 +실행·영향 evidence를 기록한다. 과거 세 case의 closure로 소급 합치지 않는다. + +Root가 관찰한 중단 baseline/단독 재현/나머지 pressure tests는 새 binary 전체 suite의 +성공 evidence가 아니다. Reference 테스트의 HDF5 cache가 이전 library보다 새롭다는 +이유로 옛 solve를 재사용하지 않았는지 확인하고, r2 영향을 받는 final comparison은 새 binary의 +fresh solve evidence로 남긴다. Reference input/results를 수정하거나 Hook state를 조작하지 않는다. + + +### Requirement coverage + +아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다. +Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md#requirements)가 원본이다. + +| Requirement suffix | 필수 cases | +| --- | --- | +| 001 | MFE-C23, MFE-C25 | +| 002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 | +| 003 | MFE-C06, MFE-C07, MFE-C23 | +| 004 | MFE-C01, MFE-C02, MFE-C07 | +| 005 | MFE-C01, MFE-C02, MFE-C03 | +| 006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 | +| 007 | MFE-C06, MFE-C13, MFE-C27 | +| 008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 | +| 009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 | +| 010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 | +| 011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 | +| 012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 | +| 013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 | +| 014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 | +| 015 | MFE-C23, MFE-C25 | +| 016 | MFE-C07, MFE-C21, MFE-C23 | +| 017 | MFE-C24, MFE-C25 | +| 018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 | +| 019 | MFE-C21, MFE-C22, MFE-C24 | +| 020 | MFE-C25, MFE-C26 | +| 021 | MFE-C25 | +| 022 | MFE-C25 | +| 023 | MFE-C27 | +| 024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 | +| 025 | MFE-C27 | +| 026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 | +| 027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 | diff --git a/docs/mitc4-shell-feast-eigen/reference-model.md b/docs/mitc4-shell-feast-eigen/reference-model.md index cfe847a..50e904a 100644 --- a/docs/mitc4-shell-feast-eigen/reference-model.md +++ b/docs/mitc4-shell-feast-eigen/reference-model.md @@ -6,10 +6,10 @@ - 검토일: `2026-09-06` - Artifact·logical comparison readiness: 필요한 입력과 비교값 확인 완료. - Numerical comparison result: 미실행. -- Stage의 I/O handoff 요청은 [numerical-review](numerical-review.md)의 `pass`를 따른다. +- Stage의 I/O handoff 요청은 [numerical-review](numerical-review.md#numerical-review)의 `pass`를 따른다. 지역 범위는 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), -`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md), +`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md#requirements), 공통 판정은 [TOLERANCE](../TOLERANCE.md)의 `common-reference-tolerance`, effective date `2026-08-18`, ADR-022를 따른다. @@ -47,7 +47,7 @@ TXT의 `Frame: Mode i`는 mode-domain frame identity를 준다. TXT에 step 이 지정 input에 frequency step이 정확히 하나인 사실로 결정적으로 해소한다. 이 예외를 다중 step이나 step이 모호한 artifact에 일반화하지 않는다. Modal frame id와 임의의 ODB storage frame index를 같은 정수라고 추정하지 않는다. -공개 의미의 근거는 [연구 S10/S11](research-evidence.md#source-inventory)이다. +공개 의미의 근거는 [연구 S10/S11](research.md#research-evidence--source-inventory)이다. 물리 eigenvalue가 같아도 다른 mode identity는 보존한다. 현재 표시값의 `(2,3)`, `(7,8)`, `(9,10)` 쌍을 평균·merge하지 않는다. 같은 표시값만으로 exact degeneracy를 @@ -106,7 +106,7 @@ Generic policy 테스트에는 near-zero `|r|=B`와 그 양옆도 포함한다. 실제 read-only `Get-Content`, `Get-FileHash`, `python -B -` inventory/identity script는 exit `0`: `729/676/104/625` nodes/elements/boundary/interior, 단일 `Step-2`, input N=10, 유일 finite positive Values `10`, 위 두 hash 일치를 확인했다. -명령·검토 evidence는 [수치 상세](numerical-review-evidence.md#실행-evidence)에 연결한다. +명령·검토 evidence는 [수치 상세](numerical-review.md#numerical-review-evidence--실행-evidence)에 연결한다. 단일 clamped flat case는 curved/partial-BC/null/zero-mode correctness를 검증하지 않는다. 원본 Abaqus 결과와 내부 정식화의 동등성, 구현의 수치 통과 또는 release를 주장하지 않는다. @@ -118,9 +118,9 @@ Value=omega² 의미, N의 입력 권위, source step/mode/frame, actual lumped 재사용했고 r2에서 두 원본 SHA-256이 위와 동일함을 확인했다(`Get-FileHash`, exit `0`). 과거 reference readiness를 r2 FESA 수치 비교 성공으로 바꾸지 않는다. -승인된 기존 static 회귀는 [Requirement의 단일 portfolio](requirements-evidence.md#필수-회귀-포트폴리오와-identity), -[C26](numerical-review-cases.md) 및 -[C7](numerical-review-controls.md#c7-승인된-정적-회귀-기준)을 따른다. +승인된 기존 static 회귀는 [Requirement의 단일 portfolio](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity), +[C26](numerical-review.md#numerical-review-cases) 및 +[C7](numerical-review.md#numerical-review-controls--c7-승인된-정적-회귀-기준)을 따른다. 그 static U blocking/UR warning-only·nonlinear local reaction review-only와 기존 step/accepted-state/source-node/component identity는 유지한다. Eigen의 Value-only와 서로 바꾸지 않는다. Static의 최신 common-policy projection을 적용하고 옛 파일명/schema diff --git a/docs/mitc4-shell-feast-eigen/requirements-evidence.md b/docs/mitc4-shell-feast-eigen/requirements-evidence.md deleted file mode 100644 index dbce7c4..0000000 --- a/docs/mitc4-shell-feast-eigen/requirements-evidence.md +++ /dev/null @@ -1,268 +0,0 @@ -# MITC4 eigen 요구사항의 관찰 evidence와 결정 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `requirement-agent` -- Input contract revision: `r2` -- 기본 보고서: [requirements.md](requirements.md) -- 관찰일: `2026-09-06` - -## 원본 reference 관찰 - -| Artifact | 실제 경로 | SHA-256 | -| --- | --- | --- | -| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` | -| Eigenvalues | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` | - -| 관찰 항목 | 파일에서 읽은 사실 | -| --- | --- | -| 모델 | `Part-1`, identity instance `Part-1-1`; 729 nodes, 676 `S4` elements | -| 좌표 | x/y 각각 `[-5,5]`, 모든 z=`0`; 26×26 element mesh의 사각 평판 | -| Section | line 1421 `*Shell Section, elset=Set-1, material=Material-1`; data `0.5, 5`; offset/composite 없음 | -| Material | lines 1455~1459: `Material-1`, `*Density`=`2700.`, `*Elastic`=`2.1e+11, 0.3` | -| Constraint | lines 1464~1470: `Set-2`의 DOF 1~6, 값 생략으로 homogeneous constraint | -| Procedure | lines 1475~1477: 유일한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; `10, , , , ,` | -| 선행 이력 | 이전 Step/Static/Initial Conditions/load 없음; 이름 `shellNL`이나 `Step-2`로 preload를 추론하지 않음 | -| 부수 요청 | `*Restart, write, frequency=0`, field/Node PRESELECT, history/Energy ALL. 모델은 acoustic element/coupling constraint를 포함하지 않음 | -| TXT | 10개 row; 각 row에 `Frame: Mode : Value = Freq = (cycles/time)` | -| Identity | mode IDs는 정확히 1~10, 유일하며 누락 없음; 모든 Value/Freq finite·positive | -| 반복값 | modes `(2,3)`, `(7,8)`, `(9,10)`의 표시 Value가 각각 같음; mode identity 중복과 구분 필요 | - -관찰 Value 목록은 다음과 같다. 원본 표시 정밀도를 확장·보정하지 않는다. - -| Mode | Value | -| --- | ---: | -| 1 | 2.19507E+05 | -| 2 | 8.85523E+05 | -| 3 | 8.85523E+05 | -| 4 | 1.85534E+06 | -| 5 | 2.74023E+06 | -| 6 | 2.77515E+06 | -| 7 | 4.14941E+06 | -| 8 | 4.14941E+06 | -| 9 | 6.73379E+06 | -| 10 | 6.73379E+06 | - -관찰값으로 `sqrt(Value)/(2*pi)`와 표시 `Freq`를 계산상 대조한 최대 상대차는 -`1.6946487122851045e-05`이다. 이것은 quantity 식별을 돕는 교차 확인이며 FESA comparison이나 -새 허용오차 판정이 아니다. `Value`는 `omega²`, `Freq`는 cycles/time이라는 공개 정의와 -일관된다. 단위계는 원문에 지정되지 않았고 수치만 보고 SI라고 단정하지 않는다. - -TXT에는 step 이름이 별도로 없지만 입력은 정확히 한 개 frequency step이며 mode identity와 -Value가 완전하다. 따라서 지정 input의 유일한 `Step-2`에 결합하는 deterministic projection은 -가능하다. 최종 readiness와 frame/family mapping은 NR·I/O가 소유한다. CSV가 없다는 이유로 -reference를 변환하거나 새 metadata/provenance를 요구할 근거는 없다. 사용자 지정 경로를 -우선하는 feature-specific artifact 선택이며 공통 reference 문서나 다른 feature 계약은 바꾸지 않는다. - -## 중요한 결정 - -### MFE-OQ-001 — 두 질량 계산 관계: 해결 - -사용자는 `2026-09-06` 후속 답변에서 “mass matrix는 consistent mass를 계산하고 이를 -이용해서 lumped mass를 계산합니다.”라고 명시했다. Consistent 원본 계산과 derived lumped -계산이 모두 필수이며 이전 둘 중 하나의 계산만 선택하는 초안은 대체되었다. -관련 결정은 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화), 요구사항은 -`FEM-REQ-MITC4-EIGEN-005`, `026`이다. Lumping 알고리즘은 사용자 지정이 없으므로 -Research/Formulation이 질량 보존·물리 회전 관성·좌표 변환·drilling 경계를 명시하고 NR가 검토한다. -모든 속도장의 kinetic energy나 두 spectrum의 exact equality를 보존 조건으로 추가하지 않는다. - -### MFE-OQ-002 — FEAST와 reference baseline의 질량: 해결 - -- 상태: **사용자 명시 결정으로 해결**. -- 관련 요구사항: `FEM-REQ-MITC4-EIGEN-008`, `011`, `013`, `017`, `020`. -- Owner: user가 사용 질량을 결정; Research/Formulation이 근거와 수식, - NR가 검증; Requirement Agent가 본 r1 baseline에 반영. - -사용자는 추가 답변에서 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 -할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”라고 명시했다. -따라서 FEAST와 authoritative reference baseline은 derived lumped mass를 사용하며 -동일 lumped mass로 residual·mass normalization·orthogonality를 검증한다. -Consistent는 유도 원본과 내부 mass/energy 검증에 유지한다. Consistent eigen 해석, -두 variant의 외부 비교 및 runtime 질량 선택 API는 현재 요구가 아니다. -이 결정은 수치 tolerance 통과나 정확도 우위의 evidence를 대신하지 않는다. - -Drilling은 기존 승인 shell 계약에서 비물리 안정화 좌표이다. 인공 drilling inertia를 -추가하거나 두 물리 회전 관성을 생략하는 대안을 새 사용자 옵션으로 발명하지 않는다. -Massless drilling을 그대로 generalized FEAST에 넣을 수 있다는 가정도 하지 않는다. -FEAST의 SPD 조건과 shell 질량 nullspace의 양립은 Research/Formulation이 물리 spectrum과 -constraints를 보존하는 방식으로 해결해야 한다. 이 문서는 elimination/projection/condensation -식을 승인하지 않으며, 새로운 물리 근사가 필수라는 evidence가 생기면 해당 owner가 반환한다. - -## NR-MFE-001 requirements intent 검토 - -이 절의 반례와 승인 전 판단은 **r1 이력**이다. 사용자 승인으로 개선 범위를 확정한 현재 -r2 계약은 아래 [r2 승인 범위와 정적 재검증](#r2-승인-범위와-정적-재검증)을 따른다. - -- Input contract revision: `r1` 유지. 이번 bounded 검토는 기존 `002/008/014`의 정합만 다룬다. -- 발견 근거: [Numerical Review](numerical-review.md#blocking-finding), - [NR 소유 직접 계산 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례), - [Formulation V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식). -- 결과: `needs-user-decision`. Requirement owner가 새 수식을 유도하거나 NR 계산을 재실행하지 않았다. - -NR는 유효한 단일 평판의 한 절점 `URZ`만 free인 모델에서 global Z축 45° 회전이 -동일 물리 component BC를 유지함을 확인했다. 기존 `kd` 규칙으로 고유치가 -`23.04088888888889`에서 `23.040628726287263`으로 달라지고 상대 차이가 -`1.1291343961675893e-5`다. 이는 NR의 독립 계산 evidence이며 새로운 mass/reduction의 -확인된 결함이나 이번 Requirement Agent의 runtime 검증 결과가 아니다. - -`014`의 원래 문구는 coordinate-invariance evidence를 필수로 두고 acceptance에 -독립 invariant suite 통과를 요구한다. 유한한 test portfolio를 NR에 위임한 것은 모든 -가능한 모델의 exact equality를 증명하라는 뜻은 아니지만, 알려진 지원 모델의 반례를 -검증 범위 밖으로 재분류할 권한도 아니다. Full-free/full-clamp 사례로만 범위를 고정한 V5는 -이 반례를 해소하지 못하므로 기존 의도의 단순 clarification으로 통과시킬 수 없다. - -`002`의 물리 kernel 재사용 문구 하나만 보면 numerical stabilization 수정까지 직접 -명시하지 않지만, 문서가 함께 재사용하는 [기존 shell 요구사항](../linear-static-mitc4-shell/requirements.md)의 -`FESA-REQ-LSMITC4-034/056`은 고정 `kd` 규칙을 정한다. `008`은 실제 제약을 적용한 -원래 pencil의 유한 spectrum 보존을 요구하므로 massless 처리에서 남는 stabilization을 -제거해 이 반례를 없애는 해석도 허용하지 않는다. 고정된 tensor의 기저 변환과 geometry를 -회전시켜 `kd`를 다시 계산하는 서로 다른 연산을 같은 검증으로 취급해서는 안 된다. - -### MFE-OQ-003 — r1에서 검토한 대안과 영향 - -| 대안 | 정확한 영향과 승인 뒤 필요한 작업 | -| --- | --- | -| 기존 stabilization 유지 및 한계 수용 | Partial rotation BC 지원과 원래 pencil을 유지한다. 해당 BC에서 stabilization이 유한 공간에 남는 경우의 일반 eigen 좌표 불변성을 현재 feature acceptance에서 보장하지 않도록 `014` 적용 범위를 명시적으로 변경한다. 두 질량·physical stiffness의 좌표 검증, 모든 지원 BC의 원래 pencil 보존·modal residual 등은 계속 필수이며 NR 반례를 알려진 한계로 보존한다. 이는 acceptance 변경이고 아직 승인되지 않았다 | -| 좌표 공변적인 stabilization 개선 — 권고 | 동일 물리 모델의 좌표축 선택에 따른 고유치 변화를 해결하는 강성 개선을 작업 범위에 추가한다. 기존 fixed `kd`와 충돌하는 계약의 owner·승인 경계를 정하고 Research/Formulation/NR를 재검토한다. 영향받는 기존 정적 결과와 새 eigen 결과를 재검증한다. 특정 대체 계수나 수식은 이 요구사항 검토에서 선택하지 않는다 | - -권고 이유는 좌표 선택만으로 같은 물리 모델의 고유치가 달라지는 알려진 결함을 유지하지 -않기 위해서다. 대가는 기존 stiffness 계약의 영향 조사와 정식화·회귀 검증 범위 증가다. -반례의 수치가 작다는 이유로 외부 reference tolerance를 적용하거나 일반 오차 상한으로 -사용하지 않는다. 이 한 건 외에 질량 흐름·FEAST 사용 질량·입력 N을 재질문하지 않는다. - -두 대안은 같은 반례를 acceptance에서 다르게 처리하며, 기술 evidence만으로 사용자가 -어느 변경 범위를 승인했는지 결정할 수 없다. 승인 전 `002/008/014` 원문, 기존 stiffness, -partial BC 지원, NR 판정 영향, 모든 tolerance·reference·schema를 변경하지 않았다. -Coordinator가 결정과 revision을 관리하고 영향받은 owner에게 후속 작업을 할당한다. -이 작업은 implementation correction이 아니며 correction budget을 사용하지 않는다. - -## r2 승인 범위와 정적 재검증 - -사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 -포함해주세요.”로 `MFE-OQ-003`의 개선안이 승인되었다. -[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)이 -승인·revision 근거이며, 한계 수용/acceptance 축소안은 선택되지 않았다. - -변경 intent는 `002` 물리 kernel 보존과 numerical stabilization 개선 분리, -`008` 개선된 constrained pencil의 유한 spectrum 보존, -`014` 지원 partial BC를 포함하는 필수 invariant 통과, -`024` 영향받은 정적 correctness/reference 재검증, 신규 `027` 좌표 공변적인 stabilization이다. -`020`은 eigen Value-only와 기존 static 회귀의 서로 다른 비교량을 명확히 구분한다. -기존 고정 scale과 직접 충돌하는 부분만 대체하며 수식·수치 기준·schema를 이 문서에서 정하지 않는다. - -기존 [linear shell 요구사항](../linear-static-mitc4-shell/requirements.md)의 -`034` scale 선정과 `056`의 해당 공식 검증을 대체하고, 나머지 physical/nonphysical 경계를 -유지한다. [Nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)도 -같은 initial physical tangent diagonal minimum을 사용하므로 영향받는 기존 static 경로다. -새 scale과 기존 nonlinear objective potential·일관 tangent·초기 고정 lifecycle의 정합을 -Formulation/NR가 확인해야 한다. 이 발견은 nonlinear material/procedure 범위 확대가 아니다. - -### 필수 회귀 포트폴리오와 identity - -| 구분 | 필수 재검증과 기존 evidence 계약 | -| --- | --- | -| Element 및 linear static correctness | 기존 [build-test](../linear-static-mitc4-shell/build-test.md)와 [physics](../linear-static-mitc4-shell/physics-evaluation.md)의 kernel/patch/rigid-mode/physical recovery·정적 partition/full residual·reaction·energy·source mapping을 재검증한다. 추가로 NR-MFE-001의 동일 물리 partial BC에서 complete K와 대응 정적 response를 좌표 변환해 검증한다. Loads/BC를 함께 물리적으로 변환하고 지원되지 않는 MPC 입력을 만들지 않는다 | -| 기존 linear S4 external regression | [reference-model](../linear-static-mitc4-shell/reference-model.md), [comparison의 common-policy 재검증](../linear-static-mitc4-shell/reference-comparison.md#2026-08-18-common-policy-revalidation), 현행 [nonlinear I/O의 공통 경로·linear control](../nonlinear-static-newton-raphson/io.md)을 적용한다. 원본 `reference/shell/shell.inp` + `reference/shell/shell displacements.csv`; stable source instance/node/component 및 해당 static step/frame. U1/U2/U3 blocking, UR1/UR2/UR3 warning-only를 유지한다 | -| 기존 nonlinear correctness | [FESA-REQ-NSNR-030](../nonlinear-static-newton-raphson/requirements.md), [formulation](../nonlinear-static-newton-raphson/formulation.md), [physics](../nonlinear-static-newton-raphson/physics-evaluation.md)의 선형극한·tangent consistency·objectivity·factor-one 전역 force/moment balance·free residual·commit/rollback을 새 scale로 재검증한다. 기존 Newton/convergence·하중·reaction 의미는 유지한다 | -| 기존 nonlinear external regression | [현행 reference-model](../nonlinear-static-newton-raphson/reference-model.md)과 [기존 comparison](../nonlinear-static-newton-raphson/reference-comparison.md)의 closure case `shellnl-s4-final`, `shellnl-meshfine-s4-final`, `shell-s4-linear-limit`를 재검증한다. 각각 `reference/shellNL/shellNL.inp`, `reference/shellNL-meshfine/shellNL-meshfine.inp`, 위 linear input 및 같은 폴더의 기존 ` displacements.csv`를 사용한다. Nonlinear은 source instance/node/component와 factor-one accepted state, linear은 자기 static state identity를 유지한다 | -| 새 eigen 검증 | 개선된 K와 derived lumped M에서 `008/013/014/027` 내부 검증 및 NR-MFE-001 해소를 필수 확인한다. 기존 지정 eigen input/TXT의 모든 요청 mode Value만 비교하며 static U/UR 데이터를 eigen reference로 사용하지 않는다 | - -Nonlinear 외부 회귀도 U blocking/UR warning-only이고, 기존 coarse/fine의 -`shellNL reactions.csv`·`shellNL-meshfine reactions.csv`에서 local RF1/RF2/RF3와 -physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 유지하는 review-only다. -RM3와 stress를 새 numerical gate로 추가하지 않는다. Internal equilibrium acceptance와 -local distribution 검토를 구분한다. 모든 외부 수치 판정은 `docs/TOLERANCE.md`를 그대로 사용한다. - -현행 nonlinear reference-model에는 `shellnl-meshfine-02-s4-final`도 별도 post-closure -verification으로 기록되어 있다. 이를 과거 세 case closure의 통과 evidence로 소급하지 -않는다. 기존 등록 회귀 suite에서의 실행·영향은 Planning이 기록하고 별도 case의 기존 -판정 역할을 유지한다. 과거 HDF5 schema/파일명/고정 absolute tolerance의 이력보다 현행 -공통 output 경로와 `TOLERANCE.md`, 각 feature의 최신 identity 계약이 우선한다. - -개선 전 숫자와의 bitwise equality는 요구하지 않는다. 위 approved physics·reference -기준과 개선된 formulation을 기대값으로 검증하며 오래된 실패를 baseline으로 재생성하여 -정당화하지 않는다. 원본 reference와 과거 보고서는 보존하고 새 r2 실행 evidence를 기록한다. -전체 configured MSVC/x64/Debug suite, 새 warning 없음, TDD와 failure preservation도 필수다. -현재 중요한 미결정은 없으며 연구·정식화·NR·구현의 후속 gate는 아직 통과하지 않았다. - -## 질문 없이 정리한 사항 - -- 무하중 원형상·비감쇠 해석은 실제 단일 `*FREQUENCY`와 선행 이력 부재로 결정한다. -- `.inp`의 Lanczos는 source solver 옵션이다. 사용자가 FESA backend를 FEAST로 명시했으므로 - source option을 유지해 읽되 실제 backend를 명시하는 mapping이 가능하다. Abaqus Lanczos - 동작과의 동등성을 주장하지 않는다. Exact allowlist와 진단은 I/O 소유이다. -- `SIM`은 source architecture 옵션이고 acoustic-free 모델의 `ACOUSTIC COUPLING=ON`은 - 실제 acoustic 모델 지원 요청이 아니다. 무해한 조합만 근거와 warning 정책으로 허용한다. -- `NORMALIZATION=MASS`의 내부 modal 의미를 유지한다. 외부 mode shape 비교는 추가하지 않는다. -- TXT의 명시적인 `Value`를 직접 읽고 원본을 보존한다. Matching/family는 tolerance 전에 - 고정하며 repeated eigenvalue와 duplicate mode ID를 구분한다. -- 기존 HDF5 의미를 보존하는 eigen quantity 추가는 신규 기능에 필요한 I/O 정의이다. - 비호환 변경이 없는 한 schema 검토를 별도 사용자 승인 질문으로 만들지 않는다. - -## 공개 근거 - -다음은 `2026-09-06`에 확인한 1차 문서이다. 공식 syntax와 backend admissibility 확인에만 -사용하며 Abaqus 내부 정식화의 추정 근거로 쓰지 않는다. - -1. [Abaqus 2025 — Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm): - `Eigenvalue Extraction`, `Initial Conditions`, `Loads`, `Output` 절. 무감쇠 eigenproblem의 - `omega²`, 원형상/선행 기하비선형 상태의 구분, 각 모드 출력 의미 확인. -2. [Abaqus 2025 — *FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm): - `Optional parameters`와 Lanczos data line 절. 요청수 10, blank bounds, source algorithm, - SIM/acoustic 옵션의 의미와 mass normalization 확인. -3. [Intel oneMKL 2026.0 — Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html): - real symmetric generalized 문제는 `B` SPD를 요구한다. 이 조건 때문에 massless drilling을 - 아무 처리 없이 FEAST에 전달해서는 안 된다. -4. [Intel oneMKL 2026.0 — ?feast_scsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html): - 지정 구간의 eigenpairs, subspace capacity, 결과 count와 status 의미 확인. 구간 선택·확장과 - 설치된 MKL 버전 검증은 후속 owner가 정의한다. - -## 실행 evidence와 미실행 - -r0 원본 관찰과 hash는 그대로 유지했다. 아래는 당시 실행한 read-only 조사이며 이번 r1에서 -reference 재조사나 변환을 수행하지 않았다. 해당 shell 명령은 exit code `0`이었다. - -```powershell -Get-Content -Raw '.codex/skills/fem-requirements-baseline/SKILL.md' -Get-Content -Raw 'docs/SOLVER_AGENT_DESIGN.md' -Get-Content -Raw 'docs/FEATURE_DOCUMENTATION.md' -rg -n -i '^\*(?!\*)|density|frequency|static|step|boundary|shell section' --pcre2 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Get-Content -Tail 75 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' -rg -n 'FEAST|feast|MassMatrix|Density|density|Frequency|Eigenvalue|eigenvalue' include src -g '*.[ch]*' -git status --short -``` - -추가 read-only `python -B -` here-script는 `pathlib`로 두 파일을 읽고 keyword별 node/element -count, 좌표 범위, regex `Mode\s+(\d+):\s+Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)`로 -mode/Value/Freq를 추출하여 finite·identity·주파수 교차 확인과 SHA-256을 계산했다. -Exit code `0`, 729 nodes / 676 elements / 10 modes였고 위 표·hash와 일치했다. -파일을 생성하거나 reference 내용을 쓰지 않았다. Source 검색에서 물리 mass/density/eigen -구현을 발견하지 못했고 nonlinear local energy 변수 `density`만 검색되었다. 이는 scoped 검색 -관찰이며 제품 미지원의 최종 코드 감사는 아니다. - -공통/feature/기존 MITC4·nonlinear 승인 계약을 read-only로 조사했다. 기존 보고서의 완료 -표시는 이번 feature 실행 증거로 재사용하지 않는다. C++ build/test, Harness, 외부 solver와 -FESA reference comparison은 요구사항 단계의 범위가 아니므로 미실행이다. - -r1에서는 관리문서·owned reports·공통 agent 계약을 `Get-Content`로 읽고 사용자 수정 -`AGENTS.md`의 GoogleTest 경로를 `rg -n 'GTEST|git|GoogleTest' 'AGENTS.md'`로 확인했다. -명령은 exit code `0`이었다. 실제 GoogleTest dependency 설정/build 확인은 Root·Planning -소유이며 이 문서 갱신에서 새로 실행하지 않았다. 두 사용자 결정으로 `MFE-OQ-001`과 -`MFE-OQ-002`를 해결했으며 기존 25개 requirement ID를 보존하고 derived lumped 요구 -`026`을 추가했다. 당시 질량 선택의 미결정은 모두 해소되었다. 이후 NR-MFE-001로 발견된 -현재 acceptance 결정은 위 별도 절에서 관리하며 상세 lumping 수식·수치 기준은 후속 owner 소유이다. - -NR-MFE-001 bounded 검토에서는 `Get-Content`로 현재 Feature 관리문서·owned 보고서·NR -main/evidence·reference-model·formulation-verification을 읽고, scoped `rg`로 -`002/008/014`와 기존 `FESA-REQ-LSMITC4-034/038/051/056`을 대조했다. Exit code `0`. -원본 reference 재조사, NR 반례 재계산, 새로운 외부 조사와 수식 유도는 수행하지 않았다. - -r2에서는 현재 관리문서와 위 기존 static reports/requirements/formulation을 `Get-Content`와 -scoped `rg`로 읽었다. Exit code `0`. 기존 nonlinear §10.3의 동일 scale 사용과 현행 -reference-model의 closure/별도 post-closure case 구분을 확인했다. 실제 reference 파일을 -재조회하거나 과거 수치·hash를 새로 계산하지 않았다. NR 반례/positive evidence도 재실행하지 -않았다. 변경은 owned 두 문서뿐이고 실제 C++/FEAST/build/test/reference 회귀는 미실행이다. - -변경한 경로는 기본 보고서와 이 상세 보고서 두 개뿐이며 관리문서, source, tests, phase, -공통 정책과 reference artifact는 편집하지 않았다. 정적 링크·필수 metadata·ID/matrix 검사를 -완료한 명령과 결과는 Requirement Agent 반환 evidence로 함께 보고한다. diff --git a/docs/mitc4-shell-feast-eigen/requirements.md b/docs/mitc4-shell-feast-eigen/requirements.md index 768e9f1..0e1a6af 100644 --- a/docs/mitc4-shell-feast-eigen/requirements.md +++ b/docs/mitc4-shell-feast-eigen/requirements.md @@ -1,7 +1,13 @@ -# MITC4 Shell Mass Matrix와 FEAST 고유치해석 요구사항 +# 이전 MFE 요구사항과 결정 근거 + +MFE 요구사항 ID·승인 근거는 이전 baseline의 이력이다. 현재 MFE2 요구와의 대응을 구분한다. + + + + +## MITC4 Shell Mass Matrix와 FEAST 고유치해석 요구사항 - Feature ID: `mitc4-shell-feast-eigen` -- Owner: `requirement-agent` - Input contract revision: `r2` - 검토 상태: 사용자 승인 stabilization 개선·정적/eigen 재검증 범위를 반영한 baseline gate 검토 요청. - 요청 outcome: `pass`; workflow 전이와 최종 gate 판정은 Coordinator 소유. @@ -12,9 +18,10 @@ [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용한다. Reference 관찰, 원문 경로·hash, 중요한 결정의 대안과 명령 evidence는 -[requirements-evidence.md](requirements-evidence.md)에 둔다. +[requirements-evidence.md](requirements.md#requirements-evidence)에 둔다. -## 핵심 결과와 범위 + +### 핵심 결과와 범위 지정된 reference는 이름에 `shellNL`이 있지만 선행 정적 해석 없이 원형상에서 수행하는 단일 무감쇠 선형 고유진동 해석이다. `Step-2`에서 10개 모드를 요청하고 모든 외곽 절점의 @@ -49,7 +56,8 @@ thickness, 기존 미지원 shell geometry, residual modes 및 modal stress/reac 사용자가 지정하지 않은 Lanczos/AMS 대체 backend, reference 생성·수정·복원과 외부 배포도 제외한다. 별도 frequency interval/shift 사용자 기능은 현재 최소 subset에 포함하지 않는다. -## 의미·단위·소유권 + +### 의미·단위·소유권 | 항목 | 요구되는 의미와 경계 | | --- | --- | @@ -66,10 +74,11 @@ thickness, 기존 미지원 shell geometry, residual modes 및 modal stress/reac solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run()`에 eigen 분기를 누적하거나 정적 reaction 의미를 modal 결과로 재사용해서는 안 된다. -## Requirement Verification Matrix + +### Requirement Verification Matrix 모든 행은 `must`이고 acceptance는 해당 행의 요구와 검증 조건을 모두 만족하는 것이다. -출처 `U`는 [Feature PRD](PRD.md)의 사용자 요구, `R`은 [관찰 evidence](requirements-evidence.md), +출처 `U`는 [Feature PRD](PRD.md)의 사용자 요구, `R`은 [관찰 evidence](requirements.md#requirements-evidence), `P`는 위 공통 기준, `L`은 [기존 MITC4 요구사항](../linear-static-mitc4-shell/requirements.md)과 [정식화](../linear-static-mitc4-shell/formulation.md), `N`은 [기존 nonlinear I/O](../nonlinear-static-newton-raphson/io.md)의 공통 경로·failure 계약을 뜻한다. @@ -106,7 +115,8 @@ solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run( | FEM-REQ-MITC4-EIGEN-026 | 솔버는 계산된 consistent mass에서 lumped mass를 유도하고 승인된 질량·관성 보존 계약을 검증해야 한다. | 유도 관계·독립 lumping oracle·총 병진 질량 보존, 차원/대칭성/물리 kinetic-energy 비음성, 물리 회전 관성과 drilling nullspace 의미 검사. Lumping 수식·좌표 block 처리·정확한 관성 불변식과 threshold는 Formulation/NR가 고정 | U r1, P, L; Research, Formulation, NR | | FEM-REQ-MITC4-EIGEN-027 | 개선된 numerical drilling stabilization은 같은 물리 모델의 좌표·접평면 기저 선택에 공변적이고 기존 비물리 역할을 유지해야 한다. | 독립 재계산한 stabilization/complete K의 congruence, finite·대칭·양의 numerical stabilization, 물리 rigid modes 보존, physical recovery 제외 및 결정론 검증. Partial BC의 NR-MFE-001과 대응 정적 response를 필수 통과시키며 기존 static의 동일 scale 사용 경로도 정합 검증; 수식·threshold는 Formulation/NR 소유 | U r2, L; Research, Formulation, NR, Planning, Physics | -## r2의 기존 계약 대체 범위 + +### r2의 기존 계약 대체 범위 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)의 승인으로 기존 `FESA-REQ-LSMITC4-034`의 basis-dependent `min(R+)` scale 선정과 `056` 중 그 @@ -119,22 +129,23 @@ solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run( 이력으로 보존하며 상세 대체 수식과 검증 trace를 이 feature의 후속 owner가 작성한다. 필수 static 회귀의 기존 case·identity·policy는 -[requirements evidence의 r2 재검증 범위](requirements-evidence.md#r2-승인-범위와-정적-재검증)를 따른다. +[requirements evidence의 r2 재검증 범위](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)를 따른다. 새 eigen reference의 Value-only를 기존 정적 reference 요구의 삭제로 해석하거나, 정적 U/UR 회귀를 eigen mode-shape 비교로 확대하지 않는다. -## 결정과 handoff + +### 결정과 handoff `MFE-OQ-001`은 사용자 후속 결정으로 해결되었다. Consistent를 계산하고 이로부터 lumped를 계산하므로 두 계산은 모두 필수다. 기존 양자택일 요구는 대체되었다. `MFE-OQ-002`도 사용자 명시 결정으로 해결되었다. **Consistent→lumped→FEAST** 흐름을 사용하며 external eigenvalue baseline과 내부 residual·normalization·orthogonality는 -동일 lumped mass에 대응한다. [사용자 결정 근거](requirements-evidence.md#중요한-결정)를 따른다. +동일 lumped mass에 대응한다. [사용자 결정 근거](requirements.md#requirements-evidence--중요한-결정)를 따른다. 질량·backend·mode count 선택은 해결되었으며 다시 질문하지 않는다. `MFE-OQ-003`은 사용자 명시 승인으로 해결되었다. 좌표 공변적인 stabilization 개선과 영향받는 기존 정적/eigen 재검증을 r2에 포함하며 partial BC 지원·invariance acceptance를 -축소하지 않는다. [기존 반례·판단 이력과 승인 delta](requirements-evidence.md#nr-mfe-001-requirements-intent-검토)를 +축소하지 않는다. [기존 반례·판단 이력과 승인 delta](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토)를 보존한다. 현재 요구사항의 중요한 미결정은 없고 NR 반례의 실제 해소·새 수치 통과는 아직 미검증이다. Research/Formulation은 consistent→lumped 유도 및 각 관성 불변식, lumped 질량과 massless drilling, supported global @@ -151,3 +162,284 @@ Harness Executor가 기존 계약에 따라 구현·phase 커밋을 소유하며 이번 산출물은 문서 요구사항과 read-only evidence 조사이다. 구현·CMake·CTest·Harness·외부 solver·수치 reference comparison은 수행하지 않았으며 통과로 보고하지 않는다. + + + + +## MITC4 eigen 요구사항의 관찰 evidence와 결정 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [requirements.md](requirements.md#requirements) +- 관찰일: `2026-09-06` + + +### 원본 reference 관찰 + +| Artifact | 실제 경로 | SHA-256 | +| --- | --- | --- | +| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` | +| Eigenvalues | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` | + +| 관찰 항목 | 파일에서 읽은 사실 | +| --- | --- | +| 모델 | `Part-1`, identity instance `Part-1-1`; 729 nodes, 676 `S4` elements | +| 좌표 | x/y 각각 `[-5,5]`, 모든 z=`0`; 26×26 element mesh의 사각 평판 | +| Section | line 1421 `*Shell Section, elset=Set-1, material=Material-1`; data `0.5, 5`; offset/composite 없음 | +| Material | lines 1455~1459: `Material-1`, `*Density`=`2700.`, `*Elastic`=`2.1e+11, 0.3` | +| Constraint | lines 1464~1470: `Set-2`의 DOF 1~6, 값 생략으로 homogeneous constraint | +| Procedure | lines 1475~1477: 유일한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; `10, , , , ,` | +| 선행 이력 | 이전 Step/Static/Initial Conditions/load 없음; 이름 `shellNL`이나 `Step-2`로 preload를 추론하지 않음 | +| 부수 요청 | `*Restart, write, frequency=0`, field/Node PRESELECT, history/Energy ALL. 모델은 acoustic element/coupling constraint를 포함하지 않음 | +| TXT | 10개 row; 각 row에 `Frame: Mode : Value = Freq = (cycles/time)` | +| Identity | mode IDs는 정확히 1~10, 유일하며 누락 없음; 모든 Value/Freq finite·positive | +| 반복값 | modes `(2,3)`, `(7,8)`, `(9,10)`의 표시 Value가 각각 같음; mode identity 중복과 구분 필요 | + +관찰 Value 목록은 다음과 같다. 원본 표시 정밀도를 확장·보정하지 않는다. + +| Mode | Value | +| --- | ---: | +| 1 | 2.19507E+05 | +| 2 | 8.85523E+05 | +| 3 | 8.85523E+05 | +| 4 | 1.85534E+06 | +| 5 | 2.74023E+06 | +| 6 | 2.77515E+06 | +| 7 | 4.14941E+06 | +| 8 | 4.14941E+06 | +| 9 | 6.73379E+06 | +| 10 | 6.73379E+06 | + +관찰값으로 `sqrt(Value)/(2*pi)`와 표시 `Freq`를 계산상 대조한 최대 상대차는 +`1.6946487122851045e-05`이다. 이것은 quantity 식별을 돕는 교차 확인이며 FESA comparison이나 +새 허용오차 판정이 아니다. `Value`는 `omega²`, `Freq`는 cycles/time이라는 공개 정의와 +일관된다. 단위계는 원문에 지정되지 않았고 수치만 보고 SI라고 단정하지 않는다. + +TXT에는 step 이름이 별도로 없지만 입력은 정확히 한 개 frequency step이며 mode identity와 +Value가 완전하다. 따라서 지정 input의 유일한 `Step-2`에 결합하는 deterministic projection은 +가능하다. 최종 readiness와 frame/family mapping은 NR·I/O가 소유한다. CSV가 없다는 이유로 +reference를 변환하거나 새 metadata/provenance를 요구할 근거는 없다. 사용자 지정 경로를 +우선하는 feature-specific artifact 선택이며 공통 reference 문서나 다른 feature 계약은 바꾸지 않는다. + + +### 중요한 결정 + + +#### MFE-OQ-001 — 두 질량 계산 관계: 해결 + +사용자는 `2026-09-06` 후속 답변에서 “mass matrix는 consistent mass를 계산하고 이를 +이용해서 lumped mass를 계산합니다.”라고 명시했다. Consistent 원본 계산과 derived lumped +계산이 모두 필수이며 이전 둘 중 하나의 계산만 선택하는 초안은 대체되었다. +관련 결정은 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화), 요구사항은 +`FEM-REQ-MITC4-EIGEN-005`, `026`이다. Lumping 알고리즘은 사용자 지정이 없으므로 +Research/Formulation이 질량 보존·물리 회전 관성·좌표 변환·drilling 경계를 명시하고 NR가 검토한다. +모든 속도장의 kinetic energy나 두 spectrum의 exact equality를 보존 조건으로 추가하지 않는다. + + +#### MFE-OQ-002 — FEAST와 reference baseline의 질량: 해결 + +- 상태: **사용자 명시 결정으로 해결**. +- 관련 요구사항: `FEM-REQ-MITC4-EIGEN-008`, `011`, `013`, `017`, `020`. + NR가 검증; Requirement Agent가 본 r1 baseline에 반영. + +사용자는 추가 답변에서 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 +할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”라고 명시했다. +따라서 FEAST와 authoritative reference baseline은 derived lumped mass를 사용하며 +동일 lumped mass로 residual·mass normalization·orthogonality를 검증한다. +Consistent는 유도 원본과 내부 mass/energy 검증에 유지한다. Consistent eigen 해석, +두 variant의 외부 비교 및 runtime 질량 선택 API는 현재 요구가 아니다. +이 결정은 수치 tolerance 통과나 정확도 우위의 evidence를 대신하지 않는다. + +Drilling은 기존 승인 shell 계약에서 비물리 안정화 좌표이다. 인공 drilling inertia를 +추가하거나 두 물리 회전 관성을 생략하는 대안을 새 사용자 옵션으로 발명하지 않는다. +Massless drilling을 그대로 generalized FEAST에 넣을 수 있다는 가정도 하지 않는다. +FEAST의 SPD 조건과 shell 질량 nullspace의 양립은 Research/Formulation이 물리 spectrum과 +constraints를 보존하는 방식으로 해결해야 한다. 이 문서는 elimination/projection/condensation +식을 승인하지 않으며, 새로운 물리 근사가 필수라는 evidence가 생기면 해당 owner가 반환한다. + + +### NR-MFE-001 requirements intent 검토 + +이 절의 반례와 승인 전 판단은 **r1 이력**이다. 사용자 승인으로 개선 범위를 확정한 현재 +r2 계약은 아래 [r2 승인 범위와 정적 재검증](requirements.md#requirements)을 따른다. + +- Input contract revision: `r1` 유지. 이번 bounded 검토는 기존 `002/008/014`의 정합만 다룬다. +- 발견 근거: [Numerical Review](numerical-review.md#numerical-review--blocking-finding), + [NR 소유 직접 계산 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례), + [Formulation V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식). +- 결과: `needs-user-decision`. Requirement owner가 새 수식을 유도하거나 NR 계산을 재실행하지 않았다. + +NR는 유효한 단일 평판의 한 절점 `URZ`만 free인 모델에서 global Z축 45° 회전이 +동일 물리 component BC를 유지함을 확인했다. 기존 `kd` 규칙으로 고유치가 +`23.04088888888889`에서 `23.040628726287263`으로 달라지고 상대 차이가 +`1.1291343961675893e-5`다. 이는 NR의 독립 계산 evidence이며 새로운 mass/reduction의 +확인된 결함이나 이번 Requirement Agent의 runtime 검증 결과가 아니다. + +`014`의 원래 문구는 coordinate-invariance evidence를 필수로 두고 acceptance에 +독립 invariant suite 통과를 요구한다. 유한한 test portfolio를 NR에 위임한 것은 모든 +가능한 모델의 exact equality를 증명하라는 뜻은 아니지만, 알려진 지원 모델의 반례를 +검증 범위 밖으로 재분류할 권한도 아니다. Full-free/full-clamp 사례로만 범위를 고정한 V5는 +이 반례를 해소하지 못하므로 기존 의도의 단순 clarification으로 통과시킬 수 없다. + +`002`의 물리 kernel 재사용 문구 하나만 보면 numerical stabilization 수정까지 직접 +명시하지 않지만, 문서가 함께 재사용하는 [기존 shell 요구사항](../linear-static-mitc4-shell/requirements.md)의 +`FESA-REQ-LSMITC4-034/056`은 고정 `kd` 규칙을 정한다. `008`은 실제 제약을 적용한 +원래 pencil의 유한 spectrum 보존을 요구하므로 massless 처리에서 남는 stabilization을 +제거해 이 반례를 없애는 해석도 허용하지 않는다. 고정된 tensor의 기저 변환과 geometry를 +회전시켜 `kd`를 다시 계산하는 서로 다른 연산을 같은 검증으로 취급해서는 안 된다. + + +#### MFE-OQ-003 — r1에서 검토한 대안과 영향 + +| 대안 | 정확한 영향과 승인 뒤 필요한 작업 | +| --- | --- | +| 기존 stabilization 유지 및 한계 수용 | Partial rotation BC 지원과 원래 pencil을 유지한다. 해당 BC에서 stabilization이 유한 공간에 남는 경우의 일반 eigen 좌표 불변성을 현재 feature acceptance에서 보장하지 않도록 `014` 적용 범위를 명시적으로 변경한다. 두 질량·physical stiffness의 좌표 검증, 모든 지원 BC의 원래 pencil 보존·modal residual 등은 계속 필수이며 NR 반례를 알려진 한계로 보존한다. 이는 acceptance 변경이고 아직 승인되지 않았다 | +| 좌표 공변적인 stabilization 개선 — 권고 | 동일 물리 모델의 좌표축 선택에 따른 고유치 변화를 해결하는 강성 개선을 작업 범위에 추가한다. 기존 fixed `kd`와 충돌하는 계약의 owner·승인 경계를 정하고 Research/Formulation/NR를 재검토한다. 영향받는 기존 정적 결과와 새 eigen 결과를 재검증한다. 특정 대체 계수나 수식은 이 요구사항 검토에서 선택하지 않는다 | + +권고 이유는 좌표 선택만으로 같은 물리 모델의 고유치가 달라지는 알려진 결함을 유지하지 +않기 위해서다. 대가는 기존 stiffness 계약의 영향 조사와 정식화·회귀 검증 범위 증가다. +반례의 수치가 작다는 이유로 외부 reference tolerance를 적용하거나 일반 오차 상한으로 +사용하지 않는다. 이 한 건 외에 질량 흐름·FEAST 사용 질량·입력 N을 재질문하지 않는다. + +두 대안은 같은 반례를 acceptance에서 다르게 처리하며, 기술 evidence만으로 사용자가 +어느 변경 범위를 승인했는지 결정할 수 없다. 승인 전 `002/008/014` 원문, 기존 stiffness, +partial BC 지원, NR 판정 영향, 모든 tolerance·reference·schema를 변경하지 않았다. +Coordinator가 결정과 revision을 관리하고 영향받은 owner에게 후속 작업을 할당한다. +이 작업은 implementation correction이 아니며 correction budget을 사용하지 않는다. + + +### r2 승인 범위와 정적 재검증 + +사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 +포함해주세요.”로 `MFE-OQ-003`의 개선안이 승인되었다. +[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)이 +승인·revision 근거이며, 한계 수용/acceptance 축소안은 선택되지 않았다. + +변경 intent는 `002` 물리 kernel 보존과 numerical stabilization 개선 분리, +`008` 개선된 constrained pencil의 유한 spectrum 보존, +`014` 지원 partial BC를 포함하는 필수 invariant 통과, +`024` 영향받은 정적 correctness/reference 재검증, 신규 `027` 좌표 공변적인 stabilization이다. +`020`은 eigen Value-only와 기존 static 회귀의 서로 다른 비교량을 명확히 구분한다. +기존 고정 scale과 직접 충돌하는 부분만 대체하며 수식·수치 기준·schema를 이 문서에서 정하지 않는다. + +기존 [linear shell 요구사항](../linear-static-mitc4-shell/requirements.md)의 +`034` scale 선정과 `056`의 해당 공식 검증을 대체하고, 나머지 physical/nonphysical 경계를 +유지한다. [Nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)도 +같은 initial physical tangent diagonal minimum을 사용하므로 영향받는 기존 static 경로다. +새 scale과 기존 nonlinear objective potential·일관 tangent·초기 고정 lifecycle의 정합을 +Formulation/NR가 확인해야 한다. 이 발견은 nonlinear material/procedure 범위 확대가 아니다. + + +#### 필수 회귀 포트폴리오와 identity + +| 구분 | 필수 재검증과 기존 evidence 계약 | +| --- | --- | +| Element 및 linear static correctness | 기존 [build-test](../linear-static-mitc4-shell/verification.md#build-test)와 [physics](../linear-static-mitc4-shell/verification.md#physics-evaluation)의 kernel/patch/rigid-mode/physical recovery·정적 partition/full residual·reaction·energy·source mapping을 재검증한다. 추가로 NR-MFE-001의 동일 물리 partial BC에서 complete K와 대응 정적 response를 좌표 변환해 검증한다. Loads/BC를 함께 물리적으로 변환하고 지원되지 않는 MPC 입력을 만들지 않는다 | +| 기존 linear S4 external regression | [reference-model](../linear-static-mitc4-shell/reference-model.md), [comparison의 common-policy 재검증](../linear-static-mitc4-shell/verification.md#reference-comparison--2026-08-18-common-policy-revalidation), 현행 [nonlinear I/O의 공통 경로·linear control](../nonlinear-static-newton-raphson/io.md)을 적용한다. 원본 `reference/shell/shell.inp` + `reference/shell/shell displacements.csv`; stable source instance/node/component 및 해당 static step/frame. U1/U2/U3 blocking, UR1/UR2/UR3 warning-only를 유지한다 | +| 기존 nonlinear correctness | [FESA-REQ-NSNR-030](../nonlinear-static-newton-raphson/requirements.md), [formulation](../nonlinear-static-newton-raphson/formulation.md), [physics](../nonlinear-static-newton-raphson/verification.md#physics-evaluation)의 선형극한·tangent consistency·objectivity·factor-one 전역 force/moment balance·free residual·commit/rollback을 새 scale로 재검증한다. 기존 Newton/convergence·하중·reaction 의미는 유지한다 | +| 기존 nonlinear external regression | [현행 reference-model](../nonlinear-static-newton-raphson/reference-model.md)과 [기존 comparison](../nonlinear-static-newton-raphson/verification.md#reference-comparison)의 closure case `shellnl-s4-final`, `shellnl-meshfine-s4-final`, `shell-s4-linear-limit`를 재검증한다. 각각 `reference/shellNL/shellNL.inp`, `reference/shellNL-meshfine/shellNL-meshfine.inp`, 위 linear input 및 같은 폴더의 기존 ` displacements.csv`를 사용한다. Nonlinear은 source instance/node/component와 factor-one accepted state, linear은 자기 static state identity를 유지한다 | +| 새 eigen 검증 | 개선된 K와 derived lumped M에서 `008/013/014/027` 내부 검증 및 NR-MFE-001 해소를 필수 확인한다. 기존 지정 eigen input/TXT의 모든 요청 mode Value만 비교하며 static U/UR 데이터를 eigen reference로 사용하지 않는다 | + +Nonlinear 외부 회귀도 U blocking/UR warning-only이고, 기존 coarse/fine의 +`shellNL reactions.csv`·`shellNL-meshfine reactions.csv`에서 local RF1/RF2/RF3와 +physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 유지하는 review-only다. +RM3와 stress를 새 numerical gate로 추가하지 않는다. Internal equilibrium acceptance와 +local distribution 검토를 구분한다. 모든 외부 수치 판정은 `docs/TOLERANCE.md`를 그대로 사용한다. + +현행 nonlinear reference-model에는 `shellnl-meshfine-02-s4-final`도 별도 post-closure +verification으로 기록되어 있다. 이를 과거 세 case closure의 통과 evidence로 소급하지 +않는다. 기존 등록 회귀 suite에서의 실행·영향은 Planning이 기록하고 별도 case의 기존 +판정 역할을 유지한다. 과거 HDF5 schema/파일명/고정 absolute tolerance의 이력보다 현행 +공통 output 경로와 `TOLERANCE.md`, 각 feature의 최신 identity 계약이 우선한다. + +개선 전 숫자와의 bitwise equality는 요구하지 않는다. 위 approved physics·reference +기준과 개선된 formulation을 기대값으로 검증하며 오래된 실패를 baseline으로 재생성하여 +정당화하지 않는다. 원본 reference와 과거 보고서는 보존하고 새 r2 실행 evidence를 기록한다. +전체 configured MSVC/x64/Debug suite, 새 warning 없음, TDD와 failure preservation도 필수다. +현재 중요한 미결정은 없으며 연구·정식화·NR·구현의 후속 gate는 아직 통과하지 않았다. + + +### 질문 없이 정리한 사항 + +- 무하중 원형상·비감쇠 해석은 실제 단일 `*FREQUENCY`와 선행 이력 부재로 결정한다. +- `.inp`의 Lanczos는 source solver 옵션이다. 사용자가 FESA backend를 FEAST로 명시했으므로 + source option을 유지해 읽되 실제 backend를 명시하는 mapping이 가능하다. Abaqus Lanczos + 동작과의 동등성을 주장하지 않는다. Exact allowlist와 진단은 I/O 소유이다. +- `SIM`은 source architecture 옵션이고 acoustic-free 모델의 `ACOUSTIC COUPLING=ON`은 + 실제 acoustic 모델 지원 요청이 아니다. 무해한 조합만 근거와 warning 정책으로 허용한다. +- `NORMALIZATION=MASS`의 내부 modal 의미를 유지한다. 외부 mode shape 비교는 추가하지 않는다. +- TXT의 명시적인 `Value`를 직접 읽고 원본을 보존한다. Matching/family는 tolerance 전에 + 고정하며 repeated eigenvalue와 duplicate mode ID를 구분한다. +- 기존 HDF5 의미를 보존하는 eigen quantity 추가는 신규 기능에 필요한 I/O 정의이다. + 비호환 변경이 없는 한 schema 검토를 별도 사용자 승인 질문으로 만들지 않는다. + + +### 공개 근거 + +다음은 `2026-09-06`에 확인한 1차 문서이다. 공식 syntax와 backend admissibility 확인에만 +사용하며 Abaqus 내부 정식화의 추정 근거로 쓰지 않는다. + +1. [Abaqus 2025 — Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm): + `Eigenvalue Extraction`, `Initial Conditions`, `Loads`, `Output` 절. 무감쇠 eigenproblem의 + `omega²`, 원형상/선행 기하비선형 상태의 구분, 각 모드 출력 의미 확인. +2. [Abaqus 2025 — *FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm): + `Optional parameters`와 Lanczos data line 절. 요청수 10, blank bounds, source algorithm, + SIM/acoustic 옵션의 의미와 mass normalization 확인. +3. [Intel oneMKL 2026.0 — Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html): + real symmetric generalized 문제는 `B` SPD를 요구한다. 이 조건 때문에 massless drilling을 + 아무 처리 없이 FEAST에 전달해서는 안 된다. +4. [Intel oneMKL 2026.0 — ?feast_scsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html): + 지정 구간의 eigenpairs, subspace capacity, 결과 count와 status 의미 확인. 구간 선택·확장과 + 설치된 MKL 버전 검증은 후속 owner가 정의한다. + + +### 실행 evidence와 미실행 + +r0 원본 관찰과 hash는 그대로 유지했다. 아래는 당시 실행한 read-only 조사이며 이번 r1에서 +reference 재조사나 변환을 수행하지 않았다. 해당 shell 명령은 exit code `0`이었다. + +```powershell +Get-Content -Raw '.codex/skills/fem-requirements-baseline/SKILL.md' +Get-Content -Raw 'docs/SOLVER_AGENT_DESIGN.md' +Get-Content -Raw 'docs/FEATURE_DOCUMENTATION.md' +rg -n -i '^\*(?!\*)|density|frequency|static|step|boundary|shell section' --pcre2 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' +Get-Content -Tail 75 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' +Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' +rg -n 'FEAST|feast|MassMatrix|Density|density|Frequency|Eigenvalue|eigenvalue' include src -g '*.[ch]*' +git status --short +``` + +추가 read-only `python -B -` here-script는 `pathlib`로 두 파일을 읽고 keyword별 node/element +count, 좌표 범위, regex `Mode\s+(\d+):\s+Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)`로 +mode/Value/Freq를 추출하여 finite·identity·주파수 교차 확인과 SHA-256을 계산했다. +Exit code `0`, 729 nodes / 676 elements / 10 modes였고 위 표·hash와 일치했다. +파일을 생성하거나 reference 내용을 쓰지 않았다. Source 검색에서 물리 mass/density/eigen +구현을 발견하지 못했고 nonlinear local energy 변수 `density`만 검색되었다. 이는 scoped 검색 +관찰이며 제품 미지원의 최종 코드 감사는 아니다. + +공통/feature/기존 MITC4·nonlinear 승인 계약을 read-only로 조사했다. 기존 보고서의 완료 +표시는 이번 feature 실행 증거로 재사용하지 않는다. C++ build/test, Harness, 외부 solver와 +FESA reference comparison은 요구사항 단계의 범위가 아니므로 미실행이다. + +r1에서는 관리문서·owned reports·공통 agent 계약을 `Get-Content`로 읽고 사용자 수정 +`AGENTS.md`의 GoogleTest 경로를 `rg -n 'GTEST|git|GoogleTest' 'AGENTS.md'`로 확인했다. +명령은 exit code `0`이었다. 실제 GoogleTest dependency 설정/build 확인은 Root·Planning +소유이며 이 문서 갱신에서 새로 실행하지 않았다. 두 사용자 결정으로 `MFE-OQ-001`과 +`MFE-OQ-002`를 해결했으며 기존 25개 requirement ID를 보존하고 derived lumped 요구 +`026`을 추가했다. 당시 질량 선택의 미결정은 모두 해소되었다. 이후 NR-MFE-001로 발견된 +현재 acceptance 결정은 위 별도 절에서 관리하며 상세 lumping 수식·수치 기준은 후속 owner 소유이다. + +NR-MFE-001 bounded 검토에서는 `Get-Content`로 현재 Feature 관리문서·owned 보고서·NR +main/evidence·reference-model·formulation-verification을 읽고, scoped `rg`로 +`002/008/014`와 기존 `FESA-REQ-LSMITC4-034/038/051/056`을 대조했다. Exit code `0`. +원본 reference 재조사, NR 반례 재계산, 새로운 외부 조사와 수식 유도는 수행하지 않았다. + +r2에서는 현재 관리문서와 위 기존 static reports/requirements/formulation을 `Get-Content`와 +scoped `rg`로 읽었다. Exit code `0`. 기존 nonlinear §10.3의 동일 scale 사용과 현행 +reference-model의 closure/별도 post-closure case 구분을 확인했다. 실제 reference 파일을 +재조회하거나 과거 수치·hash를 새로 계산하지 않았다. NR 반례/positive evidence도 재실행하지 +않았다. 변경은 owned 두 문서뿐이고 실제 C++/FEAST/build/test/reference 회귀는 미실행이다. + +변경한 경로는 기본 보고서와 이 상세 보고서 두 개뿐이며 관리문서, source, tests, phase, +공통 정책과 reference artifact는 편집하지 않았다. 정적 링크·필수 metadata·ID/matrix 검사를 +완료한 명령과 결과는 Requirement Agent 반환 evidence로 함께 보고한다. diff --git a/docs/mitc4-shell-feast-eigen/research-evidence.md b/docs/mitc4-shell-feast-eigen/research-evidence.md deleted file mode 100644 index 3ab88ef..0000000 --- a/docs/mitc4-shell-feast-eigen/research-evidence.md +++ /dev/null @@ -1,437 +0,0 @@ -# MITC4 질량·FEAST 근거와 downstream 검증 후보 - -- Feature ID: `mitc4-shell-feast-eigen` -- Owner: `research-agent` -- Input contract revision: `r2` -- 기본 보고서: [research.md](research.md) -- Web access date: `2026-09-06` - -`Fact`는 출처에서 확인한 내용, `Derivation/Inference`는 그 근거를 승인된 FESA에 적용한 -연구 판단, `Candidate`는 Formulation/NR가 확정할 항목이다. 이 문서는 최종 수식·API·schema· -tolerance나 benchmark acceptance를 승인하지 않는다. - -## Source inventory - -모든 외부 source는 원 논문 또는 공식 문서다. `P`는 프로젝트 계약이며 독립 검증 근거가 아니다. -공식 Abaqus 자료는 공개 입력·출력 의미만 설명한다. - -| ID | Source identity / stable locator | 신뢰도·적용·한계 | -| --- | --- | --- | -| S01 | Dvorkin & Bathe, *A Continuum Mechanics Based Four-Node Shell Element for General Non-linear Analysis*, Engineering Computations 1 (1984), 77–88, DOI `10.1108/eb023562`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eq.(1),(2), Eq.(25) 직후 및 Fig.7/Tables 3–4; [local transcription](../reference-papers/MITC4/AContinuumMechanicsBasedFourNodeShell/AContinuumMechanicsBasedFourNodeShell_001.md) | 1차 운동학·5 DOF·consistent-mass vibration 예제. Local OCR의 도표값은 검증 없이 acceptance 값으로 채택하지 않음. 비선형·가변두께 범위를 새로 허용하지 않음 | -| S02 | Voet, Sande & Buffa, *A mathematical theory for mass lumping and its generalization with applications to isogeometric analysis*, CMAME 410 (2023), 116033, DOI `10.1016/j.cma.2023.116033`; [author preprint v2](https://arxiv.org/html/2212.03614v2), §1, Definition 3.7, Remark 3.8, Lemma 3.19, §3.3 | 원 연구의 row-sum·positivity·Loewner 근거. 일반 scalar algebra를 회전 tensor에 그대로 옮기는 것은 입증되지 않음 | -| S03 | Bathe & Wilson, *Solution methods for eigenvalue problems in structural mechanics*, IJNME 6 (1973), 213–226, DOI `10.1002/nme.1620060207`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13); [publisher record](https://onlinelibrary.wiley.com/doi/pdf/10.1002/nme.1620060207) | 원 연구의 massless elimination과 fill/storage 한계. 임의 massive DOF를 제거하는 근사 Guyan reduction의 정확성을 주장하지 않음 | -| S04 | Intel oneMKL C Developer Reference, 2026.0 URL edition, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), `generalized` 및 sparse interface 설명 | 공식 admissibility·PARDISO 사용. 설치 runtime와 같은 version string이라는 가정 없음 | -| S05 | 같은 edition, [?feast_scsrgv/?feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `Syntax`, `Input/Output Parameters`; [Matrix Storage](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/matrix-storage.html) | 공식 signature·storage·capacity·결과 의미. `emin≤emax` 본문은 S07의 strict validation과 함께 읽음 | -| S06 | 같은 edition, [Extended Eigensolver Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm` 표 | 공식 count/check/iteration 옵션. Standalone FEAST 다른 버전의 fpm 번호를 대입하지 않음 | -| S07 | 같은 edition, [Extended Eigensolver Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), return-code 표와 `info=1` 주의 | 공식 오류·구간 폭·endpoint 위험. Warning은 Feature 성공으로 자동 승격하지 않음 | -| S08 | E. Polizzi, *Density-Matrix-Based Algorithm for Solving Eigenvalue Problems*, Physical Review B 79 (2009), 115112, DOI `10.1103/PhysRevB.79.115112`; [author preprint](https://arxiv.org/pdf/0901.2665), §II.A Eqs.(6)–(9), §II.B | 원 FEAST의 contour/Rayleigh–Ritz와 B-orthonormality. MKL 옵션·상태 정의는 S05–S07 우선 | -| S09 | Abaqus 2025 [*FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), `Optional parameters`, Lanczos data line | 공식 count·bounds·SIM·normalization·acoustic semantics. FESA가 source Lanczos를 구현한다는 근거가 아님 | -| S10 | Abaqus 2025 [Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm), `Eigenvalue Extraction`, `Normalization`, `Initial Conditions`, `Output` | 공식 `omega²`·generalized mass·base state. Abaqus 내부 질량 정식화에 대한 추론 금지 | -| S11 | Abaqus 2025 [OdbFrame object](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKERRefMap/simaker-c-odbframepyc.htm), modal constructor와 members; [Mode Domain Output](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEOUTRefMap/simaout-c-dboutput-frequency.htm), `Controlling Output Frequency in a Mode Domain Analysis` | 공식 mode/frame 의미. TXT에 없는 step을 임의 생성하는 권한이 아님 | -| S12 | LAPACK 3.12.1, [DLAEV2 original source/documentation](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html), source lines 31–39 (`Purpose`), 102–113 (`Further Details`); authors Univ. Tennessee / UC Berkeley / Colorado Denver / NAG | 공식 2×2 대칭 eigendecomposition과 작은 고유값의 determinant cancellation 한계. FESA scale 선정 규칙이나 새 vendor 호출 의무를 제공하지 않음 | -| S13 | Müller & Bischoff, *A Consistent Finite Element Formulation of the Geometrically Non-linear Reissner-Mindlin Shell Model*, ACME 29 (2022), 3387–3434, [updated original article](https://link.springer.com/article/10.1007/s11831-021-09702-7), Abstract, §2, §§6.1–6.2; corrections [April 2022](https://link.springer.com/article/10.1007/s11831-022-09725-8), [November 2022](https://link.springer.com/article/10.1007/s11831-022-09832-6) | 자체 shell 정식화의 potential 선형화·objectivity 근거만 사용. Review로 분류된 논문의 자체 유도 부분이며 문헌 요약을 1차 근거로 대용하지 않음. FESA의 MITC4·drilling 수식과 동일하지 않음 | -| P01 | [기존 MITC4 formulation](../linear-static-mitc4-shell/formulation.md), §§5,8,9,12,17; [실제 kernel](../../src/fesa/elements/mitc4_shell.cpp), `PhysicalTransformation20`, `DrillingTransformation4`, `EvaluateStiffness`, `GeometryAt`; [ARCHITECTURE](../ARCHITECTURE.md) | 현재 FESA 기하·부호·소유권 계약; 옛 scale 공식은 r2 대체 대상. Legacy research의 오래된 tolerance/승인 절차는 이번 계약에 재사용하지 않음 | -| P02 | [requirements r2](requirements.md), [원본 reference evidence·승인 delta](requirements-evidence.md), [공통 TOLERANCE](../TOLERANCE.md), [ADR](ADR.md) | 승인된 사용자 흐름과 acceptance boundary. 수치 통과 자체의 evidence가 아님 | -| P03 | [기존 nonlinear formulation §§10.2–10.4](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [기존 linear requirements 034/056](../linear-static-mitc4-shell/requirements.md), [NR-MFE-001 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례), [r2 static 회귀 계약](requirements-evidence.md#r2-승인-범위와-정적-재검증) | 기존 initial-fixed scale·objective potential·미분 및 r2 대체/회귀 경계. NR 반례를 재실행한 evidence로 주장하지 않음 | - -Hinton–Rock–Zienkiewicz (1976), DOI `10.1002/eqe.4290040305`의 -[publisher abstract](https://onlinelibrary.wiley.com/doi/10.1002/eqe.4290040305)는 확인했으나 -본문을 확보하지 않아 HRZ의 shell-specific 수식을 근거로 채택하지 않았다. -NASA SP-160은 optional plate benchmark 탐색에서 발견했으나 이번 포트폴리오는 S01 및 -직접 검산 가능한 oracle로 충분하므로 필수 artifact나 새 acceptance 요구로 추가하지 않았다. -Configured FEM vault는 이번 요청의 지정 evidence source가 아니며, 기존 wiki/연구 요약은 -탐색에만 참고하고 핵심 주장을 위 1차 source에 연결했다. - -## R01 — Consistent physical mass와 적분 - -**Fact, S01/P01:** 기존 보간은 `u = sum Ni(ui + z*(theta_i cross d_i))`, -`z=t*zeta/2`이며 director-parallel rotation은 입자 속도에 기여하지 않는다. -원 논문의 elastic example은 surface `2×2`, thickness 2-point Gauss 및 consistent-mass -주파수 분석을 사용한다. 이는 임의 geometry의 mass 적분이 정확하다는 증명은 아니다. - -**Derivation:** `T=1/2 integral rho*|u_dot|² dV`에서 `M_C=integral rho*H^T H dV`가 -따른다. Geometry는 기존 `X=sum Ni(Xi+z*di)`와 같은 `J=det(dX/dnatural)`를 사용한다. -양의 quadrature weight·density·유효 J에서는 대칭 PSD와 drilling null action이 직접 따른다. -MITC의 assumed shear는 strain 보간이므로 velocity 보간을 바꾸거나 shear factor `5/6`를 -물리 질량에 곱하는 이유가 되지 않는다. - -**평판 oracle:** 평행 director·centered flat section이면 병진 scalar block은 -`rho*t*integral Ni*Nj dA`, rotary block은 `rho*t³/12*integral Ni*Nj dA`와 tangent -변환의 곱이며 translation–rotation coupling은 0이다. 축정렬 직사각형 면적 A에서는 -scalar consistent block이 `rho*t*A/36`에 다음 행렬을 곱한 것과 같다. - -```text -4 2 1 2 -2 4 2 1 -1 2 4 2 -2 1 2 4 -``` - -Rotary oracle의 scalar 배율은 위 병진 배율의 `t²/12`다. 이는 bilinear 형상함수의 직접 -다항식 적분 결과이며 구현 함수를 다시 호출하는 테스트와 구분한다. - -**Candidate/한계:** 곡면에서는 J가 zeta에 의존하여 odd thickness moment와 -translation–rotation coupling이 남을 수 있다. Centered section만으로 이를 0으로 두지 않는다. -현재 trilinear geometry의 J 및 H 다항식 차수를 확인해 충분한 적분을 선택할 수 있다. -보수적인 tensor-product 3-point 후보는 각 좌표의 degree≤4 mass integrand를 적분하지만, -정확한 차수·기하 검증 위치·채택 quadrature는 Formulation/NR가 증명한다. 기존 stiffness -quadrature나 기존 geometry 허용 범위를 연구 단계에서 변경하지 않는다. - -## R02 — Consistent에서 유도하는 좌표 일관적 lumping - -**Fact, S02:** Row-sum, nodal quadrature, diagonal scaling은 일반적으로 서로 다른 근사다. -Nonnegative partition of unity는 scalar row-sum의 positivity를 설명한다. 논문의 -absolute-row-sum operator는 일반 행렬의 positivity를 확보하지만 물리 total mass나 -회전 nullspace를 보존하는 shell-specific theorem은 아니다. - -**Derivation — 피해야 할 적용:** global rotary tensor는 `I-di*di^T`와 다른 director -사이의 cross block을 포함한다. Scalar `diag(M*ones)`는 좌표 회전과 commute하지 않는다. -예를 들어 단위 director `d=(1,1,1)/sqrt(3)`의 `P=I-dd^T`는 `P*ones=0`이지만 -rank는 2다. Row-sum은 두 물리 관성을 모두 없애며 absolute row-sum은 drilling에 -관성을 더한다. 혼합 translation/rotation 행의 무차별 합은 단위도 섞는다. - -**Candidate — scalar moment를 통한 node block:** Consistent의 구성 moment -`Ck_ij=integral rho*Ni*Nj*z^k dV`, `k=0,1,2`를 식별하고 해당 물리 scalar moment에서 -row-sum한 뒤 각 node의 director tangent tensor로 재구성하는 방법을 검토할 수 있다. -이는 consistent 결과와의 유도 관계를 증명해야 하며, 별도 unrelated diagonal을 생성하는 -우회 경로로 쓰지 않는다. Full consistent block에서 moment를 추출하거나 계산 중 동일 -moment를 보존하는 구체적 방식은 Formulation 소유다. - -`sum Nj=1` 때문에 이 후보는 node별 `integral rho*Ni*Gi(z)^T Gi(z) dV` 형태로 -설명된다. 여기서 `Gi(z)`는 그 node의 병진과 director 변화로 particle velocity를 만드는 -map이다. 따라서 양의 measure에서 physical block PSD, director nullspace, tensor -congruence와 총 병진 질량 보존을 독립적으로 검산할 수 있다. Flat case에서는 -`m_i=sum_j C0_ij`, 두 tangent inertia `m_i*t²/12`, drilling 0으로 단순화된다. - -**한계:** 곡면의 nodal rotational frames를 component별로 직접 더하지 않는다. -Node block은 global 좌표에서 diagonal일 필요가 없다. Translation–rotation moment를 -보존하면 6×6 block에 coupling이 있을 수 있다. 이 후보의 positivity와 각 inertia/centroid -보존 관계는 Formulation에서 완성하고 NR가 독립 검토해야 한다. Uniform translation -energy는 보존하지만 일반 회전의 orbital inertia 및 모든 속도장의 consistent energy는 -보존한다고 가정하지 않는다. 물리 node velocity의 convexity로 설명 가능한 에너지 차이와 -refinement 거동을 검증 후보로 삼을 수 있으며, Abaqus 내부 lumping 동일성을 주장하지 않는다. - -## R03 — Massless 좌표, 제약과 유한 spectrum - -**Fact, S03:** Massless 좌표를 분리하여 mass가 `diag(Mp,0)`, `Mp` SPD이고 대응 -강성 `Kzz`가 가역이면 `Kr=Kpp-Kpz*Kzz^-1*Kzp`와 `Mp`의 문제로 축소하며, -massless 성분은 `z=-Kzz^-1*Kzp*p`로 복원한다. 이 경우 정적 제거는 massless row의 -정확한 식이다. 축소 stiffness는 일반적으로 dense가 될 수 있다. - -**Inference, P01에 적용:** 먼저 원래 global homogeneous BC의 free injection C로 -`Kf=C^T K C`, `Mf=C^T M_L C`를 만들고, 그 공간에서 positive/null basis를 정의한다. -Director가 global axis와 기울어져 있으면 `UR3=drill`은 성립하지 않는다. 일부 global -회전을 고정한 node에서는 원래 drill 방향 전체가 free space에 들어가지 않을 수 있으므로 -실제 `Mf`가 full rank가 될 수 있다. 이때 물리 질량이 있는 자유도를 제거해서는 안 된다. - -P01의 공통 nodal director와 `Kphys=Tphys^T K20 Tphys`, -`Kdrill=Td^T kd I Td` 때문에 massless 방향의 decoupling을 algebraically 증명할 -가능성이 있다. 증명된 경우 node별 작은 basis로 projection하여 sparsity를 유지할 수 있다. -단순히 coupling을 작다고 버리는 것은 그 증명이 아니다. Partial global constraints로 -finite space에 남는 stabilization contribution도 보존한다. r2의 massless 처리는 -**개선된 constrained stabilized K와 선택된 lumped M의 finite spectrum**에 대한 동등성이다. -Unstabilized 다른 shell formulation이나 consistent spectrum과의 동등성이 아니다. - -**Candidate 검증:** 비축정렬 director, partially constrained rotation, constraint-free -shell의 6 physical rigid motions, `Kpz!=0`인 작은 manufactured pencil로 축소/복원과 -full free residual을 확인한다. Physical rigid rotation의 nodal UR은 기존 계약의 tangent -projection을 사용한다. Null block이 비가역인 경우 generic inverse/pseudoinverse로 -우회하지 않는다. 공통 K/M nullspace는 regular finite-spectrum 문제와 구분해 진단한다. -물리 rank 0, request>rank, nullspace가 없는 경우를 각각 정의한다. - -일반 dense basis/Schur를 채택하면 `O(n²)` storage와 factorization fill을 평가해야 한다. -Reference의 25×25 interior nodes는 flat full clamp에서 free DOF 3750, -massive physical dimension 3125로 예상되며, 3125² double 한 행렬만 약 78.1 MB다. -이는 topology에 따른 계산 추정이고 실제 rank/runtime 측정이 아니다. FEAST workspace와 -complex shifted factorization을 더해야 하므로 한 행렬 크기로 memory feasibility를 주장하지 않는다. - -## R04 — oneMKL FEAST API와 completeness 근거 - -**설치 관찰:** `mkl/2026.1/include/mkl_solvers_ee.h` lines 33,87에 `feastinit`, -`dfeast_scsrgv`가 있다. `mkl_version.h`는 major `2026`, minor `0`, update `1`, -build date `20260612`, `INTEL_MKL_VERSION=20260100`이다. Directory `2026.1`과 -header version 표기를 임의로 통일하지 않는다. 실제 linked runtime는 Implementation이 기록한다. -`mkl_types.h`의 `MKL_INT`는 LP64에서 `int`, `MKL_ILP64`에서 64-bit다. N, nnz+1, -row/column index와 N×m0 allocation을 checked conversion해야 하며 vendor type은 adapter 내부다. - -**Fact, S04/S05:** Real symmetric generalized `A*x=lambda*B*x`에서 B는 SPD여야 한다. -`dfeast_scsrgv`는 A/B 각각 values·row pointer·column index를 받으며 같은 storage family를 -사용한다. `uplo=U/L/F`, `n>0`, `0=interval multiplicity count`다. -`fpm`은 128개 `MKL_INT`; `e/res`는 m0, eigenvectors는 N×m0의 column storage로 -준비하고 첫 m columns만 소비한다. Documented CSR은 row pointer terminal `nnz+1`인 -1-based convention으로 대응한다. A/B sparsity pattern은 같을 필요가 없다. 내부 0-based -CSR을 인덱스 변환 없이 넘기지 않는다. `epsout`은 trace 변화량이고 개별 residual을 대신하지 않는다. - -**Fact, S06 — C index 표:** - -| Parameter | 문서 의미 / 연구 적용 | -| --- | --- | -| `feastinit(fpm)` | 호출 전 초기화; 다른 FEAST 배포판의 설정 배열을 복사하지 않음 | -| `fpm[1]` | contour points; 허용된 값만 사용 | -| `fpm[2]`, `[3]` | double precision stopping exponent, refinement loop bound; 값은 NR/계약에서 고정 | -| `fpm[4]` | 0=generated initial subspace, 1=user subspace; 재현성과 projection rank 검증 필요 | -| `fpm[5]` | 0=residual stopping, 1=trace stopping; zero mode는 독립 scale-aware residual 필수 | -| `fpm[13]` | 1은 한 contour의 subspace만 반환; 완료 eigenpairs로 소비하지 않음 | -| `fpm[26]`, `[27]` | CSR validity, B SPD check 옵션 | -| `fpm[49]` | CSR interval eigenvalue count를 m0에 반환하고 flag를 0으로 재설정; count와 solve는 구분 | -| `fpm[63]` 및 `[64..127]` | PARDISO user iparm 적용 여부 및 매핑; 후반부는 output도 되므로 call 간 변경 고려 | - -**Fact, S07:** `info=0` successful; `1` empty interval/검색 실패 가능, -`2` nonconvergence, `3` insufficient subspace, `4` subspace-only이다. -`-1/-2` allocation/inner solver, `-3/-4` reduced solver/B-not-SPD, -`-5` count failure(구간 끝이 eigenvalue 또는 근접할 수 있음), `200/201/202`는 -interval/subspace/N 오류다. `100+i`는 `fpm[i-1]` 오류다. -S05 본문은 `emin<=emax`로 쓰지만 명시적인 `200` 검증은 `emin>=emax`를 거부하므로 -실제 계약은 strict `emin0`, `Kpz=0`이므로 기존 analytic projection의 정확성 근거가 유지된다. -이는 [E3](formulation-eigen.md)의 적용 조건 재확인이지 새 수식/실제 조립의 검증 완료가 아니다. -Null이 없는 partial BC에는 개선 stabilization이 남으며 이를 삭제해서는 안 된다. -새 K와 옛 K 사이의 partial-BC spectrum 동일성은 요구하지 않는다. - -**Fact, S13:** 논문의 자체 shell 정식화는 director manifold에 맞는 potential의 일관 -선형화와 objective interpolation을 함께 다룬다. 이것은 FESA의 drilling potential를 -제공하지 않는다. April correction은 proofing 오류, November correction은 Eq.(5.26)의 -LaTeX rendering 오류를 알리며 현재 원문이 교정되었다고 명시한다. 그 식을 이 후보에 -복사하거나 FESA의 기존 운동학을 해당 논문의 보간으로 교체하지 않는다. - -**Derivation/조건, P03:** 기존 nonlinear `Pi_d=k_d*gamma^T gamma/2`에서 새 scale을 -초기 reference physical K로 계산한 뒤 모든 increment/iteration에서 불변으로 유지하면 -`Dk_d=D²k_d=0`이다. 따라서 기존 exact residual/Hessian은 동일한 `gamma`, `Dgamma`, -`D²gamma`에 새 scalar를 곱하는 구조를 유지한다. 기저 불변 reference scale과 objective -gamma를 함께 유지하면 같은 물리 상태의 좌표 변경에 따른 potential 불변성도 보존할 조건이 된다. -Trial tangent에서 scale을 다시 선정하면 추가 미분항과 min의 비매끄러움이 생길 수 있어 이 -initial-fixed 계약을 대체할 수 없다. Scale이 같다는 이유로 nonlinear의 corotation coupling을 -linear의 단순 director projection과 동일하게 만들지 않는다. - -**Limit:** 양의 `k_d`는 numerical potential의 비음성과 pure-drill 양의 작용을 뜻한다. -변형된 nonlinear Hessian에는 `sum gamma_i D²gamma_i`가 있어 모든 상태의 SPD를 뜻하지 -않는다. Linear E3 decoupling 증명을 nonlinear Hessian이나 prestressed eigenproblem에 -일괄 적용하지 않는다. 새 feature의 eigen 상태는 승인된 원형상·무응력 상태다. - -### Verification 연결과 남는 owner 작업 - -NR-MFE-001의 동일 물리 partial BC에서 새 scale과 complete K를 독립 재계산하고, -대응 eigen spectrum 및 정적 response의 좌표 검증을 수행해야 한다. 옛 계수를 외부에서 -고정한 tensor 변환만 비교하면 원래 결함을 검출하지 못한다. 동일 물리 BC/loads의 변환과 -허용된 입력 범위는 유지한다. 추가 새 reference 모델을 요구하지 않는다. - -기존 static 회귀의 원본 경로·quantity·identity·policy는 P03의 -[Requirement evidence portfolio](requirements-evidence.md#r2-승인-범위와-정적-재검증)에 -한 곳에서 유지한다. Linear `shell` 및 nonlinear `shellNL`/`shellNL-meshfine`와 linear-limit -case, 내부 tangent·선형극한·objectivity·평형·reaction·energy·rollback 검증을 새 scale로 -실행해야 한다. 기존 U blocking/UR warning-only와 nonlinear reaction review-only를 -eigen Value-only 요구로 삭제하지 않는다. 오래된 통과 보고서는 새 실행 evidence가 아니다. - -남는 작업은 Formulation의 단일 후보 채택·positivity/변환 증명·적용 경계, NR의 독립 -반례 해소·conditioning·metric·필수 case와 수치 기준, Implementation/Physics의 실제 -정적/eigen 재검증이다. R07에서 새 authoritative conflict나 사용자 재결정 필요는 발견하지 않았다. - -## 실행 evidence와 미실행 - -### r1 조사 이력 - -Read-only `Get-Content`, scoped `rg`, `Get-FileHash`로 필수 공통/Feature/기존 MITC4 -문서, 실제 kernel과 원본 두 reference 파일을 읽었다. 해당 읽기·hash 명령은 exit `0`이다. -아래는 핵심 재현 진입점이다. - -```powershell -Get-Content -Raw '.codex/skills/fem-research-evidence/SKILL.md' -Get-Content -Raw 'docs/mitc4-shell-feast-eigen/requirements.md' -rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness' 'src/fesa/elements/mitc4_shell.cpp' -Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 52 -Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' -Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' -``` - -SHA-256은 input `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`, -TXT `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`로 P02와 같다. -설치 include에서 `rg`로 위 R04의 declarations/version/type을 확인했다. 별도 -`rg -n 'MKL_INTERFACE|MKL_ILP64|lp64' cmake CMakeLists.txt`는 no-match exit `1`이며 -linked ABI를 판정한 것이 아니다. Numpy/pypdf/fitz 탐색은 exit `0`, 모두 미설치였고 -설치·수치 실험·외부 solver를 수행하지 않았다. - -Web `search_query/open/find`로 S01–S11을 조사했다. S03 PDF는 초기 검색·열기에서 -`STATIC CONDENSATION`과 Eqs.(9)–(13) 텍스트를 얻었으나 후속 부분 열기는 timeout이 -발생했다. S01의 수식은 보존된 원문 transcription과 현재 승인 계약도 대조했다. -S02 author HTML, S04–S07 Intel 본문, S08 author PDF, S09–S11 공식 문서는 접근했다. -NASA PDF/일부 publisher/feastinit 개별 URL 접근 실패를 필수 근거로 사용하지 않았다. -한 차례 tool orchestration의 quote syntax 오류는 도구 실행 전 실패했으며 수정 후 검색을 -수행했다. 이런 접근 실패를 구현 또는 reference comparison 성공으로 기록하지 않는다. - -Owned 두 문서의 metadata/상대 링크/requirement coverage를 read-only Python here-script -(`python -B -`, `pathlib`, `re`, `urllib.parse.unquote`)로 검사했다. Exit `0`, -documents `2`, local links `21`, requirement coverage `26`, issues `0`이다. -`git diff --check`는 exit `0`이며 다른 owner의 관리문서 LF/CRLF 경고가 출력되었다. -신규 untracked 연구 문서는 별도 Python 정적 검사로 trailing whitespace·final newline·상대 -링크를 확인했다. Exit `0`, files `2`, local links `21`, issues `0`이다. `git status --short`에서 -연구 두 파일과 Coordinator 관리문서 변경을 구분했으며 관련 없는 파일을 수정하거나 stage하지 않았다. -CMake/CTest, Harness, FEAST runtime와 numerical reference comparison은 이 -연구 단계의 범위가 아니므로 미실행이다. Source/tests/build/phase/upstream/tolerance/reference는 -편집하지 않았으며 다른 owner의 변경을 되돌리지 않았다. - -### r2 bounded 조사와 정적 확인 - -관리문서·requirements r2·기존 research 및 NR/Formulation/static 계약을 `Get-Content`와 -scoped `rg`로 읽었다. 정상 조회는 exit `0`이다. 초기 `rg`의 literal `research*.md` 경로는 -Windows 경로 오류였고 `rg ... docs/nonlinear-static-newton-raphson -g 'research*.md'`로 -수정하여 exit `0`으로 재조회했다. 최초 patch는 context 불일치로 적용되지 않았으며 실제 -문맥을 확인한 뒤 owned 두 파일에만 적용했다. Source·test·build·phase·Hook·reference와 -upstream 문서는 수정하지 않았고 Git mutation은 수행하지 않았다. - -Web `search_query/open/find`에서 S12 공식 source와 S13 교정된 원문 및 두 correction을 -열었다. 새로 인용한 primary 사실은 그 본문에서 확인했으며 검색 요약이나 타 solver의 -비공개 동작을 근거로 사용하지 않았다. S01–S11 전체를 재조사하지 않았다. - -Read-only `python -B -` here-script로 두 문서의 owner/Feature/r2 metadata, final newline, -trailing whitespace, 상대 링크 실재 및 requirements matrix ID와 coverage 표의 set equality를 -검사했다. Exit `0`, documents `2`, local links `32`, required/covered IDs `27`, issues `0`이다. -별도 `python -B -`에서 `subprocess.run(['git','show','HEAD:'+path],check=True)`로 기존 -연구 상세를 읽고 정규식으로 R01/R02/R04/R05 절 및 S01–S11 inventory 행을 비교했다. -Exit `0`, 모든 보존 구간이 동일했다. 이는 문서 보존 확인이며 수치 검증이 아니다. -`git diff --check`는 exit `0`; LF/CRLF 정보성 경고만 있었다. `git diff`/`git status --short`로 -owned 두 파일과 Coordinator의 coordination 변경을 구분했으며 타 owner 변경을 보존했다. - -r2에서 reference 파일·hash 재조사, NR 반례·mass oracle 재계산, CMake/CTest, Harness, -FEAST runtime 및 정적/eigen reference comparison은 수행하지 않았다. 원본/reference 및 -기존 보고서의 성공 기록을 r2의 실행 성공으로 재분류하지 않는다. 최종 파일 hash는 반환 -envelope에 제공하며 본 문서 안에 자기 hash를 기록하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/research.md b/docs/mitc4-shell-feast-eigen/research.md index 93bbb45..25312a2 100644 --- a/docs/mitc4-shell-feast-eigen/research.md +++ b/docs/mitc4-shell-feast-eigen/research.md @@ -1,20 +1,27 @@ -# MITC4 질량과 FEAST 고유치해석 연구 +# 이전 MFE 연구와 출처 + +현재 채택 여부는 [eigen2의 연구·정식화](../mitc4-shell-feast-eigen2/README.md)를 따른다. + + + + +## MITC4 질량과 FEAST 고유치해석 연구 - Feature ID: `mitc4-shell-feast-eigen` -- Owner: `research-agent` - Input contract revision: `r2` - 조사일 / web access date: `2026-09-06` - 요청 outcome: `pass`; 다음 owner: `formulation-agent`. 최종 gate와 전이는 Coordinator 소유이다. 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), -[requirements r2](requirements.md), [reference 관찰·승인 delta](requirements-evidence.md)이다. +[requirements r2](requirements.md#requirements), [reference 관찰·승인 delta](requirements.md#requirements-evidence)이다. [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용한다. Source inventory, locator, API evidence, 유도 후보와 검증 한계는 -[research-evidence.md](research-evidence.md)에 둔다. +[research-evidence.md](research.md#research-evidence)에 둔다. -## 핵심 결과 + +### 핵심 결과 1. 원 MITC4의 director 운동학에서 kinetic energy를 적분하면 병진 및 두 접평면 회전의 consistent mass를 구성할 수 있다. 원 논문은 consistent mass를 사용한 주파수 예제도 @@ -46,12 +53,13 @@ Source inventory, locator, API evidence, 유도 후보와 검증 한계는 초기 reference에서만 계수를 계산·고정하고 기존 drilling map/potential을 유지하면 nonlinear 미분 구조와 linear massless decoupling을 보존할 조건을 명시할 수 있다. 최종 계수식 채택과 반례 해소 판정은 후속 owner 소유다. 근거: `S12`, `S13`, `P03`, - [r2 delta와 후보](research-evidence.md#r07--r2-stabilization-근거와-영향). + [r2 delta와 후보](research.md#research-evidence--r07--r2-stabilization-근거와-영향). 사용자 후속 확정대로 요청 mode 개수의 authority는 `.inp`의 `*FREQUENCY` data다. 현재 값은 10이며 reference row 수나 FEAST 내부 count로 요청수를 추론하지 않는다. -## Requirement coverage + +### Requirement coverage ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 owner를 명시해 누락과 완료를 구분한다. 아래 표는 requirements matrix를 대체하지 않는다. @@ -70,7 +78,8 @@ ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 ow | `023`, `024`, `025` | `P01`~`P03`, `R07`: TDD·MSVC·기존 linear/nonlinear 정적 회귀·closure는 후속 실행 evidence | Planning, Implementation, Physics, Release | | `027` | `S12`, `S13`, `P03`, `R07`: basis-invariant scalar 후보, 초기 고정 scale·objective potential 및 positive/null 역할 보존 조건 | Formulation, NR | -## Handoff와 제한 + +### Handoff와 제한 `MFE-OQ-003`의 개선안 승인으로 기존 계약 충돌의 범위 선택은 해결되었다. 새 중요한 사용자 미결정은 발견하지 않았다. 승인된 @@ -92,3 +101,458 @@ ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 ow 새 primary 근거 두 그룹과 기존 static 계약 근거를 추가했다. 명령과 결과는 상세 문서 끝에 있다. C++ build/test, Harness, 외부 solver와 FESA reference 수치 비교는 stage 범위 밖이므로 미실행이며 통과로 보고하지 않는다. + + + + +## MITC4 질량·FEAST 근거와 downstream 검증 후보 + +- Feature ID: `mitc4-shell-feast-eigen` +- Input contract revision: `r2` +- 기본 보고서: [research.md](research.md#research) +- Web access date: `2026-09-06` + +`Fact`는 출처에서 확인한 내용, `Derivation/Inference`는 그 근거를 승인된 FESA에 적용한 +연구 판단, `Candidate`는 Formulation/NR가 확정할 항목이다. 이 문서는 최종 수식·API·schema· +tolerance나 benchmark acceptance를 승인하지 않는다. + + +### Source inventory + +모든 외부 source는 원 논문 또는 공식 문서다. `P`는 프로젝트 계약이며 독립 검증 근거가 아니다. +공식 Abaqus 자료는 공개 입력·출력 의미만 설명한다. + +| ID | Source identity / stable locator | 신뢰도·적용·한계 | +| --- | --- | --- | +| S01 | Dvorkin & Bathe, *A Continuum Mechanics Based Four-Node Shell Element for General Non-linear Analysis*, Engineering Computations 1 (1984), 77–88, DOI `10.1108/eb023562`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eq.(1),(2), Eq.(25) 직후 및 Fig.7/Tables 3–4; [local transcription](../reference-papers/MITC4/AContinuumMechanicsBasedFourNodeShell/AContinuumMechanicsBasedFourNodeShell_001.md) | 1차 운동학·5 DOF·consistent-mass vibration 예제. Local OCR의 도표값은 검증 없이 acceptance 값으로 채택하지 않음. 비선형·가변두께 범위를 새로 허용하지 않음 | +| S02 | Voet, Sande & Buffa, *A mathematical theory for mass lumping and its generalization with applications to isogeometric analysis*, CMAME 410 (2023), 116033, DOI `10.1016/j.cma.2023.116033`; [author preprint v2](https://arxiv.org/html/2212.03614v2), §1, Definition 3.7, Remark 3.8, Lemma 3.19, §3.3 | 원 연구의 row-sum·positivity·Loewner 근거. 일반 scalar algebra를 회전 tensor에 그대로 옮기는 것은 입증되지 않음 | +| S03 | Bathe & Wilson, *Solution methods for eigenvalue problems in structural mechanics*, IJNME 6 (1973), 213–226, DOI `10.1002/nme.1620060207`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13); [publisher record](https://onlinelibrary.wiley.com/doi/pdf/10.1002/nme.1620060207) | 원 연구의 massless elimination과 fill/storage 한계. 임의 massive DOF를 제거하는 근사 Guyan reduction의 정확성을 주장하지 않음 | +| S04 | Intel oneMKL C Developer Reference, 2026.0 URL edition, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), `generalized` 및 sparse interface 설명 | 공식 admissibility·PARDISO 사용. 설치 runtime와 같은 version string이라는 가정 없음 | +| S05 | 같은 edition, [?feast_scsrgv/?feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `Syntax`, `Input/Output Parameters`; [Matrix Storage](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/matrix-storage.html) | 공식 signature·storage·capacity·결과 의미. `emin≤emax` 본문은 S07의 strict validation과 함께 읽음 | +| S06 | 같은 edition, [Extended Eigensolver Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm` 표 | 공식 count/check/iteration 옵션. Standalone FEAST 다른 버전의 fpm 번호를 대입하지 않음 | +| S07 | 같은 edition, [Extended Eigensolver Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), return-code 표와 `info=1` 주의 | 공식 오류·구간 폭·endpoint 위험. Warning은 Feature 성공으로 자동 승격하지 않음 | +| S08 | E. Polizzi, *Density-Matrix-Based Algorithm for Solving Eigenvalue Problems*, Physical Review B 79 (2009), 115112, DOI `10.1103/PhysRevB.79.115112`; [author preprint](https://arxiv.org/pdf/0901.2665), §II.A Eqs.(6)–(9), §II.B | 원 FEAST의 contour/Rayleigh–Ritz와 B-orthonormality. MKL 옵션·상태 정의는 S05–S07 우선 | +| S09 | Abaqus 2025 [*FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), `Optional parameters`, Lanczos data line | 공식 count·bounds·SIM·normalization·acoustic semantics. FESA가 source Lanczos를 구현한다는 근거가 아님 | +| S10 | Abaqus 2025 [Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm), `Eigenvalue Extraction`, `Normalization`, `Initial Conditions`, `Output` | 공식 `omega²`·generalized mass·base state. Abaqus 내부 질량 정식화에 대한 추론 금지 | +| S11 | Abaqus 2025 [OdbFrame object](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKERRefMap/simaker-c-odbframepyc.htm), modal constructor와 members; [Mode Domain Output](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEOUTRefMap/simaout-c-dboutput-frequency.htm), `Controlling Output Frequency in a Mode Domain Analysis` | 공식 mode/frame 의미. TXT에 없는 step을 임의 생성하는 권한이 아님 | +| S12 | LAPACK 3.12.1, [DLAEV2 original source/documentation](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html), source lines 31–39 (`Purpose`), 102–113 (`Further Details`); authors Univ. Tennessee / UC Berkeley / Colorado Denver / NAG | 공식 2×2 대칭 eigendecomposition과 작은 고유값의 determinant cancellation 한계. FESA scale 선정 규칙이나 새 vendor 호출 의무를 제공하지 않음 | +| S13 | Müller & Bischoff, *A Consistent Finite Element Formulation of the Geometrically Non-linear Reissner-Mindlin Shell Model*, ACME 29 (2022), 3387–3434, [updated original article](https://link.springer.com/article/10.1007/s11831-021-09702-7), Abstract, §2, §§6.1–6.2; corrections [April 2022](https://link.springer.com/article/10.1007/s11831-022-09725-8), [November 2022](https://link.springer.com/article/10.1007/s11831-022-09832-6) | 자체 shell 정식화의 potential 선형화·objectivity 근거만 사용. Review로 분류된 논문의 자체 유도 부분이며 문헌 요약을 1차 근거로 대용하지 않음. FESA의 MITC4·drilling 수식과 동일하지 않음 | +| P01 | [기존 MITC4 formulation](../linear-static-mitc4-shell/formulation.md), §§5,8,9,12,17; [실제 kernel](../../src/fesa/elements/mitc4_shell.cpp), `PhysicalTransformation20`, `DrillingTransformation4`, `EvaluateStiffness`, `GeometryAt`; [ARCHITECTURE](../ARCHITECTURE.md) | 현재 FESA 기하·부호·소유권 계약; 옛 scale 공식은 r2 대체 대상. Legacy research의 오래된 tolerance/승인 절차는 이번 계약에 재사용하지 않음 | +| P02 | [requirements r2](requirements.md#requirements), [원본 reference evidence·승인 delta](requirements.md#requirements-evidence), [공통 TOLERANCE](../TOLERANCE.md), [ADR](ADR.md) | 승인된 사용자 흐름과 acceptance boundary. 수치 통과 자체의 evidence가 아님 | +| P03 | [기존 nonlinear formulation §§10.2–10.4](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [기존 linear requirements 034/056](../linear-static-mitc4-shell/requirements.md), [NR-MFE-001 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례), [r2 static 회귀 계약](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증) | 기존 initial-fixed scale·objective potential·미분 및 r2 대체/회귀 경계. NR 반례를 재실행한 evidence로 주장하지 않음 | + +Hinton–Rock–Zienkiewicz (1976), DOI `10.1002/eqe.4290040305`의 +[publisher abstract](https://onlinelibrary.wiley.com/doi/10.1002/eqe.4290040305)는 확인했으나 +본문을 확보하지 않아 HRZ의 shell-specific 수식을 근거로 채택하지 않았다. +NASA SP-160은 optional plate benchmark 탐색에서 발견했으나 이번 포트폴리오는 S01 및 +직접 검산 가능한 oracle로 충분하므로 필수 artifact나 새 acceptance 요구로 추가하지 않았다. +Configured FEM vault는 이번 요청의 지정 evidence source가 아니며, 기존 wiki/연구 요약은 +탐색에만 참고하고 핵심 주장을 위 1차 source에 연결했다. + + +### R01 — Consistent physical mass와 적분 + +**Fact, S01/P01:** 기존 보간은 `u = sum Ni(ui + z*(theta_i cross d_i))`, +`z=t*zeta/2`이며 director-parallel rotation은 입자 속도에 기여하지 않는다. +원 논문의 elastic example은 surface `2×2`, thickness 2-point Gauss 및 consistent-mass +주파수 분석을 사용한다. 이는 임의 geometry의 mass 적분이 정확하다는 증명은 아니다. + +**Derivation:** `T=1/2 integral rho*|u_dot|² dV`에서 `M_C=integral rho*H^T H dV`가 +따른다. Geometry는 기존 `X=sum Ni(Xi+z*di)`와 같은 `J=det(dX/dnatural)`를 사용한다. +양의 quadrature weight·density·유효 J에서는 대칭 PSD와 drilling null action이 직접 따른다. +MITC의 assumed shear는 strain 보간이므로 velocity 보간을 바꾸거나 shear factor `5/6`를 +물리 질량에 곱하는 이유가 되지 않는다. + +**평판 oracle:** 평행 director·centered flat section이면 병진 scalar block은 +`rho*t*integral Ni*Nj dA`, rotary block은 `rho*t³/12*integral Ni*Nj dA`와 tangent +변환의 곱이며 translation–rotation coupling은 0이다. 축정렬 직사각형 면적 A에서는 +scalar consistent block이 `rho*t*A/36`에 다음 행렬을 곱한 것과 같다. + +```text +4 2 1 2 +2 4 2 1 +1 2 4 2 +2 1 2 4 +``` + +Rotary oracle의 scalar 배율은 위 병진 배율의 `t²/12`다. 이는 bilinear 형상함수의 직접 +다항식 적분 결과이며 구현 함수를 다시 호출하는 테스트와 구분한다. + +**Candidate/한계:** 곡면에서는 J가 zeta에 의존하여 odd thickness moment와 +translation–rotation coupling이 남을 수 있다. Centered section만으로 이를 0으로 두지 않는다. +현재 trilinear geometry의 J 및 H 다항식 차수를 확인해 충분한 적분을 선택할 수 있다. +보수적인 tensor-product 3-point 후보는 각 좌표의 degree≤4 mass integrand를 적분하지만, +정확한 차수·기하 검증 위치·채택 quadrature는 Formulation/NR가 증명한다. 기존 stiffness +quadrature나 기존 geometry 허용 범위를 연구 단계에서 변경하지 않는다. + + +### R02 — Consistent에서 유도하는 좌표 일관적 lumping + +**Fact, S02:** Row-sum, nodal quadrature, diagonal scaling은 일반적으로 서로 다른 근사다. +Nonnegative partition of unity는 scalar row-sum의 positivity를 설명한다. 논문의 +absolute-row-sum operator는 일반 행렬의 positivity를 확보하지만 물리 total mass나 +회전 nullspace를 보존하는 shell-specific theorem은 아니다. + +**Derivation — 피해야 할 적용:** global rotary tensor는 `I-di*di^T`와 다른 director +사이의 cross block을 포함한다. Scalar `diag(M*ones)`는 좌표 회전과 commute하지 않는다. +예를 들어 단위 director `d=(1,1,1)/sqrt(3)`의 `P=I-dd^T`는 `P*ones=0`이지만 +rank는 2다. Row-sum은 두 물리 관성을 모두 없애며 absolute row-sum은 drilling에 +관성을 더한다. 혼합 translation/rotation 행의 무차별 합은 단위도 섞는다. + +**Candidate — scalar moment를 통한 node block:** Consistent의 구성 moment +`Ck_ij=integral rho*Ni*Nj*z^k dV`, `k=0,1,2`를 식별하고 해당 물리 scalar moment에서 +row-sum한 뒤 각 node의 director tangent tensor로 재구성하는 방법을 검토할 수 있다. +이는 consistent 결과와의 유도 관계를 증명해야 하며, 별도 unrelated diagonal을 생성하는 +우회 경로로 쓰지 않는다. Full consistent block에서 moment를 추출하거나 계산 중 동일 +moment를 보존하는 구체적 방식은 Formulation 소유다. + +`sum Nj=1` 때문에 이 후보는 node별 `integral rho*Ni*Gi(z)^T Gi(z) dV` 형태로 +설명된다. 여기서 `Gi(z)`는 그 node의 병진과 director 변화로 particle velocity를 만드는 +map이다. 따라서 양의 measure에서 physical block PSD, director nullspace, tensor +congruence와 총 병진 질량 보존을 독립적으로 검산할 수 있다. Flat case에서는 +`m_i=sum_j C0_ij`, 두 tangent inertia `m_i*t²/12`, drilling 0으로 단순화된다. + +**한계:** 곡면의 nodal rotational frames를 component별로 직접 더하지 않는다. +Node block은 global 좌표에서 diagonal일 필요가 없다. Translation–rotation moment를 +보존하면 6×6 block에 coupling이 있을 수 있다. 이 후보의 positivity와 각 inertia/centroid +보존 관계는 Formulation에서 완성하고 NR가 독립 검토해야 한다. Uniform translation +energy는 보존하지만 일반 회전의 orbital inertia 및 모든 속도장의 consistent energy는 +보존한다고 가정하지 않는다. 물리 node velocity의 convexity로 설명 가능한 에너지 차이와 +refinement 거동을 검증 후보로 삼을 수 있으며, Abaqus 내부 lumping 동일성을 주장하지 않는다. + + +### R03 — Massless 좌표, 제약과 유한 spectrum + +**Fact, S03:** Massless 좌표를 분리하여 mass가 `diag(Mp,0)`, `Mp` SPD이고 대응 +강성 `Kzz`가 가역이면 `Kr=Kpp-Kpz*Kzz^-1*Kzp`와 `Mp`의 문제로 축소하며, +massless 성분은 `z=-Kzz^-1*Kzp*p`로 복원한다. 이 경우 정적 제거는 massless row의 +정확한 식이다. 축소 stiffness는 일반적으로 dense가 될 수 있다. + +**Inference, P01에 적용:** 먼저 원래 global homogeneous BC의 free injection C로 +`Kf=C^T K C`, `Mf=C^T M_L C`를 만들고, 그 공간에서 positive/null basis를 정의한다. +Director가 global axis와 기울어져 있으면 `UR3=drill`은 성립하지 않는다. 일부 global +회전을 고정한 node에서는 원래 drill 방향 전체가 free space에 들어가지 않을 수 있으므로 +실제 `Mf`가 full rank가 될 수 있다. 이때 물리 질량이 있는 자유도를 제거해서는 안 된다. + +P01의 공통 nodal director와 `Kphys=Tphys^T K20 Tphys`, +`Kdrill=Td^T kd I Td` 때문에 massless 방향의 decoupling을 algebraically 증명할 +가능성이 있다. 증명된 경우 node별 작은 basis로 projection하여 sparsity를 유지할 수 있다. +단순히 coupling을 작다고 버리는 것은 그 증명이 아니다. Partial global constraints로 +finite space에 남는 stabilization contribution도 보존한다. r2의 massless 처리는 +**개선된 constrained stabilized K와 선택된 lumped M의 finite spectrum**에 대한 동등성이다. +Unstabilized 다른 shell formulation이나 consistent spectrum과의 동등성이 아니다. + +**Candidate 검증:** 비축정렬 director, partially constrained rotation, constraint-free +shell의 6 physical rigid motions, `Kpz!=0`인 작은 manufactured pencil로 축소/복원과 +full free residual을 확인한다. Physical rigid rotation의 nodal UR은 기존 계약의 tangent +projection을 사용한다. Null block이 비가역인 경우 generic inverse/pseudoinverse로 +우회하지 않는다. 공통 K/M nullspace는 regular finite-spectrum 문제와 구분해 진단한다. +물리 rank 0, request>rank, nullspace가 없는 경우를 각각 정의한다. + +일반 dense basis/Schur를 채택하면 `O(n²)` storage와 factorization fill을 평가해야 한다. +Reference의 25×25 interior nodes는 flat full clamp에서 free DOF 3750, +massive physical dimension 3125로 예상되며, 3125² double 한 행렬만 약 78.1 MB다. +이는 topology에 따른 계산 추정이고 실제 rank/runtime 측정이 아니다. FEAST workspace와 +complex shifted factorization을 더해야 하므로 한 행렬 크기로 memory feasibility를 주장하지 않는다. + + +### R04 — oneMKL FEAST API와 completeness 근거 + +**설치 관찰:** `mkl/2026.1/include/mkl_solvers_ee.h` lines 33,87에 `feastinit`, +`dfeast_scsrgv`가 있다. `mkl_version.h`는 major `2026`, minor `0`, update `1`, +build date `20260612`, `INTEL_MKL_VERSION=20260100`이다. Directory `2026.1`과 +header version 표기를 임의로 통일하지 않는다. 실제 linked runtime는 Implementation이 기록한다. +`mkl_types.h`의 `MKL_INT`는 LP64에서 `int`, `MKL_ILP64`에서 64-bit다. N, nnz+1, +row/column index와 N×m0 allocation을 checked conversion해야 하며 vendor type은 adapter 내부다. + +**Fact, S04/S05:** Real symmetric generalized `A*x=lambda*B*x`에서 B는 SPD여야 한다. +`dfeast_scsrgv`는 A/B 각각 values·row pointer·column index를 받으며 같은 storage family를 +사용한다. `uplo=U/L/F`, `n>0`, `0=interval multiplicity count`다. +`fpm`은 128개 `MKL_INT`; `e/res`는 m0, eigenvectors는 N×m0의 column storage로 +준비하고 첫 m columns만 소비한다. Documented CSR은 row pointer terminal `nnz+1`인 +1-based convention으로 대응한다. A/B sparsity pattern은 같을 필요가 없다. 내부 0-based +CSR을 인덱스 변환 없이 넘기지 않는다. `epsout`은 trace 변화량이고 개별 residual을 대신하지 않는다. + +**Fact, S06 — C index 표:** + +| Parameter | 문서 의미 / 연구 적용 | +| --- | --- | +| `feastinit(fpm)` | 호출 전 초기화; 다른 FEAST 배포판의 설정 배열을 복사하지 않음 | +| `fpm[1]` | contour points; 허용된 값만 사용 | +| `fpm[2]`, `[3]` | double precision stopping exponent, refinement loop bound; 값은 NR/계약에서 고정 | +| `fpm[4]` | 0=generated initial subspace, 1=user subspace; 재현성과 projection rank 검증 필요 | +| `fpm[5]` | 0=residual stopping, 1=trace stopping; zero mode는 독립 scale-aware residual 필수 | +| `fpm[13]` | 1은 한 contour의 subspace만 반환; 완료 eigenpairs로 소비하지 않음 | +| `fpm[26]`, `[27]` | CSR validity, B SPD check 옵션 | +| `fpm[49]` | CSR interval eigenvalue count를 m0에 반환하고 flag를 0으로 재설정; count와 solve는 구분 | +| `fpm[63]` 및 `[64..127]` | PARDISO user iparm 적용 여부 및 매핑; 후반부는 output도 되므로 call 간 변경 고려 | + +**Fact, S07:** `info=0` successful; `1` empty interval/검색 실패 가능, +`2` nonconvergence, `3` insufficient subspace, `4` subspace-only이다. +`-1/-2` allocation/inner solver, `-3/-4` reduced solver/B-not-SPD, +`-5` count failure(구간 끝이 eigenvalue 또는 근접할 수 있음), `200/201/202`는 +interval/subspace/N 오류다. `100+i`는 `fpm[i-1]` 오류다. +S05 본문은 `emin<=emax`로 쓰지만 명시적인 `200` 검증은 `emin>=emax`를 거부하므로 +실제 계약은 strict `emin +### R05 — Reference의 관찰 가능한 의미와 family + +**Fact, S09/S10:** `*FREQUENCY`의 첫 값은 requested count다. Lanczos data line의 +blank min/max는 별도 bound를 지정하지 않으며, 뒤 shift와 block controls의 공란을 0 입력으로 +오인하지 않는다. `SIM`은 source architecture 설정이고 `NORMALIZATION=MASS`는 +generalized mass 1이다. Acoustic coupling ON은 acoustic/structural coupled model에 +작용한다. 적용 대상 acoustic 요소·ASI·coupling이 없는 현재 input의 옵션은 무해하게 +mapping할 근거가 있으며, 실제 acoustic 모델은 승인 subset 밖이다. + +**Inference/P02:** 알고리즘 지정의 FESA 해석은 source Lanczos 보존 + actual backend +FEAST이다. SIM을 FESA backend 기능으로 주장하지 않고 명시된 무해한 조합만 I/O가 +진단 정책으로 고정한다. 원본의 output/restart 요청을 읽을 때에도 새 modal stress/reaction +지원으로 확대하지 않는다. 실제 prior step, preload, damping, nonzero prescribed state를 +삭제하여 현재 subset처럼 실행하는 근거는 없다. + +**Fact/관찰:** S10은 `lambda=omega²`와 cycles/time frequency를 구분한다. S11은 +modal frame의 mode member와 mode-domain output을 정의한다. 원본 TXT는 `Frame: Mode` +1~10과 Value를 포함하고 input에는 단일 `Step-2`만 있다. 따라서 unique step + source +mode mapping이 가능하며 Freq 반올림으로 Value를 다시 계산하지 않는다. + +**NR handoff:** 공통 TOLERANCE는 같은 step/frame만 family로 묶는다. 원본에 각각의 modal +frame이 있는 점을 유지하여 mode별 scalar family를 정의하는 방향을 검토한다. 단일 HDF5 +table에 저장했다는 이유로 다른 source mode/frame을 하나의 family로 모으지 않는다. +Singleton family에서는 공통 RMS 규칙도 그대로 적용하며 scalar라는 이유로 생략하지 않는다. +최종 family 이름·identity·blocking 및 exact mapping은 NR/I/O가 고정한다. +Repeated Value는 서로 다른 mode identity로 보존하며 source missing/extra/duplicate/nonfinite +검사 후 공통 정책을 적용한다. Displayed repeated 값으로 실제 exact degeneracy를 단정하거나 +mode shape matching으로 외부 acceptance를 넓히지 않는다. + + +### R06 — 독립 verification portfolio 후보 + +각 case의 구체적 구성·수치 기준은 NR가 정한다. 새 eigen external reference는 지정 Value +10개뿐이며, r2에 승인된 기존 static 회귀는 R07과 Requirement 024의 기존 계약을 따른다. + +| Candidate | 잡아내는 오류 / 독립 기대값 | 한계 | +| --- | --- | --- | +| 직사각형 single-element mass | R01 polynomial oracle, 3 translations total `rho*A*t`, 2 rotary inertia, null drilling | 곡면 적분·semantic 연결은 검증하지 않음 | +| 곡면/왜곡 요소의 independent velocity integration | 직접 particle kinetic energy와 consistent quadratic form, R02 derived relation/양의 node block | 동일 production H/J 코드를 재호출하는 oracle는 독립성이 부족 | +| Rigid/coordinate tests | 기존 tangent rigid motion의 zero stiffness; geometry/director와 개선 scale을 독립 재계산한 complete K·두 질량의 congruence 및 eigenvalue invariant | NR-MFE-001의 같은 물리 partial BC 필수; old kd를 고정한 단순 tensor 변환이나 full-free/full-clamp만으로 대체하지 않음. 일반 MPC는 추가하지 않음 | +| Density scaling | 두 mass가 density 배율 c에 비례, 선택된 eigenvalues가 1/c, mass-normalized vector magnitude가 1/sqrt(c) | 다른 density field의 material mapping은 별도 양성/음성 test | +| 작은 manufactured singular pencil | R03 식을 손으로 계산하여 exact finite eigenvalues·복원 residual, partial global constraint와 rank case | Element/mass 조립 correctness는 별도 검증 | +| 작은 diagonal/rotated SPD pencil | FEAST N=1/2, repeated/clustered/zero/negative case, request=rank, count/m0/interval edge 및 실패 진단 | 직접 hand matrix는 전체 procedure/reference를 대신하지 않음 | +| Modal residual / Gram / energy | Free-space `Kphi-lambda*M_L*phi`, `Phi^T*M_L*Phi=I`, `phi^T*K*phi=lambda`와 constraint 복원 | 작은 residual만으로 최저 모드 completeness를 보장하지 못함 | +| Simply-supported plate analytical limit | S01 Fig.7/Table4의 plate frequency 사례 또는 `lambda=(D/(rho*t))*((m*pi/a)^2+(n*pi/b)^2)^2`의 thin-plate Navier limit | 마지막 식은 직접 thin-plate PDE로 유도·검산할 후보; rotary/shear를 포함한 유한 두께 shell의 exact oracle로 쓰지 않음 | +| 지정 clamped plate reference | 원본 `.inp`와 TXT Value의 순서·multiplicity·family 비교; square-symmetry cluster 진단 | 비교만으로 mass·mode shape·drilling·내부 알고리즘의 correctness를 주장하지 못함 | + +Modal physics는 무하중 정적 `Kphi=0`나 정적 reaction balance를 모든 eigenvector에 +요구하지 않는다. Inertia와 elastic restoring force의 균형인 free residual을 검사한다. +Dimensional translation/rotation 차이는 Formulation의 congruent scaling으로 처리하고 +zero mode의 residual denominator와 rank threshold는 NR가 정한다. 두께 변경에서는 +membrane, bending, shear, rotary inertia가 서로 다르게 변하므로 density처럼 모든 mode에 +단일 thickness power law를 강제하지 않는다. + + +### R07 — r2 stabilization 근거와 영향 + + +#### 입력 delta와 보존 근거 + +`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및 +[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)을 적용한다. +기존 `min(R+)`의 기저 의존성은 P03의 NR 반례로 확인되었다. 그 반례와 r1의 mass oracle를 +재계산하지 않는다. 사용자 승인은 개선 범위를 확정하며 특정 새 수식이나 NR 통과를 뜻하지 않는다. + +| 기존 근거 | r2 영향 판단 | +| --- | --- | +| S01/S02, R01/R02 mass·moment·quadrature | Numerical K scale과 독립이다. 기존 primary 근거·한계 및 [mass 계약](formulation.md#formulation-mass)을 보존한다 | +| S03, R03 및 [eigen E2–E4](formulation.md#formulation-eigen) | Schur 원리는 그대로다. Decoupling의 적용 대상은 개선된 K이며 아래 positive/director 구조를 Formulation이 재확인해야 한다 | +| S04–S08, R04 FEAST/정수/count | Backend·lumped M·입력 N 요구가 바뀌지 않아 근거를 보존한다. 설치/runtime를 새로 검증한 것은 아니다 | +| S09–S11, R05 reference 의미 | 새 eigen Value-only·원본 identity·공통 tolerance가 불변이다. 기존 artifact/hash는 r1 관찰 이력으로 보존한다 | +| R06 및 [기존 V5](formulation.md#formulation-verification) | Complete K 재계산과 지원 partial BC 반례 통과가 필수다. r1의 제한된 eigen 좌표 검증 설명을 r2 acceptance로 사용하지 않는다 | +| P01/P03 static | 옛 scale 선정식만 대체하며 initial-fixed lifecycle·objective potential·physical recovery 제외와 기존 회귀 계약은 유지한다 | + + +#### 공변적인 secondary scale 후보 + +**Fact, S12:** 대칭 2×2 행렬은 직교 회전으로 대각화할 수 있다. LAPACK 원 source는 +그 변환과 반환 고유값을 명시하고, 작은 고유값 계산에서 determinant 상쇄로 상대 정확도를 +잃을 수 있음을 경고한다. 이를 새 shell scale의 최종 선정 근거와 혼동하지 않는다. + +**Derivation — 기저 변화:** 초기 physical `K20^0`에서 node i의 두 회전 성분에 해당하는 +2×2 principal block을 `R_i`, 해당 성분을 global tangent rotation으로 보내는 orthonormal +map을 `U_i`라 하자. 전역 rigid coordinate rotation `G`와 접평면 기저 변경 `O_i`에서 +`U_i'=G U_i O_i`, `R_i'=O_i^T R_i O_i`이면 +`U_i' R_i' U_i'^T=G(U_i R_i U_i^T)G^T`다. +따라서 `tr(R_i')=tr(R_i)`와 `det(R_i'-lambda I)=det(R_i-lambda I)`가 직접 따른다. +개별 대각값은 이 항등식의 scalar invariant가 아니다. 서로 다른 node의 기저 변경도 +block별로 독립 허용된다. 실제 physical kernel이 이 변환 법칙을 만족하는지는 후속 검증 대상이다. + +**Candidate — trace 기반, 우선 검토 권고:** `tau_i=tr(R_i)/2`에서 하나의 positive element +scale을 만들 수 있다. `mean_i(tau_i)=sum_i tr(R_i)/8`은 기존 여덟 physical rotation +성분의 평균이며, physical K가 PSD이고 회전 강성이 적어도 하나 존재하면 양수다. +또 다른 후보는 positive nodal `tau_i`의 최솟값으로 기존 최소값 집계를 유지하는 것이다. +두 후보 모두 좌표/기저 불변이며 force·length 차원을 갖는다. 초기 K의 물리적인 PSD 및 +zero/nonfinite inventory 처리는 명시적으로 확인해야 하며 양의 trace만으로 PSD를 판정하지 않는다. +최솟값 후보의 zero-block 처리 또는 전 node positivity가 필요하면 기존 유효 geometry와의 +관계를 증명해야 한다. 암묵적인 새 geometry 제외·epsilon floor로 보완하지 않는다. + +**Candidate — 최소 spectral 값:** `lambda_min(R_i)`도 기저 불변이고 작은 회전 강성 방향을 +반영한다. 그러나 positive 여부·zero block 처리와 작은 eigenvalue의 상쇄/conditioning +문제가 추가된다. 단순 `(trace-sqrt(discriminant))/2` 구현의 안정성을 가정하지 않는다. +Trace 후보에는 이 spectral subtraction이 없으므로 bounded scale 개선의 첫 검토 방향으로 +권고한다. 이 비교는 runtime 성능 측정 또는 수식 채택 판정이 아니다. + +어느 후보든 기존 차원 없는 `10^-3` 계수와 `K_d=k_d I4`의 numerical 역할을 유지하는 +최소 변경을 검토할 수 있다. Reference 오차를 보고 scale/계수를 조정하거나 coefficient sweep, +물리 drilling 관성·strain·새 입력 설정을 추가할 근거는 없다. 정확한 aggregation, finite/positive +검사 및 scale 공식 채택은 Formulation 소유이고 numerical 기준은 NR 소유다. + + +#### Linear null과 nonlinear lifecycle의 다른 적용 조건 + +**Derivation/조건, P01/P03와 S03:** Linear/eigen에서는 기존 `T_p`, `T_d`와 +`K_drill=T_d^T k_d I4 T_d`를 그대로 두고, 모든 element의 새 `k_d`가 finite positive이면 +실제로 free space에 남는 director null `Z`에 대해 +`K_f Z=Z diag(sum_{e incident i} k_d,e)` 구조를 유지할 수 있다. +Physical K가 director 방향을 소거하고 공통 nodal director를 사용한다는 전제가 필요하다. +이 조건에서 `Kzz>0`, `Kpz=0`이므로 기존 analytic projection의 정확성 근거가 유지된다. +이는 [E3](formulation.md#formulation-eigen)의 적용 조건 재확인이지 새 수식/실제 조립의 검증 완료가 아니다. +Null이 없는 partial BC에는 개선 stabilization이 남으며 이를 삭제해서는 안 된다. +새 K와 옛 K 사이의 partial-BC spectrum 동일성은 요구하지 않는다. + +**Fact, S13:** 논문의 자체 shell 정식화는 director manifold에 맞는 potential의 일관 +선형화와 objective interpolation을 함께 다룬다. 이것은 FESA의 drilling potential를 +제공하지 않는다. April correction은 proofing 오류, November correction은 Eq.(5.26)의 +LaTeX rendering 오류를 알리며 현재 원문이 교정되었다고 명시한다. 그 식을 이 후보에 +복사하거나 FESA의 기존 운동학을 해당 논문의 보간으로 교체하지 않는다. + +**Derivation/조건, P03:** 기존 nonlinear `Pi_d=k_d*gamma^T gamma/2`에서 새 scale을 +초기 reference physical K로 계산한 뒤 모든 increment/iteration에서 불변으로 유지하면 +`Dk_d=D²k_d=0`이다. 따라서 기존 exact residual/Hessian은 동일한 `gamma`, `Dgamma`, +`D²gamma`에 새 scalar를 곱하는 구조를 유지한다. 기저 불변 reference scale과 objective +gamma를 함께 유지하면 같은 물리 상태의 좌표 변경에 따른 potential 불변성도 보존할 조건이 된다. +Trial tangent에서 scale을 다시 선정하면 추가 미분항과 min의 비매끄러움이 생길 수 있어 이 +initial-fixed 계약을 대체할 수 없다. Scale이 같다는 이유로 nonlinear의 corotation coupling을 +linear의 단순 director projection과 동일하게 만들지 않는다. + +**Limit:** 양의 `k_d`는 numerical potential의 비음성과 pure-drill 양의 작용을 뜻한다. +변형된 nonlinear Hessian에는 `sum gamma_i D²gamma_i`가 있어 모든 상태의 SPD를 뜻하지 +않는다. Linear E3 decoupling 증명을 nonlinear Hessian이나 prestressed eigenproblem에 +일괄 적용하지 않는다. 새 feature의 eigen 상태는 승인된 원형상·무응력 상태다. + + +#### Verification 연결과 남는 owner 작업 + +NR-MFE-001의 동일 물리 partial BC에서 새 scale과 complete K를 독립 재계산하고, +대응 eigen spectrum 및 정적 response의 좌표 검증을 수행해야 한다. 옛 계수를 외부에서 +고정한 tensor 변환만 비교하면 원래 결함을 검출하지 못한다. 동일 물리 BC/loads의 변환과 +허용된 입력 범위는 유지한다. 추가 새 reference 모델을 요구하지 않는다. + +기존 static 회귀의 원본 경로·quantity·identity·policy는 P03의 +[Requirement evidence portfolio](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)에 +한 곳에서 유지한다. Linear `shell` 및 nonlinear `shellNL`/`shellNL-meshfine`와 linear-limit +case, 내부 tangent·선형극한·objectivity·평형·reaction·energy·rollback 검증을 새 scale로 +실행해야 한다. 기존 U blocking/UR warning-only와 nonlinear reaction review-only를 +eigen Value-only 요구로 삭제하지 않는다. 오래된 통과 보고서는 새 실행 evidence가 아니다. + +남는 작업은 Formulation의 단일 후보 채택·positivity/변환 증명·적용 경계, NR의 독립 +반례 해소·conditioning·metric·필수 case와 수치 기준, Implementation/Physics의 실제 +정적/eigen 재검증이다. R07에서 새 authoritative conflict나 사용자 재결정 필요는 발견하지 않았다. + + +### 실행 evidence와 미실행 + + +#### r1 조사 이력 + +Read-only `Get-Content`, scoped `rg`, `Get-FileHash`로 필수 공통/Feature/기존 MITC4 +문서, 실제 kernel과 원본 두 reference 파일을 읽었다. 해당 읽기·hash 명령은 exit `0`이다. +아래는 핵심 재현 진입점이다. + +```powershell +Get-Content -Raw '.codex/skills/fem-research-evidence/SKILL.md' +Get-Content -Raw 'docs/mitc4-shell-feast-eigen/requirements.md' +rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness' 'src/fesa/elements/mitc4_shell.cpp' +Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 52 +Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' +Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt' +``` + +SHA-256은 input `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`, +TXT `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`로 P02와 같다. +설치 include에서 `rg`로 위 R04의 declarations/version/type을 확인했다. 별도 +`rg -n 'MKL_INTERFACE|MKL_ILP64|lp64' cmake CMakeLists.txt`는 no-match exit `1`이며 +linked ABI를 판정한 것이 아니다. Numpy/pypdf/fitz 탐색은 exit `0`, 모두 미설치였고 +설치·수치 실험·외부 solver를 수행하지 않았다. + +Web `search_query/open/find`로 S01–S11을 조사했다. S03 PDF는 초기 검색·열기에서 +`STATIC CONDENSATION`과 Eqs.(9)–(13) 텍스트를 얻었으나 후속 부분 열기는 timeout이 +발생했다. S01의 수식은 보존된 원문 transcription과 현재 승인 계약도 대조했다. +S02 author HTML, S04–S07 Intel 본문, S08 author PDF, S09–S11 공식 문서는 접근했다. +NASA PDF/일부 publisher/feastinit 개별 URL 접근 실패를 필수 근거로 사용하지 않았다. +한 차례 tool orchestration의 quote syntax 오류는 도구 실행 전 실패했으며 수정 후 검색을 +수행했다. 이런 접근 실패를 구현 또는 reference comparison 성공으로 기록하지 않는다. + +Owned 두 문서의 metadata/상대 링크/requirement coverage를 read-only Python here-script +(`python -B -`, `pathlib`, `re`, `urllib.parse.unquote`)로 검사했다. Exit `0`, +documents `2`, local links `21`, requirement coverage `26`, issues `0`이다. +`git diff --check`는 exit `0`이며 다른 owner의 관리문서 LF/CRLF 경고가 출력되었다. +신규 untracked 연구 문서는 별도 Python 정적 검사로 trailing whitespace·final newline·상대 +링크를 확인했다. Exit `0`, files `2`, local links `21`, issues `0`이다. `git status --short`에서 +연구 두 파일과 Coordinator 관리문서 변경을 구분했으며 관련 없는 파일을 수정하거나 stage하지 않았다. +CMake/CTest, Harness, FEAST runtime와 numerical reference comparison은 이 +연구 단계의 범위가 아니므로 미실행이다. Source/tests/build/phase/upstream/tolerance/reference는 +편집하지 않았으며 다른 owner의 변경을 되돌리지 않았다. + + +#### r2 bounded 조사와 정적 확인 + +관리문서·requirements r2·기존 research 및 NR/Formulation/static 계약을 `Get-Content`와 +scoped `rg`로 읽었다. 정상 조회는 exit `0`이다. 초기 `rg`의 literal `research*.md` 경로는 +Windows 경로 오류였고 `rg ... docs/nonlinear-static-newton-raphson -g 'research*.md'`로 +수정하여 exit `0`으로 재조회했다. 최초 patch는 context 불일치로 적용되지 않았으며 실제 +문맥을 확인한 뒤 owned 두 파일에만 적용했다. Source·test·build·phase·Hook·reference와 +upstream 문서는 수정하지 않았고 Git mutation은 수행하지 않았다. + +Web `search_query/open/find`에서 S12 공식 source와 S13 교정된 원문 및 두 correction을 +열었다. 새로 인용한 primary 사실은 그 본문에서 확인했으며 검색 요약이나 타 solver의 +비공개 동작을 근거로 사용하지 않았다. S01–S11 전체를 재조사하지 않았다. + +Read-only `python -B -` here-script로 두 문서의 owner/Feature/r2 metadata, final newline, +trailing whitespace, 상대 링크 실재 및 requirements matrix ID와 coverage 표의 set equality를 +검사했다. Exit `0`, documents `2`, local links `32`, required/covered IDs `27`, issues `0`이다. +별도 `python -B -`에서 `subprocess.run(['git','show','HEAD:'+path],check=True)`로 기존 +연구 상세를 읽고 정규식으로 R01/R02/R04/R05 절 및 S01–S11 inventory 행을 비교했다. +Exit `0`, 모든 보존 구간이 동일했다. 이는 문서 보존 확인이며 수치 검증이 아니다. +`git diff --check`는 exit `0`; LF/CRLF 정보성 경고만 있었다. `git diff`/`git status --short`로 +owned 두 파일과 Coordinator의 coordination 변경을 구분했으며 타 owner 변경을 보존했다. + +r2에서 reference 파일·hash 재조사, NR 반례·mass oracle 재계산, CMake/CTest, Harness, +FEAST runtime 및 정적/eigen reference comparison은 수행하지 않았다. 원본/reference 및 +기존 보고서의 성공 기록을 r2의 실행 성공으로 재분류하지 않는다. 최종 파일 hash는 반환 +envelope에 제공하며 본 문서 안에 자기 hash를 기록하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/ADR.md b/docs/mitc4-shell-feast-eigen2/ADR.md index 0b5d770..a35a657 100644 --- a/docs/mitc4-shell-feast-eigen2/ADR.md +++ b/docs/mitc4-shell-feast-eigen2/ADR.md @@ -20,9 +20,9 @@ - 상태: 기존 명시 사용자 결정의 재시작 기준으로서 기록. 새로운 수학·schema 승인 아님. - 결정: consistent→lumped→FEAST, 입력의 mode count, 고유치 Value-only 외부 비교, 좌표 공변적 stabilization 개선 및 영향받는 static/eigen 재검증, reference/temp 제외의 의미를 새 요구사항에 반영한다. -- 근거: 기존 [ADR](../mitc4-shell-feast-eigen/ADR.md)의 MFE-ADR-001·002·004·005·007·013 및 [requirements](../mitc4-shell-feast-eigen/requirements.md) r3. 기존 ADR에는 질량 사용·개선 범위·제외에 관한 사용자 답변이 명시되어 있다. +- 근거: 기존 [ADR](../mitc4-shell-feast-eigen/ADR.md)의 MFE-ADR-001·002·004·005·007·013 및 [requirements](../mitc4-shell-feast-eigen/requirements.md#requirements) r3. 기존 ADR에는 질량 사용·개선 범위·제외에 관한 사용자 답변이 명시되어 있다. - 영향: 알려진 사용자 결정을 다시 양자택일 질문으로 만들지 않는다. 기존 formulation/NR/I/O의 상세 수식·control·영속 식별자를 자동 채택하거나 통과로 표시하지 않는다. -- 한계: 일부 기존 r3 문서는 현재 worktree의 미커밋 자료다. 필요한 요구의 실제 의미와 제외 목록은 새 requirements에 독립적으로 명시하고 이전 HEAD에 동일 내용이 있다고 주장하지 않는다. +- 한계: 이 결정 당시 일부 기존 r3 문서는 당시 worktree의 미커밋 자료였다. 필요한 요구의 실제 의미와 제외 목록은 새 requirements에 독립적으로 명시하고 이전 HEAD에 동일 내용이 있다고 주장하지 않는다. ## MFE2-ADR-003 — 참고 자료와 새 evidence의 경계 @@ -53,13 +53,13 @@ - 결정: [정식화](formulation.md)의 27점 consistent moments→nodal block lumping, 실제 BC 우선 analytic null 제거·nodal whitening 및 초기 physical rotary trace 평균 stabilization을 이번 수학 계약으로 선택한다. Nonlinear objective potential과 초기 scale 고정 lifecycle을 유지한다. - 이유: 질량 유도 관계·drilling null·부분 회전 제약을 보존하고 기존 최소 대각 scale의 기저 의존성을 해결한다. 기존 유도의 채택 범위를 새 문서에 명시하며 과거 pass를 승계하지 않는다. - FEAST: 독립 outer enclosure와 성공 total count를 기준으로 lower endpoint를 고정하고 upper-prefix 축소만 선택적으로 사용한다. 미확인 empty-count 성공에 의존하지 않으며 최적화 실패 시 마지막 확인된 구간을 사용한다. -- 근거·한계: [연구 G01/G02](research-evidence.md)에서 count-only 빈 구간 및 작은 workspace 보장이 확인되지 않았다. 보수적 workspace와 실제 runtime·memory 검증 의무를 남기며 backend 통과를 선언하지 않는다. +- 근거·한계: [연구 G01/G02](research.md#research-evidence)에서 count-only 빈 구간 및 작은 workspace 보장이 확인되지 않았다. 보수적 workspace와 실제 runtime·memory 검증 의무를 남기며 backend 통과를 선언하지 않는다. - 승인 경계: 기존 사용자 요구의 수학적 구체화이며 새로운 물리 범위·외부 tolerance·공개 호환성 변경은 없다. 수치 controls·검토는 NR, 영속 schema는 I/O가 소유한다. ## MFE2-ADR-007 — 독립 수치 검토와 comparison family - 상태: numerical-review-agent의 독립 `pass-for-io-definition`, 2026-09-08. Owner: numerical-review-agent; 기록: 메인 assistant. -- 근거: [검토](numerical-review.md), [새 계산](numerical-review-evidence.md). Geometry부터 complete K·질량·부분 제약 정적 응답을 재계산하여 `lambda=10369/450` 및 좌표 공변성을 확인했다. 별도 rational mass oracle도 새로 실행했다. +- 근거: [검토](numerical-review.md#numerical-review), [새 계산](numerical-review.md#numerical-review-evidence). Geometry부터 complete K·질량·부분 제약 정적 응답을 재계산하여 `lambda=10369/450` 및 좌표 공변성을 확인했다. 별도 rational mass oracle도 새로 실행했다. - 결정: [내부 controls](numerical-review-controls.md)와 [27개 사례](numerical-review-cases.md)를 적용한다. 초기 enclosing count 재시도는 최초 포함 3회, 이후 lower endpoint 고정·upper search·전체 count/solve 유한 한계를 명시했다. B=0의 시작 구간은 (-1,1)로 고정했다. - 외부 비교: 원본 TXT의 literal modal frame과 유일한 source Step-2를 [reference-model](reference-model.md)에 대응한다. 같은 frame 규칙에 따라 10개 singleton Value blocking family를 정의하고 공통 행 5%·RMS 1% 정책을 그대로 적용한다. 이번 양수 singleton의 실효 각 Value 한계는 RMS 1%다. - 영향·한계: 확인된 수학 차단 이슈 없이 I/O 정의를 진행할 수 있다. 이 판정은 구현·실제 FEAST·정적 회귀·외부 비교·Physics·release 통과가 아니다. Runtime count/cluster/ABI/workspace와 메모리 검증은 후속 필수 evidence다. @@ -67,7 +67,7 @@ ## MFE2-ADR-008 — Eigen I/O의 additive 계약과 이번 작업 종료 - 상태: 요청 범위의 I/O 정의 완료 및 메인 계약 대조 완료, 2026-09-08. Owner: io-definition-agent; 기록: 메인 assistant. -- 결정: [I/O](io.md)의 source density/Frequency/동차 BC·정확한 no-op allowlist를 사용한다. 기존 static schema0/1을 보존하고 eigen discriminator `(schema_version=0, feature_id=mitc4-shell-feast-eigen2, analysis_procedure=linear-frequency, eigen_schema_version=1)`를 추가한다. +- 결정: [I/O](io.md#io)의 source density/Frequency/동차 BC·정확한 no-op allowlist를 사용한다. 기존 static schema0/1을 보존하고 eigen discriminator `(schema_version=0, feature_id=mitc4-shell-feast-eigen2, analysis_procedure=linear-frequency, eigen_schema_version=1)`를 추가한다. - Identity: storage Step-1과 source Step-2를 구분한다. 공개 N개 scalar/global normalized vectors와 전체 c개 validation evidence를 분리한다. 원본 TXT Value만 source modal frame에 직접 대응하며 외부 mode-shape gate를 추가하지 않는다. - 이유: 실제 parser·model·writer의 현재 경계를 보존하면서 새 procedure의 input/result 의미를 명확히 하기 위함이다. Candidate self-check·final 교체와 별도 live log lifecycle을 유지한다. - 승인 경계: 이미 승인된 새 eigen procedure의 상세 schema 정의이며 기존 static 호환성·물리·외부 tolerance 변경은 없다. 일반 routine 정의에 반복 사용자 승인 gate를 추가하지 않는다. @@ -78,12 +78,12 @@ - 상태: 사용자 명시 요청, 2026-09-09 KST. Owner: 메인 assistant. - 근거: “implementation 단계를 진행해주세요”, “implementation 단계에서 30분 제한은 없습니다”. - 결정: 확정된 r1 계약을 구현하고 동작별 테스트·실제 FEAST·남는 필수 회귀/reference와 독립 검토를 진행한다. 30분 시간 제한을 적용하지 않는다. -- 영향: [구현 계획](implementation-plan.md)의 파일 소유권으로 병행 작업하고 메인이 CMake 등록·빌드·통합·커밋을 조정한다. 수치/공개 schema/지원 범위를 구현 결과에 맞춰 변경하지 않는다. 공통 문서·기존 사용자 변경·reference를 보존한다. +- 영향: [구현 계획](README.md#재사용-handoff)의 파일 소유권으로 병행 작업하고 메인이 CMake 등록·빌드·통합·커밋을 조정한다. 수치/공개 schema/지원 범위를 구현 결과에 맞춰 변경하지 않는다. 공통 문서·기존 사용자 변경·reference를 보존한다. ## MFE2-ADR-010 — 실제 실행에서 드러난 계약 충돌 - 상태: 문제 기록·후속 제안, **수치 계약 변경 미승인**. Owner: 메인 assistant. -- 근거: [실행 결과](implementation-verification.md), [독립 수치 검토](implementation-numerical-review.md), [S3 검토](implementation-numerical-review-s3-static.md). +- 근거: [실행 결과](implementation-verification.md), [독립 수치 검토](implementation-review.md#implementation-numerical-review), [S3 검토](implementation-review.md#implementation-numerical-review-s3-static). - 관찰: 원본 모델은 고정 FEAST trace stopping의 실제 반환값에서 전체 c residual 기준을 넘는다. S3 public static은 rotation-only drilling의 미평형 모멘트 때문에 실패한다. - 현재 처리: r1 controls·tolerance·물리 식을 유지하고 실패를 명시한다. 요청 N 밖의 모드를 버리거나 reaction에서 torque를 제거하지 않는다. 구현 진행분은 커밋하되 기능 완료로 표시하지 않는다. - 당시 후속 제안: residual stopping 후보의 FEAST 제어와 S3 정식화/회복/평형 계약을 사용자 결정 후 formulation·NR에서 재검토한다. 이 기록 시점에는 채택·승인된 변경이 없었다. 이후 FEAST 제어만 ADR-011로 변경한다. @@ -95,7 +95,7 @@ - 결정: C-index `fpm[5]`를 `1`에서 `0`으로 변경한다. `fpm[2]=12`, `fpm[3]=20`, count/solve 구간·capacity·seed·thread·실패 정책 및 전체 c개 독립 `1e-10` 검증은 유지한다. - 이유: trace 변화의 수렴만으로는 원본 모델 전체 고유쌍의 독립 잔차를 충족하지 못했다. 개별 잔차를 사용하는 backend 종료를 선택하되 backend 성공을 독립 검증으로 대체하지 않는다. - 영향: [정식화 E5](formulation-eigen.md), [수치 controls C5](numerical-review-controls.md), backend와 HDF5 writer의 control 검증을 함께 갱신한다. 기존 schema의 실제 `base_fpm[5]` 기록값이 바뀌며 field·shape·단위와 reference mapping은 유지한다. -- 검증: [실행 결과](implementation-verification.md) 및 [독립 수치 검토](implementation-feast-residual-review.md)에 새 실행을 기록한다. 기존 trace 실패 evidence는 당시 결과로 보존한다. +- 검증: [실행 결과](implementation-verification.md) 및 [독립 수치 검토](implementation-review.md#implementation-feast-residual-review)에 새 실행을 기록한다. 기존 trace 실패 evidence는 당시 결과로 보존한다. - 범위: S3 정식화·부분 회전 BC·reaction·평형 기준은 변경하지 않고 알려진 충돌을 후속 과제로 유지한다. S3를 해결하거나 unsupported로 재분류한 결정이 아니다. 외부 reference와 공통 tolerance도 유지한다. ## MFE2-ADR-012 — 첫 구현의 외부 고유치 5% 수용 @@ -105,5 +105,5 @@ - 결정: [공통 ADR-029](../ADR.md#adr-029)와 [TOLERANCE 예외](../TOLERANCE.md#승인된-mitc4-eigen-첫-구현-예외)의 `mitc4-eigen-first-implementation` 정책을 적용한다. Mode별 Value relative/RMS limit은 inclusive5%다. - 영향: Requirement022, reference model, I/O mapping과 comparator/report를 갱신한다. 같은 모드 identity·singleton family·원본 artifact와 내부 all-c1e-10 기준을 유지한다. 다른 기능의 공통 RMS1%는 변경하지 않는다. - 범위: 첫 구현의 외부 고유치 정확도 향상 및 ADR-011의 S3는 후속 과제로 유지한다. 나머지 필수 구현/실패 보존 검사는 실제 evidence로 마무리하며 미실행을 통과로 표시하지 않는다. -- 결과: [구현 결과](implementation-verification.md)와 [첫 구현 독립 검토](implementation-first-version-review.md)에 새 정책의 fresh 검증 및 제한을 기록한다. 과거1% 비교 실패는 당시 계약의 이력으로 보존한다. +- 결과: [구현 결과](implementation-verification.md)와 [첫 구현 독립 검토](implementation-review.md#implementation-first-version-review)에 새 정책의 fresh 검증 및 제한을 기록한다. 과거1% 비교 실패는 당시 계약의 이력으로 보존한다. - 통합 승인: 사용자는 구현·검증 완료 후 `dev` 병합과 push를 명시 요청했다. 메인은 통과한 변경을 커밋하고 `dev`에 반영하며 관련 없는 사용자 worktree 변경은 보존한다. 외부 release/tag 승인으로 확대하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md index de26d68..dfcf3d3 100644 --- a/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md @@ -1,46 +1,22 @@ -# MITC4 Shell Mass·FEAST Eigen 2 작업 지침 +# mitc4-shell-feast-eigen2 문서·작업 지침 - Feature ID: `mitc4-shell-feast-eigen2` -- Owner: 메인 assistant -- Requirement baseline revision: `r2` (외부 고유치5% 수용) -- 현재 상태: [ADR-011](ADR.md#mfe2-adr-011--feast-residual-stopping과-s3-후속-분리)의 residual stopping과 [ADR-012](ADR.md#mfe2-adr-012--첫-구현의-외부-고유치-5-수용)의 외부5% 기준으로 첫 구현 검증을 완료했다. 전체417개 검사와 독립 검토는 PASS다. C5 controls·I/O mapping은 r2이며 S3와 정확도 향상은 후속 과제로 유지한다. -- 목적: MITC4 질량행렬과 FEAST 고유진동 해석의 요구사항을 이론·수학·수치 검토·입출력 계약으로 구체화한다. -- 현재 checklist: [PRD](PRD.md#현재-checklist). +- 문서 진입점·목적·사용법·Handoff: [README](README.md). +- 현재 범위·checklist: [PRD](PRD.md); 결정·승인·대체 이력: [ADR](ADR.md). +- 적용 범위: 해당 기능의 문서. 자동 로드되는 코드 영역 `AGENTS.md`가 아니다. -기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), -[공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md), -[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [TOLERANCE](../TOLERANCE.md). +기준: [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md), +[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [공통 tolerance](../TOLERANCE.md). -## 지역 지침 +## 보존할 계약과 인계 -- 기존 `docs/mitc4-shell-feast-eigen/`의 현재 worktree 문서는 읽기 전용 참고 자료다. 일부 r3 기록은 미커밋 상태이므로 HEAD의 내용과 동일하다고 가정하지 않는다. -- 기존 명시 사용자 요구와 물리·검증 의도는 출처를 연결하여 정리한다. 과거 agent stage, phase 상태, 수치 검토 통과와 환경 복구 기록은 새 작업의 승인·실행 evidence가 아니다. -- 전문 보고서의 수행·미실행은 해당 작업 시점의 기록이다. 현재 완료 상태는 PRD checklist가 소유하며 requirement-only 시점의 미실행 기록을 이후 전문 검토의 부재로 해석하지 않는다. -- 새 요구사항은 `FEM-REQ-MITC4-EIGEN2-###` ID를 사용한다. 기존 ID는 추적용 대응 관계에만 남긴다. -- Requirement는 관찰 가능한 동작·범위·검증 의도를 소유한다. 특정 lumping/축소 수식, FEAST parameter, HDF5 layout, 수치 threshold는 새로 결정하지 않는다. -- `reference/temp` 예제는 원본·옛 경로·복사본·cache를 통해서도 검증에 사용하지 않는다. 제외 목록은 requirements의 원본 정의를 따른다. -- 구현 변경은 [implementation-plan](implementation-plan.md)의 할당 source·test·build 등록과 이 Feature 문서에 제한한다. 기존 Feature·phase의 사용자 변경과 reference는 보존한다. -- 문서·단일 kernel/backend의 완료를 solver 기능 완료로 보고하지 않는다. 필요한 실제 실행·독립 검토 evidence를 확인한다. -- 사용자는 implementation 단계의 30분 제한을 명시 해제했다. 이전 문서 단계의 시간 제한은 이력이다. +수식·I/O·수치 기준의 원본은 README에서 연결한 전문 문서를 따른다. 기능을 재개할 때 +관련 계약과 실제 실행 revision·미해결 항목을 함께 읽는다. 과거 stage pass나 현재 문서 +정리를 solver 검증 통과로 계산하지 않는다. 요구사항·ADR ID와 승인 이력을 유지한다. +메인은 PRD·ADR·진입점·문서 참조를 관리하고 전문 작업자는 할당한 본문과 관련 범위만 수정한다. +기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다. +문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다. -## 문서 목록과 소유권 - -| 문서 | Owner | 역할 | -| --- | --- | --- | -| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | 메인 assistant | Feature 지역 지침·문서 목록 | -| [PRD.md](PRD.md) | 메인 assistant | 사용자 요청·범위 요약·현재 checklist | -| [ADR.md](ADR.md) | 메인 assistant | 새 작업의 결정·기존 자료 적용 경계 | -| [requirements.md](requirements.md) | requirement-agent | 원자적 요구사항·acceptance intent·검증 matrix | -| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | 재사용 근거·기존 요구 대응·reference 정적 관찰·미해결 사항 | -| [research.md](research.md), [research-evidence.md](research-evidence.md) | research-agent | 일차 출처·적용 판단·검증 후보·미해결 근거 | -| [formulation.md](formulation.md), [질량·stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md) | formulation-agent | 구현 가능한 수학 계약·기존 유도 채택 경계 | -| [numerical-review.md](numerical-review.md), [evidence](numerical-review-evidence.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [reference-model](reference-model.md) | numerical-review-agent | 독립 수학 검토·실제 검산·수치 기준·검증 사례·외부 비교 의미 | -| [io.md](io.md), [input](io-input.md), [schema](io-schema.md), [mapping](io-mapping.md) | io-definition-agent | 입력·진단·내부 소유권·영속 결과·비교 projection 계약 | -| [implementation-plan.md](implementation-plan.md) | 메인 assistant | 구현 할당·검증 순서와 실행 경계 | -| [implementation-verification.md](implementation-verification.md) | 메인 assistant | 실제 구현·실행·실패·남은 evidence와 후속 결정 | -| [구현 수치 검토](implementation-numerical-review.md), [검토 이력](implementation-numerical-review-history.md), [S3 정적 검토](implementation-numerical-review-s3-static.md) | numerical-review-agent | 구현의 독립 수치 대조와 계약 충돌 | -| [구현 물리 검토](implementation-physics-review.md) | physics-evaluation-agent | 실제 retained 결과의 물리 evidence·범위와 기존 문제 | -| [FEAST 종료 제어 검토](implementation-feast-residual-review.md) | numerical-review-agent | 사용자 승인 residual stopping의 독립 검토와 새 실행 판정 | -| [첫 구현 검토](implementation-first-version-review.md) | numerical-review-agent | 승인된5% 범위·필수 coverage 보강·실행 및 제한의 독립 확인 | - -반환은 결과·변경 파일·정적 확인·미해결 항목으로 충분하다. Git 경로 선택·커밋과 최종 결과 확인은 메인이 수행한다. +현재 첫 구현은 FEAST residual stopping·모드별5% 정책의 승인 범위다. 다른 기능의 RMS1%를 +바꾸지 않는다. `reference/temp` 제외 portfolio를 cache·복사본으로 재사용하지 않는다. +S3 public static 충돌과 외부 정확도 개선은 보류이며, HHT consistent kinetic mass와 구분한다. diff --git a/docs/mitc4-shell-feast-eigen2/PRD.md b/docs/mitc4-shell-feast-eigen2/PRD.md index bb92be0..164a146 100644 --- a/docs/mitc4-shell-feast-eigen2/PRD.md +++ b/docs/mitc4-shell-feast-eigen2/PRD.md @@ -9,36 +9,13 @@ [공통 ADR](../ADR.md#adr-028). 지역 지침은 [FEATURED_AGENTS](FEATURED_AGENTS.md), 결정 근거는 [Feature ADR](ADR.md)을 따른다. -## 사용자 요청과 적용 범위 +## 사용자 결정과 현재 적용 범위 -2026-09-08 사용자는 기존 작업을 `mitc4-shell-feast-eigen2`라는 이름으로 requirement부터 -다시 시작하고, 기존 `docs/mitc4-shell-feast-eigen/`의 유용한 문서를 참고하며 작업 중 -변경사항을 Git에 커밋하도록 요청했다. 이어 **모든 단계를 진행하지 말고 requirement -단계만 진행**하도록 범위를 명시했다. - -이후 사용자가 **research부터 io-definition까지** 진행하도록 요청했다. 당시 범위는 research, -formulation, 독립 numerical review, I/O 계약 문서와 단계별 커밋이다. 구현 계획·코드, -solver build/test·reference 비교와 release 감사는 포함하지 않는다. -별도 coordinator나 phase 상태기계를 만들지 않는다. - -작업시간 제한은 30분이다. 시작은 2026-09-08 12:07:56 UTC이며 12:37:56 UTC에 도달하면 -진행 중인 작업을 중지하고 실제 완료·미완료 항목과 지연 이유를 보고한다. - -2026-09-09 KST 사용자는 **implementation 단계를 진행**하도록 요청하고 **implementation -단계의 30분 제한은 없다**고 명시했다. 현재 범위는 [구현 계획](implementation-plan.md)에 따른 -코드·테스트·실제 FEAST 및 필수 reference/회귀 검증과 작업별 커밋이다. 앞의 30분 제한은 -완료된 문서 작업의 이력이다. 원본 reference 생성·변경과 release는 포함하지 않는다. Push는 아래 후속 요청으로 승인되었다. - -2026-09-10 사용자는 FEAST 종료 조건을 trace에서 residual로 변경하고 S3는 추후 고려하도록 -명시했다. [ADR-011](ADR.md#mfe2-adr-011--feast-residual-stopping과-s3-후속-분리)에 따라 backend·저장 control 검증·관련 문서를 갱신하며, -기존 독립 잔차와 외부 tolerance, 질량·drilling 수식은 유지한다. - -이어 사용자는 “5% 이내면 첫 구현이므로 Abaqus와의 고유치 정확도 향상은 추후에 진행”하고 -구현을 마무리하도록 요청했다. [ADR-012](ADR.md#mfe2-adr-012--첫-구현의-외부-고유치-5-수용)의 -모드별 외부5% 정책을 적용하고 나머지 필수 검증을 보강한다. S3 보류는 유지한다. - -사용자는 구현과 검증 완료 후 `dev` 병합 및 push도 명시 승인했다. 관련 변경을 커밋하고 -검증한 tree를 `dev`에 병합한 뒤 원격 `dev`에 반영한다. 기존 사용자 변경과 reference 원본은 보존한다. +새 MFE2 baseline은 이전 유용한 수학 근거를 명시적으로 채택하되 실행·검증 결과는 승계하지 +않는다. 사용자 승인 첫 구현은 residual stopping과 모드별 외부5% 정책이다. +[ADR-011](ADR.md#mfe2-adr-011--feast-residual-stopping과-s3-후속-분리)· +[ADR-012](ADR.md#mfe2-adr-012--첫-구현의-외부-고유치-5-수용)에 채택 이유와 승인 이력을 남긴다. +옛30분 문서 작업 제한·당시 Git 운영 요청은 현재 기능 개발의 제약·권한이 아니다. ## 솔버 기능의 요구 범위 요약 @@ -53,7 +30,7 @@ solver build/test·reference 비교와 release 감사는 포함하지 않는다. 6. `reference/temp`로 제외된 예제는 검증에 사용하지 않는다. 남는 정적 회귀와 내부 물리 검증 의무를 명시한다. 지속할 상세 계약이 필요하므로 요구사항과 verification matrix 원본은 -[requirements.md](requirements.md)에 둔다. 이 PRD에는 수식·threshold·schema를 중복 정의하지 않는다. +[requirements.md](requirements.md#requirements)에 둔다. 이 PRD에는 수식·threshold·schema를 중복 정의하지 않는다. ## Acceptance 요약과 원본 @@ -61,64 +38,28 @@ solver build/test·reference 비교와 release 감사는 포함하지 않는다. | 영역 | Requirement IDs | 요구되는 결과와 검증 의도 | | --- | --- | --- | -| 입력·물리 범위 | [001~004, 015~016](requirements.md#requirement-verification-matrix) | 밀도·section·geometry·boundary·mode 요청의 의미를 보존하고 미지원 조합을 명확히 진단 | -| 질량·stabilization | [005~008, 014, 026~027](requirements.md#requirement-verification-matrix) | 두 질량의 유도 관계, 물리 관성·drilling null, 대칭성·에너지·좌표 공변성 검증 | -| FEAST·modal evidence | [009~013](requirements.md#requirement-verification-matrix) | 실제 backend, 낮은 N개·multiplicity, 동일 사용 질량의 residual·normalization·orthogonality 및 실패 보존 | -| 결과·reference | [017~022](requirements.md#requirement-verification-matrix) | HDF5 source/mode identity, Value-only 대응, completeness·finite 사전검사와 공통 tolerance | -| 회귀·완료 | [023~025](requirements.md#requirement-verification-matrix) | 제외 예제를 사용하지 않는 남은 static·내부 물리 검증, 필요한 실제 실행 evidence와 미실행의 구분 | +| 입력·물리 범위 | [001~004, 015~016](requirements.md#requirements--requirement-verification-matrix) | 밀도·section·geometry·boundary·mode 요청의 의미를 보존하고 미지원 조합을 명확히 진단 | +| 질량·stabilization | [005~008, 014, 026~027](requirements.md#requirements--requirement-verification-matrix) | 두 질량의 유도 관계, 물리 관성·drilling null, 대칭성·에너지·좌표 공변성 검증 | +| FEAST·modal evidence | [009~013](requirements.md#requirements--requirement-verification-matrix) | 실제 backend, 낮은 N개·multiplicity, 동일 사용 질량의 residual·normalization·orthogonality 및 실패 보존 | +| 결과·reference | [017~022](requirements.md#requirements--requirement-verification-matrix) | HDF5 source/mode identity, Value-only 대응, completeness·finite 사전검사와 공통 tolerance | +| 회귀·완료 | [023~025](requirements.md#requirements--requirement-verification-matrix) | 제외 예제를 사용하지 않는 남은 static·내부 물리 검증, 필요한 실제 실행 evidence와 미실행의 구분 | -각 영역의 원자적 ID·검증 방법·출처는 requirements 및 [근거 문서](requirements-evidence.md)를 따른다. +각 영역의 원자적 ID·검증 방법·출처는 requirements 및 [근거 문서](requirements.md#requirements-evidence)를 따른다. 과거 문서의 `pass`, 362/352 test count나 stage 완료를 이 baseline의 실행 결과로 사용하지 않는다. ## 현재 checklist -- [x] 새 Feature ID·작업 브랜치와 requirement-only 범위를 설정한다. -- [x] 기존 자료의 참고·승계·후속 재검토 경계를 정한다. -- [x] Requirement specialist가 새 요구사항·verification matrix와 근거를 작성한다. -- [x] 메인이 사용자 요구 coverage, 전문 owner 경계와 미해결 사항을 정적으로 확인한다. -- [x] 상대 링크·ID를 검사하고 커밋 대상이 새 Feature 문서 5개뿐인지 확인한다. +- [x] MFE2 요구사항·정식화·수치 기준·I/O·기존 MFE 대응과 독립 검산 확정. +- [x] Density/Frequency, mass·공변 stabilization, constraint-first modal reduction·실제 FEAST 구현. +- [x] State/procedure·HDF5 candidate 보존·Value 비교 및 failure/normalization·mass oracle 보강. +- [x] 2026-09-10 첫 구현 전체417/417 PASS·원본10개 Value 최대 상대차 약4.261331%·독립 수치/물리 검토 기록. +- [x] FEAST residual stopping으로 원본 전체 c의 독립 잔차 실패 해소·저장 controls 검증. +- [ ] Abaqus Value 정확도 개선. 이전 RMS1% 불일치는 이력으로 보존. +- [ ] S3 public static 평형 계약 충돌의 후속 검토. -- [x] Research: [연구](research.md)와 [근거](research-evidence.md)에 일차 출처·질량/축소/stabilization 후보 및 실제 runtime 확인이 필요한 FEAST 두 항목을 기록했다. -- [x] Formulation: [정식화](formulation.md)에 질량·공변 stabilization·constraint-first 축소·FEAST·복구 수학 계약을 작성했다. 독립 numerical review는 별도 항목이다. -- [x] Numerical review: [독립 검토](numerical-review.md)는 `pass-for-io-definition`이다. 새 수학 oracle 2개와 27개 verification cases, 내부 controls 및 Value-only reference family를 정의했다. 실제 solver 검증은 미실행이다. -- [x] I/O definition: [I/O 계약](io.md)에 입력·진단·additive eigen schema·source step/mode mapping·실패 보존과 검증 의무를 정의했다. -- [x] 신규 문서의 링크·계약 일관성, 27개 요구사항의 NR/I/O coverage와 변경 범위를 정적으로 확인하고 단계별 변경을 커밋한다. +## 실행과 미검증 범위 -이 checklist는 문서 작업 상태다. Solver 구현·실제 FEAST 실행·회귀 및 외부 reference 비교의 통과를 뜻하지 않는다. - -- [x] 질량·stabilization과 독립 analytical/invariant 테스트 구현·검증. S3 public static 충돌은 아래 후속 항목으로 분리한다. -- [x] 실제 FEAST backend·count/cluster/zero/실패 controls와 runtime 검증. 실행한 대표 실패 경로와 미주입 한계는 결과 보고서에 구분한다. -- [x] Density/Frequency semantic·source identity·진단 및 입력 테스트. 기존 정적 PREPRINT 회귀를 보존했다. -- [x] Constraint-first 축소·modal recovery·별도 eigen state/procedure 구현. -- [x] HDF5 additive schema·candidate 보존·Value comparator 및 통합 테스트. -- [x] 제외 예제 사용 없이 남는 static/내부 회귀·전체 build/test·필수 reference 실행: 417/417 PASS. -- [x] 관련 독립 numerical/physics 확인과 결과·한계 기록. 첫 구현 독립 판정은 승인된 범위에서 PASS다. - -- [x] 승인된 FEAST residual stopping과 HDF5 control 검증을 함께 적용하고 변경 전 실패·변경 후 검사를 확인한다. -- [x] 원본 eigen의 전체 c개 독립 잔차·복구·HDF5 생성을 확인하고 종료 제어의 독립 수치 검토를 받는다. -- [x] 원본 eigen 10개 Value가 사용자 승인 모드별5% 기준을 충족한다. 최대 상대오차는 약4.261331%다. - -후속 보류 항목: - -- [ ] Abaqus와의 외부 Value 정확도를 개선한다. 이전 RMS1% 기준의 Mode2–10 불일치는 이력으로 보존한다. -- [ ] S3 public static 정적 평형 계약 충돌은 사용자 요청에 따라 후속 검토한다. - -현재 구현·실행은 [implementation-verification](implementation-verification.md)에 기록했다. -실제 mass/reduction/FEAST/procedure/HDF5 경로와 전체 실행을 확인했고 원본 eigen의 전체 c -residual 실패는 residual stopping으로 해소했다. [첫 구현 독립 검토](implementation-first-version-review.md)는 -승인된5%·S3 보류 범위에서 PASS다. 실제512회 vendor 호출과 HDF5 close-error 주입은 수행하지 -않았으며 대표 실패 경로·정적 대조의 범위를 보고서에 기록했다. 기존 nonlinear recovery 문제와 -제외 pressure 예제의 coverage 부재를 해결한 것으로 해석하지 않는다. - -## 이전 문서 단계의 결과와 구현 입력 - -Research부터 I/O까지 요청한 문서 작업과 독립 수학 검산을 30분 제한 안에 완료했다. -19개 Feature 문서의 링크·UTF-8·diff와 27개 요구/검증 case identity·coverage를 확인했다. -기존 Feature/phase의 사용자 변경 16개는 보존했다. Source·test·config·reference는 변경하지 않았다. - -다음 작업의 입력은 [정식화](formulation.md), [독립 검토](numerical-review.md), -[controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [I/O](io.md)다. -문서 단계 종료 당시 Density/Frequency semantic·mass/FEAST·eigen state/writer 구현, 실제 -backend와 MSVC build/test·reference·물리 검증은 미실행이었다. 현재 사용자가 승인한 구현은 -[implementation-plan](implementation-plan.md)에 따라 이 후속 실행을 포함하며, 진행 상태는 -위 checklist를 따른다. Pressure 제외 예제의 fresh 외부 coverage 부재는 유지한다. +[실행 보고서](implementation-verification.md)와 [구현 독립 검토](implementation-review.md)는 +당시 명령·수치·수정 전 실패·실제 주입 범위를 기록한다. 실제512회 vendor 호출과 HDF5 +close-error 전체 주입은 하지 않았다. 이후 통합 회귀는 [전체 현황](../tracking/status.md)이 +연결하며 첫 구현 범위를 release 또는 임의 모델 정확도 보증으로 확대하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/README.md b/docs/mitc4-shell-feast-eigen2/README.md new file mode 100644 index 0000000..4608794 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/README.md @@ -0,0 +1,38 @@ +# MITC4 질량·FEAST 고유치해석 + +## 목적과 개발 결과 + +MITC4 consistent mass에서 유도한 nodal block lumping, 공변 drilling stabilization, +실제 경계조건을 먼저 적용하는 finite-space reduction과 실제 MKL FEAST를 구현했다. +사용자 승인 첫 구현 범위에서 2026-09-10 전체 417/417 PASS 기록이 있다. +현재 통합 회귀와 이 기능 당시의 검증은 [전체 현황](../tracking/status.md)에서 구분한다. + +## 계약과 사용법 + +- [PRD](PRD.md)·[ADR](ADR.md): 모드별 외부5% 수용, residual stopping, S3 후속 보류. +- [요구사항](requirements.md#requirements): MFE2 ID·verification matrix와 이전 MFE 대응. +- [정식화](formulation.md), [질량·stabilization](formulation-mass-stabilization.md), + [축소·FEAST](formulation-eigen.md): 물리 질량·drill null·constraint-first 축소. +- [I/O](io.md#io): Density/Frequency keyword·N·결과 source/mode identity·HDF5 controls. +- [Reference](reference-model.md): Value-only 대응과 승인 first-implementation policy. +- [내부 수치 기준](numerical-review-controls.md), [검증 사례](numerical-review-cases.md), + [독립 수학 검산](numerical-review.md#numerical-review), [연구](research.md#research). +- [실행 결과](implementation-verification.md), [구현 독립 검토·교훈](implementation-review.md). + +실행 환경·CLI는 [operations](../operations.md)를 따른다. Keyword/option 허용 범위와 +HDF5 control 값은 I/O 계약을 확인한다. 외부5% 정책을 다른 해석의 RMS1%에 확대하지 않는다. + +## 재사용 Handoff + +질량·축소·FEAST state는 frequency의 소유다. HHT의 consistent kinetic mass를 이 lumped +modal 질량으로 대체하지 않는다. Partial rotational BC를 full clamp로 바꾸거나 임의 +drilling inertia를 추가하지 않는다. 이전 MFE 유도의 채택 경계는 정식화 표를 따른다. +실제 public core·private backend 경계는 [ARCHITECTURE](../ARCHITECTURE.md)에 연결한다. + +## 실패와 남은 범위 + +Trace stopping은 전체 c개의 독립 residual을 만족하지 못했고 C-index `fpm[5]=0`의 +residual stopping으로 수정했다. 초기 외부 RMS1% 불일치는 사용자 승인 후 첫 구현 +policy로 판정했으며 과거 실패 기록을 바꾸지 않았다. 최대 외부 상대차는 약4.261331%다. +S3 public static 평형 충돌과 Abaqus Value 정확도 개선은 보류다. 실제512회 vendor 호출· +HDF5 close-error 전체 주입 및 모든 모델의 정확도를 검증했다고 주장하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/formulation-eigen.md b/docs/mitc4-shell-feast-eigen2/formulation-eigen.md index 39bf1a9..64748c1 100644 --- a/docs/mitc4-shell-feast-eigen2/formulation-eigen.md +++ b/docs/mitc4-shell-feast-eigen2/formulation-eigen.md @@ -2,7 +2,7 @@ Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)와 [질량·stabilization](formulation-mass-stabilization.md)의 기호를 사용한다. -Intel evidence는 [research R04/G01/G02](research-evidence.md)에 따른다. +Intel evidence는 [research R04/G01/G02](research.md#research-evidence)에 따른다. ## E1. 실제 BC를 먼저 적용한다 diff --git a/docs/mitc4-shell-feast-eigen2/formulation.md b/docs/mitc4-shell-feast-eigen2/formulation.md index 1139e41..8385945 100644 --- a/docs/mitc4-shell-feast-eigen2/formulation.md +++ b/docs/mitc4-shell-feast-eigen2/formulation.md @@ -1,7 +1,7 @@ # MITC4 질량·공변 stabilization·FEAST 정식화 - Feature: `mitc4-shell-feast-eigen2`; Owner: `formulation-agent`; 정식화 revision: `r1`. -- 입력: [requirements r1](requirements.md), [근거](requirements-evidence.md), [Feature ADR](ADR.md). +- 입력: [requirements r1](requirements.md#requirements), [근거](requirements.md#requirements-evidence), [Feature ADR](ADR.md). - 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR-028](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md). - 상태: 독립 numerical review에 인계하는 수학 계약. 구현·runtime·reference 통과 선언이 아니다. @@ -31,14 +31,14 @@ Numerical scale은 초기 physical rotary diagonal 8개 trace 평균의 `10^-3` | 이전 자료 | 이번 채택 | 이번에 채택하지 않는 부분 | | --- | --- | --- | -| [mass M1–M10](../mitc4-shell-feast-eigen/formulation-mass.md) | 동일 geometry·H 보간, moments, 27점 정확성, block lumping 및 Jensen identity; 새 상세에 재기재 | 이전 revision·readiness 진술 | -| [stabilization S1–S6](../mitc4-shell-feast-eigen/formulation-stabilization.md) | trace 평균 후보를 이번 식으로 선택; 공변성, frozen objective potential, 반례 exact target | S7의 옛 reference portfolio 및 과거 해소 판정 | -| [eigen E1–E5/E8](../mitc4-shell-feast-eigen/formulation-eigen.md) | constraint-first analytic split, nodal whitening, global recovery 원리 | E6/E7의 빈 count 성공 가정·기존 수치 controls 자동 승계 | -| [verification V1–V5](../mitc4-shell-feast-eigen/formulation-verification.md) | 같은 단위의 residual/Gram·energy·covariance·density 측정량 | 기존 tolerance 값·test 수·gate·실행 portfolio | +| [mass M1–M10](../mitc4-shell-feast-eigen/formulation.md#formulation-mass) | 동일 geometry·H 보간, moments, 27점 정확성, block lumping 및 Jensen identity; 새 상세에 재기재 | 이전 revision·readiness 진술 | +| [stabilization S1–S6](../mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) | trace 평균 후보를 이번 식으로 선택; 공변성, frozen objective potential, 반례 exact target | S7의 옛 reference portfolio 및 과거 해소 판정 | +| [eigen E1–E5/E8](../mitc4-shell-feast-eigen/formulation.md#formulation-eigen) | constraint-first analytic split, nodal whitening, global recovery 원리 | E6/E7의 빈 count 성공 가정·기존 수치 controls 자동 승계 | +| [verification V1–V5](../mitc4-shell-feast-eigen/formulation.md#formulation-verification) | 같은 단위의 residual/Gram·energy·covariance·density 측정량 | 기존 tolerance 값·test 수·gate·실행 portfolio | 질량 및 trace 평균은 FESA 운동학에서 유도한 선택이다. 외부 source가 이 lumping/scale을 -지정한다고 주장하지 않는다. 최신 API 근거와 검토 한계는 [research](research.md)와 -[research evidence](research-evidence.md)에 연결한다. FEAST count의 `fpm[49]=1`과 +지정한다고 주장하지 않는다. 최신 API 근거와 검토 한계는 [research](research.md#research)와 +[research evidence](research.md#research-evidence)에 연결한다. FEAST count의 `fpm[49]=1`과 residual stopping의 `fpm[5]=0`은 C-index다. 종료 제어는 [ADR-011](ADR.md#mfe2-adr-011--feast-residual-stopping과-s3-후속-분리)과 [controls C5](numerical-review-controls.md#c5-fixed-lower-enclosure와-bounded-upper-search)의 승인된 변경을 적용한다. 빈 count interval의 `info=0,m0=0`과 작은 @@ -53,16 +53,13 @@ scratch 허용은 보장된 vendor 계약으로 채택하지 않는다. 같은 물리 partial BC 및 admissible tangent moment를 사용하는 정적 대응도 검사한다. Nonlinear scale immutability·objective energy·일관 residual/Hessian·선형극한을 재검증한다. -외부 portfolio는 오직 새 [requirements의 지정 범위](requirements.md)를 따른다. +외부 portfolio는 오직 새 [requirements의 지정 범위](requirements.md#requirements)를 따른다. `shell`, `shellNL`, `shellNL-eigen-meshfine`의 retained 의무와 synthetic 내부 검사를 유지한다. 제외된 네 예제는 원본·복사본·cache·과거 결과로 재사용하지 않는다. Eigen 외부 비교는 원본 TXT의 `Value`이며 [공통 tolerance](../TOLERANCE.md)를 변경하지 않는다. -NR가 내부 수치 기준, FEAST control·endpoint separation·bounded call budget·seed를 -독립 검토하여 고정해야 한다. 실제 설치 runtime의 count/solve·zero/cluster/full-capacity -동작과 memory는 후속 실행 evidence다. Numerical review 전 수학적 correctness를 -스스로 승인하지 않는다. I/O owner는 입력 allowlist, result schema·identity 및 실패 진단을 -정의한다. 이 문서는 신규 physical scope 또는 영속 layout을 추가하지 않는다. - -문서 작업에는 build/test를 실행하지 않는다. 링크·식·소스 경계의 정적 대조를 수행하며 -실제 solver·reference 검증은 미실행으로 남긴다. +내부 수치 기준, FEAST control·endpoint separation·bounded call budget·seed의 독립 판정은 +[numerical review](numerical-review.md)와 [controls](numerical-review-controls.md)에 기록했다. +입력 allowlist, result schema·identity 및 실패 진단은 [I/O](io.md)를 따른다. +실제 설치 runtime·reference 결과와 미실행 한계는 [구현 검증](implementation-verification.md), +S3 후속 범위는 [현재 PRD](PRD.md)에 기록했다. 이 수학 계약 자체를 실행 통과로 해석하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-feast-residual-review.md b/docs/mitc4-shell-feast-eigen2/implementation-feast-residual-review.md deleted file mode 100644 index a118f3d..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-feast-residual-review.md +++ /dev/null @@ -1,71 +0,0 @@ -# FEAST residual stopping 독립 검토 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 2026-09-10. -- 범위: 사용자 승인 `fpm[5]:1→0`, `[2]=12`, `[3]=20` 유지. S3는 보류 상태를 유지한다. -- 판정: **`PASS` — 승인된 종료 제어 변경**, **`FAIL` — 원본 외부 Value acceptance**. - 전체 기능 완료 판정이 아니다. -- 기준: [PRD](PRD.md), [ADR](ADR.md), [E4–E7](formulation-eigen.md), - [C3/C5](numerical-review-controls.md), [I/O](io-schema.md), [TOLERANCE](../TOLERANCE.md). - -## 판단과 필요한 확인 - -| 항목 | 독립 판단 | -| --- | --- | -| 종료 기준 | [Intel C parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)는 `[5]=0` residual, `1` trace이며 double epsilon은 `10^-fpm[2]`임을 명시한다. `1e-12` vendor stopping과 독립 all-c `1e-10`은 서로 다른 metric이다 | -| 불변 수식 | `B=A/s`, `mu=lambda/s`는 무차원이고 `rho_B=norm2(Bx-mu x)/norm2(x)`도 무차원이다. 종료 시점만 바뀌며 K/M, 부호·단위·DOF 순서, 적분, whitening, raw sort, 복구·state commit 식은 그대로다 | -| 전체 c | 요청 N 밖을 포함한 c개 residual과 pairwise/Frobenius Gram 검증 후 첫 N개를 공개해야 한다. FEAST 성공이나 작은 epsout으로 생략할 수 없다 | -| Zero·반복군 | 정확한 zero의 backend residual이 비유한이면 기존 available=false 표현을 유지한다. 독립 zero identity와 nonzero vector·Gram은 검증한다. Residual stopping에서 zero/mixed-zero의 실제 성공 여부는 실행으로 확인해야 하며 trace fallback을 추가하지 않는다. 반복군은 multiplicity·공간·Gram으로 판단하고 개별 벡터 방향의 유일성을 요구하지 않는다 | -| 상태·metadata | `SetControls`를 count/solve마다 재초기화하며 count의 `[49]=1` reset을 다음 solve에 전파하지 않는다. `base_fpm[5]=0,[2]=12,[3]=20`은 실제 새 HDF5에서 확인한다. `epsout`은 기존 trace 변화 진단량이며 residual stopping 지표로 이름·의미를 바꾸지 않는다 | -| 실패·안정성 | Refinement 최대20, bounded interval/capacity retry와 독립 검증 실패 즉시 종료를 유지한다. 새 종료 조건에서도 모든 conditioning의 수렴을 보장하지 않는다. Source의 미수렴/status/budget/allocation 전체 실패 주입 coverage는 기존 미완료 위험으로 남는다 | - -검토 source: [backend](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp), -[기존 backend tests](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp). -추가로 [writer 검증](../../src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp)의 `[5]=0` 제한과 -[실제 HDF5 readback·변조 거부 검사](../../tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp)를 -대조했다. Schema의 field/type/layout 변경 없이 승인된 control 값만 일치시킨다. -본 검토자는 source/tests를 변경하거나 build/test를 중복 실행하지 않고 메인의 실행 로그를 대조했다. - -## 새 실행 evidence - -개인 `.harness/config.json`과 preset의 MSVC x64 Debug·oneMKL 2026.1 설정을 확인했다. - -| Evidence 경로 | 확인 결과 | -| --- | --- | -| `.harness/feast-residual-red.log` | 변경 전 backend와 실제 HDF5에서 `[5]=1`을 읽어 새 `[5]=0` 검사 두 개가 실패함 | -| `.harness/feast-residual-focused.log` | 12개 중 11 통과. Backend 10개는 n1/all-zero/mixed-zero/repeated40 prefix/close distinct·Givens/negative/invalid/thread 복원 포함. Writer 한 개는 실제 control readback·trace로 변조한 candidate 거부 포함 | -| 같은 focused log의 원본 reference | Application 성공 후 Value 비교까지 진행했으나 10 singleton 중 9개 실패. 기존 독립 residual 차단과 다른 외부 acceptance 실패이며 전체 검사가 통과한 것은 아님 | -| `.harness/feast-residual-full-run.log` | 구성된 전체 build/test에서 CTest 395개 중 394 통과, 원본 Value reference 한 개 실패, CTest exit8, 실행178.42초. 전체 통과 아님 | -| `.harness/build-ninja-msvc-debug/feast-residual-metrics.json` | `.harness/build-ninja-msvc-debug/extract_feast_residual.py`가 공식 원본 sibling HDF5를 read-only 추출한 값. 스크립트의 실제 dataset·mode_id 대응과 JSON을 대조함 | - -원본 새 HDF5에서 `c=22,m0=33,info=0,loop=6`, controls `[2]=12,[3]=20,[5]=0`, -`epsout=2.4227135616446226e-17`을 확인했다. 전체 c개의 최대값은 다음과 같다. - -| Metric | 실제 최대값 | 판정 기준 | -| --- | ---: | ---: | -| 독립 rho_B | `1.605467212112365e-13` | `<=1e-10`, PASS | -| Original-free eta_r / whitened eta_w | `9.981033437726324e-15` / `7.315529163435965e-15` | 각각 `<=1e-10`, PASS | -| Gram eta_gram / max_eta_orth | `1.3777964580680282e-15` / `1.6958335496991244e-15` | 각각 `<=1e-10`, PASS | -| Backend res | `8.280018892001454e-13` | vendor 진단량, 독립 rho_B 대체 아님 | - -Value 행별 상대오차는 전부 5% 이내지만 Mode2–10의 singleton RMS는 1%를 초과한다. -Mode1은 `0.5648341627%`로 PASS, Mode2–10은 `1.3496440956%`–`4.2613310845%`로 FAIL이다. -양의 singleton은 RMS가 relative error와 같다는 [승인된 family 계약](reference-model.md)을 -그대로 적용했다. 행 5%만으로 전체 PASS를 선언하거나 frame을 합쳐 RMS를 완화할 수 없다. -**필요한 후속 correction:** 메인이 이 외부 불일치의 원인·모델 가정을 별도 조사해야 한다. -현재 evidence만으로 질량·stabilization 등 특정 물리 식이 원인이라고 단정할 수 없다. - -반복군 검사 통과를 모든 projector·3회 결정론·vendor 실패 주입 coverage 완료로 확장하지 않는다. - -## Trace stopping 이력과 잔여 위험 - -[기존 실행 기록](implementation-verification.md)의 trace stopping 실패는 -`n=3125,N=10,c=22,m0=33,info=0,loop=4`, raw solver column20의 -`rho_B=1.48674481038207483e-10>1e-10`, `epsout=2.82488401287762986e-14`다. -Full/upper action 차이 `1.38724134018909290e-17`은 해당 실패 크기를 설명하지 못한다. -이 관찰은 trace 수렴이 각 vector residual 통과를 보장하지 않는 실제 반례이며, -새 제어의 개선 정도·통과 여부를 선취하지 않는다. - -공통 외부 정책은 필요한 row의 누락·추가·중복·비유한을 tolerance 전에 거부하고 승인된 -Value family에 적용한다. 독립 modal 허용오차를 외부 reference tolerance로 대체하지 않는다. -S3 정적 계약 충돌과 기존 nonlinear recovery 문제, 27개 case 전체 세부 coverage 미완료는 -[기존 독립 검토](implementation-numerical-review.md)의 별도 제한으로 남는다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-first-version-review.md b/docs/mitc4-shell-feast-eigen2/implementation-first-version-review.md deleted file mode 100644 index f99c103..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-first-version-review.md +++ /dev/null @@ -1,67 +0,0 @@ -# 첫 구현 acceptance 독립 검토 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 2026-09-10. -- 판정: **`PASS` — 사용자 승인 첫 구현 범위**. S3와 후속 정확도 개선은 보류 상태다. -- 적용: 사용자 승인 외부 Value 5%, [PRD](PRD.md), [ADR](ADR.md), - [TOLERANCE](../TOLERANCE.md), [reference-model](reference-model.md), - [필수 cases](numerical-review-cases.md), [내부 controls](numerical-review-controls.md). - -## 승인 경계와 수치 판단 - -원본 Mode1–10은 source `Step-2`의 독립 modal-frame singleton이다. 첫 구현 profile -`mitc4-eigen-first-implementation`은 각 `Value`의 reference-only relative error와 RMS를 -각각 .05로 검사한다. 경계 포함이며 family를 합치거나 mode를 평균하지 않는다. -다른 공통 comparison의 RMS .01, missing/extra/duplicate/nonfinite 거부, zero-scale exact-zero, -내부 전체 c개의 residual/Gram `1e-10`은 유지한다. - -[종료 제어 검토](implementation-feast-residual-review.md)의 원본 최대 Value 오차 -`4.2613310845%`는 승인된 새 5% 범위 안이다. 새 comparator의 실제 focused 실행에서 -원본 10개 family가 통과했다. 기존 1% FAIL 기록은 당시 판정으로 보존한다. 수식·DOF·단위·적분· -mass·whitening·복구·state update는 이번 외부 정책으로 바뀌지 않는다. - -## 필수 보강과 추가 검증 한계 - -| 분류 | 요구·현재 evidence·필요한 보강 | -| --- | --- | -| 확인 — backend 실패 | REQ012/019, C21/C22. Fatal count·optional info1 fallback, final count 불일치·변경 없는 solve 반복 금지, info2의 더 큰 구간 retry, 요청 N 밖 고유벡터의 실제 residual 초과 및 nonfinite/Gram 거부 통과. Production이 사용하는 동일 budget helper의 511/512·363/364, size product·PTRDIFF/container 경계, 실제 count/solve workspace bad_alloc·thread 복원 및 초기 count3회 한계를 검사 | -| 확인 — raw·순위·반복군 | C18/C19/C21. 증가 upper의 감소 count 거부, raw -1e-12와 -1e-9 보존 및 -1e-9 바로 아래 실패 통과. 작은 isolated repeated군을 세 번 실제 FEAST로 풀어 순서·history와 승인된 Frobenius projector/sqrt(2r) metric을 비교 | -| 확인 — mass oracle·단위 | REQ005/014/026, C02/C03/C05. 48개 rational Ck/각 row·first spatial moment, theta×d 부호의 C1 cross-block·C2 rotary block과 두24×24 질량, pairwise Jensen의1/2 및2*C1 항을 대조. Scalar는 m_e(t/2)^k, matrix는 D Frobenius norm합, Jensen 차이는 qMLq+qMCq로 정규화. Proper Q+shift를 geometry/director부터 재계산하여 두 mass의 공변성 통과 | -| 확인 — 공유 node assembly | REQ003/004/007, C06. rho2/t.5와 rho5/t1의 공유 node URX만 free인 patch에서 mass7/64, local K합/m와 modal amplitude²*mass1, element source order 변화의 결과를 확인. Model-level BC로 fixture를 바로잡은 뒤 통과; parser 지원 범위를 넓히지 않음 | -| 확인 — final 보존 | REQ019, C24. Eigen candidate 변조·empty pencil 보존 및 실제 valid HDF5에 Win32 delete-sharing lock을 걸어 close/self-check 뒤 replace 실패·원본 bytes 보존 통과. 공통 AtomicFinalizeValidatedCandidate의 실패 경로와 연결 | -| 확인 — 5% 한정 정책 | C25. ±5% 경계와 바로 밖, zero/nonfinite·identity 거부, common RMS1% 보존, actual profile metadata와 원본 10 family fresh 비교 통과. 아래 focused evidence와 source 대조 | -| 사용자 명시 보류 | S3의 public static moment 충돌. Direct pencil/covariance 검사의 성공과 구별하고 지원 정적 사례의 성공으로 표시하지 않는다 | -| 추가 검증의 한계 | 모든 조건수·geometry injectivity·mesh spectrum 수렴차수·vendor/OS 오류 조합·임의 반복군 방향은 보장하지 않는다. H5Fclose 오류 자체와512회 actual vendor 호출은 미실행이다. CloseChecked 실패는 RequireHdf5→catch/cleanup→replace전 종료를 정적으로 대조했고 budget은 실제 사용 helper의 경계 검사다. 대표 분기 검증을 모든 오류 조합 전수 검사로 확대하지 않는다 | - -검토 대상 tests: [mass contract](../../tests/unit/elements/mitc4_shell_mass_contract_test.cpp), -[mass/kernel](../../tests/unit/elements/mitc4_shell_test.cpp), -[공유 node assembly](../../tests/unit/analysis/eigen_mass_assembly_test.cpp), -[reduction](../../tests/unit/analysis/eigen_reduction_test.cpp), -[backend](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp), -[procedure](../../tests/integration/analysis/linear_frequency_procedure_test.cpp), -[writer](../../tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp), -[common finalize](../../tests/unit/io/hdf5/hdf5_writer_components_test.cpp). -Source의 guard 존재와 실제 실패 주입 통과를 구분한다. 검토자는 source/tests·상위 계약·reference를 -수정하지 않고 메인의 fresh 결과를 대조한다. - -## 실행 evidence - -- `.harness/eigen-first-implementation-focused.log`: comparator/policy 10/10 PASS, - 원본 실제 해석→HDF5→10개 family 비교 포함. 정책 코드의 공통 Evaluate는 RMS .01을 - 유지하고 named entry는 blocking singleton `Value`만 허용한다. -- 독립 재계산: [기존 rational coefficient 적분](numerical-review-evidence.md)의 Python을 - 표준 라이브러리로 새 실행하고 mass test의 48개 rational 상수를 Fraction으로 대조하여 - 전부 exact 일치를 확인했다. 이종 두 요소 공유 node의 rotary mass도 - `2*(1/2)^3/48+5/48=7/64 [M L²]`로 독립 확인했다. 이는 C++ 실행 대체가 아니다. -- `.harness/eigen-first-implementation-coverage.log`: 31개 중30 PASS. Backend24개·writer - 통과, C06 fixture의 BC 위치만 실패했다. `.harness/eigen-first-implementation-mass.log`에서 - fixture와 정규화 보강 뒤 mass6/6 PASS를 직접 확인했다. -- `.harness/eigen-first-implementation-boundaries.log`: raw negative와 count monotonicity 경계2/2 PASS. -- `.harness/eigen-first-implementation-full-run.log`: MSVC x64 Debug의 configure/build/ - discovery/CTest 모두 exit0, **417/417 PASS**, 166.86초. Unit339/integration42/reference36. - 같은 build의 `Testing/Temporary/LastTest.log`에서도 Passed417/Failed0와 원본 reference - 실행을 직접 확인했다. 과거 C06 실패를 담은 `LastTestsFailed.log`는 최신 판정 근거로 사용하지 않는다. - -이번 검토에서 추가 numerical correction은 필요하지 않다. 독립 내부 기준과 새 외부 -정책의 실행 연결을 확인했으며, 모든 vendor·OS 실패 조합이나 S3 해결·Abaqus 내부 절차 -동등성을 승인한 판정은 아니다. [이전 물리 검토](implementation-physics-review.md)의 기존 -nonlinear recovery 제한도 이 변경으로 해소됐다고 주장하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-history.md b/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-history.md deleted file mode 100644 index 3432831..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-history.md +++ /dev/null @@ -1,99 +0,0 @@ -# 수정 전 구현 수치 검토 기록 - -아래는 최초 검토 당시 관찰이다. 현재 판정·수정 상태는 [현재 보고서](implementation-numerical-review.md)를 따른다. - -# 구현 독립 수치 검토 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`. -- 검토일: `2026-09-09`; 대상: 질량·선형 stabilization·constraint-first reduction의 현재 작업본. -- 판정: **correction-required / verification-incomplete**. 최초 질량/축소 검토에 이어 메인의 추가 할당으로 FEAST backend를 검토했다. Procedure는 메인이 수정 중이므로 검토하지 않았다. -- 기준: [formulation](formulation.md), [mass/stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [requirements](requirements.md), [공통 tolerance](../TOLERANCE.md). - -## 수정 사항 - -### NR-IMP-01 — P2: 질량 양성 검사가 불필요한 곱의 범위에 의존한다 - -[mitc4_shell.cpp](../../src/fesa/elements/mitc4_shell.cpp) 819–824행은 -`m*j-h*h`의 finite/positive 여부를 검사한다. 채택 C2-09의 검사는 -`j-h²/m>0`이며, 전자는 유한하고 잘 조건화된 질량도 density 배율만으로 거부한다. -평판 `A=4,t=2,h=0`에서 `m=2*rho,j=(2/3)*rho`다. - -| rho | m*j의 binary64 결과 | j-(h/m)*h | 현재 guard | -| ---: | ---: | ---: | --- | -| 1 | 1.3333333333333333 | 0.6666666666666666 | true | -| 1e-180 | 0 | 6.666666666666667e-181 | false | -| 1e180 | inf | 6.666666666666666e179 | false | - -이는 Python 표준 `float`/`math.isfinite`로 실제 계산한 scalar 반례이며 C++ solver 재현은 미실행이다. -모든 사례의 `m,j`와 nodal block 성분은 finite positive이고 density 배율은 condition number를 바꾸지 않는다. -**수정:** 승인된 Schur variance를 불필요한 `m*j`, `h*h` 중간 곱 없이 평가하고 strict finite/positive 판정은 유지한다. -두 배율의 element mass 회귀로 실패를 재현하고, 정상 mass의 density 비례 및 잘못된 variance의 거부를 확인한다. -근거: M4/M5, C1 및 C2-09, 요구 003/014/026. 허용오차·rank·density 계약 변경은 필요하지 않다. - -### NR-IMP-02 — P2: 새 oracle/covariance 검사가 승인된 metric을 사용하지 않는다 - -[mitc4_shell_test.cpp](../../tests/unit/elements/mitc4_shell_test.cpp) 837–845, 901, 922–937행은 -차원이 다른 `C0/C1/C2` 및 translation/rotation matrix entries에 동일한 absolute `1e-12`를 적용한다. -특히 `ExpectGlobalZCovariance`는 `D^T M D`, `D^T K D`와 상대 Frobenius 지표를 계산하지 않는다. -이 검사는 현재 fixture의 entry 오차를 확인하지만 C1/C2-02/03의 통과 evidence를 대신할 수 없다. -**수정:** scalar Ck 오차는 `m_e(t/2)^k`, matrix congruence는 같은 `ell`의 D congruence 후 -`norm(R-S)/(norm(R)+norm(S))`로 검사한다. Finite-first와 승인된 zero branch를 유지한다. -단위변환 E2-C20을 함께 연결하여 고정 절대 단위에 의존하지 않음을 확인한다. - -## FEAST 추가 검토: 수정 사항 - -대상은 [mkl_feast_eigen_solver.cpp](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp)의 -2026-09-09 추가 할당 시점 작업본이다. 아래 행 번호는 후속 수정 전이며 기준은 C1/C3/C5/C6다. - -| Finding | 위치·영향 | 필요한 수정·검증 | -| --- | --- | --- | -| NR-IMP-03 **P1** | 420–425행은 optional count의 **모든** 오류를 fallback으로 처리한다. Invalid/SPD/inner-solver 오류도 이후 solve 성공으로 우회될 수 있다. | `info=1,2,3,-5`만 optional search 종료로 분류하고 나머지는 즉시 실패. E2-C21 status 주입으로 각각 확인 | -| NR-IMP-04 **P1** | 429–433행은 세 guard의 서로 다른 successful count를 모두 fatal로 처리한다. Spectrum이 guard 사이에 있으면 정상적인 nondecreasing count 차이이며 endpoint collision이다. 반대로 서로 다른 interval들의 global monotonicity는 검사하지 않는다. | C5의 후보 `0,+1,-1,+2,-2,+4,-4` times delta 최대7개와 certified fallback을 구현. Successful count가 interval 포함관계에 모순될 때만 count-inconsistent. 정상 collision과 실제 역전 mock을 구분 | -| NR-IMP-05 **P1** | 451–457행의 final interior endpoint 검사는 central count 한 번뿐이다. 500–505행의 retry는 같은 b에서 capacity만 늘리며 재count하지 않는다. 542–546행의 endpoint separation 실패는 retry 경로에 들어가지 않는다. | Final interior b의 세 guard 재확인, 저장된 더 큰 certified b 선택→재count→capacity 갱신을 solve retry와 endpoint 실패에 연결. 최종 b0 및 변경 없는 입력 재호출 금지·3회/budget 한계 확인 | -| NR-IMP-06 **P2** | 360–365행은 초기 retry 때 Gershgorin padding 대신 전체 bracket 폭을 2^j배 한다. 불필요하게 넓어진 contour는 승인된 controls와 다른 수렴 동작을 만든다. | 원 gL/gU를 보존하고 **16delta padding만** 2^j배로 outward 재계산. Zero B의 ±2^j branch는 현재 정의와 일치 | -| NR-IMP-07 **P2** | 175–219행의 QR은 reflector norm의 absolute 1e-12만 검사하고 relative pivot, positive R diagonal, post-QR Gram 검사를 수행하지 않는다. | C6의 원 column scale 대비 pivot·positive R sign·Gram<=1e-12를 실제 계산. Fixed seed/n,m0별 재현성과 부적합 QR 실패 검증 | -| NR-IMP-08 **P1** | 236–238/312/459–473행은 일부 size_t product만 검사한다. n²/nm0의 byte·PTRDIFF_MAX·container max_size와 count padding arithmetic 사전검사가 없고 allocation exception 변환도 이 함수에 없다. | 모든 integer/byte operation 전에 C6 범위 검사, allocation/length 오류의 structured failure 경로를 연결. 불가능한 count m0도 cast 전 `0<=m0<=n` 검증(338–344행). E2-C22의 boundary/실패 주입 | -| NR-IMP-09 **P2** | 513–535행은 finite 검사 전에 eigenvalues를 sort한다. 565행은 physical lambda 환산의 finite/비영 underflow 검사를 하지 않는다. 492–495행은 epsout을 무조건 available로 기록하고 finite 검사하지 않는다. 571–579행은 Gram 최대 entry만 계산한다. | Raw eigenpairs finite-first 후 sort, `mu*s` overflow/비영→0 실패, epsout finite 검증, 전체 c의 `norm(G-I)F/sqrt(c)`와 pairwise 기준을 별도 적용. Public 결과의 gram_error 의미를 승인된 schema에 맞춤 | - -추가 관찰: `ValidateSymmetry` 118–143행의 max-entry 기준도 C2-01의 Frobenius 지표와 다르다. -Failure 반환은 local `calls`를 버리므로 실패/fallback 이력을 상위 diagnostic/log에 남기는 연결을 확인해야 한다. -현재 [backend tests](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp)는 actual n1/zero/repeated/prefix/negative/thread/request를 다루지만, -위 C5 status·collision·monotonicity·final guard·retry·512 call budget·overflow failure injection은 확인되지 않았다. -Backend를 이 검토에서 실행하지 않았으며 actual FEAST의 성공 또는 실패를 새로 주장하지 않는다. - -## 정적 대조에서 일치한 구현 - -| 경로·행 | 확인 내용 | -| --- | --- | -| [mitc4_shell.cpp](../../src/fesa/elements/mitc4_shell.cpp) 292–299, 725–805 | `S=-[d]cross`, 27점 xi→eta→zeta 적분, 각 점 geometry/J 검사, 대칭 Ck와 MC의 네 block 부호·DOF 순서가 M1/M3와 일치 | -| 같은 파일 808–850 | 보존된 Ck의 실제 row sum에서 m/h/j를 만들고 nodal tensor를 재구성한다. Full24 row sum 또는 인공 drilling mass를 사용하지 않음 | -| 같은 파일 649–716 | 초기 physical rotary 8개 전부의 trace mean, zero 포함 분모8, negative/nonfinite/allzero 거부 및 complete K 재조립이 S1과 일치 | -| [eigen_reduction.cpp](../../src/fesa/analysis/eigen_reduction.cpp) 65–112 | 실제 component BC를 먼저 적용하고 constrained director의 **정확한 비영** 성분으로 analytic null을 판정. Partial URZ의 양의 mass를 보존 | -| 같은 파일 116–200, 311–332, 359–370 | `Mp/scale`의 block Cholesky, small triangular inverse action으로 rcond_inf, `P L^-T` lift, nodal stiffness congruence 및 constrained-zero scaled mode 복원 방향이 E1–E4와 일치. Global dense inverse 없음 | -| 같은 파일 238–280, 289–349 | 원 scaled constrained MZ/KZ/PZ를 검사하고 null stiffness kappa의 strict positivity를 유지. `nz=0`의 storage0는 상위 I/O에서 N/A flag와 연결해야 함 | - -## 아직 연결해야 하는 검증 - -다음은 할당된 [element tests](../../tests/unit/elements/mitc4_shell_test.cpp)와 -[reduction tests](../../tests/unit/analysis/eigen_reduction_test.cpp)의 정적 coverage 확인이다. -다른 파일의 미확인 coverage를 전체 저장소의 부재로 단정하지 않는다. - -- E2-C02/03/04/11: warped oracle는 현재 Ck(0,0) 및 전체 scalar sums만 확인한다. - 모든 Ck/row, `sum(m_i X_i+h_i d_i)`의 독립 first spatial moment, MC/ML 각각의 직접 kinetic energy, - Jensen pairwise integral·mesh 차이, consistent rank20·nodal rank5·drill null·여섯 physical rigid mass Gram이 필요하다. -- E2-C08/09/10: 원 S3 exact scalar target은 구현되어 있다. **회전한 같은 S3 fixture**의 실제 partial BC spectrum과 - admissible tangent moment `(5/3)b`의 정적 응답·full residual covariance는 아직 이 두 파일에서 확인되지 않았다. - Zero 포함 rotary inventory와 독립 tangent basis, invalid inventory 경계도 별도 evidence가 필요하다. -- E2-C13/14/15/16: 현 reduction 3개 테스트는 URZ positive, full-free aligned null/Kpz 실패, p=1e-8 conditioning 실패를 다룬다. - p=1/2000 positive 성공과 p=0 exact null, 2개 free rotations, drill-only free/all-fixed node/global n0, - nonpositive kappa·MZ 위반, **비대각 Mp** `[[2,1],[1,2]]`의 lambda `2,10/3` 및 original-mass 복원 검증이 필요하다. -- E2-C06/12/20/26: 공유 node의 section별 stable assembly·재현성, frozen nonlinear scale/미분/rollback, - density와 단위변환, retained static·pressure synthetic evidence는 이번 할당 파일 범위 밖의 후속 연결 사항이다. - -## 실행 경계와 잔여 위험 - -이번에는 문서·source·test를 읽고 scalar binary64 반례만 실행했다. Build/CTest·FEAST·external reference·physics 검증은 실행하지 않았다. -메인의 focused build/test 성공 전달은 별도 실행 evidence이며 본 검토가 전체 기능 완료를 승인하지 않는다. -Reference artifact와 제외 예제는 읽거나 수정하지 않았다. 상위 계약·source·test·Git도 수정하지 않았다. -남는 위험은 거의 정렬된 partial BC의 forward accuracy, geometry 평가점 밖 injectivity, -원 free residual·전체 c개 Gram을 포함한 procedure 복원 검증과 actual FEAST의 count/cluster/runtime다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-s3-static.md b/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-s3-static.md deleted file mode 100644 index 7befa08..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-s3-static.md +++ /dev/null @@ -1,65 +0,0 @@ -# S3 partial-BC 정적 평형 불일치 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 검토일: `2026-09-09`. -- Finding: **NR-IMP-10 / upstream-contract-conflict**. [현재 보고서](implementation-numerical-review.md)의 추가 검토다. -- 입력: [S3 정식화](formulation-mass-stabilization.md), [E2-C09](numerical-review-cases.md), 채택 [C7](../mitc4-shell-feast-eigen/numerical-review-controls.md), 기존 [linear formulation §14.1](../linear-static-mitc4-shell/formulation.md), [linear I/O §6.5](../linear-static-mitc4-shell/io.md). - -## 독립 수치 결론 - -`d=(3/5,0,4/5)`, node1 URZ만 free, applied moment `(-4/3,0,1)=(5/3)b`, -`M0=1`인 승인 S3에서 다음은 정확하다. Moment의 단위는 `[force·length]`다. - -\[ -\theta_{1Z}=7500/10369,\qquad -\gamma_1=d^T\theta_1=6000/10369,\qquad k_d=19/4800. -\] - -Physical stiffness의 spatial total moment는 0이지만, -`Kdrill`은 node1에 `tau_d=kd gamma1 d`를 더한다. `r=Kq-F`의 free 성분은 0이므로 -applied load와 **constrained full residual**을 더한 기존 global moment evidence는 - -\[ -e_M=\tau_d=(57/41476,\ 0,\ 19/10369),\qquad -\|e_M\|=95/41476\approx0.002290481242164143\ne0. -\] - -Global Z45° 회전에서는 `e_M'=Q e_M`이며 norm은 같다. Applied moment가 tangent라는 사실은 -partial global BC가 만든 `gamma1!=0`을 없애지 않는다. Load의 constrained X 성분을 추가해도 -`Ff=1`과 위 nonzero torque는 그대로다. Physical rigid representative의 회전은 `P_i Omega`이고, -full spatial `Omega`와 numerical drilling energy를 혼동하면 이 불일치를 놓친다. - -[기존 독립 oracle](numerical-review-evidence.md)의 첫 Python block을 그대로 실행한 뒤 -원 `K,q,F`에서 constrained `Kq-F`, 각 node의 `X cross R+RM`을 따로 합산했다. -현재 [global recovery](../../src/fesa/results/global_equilibrium_recovery.cpp) 193–249행과 같은 -정규화에서 `reaction moment scale=3.1253278233567374`, -`applied moment scale=5/3`, `eta_M=0.0007328771161369957`을 얻었다. -Fraction 산술의 위 exact torque와 일치한다. 따라서 기존 `1e-10` 검사가 실패하는 것은 예상된 결과다. -이것은 독립 수학 실행이며 C++/reference/solver 재실행이 아니다. - -## E2-C09 검증 계층과 계약 경계 - -**E2-C09 자체는 public `LinearStaticProcedureExecutor::Execute`의 성공을 명시하지 않는다.** -S3, E2-C09 및 채택 C7의 해당 문장은 `thetaZ`, complete full `Kq-F`, same-BC/load 회전 공변성을 요구한다. -기존 독립 evidence도 direct1DOF partition solve로 이를 검증했고 zero global moment를 확인한 적은 없다. -따라서 production kernel의 complete K를 geometry/frame부터 재계산하여 `Kff theta=Ff`를 풀고, -전체 `r=Kq-F`와 원/회전 결과를 비교하는 **직접 pencil 테스트는 E2-C09에 맞는 검증**이다. -Constrained residual이 0이어야 한다는 의미로 complete residual 기준을 적용하지 않는다. -이는 case의 test layer를 바로잡는 것이며 threshold·물리·reaction 계약을 바꾸지 않는다. - -동시에 **public static 실패는 별개의 실제 계약 충돌로 남는다.** 기존 -[linear requirements](../linear-static-mitc4-shell/requirements.md)의 017–019는 이 global component BC와 -tangent CLOAD를 지원하고, 029/046/057 및 기존 I/O는 full residual reaction과 spatial global balance를 유지한다. -새 요구 024/027은 그 의미를 보존한다. 승인된 M2의 rotation-only drill penalty와 이 조합은 -S3에서 exact algebra상 동시에 public 성공 조건을 만족할 수 없다. -직접 테스트 통과만으로 public static 회귀가 해소되었다거나 이 입력이 새로 unsupported라고 선언하면 안 된다. - -**처리:** E2-C09의 algebraic 검증과 현재 public failure 재현은 따로 보존한다. -Global balance를 완화하거나 drill torque를 빼거나 reaction을 projection하거나 fixture BC/load를 바꾸어 실패를 감추지 않는다. -Public static의 해당 supported 범위까지 성공해야 하는 완료 판정을 내려면 메인이 formulation/requirements owner에게 -이 exact 반례를 전달하고, physics·지원 범위·recovery/acceptance 중 어떤 계약을 바꿀지 사용자 결정을 받아야 한다. -현재 numerical reviewer에게 그 변경을 자체 승인할 권한은 없다. Eigen S3의 finite-pencil target은 이 static 충돌로 바뀌지 않는다. - -후속 실행 전달: 메인은 E2-C09를 direct pencil/full `Kq-F` covariance 테스트로 수정하여 통과했고, -별도 public static 테스트는 현재 global-equilibrium rejection을 재현한다고 보고했다. -이는 수학 case와 public 실패를 분리해 검증한 evidence이며, 지원 범위의 상위 계약 충돌을 해결하거나 -public failure를 승인된 unsupported-input 진단으로 바꾼 결정은 아니다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-numerical-review.md b/docs/mitc4-shell-feast-eigen2/implementation-numerical-review.md deleted file mode 100644 index e405ccf..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-numerical-review.md +++ /dev/null @@ -1,100 +0,0 @@ -# 구현 독립 수치 검토 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 검토일: `2026-09-09`. -- 판정: **correction-required / verification-incomplete**. -- 대상: 질량·stabilization·reduction, 수정된 FEAST backend와 `linear_frequency_procedure.cpp`. Writer는 검토하지 않았다. -- 기준: [formulation](formulation.md), [mass/stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [requirements](requirements.md), [공통 tolerance](../TOLERANCE.md). -- 최초 finding·scalar 반례는 [이전 검토 상세](implementation-numerical-review-history.md)에 보존한다. 아래는 후속 수정본에 대한 현재 판정이다. - -## 이전 finding의 수정 확인 - -Central Count·안정적 QR까지 수정한 최신 저장본 `mkl_feast_eigen_solver.cpp`를 직접 대조했다. -아래 source 판정과 메인이 전달한 실제 재실행 결과를 구분한다. - -| Finding | 현재 상태 | 최신 정적 evidence | -| --- | --- | --- | -| NR-IMP-01 | **addressed** | [mass source](../../src/fesa/elements/mitc4_shell.cpp)의 `j-h*(h/m)` strict finite/positive와 [density 회귀](../../tests/unit/elements/mitc4_shell_test.cpp) 확인. 메인이 실제 통과를 전달 | -| NR-IMP-02 | **open** | Mass Ck oracle/`ExpectGlobalZCovariance`의 승인된 차원별 scale·D congruence 적용 및 단위변환 coverage 미완료 | -| NR-IMP-03 | **addressed in source** | [backend](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp) optional info1/2/3/-5만 fallback, 나머지는 실패 | -| NR-IMP-04 | **addressed in source** | Offsets `0,±1,±2,±4`, 21-call 예약으로 optimization384 유지, 각 Count/solve의 total512 guard 확인. Central Count 473–484행에서 동일 lower의 모든 성공 이력에 대해 upper/count 단조성과 동일 endpoint count 일치를 검사 | -| NR-IMP-05 | **addressed in source** | 최초·retry interior 3-count guard, previous/new capacity 비교와 실제 interval 변경 조건을 확인. Retry Count도 위 central history 검사를 거침 | -| NR-IMP-06 | **addressed in source** | 초기 재시도는 16delta padding만 2^j배 | -| NR-IMP-07 | **addressed in source** | 229–245행의 relative pivot·`alpha=-copysign(norm,x0)` reflector, 276–290행의 Q column sign으로 positive R diagonal 및 `norm(Q^T Q-I)_F/sqrt(m0)<=1e-12` 확인 | -| NR-IMP-08 | **production guards added; failure coverage incomplete** | n²/nm0 storage·PTRDIFF/container·padding·count[0,n] 검사, 주요 allocation 변환 및 [procedure](../../src/fesa/analysis/linear_frequency_procedure.cpp)의 bad_alloc/length_error 변환 확인. 경계/실패 주입 검증 미확인 | -| NR-IMP-09 | **addressed in source** | Successful epsout/loop 및 유효한 반환 범위의 모든 eigenvalue/vector finite 검사를 endpoint/retry 앞에 수행. Finite-first sort, physical lambda 환산, exact-zero nonfinite backend res의 unavailable 처리, all-c pairwise/Frobenius Gram acceptance 확인 | - -## 최신 backend correction과 검증 경계 - -[Backend source](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp)의 이전 count/QR/nonfinite-vector finding은 -현재 저장본에서 수정됐다. Optional guard가 중간 실패해도 이전 성공 Count는 공통 이력에 남아 이후 대조에 사용된다. -Signed Householder는 cancellation을 피하며 Q column sign 변경은 R row sign 변경과 대응하므로 positive diagonal 규칙에 맞는다. -`ValidateSymmetry` 134–166행도 scale로 정규화한 Frobenius 비율이며, max-entry acceptance라는 이전 finding은 해소됐다. - -C5 실패/status/동일 endpoint/역전/retry/budget/allocation 주입은 **실행 evidence 미완료**다. -`CallHistory`는 residual 실패에 연결됐지만 다른 early failure의 전체 이력 보존도 미확인이다. -Source correction 확인을 해당 실패 경로의 실행 통과로 확대하지 않는다. NR-IMP-02의 mass oracle 차원별 scale은 별도로 남는다. - -## Frequency procedure와 reduction의 대조 결과 - -[Procedure source](../../src/fesa/analysis/linear_frequency_procedure.cpp)에서 다음 수학 계약과의 불일치는 발견하지 못했다. - -- 161–185행: active shell 길이 scale과 analytic reduction 뒤 actual FEAST를 사용하고, exact-zero A의 scale 후보는 `min(E/rho/ell²)`로 만든다. -- 201–223행: K/M Frobenius norm은 실제 free/free 부분에 D congruence를 적용해 같은 단위로 계산한다. -- 235–270행: `q=D y`, scaled source maximum-component sign, actual ML mass 정규화, 최종 phi에서 g/y 재계산, 원 조립 K/ML의 모든 free DOF residual·Rayleigh·energy를 평가한다. Constrained components는 exact0이며 modal reaction을 생성하지 않는다. -- 271–305행: whitened/operator residual 및 raw lambda를 보존한 near-zero/positive·connected cluster·frequency validity를 검사한다. 전체 c를 검증하고 첫 N개만 mode/vector로 공개한다. -- 306–319행: 정규화된 physical phi와 actual mass action으로 전체 c의 Gram/각 pairwise orthogonality를 다시 계산한다. `nz=0`의 null metric은 applicable flag0와 연결된다. -- [Reduction tests](../../tests/unit/analysis/eigen_reduction_test.cpp)에 비대각 Mp의 lambda2,10/3·original mass 복원, p1/2000 positive, 2 free rotations, MZ 위반, drill-only/all-fixed empty 실패가 추가됐다. - -## 원본 eigen column20 residual 실패의 한정 재검토 - -메인이 전달한 correction 후 실제 값은 `n=3125,c=22,m0=33`, backend 26 calls, -`rho_B=1.48674481038207483e-10`이다. **현재 근거로 procedure/reduction의 구현 결함이 원인이라고 판정할 수 없으며, -보고된 값에 대한 실패 처리는 승인 C3-02/C5와 일치한다.** 기준1e-10을 48.6745% 초과하고, -requested10 밖의 column20도 검증 대상인 전체 c개에 속하므로 삭제하거나 검사에서 제외할 수 없다. -FEAST 성공 status·trace stopping은 이 독립 operator residual 기준을 대신하지 않는다. - -- [Procedure](../../src/fesa/analysis/linear_frequency_procedure.cpp) 184–186행은 backend 실패를 즉시 반환한다. - 따라서 201행 이후의 scaled original-free norm, `q=D y`, 최종 physical normalization·Gram/energy는 - 이번 실패 때 실행되지 않았다. 그 계산에서 이번 backend column20 오류가 생겼다는 설명은 실행 순서와 맞지 않는다. -- 최신 [reduction](../../src/fesa/analysis/eigen_reduction.cpp) 116–206, 301–356행을 다시 대조했다. - `Mp/scale=L0 L0^T`, lift=`P L0^-T/sqrt(scale)`, `A=lift^T Khat_f lift`의 전치·양쪽 D·질량·단위는 일치한다. - 실제 global BC의 exact null 처리와 원 MZ/KZ/PZ 검증에도 이 residual 실패를 설명하는 수식 오류를 발견하지 못했다. - 이는 실제 큰 모델의 forward accuracy 보장이거나 모든 입력 inventory의 독립 검증 완료를 뜻하지 않는다. -- Backend가 계산하는 `norm((A/s)x-mu*x)/norm(x)`는 해당 승인 metric이다. - 모드 진폭을 바꿔도 비율은 같고 물리 mass 정규화로 이 값을 낮추려는 변경은 근거가 없다. - -메인이 전달한 column20의 correction 전·후 actual rerun 진단값은 다음과 같다. - -| 관찰 | 이전 실행 | 최신 correction 후 실행 | -| --- | ---: | ---: | -| FEAST info / loop | 0 / 4 | 0 / 4 | -| trace epsout | 2.82730672643927457e-14 | 2.82488401287762986e-14 | -| full CSR rho_B | 1.42356735413003805e-10 | 1.48674481038207483e-10 | -| mirrored upper CSR rho_B | 1.42356735389686902e-10 | 1.48674481542089335e-10 | -| full/upper difference action norm | 1.24572423402534915e-17 | 1.38724134018909290e-17 | - -**해당 실행 판정: mandatory all-c residual failure confirmed.** FEAST가 실제 받은 symmetric upper operator에서도 -같은 기준을 넘으므로 full/upper symmetry roundoff는 이 실패의 원인이 아니다. -고정 `fpm[5]=1` trace stopping이 4회에서 충족된 결과이며 **최대20회 반복을 소진한 실패가 아니다**. -따라서 단순히 maximum loop를 늘리는 것을 확인된 원인 수정으로 제시할 수 없다. -작은 trace 변화나 `info=0`을 모든 eigenpair residual의 통과로 해석하지 않는다. - -최신 진단은 위 central Count·안정적 QR correction **이후 실행**이다. 확인된 구현 결함을 수정한 뒤에도 -승인 fixed controls로 얻은 이 모델의 결과가 mandatory all-c 기준을 충족하지 못한다. -이는 모든 잠재적 구현 결함을 배제한 증명은 아니지만, 현재 reference 성공 또는 기능 완료 판정을 막는 실제 evidence다. -전체 runner 통과가 있더라도 이 필수 residual/reference 실패를 대신 해소하지 않는다. - -FEAST stopping/control·후검증 기준·실패 retry 정책을 바꾸려는 경우에는 고정 C3/C5 계약의 -**사용자 결정과 관련 수치 재검토가 먼저 필요하다**. 구현 correction은 기존 계약 안에서 진행할 수 있으며, -mass·seed·N 변경, column20 제외 또는 실패 후 미승인 재시도의 근거가 되지 않는다. -이번 검토자는 actual rerun을 직접 실행하지 않았고 전달받은 진단값과 read-only 실행 경로를 대조했다. - -## 남은 검증과 실행 경계 - -- **NR-IMP-10 / upstream-contract-conflict:** S3의 public static global moment failure는 exact numerical drilling torque에서 발생한다. `norm(e_M)=95/41476`, 현재 normalized metric≈7.328771e-4다. [독립 유도와 판단](implementation-numerical-review-s3-static.md)을 참조한다. 메인은 수정된 E2-C09 direct pencil/full Kq-F covariance 테스트 통과와 별도 public rejection 재현을 전달했다. 수학 case의 검증은 연결됐지만 public 지원 범위의 평형 충돌은 미해결이다. -- [Procedure integration tests](../../tests/integration/analysis/linear_frequency_procedure_test.cpp)는 S3 direct pencil/full residual covariance와 free panel의 여섯 near-zero mode/all-c evidence를 다룬다. Density4 및 length1024의 물리 단위변환에서 lambda·rotation amplitude·residual/energy를 검증하는 테스트도 추가됐고 메인은 최신 focused 통과를 전달했다. Wrong-mass/vector/constraint mutation 검증은 미완료다. -- Mass의 모든 warped Ck/rows·first spatial moment·두 mass의 독립 energy/Jensen·mesh 오차·rank20/rank5·physical rigid Gram, 독립 tangent inventory 및 frozen nonlinear/retained static 검증은 최초 상세의 coverage gap이 남아 있다. -- [Actual FEAST tests](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp)에 zero/positive known spectra의 lowest prefix와 Givens congruence로 회전한 close distinct spectrum/Gram 검증이 추가됐고 메인은 최신 focused 통과를 전달했다. C5 status·guard collision/역전·retry·budget·allocation 주입, repeated eigenspace projector 및 세 반복 재현성 evidence는 미확인이다. -- 메인이 전달한 최신 source checkpoint는 `22c9d44`이며 configured full runner는 **395개 중394 통과, 원본 eigen 1개 실패, 155.31초**다. Input/FEAST/procedure/writer focused41은 새 density·unit scaling을 포함해 모두 통과했다. 본 검토자는 실행 로그를 직접 재검증하거나 build/test를 실행하지 않았다. 필수 reference/physics 완료는 승인하지 않는다. -- 최초 원본 eigen 실행의 10669ms 뒤 column20 `eigenpair-validation-failed`는 위 actual rerun의 full/upper residual·loop/epsout evidence로 구체화됐다. 필수 reference/전체 기능의 성공 판정은 할 수 없다. -- 이번 후속 수정은 본 보고서뿐이며 과거 검토 상세는 보존했다. 상위 계약·source·tests·writer·Git·reference는 수정하지 않았고 reference·제외 예제는 열람하지 않았다. 잔여 위험은 mandatory residual와 public static 계약 충돌, near-aligned forward accuracy, geometry 평가점 밖 injectivity 및 필수 coverage다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-physics-review.md b/docs/mitc4-shell-feast-eigen2/implementation-physics-review.md deleted file mode 100644 index f1112d4..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-physics-review.md +++ /dev/null @@ -1,60 +0,0 @@ -# 구현 결과 물리 검토 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: `physics-evaluation-agent`; 검토일: `2026-09-09`. -- 결론: **유지 대상 변위·평형 evidence는 타당하나 feature 완료 판정 불가**. 원본 eigen 필수 residual 실패, S3 public static 계약 충돌이 남는다. 별도로 기존 nonlinear 굽힘 단면력 복구 결함을 확인했다. -- 기준: [cases E2-C08/09/11/12/26](numerical-review-cases.md), [mass/stabilization S1–S3](formulation-mass-stabilization.md), [controls C3/C7](numerical-review-controls.md), [공통 tolerance](../TOLERANCE.md), [nonlinear I/O §7.5/8.5](../nonlinear-static-newton-raphson/io.md). 새 acceptance나 release 승인을 만들지 않는다. - -## 직접 확인한 evidence - -아래 `A/B/C`는 이번 검토 시 허용된 각 경로에서 `LastWriteTime`으로 선택한 최신 결과다. HDF5를 `h5py.File(path, 'r')`로 읽어 계산했으며 solver/build/test는 재실행하지 않았다. 이후 구현 수정·재실행 결과로 자동 승계하지 않는다. - -| ID | Artifact | -| --- | --- | -| A | [.harness/build-ninja-msvc-debug/reference/mitc4-shell-s4-comparison/shell_results.h5](../../.harness/build-ninja-msvc-debug/reference/mitc4-shell-s4-comparison/shell_results.h5), 같은 폴더 [comparison.json](../../.harness/build-ninja-msvc-debug/reference/mitc4-shell-s4-comparison/comparison.json) | -| B | [.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-798076888102900-0/shellNL_results.h5](../../.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-798076888102900-0/shellNL_results.h5), 같은 폴더 `shellNL_log.txt` | -| C | [.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-798054727288300-1/shell_results.h5](../../.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-798054727288300-1/shell_results.h5) | -| Model/reference | [shell.inp](../../reference/shell/shell.inp), [shell displacements.csv](<../../reference/shell/shell displacements.csv>), [shellNL.inp](../../reference/shellNL/shellNL.inp), [shellNL displacements.csv](<../../reference/shellNL/shellNL displacements.csv>), [shellNL reactions.csv](<../../reference/shellNL/shellNL reactions.csv>) | - -두 모델은 `36 S4 / 49 nodes`, `[-5,5]×[-5,5]` 평판, `t=0.5`, `E=2.1e11`, `nu=0.3`, 외곽 24 node의 6 DOF 고정, 중앙 `(Part-1-1, node 2)`의 `FZ=-100000`이다. A/C는 linear, B는 `nlgeom=YES`, factor `0.1..1.0`의 10 accepted frames다. 단위계는 입력의 일관된 미지정 단위: 변위 `length`, 힘 `force`, 모멘트·에너지 `force*length`, 응력 `force/length²`, 굽힘 단면력 `force`다. SI로 추정하지 않는다. 제외된 원본·복사·cache 모델과 stress reference CSV는 열거나 사용하지 않았다. - -## 변위, 대칭, 평형과 에너지 - -| 관찰 | 직접 계산/저장 결과 | 해석 | -| --- | --- | --- | -| A/C 하중 방향·크기 | 중앙 `UZ=-2.3550441765084857e-5`; `UX=UY=URZ=0`; `max|URX/Y|=7.55060026636933e-6` | 음의 Z 하중에 음의 처짐. `|UZ|/t=4.71009e-5`로 작은 변형 영역 | -| A 대칭 | X/Y 반사 node 대응의 `max|ΔUZ|=3.21873e-20 length` | 중앙하중·고정 외곽의 대칭과 일치. 이 수치는 별도 새 판정 기준이 아닌 관찰 | -| A 평형 | HDF5 `global/verification_metrics`: free residual `1.07747756e-14`, force `1.12049747e-14`, moment `2.35981342e-15` | 각각 기존 `1e-10` 이내 | -| A 에너지 | physical energy `1.1775220882542212`; `Fᵀu/2=1.1775220882542428`; 상대차 `1.82912e-14` | 양의 선형 변형에너지와 일치, 기존 energy `1e-12` 이내 | -| B 최종 변위 | 중앙 `UZ=-2.355044174560645e-5`; `max|UX/UY|≈8.79961e-12`; 반사 `max|ΔUZ|=7.41128e-17` | 작은 면내 응답과 대칭 유지. 큰 변형의 외부 검증으로 확대할 수 없음 | -| B 선형극한 | C 대비 중앙 UZ 상대차 `8.27093e-10`; 전체 translation 최대차/최대 linear translation `3.73649e-7` | 작은 하중의 nonlinear displacement가 linear에 접근. 단면력 일치까지 뜻하지 않음 | -| B 에너지·증분 | factor0.1 energy `0.011775220886841211`, factor1 energy `1.1775220868030056`; 모든 10 frame 양수·증가, 각 2 Newton iterations | 거의 factor² 에너지와 factor 비례 처짐. Nonlinear에서 `Fᵀu/2`를 일반 항등식으로 요구하지 않음 | - -B frame9의 `generalized_residual`에 **먼저 constraint mask**를 적용한 뒤 회전만 `J_l(phi)^(-T)`로 spatial 변환하고 current arm `X+u`를 사용했다. `|phi|<1.1e-5`에서 inverse-Jacobian의 안정적 소각 전개를 사용했다. 독립 합산은 저장된 `/global/equilibrium`과 roundoff 범위에서 일치한다. - -- Constrained resultant force: `(-5.88263e-12, 6.25300e-12, 100000.00000082512) force`. Applied force `(0,0,-100000)`을 상쇄한다. Reference CSV 전체 RF 합의 Z는 `99999.99959279996 force`; 이는 review-only 관찰이다. -- Constrained resultant moment about origin: `(-5.63887e-11, 3.63798e-11, -4.17886618386e-5) force*length`. 중앙 applied force arm은 사실상 0이다. -- I/O §8.5의 nodal norm-sum scale은 force `100000.00439300563`, moment `780242.2734309232`. 독립 normalized force `8.25134e-12`, moment `5.35586e-11`로 각각 기존 factor-one `1e-8` 이내다. 저장 balance Z-force `8.25122697279e-7`, Z-moment `-4.17886618392e-5`를 zero-clamp하지 않았다. -- Accepted free residual: force infinity norm `0.031462885121074535 force`, matching external scale `100000`, internal-inclusive scale `100000.00000106206` → relative `3.14629e-7 <= 1e-2`. Moment infinity norm `3.3292018315478344e-6 force*length`, matching external scale exact0 → 기존 typed absolute `1e-3` 이내. 이 accepted residual과 global balance는 서로 다른 관찰이다. - -## 외부 변위 비교와 복구 결함 - -A comparison JSON은 49 nodes × 6 components의 294행, blocking U와 warning-only UR 각각 147행, 실패행·warning 0이다. U relative RMS `0.0010332756650397166`, UR `0.0029771372973060382`로 기존 `0.01` 이내다. - -B는 실제 CSV/HDF5의 `(case-insensitive instance, source node label, component)`를 직접 대응했다. 49개의 유일 node identity가 일치하고 값이 모두 유한하다. 같은 공통 tolerance로 U relative RMS `0.0010332757195474177`, UR `0.0029771373238648216`, 각 family 실패행 0이다. Reaction CSV를 blocking 비교로 승격하지 않는다. 변위 수치 일치는 아래 복구 결함을 검출하지 않는다. - -**PE-IMP-01 — 기존 nonlinear 굽힘 단면력 복구 결함, 구현 owner 인계.** B frame9 `(Part-1-1, element 3, midsurface GP2)`의 `S11` bottom/middle/top은 `[313254.63790344447, 3.694293034163272, -313246.91989287396] force/length²`이다. [nonlinear formulation §13.3](../nonlinear-static-newton-raphson/formulation.md)의 `M11=∫z S11 dz`, `z∈[-t/2,t/2]`와 평판의 두께 stress polynomial에서: - -`M11 = t²/12 * (S11_top-S11_bottom) = -13052.1157874233 force`. - -그러나 HDF5 `section_resultant[...,3]`는 `-26104.23157284045 force`, 비율 `1.999999999846297`이다. A의 같은 적분은 저장 M과 최대차 `9.09495e-12 force`로 일치한다. B의 모든 row/component 중 최대 굽힘 오차는 `13052.11578541715 force`다. - -메인의 추가 읽기 허가로 [nonlinear recovery source](../../src/fesa/elements/nonlinear_mitc4_shell.cpp:1243)를 확인했다. 두께 Gauss moment 가중치가 `0.25*t*zeta*stress`이므로 `z dz`가 요구하는 `0.25*t²*zeta*stress`의 thickness 한 개가 빠져 있다. `t=0.5`의 2배 차이와 직접 연결되며 차원도 맞지 않는다. 해당 파일의 `git diff HEAD -- `는 비어 있다. 따라서 **현재 eigen 변경이 도입한 결함이라는 근거는 없고 HEAD에도 존재하는 복구 결함**이다. 코드 수정이나 새 gate를 수행하지 않았다. Finite stress/strain, 양의 에너지, U/UR 통과만으로 nonlinear section-resultant 물리 타당성을 주장할 수 없다. - -## Eigen/S3와 남은 범위 - -- **원본 eigen 미해결:** 메인의 최신 actual FEAST 전달값은 `676 shells / 729 nodes`, `nf=3750,nz=625,n=3125,N=10`, `c=22,m0=33,loop=4`, column20 `rho_B=1.48674481038207483e-10 > 1e-10`이다. Symmetric upper operator에서도 `1.48674481542089335e-10`이다. 요청 10개 밖이어도 all-c 검증 대상이므로 버릴 수 없다. Accepted modal HDF5와 Value reference comparison이 없으므로 원본 modal energy·mass normalization·mode shape 물리 검증은 **미실시**다. 최신 실패값은 메인 실행 전달이며 이 검토자가 eigen artifact를 직접 읽은 값이 아니다. -- **S3 public static 충돌:** [독립 수치 검토](implementation-numerical-review-s3-static.md)의 `thetaZ=7500/10369`, `lambda=10369/450`과 complete `Kq-F` 회전 공변성은 direct pencil 검증이다. `gamma1=6000/10369`에서 미상쇄 drilling torque `(57/41476,0,19/10369) force*length`, norm `95/41476≈0.002290481242164143`, normalized spatial moment `0.0007328771161369957 > 1e-10`가 남는다. 메인은 direct 검증 통과와 별도 public rejection 재현을 전달했다. 지원되는 static 성공을 의미하지 않으며 기존 reaction/global-balance 의미와의 계약 충돌 해결은 formulation/requirements owner와 사용자 결정 사항이다. -- **전달받은 synthetic 통과의 한계:** 작은 S3 eigen, free panel 여섯 rigid near-zero modes 및 all-c Gram, nonlinear tangent/objectivity/force/moment/free residual/energy/rollback 통과는 메인 실행 전달이다. 이번 검토자는 해당 test output을 직접 열지 않았다. Massless drill null과 양의 질량을 가진 physical rigid modes를 구분하는 근거이지만 큰 원본 모델 성공을 대신하지 않는다. -- Retained 외부 모델은 같은 평판의 매우 작은 변형이다. Arbitrary curved/director, 큰 회전·큰 변형의 외부 정확도, pressure external fresh comparison, modal stress/reaction, 일반 mesh 수렴은 여기서 검증하지 않았다. Synthetic pressure 통과가 외부 pressure coverage를 채우지 않는다. - -검토 변경은 이 보고서뿐이다. 계약·허용오차·source·test·output·reference는 수정하지 않았다. 후속 action은 원본 eigen 실패와 S3 계약 충돌의 owner 처리, PE-IMP-01의 기존 recovery 결함 분리 추적이다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-plan.md b/docs/mitc4-shell-feast-eigen2/implementation-plan.md deleted file mode 100644 index ec44567..0000000 --- a/docs/mitc4-shell-feast-eigen2/implementation-plan.md +++ /dev/null @@ -1,46 +0,0 @@ -# MITC4 eigen 구현 계획 - -- Feature: `mitc4-shell-feast-eigen2`; Owner: 메인 assistant. -- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR](../ADR.md), - [정식화](formulation.md), [NR controls](numerical-review-controls.md), - [검증 사례](numerical-review-cases.md), [I/O](io.md). -- 실행 권한·현재 checklist는 [Feature PRD](PRD.md), 시간 제한 해제는 [Feature ADR](ADR.md)의 ADR-009를 따른다. - -## 변경 묶음과 소유권 - -| 묶음 | Owner / 실제 경로 | 구현과 검증 | -| --- | --- | --- | -| 질량·stabilization | implementation-agent `eigen2_mass_impl`; `include/fesa/elements/mitc4_shell.h`, `src/fesa/elements/mitc4_shell.cpp`, 해당 element unit tests | 27점 consistent moments→derived lumped, trace mean. 독립 flat/warped mass, drill null·좌표/부분 BC와 기존 물리 kernel 검사 | -| FEAST backend | implementation-agent `eigen2_feast_impl`; 새 `include/fesa/solvers/eigen/`, `src/fesa/solvers/eigen/`와 unit tests | 실제 MKL 호출, fixed-lower count/search, controls·checked storage·all-c 검증·실패 evidence. 실제 known spectra/zero/repeated/endpoint 및 thread 복원 | -| 입력·Domain | implementation-agent `eigen2_input_impl`; `model_types.h`, `domain.h/.cpp`, `domain_mapping_context.cpp`, eigen mapper/model tests | Material별 density, 독립 Frequency payload와 common boundary view, source Step-2/N 보존, exact allowlist와 fail-closed 진단 | -| 축소·procedure·state | 메인; 새 `analysis/eigen_*`, 관련 `AnalysisModel`/`DofManager`/prepared/application 연결 | 실제 BC→analytic null→nodal SPD whitening, sparse congruence, original-free 복구·정규화/Gram/에너지, 후보 state. 작은 직접 pencil 및 partial-BC 통합 검증 | -| 결과·비교·회귀 | 메인 또는 후속 명시 할당 owner; 새 eigen HDF5 writer/self-check, eigen reference comparator, 해당 tests와 기존 제외 inventory 변경 | Static schema 유지, source identity·N/c 구분, candidate 보존, TXT Value-only 공통 tolerance, retained static와 synthetic coverage | -| 빌드·Git·Feature 기록 | 메인; `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, 이 Feature의 관리/결과 문서 | 동시 빌드 충돌 방지, 명시 경로별 stage/commit, 사용자 변경 보존 | - -서로 다른 owner의 파일을 덮어쓰지 않는다. Shared API는 구현 전에 메인에 전달하고 불일치는 -계약 원본과 대조하여 수정한다. Vendor type은 private adapter에만 둔다. 이미 승인된 수식을 -다시 선택하거나 시간 절약을 위해 dense global Schur·인공 mass·lower mode 누락을 허용하지 않는다. - -## 검증 순서 - -1. 현재 설정의 configure/build와 검사 inventory를 확인한다. 가능한 결함 재현 후 최소 수정하고 - [27개 사례](numerical-review-cases.md)와 [IO-T01–11](io.md)에 각 테스트를 연결한다. -2. 묶음별 unit/integration 검사를 실행한다. Actual FEAST probe는 mock으로 대체하지 않는다. - 수학/자료 조립을 변경하면 필요한 독립 numerical 검토를 받는다. -3. CLI→원본 입력→HDF5→TXT Value comparison을 fresh 실행한다. 원본 TXT/CSV를 수정하거나 - 제외 예제의 옛 경로·복사본·cache로 성공 evidence를 만들지 않는다. -4. 영향받는 shell/shellNL/linear-limit, nonlinear tangent/objectivity/평형·state, - pressure synthetic·기타 기존 회귀를 보존한다. 제외된 복합 테스트의 retained 관찰은 분리한다. -5. 기능 완료 시 구성된 전체 build/test와 필수 reference를 한 번 실행하고 독립 물리 검토와 - 실제 결과·실패·미실행을 기록한다. 실패 수치를 expected로 복사하지 않는다. 외부 고유치 - 기준은 [ADR-012](ADR.md#mfe2-adr-012--첫-구현의-외부-고유치-5-수용)의 사용자 승인5%를 적용한다. - -현재 `.harness/config.json`은 `mfe-workspace-msvc-ninja-debug` configure/build/test preset과 -`.harness/build-ninja-msvc-debug`를 선택한다. 개인 preset의 dependency 경로는 commit하지 않는다. -Focused 실행은 해당 CMake target/CTest filter, 전체 검증은 `python scripts/execute.py`다. -메인이 빌드 실행을 직렬화한다. C++에는 MSVC x64 Debug `/W4 /WX` 기준을 적용한다. - -실제 runtime·known spectra와 원본 모델을 실행했다. 현재 결과·수정 범위와 미완료 검증은 -[implementation-verification](implementation-verification.md)에 기록한다. All-c residual은 -ADR-011의 residual stopping으로 해소했다. ADR-012의 첫 구현 범위에서 외부5% 비교와 -필수 mass/실패 보존 evidence를 확인하며 S3는 명시된 후속 과제로 유지한다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-review.md b/docs/mitc4-shell-feast-eigen2/implementation-review.md new file mode 100644 index 0000000..fe90b9e --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/implementation-review.md @@ -0,0 +1,519 @@ +# MITC4 eigen 구현 독립 검토와 수정 이력 + +수정 전 finding·수정 확인·S3 보류·물리 한계·종료 제어·첫 구현 acceptance를 구분한다. 아래 각 문서의 날짜·검토 source와 미실행 범위를 유지하며 새로운 검토를 수행한 것은 아니다. + + + + +## 수정 전 구현 수치 검토 기록 + +아래는 최초 검토 당시 관찰이다. 현재 판정·수정 상태는 [현재 보고서](implementation-review.md#implementation-numerical-review)를 따른다. + + +## 구현 독립 수치 검토 + +- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`. +- 검토일: `2026-09-09`; 대상: 질량·선형 stabilization·constraint-first reduction의 현재 작업본. +- 판정: **correction-required / verification-incomplete**. 최초 질량/축소 검토에 이어 메인의 추가 할당으로 FEAST backend를 검토했다. Procedure는 메인이 수정 중이므로 검토하지 않았다. +- 기준: [formulation](formulation.md), [mass/stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [requirements](requirements.md#requirements), [공통 tolerance](../TOLERANCE.md). + + +### 수정 사항 + + +#### NR-IMP-01 — P2: 질량 양성 검사가 불필요한 곱의 범위에 의존한다 + +[mitc4_shell.cpp](../../src/fesa/elements/mitc4_shell.cpp) 819–824행은 +`m*j-h*h`의 finite/positive 여부를 검사한다. 채택 C2-09의 검사는 +`j-h²/m>0`이며, 전자는 유한하고 잘 조건화된 질량도 density 배율만으로 거부한다. +평판 `A=4,t=2,h=0`에서 `m=2*rho,j=(2/3)*rho`다. + +| rho | m*j의 binary64 결과 | j-(h/m)*h | 현재 guard | +| ---: | ---: | ---: | --- | +| 1 | 1.3333333333333333 | 0.6666666666666666 | true | +| 1e-180 | 0 | 6.666666666666667e-181 | false | +| 1e180 | inf | 6.666666666666666e179 | false | + +이는 Python 표준 `float`/`math.isfinite`로 실제 계산한 scalar 반례이며 C++ solver 재현은 미실행이다. +모든 사례의 `m,j`와 nodal block 성분은 finite positive이고 density 배율은 condition number를 바꾸지 않는다. +**수정:** 승인된 Schur variance를 불필요한 `m*j`, `h*h` 중간 곱 없이 평가하고 strict finite/positive 판정은 유지한다. +두 배율의 element mass 회귀로 실패를 재현하고, 정상 mass의 density 비례 및 잘못된 variance의 거부를 확인한다. +근거: M4/M5, C1 및 C2-09, 요구 003/014/026. 허용오차·rank·density 계약 변경은 필요하지 않다. + + +#### NR-IMP-02 — P2: 새 oracle/covariance 검사가 승인된 metric을 사용하지 않는다 + +[mitc4_shell_test.cpp](../../tests/unit/elements/mitc4_shell_test.cpp) 837–845, 901, 922–937행은 +차원이 다른 `C0/C1/C2` 및 translation/rotation matrix entries에 동일한 absolute `1e-12`를 적용한다. +특히 `ExpectGlobalZCovariance`는 `D^T M D`, `D^T K D`와 상대 Frobenius 지표를 계산하지 않는다. +이 검사는 현재 fixture의 entry 오차를 확인하지만 C1/C2-02/03의 통과 evidence를 대신할 수 없다. +**수정:** scalar Ck 오차는 `m_e(t/2)^k`, matrix congruence는 같은 `ell`의 D congruence 후 +`norm(R-S)/(norm(R)+norm(S))`로 검사한다. Finite-first와 승인된 zero branch를 유지한다. +단위변환 E2-C20을 함께 연결하여 고정 절대 단위에 의존하지 않음을 확인한다. + + +### FEAST 추가 검토: 수정 사항 + +대상은 [mkl_feast_eigen_solver.cpp](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp)의 +2026-09-09 추가 할당 시점 작업본이다. 아래 행 번호는 후속 수정 전이며 기준은 C1/C3/C5/C6다. + +| Finding | 위치·영향 | 필요한 수정·검증 | +| --- | --- | --- | +| NR-IMP-03 **P1** | 420–425행은 optional count의 **모든** 오류를 fallback으로 처리한다. Invalid/SPD/inner-solver 오류도 이후 solve 성공으로 우회될 수 있다. | `info=1,2,3,-5`만 optional search 종료로 분류하고 나머지는 즉시 실패. E2-C21 status 주입으로 각각 확인 | +| NR-IMP-04 **P1** | 429–433행은 세 guard의 서로 다른 successful count를 모두 fatal로 처리한다. Spectrum이 guard 사이에 있으면 정상적인 nondecreasing count 차이이며 endpoint collision이다. 반대로 서로 다른 interval들의 global monotonicity는 검사하지 않는다. | C5의 후보 `0,+1,-1,+2,-2,+4,-4` times delta 최대7개와 certified fallback을 구현. Successful count가 interval 포함관계에 모순될 때만 count-inconsistent. 정상 collision과 실제 역전 mock을 구분 | +| NR-IMP-05 **P1** | 451–457행의 final interior endpoint 검사는 central count 한 번뿐이다. 500–505행의 retry는 같은 b에서 capacity만 늘리며 재count하지 않는다. 542–546행의 endpoint separation 실패는 retry 경로에 들어가지 않는다. | Final interior b의 세 guard 재확인, 저장된 더 큰 certified b 선택→재count→capacity 갱신을 solve retry와 endpoint 실패에 연결. 최종 b0 및 변경 없는 입력 재호출 금지·3회/budget 한계 확인 | +| NR-IMP-06 **P2** | 360–365행은 초기 retry 때 Gershgorin padding 대신 전체 bracket 폭을 2^j배 한다. 불필요하게 넓어진 contour는 승인된 controls와 다른 수렴 동작을 만든다. | 원 gL/gU를 보존하고 **16delta padding만** 2^j배로 outward 재계산. Zero B의 ±2^j branch는 현재 정의와 일치 | +| NR-IMP-07 **P2** | 175–219행의 QR은 reflector norm의 absolute 1e-12만 검사하고 relative pivot, positive R diagonal, post-QR Gram 검사를 수행하지 않는다. | C6의 원 column scale 대비 pivot·positive R sign·Gram<=1e-12를 실제 계산. Fixed seed/n,m0별 재현성과 부적합 QR 실패 검증 | +| NR-IMP-08 **P1** | 236–238/312/459–473행은 일부 size_t product만 검사한다. n²/nm0의 byte·PTRDIFF_MAX·container max_size와 count padding arithmetic 사전검사가 없고 allocation exception 변환도 이 함수에 없다. | 모든 integer/byte operation 전에 C6 범위 검사, allocation/length 오류의 structured failure 경로를 연결. 불가능한 count m0도 cast 전 `0<=m0<=n` 검증(338–344행). E2-C22의 boundary/실패 주입 | +| NR-IMP-09 **P2** | 513–535행은 finite 검사 전에 eigenvalues를 sort한다. 565행은 physical lambda 환산의 finite/비영 underflow 검사를 하지 않는다. 492–495행은 epsout을 무조건 available로 기록하고 finite 검사하지 않는다. 571–579행은 Gram 최대 entry만 계산한다. | Raw eigenpairs finite-first 후 sort, `mu*s` overflow/비영→0 실패, epsout finite 검증, 전체 c의 `norm(G-I)F/sqrt(c)`와 pairwise 기준을 별도 적용. Public 결과의 gram_error 의미를 승인된 schema에 맞춤 | + +추가 관찰: `ValidateSymmetry` 118–143행의 max-entry 기준도 C2-01의 Frobenius 지표와 다르다. +Failure 반환은 local `calls`를 버리므로 실패/fallback 이력을 상위 diagnostic/log에 남기는 연결을 확인해야 한다. +현재 [backend tests](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp)는 actual n1/zero/repeated/prefix/negative/thread/request를 다루지만, +위 C5 status·collision·monotonicity·final guard·retry·512 call budget·overflow failure injection은 확인되지 않았다. +Backend를 이 검토에서 실행하지 않았으며 actual FEAST의 성공 또는 실패를 새로 주장하지 않는다. + + +### 정적 대조에서 일치한 구현 + +| 경로·행 | 확인 내용 | +| --- | --- | +| [mitc4_shell.cpp](../../src/fesa/elements/mitc4_shell.cpp) 292–299, 725–805 | `S=-[d]cross`, 27점 xi→eta→zeta 적분, 각 점 geometry/J 검사, 대칭 Ck와 MC의 네 block 부호·DOF 순서가 M1/M3와 일치 | +| 같은 파일 808–850 | 보존된 Ck의 실제 row sum에서 m/h/j를 만들고 nodal tensor를 재구성한다. Full24 row sum 또는 인공 drilling mass를 사용하지 않음 | +| 같은 파일 649–716 | 초기 physical rotary 8개 전부의 trace mean, zero 포함 분모8, negative/nonfinite/allzero 거부 및 complete K 재조립이 S1과 일치 | +| [eigen_reduction.cpp](../../src/fesa/analysis/eigen_reduction.cpp) 65–112 | 실제 component BC를 먼저 적용하고 constrained director의 **정확한 비영** 성분으로 analytic null을 판정. Partial URZ의 양의 mass를 보존 | +| 같은 파일 116–200, 311–332, 359–370 | `Mp/scale`의 block Cholesky, small triangular inverse action으로 rcond_inf, `P L^-T` lift, nodal stiffness congruence 및 constrained-zero scaled mode 복원 방향이 E1–E4와 일치. Global dense inverse 없음 | +| 같은 파일 238–280, 289–349 | 원 scaled constrained MZ/KZ/PZ를 검사하고 null stiffness kappa의 strict positivity를 유지. `nz=0`의 storage0는 상위 I/O에서 N/A flag와 연결해야 함 | + + +### 아직 연결해야 하는 검증 + +다음은 할당된 [element tests](../../tests/unit/elements/mitc4_shell_test.cpp)와 +[reduction tests](../../tests/unit/analysis/eigen_reduction_test.cpp)의 정적 coverage 확인이다. +다른 파일의 미확인 coverage를 전체 저장소의 부재로 단정하지 않는다. + +- E2-C02/03/04/11: warped oracle는 현재 Ck(0,0) 및 전체 scalar sums만 확인한다. + 모든 Ck/row, `sum(m_i X_i+h_i d_i)`의 독립 first spatial moment, MC/ML 각각의 직접 kinetic energy, + Jensen pairwise integral·mesh 차이, consistent rank20·nodal rank5·drill null·여섯 physical rigid mass Gram이 필요하다. +- E2-C08/09/10: 원 S3 exact scalar target은 구현되어 있다. **회전한 같은 S3 fixture**의 실제 partial BC spectrum과 + admissible tangent moment `(5/3)b`의 정적 응답·full residual covariance는 아직 이 두 파일에서 확인되지 않았다. + Zero 포함 rotary inventory와 독립 tangent basis, invalid inventory 경계도 별도 evidence가 필요하다. +- E2-C13/14/15/16: 현 reduction 3개 테스트는 URZ positive, full-free aligned null/Kpz 실패, p=1e-8 conditioning 실패를 다룬다. + p=1/2000 positive 성공과 p=0 exact null, 2개 free rotations, drill-only free/all-fixed node/global n0, + nonpositive kappa·MZ 위반, **비대각 Mp** `[[2,1],[1,2]]`의 lambda `2,10/3` 및 original-mass 복원 검증이 필요하다. +- E2-C06/12/20/26: 공유 node의 section별 stable assembly·재현성, frozen nonlinear scale/미분/rollback, + density와 단위변환, retained static·pressure synthetic evidence는 이번 할당 파일 범위 밖의 후속 연결 사항이다. + + +### 실행 경계와 잔여 위험 + +이번에는 문서·source·test를 읽고 scalar binary64 반례만 실행했다. Build/CTest·FEAST·external reference·physics 검증은 실행하지 않았다. +메인의 focused build/test 성공 전달은 별도 실행 evidence이며 본 검토가 전체 기능 완료를 승인하지 않는다. +Reference artifact와 제외 예제는 읽거나 수정하지 않았다. 상위 계약·source·test·Git도 수정하지 않았다. +남는 위험은 거의 정렬된 partial BC의 forward accuracy, geometry 평가점 밖 injectivity, +원 free residual·전체 c개 Gram을 포함한 procedure 복원 검증과 actual FEAST의 count/cluster/runtime다. + + + + +## 구현 독립 수치 검토 + +- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 검토일: `2026-09-09`. +- 판정: **correction-required / verification-incomplete**. +- 대상: 질량·stabilization·reduction, 수정된 FEAST backend와 `linear_frequency_procedure.cpp`. Writer는 검토하지 않았다. +- 기준: [formulation](formulation.md), [mass/stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [requirements](requirements.md#requirements), [공통 tolerance](../TOLERANCE.md). +- 최초 finding·scalar 반례는 [이전 검토 상세](implementation-review.md#implementation-numerical-review-history)에 보존한다. 아래는 후속 수정본에 대한 현재 판정이다. + + +### 이전 finding의 수정 확인 + +Central Count·안정적 QR까지 수정한 최신 저장본 `mkl_feast_eigen_solver.cpp`를 직접 대조했다. +아래 source 판정과 메인이 전달한 실제 재실행 결과를 구분한다. + +| Finding | 현재 상태 | 최신 정적 evidence | +| --- | --- | --- | +| NR-IMP-01 | **addressed** | [mass source](../../src/fesa/elements/mitc4_shell.cpp)의 `j-h*(h/m)` strict finite/positive와 [density 회귀](../../tests/unit/elements/mitc4_shell_test.cpp) 확인. 메인이 실제 통과를 전달 | +| NR-IMP-02 | **open** | Mass Ck oracle/`ExpectGlobalZCovariance`의 승인된 차원별 scale·D congruence 적용 및 단위변환 coverage 미완료 | +| NR-IMP-03 | **addressed in source** | [backend](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp) optional info1/2/3/-5만 fallback, 나머지는 실패 | +| NR-IMP-04 | **addressed in source** | Offsets `0,±1,±2,±4`, 21-call 예약으로 optimization384 유지, 각 Count/solve의 total512 guard 확인. Central Count 473–484행에서 동일 lower의 모든 성공 이력에 대해 upper/count 단조성과 동일 endpoint count 일치를 검사 | +| NR-IMP-05 | **addressed in source** | 최초·retry interior 3-count guard, previous/new capacity 비교와 실제 interval 변경 조건을 확인. Retry Count도 위 central history 검사를 거침 | +| NR-IMP-06 | **addressed in source** | 초기 재시도는 16delta padding만 2^j배 | +| NR-IMP-07 | **addressed in source** | 229–245행의 relative pivot·`alpha=-copysign(norm,x0)` reflector, 276–290행의 Q column sign으로 positive R diagonal 및 `norm(Q^T Q-I)_F/sqrt(m0)<=1e-12` 확인 | +| NR-IMP-08 | **production guards added; failure coverage incomplete** | n²/nm0 storage·PTRDIFF/container·padding·count[0,n] 검사, 주요 allocation 변환 및 [procedure](../../src/fesa/analysis/linear_frequency_procedure.cpp)의 bad_alloc/length_error 변환 확인. 경계/실패 주입 검증 미확인 | +| NR-IMP-09 | **addressed in source** | Successful epsout/loop 및 유효한 반환 범위의 모든 eigenvalue/vector finite 검사를 endpoint/retry 앞에 수행. Finite-first sort, physical lambda 환산, exact-zero nonfinite backend res의 unavailable 처리, all-c pairwise/Frobenius Gram acceptance 확인 | + + +### 최신 backend correction과 검증 경계 + +[Backend source](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp)의 이전 count/QR/nonfinite-vector finding은 +현재 저장본에서 수정됐다. Optional guard가 중간 실패해도 이전 성공 Count는 공통 이력에 남아 이후 대조에 사용된다. +Signed Householder는 cancellation을 피하며 Q column sign 변경은 R row sign 변경과 대응하므로 positive diagonal 규칙에 맞는다. +`ValidateSymmetry` 134–166행도 scale로 정규화한 Frobenius 비율이며, max-entry acceptance라는 이전 finding은 해소됐다. + +C5 실패/status/동일 endpoint/역전/retry/budget/allocation 주입은 **실행 evidence 미완료**다. +`CallHistory`는 residual 실패에 연결됐지만 다른 early failure의 전체 이력 보존도 미확인이다. +Source correction 확인을 해당 실패 경로의 실행 통과로 확대하지 않는다. NR-IMP-02의 mass oracle 차원별 scale은 별도로 남는다. + + +### Frequency procedure와 reduction의 대조 결과 + +[Procedure source](../../src/fesa/analysis/linear_frequency_procedure.cpp)에서 다음 수학 계약과의 불일치는 발견하지 못했다. + +- 161–185행: active shell 길이 scale과 analytic reduction 뒤 actual FEAST를 사용하고, exact-zero A의 scale 후보는 `min(E/rho/ell²)`로 만든다. +- 201–223행: K/M Frobenius norm은 실제 free/free 부분에 D congruence를 적용해 같은 단위로 계산한다. +- 235–270행: `q=D y`, scaled source maximum-component sign, actual ML mass 정규화, 최종 phi에서 g/y 재계산, 원 조립 K/ML의 모든 free DOF residual·Rayleigh·energy를 평가한다. Constrained components는 exact0이며 modal reaction을 생성하지 않는다. +- 271–305행: whitened/operator residual 및 raw lambda를 보존한 near-zero/positive·connected cluster·frequency validity를 검사한다. 전체 c를 검증하고 첫 N개만 mode/vector로 공개한다. +- 306–319행: 정규화된 physical phi와 actual mass action으로 전체 c의 Gram/각 pairwise orthogonality를 다시 계산한다. `nz=0`의 null metric은 applicable flag0와 연결된다. +- [Reduction tests](../../tests/unit/analysis/eigen_reduction_test.cpp)에 비대각 Mp의 lambda2,10/3·original mass 복원, p1/2000 positive, 2 free rotations, MZ 위반, drill-only/all-fixed empty 실패가 추가됐다. + + +### 원본 eigen column20 residual 실패의 한정 재검토 + +메인이 전달한 correction 후 실제 값은 `n=3125,c=22,m0=33`, backend 26 calls, +`rho_B=1.48674481038207483e-10`이다. **현재 근거로 procedure/reduction의 구현 결함이 원인이라고 판정할 수 없으며, +보고된 값에 대한 실패 처리는 승인 C3-02/C5와 일치한다.** 기준1e-10을 48.6745% 초과하고, +requested10 밖의 column20도 검증 대상인 전체 c개에 속하므로 삭제하거나 검사에서 제외할 수 없다. +FEAST 성공 status·trace stopping은 이 독립 operator residual 기준을 대신하지 않는다. + +- [Procedure](../../src/fesa/analysis/linear_frequency_procedure.cpp) 184–186행은 backend 실패를 즉시 반환한다. + 따라서 201행 이후의 scaled original-free norm, `q=D y`, 최종 physical normalization·Gram/energy는 + 이번 실패 때 실행되지 않았다. 그 계산에서 이번 backend column20 오류가 생겼다는 설명은 실행 순서와 맞지 않는다. +- 최신 [reduction](../../src/fesa/analysis/eigen_reduction.cpp) 116–206, 301–356행을 다시 대조했다. + `Mp/scale=L0 L0^T`, lift=`P L0^-T/sqrt(scale)`, `A=lift^T Khat_f lift`의 전치·양쪽 D·질량·단위는 일치한다. + 실제 global BC의 exact null 처리와 원 MZ/KZ/PZ 검증에도 이 residual 실패를 설명하는 수식 오류를 발견하지 못했다. + 이는 실제 큰 모델의 forward accuracy 보장이거나 모든 입력 inventory의 독립 검증 완료를 뜻하지 않는다. +- Backend가 계산하는 `norm((A/s)x-mu*x)/norm(x)`는 해당 승인 metric이다. + 모드 진폭을 바꿔도 비율은 같고 물리 mass 정규화로 이 값을 낮추려는 변경은 근거가 없다. + +메인이 전달한 column20의 correction 전·후 actual rerun 진단값은 다음과 같다. + +| 관찰 | 이전 실행 | 최신 correction 후 실행 | +| --- | ---: | ---: | +| FEAST info / loop | 0 / 4 | 0 / 4 | +| trace epsout | 2.82730672643927457e-14 | 2.82488401287762986e-14 | +| full CSR rho_B | 1.42356735413003805e-10 | 1.48674481038207483e-10 | +| mirrored upper CSR rho_B | 1.42356735389686902e-10 | 1.48674481542089335e-10 | +| full/upper difference action norm | 1.24572423402534915e-17 | 1.38724134018909290e-17 | + +**해당 실행 판정: mandatory all-c residual failure confirmed.** FEAST가 실제 받은 symmetric upper operator에서도 +같은 기준을 넘으므로 full/upper symmetry roundoff는 이 실패의 원인이 아니다. +고정 `fpm[5]=1` trace stopping이 4회에서 충족된 결과이며 **최대20회 반복을 소진한 실패가 아니다**. +따라서 단순히 maximum loop를 늘리는 것을 확인된 원인 수정으로 제시할 수 없다. +작은 trace 변화나 `info=0`을 모든 eigenpair residual의 통과로 해석하지 않는다. + +최신 진단은 위 central Count·안정적 QR correction **이후 실행**이다. 확인된 구현 결함을 수정한 뒤에도 +승인 fixed controls로 얻은 이 모델의 결과가 mandatory all-c 기준을 충족하지 못한다. +이는 모든 잠재적 구현 결함을 배제한 증명은 아니지만, 현재 reference 성공 또는 기능 완료 판정을 막는 실제 evidence다. +전체 runner 통과가 있더라도 이 필수 residual/reference 실패를 대신 해소하지 않는다. + +FEAST stopping/control·후검증 기준·실패 retry 정책을 바꾸려는 경우에는 고정 C3/C5 계약의 +**사용자 결정과 관련 수치 재검토가 먼저 필요하다**. 구현 correction은 기존 계약 안에서 진행할 수 있으며, +mass·seed·N 변경, column20 제외 또는 실패 후 미승인 재시도의 근거가 되지 않는다. +이번 검토자는 actual rerun을 직접 실행하지 않았고 전달받은 진단값과 read-only 실행 경로를 대조했다. + + +### 남은 검증과 실행 경계 + +- **NR-IMP-10 / upstream-contract-conflict:** S3의 public static global moment failure는 exact numerical drilling torque에서 발생한다. `norm(e_M)=95/41476`, 현재 normalized metric≈7.328771e-4다. [독립 유도와 판단](implementation-review.md#implementation-numerical-review-s3-static)을 참조한다. 메인은 수정된 E2-C09 direct pencil/full Kq-F covariance 테스트 통과와 별도 public rejection 재현을 전달했다. 수학 case의 검증은 연결됐지만 public 지원 범위의 평형 충돌은 미해결이다. +- [Procedure integration tests](../../tests/integration/analysis/linear_frequency_procedure_test.cpp)는 S3 direct pencil/full residual covariance와 free panel의 여섯 near-zero mode/all-c evidence를 다룬다. Density4 및 length1024의 물리 단위변환에서 lambda·rotation amplitude·residual/energy를 검증하는 테스트도 추가됐고 메인은 최신 focused 통과를 전달했다. Wrong-mass/vector/constraint mutation 검증은 미완료다. +- Mass의 모든 warped Ck/rows·first spatial moment·두 mass의 독립 energy/Jensen·mesh 오차·rank20/rank5·physical rigid Gram, 독립 tangent inventory 및 frozen nonlinear/retained static 검증은 최초 상세의 coverage gap이 남아 있다. +- [Actual FEAST tests](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp)에 zero/positive known spectra의 lowest prefix와 Givens congruence로 회전한 close distinct spectrum/Gram 검증이 추가됐고 메인은 최신 focused 통과를 전달했다. C5 status·guard collision/역전·retry·budget·allocation 주입, repeated eigenspace projector 및 세 반복 재현성 evidence는 미확인이다. +- 메인이 전달한 최신 source checkpoint는 `22c9d44`이며 configured full runner는 **395개 중394 통과, 원본 eigen 1개 실패, 155.31초**다. Input/FEAST/procedure/writer focused41은 새 density·unit scaling을 포함해 모두 통과했다. 본 검토자는 실행 로그를 직접 재검증하거나 build/test를 실행하지 않았다. 필수 reference/physics 완료는 승인하지 않는다. +- 최초 원본 eigen 실행의 10669ms 뒤 column20 `eigenpair-validation-failed`는 위 actual rerun의 full/upper residual·loop/epsout evidence로 구체화됐다. 필수 reference/전체 기능의 성공 판정은 할 수 없다. +- 이번 후속 수정은 본 보고서뿐이며 과거 검토 상세는 보존했다. 상위 계약·source·tests·writer·Git·reference는 수정하지 않았고 reference·제외 예제는 열람하지 않았다. 잔여 위험은 mandatory residual와 public static 계약 충돌, near-aligned forward accuracy, geometry 평가점 밖 injectivity 및 필수 coverage다. + + + + +## S3 partial-BC 정적 평형 불일치 + +- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 검토일: `2026-09-09`. +- Finding: **NR-IMP-10 / upstream-contract-conflict**. [현재 보고서](implementation-review.md#implementation-numerical-review)의 추가 검토다. +- 입력: [S3 정식화](formulation-mass-stabilization.md), [E2-C09](numerical-review-cases.md), 채택 [C7](../mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls), 기존 [linear formulation §14.1](../linear-static-mitc4-shell/formulation.md), [linear I/O §6.5](../linear-static-mitc4-shell/io.md). + + +### 독립 수치 결론 + +`d=(3/5,0,4/5)`, node1 URZ만 free, applied moment `(-4/3,0,1)=(5/3)b`, +`M0=1`인 승인 S3에서 다음은 정확하다. Moment의 단위는 `[force·length]`다. + +\[ +\theta_{1Z}=7500/10369,\qquad +\gamma_1=d^T\theta_1=6000/10369,\qquad k_d=19/4800. +\] + +Physical stiffness의 spatial total moment는 0이지만, +`Kdrill`은 node1에 `tau_d=kd gamma1 d`를 더한다. `r=Kq-F`의 free 성분은 0이므로 +applied load와 **constrained full residual**을 더한 기존 global moment evidence는 + +\[ +e_M=\tau_d=(57/41476,\ 0,\ 19/10369),\qquad +\|e_M\|=95/41476\approx0.002290481242164143\ne0. +\] + +Global Z45° 회전에서는 `e_M'=Q e_M`이며 norm은 같다. Applied moment가 tangent라는 사실은 +partial global BC가 만든 `gamma1!=0`을 없애지 않는다. Load의 constrained X 성분을 추가해도 +`Ff=1`과 위 nonzero torque는 그대로다. Physical rigid representative의 회전은 `P_i Omega`이고, +full spatial `Omega`와 numerical drilling energy를 혼동하면 이 불일치를 놓친다. + +[기존 독립 oracle](numerical-review.md#numerical-review-evidence)의 첫 Python block을 그대로 실행한 뒤 +원 `K,q,F`에서 constrained `Kq-F`, 각 node의 `X cross R+RM`을 따로 합산했다. +현재 [global recovery](../../src/fesa/results/global_equilibrium_recovery.cpp) 193–249행과 같은 +정규화에서 `reaction moment scale=3.1253278233567374`, +`applied moment scale=5/3`, `eta_M=0.0007328771161369957`을 얻었다. +Fraction 산술의 위 exact torque와 일치한다. 따라서 기존 `1e-10` 검사가 실패하는 것은 예상된 결과다. +이것은 독립 수학 실행이며 C++/reference/solver 재실행이 아니다. + + +### E2-C09 검증 계층과 계약 경계 + +**E2-C09 자체는 public `LinearStaticProcedureExecutor::Execute`의 성공을 명시하지 않는다.** +S3, E2-C09 및 채택 C7의 해당 문장은 `thetaZ`, complete full `Kq-F`, same-BC/load 회전 공변성을 요구한다. +기존 독립 evidence도 direct1DOF partition solve로 이를 검증했고 zero global moment를 확인한 적은 없다. +따라서 production kernel의 complete K를 geometry/frame부터 재계산하여 `Kff theta=Ff`를 풀고, +전체 `r=Kq-F`와 원/회전 결과를 비교하는 **직접 pencil 테스트는 E2-C09에 맞는 검증**이다. +Constrained residual이 0이어야 한다는 의미로 complete residual 기준을 적용하지 않는다. +이는 case의 test layer를 바로잡는 것이며 threshold·물리·reaction 계약을 바꾸지 않는다. + +동시에 **public static 실패는 별개의 실제 계약 충돌로 남는다.** 기존 +[linear requirements](../linear-static-mitc4-shell/requirements.md)의 017–019는 이 global component BC와 +tangent CLOAD를 지원하고, 029/046/057 및 기존 I/O는 full residual reaction과 spatial global balance를 유지한다. +새 요구 024/027은 그 의미를 보존한다. 승인된 M2의 rotation-only drill penalty와 이 조합은 +S3에서 exact algebra상 동시에 public 성공 조건을 만족할 수 없다. +직접 테스트 통과만으로 public static 회귀가 해소되었다거나 이 입력이 새로 unsupported라고 선언하면 안 된다. + +**처리:** E2-C09의 algebraic 검증과 현재 public failure 재현은 따로 보존한다. +Global balance를 완화하거나 drill torque를 빼거나 reaction을 projection하거나 fixture BC/load를 바꾸어 실패를 감추지 않는다. +Public static의 해당 supported 범위까지 성공해야 하는 완료 판정을 내려면 메인이 formulation/requirements owner에게 +이 exact 반례를 전달하고, physics·지원 범위·recovery/acceptance 중 어떤 계약을 바꿀지 사용자 결정을 받아야 한다. +현재 numerical reviewer에게 그 변경을 자체 승인할 권한은 없다. Eigen S3의 finite-pencil target은 이 static 충돌로 바뀌지 않는다. + +후속 실행 전달: 메인은 E2-C09를 direct pencil/full `Kq-F` covariance 테스트로 수정하여 통과했고, +별도 public static 테스트는 현재 global-equilibrium rejection을 재현한다고 보고했다. +이는 수학 case와 public 실패를 분리해 검증한 evidence이며, 지원 범위의 상위 계약 충돌을 해결하거나 +public failure를 승인된 unsupported-input 진단으로 바꾼 결정은 아니다. + + + +> 이 절은 2026-09-10 residual stopping·후속 recovery 수정 이전의 발견 기록이다. +> Eigen all-c 잔차는 후속 수정으로 해소했고, 굽힘 단면력은 HHT 후속 작업에서 수정했다. +> 원래 실패 수치와 coverage 한계는 그대로 보존하며 S3는 보류다. + + + +## 구현 결과 물리 검토 + +- Feature: `mitc4-shell-feast-eigen2`; Owner: `physics-evaluation-agent`; 검토일: `2026-09-09`. +- 결론: **유지 대상 변위·평형 evidence는 타당하나 feature 완료 판정 불가**. 원본 eigen 필수 residual 실패, S3 public static 계약 충돌이 남는다. 별도로 기존 nonlinear 굽힘 단면력 복구 결함을 확인했다. +- 기준: [cases E2-C08/09/11/12/26](numerical-review-cases.md), [mass/stabilization S1–S3](formulation-mass-stabilization.md), [controls C3/C7](numerical-review-controls.md), [공통 tolerance](../TOLERANCE.md), [nonlinear I/O §7.5/8.5](../nonlinear-static-newton-raphson/io.md). 새 acceptance나 release 승인을 만들지 않는다. + + +### 직접 확인한 evidence + +아래 `A/B/C`는 이번 검토 시 허용된 각 경로에서 `LastWriteTime`으로 선택한 최신 결과다. HDF5를 `h5py.File(path, 'r')`로 읽어 계산했으며 solver/build/test는 재실행하지 않았다. 이후 구현 수정·재실행 결과로 자동 승계하지 않는다. + +| ID | Artifact | +| --- | --- | +| A | [.harness/build-ninja-msvc-debug/reference/mitc4-shell-s4-comparison/shell_results.h5](../../.harness/build-ninja-msvc-debug/reference/mitc4-shell-s4-comparison/shell_results.h5), 같은 폴더 [comparison.json](../../.harness/build-ninja-msvc-debug/reference/mitc4-shell-s4-comparison/comparison.json) | +| B | .harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-798076888102900-0/shellNL_results.h5(당시 경로: `../../.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-798076888102900-0/shellNL_results.h5`, 현재 checkout에 없음), 같은 폴더 `shellNL_log.txt` | +| C | .harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-798054727288300-1/shell_results.h5(당시 경로: `../../.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-798054727288300-1/shell_results.h5`, 현재 checkout에 없음) | +| Model/reference | [shell.inp](../../reference/shell/shell.inp), [shell displacements.csv](<../../reference/shell/shell displacements.csv>), [shellNL.inp](../../reference/shellNL/shellNL.inp), [shellNL displacements.csv](<../../reference/shellNL/shellNL displacements.csv>), [shellNL reactions.csv](<../../reference/shellNL/shellNL reactions.csv>) | + +두 모델은 `36 S4 / 49 nodes`, `[-5,5]×[-5,5]` 평판, `t=0.5`, `E=2.1e11`, `nu=0.3`, 외곽 24 node의 6 DOF 고정, 중앙 `(Part-1-1, node 2)`의 `FZ=-100000`이다. A/C는 linear, B는 `nlgeom=YES`, factor `0.1..1.0`의 10 accepted frames다. 단위계는 입력의 일관된 미지정 단위: 변위 `length`, 힘 `force`, 모멘트·에너지 `force*length`, 응력 `force/length²`, 굽힘 단면력 `force`다. SI로 추정하지 않는다. 제외된 원본·복사·cache 모델과 stress reference CSV는 열거나 사용하지 않았다. + + +### 변위, 대칭, 평형과 에너지 + +| 관찰 | 직접 계산/저장 결과 | 해석 | +| --- | --- | --- | +| A/C 하중 방향·크기 | 중앙 `UZ=-2.3550441765084857e-5`; `UX=UY=URZ=0`; `max|URX/Y|=7.55060026636933e-6` | 음의 Z 하중에 음의 처짐. `|UZ|/t=4.71009e-5`로 작은 변형 영역 | +| A 대칭 | X/Y 반사 node 대응의 `max|ΔUZ|=3.21873e-20 length` | 중앙하중·고정 외곽의 대칭과 일치. 이 수치는 별도 새 판정 기준이 아닌 관찰 | +| A 평형 | HDF5 `global/verification_metrics`: free residual `1.07747756e-14`, force `1.12049747e-14`, moment `2.35981342e-15` | 각각 기존 `1e-10` 이내 | +| A 에너지 | physical energy `1.1775220882542212`; `Fᵀu/2=1.1775220882542428`; 상대차 `1.82912e-14` | 양의 선형 변형에너지와 일치, 기존 energy `1e-12` 이내 | +| B 최종 변위 | 중앙 `UZ=-2.355044174560645e-5`; `max|UX/UY|≈8.79961e-12`; 반사 `max|ΔUZ|=7.41128e-17` | 작은 면내 응답과 대칭 유지. 큰 변형의 외부 검증으로 확대할 수 없음 | +| B 선형극한 | C 대비 중앙 UZ 상대차 `8.27093e-10`; 전체 translation 최대차/최대 linear translation `3.73649e-7` | 작은 하중의 nonlinear displacement가 linear에 접근. 단면력 일치까지 뜻하지 않음 | +| B 에너지·증분 | factor0.1 energy `0.011775220886841211`, factor1 energy `1.1775220868030056`; 모든 10 frame 양수·증가, 각 2 Newton iterations | 거의 factor² 에너지와 factor 비례 처짐. Nonlinear에서 `Fᵀu/2`를 일반 항등식으로 요구하지 않음 | + +B frame9의 `generalized_residual`에 **먼저 constraint mask**를 적용한 뒤 회전만 `J_l(phi)^(-T)`로 spatial 변환하고 current arm `X+u`를 사용했다. `|phi|<1.1e-5`에서 inverse-Jacobian의 안정적 소각 전개를 사용했다. 독립 합산은 저장된 `/global/equilibrium`과 roundoff 범위에서 일치한다. + +- Constrained resultant force: `(-5.88263e-12, 6.25300e-12, 100000.00000082512) force`. Applied force `(0,0,-100000)`을 상쇄한다. Reference CSV 전체 RF 합의 Z는 `99999.99959279996 force`; 이는 review-only 관찰이다. +- Constrained resultant moment about origin: `(-5.63887e-11, 3.63798e-11, -4.17886618386e-5) force*length`. 중앙 applied force arm은 사실상 0이다. +- I/O §8.5의 nodal norm-sum scale은 force `100000.00439300563`, moment `780242.2734309232`. 독립 normalized force `8.25134e-12`, moment `5.35586e-11`로 각각 기존 factor-one `1e-8` 이내다. 저장 balance Z-force `8.25122697279e-7`, Z-moment `-4.17886618392e-5`를 zero-clamp하지 않았다. +- Accepted free residual: force infinity norm `0.031462885121074535 force`, matching external scale `100000`, internal-inclusive scale `100000.00000106206` → relative `3.14629e-7 <= 1e-2`. Moment infinity norm `3.3292018315478344e-6 force*length`, matching external scale exact0 → 기존 typed absolute `1e-3` 이내. 이 accepted residual과 global balance는 서로 다른 관찰이다. + + +### 외부 변위 비교와 복구 결함 + +A comparison JSON은 49 nodes × 6 components의 294행, blocking U와 warning-only UR 각각 147행, 실패행·warning 0이다. U relative RMS `0.0010332756650397166`, UR `0.0029771372973060382`로 기존 `0.01` 이내다. + +B는 실제 CSV/HDF5의 `(case-insensitive instance, source node label, component)`를 직접 대응했다. 49개의 유일 node identity가 일치하고 값이 모두 유한하다. 같은 공통 tolerance로 U relative RMS `0.0010332757195474177`, UR `0.0029771373238648216`, 각 family 실패행 0이다. Reaction CSV를 blocking 비교로 승격하지 않는다. 변위 수치 일치는 아래 복구 결함을 검출하지 않는다. + +**PE-IMP-01 — 기존 nonlinear 굽힘 단면력 복구 결함, 구현 owner 인계.** B frame9 `(Part-1-1, element 3, midsurface GP2)`의 `S11` bottom/middle/top은 `[313254.63790344447, 3.694293034163272, -313246.91989287396] force/length²`이다. [nonlinear formulation §13.3](../nonlinear-static-newton-raphson/formulation.md)의 `M11=∫z S11 dz`, `z∈[-t/2,t/2]`와 평판의 두께 stress polynomial에서: + +`M11 = t²/12 * (S11_top-S11_bottom) = -13052.1157874233 force`. + +그러나 HDF5 `section_resultant[...,3]`는 `-26104.23157284045 force`, 비율 `1.999999999846297`이다. A의 같은 적분은 저장 M과 최대차 `9.09495e-12 force`로 일치한다. B의 모든 row/component 중 최대 굽힘 오차는 `13052.11578541715 force`다. + +메인의 추가 읽기 허가로 [nonlinear recovery source](../../src/fesa/elements/nonlinear_mitc4_shell.cpp#L1243)를 확인했다. 두께 Gauss moment 가중치가 `0.25*t*zeta*stress`이므로 `z dz`가 요구하는 `0.25*t²*zeta*stress`의 thickness 한 개가 빠져 있다. `t=0.5`의 2배 차이와 직접 연결되며 차원도 맞지 않는다. 해당 파일의 `git diff HEAD -- `는 비어 있다. 따라서 **현재 eigen 변경이 도입한 결함이라는 근거는 없고 HEAD에도 존재하는 복구 결함**이다. 코드 수정이나 새 gate를 수행하지 않았다. Finite stress/strain, 양의 에너지, U/UR 통과만으로 nonlinear section-resultant 물리 타당성을 주장할 수 없다. + + +### Eigen/S3와 남은 범위 + +- **원본 eigen 미해결:** 메인의 최신 actual FEAST 전달값은 `676 shells / 729 nodes`, `nf=3750,nz=625,n=3125,N=10`, `c=22,m0=33,loop=4`, column20 `rho_B=1.48674481038207483e-10 > 1e-10`이다. Symmetric upper operator에서도 `1.48674481542089335e-10`이다. 요청 10개 밖이어도 all-c 검증 대상이므로 버릴 수 없다. Accepted modal HDF5와 Value reference comparison이 없으므로 원본 modal energy·mass normalization·mode shape 물리 검증은 **미실시**다. 최신 실패값은 메인 실행 전달이며 이 검토자가 eigen artifact를 직접 읽은 값이 아니다. +- **S3 public static 충돌:** [독립 수치 검토](implementation-review.md#implementation-numerical-review-s3-static)의 `thetaZ=7500/10369`, `lambda=10369/450`과 complete `Kq-F` 회전 공변성은 direct pencil 검증이다. `gamma1=6000/10369`에서 미상쇄 drilling torque `(57/41476,0,19/10369) force*length`, norm `95/41476≈0.002290481242164143`, normalized spatial moment `0.0007328771161369957 > 1e-10`가 남는다. 메인은 direct 검증 통과와 별도 public rejection 재현을 전달했다. 지원되는 static 성공을 의미하지 않으며 기존 reaction/global-balance 의미와의 계약 충돌 해결은 formulation/requirements owner와 사용자 결정 사항이다. +- **전달받은 synthetic 통과의 한계:** 작은 S3 eigen, free panel 여섯 rigid near-zero modes 및 all-c Gram, nonlinear tangent/objectivity/force/moment/free residual/energy/rollback 통과는 메인 실행 전달이다. 이번 검토자는 해당 test output을 직접 열지 않았다. Massless drill null과 양의 질량을 가진 physical rigid modes를 구분하는 근거이지만 큰 원본 모델 성공을 대신하지 않는다. +- Retained 외부 모델은 같은 평판의 매우 작은 변형이다. Arbitrary curved/director, 큰 회전·큰 변형의 외부 정확도, pressure external fresh comparison, modal stress/reaction, 일반 mesh 수렴은 여기서 검증하지 않았다. Synthetic pressure 통과가 외부 pressure coverage를 채우지 않는다. + +검토 변경은 이 보고서뿐이다. 계약·허용오차·source·test·output·reference는 수정하지 않았다. 후속 action은 원본 eigen 실패와 S3 계약 충돌의 owner 처리, PE-IMP-01의 기존 recovery 결함 분리 추적이다. + + + + +## FEAST residual stopping 독립 검토 + +- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 2026-09-10. +- 범위: 사용자 승인 `fpm[5]:1→0`, `[2]=12`, `[3]=20` 유지. S3는 보류 상태를 유지한다. +- 판정: **`PASS` — 승인된 종료 제어 변경**, **`FAIL` — 원본 외부 Value acceptance**. + 전체 기능 완료 판정이 아니다. +- 기준: [PRD](PRD.md), [ADR](ADR.md), [E4–E7](formulation-eigen.md), + [C3/C5](numerical-review-controls.md), [I/O](io.md#io-schema), [TOLERANCE](../TOLERANCE.md). + + +### 판단과 필요한 확인 + +| 항목 | 독립 판단 | +| --- | --- | +| 종료 기준 | [Intel C parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)는 `[5]=0` residual, `1` trace이며 double epsilon은 `10^-fpm[2]`임을 명시한다. `1e-12` vendor stopping과 독립 all-c `1e-10`은 서로 다른 metric이다 | +| 불변 수식 | `B=A/s`, `mu=lambda/s`는 무차원이고 `rho_B=norm2(Bx-mu x)/norm2(x)`도 무차원이다. 종료 시점만 바뀌며 K/M, 부호·단위·DOF 순서, 적분, whitening, raw sort, 복구·state commit 식은 그대로다 | +| 전체 c | 요청 N 밖을 포함한 c개 residual과 pairwise/Frobenius Gram 검증 후 첫 N개를 공개해야 한다. FEAST 성공이나 작은 epsout으로 생략할 수 없다 | +| Zero·반복군 | 정확한 zero의 backend residual이 비유한이면 기존 available=false 표현을 유지한다. 독립 zero identity와 nonzero vector·Gram은 검증한다. Residual stopping에서 zero/mixed-zero의 실제 성공 여부는 실행으로 확인해야 하며 trace fallback을 추가하지 않는다. 반복군은 multiplicity·공간·Gram으로 판단하고 개별 벡터 방향의 유일성을 요구하지 않는다 | +| 상태·metadata | `SetControls`를 count/solve마다 재초기화하며 count의 `[49]=1` reset을 다음 solve에 전파하지 않는다. `base_fpm[5]=0,[2]=12,[3]=20`은 실제 새 HDF5에서 확인한다. `epsout`은 기존 trace 변화 진단량이며 residual stopping 지표로 이름·의미를 바꾸지 않는다 | +| 실패·안정성 | Refinement 최대20, bounded interval/capacity retry와 독립 검증 실패 즉시 종료를 유지한다. 새 종료 조건에서도 모든 conditioning의 수렴을 보장하지 않는다. Source의 미수렴/status/budget/allocation 전체 실패 주입 coverage는 기존 미완료 위험으로 남는다 | + +검토 source: [backend](../../src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp), +[기존 backend tests](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp). +추가로 [writer 검증](../../src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp)의 `[5]=0` 제한과 +[실제 HDF5 readback·변조 거부 검사](../../tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp)를 +대조했다. Schema의 field/type/layout 변경 없이 승인된 control 값만 일치시킨다. +본 검토자는 source/tests를 변경하거나 build/test를 중복 실행하지 않고 메인의 실행 로그를 대조했다. + + +### 새 실행 evidence + +개인 `.harness/config.json`과 preset의 MSVC x64 Debug·oneMKL 2026.1 설정을 확인했다. + +| Evidence 경로 | 확인 결과 | +| --- | --- | +| `.harness/feast-residual-red.log` | 변경 전 backend와 실제 HDF5에서 `[5]=1`을 읽어 새 `[5]=0` 검사 두 개가 실패함 | +| `.harness/feast-residual-focused.log` | 12개 중 11 통과. Backend 10개는 n1/all-zero/mixed-zero/repeated40 prefix/close distinct·Givens/negative/invalid/thread 복원 포함. Writer 한 개는 실제 control readback·trace로 변조한 candidate 거부 포함 | +| 같은 focused log의 원본 reference | Application 성공 후 Value 비교까지 진행했으나 10 singleton 중 9개 실패. 기존 독립 residual 차단과 다른 외부 acceptance 실패이며 전체 검사가 통과한 것은 아님 | +| `.harness/feast-residual-full-run.log` | 구성된 전체 build/test에서 CTest 395개 중 394 통과, 원본 Value reference 한 개 실패, CTest exit8, 실행178.42초. 전체 통과 아님 | +| `.harness/build-ninja-msvc-debug/feast-residual-metrics.json` | `.harness/build-ninja-msvc-debug/extract_feast_residual.py`가 공식 원본 sibling HDF5를 read-only 추출한 값. 스크립트의 실제 dataset·mode_id 대응과 JSON을 대조함 | + +원본 새 HDF5에서 `c=22,m0=33,info=0,loop=6`, controls `[2]=12,[3]=20,[5]=0`, +`epsout=2.4227135616446226e-17`을 확인했다. 전체 c개의 최대값은 다음과 같다. + +| Metric | 실제 최대값 | 판정 기준 | +| --- | ---: | ---: | +| 독립 rho_B | `1.605467212112365e-13` | `<=1e-10`, PASS | +| Original-free eta_r / whitened eta_w | `9.981033437726324e-15` / `7.315529163435965e-15` | 각각 `<=1e-10`, PASS | +| Gram eta_gram / max_eta_orth | `1.3777964580680282e-15` / `1.6958335496991244e-15` | 각각 `<=1e-10`, PASS | +| Backend res | `8.280018892001454e-13` | vendor 진단량, 독립 rho_B 대체 아님 | + +Value 행별 상대오차는 전부 5% 이내지만 Mode2–10의 singleton RMS는 1%를 초과한다. +Mode1은 `0.5648341627%`로 PASS, Mode2–10은 `1.3496440956%`–`4.2613310845%`로 FAIL이다. +양의 singleton은 RMS가 relative error와 같다는 [승인된 family 계약](reference-model.md)을 +그대로 적용했다. 행 5%만으로 전체 PASS를 선언하거나 frame을 합쳐 RMS를 완화할 수 없다. +**필요한 후속 correction:** 메인이 이 외부 불일치의 원인·모델 가정을 별도 조사해야 한다. +현재 evidence만으로 질량·stabilization 등 특정 물리 식이 원인이라고 단정할 수 없다. + +반복군 검사 통과를 모든 projector·3회 결정론·vendor 실패 주입 coverage 완료로 확장하지 않는다. + + +### Trace stopping 이력과 잔여 위험 + +[기존 실행 기록](implementation-verification.md)의 trace stopping 실패는 +`n=3125,N=10,c=22,m0=33,info=0,loop=4`, raw solver column20의 +`rho_B=1.48674481038207483e-10>1e-10`, `epsout=2.82488401287762986e-14`다. +Full/upper action 차이 `1.38724134018909290e-17`은 해당 실패 크기를 설명하지 못한다. +이 관찰은 trace 수렴이 각 vector residual 통과를 보장하지 않는 실제 반례이며, +새 제어의 개선 정도·통과 여부를 선취하지 않는다. + +공통 외부 정책은 필요한 row의 누락·추가·중복·비유한을 tolerance 전에 거부하고 승인된 +Value family에 적용한다. 독립 modal 허용오차를 외부 reference tolerance로 대체하지 않는다. +S3 정적 계약 충돌과 기존 nonlinear recovery 문제, 27개 case 전체 세부 coverage 미완료는 +[기존 독립 검토](implementation-review.md#implementation-numerical-review)의 별도 제한으로 남는다. + + + + +## 첫 구현 acceptance 독립 검토 + +- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 2026-09-10. +- 판정: **`PASS` — 사용자 승인 첫 구현 범위**. S3와 후속 정확도 개선은 보류 상태다. +- 적용: 사용자 승인 외부 Value 5%, [PRD](PRD.md), [ADR](ADR.md), + [TOLERANCE](../TOLERANCE.md), [reference-model](reference-model.md), + [필수 cases](numerical-review-cases.md), [내부 controls](numerical-review-controls.md). + + +### 승인 경계와 수치 판단 + +원본 Mode1–10은 source `Step-2`의 독립 modal-frame singleton이다. 첫 구현 profile +`mitc4-eigen-first-implementation`은 각 `Value`의 reference-only relative error와 RMS를 +각각 .05로 검사한다. 경계 포함이며 family를 합치거나 mode를 평균하지 않는다. +다른 공통 comparison의 RMS .01, missing/extra/duplicate/nonfinite 거부, zero-scale exact-zero, +내부 전체 c개의 residual/Gram `1e-10`은 유지한다. + +[종료 제어 검토](implementation-review.md#implementation-feast-residual-review)의 원본 최대 Value 오차 +`4.2613310845%`는 승인된 새 5% 범위 안이다. 새 comparator의 실제 focused 실행에서 +원본 10개 family가 통과했다. 기존 1% FAIL 기록은 당시 판정으로 보존한다. 수식·DOF·단위·적분· +mass·whitening·복구·state update는 이번 외부 정책으로 바뀌지 않는다. + + +### 필수 보강과 추가 검증 한계 + +| 분류 | 요구·현재 evidence·필요한 보강 | +| --- | --- | +| 확인 — backend 실패 | REQ012/019, C21/C22. Fatal count·optional info1 fallback, final count 불일치·변경 없는 solve 반복 금지, info2의 더 큰 구간 retry, 요청 N 밖 고유벡터의 실제 residual 초과 및 nonfinite/Gram 거부 통과. Production이 사용하는 동일 budget helper의 511/512·363/364, size product·PTRDIFF/container 경계, 실제 count/solve workspace bad_alloc·thread 복원 및 초기 count3회 한계를 검사 | +| 확인 — raw·순위·반복군 | C18/C19/C21. 증가 upper의 감소 count 거부, raw -1e-12와 -1e-9 보존 및 -1e-9 바로 아래 실패 통과. 작은 isolated repeated군을 세 번 실제 FEAST로 풀어 순서·history와 승인된 Frobenius projector/sqrt(2r) metric을 비교 | +| 확인 — mass oracle·단위 | REQ005/014/026, C02/C03/C05. 48개 rational Ck/각 row·first spatial moment, theta×d 부호의 C1 cross-block·C2 rotary block과 두24×24 질량, pairwise Jensen의1/2 및2*C1 항을 대조. Scalar는 m_e(t/2)^k, matrix는 D Frobenius norm합, Jensen 차이는 qMLq+qMCq로 정규화. Proper Q+shift를 geometry/director부터 재계산하여 두 mass의 공변성 통과 | +| 확인 — 공유 node assembly | REQ003/004/007, C06. rho2/t.5와 rho5/t1의 공유 node URX만 free인 patch에서 mass7/64, local K합/m와 modal amplitude²*mass1, element source order 변화의 결과를 확인. Model-level BC로 fixture를 바로잡은 뒤 통과; parser 지원 범위를 넓히지 않음 | +| 확인 — final 보존 | REQ019, C24. Eigen candidate 변조·empty pencil 보존 및 실제 valid HDF5에 Win32 delete-sharing lock을 걸어 close/self-check 뒤 replace 실패·원본 bytes 보존 통과. 공통 AtomicFinalizeValidatedCandidate의 실패 경로와 연결 | +| 확인 — 5% 한정 정책 | C25. ±5% 경계와 바로 밖, zero/nonfinite·identity 거부, common RMS1% 보존, actual profile metadata와 원본 10 family fresh 비교 통과. 아래 focused evidence와 source 대조 | +| 사용자 명시 보류 | S3의 public static moment 충돌. Direct pencil/covariance 검사의 성공과 구별하고 지원 정적 사례의 성공으로 표시하지 않는다 | +| 추가 검증의 한계 | 모든 조건수·geometry injectivity·mesh spectrum 수렴차수·vendor/OS 오류 조합·임의 반복군 방향은 보장하지 않는다. H5Fclose 오류 자체와512회 actual vendor 호출은 미실행이다. CloseChecked 실패는 RequireHdf5→catch/cleanup→replace전 종료를 정적으로 대조했고 budget은 실제 사용 helper의 경계 검사다. 대표 분기 검증을 모든 오류 조합 전수 검사로 확대하지 않는다 | + +검토 대상 tests: [mass contract](../../tests/unit/elements/mitc4_shell_mass_contract_test.cpp), +[mass/kernel](../../tests/unit/elements/mitc4_shell_test.cpp), +[공유 node assembly](../../tests/unit/analysis/eigen_mass_assembly_test.cpp), +[reduction](../../tests/unit/analysis/eigen_reduction_test.cpp), +[backend](../../tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp), +[procedure](../../tests/integration/analysis/linear_frequency_procedure_test.cpp), +[writer](../../tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp), +[common finalize](../../tests/unit/io/hdf5/hdf5_writer_components_test.cpp). +Source의 guard 존재와 실제 실패 주입 통과를 구분한다. 검토자는 source/tests·상위 계약·reference를 +수정하지 않고 메인의 fresh 결과를 대조한다. + + +### 실행 evidence + +- `.harness/eigen-first-implementation-focused.log`: comparator/policy 10/10 PASS, + 원본 실제 해석→HDF5→10개 family 비교 포함. 정책 코드의 공통 Evaluate는 RMS .01을 + 유지하고 named entry는 blocking singleton `Value`만 허용한다. +- 독립 재계산: [기존 rational coefficient 적분](numerical-review.md#numerical-review-evidence)의 Python을 + 표준 라이브러리로 새 실행하고 mass test의 48개 rational 상수를 Fraction으로 대조하여 + 전부 exact 일치를 확인했다. 이종 두 요소 공유 node의 rotary mass도 + `2*(1/2)^3/48+5/48=7/64 [M L²]`로 독립 확인했다. 이는 C++ 실행 대체가 아니다. +- `.harness/eigen-first-implementation-coverage.log`: 31개 중30 PASS. Backend24개·writer + 통과, C06 fixture의 BC 위치만 실패했다. `.harness/eigen-first-implementation-mass.log`에서 + fixture와 정규화 보강 뒤 mass6/6 PASS를 직접 확인했다. +- `.harness/eigen-first-implementation-boundaries.log`: raw negative와 count monotonicity 경계2/2 PASS. +- `.harness/eigen-first-implementation-full-run.log`: MSVC x64 Debug의 configure/build/ + discovery/CTest 모두 exit0, **417/417 PASS**, 166.86초. Unit339/integration42/reference36. + 같은 build의 `Testing/Temporary/LastTest.log`에서도 Passed417/Failed0와 원본 reference + 실행을 직접 확인했다. 과거 C06 실패를 담은 `LastTestsFailed.log`는 최신 판정 근거로 사용하지 않는다. + +이번 검토에서 추가 numerical correction은 필요하지 않다. 독립 내부 기준과 새 외부 +정책의 실행 연결을 확인했으며, 모든 vendor·OS 실패 조합이나 S3 해결·Abaqus 내부 절차 +동등성을 승인한 판정은 아니다. [이전 물리 검토](implementation-review.md#implementation-physics-review)의 기존 +nonlinear recovery 제한도 이 변경으로 해소됐다고 주장하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/implementation-verification.md b/docs/mitc4-shell-feast-eigen2/implementation-verification.md index 8ace32b..4a1faba 100644 --- a/docs/mitc4-shell-feast-eigen2/implementation-verification.md +++ b/docs/mitc4-shell-feast-eigen2/implementation-verification.md @@ -4,10 +4,10 @@ - 현재 판정: **사용자 승인 첫 구현 범위 PASS**. FEAST 잔차 초과를 해소했고 외부10개 Value가 모드별5% 기준을 충족한다. S3와 후속 정확도 개선은 보류한다. 아래 2026-09-10 결과가 최신이며 2026-09-09 trace 실행은 당시 evidence로 보존한다. - 기준: [프로젝트 지침](../../AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), - [정식화](formulation.md), [수치 controls](numerical-review-controls.md), [I/O](io.md). -- 독립 검토: [수치](implementation-numerical-review.md), - [S3 정적 계약](implementation-numerical-review-s3-static.md), - [물리](implementation-physics-review.md), [FEAST 종료 변경](implementation-feast-residual-review.md), [첫 구현 최종 검토](implementation-first-version-review.md). + [정식화](formulation.md), [수치 controls](numerical-review-controls.md), [I/O](io.md#io). +- 독립 검토: [수치](implementation-review.md#implementation-numerical-review), + [S3 정적 계약](implementation-review.md#implementation-numerical-review-s3-static), + [물리](implementation-review.md#implementation-physics-review), [FEAST 종료 변경](implementation-review.md#implementation-feast-residual-review), [첫 구현 최종 검토](implementation-review.md#implementation-first-version-review). ## 2026-09-10 첫 구현의 5% 수용과 검증 보강 @@ -49,7 +49,7 @@ Close 실패는 기존 checked-close→exception→candidate 정리/기존 final 추가 테스트 작성 중 nested initializer와 lambda capture의 컴파일 오류를 수정한 뒤 MSVC x64 Debug build가 성공했다. 실패한 빌드 뒤 등록되지 않은 테스트의 `No tests were found`를 PASS로 -계산하지 않았다. [첫 구현 독립 검토](implementation-first-version-review.md)는 새 oracle와 +계산하지 않았다. [첫 구현 독립 검토](implementation-review.md#implementation-first-version-review)는 새 oracle와 failure/acceptance evidence·전체 실행을 대조하고 **사용자 승인 첫 구현 범위 PASS**로 판정했다. 임의 모델 정확도나 외부 release를 보장하는 판정은 아니다. @@ -79,7 +79,7 @@ Read-only 추출 스크립트와 JSON은 최종적으로 ignored build directory 그 directory의 `feast-residual-metrics.json`과 `feast-residual-full-metrics.json`이 각 실행의 기록이다. 개인 환경·추출 스크립트·기계 생성 로그/결과는 커밋하지 않는다. 이 작업에서 Python Harness suite는 실행하지 않았다. -원본 [결과 HDF5](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_results.h5)는 +원본 결과 HDF5(당시 경로: `../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_results.h5`, 현재 checkout에 없음)는 이번 실제 해석이 새로 생성한 공식 sibling output이다. 생성과 closed-file self-check는 성공했고, 기존 외부 INP/TXT의 실행 전후 bytes는 reference test에서 보존을 확인했다. diff --git a/docs/mitc4-shell-feast-eigen2/io-input.md b/docs/mitc4-shell-feast-eigen2/io-input.md deleted file mode 100644 index 87c2201..0000000 --- a/docs/mitc4-shell-feast-eigen2/io-input.md +++ /dev/null @@ -1,140 +0,0 @@ -# MITC4 eigen 입력·진단 계약 - -- Feature ID: `mitc4-shell-feast-eigen2` -- Owner: `io-definition-agent` -- Contract revision: `r1` -- 기본 보고서: [io.md](io.md) - -## 문법과 기존 지원 범위 - -기존 [shell 입력](../linear-static-mitc4-shell/io.md#1-abaqus-input-scope)과 -[후속 lexical 계약](../shell-surface-pressure-load/io.md)을 유지한다. 현재 -[input_reader.cpp](../../src/fesa/io/abaqus/input_reader.cpp)와 -[domain_mapping_context.cpp](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 대조했다. -LF/CRLF, 종결자 제외 physical line 256 ASCII bytes, printable ASCII/tab, blank와 `**` -comment, keyword parameter continuation은 기존 규칙을 따른다. Inline comment, data -continuation, include/substitution/quoted name을 추가하지 않는다. Keyword·parameter·enum· -name lookup은 ASCII case-insensitive이며 raw spelling/physical source line은 보존한다. -Duplicate parameter는 같은 값이어도 실패한다. Comma split은 빈 field를 보존한다. - -Eigen model의 순서는 `HEADING? PREPRINT? PART+ ASSEMBLY MATERIAL+ BOUNDARY* STEP EOF`다. -Part 내부 NODE→ELEMENT→sets→SHELL SECTION, assembly의 identity INSTANCE와 explicit-instance -sets, forward section→material lookup은 기존 shell 범위다. `S4`와 `S4R`는 source type만 -구별하고 같은 FESA MITC4 kernel에 대응한다. Node/element positive int64 source label, -instance/name scope, element 네 distinct nodes, section 유일 할당, geometry-derived director, -centered finite thickness>0, homogeneous isotropic `E>0,-1finite_dimension`과 빈 finite system은 equation 구성 뒤 model 실패다. - -공개 Abaqus convention의 근거는 [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), -[DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm), -[STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm)이다. -2026-09-08 직접 확인했다. 위 allowlist와 warning은 FESA의 지원 차이이며 Abaqus algorithm· -SIM·parser 내부 구현의 동등성을 주장하지 않는다. - -## Homogeneous BC와 result-neutral allowlist - -BOUNDARY는 model 또는 FREQUENCY 뒤/output 앞에 parameter 없이 -`target,first,last[,value]`로 둔다. `1<=first<=last<=6`; value 생략은 exact0, 명시 value는 -finite exact0만 허용한다. 빈 fourth field는 생략으로 보지 않는다. 기존 bare source label 또는 -unambiguous node-set resolver와 assembly INSTANCE binding을 사용한다. 새로운 dotted target, -local/tangent BC, MPC를 추가하지 않는다. Model BC→step BC 순서의 zero constraint union이며 -같은 zero 재선언은 같은 constraint다. Nonzero를 상쇄·override해서 통과시키지 않는다. -Global DOF는 `UX,UY,UZ,URX,URY,URZ`; partial rotation BC를 그대로 유지한다. - -| Keyword | 정확한 조합·위치; 모두 data 없음 | -| --- | --- | -| PREPRINT | Optional top-level, ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO 네 개 | -| RESTART | FREQUENCY/BC 뒤, WRITE flag와 FREQUENCY=0 | -| OUTPUT | FREQUENCY/BC 뒤, FIELD 또는 HISTORY flag 하나, optional VARIABLE=PRESELECT | -| NODE OUTPUT | 활성 OUTPUT FIELD 아래, VARIABLE=PRESELECT | -| ENERGY OUTPUT | 활성 OUTPUT HISTORY 아래, VARIABLE=ALL | - -Parameter 순서는 자유이며 duplicate/extra parameter는 실패한다. OUTPUT root/RESTART/END STEP은 -이전 output scope를 닫는다. 모든 허용 no-op keyword마다 `ignored-input-keyword` warning과 -`mandatory-eigen-output-unchanged` 이유를 기록한다. 선택·억제·restart state를 생성하지 않는다. -Unknown output variable row/child, restart READ/nonzero frequency는 실패한다. - -어떤 위치의 CLOAD/DLOAD/DSLOAD(값0 포함), initial state/stress/temperature, damping, -amplitude, acoustic/beam/solid/mixed model, concentrated/nonstructural mass, composite/offset/ -variable thickness, contact/MPC/TIE, transform/orientation/explicit director, surface 등 의미 있는 -미지원 입력은 fail-closed다. 이름 `shellNL` 또는 `Step-2`에서 preload를 추정하지 않는다. - -## 진단 - -기존 record `severity,code,file,line,keyword,entity_identity,message`와 CLI category를 유지한다. -File은 absolute lexical normalized path, line은 1-based; entity에 source instance/material/ -element/node/step와 DOF 또는 field ordinal을 연결한다. Backend 오류도 Frequency 위치를 붙인다. -Warnings는 기존 SortDiagnostics와 same-key discovery order다. Fatal은 첫 원인을 유지하고 -후속 solve/commit을 중단한다. 수치값은 round-trip decimal로 보고하며 임의 tolerance를 붙이지 않는다. - -| 실패 | Code | Exit | -| --- | --- | --- | -| Lexical/arity/duplicate parameter/unresolved | 해당 기존 code: invalid-input-character, input-line-too-long, invalid-data-arity, duplicate-entity, unresolved-reference 등 | 3 | -| Density scope/malformed data/options/duplicate | invalid-density-data / unsupported-density-option / duplicate-density | 3 | -| Active rho missing / nonfinite·nonpositive·conversion range | missing-material-density / invalid-material-density | 4 | -| Frequency options/count/data | unsupported-frequency-option / invalid-frequency-data | 3 | -| Multiple/preload/other procedure | unsupported-analysis-procedure | 3 | -| Nonzero prescribed BC | unsupported-eigen-boundary | 3 | -| Other unsupported model semantics | unsupported-keyword / unsupported-element-formulation / unsupported-mixed-element-model | 3 | -| Existing geometry/material/section invalid | 기존 model code; 새 mass point 오류 invalid-shell-mass-geometry | 4 | -| Empty finite system / N>n | empty-eigenproblem / insufficient-finite-modes | 4 | -| Mass-space/conditioning/backend/numerical failure | [mapping의 solver diagnostics](io-mapping.md#실패와-공개-lifecycle) | 5 | -| Log/candidate/self-check/finalization | 기존 output category | 6 | - -Usage2/success0와 stderr escaping은 기존 공통 CLI 계약이다. 지원되는 입력의 conditioning -실패를 input subset 축소나 인공 mass/zero clamp로 우회하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/io-mapping.md b/docs/mitc4-shell-feast-eigen2/io-mapping.md deleted file mode 100644 index 8104d0e..0000000 --- a/docs/mitc4-shell-feast-eigen2/io-mapping.md +++ /dev/null @@ -1,138 +0,0 @@ -# MITC4 eigen 내부 mapping·reference projection - -- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r2` (외부 Value acceptance만 변경). -- 기본 보고서: [io.md](io.md). 수학 원본: [formulation-eigen](formulation-eigen.md). - -## 내부 소유권과 identity - -| Owner | 필수 의미와 mapping | -| --- | --- | -| ParsedInput | 실제 input bytes의 기존 content identity, lexical path, keyword/parameter presence·raw 값·빈 data slot·source line | -| Domain | 전체 geometry/source topology, section→material→constant rho, 원형상 director, homogeneous BC, sole Frequency definition; 파싱 후 가능한 불변 | -| Frequency definition | source step raw/canonical name, step/Frequency/data 위치, requested N, 각 option의 explicit presence/effective value, no-op warning inventory; storage Step-1과 구별 | -| AnalysisModel | Domain보다 짧은 수명의 활성 shell/material/section/BC/procedure const non-owning view | -| DofManager | Source node×고정 6 DOF, full/free/constrained injection, stable equation IDs/scatter/sparse pattern; Node/Element에 equation ID를 저장하지 않음 | -| Assembly/procedure | 실제 consistent moment→derived lumped→개선 K, 같은 source scatter/reduction; E1~E7의 constraint-first split·whitening·FEAST·복구·all-c validation | -| Private backend | Vendor CSR/index/workspace/FEAST control·runtime·call evidence; MKL type/header를 public core에 노출하지 않음 | -| Eigen state | Candidate/accepted 분리, N개의 paired raw scalar/global vectors, source mapping, c개 validation evidence; static/Newton state를 mode count로 재사용하지 않음 | -| ResultsWriter | Validated state serialization→closed candidate self-check→final replacement; 물리값·identity 재계산/보정으로 실패를 숨기지 않음 | - -Source `(instance_name,numeric source label)`과 raw spelling, internal model row, free equation -index, FEAST column, sorted rank, public mode ID는 별개다. Instance expansion/declaration의 기존 -model 순서와 DOF `UX,UY,UZ,URX,URY,URZ` 순서를 유지한다. Source renumbering 비교는 -geometry/connectivity/BC 대응을 함께 사용하며 숫자가 우연히 같은 internal ID를 source key로 -대체하지 않는다. Repeated eigenvalues는 별개 rank이며 특정 vector 방향의 유일성을 요구하지 않는다. - -Raw consistent 계산을 lumped로 덮어쓰지 않는다. Global dense mass dump는 필수 결과가 아니다. -실제 constrained free space에서만 analytic null을 제거하며 tiny positive mass를 rank cutoff로 -삭제하지 않는다. `requested N`, finite dimension n, count의 overwritten m0, allocated m0, -solve returned m, validated c, public N을 각기 보존한다. 모든 c를 검증한 뒤 첫 N을 공개한다. - -## 실패와 공개 lifecycle - -Public CLI·path·lock·log는 [현재 공통 계약 §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 -유지한다. `fesa.exe `이며 output override를 추가하지 않는다. Input lexical sibling은 -`_results.h5`와 `_log.txt`다. 마지막 `.inp` extension만 제거하고 basename case· -앞선 dot은 보존한다. Symlink/junction을 resolve해 결과 위치를 바꾸지 않는다. - -1. Usage 검증→derived pair의 exclusive nonblocking ownership→live log open/truncate. -2. Parse/model/solve/all-c validation을 candidate에서 수행한다. 기존 accepted state/final은 유지한다. -3. Candidate state를 완성하고 log close 성공을 확인한다. 같은 directory의 exclusive-create private - HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다. -4. Final replace가 성공한 뒤 준비된 state를 no-fail swap한다. 이후 allocation/validation/callback - failure를 남기지 않는다. 실패 candidate는 authoritative 결과가 아니다. - -제어된 solve/validation/write/flush/close/reopen/self-check/replace 실패에서 이전 valid final과 -state를 보존한다. 이전 final이 없으면 만들지 않는다. Log는 별도 live lifecycle이며 rollback하지 -않는다. Eigen log에는 Newton iteration/FEAST trace를 새로 쓰지 않고 정상 log는 zero-byte다. -Backend evidence는 아래 result/Status에 둔다. Lock 실패는 기존 log/final도 건드리지 않는다. -Candidate 정리는 best effort이며 다른 run 파일을 삭제하지 않는다. Crash/power-loss 전체 원자성은 -약속하지 않는다. Reference `.inp`/TXT/CSV는 read-only이며 output으로 덮어쓰지 않는다. - -| Solver 실패 / exit5 | Stable code·필수 context | -| --- | --- | -| Analytic mass space·null identity 오류 | invalid-eigen-mass-space: node/DOF/n/nz·실패 identity | -| Positive block conditioning 실패 | eigen-mass-conditioning: node·metric·관측값·NR limit | -| Checked index/capacity 또는 CSR | eigen-index-overflow / invalid-eigen-csr: n,nnz,N,m0와 실패 bound | -| Workspace allocation | eigen-allocation-failed: 역할·checked byte request; N 축소 없음 | -| Fatal FEAST status | eigen-feast-failed: raw info, call kind/ordinal, interval, allocated m0 | -| Count/solve 수·monotonicity 불일치 | eigen-count-inconsistent: 실제 count history·certified interval | -| Endpoint separation | eigen-endpoint-separation: raw endpoints·nearest returned value·NR limit | -| Mandatory search budget 소진 | eigen-search-budget-exhausted: attempts·마지막 safe bracket·fallback 가능 여부 | -| Significant negative spectrum | negative-eigenvalue-spectrum: raw lambda/mu/s·rank·NR limit | -| Nonfinite/invalid conversion/frequency | invalid-eigenvalue-result: raw quantity·stage·source step | -| Pair/Gram/original-free residual/energy 실패 | eigenpair-validation-failed: metric·value·limit·solver column/rank | - -선택적 upper-prefix 최적화에서 인증되지 않은 empty/count status는 count0으로 바꾸지 않는다. -Formulation E4와 NR가 허용한 safe bracket fallback은 실패를 은폐한 성공 count가 아니며 -actual attempted call·종료 이유를 evidence에 남긴다. Mandatory final count/solve/validation 실패는 -부분 결과로 성공하지 않는다. Count workspace의 작은/null scratch를 문헌 보장으로 가정하지 않는다. -Failure Status는 Frequency 위치와 지금까지의 chronological call context를 포함한다. -Undefined vendor outputs는 읽지 않고 unavailable로 표시한다. Allocation 실패의 부속 message -생성은 기존 best-effort diagnostic 한계를 따른다. - -## 원본 TXT grammar와 prechecks - -Input은 `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp`, reference는 같은 폴더의 -`shellNL-eigen-meshfine eigenvalues.txt`다. 이름 변경, TXT rewrite, CSV 변환, companion -README/metadata/version/provenance 추가를 요구하지 않는다. TXT에 step이 없으므로 지정 input의 -**유일한 frequency source step Step-2**에 대응한다. 이름에서 ODB frame index를 추정하지 않는다. - -LF/CRLF logical line에서 space/tab-only 행은 건너뛴다. 나머지는 아래 case-sensitive full-match다. -`ws=[ \t]*`, `ws1=[ \t]+`; id는 checked positive int64 decimal이다. - -```text -number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)? -id := [0-9]+ -row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number - ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws -``` - -Header/footer/comment/BOM/extra token/malformed row는 schema 실패다. Value는 finite binary64 -full conversion이며 range error를 거부한다. Freq는 숫자 token 구조만 검사하며 수치 변환· -물리 일치·오차 판정에 사용하지 않는다. Freq에서 Value를 재구성하지 않는다. 같은 numeric mode -ID의 재등장은 duplicate이며 같은 Value의 다른 mode는 정상이다. - -Tolerance 전에 다음을 순서대로 완료한다. - -1. 지정 input/TXT와 HDF5 존재, eigen discriminator, source_input_identity를 현재 입력의 - lexical path와 기존 byte-content identity에 대조한다. Static output·unknown eigen schema를 거부한다. -2. Input sole source step/N을 직접 읽어 HDF5 source step·requested/public count와 대응한다. - N을 TXT row 수나 검증 c에서 추론하지 않는다. 현재 양쪽 required mode inventory는 1..10이다. -3. TXT 모든 nonblank row를 parse하고 duplicate/missing/extra/nonfinite를 거부한다. Malformed-row - skip/dictionary overwrite/값 sorting으로 source mode identity를 바꾸지 않는다. -4. HDF5 mandatory dataset/type/shape, units·quantity·실제 backend·mass variant·normalization, - source/model identities, modes ID 1..N, paired vector shape, raw eigenvalue finite를 검사한다. - HDF5 순서 오류는 reader 재정렬로 숨기지 않는다. 값이 같아도 ID가 다르면 multiplicity다. -5. `(case,source_step_name,mode_id,component=Value)`로 one-to-one join하고 mode ID 순서로 출력한다. - TXT row reorder는 허용한다. `modes.eigenvalue`만 FESA scalar authority다. c개 검증 table, - frequencies, vectors 또는 static fields에서 fallback하지 않는다. - -## Family와 보고 - -[NR reference-model](reference-model.md)이 정의하는 family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue, -dimension=time^-2,coordinates=scalar,impact=blocking)`다. Mode별 frame은 10개 singleton -family이며 하나의 storage table이라고 서로 합치지 않는다. 2026-09-10 사용자 명시 5% 승인과 -[MFE2-ADR-012](ADR.md)에 따라 [공통 TOLERANCE](../TOLERANCE.md)의 승인된 한정 정책 -`mitc4-eigen-first-implementation`을 이 Feature의 외부 Value 비교에 적용한다. -Reference-only S와 near-zero 분류·row branch는 유지하고 상대오차와 relative RMS의 한계를 -각각 `0.05`로 적용한다. 같은 identity의 양수 singleton에서는 두 metric이 모두 -`abs(FESA - reference) / abs(reference)`이므로 mode별 5% 이하(inclusive)가 통과 조건이다. -Mode 사이 평균·collapse·재정렬로 실패를 숨기지 않는다. S=0은 exact-zero FESA만 성공하며, -missing/extra/duplicate/nonfinite/schema/identity 오류는 위 prechecks에서 먼저 거부한다. -다른 공통 family의 RMS `0.01`과 전체 c개 내부 독립 검증 `1e-10`은 유지한다. -이는 승인된 첫 구현 acceptance이며 후속 정확도 개선이나 S3 해결의 evidence가 아니다. - -Report는 input/reference/result identity, freshness evidence, 전체 prechecks, source key/ -component/family/count/S, raw reference/FESA/error·branch·row verdict, RMS·family verdict, -blocking failure와 overall verdict를 mode 순서로 남긴다. Comparator report는 -`policy_id=mitc4-eigen-first-implementation`과 `relative_rms_tolerance=0.05`를 명시해 -공통 RMS 1% 정책과 구별한다. 임의 tolerance를 지정하는 generic policy argument는 노출하지 않는다. -이 report 계약 변경은 HDF5 field·shape·단위·schema version을 변경하지 않는다. -Zero-scale 미정 metric은 named state로 -표시하고 NaN/Inf/floor를 넣지 않는다. 필요 시 HDF5 projection CSV는 보조 debug view일 뿐이다. - -외부 eigen gate는 Value뿐이다. N개의 global vectors는 내부 constraint/residual/normalization -재검증용이며 외부 shape reference는 요구하지 않는다. 기존 static 회귀는 [requirements](requirements.md)의 -retained shell/shellNL/linear-limit portfolio와 기존 source step/frame·U blocking·UR warning-only, -nonlinear reaction review-only 의미를 유지한다. 제외 네 예제는 원본·복사·cache로도 사용하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/io-schema.md b/docs/mitc4-shell-feast-eigen2/io-schema.md deleted file mode 100644 index c4ed3b6..0000000 --- a/docs/mitc4-shell-feast-eigen2/io-schema.md +++ /dev/null @@ -1,182 +0,0 @@ -# MITC4 eigen authoritative HDF5 schema - -- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r1`. -- 기본 보고서: [io.md](io.md). 수치 원본: [formulation-eigen](formulation-eigen.md), - [NR controls](numerical-review-controls.md). - -## Container와 compatibility - -공식 결과는 input lexical sibling `_results.h5`다. Linear schema0와 nonlinear schema1의 -기존 dataset/type/필수성/reader 의미를 바꾸지 않는다. 새 eigen discriminator는 -`(schema_version=0,feature_id=mitc4-shell-feast-eigen2,analysis_procedure=linear-frequency, -eigen_schema_version=1)`이다. 이는 공통 shell model container에 대한 additive procedure다. -Reader는 schema_version만 보고 static으로 해석하지 않는다. Unknown procedure/version 또는 -eigen 필수 field 누락은 명시적 unsupported/invalid schema다. Static 파일에 새 eigen fields를 -요구하거나 migration하지 않는다. Unknown optional additive fields만 무시할 수 있다. - -File scalar는 f64=`H5T_IEEE_F64LE`, u64/u8/i64는 해당 fixed-width little-endian integer, -string은 variable-length UTF-8다. Compound byte padding/offset은 private이며 field name/type/ -array extent가 계약이다. 차원 product는 allocation 전에 checked integer다. 아래 nn/ne/nmat는 -model node/element/material 수, N은 input 요청, n은 finite dimension, c는 최종 전체 검증 수다. - -## Metadata와 model - -`/metadata` 필수 attributes: - -| 이름 | Type / 값 | -| --- | --- | -| schema_version, eigen_schema_version | u64 0,1 | -| feature_id, analysis_procedure | utf8 mitc4-shell-feast-eigen2, linear-frequency | -| solver_version | utf8 실제 binary version | -| source_input_identity | utf8 기존 `path=;content_identity=fnv1a64:<16 lower hex>`; 실제 읽은 원본 bytes | -| unit_system_label | utf8 user-consistent-unspecified | -| coordinate_convention | utf8 global-cartesian; shell-local=initial-reference; positive-thickness=+zeta | -| internal_formulation | utf8 FESA-MITC4 | -| integration_rule, mass_integration_rule | utf8 2x2x2-gauss; mitc4-edge-midpoint-shear / 3x3x3-gauss | -| stabilization_rule | utf8 initial-physical-rotary-trace-mean | -| mass_variant, mass_origin, normalization | utf8 derived-lumped, consistent-moment-row-sum, mass | -| eigensolver_backend, eigensolver_routine | utf8 MKL FEAST, dfeast_scsrgv | -| backend_problem | utf8 scaled-whitened-lumped-with-identity-mass | -| numerical_contract | utf8 mitc4-shell-feast-eigen2:r1 | - -Model compounds의 기존 physical field는 수정하지 않고 아래처럼 재사용한다. - -| Dataset | Shape / fields | 의미 | -| --- | --- | --- | -| /model/nodes | [nn] internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3] | ID 0..nn-1, 기존 expansion/declaration order, global length | -| /model/elements | [ne] internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64 | ID order; S4/S4R 원형 유지; 모두 FESA-MITC4 | -| /model/shell/materials | [nmat] internal_material_id:u64,name:utf8,E:f64,nu:f64 | 기존 declaration order; E force/length^2, nu1; rho를 compound에 삽입하지 않음 | -| /model/shell/sections | [section_count] internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64 | 기존 centered-single-layer와 thickness length | -| /model/shell/nodal_director | [nn,3] f64 | 기존 global unit director D1,D2,D3 | -| /model/shell/nodal_frame | [nn,3,3] f64 | 기존 A,B,D axes×global X,Y,Z, dimension1 | -| /model/nodal_constraint_mask | [nn,6] u8 | UX,UY,UZ,URX,URY,URZ; free0/constrained1 | -| /model/prescribed_displacement | [nn,6] f64 | 같은 component order; 전부 exact0, 기존 length/radian dimensions | -| /model/shell/densities | [density_count] 새 compound material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64 | Material ID ascending, 선언 density마다 한 row; 활성 material 전부 존재, rho>0 mass/length^3 | -| /diagnostics | [diagnostic_count] 기존 severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8 | 기존 deterministic order, 성공 파일은 warning만 | - -기존 model dataset attrs는 [현재 model writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)의 -동일 field 의미를 따른다. `/model/shell/densities` attrs는 component_names=rho, -component_unit_dimensions=mass/length^3,coordinate_system=scalar,location=model-material다. -공유 writer의 midsurface_locations/section_positions 추가 저장은 허용하지만 eigen 필수량이 아니다. - -`/steps/Step-1`은 storage group이며 아래 attributes가 source/procedure authority다. -Raw name을 HDF5 path에 넣거나 Step-1에서 source name을 역추정하지 않는다. - -| Attribute | Type / 의미 | -| --- | --- | -| source_step_name, source_step_name_canonical | utf8 원문/ASCII uppercase; 지정 입력 Step-2/STEP-2 | -| step_source_line, frequency_source_line, frequency_data_line | u64 source 1-based 위치 | -| source_nlgeom, source_perturbation_present | u8 effective0 / flag presence0 또는1 | -| source_eigensolver, source_sim, source_acoustic_coupling, source_normalization | utf8 effective LANCZOS,YES,ON,MASS | -| source_option_presence | u8[4] 위 네 option의 explicit presence 순서 | -| requested_mode_count, returned_mode_count | u64 N,N | -| full_dof_count, free_dof_count, mass_null_dimension, finite_dimension | u64 6nn,nf,nz,n; nf=n+nz | -| validated_eigenpair_count | u64 c; N<=c<=n | -| frame_indexing | utf8 mode-rank-one-based | - -별도 raw source-record table이나 duplicate reference provenance 파일은 필수로 만들지 않는다. -Raw keyword/data/blank fields는 Domain의 ParsedInput provenance와 source byte identity로 추적한다. - -## 공개 modal 결과 - -Prefix `/steps/Step-1/eigen`. 새 result dataset의 공통 attrs는 -`eigen_schema_version:u64=1,source_step_name:utf8=,domain:utf8=mode`와 아래 quantity/ -component/dimension/coordinate/location이다. Numeric/physical values는 전부 finite다. - -| Dataset | Shape/type | Quantity·identity | -| --- | --- | --- | -| modes | [N] compound mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64 | 유일 Value authority; mode_id1..N 순서, quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame | -| frequencies | [Nv] compound mode_id:u64,frequency:f64 | modes 중 raw lambda>=0의 정확한 ID subset, mode order; quantity=cycle-frequency, component_names=Freq, component_unit_dimensions=time^-1, coordinate_system=scalar, location=modal-frame | -| vectors | [N,nn,6] f64 | Modes와 같은 mode axis, model/nodes와 같은 node axis; component_names=UX,UY,UZ,URX,URY,URZ, global-cartesian, nodal-modal-vector | - -Vectors는 **mandatory 내부 검증 projection**이다. 병진 dimension `mass^-1/2` 세 개와 -회전 `mass^-1/2*length^-1` 세 개를 component_unit_dimensions에 기록한다. -`normalization=mass,mass_variant=derived-lumped,interpretation=normalized-mode-not-response-displacement` -attrs를 둔다. 회전은 initial global infinitesimal rotation이다. Constrained component는 exact0. -Static displacement/reaction/stress/accepted_frames를 modal 결과로 생성하지 않는다. - -[NR raw 분류](numerical-review-controls.md)대로 mu=lambda/s의 절댓값<=1e-9는 -classification0=near-zero, 나머지 허용 양수는1=positive다. mu<-1e-9는 성공 파일을 만들 수 없다. -Raw lambda는 작은 음수도 보존하며 절댓값/zero clamp하지 않는다. Frequency는 raw lambda>0이면 -sqrt(lambda)/(2pi), exact0이면0, 음수에는 row가 없다. Mandatory frequencies dataset은 Nv=0도 -허용하며 unavailable_rule=negative-raw-eigenvalue를 기록한다. Finite/range 검사는 NR 기준이며 -양수의 frequency underflow-to-zero도 invalid-eigenvalue-result다. - -Sort는 paired raw lambda ascending, exact tie는 원 FEAST column order다. Sign은 최대 절댓값 -scaled global component(translation/ell,rotation)를 양수로, tie는 model row×DOF 순서다. -Cluster는 전체 c sorted pairs의 NR connected rule로 1부터 부여한 후 N개에 투영한다. -Cluster label은 진단 identity이며 mode average/deduplicate/외부 shape 비교를 유발하지 않는다. - -## 전체 c 검증과 실제 backend evidence - -Prefix `/steps/Step-1/eigen/verification`. Attributes `characteristic_length:f64=ell [length]`, -`operator_scale:f64=s [time^-2]`는 positive finite다. `validation_scope=all-computed-c-columns`, -`eta_gram:f64,max_eta_orth:f64`는 dimension1, c=1이면 latter0이다. Null 검사는 -`null_checks_applicable:u8`와 `eta_mz,eta_kz,eta_pz:f64`로 저장한다. nz=0이면 flag0/storage0이며 -N/A이지 검증 통과 metric0이 아니다. 모든 metric 식과 limit는 NR controls와 채택 V식이다. 정규화 후 최종 phi에서 -modal_mass와 yf를 다시 계산하고 모든 저장 residual/Gram/Rayleigh/energy에 이 값을 사용한다. - -| Dataset | Shape / fields | -| --- | --- | -| nodal_reduction | [nn] compound free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64 | -| eigenpair_checks | [c] compound sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64 | - -두 검증 dataset attrs는 coordinate_system=scalar이며 location은 각각 nodal-mass-reduction, -eigenpair-verification이다. component_names는 표의 f64 fields 순서, component_unit_dimensions는 -아래 해당 field 차원 순서다. Nodal counts는 nn source row에 대응하고 합이 nf/nz/n과 일치한다. Positive block 없는 node는 -rcond_available0/storage0이다. Sorted_rank1..c, solver_column0-based unique, modes의 첫 N scalar와 -exact pairing한다. Eigenvalue/Rayleigh는 time^-2, 나머지는 dimension1이다. Backend relative res가 -zero-mode에서 정의되지 않는 경우에만 unavailable0/storage0으로 두고 의미를 명시한다. -Nonzero mode의 nonfinite res 및 모든 mandatory independent metric nonfinite는 실패다. - -C개 vectors는 solve/validation 동안 유지한다. Accepted state/HDF5에는 N vectors와 전체 c의 -metrics를 남긴다. N vectors로 같은 input의 K/ML를 재조립해 N개의 original-free residual/ -normalization을 재현할 수 있다. 전체 c Gram의 실제 검증 evidence는 runtime/test 결과로 남기며 -N vectors만으로 c Gram를 재계산했다고 주장하지 않는다. Full matrices의 영속 dump는 요구하지 않는다. - -Prefix `/steps/Step-1/eigen/backend` attributes: -`runtime_version:utf8,integer_abi:utf8=LP64|ILP64,thread_count:u64=1,seed:u64`, -`enclosure_lower:f64,enclosure_upper:f64,solve_lower:f64,solve_upper:f64`, -`count_calls:u64,solve_calls:u64,final_solve_ordinal:u64,final_count:u64=c`, -`upper_search_termination:utf8`를 둔다. 마지막 값은 count-target/width-limit/no-midpoint/ -optimization-budget/collision-exhausted/optional-status 중 실제 종료 이유다. -Bounds는 dimensionless B-space이며 사용자 frequency interval이 아니다. Seed는 NR 값이다. - -| Dataset | Shape / fields | 의미 | -| --- | --- | --- | -| base_fpm | [128] i64 | feastinit 뒤 NR override한 실제 solve control snapshot; defaults 포함. Count는 동일 snapshot에서 C-index49만1, 매 call 재초기화 | -| calls | [Lcalls] compound ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64,outcome:utf8,decision_reason:utf8 | 실제 chronological 호출, ordinal0-based; kind=count/solve, purpose=total-enclosure/upper-guard/final-count/solve | - -Count의 overwritten m0 또는 solve의 returned m을 count에 담고 allocated_m0와 구분한다. -Outcome은 accepted/optional-abandoned/retry이며 NR의 실제 결정에 대응한다. Decision_reason은 -accepted 또는 status/count-mismatch/endpoint-separation 등의 결정 원인과 필요한 관측값을 -round-trip decimal로 남긴다. 호출 없이 budget/width로 종료한 이유는 upper_search_termination에 둔다. -초기 enclosing 재시도에서만 a0가 확정 전 변경될 수 있고, 성공한 total enclosure 이후 하한은 고정이다. Guard 세 구간은 -각각 call row다. 실패·fallback을 삭제하지 않는다. Undefined vendor output은 flag0/storage0으로 -두고 읽지 않는다. 성공 count는 count_available1; 성공 solve는 loop/epsout available1이고 finite다. -Calls와 final interval/rank/c를 통해 fixed a0, certified upper/full enclosure fallback, budget, -capacity, returned count의 경로를 재구성할 수 있어야 한다. CLI live log로 이 trace를 옮기지 않는다. -Calls의 f64 component_names는 lower,upper,epsout이고 component_unit_dimensions=1,1,1, -coordinate_system=scalar,location=backend-call이다. Base_fpm은 component_names=fpm, -component_unit_dimensions=1,coordinate_system=none,location=backend-parameter다. -128개 per-call dump 대신 공통 snapshot 한 개와 kind로 실제 controls를 재현한다. 향후 call별 -control 차이를 추가하려면 이 표현과 NR 계약을 함께 재검토해야 한다. - -## Closed candidate self-check - -현재 [self_check](../../src/fesa/io/hdf5/hdf5_self_check.cpp)는 static schema0/1 전용이므로 -별도 eigen dispatch/check가 필요하다. Candidate를 닫고 read-only reopen하여 다음을 검증한다. - -- Discriminator/metadata/source input bytes·step·요청수, known type/rank/shape/dimension attrs와 - model source identity uniqueness/각 reference ID range, density coverage/positivity를 candidate와 대조한다. -- Model mask는0/1, prescribed values exact0, modes inventory 정확히1..N, 오름차순·cluster/classification, - frequencies 정확한 subset, vectors paired axis/finite/constraint zero와 validated candidate 값을 대조한다. -- nf=n+nz 및 nodal count 합, N<=c<=n, c rank/solver-column uniqueness, first-N scalar pairing, - independent metrics finite/NR limits, applicable/available flags를 검사한다. N/A를 pass로 계산하지 않는다. -- Backend routine/ABI/runtime/base controls, actual call ordering/count/bounds/capacity/status/budget와 final - certified interval·c 및 successful all-c validation 연결을 확인한다. Static result paths가 없어야 한다. -- Mandatory row 누락/추가/중복/nonfinite/잘못된 quantity·units·mass는 실패한다. Writer가 sorting, - averaging, 값 수정으로 candidate mismatch를 수리하지 않는다. 모든 handle close 후에만 replace한다. - -Self-check는 serialization과 검증된 state의 동일성을 확인한다. 독립 physics/NR 테스트를 대신하거나 -저장 metric만으로 실행되지 않은 residual/Gram 계산을 통과로 인정하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/io.md b/docs/mitc4-shell-feast-eigen2/io.md index 127eae9..6431d52 100644 --- a/docs/mitc4-shell-feast-eigen2/io.md +++ b/docs/mitc4-shell-feast-eigen2/io.md @@ -1,12 +1,20 @@ -# MITC4 eigen I/O 계약 +# MITC4 eigen 입력·결과·mapping 계약 + +Density/Frequency 입력, authoritative additive HDF5 schema와 identity·실패 lifecycle의 현재 계약이다. + + + + +## MITC4 eigen I/O 계약 - Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r2` (외부 Value acceptance만 변경). -- 입력 baseline: [requirements r1](requirements.md), [formulation r1](formulation.md). +- 입력 baseline: [requirements r1](requirements.md#requirements), [formulation r1](formulation.md). - 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR-028](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md), [Feature ADR](ADR.md). - 상태: formulation r1과 독립 NR의 `pass-for-io-definition` 및 최종 controls/reference-model을 반영한 I/O 계약 작성 완료. 구현·실행 검증 기록이 아니다. -## 결정 + +### 결정 원본 frequency input의 N과 source step을 보존하며 consistent에서 유도한 lumped mass와 실제 MKL FEAST의 N개 고유쌍을 공식 HDF5로 식별한다. 기존 static schema0/1과 CLI/output @@ -23,20 +31,22 @@ N개의 global mass-normalized vectors는 내부 검증을 위해 필수이며 | 상세 문서 | 권위와 내용 | | --- | --- | -| [io-input](io-input.md) | Supported syntax/defaults, source scope, rho/BC mapping, no-op allowlist, fail-closed diagnostics | -| [io-schema](io-schema.md) | Authoritative HDF5 types/shapes/units, source step·mode identity, all-c evidence, self-check | -| [io-mapping](io-mapping.md) | Domain/AnalysisModel/DOF/state ownership, candidate/failure lifecycle, TXT grammar·prechecks·Value projection | +| [io-input](io.md#io-input) | Supported syntax/defaults, source scope, rho/BC mapping, no-op allowlist, fail-closed diagnostics | +| [io-schema](io.md#io-schema) | Authoritative HDF5 types/shapes/units, source step·mode identity, all-c evidence, self-check | +| [io-mapping](io.md#io-mapping) | Domain/AnalysisModel/DOF/state ownership, candidate/failure lifecycle, TXT grammar·prechecks·Value projection | | [NR controls](numerical-review-controls.md), [reference-model](reference-model.md) | 내부 수치 controls와 외부 modal-frame family; I/O가 tolerance를 선택하지 않음 | -공개 Abaqus convention은 [입력 문서의 공식 출처](io-input.md#step와-frequency)를 직접 대조했다. +공개 Abaqus convention은 [입력 문서의 공식 출처](io.md#io-input--step와-frequency)를 직접 대조했다. Lanczos/SIM은 source compatibility 정보이며 실제 algorithm 동등성을 주장하지 않는다. ACOUSTIC COUPLING=ON은 acoustic-free 모델에서만 적용 대상 없음으로 처리한다. 물리량은 사용자 일관 units이며 SI로 추론하지 않는다. Meaningful unsupported input은 실패한다. -## 현재 source와의 차이 + +### 설계 당시 source와의 차이 -2026-09-08 지정 source를 읽기 전용으로 직접 확인했다. 아래는 후속 구현 의무이며 현재 -동작이 구현되었다는 의미가 아니다. 기존 Feature 문서의 pass·workflow·trace schema는 승계하지 않았다. +2026-09-08 설계 당시 지정 source를 읽기 전용으로 확인한 기록이다. 아래 표는 당시의 +미구현 연결을 설명하며 현재 구현 상태를 뜻하지 않는다. 연결 후 실행 결과와 남은 한계는 +[구현 검증](implementation-verification.md)을 따른다. 기존 Feature의 pass를 승계하지 않았다. | 실제 확인 파일 | 확인 결과와 필요한 연결 | | --- | --- | @@ -46,10 +56,11 @@ ACOUSTIC COUPLING=ON은 acoustic-free 모델에서만 적용 대상 없음으로 | [model writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp), [primitives](../../src/fesa/io/hdf5/hdf5_primitives.cpp) | 기존 compounds, UTF-8/fixed-width, user-consistent-unspecified, path+content identity 재사용; material compound 수정 대신 별도 densities | | [linear writer](../../src/fesa/io/hdf5/hdf5_results_writer.cpp), [nonlinear writer](../../src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp), [self_check](../../src/fesa/io/hdf5/hdf5_self_check.cpp) | Static0/1 전용 경로를 eigen에 재사용해 modal 값을 static frame0으로 내면 오류. Dedicated eigen serialization/self-check dispatch 필요 | -## 후속 검증 의무 + +### 후속 검증 의무 Requirement prefix는 `FEM-REQ-MITC4-EIGEN2-`다. 아래 검증을 문서 작업 중 실행한 것으로 -집계하지 않는다. 수치 기준·oracle는 [NR](numerical-review.md)와 연결된 상세가 권위다. +집계하지 않는다. 수치 기준·oracle는 [NR](numerical-review.md#numerical-review)와 연결된 상세가 권위다. | ID | 필수 관찰 | Requirement suffix | | --- | --- | --- | @@ -65,7 +76,8 @@ Requirement prefix는 `FEM-REQ-MITC4-EIGEN2-`다. 아래 검증을 문서 작업 | IO-T10 | Density 없는 static 입력과 schema0/1 유지, retained shell/shellNL/linear-limit source identity·U/UR/reaction 분류와 fresh 회귀, 제외 예제0건 | 023–025,027 | | IO-T11 | Consistent→lumped 원본 연결과 같은 mass의 실제 FEAST/검증; mass oracle·inertia/null·coordinate/NR-MFE-001 및 deterministic assembly/row/diagnostic | 005–008,011,013–014,023,026–027 | -## 최종 대조와 미실행 + +### 최종 대조와 미실행 최종 NR의 B=0 enclosure, 초기 count 최대3회·전체 count512/solve3, fixed a0와 optional upper search 종료·certified fallback, normalized final phi metrics를 대조했다. @@ -75,9 +87,10 @@ optional upper search 종료·certified fallback, normalized final phi metrics 변경은 없다. 새 mode shape 외부 acceptance, CSV mandate, reference 보조 metadata, full matrix mandatory dump, lower/empty-prefix 검색 schema를 추가하지 않았다. -현재 source의 density/Frequency/state/writer 연결은 미구현이다. Research G01/G02의 installed +이 I/O 정의를 작성할 당시 density/Frequency/state/writer 연결은 미구현이었다. Research G01/G02의 installed FEAST 동작·workspace와 실제 peak memory, retained regression/새 eigen reference 및 physics -검증은 후속 실행 의무다. Safe enclosure fallback이 runtime 확인을 대신하지 않는다. +검증은 당시 후속 실행 의무였다. 현재 실행·미실행 범위는 [구현 검증](implementation-verification.md)에 +기록했다. Safe enclosure fallback이 runtime 확인을 대신하지 않는다. 문서만 수정하므로 build/test/Harness/FEAST/외부 solver를 실행하지 않았다. Source/test/reference와 제외 네 예제의 원본·복사·cache는 수정·검증에 사용하지 않았다. @@ -85,3 +98,488 @@ FEAST 동작·workspace와 실제 peak memory, retained regression/새 eigen ref 41개와 원본 TXT full grammar/finite Value/unique Mode1..10을 Python read-only 검사로 확인했다. 경로 한정 `git diff --check`도 exit0이었다. Untracked 문서는 별도 내용 검사로 확인했으며 diff 검사만으로 검증했다고 하지 않는다. Build/test와 수치 comparison은 미실행이다. + + + + +## MITC4 eigen 입력·진단 계약 + +- Feature ID: `mitc4-shell-feast-eigen2` +- Contract revision: `r1` +- 기본 보고서: [io.md](io.md#io) + + +### 문법과 기존 지원 범위 + +기존 [shell 입력](../linear-static-mitc4-shell/io.md#1-abaqus-input-scope)과 +[후속 lexical 계약](../shell-surface-pressure-load/io.md)을 유지한다. 현재 +[input_reader.cpp](../../src/fesa/io/abaqus/input_reader.cpp)와 +[domain_mapping_context.cpp](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 대조했다. +LF/CRLF, 종결자 제외 physical line 256 ASCII bytes, printable ASCII/tab, blank와 `**` +comment, keyword parameter continuation은 기존 규칙을 따른다. Inline comment, data +continuation, include/substitution/quoted name을 추가하지 않는다. Keyword·parameter·enum· +name lookup은 ASCII case-insensitive이며 raw spelling/physical source line은 보존한다. +Duplicate parameter는 같은 값이어도 실패한다. Comma split은 빈 field를 보존한다. + +Eigen model의 순서는 `HEADING? PREPRINT? PART+ ASSEMBLY MATERIAL+ BOUNDARY* STEP EOF`다. +Part 내부 NODE→ELEMENT→sets→SHELL SECTION, assembly의 identity INSTANCE와 explicit-instance +sets, forward section→material lookup은 기존 shell 범위다. `S4`와 `S4R`는 source type만 +구별하고 같은 FESA MITC4 kernel에 대응한다. Node/element positive int64 source label, +instance/name scope, element 네 distinct nodes, section 유일 할당, geometry-derived director, +centered finite thickness>0, homogeneous isotropic `E>0,-1 +### Density + +`*DENSITY`는 current MATERIAL 안에서 parameter 없이 최대 한 번, 정확히 한 data row를 +갖는다. `rho` 또는 `rho,`만 허용한다. 뒤의 빈 temperature slot은 constant 값이며 원본 +`2700.,`를 그대로 수용한다. Nonempty temperature, 추가 field/comma/row, `DEPENDENCIES=0`을 +포함한 모든 parameter와 distribution은 거부한다. ELASTIC과 DENSITY의 상대 순서는 자유다. + +새 rho의 C-locale token은 아래 full-match이고 binary64 full conversion을 요구한다. + +```text +number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)? +``` + +Hex/D exponent/locale comma/잘못된 token은 input 오류다. NaN/Inf spelling은 아래 model +nonfinite 진단으로 분류하며 허용 token이 아니다. Overflow/underflow conversion error, +nonfinite, `rho<=0`는 invalid material이다. 모든 활성 `element→section→material→rho`가 +정확히 하나로 결정되어야 한다. 누락값·다른 material·global 평균으로 대체하지 않는다. +사용하지 않은 material에 선언된 density도 문법·양성 검증한다. 필수 존재 조건은 활성 material에 +적용한다. 단위는 `mass/length^3`, 사용자 일관 단위계이며 자동 SI 추론·변환은 없다. + +Density 허용은 새 eigen procedure에 한정한다. 기존 static 입력 지원을 확장하거나 density를 +필수화하지 않는다. Procedure 확인 전 raw material을 보존한 뒤 해당 procedure로 검증한다. + + +### Step와 Frequency + +`*STEP`은 정확히 하나이며 optional `NAME`, `NLGEOM=NO`, value 없는 `PERTURBATION`만 +허용한다. Data는 없다. 생략 NLGEOM은 NO, 생략 NAME은 source `Step-1`이다. FREQUENCY가 +원형상 무응력 linear perturbation procedure를 결정하므로 PERTURBATION 생략도 같은 의미다. +Raw/canonical name과 flag presence를 보존한다. Storage `Step-1`과 source `Step-2`는 별개다. +`NLGEOM=YES`, INC, 선행/다중 step, 다른 procedure와 step description은 거부한다. + +| FREQUENCY parameter | 허용/생략 default | FESA 의미 | +| --- | --- | --- | +| `EIGENSOLVER` | `LANCZOS` / LANCZOS | 실제 MKL FEAST 사용; 항상 `source-eigensolver-mapped-to-feast` warning | +| `SIM` | flag 또는 `YES` / YES | Source option만 보존; 명시되면 `source-sim-option-not-applied` warning | +| `ACOUSTIC COUPLING` | `ON` / ON | Structural-only 모델에서 적용 대상 없음; 명시되면 `acoustic-option-inapplicable-structural-only` warning | +| `NORMALIZATION` | `MASS` / MASS | 실제 derived lumped mass로 normalization | + +SIM=NO, DISPLACEMENT normalization, AMS/SUBSPACE/FEAST enum, coupling OFF/PROJECTION, +RESIDUAL MODES, DAMPING PROJECTION, PROPERTY EVALUATION, NSET와 모든 미열거 parameter는 +실패한다. Acoustic 요소/ASI/TIE/coupling 정의가 존재하면 ON no-op을 적용하지 않고 실패한다. + +FREQUENCY data는 한 physical row, 1~7 comma fields다. 첫 field N은 `[0-9]+`, checked +positive int64이며 나머지 존재하는 fields는 전부 empty여야 한다. Fields 2~7은 source의 +minimum/maximum frequency, shift, block size, Lanczos step count, acoustic range factor 자리다. +빈칸은 unspecified이며 숫자0이 아니다. Nonempty0도 실패하고 eighth empty field도 실패한다. +원본 `10, , , , ,`는 6 fields, N=10이다. Bounds/shift/FEAST controls는 사용자 입력 기능으로 +추가하지 않는다. `N>finite_dimension`과 빈 finite system은 equation 구성 뒤 model 실패다. + +공개 Abaqus convention의 근거는 [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), +[DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm), +[STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm)이다. +2026-09-08 직접 확인했다. 위 allowlist와 warning은 FESA의 지원 차이이며 Abaqus algorithm· +SIM·parser 내부 구현의 동등성을 주장하지 않는다. + + +### Homogeneous BC와 result-neutral allowlist + +BOUNDARY는 model 또는 FREQUENCY 뒤/output 앞에 parameter 없이 +`target,first,last[,value]`로 둔다. `1<=first<=last<=6`; value 생략은 exact0, 명시 value는 +finite exact0만 허용한다. 빈 fourth field는 생략으로 보지 않는다. 기존 bare source label 또는 +unambiguous node-set resolver와 assembly INSTANCE binding을 사용한다. 새로운 dotted target, +local/tangent BC, MPC를 추가하지 않는다. Model BC→step BC 순서의 zero constraint union이며 +같은 zero 재선언은 같은 constraint다. Nonzero를 상쇄·override해서 통과시키지 않는다. +Global DOF는 `UX,UY,UZ,URX,URY,URZ`; partial rotation BC를 그대로 유지한다. + +| Keyword | 정확한 조합·위치; 모두 data 없음 | +| --- | --- | +| PREPRINT | Optional top-level, ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO 네 개 | +| RESTART | FREQUENCY/BC 뒤, WRITE flag와 FREQUENCY=0 | +| OUTPUT | FREQUENCY/BC 뒤, FIELD 또는 HISTORY flag 하나, optional VARIABLE=PRESELECT | +| NODE OUTPUT | 활성 OUTPUT FIELD 아래, VARIABLE=PRESELECT | +| ENERGY OUTPUT | 활성 OUTPUT HISTORY 아래, VARIABLE=ALL | + +Parameter 순서는 자유이며 duplicate/extra parameter는 실패한다. OUTPUT root/RESTART/END STEP은 +이전 output scope를 닫는다. 모든 허용 no-op keyword마다 `ignored-input-keyword` warning과 +`mandatory-eigen-output-unchanged` 이유를 기록한다. 선택·억제·restart state를 생성하지 않는다. +Unknown output variable row/child, restart READ/nonzero frequency는 실패한다. + +어떤 위치의 CLOAD/DLOAD/DSLOAD(값0 포함), initial state/stress/temperature, damping, +amplitude, acoustic/beam/solid/mixed model, concentrated/nonstructural mass, composite/offset/ +variable thickness, contact/MPC/TIE, transform/orientation/explicit director, surface 등 의미 있는 +미지원 입력은 fail-closed다. 이름 `shellNL` 또는 `Step-2`에서 preload를 추정하지 않는다. + + +### 진단 + +기존 record `severity,code,file,line,keyword,entity_identity,message`와 CLI category를 유지한다. +File은 absolute lexical normalized path, line은 1-based; entity에 source instance/material/ +element/node/step와 DOF 또는 field ordinal을 연결한다. Backend 오류도 Frequency 위치를 붙인다. +Warnings는 기존 SortDiagnostics와 same-key discovery order다. Fatal은 첫 원인을 유지하고 +후속 solve/commit을 중단한다. 수치값은 round-trip decimal로 보고하며 임의 tolerance를 붙이지 않는다. + +| 실패 | Code | Exit | +| --- | --- | --- | +| Lexical/arity/duplicate parameter/unresolved | 해당 기존 code: invalid-input-character, input-line-too-long, invalid-data-arity, duplicate-entity, unresolved-reference 등 | 3 | +| Density scope/malformed data/options/duplicate | invalid-density-data / unsupported-density-option / duplicate-density | 3 | +| Active rho missing / nonfinite·nonpositive·conversion range | missing-material-density / invalid-material-density | 4 | +| Frequency options/count/data | unsupported-frequency-option / invalid-frequency-data | 3 | +| Multiple/preload/other procedure | unsupported-analysis-procedure | 3 | +| Nonzero prescribed BC | unsupported-eigen-boundary | 3 | +| Other unsupported model semantics | unsupported-keyword / unsupported-element-formulation / unsupported-mixed-element-model | 3 | +| Existing geometry/material/section invalid | 기존 model code; 새 mass point 오류 invalid-shell-mass-geometry | 4 | +| Empty finite system / N>n | empty-eigenproblem / insufficient-finite-modes | 4 | +| Mass-space/conditioning/backend/numerical failure | [mapping의 solver diagnostics](io.md#io-mapping--실패와-공개-lifecycle) | 5 | +| Log/candidate/self-check/finalization | 기존 output category | 6 | + +Usage2/success0와 stderr escaping은 기존 공통 CLI 계약이다. 지원되는 입력의 conditioning +실패를 input subset 축소나 인공 mass/zero clamp로 우회하지 않는다. + + + + +## MITC4 eigen authoritative HDF5 schema + +- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r1`. +- 기본 보고서: [io.md](io.md#io). 수치 원본: [formulation-eigen](formulation-eigen.md), + [NR controls](numerical-review-controls.md). + + +### Container와 compatibility + +공식 결과는 input lexical sibling `_results.h5`다. Linear schema0와 nonlinear schema1의 +기존 dataset/type/필수성/reader 의미를 바꾸지 않는다. 새 eigen discriminator는 +`(schema_version=0,feature_id=mitc4-shell-feast-eigen2,analysis_procedure=linear-frequency, +eigen_schema_version=1)`이다. 이는 공통 shell model container에 대한 additive procedure다. +Reader는 schema_version만 보고 static으로 해석하지 않는다. Unknown procedure/version 또는 +eigen 필수 field 누락은 명시적 unsupported/invalid schema다. Static 파일에 새 eigen fields를 +요구하거나 migration하지 않는다. Unknown optional additive fields만 무시할 수 있다. + +File scalar는 f64=`H5T_IEEE_F64LE`, u64/u8/i64는 해당 fixed-width little-endian integer, +string은 variable-length UTF-8다. Compound byte padding/offset은 private이며 field name/type/ +array extent가 계약이다. 차원 product는 allocation 전에 checked integer다. 아래 nn/ne/nmat는 +model node/element/material 수, N은 input 요청, n은 finite dimension, c는 최종 전체 검증 수다. + + +### Metadata와 model + +`/metadata` 필수 attributes: + +| 이름 | Type / 값 | +| --- | --- | +| schema_version, eigen_schema_version | u64 0,1 | +| feature_id, analysis_procedure | utf8 mitc4-shell-feast-eigen2, linear-frequency | +| solver_version | utf8 실제 binary version | +| source_input_identity | utf8 기존 `path=;content_identity=fnv1a64:<16 lower hex>`; 실제 읽은 원본 bytes | +| unit_system_label | utf8 user-consistent-unspecified | +| coordinate_convention | utf8 global-cartesian; shell-local=initial-reference; positive-thickness=+zeta | +| internal_formulation | utf8 FESA-MITC4 | +| integration_rule, mass_integration_rule | utf8 2x2x2-gauss; mitc4-edge-midpoint-shear / 3x3x3-gauss | +| stabilization_rule | utf8 initial-physical-rotary-trace-mean | +| mass_variant, mass_origin, normalization | utf8 derived-lumped, consistent-moment-row-sum, mass | +| eigensolver_backend, eigensolver_routine | utf8 MKL FEAST, dfeast_scsrgv | +| backend_problem | utf8 scaled-whitened-lumped-with-identity-mass | +| numerical_contract | utf8 mitc4-shell-feast-eigen2:r1 | + +Model compounds의 기존 physical field는 수정하지 않고 아래처럼 재사용한다. + +| Dataset | Shape / fields | 의미 | +| --- | --- | --- | +| /model/nodes | [nn] internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3] | ID 0..nn-1, 기존 expansion/declaration order, global length | +| /model/elements | [ne] internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64 | ID order; S4/S4R 원형 유지; 모두 FESA-MITC4 | +| /model/shell/materials | [nmat] internal_material_id:u64,name:utf8,E:f64,nu:f64 | 기존 declaration order; E force/length^2, nu1; rho를 compound에 삽입하지 않음 | +| /model/shell/sections | [section_count] internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64 | 기존 centered-single-layer와 thickness length | +| /model/shell/nodal_director | [nn,3] f64 | 기존 global unit director D1,D2,D3 | +| /model/shell/nodal_frame | [nn,3,3] f64 | 기존 A,B,D axes×global X,Y,Z, dimension1 | +| /model/nodal_constraint_mask | [nn,6] u8 | UX,UY,UZ,URX,URY,URZ; free0/constrained1 | +| /model/prescribed_displacement | [nn,6] f64 | 같은 component order; 전부 exact0, 기존 length/radian dimensions | +| /model/shell/densities | [density_count] 새 compound material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64 | Material ID ascending, 선언 density마다 한 row; 활성 material 전부 존재, rho>0 mass/length^3 | +| /diagnostics | [diagnostic_count] 기존 severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8 | 기존 deterministic order, 성공 파일은 warning만 | + +기존 model dataset attrs는 [현재 model writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)의 +동일 field 의미를 따른다. `/model/shell/densities` attrs는 component_names=rho, +component_unit_dimensions=mass/length^3,coordinate_system=scalar,location=model-material다. +공유 writer의 midsurface_locations/section_positions 추가 저장은 허용하지만 eigen 필수량이 아니다. + +`/steps/Step-1`은 storage group이며 아래 attributes가 source/procedure authority다. +Raw name을 HDF5 path에 넣거나 Step-1에서 source name을 역추정하지 않는다. + +| Attribute | Type / 의미 | +| --- | --- | +| source_step_name, source_step_name_canonical | utf8 원문/ASCII uppercase; 지정 입력 Step-2/STEP-2 | +| step_source_line, frequency_source_line, frequency_data_line | u64 source 1-based 위치 | +| source_nlgeom, source_perturbation_present | u8 effective0 / flag presence0 또는1 | +| source_eigensolver, source_sim, source_acoustic_coupling, source_normalization | utf8 effective LANCZOS,YES,ON,MASS | +| source_option_presence | u8[4] 위 네 option의 explicit presence 순서 | +| requested_mode_count, returned_mode_count | u64 N,N | +| full_dof_count, free_dof_count, mass_null_dimension, finite_dimension | u64 6nn,nf,nz,n; nf=n+nz | +| validated_eigenpair_count | u64 c; N<=c<=n | +| frame_indexing | utf8 mode-rank-one-based | + +별도 raw source-record table이나 duplicate reference provenance 파일은 필수로 만들지 않는다. +Raw keyword/data/blank fields는 Domain의 ParsedInput provenance와 source byte identity로 추적한다. + + +### 공개 modal 결과 + +Prefix `/steps/Step-1/eigen`. 새 result dataset의 공통 attrs는 +`eigen_schema_version:u64=1,source_step_name:utf8=,domain:utf8=mode`와 아래 quantity/ +component/dimension/coordinate/location이다. Numeric/physical values는 전부 finite다. + +| Dataset | Shape/type | Quantity·identity | +| --- | --- | --- | +| modes | [N] compound mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64 | 유일 Value authority; mode_id1..N 순서, quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame | +| frequencies | [Nv] compound mode_id:u64,frequency:f64 | modes 중 raw lambda>=0의 정확한 ID subset, mode order; quantity=cycle-frequency, component_names=Freq, component_unit_dimensions=time^-1, coordinate_system=scalar, location=modal-frame | +| vectors | [N,nn,6] f64 | Modes와 같은 mode axis, model/nodes와 같은 node axis; component_names=UX,UY,UZ,URX,URY,URZ, global-cartesian, nodal-modal-vector | + +Vectors는 **mandatory 내부 검증 projection**이다. 병진 dimension `mass^-1/2` 세 개와 +회전 `mass^-1/2*length^-1` 세 개를 component_unit_dimensions에 기록한다. +`normalization=mass,mass_variant=derived-lumped,interpretation=normalized-mode-not-response-displacement` +attrs를 둔다. 회전은 initial global infinitesimal rotation이다. Constrained component는 exact0. +Static displacement/reaction/stress/accepted_frames를 modal 결과로 생성하지 않는다. + +[NR raw 분류](numerical-review-controls.md)대로 mu=lambda/s의 절댓값<=1e-9는 +classification0=near-zero, 나머지 허용 양수는1=positive다. mu<-1e-9는 성공 파일을 만들 수 없다. +Raw lambda는 작은 음수도 보존하며 절댓값/zero clamp하지 않는다. Frequency는 raw lambda>0이면 +sqrt(lambda)/(2pi), exact0이면0, 음수에는 row가 없다. Mandatory frequencies dataset은 Nv=0도 +허용하며 unavailable_rule=negative-raw-eigenvalue를 기록한다. Finite/range 검사는 NR 기준이며 +양수의 frequency underflow-to-zero도 invalid-eigenvalue-result다. + +Sort는 paired raw lambda ascending, exact tie는 원 FEAST column order다. Sign은 최대 절댓값 +scaled global component(translation/ell,rotation)를 양수로, tie는 model row×DOF 순서다. +Cluster는 전체 c sorted pairs의 NR connected rule로 1부터 부여한 후 N개에 투영한다. +Cluster label은 진단 identity이며 mode average/deduplicate/외부 shape 비교를 유발하지 않는다. + + +### 전체 c 검증과 실제 backend evidence + +Prefix `/steps/Step-1/eigen/verification`. Attributes `characteristic_length:f64=ell [length]`, +`operator_scale:f64=s [time^-2]`는 positive finite다. `validation_scope=all-computed-c-columns`, +`eta_gram:f64,max_eta_orth:f64`는 dimension1, c=1이면 latter0이다. Null 검사는 +`null_checks_applicable:u8`와 `eta_mz,eta_kz,eta_pz:f64`로 저장한다. nz=0이면 flag0/storage0이며 +N/A이지 검증 통과 metric0이 아니다. 모든 metric 식과 limit는 NR controls와 채택 V식이다. 정규화 후 최종 phi에서 +modal_mass와 yf를 다시 계산하고 모든 저장 residual/Gram/Rayleigh/energy에 이 값을 사용한다. + +| Dataset | Shape / fields | +| --- | --- | +| nodal_reduction | [nn] compound free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64 | +| eigenpair_checks | [c] compound sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64 | + +두 검증 dataset attrs는 coordinate_system=scalar이며 location은 각각 nodal-mass-reduction, +eigenpair-verification이다. component_names는 표의 f64 fields 순서, component_unit_dimensions는 +아래 해당 field 차원 순서다. Nodal counts는 nn source row에 대응하고 합이 nf/nz/n과 일치한다. Positive block 없는 node는 +rcond_available0/storage0이다. Sorted_rank1..c, solver_column0-based unique, modes의 첫 N scalar와 +exact pairing한다. Eigenvalue/Rayleigh는 time^-2, 나머지는 dimension1이다. Backend relative res가 +zero-mode에서 정의되지 않는 경우에만 unavailable0/storage0으로 두고 의미를 명시한다. +Nonzero mode의 nonfinite res 및 모든 mandatory independent metric nonfinite는 실패다. + +C개 vectors는 solve/validation 동안 유지한다. Accepted state/HDF5에는 N vectors와 전체 c의 +metrics를 남긴다. N vectors로 같은 input의 K/ML를 재조립해 N개의 original-free residual/ +normalization을 재현할 수 있다. 전체 c Gram의 실제 검증 evidence는 runtime/test 결과로 남기며 +N vectors만으로 c Gram를 재계산했다고 주장하지 않는다. Full matrices의 영속 dump는 요구하지 않는다. + +Prefix `/steps/Step-1/eigen/backend` attributes: +`runtime_version:utf8,integer_abi:utf8=LP64|ILP64,thread_count:u64=1,seed:u64`, +`enclosure_lower:f64,enclosure_upper:f64,solve_lower:f64,solve_upper:f64`, +`count_calls:u64,solve_calls:u64,final_solve_ordinal:u64,final_count:u64=c`, +`upper_search_termination:utf8`를 둔다. 마지막 값은 count-target/width-limit/no-midpoint/ +optimization-budget/collision-exhausted/optional-status 중 실제 종료 이유다. +Bounds는 dimensionless B-space이며 사용자 frequency interval이 아니다. Seed는 NR 값이다. + +| Dataset | Shape / fields | 의미 | +| --- | --- | --- | +| base_fpm | [128] i64 | feastinit 뒤 NR override한 실제 solve control snapshot; defaults 포함. Count는 동일 snapshot에서 C-index49만1, 매 call 재초기화 | +| calls | [Lcalls] compound ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64,outcome:utf8,decision_reason:utf8 | 실제 chronological 호출, ordinal0-based; kind=count/solve, purpose=total-enclosure/upper-guard/final-count/solve | + +Count의 overwritten m0 또는 solve의 returned m을 count에 담고 allocated_m0와 구분한다. +Outcome은 accepted/optional-abandoned/retry이며 NR의 실제 결정에 대응한다. Decision_reason은 +accepted 또는 status/count-mismatch/endpoint-separation 등의 결정 원인과 필요한 관측값을 +round-trip decimal로 남긴다. 호출 없이 budget/width로 종료한 이유는 upper_search_termination에 둔다. +초기 enclosing 재시도에서만 a0가 확정 전 변경될 수 있고, 성공한 total enclosure 이후 하한은 고정이다. Guard 세 구간은 +각각 call row다. 실패·fallback을 삭제하지 않는다. Undefined vendor output은 flag0/storage0으로 +두고 읽지 않는다. 성공 count는 count_available1; 성공 solve는 loop/epsout available1이고 finite다. +Calls와 final interval/rank/c를 통해 fixed a0, certified upper/full enclosure fallback, budget, +capacity, returned count의 경로를 재구성할 수 있어야 한다. CLI live log로 이 trace를 옮기지 않는다. +Calls의 f64 component_names는 lower,upper,epsout이고 component_unit_dimensions=1,1,1, +coordinate_system=scalar,location=backend-call이다. Base_fpm은 component_names=fpm, +component_unit_dimensions=1,coordinate_system=none,location=backend-parameter다. +128개 per-call dump 대신 공통 snapshot 한 개와 kind로 실제 controls를 재현한다. 향후 call별 +control 차이를 추가하려면 이 표현과 NR 계약을 함께 재검토해야 한다. + + +### Closed candidate self-check + +현재 [self_check](../../src/fesa/io/hdf5/hdf5_self_check.cpp)는 static schema0/1 전용이므로 +별도 eigen dispatch/check가 필요하다. Candidate를 닫고 read-only reopen하여 다음을 검증한다. + +- Discriminator/metadata/source input bytes·step·요청수, known type/rank/shape/dimension attrs와 + model source identity uniqueness/각 reference ID range, density coverage/positivity를 candidate와 대조한다. +- Model mask는0/1, prescribed values exact0, modes inventory 정확히1..N, 오름차순·cluster/classification, + frequencies 정확한 subset, vectors paired axis/finite/constraint zero와 validated candidate 값을 대조한다. +- nf=n+nz 및 nodal count 합, N<=c<=n, c rank/solver-column uniqueness, first-N scalar pairing, + independent metrics finite/NR limits, applicable/available flags를 검사한다. N/A를 pass로 계산하지 않는다. +- Backend routine/ABI/runtime/base controls, actual call ordering/count/bounds/capacity/status/budget와 final + certified interval·c 및 successful all-c validation 연결을 확인한다. Static result paths가 없어야 한다. +- Mandatory row 누락/추가/중복/nonfinite/잘못된 quantity·units·mass는 실패한다. Writer가 sorting, + averaging, 값 수정으로 candidate mismatch를 수리하지 않는다. 모든 handle close 후에만 replace한다. + +Self-check는 serialization과 검증된 state의 동일성을 확인한다. 독립 physics/NR 테스트를 대신하거나 +저장 metric만으로 실행되지 않은 residual/Gram 계산을 통과로 인정하지 않는다. + + + + +## MITC4 eigen 내부 mapping·reference projection + +- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r2` (외부 Value acceptance만 변경). +- 기본 보고서: [io.md](io.md#io). 수학 원본: [formulation-eigen](formulation-eigen.md). + + +### 내부 소유권과 identity + +| Owner | 필수 의미와 mapping | +| --- | --- | +| ParsedInput | 실제 input bytes의 기존 content identity, lexical path, keyword/parameter presence·raw 값·빈 data slot·source line | +| Domain | 전체 geometry/source topology, section→material→constant rho, 원형상 director, homogeneous BC, sole Frequency definition; 파싱 후 가능한 불변 | +| Frequency definition | source step raw/canonical name, step/Frequency/data 위치, requested N, 각 option의 explicit presence/effective value, no-op warning inventory; storage Step-1과 구별 | +| AnalysisModel | Domain보다 짧은 수명의 활성 shell/material/section/BC/procedure const non-owning view | +| DofManager | Source node×고정 6 DOF, full/free/constrained injection, stable equation IDs/scatter/sparse pattern; Node/Element에 equation ID를 저장하지 않음 | +| Assembly/procedure | 실제 consistent moment→derived lumped→개선 K, 같은 source scatter/reduction; E1~E7의 constraint-first split·whitening·FEAST·복구·all-c validation | +| Private backend | Vendor CSR/index/workspace/FEAST control·runtime·call evidence; MKL type/header를 public core에 노출하지 않음 | +| Eigen state | Candidate/accepted 분리, N개의 paired raw scalar/global vectors, source mapping, c개 validation evidence; static/Newton state를 mode count로 재사용하지 않음 | +| ResultsWriter | Validated state serialization→closed candidate self-check→final replacement; 물리값·identity 재계산/보정으로 실패를 숨기지 않음 | + +Source `(instance_name,numeric source label)`과 raw spelling, internal model row, free equation +index, FEAST column, sorted rank, public mode ID는 별개다. Instance expansion/declaration의 기존 +model 순서와 DOF `UX,UY,UZ,URX,URY,URZ` 순서를 유지한다. Source renumbering 비교는 +geometry/connectivity/BC 대응을 함께 사용하며 숫자가 우연히 같은 internal ID를 source key로 +대체하지 않는다. Repeated eigenvalues는 별개 rank이며 특정 vector 방향의 유일성을 요구하지 않는다. + +Raw consistent 계산을 lumped로 덮어쓰지 않는다. Global dense mass dump는 필수 결과가 아니다. +실제 constrained free space에서만 analytic null을 제거하며 tiny positive mass를 rank cutoff로 +삭제하지 않는다. `requested N`, finite dimension n, count의 overwritten m0, allocated m0, +solve returned m, validated c, public N을 각기 보존한다. 모든 c를 검증한 뒤 첫 N을 공개한다. + + +### 실패와 공개 lifecycle + +Public CLI·path·lock·log는 [현재 공통 계약 §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 +유지한다. `fesa.exe `이며 output override를 추가하지 않는다. Input lexical sibling은 +`_results.h5`와 `_log.txt`다. 마지막 `.inp` extension만 제거하고 basename case· +앞선 dot은 보존한다. Symlink/junction을 resolve해 결과 위치를 바꾸지 않는다. + +1. Usage 검증→derived pair의 exclusive nonblocking ownership→live log open/truncate. +2. Parse/model/solve/all-c validation을 candidate에서 수행한다. 기존 accepted state/final은 유지한다. +3. Candidate state를 완성하고 log close 성공을 확인한다. 같은 directory의 exclusive-create private + HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다. +4. Final replace가 성공한 뒤 준비된 state를 no-fail swap한다. 이후 allocation/validation/callback + failure를 남기지 않는다. 실패 candidate는 authoritative 결과가 아니다. + +제어된 solve/validation/write/flush/close/reopen/self-check/replace 실패에서 이전 valid final과 +state를 보존한다. 이전 final이 없으면 만들지 않는다. Log는 별도 live lifecycle이며 rollback하지 +않는다. Eigen log에는 Newton iteration/FEAST trace를 새로 쓰지 않고 정상 log는 zero-byte다. +Backend evidence는 아래 result/Status에 둔다. Lock 실패는 기존 log/final도 건드리지 않는다. +Candidate 정리는 best effort이며 다른 run 파일을 삭제하지 않는다. Crash/power-loss 전체 원자성은 +약속하지 않는다. Reference `.inp`/TXT/CSV는 read-only이며 output으로 덮어쓰지 않는다. + +| Solver 실패 / exit5 | Stable code·필수 context | +| --- | --- | +| Analytic mass space·null identity 오류 | invalid-eigen-mass-space: node/DOF/n/nz·실패 identity | +| Positive block conditioning 실패 | eigen-mass-conditioning: node·metric·관측값·NR limit | +| Checked index/capacity 또는 CSR | eigen-index-overflow / invalid-eigen-csr: n,nnz,N,m0와 실패 bound | +| Workspace allocation | eigen-allocation-failed: 역할·checked byte request; N 축소 없음 | +| Fatal FEAST status | eigen-feast-failed: raw info, call kind/ordinal, interval, allocated m0 | +| Count/solve 수·monotonicity 불일치 | eigen-count-inconsistent: 실제 count history·certified interval | +| Endpoint separation | eigen-endpoint-separation: raw endpoints·nearest returned value·NR limit | +| Mandatory search budget 소진 | eigen-search-budget-exhausted: attempts·마지막 safe bracket·fallback 가능 여부 | +| Significant negative spectrum | negative-eigenvalue-spectrum: raw lambda/mu/s·rank·NR limit | +| Nonfinite/invalid conversion/frequency | invalid-eigenvalue-result: raw quantity·stage·source step | +| Pair/Gram/original-free residual/energy 실패 | eigenpair-validation-failed: metric·value·limit·solver column/rank | + +선택적 upper-prefix 최적화에서 인증되지 않은 empty/count status는 count0으로 바꾸지 않는다. +Formulation E4와 NR가 허용한 safe bracket fallback은 실패를 은폐한 성공 count가 아니며 +actual attempted call·종료 이유를 evidence에 남긴다. Mandatory final count/solve/validation 실패는 +부분 결과로 성공하지 않는다. Count workspace의 작은/null scratch를 문헌 보장으로 가정하지 않는다. +Failure Status는 Frequency 위치와 지금까지의 chronological call context를 포함한다. +Undefined vendor outputs는 읽지 않고 unavailable로 표시한다. Allocation 실패의 부속 message +생성은 기존 best-effort diagnostic 한계를 따른다. + + +### 원본 TXT grammar와 prechecks + +Input은 `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp`, reference는 같은 폴더의 +`shellNL-eigen-meshfine eigenvalues.txt`다. 이름 변경, TXT rewrite, CSV 변환, companion +README/metadata/version/provenance 추가를 요구하지 않는다. TXT에 step이 없으므로 지정 input의 +**유일한 frequency source step Step-2**에 대응한다. 이름에서 ODB frame index를 추정하지 않는다. + +LF/CRLF logical line에서 space/tab-only 행은 건너뛴다. 나머지는 아래 case-sensitive full-match다. +`ws=[ \t]*`, `ws1=[ \t]+`; id는 checked positive int64 decimal이다. + +```text +number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)? +id := [0-9]+ +row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number + ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws +``` + +Header/footer/comment/BOM/extra token/malformed row는 schema 실패다. Value는 finite binary64 +full conversion이며 range error를 거부한다. Freq는 숫자 token 구조만 검사하며 수치 변환· +물리 일치·오차 판정에 사용하지 않는다. Freq에서 Value를 재구성하지 않는다. 같은 numeric mode +ID의 재등장은 duplicate이며 같은 Value의 다른 mode는 정상이다. + +Tolerance 전에 다음을 순서대로 완료한다. + +1. 지정 input/TXT와 HDF5 존재, eigen discriminator, source_input_identity를 현재 입력의 + lexical path와 기존 byte-content identity에 대조한다. Static output·unknown eigen schema를 거부한다. +2. Input sole source step/N을 직접 읽어 HDF5 source step·requested/public count와 대응한다. + N을 TXT row 수나 검증 c에서 추론하지 않는다. 현재 양쪽 required mode inventory는 1..10이다. +3. TXT 모든 nonblank row를 parse하고 duplicate/missing/extra/nonfinite를 거부한다. Malformed-row + skip/dictionary overwrite/값 sorting으로 source mode identity를 바꾸지 않는다. +4. HDF5 mandatory dataset/type/shape, units·quantity·실제 backend·mass variant·normalization, + source/model identities, modes ID 1..N, paired vector shape, raw eigenvalue finite를 검사한다. + HDF5 순서 오류는 reader 재정렬로 숨기지 않는다. 값이 같아도 ID가 다르면 multiplicity다. +5. `(case,source_step_name,mode_id,component=Value)`로 one-to-one join하고 mode ID 순서로 출력한다. + TXT row reorder는 허용한다. `modes.eigenvalue`만 FESA scalar authority다. c개 검증 table, + frequencies, vectors 또는 static fields에서 fallback하지 않는다. + + +### Family와 보고 + +[NR reference-model](reference-model.md)이 정의하는 family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue, +dimension=time^-2,coordinates=scalar,impact=blocking)`다. Mode별 frame은 10개 singleton +family이며 하나의 storage table이라고 서로 합치지 않는다. 2026-09-10 사용자 명시 5% 승인과 +[MFE2-ADR-012](ADR.md)에 따라 [공통 TOLERANCE](../TOLERANCE.md)의 승인된 한정 정책 +`mitc4-eigen-first-implementation`을 이 Feature의 외부 Value 비교에 적용한다. +Reference-only S와 near-zero 분류·row branch는 유지하고 상대오차와 relative RMS의 한계를 +각각 `0.05`로 적용한다. 같은 identity의 양수 singleton에서는 두 metric이 모두 +`abs(FESA - reference) / abs(reference)`이므로 mode별 5% 이하(inclusive)가 통과 조건이다. +Mode 사이 평균·collapse·재정렬로 실패를 숨기지 않는다. S=0은 exact-zero FESA만 성공하며, +missing/extra/duplicate/nonfinite/schema/identity 오류는 위 prechecks에서 먼저 거부한다. +다른 공통 family의 RMS `0.01`과 전체 c개 내부 독립 검증 `1e-10`은 유지한다. +이는 승인된 첫 구현 acceptance이며 후속 정확도 개선이나 S3 해결의 evidence가 아니다. + +Report는 input/reference/result identity, freshness evidence, 전체 prechecks, source key/ +component/family/count/S, raw reference/FESA/error·branch·row verdict, RMS·family verdict, +blocking failure와 overall verdict를 mode 순서로 남긴다. Comparator report는 +`policy_id=mitc4-eigen-first-implementation`과 `relative_rms_tolerance=0.05`를 명시해 +공통 RMS 1% 정책과 구별한다. 임의 tolerance를 지정하는 generic policy argument는 노출하지 않는다. +이 report 계약 변경은 HDF5 field·shape·단위·schema version을 변경하지 않는다. +Zero-scale 미정 metric은 named state로 +표시하고 NaN/Inf/floor를 넣지 않는다. 필요 시 HDF5 projection CSV는 보조 debug view일 뿐이다. + +외부 eigen gate는 Value뿐이다. N개의 global vectors는 내부 constraint/residual/normalization +재검증용이며 외부 shape reference는 요구하지 않는다. 기존 static 회귀는 [requirements](requirements.md#requirements)의 +retained shell/shellNL/linear-limit portfolio와 기존 source step/frame·U blocking·UR warning-only, +nonlinear reaction review-only 의미를 유지한다. 제외 네 예제는 원본·복사·cache로도 사용하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md b/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md index 6c72254..b049018 100644 --- a/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md +++ b/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md @@ -1,11 +1,11 @@ # 필수 검증 사례와 요구사항 연결 - Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r2` (2026-09-10, E2-C25의 승인된 첫 구현 profile 반영). -- 기본 보고서: [numerical-review](numerical-review.md); 판정 수치: [controls](numerical-review-controls.md). -- 아래는 구현의 필수 관찰이다. 문서 r1 시점의 실제 수학 oracle는 [evidence](numerical-review-evidence.md)이며, - 최신 실행·미실행 분류는 [첫 구현 검토](implementation-first-version-review.md)를 따른다. +- 기본 보고서: [numerical-review](numerical-review.md#numerical-review); 판정 수치: [controls](numerical-review-controls.md). +- 아래는 구현의 필수 관찰이다. 문서 r1 시점의 실제 수학 oracle는 [evidence](numerical-review.md#numerical-review-evidence)이며, + 최신 실행·미실행 분류는 [첫 구현 검토](implementation-review.md#implementation-first-version-review)를 따른다. -[이전 case C01–C24](../mitc4-shell-feast-eigen/numerical-review-cases.md)의 synthetic fixture와 +[이전 case C01–C24](../mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases)의 synthetic fixture와 독립 oracle를 읽고 새 formulation에 대조해 아래에 채택한다. 숫자·fixture 상세는 그 문서를 참조하되 **이 문서의 새 controls와 아래 예외가 우선**한다. 기존 requirement prefix, RED 고정 순서·phase/release 절차·test 이름/개수·이전 pass는 채택하지 않는다. @@ -46,7 +46,7 @@ E2-C17/18/22는 mock만으로 충족하지 않는다. E2-C21의 실패 주입은 설정하거나 동일 production 함수를 oracle로 호출하지 않는다. Actual FEAST의 G01/G02 installed probes에는 occupied/empty/endpoint count 반환·flag reset·full m0=n/zero matrix· workspace/ABI/thread 복원이 포함된다. r1 문서 시점에는 **NOT RUN**이었으며, -이후 실행 여부는 [첫 구현 검토](implementation-first-version-review.md)의 evidence와 구분한다. +이후 실행 여부는 [첫 구현 검토](implementation-review.md#implementation-first-version-review)의 evidence와 구분한다. E2-C26은 excluded original/copied/cached examples를 절대로 사용하지 않는다. 제외된 혼합 시험에 있던 retained shellNL force/moment balance·free force/moment residual diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md b/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md index b3f9210..d50deb3 100644 --- a/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md +++ b/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md @@ -1,20 +1,20 @@ # 내부 수치 기준과 FEAST controls - Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r2` (2026-09-10, C5 종료 제어만 변경). -- 기본 보고서: [numerical-review](numerical-review.md); 수식: [새 formulation](formulation.md). +- 기본 보고서: [numerical-review](numerical-review.md#numerical-review); 수식: [새 formulation](formulation.md). - IEEE binary64의 내부 검증 계약이며 [외부 TOLERANCE](../TOLERANCE.md)를 변경하지 않는다. - 아래 `NOT RUN`은 r1 문서 검토 당시의 기록이다. 변경된 C5의 실제 실행 판정은 - [종료 제어 구현 검토](implementation-feast-residual-review.md)를 따른다. + [종료 제어 구현 검토](implementation-review.md#implementation-feast-residual-review)를 따른다. ## C1–C4, C6, C7의 독립 검토 후 명시 채택 -[이전 controls](../mitc4-shell-feast-eigen/numerical-review-controls.md)의 C1, C2-01~14와 +[이전 controls](../mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls)의 C1, C2-01~14와 nodal rcond 절, C3-01~08와 raw classification, C4, C6의 seed/QR/thread/storage, C7의 retained static 기준을 전부 읽고 새 M/S/E 식에 대조하여 **수치 정의만 채택**한다. 이것은 과거 판정·runtime·reference pass의 승계가 아니다. 다음 적용 경계가 우선한다. - E/V/S 식 번호는 [새 formulation](formulation.md)과 그 문서가 명시 채택한 - [V1–V5 측정식](../mitc4-shell-feast-eigen/formulation-verification.md)에 대응한다. + [V1–V5 측정식](../mitc4-shell-feast-eigen/formulation.md#formulation-verification)에 대응한다. - 이전 C5 전체와 lower/empty-prefix search는 채택하지 않는다. 아래 C5가 완전히 대체한다. - C6 count `n×n`은 이번의 보수적 allocation 선택이며 Intel의 최소 workspace 의무가 아니다. Count input capacity `n`, 반환 count, solve capacity `m0`, 요청 `N`은 서로 다른 값이다. @@ -64,7 +64,7 @@ residual stopping, CSR/SPD checks와 count flag reset을 확인했다. 위 값 그대로다. Vendor residual의 정규화와 독립 rho_B를 동일시하지 않으며 `info=0`도 독립 검증을 대체하지 않는다. `epsout`은 trace 변화 진단량으로 보존하고 새 residual 오차로 재해석하지 않는다. 기존 trace 실행의 pass/fail·loop·epsout은 당시 controls의 이력이다. Zero/mixed-zero/repeated -및 원본 모델의 새 실행과 미해결 위험은 [종료 제어 구현 검토](implementation-feast-residual-review.md)에 +및 원본 모델의 새 실행과 미해결 위험은 [종료 제어 구현 검토](implementation-review.md#implementation-feast-residual-review)에 구분한다. S3·물리 정식화·공통 외부 tolerance는 이 결정으로 변경하지 않는다. Gershgorin off-diagonal absolute row sum은 매 합산 뒤 `nextafter(+infinity)`로 outward @@ -119,6 +119,6 @@ Count `x[n*n]`, `e[n]`, `res[n]` 보수 storage와 identity initial subspace를 container max_size 및 `min(SIZE_MAX,PTRDIFF_MAX)`를 overflow **전** 검사한다. Global inverse를 만들지 않으며 allocation/shifted factorization 실패는 명시적으로 종료한다. Count n² scratch는 최소 memory 보장이나 전체 peak memory 추정이 아니다. -[Research G01/G02](research-evidence.md)의 installed empty/occupied/endpoint/count reset, +[Research G01/G02](research.md#research-evidence)의 installed empty/occupied/endpoint/count reset, workspace·header/runtime probes는 **NOT RUN**이다. Safe enclosing fallback으로 빈 count 성공이 수학적 전제에서는 제거됐지만 실제 FEAST 실행·메모리·cluster 동작 검증 의무는 남는다. diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md b/docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md deleted file mode 100644 index 974d30d..0000000 --- a/docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md +++ /dev/null @@ -1,191 +0,0 @@ -# 독립 수학 검산 evidence - -- Feature ID: `mitc4-shell-feast-eigen2` -- Owner: `numerical-review-agent` -- 검토일: `2026-09-08`; 기본 보고서: [numerical-review](numerical-review.md). -- 대상: 새 requirement r1. 아래는 Python 표준 라이브러리만 사용하는 수학 검산이며 C++/FEAST 실행이 아니다. - -## NR-MFE-001의 geometry부터 재계산 - -`a=(0,1,0)`, `b=(-4/5,0,3/5)`, `d=(3/5,0,4/5)`이고 -`X=[-2a-b,2a-b,2a+b,-2a+b]`, `E=12`, `nu=0`, `rho=t=1`이다. -Node 1 URZ만 free이고 나머지 23 DOF는 fixed다. Z45° 회전은 같은 physical -free subspace를 유지한다. 아래는 [이전 독립 적분](../mitc4-shell-feast-eigen/numerical-review-evidence.md)의 -평판 membrane/curvature/MITC edge-work를 검토한 뒤 geometry edge에서 길이·axes·director를 -다시 얻도록 구성한 새 실행이다. 기존 수치 출력이나 저장 K를 입력으로 쓰지 않는다. -전역 24×24 physical K를 직접 적분하고 새 director의 least-aligned tangent를 재생성해 -여덟 rotary diagonal의 trace mean을 계산한다. 비교 대상 congruence에만 원 K를 회전한다. -Norm에는 ell=4, D=diag(ell I3,I3)를 사용하여 matrix는 D^T A D, -response는 D^-1 q, force/moment residual은 D^T r로 같은 단위를 만든다. - -```python -from math import sqrt, fsum -from fractions import Fraction as F -def dot(a,b): return fsum(x*y for x,y in zip(a,b)) -def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) -def norm(a): return sqrt(dot(a,a)) -def unit(a): return tuple(x/norm(a) for x in a) -def sub(a,b): return tuple(x-y for x,y in zip(a,b)) -def rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) -def action(A,x): return [dot(row,x) for row in A] -def rotate_vector(v): return [x for i in range(0,len(v),3) for x in rz(v[i:i+3])] -def rotate_matrix(A): - left=list(zip(*(rotate_vector(c) for c in zip(*A)))) - return [rotate_vector(row) for row in left] -def err(a,b): return norm(sub(a,b))/(norm(a)+norm(b)) -D=[4. if i%6<3 else 1. for i in range(24)] -def merr(A,B): return err([D[i]*A[i][j]*D[j] for i in range(24) for j in range(24)],[D[i]*B[i][j]*D[j] for i in range(24) for j in range(24)]) -def qerr(a,b): return err([x/s for x,s in zip(a,D)],[x/s for x,s in zip(b,D)]) -def rerr(a,b): return err([x*s for x,s in zip(a,D)],[x*s for x,s in zip(b,D)]) -def build(X): - edge1=sub(X[1],X[0]); edge2=sub(X[3],X[0]) - lx,ly=norm(edge1),norm(edge2); ex,ey=unit(edge1),unit(edge2) - d=unit(cross(ex,ey)); area=lx*ly - K=[[0.]*24 for _ in range(24)] - for xi in [-1/sqrt(3),1/sqrt(3)]: - for eta in [-1/sqrt(3),1/sqrt(3)]: - fields=[] - for sx,sy in [(-1,-1),(1,-1),(1,1),(-1,1)]: - nx=sx*(1+sy*eta)/(2*lx); ny=sy*(1+sx*xi)/(2*ly) - tx=(1+sy*eta)/4; ty=(1+sx*xi)/4 - for c in range(3): - fields.append(([nx*ex[c],ny*ey[c],ny*ex[c]+nx*ey[c]],[0,0,0],[nx*d[c],ny*d[c]])) - for c in range(3): - fields.append(([0,0,0],[nx*ey[c],-ny*ex[c],ny*ey[c]-nx*ex[c]],[tx*ey[c],-ty*ex[c]])) - for i,(mi,bi,si) in enumerate(fields): - for j,(mj,bj,sj) in enumerate(fields): - K[i][j]+=area/4*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj)) - axis=min(range(3),key=lambda k:(abs(d[k]),k)) - ta=unit(tuple(float(c==axis)-d[axis]*d[c] for c in range(3))) - tb=cross(d,ta); diag=[] - for i in range(4): - for tangent in [ta,tb]: - v=[0.]*24; v[6*i+3:6*i+6]=tangent - diag.append(dot(v,action(K,v))) - kd=fsum(diag)/8000 - M=[[0.]*24 for _ in range(24)] - for i in range(4): - for a in range(3): - M[6*i+a][6*i+a]=area/4 - for b in range(3): - K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b] - M[6*i+3+a][6*i+3+b]=area/48*(float(a==b)-d[a]*d[b]) - return K,M,kd,d,ey,diag -a=(0.,1.,0.); b=(-.8,0.,.6) -X=[tuple(s*a[k]+t*b[k] for k in range(3)) for s,t in [(-2,-1),(2,-1),(2,1),(-2,1)]] -K,M,kd,d,ey,diags=build(X) -Kr,Mr,kdr,dr,eyr,diagsr=build([rz(x) for x in X]) -load=[0.]*24; load[3:6]=[5*x/3 for x in ey]; lr=rotate_vector(load) -q=[0.]*24; qr=[0.]*24; q[5]=load[5]/K[5][5]; qr[5]=lr[5]/Kr[5][5] -r=sub(action(K,q),load); rr=sub(action(Kr,qr),lr) -targets=[float(F(19,4800)),float(F(10369,7500)),float(F(3,50)),float(F(10369,450)),float(F(7500,10369))] -actual=[kd,K[5][5],M[5][5],K[5][5]/M[5][5],q[5]] -for v,w in zip(actual,targets): assert abs(v-w)/(abs(v)+abs(w))<1e-12 -cov=[merr(Kr,rotate_matrix(K)),merr(Mr,rotate_matrix(M)),qerr(qr,rotate_vector(q)),rerr(rr,rotate_vector(r))] -assert max(cov)<1e-12 -assert abs(kd-kdr)/(abs(kd)+abs(kdr))<1e-12 -assert abs(dot(d,load[3:6]))/norm(load[3:6])<1e-12 -for A,v,f,residual in [(K,q,load,r),(Kr,qr,lr,rr)]: - assert abs(residual[5])/(abs(A[5][5]*v[5])+abs(f[5]))<=1e-10 -print('partial_bc=',actual) -print('rotated_partial_bc=',[kdr,Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5]]) -print('covariance_K_M_q_reaction=',cov) -print('fresh_rotary_diagonals=',diags,diagsr) -``` - -## 독립 rational mass oracle - -다음 coefficient-dictionary 적분은 production shape/J/질량 함수를 사용하지 않는다. -이전 문서의 rational fixture 자체는 재사용하지만 모든 계수·행합·first moment를 이번에 -다시 적분한다. Kernel-level director fixture이며 input explicit-normal 지원을 추가하지 않는다. - -```python -from fractions import Fraction as F -from itertools import permutations, product -from math import sqrt -def const(x): return {(0,0,0):F(x)} -def add(*args): - out={} - for a in args: - for p,c in a.items(): out[p]=out.get(p,F(0))+c - return {p:c for p,c in out.items() if c} -def scale(a,c): return {p:v*c for p,v in a.items() if v*c} -def mul(a,b): - out={} - for p,c in a.items(): - for q,d in b.items(): - key=tuple(x+y for x,y in zip(p,q));out[key]=out.get(key,F(0))+c*d - return {p:c for p,c in out.items() if c} -def diff(a,k): - out={} - for p,c in a.items(): - if p[k]: - q=list(p);q[k]-=1;out[tuple(q)]=c*p[k] - return out -def integ(a): return sum((c*F(8,(p[0]+1)*(p[1]+1)*(p[2]+1)) for p,c in a.items() if all(v%2==0 for v in p)),F(0)) -def value(a,x): return sum(float(c)*x[0]**p[0]*x[1]**p[1]*x[2]**p[2] for p,c in a.items()) -v=[{tuple(int(k==i) for k in range(3)):F(1)} for i in range(3)] -N=[scale(mul(add(const(1),scale(v[0],sx)),add(const(1),scale(v[1],sy))),F(1,4)) for sx,sy in [(-1,-1),(1,-1),(1,1),(-1,1)]] -X=[(-1,-1,F(1,10)),(1,-1,-F(1,10)),(1,1,F(1,5)),(-1,1,-F(1,10))] -d=[(0,0,1),(F(3,5),0,F(4,5)),(F(2,3),F(1,3),F(2,3)),(0,F(3,5),F(4,5))] -z=scale(v[2],F(1,4));pos=[add(*(mul(N[i],add(const(X[i][c]),scale(z,d[i][c]))) for i in range(4))) for c in range(3)] -J={} -for perm in permutations(range(3)): - inversions=sum(perm[i]>perm[j] for i in range(3) for j in range(i+1,3)) - term=const((-1)**inversions) - for c in range(3): term=mul(term,diff(pos[c],perm[c])) - J=add(J,term) -rhoJ=scale(J,F(3));zk=[const(1),z,mul(z,z)] -polys=[[[mul(mul(mul(rhoJ,N[i]),N[j]),zk[k]) for j in range(4)] for i in range(4)] for k in range(3)] -C=[[[integ(p) for p in row] for row in mat] for mat in polys] -rows=[[sum(row,F(0)) for row in mat] for mat in C] -assert [mat[0][0] for mat in C]==[F(17609,28800),F(11003,1440000),F(88177,6912000)] -assert [sum(row,F(0)) for row in rows]==[F(7743,1600),F(739,12000),F(517,5120)] -first=[sum((rows[0][i]*X[i][c]+rows[1][i]*d[i][c] for i in range(4)),F(0)) for c in range(3)] -assert first==[integ(mul(rhoJ,p)) for p in pos] -g=[(-sqrt(3/5),5/9),(0.,8/9),(sqrt(3/5),5/9)] -maxerr=0.;jvals=[] -for q in product(g,repeat=3): jvals.append(value(J,[s[0] for s in q])) -for k,i,j in product(range(3),range(4),range(4)): - approx=sum(value(polys[k][i][j],[s[0] for s in q])*q[0][1]*q[1][1]*q[2][1] for q in product(g,repeat=3)) - maxerr=max(maxerr,abs(approx-float(C[k][i][j]))) -assert min(jvals)>0 and maxerr<1e-12 -central=[rows[2][i]-rows[1][i]**2/rows[0][i] for i in range(4)] -assert min(central)>0 -print('mass_C11=',[str(mat[0][0]) for mat in C]) -print('mass_rows=',[[str(x) for x in row] for row in rows]) -print('mass_first_moment=',[str(x) for x in first]) -print('mass_Jrange_Gauss_error_central=',min(jvals),max(jvals),maxerr,float(min(central))) -``` - -## 이번 실행 결과 - -2026-09-08 PowerShell here-string에서 이 문서의 두 Python block을 추출하고 -`subprocess.run([sys.executable,'-B','-'])`으로 각각 실행했다. Oracle 1/2 exit `0`이다. - -| 항목 | 이번 직접 계산 | -| --- | --- | -| `kd`, `Kff`, `Mff` | `0.003958333333333333`, `1.3825333333333332`, `0.05999999999999998` | -| `lambda` 원/회전 | `23.04222222222223` / `23.042222222222208`; exact `10369/450 [T^-2]` | -| 단위 moment의 `thetaZ` 원/회전 | `0.7233098659465717` / `0.7233098659465714`; exact `7500/10369` | -| Complete `K`, `ML`, response, full reaction 공변성 ratio | `1.658e-16`, `7.851e-17`, `1.535e-16`, `1.706e-16` | -| 원/회전 free residual raw | `0`, `-1.1102230246251565e-16`; 기존 scaled `1e-10` 기준 충족 | -| Rational `C0_11,C1_11,C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` | -| `sum m,sum h,sum j` | `7743/1600`, `739/12000`, `517/5120` | -| Spatial first moment 두 독립식 | Exact equal: `(-79747/360000,-685951/2880000,49651/320000)` | -| 27점 J min/max | `0.1285991922161525` / `0.2701341411171808` | -| Gauss vs rational 최대 entry absolute error | `2.220446049250313e-16` | -| 최소 nodal central inertia | `0.022318161338791092 > 0` | - -최초 oracle 1 exit `1`은 회전 후 raw free residual에 잘못 추가한 exact-zero assertion이었다. -반력은 일반 floating arithmetic이며 원 계약은 scaled residual `1e-10`이다. -이를 기존 기준으로 수정하고 raw 값을 보존했다. Exact constrained displacement zero 조건, -정식화 또는 승인 tolerance를 변경한 것이 아니다. - -외부 solver, FEAST runtime, build/test, retained static fresh solve 및 HDF5–reference -comparison은 **NOT RUN**이다. 위 항등식의 통과는 구현/reference 통과가 아니다. - -최종 정적 Python audit는 owned Markdown 5개, 상대 파일 링크 38개, requirement 27개와 -case 27개의 유일·연속 identity, UTF-8/whitespace/final newline을 검사했고 exit `0`이었다. -두 oracle 모두 exit `0`; 이후 norm의 length congruence 명시를 코드에 반영하고 영향받은 -첫 oracle를 재실행하여 exit `0` 및 위 최종 scaled ratio를 확인했다. 식·판정 한계는 불변이다. diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review.md b/docs/mitc4-shell-feast-eigen2/numerical-review.md index d0e975e..36cf1f2 100644 --- a/docs/mitc4-shell-feast-eigen2/numerical-review.md +++ b/docs/mitc4-shell-feast-eigen2/numerical-review.md @@ -1,12 +1,20 @@ -# 독립 Numerical Review +# MITC4 eigen 독립 검산과 판정 + + + + + + +## 독립 Numerical Review - Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r1`. -- 입력: [requirements r1](requirements.md), [evidence](requirements-evidence.md), - [새 research](research.md), [새 formulation r1](formulation.md), [TOLERANCE](../TOLERANCE.md). +- 입력: [requirements r1](requirements.md#requirements), [evidence](requirements.md#requirements-evidence), + [새 research](research.md#research), [새 formulation r1](formulation.md), [TOLERANCE](../TOLERANCE.md). - Verdict: **`pass-for-io-definition`**. 새 수학 계약의 확인된 blocking defect 없음. - 범위: 문서·독립 수학 검산. 구현, FEAST runtime, build/test, reference comparison, Physics/release 통과 판정이 아니다. -## 판단과 독립 근거 + +### 판단과 독립 근거 새 질량·stabilization·constraint/FEAST 문서를 실제 작성 후 모두 읽었다. 기존 pass를 전제로 삼지 않고 새 요구 27개와 식·실패 경계를 대조했다. @@ -25,13 +33,14 @@ | Recovery·state | 최종 normalized phi에서 gi/yf를 다시 계산한 full original-free residual·Gram·Rayleigh/energy를 검사. Constrained components exact zero; modal reaction/stress를 새 output으로 만들지 않음. 검증 candidate·writer finalize 후 state commit 경계 유지 | | 비선형 영향 | Initial kd의 Dkd=D²kd=0으로 기존 objective potential의 residual/Hessian 미분을 유지. Nonlinear Hessian SPD나 초기 Dgamma=linear Td를 주장하지 않음. 선형극한·objectivity·회귀·rollback은 후속 실행 의무 | -Fresh 독립 oracle의 재현 코드와 실제 값은 [numerical-review-evidence](numerical-review-evidence.md)에 있다. +Fresh 독립 oracle의 재현 코드와 실제 값은 [numerical-review-evidence](numerical-review.md#numerical-review-evidence)에 있다. NR-MFE-001은 `kd=19/4800`, `Mff=3/50`, `Kff=10369/7500`, `lambda=10369/450`, 단위 moment `thetaZ=7500/10369`을 확인했다. Complete K/ML/response/full reaction 공변성 ratio는 모두 `1.8e-16` 미만이다. 곡면 mass rational oracle와 27점 적분 최대 entry 차는 `2.221e-16` 미만이었다. -## 고정한 기준과 후속 인계 + +### 고정한 기준과 후속 인계 - [내부 controls](numerical-review-controls.md): 검토 후 채택한 기존 C1–C4/C6/C7 수치 정의, 새 fixed-lower C5·finite budgets·seed·conditioning·raw classification. 기존 workflow/제외 portfolio/과거 pass는 미채택. @@ -46,7 +55,8 @@ I/O는 정확한 입력 allowlist·diagnostic·영속 HDF5 경로 및 source/mod raw negative/nearzero와 frequency validity, 실패한 optional optimization·fallback까지의 count/solve history를 의미 손실 없이 연결해야 한다. 데이터 layout은 NR가 선점하지 않는다. -## 잔여 위험·미실행 + +### 잔여 위험·미실행 Research G01/G02의 installed count-empty/endpoint/workspace·ABI probes, n1/N=n/allzero/ repeated/clustered actual FEAST와 shifted sparse factorization memory는 **NOT RUN**이다. @@ -62,3 +72,200 @@ locking·accuracy, 27점 밖 geometry injectivity 및 floating count의 정확 확인된 수학 correction request는 없다. 구현 owner는 명시 controls/cases를 실제 runtime과 연결하고 I/O owner는 reference/validation projection을 보존해야 한다. Source/tests, upstream 계약·공통 tolerance·reference artifacts·Git은 수정하지 않았다. + + + + +## 독립 수학 검산 evidence + +- Feature ID: `mitc4-shell-feast-eigen2` +- 검토일: `2026-09-08`; 기본 보고서: [numerical-review](numerical-review.md#numerical-review). +- 대상: 새 requirement r1. 아래는 Python 표준 라이브러리만 사용하는 수학 검산이며 C++/FEAST 실행이 아니다. + + +### NR-MFE-001의 geometry부터 재계산 + +`a=(0,1,0)`, `b=(-4/5,0,3/5)`, `d=(3/5,0,4/5)`이고 +`X=[-2a-b,2a-b,2a+b,-2a+b]`, `E=12`, `nu=0`, `rho=t=1`이다. +Node 1 URZ만 free이고 나머지 23 DOF는 fixed다. Z45° 회전은 같은 physical +free subspace를 유지한다. 아래는 [이전 독립 적분](../mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence)의 +평판 membrane/curvature/MITC edge-work를 검토한 뒤 geometry edge에서 길이·axes·director를 +다시 얻도록 구성한 새 실행이다. 기존 수치 출력이나 저장 K를 입력으로 쓰지 않는다. +전역 24×24 physical K를 직접 적분하고 새 director의 least-aligned tangent를 재생성해 +여덟 rotary diagonal의 trace mean을 계산한다. 비교 대상 congruence에만 원 K를 회전한다. +Norm에는 ell=4, D=diag(ell I3,I3)를 사용하여 matrix는 D^T A D, +response는 D^-1 q, force/moment residual은 D^T r로 같은 단위를 만든다. + +```python +from math import sqrt, fsum +from fractions import Fraction as F +def dot(a,b): return fsum(x*y for x,y in zip(a,b)) +def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) +def norm(a): return sqrt(dot(a,a)) +def unit(a): return tuple(x/norm(a) for x in a) +def sub(a,b): return tuple(x-y for x,y in zip(a,b)) +def rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) +def action(A,x): return [dot(row,x) for row in A] +def rotate_vector(v): return [x for i in range(0,len(v),3) for x in rz(v[i:i+3])] +def rotate_matrix(A): + left=list(zip(*(rotate_vector(c) for c in zip(*A)))) + return [rotate_vector(row) for row in left] +def err(a,b): return norm(sub(a,b))/(norm(a)+norm(b)) +D=[4. if i%6<3 else 1. for i in range(24)] +def merr(A,B): return err([D[i]*A[i][j]*D[j] for i in range(24) for j in range(24)],[D[i]*B[i][j]*D[j] for i in range(24) for j in range(24)]) +def qerr(a,b): return err([x/s for x,s in zip(a,D)],[x/s for x,s in zip(b,D)]) +def rerr(a,b): return err([x*s for x,s in zip(a,D)],[x*s for x,s in zip(b,D)]) +def build(X): + edge1=sub(X[1],X[0]); edge2=sub(X[3],X[0]) + lx,ly=norm(edge1),norm(edge2); ex,ey=unit(edge1),unit(edge2) + d=unit(cross(ex,ey)); area=lx*ly + K=[[0.]*24 for _ in range(24)] + for xi in [-1/sqrt(3),1/sqrt(3)]: + for eta in [-1/sqrt(3),1/sqrt(3)]: + fields=[] + for sx,sy in [(-1,-1),(1,-1),(1,1),(-1,1)]: + nx=sx*(1+sy*eta)/(2*lx); ny=sy*(1+sx*xi)/(2*ly) + tx=(1+sy*eta)/4; ty=(1+sx*xi)/4 + for c in range(3): + fields.append(([nx*ex[c],ny*ey[c],ny*ex[c]+nx*ey[c]],[0,0,0],[nx*d[c],ny*d[c]])) + for c in range(3): + fields.append(([0,0,0],[nx*ey[c],-ny*ex[c],ny*ey[c]-nx*ex[c]],[tx*ey[c],-ty*ex[c]])) + for i,(mi,bi,si) in enumerate(fields): + for j,(mj,bj,sj) in enumerate(fields): + K[i][j]+=area/4*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj)) + axis=min(range(3),key=lambda k:(abs(d[k]),k)) + ta=unit(tuple(float(c==axis)-d[axis]*d[c] for c in range(3))) + tb=cross(d,ta); diag=[] + for i in range(4): + for tangent in [ta,tb]: + v=[0.]*24; v[6*i+3:6*i+6]=tangent + diag.append(dot(v,action(K,v))) + kd=fsum(diag)/8000 + M=[[0.]*24 for _ in range(24)] + for i in range(4): + for a in range(3): + M[6*i+a][6*i+a]=area/4 + for b in range(3): + K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b] + M[6*i+3+a][6*i+3+b]=area/48*(float(a==b)-d[a]*d[b]) + return K,M,kd,d,ey,diag +a=(0.,1.,0.); b=(-.8,0.,.6) +X=[tuple(s*a[k]+t*b[k] for k in range(3)) for s,t in [(-2,-1),(2,-1),(2,1),(-2,1)]] +K,M,kd,d,ey,diags=build(X) +Kr,Mr,kdr,dr,eyr,diagsr=build([rz(x) for x in X]) +load=[0.]*24; load[3:6]=[5*x/3 for x in ey]; lr=rotate_vector(load) +q=[0.]*24; qr=[0.]*24; q[5]=load[5]/K[5][5]; qr[5]=lr[5]/Kr[5][5] +r=sub(action(K,q),load); rr=sub(action(Kr,qr),lr) +targets=[float(F(19,4800)),float(F(10369,7500)),float(F(3,50)),float(F(10369,450)),float(F(7500,10369))] +actual=[kd,K[5][5],M[5][5],K[5][5]/M[5][5],q[5]] +for v,w in zip(actual,targets): assert abs(v-w)/(abs(v)+abs(w))<1e-12 +cov=[merr(Kr,rotate_matrix(K)),merr(Mr,rotate_matrix(M)),qerr(qr,rotate_vector(q)),rerr(rr,rotate_vector(r))] +assert max(cov)<1e-12 +assert abs(kd-kdr)/(abs(kd)+abs(kdr))<1e-12 +assert abs(dot(d,load[3:6]))/norm(load[3:6])<1e-12 +for A,v,f,residual in [(K,q,load,r),(Kr,qr,lr,rr)]: + assert abs(residual[5])/(abs(A[5][5]*v[5])+abs(f[5]))<=1e-10 +print('partial_bc=',actual) +print('rotated_partial_bc=',[kdr,Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5]]) +print('covariance_K_M_q_reaction=',cov) +print('fresh_rotary_diagonals=',diags,diagsr) +``` + + +### 독립 rational mass oracle + +다음 coefficient-dictionary 적분은 production shape/J/질량 함수를 사용하지 않는다. +이전 문서의 rational fixture 자체는 재사용하지만 모든 계수·행합·first moment를 이번에 +다시 적분한다. Kernel-level director fixture이며 input explicit-normal 지원을 추가하지 않는다. + +```python +from fractions import Fraction as F +from itertools import permutations, product +from math import sqrt +def const(x): return {(0,0,0):F(x)} +def add(*args): + out={} + for a in args: + for p,c in a.items(): out[p]=out.get(p,F(0))+c + return {p:c for p,c in out.items() if c} +def scale(a,c): return {p:v*c for p,v in a.items() if v*c} +def mul(a,b): + out={} + for p,c in a.items(): + for q,d in b.items(): + key=tuple(x+y for x,y in zip(p,q));out[key]=out.get(key,F(0))+c*d + return {p:c for p,c in out.items() if c} +def diff(a,k): + out={} + for p,c in a.items(): + if p[k]: + q=list(p);q[k]-=1;out[tuple(q)]=c*p[k] + return out +def integ(a): return sum((c*F(8,(p[0]+1)*(p[1]+1)*(p[2]+1)) for p,c in a.items() if all(v%2==0 for v in p)),F(0)) +def value(a,x): return sum(float(c)*x[0]**p[0]*x[1]**p[1]*x[2]**p[2] for p,c in a.items()) +v=[{tuple(int(k==i) for k in range(3)):F(1)} for i in range(3)] +N=[scale(mul(add(const(1),scale(v[0],sx)),add(const(1),scale(v[1],sy))),F(1,4)) for sx,sy in [(-1,-1),(1,-1),(1,1),(-1,1)]] +X=[(-1,-1,F(1,10)),(1,-1,-F(1,10)),(1,1,F(1,5)),(-1,1,-F(1,10))] +d=[(0,0,1),(F(3,5),0,F(4,5)),(F(2,3),F(1,3),F(2,3)),(0,F(3,5),F(4,5))] +z=scale(v[2],F(1,4));pos=[add(*(mul(N[i],add(const(X[i][c]),scale(z,d[i][c]))) for i in range(4))) for c in range(3)] +J={} +for perm in permutations(range(3)): + inversions=sum(perm[i]>perm[j] for i in range(3) for j in range(i+1,3)) + term=const((-1)**inversions) + for c in range(3): term=mul(term,diff(pos[c],perm[c])) + J=add(J,term) +rhoJ=scale(J,F(3));zk=[const(1),z,mul(z,z)] +polys=[[[mul(mul(mul(rhoJ,N[i]),N[j]),zk[k]) for j in range(4)] for i in range(4)] for k in range(3)] +C=[[[integ(p) for p in row] for row in mat] for mat in polys] +rows=[[sum(row,F(0)) for row in mat] for mat in C] +assert [mat[0][0] for mat in C]==[F(17609,28800),F(11003,1440000),F(88177,6912000)] +assert [sum(row,F(0)) for row in rows]==[F(7743,1600),F(739,12000),F(517,5120)] +first=[sum((rows[0][i]*X[i][c]+rows[1][i]*d[i][c] for i in range(4)),F(0)) for c in range(3)] +assert first==[integ(mul(rhoJ,p)) for p in pos] +g=[(-sqrt(3/5),5/9),(0.,8/9),(sqrt(3/5),5/9)] +maxerr=0.;jvals=[] +for q in product(g,repeat=3): jvals.append(value(J,[s[0] for s in q])) +for k,i,j in product(range(3),range(4),range(4)): + approx=sum(value(polys[k][i][j],[s[0] for s in q])*q[0][1]*q[1][1]*q[2][1] for q in product(g,repeat=3)) + maxerr=max(maxerr,abs(approx-float(C[k][i][j]))) +assert min(jvals)>0 and maxerr<1e-12 +central=[rows[2][i]-rows[1][i]**2/rows[0][i] for i in range(4)] +assert min(central)>0 +print('mass_C11=',[str(mat[0][0]) for mat in C]) +print('mass_rows=',[[str(x) for x in row] for row in rows]) +print('mass_first_moment=',[str(x) for x in first]) +print('mass_Jrange_Gauss_error_central=',min(jvals),max(jvals),maxerr,float(min(central))) +``` + + +### 이번 실행 결과 + +2026-09-08 PowerShell here-string에서 이 문서의 두 Python block을 추출하고 +`subprocess.run([sys.executable,'-B','-'])`으로 각각 실행했다. Oracle 1/2 exit `0`이다. + +| 항목 | 이번 직접 계산 | +| --- | --- | +| `kd`, `Kff`, `Mff` | `0.003958333333333333`, `1.3825333333333332`, `0.05999999999999998` | +| `lambda` 원/회전 | `23.04222222222223` / `23.042222222222208`; exact `10369/450 [T^-2]` | +| 단위 moment의 `thetaZ` 원/회전 | `0.7233098659465717` / `0.7233098659465714`; exact `7500/10369` | +| Complete `K`, `ML`, response, full reaction 공변성 ratio | `1.658e-16`, `7.851e-17`, `1.535e-16`, `1.706e-16` | +| 원/회전 free residual raw | `0`, `-1.1102230246251565e-16`; 기존 scaled `1e-10` 기준 충족 | +| Rational `C0_11,C1_11,C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` | +| `sum m,sum h,sum j` | `7743/1600`, `739/12000`, `517/5120` | +| Spatial first moment 두 독립식 | Exact equal: `(-79747/360000,-685951/2880000,49651/320000)` | +| 27점 J min/max | `0.1285991922161525` / `0.2701341411171808` | +| Gauss vs rational 최대 entry absolute error | `2.220446049250313e-16` | +| 최소 nodal central inertia | `0.022318161338791092 > 0` | + +최초 oracle 1 exit `1`은 회전 후 raw free residual에 잘못 추가한 exact-zero assertion이었다. +반력은 일반 floating arithmetic이며 원 계약은 scaled residual `1e-10`이다. +이를 기존 기준으로 수정하고 raw 값을 보존했다. Exact constrained displacement zero 조건, +정식화 또는 승인 tolerance를 변경한 것이 아니다. + +외부 solver, FEAST runtime, build/test, retained static fresh solve 및 HDF5–reference +comparison은 **NOT RUN**이다. 위 항등식의 통과는 구현/reference 통과가 아니다. + +최종 정적 Python audit는 owned Markdown 5개, 상대 파일 링크 38개, requirement 27개와 +case 27개의 유일·연속 identity, UTF-8/whitespace/final newline을 검사했고 exit `0`이었다. +두 oracle 모두 exit `0`; 이후 norm의 length congruence 명시를 코드에 반영하고 영향받은 +첫 oracle를 재실행하여 exit `0` 및 위 최종 scaled ratio를 확인했다. 식·판정 한계는 불변이다. diff --git a/docs/mitc4-shell-feast-eigen2/reference-model.md b/docs/mitc4-shell-feast-eigen2/reference-model.md index 86e5b6e..a3b451f 100644 --- a/docs/mitc4-shell-feast-eigen2/reference-model.md +++ b/docs/mitc4-shell-feast-eigen2/reference-model.md @@ -1,8 +1,8 @@ # 외부 reference projection과 tolerance 적용 - Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r2` (2026-09-10 첫 구현의 외부 Value 5% 승인). -- 기본 보고서: [numerical-review](numerical-review.md); 기준: [requirements](requirements.md), [TOLERANCE](../TOLERANCE.md). -- 판정: 승인된 비교 계약 갱신. 실제 최신 판정은 [첫 구현 검토](implementation-first-version-review.md)에 기록한다. +- 기본 보고서: [numerical-review](numerical-review.md#numerical-review); 기준: [requirements](requirements.md#requirements), [TOLERANCE](../TOLERANCE.md). +- 판정: 승인된 비교 계약 갱신. 실제 최신 판정은 [첫 구현 검토](implementation-review.md#implementation-first-version-review)에 기록한다. ## Eigen의 지정 원본과 logical identity @@ -69,7 +69,7 @@ Required scalar Value의 finite 검사를 별도 Freq 비교로 대신하지 않 ## 남는 static portfolio -아래는 [새 requirements](requirements.md)의 기존 acceptance 보존이며 eigen family와 섞지 않는다. +아래는 [새 requirements](requirements.md#requirements)의 기존 acceptance 보존이며 eigen family와 섞지 않는다. | 역할 | 기존 원본과 비교 | | --- | --- | diff --git a/docs/mitc4-shell-feast-eigen2/requirements-evidence.md b/docs/mitc4-shell-feast-eigen2/requirements-evidence.md deleted file mode 100644 index 46416d7..0000000 --- a/docs/mitc4-shell-feast-eigen2/requirements-evidence.md +++ /dev/null @@ -1,129 +0,0 @@ -# 요구사항 근거와 적용 경계 - -- Feature ID: `mitc4-shell-feast-eigen2` -- Requirement baseline revision: `r1` -- Owner: `requirement-agent` -- 작성일: `2026-09-08` -- 원본: [requirements.md](requirements.md), 현재 작업: [PRD](PRD.md). - -기준은 [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), -[ADR-028](../ADR.md#adr-028), [새 Feature ADR](ADR.md)이다. 이 문서는 근거와 미실행을 -구분하며 새 수학·구현 acceptance 승인이나 solver readiness 판정이 아니다. - -## 근거의 종류와 재사용 - -| 근거 | 재사용하는 내용 | 이번 기준선으로 가져오지 않는 것 | -| --- | --- | --- | -| 2026-09-08 사용자 요청과 [새 PRD](PRD.md) | 새 Feature 이름, requirement부터 재시작, 유용한 기존 자료 참고, 작업 중 commit; 최종 지시로 requirement 단계만 수행 | Research 이후 실행 권한·전체 단계 자동 진행·push 권한 | -| [기존 ADR](../mitc4-shell-feast-eigen/ADR.md)의 MFE-ADR-001/002/004/005 | MKL FEAST, consistent→derived lumped→eigen, 지정 reference의 Value-only, 입력의 mode count 권위 | Mass variant 선택 API, 다른 backend, 외부 mode-shape acceptance | -| 같은 ADR의 MFE-ADR-007 | 좌표 공변적 stabilization 개선 및 영향받는 static/eigen 검증의 명시 사용자 승인 | 특정 trace 공식 또는 기존 NR pass의 자동 채택 | -| 같은 ADR의 MFE-ADR-013 | reference/temp 네 예제와 옛 경로·복사·cache 검증 제외 | 과거 14개 blob·이동 commit·검사 수를 이번 재확인으로 보고 | -| [기존 requirements r3](../mitc4-shell-feast-eigen/requirements.md), [기존 evidence r3](../mitc4-shell-feast-eigen/requirements-evidence.md) | 27개 관찰 의무, 단위·identity·실패·남는 static/internal portfolio, 알려진 partial-BC 반례 | 기존 revision의 수식·threshold·영속 문자열이 새 Feature에 자동 승인되었다는 문구 | -| 기존 [research evidence](../mitc4-shell-feast-eigen/research-evidence.md), [formulation](../mitc4-shell-feast-eigen/formulation.md), [NR](../mitc4-shell-feast-eigen/numerical-review.md), [I/O](../mitc4-shell-feast-eigen/io.md) | 후속 전문 작업에서 필요한 근거·후보·반례를 찾을 위치 | 이번에 새로 조사·검토·검증한 evidence라는 주장 | -| 기존 [PRD 사용자 요구](../mitc4-shell-feast-eigen/PRD.md#사용자-요구) | 명시 release-readiness 감사 요청의 이력 보존 | 옛 고정 9-stage 순회, Hook·phase 상태·중복 수동/자동 실행의 복원 | - -기존 r3 요구 문서는 **현재 worktree의 미커밋 자료**를 읽었다. 링크는 그 작업 자료를 -가리키며 과거 HEAD/commit에 동일 내용이 있다고 가정하지 않는다. 과거 공개 문헌 조사도 -기존 evidence에 기록된 당시 이력으로만 참조한다. 이번 작업은 외부 문헌 조사·정식화 유도· -독립 수치 검토를 수행하지 않았다. - -기존 `NR-MFE-001`은 같은 물리 partial rotation BC에서 좌표를 회전하고 stiffness를 -재계산할 때 나타난 반례다. 기존 evidence의 numerical 값은 재계산하지 않았다. `014/027`은 -알려진 사례를 검증에서 배제하지 않는 의도를 승계한다. 이전 행렬을 단순 기저변환하는 -검사만으로 geometry부터 재계산한 complete K의 공변성 검사를 대체하지 않는다. -기존 linear 요구 `FESA-REQ-LSMITC4-034/056`과 -[nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)의 -scale 선정 부분이 영향 대상이며 다른 물리·lifecycle 의미를 교체하지 않는다. - -## 기존 ID와 새 ID 대응 - -기존 열은 prefix `FEM-REQ-MITC4-EIGEN-`, 새 열은 prefix -`FEM-REQ-MITC4-EIGEN2-`를 생략한다. 27개 ID를 1:1로 대응하며 아래 요약은 -요구사항 본문의 acceptance를 대신하지 않는다. - -| 기존 suffix | 새 suffix | 보존하는 관찰 의무·변경 경계 | -| --- | --- | --- | -| `001` | `001` | 원형상·무응력 단일 무감쇠 procedure | -| `002` | `002` | S4/S4R의 기존 물리 의미와 stabilization 개선 분리 | -| `003` | `003` | Material/section의 양의 유한 밀도 연결과 진단 | -| `004` | `004` | 기존 geometry/director/thickness 유효성 | -| `005` | `005` | Consistent mass의 계산·독립 oracle·lumping 원본 | -| `006` | `006` | 물리 병진/회전 관성과 drilling null | -| `007` | `007` | 같은 DOF/constraint·결정적 조립 | -| `008` | `008` | 실제 partial BC에서 유한 spectrum 보존·FEAST admissibility | -| `009` | `009` | 입력 요청의 낮은 N개·zero modes·불가능 요청 진단 | -| `010` | `010` | 오름차순 mode identity·multiplicity | -| `011` | `011` | Derived lumped mass로 실제 MKL FEAST 실행 | -| `012` | `012` | Backend 실패·미수렴·불완전 모드의 성공 반영 금지 | -| `013` | `013` | 같은 lumped M의 residual·normalization·orthogonality | -| `014` | `014` | 두 mass와 complete K/eigen의 물리·좌표 불변식 | -| `015` | `015` | 원본 Frequency 및 부수 옵션의 명시적 의미 처리 | -| `016` | `016` | 미지원 모델·옵션의 silent no-op 거부 | -| `017` | `017` | HDF5 quantity·단위·source/mode/backend/mass 식별 | -| `018` | `018` | 내부 modal vectors와 source/physical DOF 대응 | -| `019` | `019` | 검증 candidate 반영과 state/final output 실패 보존 | -| `020` | `020` | 지정 eigen TXT Value-only 외부 비교 | -| `021` | `021` | Tolerance 전 identity/quantity/schema/finite 검사 | -| `022` | `022` | 공통 tolerance 유지; family는 후속 NR/I/O 정의 | -| `023` | `023` | 현행 behavior tests·관련 검사·완료 시 전체검증; 고정 RED/중복 실행 삭제 | -| `024` | `024` | 남는 shell/shellNL 및 내부 static 회귀·밀도 없는 static 유지 | -| `025` | `025` | 메인의 evidence 추적 완료 판단·필수 독립 검증; 고정 stage 삭제·감사 요청 이력 보존 | -| `026` | `026` | Consistent에서 유도한 lumped의 질량·관성 보존 검사 | -| `027` | `027` | 좌표 공변적 비물리 stabilization 및 partial-BC 정적/eigen 검증 | - -## 현재 원본의 정적 관찰 - -아래는 메인이 `2026-09-08` 전달한 read-only 관찰이다. Python `pathlib`·regex·finite -검사와 keyword inventory는 exit `0`이었고 solver 실행은 아니다. Requirement owner는 -원본을 다시 읽거나 hash·산술 검사를 반복하지 않았다. 과거 hash를 현재 확인값으로 옮기지 않는다. - -| 대상 | 메인이 확인한 현재 사실 | -| --- | --- | -| `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp` | 729 nodes, 676 S4 elements; density `2700.`, shell section `0.5, 5` | -| Step/BC | 한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `Set-2` DOF 1~6의 homogeneous boundary 행 | -| Frequency | `eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; data `10, , , , ,` | -| `shellNL-eigen-meshfine eigenvalues.txt` | Mode IDs 1~10, finite Value, 중복 mode ID 없음 | -| Value 순서 | `219507, 885523, 885523, 1855340, 2740230, 2775150, 4149410, 4149410, 6733790, 6733790` | -| 표시값 반복 | `(2,3)`, `(7,8)`, `(9,10)`에서 같은 표시 Value; 이것만으로 실제 spectral multiplicity를 판정하지 않음 | -| 남는 static artifact | `rg --files`로 `reference/shell`·`reference/shellNL` 각각 inp 및 displacements/reactions/stresses CSV 존재 확인; 내용·수치 통과 확인은 아님 | - -TXT의 표시 Value는 보정하지 않는다. 단위계는 수치 크기로 추론하지 않는다. 기존 관찰은 -선행 static/load가 없는 단일 frequency 모델과 TXT의 분리된 Value/Freq를 기록한다. -입력의 유일한 step과 TXT mode를 연결할 수 있다는 것은 요구 정리를 위한 관찰이며, -comparison readiness·HDF5 projection·frame/family의 최종 정의는 후속 NR/I/O 책임이다. - -`reference/temp` 원본은 이번에 읽거나 실행하지 않았다. 네 제외 예제와 남는 coverage의 -원본은 [requirements](requirements.md#사용자-제외-예제)이며 과거 검사 개수나 cache로 -현재 실행 검증을 대체하지 않는다. - -## 후속 전문 판단과 사용자 결정 경계 - -아래는 requirement 작성의 blocker가 아니라 후속 작업이 필요할 때 구체화할 사항이다. -이번 요청으로 그 작업을 시작하지 않는다. - -| 후속 owner | 필요한 판단·고정 경계 | -| --- | --- | -| Formulation | Consistent→lumped 유도, 정확한 관성 불변식·좌표 block, massless drilling과 실제 global BC의 유한 spectrum 보존, FEAST admissibility, 낮은 N개 완전성. 특정 quadrature·row-sum·projection/whitening 공식은 자동 채택하지 않음 | -| Formulation·NR | 공변 stabilization과 기존 nonlinear 초기 고정 scale lifecycle의 정합, partial-BC 반례·대응 static response 및 개선된 pencil 재검증. 기존 trace scale 공식·NR pass를 새 승인으로 간주하지 않음 | -| NR | 독립 내부 oracle·scale/threshold·검증 충분성·FEAST controls 검토. 외부 eigen Value는 blocking acceptance이며 비교 family는 공통 TOLERANCE의 같은 model/step/frame/quantity/차원/좌표/판정 영향 규칙 안에서 정의; 과거 singleton family 판정을 자동 채택하지 않음 | -| I/O | 최소 syntax/무해 옵션/진단, source step·mode·modal vector 의미와 HDF5 projection. Exact layout·영속 contract/stabilization 문자열은 이번에 고정하지 않음; 기존 public 호환성 보존 | -| 메인·Implementation·Physics | 실제 retained test 선택과 실행 evidence·독립 물리 판단. 옛 362/352 수, 미실행·실패·stale를 통과로 소급하지 않으며 명시 감사 요청은 후속 범위와 함께 관리 | - -질량 흐름·backend·입력 count·Value-only·stabilization 개선·제외 목록은 기존 명시 결정으로 -해결되어 재질문하지 않는다. 현재 추가 사용자 결정이 필요한 material conflict는 발견하지 -않았다. 후속 증거가 새 물리 근사·지원 축소·공개 호환성/영속 schema의 비호환 변경 또는 -acceptance 변경을 필요로 할 때만 근거와 함께 메인에게 반환한다. Reference 변경이나 -공통 tolerance 완화로 충돌을 해소하지 않는다. - -## 정적 확인과 미실행 - -Requirement owner는 `Get-Content`·`rg`로 할당 관리문서, 기존 r3 요구·근거, 관련 사용자 -ADR와 프로젝트 PRD/ARCHITECTURE/ADR-028/TOLERANCE 절을 읽었다. 명령 exit `0`. -`python -B -X utf8 -` 문서 작성 및 정적 검사는 exit `0`으로 27개 새 matrix ID의 유일성·연속성, -27개 old→new 대응과 상대 파일 링크 존재를 확인했다. 수정 대상은 할당된 두 문서이며 -checklist는 PRD 한 곳에서 관리한다. - -C++·FEAST·CMake/CTest·Harness·pytest·외부 solver·reference 수치 비교·독립 numerical/physics -review·release-readiness는 requirement-only 요청 때문에 미실행이다. 문서 완료는 이 검사의 -통과나 새 수학·구현 acceptance 승인을 뜻하지 않는다. Source·test·공통 정책·기존 Feature· -phase·reference와 Git 작업은 변경하지 않았다. diff --git a/docs/mitc4-shell-feast-eigen2/requirements.md b/docs/mitc4-shell-feast-eigen2/requirements.md index e4b248b..6a4f880 100644 --- a/docs/mitc4-shell-feast-eigen2/requirements.md +++ b/docs/mitc4-shell-feast-eigen2/requirements.md @@ -1,17 +1,24 @@ -# MITC4 질량행렬·FEAST eigen 요구사항 +# MITC4 eigen 요구사항과 근거 + + + + + + +## MITC4 질량행렬·FEAST eigen 요구사항 - Feature ID: `mitc4-shell-feast-eigen2` - Requirement baseline revision: `r2` (2026-09-10, 사용자 승인에 따른 022 외부 accuracy 기준 변경) -- Owner: `requirement-agent` - 상태: 요구사항 기준선 작성. 구현·수치 검증 또는 readiness 통과 기록이 아니다. 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ADR-028](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md), [TOLERANCE](../TOLERANCE.md). 현재 작업·checklist는 [PRD](PRD.md), 소유권은 [FEATURED_AGENTS](FEATURED_AGENTS.md), 결정은 [ADR](ADR.md)을 따른다. -근거 구분·기존 ID 대응·미결정은 [requirements-evidence](requirements-evidence.md)에 둔다. +근거 구분·기존 ID 대응·미결정은 [requirements-evidence](requirements.md#requirements-evidence)에 둔다. -## 범위와 해석 의미 + +### 범위와 해석 의미 Consistent mass를 계산하고 그 결과로부터 lumped mass를 유도하며 실제 무감쇠 선형 고유진동 해석은 **derived lumped mass와 MKL FEAST**를 사용한다. 같은 lumped mass를 @@ -46,7 +53,8 @@ beam/solid/shell, concentrated/nonstructural mass, composite/offset/variable thi 별도 frequency interval/shift 사용자 기능, Lanczos/AMS 대체 backend, reference 생성·수정·복원과 외부 배포도 제외한다. Eigen 기능의 밀도 필수 조건을 기존 static에 확대하지 않는다. -## Requirement verification matrix + +### Requirement verification matrix 각 행은 하나의 관찰 의무이며 acceptance는 해당 요구와 검증 조건을 충족하는 것이다. 현재 요청은 이 의무를 정의하는 **requirement 단계만** 수행한다. 아래 검증은 후속 솔버 @@ -54,11 +62,11 @@ beam/solid/shell, concentrated/nonstructural mass, composite/offset/variable thi I/O layout은 후속 전문 owner가 필요한 시점에 정의한다. 외부 tolerance는 공통 정책을 따른다. 출처: `U`=[새 Feature ADR](ADR.md)의 기존 명시 사용자 결정 적용, -`R`=[근거 문서](requirements-evidence.md)의 reference 관찰, +`R`=[근거 문서](requirements.md#requirements-evidence)의 reference 관찰, `P`=위 프로젝트 기준, `L`=[기존 shell 요구](../linear-static-mitc4-shell/requirements.md), `N`=[기존 nonlinear I/O](../nonlinear-static-newton-raphson/io.md)의 공통 경로·실패 의미. `Formulation`, `NR`, `I/O`, `Implementation`, `Physics`는 전문 책임이며 고정 호출 단계가 아니다. -각 행은 [기존 r3](../mitc4-shell-feast-eigen/requirements.md)의 같은 번호에 대응한다. +각 행은 [기존 r3](../mitc4-shell-feast-eigen/requirements.md#requirements)의 같은 번호에 대응한다. | Requirement ID | Shall statement | 측정 가능한 acceptance / verification method | 출처·후속 owner | | --- | --- | --- | --- | @@ -90,7 +98,8 @@ I/O layout은 후속 전문 owner가 필요한 시점에 정의한다. 외부 to | FEM-REQ-MITC4-EIGEN2-026 | 솔버는 계산된 consistent mass에서 lumped mass를 유도하고 승인된 질량·관성 보존 계약을 검증해야 한다. | 유도 관계·독립 lumping oracle·총 병진 질량 보존, 차원/대칭성/물리 kinetic-energy 비음성, 물리 회전 관성과 drilling nullspace 의미 검사. Lumping 수식·좌표 block 처리·정확한 관성 불변식과 threshold는 Formulation/NR가 고정 | U, P, L; Formulation, NR | | FEM-REQ-MITC4-EIGEN2-027 | 개선된 numerical drilling stabilization은 같은 물리 모델의 좌표·접평면 기저 선택에 공변적이고 기존 비물리 역할을 유지해야 한다. | 독립 재계산한 stabilization/complete K의 congruence, finite·대칭·양의 numerical stabilization, 물리 rigid modes 보존, physical recovery 제외 및 결정론 검증. Partial BC의 NR-MFE-001과 대응 정적 response를 필수 통과시키며 기존 static의 동일 scale 사용 경로도 정합 검증; 수식·threshold는 Formulation/NR 소유 | U, L; Formulation, NR, Implementation, Physics | -## 지정 reference와 남는 검증 범위 + +### 지정 reference와 남는 검증 범위 Eigen input은 `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp`, 외부 reference는 같은 폴더의 `shellNL-eigen-meshfine eigenvalues.txt`를 그대로 사용한다. 입력의 @@ -115,7 +124,8 @@ bitwise equality가 아니라 승인된 물리·identity·공통 정책으로 reaction의 local distribution 검토는 별개다. 알려진 partial-BC 반례를 full-free/full-clamp 사례만으로 대체하거나 실패 수치를 기대값으로 재생성해 정당화하지 않는다. -## 사용자 제외 예제 + +### 사용자 제외 예제 다음 네 예제는 `reference/temp/` 아래 원본뿐 아니라 옛 경로, 복사 input, cached HDF5·log· 추출 결과를 통한 검증에서도 제외한다. 원본 열람·artifact audit·solve·비교·복원 또는 @@ -133,10 +143,148 @@ reaction의 local distribution 검토는 별개다. 알려진 partial-BC 반례 명시적으로 보고한다. 과거 test 수 `362/352`를 새 완료 조건으로 사용하지 않고 실제 남은 의무·선택·실행·사용자 제외를 구분한다. -## 이번 완료와 후속 판단의 경계 + +### 이번 완료와 후속 판단의 경계 이번 완료는 요구·출처·coverage·링크의 정적 확인까지다. 구현/FEAST/build/test/reference, 독립 numerical/physics review와 release-readiness는 미실행이다. 기존 명시 release-readiness 감사 요청은 후속 요구 기록으로 보존하되 이번 요청의 실행 범위나 모든 기능의 고정 단계 의무로 확대하지 않는다. 메인이 필요한 후속 전문 작업과 evidence를 판단한다. 공통 문서·기존 Feature·source·test·reference는 읽기 전용이며 Git은 메인이 소유한다. + + + + +## 요구사항 근거와 적용 경계 + +- Feature ID: `mitc4-shell-feast-eigen2` +- Requirement baseline revision: `r1` +- 작성일: `2026-09-08` +- 원본: [requirements.md](requirements.md#requirements), 현재 작업: [PRD](PRD.md). + +기준은 [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), +[ADR-028](../ADR.md#adr-028), [새 Feature ADR](ADR.md)이다. 이 문서는 근거와 미실행을 +구분하며 새 수학·구현 acceptance 승인이나 solver readiness 판정이 아니다. + + +### 근거의 종류와 재사용 + +| 근거 | 재사용하는 내용 | 이번 기준선으로 가져오지 않는 것 | +| --- | --- | --- | +| 2026-09-08 사용자 요청과 [새 PRD](PRD.md) | 새 Feature 이름, requirement부터 재시작, 유용한 기존 자료 참고, 작업 중 commit; 최종 지시로 requirement 단계만 수행 | Research 이후 실행 권한·전체 단계 자동 진행·push 권한 | +| [기존 ADR](../mitc4-shell-feast-eigen/ADR.md)의 MFE-ADR-001/002/004/005 | MKL FEAST, consistent→derived lumped→eigen, 지정 reference의 Value-only, 입력의 mode count 권위 | Mass variant 선택 API, 다른 backend, 외부 mode-shape acceptance | +| 같은 ADR의 MFE-ADR-007 | 좌표 공변적 stabilization 개선 및 영향받는 static/eigen 검증의 명시 사용자 승인 | 특정 trace 공식 또는 기존 NR pass의 자동 채택 | +| 같은 ADR의 MFE-ADR-013 | reference/temp 네 예제와 옛 경로·복사·cache 검증 제외 | 과거 14개 blob·이동 commit·검사 수를 이번 재확인으로 보고 | +| [기존 requirements r3](../mitc4-shell-feast-eigen/requirements.md#requirements), [기존 evidence r3](../mitc4-shell-feast-eigen/requirements.md#requirements-evidence) | 27개 관찰 의무, 단위·identity·실패·남는 static/internal portfolio, 알려진 partial-BC 반례 | 기존 revision의 수식·threshold·영속 문자열이 새 Feature에 자동 승인되었다는 문구 | +| 기존 [research evidence](../mitc4-shell-feast-eigen/research.md#research-evidence), [formulation](../mitc4-shell-feast-eigen/formulation.md#formulation), [NR](../mitc4-shell-feast-eigen/numerical-review.md#numerical-review), [I/O](../mitc4-shell-feast-eigen/io.md#io) | 후속 전문 작업에서 필요한 근거·후보·반례를 찾을 위치 | 이번에 새로 조사·검토·검증한 evidence라는 주장 | +| 기존 [PRD 사용자 요구](../mitc4-shell-feast-eigen/PRD.md#사용자-요구와-승계-경계) | 명시 release-readiness 감사 요청의 이력 보존 | 옛 고정 9-stage 순회, Hook·phase 상태·중복 수동/자동 실행의 복원 | + +요구사항 작성 당시 기존 r3 요구 문서는 **당시 worktree의 미커밋 자료**를 읽었다. +현재 링크는 정리된 해당 기록을 가리킨다. 당시 HEAD/commit에 동일 내용이 있었다고 가정하지 않는다. 과거 공개 문헌 조사도 +기존 evidence에 기록된 당시 이력으로만 참조한다. 이번 작업은 외부 문헌 조사·정식화 유도· +독립 수치 검토를 수행하지 않았다. + +기존 `NR-MFE-001`은 같은 물리 partial rotation BC에서 좌표를 회전하고 stiffness를 +재계산할 때 나타난 반례다. 기존 evidence의 numerical 값은 재계산하지 않았다. `014/027`은 +알려진 사례를 검증에서 배제하지 않는 의도를 승계한다. 이전 행렬을 단순 기저변환하는 +검사만으로 geometry부터 재계산한 complete K의 공변성 검사를 대체하지 않는다. +기존 linear 요구 `FESA-REQ-LSMITC4-034/056`과 +[nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)의 +scale 선정 부분이 영향 대상이며 다른 물리·lifecycle 의미를 교체하지 않는다. + + +### 기존 ID와 새 ID 대응 + +기존 열은 prefix `FEM-REQ-MITC4-EIGEN-`, 새 열은 prefix +`FEM-REQ-MITC4-EIGEN2-`를 생략한다. 27개 ID를 1:1로 대응하며 아래 요약은 +요구사항 본문의 acceptance를 대신하지 않는다. + +| 기존 suffix | 새 suffix | 보존하는 관찰 의무·변경 경계 | +| --- | --- | --- | +| `001` | `001` | 원형상·무응력 단일 무감쇠 procedure | +| `002` | `002` | S4/S4R의 기존 물리 의미와 stabilization 개선 분리 | +| `003` | `003` | Material/section의 양의 유한 밀도 연결과 진단 | +| `004` | `004` | 기존 geometry/director/thickness 유효성 | +| `005` | `005` | Consistent mass의 계산·독립 oracle·lumping 원본 | +| `006` | `006` | 물리 병진/회전 관성과 drilling null | +| `007` | `007` | 같은 DOF/constraint·결정적 조립 | +| `008` | `008` | 실제 partial BC에서 유한 spectrum 보존·FEAST admissibility | +| `009` | `009` | 입력 요청의 낮은 N개·zero modes·불가능 요청 진단 | +| `010` | `010` | 오름차순 mode identity·multiplicity | +| `011` | `011` | Derived lumped mass로 실제 MKL FEAST 실행 | +| `012` | `012` | Backend 실패·미수렴·불완전 모드의 성공 반영 금지 | +| `013` | `013` | 같은 lumped M의 residual·normalization·orthogonality | +| `014` | `014` | 두 mass와 complete K/eigen의 물리·좌표 불변식 | +| `015` | `015` | 원본 Frequency 및 부수 옵션의 명시적 의미 처리 | +| `016` | `016` | 미지원 모델·옵션의 silent no-op 거부 | +| `017` | `017` | HDF5 quantity·단위·source/mode/backend/mass 식별 | +| `018` | `018` | 내부 modal vectors와 source/physical DOF 대응 | +| `019` | `019` | 검증 candidate 반영과 state/final output 실패 보존 | +| `020` | `020` | 지정 eigen TXT Value-only 외부 비교 | +| `021` | `021` | Tolerance 전 identity/quantity/schema/finite 검사 | +| `022` | `022` | 공통 tolerance 유지; family는 후속 NR/I/O 정의 | +| `023` | `023` | 현행 behavior tests·관련 검사·완료 시 전체검증; 고정 RED/중복 실행 삭제 | +| `024` | `024` | 남는 shell/shellNL 및 내부 static 회귀·밀도 없는 static 유지 | +| `025` | `025` | 메인의 evidence 추적 완료 판단·필수 독립 검증; 고정 stage 삭제·감사 요청 이력 보존 | +| `026` | `026` | Consistent에서 유도한 lumped의 질량·관성 보존 검사 | +| `027` | `027` | 좌표 공변적 비물리 stabilization 및 partial-BC 정적/eigen 검증 | + + +### 현재 원본의 정적 관찰 + +아래는 메인이 `2026-09-08` 전달한 read-only 관찰이다. Python `pathlib`·regex·finite +검사와 keyword inventory는 exit `0`이었고 solver 실행은 아니다. Requirement owner는 +원본을 다시 읽거나 hash·산술 검사를 반복하지 않았다. 과거 hash를 현재 확인값으로 옮기지 않는다. + +| 대상 | 메인이 확인한 현재 사실 | +| --- | --- | +| `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp` | 729 nodes, 676 S4 elements; density `2700.`, shell section `0.5, 5` | +| Step/BC | 한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `Set-2` DOF 1~6의 homogeneous boundary 행 | +| Frequency | `eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; data `10, , , , ,` | +| `shellNL-eigen-meshfine eigenvalues.txt` | Mode IDs 1~10, finite Value, 중복 mode ID 없음 | +| Value 순서 | `219507, 885523, 885523, 1855340, 2740230, 2775150, 4149410, 4149410, 6733790, 6733790` | +| 표시값 반복 | `(2,3)`, `(7,8)`, `(9,10)`에서 같은 표시 Value; 이것만으로 실제 spectral multiplicity를 판정하지 않음 | +| 남는 static artifact | `rg --files`로 `reference/shell`·`reference/shellNL` 각각 inp 및 displacements/reactions/stresses CSV 존재 확인; 내용·수치 통과 확인은 아님 | + +TXT의 표시 Value는 보정하지 않는다. 단위계는 수치 크기로 추론하지 않는다. 기존 관찰은 +선행 static/load가 없는 단일 frequency 모델과 TXT의 분리된 Value/Freq를 기록한다. +입력의 유일한 step과 TXT mode를 연결할 수 있다는 것은 요구 정리를 위한 관찰이며, +comparison readiness·HDF5 projection·frame/family의 최종 정의는 후속 NR/I/O 책임이다. + +`reference/temp` 원본은 이번에 읽거나 실행하지 않았다. 네 제외 예제와 남는 coverage의 +원본은 [requirements](requirements.md#requirements--사용자-제외-예제)이며 과거 검사 개수나 cache로 +현재 실행 검증을 대체하지 않는다. + + +### 후속 전문 판단과 사용자 결정 경계 + +아래는 requirement 작성의 blocker가 아니라 후속 작업이 필요할 때 구체화할 사항이다. +이번 요청으로 그 작업을 시작하지 않는다. + +| 후속 owner | 필요한 판단·고정 경계 | +| --- | --- | +| Formulation | Consistent→lumped 유도, 정확한 관성 불변식·좌표 block, massless drilling과 실제 global BC의 유한 spectrum 보존, FEAST admissibility, 낮은 N개 완전성. 특정 quadrature·row-sum·projection/whitening 공식은 자동 채택하지 않음 | +| Formulation·NR | 공변 stabilization과 기존 nonlinear 초기 고정 scale lifecycle의 정합, partial-BC 반례·대응 static response 및 개선된 pencil 재검증. 기존 trace scale 공식·NR pass를 새 승인으로 간주하지 않음 | +| NR | 독립 내부 oracle·scale/threshold·검증 충분성·FEAST controls 검토. 외부 eigen Value는 blocking acceptance이며 비교 family는 공통 TOLERANCE의 같은 model/step/frame/quantity/차원/좌표/판정 영향 규칙 안에서 정의; 과거 singleton family 판정을 자동 채택하지 않음 | +| I/O | 최소 syntax/무해 옵션/진단, source step·mode·modal vector 의미와 HDF5 projection. Exact layout·영속 contract/stabilization 문자열은 이번에 고정하지 않음; 기존 public 호환성 보존 | +| 메인·Implementation·Physics | 실제 retained test 선택과 실행 evidence·독립 물리 판단. 옛 362/352 수, 미실행·실패·stale를 통과로 소급하지 않으며 명시 감사 요청은 후속 범위와 함께 관리 | + +질량 흐름·backend·입력 count·Value-only·stabilization 개선·제외 목록은 기존 명시 결정으로 +해결되어 재질문하지 않는다. 현재 추가 사용자 결정이 필요한 material conflict는 발견하지 +않았다. 후속 증거가 새 물리 근사·지원 축소·공개 호환성/영속 schema의 비호환 변경 또는 +acceptance 변경을 필요로 할 때만 근거와 함께 메인에게 반환한다. Reference 변경이나 +공통 tolerance 완화로 충돌을 해소하지 않는다. + + +### 정적 확인과 미실행 + +Requirement owner는 `Get-Content`·`rg`로 할당 관리문서, 기존 r3 요구·근거, 관련 사용자 +ADR와 프로젝트 PRD/ARCHITECTURE/ADR-028/TOLERANCE 절을 읽었다. 명령 exit `0`. +`python -B -X utf8 -` 문서 작성 및 정적 검사는 exit `0`으로 27개 새 matrix ID의 유일성·연속성, +27개 old→new 대응과 상대 파일 링크 존재를 확인했다. 수정 대상은 할당된 두 문서이며 +checklist는 PRD 한 곳에서 관리한다. + +C++·FEAST·CMake/CTest·Harness·pytest·외부 solver·reference 수치 비교·독립 numerical/physics +review·release-readiness는 requirement-only 요청 때문에 미실행이다. 문서 완료는 이 검사의 +통과나 새 수학·구현 acceptance 승인을 뜻하지 않는다. Source·test·공통 정책·기존 Feature· +phase·reference와 Git 작업은 변경하지 않았다. diff --git a/docs/mitc4-shell-feast-eigen2/research-evidence.md b/docs/mitc4-shell-feast-eigen2/research-evidence.md deleted file mode 100644 index ab1ee33..0000000 --- a/docs/mitc4-shell-feast-eigen2/research-evidence.md +++ /dev/null @@ -1,156 +0,0 @@ -# 연구 근거·검증 후보·미해결 항목 - -- Feature ID: `mitc4-shell-feast-eigen2` -- Owner: `research-agent` -- Input baseline: `requirements r1` -- Web access date: `2026-09-08` -- Main report: [research.md](research.md) - -`Fact`는 이번 원문 확인, `Inference`는 수학적 적용 판단, `Candidate`는 후속 채택 후보, -`Gap`은 아직 확인하지 못한 사항이다. 수식·threshold·schema의 최종 계약을 정하지 않는다. - -## Source inventory - -| ID | Source / stable locator | 적용과 한계 | -| --- | --- | --- | -| S01 | Dvorkin & Bathe (1984), Engineering Computations 1, 77–88, DOI `10.1108/eb023562`, [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eqs.(1),(2), p.81 및 Fig.7 vibration examples | Director 운동학·5 DOF·rigid mode의 원 연구. 곡면 lumping 또는 Abaqus 내부 알고리즘의 근거가 아님. | -| S02 | Voet, Sande & Buffa (2023), CMAME 410,116033, DOI `10.1016/j.cma.2023.116033`, [author preprint v2](https://arxiv.org/html/2212.03614v2), Definition 3.7, Remark 3.8 | Scalar/일반 행렬 lumping 이론. 절댓값 row-sum theorem을 shell drilling-null 보존으로 확대하지 않음. | -| S03 | Bathe & Wilson (1973), IJNME 6,213–226, DOI `10.1002/nme.1620060207`, [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13) | Massless 제거·fill 증가. Massive DOF의 근사 condensation과 구분. | -| S04 | Intel oneMKL C Developer Reference, URL edition `2026-0`, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), generalized problem | Real symmetric generalized 문제의 SPD B 조건. 설치 runtime 일치 확인은 아님. | -| S05 | 같은 edition, [Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm[5]`, `[26]`, `[27]`, `[49]` | Count·trace·matrix checks. Standalone FEAST 또는 Fortran index와 혼동 금지. | -| S06 | 같은 edition, [Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), `info` table 및 마지막 remark | 실패·empty warning·endpoint와 isolated cluster 위험. Count-empty 특수 성공 보장 문구 없음. | -| S07 | 같은 edition, [feast_scsrgv/feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `m0`, `x`, `epsout`, `m`, CSR parameters | Signature·capacity·endpoint-scaled trace. Count-only 작은/null workspace 보장 문구 없음. | -| S08 | Abaqus 2025 [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), optional parameters와 Lanczos data line | 공개 count·bound·normalization·SIM·acoustic syntax만 사용. FESA 내부 질량/해법의 동등성은 주장하지 않음. | -| P01 | [기존 mass](../mitc4-shell-feast-eigen/formulation-mass.md), [eigen](../mitc4-shell-feast-eigen/formulation-eigen.md), [stabilization](../mitc4-shell-feast-eigen/formulation-stabilization.md), [연구](../mitc4-shell-feast-eigen/research-evidence.md) | 현재 worktree의 후보 유도·과거 근거 locator. 이번 독립 검증 또는 승인으로 간주하지 않음. | -| P02 | [요구사항](requirements.md), [요구 근거](requirements-evidence.md), [기존 nonlinear §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [TOLERANCE](../TOLERANCE.md) | 요구·frozen lifecycle·acceptance 경계. 경험적 통과의 근거가 아님. | - -## R01 — 질량과 lumping - -**Fact S01:** 입자 변위는 nodal translation과 두 director rotation으로 보간한다. -논문은 전역 3회전 표현으로 변환 가능함을 설명하고 여섯 rigid modes를 확인한다. -**Inference:** `v=sum Ni(ui_dot+z*(theta_i_dot cross di))`, -`T=1/2 integral rho |v|² dV`이면 `M_C=integral rho H^T H dV`이며 -director-parallel rotation은 질량 null이다. MITC assumed shear는 strain 보간이므로 -질량에 shear correction을 추가할 근거가 없다. - -**Fact S02:** 일반 행렬의 absolute-row-sum과 nonnegative 행렬의 보통 row-sum은 -구분된다. **Inference:** global rotary `P=I-dd^T`에 component row-sum을 적용하면 -좌표 공변성·null을 잃는다. `d=(1,1,1)/sqrt(3)`에서는 `P*ones=0`이나 rank(P)=2다. -Translation/rotation의 무차별 행 합은 질량·질량×길이·질량×길이² 차원도 섞는다. - -**Candidate P01 재검토:** Consistent 계산의 `Ck_ij=integral rho Ni Nj z^k dV`, -`k=0,1,2`를 보존하고 scalar row-sum을 node별 tensor block으로 재구성한다. -`sum Nj=1`, `Ni>=0`에서 node energy는 `integral rho Ni |Gi(z) qi_dot|² dV`이므로 -양의 measure에서 비음성과 drilling null을 설명한다. Centered section이라도 곡면 J의 -두께 의존성 때문에 first moment가 남을 수 있다. Flat parallel director에서만 -rotary factor `t²/12`와 zero translation–rotation coupling이 직접 성립한다. -일반 orbital inertia·모든 velocity energy·consistent spectrum 동일성을 요구하지 않는다. - -**검증 후보:** 직사각형 면적 A의 scalar mass는 `rho*t*A/36` 곱하기 -`[[4,2,1,2],[2,4,2,1],[1,2,4,2],[2,1,2,4]]`인 직접 다항 적분 oracle; -회전 scalar 배율은 `t²/12`. 곡면은 production H/J를 재호출하지 않는 독립 velocity 적분, -node block positivity·moment 관계·두 mass의 좌표 congruence·density scaling을 검사한다. -Quadrature 차수·정확 관성 보존 범위는 Formulation/NR가 확정한다. - -## R02 — 실제 BC와 massless reduction - -**Fact S03:** Mass가 `diag(Mp,0)`이고 massless stiffness `Kzz`가 가역이면 -`Kr=Kpp-Kpz*Kzz^-1*Kzp`, `z=-Kzz^-1*Kzp*p`가 massless 방정식의 정확한 제거다. -Dense fill 가능성이 있다. **Inference:** 실제 global BC의 free injection C를 먼저 -적용하여 `Mf=C^T M_L C`, `Kf=C^T K C`에서 positive/null 공간을 찾아야 한다. -기울어진 director와 partial rotation BC에서는 원래 drill 방향이 free 공간에 들어가지 -않아 rotary free block이 SPD가 될 수 있다. UR3 또는 node당 1 DOF 일괄 삭제는 틀리다. - -**Candidate:** 공통 nodal director, physical K의 drill null, positive scalar numerical -drilling 구조에서 `Kf Z=Z D`, `D>0`를 증명하면 `Kpz=0`인 sparse projection을 쓸 수 있다. -이 증명은 개선된 constrained pencil 대상이며 partial BC에 남는 stabilization을 지우지 않는다. -Nonlinear tangent 또는 prestressed 문제에 확장하지 않는다. - -**검증 후보:** 비축정렬 director의 partial BC, null 없음/있음, 0 physical rank, -request>rank, `Kpz!=0`의 작은 manufactured pencil, 원 free residual 및 constraint 복원. -공통 K/M nullspace는 임의 pseudoinverse로 성공 처리하지 않는다. - -## R03 — 공변 stabilization과 frozen nonlinear scale - -**Inference:** Orthogonal tangent basis 변경에서 `Ri'=Oi^T Ri Oi`이면 -`trace(Ri')=trace(Ri)`다. 개별 대각값의 최솟값은 불변량이 아니다. -**Candidate:** 초기 physical rotational blocks의 trace 평균은 force×length 차원이며 -PSD physical K에 비영 회전 강성이 있으면 양수다. Trace 양수만으로 전체 PSD를 입증하지는 -못한다. 정확 집계·계수·유효성 판단은 Formulation 책임이며 reference tuning은 근거가 없다. - -**Inference P02:** `Pi_d=kd*gamma^T gamma/2`에서 initial kd를 고정하면 -`Dkd=D²kd=0`이고 기존 residual/Hessian 구조를 유지한다. Trial에서 재선정하면 추가 미분항이 -필요하다. Objective gamma와 invariant initial kd가 모두 필요하며, positive kd만으로 -일반 nonlinear Hessian의 SPD가 따르지 않는다. - -**검증 후보:** Geometry부터 complete K·director·scale을 독립 재계산하는 좌표 회전, -node별 tangent 변경, 지원 partial BC `NR-MFE-001`와 같은 물리 load의 static response, -rigid physical motion·physical recovery 제외, nonlinear objective potential의 1·2차 미분과 -initial scale immutability. 과거 반례 수치·새 trace 후보 기대값은 이번에 재계산하지 않았다. - -## R04 — FEAST count·completeness의 확인과 gap - -**Fact S04/S05:** Generalized real symmetric 문제의 B는 SPD다. C-index -`fpm[49]=1`은 CSR 구간 전체 고유치 수를 `m0`로 반환하고 flag를 0으로 재설정한다. -`fpm[26]`은 CSR 검사, `[27]`은 B 양정치 검사이며 `[5]=1`은 trace stopping이다. -**Fact S07:** `epsout=|trace_i-trace_previous|/max(|emin|,|emax|)`; -`0=emax`는 오류다. 매우 넓은 구간의 고립 cluster를 놓쳐 `info=1`일 수 있다. -따라서 빈 반환이나 작은 residual만으로 낮은 mode가 없음을 증명하지 못한다. - -**Candidate:** SPD whitening 뒤 차원 일관적인 spectral lower bound와 bounded count -search를 연결하고, 구간 count와 solve row 수·Gram rank를 일치시킨 후 낮은 N개를 취한다. -N번째가 repeated cluster 안이면 내부 solve는 cluster 전체를 포함하고 외부 N개 identity는 -count 요청을 따른다. 벡터 기저의 비유일성과 scalar multiplicity를 구분한다. -Zero modes를 양수 시작 구간으로 제외하거나 negative 값을 clamp하지 않는다. - -**Gap G01:** 공식 표는 count-only empty case의 `info=0,m0=0`을 명시 보장하지 않는다. -성공 status와 count=0만 인정하는 guard는 fail-closed 후보지만, 이를 실제 runtime이 반환하여 -전체 search가 진행되는지는 설치 oneMKL의 empty/occupied/endpoint 근접 probe가 필요하다. -`info=1`을 검증 없이 trusted zero count로 승격하지 않는다. -전체 spectrum 밖임을 독립 bound로 확보한 enclosing interval에서 성공 count가 n이면 -전체 bracket의 완전성 근거가 된다. 선택적 empty-prefix 축소가 불가능해도 이 bracket을 -유지하는 후보가 있으며, 비용·종료 조건과 채택은 Formulation이 판단한다. - -**Gap G02:** Count-only의 작은/null x/e/res allocation 면제는 확인하지 못했다. -`m0=n`, `x[n*n]` 보수 allocation은 기존 후보이지 공식 최소 workspace 의무가 아니다. -설치 header/runtime와 memory·integer overflow를 구현 시 확인한다. 이 조사에서는 설치 -runtime version·실행·peak memory를 측정하지 않았다. - -**검증 후보:** 손으로 알려진 diagonal 및 직교 변환 SPD pencil의 첫 N개, -zero/negative/repeated/clustered/empty spectrum, N=rank, endpoint 근접, count/solve mismatch, -미수렴·allocation 실패, 원 lumped M residual·normalization·Gram. FEAST status만으로 -physics/completeness를 통과 처리하지 않는다. 세부 bound·budget·threshold는 Formulation/NR 소유다. - -## R05 — 지정 원본과 공개 입력 의미 - -**이번 직접 정적 관찰:** -`reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp`의 끝부분은 -`*Step, name=Step-2, nlgeom=NO, perturbation`, -`*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`, -`10, , , , ,` 및 Set-2 DOF 1~6 boundary 행이다. 같은 폴더의 -`shellNL-eigen-meshfine eigenvalues.txt`는 Mode 1~10, Value와 별도 Freq를 표시한다. -Value 반복 표시는 2/3, 7/8, 9/10에 있으며 표시 precision만으로 exact degeneracy를 단정하지 않는다. -전체 keyword inventory·node count는 [요구 근거](requirements-evidence.md)의 선행 정적 관찰이다. - -**Fact S08:** Lanczos 첫 data field는 requested count, 다음 두 field는 cycles/time의 -frequency bounds이며 blank는 해당 bound 미설정을 뜻한다. Shift와 controls도 별도 field다. -**Inference/인계:** FESA의 FEAST backend와 source Lanczos/SIM을 분리하고 acoustic-free -옵션의 처리·warning 및 비영 unsupported field 거부를 I/O가 명시한다. 공개 Abaqus syntax는 -FESA mass/stabilization 내부 동등성의 근거가 아니다. - -Value-only·공통 tolerance는 사용자 계약이다. Freq 변환·TXT 보정·CSV 복제·외부 mode-shape -gate를 추가하지 않는다. NR가 family를 새로 검토하고 I/O가 source step/mode projection을 정의한다. - -## 정적 확인·미실행 - -원 논문·공식 웹 문서 접근과 위 지정 원본 두 파일의 읽기는 수행했다. 연구 문서의 상대 -파일 링크 존재와 UTF-8 replacement 문자 부재를 Python으로 검사했고 exit `0`이었다. -기존 문서·reference·코드·threshold·schema를 수정하지 않았다. -이번 산출물은 두 연구 문서뿐이며 Git은 메인이 소유한다. Build/test·FEAST runtime·외부 solver· -reference 비교·독립 NR/Physics는 연구 범위 밖으로 미실행이다. Configured vault 요청이 없어 -`fem-theory-query`를 사용하지 않았다. 제외 예제의 원본·복사·cache 열람과 재사용은 없다. diff --git a/docs/mitc4-shell-feast-eigen2/research.md b/docs/mitc4-shell-feast-eigen2/research.md index 1a7a0f6..1345997 100644 --- a/docs/mitc4-shell-feast-eigen2/research.md +++ b/docs/mitc4-shell-feast-eigen2/research.md @@ -1,17 +1,27 @@ -# MITC4 질량·FEAST 연구 결과 +# MITC4 eigen 연구와 근거 + +이 연구 기록의 후보·runtime gap은 조사 당시 상태다. 최종 채택식은 [정식화](formulation.md), +FEAST residual stopping과 비교 정책의 승인 변경은 [ADR](ADR.md), 실제 실행 범위는 +[구현 검증](implementation-verification.md)을 따른다. 조사 시점의 trace stopping을 현재 설정으로 읽지 않는다. + + + + + + +## MITC4 질량·FEAST 연구 결과 - Feature ID: `mitc4-shell-feast-eigen2` -- Owner: `research-agent` - Input baseline: `requirements r1` - Research date: `2026-09-08` - Status: `research evidence complete`; 현재 후속 작업 상태는 [PRD](PRD.md)의 checklist를 따른다. -[요구사항](requirements.md)과 [요구 근거](requirements-evidence.md)에 대한 연구다. +[요구사항](requirements.md#requirements)과 [요구 근거](requirements.md#requirements-evidence)에 대한 연구다. 현재 후속 작업 권한은 메인이 전달한 최신 사용자 지시를 따르며, 요구 문서의 과거 requirement-only 완료 기록을 이번 연구의 실행 제한으로 해석하지 않는다. 기준은 [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [ADR-028](../ADR.md#adr-028)이다. -출처별 locator·조건·검증 후보·gap은 [상세 근거](research-evidence.md)에 기록했다. +출처별 locator·조건·검증 후보·gap은 [상세 근거](research.md#research-evidence)에 기록했다. | 질문 / Requirement suffix | 결론과 인계 | | --- | --- | @@ -22,7 +32,7 @@ requirement-only 완료 기록을 이번 연구의 실행 제한으로 해석하 | Intel 세부 위험 / 012 | 공식 C `fpm[49]=1` count와 `fpm[5]=1` trace는 확인했다. Count-only 빈 구간의 `info=0,m0=0` 보장과 축소 workspace는 문서에 명시되지 않아 runtime 검증 gap으로 남는다. | | 원본 syntax·Value-only / 015,020–022 | 지정 원본은 `10, , , , ,`이며 TXT Mode 1~10의 Value를 보존한다. Lanczos/SIM은 FESA FEAST backend 선택 근거가 아니다. 최종 allowlist·HDF5·comparison family는 I/O·NR 소유다. | -기존 feature의 연구·질량·eigen·stabilization 문서는 **현재 worktree의 read-only 후보**로 +기존 feature의 연구·질량·eigen·stabilization 문서는 **연구 당시 worktree의 read-only 후보**로 읽었다. 과거 수식·NR 판정·runtime 결과를 이번 승인이나 새 통과로 가져오지 않았다. 특히 과거 singleton mode family는 연구 결론이 아니며 [공통 tolerance](../TOLERANCE.md)에 대해 NR가 새로 판단해야 한다. @@ -33,3 +43,169 @@ requirement-only 완료 기록을 이번 연구의 실행 제한으로 해석하 이번에는 문헌·원본 syntax·문서 링크의 정적 확인만 수행했다. Solver, FEAST runtime, build/test, reference 수치 비교와 독립 NR/Physics는 실행하지 않았다. 제외된 네 예제의 원본·복사·cache는 읽거나 사용하지 않았고 reference·공통 정책도 수정하지 않았다. + + + + +## 연구 근거·검증 후보·미해결 항목 + +- Feature ID: `mitc4-shell-feast-eigen2` +- Input baseline: `requirements r1` +- Web access date: `2026-09-08` +- Main report: [research.md](research.md#research) + +`Fact`는 이번 원문 확인, `Inference`는 수학적 적용 판단, `Candidate`는 후속 채택 후보, +`Gap`은 아직 확인하지 못한 사항이다. 수식·threshold·schema의 최종 계약을 정하지 않는다. + + +### Source inventory + +| ID | Source / stable locator | 적용과 한계 | +| --- | --- | --- | +| S01 | Dvorkin & Bathe (1984), Engineering Computations 1, 77–88, DOI `10.1108/eb023562`, [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eqs.(1),(2), p.81 및 Fig.7 vibration examples | Director 운동학·5 DOF·rigid mode의 원 연구. 곡면 lumping 또는 Abaqus 내부 알고리즘의 근거가 아님. | +| S02 | Voet, Sande & Buffa (2023), CMAME 410,116033, DOI `10.1016/j.cma.2023.116033`, [author preprint v2](https://arxiv.org/html/2212.03614v2), Definition 3.7, Remark 3.8 | Scalar/일반 행렬 lumping 이론. 절댓값 row-sum theorem을 shell drilling-null 보존으로 확대하지 않음. | +| S03 | Bathe & Wilson (1973), IJNME 6,213–226, DOI `10.1002/nme.1620060207`, [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13) | Massless 제거·fill 증가. Massive DOF의 근사 condensation과 구분. | +| S04 | Intel oneMKL C Developer Reference, URL edition `2026-0`, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), generalized problem | Real symmetric generalized 문제의 SPD B 조건. 설치 runtime 일치 확인은 아님. | +| S05 | 같은 edition, [Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm[5]`, `[26]`, `[27]`, `[49]` | Count·trace·matrix checks. Standalone FEAST 또는 Fortran index와 혼동 금지. | +| S06 | 같은 edition, [Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), `info` table 및 마지막 remark | 실패·empty warning·endpoint와 isolated cluster 위험. Count-empty 특수 성공 보장 문구 없음. | +| S07 | 같은 edition, [feast_scsrgv/feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `m0`, `x`, `epsout`, `m`, CSR parameters | Signature·capacity·endpoint-scaled trace. Count-only 작은/null workspace 보장 문구 없음. | +| S08 | Abaqus 2025 [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), optional parameters와 Lanczos data line | 공개 count·bound·normalization·SIM·acoustic syntax만 사용. FESA 내부 질량/해법의 동등성은 주장하지 않음. | +| P01 | [기존 mass](../mitc4-shell-feast-eigen/formulation.md#formulation-mass), [eigen](../mitc4-shell-feast-eigen/formulation.md#formulation-eigen), [stabilization](../mitc4-shell-feast-eigen/formulation.md#formulation-stabilization), [연구](../mitc4-shell-feast-eigen/research.md#research-evidence) | 연구 당시 worktree의 후보 유도·과거 근거 locator. 이번 독립 검증 또는 승인으로 간주하지 않음. | +| P02 | [요구사항](requirements.md#requirements), [요구 근거](requirements.md#requirements-evidence), [기존 nonlinear §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [TOLERANCE](../TOLERANCE.md) | 요구·frozen lifecycle·acceptance 경계. 경험적 통과의 근거가 아님. | + + +### R01 — 질량과 lumping + +**Fact S01:** 입자 변위는 nodal translation과 두 director rotation으로 보간한다. +논문은 전역 3회전 표현으로 변환 가능함을 설명하고 여섯 rigid modes를 확인한다. +**Inference:** `v=sum Ni(ui_dot+z*(theta_i_dot cross di))`, +`T=1/2 integral rho |v|² dV`이면 `M_C=integral rho H^T H dV`이며 +director-parallel rotation은 질량 null이다. MITC assumed shear는 strain 보간이므로 +질량에 shear correction을 추가할 근거가 없다. + +**Fact S02:** 일반 행렬의 absolute-row-sum과 nonnegative 행렬의 보통 row-sum은 +구분된다. **Inference:** global rotary `P=I-dd^T`에 component row-sum을 적용하면 +좌표 공변성·null을 잃는다. `d=(1,1,1)/sqrt(3)`에서는 `P*ones=0`이나 rank(P)=2다. +Translation/rotation의 무차별 행 합은 질량·질량×길이·질량×길이² 차원도 섞는다. + +**Candidate P01 재검토:** Consistent 계산의 `Ck_ij=integral rho Ni Nj z^k dV`, +`k=0,1,2`를 보존하고 scalar row-sum을 node별 tensor block으로 재구성한다. +`sum Nj=1`, `Ni>=0`에서 node energy는 `integral rho Ni |Gi(z) qi_dot|² dV`이므로 +양의 measure에서 비음성과 drilling null을 설명한다. Centered section이라도 곡면 J의 +두께 의존성 때문에 first moment가 남을 수 있다. Flat parallel director에서만 +rotary factor `t²/12`와 zero translation–rotation coupling이 직접 성립한다. +일반 orbital inertia·모든 velocity energy·consistent spectrum 동일성을 요구하지 않는다. + +**검증 후보:** 직사각형 면적 A의 scalar mass는 `rho*t*A/36` 곱하기 +`[[4,2,1,2],[2,4,2,1],[1,2,4,2],[2,1,2,4]]`인 직접 다항 적분 oracle; +회전 scalar 배율은 `t²/12`. 곡면은 production H/J를 재호출하지 않는 독립 velocity 적분, +node block positivity·moment 관계·두 mass의 좌표 congruence·density scaling을 검사한다. +Quadrature 차수·정확 관성 보존 범위는 Formulation/NR가 확정한다. + + +### R02 — 실제 BC와 massless reduction + +**Fact S03:** Mass가 `diag(Mp,0)`이고 massless stiffness `Kzz`가 가역이면 +`Kr=Kpp-Kpz*Kzz^-1*Kzp`, `z=-Kzz^-1*Kzp*p`가 massless 방정식의 정확한 제거다. +Dense fill 가능성이 있다. **Inference:** 실제 global BC의 free injection C를 먼저 +적용하여 `Mf=C^T M_L C`, `Kf=C^T K C`에서 positive/null 공간을 찾아야 한다. +기울어진 director와 partial rotation BC에서는 원래 drill 방향이 free 공간에 들어가지 +않아 rotary free block이 SPD가 될 수 있다. UR3 또는 node당 1 DOF 일괄 삭제는 틀리다. + +**Candidate:** 공통 nodal director, physical K의 drill null, positive scalar numerical +drilling 구조에서 `Kf Z=Z D`, `D>0`를 증명하면 `Kpz=0`인 sparse projection을 쓸 수 있다. +이 증명은 개선된 constrained pencil 대상이며 partial BC에 남는 stabilization을 지우지 않는다. +Nonlinear tangent 또는 prestressed 문제에 확장하지 않는다. + +**검증 후보:** 비축정렬 director의 partial BC, null 없음/있음, 0 physical rank, +request>rank, `Kpz!=0`의 작은 manufactured pencil, 원 free residual 및 constraint 복원. +공통 K/M nullspace는 임의 pseudoinverse로 성공 처리하지 않는다. + + +### R03 — 공변 stabilization과 frozen nonlinear scale + +**Inference:** Orthogonal tangent basis 변경에서 `Ri'=Oi^T Ri Oi`이면 +`trace(Ri')=trace(Ri)`다. 개별 대각값의 최솟값은 불변량이 아니다. +**Candidate:** 초기 physical rotational blocks의 trace 평균은 force×length 차원이며 +PSD physical K에 비영 회전 강성이 있으면 양수다. Trace 양수만으로 전체 PSD를 입증하지는 +못한다. 정확 집계·계수·유효성 판단은 Formulation 책임이며 reference tuning은 근거가 없다. + +**Inference P02:** `Pi_d=kd*gamma^T gamma/2`에서 initial kd를 고정하면 +`Dkd=D²kd=0`이고 기존 residual/Hessian 구조를 유지한다. Trial에서 재선정하면 추가 미분항이 +필요하다. Objective gamma와 invariant initial kd가 모두 필요하며, positive kd만으로 +일반 nonlinear Hessian의 SPD가 따르지 않는다. + +**검증 후보:** Geometry부터 complete K·director·scale을 독립 재계산하는 좌표 회전, +node별 tangent 변경, 지원 partial BC `NR-MFE-001`와 같은 물리 load의 static response, +rigid physical motion·physical recovery 제외, nonlinear objective potential의 1·2차 미분과 +initial scale immutability. 과거 반례 수치·새 trace 후보 기대값은 이번에 재계산하지 않았다. + + +### R04 — FEAST count·completeness의 확인과 gap + +**Fact S04/S05:** Generalized real symmetric 문제의 B는 SPD다. C-index +`fpm[49]=1`은 CSR 구간 전체 고유치 수를 `m0`로 반환하고 flag를 0으로 재설정한다. +`fpm[26]`은 CSR 검사, `[27]`은 B 양정치 검사이며 `[5]=1`은 trace stopping이다. +**Fact S07:** `epsout=|trace_i-trace_previous|/max(|emin|,|emax|)`; +`0=emax`는 오류다. 매우 넓은 구간의 고립 cluster를 놓쳐 `info=1`일 수 있다. +따라서 빈 반환이나 작은 residual만으로 낮은 mode가 없음을 증명하지 못한다. + +**Candidate:** SPD whitening 뒤 차원 일관적인 spectral lower bound와 bounded count +search를 연결하고, 구간 count와 solve row 수·Gram rank를 일치시킨 후 낮은 N개를 취한다. +N번째가 repeated cluster 안이면 내부 solve는 cluster 전체를 포함하고 외부 N개 identity는 +count 요청을 따른다. 벡터 기저의 비유일성과 scalar multiplicity를 구분한다. +Zero modes를 양수 시작 구간으로 제외하거나 negative 값을 clamp하지 않는다. + +**Gap G01:** 공식 표는 count-only empty case의 `info=0,m0=0`을 명시 보장하지 않는다. +성공 status와 count=0만 인정하는 guard는 fail-closed 후보지만, 이를 실제 runtime이 반환하여 +전체 search가 진행되는지는 설치 oneMKL의 empty/occupied/endpoint 근접 probe가 필요하다. +`info=1`을 검증 없이 trusted zero count로 승격하지 않는다. +전체 spectrum 밖임을 독립 bound로 확보한 enclosing interval에서 성공 count가 n이면 +전체 bracket의 완전성 근거가 된다. 선택적 empty-prefix 축소가 불가능해도 이 bracket을 +유지하는 후보가 있으며, 비용·종료 조건과 채택은 Formulation이 판단한다. + +**Gap G02:** Count-only의 작은/null x/e/res allocation 면제는 확인하지 못했다. +`m0=n`, `x[n*n]` 보수 allocation은 기존 후보이지 공식 최소 workspace 의무가 아니다. +설치 header/runtime와 memory·integer overflow를 구현 시 확인한다. 이 조사에서는 설치 +runtime version·실행·peak memory를 측정하지 않았다. + +**검증 후보:** 손으로 알려진 diagonal 및 직교 변환 SPD pencil의 첫 N개, +zero/negative/repeated/clustered/empty spectrum, N=rank, endpoint 근접, count/solve mismatch, +미수렴·allocation 실패, 원 lumped M residual·normalization·Gram. FEAST status만으로 +physics/completeness를 통과 처리하지 않는다. 세부 bound·budget·threshold는 Formulation/NR 소유다. + + +### R05 — 지정 원본과 공개 입력 의미 + +**이번 직접 정적 관찰:** +`reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp`의 끝부분은 +`*Step, name=Step-2, nlgeom=NO, perturbation`, +`*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`, +`10, , , , ,` 및 Set-2 DOF 1~6 boundary 행이다. 같은 폴더의 +`shellNL-eigen-meshfine eigenvalues.txt`는 Mode 1~10, Value와 별도 Freq를 표시한다. +Value 반복 표시는 2/3, 7/8, 9/10에 있으며 표시 precision만으로 exact degeneracy를 단정하지 않는다. +전체 keyword inventory·node count는 [요구 근거](requirements.md#requirements-evidence)의 선행 정적 관찰이다. + +**Fact S08:** Lanczos 첫 data field는 requested count, 다음 두 field는 cycles/time의 +frequency bounds이며 blank는 해당 bound 미설정을 뜻한다. Shift와 controls도 별도 field다. +**Inference/인계:** FESA의 FEAST backend와 source Lanczos/SIM을 분리하고 acoustic-free +옵션의 처리·warning 및 비영 unsupported field 거부를 I/O가 명시한다. 공개 Abaqus syntax는 +FESA mass/stabilization 내부 동등성의 근거가 아니다. + +Value-only·공통 tolerance는 사용자 계약이다. Freq 변환·TXT 보정·CSV 복제·외부 mode-shape +gate를 추가하지 않는다. NR가 family를 새로 검토하고 I/O가 source step/mode projection을 정의한다. + + +### 정적 확인·미실행 + +원 논문·공식 웹 문서 접근과 위 지정 원본 두 파일의 읽기는 수행했다. 연구 문서의 상대 +파일 링크 존재와 UTF-8 replacement 문자 부재를 Python으로 검사했고 exit `0`이었다. +기존 문서·reference·코드·threshold·schema를 수정하지 않았다. +이번 산출물은 두 연구 문서뿐이며 Git은 메인이 소유한다. Build/test·FEAST runtime·외부 solver· +reference 비교·독립 NR/Physics는 연구 범위 밖으로 미실행이다. Configured vault 요청이 없어 +`fem-theory-query`를 사용하지 않았다. 제외 예제의 원본·복사·cache 열람과 재사용은 없다. diff --git a/docs/nonlinear-static-newton-raphson/README.md b/docs/nonlinear-static-newton-raphson/README.md new file mode 100644 index 0000000..bdf34bd --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/README.md @@ -0,0 +1,38 @@ +# MITC4 비선형 정적 해석 + +## 목적과 현재 범위 + +유한회전 total chart, 같은 trial의 residual/tangent, Newton·증분·rollback를 구현한 기능이다. 역사적 기능 검증과 현재 통합 회귀의 범위를 구분한다. +최근 dev 통합 회귀는 [전체 현황](../tracking/status.md)에 연결하며, 과거 release 판정은 +[release.md](release.md)에 남긴다. 문서 정리는 새 기능 검증이나 재승인을 뜻하지 않는다. + +## 계약과 재사용 Handoff + +- [요구사항·acceptance](requirements.md): 지원·제외와 기존 요구사항 ID. +- [정식화](formulation.md): 수식·가정·부호·좌표계·복구 위치. +- [I/O](io.md): 입력 subset·진단·source identity·결과 schema. +- [Reference 모델](reference-model.md): 원본과 비교량·행 identity·적용 범위. +- [독립 수치 검토](numerical-review.md): 검산·위험·반례와 수정 확인. +- [검증·물리 결과](verification.md): 실제 실행한 명령·수치·실패·미실행·한계. +- [연구 근거](research.md): 정식화에 필요한 출처와 적용 경계. + +공통 소유권은 [ARCHITECTURE](../ARCHITECTURE.md)를 따른다. Element는 local 계산, +Assembly는 결정적 reduction, Procedure는 trial/commit, Recovery는 물리 의미, +Writer는 직렬화를 담당한다. 새 기능에서 기존 stage/phase 실행 계획을 재사용하지 않는다. +현재 공개 API는 `include/fesa/`, 실제 구현은 `src/fesa/`와 대응 검사를 확인한다. + +## 사용법 + +환경 준비·build·CTest·CLI 기본 사용은 [operations](../operations.md), 입력과 결과의 +공통 계약은 [contracts](../contracts.md)를 따른다. 이 기능의 keyword·option 허용 범위는 +위 I/O 계약을 확인한다. 과거 보고서의 machine 경로·임시 command를 현재 기본값으로 쓰지 않는다. + +## 개발 과정과 주의사항 + +기존 단계별 계획·coordination은 완료된 실행 운영 기록이어서 제거했다. 승인된 요구사항· +수식·검토·실제 검증 결과는 위 문서에 보존한다. Git `858e87b`의 이전 경로는 당시 원문을 +조회하는 용도로만 사용하며 현행 작업 지침이 아니다. + +- 실패한 trial·candidate는 기존 accepted state와 최종 결과를 변경하지 않아야 한다. +- 같은 trial의 기하·내력·하중·접선을 사용하고 generalized rotation moment와 spatial moment를 구분한다. +- [수정·실패 기록](lessons.md)에 원인과 검증 결과를 보존한다. diff --git a/docs/nonlinear-static-newton-raphson/build-test.md b/docs/nonlinear-static-newton-raphson/build-test.md deleted file mode 100644 index 8e65b82..0000000 --- a/docs/nonlinear-static-newton-raphson/build-test.md +++ /dev/null @@ -1,44 +0,0 @@ -# Nonlinear Static Newton-Raphson Build and Test Report - -## Metadata - -| key | value | -| --- | --- | -| feature_id | `nonlinear-static-newton-raphson` | -| owner_agent | `implementation-agent` | -| working directory | `C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson` | -| configuration | `windows-msvc-ninja-debug`, x64 Debug | -| compiler | MSVC `cl.exe` from VS 18, toolset `14.51.36231` | -| generator | Ninja | -| dependency configuration | `FESA_GTEST_SOURCE_DIR=C:/git/googletest`; MKL `2026.1`; TBB `2023.1`; HDF5 `2.1.1` | -| final classification | none; all commands passed | - -## Fresh command log - -| stage | command | exit | duration | output tail | -| --- | --- | ---: | ---: | --- | -| configure | `cmake --preset windows-msvc-ninja-debug` | 0 | 1.066 s | `Configuring done`; `Generating done`; build files written to `.harness/build-ninja-msvc-debug` | -| build | `cmake --build --preset windows-msvc-ninja-debug` | 0 | 0.113 s | `ninja: no work to do.` | -| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | 0 | 0.219 s | 302 tests discovered | -| focused control/log | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure` | 0 | 0.471 s | 14/14 passed | -| focused procedure/writer | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure` | 0 | 2.524 s | 7/7 passed | -| nonlinear reference | `ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` | 0 | 905.404 s | 9/9 passed | -| extended reference | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` | 0 | 930.617 s | 9/9 matched tests passed | -| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | 0 | 956.498 s | 302/302 passed; integration 16, unit 256, reference 30 | - -The full CTest output reported no failed-test inventory. The build emitted no compiler/linker -output beyond `ninja: no work to do.`; the build tree audit found no new `warning C####` or -`: warning:` record. The only diagnostic setup issue was that standalone HDF5 inspection tools -need Intel `libmmd.dll` on `PATH`; this did not affect the staged test executables, CMake build, or -CTest and is not a product failure. - -## Results and handoff - -The selected `.harness/config.json` preset was used throughout. All commands were run from the -repository root in an x64 VsDevCmd environment. The final status is -`pass-for-physics-evaluation`; no Harness Python command was required because this Step did not -change Python, hooks, or agent configuration. - -This Step changed documentation and its own phase status only. It did not modify C++ production, -tests, CMake, Harness configuration, tolerance, reference artifacts, or output data. The immutable -reference artifact audit before and after comparison was identical; see `reference-comparison.md`. diff --git a/docs/nonlinear-static-newton-raphson/coordination.md b/docs/nonlinear-static-newton-raphson/coordination.md deleted file mode 100644 index 75ce73b..0000000 --- a/docs/nonlinear-static-newton-raphson/coordination.md +++ /dev/null @@ -1,377 +0,0 @@ -# Nonlinear Static Newton–Raphson Coordination Record - -## 1. Metadata and Feature Scope - -- feature_id: `nonlinear-static-newton-raphson` -- workflow_state: `completed` -- owner_agent: `coordinator-agent` -- request_date: `2026-08-18` -- last_updated: `2026-08-30` (post-closure `shellNL-meshfine_02` current-code verification passed) -- process_classification: `architectural` -- requested_capability: Newton–Raphson 방법을 사용하는 새 nonlinear static analysis procedure -- proposed_scope_boundary: 첫 release는 initial configuration 기준 Total Lagrangian, materially linear + geometrically nonlinear MITC4로 제한한다. 요구조건 인터뷰와 8단계 evidence gate를 먼저 완료하며, 승인 전에는 상세 수치·I/O·구현 범위를 확정하거나 기존 linear-static lifecycle을 변경하지 않는다. -- naming_note: 사용자 표현 `Newton-Rhapson`은 표준 명칭 `Newton–Raphson`으로 정규화했다. -- current_goal: Preserve the completed eight-stage workflow with the user-requested post-closure `shellNL-meshfine_02` verification against merged `dev` HEAD `9ce28571f8cc6f67993e4d77c4462579b4fdb4b7` recorded as passing return-only diagnostic evidence. -- constraints: 승인된 physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel, thresholds `1e-2`/typed absolute `1e-3`, four-channel AND, Full Newton, fixed stepping, no line search, 100-iteration limit, `docs/TOLERANCE.md`, reference artifact filenames/hashes, stress optional inspection and `RM3` exclusion을 유지한다. USER-DECISION-004 option 1 keeps local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` review-only/nonblocking, with blocking factor-one global applied-plus-reaction resultant force `[3]`, global resultant moment `[3]` and accepted free-DOF residual gates/evidence; global resultant semantics are global origin `[0,0,0]`, current force arms and spatial physical nodal moments. USER-DECISION-006 supersedes/retire prior moment-only `1e-9` and all `fesa.env`/runtime-config discussion: do not add `fesa.env`, config parsing, runtime API, or product behavior. Current authoritative decision fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8` while preserving exact formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069 free-residual gates, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation. Sequential reapproval is delegated to Coordinator without intermediate user approval through Stage 4 Numerical/reference, Stage 5 I/O and Stage 6 Implementation Planning materialization; Steps `11` and `12` are completed under the approved Codex CLI `0.150.1`/Ninja/MSVC envelope. Stage 8 may create only `release.md`; no push, no `danger-full-access`, no reference mutation/solver, no source/tests/CMake/upstream/tolerance edit, and no publish/deploy/package/tag/external release. Any required contract change beyond the fixed `1e-8` global balance threshold stops as blocker. -- repository_audit: 기존 worktree에는 `.codex/agents/*.toml`과 `AGENTS.md`의 사용자 변경이 있으며 이를 보존한다. - -## 2. Eight-Stage Worklist - -| stage | owner | status | output paths | acceptance gate | evidence summary | blockers | attempt count | -| --- | --- | --- | --- | --- | --- | --- | --- | -| 1. Requirements | `requirement-agent` | `passed` | `docs/nonlinear-static-newton-raphson/requirements.md` | USER-DECISION-004 option 1을 requirements/reference acceptance contract에 최소 반영하고 compact requirements contract, existing thresholds, four-channel AND, Full Newton, 100-iteration limit, `docs/TOLERANCE.md`, approved semantic loss 0을 보존함 | Requirement Agent returned revised `requirements.md` status `draft`, ready for Coordinator/user re-approval, SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`. Coordinator audit passed: hash matched, 401 lines, 24 requirement records, 24 Matrix rows, duplicate/missing/orphan IDs 0, USER-DECISION-004 option 1 expressed, local RF/RM review-only, blocking global applied-plus-reaction force/moment plus accepted free residual present, formulation semantics preserved, AUDIT-001 Stage5/6 handoff present, no tolerance/reference/HDF5/public-scope expansion. User explicitly re-approved this hash on 2026-08-27. | 없음 | 43 | -| 2. Research | `research-agent` | `passed` | `docs/nonlinear-static-newton-raphson/research.md` | 필요한 이론·benchmark·source reliability·applicability limit가 충분함 | Owner/Coordinator pass와 2026-08-23 사용자 명시 승인; 10 required sections, S1–S17, 12 benchmark candidates, 11 research-relevant requirement IDs, 14 unique open issues; nonlinear stored reference gap explicit; SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; forbidden changes 0. | 없음 | 1 | -| 3. Formulation | `formulation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/formulation.md` | §14.1만 USER-DECISION-003 option 1로 갱신하고 strong/weak form, kinematics, tangent/residual, integration, state/recovery, O-ROT/O-MAP/O-DRILL/O-MOM/O-BC closure를 보존함 | Owner returned `ready-for-coordinator-and-user-reapproval`, SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, §14.1-only diff `34` additions/`5` deletions, revised requirements hash matched, 13/13 contract assertions and diff check passed, no other owner file changes. Coordinator audit passed and user explicitly re-approved this hash on 2026-08-24: exact-zero branch selector is matching external residual-channel scale, nonzero external scale retains relative `max(internal, external)` denominator and `1e-2`, typed absolutes remain `1e-3`, correction gates/four-channel AND/lifecycle/reference disposition unchanged. | 없음 | 3 | -| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | USER-DECISION-006 delegated reapproval: both normalized factor-one global FORCE and MOMENT balance gates are fixed `<=1e-8`, with exact formulas, sum-of-contribution scales, zero-scale rule, source identity and USER-DECISION-004 dispositions preserved | Owner returned `pass-for-io-definition`, blockers none. Coordinator audit verified hashes `numerical-review.md` `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `reference-model.md` `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; both reports record global force/moment normalized gate `<=1e-8`, unchanged formulas/scales/exact-zero/current-arm/spatial moment/factor-one/NSNR-069/`docs/TOLERANCE.md` boundaries, 12 reference hashes/length/mtime unchanged, fine primary/coarse companion, U blocking, UR warning-only, local RF/RM review-only and `RM3`/stress excluded. Root independently verified hashes, target occurrences and `git diff --check` with only LF/CRLF warnings. | 없음 | 6 | -| 5. I/O definition | `io-definition-agent` | `passed` | `docs/nonlinear-static-newton-raphson/io.md` | USER-DECISION-006 fixed both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8` while preserving HDF5 schema/projections/reference paths and `docs/TOLERANCE.md` separation | Owner returned `ready-for-coordinator-review`, blockers none. Coordinator verified raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`; owner/root LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`. `io.md` records both coarse/fine global force and moment internal gates as dimension-separated normalized `<=1e-8`, preserves `/global/equilibrium` schema version/path/shape/source identity, constrained reaction/free residual projections, zero-scale rule, NSNR-069, local RF/RM review-only, U blocking, UR warning-only, `RM3`/stress exclusions, reference paths and external-only `docs/TOLERANCE.md`. | 없음 | 7 | -| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md`; `docs/nonlinear-static-newton-raphson/corrections.md`; `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` | Add one unambiguous overall handoff status `pass-for-physics-evaluation` to `reference-comparison.md` while preserving detailed verdict `blocking-pass-with-review-only-findings`, all evidence/dispositions and no-change assertions | Owner returned `pass-for-physics-evaluation`, blockers none, SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241`. Coordinator verified exact `4`-line status-only diff, both required status/verdict tokens, all six review-only findings and `<=1e-8` metrics retained, whitespace clean, and no reference artifact or other owner-path change. | 없음 | 38 | -| 7. Physics evaluation | `physics-evaluation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/physics-evaluation.md` | equilibrium, reaction, direction, path/history, energy, symmetry, model coverage가 `pass-for-release-agent`임 | STAGE7-PHYSICS-002 returned `pass-for-release-agent`, blockers none, SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`. Corrected Stage 6 hash/status resolved PHYS-STATUS-001. Prior fresh focused CTest `23/23`, canonical reference hash audit, and physical checks remain passing; historical requirements metadata is nonblocking; four declared open items are nonblocking/known limitations. Coordinator verified all eight sections, exact corrected input hash, pass/handoff boundaries, whitespace, no Release file/dispatch, and no forbidden change. | 없음 | 2 | -| 8. Release readiness | `release-agent` | `passed` | `docs/nonlinear-static-newton-raphson/release.md` | `ready-for-release` recommendation과 acceptance traceability가 완전함 | Owner returned `ready-for-release`, blockers none, SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`. Coordinator verified all 11 required sections, exact current gate hashes/pass statuses, 24/24 unique must IDs with acceptance/test-or-reference/release disposition `included-pass`, 12/12 reference hashes, complete known limitations/release notes, transparent requirements metadata and reference-comparison feature-id omissions, whitespace/scope/no-change boundaries, and no external release action. | 없음 | 1 | - -## 3. Active Dispatch Package and Latest Sub-Agent Return - -### Active Dispatch Package - -- feature_id: `nonlinear-static-newton-raphson` -- current_dispatch: `none` -- target_sub_agent: `none` -- required_inputs: 없음 -- expected_outputs: 없음 -- acceptance_gate: Post-closure `shellNL-meshfine_02` diagnostic passed all exact prechecks and blocking external/internal gates; warning-only and review-only findings are retained below without changing the completed eight-stage workflow. -- stop_condition: Diagnostic is closed. Do not rewrite canonical Stage 6/Release reports, modify implementation/tests/CMake/reference/tolerance contracts, or run Abaqus/reference solver. -- missing_evidence: 없음 - -### Latest Sub-Agent Return - -- target_sub_agent: `implementation-agent` -- output_paths: - - `.harness/build-ninja-msvc-debug/verification/shellNL-meshfine_02-merged-06d79f9d7f504b5995a91292c30535f4/shellNL-meshfine_02_results.h5` - - `.harness/build-ninja-msvc-debug/verification/shellNL-meshfine_02-merged-06d79f9d7f504b5995a91292c30535f4/shellNL-meshfine_02_log.txt` -- status: owner execution/artifact audit completed; independent exact comparison evidence supplied by root; Coordinator decision `passed` -- evidence_summary: - - Provenance: `dev` HEAD `9ce28571f8cc6f67993e4d77c4462579b4fdb4b7`. Owner command `cmake --build .harness/build --config Debug` exited `0` in `15.063s` under cached Visual Studio 18 2026/x64 and produced `.harness/build/src/fesa/Debug/fesa.exe`, SHA-256 `A3E87AEDA23929341E7666409C4EB25A32D1E2844D05A9EEEFE549F55C0BFAD1`, `4,654,080` bytes. Root's merge-turn fresh configure/build/full CTest evidence remains `302/302`. - - Independent run used `.harness/build-ninja-msvc-debug/src/fesa/fesa.exe`, SHA-256 `66AA2341EED8FDC56C42CB807782626D3712349F14EA338D85024C3100CC351A`, `4,654,080` bytes, with the copied input as the sole argument in the unique run directory. Copied input and source are byte-identical: SHA-256 `DAEC7592489837B165D55382CAEAF53E21D84D804AA38C73CBF35E5CC0BAC3E5`, `56,554` bytes. Run exit `0`, duration `764.66s`; accepted frames `10`, factor-one frame index `9`/increment `10`, every increment accepted in `3` Newton iterations. - - HDF5 SHA-256 `B1189D19534D7EB9CFE4E6BA52E61B70B9B2610EC9881DD49A4E8345F682C4B7`, `10,547,430` bytes; log SHA-256 `A64D8A44BD07B67D68C3452C74B72ADA86CF605B1AF6AF68F34B650C0D10CFC2`, `40,666` bytes. - - Exact identity/component, missing/extra/duplicate/nonfinite prechecks passed. Blocking U: `2187` rows, `S=0.0257712454`, `B=0.000257712454`, max abs `0.00016420230927672447` at node `2/U3`, max rel `0.03993009716605022`, RMS/S `0.0002446063139644424`, failed `0`, `PASS`. - - Warning-only UR: `2187` rows, `S=0.00658291345`, `B=0.0000658291345`, max abs `0.0002131299106976069` at node `70/UR3`, max rel `0.4494589542186548`, RMS/S `0.0016290565114831094`, failed `26`, `FAIL-WARNING`. - - Review-only RF1/RF2: `208` rows, `S=3347707`, max abs `30773.166854762763` at node `4/RF2`, max rel `0.1350569944997168`, RMS/S `0.002634194489949025`, failed `12`. RF3: `104` rows, `S=2802821.5`, max abs `46343.45205024615` at node `4/RF3`, max rel `0.23291665408016715`, RMS/S `0.005316133431834461`, failed `14`. RM1/RM2: `208` rows, `S=4722449.5`, max abs `31746.280996990332` at node `52/RM2`, max rel `0.16007646863904998`, RMS/S `0.0033641766812733376`, failed `96`. `RM3` and stress remain excluded. - - All four blocking internal gates passed: global force `0.003209977112778376/228828371.8687996 = 1.4027880749939697e-11`; global moment `0.008313883925089659/521957620.13808715 = 1.5928273875741422e-11`, both `<=1e-8`; free force `1875` rows, `0.0008136481046676636/100000000.00063828 = 8.136481046624702e-12 <=1e-2`; free moment `1875` rows, external scale zero and numerator `0.0003104638308286667 <=0.001` typed gate. - - Original reference pre/post hashes remained exact: displacement `18EC051D265E0BD2C441FE73C08E097B83EE85BC2EB32FFBE3AF0DCB9CB89672`, reaction `59348996E0CE80687C9EB2747EEABF84ACED4CE97F8A56F0FFDDBDCA404A57A3`, stress `933A72025A0E897FD65F81C913E53D1730BD551CE95CBDEA96F9F99B10BE8B18`; input hash is recorded above. -- blockers: - - 없음 -- self_audit_findings: No tracked/untracked non-build file changed except this Coordinator-owned `coordination.md`; no source/test/CMake/upstream/tolerance/reference/historical report mutation, Harness/Abaqus/reference solver, commit or push. Owner's first detached long run produced valid factor-one output but its shell could not recover the OS exit code; the independent root run above supplied exit `0` and the exact comparison metrics, so no additional solver rerun was required. -- return_contract_check: Output paths, provenance, copied-input proof, output hashes, exact prechecks, external/internal classifications, reference pre/post audit, blockers and no-change assertion are complete. -- acceptance_evidence_check: Verdict `blocking-pass-with-warning-and-review-only-findings`; the post-closure verification gate passes. This diagnostic does not reopen or rewrite canonical Stage 6, Physics, or Release evidence. - -### USER-DECISION-004 Selected Path - -- selected: User explicitly approved option 1 on `2026-08-26`. -- meaning: exact local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` rows remain deterministic source-key/schema/finite/inventory/error-reporting evidence but become review-only/nonblocking; `RM3` remains excluded. -- blocking evidence: factor-one global resultant force `[3]`, factor-one global resultant moment `[3]`, and accepted free-DOF residual gates/evidence. Resultant moment uses the existing I/O global-equilibrium contract: global origin `[0,0,0]`, current force arms and spatial physical nodal moments. -- unchanged: displacement comparison remains blocking, `UR1/UR2/UR3` remains warning-only, stress CSVs remain optional inspection/no comparison projection, `docs/TOLERANCE.md` applies where external comparison remains, and exact source-ID prechecks are preserved. -- prohibited: no averaging/collapse/zero clamp, no tolerance relaxation, no comparator weakening, no reference artifact edit, and no Abaqus S4 internal-equivalence claim. -- re-approval path: Stage 1 requirements, Stage 4 Numerical/reference and Stage 5 I/O are re-approved. Stage 6 implementation-planning revision draft is returned, Coordinator-audited, user-approved and materialized by MATERIALIZATION-003. DECISION-042 now supplies the separate explicit Step 11 Harness/Implementation request. Stage 3 formulation has no immediate dispatch because current §11.4 and §13.4 already define full residual/reactions and global resultant identities. - -`MESH-REFINEMENT-SPIKE-001` remains diagnostic evidence that option 3 is not met by the current Abaqus S4 coarse/fine pair. `TRANSLATION-REPORT-001` remains translation-only diagnostic evidence and does not authorize final reference-model, tolerance, comparator, HDF5 schema, implementation, Harness, Step 12, Physics or Release changes. - -### Compact Migration Evidence - -- `NSNR-001←001,005,015,017,066–068`; `003←003,040`; `041←041,042`; `074←073–075` -- `NSNR-006←002,006,043–045`; `007←007,052,054`; `069←069`; `070←070`; `008←008,013,071`; `014←014,072` -- `NSNR-046←009,010,046,055–057`; `048←048`; `018←018,060–062`; `063←049–051,063–065`; `016←016,058,059` -- `NSNR-011←011,012,047,029`; `019←019,053`; `020←020`; `021←021–023,025`; `024←024,076,077` -- `NSNR-083←004,083–085,088`; `026←026`; `030←030–032`; `034←034–037` -- Downstream-only: `027,028,033,039,086,087`; removed interview-only record: `038` - -## 4. Gate Decision Log and Workflow State - -| date | gate | decision | owner evidence | workflow state | next eligible action | -| --- | --- | --- | --- | --- | --- | -| 2026-08-18 | Intake | `in-progress` | 사용자 요청; repository baseline audit | `needs-requirements` | Requirements Agent dispatch 및 반환 검증 | -| 2026-08-18 | Requirements draft | `needs-rework` | `requirements.md` status `draft-needs-user-decision`; Requirement Agent return contract | `needs-user-decision` | `OQ-001`을 사용자에게 질문하고 답변 뒤 Requirement Agent에 bounded revision dispatch | -| 2026-08-18 | Requirements OQ-001 | `in-progress` | 사용자 결정: option 1 `Geometric-only MITC4` | `needs-requirements` | 같은 Requirement Agent가 scope 반영 및 self-audit 수행 | -| 2026-08-18 | Requirements OQ-001 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator traceability check | `needs-user-decision` | `OQ-004` finite-kinematic framework를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-004 | `in-progress` | 사용자 결정: option 1 `Total Lagrangian` | `needs-requirements` | 같은 Requirement Agent가 initial-configuration 계약 반영 및 self-audit 수행 | -| 2026-08-18 | Requirements OQ-004 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator configuration/state/rollback check | `needs-user-decision` | `OQ-006` Newton variant와 tangent refresh를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-006 | `in-progress` | 사용자 결정: option 1 `Full Newton–Raphson` | `needs-requirements` | 같은 Requirement Agent가 per-iteration tangent/factorization/solve 계약 반영 및 self-audit 수행 | -| 2026-08-18 | Requirements OQ-006 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator Full Newton event/rollback/determinism check | `needs-user-decision` | `OQ-005` increment control variable을 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-005 | `in-progress` | 사용자 결정: option 1 `Load-factor control` | `needs-requirements` | 같은 Requirement Agent가 scalar load coordinate와 step/load/BC path 계약 반영 및 self-audit 수행 | -| 2026-08-18 | Requirements OQ-005 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator load-factor identity/path/rollback check | `needs-user-decision` | `OQ-009` scalar load-factor path proportionality를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-009 | `in-progress` | 사용자 결정: option 1 `Single proportional load/BC path` | `needs-requirements` | 같은 Requirement Agent가 proportional load/BC factor와 constraint/equilibrium/rollback 계약 반영 및 self-audit 수행 | -| 2026-08-18 | Requirements OQ-009 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator proportional factor/constraint/equilibrium check | `needs-user-decision` | `OQ-017` increment-size strategy를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-017 | `in-progress` | 사용자 결정: option 2 `Fixed-size stepping` | `needs-requirements` | 같은 Requirement Agent가 fixed increment/final-shortening/fail-without-retry 계약 반영 및 self-audit 수행 | -| 2026-08-18 | Requirements OQ-017 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator endpoint/order/no-retry check | `needs-user-decision` | `OQ-020` four-value `*STATIC` mapping을 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-020 | `in-progress` | 사용자 결정: option 2 `First-value driven` | `needs-requirements` | 같은 Requirement Agent가 `*STATIC` use/ignore/validation/diagnostic 및 endpoint consistency 반영 | -| 2026-08-18 | Requirements OQ-020 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator mapping/ignored-field warning/input validation check | `needs-user-decision` | `OQ-018` approved `*CLOAD` direction/configuration을 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-018 | `in-progress` | 사용자 결정: option 1 `Dead loads in fixed global directions` | `needs-requirements` | 같은 Requirement Agent가 global-fixed `*CLOAD` magnitude/work/tangent/equilibrium/assembly 계약 반영 | -| 2026-08-18 | Requirements OQ-018 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator 62 requirement/matrix traceability 및 stale/금지범위 check | `needs-user-decision` | `OQ-019` prescribed `*BOUNDARY` total/incremental 의미를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-019 | `in-progress` | 사용자 결정: option 1 `Total step target` | `needs-requirements` | 같은 Requirement Agent가 absolute target/interpolation, zero/repeated-step, correction/equilibrium/state/source-identity 계약 반영 | -| 2026-08-18 | Requirements OQ-019 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator 65 requirement/matrix traceability, target/correction/rollback 및 stale/금지범위 check | `needs-user-decision` | `OQ-003` nonlinear step cardinality와 propagation 범위를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-003 | `in-progress` | 사용자 결정: option 1 `Single nonlinear step only` | `needs-requirements` | 같은 Requirement Agent가 single-step fail-closed cardinality, identity, ordering, failure preservation과 CLI selection 계약 반영 | -| 2026-08-18 | Requirements OQ-003 revision | `needs-rework` | revised `requirements.md`; Requirement Agent self-audit; Coordinator 68 requirement/matrix traceability, cardinality/identity/order/failure-preservation 및 stale/금지범위 check | `needs-user-decision` | `OQ-007` mandatory convergence quantity set을 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-007 quantity set | `in-progress` | 사용자 결정: option 1 `Residual and correction` | `needs-requirements` | 같은 Requirement Agent가 two mandatory gates, same-state/order, free-DOF, nonfinite/max-iteration 및 atomic state 계약 반영 | -| 2026-08-18 | Requirements OQ-007 quantity revision return | `needs-rework` | revised `requirements.md`; 72/72 traceability와 quantity contract는 통과했으나 next question이 사용자 지정 norm/normalization/tolerance 대신 line search를 제시함 | `needs-requirements` | 같은 Requirement Agent에 `next-question-routing-mismatch` bounded correction 1회 dispatch | -| 2026-08-18 | Requirements OQ-007 routing correction | `needs-rework` | OQ-007 closed/OQ-021 sole pending-next; 72/72 traceability와 accepted quantity/failure/energy-exclusion 보존; Coordinator stale/금지범위 check | `needs-user-decision` | `OQ-021` convergence norm/normalization/threshold contract를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-021 nonzero-scale contract | `in-progress` | 사용자 결정: channel-separated normalized infinity gates; four relative thresholds=`1e-2`; zero-scale 미결정 | `needs-requirements` | 같은 Requirement Agent가 free-DOF channel/same-trial scale/fresh-correction identity를 반영하고 zero-scale만 다음 질문으로 분리 | -| 2026-08-18 | Requirements OQ-021 nonzero-scale revision | `needs-rework` | revised `requirements.md`; 72/72 traceability, four `1e-2` channels, same-trial/fresh-solve scale, logical-AND/stable-order 및 sole pending-next 검증 | `needs-user-decision` | OQ-021 zero-denominator policy와 필요한 absolute thresholds를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-021 zero-scale policy partial decision | `in-progress` | 사용자 결정: channel-specific absolute fallback; exact four channel thresholds 미제공 | `needs-requirements` | 같은 Requirement Agent가 policy만 반영하고 four exact values/unit dimensions를 sole pending-next로 유지 | -| 2026-08-18 | Requirements OQ-021 zero-scale partial revision | `needs-rework` | revised `requirements.md`; 72/72 traceability, own-channel fallback, common floor/tolerance reuse absence와 four value/dimension request 검증 | `needs-user-decision` | force, force·length, length, dimensionless-rotation exact thresholds 네 값을 사용자에게 요청 | -| 2026-08-18 | Requirements OQ-021 final thresholds | `in-progress` | 사용자 결정: each zero-scale threshold numeric literal=`1e-3` with distinct model-consistent dimensions | `needs-requirements` | 같은 Requirement Agent가 OQ-021을 닫고 exact values/dimensions/pass rule/unit semantics/stale text를 전 구간 정렬 | -| 2026-08-18 | Requirements OQ-021 final revision | `needs-rework` | revised `requirements.md`; 72/72 traceability, OQ-021 closed/OQ-008 sole pending-next, four typed `1e-3`, nonzero `1e-2`, unit/fallback exclusion 검증 | `needs-user-decision` | OQ-008 line-search 지원 범위를 사용자에게 질문 | -| 2026-08-18 | Requirements OQ-008 | `in-progress` | 사용자 결정: option 1 `No line search` | `needs-requirements` | 같은 Requirement Agent가 full-correction direct application과 line-search/damping/merit/reduction/fallback exact absence를 반영하고 max iteration을 OQ-022로 분리 | -| 2026-08-19 | Requirements OQ-008 revision | `needs-rework` | user decision date 2026-08-18 유지; revised `requirements.md`; 72/72, OQ-008 closed/OQ-022 sole pending-next, full-correction identity와 line-search lifecycle exact absence 검증 | `needs-user-decision` | OQ-022 maximum Newton iteration count를 사용자에게 질문 | -| 2026-08-19 | Requirements OQ-022 | `in-progress` | 사용자 결정: attempted increment당 fixed maximum Newton iterations=`100` | `needs-requirements` | 같은 Requirement Agent가 iteration `1..100`, pass-at-100, fail-after-100 및 post-exhaustion exact absence를 반영 | -| 2026-08-19 | Requirements OQ-022 revision | `needs-rework` | revised `requirements.md`; 72/72, OQ-022 closed/OQ-010 sole pending-next, pass-at-99/100, fail-after-100와 post-event absence 검증 | `needs-user-decision` | OQ-010 finite-rotation/director state representation을 사용자에게 질문 | -| 2026-08-19 | Requirements OQ-010 | `in-progress` | 사용자 결정: `Incremental rotation vector + committed triad` | `needs-requirements` | 같은 Requirement Agent가 external DOF/incremental correction/committed-trial triad/multiplicative update/rollback과 downstream map gaps를 반영 | -| 2026-08-19 | Requirements OQ-010 revision | `needs-rework` | revised `requirements.md`; 75/75, OQ-010 closed/OQ-012 sole pending-next, triad/director invariants, exact rollback과 unresolved exact-map gaps 검증 | `needs-user-decision` | OQ-012 authoritative HDF5 accepted-frame/iteration-history 범위를 사용자에게 질문 | -| 2026-08-20 | Requirements OQ-012 | `in-progress` | user decision date 2026-08-19 유지: every committed increment frame, no trial history | `needs-requirements` | 같은 Requirement Agent가 accepted-commit↔frame 1:1/order/factor1 및 trial/failed/partial-final absence를 반영 | -| 2026-08-20 | Requirements OQ-012 revision | `needs-rework` | revised `requirements.md`; 75/75, OQ-012 closed/OQ-011 sole pending-next, accepted-frame bijection/order/factor1, absence/preservation와 factor0/schema gap 분리 검증 | `needs-user-decision` | OQ-011 runtime Newton diagnostic granularity를 사용자에게 질문 | -| 2026-08-21 | Requirements OQ-011 granularity/content | `in-progress` | 사용자 결정: every entered iteration exactly one structured runtime summary | `needs-requirements` | 같은 Requirement Agent가 complete/early-failure content, nonfabrication/order/runtime-only absence를 반영하고 transport/exit mapping을 분리 | -| 2026-08-21 | Requirements OQ-011 granularity revision | `needs-rework` | revised `requirements.md`; 77/77, OQ-011 closed/OQ-025 sole pending-next, completed/early-failure/exhaustion cardinality, nonfabrication와 HDF5/sidecar/reference absence 검증 | `needs-user-decision` | OQ-025 runtime-summary serialization format을 사용자에게 질문 | -| 2026-08-21 | Requirements OQ-025 | `in-progress` | 사용자 결정: `JSON Lines runtime records` | `needs-requirements` | 같은 Requirement Agent가 summary↔JSON-object↔line cardinality, finite/parseable/nonaggregation과 runtime-only absence를 반영하고 exact schema/transport/exit gaps를 분리 | -| 2026-08-21 | Requirements OQ-025 revision | `needs-rework` | revised `requirements.md`; 79/79, OQ-025 closed/OQ-026 sole pending-next, strict JSON Lines cardinality/finite/nonaggregation/order 및 projection absence 검증 | `needs-user-decision` | OQ-026 destination/buffering/failed-run delivery lifecycle을 사용자에게 질문 | -| 2026-08-21 | Requirements OQ-026 | `in-progress` | 사용자 결정: stderr record별 immediate emit+flush | `needs-requirements` | 같은 Requirement Agent가 flush-before-next/return, controlled failure delivery, stable/no-interleaving/no-bulk/no-stdout/projection absence를 반영 | -| 2026-08-21 | Requirements OQ-026 revision | `needs-rework` | revised `requirements.md`; 81/81, OQ-026 closed/OQ-028 sole pending-next, stderr emit/flush cardinality/order/delivery와 prohibited path absence 검증 | `needs-user-decision` | OQ-028 unavailable-field JSON schema를 사용자에게 질문 | -| 2026-08-21 | Requirements OQ-028 | `in-progress` | 사용자 결정: field omission + explicit not-evaluated identity list; low-risk defaults may auto-apply | `needs-requirements` | 같은 Requirement Agent가 omission/list nonfabrication을 반영하고 next item risk classification을 반환 | -| 2026-08-21 | Requirements OQ-028 revision | `needs-rework` | revised `requirements.md`; 82/82, OQ-028 closed/OQ-029 sole pending-next, omission-list bijection/reason/nonfabrication 검증; OQ-029 substantive 분류 | `needs-user-decision` | OQ-029 stderr write/flush failure policy를 사용자에게 질문 | -| 2026-08-21 | Requirements JSON policy scope reversal | `in-progress` | 사용자 요청: JSON 정책 철회, simple plain-text analysis log; destination은 substantive ambiguity | `needs-requirements` | 같은 Requirement Agent가 JSON-specific decisions/requirements를 retire하고 OQ-011을 보존한 뒤 stderr text 대 `.txt` file direct confirmation을 반환 | -| 2026-08-21 | Requirements JSON policy retirement rework | `needs-rework` | revised `requirements.md`; 82→77/77, retired NSNR-078..082, superseded/retired OQ-025..032, current JSON shall/Matrix 0, OQ-011 보존 검증 | `needs-user-decision` | OQ-033 stderr text 대 actual `.txt` file을 direct confirmation | -| 2026-08-21 | Requirements OQ-033 ambiguous response | `needs-rework` | 사용자 원문 verbatim evidence, OQ-033 `pending-clarification`/sole pending-next, 77/77 exact traceability와 금지범위 변경 0건 확인 | `needs-user-decision` | solver-only stderr와 external one-file redirect 의미를 direct yes/no로 확인 | -| 2026-08-21 | Requirements OQ-033 solver-managed file partial decision | `needs-rework` | Solver-managed single `.txt`, external redirect superseded, OQ-033 `pending-clarification`/sole pending-next, 77/77 exact traceability와 금지범위 변경 0건 확인 | `needs-user-decision` | same iteration summary의 file-only 대 file+stderr duplication을 direct confirmation | -| 2026-08-21 | Requirements OQ-033 file-only/no-duplication approval | `needs-rework` | OQ-033 closed; stderr duplicate 0; OQ-035 `analysis.log` sibling unapproved sole pending-next; repository evidence; 77/77 exact traceability와 금지범위 변경 0건 | `needs-user-decision` | OQ-035 filename/location direct confirmation | -| 2026-08-21 | Requirements input-stem output naming scope clarification | `needs-rework` | Exact proposal를 `proposed/pending-scope`로 기록, current shall/Matrix hit 0, OQ-035 sole pending-next, 77/77 exact traceability와 금지범위 변경 0건 | `needs-user-decision` | nonlinear-static-only 대 repository-wide scope direct confirmation | -| 2026-08-21 | Requirements repository-wide output scope approval | `in-progress` | 사용자 승인: all analyses input-directory stem outputs, remove `--output`; current one-input/explicit-output CLI/tests/ARCHITECTURE/ADR conflict read-only audit | `needs-requirements` | cross-procedure requirements와 global-doc handoff를 기록하고 removed-option compatibility를 sole pending-next로 분리 | -| 2026-08-21 | Requirements repository-wide output revision return | `needs-rework` | 77→80/80, NSNR-083..085, OQ-035 closed/OQ-038 sole pending-next, retired-ID reuse 0; NSNR-085 failure-atomicity scope ambiguity 발견 | `needs-requirements` | same Requirement Agent wording-only correction 후 evidence 재검증 | -| 2026-08-21 | Requirements failure-atomicity boundary correction | `needs-rework` | NSNR-085 legacy HDF5 preservation only; new result/log lifecycle OQ-037; 80/80 exact traceability; OQ-038 sole pending-next; forbidden changes 0 | `needs-user-decision` | OQ-038 strict removal/no-alias direct confirmation | -| 2026-08-22 | Requirements OQ-038 strict removal approval | `needs-rework` | OQ-038 closed; exact failure stage/code/diagnostic/output absence; OQ-036 unapproved sole pending-next; 80/80 exact traceability와 forbidden changes 0 | `needs-user-decision` | OQ-036 asymmetric lifecycle direct confirmation | -| 2026-08-22 | Requirements OQ-036 independent lifecycle approval | `needs-rework` | OQ-036 closed; approved log/HDF5 lifecycle and zero pair atomicity; OQ-037 unapproved sole pending-next; 80/80 exact traceability와 forbidden changes 0 | `needs-user-decision` | OQ-037 grouped log-I/O fail-closed direct confirmation | -| 2026-08-22 | Requirements OQ-037 grouped fail-closed approval | `needs-rework` | OQ-037 closed; NSNR-086 operation-stage/preservation/prohibited-event record; 81/81 exact traceability와 forbidden changes 0 | `needs-requirements` | OQ-034 low-risk auto-default revision | -| 2026-08-22 | Requirements OQ-037 revision evidence | `needs-rework` | OQ-037 closed, NSNR-086 added, 81/81 exact traceability, OQ-034 low-risk/OQ-039 first substantive classification | `needs-requirements` | OQ-034 auto-default bounded revision | -| 2026-08-22 | Requirements OQ-034 auto-default revision | `needs-rework` | OQ-034 closed, NSNR-087 added, 82/82 exact traceability, content/authority scope unchanged, OQ-039 sole pending-next | `needs-user-decision` | OQ-039 stem/path identity option selection | -| 2026-08-22 | Requirements OQ-039 lexical identity approval | `in-progress` | 사용자 option 1 approval; concurrency/locking remains substantive | `needs-requirements` | OQ-039 close, open-item audit, same-output concurrency question framing | -| 2026-08-22 | Requirements compact-pruning proposal | `needs-rework` | Read-only 24/24 proposal; 360–390 claim과 section sum 불일치, asymmetric output lifecycle mapping 보강 필요; file edits 0 | `needs-requirements` | Same Requirement Agent read-only correction | -| 2026-08-22 | Requirements compact-pruning corrected design | `needs-rework` | Exact 363-line budget, 24 canonical records/24 Matrix, approved semantic-loss 0, asymmetric log/HDF5 lifecycle explicit, Stage-1 remaining questions 0; baseline unchanged 2,909/83/83/40 | `needs-user-decision` | Compact sectioned-design 한 번의 명시적 사용자 승인 | -| 2026-08-22 | Requirements compact rewrite approval | `in-progress` | User explicitly approved 24-record/363-line-target design and permanent essential-decision-only Requirement Agent discipline | `needs-requirements` | Same Requirement Agent compact rewrite and self-audit | -| 2026-08-22 | Requirements compact rewrite return | `needs-rework` | 395 lines, exact 24↔24, no OQ/trivia/questions; Coordinator found NSNR-083 retained exit 2/pre-output but omitted approved pre-input/pre-Analysis precedence and no-alias/deprecation | `needs-requirements` | Same Requirement Agent NSNR-083 wording-only correction | -| 2026-08-22 | Requirements NSNR-083 correction return | `needs-rework` | 395 lines, exact 24↔24, NSNR-083 summary/record/Matrix preserve pre-input/pre-Analysis/pre-result-log exit 2 and no alias/deprecation; duplicate/missing/orphan/questions/placeholders/forbidden changes 0 | `needs-user-decision` | Present compact Stage-1 artifact for explicit user approval | -| 2026-08-23 | Requirements explicit user approval | `passed` | User explicitly approved `requirements.md`; owner and Coordinator evidence already passed | `research-in-progress` | Dispatch Research Agent for Stage 2 evidence | -| 2026-08-23 | Research Agent return and Coordinator audit | `needs-rework` | `research.md` owner pass; Coordinator verified 10 sections, S1–S17, 12 complete benchmark candidates, 11 requirement IDs, 14 unique open issues, local evidence existence, nonlinear stored reference hits 0 and forbidden changes 0 | `needs-user-decision` | Present Stage-2 artifact for explicit user approval | -| 2026-08-23 | Research explicit user approval | `passed` | User explicitly approved `research.md`; Research Agent and Coordinator evidence already passed; approved artifact SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` | `needs-formulation` | Dispatch Formulation Agent for bounded Stage 3 evidence | -| 2026-08-23 | Formulation dispatch attempt 1 | `in-progress` | Approved Stage-1/2 baselines and project contracts audited; bounded package requires O-ROT/O-MAP/O-DRILL/O-MOM/O-BC closure without downstream contract changes | `needs-formulation` | Await Formulation Agent return and independently audit Stage-3 evidence | -| 2026-08-23 | Formulation Agent return and Coordinator audit | `needs-rework` | `formulation.md` owner pass/`ready-for-numerical-review`; Coordinator verified 18 required sections, exact 7/7 formulation closure IDs, complete 24-coordinate residual/tangent term inventory, state/integration/recovery/verification/traceability sections, balanced math/fence structure, upstream hash preservation and forbidden changes 0; output SHA-256 `516EB692619C6AAB1AD09061A671697BB7C1B821B0B60BC5A2831CA5D09E131D` | `needs-user-decision` | Present Stage-3 artifact for explicit user approval; do not dispatch Stage 4 | -| 2026-08-23 | Formulation independent consistency review | `needs-rework` | §13.4 uses rotation matrix symbol `R_I` as reaction force, creating dimensional collision; §§4.4/5/11.2 mix tolerance-based source-moment admissibility with exact tangency/projection work statements. Both are bounded formulation-document defects and first normalized attempts. | `needs-formulation` | Same Formulation Agent targeted rework attempt 2; preserve scope/threshold/public meaning | -| 2026-08-23 | Formulation bounded rework attempt 2 return and Coordinator audit | `needs-rework` | Owner pass; reaction force/generalized moment/spatial moment 기호·단위가 rotation matrix `R_I`와 분리되고 force/moment balance가 corrected. Immutable fixed-global source, unchanged `rho_M <= 1e-12`, exact projected work covector, removed director component/no drill channel, `DP`/`DJ_l`/map-Hessian을 포함한 chart/global residual-tangent identity가 일치함. 18 sections/7 closures, upstream hashes와 forbidden-change boundary 보존; SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`. | `needs-user-decision` | Present corrected Stage-3 artifact for explicit user approval; do not dispatch Stage 4 | -| 2026-08-23 | Formulation explicit user approval | `passed` | Task payload states the user explicitly approved `docs/nonlinear-static-newton-raphson/formulation.md`; approved SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` retained. | `needs-numerical-review` | Dispatch `numerical-review-agent` only | -| 2026-08-23 | Numerical/reference dispatch attempt 1 | `blocked` | Coordinator prepared bounded Stage 4 package, but no collaboration `spawn_agent` tool is exposed in this agent environment; `tool_search` found no dispatch tool; `codex exec` fallback was interrupted, is not a visible child-agent dispatch, and produced no Stage 4 outputs. | `blocked` | Expose/route the valid `numerical-review-agent` collaboration dispatch, then rerun Stage 4 owner task | -| 2026-08-23 | Numerical/reference owner return | `needs-rework` | Root-dispatched `numerical-review-agent` returned both outputs with owner status `pass-for-io-definition`, shellNL/shell read-only inventory, row prechecks and blockers none. Coordinator/root audit found a blocking cross-report contradiction on stress CSV and `RM3` comparison disposition, so acceptance evidence is not coherent. | `needs-numerical-review` | Same `numerical-review-agent` bounded reconciliation; do not dispatch I/O | -| 2026-08-23 | Numerical/reference corrected return | `passed` | Corrected current reports have owner status `pass-for-io-definition`; stress CSVs are optional read-only inspection/order evidence only, `RM3` is excluded, and required external comparison is displacement, reaction force and physical spatial `RM1/RM2`. Coordinator verified required sections, exact paths, no concrete HDF5 dataset paths and no forbidden file-change scope. | `needs-user-decision` | Present Stage 4 artifacts for explicit user approval; do not dispatch I/O | -| 2026-08-23 | Numerical/reference explicit user approval | `passed` | User explicitly approved Stage 4 documents and requested next gate; approved hashes retained for requirements, research, formulation, numerical-review and reference-model. | `needs-io-definition` | Prepare bounded `io-definition-agent` dispatch package | -| 2026-08-23 | I/O Definition dispatch package | `in-progress` | Coordinator prepared Stage 5 package requiring `fesa-io-contract`, exact Stage 1-4 inputs, corrected reference disposition, authoritative `results.h5`, and only `docs/nonlinear-static-newton-raphson/io.md` output. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; await owner return | -| 2026-08-23 | I/O Definition owner return and Coordinator audit | `needs-rework` | Owner returned `io.md` status `ready-for-coordinator-review`, SHA-256 `75D702301D6285F151D913DCD0351F4AD302C4C24A004DD5841A576592D675FC`, blockers none. Coordinator confirmed blocking defects in `--output` substring rejection, Newton iteration log schema, `VARIABLE=PRESELECT` ignored output request acceptance and repository-wide non-Newton log lifecycle. | `needs-io-definition` | Same `io-definition-agent` bounded correction; do not start Implementation Planning | -| 2026-08-23 | I/O Definition bounded rework return and Coordinator audit | `passed` | Owner returned corrected `io.md` status `ready-for-coordinator-review`, SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`, blockers none. Coordinator verified REWORK-002 closure, DECISION-028/029/030 output lifecycle/path/log evidence, HDF5/reference/tolerance preservation and no stale narrow `--output` rule. | `needs-user-decision` | Present Stage 5 artifact for explicit user approval; do not start Implementation Planning | -| 2026-08-23 | I/O Definition explicit user approval | `passed` | User explicitly approved `docs/nonlinear-static-newton-raphson/io.md` SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` and requested the next Implementation Planning gate. | `needs-implementation-plan` | Prepare bounded `implementation-planning-agent` draft package only | -| 2026-08-23 | Implementation Planning draft dispatch package | `in-progress` | Coordinator prepared Stage 6 planning package requiring `fesa-cpp-msvc-tdd` and project-local `harness`, approved Stage 1-5 hashes, exact reference/tolerance disposition and draft-only stop condition. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await draft/interview return | -| 2026-08-23 | Implementation Planning draft owner return and Coordinator audit | `passed` | Owner returned draft status `draft-ready-for-user-review`, slug `nonlinear-static-newton-raphson`, Steps `0..12`, no files changed, no interview issue/blocker. Coordinator verified requirements/category mapping, TDD/Harness step shape, prepared-analysis orchestration boundary, exact reference/tolerance preservation and no forbidden execution or file creation. | `needs-user-decision` | Present Stage 6 draft for explicit user approval or bounded rework request; do not materialize files yet | -| 2026-08-24 | Implementation Planning draft explicit user approval | `passed` | User explicitly approved the 13-Step draft and requested `implementation-plan.md` plus pending Harness phase file creation. | `needs-implementation-plan` | Prepare bounded materialization package for `implementation-planning-agent` only | -| 2026-08-24 | Implementation Planning materialization dispatch package | `in-progress` | Coordinator authorized only `implementation-plan.md`, append pending phase entry, create phase index and `step0.md`..`step12.md` pending with no executor timestamps; source/tests/CMake/upstream/reference/tolerance/evidence docs and Harness/build/test execution remain forbidden. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await materialization return | -| 2026-08-24 | Implementation Planning materialization owner return and Coordinator audit | `passed` | `implementation-plan.md`, `phases/index.json`, phase index and `step0.md`..`step12.md` are materialized after user approval. Coordinator/root audit passed phase uniqueness, 13/13 pending steps without executor metadata, 151 root assertions, reference hashes/row counts and no unauthorized evidence docs/execution/source/test/CMake/reference edits. | `ready-for-implementation` | Await separate explicit Harness/implementation execution request; do not run Executor automatically | -| 2026-08-24 | Harness/Implementation execution authorization and dispatch package | `in-progress` | User explicitly requested Harness/Implementation execution. Coordinator verified materialized phase still has Step 0 `cli-output-lease-and-derived-names` as the first pending Step, preserved Stage 1-5 hashes and materialization evidence, and prepared no-push `scripts/execute.py nonlinear-static-newton-raphson` dispatch. | `needs-implementation` | Run no-push Harness executor; await Implementation/Harness return before any physics/release transition | -| 2026-08-24 | Harness/Implementation execution attempt 1 | `needs-rework` | No-push Harness attempt failed before Step 0 evidence: `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no source/test edits, `step0-output.json`, `MAX_RETRIES`, or Step evidence. Normalized classification `harness-uncaught-step-codex-timeout-no-retry` attempt 1. | `needs-implementation` | Bounded Harness repair before retry; do not route to Correction Agent for first clear harness failure | -| 2026-08-24 | Harness repair after attempt 1 | `passed` | Implementation Agent repaired Harness timeout/profile handling in `scripts/execute.py` with tests in `tests/test_execute.py`; RED 3 expected failures, GREEN 3 passed, focused 10/10 passed, full pytest 23 passed/1 pre-existing `xhigh` vs `extra high` mismatch. Root review found no new defect and reproduced the same evidence. No phase execution, phase/source/CMake/reference/evidence docs edit, or reference solver activity. | `needs-implementation` | Retry no-push Harness attempt 2 for Executor-selected Step 0 in workspace-write; if the same normalized timeout recurs, stop automatic rework and route to `needs-user-decision` or `blocked` | -| 2026-08-24 | Harness/Implementation execution attempt 2 | `blocked` | Repaired Executor produced `step0-output.json` with `exitCode` 124 and stderr `Codex timed out after 1800 seconds.`. The Implementation Agent turn completed, but every nested shell `command_execution` remained `status=in_progress` even for `Get-Date`, `cmd echo`, and `exit 0`; Step 0 stayed pending with no production/test changes. Root cause is `harness-nested-codex-windows-shell-tool-execution-hang` attempt 2. | `blocked` | Stop remaining automatic retries; no workaround/further Harness execution until explicit user/root decision or external runtime fix | -| 2026-08-24 | Root correction-cycle authorization | `in-progress` | Root authorized one bounded Correction Agent diagnostic/rework cycle for the repeated infrastructure/runtime failure; unauthorized retry PIDs have been terminated and none remain. Coordinator prepared a correction package limited to no-op/tool smoke reproduction, local Codex CLI/config option inspection, documented flag hypothesis testing, and optional TDD runner changes in `scripts/execute.py`/`tests/test_execute.py`. | `needs-correction` | Root profile dispatch to `correction-agent` is required because this Coordinator runtime exposes no callable `spawn_agent` tool | -| 2026-08-24 | Correction Agent return and Coordinator audit | `blocked` | Correction Agent returned `blocked` and created only `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `C9F93AC99225725C88BB7F0BABC8F7D75D3E05082070090328203DB3776BEFE6`. Baseline smoke reproduced no nested shell completion; `--disable code_mode_host` failed closed; `--enable unified_exec` hung; combined flags failed closed. Root verified no nonlinear Harness/Codex processes remain, all 13 steps pending, Python 23 passed/1 pre-existing failure, MSVC build exit 0, discovery 214 and CTest 214/214. | `blocked` | No further Harness retry until external Codex runtime update/repair plus bounded shell smoke success | -| 2026-08-24 | Codex `0.149.1` smoke pass and runner preflight | `needs-rework` | User/root authorized Codex CLI update, bounded smoke and Harness rerun. Smoke passed only with aligned `CODEX_HOME`, filtered WindowsApps PATH entries and `--disable unified_exec`; current `scripts/execute.py` does not pass that flag to nested `codex exec`, while local `codex exec --help` confirms `--disable ` support. | `needs-correction` | Dispatch bounded runner-option correction before any no-push Harness phase rerun | -| 2026-08-24 | REWORK-004 Correction return and Coordinator audit | `passed` | Correction returned `corrected-for-implementation-rerun`; runner now passes adjacent `--disable`, `unified_exec` after `codex exec`; regression test asserts the command contract; `corrections.md` SHA-256 `82572437689B41323B6533C2361F2F12BF07B5ED305825AA84C56AEEDC729930`; focused tests 10/10, full pytest only known pre-existing mismatch, MSVC build and 214/214 CTest pass per owner/root evidence. | `needs-implementation` | Root is authorized to run no-push `python scripts/execute.py nonlinear-static-newton-raphson` with Codex `0.149.1`, aligned `CODEX_HOME`, filtered child PATH, `workspace-write`, hooks retained and no `danger-full-access` | -| 2026-08-24 | Harness rerun Step 1 safe block | `needs-rework` | No-push Harness rerun under the approved Codex `0.149.1` envelope exited 2 safely, not by nested shell hang. Step 0 completed and committed (`fc16ef6`, metadata `e7c6932`). Step 1 is `blocked` because Visual Studio 18 CMake configure hit MSBuild `FileTracker` `E_ACCESSDENIED` in `workspace-write`; root reports clean Ninja/MSVC build and all 228 CTest cases passed. Top phase hash `E5AB831A326AA361B1C3491DA2DA09AC2CA8D66D9A3BCEE8E771D78C6352EC45`, phase index hash `5CD3B4E2BD50BF03A105CAC645F7F48F5A1360414E085B08C9D75BF6D46317A8`, Step 1 output hash `B04B25E8C2D1E0CD54E712B086623E1741FC563A70F0582FD6DC813F660CD6D7`. | `needs-correction` | Root profile dispatch to bounded `correction-agent` for FileTracker diagnosis under `workspace-write`; `danger-full-access` requires explicit new user approval and is not authorized | -| 2026-08-24 | REWORK-005 FileTracker Correction return and Coordinator audit | `blocked` | Correction returned `blocked` / `needs-user-decision`, changed only `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `BCA9DEE6F6F262A70FB5C7A49B2BF06CA3FF8BC6C6838FB20A8B48071CF9D420`. VS18/MSBuild `18.8.2` fails in FESA and gtest at `FileTracker..cctor()` -> `GetLongFilePath` with `E_ACCESSDENIED`; inherited `TEMP`/`TMP` is outside workspace; `/p:TrackFileAccess=false` and `:workspace` echo were not proven; exact process trees were cleaned; Ninja/MSVC 27/27 focused and 228/228 full evidence is preserved but not an approved substitute. | `needs-user-decision` | User must choose A Ninja/MSVC evidence substitution, B isolated `danger-full-access` fallback, or C stop pending external Codex sandbox Temp/FileTracker repair | -| 2026-08-24 | USER-DECISION-002 option A and REWORK-006 dispatch | `in-progress` | User explicitly approved option A: Ninja/MSVC is the accepted Stage 6 validation contract. Coordinator/root audit found `.harness/config.json` ignored/absent, CMake presets absent, and adapter preset triplets sufficient to route Stop hook to Ninja without Harness Python production changes. Root dispatched `correction-agent` for preset/config plumbing, preset-contract RED test, planning/phase command rewrite, blocker-clear evidence, and phase reset only after evidence. | `needs-correction` | Await REWORK-006 Correction return; no Harness rerun, Step 2, `danger-full-access`, push, reference solver or reference artifact change | -| 2026-08-24 | REWORK-006 Correction return and Coordinator audit | `passed` | Correction returned `corrected-for-implementation-rerun`; `corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81`; Ninja/MSVC Debug configure/build/discovery/full CTest passed with 228/228, Stop-hook `codex exec` exit 0, focused contract test 1/1, full Python 24 passed plus pre-existing `xhigh`/`extra high`; reference hashes unchanged; top phase and Step 1 reset to `pending` only after evidence; root independent review found no blocking issue. | `needs-implementation` | Root is authorized to rerun no-push `python scripts/execute.py nonlinear-static-newton-raphson` from Step 1 under approved Ninja/MSVC workspace-write envelope | -| 2026-08-24 | Harness Step 11 reference-comparison block and REWORK-007 dispatch | `needs-rework` | Harness Steps 0..10 completed. Step 11 owner added reference comparator/test files but blocked because copied `shellNL.inp` reaches `nonlinear-nonconvergence` after 100 Newton iterations; `shellNL_results.h5` is absent, `git diff -- reference` is clean, and Step 12 remains pending. Log evidence shows force/correction channels passing while residual moment remains failing; approved convergence contract must not be relaxed silently. | `needs-correction` | Root profile dispatch to bounded `correction-agent`: diagnose/fix only implementation-owned nonlinear solver/convergence defect under approved contracts, or return `upstream-contract` / `needs-user-decision` if the approved moment-denominator contract is the blocker | -| 2026-08-24 | REWORK-007 upstream-contract return and Coordinator audit | `blocked` | Correction returned `needs-upstream-decision`, `corrections.md` SHA-256 `63E0FF45AF44F564B276C2400B2D1A9AB5F90FC9E1470F4F8246ED57231B175B`, changed only that report. Proof: shellNL has no external rotational generalized force, so approved `D_M=max(||f_int||inf,||f_ext||inf)` gives `eta_M=1` for every nonzero rotational residual; focused CTest #288 reproduced the failure and 100/100 log records have numerator=denominator, relative branch, pass=0. | `needs-user-decision` | USER-DECISION-003: choose a residual-moment convergence contract path before requirements/formulation/numerical-review/io/planning rework or stop the feature | -| 2026-08-24 | USER-DECISION-003 option 1 and Requirements rework dispatch | `in-progress` | User approved option 1: if the matching external residual-channel scale is exact zero, apply the existing typed absolute residual gate; otherwise retain the current relative denominator. Coordinator recorded required re-approval sequence and bounded Stage 1 rework to NSNR-069 in `requirements.md` only. | `needs-requirements` | Root profile dispatch to `requirement-agent`; await revised `requirements.md` return and Coordinator audit before explicit Stage 1 re-approval | -| 2026-08-24 | Requirements NSNR-069 option 1 return and Coordinator audit | `passed` | Requirement Agent returned `draft`, `ready-for-coordinator-review`, `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`. Coordinator verified hash, `git diff --check`, 397 lines, 24/24 records/Matrix rows, scoped NSNR-069/status/tolerance/matrix/handoff diff, unchanged thresholds/four-channel AND/Full Newton/100 iterations/reference disposition, and no forbidden execution or artifact change. | `needs-user-decision` | Ask user to explicitly approve revised `requirements.md`; do not dispatch formulation yet | -| 2026-08-24 | Revised Stage 1 approval and Formulation §14.1 dispatch | `in-progress` | User explicitly approved revised `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`. Coordinator closed the Stage 1 re-approval item and prepared a bounded `formulation-agent` package for `formulation.md` §14.1 only under USER-DECISION-003 option 1. | `needs-formulation` | Root profile dispatch to `formulation-agent`; await §14.1-only return and Coordinator audit; do not start numerical-review/I/O/planning/implementation | -| 2026-08-24 | Formulation §14.1 option 1 return and Coordinator audit | `passed` | Formulation Agent returned `ready-for-coordinator-and-user-reapproval`, `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`. Coordinator verified hash, §14.1-only diff `34` additions/`5` deletions, revised requirements hash alignment, external-scale exact-zero selector, retained nonzero-external relative gate, unchanged thresholds/correction gates/four-channel AND/lifecycle/reference disposition, and no forbidden execution or artifact change. | `needs-user-decision` | Ask user to explicitly approve revised `formulation.md`; do not dispatch numerical-review yet | -| 2026-08-24 | Revised Stage 3 approval and Numerical/reference dispatch | `in-progress` | User explicitly approved revised `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`. Coordinator closed REAPPROVAL-002 and prepared a bounded `numerical-review-agent` package to validate USER-DECISION-003 option 1, dimensions/predicates, shellNL readiness and reference disposition. | `needs-numerical-review` | Root profile dispatch to `numerical-review-agent`; await owner return and Coordinator audit; do not start I/O/planning/implementation | -| 2026-08-24 | Numerical/reference option 1 return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`; `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153`, diff `+49/-11`; `reference-model.md` byte-identical SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`. Coordinator verified revised branch coverage, unchanged reference disposition, reference hashes/row counts, no concrete HDF5 dataset paths, no forbidden artifact/execution scope and diff check pass. | `needs-user-decision` | Ask user to explicitly approve revised Stage 4 artifacts; do not dispatch I/O yet | -| 2026-08-24 | Revised Stage 4 approval and I/O dispatch | `in-progress` | User explicitly approved revised `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153` and unchanged `reference-model.md` SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`. Coordinator closed REAPPROVAL-003 and prepared a bounded `io-definition-agent` package for `io.md` only. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; await owner return and Coordinator audit; do not start planning/implementation/Harness | -| 2026-08-24 | I/O option 1 return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`; `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`, diff `+37/-20`. Coordinator verified approved source hash alignment, residual matching-external-scale exact-zero/nonzero selector, retained nonzero relative denominator, unchanged 39-field `nsnr-log-v1` labels/order, unchanged HDF5/reference projection and dispositions, stress optional/RM3 excluded, diff check pass and reference diff clean. | `needs-user-decision` | Ask user to explicitly approve revised `io.md`; do not dispatch planning/implementation/Harness | -| 2026-08-24 | Revised Stage 5 approval and Implementation Planning revision-draft dispatch | `in-progress` | User explicitly approved revised `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`. Coordinator closed REAPPROVAL-004 and prepared a bounded `implementation-planning-agent` package to draft exact plan/phase revisions for USER-DECISION-003 option 1 while preserving Steps 0..10 history and Step 11 blocked comparator work. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; owner returns concise revision draft only; do not materialize planning files or run Harness until user approves the draft | -| 2026-08-25 | Implementation Planning option 1 revision draft return and Coordinator audit | `passed` | Implementation Planning owner returned `draft-ready-for-user-review`, no files changed/executed. Draft proposes minimal updates to `implementation-plan.md`, Step `5/7/10/11/12` and phase indexes; Step 11 owns RED-first `NSNR-CTRL-018..021` and `NSNR-LOG-012`, minimal `nonlinear_static_control.cpp` update, comparator preservation, copied `shellNL` reference comparison and full CTest. Coordinator verified approved upstream semantics and Harness ownership boundaries. | `needs-user-decision` | Ask user to explicitly approve the planning revision draft; do not materialize or run Harness | -| 2026-08-25 | Implementation Planning revision draft approval and materialization dispatch | `in-progress` | User explicitly approved the audited Implementation Planning revision draft and requested materialization. Coordinator closed REAPPROVAL-005 and prepared bounded materialization dispatch limited to `implementation-plan.md`, Step `5/7/10/11/12`, feature index and top index. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await materialization return and Coordinator audit; do not run Harness/CTest/code/reference/push | -| 2026-08-25 | Implementation Planning materialization return and Coordinator audit | `passed` | Owner returned `ready-for-implementation`; approved 8 outputs materialized, Step 11 reset to `pending`, top phase reset to `pending`, Steps 0..10 completed history and Step 11 partial comparator files preserved, Step 12 pending, forbidden source/include/reference/tolerance diff empty, HEAD unchanged and no execution/commit/push. | `ready-for-implementation` | Await separate explicit no-push Harness/Implementation execution request; current Executor-selected pending Step is Step 11 | -| 2026-08-25 | Step 11 no-push Harness/Implementation execution authorization | `in-progress` | User explicitly requested no-push Harness/Implementation rerun from Step 11. Coordinator preflight verified isolated linked worktree, branch `feat-nonlinear-static-newton-raphson`, HEAD `65b56b1`, Step 11 `pending` with historical `started_at`, Step 12 `pending`, Codex CLI `0.149.1`, approved `windows-msvc-ninja-debug` preset/config, runner `--disable unified_exec`, and approved dirty state with preserved comparator files. | `needs-implementation` | Launch no-push Harness Executor under DECISION-038/039 envelope; await Step 11 return; no `danger-full-access`, push, reference mutation, reference solver, Step 12, Physics or Release | -| 2026-08-25 | Step 11 reference-comparison return and REWORK-008 dispatch package | `needs-rework` | Harness exit `2`; Step 11 blocked; Step 12 pending; `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`. Selector/control/log fix passed and factor-one HDF5 exists, but reference gate `15/16` failed on blocking reaction RMS. Additional read-only diagnosis shows deterministic key mapping and global equilibrium but local reaction redistribution mismatch already present in linear-limit reactions, so Correction must audit implementation-vs-upstream-contract before any production edit. | `needs-correction` | Root profile dispatch to `correction-agent` for REWORK-008 diagnostic; no tolerance/reference/HDF5 schema contract change, reference solver, reference mutation, `danger-full-access`, push, Step 12, Physics or Release | -| 2026-08-25 | REWORK-008 upstream-contract return and USER-DECISION-004 gate | `blocked` | Correction returned `needs-upstream-decision`, classification `upstream-contract` / `reference-blocking-model-adequacy-conflict`, Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`. It found no reaction computation/storage/mapping defect: residual→reaction→HDF5 mapping exact, constrained `phi=0`, global resultant matches, and local RF/RM mismatch already exists in FESA-linear versus Abaqus-linear while each solver NL≈linear. No forbidden files changed by correction; reference diff clean and HEAD unchanged. | `needs-user-decision` | USER-DECISION-004: choose local nodal reactions review-only with global equilibrium blocking, global resultant-only blocking, or independent formulation-appropriate local-reaction benchmark; do not dispatch further work before explicit choice | -| 2026-08-25 | MESH-REFINEMENT-SPIKE-001 numerical-review dispatch | `in-progress` | User added untracked main-checkout `reference/shellNL-meshfine` artifacts and explicitly approved a spike design for USER-DECISION-004 option 3 candidate validation. Coordinator verified read-only hashes/rows and feature-worktree missing state, then recorded a bounded `numerical-review-agent` package for artifact/input-equivalence/row-identity readiness only. | `needs-user-decision` | Root profile dispatch to `numerical-review-agent`; no final option selection, reference solver, artifact mutation, tolerance/comparator/HDF5 schema/implementation/Harness/Step 12/Physics/Release change | -| 2026-08-25 | MESH-REFINEMENT-SPIKE-001 diagnostic return and Coordinator audit | `passed` | Fine artifacts copied byte-identically; required displacement/reaction artifacts are valid, stress is optional inventory only with one malformed optional key. Existing executable run exited `0` and produced H5/log hashes. Translation/rotation pass common tolerance, but local RF/RM rows still fail per-row gates; inplane reaction worsens under refinement. Global resultants and free residuals are sound. The same Abaqus S4 coarse/fine pair is not an independent formulation-appropriate local-reaction benchmark. | `needs-user-decision` | Ask user to choose USER-DECISION-004; Coordinator recommends option 1 review-only local nodal rows plus blocking global equilibrium/resultants; no Harness/Step 11 rerun before approval | -| 2026-08-26 | TRANSLATION-REPORT-001 focused reporting dispatch | `in-progress` | User approved bounded focused report design for `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md`: coarse/fine U1/U2/U3 translation-only comparison with exact artifact/HDF5 identity, source-key prechecks, `docs/TOLERANCE.md`, metrics, worst rows, mesh trend and exclusions. | `needs-user-decision` | Root profile dispatch to `implementation-agent`; only the focused report may be created; do not create canonical `reference-comparison.md`, run solver/Harness/reference solver, edit code/comparator/tolerance/reference artifacts, change USER-DECISION-004, or advance Step 11/12 | -| 2026-08-26 | TRANSLATION-REPORT-001 return and Coordinator audit | `passed` | Implementation Agent returned `translation-diagnostic-pass-not-a-gate` and created only `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`. Coordinator/root audit verified exact artifact hashes, coarse/fine U-key prechecks, `docs/TOLERANCE.md` pass metrics, explicit exclusions, diff check pass, tracked reference diff clean and canonical evidence docs absent. | `needs-user-decision` | Historical pre-decision state; superseded by USER-DECISION-004 option 1 entry below. No Step 11 rerun, Step 12, Physics or Release before required upstream re-approval | -| 2026-08-26 | USER-DECISION-004 option 1 approval and requirements dispatch package | `in-progress` | User explicitly selected option 1. Coordinator recorded local nodal RF/RM as review-only/nonblocking, global resultant force/moment plus accepted free residual as blocking reaction/equilibrium evidence, verified Stage 3 formulation has no immediate semantic rework need because §11.4/§13.4 already define reactions/global resultants, and recorded the Stage 5/6 projection audit item for current-position/spatial-moment global equilibrium versus raw-residual implementation helper. | `needs-requirements` | Root profile dispatch to bounded `requirement-agent` for `requirements.md` only; after owner return, Coordinator audit and explicit user approval are required before Stage 4 | -| 2026-08-27 | REAPPROVAL-006 Requirements return and Coordinator audit | `passed` | Requirement Agent returned revised `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, status `draft`. Coordinator verified hash, 24/24 requirement and matrix preservation, USER-DECISION-004 option 1 semantics, AUDIT-001 Stage5/6 handoff, preserved formulation meaning, unchanged thresholds/reference immutability and no forbidden gate advancement. | `needs-user-decision` | Ask user to explicitly approve revised `requirements.md`; do not dispatch Stage 4 Numerical/reference until approval | -| 2026-08-27 | Revised Stage 1 approval and Stage 4 Numerical/reference dispatch package | `in-progress` | User explicitly approved revised `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`. Coordinator closed Stage 1 re-approval and prepared bounded `numerical-review-agent` package requiring `fesa-numerical-review`, USER-DECISION-004 option 1 reaction disposition, coarse/fine reference role review and AUDIT-001 downstream separation. | `needs-numerical-review` | Root profile dispatch to `numerical-review-agent`; allowed outputs only `numerical-review.md` and `reference-model.md`; do not start Stage 5 | -| 2026-08-27 | REAPPROVAL-007 Numerical/reference return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`, blockers none; `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091`, `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`. Coordinator verified requirements/formulation alignment, fine-primary/coarse-companion roles, local RF/RM review-only with `RM3`/stress excluded, U blocking/UR warning-only, internal normalized `1e-10` global balance gate separated from external `docs/TOLERANCE.md`, NSNR-069 free residual gate and AUDIT-001 Stage5/6 handoff. | `needs-user-decision` | Ask user to explicitly approve revised Stage 4 artifacts; do not dispatch Stage 5 I/O yet | -| 2026-08-27 | Revised Stage 4 approval and Stage 5 I/O dispatch package | `in-progress` | User explicitly approved revised `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091` and `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`. Coordinator closed REAPPROVAL-007 and prepared bounded `io-definition-agent` package requiring `fesa-io-contract`, USER-DECISION-004 option 1 HDF5/reference projection update, AUDIT-001 logical quantity separation and no parser/API/code/reference changes. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; expected output only `io.md`; await owner return and Coordinator audit; do not start Stage 6/Harness | -| 2026-08-27 | REAPPROVAL-008 I/O return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`, blockers none; `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`, LF-normalized SHA-256 `BF775990D83D95B470F814BE57C9676305119D97E48225E231D4926E7809029F`. Coordinator verified approved source hashes, HDF5 schema v1 authority, `/global/equilibrium` applied-plus-reaction current-position/spatial-moment semantics, distinct free-residual/constrained-resultant/balance-error projections, local RF/RM review-only, `RM3`/stress excluded, U blocking/UR warning-only, fine primary/coarse companion and internal `1e-10` versus external `docs/TOLERANCE.md` boundary. | `needs-user-decision` | Ask user to explicitly approve revised `io.md`; do not start Stage 6 planning/materialization/Harness before approval | -| 2026-08-27 | Revised Stage 5 approval and Stage 6 planning re-entry draft dispatch | `in-progress` | User explicitly approved revised `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`. Coordinator closed REAPPROVAL-008 and prepared bounded DRAFT ONLY `implementation-planning-agent` package requiring `fesa-cpp-msvc-tdd` plus project-local `harness`; the owner must audit existing Step 11+ plan/phase state and return a chat draft only. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; no planning-file materialization, Harness, build, CTest, solver, reference solver, source/test/CMake/reference/tolerance edit, commit or push before draft approval | -| 2026-08-27 | REAPPROVAL-009 Planning draft return and Coordinator audit | `passed` | Planning Agent returned `draft-ready-for-user-review`, blockers none, no files changed/executed. Coordinator verified the draft is a minimal Step 11/12 revision: preserve Steps `0..10`, reset/rename only Step `11` after approval, keep Step `12` pending, cover AUDIT-001 current-arm/spatial-moment projections, no new HDF5 dataset/public header, internal/external tolerance separation, fine primary/coarse companion and approved Ninja/MSVC commands. | `needs-user-decision` | Ask user to approve or reject the Stage 6 revision draft; do not materialize planning files or run Harness until explicit approval | -| 2026-08-27 | REAPPROVAL-009 draft approval and MATERIALIZATION-003 dispatch package | `in-progress` | User explicitly approved the Coordinator-audited 2-Step draft. Coordinator prepared materialization-only dispatch to `implementation-planning-agent`, required `fesa-cpp-msvc-tdd` plus project-local `harness`, fixed current input hashes and allowed only `implementation-plan.md`, `phases/index.json`, phase index, `step11.md` and `step12.md` as outputs. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; no Harness/build/CTest/solver/reference solver, code/tests/CMake/upstream/reference/tolerance edit, evidence-doc creation, commit or push | -| 2026-08-27 | MATERIALIZATION-003 return and Coordinator audit | `passed` | Planning Agent materialized exactly the allowed five outputs: `implementation-plan.md` `758F8F5BB224E88864338C48221D53D4BD2F8633E04C9F2136FFF9E2D1BADFB8`, `phases/index.json` `536D4BF9427792ECCCE4C9A2980210E050035D0202DB8A700BDD671E0DB218C7`, phase index `D808D5C0F389B444A529FC81A48B5726E4CF282CA51B62F3AECAC4D89EA6A5BF`, `step11.md` `D324F7E1495A25B3B8CEA7A2A6C68D559F8336C3A527A164ECD2D0A82C20A526`, `step12.md` `F2831F7E802A40631C91E638C9079508EF1A97CFE46FACC51DCBB4EC55337452`. Coordinator verified JSON parse, 24/24 requirements mapping, clean placeholder scan, scoped `git diff --check` pass, `NSNR-PROC-019` collision handling, Step `11` pending, Step `12` pending, Steps `0..10` preserved, canonical evidence docs absent, tracked reference diff clean, and no execution/commit/push. | `needs-implementation` | Await separate explicit no-push Step 11 Harness/Implementation request; do not run Harness automatically | -| 2026-08-27 | Step 11 no-push Harness/Implementation execution approval | `in-progress` | User explicitly approved `Harness/Implementation 시작`. Coordinator verified current runner CLI takes slug `nonlinear-static-newton-raphson`, current phase has Step `11` pending and Step `12` pending, and prepared a no-push `implementation-agent` via Harness dispatch for Step `11` only under DECISION-038/039. Step `12` is outside this approval; current runner loops over pending steps, so root/Executor must enforce the one-step boundary or stop before Step `12`. | `needs-implementation` | Root may run `python scripts/execute.py nonlinear-static-newton-raphson` only under the recorded no-push Step 11 envelope; await Step `11` return | -| 2026-08-27 | Step 11 execution recurrent runtime block | `blocked` | DECISION-042 Step11-only execution used the approved no-push envelope but timed out after `1800s`; `step11-output.json` SHA-256 `9FCBC5CE10E2C1B931EC16CADFADF7684C45FBB0B11D9A404922D607EB16706D`, exit `124`, stderr `Codex timed out after 1800 seconds.`, stdout nested command executions stuck `in_progress`. Retry was prevented by secondary CP949 `UnicodeEncodeError` printing `↻`. Read-only shell smokes under tested flag/env variants did not complete. Step `11` and Step `12` remain pending; no production/test/reference edits, commit or push. | `needs-user-decision` | No automatic correction dispatch; user must choose a runtime/runner route before any Step `11` rerun | -| 2026-08-28 | USER-DECISION-005 option A and Step 11 runtime-smoke dispatch | `in-progress` | User approved option A: use official current Codex CLI `0.150.1` to restore the runtime/update path, prove same `workspace-write`/filtered WindowsApps PATH/`CODEX_HOME`/VsDevCmd/hooks/Terra-xhigh/`--disable unified_exec` envelope with a bounded nested shell smoke, then rerun only Step `11` no-push if the smoke passes. | `needs-implementation` | Root may perform the Codex `0.150.1` smoke preflight and, only on pass, launch Step `11` Harness/Implementation under the active dispatch; Step `12`, push, `danger-full-access`, reference solver/artifact mutation and manual hooks remain forbidden | -| 2026-08-28 | USER-DECISION-005A smoke pass and Step 11 dispatch confirmation | `passed` | Root supplied smoke success evidence: Codex CLI `0.150.1`, app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, doctor `20 ok/0 fail`, same-envelope smoke `93.621s`, nested exit `0`, command_execution completed, command exit `0`, output `CODEX_SHELL_SMOKE_OK`, stderr empty. Coordinator updated `BLOCKER-002` to smoke-passed and confirmed Step `11` dispatch. | `needs-implementation` | Historical smoke gate pass; superseded by the Step `11` blocked return below | -| 2026-08-28 | USER-DECISION-005A Step 11 blocked return | `blocked` | Step `11` only no-push Harness ran after smoke pass; runner exit `2`; Step `11` blocked at `2026-08-28T02:03:23+09:00`; Step `12` pending. Current-arm/spatial projection reproduced and NSNR-069 free residual accepted, but coarse/fine factor-one global moment balance metrics `1.413750912531167e-10`/`2.7454660159924086e-10` exceed approved `1e-10`; CTest `295` and `299` failed. `step11-output.json` SHA-256 `D56EB816DDD63E71D8880CA5AF39C10A38E2BF562A28207D26417716154F1872`; no commits/push; reference hashes/length/mtimes unchanged and `git diff -- reference` empty. | `needs-user-decision` | USER-DECISION-006: choose an upstream convergence-acceptance/global-balance-gate path before any rework, Step `11` retry, Step `12`, Physics or Release | -| 2026-08-28 | USER-DECISION-006 superseding global balance threshold and Stage 4 dispatch package | `in-progress` | User withdrew the entire `fesa.env`/runtime-config discussion and superseded the prior moment-only `1e-9` decision. Current authoritative decision fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8`; all formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation are preserved. User delegated Stage 4/5/6 reapproval and Step `11` completion without intermediate approval waits, bounded to this threshold-only change. | `needs-numerical-review` | Root/profile dispatch to `numerical-review-agent` with `fesa-numerical-review`; allowed outputs only `numerical-review.md` and `reference-model.md`; do not start Stage 5, planning, Harness, Step `11` retry, Step `12`, reference solver, push or `danger-full-access` before owner return and Coordinator audit | -| 2026-08-28 | REAPPROVAL-010 Stage 4 return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`, blockers none; `numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`, `reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`. Coordinator verified required output paths/status, both normalized factor-one global force/moment gates `<=1e-8`, unchanged formulas/scales/exact-zero/current-arm/spatial moment/factor-one/NSNR-069/`docs/TOLERANCE.md` boundaries, unchanged dispositions and no forbidden Stage 5/6/source/reference advancement. | `needs-io-definition` | Prepare bounded Stage 5 `io-definition-agent` dispatch; expected output only `io.md` | -| 2026-08-28 | REAPPROVAL-011 Stage 5 I/O dispatch package | `in-progress` | Coordinator prepared bounded `io-definition-agent` package requiring `fesa-io-contract` and the passed Stage 4 hashes. Scope is limited to `io.md` global balance gate literals/diagnostics/handoff for force and moment `<=1e-8`; HDF5 schema/projections/reference paths/dispositions and `docs/TOLERANCE.md` separation must be preserved. | `needs-io-definition` | Root/profile dispatch to `io-definition-agent`; await owner return and Coordinator audit; do not start Stage 6 planning/Harness/Step 11 retry | -| 2026-08-28 | REAPPROVAL-011 Stage 5 I/O return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`, blockers none; `io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`. Coordinator verified both coarse/fine global force and moment internal gates `<=1e-8`, unchanged HDF5 schema/projections/identities/scales/zero-scale/NSNR-069/reference paths and external-only `docs/TOLERANCE.md`, and no `fesa.env`/runtime-config direction. | `needs-implementation-plan` | Prepare bounded Stage 6 `implementation-planning-agent` materialization dispatch; do not run Harness or edit planning files as Coordinator | -| 2026-08-28 | REAPPROVAL-012 Stage 6 planning materialization dispatch package | `in-progress` | Coordinator prepared bounded `implementation-planning-agent` package requiring `fesa-cpp-msvc-tdd` plus project-local `harness`. Scope is limited to `implementation-plan.md`, `phases/index.json`, phase index, `step11.md` and `step12.md`; update only obsolete `1e-10` global balance references to force/moment `<=1e-8`, preserve Steps `0..10` and dirty Step `11` implementation work, reset top/Step `11` for rerun only after materialization evidence, and keep Step `12` pending. | `needs-implementation-plan` | Root/profile dispatch to `implementation-planning-agent`; await materialization return and Coordinator audit; no Harness/build/CTest/solver/reference solver, implementation, commit or push | -| 2026-08-28 | REAPPROVAL-012 Stage 6 planning materialization return and Coordinator audit | `passed` | Planning owner returned `ready-for-implementation`, blockers none; hashes verified for `implementation-plan.md` `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8`, and `step12.md` `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`. Coordinator/root verified JSON parse, top/Step `11` pending, Step `12` pending, Steps `0..10` completed metadata retained, Step `11.started_at` retained, `NSNR-REF-024..025` gate requirements present, and no execution. | `needs-implementation` | Prepare Step `11` only no-push `implementation-agent` Harness package under USER-DECISION-005A; do not start Step `12` | -| 2026-08-28 | STEP11-EXECUTION-003 global balance `1e-8` no-push dispatch package | `in-progress` | Coordinator prepared bounded Step `11` only package for `implementation-agent` via Harness. Runner/Executor owns branch, pending selection, retry, timestamps, commits, advancement and top-level phase status; Implementation Agent owns only Step `11` RED -> observed failure -> minimal GREEN -> VERIFY. Package requires `NSNR-REF-022` old-gate RED plus test-first `NSNR-REF-024..025`, no `fesa.env`/product config, reference immutability, no push and no Step `12` auto-advance. | `needs-implementation` | Root/Executor may launch Step `11` only under USER-DECISION-005A; await owner return and stop before Step `12` | -| 2026-08-28 | STEP11-EXECUTION-003 runtime/environment return and Coordinator audit | `needs-rework` | Step `11` only wrapper attempt 1 timed out and attempt 2 selected user-local WindowsApps `pwsh.exe`, producing `CreateProcessAsUserW failed: 5 (Access denied)` on every exec. Stop-hook CTest evidence nevertheless passed all `302/302`, including the Step `11` global balance/reference tests; Step `11` remains pending because the agent did not update status/summary and Executor did not commit. Root stopped retry 3 and cleaned PIDs `4240`/`12000`/`16924`. | `needs-correction` | Dispatch bounded report-only `correction-agent` for launch PATH filter diagnosis; no Step `11` rerun or Step `12` before correction return | -| 2026-08-28 | REWORK-009 user-local WindowsApps `pwsh.exe` launch filter return and Coordinator audit | `passed` | Correction Agent returned `corrected-for-implementation-rerun`, blockers none, `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator/root verified Section 14: all PATH entries matching `\\WindowsApps(?:\\|$)` filtered, `pwsh` unresolved, system Windows PowerShell selected, exact `FESA_CODEX_SHELL_SMOKE_OK`, recovered RED->GREEN, focused passes, Stop `302/302`, no forbidden edits/execution/commit/push/reference mutation. | `needs-implementation` | Issue one bounded Step `11` only no-push rerun package using corrected launch PATH filter | -| 2026-08-28 | STEP11-EXECUTION-004 all-WindowsApps-filter Step 11 rerun package | `in-progress` | Coordinator prepared bounded `implementation-agent`/Harness package: run only Step `11`, preserve fixed `<=1e-8` force/moment gates and all Stage 4/5/6 contracts, use Codex CLI `0.150.1` with `CODEX_HOME`, `workspace-write`, hooks, Terra/`xhigh`, `--disable unified_exec`, VsDevCmd x64/deps, Ninja/MSVC Debug preset and child PATH filtered by `\\WindowsApps(?:\\|$)`. | `needs-implementation` | Root/Executor may launch Step `11` only; hard-stop before Step `12`; no push, `danger-full-access`, reference mutation/solver or manual hooks | -| 2026-08-28 | STEP11-EXECUTION-004 return and Coordinator audit | `passed` | Harness Step `11` completed with implementation commit `6dbf1b2`, metadata commit `c58ba9f`, phase completion `2026-08-28T09:22:33+0900`, Step `12` pending, clean worktree before Coordinator update, no push. Fresh LastTest.log mtime `2026-08-28 09:22:32` has `302/302` pass; focused procedure/HDF5 `7/7` and threshold `2/2` pass; stale LastTestsFailed.log is from prior RED; reference diff clean and reference artifacts unchanged by supplied hash/mtime evidence. | `needs-implementation` | Stop before Step `12`; await explicit Step `12` Harness/Implementation request | -| 2026-08-28 | STEP12-EXECUTION-001 evidence-doc closure dispatch package | `in-progress` | User explicitly approved Step `12` execution. Coordinator verified clean worktree, HEAD `af5d72233c2bcd00edc087531d10eb92f7232d3e`, Step `11` completed, Step `12` pending, canonical reports absent and Step `12` scope: create actual-evidence-only `implementation-report.md`, `build-test.md`, `reference-comparison.md`, plus minimal directly-superseded PRD/ARCHITECTURE/ADR sync only. | `needs-implementation` | Root/Executor may run Step `12` under the prior successful Codex `0.150.1` all-WindowsApps-filter envelope; C++/tests/CMake/Harness/reference/tolerance changes, reference solver, Physics/Release dispatch and Coordinator execution remain forbidden | -| 2026-08-28 | STEP12-EXECUTION-001 return and Coordinator code-review audit | `passed` | Implementation Agent/Harness returned Step `12` completed, exitCode `0`, owner classification `pass-for-physics-evaluation`. Coordinator reviewed reports, phase metadata and diff range `d275e844f27107cfab52309025e259f2156345d2..624807a13543454ffbb6b0301e06bf8f79fbeeb9`; changed paths are allowed reports/global docs/phase metadata only, `git diff --check` for the range exits `0`, source/tests/CMake/Harness/tolerance/reference/upstream feature docs are unchanged, and no tracked-file Critical/Important/Minor finding was found. | `needs-physics-evaluation` | Stage 6 passed; next eligible action is bounded Stage 7 Physics Evaluation dispatch, not started by this audit | -| 2026-08-28 | STAGE7-PHYSICS-001 dispatch package | `in-progress` | User explicitly requested Stage 7 only. Coordinator state audit verified HEAD `014f6a7926f00950c62f8109226b2d4ab93efd36`, clean worktree before coordination update, Stage 6 passed, `implementation-report.md`/`build-test.md` classification `pass-for-physics-evaluation`, `reference-comparison.md` SHA-256 `5CFFB39BBDB323196461A54FCCFF8EE6E66866103D0931D4D3A94D2B3D644328`, and absent `physics-evaluation.md`. Dispatch requires `physics-evaluation-agent` with `fesa-physics-sanity`; it must audit the `reference-comparison.md` verdict wording and historical `requirements.md` draft/pending metadata against authoritative Coordinator/user approvals before issuing any pass. | `needs-physics-evaluation` | Await Physics owner return; do not dispatch Release, commit, push, run Harness/build/CTest/solver/reference solver, or edit source/tests/CMake/upstream contracts/reference/tolerance | -| 2026-08-28 | STAGE7-PHYSICS-001 return and Coordinator audit | `needs-rework` | Physics owner created only `physics-evaluation.md`, SHA-256 `01BDD1EB986E2F227A8830495B464B4DA7A977D8B9248CFD87351A415E03A10B`, and returned `needs-upstream-decision`. Fresh focused physics CTest `23/23` and 12-reference hash audit passed; no documented physical failure was found. Coordinator verified all required sections, hash, `git diff --check`, no forbidden changed path, and accepted the single upstream report-contract blocker `PHYS-STATUS-001`: required `reference-comparison.md` lacks `pass-for-physics-evaluation`. Historical requirements draft/pending metadata is nonblocking under the recorded explicit user approval of the current hash. | `needs-implementation` | Route one bounded report-only status reconciliation to `implementation-agent`, then rerun Physics; Release remains ineligible and was not dispatched | -| 2026-08-28 | PHYS-STATUS-001-IMPLEMENTATION-001 dispatch package | `in-progress` | User authorized both Stage 7/8 gates and Coordinator rework routing. Package assigns exactly one `implementation-agent` to edit only `reference-comparison.md`: add overall handoff `pass-for-physics-evaluation` while preserving detailed `blocking-pass-with-review-only-findings`, all values/dispositions/findings/hashes/no-change assertions. | `needs-implementation` | Await owner return; no tests/solver/evidence regeneration or other file edit; do not rerun Physics or dispatch Release before audit | -| 2026-08-28 | PHYS-STATUS-001-IMPLEMENTATION-001 return and Coordinator audit | `passed` | Implementation owner returned `pass-for-physics-evaluation`, blockers none, changed only `reference-comparison.md`, SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241`. Coordinator verified an exact four-line handoff addition, retained detailed verdict/six review-only findings/all metrics and artifact evidence, clean whitespace, no reference diff, and no forbidden owner change. | `needs-physics-evaluation` | Rerun Stage 7 with corrected exact status; do not dispatch Release before Physics owner pass | -| 2026-08-28 | STAGE7-PHYSICS-002 rerun package | `in-progress` | Same Physics owner must revise only `physics-evaluation.md` against corrected Stage 6 hash, retain prior audited physical evidence, independently resolve `PHYS-STATUS-001`, and return `pass-for-release-agent` only if no remaining blocker exists. | `needs-physics-evaluation` | Await Physics owner return; no Release dispatch, commit/push or other file mutation | -| 2026-08-28 | STAGE7-PHYSICS-002 return and Coordinator audit | `passed` | Physics owner returned `pass-for-release-agent`, blockers none, revised only `physics-evaluation.md`, SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`. Coordinator verified corrected Stage 6 hash/status, resolved PHYS-STATUS-001, eight required sections, prior fresh focused CTest `23/23` and reference hash evidence, all physics checks pass, only nonblocking/known-limit open items, explicit non-Release meaning, whitespace clean, no forbidden path/reference diff and no Release file. | `needs-release` | Stop before Release; root owns requested Stage 7 commit/push, then Stage 8 becomes the next bounded dispatch | -| 2026-08-28 | STAGE8-RELEASE-001 dispatch package | `in-progress` | User-requested Stage 7 commit/push is verified at clean local/origin HEAD `06861608da5ffa4c09b786c3f5052dc7c6604e1b`. Coordinator inventoried all required Stage 1..7 reports and pass statuses, 24 must requirements, full CTest `302/302`, reference `9/9`, `pass-for-physics-evaluation` and `pass-for-release-agent`. One release-agent must independently audit freshness/contradictions/traceability/known limitations and create only `release.md`. | `needs-release` | Await owner return; no other edit, external solver, publish/deploy/package/tag, commit or push | -| 2026-08-28 | STAGE8-RELEASE-001 return and Coordinator audit | `passed` | Release owner returned `ready-for-release`, blockers none, created only `release.md`, final SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`. Coordinator verified required sections/status, current gate hashes, 24/24 exact must traceability, 12/12 canonical reference hashes, all required known limitations/notes, transparent metadata omissions, whitespace/scope/no-change assertion and no external release action. | `completed` | Eight-stage workflow closed; root owns requested final commit/push only | -| 2026-08-30 | Post-closure `shellNL-meshfine_02` verification dispatch | `in-progress` | User requested the additional model be tested after nonlinear implementation was merged to clean `dev` HEAD `9ce28571f8cc6f67993e4d77c4462579b4fdb4b7`. Post-closure Stage 4 addendum defines exact artifacts, families and gates without changing historical closure. | `completed` | Implementation Agent performs build-local copied-input execution and conditional comparison; return-only diagnostic does not reopen or rewrite Stage 6/Release. | -| 2026-08-30 | Post-closure `shellNL-meshfine_02` verification return and Coordinator audit | `passed` | Merged current FESA produced 10 accepted frames and factor-one output. Exact prechecks passed; blocking U failed rows `0`; global force/moment and free force/moment residual gates passed. UR has `26` warning-only failures; RF1/RF2 `12`, RF3 `14`, RM1/RM2 `96` review-only failures. Original four reference hashes remained unchanged and only Coordinator-owned `coordination.md` is a non-build worktree edit. | `completed` | Diagnostic closed; no canonical Stage 6/Release rewrite or implementation/reference change. | - -- current_dispatch: `none` -- current_workflow_state: `completed` -- next_gate_requires_user_approval: no next formal gate; the eight-stage workflow remains completed and the post-closure diagnostic is closed. Any numerical value/disposition/source/tests/CMake/Harness/reference/tolerance change, external solver/artifact mutation or publish/deploy/package/tag/external release requires separate explicit authority. - -## 5. Risk, Blocker, and User-Decision Register - -| id | type | description | owner | status | -| --- | --- | --- | --- | --- | -| BLOCKER-001 | dispatch | Stage 4 requires a valid `numerical-review-agent` child dispatch. Root supplied the valid profile dispatch and owner return, so this runtime-tooling blocker no longer blocks the gate. | `coordinator-agent` / runtime tooling | closed | -| REWORK-001 | report-contract | Stage 4 returned evidence had a cross-report contradiction on stress CSV and `RM3` comparison disposition. Corrected reports now consistently treat stress CSVs as optional read-only inspection/order evidence only and exclude `RM3` from comparison. | `numerical-review-agent` | closed | -| REWORK-002 | io-contract | Stage 5 `io.md` bounded correction completed: public CLI `--output` substring rejection, Newton iteration log schema, exact `VARIABLE=PRESELECT` ignored-with-warning handling, repository-wide non-Newton log lifecycle, DECISION-028/029/030 path/log lifecycle and collision semantics are now recorded in `io.md`. | `io-definition-agent` | closed | -| REWORK-003 | harness | Stage 6 attempt 1 timeout/no-retry defect is repaired in Harness infrastructure: timeouts now return structured exit `124` through `MAX_RETRIES`, and implementation-agent profile settings are passed to Codex. Same normalized failure attempt count remains 1; attempt 2 is authorized and same-class recurrence stops automatic rework. | `implementation-agent` via Harness Executor | closed | -| BLOCKER-002 | harness-runtime | Closed for USER-DECISION-005A route: nested Codex Windows shell tool execution hung under the approved Codex CLI `0.149.1` envelope in DECISION-042, but Codex CLI `0.150.1` same-envelope smoke passed and the Step `11` Harness rerun reached deterministic CTest/reference-gate failures instead of a shell hang. Recurrence of nested command `in_progress` timeout reopens this blocker. | external Codex runtime / user-root decision | closed-smoke-passed-step11-executed | -| BLOCKER-003 | dispatch-runtime | This Coordinator runtime exposed no callable `spawn_agent` tool, but root successfully performed the required Correction Agent profile dispatch. | coordinator/root tooling | closed | -| REWORK-004 | harness | Corrected: `scripts/execute.py` now passes adjacent `--disable`, `unified_exec` immediately after `codex exec`; `tests/test_execute.py` asserts this while preserving terra/xhigh routing; `corrections.md` records RED/GREEN/VERIFY and no Harness phase/source C++/CMake/reference edits. | `correction-agent` | closed | -| REWORK-005 | harness | FileTracker Correction returned `blocked`: VS18/MSBuild `FileTracker` `E_ACCESSDENIED` is classified as environment-owned sandbox/MSBuild interaction; no safe Visual Studio `workspace-write` workaround was proven. User resolved the route by approving option A Ninja/MSVC validation. | `correction-agent` | closed-by-USER-DECISION-002A | -| REWORK-006 | harness | Corrected: approved option A is expressed through tracked `CMakePresets.json`, ignored `.harness/config.json`, preset-based implementation-plan/step verification commands, RED-first contract test, workspace-write Ninja/MSVC blocker-clear evidence, and blocked-to-pending phase reset only after pass. | `correction-agent` | closed | -| REWORK-007 | upstream-contract | Step 11 reference comparison is blocked because the approved residual-moment convergence denominator makes no-applied-moment shellNL structurally nonconvergent for any nonzero rotational residual. Correction changed only `corrections.md` and returned `needs-upstream-decision`. | `correction-agent` | closed-upstream-contract | -| REWORK-008 | upstream-contract | Correction returned `needs-upstream-decision`, classification `reference-blocking-model-adequacy-conflict`: local nodal RF/RM blocking assumes unsupported Abaqus S4 versus FESA MITC4 distribution adequacy, while reaction pipeline/global equilibrium evidence is sound. Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`. | `correction-agent` | closed-upstream-contract | -| USER-DECISION-004 | user decision | User explicitly approved option 1 on `2026-08-26`: local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` rows are review-only/nonblocking with deterministic source-key/schema/finite/inventory/error reporting; `RM3` remains excluded; blocking reaction/equilibrium evidence is factor-one global resultant force `[3]`, global resultant moment `[3]` and accepted free-DOF residual gates/evidence. No tolerance/comparator/reference relaxation is authorized. | user via Coordinator | closed | -| REAPPROVAL-006 | upstream-reapproval | USER-DECISION-004 option 1 Stage 1 propagation completed: requirements owner/Coordinator audit passed for `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, and the user explicitly re-approved that hash on `2026-08-27`. Stage 3 formulation has no immediate dispatch because §11.4/§13.4 already define residual/reaction/global-resultant semantics. | `requirement-agent` / Coordinator / user | closed | -| REAPPROVAL-007 | upstream-reapproval | USER-DECISION-004 option 1 Stage 4 propagation completed: `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091`, `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`, owner status `pass-for-io-definition`, Coordinator audit passed, blockers none, and the user explicitly approved both hashes on `2026-08-27`. | `numerical-review-agent` / Coordinator / user | closed | -| REAPPROVAL-008 | upstream-reapproval | USER-DECISION-004 option 1 Stage 5 propagation completed: `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`, LF-normalized SHA-256 `BF775990D83D95B470F814BE57C9676305119D97E48225E231D4926E7809029F`; owner/Coordinator audit passed and the user explicitly approved the raw hash on `2026-08-27`. | `io-definition-agent` / Coordinator / user | closed | -| REAPPROVAL-009 | planning-reapproval | Stage 6 implementation planning re-entry draft returned `draft-ready-for-user-review`; Coordinator audit passed; user explicitly approved the draft on `2026-08-27`. Draft proposes only Step `11`/`12` replanning for USER-DECISION-004 option 1 and AUDIT-001 while preserving Steps `0..10`, current uncommitted Step 11 work, approved contracts, no-new-dataset semantics and no execution. | `implementation-planning-agent` / Coordinator / user | closed | -| MATERIALIZATION-003 | planning-materialization | Passed: Planning Agent materialized exactly `implementation-plan.md` SHA-256 `758F8F5BB224E88864338C48221D53D4BD2F8633E04C9F2136FFF9E2D1BADFB8`, `phases/index.json` SHA-256 `536D4BF9427792ECCCE4C9A2980210E050035D0202DB8A700BDD671E0DB218C7`, `phases/nonlinear-static-newton-raphson/index.json` SHA-256 `D808D5C0F389B444A529FC81A48B5726E4CF282CA51B62F3AECAC4D89EA6A5BF`, `step11.md` SHA-256 `D324F7E1495A25B3B8CEA7A2A6C68D559F8336C3A527A164ECD2D0A82C20A526`, and `step12.md` SHA-256 `F2831F7E802A40631C91E638C9079508EF1A97CFE46FACC51DCBB4EC55337452`. Coordinator audit found JSON parse clean, no placeholders, scoped `git diff --check` pass, changed planning outputs within allowlist, Step `11`/top phase pending, Steps `0..10` preserved, Step `12` pending, reference diff clean and no Harness/build/solver execution. | `implementation-planning-agent` / Coordinator | passed | -| DECISION-042 | user approval | User explicitly approved `Harness/Implementation 시작` for no-push Step `11` execution only. The verified command is `python scripts/execute.py nonlinear-static-newton-raphson`; Step `12` is not authorized and must not start before Coordinator audit. | user via Coordinator | closed | -| USER-DECISION-005 | user decision | User approved option A on `2026-08-28`: use official current Codex CLI `0.150.1` to repair/validate the runtime route, run a bounded same-envelope nested shell smoke, and only if it passes rerun Step `11` no-push. Smoke passed with app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, doctor `20 ok/0 fail`, duration `93.621s`, nested exit `0`, command_execution completed and output `CODEX_SHELL_SMOKE_OK`. This does not authorize `danger-full-access`, reference solver/artifact changes, push, Step `12`, manual hooks or runner/source/test/phase edits outside the Step `11` contract. | user via Coordinator | closed-option-A-smoke-passed | -| USER-DECISION-006 | user decision | Closed/delegated superseding decision on `2026-08-28`: withdraw the entire `fesa.env`/runtime-config discussion; do not add `fesa.env`, config parsing, runtime API or product behavior. Current authoritative contract fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8`, preserving exact formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069 free-residual gates, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation. Coordinator is delegated to run Stage 4/5/6 reapproval and Step `11` no-push completion without intermediate approval waits, but must stop on any change beyond this fixed threshold. | user via Coordinator | closed-delegated | -| REAPPROVAL-010 | upstream-reapproval | Passed under delegated USER-DECISION-006 authority: Stage 4 owner returned `pass-for-io-definition`, blockers none, `numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; Coordinator audit passed against the threshold-only package. | `numerical-review-agent` / Coordinator | passed | -| REAPPROVAL-011 | upstream-reapproval | Passed under delegated USER-DECISION-006 authority: Stage 5 owner returned `ready-for-coordinator-review`, blockers none, `io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`; Coordinator audit passed against the threshold-only package with schema/projection/reference/TOLERANCE boundaries preserved. | `io-definition-agent` / Coordinator | passed | -| REAPPROVAL-012 | planning-materialization | Passed under delegated USER-DECISION-006 authority: Planning owner returned `ready-for-implementation`, blockers none; `implementation-plan.md` SHA-256 `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8`, `step12.md` `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`; Coordinator audit passed. | `implementation-planning-agent` / Coordinator | passed | -| STEP11-EXECUTION-003 | implementation-dispatch | Needs rework: Step `11` only no-push wrapper attempt 1 timed out and attempt 2 hit inaccessible `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe` with `CreateProcessAsUserW failed: 5`; Stop-hook CTest evidence passed `302/302`, but Step `11` status/summary/commit are absent. | `implementation-agent` / Harness Executor / Coordinator | needs-rework | -| REWORK-009 | harness-environment | Passed: Correction Agent diagnosed the user-local WindowsApps `pwsh.exe` launch filter miss and proved an all-`WindowsApps` PATH-filter same-envelope shell smoke. Output `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`; changed `corrections.md` only; no runner/source/test/CMake/phase/upstream/reference/tolerance edits. | `correction-agent` / Coordinator | passed | -| STEP11-EXECUTION-004 | implementation-dispatch | Passed: Step `11` completed and committed under corrected all-WindowsApps child PATH filter. Implementation commit `6dbf1b2`; metadata commit `c58ba9f`; focused and Stop evidence passed; Step `12` remains pending and unstarted. | `implementation-agent` / Harness Executor / Coordinator | passed | -| STEP12-EXECUTION-001 | implementation-dispatch | Passed: Step `12` evidence-doc closure completed with canonical Stage 6 reports, minimal PRD/ARCHITECTURE/ADR sync, Executor-owned phase metadata/output and local commits. Coordinator code-review audit found no tracked-file Critical/Important/Minor finding and no forbidden source/tests/CMake/Harness/reference/tolerance change. | `implementation-agent` / Harness Executor / Coordinator | passed | -| BLOCKER-005 | dispatch-runtime | This Coordinator runtime exposes no callable collaboration `spawn_agent` tool and `tool_search` found no dispatch tool. Root completed prior profile/Harness dispatches through Step `12`; no active dispatch remains. Future Stage 7 dispatch still requires root/profile launch if this runtime remains unchanged. | coordinator/root tooling | closed-no-current-dispatch | -| PUSH-001 | external-push | Closed before Stage 7 intake: branch HEAD `014f6a7926f00950c62f8109226b2d4ab93efd36` matched `origin/feat-nonlinear-static-newton-raphson` with no ahead/behind marker. Stage 7 commit/push remains root-owned after this audit. | root/user remote auth | closed | -| STAGE7-PHYSICS-001 | physics-evaluation-dispatch | Needs rework: owner found no physical failure but withheld `pass-for-release-agent` because required `reference-comparison.md` has no `pass-for-physics-evaluation` handoff status. | `physics-evaluation-agent` / Coordinator | needs-rework | -| PHYS-STATUS-001 | upstream-report-contract | Resolved: Implementation owner added unambiguous overall `pass-for-physics-evaluation` while preserving detailed `blocking-pass-with-review-only-findings` and all evidence. Coordinator verified corrected SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` and exact status-only diff. | `implementation-agent` through Coordinator | passed | -| STAGE7-PHYSICS-002 | physics-evaluation-dispatch | Passed: owner returned `pass-for-release-agent`, blockers none; Coordinator audit verified SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`, corrected input hash, physics evidence and no-change/Release boundaries. | `physics-evaluation-agent` / Coordinator | passed | -| STAGE8-RELEASE-001 | release-readiness-dispatch | Passed: owner returned `ready-for-release`, blockers none; Coordinator verified release SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`, 24/24 traceability, gate/validation inventory, known limitations, release notes and authority boundaries. | `release-agent` / Coordinator | passed | -| AUDIT-001 | projection-implementation | Passed by STEP11-EXECUTION-004: `/global/equilibrium` and reference comparator tests cover current nodal positions, spatial physical nodal moments about global origin, distinct global balance/free residual projections, and nonzero prescribed motion without raw full residual/initial-coordinate shortcut. | `implementation-planning-agent` / `implementation-agent` | passed | -| MESH-REFINEMENT-SPIKE-001 | diagnostic-spike | Completed read-only numerical/reference spike for `reference/shellNL-meshfine`: artifacts copied byte-identically, required rows readable, existing executable run successful, primary displacement/rotation passed common tolerance, local RF/RM per-row gates failed, and current coarse/fine Abaqus S4 pair did not meet option 3 independent benchmark condition. | `numerical-review-agent` | passed | -| TRANSLATION-REPORT-001 | focused-report | Completed bounded report for coarse/fine `U1/U2/U3` translation displacement only. Output `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`; diagnostic non-gate, not canonical `reference-comparison.md`, and does not alter reaction/rotation/stress or USER-DECISION-004 disposition. | `implementation-agent` | passed | -| USER-DECISION-002 | user decision | User explicitly chose option A: approve Ninja/MSVC evidence contract for Stage 6 continuation. Option B `danger-full-access` and option C external sandbox wait are not selected. | user via Coordinator | closed | -| USER-DECISION-003 | user decision | User approved option 1: if the matching external residual-channel scale is exact zero, use the existing typed absolute residual gate; keep current relative denominator when the external scale is nonzero. This starts required upstream re-approval in order: requirements NSNR-069, formulation §14.1, numerical-review, I/O, then implementation-plan/phase steps before implementation rerun. | user via Coordinator | closed | -| REAPPROVAL-001 | upstream-reapproval | USER-DECISION-003 option 1 Stage 1 propagation completed: requirements owner return and Coordinator audit passed for `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`, and the user explicitly re-approved that hash. | `requirement-agent` / user via Coordinator | closed | -| REAPPROVAL-002 | upstream-reapproval | USER-DECISION-003 option 1 Stage 3 propagation completed: formulation owner return and Coordinator audit passed for `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, and the user explicitly re-approved that hash. | `formulation-agent` / user via Coordinator | closed | -| REAPPROVAL-003 | upstream-reapproval | USER-DECISION-003 option 1 Stage 4 propagation completed: Numerical Review owner return and Coordinator audit passed for `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153`, `reference-model.md` remained byte-identical at SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`, and the user explicitly re-approved both hashes. | `numerical-review-agent` / user via Coordinator | closed | -| REAPPROVAL-004 | upstream-reapproval | USER-DECISION-003 option 1 Stage 5 propagation completed: I/O owner return and Coordinator audit passed for `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`, and the user explicitly re-approved both hashes. | `io-definition-agent` / user via Coordinator | closed | -| REAPPROVAL-005 | planning-reapproval | USER-DECISION-003 option 1 Stage 6 planning propagation draft passed Coordinator audit and the user explicitly approved materialization on `2026-08-25`. | `implementation-planning-agent` / user via Coordinator | closed | -| MATERIALIZATION-002 | planning-materialization | User-approved Stage 6 planning revision materialized only in `implementation-plan.md`, `step5.md`, `step7.md`, `step10.md`, `step11.md`, `step12.md`, feature index and top index; Steps 0..10 history/commits and partial Step 11 comparator files are preserved, Step 11/top status reset to `pending`, and Step 12 remains `pending`. | `implementation-planning-agent` | closed | -| DECISION-040 | user approval | User explicitly approved the audited Implementation Planning revision draft and requested materialization. This approval does not authorize Harness, CTest, code/test/CMake/source edits, reference artifact changes, commit, or push. | user via Coordinator | closed | -| DECISION-041 | user approval | User explicitly requested no-push Harness/Implementation rerun from Step 11 under DECISION-038/039: Codex CLI `0.149.1`, aligned `CODEX_HOME`, launch-env WindowsApps PATH filtering, `workspace-write`, hooks retained, `--disable unified_exec`, VsDevCmd x64, dependency env vars, approved Ninja/MSVC Debug preset, no `danger-full-access`, no push, no reference solver and no reference artifact mutation. | user via Coordinator | closed | -| RISK-001 | architecture | 기존 `LinearStaticAnalysis` private lifecycle은 단일 factorization/substitution과 final frame만 소유하므로 nonlinear increment/iteration/state commit을 삽입하면 ADR 경계를 위반한다. | `coordinator-agent` routing | open | -| RISK-002 | scope | `Newton–Raphson`은 solution algorithm이고 geometric/material/contact nonlinearity 범위를 단독으로 결정하지 않는다. | `requirement-agent` | mitigated by DECISION-001 | -| RISK-003 | contract | 현재 `Element`는 displacement-dependent residual/consistent tangent/trial state 계약이 없고 `AnalysisState`는 nonlinear history를 소유하지 않는다. | downstream formulation/architecture gates | open | -| RISK-004 | input | 현재 `NLGEOM=YES`는 `unsupported-nonlinear-geometry`로 거부되고 `*STATIC` 네 값은 provenance로만 보존된다. | downstream requirements/I/O gates | open | -| RISK-005 | verification | exact nonlinear reference artifacts와 path-dependent blocking quantities가 아직 지정되지 않았다. | downstream numerical-review gate | open | -| DECISION-001 | user decision | 첫 release는 materially linear + geometrically nonlinear MITC4로 고정한다. Material-only와 combined material/geometric nonlinearity는 이 release 범위 밖이다. | user via Coordinator | closed | -| DECISION-002 | user decision | First-release geometric-nonlinear MITC4 kinematic framework는 initial configuration 기준 `Total Lagrangian`으로 고정한다. Updated Lagrangian과 corotational 의미는 이 release 범위 밖이다. | user via Coordinator | closed | -| DECISION-003 | user decision | Newton variant는 `Full Newton–Raphson`으로 고정한다. 매 iteration의 current trial/candidate state에서 residual과 algorithmically consistent tangent를 재평가하고, 그 tangent로 새 factorization/solve를 수행한다. Modified Newton과 adaptive refresh는 out-of-scope다. | user via Coordinator | closed | -| DECISION-004 | user decision | First-release nonlinear increment control은 하나의 scalar load coordinate/load factor로 approved load/BC path를 진행하는 `Load-factor control`로 고정한다. Controlled-displacement와 arc-length/path-following control은 out-of-scope다. | user via Coordinator | closed | -| DECISION-005 | user decision | 모든 approved `*CLOAD`와 nonzero prescribed `*BOUNDARY` target은 같은 dimensionless scalar load factor로 step-start 값에서 target까지 비례 진행한다. Fixed step-start BC와 independent/non-proportional amplitude/path는 out-of-scope다. | user via Coordinator | closed | -| DECISION-006 | user decision | First-release는 approved fixed load-factor increment size를 반복하고 factor 1에 정확히 도달하도록 마지막 increment만 작게 조정하는 `Fixed-size stepping`으로 고정한다. Automatic growth, cutback/retry와 explicit schedule은 out-of-scope며 attempted increment failure는 재시도 없이 analysis failure다. | user via Coordinator | closed | -| DECISION-007 | user decision | Nonlinear four-value `*STATIC`은 first positive value만 fixed load-factor increment로 사용하고 second/period는 exact supported endpoint `1`을 요구하며 positive minimum/maximum은 입력 호환성을 위해 수용하지만 runtime stepping에는 사용하지 않는 `First-value driven` mapping으로 고정한다. Strict tuple과 single-value form은 out-of-scope다. | user via Coordinator | closed | -| DECISION-008 | user decision | First-release approved `*CLOAD` force/moment component directions는 initial/current deformation과 무관하게 fixed global frame에 유지되고 common scalar factor로 magnitude만 비례 진행하는 dead-load semantics로 고정한다. Follower nodal loads, selectable dual semantics, external-load geometric tangent/follower work는 out-of-scope다. | user via Coordinator | closed | -| DECISION-009 | user decision | Nonzero prescribed `*BOUNDARY` input value는 factor 1의 absolute global-DOF `Total step target`이며 step-start committed value에서 target까지 common scalar factor로 보간한다. Incremental delta와 selectable dual semantics는 out-of-scope다. | user via Coordinator | closed | -| DECISION-010 | user decision | First release는 입력당 exactly one supported geometrically nonlinear static step만 허용하고 no-prior-history baseline에서 factor 0→1을 수행한다. Multiple nonlinear steps, mixed linear/nonlinear steps, cross-step state/load/BC propagation과 procedure transition은 out-of-scope/fail-closed다. | user via Coordinator | closed | -| DECISION-011 | user decision | First-release increment acceptance는 free-DOF equilibrium residual과 Newton correction의 두 mandatory quantity가 각각 승인 gate를 모두 통과해야 한다. Energy convergence는 diagnostic/mandatory가 아닌 out-of-scope다. Norm, normalization과 tolerance는 별도 결정으로 남긴다. | user via Coordinator | closed | -| DECISION-012 | user decision | Four channel-separated infinity gates의 nonzero-scale relative threshold는 각각 `1e-2`다. Zero denominator에는 own-channel absolute fallback을 적용하며 네 numeric literal은 모두 `1e-3`: force residual은 model-consistent force, moment residual은 force·length, translational correction은 length, rotational correction은 later-approved convention의 dimensionless rotation parameter다. `.inp` 단위 추론/변환은 하지 않는다. | user via Coordinator | closed | -| DECISION-013 | user decision | First release는 `No line search`다. 각 successful fresh tangent correction solve의 full correction을 damping/backtracking/trial-step reduction 없이 next candidate에 그대로 적용하며 merit/acceptance/reduction loop, selectable input과 fallback은 out-of-scope/fail-closed다. | user via Coordinator | closed | -| DECISION-014 | user decision | Attempted increment당 maximum Newton iteration count는 product-fixed `100`이다. Entered iteration은 `1..100`; iteration 100 gate pass는 accept 가능하고 fail 시 iteration 101/candidate/retry/cutback 없이 immediate failure 및 prior committed state/result preservation을 적용한다. | user via Coordinator | closed | -| DECISION-015 | user decision | MITC4 Newton solve는 dimensionless incremental rotation-vector correction을 만들고 authoritative rotational state는 orthonormal right-handed committed triad `Q`이며 director는 third axis다. Separate trial triad를 사용하고 large rotation은 multiplicative composition으로 갱신한다. Exact map/side/frame/parameterization/re-orthonormalization/drilling/derivatives는 downstream gap이다. | user via Coordinator | closed | -| DECISION-016 | user decision | Successful analysis의 authoritative `results.h5`는 each committed nonlinear increment마다 exactly one accepted frame을 stable accepted-factor order로 저장하고 factor-1 frame을 포함한다. Trial/failed/duplicate/missing/partial-final history는 없으며 pre-existing valid final을 exact 보존한다. Exact schema와 factor-0 frame 여부는 downstream gap이다. | user via Coordinator | closed | -| DECISION-017 | user decision | Every entered Newton iteration은 exactly one deterministic structured runtime summary를 낸다. Complete gate는 four-channel identities/norms/branch/threshold/pass/combined transition을 포함하고 early failure는 last-completed/failing stage와 later fields absent/not-evaluated를 기록한다. 이는 diagnostic-only이며 HDF5/sidecar/authoritative/reference quantity가 아니다. Transport/exit mapping은 별도 미결정이다. | user via Coordinator | closed | -| DECISION-018 | superseded user decision | JSON Lines serialization family 결정은 DECISION-023 scope reversal로 current contract에서 retire되며 historical evidence로만 남는다. | user via Coordinator | closed | -| DECISION-019 | superseded user decision | JSON stderr exactly-once emit/flush lifecycle 결정은 DECISION-023 scope reversal로 current contract에서 retire되며 historical evidence로만 남는다. | user via Coordinator | closed | -| DECISION-020 | superseded user decision | JSON field-omission/not-evaluated-list 결정은 DECISION-023 scope reversal로 current contract에서 retire되며 historical evidence로만 남는다. | user via Coordinator | closed | -| DECISION-021 | user operating policy | 물리 결과·수치 거동·public compatibility에 실질 영향 없는 serialization notation/key ordering/diagnostic formatting 등 low-risk 기본 결정은 recommended option을 자동 적용한다. Formulation/Newton/state/tolerance/load-BC/input/failure-rollback/HDF5 authoritative/public compatibility/reference acceptance는 계속 한 번에 하나씩 인터뷰한다. | user via Coordinator | closed | -| DECISION-022 | retired pending decision | JSON stderr write/flush failure policy는 DECISION-023 scope reversal로 선택 없이 retire되었다. | user via Coordinator | closed | -| DECISION-023 | user scope reversal | JSON-specific runtime log decisions와 파생 contracts를 철회하고 serialization-independent OQ-011 granularity를 보존한 simple plain-text analysis log로 재설계한다. Destination은 stderr text 대 actual `.txt` file의 substantive user decision으로 남긴다. | user via Coordinator | closed | -| DECISION-024 | user decision | Solver directly creates exactly one separate plain-text analysis-log file. Per-iteration summaries are file-only; stderr contains log open/write/close fatal diagnostic and final analysis failure summary only, with exact zero per-iteration duplication. External redirect and file+stderr duplication are excluded. Filename/location, overwrite and failure atomicity remain separate questions. | user via Coordinator | closed | -| DECISION-025 | user decision | Repository-wide architectural direction approved: all existing/future analyses use input-directory `.inp -> _results.h5` and `_log.txt`, and `--output` is removed. This requires later approved sectioned-design changes to ARCHITECTURE/ADR and cross-procedure regression evidence; no implementation/global-doc change is claimed now. | user via Coordinator | closed | -| DECISION-026 | user decision | Every invocation containing `--output`, including the formerly valid explicit path form, fails before input parsing/Analysis construction/result-log creation with exact exit 2 and one ordered `cli-usage` stderr diagnostic. No compatibility alias or deprecation window. | user via Coordinator | closed | -| DECISION-027 | user decision | Independent asymmetric lifecycle: current-run log replaces/truncates old log at invocation start and persists on success/failure; HDF5 uses sibling candidate and replaces final only after success, preserving prior valid final on failure; no cross-file pair atomicity. | user via Coordinator | closed | -| DECISION-028 | user decision | Log-I/O grouped fail-closed policy: pre-analysis abort on create/open/truncate failure; immediate abort on write/flush; close failure blocks result commit; best-effort one fatal stderr diagnostic attempt, prior HDF5 and retained log prefix preservation, no retry/fallback/continue/result commit. | user via Coordinator | closed | -| DECISION-029 | coordinator auto-default | OQ-034 low-risk plain-text representation/ordering: UTF-8 no BOM, one physical tab-separated `label=value` line per entered iteration, fixed semantic field/channel order, explicit `not-evaluated(reason)`, locale-independent finite round-trip numerics, embedded control/backslash escaping. No physics/numerics/path/state/authority change. | Coordinator under DECISION-021 | closed | -| DECISION-030 | user decision | OQ-039 user-addressed lexical identity: resolve relative input against invocation CWD, lexically normalize `.`/`..`, do not resolve symlink/junction targets, accept final `.inp` case-insensitively, remove only the last extension and preserve preceding dots/basename case; output beside normalized user-addressed path. | user via Coordinator | closed | -| DECISION-031 | superseded proposal | Same-derived-output concurrent invocation ownership의 fine-grained OQ-040 interview는 사용자 process correction으로 중단했다. 승인된 정책은 없으며 필요한 convention은 I/O/Planning owner가 repository evidence로 정한다. | user via Coordinator | closed | -| DECISION-032 | user process decision | `requirements.md`를 핵심 Stage-1 계약으로 압축하고 OQ chronology, diagnostic/path/concurrency trivia와 반복 handoff를 제거한다. Minor details는 downstream specialist convention/evidence로 정하며 approved scope/physics/tolerance/public compatibility를 바꿀 때만 사용자 결정을 다시 요청한다. | user via Coordinator | closed | -| DECISION-033 | design approval | Target 363 lines, 24 canonical requirements와 24-row Matrix, approved semantic-loss 0의 compact rewrite design. | user via Coordinator | closed | -| DECISION-034 | user process decision | Requirement Agent는 approved physics/scope/tolerance/authoritative-output/public compatibility를 바꾸는 essential decision만 사용자에게 묻고, specialist detail은 owning downstream stage가 repository evidence와 conventional FEM practice로 정한다. Equivalence claim은 금지한다. | user via Coordinator; `.codex/agents/requirement-agent.toml` | closed | -| DECISION-035 | user approval | User explicitly approved Stage 5 `docs/nonlinear-static-newton-raphson/io.md` SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` and requested Implementation Planning. | user via Coordinator | closed | -| DECISION-036 | user approval | User explicitly approved the Stage 6 Implementation Planning 13-Step draft on `2026-08-24` and authorized creation of `implementation-plan.md` plus pending Harness phase files. | user via Coordinator | closed | -| DECISION-037 | user approval | User explicitly requested no-push Harness/Implementation execution for materialized phase `nonlinear-static-newton-raphson` on `2026-08-24`. | user via Coordinator | closed | -| DECISION-038 | user/root runtime approval | User/root authorized Codex CLI update, shell smoke and no-push Harness rerun. Accepted runtime envelope is Codex CLI `0.149.1`, `CODEX_HOME=C:\Users\baram\.codex`, launch-env-only WindowsApps PATH filtering, `workspace-write`, hooks retained, implementation-agent `gpt-5.6-terra`/`xhigh`, no `danger-full-access`, and `--disable unified_exec`. | user/root via Coordinator | closed | -| DECISION-039 | user decision | Stage 6 FileTracker blocker route: user approved option A, making Ninja/MSVC x64 Debug with full CTest the accepted validation contract for continuation. `danger-full-access`, Visual Studio fallback, reference solver activity, push and Step 2 advancement remain unauthorized. | user via Coordinator | closed | -| USER-DECISION-001 | user decision | Stage 6 Implementation Planning draft Steps `0..12` were approved on `2026-08-24`; materialization is authorized for `implementation-planning-agent`. | user via Coordinator | closed | - -## 6. Rework-Loop Control and Stop Condition - -- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1; `formulation-equilibrium-reaction-symbol-collision`: 1; `formulation-moment-admissibility-work-inconsistency`: 1; `numerical-review-cross-report-disposition-contradiction`: 1; `io-contract-public-cli-log-output-request-gap`: 1; `harness-nested-codex-windows-shell-tool-execution-hang`: 3; `harness-console-cp949-retry-glyph-unicodeencodeerror`: 1; `harness-msbuild-filetracker-eaccessdenied-workspace-write`: 2; `implementation-shellnl-nonlinear-nonconvergence-no-hdf5`: 1; `reference-blocking-model-adequacy-conflict`: 1; `upstream-global-moment-balance-gate-threshold-conflict`: 1; `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied`: 2; `physics-reference-comparison-handoff-status-mismatch`: 1 -- automatic_rework_limit: 동일 normalized failure classification `2`회 -- correction_agent_policy: 명확한 implementation failure는 먼저 `implementation-agent`에 반환하고, 반복되거나 원인이 불명확할 때만 `correction-agent`를 dispatch한다. -- stop_condition: 동일 classification이 두 번이면 자동 rework를 중단하고 workflow를 `needs-user-decision` 또는 `blocked`로 전환한다. -- correction_cycle_authorization: REWORK-008 is closed as `upstream-contract`. MATERIALIZATION-003 and REAPPROVAL-012 are closed as `passed`. USER-DECISION-006 resolves the prior `upstream-global-moment-balance-gate-threshold-conflict` by fixing both normalized global balance gates at `<=1e-8`. STEP11-EXECUTION-003 reached normalized environment failure count `2`, automatic retry was stopped, REWORK-009 passed, STEP11-EXECUTION-004 passed, and STEP12-EXECUTION-001 passed. No correction loop is active. -- upstream_reapproval_sequence: Prior USER-DECISION-003/004/006 sequences remain closed. PHYS-STATUS-001 passed on first attempt, Stage 7 returned `pass-for-release-agent`, Stage 8 returned `ready-for-release`, and all Coordinator audits passed. No rework loop remains active. - -## 7. Final Workflow Closure - -- closure_status: `completed` -- required_evidence: satisfied by `docs/nonlinear-static-newton-raphson/release.md` SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`, owner verdict `ready-for-release`, blockers none -- closure_record: Eight stages are `passed`; Stage 6 `pass-for-physics-evaluation`, Stage 7 `pass-for-release-agent`, full CTest `302/302`, reference `9/9`, 24/24 must traceability and disclosed known limitations are audited. Closure means internal feature workflow readiness only and does not publish, deploy, package, tag or externally release. - -## 8. No-Change Assertion - -- source_code: Steps 0..11 implementation source changes are committed through Harness; Step `11` implementation commit is `6dbf1b2`. Step `12` range contains no source-code diff. Coordinator did not edit source code. -- tests: Step `11` comparator/test changes are committed through Harness. Step `12` range contains no test diff; owner reports focused commands and full CTest `302/302` passed. Coordinator did not edit tests. -- CMake: Step `11` owner committed `tests/CMakeLists.txt` changes; REWORK-006 added tracked `CMakePresets.json` for DECISION-039 Ninja/MSVC validation. Coordinator did not edit CMake configuration. -- reference_artifacts: Root copied four `reference/shellNL-meshfine` artifacts byte-identically into the feature worktree for the approved spike; SHA-256 values match the recorded main-checkout hashes and row counts `729/729/5408`. No reference artifact was generated, renamed, normalized, repaired or modified by Coordinator. -- tolerance_policies: 변경 없음 -- phase_files: Step `12` metadata commit `624807a` records phase completion; `phases/index.json` SHA-256 `5FA3225F73E4B4FB6A7CFCD049DD66FF21715DFB41A91BB14F47ABDFE45378BD` and phase index SHA-256 `B941B903746DA19F1460C1022FE3501DFC44CE09E5D72CCCCCB7E38D7D55FD22`; Steps 0..12 are completed and top phase is completed. Coordinator did not edit phase files. -- Harness: STEP12-EXECUTION-001 completed under the approved envelope with owner-reported exitCode `0`, fresh configure/build/discovery/focused/full CTest and reference gate pass. Physics owner additionally ran focused CTest `23/23`; Release owner and Coordinator did not run Harness/build/test, use `danger-full-access`, clean outputs, publish/deploy/package/tag/external release, commit or push. -- feature_documents: REWORK-008 Correction updated `docs/nonlinear-static-newton-raphson/corrections.md` Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`; Requirement Agent updated only `docs/nonlinear-static-newton-raphson/requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`; Formulation Agent updated only `docs/nonlinear-static-newton-raphson/formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`; REAPPROVAL-010 Numerical Review Agent updated Stage 4 reports to `docs/nonlinear-static-newton-raphson/numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `docs/nonlinear-static-newton-raphson/reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; REAPPROVAL-011 I/O Definition Agent updated only `docs/nonlinear-static-newton-raphson/io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`; REAPPROVAL-012 Planning owner materialized `docs/nonlinear-static-newton-raphson/implementation-plan.md` SHA-256 `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `step11.md` SHA-256 `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8` and `step12.md` SHA-256 `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`. STEP12-EXECUTION-001 created `implementation-report.md` SHA-256 `D75C8B5922C9EEF7C7262B01BFB12D5F7609B1A6DB3A7C6D5AE47CB45ADAD578`, `build-test.md` SHA-256 `ED6B1B6CFD9478B09B92E7ADE3891622FEA1AA521AD29550D6F4C78C952E8DDA`, `reference-comparison.md` SHA-256 `5CFFB39BBDB323196461A54FCCFF8EE6E66866103D0931D4D3A94D2B3D644328` and minimal `docs/PRD.md`/`docs/ARCHITECTURE.md`/`docs/ADR.md` sync. This coordinator update changed only isolated `coordination.md`. -- stage7_rework_documents: PHYS-STATUS-001-IMPLEMENTATION-001 changed only `reference-comparison.md` to SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241`; STAGE7-PHYSICS-002 revised only `physics-evaluation.md` to SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`; Coordinator changed only `coordination.md`. -- release_document: STAGE8-RELEASE-001 created only `docs/nonlinear-static-newton-raphson/release.md`, SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`; Coordinator changed only `coordination.md`. -- correction_reports: REWORK-009 Correction Agent updated current `docs/nonlinear-static-newton-raphson/corrections.md` Section 14, SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator did not edit `corrections.md`. diff --git a/docs/nonlinear-static-newton-raphson/formulation.md b/docs/nonlinear-static-newton-raphson/formulation.md index 16f9d5c..7d376b3 100644 --- a/docs/nonlinear-static-newton-raphson/formulation.md +++ b/docs/nonlinear-static-newton-raphson/formulation.md @@ -1,5 +1,9 @@ # Nonlinear Static Newton–Raphson 정식화 +> 적용 경계: 물리 정식화와 당시 수치 stabilization 유도를 구분한다. 현재 공변 trace-average +> scale·frozen lifecycle은 [고유치 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을 +> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않으며 S3 partial-BC 보류를 유지한다. + ## 1. Metadata - feature_id: nonlinear-static-newton-raphson diff --git a/docs/nonlinear-static-newton-raphson/implementation-plan.md b/docs/nonlinear-static-newton-raphson/implementation-plan.md deleted file mode 100644 index 4847fd3..0000000 --- a/docs/nonlinear-static-newton-raphson/implementation-plan.md +++ /dev/null @@ -1,341 +0,0 @@ -# Nonlinear Static Newton-Raphson Implementation Plan - -> For Harness workers: this plan is an approved Stage 6 planning artifact. It authorizes planning files only. It does not authorize `scripts/execute.py`, C++ implementation, build, CTest, reference solver execution, or evidence-document creation. - -**Goal:** `nonlinear-static-newton-raphson` 기능을 C++17/MSVC/CMake/CTest TDD 순서로 완결하고, current-position/spatial-moment global equilibrium, accepted free residual, fine-primary/coarse-companion reference gate와 HDF5 schema v1을 검증한다. - -**Architecture:** App layer가 argv 검증, lexical output path derivation, move-only `OutputWriteLease`, log open/close와 final HDF5 writer 호출 순서를 소유한다. 입력 parse/map은 정확히 한 번 수행하고, `StepDefinition::ProcedureKind()`로 linear와 nonlinear procedure executor를 분리한다. Nonlinear accepted state는 current arm과 spatial physical moment로 applied-plus-reaction balance error를 만들고 기존 `/global/equilibrium`에 저장하며, comparator는 existing schema-v1 nodal datasets에서 constrained reaction resultant와 accepted free residual을 별도로 재구성한다. `LinearStaticAnalysis`의 기존 private lifecycle에는 nonlinear 조건문을 넣지 않는다. - -**Tech Stack:** C++17, MSVC on Windows, CMake, CTest, GoogleTest, Intel oneAPI MKL/TBB, HDF5, Abaqus `.inp` approved subset, Python 3 Harness scripts. - -**Spec:** `docs/nonlinear-static-newton-raphson/{requirements,research,formulation,numerical-review,reference-model,io}.md` - -## Metadata - -| key | value | -| --- | --- | -| feature_id | `nonlinear-static-newton-raphson` | -| status | `ready-for-implementation` | -| owner_agent | `implementation-planning-agent` | -| date | `2026-08-28` | -| approval | User approved the original 13-Step draft on `2026-08-24`, USER-DECISION-003 revision, and delegated the Coordinator-audited REAPPROVAL-012 Stage 6 reapproval/materialization with both normalized factor-one global force and moment balance gates fixed at `<=1e-8` on `2026-08-28`. | -| source_requirement | `docs/nonlinear-static-newton-raphson/requirements.md` | -| source_research | `docs/nonlinear-static-newton-raphson/research.md` | -| source_formulation | `docs/nonlinear-static-newton-raphson/formulation.md` | -| source_numerical_review | `docs/nonlinear-static-newton-raphson/numerical-review.md` | -| source_reference_models | `docs/nonlinear-static-newton-raphson/reference-model.md` | -| source_io_definition | `docs/nonlinear-static-newton-raphson/io.md` | - -## Approved Upstream Hashes - -| document | SHA-256 | -| --- | --- | -| `requirements.md` | `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` | -| `research.md` raw | `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` | -| `formulation.md` | `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` | -| `numerical-review.md` | `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` | -| `reference-model.md` | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | -| `io.md` raw | `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9` | -| `io.md` LF-normalized | `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB` | - -## Readiness Check - -- Upstream document status: Stage 1 requirements, Stage 4 numerical/reference review and Stage 5 I/O definition are complete; REAPPROVAL-012 fixes both factor-one normalized global force and moment balance gates at `<=1e-8`. Stage 3 formulation §§11.4/13.4 already supplies the accepted residual/reaction/global-resultant meaning. -- Missing decisions: none. -- Missing required comparison files: none. Fine primary, coarse companion and linear-control exact inputs/CSVs are present; stress files are optional inventory only. -- Planning can proceed: yes. -- REWORK-008의 local reaction blocking conflict는 USER-DECISION-004 option 1로 해소되었다. Local nodal RF/RM은 review-only이고 factor-one global force/moment balance와 accepted free residual이 blocking이다. `AUDIT-001` current-arm/spatial-moment implementation seam은 Step 11에서 RED-first로 닫는다. -- Step 11에는 보존해야 할 uncommitted `NSNR-CTRL-018..021`, `NSNR-LOG-012`, `NSNR-PROC-019`, - `NSNR-HDF5-014`, `NSNR-REF-001..023`, residual-selector GREEN과 comparator/CMake 작업이 있다. - 새 계획은 이를 reset/replay하지 않는다. -- `implementation-report.md`, `build-test.md`, canonical `reference-comparison.md`는 아직 없고 Step 12가 actual evidence에서만 생성한다. -- `CMakePresets.json` tracks the approved `windows-msvc-ninja-debug` contract. The ignored `.harness/config.json` selects the matching configure/build/test presets and `.harness/build-ninja-msvc-debug` binary directory. - -## Implementation Scope - -Included behavior: - -- Existing schema-v1 `/global/equilibrium [6]`에 global origin `[0,0,0]`, accepted current - position `X+u`, independently spatial-converted applied/reaction moments를 사용하는 - applied-plus-reaction balance error를 기록한다. -- Existing schema-v1 nodal datasets와 exact constraint mask에서 accepted free residual, - constrained reaction resultant와 global balance error를 서로 다른 evidence로 재구성한다. -- Fine nonlinear primary, coarse nonlinear companion와 linear control을 exact read-only artifact로 - 비교한다. U는 blocking, UR은 warning-only, local RF/RM은 review-only, RM3/stress는 excluded다. -- Internal global force/moment는 dimension-separated normalized `1e-8`, accepted free residual은 - NSNR-069으로 blocking 검증하고 external families만 `docs/TOLERANCE.md`를 사용한다. - -Excluded behavior and non-goals: - -- New HDF5 dataset/schema version, public header/API, tolerance, reference artifact 또는 solver scope - 추가가 아니다. -- `fesa.env`, runtime configuration, CLI option 또는 product solver acceptance behavior를 추가하지 - 않는다. `1e-8`은 comparator-owned internal verification gate의 fixed value다. -- Local nodal reaction을 global sum으로 대체하거나 Abaqus S4와 FESA MITC4 내부 정식화 - 동등성을 주장하지 않는다. -- Steps 0–10 구현/history replay, selector RED 재현, Abaqus/reference solver 실행, Physics/Release - 판정은 포함하지 않는다. - -## Global Constraints - -- Use `RED -> observed failure -> minimal GREEN -> focused VERIFY -> full CTest` in every implementation Step. -- C++ production edits require related C++ tests in the same Step. -- Do not edit requirements, research, formulation, numerical review, reference-model, I/O, tolerance, or reference artifacts. -- Do not run Abaqus, Nastran, or any reference solver. -- Do not create `implementation-report.md`, `build-test.md`, or `reference-comparison.md` before Step 12 produces actual command evidence. -- Do not run Harness from this planning approval. `scripts/execute.py` requires a separate explicit request. -- Implementation and Harness execution remain unauthorized by this materialized plan until the user separately requests Executor execution. -- Preserve source label/instance identity, deterministic row order, deterministic diagnostics, finite checks, and `docs/TOLERANCE.md` exactly. -- Residual force/moment channel은 finite-first 검사 뒤 matching external scale 자체로 분기한다. Exact zero이면 denominator output exact `0`과 typed absolute `1.0e-3`; nonzero이면 retained `max(internal,external)` denominator와 dimensionless relative `1.0e-2`만 사용한다. Tolerance band, zero clamp, `max(1,...)`, absolute/relative OR는 금지한다. -- Correction gates, four-channel logical AND, Full Newton, fixed load-factor stepping, maximum 100 iterations와 `nsnr-log-v1` 39-field label/order/TAB schema는 변경하지 않는다. -- Preserve `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. Fine/coarse constrained `RF1/RF2`, `RF3`, physical spatial `RM1/RM2` remain review-only with complete deterministic precheck/error reporting; exclude `RM3` and stress from numeric comparison. -- Preserve schema version 1 and all existing HDF5 paths/shapes/components. Do not add a summary dataset or public header. -- Keep internal global balance/free-residual gates separate from external `docs/TOLERANCE.md`; do not add a floor, `max(1,S)`, zero clamp, averaging or collapse. -- Launch every Harness process from VsDevCmd with `-arch=x64 -host_arch=x64` and inherit `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR`. The tracked preset selects Ninja and MSVC Debug without hard-coding machine-local dependency paths. - -## Repository Seam Map - -| area | current seam | implementation direction | -| --- | --- | --- | -| CLI/app | `src/fesa/app/fesa_application.cpp` currently accepts `[--output ]` and constructs `LinearStaticAnalysis`. | Add output path derivation and `OutputWriteLease`, reject any argv token containing `--output`, own log/HDF5 lifecycle. | -| Analysis request | `include/fesa/analysis/analysis.h` contains `input_path` and `output_path`. | Add `log_path`; Step 10 introduces prepared analysis flow for single parse/map and delayed HDF5 finalization. | -| Linear lifecycle | `LinearStaticAnalysis::Run()` currently parses/maps and writes HDF5 inside `RecoverAndWrite()`. | Refactor into `PrepareAnalysisInput`, `LinearStaticProcedureExecutor`, and final writer call after log close; keep linear numerical behavior. | -| Domain | `StaticStepDefinition` in `include/fesa/model/model_types.h`; `StepDefinition` in `include/fesa/model/domain.h`. | Store procedure identity, `NLGEOM`, raw four `*STATIC` values and provenance. Do not store derived factor sequence or PRESELECT state. | -| Parser mapping | `src/fesa/io/abaqus/domain_mapping_context.cpp`, `step_definition_mapper.cpp`. | Accept nonlinear static subset, warning no-op PRESELECT, reject unsupported procedure fail-closed. | -| MITC4 | `include/fesa/elements/mitc4_shell.h`, `src/fesa/elements/mitc4_shell.cpp` are linear small-rotation. | Add separate nonlinear MITC4 files with `Create(...)` from four nodes, four initial frames, `ShellSection`, and `LinearElasticMaterial`; element kernels compute internal residual/tangent/recovery only. | -| Loads/control | Preserved partial Step 11 work already changes residual selection to matching external scale exact-zero/nonzero and adds `NSNR-CTRL-018..021`/`NSNR-LOG-012`. | Preserve without replay/redesign; run focused regression before the new equilibrium/reference gate. | -| Equilibrium projection | `src/fesa/analysis/nonlinear_static_procedure.cpp` currently sums raw full residual with initial Domain coordinates and raw rotational covectors. | Apply the constraint mask before rotational conversion; use accepted `X+u`; convert applied and constrained-reaction rotational covectors independently with `InverseTransposeLeftJacobianSO3(phi)`; store applied-plus-reaction balance only. | -| Source identity | `SourceEntityId { instance_name, source_label, source_label_text }` and `EntityIndex` exist in `include/fesa/core/source_identity.h`; nodes are stored in stable Domain order. | Step 8 baseline uses both `EntityIndex` and full `SourceEntityId`, requires one node baseline per Domain node in stable internal order, rejects label-only or mismatched identities, and preserves identity into HDF5/reference mapping. | -| Solver | `MklPardisoSolver` uses SPD `mtype=2` and upper-triangle copy. | Preserve unchanged; add `TangentSolver` and MKL unsymmetric full CSR `mtype=11`. | -| Results writer | `NonlinearHdf5ResultsWriter` already writes schema-v1 `/global/equilibrium`, but its location attribute is `global-origin`. | Preserve dataset path/shape/components and change exact location identity to `global-balance-error`; no new dataset or public writer boundary. | -| Tests | Existing integration/HDF5 tests and partial nonlinear comparator are registered in existing executables. | Add RED to existing sources; preserve the current CMake registration and use focused `ctest -R` regex without a new target or global relabel. | - -## Work Breakdown - -| Step | name | dependency | primary responsibility | -| ---: | --- | --- | --- | -| 0 | `cli-output-lease-and-derived-names` | none | CLI output derivation, `--output` substring rejection, RAII output lease, app-owned log/HDF5 lifecycle entry. | -| 1 | `nonlinear-static-domain-contract` | 0 | Domain/parser semantic contract for `NLGEOM=YES`, raw `*STATIC`, PRESELECT warning no-op. | -| 2 | `finite-rotation-state` | 1 | SO(3) finite rotation state, left Jacobian, branch/invariant validation. | -| 3 | `nonlinear-mitc4-kinematics-and-recovery` | 1,2 | TL MITC4 nonlinear kinematics and recovery rows. | -| 4 | `nonlinear-mitc4-residual-and-tangent` | 2,3 | Same-trial internal residual and internal consistent tangent with recovery. | -| 5 | `load-boundary-path-and-convergence-gates` | 1-4 | Fixed factor path, proportional load/BC path, global-once fixed-load `f_ext`/`K_ext` with approved subtraction signs, `rho_M`, typed four-channel convergence with constants owned by evaluator. | -| 6 | `backend-neutral-tangent-solver` | 4 | Separate nonsymmetric tangent solver boundary and MKL adapter. | -| 7 | `newton-iteration-log-writer` | 0,5 | Exact 39-field Newton text log writer. | -| 8 | `nonlinear-state-commit-rollback` | 3-7 | Factor-zero baseline construction with `EntityIndex` plus `SourceEntityId`, trial/committed nonlinear state, accepted frames, rollback/preservation. | -| 9 | `nonlinear-hdf5-schema-v1-writer` | 8 | Nonlinear HDF5 schema v1 writer using `std::vector`. | -| 10 | `prepared-analysis-flow-and-full-procedure` | 0-9 | Single parse/map prepared analysis flow, separate linear/nonlinear executors, delayed writer finalization. | -| 11 | `equilibrium-projection-and-reference-gate` | 0-10 | Preserve partial selector/comparator work; add new current-arm/spatial-moment, HDF5 location, fine/coarse disposition/internal-gate RED tests; make minimal procedure/writer/comparator GREEN; run focused/full verification. | -| 12 | `execution-closure-and-evidence-docs` | 0-11 | Fresh MSVC evidence, deterministic repeat/reference audit, actual-output evidence docs. | - -## TDD Test Plan - -| test id family | RED assertion scope | Step | -| --- | --- | --- | -| `NSNR-CLI-*` | `--output` substring first-token rejection, lexical result/log names, no-output-change proof, lease lifetime. | 0 | -| `NSNR-IO-*` | `NLGEOM=YES`, raw `*STATIC`, `NLGEOM=NO` regression, PRESELECT warning no-op, unsupported procedure diagnostics. | 1 | -| `NSNR-ROT-*` | finite rotation invariants, `J_l`, branch margin, director update. | 2 | -| `NSNR-ELEM-KIN-*` | nonlinear MITC4 creation inputs, TL shell kinematics, fixed-size four-GP recovery rows, degeneracy fail-closed, linear limit. | 3 | -| `NSNR-ELEM-TAN-*` | same-trial internal residual/tangent, directional derivative, objectivity, symmetry only for internal/no-external cases. | 4 | -| `NSNR-CTRL-*` | Existing coverage plus preserved partial `NSNR-CTRL-018..021`: matching-external exact-zero absolute boundaries, retained nonzero relative boundaries, nonfinite-first/no-clamp selection, unchanged correction gates/four-channel AND. Do not replay/fabricate selector RED. | 5,11 | -| `NSNR-SOLVER-*` | nonsymmetric tangent solve, 0x0, nonfinite/failure translation, SPD solver unchanged. | 6 | -| `NSNR-LOG-*` | Existing serializer coverage plus preserved partial `NSNR-LOG-012`: evaluator-produced zero/nonzero-external decisions retain exact denominator, branch, threshold, unit and 39 fields. | 7,11 | -| `NSNR-STATE-*` | factor-zero baseline creation with stable node order and full source identity, trial/committed separation, accepted frame order, full schema-v1 state inventory, finite atomic commit, rollback. | 8 | -| `NSNR-HDF5-*` | Existing schema-v1 coverage plus `NSNR-HDF5-014` exact `/global/equilibrium` `location=global-balance-error`; path/shape/components/version unchanged. | 9,11 | -| `NSNR-PROC-*` | Existing procedure coverage plus collision-resolved `NSNR-PROC-019` exact test `NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance`. Approved draft label `NSNR-PROC-011` is not reused because completed Step 10 already owns it. | 10,11 | -| `NSNR-REF-*` | Preserve `NSNR-REF-001..023`, including the current-case old-gate RED in `022`; add `024` inclusive `1e-8` force/moment boundary plus approved between-threshold regression and `025` exact-zero-scale force/moment regression before changing the comparator gate. | 11 | -| `NSNR-EVID-*` | `001..007` freshness, disposition, fine/internal inventory, AUDIT-001, command/provenance and actual-output report checks. | 12 | - -## CMake And CTest Plan - -- Add C++ sources to `src/fesa/CMakeLists.txt` under existing `fesa_solver`. -- Add unit tests to `fesa_unit_tests`, integration tests to `fesa_integration_tests`, reference tests to `fesa_reference_tests`. -- Preserve current executable-wide labels. Use focused regex such as `ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`. -- Step 11 adds no target or `add_test`: procedure/HDF5 tests use existing executables and current partial `tests/CMakeLists.txt` comparator registration is preserved without unrelated edits. -- If scoped per-test labels are introduced, the Step that introduces the mechanism must test it and avoid changing labels for unrelated discovered tests. -- Configure/build/test commands: - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -## Candidate Files and Ownership - -Candidate paths guide the Implementation Agent and do not finalize a new public API. - -| Step | candidate files | responsibility boundary | -| --- | --- | --- | -| 11 RED | `tests/integration/analysis/nonlinear_static_procedure_test.cpp`; `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`; existing partial `tests/reference/nonlinear_static_reference_{comparison.h,comparison.cpp,cases_test.cpp}` | New behavior must fail before production edits; comparator extensions remain test-private. | -| 11 GREEN | `src/fesa/analysis/nonlinear_static_procedure.cpp`; `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` | Current-arm/spatial-moment balance and exact dataset location only; no public header/state/schema expansion. | -| 11 preserve | `src/fesa/analysis/nonlinear_static_control.cpp`; `tests/unit/analysis/nonlinear_static_control_test.cpp`; `tests/unit/analysis/newton_iteration_log_test.cpp`; `tests/CMakeLists.txt` | Preserve uncommitted selector/tests/registration and verify them; do not reset, recreate or redesign. | -| 12 evidence | `docs/PRD.md`; `docs/ARCHITECTURE.md`; `docs/ADR.md`; feature `implementation-report.md`, `build-test.md`, `reference-comparison.md` | Directly superseded global statements and actual evidence only; no C++/test/CMake ownership. | - -## Data Flow Contract - -1. CLI receives `fesa.exe `. -2. App scans all argv tokens left-to-right. The first token containing case-sensitive substring `--output` fails with one `cli-usage` diagnostic before path resolution, parse/map, analysis, lease, log, or HDF5. -3. App derives `_results.h5` and `_log.txt` beside the lexically normalized user-addressed `.inp`. -4. App acquires move-only `OutputWriteLease` and retains it until all log and HDF5 work ends. -5. App opens/truncates the log, then `PrepareAnalysisInput(input_path)` parses/maps once into `Domain`. -6. Procedure executor receives injected `ParallelFor` plus `LinearSolver` or `TangentSolver` and computes a fully validated state without opening HDF5. Nonlinear assembly forms `r=f_int-f_ext` and `K_T=K_int-K_ext`, preserves the existing convergence decisions, then computes accepted global balance in stable node order. For each node it sets `x=X+u`, masks constrained residual components before converting reaction rotation, converts applied and reaction rotational covectors independently with `InverseTransposeLeftJacobianSO3(phi)`, and accumulates `applied+reaction` force and `x cross force + spatial moment` about `[0,0,0]`. -7. App closes the log successfully before invoking injected `ResultsWriter` or `NonlinearResultsWriter`. -8. HDF5 is authoritative. Existing schema-v1 `/global/equilibrium [6]` stores only the applied-plus-reaction balance error with `location=global-balance-error`; existing nodal datasets/mask reconstruct accepted free residual and constrained reaction resultant without new datasets. -9. Comparator copies exact inputs to unique build-local directories, runs only the copies, and executes `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. CSV views are comparison/debug artifacts only. - -## Reference Inventory - -| path | role | rows | SHA-256 | -| --- | --- | ---: | --- | -| `reference/shellNL-meshfine/shellNL-meshfine.inp` | primary nonlinear input | input | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | -| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning CSV | 729 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | -| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | required review-only CSV | 729 | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | -| `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional inventory artifact | 5,408 | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | -| `reference/shellNL/shellNL.inp` | nonlinear input | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | -| `reference/shellNL/shellNL displacements.csv` | required blocking/warning CSV | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | -| `reference/shellNL/shellNL reactions.csv` | required review-only CSV | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | -| `reference/shellNL/shellNL stresses.csv` | optional inventory artifact | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | -| `reference/shell/shell.inp` | linear input | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | -| `reference/shell/shell displacements.csv` | required displacement CSV | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | -| `reference/shell/shell reactions.csv` | nonblocking inventory artifact | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | -| `reference/shell/shell stresses.csv` | nonblocking inventory artifact | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | - -External comparison families: - -| family | components | rows | disposition | -| --- | --- | ---: | --- | -| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking | -| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only | -| `coarse.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking | -| `coarse.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only | -| `coarse.local_reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | review-only | -| `coarse.local_reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | review-only | -| `coarse.local_reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | review-only | -| `fine.translation` | `U1,U2,U3`, nodes `1..729` | 2,187 | blocking | -| `fine.rotation` | `UR1,UR2,UR3`, nodes `1..729` | 2,187 | warning-only | -| `fine.local_reaction_inplane_force` | `RF1,RF2`, 104 constrained nodes | 208 | review-only | -| `fine.local_reaction_transverse_force` | `RF3`, 104 constrained nodes | 104 | review-only | -| `fine.local_reaction_physical_moment` | `RM1,RM2`, 104 constrained nodes | 208 | review-only | - -Internal blocking families for each fine/coarse accepted factor-one state are free force residual, -free moment residual, global force balance and global moment balance. Global force/moment use separate -normalized `<=1e-8` gates; free residual uses NSNR-069. Constrained reaction resultant force `[3]` -and moment `[3]` is a distinct review-only summary. - -Constrained labels: coarse `1,3..9,14..17,22..33`; fine `1,3..9,34..57,82..153`. - -Exact fine and coarse nonlinear `Frame`: `Increment 10: Step Time = 1.000`. - -Step 11 must not run original reference input paths directly. It snapshots each exact original artifact inventory, copies input bytes unchanged into a unique build-local case directory, runs `FesaApplication` on the copy, consumes copied-sibling `_results.h5` and `_log.txt`, compares generated HDF5 to original read-only CSVs, and verifies original inventory, bytes, timestamps and hashes are unchanged. HDF5 path identity matches the copied input and source content identity matches the approved input hash. - -## Acceptance Traceability Matrix - -| requirement | Steps | test ids | -| --- | --- | --- | -| `FESA-REQ-NSNR-001` | 1,10 | `NSNR-IO-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-003` | 1,3,4,10 | `NSNR-IO-*`, `NSNR-ELEM-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-041` | 1,3,10 | `NSNR-IO-*`, `NSNR-ELEM-KIN-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-074` | 2,8,10 | `NSNR-ROT-*`, `NSNR-STATE-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-006` | 4,6,10 | `NSNR-ELEM-TAN-*`, `NSNR-SOLVER-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-007` | 5,10,11 | `NSNR-CTRL-021`, `NSNR-PROC-*`, `NSNR-REF-019` | -| `FESA-REQ-NSNR-069` | 5,10,11 | `NSNR-CTRL-018..020`, `NSNR-LOG-012`, `NSNR-REF-019` | -| `FESA-REQ-NSNR-070` | 5,10,11 | `NSNR-CTRL-021`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-008` | 5,10,11 | `NSNR-CTRL-020`, `NSNR-PROC-*`, `NSNR-REF-019` | -| `FESA-REQ-NSNR-014` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-046` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-048` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-018` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-063` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-016` | 1,5 | `NSNR-IO-*`, `NSNR-CTRL-*` | -| `FESA-REQ-NSNR-011` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-019` | 4,8,10,11 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` | -| `FESA-REQ-NSNR-020` | 1 | `NSNR-IO-*` | -| `FESA-REQ-NSNR-021` | 8,9,10,11 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-HDF5-014` | -| `FESA-REQ-NSNR-024` | 7,10,11 | `NSNR-LOG-012`, `NSNR-PROC-*`, `NSNR-REF-019` | -| `FESA-REQ-NSNR-083` | 0,10,12 | `NSNR-CLI-*`, `NSNR-PROC-*`, `NSNR-EVID-*` | -| `FESA-REQ-NSNR-026` | 8,10,11,12 | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-020..023`, `NSNR-EVID-*` | -| `FESA-REQ-NSNR-030` | 2,3,4,5,6,7,8,9,10,11 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-014`, `NSNR-PROC-019`, `NSNR-REF-022`, `NSNR-REF-024..025` | -| `FESA-REQ-NSNR-034` | 11,12 | `NSNR-REF-020..023`, `NSNR-EVID-003..007` | - -## Numerical Review Coverage - -| category | Steps | -| --- | --- | -| linear-limit reduction | 3,4,10,11 | -| rotation invariants and branch margin | 2,8,10 | -| tangent directional derivative schedule | 4 | -| no-moment tangent symmetry | 4 | -| finite rigid objectivity | 3,4 | -| patch/sign recovery | 3,4 | -| load/boundary path and `rho_M` | 5,10 | -| Newton factor/iteration lifecycle | 5,7,10 | -| four convergence gates | 5,7,10,11; preserved partial selector/control/log work is regression-verified in Step 11 | -| global balance/current-arm/spatial moment | 11 | -| review-only local reaction and fine/coarse reference | 11,12 | -| commit/rollback/determinism | 8,10,11,12 | - -## Validation Commands - -Each Step must: - -1. Use the ignored `.harness/config.json` preset contract and tracked `CMakePresets.json`. -2. Confirm the Harness parent environment was initialized by VsDevCmd x64 and contains `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR`. -3. Run: - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Step 11 focused commands additionally include: - -```powershell -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure -``` - -Harness Python validation is not in scope unless a Step changes Harness Python behavior, hook behavior, or agent configuration. - -## Risks And Downstream Handoff - -- Current numerical risk: nonzero prescribed motion exposes the existing raw-residual/initial-arm - shortcut. The minimal fix must preserve same-state, stable-order and mask-before-spatial-conversion - semantics; passing zero-prescribed shellNL cases alone is insufficient evidence. -- Current reference risk: fine/coarse U and internal balance/free-residual are blocking, but local RF/RM - may still show large review-only errors. Do not convert those findings into omitted rows, relaxed - tolerance or a blocking gate. -- Current worktree risk: Step 11 contains partial selector/comparator/CMake edits. Preserve and continue - those files; do not delete, reset, replay selector RED or replace the comparator design wholesale. -- Handoff to Implementation Agent through Coordinator: after a separate explicit Harness request, - resume only Executor-selected Step 11. Preserve existing `NSNR-PROC-019`, `NSNR-HDF5-014` and - `NSNR-REF-020..023`; first re-observe the current-case old-gate RED, then add `NSNR-REF-024..025` - before changing the comparator-only shared force/moment gate to `1e-8`. Verify preserved - selector/log tests, then run focused/full preset validation. - Step 12 remains actual-evidence closure. - -## Harness Step Draft - -| Step | name | one-module scope | prerequisites | stop condition | -| ---: | --- | --- | --- | --- | -| 11 | `equilibrium-projection-and-reference-gate` | Nonlinear accepted equilibrium projection, exact HDF5 location and test-private reference gate | Steps 0–10 completed; approved upstream hashes; partial Step 11 work preserved; VsDevCmd/preset dependency environment | Stop on unexpected RED, public API/schema/tolerance/reference change, reference mutation, or any focused/full failure. | -| 12 | `execution-closure-and-evidence-docs` | Fresh evidence reports plus directly superseded PRD/ARCH/ADR statements | Step 11 completed with actual command/reference evidence | Stop if Step 11 is incomplete, evidence is stale/untraceable, a code/test/CMake change is needed, or any final command fails. | - -Both Step files contain exact commands, file ownership, RED/GREEN/VERIFY order and prohibitions. -Materialization does not select or execute either Step. - -## Open Issues - -None blocking planning. Revised upstream contracts and exact required artifacts are complete; actual -RED/GREEN/build/reference outcomes remain Step 11/12 evidence and are not pre-claimed. - -## Plan Approval Boundary - -The Coordinator-audited REAPPROVAL-012 revision authorizes this planning/phase materialization and -blocked-to-pending recovery. It does not itself execute Harness; Executor invocation remains under -the Coordinator's separately audited execution authority. diff --git a/docs/nonlinear-static-newton-raphson/implementation-report.md b/docs/nonlinear-static-newton-raphson/implementation-report.md deleted file mode 100644 index ed704fa..0000000 --- a/docs/nonlinear-static-newton-raphson/implementation-report.md +++ /dev/null @@ -1,84 +0,0 @@ -# Nonlinear Static Newton-Raphson Implementation Report - -## Metadata - -| key | value | -| --- | --- | -| feature_id | `nonlinear-static-newton-raphson` | -| phase step | `12: execution-closure-and-evidence-docs` | -| owner_agent | `implementation-agent` | -| evidence date | `2026-08-28` | -| repository HEAD before this Step's documentation edits | `d275e844f27107cfab52309025e259f2156345d2` | -| classification | `pass-for-physics-evaluation` | - -## Freshness audit (RED) - -Before any build or reference command, `NSNR-EVID-001..007` failed as expected. -`implementation-report.md`, `build-test.md`, and `reference-comparison.md` were absent. The -global documents still advertised `--output`, only the prior linear output path, and did not state -the approved nonlinear current-arm/reaction and fine/coarse reference dispositions. This was an -evidence freshness failure, not a solver failure. No report was created until the fresh commands -below completed. - -## Approved inputs and preserved Step history - -The consumed upstream document SHA-256 values were: requirements -`89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, research -`4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570`, formulation -`878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, numerical review -`C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`, reference model -`B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`, I/O -`ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, implementation plan -`CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, and corrections -`4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. - -Steps 0--10 remain unchanged: derived output/log lease; NLGEOM Domain controls; finite rotations; -nonlinear MITC4 kinematics/recovery; residual/tangent; load/BC/convergence gates; tangent solver; -iteration log; transactional state; nonlinear HDF5 v1; and prepared parse-once dispatch/finalization. - -## Step 11 RED to GREEN evidence - -The preserved Step 11 transcript SHA-256 is -`292FE06B7F97B1CBE267A36D875342B300E82486B76BDCBCD31EE2192A87ACE3`. -Its RED evidence covered: initial-arm/raw rotation balance (`NSNR-PROC-019`), obsolete -`location=global-origin` (`NSNR-HDF5-014`), missing fine inventory (`NSNR-REF-020`), blocking -local RF/RM (`NSNR-REF-021`), obsolete `1e-10` balance rejection (`NSNR-REF-022`), pre-tolerance -row rejection (`NSNR-REF-023`), inclusive `1e-8` boundary (`NSNR-REF-024`), and exact-zero scale -(`NSNR-REF-025`). - -The minimal GREEN slice was limited to the nonlinear procedure current-arm/spatial balance -projection, HDF5 location metadata/self-check, and test-private reference comparator/case -inventory. The relevant production files were `nonlinear_static_procedure.cpp`, -`nonlinear_hdf5_results_writer.cpp`, and `hdf5_self_check.cpp`; test changes remained in the -procedure, writer, convergence/log, and reference-comparator tests. This Step made no C++, test, -CMake, Harness, tolerance, or reference-artifact change. - -Fresh VERIFY reran the preserved controls. The focused `NonlinearStaticProcedure` and -`NonlinearHdf5ResultsWriter` command passed 7/7, including -`NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance` and -`WritesSchemaV1GlobalBalanceErrorLocation`. The reference command passed the inclusive and -exact-zero global gate tests. This closes `AUDIT-001`: the tests exercise nonzero prescribed -translation and rotation, `x=X+u`, component-mask-before-conversion, independently converted -applied and constrained rotation covectors, and `location=global-balance-error`. - -## Requirement and test traceability - -| evidence | fresh result | -| --- | --- | -| `NSNR-CTRL-018..021` convergence controls | 6/6 `NonlinearConvergence.*` passed | -| `NSNR-LOG-012` iteration-log contract | 8/8 `NewtonIterationLog.*` passed | -| `NSNR-PROC-019` current-arm balance | passed in focused 7-test procedure/writer run | -| `NSNR-HDF5-014` v1 equilibrium location | passed in focused 7-test procedure/writer run | -| `NSNR-REF-020..025` portfolio, dispositions, prechecks, 1e-8 and zero-scale | 9/9 `NonlinearStaticReference.*` passed twice and in full CTest | -| blocking external/internal final gate | all 302 CTest tests passed; detailed metrics are in `reference-comparison.md` | - -## Handoff and open issues - -Implementation-owned classification is `pass-for-physics-evaluation`. The only numerical -differences retained are six deterministic local RF/RM review-only findings; they do not alter -the blocking verdict. No warning-only UR family failed. This report does not claim physics or -release readiness, and numerical agreement does not assert Abaqus S4 internal formulation -equivalence. - -No Step 12 production behavior changed. Reference inputs and CSV files were read-only and their -pre/post inventory, byte sizes, timestamps, and SHA-256 values were identical. diff --git a/docs/nonlinear-static-newton-raphson/corrections.md b/docs/nonlinear-static-newton-raphson/lessons.md similarity index 60% rename from docs/nonlinear-static-newton-raphson/corrections.md rename to docs/nonlinear-static-newton-raphson/lessons.md index 98a7e94..5f78ab0 100644 --- a/docs/nonlinear-static-newton-raphson/corrections.md +++ b/docs/nonlinear-static-newton-raphson/lessons.md @@ -1,12 +1,20 @@ -# Nonlinear Static Newton-Raphson Correction Report +# MITC4 비선형 정적 해석 수정과 시행착오 -## 1. Metadata +아래는 당시 실패 재현·원인·수정·검증 기록이다. 임시 shell/Hook/phase 복구 명령은 현재 실행 절차가 아니다. + + + + +## Nonlinear Static Newton-Raphson Correction Report + + +### 1. Metadata | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `docs/nonlinear-static-newton-raphson/coordination.md`; `phases/nonlinear-static-newton-raphson/step0-output.json`; `phases/nonlinear-static-newton-raphson/step1-output.json` | -| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md` | +| source failure report | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step0-output.json`; `phases/nonlinear-static-newton-raphson/step1-output.json` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md` | | status | `corrected-for-implementation-rerun` | | owner_agent | `correction-agent` | | date | `2026-08-24` | @@ -15,7 +23,8 @@ Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이고 Sections 11-13은 이전 correction history다. Current correction과 status는 Section 14가 supersede한다. -## 2. Failure Triage + +### 2. Failure Triage - classification: `harness` - normalized classification: `harness-nested-codex-windows-shell-tool-execution-hang` @@ -29,7 +38,8 @@ Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Secti - evidence tail: baseline diagnostic는 45초 안에 종료되지 않았다. JSONL에는 `item.started`, `type=command_execution`, `status=in_progress`가 기록됐지만 대응하는 completion event와 `CODEX_SHELL_SMOKE_OK` 출력이 없었다. 진단 root PID `11292`와 관찰된 descendant PID tree를 `taskkill /PID 11292 /T /F`로 종료한 뒤 `remainingPids=[]`를 확인했다. - historical evidence: `step0-output.json`도 exit code `124`, stderr `Codex timed out after 1800 seconds.`를 기록했고 `Get-Date`, `cmd.exe /d /c echo test`, `exit 0` 등의 nested command가 `status=in_progress`에 머물렀다. -## 3. Root Cause Summary + +### 3. Root Cause Summary 실패 경계는 repaired Python Executor의 timeout/retry 처리나 FESA C++ 구현이 아니라 local `codex-cli 0.147.0`의 nested command execution runtime이다. 같은 worktree에서 direct PowerShell과 `cmd.exe`는 정상 실행되고, focused Harness Python test도 통과하며, runner-equivalent Codex baseline만 nested shell completion을 반환하지 않았다. @@ -44,19 +54,8 @@ Local CLI help는 `--disable `와 `--enable `를 문서화하 따라서 `--disable code_mode_host`는 shell execution을 복구하지 않고 tool host를 fail-closed로 제거한다. `unified_exec`도 단독 또는 조합에서 실제 shell completion을 만들지 못했다. Codex 내부 결함의 더 세부 원인은 repository evidence로 확정할 수 없으며, 안전한 documented runner flag workaround는 입증되지 않았다. 이는 implementation defect, test defect 또는 CMake registration issue가 아니라 external Codex runtime blocker다. -## 4. Correction Scope - -- changed source files: `scripts/execute.py` (`codex exec` argv에 adjacent `--disable`, `unified_exec` 추가) -- changed header files: 없음 -- changed test files: `tests/test_execute.py` (Implementation Agent command contract regression assertion 추가) -- changed CMake files: 없음 -- changed report files: `docs/nonlinear-static-newton-raphson/corrections.md` -- excluded upstream contract files: `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md` -- excluded artifacts/policies: phase definition/index, production C++, reference inputs/CSV, `docs/TOLERANCE.md` - -초기 correction cycle에서는 safe workaround가 입증되지 않아 runner/test를 변경하지 않았다. 이후 user/root가 Codex `0.149.1`의 bounded smoke로 `--disable unified_exec` runtime envelope를 입증했고, REWORK-004에서 그 pair만 TDD로 추가했다. 기존 Harness-repair 변경과 다른 owner의 dirty-worktree 변경은 그대로 보존했다. - -## 5. Verification Evidence + +### 5. Verification Evidence | purpose | command | result | | --- | --- | --- | @@ -75,34 +74,11 @@ Full Python failure는 pre-existing out-of-scope contract mismatch다: `test_age Stop hook은 Harness Step 실행을 금지한 이번 correction session에서 별도 Codex Step 종료 evidence를 생성하지 않았다. Hook entry point의 수동 실행은 project contract가 금지하므로 대신 config-resolved full MSVC build와 full CTest를 직접 실행해 결과를 위에 기록했다. -## 6. Traceability + +### 9. REWORK-004 TDD And Verification Evidence -| requirement id | task id | test id | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-083` | Step 0 `cli-output-lease-and-derived-names` | `CORR-HARNESS-SMOKE-001` | runner-equivalent `codex exec` invoking `cmd.exe /d /c echo CODEX_SHELL_SMOKE_OK` | 없음 | workspace-write, hooks, `gpt-5.6-terra`/`xhigh`, no-push, no `danger-full-access`를 유지한 실제 shell completion과 exact echo output; 실패 | -| `FESA-REQ-NSNR-083` | Step 0 `cli-output-lease-and-derived-names` | `CORR-HARNESS-SMOKE-002` | same smoke with `--disable code_mode_host` | 없음 | shell completion 복구; 실패 (`code-mode host is disabled`) | - -Runner correction acceptance criterion이 충족되지 않았으므로 Implementation Step 0의 `NSNR-CLI-*` RED/GREEN은 시작되지 않았고 Step 0 status는 `pending`으로 유지된다. - -## 7. Handoff Recommendation - -- recommendation: Coordinator Agent를 통해 Implementation Agent에 `needs-implementation-rerun` 요청. -- corrected runner contract: nested command는 `codex exec --disable unified_exec --json ...` 순서로 실행된다. -- preserved execution contract: Coordinator가 관리하는 rerun launch environment는 Codex `0.149.1`, aligned `CODEX_HOME`, approved WindowsApps PATH filtering, `workspace-write`, project hooks, `gpt-5.6-terra`, `xhigh`, no-push, no `danger-full-access`를 유지해야 한다. -- scope boundary: 이 correction은 runner option gate만 복구했다. Harness phase, Implementation Step 0, reference comparison 또는 physics success를 주장하지 않는다. - -## 8. Stop Condition - -- repeated failure: normalized classification attempt `2`는 초기 Codex `0.147.0` failure history로 보존한다. -- external mitigation: user/root의 Codex `0.149.1` bounded smoke와 `DECISION-038`이 새 좁은 runner correction을 승인했다. -- correction result: required adjacent `--disable unified_exec` pair와 regression test가 GREEN이다. -- residual blocker: runner correction 자체 blocker는 없음. Full Python suite의 pre-existing `xhigh` actual 대 `extra high` expected mismatch는 변경하지 않았다. -- upstream ambiguity/reference artifact gap: 없음; reference artifact는 읽기/수정/생성하지 않았다. -- final stop: correction-owned edits와 검증이 끝났으므로 여기서 중단하고, phase rerun 판단과 실행은 Coordinator/Implementation Agent에 반환한다. - -## 9. REWORK-004 TDD And Verification Evidence - -### Failure and Minimal Correction + +#### Failure and Minimal Correction - classification: `harness` - implementation defect: Codex `0.149.1`에서 통과한 runtime envelope의 `--disable unified_exec` option을 `scripts/execute.py`가 nested `codex exec`에 전달하지 않았다. @@ -110,7 +86,8 @@ Runner correction acceptance criterion이 충족되지 않았으므로 Implement - minimal GREEN: command vector에서 `"codex", "exec"` 바로 뒤에 `"--disable", "unified_exec"` 두 argument만 추가했다. - preserved behavior: `workspace-write` default/validated override, `--dangerously-bypass-hook-trust`, `gpt-5.6-terra`, `model_reasoning_effort="xhigh"`, 1800-second structured timeout, no-push default, `danger-full-access` 비사용 정책은 변경하지 않았다. -### RED / GREEN / VERIFY + +#### RED / GREEN / VERIFY | stage | command | exit | duration | evidence tail | | --- | --- | ---: | ---: | --- | @@ -124,26 +101,23 @@ Runner correction acceptance criterion이 충족되지 않았으므로 Implement Full Python failure는 기존 `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`의 `assert 'xhigh' == 'extra high'` 한 건이다. REWORK-004의 command-contract test를 포함한 `tests/test_execute.py`는 10/10 통과하며, dispatch 경계에 따라 pre-existing mismatch를 수정하지 않았다. -### REWORK-004 Traceability + +### 10. FileTracker Workspace-Write Diagnosis -| requirement id | task id | test id | corrected files | acceptance criterion | -| --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-083` | Harness runner correction `REWORK-004`; blocks Step 0 `cli-output-lease-and-derived-names` | `test_invoke_codex_uses_implementation_agent_command_contract` | `scripts/execute.py`; `tests/test_execute.py` | nested Codex argv가 adjacent `--disable`, `unified_exec`를 포함하면서 Terra/xhigh routing을 보존함; passed | - -## 10. FileTracker Workspace-Write Diagnosis - -### 10.1 Metadata + +#### 10.1 Metadata | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` | -| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step1.md` | +| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/README.md` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step1.md` | | status | `blocked` | | owner_agent | `correction-agent` | | date | `2026-08-24` | -### 10.2 Failure Triage + +#### 10.2 Failure Triage - classification: `harness` - normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write` @@ -159,7 +133,8 @@ Full Python failure는 기존 `test_agent_toml_and_limited_skill_yaml_schemas_ar - command-result caveat: `step1-output.json`의 item 25는 build와 CTest를 세미콜론으로 연결해 aggregate exit `0`을 기록했지만, 그 내부 `cmake --build`는 exit `1`로 실패했다. 뒤따른 stale-build CTest 성공은 Visual Studio build 성공 evidence가 아니다. - configure boundary: 보존된 `.harness/build/CMakeCache.txt`는 `CMAKE_GENERATOR=Visual Studio 18 2026`, platform `x64`다. CMake generation 자체가 아니라 생성된 MSBuild project의 CL dependency-tracking 단계가 실패했다. -### 10.3 Root Cause Summary + +#### 10.3 Root Cause Summary FESA source, Step 1 test 또는 CMake registration이 원인이 아니다. 서로 독립적인 FESA와 GoogleTest project가 동일한 `FileTracker` static initializer에서 실패하므로 project-local input보다 sandbox/environment boundary다. @@ -176,16 +151,8 @@ Microsoft의 `FileTracker.cs`는 static initialization에서 `Path.GetTempPath() - installed Visual Studio target: `C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\Microsoft.CppCommon.targets` lines 48-49 and 764-771 - OpenAI Codex sandbox CLI source: `https://github.com/openai/codex/blob/main/codex-rs/cli/src/lib.rs`; built-in writable profile name은 `:workspace` -### 10.4 Correction Scope - -- changed report files: `docs/nonlinear-static-newton-raphson/corrections.md` -- changed source/header/test/CMake/runner files: 없음 -- preserved dirty Step 1 files: `include/fesa/model/domain.h`, `include/fesa/model/model_types.h`, `src/fesa/io/abaqus/domain_mapping_context.cpp`, `src/fesa/model/domain.cpp`와 관련 unit tests -- preserved workflow files: `docs/nonlinear-static-newton-raphson/coordination.md`, `phases/index.json`, `phases/nonlinear-static-newton-raphson/index.json` -- excluded files: C++/CMake, phase definition/index, coordination, runner, upstream contracts, reference/tolerance artifacts -- prohibited actions not performed: Harness phase rerun, Step 2, build cleanup/deletion, Abaqus/Nastran/reference solver, `danger-full-access`, commit, push - -### 10.5 Workaround Evaluation And Verification Evidence + +#### 10.5 Workaround Evaluation And Verification Evidence | purpose | exact command/evidence | result | | --- | --- | --- | @@ -199,43 +166,23 @@ Microsoft의 `FileTracker.cs`는 static initialization에서 `Path.GetTempPath() Ninja/MSVC는 같은 sandbox에서 implementation/test 건전성을 입증하지만 Step 1 VERIFY가 명시한 `Visual Studio 18 2026` generator acceptance criterion을 대체하지 않는다. 따라서 correction-agent가 phase/upstream contract 변경 없이 자동 채택할 수 없다. `danger-full-access`는 지시대로 실행하거나 시험하지 않았다. -### 10.6 Traceability + +### 11. REWORK-006 Ninja/MSVC Validation Contract Correction -| requirement id | task id | test id | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-083` | Step 1 `nonlinear-static-domain-contract`; FileTracker correction attempt 1 | `CORR-HARNESS-FILETRACKER-001` | `cmake --build .harness/build --config Debug` | report only | approved `workspace-write`에서 Visual Studio 18/MSBuild build completion; not met | -| `FESA-REQ-NSNR-083` | same | `CORR-HARNESS-FILETRACKER-002` | same build with `/p:TrackFileAccess=false` | 없음 | vendor-defined property가 FileTracker denial을 제거하고 build를 완료함; completion evidence 없음 | - -### 10.7 Handoff Recommendation - -- recommendation: `needs-user-decision`; Coordinator Agent에 `blocked` 반환. -- safe automatic correction: 없음. Runner/CMake/Step 1 source를 변경하지 않는다. -- decision option 1: approved implementation plan/phase owner가 Ninja+MSVC를 Visual Studio generator 대체 evidence로 명시적으로 승인한다. 이는 correction-agent 범위 밖의 upstream acceptance 변경이다. -- decision option 2: 사용자가 `docs/HARNESS.md`의 isolated clean-worktree `danger-full-access` fallback을 명시적으로 승인한다. 이번 진단에서는 broader privilege를 사용하거나 시험하지 않았다. -- decision option 3: Codex/Windows sandbox 환경 소유자가 direct `:workspace` launcher와 user Temp long-path access 문제를 수정한 뒤 동일 Visual Studio build를 재검증한다. - -### 10.8 Stop Condition - -- repeated failure: normalized classification attempt `1`; 같은 classification의 두 번째 자동 rework는 아직 수행하지 않았다. -- environment blocker: direct `:workspace` no-op도 bounded completion을 내지 않아 workspace-only workaround를 신뢰성 있게 검증할 수 없다. -- upstream ambiguity: Ninja acceptance 또는 broader sandbox 권한은 사용자/Coordinator 결정이 필요하다. -- reference artifact gap: 없음; reference artifact는 읽기/수정/생성하지 않았다. -- final stop: safe, vendor-supported, contract-preserving `workspace-write` workaround가 입증되지 않아 code change 없이 `blocked`로 중단한다. - -## 11. REWORK-006 Ninja/MSVC Validation Contract Correction - -### 11.1 Metadata + +#### 11.1 Metadata | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` USER-DECISION-002 option A / REWORK-006 | -| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` | +| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/README.md` USER-DECISION-002 option A / REWORK-006 | +| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` | | status | `corrected-for-implementation-rerun` | | owner_agent | `correction-agent` | | date | `2026-08-24` | -### 11.2 Failure Triage + +#### 11.2 Failure Triage - classification: `harness` - normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write` @@ -244,20 +191,13 @@ Ninja/MSVC는 같은 sandbox에서 implementation/test 건전성을 입증하지 - failed target: Visual Studio generator/MSBuild `FileTracker..cctor()`; Section 10의 `E_ACCESSDENIED` - replacement acceptance: `workspace-write` 안에서 VsDevCmd x64를 상속한 Ninja/MSVC Debug configure/build, CTest discovery, full CTest가 모두 통과해야 한다. -### 11.3 Root Cause Summary + +#### 11.3 Root Cause Summary FESA C++/test/CMake target defect가 아니라 Visual Studio generator의 MSBuild FileTracker와 `workspace-write` sandbox 사이 environment failure였다. User가 option A를 승인했으므로 tracked root `CMakePresets.json`과 existing Harness preset adapter를 사용해 동일 MSVC x64 Debug compiler를 Ninja로 구동한다. Harness Python은 이미 complete preset triplet과 parent environment copy를 지원하므로 production Python 변경은 필요하지 않았다. -### 11.4 Correction Scope - -- validation plumbing: `CMakePresets.json`, `.harness/config.example.json`, `.gitignore`, ignored local `.harness/config.json`, `tests/test_harness_preset_contract.py` -- approved validation commands: `docs/nonlinear-static-newton-raphson/implementation-plan.md`, `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` -- report/status: `docs/nonlinear-static-newton-raphson/corrections.md`, `phases/nonlinear-static-newton-raphson/index.json`; top `phases/index.json`은 blocked payload 제거 후 HEAD와 같은 `pending` 의미로 복원됨 -- generated/ignored build output: `.harness/build-ninja-msvc-debug/`; 삭제하거나 cleanup하지 않았다. -- production Harness Python, runner, C++, CMakeLists, upstream physics/I/O/reference/tolerance contract: 변경 없음 -- preserved others' dirty files: Step 1 C++/unit tests와 Coordinator-owned `coordination.md`를 되돌리거나 덮어쓰지 않았다. - -### 11.5 RED -> GREEN Evidence + +#### 11.5 RED -> GREEN Evidence | stage | command | result | | --- | --- | --- | @@ -274,7 +214,8 @@ Contract details: - cache variables: `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR` use `$env{...}` and therefore fail closed when the parent launch envelope is incomplete. - `.harness/config.json` is ignored and byte-identical to `.harness/config.example.json`; both SHA-256 `D07429860D472AE37D02D6CD638900FA46175085AF47F179E98601227F8D3C43` at verification. -### 11.6 Verification Evidence + +#### 11.6 Verification Evidence Exact nested launch envelope: @@ -304,35 +245,23 @@ codex exec --ephemeral --json --sandbox workspace-write --disable unified_exec - Reference artifact no-change evidence: `git diff --name-only -- reference`는 empty였다. `shellNL.inp`, shellNL displacement/reaction/stress CSV와 shell input/displacement/reaction/stress CSV의 SHA-256은 implementation-plan inventory와 모두 일치한다. Reference solver와 feature Harness phase는 실행하지 않았다. -### 11.7 Traceability + +### 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage -| requirement id | task id | test id | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-083` | `REWORK-006`; Steps 0..12 validation contract | `CORR-HARNESS-PRESET-001` | Visual Studio/MSBuild build | `CMakePresets.json`; `.harness/config.example.json`; `.gitignore`; `tests/test_harness_preset_contract.py` | tracked Ninja/MSVC preset and Harness plan select MSVC/x64/Debug under `workspace-write` | -| `FESA-REQ-NSNR-083` | same | `CORR-HARNESS-PRESET-VERIFY-001` | preset configure/build/discovery/full CTest | implementation plan and `step0.md`..`step12.md` | nested env preflight plus 228/228 CTest pass | - -### 11.8 Handoff Recommendation And Stop Condition - -- recommendation: Coordinator를 통해 Implementation Agent에 Step 1 no-push rerun을 요청한다; Step 2로 advance하지 않는다. -- phase state after evidence: top phase `pending`; Step 1 `pending`, historical `started_at` 보존; `blocked_reason`과 `blocked_at`만 제거; Steps 2..12 remain `pending`. -- status: `corrected-for-implementation-rerun`. -- blockers: 이 correction 범위에는 없음. Existing Python `xhigh`/`extra high` mismatch는 명시된 out-of-scope pre-existing failure다. -- prohibited actions not performed: Harness phase rerun, Step 2, `danger-full-access`, push, commit, reference solver/artifact mutation, build cleanup/deletion. - -## 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage - -### 12.1 Metadata + +#### 12.1 Metadata | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` REWORK-007 | -| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` | +| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/README.md` REWORK-007 | +| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` | | status | `needs-upstream-decision` | | owner_agent | `correction-agent` | | date | `2026-08-24` | -### 12.2 Failure Triage + +#### 12.2 Failure Triage - classification: `upstream-contract` - normalized classification: `implementation-shellnl-nonlinear-nonconvergence-no-hdf5` @@ -347,7 +276,8 @@ Reference artifact no-change evidence: `git diff --name-only -- reference`는 em - evidence tail: copied build-local `shellNL.inp` reaches `severity=error`, `code=nonlinear-nonconvergence` after iteration 100. `generated.HasValue()` is false because no authoritative copied-sibling `shellNL_results.h5` is committed. - correction-agent reproduction: the exact focused test alone failed deterministically in 103.84 seconds with the same diagnostic. The original reference input was not passed to FESA. -### 12.3 Root Cause Summary + +#### 12.3 Root Cause Summary This is not an implementation defect in the observed convergence calculation. The implementation in `src/fesa/analysis/nonlinear_static_procedure.cpp` supplies same-trial free rotational residual, internal moment and external moment to `EvaluateNewtonConvergence`. `src/fesa/analysis/nonlinear_static_control.cpp` then implements the approved `NSNR-069` and formulation Section 14.1 literally: @@ -381,18 +311,8 @@ The reproduced log contains 100/100 parsed iteration records with exact printed Every listed numerator is below `1e-3 force-length`, but the approved exact-zero-denominator predicate forbids use of that absolute branch. Changing the implementation alone would contradict the approved requirement and formulation. -### 12.4 Correction Scope - -- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md` -- changed production source/header/test/CMake files: none -- preserved dirty Step 11 files: `tests/CMakeLists.txt`, `tests/reference/nonlinear_static_reference_cases_test.cpp`, `tests/reference/nonlinear_static_reference_comparison.cpp`, `tests/reference/nonlinear_static_reference_comparison.h` -- excluded upstream files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md` -- excluded workflow/final reports: phase indexes/status, `implementation-report.md`, `build-test.md`, `reference-comparison.md` -- prohibited actions not performed: production/test/CMake change, threshold or denominator relaxation, Step 11 completion, Step 12 advancement, Abaqus/Nastran/reference solver, reference artifact generation/modification, `danger-full-access`, commit, push - -No RED test was added because no implementation correction is authorized: a test requiring this case to pass would encode a new convergence contract before user/upstream approval. The existing focused reference test already provides the failing integration evidence. - -### 12.5 Verification Evidence + +#### 12.5 Verification Evidence | purpose | exact command/evidence | result | | --- | --- | --- | @@ -405,47 +325,25 @@ No RED test was added because no implementation correction is authorized: a test | Stop | not applicable | Correction was not a Harness Step and made no production/test/CMake change | | Harness Python pytest | not applicable | no Harness/Hook/agent-config behavior changed | -### 12.6 Traceability + +### 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage -| requirement id | task id | test id | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-069` | Step 5 `load-boundary-path-and-convergence-gates`; REWORK-007 | `CORR-NSNR-CONTRACT-001` log audit | focused test 288 | report only | no-applied-moment free rotational residual must have a reachable approved convergence decision; not met by current contract | -| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate` | `NSNR-REF-002`, `NSNR-REF-004` via test 288 | focused test 288 | report only | copied shellNL run produces authoritative HDF5 before comparison; blocked by NSNR-069 contract | - -### 12.7 Handoff Recommendation - -- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun yet. -- narrowest contract alternative: when the matching external residual-channel scale is exactly zero, select the existing typed absolute gate (`||r_f^phi||inf <= 1e-3 force-length`) even if the internal residual is nonzero; retain the current relative denominator when matching external scale is nonzero. -- broader contract alternative: make residual convergence pass when either its typed absolute gate or its current relative gate passes. This is simpler and symmetric across force/moment channels but changes acceptance for all load-scale regimes. -- scale-based contract alternative: define an explicit nonzero model force-length reference scale for moment residual normalization, including its deterministic characteristic-length source. This is more general but expands the numerical contract and needs formulation/numerical review. -- non-solution: changing the reference deck to add an applied moment would not correct the same structural failure for supported no-moment load cases and would also violate immutable reference ownership in this correction. - -Any selected alternative requires the owning upstream documents and tests to be revised and approved before production code changes. Correction Agent does not choose among them. - -### 12.8 Stop Condition - -- upstream ambiguity: the exact approved `max(internal, external)` denominator and exact-zero branch are the demonstrated cause. -- implementation stop: any code-only pass would relax/reinterpret `NSNR-069` and formulation Section 14.1. -- reference artifact gap: none; all declared reference artifacts exist and remain unchanged. -- repeated failure: normalized classification attempt `1`; no automatic second implementation correction is safe before an upstream decision. -- final stop: status `needs-upstream-decision`; Step 11 remains blocked and Step 12 remains pending. - -## 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage - -### 13.1 Metadata + +#### 13.1 Metadata | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` | -| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` | +| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/README.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` | | status | `needs-upstream-decision` | | owner_agent | `correction-agent` | | date | `2026-08-25` | `implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 immutable `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`, Coordinator dispatch, current implementation/CTest와 read-only result/reference audit를 source evidence로 사용했다. -### 13.2 Failure Triage + +#### 13.2 Failure Triage - initial failure classification: `reference-comparison` - final classification: `upstream-contract` @@ -466,7 +364,8 @@ Any selected alternative requires the owning upstream documents and tests to be - failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (fresh CTest test 293) - evidence tail: exit `8`, 0/1 passed, 16.88 s. Row identity/schema/nonfinite prechecks passed before the common tolerance gate reported exactly three failed blocking families: in-plane RF RMS `0.11437709952897851`, transverse RF RMS `0.048448360241294064`, physical spatial RM RMS `0.02746412616679237`, each above `0.01`. -### 13.3 Root Cause Summary + +#### 13.3 Root Cause Summary Observed reaction computation/storage/mapping path에는 implementation defect evidence가 없다. @@ -479,18 +378,8 @@ Observed reaction computation/storage/mapping path에는 implementation defect e 따라서 demonstrated cause는 nonlinear reaction implementation이 아니라 reference blocking quantity의 model-adequacy 전제다. Approved `reference-model.md`는 linear reaction CSV를 review-only로 두면서, 같은 local RF3/RM distribution을 nonlinear에서 blocking으로 승격한다. Project contract는 FESA MITC4의 integration/stabilization/internal behavior가 Abaqus S4와 동등하다고 주장하지 않는다. Global equilibrium은 맞지만 formulation-sensitive local nodal reaction 분포가 1% RMS를 만족해야 한다는 분석적 또는 독립 benchmark 근거는 없다. 이를 code-only로 Abaqus 값에 맞추는 것은 formulation/model adequacy 또는 reference acceptance contract 변경이며 Correction Agent 범위를 벗어난다. -### 13.4 Correction Scope - -- changed report file in this rework: `docs/nonlinear-static-newton-raphson/corrections.md` -- changed production source/header/test/CMake files in this rework: none -- preserved pre-existing dirty Step 11 files, including selector/control/log tests, comparator/reference tests, plan/phase/coordination and upstream approval edits -- excluded upstream contract files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md` -- excluded immutable/reference files: `reference/**`, stored Abaqus CSV, HDF5 schema and tolerance policy -- prohibited actions not performed: new RED test without an implementation defect, production/comparator/test/CMake change, tolerance weakening, reference artifact generation/modification, Abaqus/Nastran/reference solver, Harness phase execution, Step 12/Physics/Release advancement, `danger-full-access`, commit, push - -No focused RED test was added because the dataflow audit disproved a bounded nonlinear computation/storage/mapping defect. The existing focused integration test is already RED for an upstream blocking/model-adequacy assumption; encoding a replacement expected result before upstream approval would itself change that contract. - -### 13.5 Verification Evidence + +#### 13.5 Verification Evidence Visual Studio environment는 `VsDevCmd.bat -arch=x64 -host_arch=x64`로 설정했고, `.harness/config.json`/preset가 요구한 `FESA_GTEST_SOURCE_DIR=C:/git/googletest`, `MKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl`, `TBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb`, `HDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake`를 사용했다. @@ -511,49 +400,25 @@ Visual Studio environment는 `VsDevCmd.bat -arch=x64 -host_arch=x64`로 설정 | Stop | not applicable | Correction Agent session은 Harness Step이 아니며 production/test/CMake를 변경하지 않았다. Full preset build/CTest를 직접 실행했다. | | Harness Python pytest | not applicable | Harness Python, Hook, agent config behavior를 변경하지 않았다. | -### 13.6 Traceability + +### 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction -| requirement id | task id | test id | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-019` | Step 10 reaction/HDF5 path; REWORK-008 | `CORR-NSNR-REACTION-PIPELINE-001` read-only audit | focused test 293 | report only | accepted full residual, constrained reaction and HDF5 physical moment mapping are identical at constrained zero-rotation DOFs; met | -| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate`; REWORK-008 | `NSNR-REF-015`, `NSNR-REF-017` via test 293 | focused test 293 and full CTest | report only | exact keys/prechecks pass, but three local reaction families exceed blocking RMS `0.01`; not met because approved reference quantity assumes unsupported local S4/MITC4 distribution agreement | -| `FESA-REQ-NSNR-034` | Step 11 model-adequacy audit | `CORR-NSNR-LINEAR-CROSSCHECK-001` | read-only HDF5/CSV audit | report only | distinguish nonlinear reaction implementation error from pre-existing formulation-sensitive local redistribution; implementation-error hypothesis rejected | - -### 13.7 Handoff Recommendation - -- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun and do not advance Step 12 until an upstream alternative is explicitly selected and approved. -- recommended narrow alternative: align nonlinear local nodal RF/RM disposition with the approved linear reference contract—keep local rows as read-only model-adequacy/physics-review evidence, while blocking reaction evidence is global force/moment equilibrium plus free-residual checks. Blocking displacement comparison remains unchanged. -- local-to-global alternative: retain reaction as a blocking external quantity only after projecting it to formulation-independent global resultant force/moment families; keep exact local nodal rows as warning/characterization evidence. -- local-blocking alternative: if exact local RF/RM rows must remain blocking, Numerical Review/Reference Model owners must supply an analytical or independent formulation-appropriate benchmark, or explicitly approve Abaqus S4 local nodal reaction distribution as an FESA MITC4 model-adequacy target after a mesh/formulation study. Implementation must not calibrate reactions to Abaqus without that decision. -- excluded alternative: tolerance relaxation, row averaging/collapse, comparator weakening or reference artifact rewriting is not acceptable. - -Each viable alternative changes blocking quantity/model-adequacy ownership in `requirements.md`, `numerical-review.md`, `reference-model.md`, `io.md` and the implementation/reference plan. Correction Agent does not select or edit those contracts. - -### 13.8 Stop Condition - -- upstream ambiguity: current contracts simultaneously disclaim Abaqus S4 internal equivalence, make linear local reaction review-only, and require the same formulation-sensitive local distribution as nonlinear blocking evidence. -- implementation stop: no nonlinear reaction computation, storage or exact-key mapping defect was reproduced; a code-only pass would alter formulation/reference meaning. -- reference artifact gap: none; required artifacts exist, remained read-only and have empty reference diff. -- environment blocker: none; configure/build/discovery completed and full CTest reproduced only the intended reference failure. -- repeated failure: `REWORK-008` classification attempt `1`; no automatic implementation correction is safe before the upstream decision. -- final stop: status `needs-upstream-decision`; Step 11 remains blocked, Step 12 remains pending, and Physics/Release remain ineligible. - -## 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction - -### 14.1 Metadata + +#### 14.1 Metadata | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` | -| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` | +| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/README.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` | | status | `corrected-for-implementation-rerun` | | owner_agent | `correction-agent` | | date | `2026-08-28` | `implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 current `step11-output.json` SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`, Coordinator dispatch, preserved attempt-1 TDD evidence와 attempt-2 Stop evidence를 source evidence로 사용했다. -### 14.2 Failure Triage + +#### 14.2 Failure Triage - classification: `harness` - normalized classification: `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied` @@ -568,7 +433,8 @@ Each viable alternative changes blocking quantity/model-adequacy ownership in `r - evidence tail: nested Codex `0.150.1`이 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe`를 선택했다. `workspace-write` runner가 `CreateProcessAsUserW failed: 5 (Access denied)`로 이를 거부해 소스 확인, RED/VERIFY 명령과 Step status update가 실행되지 않았다. Codex process 자체는 `exitCode=0`이지만 blocker agent message만 반환했으므로 Step 성공 evidence가 아니다. - state evidence: `HEAD=65b56b1755e4537b48b44476375b6235da732648`; Step 11 `pending`; Step 12 `pending`. -### 14.3 Root Cause Summary + +#### 14.3 Root Cause Summary 이번 실패는 solver, comparator 또는 `1e-8` gate defect가 아니라 Harness child launch environment defect다. @@ -580,18 +446,8 @@ Each viable alternative changes blocking quantity/model-adequacy ownership in `r 따라서 repository runner나 Step 11 implementation을 고칠 필요가 없다. Rerun launch에서 PATH predicate만 전체 WindowsApps entry를 제거하도록 바로잡으면 된다. -### 14.4 Correction Scope - -- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md` -- changed source/header/test/CMake/runner/phase files: none -- excluded upstream contracts: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`, `docs/TOLERANCE.md` -- excluded immutable evidence: `reference/**`, stored CSVs and reference inputs -- preserved dirty implementation: all existing Step 11 source, test, comparator, CMake and phase changes -- prohibited actions not performed: Harness phase execution, Step 11 implementation, Step 12, full build/CTest rerun, manual Hook execution, commit, push, `danger-full-access`, reference solver or artifact mutation - -Correction은 repository code 변경이 아니라 corrected child-launch envelope와 재실행 경계를 확정한다. Production C++ 변경이 없으므로 새 RED test는 필요하지 않다. - -### 14.5 Verification Evidence + +#### 14.5 Verification Evidence | purpose | exact command/evidence | exit/result | | --- | --- | --- | @@ -608,37 +464,3 @@ Correction은 repository code 변경이 아니라 corrected child-launch envelop | Harness Python pytest | not applicable | runner, Hook 또는 agent config를 변경하지 않았다. | Attempt-1 RED/GREEN은 recovered immutable execution evidence이며 이 correction에서 재현하거나 새로 주장한 RED가 아니다. Current code를 old threshold로 되돌리지 않았고 reference artifact도 실행·수정하지 않았다. - -### 14.6 Traceability - -| requirement id | task id | test id | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-019` | Step 11 `equilibrium-projection-and-reference-gate`; REWORK-009 | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | Step 11 agent can read/run the preserved current-arm, spatial-moment and distinct global force/moment evidence under `workspace-write` | -| `FESA-REQ-NSNR-034` | Step 11 reference gate; REWORK-009 | `NSNR-REF-020..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | implementation-owned reference checks can complete without changing disposition, reference artifacts or tolerance | -| Harness Step execution contract | `STEP11-EXECUTION-003`; `REWORK-009` | `CORR-HARNESS-SHELL-002` | user-local WindowsApps `pwsh.exe` launch | `corrections.md` | all PATH entries matching `\\WindowsApps(?:\\|$)` are absent; system Windows PowerShell launches and exact smoke exits `0` | - -### 14.7 Handoff Recommendation - -- recommendation: return `corrected-for-implementation-rerun` to Coordinator Agent and request one bounded Implementation Agent rerun of Step 11 only. -- exact launch correction: reuse the approved `STEP11-EXECUTION-003` Step11-only wrapper and change only the launch PATH filter to the following predicate after VsDevCmd x64/dependency environment setup and before `codex exec`: - - ```powershell - $step11PathEntries = $env:PATH -split ';' | Where-Object { - $_ -and $_ -notmatch '\\WindowsApps(?:\\|$)' - } - $env:PATH = $step11PathEntries -join ';' - $env:CODEX_HOME = 'C:\Users\baram\.codex' - $env:FESA_HARNESS_CODEX_SANDBOX = 'workspace-write' - ``` - -- preserve exact runtime: Codex CLI `0.150.1`; implementation-agent `gpt-5.6-terra`/`xhigh`; `--disable unified_exec`; project PreToolUse/Stop hooks; VsDevCmd x64; approved `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`. -- preflight must resolve `powershell` to `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`, leave `pwsh` unresolved, and print exact `FESA_CODEX_SHELL_SMOKE_OK` with exit `0`. -- run only Executor-selected Step 11, no `--push`; hard-stop before Step 12. Do not use `danger-full-access`, run a reference solver, mutate reference artifacts or alter runner/source/test/CMake/phase/upstream/tolerance files as part of this launch correction. - -### 14.8 Stop Condition - -- repeated failure: normalized classification count is already `2`; if the corrected all-WindowsApps filter still produces the same `CreateProcessAsUserW` failure, do not start another automatic retry. Return `needs-environment-fix` to Coordinator with the new output artifact. -- environment blocker: cleared for one bounded Step 11 rerun by the same-envelope smoke; no repository-local code fix is required. -- upstream ambiguity: none introduced by this correction; fixed `1e-8` force/moment gate and all approved contracts remain unchanged. -- reference artifact gap: none examined or changed in this correction. -- final stop: status `corrected-for-implementation-rerun`; Step 11 and Step 12 remain `pending` until Executor/Implementation owner action. diff --git a/docs/nonlinear-static-newton-raphson/numerical-review.md b/docs/nonlinear-static-newton-raphson/numerical-review.md index 0a24133..2eda86c 100644 --- a/docs/nonlinear-static-newton-raphson/numerical-review.md +++ b/docs/nonlinear-static-newton-raphson/numerical-review.md @@ -13,7 +13,7 @@ - repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/TOLERANCE.md` - decision_source: `USER-DECISION-004 option 1` - balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8` -- diagnostic_evidence: `docs/nonlinear-static-newton-raphson/corrections.md` §13, +- diagnostic_evidence: `docs/nonlinear-static-newton-raphson/lessons.md` §13, `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` - status: `pass-for-io-definition` - owner_agent: `numerical-review-agent` diff --git a/docs/nonlinear-static-newton-raphson/physics-evaluation.md b/docs/nonlinear-static-newton-raphson/physics-evaluation.md deleted file mode 100644 index 4e04b9d..0000000 --- a/docs/nonlinear-static-newton-raphson/physics-evaluation.md +++ /dev/null @@ -1,138 +0,0 @@ -# Nonlinear Static Newton-Raphson Physics Evaluation - -## 1. Metadata - -| key | value | -| --- | --- | -| feature_id | `nonlinear-static-newton-raphson` | -| source reference comparison report | `docs/nonlinear-static-newton-raphson/reference-comparison.md` | -| source reference comparison SHA-256 | `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` | -| source reference model | `docs/nonlinear-static-newton-raphson/reference-model.md` | -| source reference model SHA-256 | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | -| status | `pass-for-release-agent` | -| owner_agent | `physics-evaluation-agent` | -| date | `2026-08-28` | - -이 평가는 승인된 물리 acceptance scope와 이미 생성된 accepted-state evidence만 사용한다. -Abaqus 또는 다른 reference solver를 실행하지 않았고, 외부 solver의 내부 정식화·적분·안정화· -결과 복구 동등성을 주장하지 않는다. - -## 2. Input Evidence - -### 2.1 Gate-entry audit - -- `implementation-report.md`와 `build-test.md`의 Stage 6 owner classification은 - `pass-for-physics-evaluation`이며 full CTest `302/302`, nonlinear reference `9/9` 통과를 - 기록한다. -- Corrected required source `reference-comparison.md`는 overall handoff status를 - `pass-for-physics-evaluation`로 명시한다. Detailed verdict - `blocking-pass-with-review-only-findings`는 모든 blocking numerical family가 통과하고 six - local RF/RM findings만 review-only라는 세부 분류로 함께 유지된다. 두 status는 서로 - 모순되지 않으며 `PHYS-STATUS-001`은 해소되었다. -- `requirements.md` metadata의 `status: draft`, `approved_by: pending user re-approval` 및 - `FESA-REQ-NSNR-069`의 historical `draft` 표시는 내용상 physics blocker가 아니다. - Authoritative `coordination.md` Stage 1 record는 현재 requirements SHA-256 - `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`가 - `2026-08-27` 사용자에게 명시적으로 재승인되었고 Stage 1이 `passed`임을 기록한다. - 따라서 이 stale metadata를 승인 부재로 재해석하지 않는다. - -### 2.2 Solver outputs and logs - -| case | checked authoritative/generated evidence | SHA-256 / observed identity | -| --- | --- | --- | -| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_results.h5` | `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment | -| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_log.txt` | `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 | -| `shellnl-s4-final` | build-local `shellNL_results.h5` | `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment | -| `shellnl-s4-final` | build-local `shellNL_log.txt` | `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 | -| `shell-s4-linear-limit` | build-local `shell_results.h5`, `shell_log.txt` | HDF5 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; zero-byte log `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` | - -HDF5는 `reference-comparison.md`에 적힌 build-local exact path에서 직접 읽었다. Optional FESA -debug CSV view는 선언되거나 필요하지 않아 사용하지 않았다. Factor-one -`nodal/displacement`, `global/equilibrium`, `global/energy`, direct shell stress와 -`accepted_frames`를 확인했다. - -### 2.3 Read-only reference evidence - -Canonical reference bundle은 `reference-comparison.md`가 inventoried한 12개 exact file을 사용했다. - -- `reference/shellNL-meshfine/`: input, displacement, reaction, stress inventory -- `reference/shellNL/`: input, displacement, reaction, stress inventory -- `reference/shell/`: linear input, displacement, reaction inventory, stress inventory - -각 SHA-256은 `reference-model.md`와 `reference-comparison.md` inventory에 일치한다. 비교량은 -fine/coarse/linear `U1/U2/U3` blocking, `UR1/UR2/UR3` warning-only, fine/coarse local -`RF1/RF2/RF3`와 physical spatial `RM1/RM2` review-only다. `RM3`와 stored element-corner -stress는 numerical comparison에서 제외되었다. - -Reference model의 목적은 중앙 `DOF 3=-100000` fixed-global dead load를 받고 둘레의 all-six -DOF가 고정된 `10 x 10`, thickness `0.5` square plate의 coarse/fine nonlinear response와 -linear-limit source identity를 검증하는 것이다. Nonlinear cases는 `0.1` 간격으로 factor one까지 -진행한다. - -## 3. Physics Checks - -| physics check | result | evidence and interpretation | -| --- | --- | --- | -| global equilibrium | `pass` | Fine normalized force `2.09625758e-12`, moment `2.74546602e-10`; coarse force `8.25122661e-12`, moment `1.41375091e-10`. 네 값 모두 approved inclusive `<=1e-8`다. HDF5 `/global/equilibrium`은 `location=global-balance-error`, current arm, global origin `[0,0,0]`, spatial moment 의미를 가진다. | -| reaction consistency | `pass` | Applied `F3=-100000`에 대해 constrained-reaction resultant `F3`는 fine/coarse 모두 약 `+100000`이고 다른 force components는 roundoff 수준이다. Applied-plus-reaction force/moment와 accepted free force/moment residual이 각각 blocking gate를 통과했다. Local RF/RM six-family discrepancy는 승인 계약상 review-only nodal redistribution evidence이며 global reaction/resultant identity를 대체하지 않는다. | -| displacement direction | `pass` | Downward load에 대해 node 2 final `U3`는 fine `-2.56338e-5`, coarse `-2.35504e-5`; reference도 각각 `-2.57957054e-5`, `-2.37408203e-5`다. HDF5 path는 factor `0.1..1.0`에서 fine `-2.56338e-6 .. -2.56338e-5`, coarse `-2.35504e-6 .. -2.35504e-5`로 부호 반전·jump·rollback 없이 진행한다. | -| symmetry / expected zero | `pass` | Center node 2의 factor-one `U1/U2`와 rotations는 fine/coarse에서 약 `1e-17` 이하로, centered load와 symmetric all-edge constraint의 expected-zero response와 일치한다. Fresh physics-focused CTest에서 finite rigid objectivity, zero internal force, rigid translation nullspace와 no-moment tangent symmetry checks가 통과했다. | -| element force balance | `covered-by-approved-invariants` | 승인 HDF5에는 standalone element nodal-action balance dataset이 없고 external element-force comparison도 요구되지 않는다. 대신 complete element residual/tangent same-trial identity, patch recovery, stable assembly covariance tests와 accepted global/free equilibrium gate가 문서화된 expectation을 충족한다. 별도 element-force output을 invent하지 않았다. | -| stress/strain | `pass-sanity-evidence` | HDF5 direct fixed-reference Gauss stress는 finite다. Element 1/GP1의 `[S11,S22,S12]`는 fine bottom `[-264846,-77843.6,914.879]`, middle `[1.94695,0.530775,-0.0224511]`, top `[264850,77844.8,-914.925]`; coarse도 bottom/top sign이 반대이고 middle이 작아 centered plate bending sign/thickness pattern과 일치한다. Stored CSV는 corner/SPOS-SNEG identity로 위치가 달라 numerical stress comparison이 승인되지 않았으므로 이를 tolerance pass로 재분류하지 않는다. | -| rigid body mode | `pass` | 둘레 all-six-DOF support가 global rigid-body motion을 제거하고, accepted path에 비정상 large translation 또는 singular/nonfinite 증상이 없다. Fresh focused tests에서 proper triad/director, finite rigid objectivity, zero internal force, rigid nullspace와 invalid branch rejection을 확인했다. | -| energy/residual | `pass-sanity-evidence` | Factor-one physical strain energy는 fine `1.28169`, coarse `1.17752`로 finite positive이며 near-linear relation `0.5*100000*abs(U3_center)`와 일치한다. 이는 secondary sanity evidence이고 승인 energy convergence gate는 아니다. Fine/coarse accepted free force/moment residual은 NSNR-069 blocking gate를 통과했고 log에는 nonfinite/failed accepted state가 없다. | -| model coverage | `pass` | Fine 729-node/676-element primary, coarse 49-node/36-element companion, linear control과 internal linear-limit/tangent/objectivity/patch/rollback portfolio가 승인 NSNR-030 scope를 덮는다. Stored response는 weak geometric-nonlinear regime이고 original-style MITC4의 curved/distorted membrane-locking risk는 알려진 한계지만 Numerical Review가 이번 release의 additional benchmark/convergence gate로 승인하지 않았으므로 model-coverage gap을 새로 만들지 않는다. | - -Fresh physics-focused verification command: - -```powershell -ctest --preset windows-msvc-ninja-debug -R '^(NonlinearMitc4Shell|NonlinearMitc4Recovery|NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch|FiniteRotation|NonlinearStaticProcedure)\.' --output-on-failure -``` - -Result: `23/23` passed, exit `0`, total real time `5.12 s`. - -## 4. Failure Classification - -- blocking classification: 없음 -- resolved finding: `PHYS-STATUS-001`; corrected `reference-comparison.md`가 required overall - `pass-for-physics-evaluation` handoff와 detailed - `blocking-pass-with-review-only-findings` verdict의 관계를 명시했다. -- observed failures: `equilibrium-failure`, `reaction-inconsistency`, - `displacement-direction-failure`, `symmetry-failure`, `stress-location-failure`, - `element-force-inconsistency`, `rigid-body-mode-suspected`, `nonfinite-result`, - `model-coverage-gap`, `upstream-contract`, `environment` 모두 없음. - -## 5. Evaluation Verdict - -- verdict: `pass-for-release-agent` -- physics evidence disposition: documented equilibrium, reaction, displacement, symmetry/objectivity, - stress/strain sanity, rigid-body, residual/path and model-coverage checks show no physical failure. -- pass disposition: documented physical expectations passed and no physics/model-coverage/I/O/upstream - blocker remains. -- release meaning: this verdict authorizes Release Agent evaluation through Coordinator only. It is - not Release approval, publish/deploy/package/tag authorization, or external-solver equivalence. - -## 6. Handoff Recommendation - -- handoff: `Release Agent`, always through `Coordinator Agent` -- recommendation: Release Agent는 current approved hashes, Stage 6 - `pass-for-physics-evaluation`, 이 문서의 `pass-for-release-agent`, known limitations와 - review-only findings를 사용해 release readiness만 audit한다. -- boundary: Physics Evaluation Agent는 release readiness, final release checklist, release notes, - publish/deploy/package/tag를 승인하지 않는다. - -## 7. No-Change Assertion - -이 Stage 7 작업은 `docs/nonlinear-static-newton-raphson/physics-evaluation.md`만 생성했다. -Source code, tests, CMake, Harness, requirements, research, formulation, numerical review, -reference model, I/O contract, implementation reports, reference artifacts와 tolerance policy를 -수정하지 않았다. Abaqus, Nastran 또는 다른 reference solver를 실행하지 않았다. - -## 8. Open Issues - -| id | severity | issue | gate effect | -| --- | --- | --- | --- | -| `PHYS-META-001` | nonblocking | `requirements.md`의 draft/pending metadata가 authoritative Coordinator/user reapproval record와 stale함 | 현재 hash의 explicit approval로 physics authority는 해소됨; Release traceability audit에서 투명하게 유지 | -| `PHYS-LOCAL-001` | nonblocking | six local RF/RM families have review-only discrepancies | approved disposition 유지; global force/moment balance와 free residual을 blocking evidence로 사용 | -| `PHYS-STRESS-001` | nonblocking | stored corner/SPOS-SNEG stress와 FESA direct Gauss recovery 위치가 다르고 fine optional stress row 하나의 node label이 malformed | stress numerical comparison 제외 유지; artifact를 repair하지 않음 | -| `PHYS-LIMIT-001` | known limitation | stored cases are weak geometric-nonlinear plate responses; original MITC4 has known curved/distorted membrane-locking risk | approved current portfolio에서는 blocker 아님; broader claim 금지 | diff --git a/docs/nonlinear-static-newton-raphson/reference-comparison.md b/docs/nonlinear-static-newton-raphson/reference-comparison.md deleted file mode 100644 index 22e156f..0000000 --- a/docs/nonlinear-static-newton-raphson/reference-comparison.md +++ /dev/null @@ -1,112 +0,0 @@ -# Nonlinear Static Newton-Raphson Reference Comparison - -## Verdict - -`blocking-pass-with-review-only-findings`. FESA HDF5 is the authoritative solver output. The -Abaqus CSV files are read-only external comparison evidence; the observed agreement does not imply -Abaqus S4 internal formulation, integration, stabilization, or recovery equivalence. - -Overall handoff status: `pass-for-physics-evaluation`. This handoff classification records that -all blocking comparisons passed; the detailed verdict above remains -`blocking-pass-with-review-only-findings` because the six local RF/RM findings are review-only. - -The literal execution order was `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. - -The `COMPARE` commands were -`ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` -(exit 0, 905.404 s, 9/9 passed), followed by -`ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` -(exit 0, 930.617 s, 9/9 matched tests passed). The fresh full CTest run then passed 302/302; -its command and output tail are recorded in `build-test.md`. - -## Artifact check - -Every input, displacement CSV, reaction CSV, and stress-inventory CSV was readable, finite where -required, unique by declared source key, and identical before and after all copied-input executions. - -| case / role | exact path | bytes | pre/post UTC mtime | SHA-256 | -| --- | --- | ---: | --- | --- | -| fine primary input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `2026-08-25T13:53:49.1919675Z` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | -| fine U | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `2026-08-25T14:06:00.1262830Z` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | -| fine local reaction | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 108,951 | `2026-08-25T14:05:06.2950127Z` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | -| fine stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | 1,036,869 | `2026-08-25T14:04:24.2027682Z` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | -| coarse companion input | `reference/shellNL/shellNL.inp` | 4,778 | `2026-08-23T16:36:23.9302881Z` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | -| coarse U | `reference/shellNL/shellNL displacements.csv` | 7,542 | `2026-08-23T16:36:23.9282815Z` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | -| coarse local reaction | `reference/shellNL/shellNL reactions.csv` | 7,443 | `2026-08-23T16:36:23.9292877Z` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | -| coarse stress inventory | `reference/shellNL/shellNL stresses.csv` | 54,720 | `2026-08-23T16:36:23.9302881Z` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | -| linear control input | `reference/shell/shell.inp` | 4,770 | `2026-08-23T16:36:23.9272805Z` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | -| linear U | `reference/shell/shell displacements.csv` | 5,592 | `2026-08-23T16:36:23.9262810Z` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | -| linear reaction inventory | `reference/shell/shell reactions.csv` | 5,524 | `2026-08-23T16:36:23.9262810Z` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | -| linear stress inventory | `reference/shell/shell stresses.csv` | 43,502 | `2026-08-23T16:36:23.9272805Z` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | - -Fine and coarse required nonlinear CSV rows had exact `Frame=Increment 10: Step Time = 1.000`. -The HDF5 `/steps/Step-1/accepted_frames` table had exactly one factor-one row: frame 9, increment -10, load factor 1.0, two Newton iterations. Reference copies and generated artifacts were confined -to these build-local directories: - -| case | copied input | generated results / log | -| --- | --- | --- | -| fine | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_results.h5`, SHA-256 `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_log.txt`, SHA-256 `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27` | -| coarse | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_results.h5`, SHA-256 `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_log.txt`, SHA-256 `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906` | -| linear | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_results.h5`, SHA-256 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_log.txt`, zero bytes, SHA-256 `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` | - -## Compare and classify - -Rows were matched by `(case_id, accepted_state, canonical_instance_name, source_node_label, -component)`, never CSV order. Required HDF5 projections were factor-one -`/steps/Step-1/frames/9/nodal/displacement`, `generalized_internal_force`, -`generalized_external_force`, `generalized_residual`, `reaction`, `/model/nodal_constraint_mask`, -and `/global/equilibrium`; the linear control uses `/steps/Step-1/frames/0/nodal/displacement`. -All required source keys, components, uniqueness and finite checks passed before tolerance. - -External families use `docs/TOLERANCE.md`: reference-only scale, near-zero band `0.01*S`, row -relative limit `0.05`, and family RMS limit `0.01`. `rows passed` is the deterministic per-row -decision count; U is blocking and UR is warning-only. - -| family | disposition | rows passed | scale | max abs | max relative | relative RMS | result | -| --- | --- | ---: | ---: | ---: | ---: | ---: | --- | -| fine.translation | blocking | 2187/2187 | 2.57957054e-05 | 1.6193812501e-07 | 6.27771648e-03 | 2.27230258e-04 | pass | -| fine.rotation | warning-only | 2187/2187 | 6.58704994e-06 | 3.0109969916e-08 | 3.54510604e-02 | 4.68253850e-04 | pass | -| coarse.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037855439e-07 | 8.57111694e-03 | 1.03327572e-03 | pass | -| coarse.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828551252e-08 | 4.69071871e-02 | 2.97713732e-03 | pass | -| linear.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037853492e-07 | 8.57111604e-03 | 1.03327567e-03 | pass | -| linear.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828549627e-08 | 4.69071860e-02 | 2.97713730e-03 | pass | - -Worst absolute rows were fine U `PART-1-1/node 2/U3`, fine UR -`PART-1-1/node 442/UR1`, coarse U `PART-1-1/node 2/U3`, coarse UR -`PART-1-1/node 37/UR1`, linear U `PART-1-1/node 2/U3`, and linear UR -`PART-1-1/node 44/UR1`. No warning-only family failed. - -The eight blocking internal families are independent of Abaqus CSV tolerance. - -| family | rows | numerator | scale | metric | gate | result | -| --- | ---: | ---: | ---: | ---: | --- | --- | -| fine.global_force_balance | 3 | 2.6775524023e-07 | 1.2773012379e+05 | 2.09625758e-12 | `<=1e-8` | pass | -| fine.global_moment_balance | 3 | 1.3258637157e-04 | 4.8292847478e+05 | 2.74546602e-10 | `<=1e-8` | pass | -| fine.accepted_free_force_residual | 1875 | 3.8659904671e-03 | 1.0000000000e+05 | 3.86599047e-08 | `<=1e-2` | pass | -| fine.accepted_free_moment_residual | 1875 | 1.3760745787e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass | -| coarse.global_force_balance | 3 | 8.2512269735e-07 | 1.0000000439e+05 | 8.25122661e-12 | `<=1e-8` | pass | -| coarse.global_moment_balance | 3 | 4.1788609354e-05 | 2.9558678960e+05 | 1.41375091e-10 | `<=1e-8` | pass | -| coarse.accepted_free_force_residual | 75 | 3.1462885132e-02 | 1.0000000000e+05 | 3.14628851e-07 | `<=1e-2` | pass | -| coarse.accepted_free_moment_residual | 75 | 3.3292052422e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass | - -The constrained-reaction resultant remains a distinct review summary: fine force -`[1.2306822228e-12, -3.5943123478e-12, 1.0000000000e+05]`, moment -`[2.7057467378e-11, -5.6934368331e-10, -1.3258637157e-04]`; coarse force -`[7.9591888635e-12, 7.2906680693e-12, 1.0000000000e+05]`, moment -`[-1.7826096155e-10, -2.5829649530e-10, -4.1788609352e-05]`. - -Local reaction RF/RM source-key/inventory/finite prechecks passed, but the following direct -row/RMS findings remain review-only and therefore do not change the blocking classification. - -| review family | rows passed | relative RMS | worst absolute row | finding | -| --- | ---: | ---: | --- | --- | -| coarse in-plane RF | 4/48 | 1.1437709953e-01 | node 3/RF1, 5.3914239451e-01 | review-only failure | -| coarse RF3 | 4/24 | 4.8448360241e-02 | node 31/RF3, 7.1995422354e+02 | review-only failure | -| coarse physical RM1/RM2 | 32/48 | 2.7464126167e-02 | node 22/RM1, 1.0484921048e+03 | review-only failure | -| fine in-plane RF | 12/208 | 1.1971372918e-01 | node 1/RF2, 1.5298653299e-01 | review-only failure | -| fine RF3 | 92/104 | 5.3476362434e-03 | node 9/RF3, 4.6176964624e+01 | review-only row failure | -| fine physical RM1/RM2 | 112/208 | 3.3719303859e-03 | node 52/RM2, 3.1549617088e+01 | review-only row failure | - -`RM3` and stress were not numerically compared. Artifact inventory, byte size, timestamp, and -SHA-256 equality before/after all runs prove that no reference artifact changed. diff --git a/docs/nonlinear-static-newton-raphson/release.md b/docs/nonlinear-static-newton-raphson/release.md index 6e4d182..332ddc8 100644 --- a/docs/nonlinear-static-newton-raphson/release.md +++ b/docs/nonlinear-static-newton-raphson/release.md @@ -1,5 +1,9 @@ # Nonlinear Static Newton-Raphson Release Readiness +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + ## 1. Metadata | key | value | @@ -16,143 +20,15 @@ Literal `feature_id`를 선언한 모든 source report는 `nonlinear-static-newton-raphson`과 일치한다. `reference-comparison.md`에는 literal `feature_id` field가 없지만 exact bundle path -`docs/nonlinear-static-newton-raphson/reference-comparison.md`, title, current SHA-256와 Stage 6 +`docs/nonlinear-static-newton-raphson/verification.md`, title, current SHA-256와 Stage 6 handoff chain, 그리고 Physics report의 exact source hash가 같은 feature에 결정적으로 연결한다. 상충하는 feature identity는 없으므로 upstream report를 변경하지 않고 nonblocking metadata omission으로 기록한다. `requirements.md`의 `status: draft`, `approved_by: pending user re-approval`과 `FESA-REQ-NSNR-069 status: draft`는 stale metadata다. -Authoritative `coordination.md`는 현재 exact requirements hash가 `2026-08-27` 사용자에게 명시적으로 -재승인되었고 Stage 1이 `passed`임을 기록한다. Current Stage 4/5/6 문서도 같은 hash를 입력으로 +당시 Authoritative `coordination.md`는 그 requirements의 exact hash가 `2026-08-27` 사용자에게 명시적으로 +재승인되었고 Stage 1이 `passed`임을 기록한다. 당시 Stage 4/5/6 문서도 같은 hash를 입력으로 사용하므로 실제 승인·수치 계약과의 모순은 없다. -## 2. Release Scope - -### Included - -- No-prior-history baseline에서 정확히 하나의 geometrically nonlinear static step을 수행하는 별도 - `Full Newton-Raphson` procedure. -- Fixed-initial-reference Total Lagrangian `FESA-MITC4`; source `S4`와 `S4R`은 같은 internal - formulation과 `2 x 2 x 2` integration에 매핑된다. -- Homogeneous isotropic materially linear elasticity, centered single-layer shell section, - six global nodal DOFs와 committed/trial finite-rotation triad/director state. -- Fixed scalar load-factor increments, final factor-one shortening, common proportional path, - fixed-global dead `*CLOAD`, factor-one absolute `*BOUNDARY` target. -- Same-trial residual/consistent tangent, fresh factorization/solve, four-channel convergence, - iteration limit `100`, no line search/cutback/retry. -- Accepted-increment-only HDF5 schema version `1`, deterministic Newton text log, atomic candidate/final - result lifecycle, stable source/result/diagnostic ordering. -- Factor-one accepted free residual과 current-arm/spatial-moment global applied-plus-reaction force/moment - balance; normalized global force와 moment gate는 각각 inclusive `<=1e-8`이다. -- Fine nonlinear primary, coarse nonlinear companion, linear control reference portfolio. External - `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는 warning-only, local RF/RM은 review-only다. - -### Supported input and output subset - -- 주요 supported input: `*HEADING`, `*PART`, `*NODE`, `*NSET`, `*ELEMENT` (`S4`/`S4R`), - `*ELSET`, `*MATERIAL`, `*ELASTIC`, `*SHELL SECTION`, one identity `*ASSEMBLY`/`*INSTANCE`, - `*BOUNDARY`, `*CLOAD`, one `*STEP, NLGEOM=YES`, one four-value `*STATIC`. -- Exact allowlisted `VARIABLE=PRESELECT` output requests와 일부 generator/restart output syntax는 - warning no-op이며 FESA mandatory output을 바꾸지 않는다. -- Public invocation은 `fesa.exe `다. Authoritative output은 input sibling - `_results.h5`, current-run diagnostic은 `_log.txt`다. Literal `--output`을 포함한 - argv token은 compatibility alias 없이 pre-input exit `2`로 거부한다. -- CSV는 external reference 또는 deterministic debug view일 뿐 FESA official output이 아니다. - -### Excluded - -- Material nonlinearity/history, Updated Lagrangian, corotational procedure, multiple/mixed nonlinear - steps와 cross-step propagation. -- Modified/quasi-Newton, tangent reuse, line search, damping, adaptive growth/cutback/retry, - controlled-displacement와 arc-length/path-following. -- Follower/non-proportional/distributed/body/pressure/edge loads, `*DLOAD`, contact, MPC, transforms, - amplitude, composite/offset/oriented shell section과 unsupported model-affecting keywords. -- Reduced integration/hourglass behavior selected by source `S4R`, MITC4+, trial-state HDF5 history, - nodal stress extrapolation/averaging, `RM3`와 stored stress numerical comparison. -- Abaqus, Midas 또는 다른 solver의 formulation, integration, stabilization, state update, - recovery 또는 internal algorithm equivalence claim. - -## 3. Gate Evidence Inventory - -| gate artifact | current SHA-256 | audited status / release disposition | -| --- | --- | --- | -| `requirements.md` | `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` | Coordinator Stage 1 `passed`; current hash explicitly user re-approved; 24/24 must records and Matrix rows | -| `research.md` | raw `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` | `passed`; LF-normalized hash matches recorded approved `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` | -| `formulation.md` | `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` | `ready-for-numerical-review`; Coordinator Stage 3 `passed`, explicit user approval; current Stage 4 review found no formulation defect | -| `numerical-review.md` | `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` | `pass-for-io-definition`; blockers 없음 | -| `reference-model.md` | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | `pass-for-io-definition`; required files present, exact family/disposition contract complete | -| `io.md` | raw `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9` | `ready-for-coordinator-review`; Coordinator Stage 5 `passed`; LF-normalized hash `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB` | -| `implementation-plan.md` | `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C` | `ready-for-implementation`; 24/24 requirement-to-Step/test mapping | -| `corrections.md` | `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A` | Historical environment/upstream issues resolved; current status `corrected-for-implementation-rerun`, followed by passing Step 11/12 evidence | -| `implementation-report.md` | `D75C8B5922C9EEF7C7262B01BFB12D5F7609B1A6DB3A7C6D5AE47CB45ADAD578` | `pass-for-physics-evaluation`; no implementation-owned blocker | -| `build-test.md` | `ED6B1B6CFD9478B09B92E7ADE3891622FEA1AA521AD29550D6F4C78C952E8DDA` | full CTest `302/302`; all recorded commands exit `0` | -| `reference-comparison.md` | `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` | overall `pass-for-physics-evaluation`; detailed `blocking-pass-with-review-only-findings`; reference `9/9` | -| `physics-evaluation.md` | `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538` | `pass-for-release-agent`; blockers 없음 | - -Historical source hashes embedded in earlier research/formulation metadata reflect their original gate inputs. -Current Numerical Review, I/O, Planning, Implementation, reference and Physics reports consume or audit the -current approved hashes and report no semantic contradiction. No stale or failed gate overrides this inventory. - -## 4. Acceptance Traceability - -`N/A (internal)`은 해당 acceptance가 external reference value가 아니라 deterministic CTest/invariant로 -검증된다는 뜻이다. 모든 row의 final disposition은 current release scope에서 `included-pass`다. - -| requirement id | acceptance criterion | test id / passing evidence | reference model id | verification report | release disposition | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-NSNR-001` | 정확히 한 supported source/semantic nonlinear step만 별도 procedure를 선택하고 zero/multiple/mixed는 increment 전 fail-closed | `NSNR-IO-*`, `NSNR-PROC-*`; full CTest `302/302` | N/A (internal) | `implementation-plan.md`, `build-test.md` | `included-pass` | -| `FESA-REQ-NSNR-003` | `S4/S4R`를 homogeneous isotropic materially linear geometric-only FESA-MITC4로 처리하고 material/combined nonlinearity는 거부 | `NSNR-IO-*`, `NSNR-ELEM-*`, `NSNR-PROC-*` | `shellnl-meshfine-s4-final`, `shellnl-s4-final`, `shell-s4-linear-limit` | `implementation-report.md`, `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-041` | 모든 increment가 하나의 fixed initial reference를 유지하고 current geometry로 re-base하지 않음 | `NSNR-IO-*`, `NSNR-ELEM-KIN-*`, `NSNR-PROC-*` | N/A (internal TL/objectivity) | `implementation-plan.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-074` | global six DOF, dimensionless rotation correction, separate trial/committed proper triad/director와 multiplicative update/rollback | `NSNR-ROT-*`, `NSNR-STATE-*`, `NSNR-PROC-*`; Physics focused suite 포함 | N/A (internal invariant) | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-006` | residual/tangent/factorization/correction이 동일 trial이고 entered iteration마다 fresh factorization/solve | `NSNR-ELEM-TAN-*`, `NSNR-SOLVER-*`, `NSNR-PROC-*` | N/A (internal tangent) | `implementation-plan.md`, `build-test.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-007` | free residual과 same-iteration correction의 네 channel을 logical AND로 통과하고 constrained residual은 reaction으로 유지 | `NSNR-CTRL-021`, `NSNR-PROC-*`, `NSNR-REF-019`; control/log `14/14` | `shellnl-meshfine-s4-final`, `shellnl-s4-final` | `implementation-report.md`, `reference-comparison.md` | `included-pass` | -| `FESA-REQ-NSNR-069` | matching external residual scale nonzero 시 relative `<=1e-2`, exact zero 시 typed force/moment absolute `<=1e-3` | `NSNR-CTRL-018..020`, `NSNR-LOG-012`, `NSNR-REF-019`; exact-zero fine/coarse moment residual pass | `shellnl-meshfine-s4-final`, `shellnl-s4-final` | `implementation-report.md`, `reference-comparison.md` | `included-pass` | -| `FESA-REQ-NSNR-070` | translation/rotation correction을 nonzero relative 또는 typed exact-zero gate로 각각 inclusive 판정 | `NSNR-CTRL-021`, `NSNR-PROC-*`; control/log `14/14` | N/A (internal convergence) | `implementation-report.md`, `build-test.md` | `included-pass` | -| `FESA-REQ-NSNR-008` | required Newton data finite, iteration `1..100`, iteration 100 pass 허용, iteration 101 금지 | `NSNR-CTRL-020`, `NSNR-PROC-*`, `NSNR-REF-019` | fine/coarse logs: accepted increments each use two iterations | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-014` | fresh correction을 변경 없이 적용하고 line search/damping/fallback/energy gate를 사용하지 않음 | `NSNR-CTRL-*`, `NSNR-PROC-*` | N/A (internal lifecycle) | `implementation-plan.md`, `build-test.md` | `included-pass` | -| `FESA-REQ-NSNR-046` | fixed positive factor increment, factor one final shortening, growth/cutback/retry 없음 | `NSNR-CTRL-*`, `NSNR-PROC-*` | fine/coarse factor `0.1..1.0`, unique factor-one frame | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-048` | 모든 approved CLOAD/BOUNDARY target이 하나의 common proportional factor를 사용 | `NSNR-CTRL-*`, `NSNR-PROC-*` | fine/coarse nonlinear load path | `implementation-plan.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-018` | CLOAD force/moment source direction은 fixed global dead load이고 follower tangent가 없음 | `NSNR-CTRL-*`, `NSNR-PROC-*` | fine/coarse centered fixed-global `F3=-100000` | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-063` | prescribed BOUNDARY는 factor-one absolute target이고 constrained correction과 분리되며 failure 시 start state 보존 | `NSNR-CTRL-*`, `NSNR-PROC-*`, `NSNR-PROC-019` | N/A (nonzero prescribed-motion internal case) | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-016` | nonlinear STATIC 네 값을 exact arity/finite/positive/endpoint rule로 mapping하고 third/fourth는 stepping에 미사용 | `NSNR-IO-*`, `NSNR-CTRL-*` | fine/coarse `*STATIC 0.1,1.,0.001,0.1` | `io.md`, `reference-model.md`, `build-test.md` | `included-pass` | -| `FESA-REQ-NSNR-011` | trial state를 분리하고 converged complete state만 atomic commit하며 모든 실패에서 prior state/final 보존 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` | fine/coarse accepted-frame evidence; failure paths internal | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-019` | stable source/order와 free residual, constrained resultant, applied-plus-reaction balance를 분리하고 current arm/spatial moment 사용 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022/024/025`; procedure/writer `7/7` | `shellnl-meshfine-s4-final`, `shellnl-s4-final` | `implementation-report.md`, `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-020` | approved element/material/load/boundary/step/solver inventory 밖의 meaning을 authoritative output 전 fail-closed | `NSNR-IO-*` negative inventory | N/A (internal rejection) | `io.md`, `implementation-plan.md`, `build-test.md` | `included-pass` | -| `FESA-REQ-NSNR-021` | committed increment와 accepted HDF5 frame이 일대일이고 factor one 포함, trial history 없음, failed candidate는 final이 아님 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-HDF5-014` | fine/coarse 10 accepted frames, unique frame 9/increment 10/factor 1 | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-024` | invocation-start log replacement과 entered iteration당 deterministic summary 하나, controlled failure에도 current log 유지 | `NSNR-LOG-012`, `NSNR-PROC-*`, `NSNR-REF-019`; `NewtonIterationLog.*` `8/8` | fine/coarse 20 records, two per increment | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-083` | derived result/log names, every literal `--output` form pre-input exit `2`, no alias, independent asymmetric lifecycles와 linear regression | `NSNR-CLI-*`, `NSNR-PROC-*`, `NSNR-EVID-*` | all three stored case executions use derived sibling outputs | `implementation-report.md`, `build-test.md`, `reference-comparison.md` | `included-pass` | -| `FESA-REQ-NSNR-026` | factor/iteration/assembly/frame/result/log ordering이 same input/runtime에서 deterministic | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-020..023`, `NSNR-EVID-*`; reference `9/9` twice | all three stored cases | `implementation-report.md`, `reference-comparison.md` | `included-pass` | -| `FESA-REQ-NSNR-030` | linear limit, tangent, global balance/free residual, symmetry/objectivity와 commit/rollback portfolio가 모두 통과 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-014`, `NSNR-PROC-019`, `NSNR-REF-022/024/025`; Physics focused `23/23` | fine primary, coarse companion, linear control | `build-test.md`, `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | -| `FESA-REQ-NSNR-034` | exact source/component precheck 후 U blocking, UR warning-only, RF/RM review-only, RM3/stress excluded, common external tolerance 적용 | `NSNR-REF-020..023`, `NSNR-EVID-003..007`; nonlinear reference `9/9` | fine primary, coarse companion, linear control | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | - -## 5. Validation Evidence - -Fresh Stage 6 commands and results are recorded in `build-test.md`: - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -- Configure/build/discovery: exit `0`; 302 tests discovered. -- Focused control/log `14/14`, procedure/writer `7/7`. -- Nonlinear reference `9/9`; extended matched reference `9/9`. -- Full MSVC x64 Debug CTest `302/302`, failed-test inventory 없음, 새 compiler/linker warning 없음. -- Stage 7 Physics-focused CTest `23/23`, exit `0`. -- Harness Python pytest는 Step 12가 Python, hooks 또는 agent configuration을 변경하지 않아 applicable하지 - 않았고 필수 제품 검증으로 재분류하지 않았다. -- `reference-comparison.md`: overall `pass-for-physics-evaluation`; external translation blocking families, - warning-only UR families와 eight internal blocking families 통과. Global balance metrics의 worst value는 - fine moment `2.74546602e-10 <=1e-8`이다. -- `physics-evaluation.md`: `pass-for-release-agent`; equilibrium, reactions, displacement direction/path, - symmetry/objectivity, stress sanity, rigid-body, energy/residual과 model coverage에 물리 blocker 없음. -- Declared canonical reference 12개는 current SHA-256가 `reference-model.md`와 일치하고 tracked diff가 없다. - ## 6. Known Limitations 1. Coarse/fine local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`에는 six review-only @@ -179,48 +55,6 @@ ctest --preset windows-msvc-ninja-debug --output-on-failure 10. Numerical agreement은 Abaqus formulation, integration, stabilization, state update 또는 recovery의 internal equivalence evidence가 아니다. -## 7. Release Notes Draft - -### 기능 요약 - -FESA에 fixed-initial-reference Total Lagrangian 기반 geometric-nonlinear `FESA-MITC4` static -procedure가 추가되었다. Solver는 fixed load-factor path에서 Full Newton-Raphson을 수행하고, -수렴한 increment만 HDF5 schema v1 accepted frame으로 commit한다. Trial/committed finite-rotation state, -deterministic per-iteration log, rollback-safe output lifecycle, current-arm/spatial-moment global equilibrium -evidence를 포함한다. - -### 사용과 산출물 - -- 실행: `fesa.exe ` -- 결과: input sibling `_results.h5` -- 진단: input sibling `_log.txt` -- 지원 핵심 범위: one `*STEP, NLGEOM=YES`, one four-value `*STATIC`, source `S4/S4R`, isotropic - linear elastic shell, `*CLOAD`, `*BOUNDARY`의 approved subset. -- Literal `--output`은 제거되었고 alias/deprecation form 없이 exit `2`로 거부된다. - -### 검증 범위 - -MSVC x64 Debug full CTest `302/302`, nonlinear/extended reference `9/9`, Physics focused `23/23`이 -통과했다. Fine/coarse nonlinear plate와 linear control의 `U1/U2/U3` blocking comparison, -warning-only UR, accepted free residual 및 normalized global force/moment `<=1e-8`을 검증했다. - -### 사용자에게 알려진 제한 - -Local nodal RF/RM discrepancy는 review-only이며 `RM3`와 stored stress comparison은 제외된다. -Fine optional stress CSV의 malformed node label은 read-only로 유지한다. UR은 warning-only다. -Stored nonlinear cases는 weak response이고 original MITC4는 curved/distorted mesh membrane-locking 위험이 -있으므로 broader large-response, locking-free 또는 external-solver internal-equivalence claim을 하지 않는다. -Material nonlinearity, multiple/mixed steps, follower/distributed loads, line search/cutback/retry, -arc-length와 broad Abaqus keyword compatibility는 지원 범위 밖이다. - -### Evidence artifacts - -- `docs/nonlinear-static-newton-raphson/implementation-report.md` -- `docs/nonlinear-static-newton-raphson/build-test.md` -- `docs/nonlinear-static-newton-raphson/reference-comparison.md` -- `docs/nonlinear-static-newton-raphson/physics-evaluation.md` -- Authoritative solver artifact: each input sibling `_results.h5` - ## 8. Release Verdict - verdict: `ready-for-release` @@ -241,15 +75,6 @@ Coordinator Agent가 이 보고서의 exact path/hash와 `ready-for-release`를 sub-agent rework는 필요하지 않다. 사용자가 요청한 commit/push는 Coordinator/root가 Release gate audit 후 별도로 수행해야 하며, 이 Release Agent는 commit, push, tag 또는 publish를 수행하지 않는다. -## 10. No-Change Assertion - -이 Stage 8 작업은 `docs/nonlinear-static-newton-raphson/release.md` 하나만 생성했다. Coordinator가 -동시에 소유한 pre-existing `coordination.md` 변경은 읽기만 했고 수정·revert하지 않았다. Source code, -headers, tests, CMake, Harness, requirements, research, formulation, numerical review, reference model, -I/O, implementation/physics reports, reference artifacts와 `docs/TOLERANCE.md`를 변경하지 않았다. -Abaqus, Nastran 또는 다른 reference solver, build, CTest, Harness, publish/deploy/package/tag 작업을 -실행하지 않았다. - ## 11. Open Issues Blocking open issue는 없다. @@ -264,3 +89,5 @@ Blocking open issue는 없다. Missing required report, failed pass status, unresolved defect, missing declared comparison file 또는 contradictory acceptance evidence는 발견되지 않았다. + +현재 build·reference·물리 실행 기록은 [검증 보고서](verification.md)에 통합했다. 과거 readiness와 현재 재검증 필요를 구분하며 이 정리는 새로운 release 감사가 아니다. diff --git a/docs/nonlinear-static-newton-raphson/verification.md b/docs/nonlinear-static-newton-raphson/verification.md new file mode 100644 index 0000000..dca8308 --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/verification.md @@ -0,0 +1,323 @@ +# MITC4 비선형 정적 해석 검증과 한계 + +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + +아래 날짜·revision·명령·수치는 당시 실제 실행 기록이다. 문서 정리에서 solver를 다시 실행하지 않았다. +현재 계약은 [요구사항](requirements.md), [정식화](formulation.md), [I/O](io.md), [공통 tolerance](../TOLERANCE.md)를 따른다. [과거 release 판정](release.md)의 재검증 경계도 유지한다. + + + + +## Nonlinear Static Newton-Raphson Build and Test Report + + +### Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| owner_agent | `implementation-agent` | +| working directory | `C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson` | +| configuration | `windows-msvc-ninja-debug`, x64 Debug | +| compiler | MSVC `cl.exe` from VS 18, toolset `14.51.36231` | +| generator | Ninja | +| dependency configuration | `FESA_GTEST_SOURCE_DIR=C:/git/googletest`; MKL `2026.1`; TBB `2023.1`; HDF5 `2.1.1` | +| final classification | none; all commands passed | + + +### Fresh command log + +| stage | command | exit | duration | output tail | +| --- | --- | ---: | ---: | --- | +| configure | `cmake --preset windows-msvc-ninja-debug` | 0 | 1.066 s | `Configuring done`; `Generating done`; build files written to `.harness/build-ninja-msvc-debug` | +| build | `cmake --build --preset windows-msvc-ninja-debug` | 0 | 0.113 s | `ninja: no work to do.` | +| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | 0 | 0.219 s | 302 tests discovered | +| focused control/log | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure` | 0 | 0.471 s | 14/14 passed | +| focused procedure/writer | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure` | 0 | 2.524 s | 7/7 passed | +| nonlinear reference | `ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` | 0 | 905.404 s | 9/9 passed | +| extended reference | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` | 0 | 930.617 s | 9/9 matched tests passed | +| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | 0 | 956.498 s | 302/302 passed; integration 16, unit 256, reference 30 | + +The full CTest output reported no failed-test inventory. The build emitted no compiler/linker +output beyond `ninja: no work to do.`; the build tree audit found no new `warning C####` or +`: warning:` record. The only diagnostic setup issue was that standalone HDF5 inspection tools +need Intel `libmmd.dll` on `PATH`; this did not affect the staged test executables, CMake build, or +CTest and is not a product failure. + + +### Results and handoff + +The selected `.harness/config.json` preset was used throughout. All commands were run from the +repository root in an x64 VsDevCmd environment. The final status is +`pass-for-physics-evaluation`; no Harness Python command was required because this Step did not +change Python, hooks, or agent configuration. + +This Step changed documentation and its own phase status only. It did not modify C++ production, +tests, CMake, Harness configuration, tolerance, reference artifacts, or output data. The immutable +reference artifact audit before and after comparison was identical; see `reference-comparison.md`. + + + + +## Nonlinear Static Newton-Raphson Reference Comparison + + +### Verdict + +`blocking-pass-with-review-only-findings`. FESA HDF5 is the authoritative solver output. The +Abaqus CSV files are read-only external comparison evidence; the observed agreement does not imply +Abaqus S4 internal formulation, integration, stabilization, or recovery equivalence. + +Overall handoff status: `pass-for-physics-evaluation`. This handoff classification records that +all blocking comparisons passed; the detailed verdict above remains +`blocking-pass-with-review-only-findings` because the six local RF/RM findings are review-only. + +The literal execution order was `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. + +The `COMPARE` commands were +`ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` +(exit 0, 905.404 s, 9/9 passed), followed by +`ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` +(exit 0, 930.617 s, 9/9 matched tests passed). The fresh full CTest run then passed 302/302; +its command and output tail are recorded in `build-test.md`. + + +### Artifact check + +Every input, displacement CSV, reaction CSV, and stress-inventory CSV was readable, finite where +required, unique by declared source key, and identical before and after all copied-input executions. + +| case / role | exact path | bytes | pre/post UTC mtime | SHA-256 | +| --- | --- | ---: | --- | --- | +| fine primary input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `2026-08-25T13:53:49.1919675Z` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | +| fine U | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `2026-08-25T14:06:00.1262830Z` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | +| fine local reaction | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 108,951 | `2026-08-25T14:05:06.2950127Z` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | +| fine stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | 1,036,869 | `2026-08-25T14:04:24.2027682Z` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | +| coarse companion input | `reference/shellNL/shellNL.inp` | 4,778 | `2026-08-23T16:36:23.9302881Z` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | +| coarse U | `reference/shellNL/shellNL displacements.csv` | 7,542 | `2026-08-23T16:36:23.9282815Z` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | +| coarse local reaction | `reference/shellNL/shellNL reactions.csv` | 7,443 | `2026-08-23T16:36:23.9292877Z` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | +| coarse stress inventory | `reference/shellNL/shellNL stresses.csv` | 54,720 | `2026-08-23T16:36:23.9302881Z` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | +| linear control input | `reference/shell/shell.inp` | 4,770 | `2026-08-23T16:36:23.9272805Z` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | +| linear U | `reference/shell/shell displacements.csv` | 5,592 | `2026-08-23T16:36:23.9262810Z` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | +| linear reaction inventory | `reference/shell/shell reactions.csv` | 5,524 | `2026-08-23T16:36:23.9262810Z` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | +| linear stress inventory | `reference/shell/shell stresses.csv` | 43,502 | `2026-08-23T16:36:23.9272805Z` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | + +Fine and coarse required nonlinear CSV rows had exact `Frame=Increment 10: Step Time = 1.000`. +The HDF5 `/steps/Step-1/accepted_frames` table had exactly one factor-one row: frame 9, increment +10, load factor 1.0, two Newton iterations. Reference copies and generated artifacts were confined +to these build-local directories: + +| case | copied input | generated results / log | +| --- | --- | --- | +| fine | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_results.h5`, SHA-256 `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_log.txt`, SHA-256 `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27` | +| coarse | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_results.h5`, SHA-256 `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_log.txt`, SHA-256 `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906` | +| linear | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_results.h5`, SHA-256 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_log.txt`, zero bytes, SHA-256 `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` | + + +### Compare and classify + +Rows were matched by `(case_id, accepted_state, canonical_instance_name, source_node_label, +component)`, never CSV order. Required HDF5 projections were factor-one +`/steps/Step-1/frames/9/nodal/displacement`, `generalized_internal_force`, +`generalized_external_force`, `generalized_residual`, `reaction`, `/model/nodal_constraint_mask`, +and `/global/equilibrium`; the linear control uses `/steps/Step-1/frames/0/nodal/displacement`. +All required source keys, components, uniqueness and finite checks passed before tolerance. + +External families use `docs/TOLERANCE.md`: reference-only scale, near-zero band `0.01*S`, row +relative limit `0.05`, and family RMS limit `0.01`. `rows passed` is the deterministic per-row +decision count; U is blocking and UR is warning-only. + +| family | disposition | rows passed | scale | max abs | max relative | relative RMS | result | +| --- | --- | ---: | ---: | ---: | ---: | ---: | --- | +| fine.translation | blocking | 2187/2187 | 2.57957054e-05 | 1.6193812501e-07 | 6.27771648e-03 | 2.27230258e-04 | pass | +| fine.rotation | warning-only | 2187/2187 | 6.58704994e-06 | 3.0109969916e-08 | 3.54510604e-02 | 4.68253850e-04 | pass | +| coarse.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037855439e-07 | 8.57111694e-03 | 1.03327572e-03 | pass | +| coarse.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828551252e-08 | 4.69071871e-02 | 2.97713732e-03 | pass | +| linear.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037853492e-07 | 8.57111604e-03 | 1.03327567e-03 | pass | +| linear.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828549627e-08 | 4.69071860e-02 | 2.97713730e-03 | pass | + +Worst absolute rows were fine U `PART-1-1/node 2/U3`, fine UR +`PART-1-1/node 442/UR1`, coarse U `PART-1-1/node 2/U3`, coarse UR +`PART-1-1/node 37/UR1`, linear U `PART-1-1/node 2/U3`, and linear UR +`PART-1-1/node 44/UR1`. No warning-only family failed. + +The eight blocking internal families are independent of Abaqus CSV tolerance. + +| family | rows | numerator | scale | metric | gate | result | +| --- | ---: | ---: | ---: | ---: | --- | --- | +| fine.global_force_balance | 3 | 2.6775524023e-07 | 1.2773012379e+05 | 2.09625758e-12 | `<=1e-8` | pass | +| fine.global_moment_balance | 3 | 1.3258637157e-04 | 4.8292847478e+05 | 2.74546602e-10 | `<=1e-8` | pass | +| fine.accepted_free_force_residual | 1875 | 3.8659904671e-03 | 1.0000000000e+05 | 3.86599047e-08 | `<=1e-2` | pass | +| fine.accepted_free_moment_residual | 1875 | 1.3760745787e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass | +| coarse.global_force_balance | 3 | 8.2512269735e-07 | 1.0000000439e+05 | 8.25122661e-12 | `<=1e-8` | pass | +| coarse.global_moment_balance | 3 | 4.1788609354e-05 | 2.9558678960e+05 | 1.41375091e-10 | `<=1e-8` | pass | +| coarse.accepted_free_force_residual | 75 | 3.1462885132e-02 | 1.0000000000e+05 | 3.14628851e-07 | `<=1e-2` | pass | +| coarse.accepted_free_moment_residual | 75 | 3.3292052422e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass | + +The constrained-reaction resultant remains a distinct review summary: fine force +`[1.2306822228e-12, -3.5943123478e-12, 1.0000000000e+05]`, moment +`[2.7057467378e-11, -5.6934368331e-10, -1.3258637157e-04]`; coarse force +`[7.9591888635e-12, 7.2906680693e-12, 1.0000000000e+05]`, moment +`[-1.7826096155e-10, -2.5829649530e-10, -4.1788609352e-05]`. + +Local reaction RF/RM source-key/inventory/finite prechecks passed, but the following direct +row/RMS findings remain review-only and therefore do not change the blocking classification. + +| review family | rows passed | relative RMS | worst absolute row | finding | +| --- | ---: | ---: | --- | --- | +| coarse in-plane RF | 4/48 | 1.1437709953e-01 | node 3/RF1, 5.3914239451e-01 | review-only failure | +| coarse RF3 | 4/24 | 4.8448360241e-02 | node 31/RF3, 7.1995422354e+02 | review-only failure | +| coarse physical RM1/RM2 | 32/48 | 2.7464126167e-02 | node 22/RM1, 1.0484921048e+03 | review-only failure | +| fine in-plane RF | 12/208 | 1.1971372918e-01 | node 1/RF2, 1.5298653299e-01 | review-only failure | +| fine RF3 | 92/104 | 5.3476362434e-03 | node 9/RF3, 4.6176964624e+01 | review-only row failure | +| fine physical RM1/RM2 | 112/208 | 3.3719303859e-03 | node 52/RM2, 3.1549617088e+01 | review-only row failure | + +`RM3` and stress were not numerically compared. Artifact inventory, byte size, timestamp, and +SHA-256 equality before/after all runs prove that no reference artifact changed. + + + + +## Nonlinear Static Newton-Raphson Physics Evaluation + + +### 1. Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source reference comparison report | `docs/nonlinear-static-newton-raphson/verification.md` | +| source reference comparison SHA-256 | `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` | +| source reference model | `docs/nonlinear-static-newton-raphson/reference-model.md` | +| source reference model SHA-256 | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | +| status | `pass-for-release-agent` | +| owner_agent | `physics-evaluation-agent` | +| date | `2026-08-28` | + +이 평가는 승인된 물리 acceptance scope와 이미 생성된 accepted-state evidence만 사용한다. +Abaqus 또는 다른 reference solver를 실행하지 않았고, 외부 solver의 내부 정식화·적분·안정화· +결과 복구 동등성을 주장하지 않는다. + + +### 2. Input Evidence + + +#### 2.1 Gate-entry audit + +- `implementation-report.md`와 `build-test.md`의 Stage 6 owner classification은 + `pass-for-physics-evaluation`이며 full CTest `302/302`, nonlinear reference `9/9` 통과를 + 기록한다. +- Corrected required source `reference-comparison.md`는 overall handoff status를 + `pass-for-physics-evaluation`로 명시한다. Detailed verdict + `blocking-pass-with-review-only-findings`는 모든 blocking numerical family가 통과하고 six + local RF/RM findings만 review-only라는 세부 분류로 함께 유지된다. 두 status는 서로 + 모순되지 않으며 `PHYS-STATUS-001`은 해소되었다. +- `requirements.md` metadata의 `status: draft`, `approved_by: pending user re-approval` 및 + `FESA-REQ-NSNR-069`의 historical `draft` 표시는 내용상 physics blocker가 아니다. + 당시 Authoritative `coordination.md` Stage 1 record는 당시 requirements SHA-256 + `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`가 + `2026-08-27` 사용자에게 명시적으로 재승인되었고 Stage 1이 `passed`임을 기록한다. + 따라서 이 stale metadata를 승인 부재로 재해석하지 않는다. + + +#### 2.2 Solver outputs and logs + +| case | checked authoritative/generated evidence | SHA-256 / observed identity | +| --- | --- | --- | +| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_results.h5` | `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment | +| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_log.txt` | `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 | +| `shellnl-s4-final` | build-local `shellNL_results.h5` | `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment | +| `shellnl-s4-final` | build-local `shellNL_log.txt` | `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 | +| `shell-s4-linear-limit` | build-local `shell_results.h5`, `shell_log.txt` | HDF5 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; zero-byte log `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` | + +HDF5는 `reference-comparison.md`에 적힌 build-local exact path에서 직접 읽었다. Optional FESA +debug CSV view는 선언되거나 필요하지 않아 사용하지 않았다. Factor-one +`nodal/displacement`, `global/equilibrium`, `global/energy`, direct shell stress와 +`accepted_frames`를 확인했다. + + +#### 2.3 Read-only reference evidence + +Canonical reference bundle은 `reference-comparison.md`가 inventoried한 12개 exact file을 사용했다. + +- `reference/shellNL-meshfine/`: input, displacement, reaction, stress inventory +- `reference/shellNL/`: input, displacement, reaction, stress inventory +- `reference/shell/`: linear input, displacement, reaction inventory, stress inventory + +각 SHA-256은 `reference-model.md`와 `reference-comparison.md` inventory에 일치한다. 비교량은 +fine/coarse/linear `U1/U2/U3` blocking, `UR1/UR2/UR3` warning-only, fine/coarse local +`RF1/RF2/RF3`와 physical spatial `RM1/RM2` review-only다. `RM3`와 stored element-corner +stress는 numerical comparison에서 제외되었다. + +Reference model의 목적은 중앙 `DOF 3=-100000` fixed-global dead load를 받고 둘레의 all-six +DOF가 고정된 `10 x 10`, thickness `0.5` square plate의 coarse/fine nonlinear response와 +linear-limit source identity를 검증하는 것이다. Nonlinear cases는 `0.1` 간격으로 factor one까지 +진행한다. + + +### 3. Physics Checks + +| physics check | result | evidence and interpretation | +| --- | --- | --- | +| global equilibrium | `pass` | Fine normalized force `2.09625758e-12`, moment `2.74546602e-10`; coarse force `8.25122661e-12`, moment `1.41375091e-10`. 네 값 모두 approved inclusive `<=1e-8`다. HDF5 `/global/equilibrium`은 `location=global-balance-error`, current arm, global origin `[0,0,0]`, spatial moment 의미를 가진다. | +| reaction consistency | `pass` | Applied `F3=-100000`에 대해 constrained-reaction resultant `F3`는 fine/coarse 모두 약 `+100000`이고 다른 force components는 roundoff 수준이다. Applied-plus-reaction force/moment와 accepted free force/moment residual이 각각 blocking gate를 통과했다. Local RF/RM six-family discrepancy는 승인 계약상 review-only nodal redistribution evidence이며 global reaction/resultant identity를 대체하지 않는다. | +| displacement direction | `pass` | Downward load에 대해 node 2 final `U3`는 fine `-2.56338e-5`, coarse `-2.35504e-5`; reference도 각각 `-2.57957054e-5`, `-2.37408203e-5`다. HDF5 path는 factor `0.1..1.0`에서 fine `-2.56338e-6 .. -2.56338e-5`, coarse `-2.35504e-6 .. -2.35504e-5`로 부호 반전·jump·rollback 없이 진행한다. | +| symmetry / expected zero | `pass` | Center node 2의 factor-one `U1/U2`와 rotations는 fine/coarse에서 약 `1e-17` 이하로, centered load와 symmetric all-edge constraint의 expected-zero response와 일치한다. Fresh physics-focused CTest에서 finite rigid objectivity, zero internal force, rigid translation nullspace와 no-moment tangent symmetry checks가 통과했다. | +| element force balance | `covered-by-approved-invariants` | 승인 HDF5에는 standalone element nodal-action balance dataset이 없고 external element-force comparison도 요구되지 않는다. 대신 complete element residual/tangent same-trial identity, patch recovery, stable assembly covariance tests와 accepted global/free equilibrium gate가 문서화된 expectation을 충족한다. 별도 element-force output을 invent하지 않았다. | +| stress/strain | `pass-sanity-evidence` | HDF5 direct fixed-reference Gauss stress는 finite다. Element 1/GP1의 `[S11,S22,S12]`는 fine bottom `[-264846,-77843.6,914.879]`, middle `[1.94695,0.530775,-0.0224511]`, top `[264850,77844.8,-914.925]`; coarse도 bottom/top sign이 반대이고 middle이 작아 centered plate bending sign/thickness pattern과 일치한다. Stored CSV는 corner/SPOS-SNEG identity로 위치가 달라 numerical stress comparison이 승인되지 않았으므로 이를 tolerance pass로 재분류하지 않는다. | +| rigid body mode | `pass` | 둘레 all-six-DOF support가 global rigid-body motion을 제거하고, accepted path에 비정상 large translation 또는 singular/nonfinite 증상이 없다. Fresh focused tests에서 proper triad/director, finite rigid objectivity, zero internal force, rigid nullspace와 invalid branch rejection을 확인했다. | +| energy/residual | `pass-sanity-evidence` | Factor-one physical strain energy는 fine `1.28169`, coarse `1.17752`로 finite positive이며 near-linear relation `0.5*100000*abs(U3_center)`와 일치한다. 이는 secondary sanity evidence이고 승인 energy convergence gate는 아니다. Fine/coarse accepted free force/moment residual은 NSNR-069 blocking gate를 통과했고 log에는 nonfinite/failed accepted state가 없다. | +| model coverage | `pass` | Fine 729-node/676-element primary, coarse 49-node/36-element companion, linear control과 internal linear-limit/tangent/objectivity/patch/rollback portfolio가 승인 NSNR-030 scope를 덮는다. Stored response는 weak geometric-nonlinear regime이고 original-style MITC4의 curved/distorted membrane-locking risk는 알려진 한계지만 Numerical Review가 이번 release의 additional benchmark/convergence gate로 승인하지 않았으므로 model-coverage gap을 새로 만들지 않는다. | + +Fresh physics-focused verification command: + +```powershell +ctest --preset windows-msvc-ninja-debug -R '^(NonlinearMitc4Shell|NonlinearMitc4Recovery|NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch|FiniteRotation|NonlinearStaticProcedure)\.' --output-on-failure +``` + +Result: `23/23` passed, exit `0`, total real time `5.12 s`. + + +### 4. Failure Classification + +- blocking classification: 없음 +- resolved finding: `PHYS-STATUS-001`; corrected `reference-comparison.md`가 required overall + `pass-for-physics-evaluation` handoff와 detailed + `blocking-pass-with-review-only-findings` verdict의 관계를 명시했다. +- observed failures: `equilibrium-failure`, `reaction-inconsistency`, + `displacement-direction-failure`, `symmetry-failure`, `stress-location-failure`, + `element-force-inconsistency`, `rigid-body-mode-suspected`, `nonfinite-result`, + `model-coverage-gap`, `upstream-contract`, `environment` 모두 없음. + + +### 5. Evaluation Verdict + +- verdict: `pass-for-release-agent` +- physics evidence disposition: documented equilibrium, reaction, displacement, symmetry/objectivity, + stress/strain sanity, rigid-body, residual/path and model-coverage checks show no physical failure. +- pass disposition: documented physical expectations passed and no physics/model-coverage/I/O/upstream + blocker remains. +- release meaning: this verdict authorizes Release Agent evaluation through Coordinator only. It is + not Release approval, publish/deploy/package/tag authorization, or external-solver equivalence. + + +### 6. Handoff Recommendation + +- handoff: `Release Agent`, always through `Coordinator Agent` +- recommendation: Release Agent는 current approved hashes, Stage 6 + `pass-for-physics-evaluation`, 이 문서의 `pass-for-release-agent`, known limitations와 + review-only findings를 사용해 release readiness만 audit한다. +- boundary: Physics Evaluation Agent는 release readiness, final release checklist, release notes, + publish/deploy/package/tag를 승인하지 않는다. + + +### 8. Open Issues + +| id | severity | issue | gate effect | +| --- | --- | --- | --- | +| `PHYS-META-001` | nonblocking | `requirements.md`의 draft/pending metadata가 authoritative Coordinator/user reapproval record와 stale함 | 현재 hash의 explicit approval로 physics authority는 해소됨; Release traceability audit에서 투명하게 유지 | +| `PHYS-LOCAL-001` | nonblocking | six local RF/RM families have review-only discrepancies | approved disposition 유지; global force/moment balance와 free residual을 blocking evidence로 사용 | +| `PHYS-STRESS-001` | nonblocking | stored corner/SPOS-SNEG stress와 FESA direct Gauss recovery 위치가 다르고 fine optional stress row 하나의 node label이 malformed | stress numerical comparison 제외 유지; artifact를 repair하지 않음 | +| `PHYS-LIMIT-001` | known limitation | stored cases are weak geometric-nonlinear plate responses; original MITC4 has known curved/distorted membrane-locking risk | approved current portfolio에서는 blocker 아님; broader claim 금지 | diff --git a/docs/operations.md b/docs/operations.md index 9f3cd0e..0a80e5c 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -69,6 +69,11 @@ python scripts/execute.py Phase 인자·`--push`·`--approve-danger-full-access`를 받지 않는다. 자동 Git·retry·외부 solver 실행이나 필요한 추가 reference 비교의 추론은 하지 않는다. +최근 전체617개 회귀는 개별 검사 시간 합계가 약6,859초였으므로 기본1,800초 runner로 +전체 완료를 기대하면 안 된다. 긴 전체 회귀는 위 MSVC 환경의 명시 CMake/CTest preset +명령으로 실행하고 실제 native 종료·전체 verdict를 보존한다. Timeout이나 중단된 로그를 +부분 성공으로 계산하거나 문서 정리를 이유로 runner 제한·검사를 임의 변경하지 않는다. + 성공은 exit 0, config/toolchain/backend/timeout 실패는 exit 1이다. 잘못된 CLI 인자나 자동 감지에서 project metadata가 없는 경우는 exit 2다. 원래 backend exit와 runner exit를 구분해 기록하고 출력 tail에 포함된 stage·argv·cwd에서 실패 경계를 찾는다. diff --git a/docs/reference-papers/MITC4/MITC공부/MITC공부_001.md b/docs/reference-papers/MITC4/MITC공부/MITC공부_001.md index 02bbbb6..30a0525 100644 --- a/docs/reference-papers/MITC4/MITC공부/MITC공부_001.md +++ b/docs/reference-papers/MITC4/MITC공부/MITC공부_001.md @@ -9,7 +9,7 @@ Locking을 방지하기 위해 횡방향 전단 변형률에 보간법 사용 2. Kinematics -![](page-001_64f5f5a6fb0b89f088f64198f2101fe1662d688eb8c02d8fa6f1a855f09aaed4.jpg) +![](images/page-001_64f5f5a6fb0b89f088f64198f2101fe1662d688eb8c02d8fa6f1a855f09aaed4.jpg)
flowchart @@ -355,7 +355,7 @@ graph TD ```
-![](page-001_65026891a36c5d50bc54d22bb4fc099887273632fcbc2746d2786df72ef41bb2.jpg) +![](images/page-001_65026891a36c5d50bc54d22bb4fc099887273632fcbc2746d2786df72ef41bb2.jpg)
text_image diff --git a/docs/shell-surface-pressure-load/README.md b/docs/shell-surface-pressure-load/README.md new file mode 100644 index 0000000..19239a1 --- /dev/null +++ b/docs/shell-surface-pressure-load/README.md @@ -0,0 +1,38 @@ +# Shell 표면 압력 + +## 목적과 현재 범위 + +SURFACE의 SPOS/SNEG와 DSLOAD의 P를 사용하는 압력의 방향·면적·follower tangent 및 선형/비선형 조립를 구현한 기능이다. 역사적 기능 검증과 현재 통합 회귀의 범위를 구분한다. +최근 dev 통합 회귀는 [전체 현황](../tracking/status.md)에 연결하며, 과거 release 판정은 +[release.md](release.md)에 남긴다. 문서 정리는 새 기능 검증이나 재승인을 뜻하지 않는다. + +## 계약과 재사용 Handoff + +- [요구사항·acceptance](requirements.md): 지원·제외와 기존 요구사항 ID. +- [정식화](formulation.md): 수식·가정·부호·좌표계·복구 위치. +- [I/O](io.md): 입력 subset·진단·source identity·결과 schema. +- [Reference 모델](reference-model.md): 원본과 비교량·행 identity·적용 범위. +- [독립 수치 검토](numerical-review.md): 검산·위험·반례와 수정 확인. +- [검증·물리 결과](verification.md): 실제 실행한 명령·수치·실패·미실행·한계. +- [연구 근거](research.md): 정식화에 필요한 출처와 적용 경계. + +공통 소유권은 [ARCHITECTURE](../ARCHITECTURE.md)를 따른다. Element는 local 계산, +Assembly는 결정적 reduction, Procedure는 trial/commit, Recovery는 물리 의미, +Writer는 직렬화를 담당한다. 새 기능에서 기존 stage/phase 실행 계획을 재사용하지 않는다. +현재 공개 API는 `include/fesa/`, 실제 구현은 `src/fesa/`와 대응 검사를 확인한다. + +## 사용법 + +환경 준비·build·CTest·CLI 기본 사용은 [operations](../operations.md), 입력과 결과의 +공통 계약은 [contracts](../contracts.md)를 따른다. 이 기능의 keyword·option 허용 범위는 +위 I/O 계약을 확인한다. 과거 보고서의 machine 경로·임시 command를 현재 기본값으로 쓰지 않는다. + +## 개발 과정과 주의사항 + +기존 단계별 계획·coordination은 완료된 실행 운영 기록이어서 제거했다. 승인된 요구사항· +수식·검토·실제 검증 결과는 위 문서에 보존한다. Git `858e87b`의 이전 경로는 당시 원문을 +조회하는 용도로만 사용하며 현행 작업 지침이 아니다. + +- 실패한 trial·candidate는 기존 accepted state와 최종 결과를 변경하지 않아야 한다. +- 같은 trial의 기하·내력·하중·접선을 사용하고 generalized rotation moment와 spatial moment를 구분한다. +- [수정·실패 기록](lessons.md)에 원인과 검증 결과를 보존한다. diff --git a/docs/shell-surface-pressure-load/build-test.md b/docs/shell-surface-pressure-load/build-test.md deleted file mode 100644 index 671b520..0000000 --- a/docs/shell-surface-pressure-load/build-test.md +++ /dev/null @@ -1,95 +0,0 @@ -# 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: Harness phase completed locally at - `2026-09-01 17:43:57`. The single automatic Stop whole-project MSVC x64 - Debug build passed. It ran `cmake --build .harness/build --config Debug`, - then `ctest --test-dir .harness/build -C Debug --show-only=json-v1` with - nonzero discovery, and `ctest --test-dir .harness/build -C Debug - --output-on-failure`; the final full CTest result was `362/362 PASS`, - `0 failed`. -- automatic Stop evidence sources: - `phases/shell-surface-pressure-load/step7-output.json`, - `.harness/build/Testing/Temporary/LastTest.log`, and phase/commit metadata - `2c91462`, `bf2339c`, `c4d1e2a`. Classification: `pass`; failed tests: - none. Duration: not separately preserved in committed report; completion - timestamp and LastTest log are authoritative. -- 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/coordination.md b/docs/shell-surface-pressure-load/coordination.md deleted file mode 100644 index 7deaf22..0000000 --- a/docs/shell-surface-pressure-load/coordination.md +++ /dev/null @@ -1,297 +0,0 @@ -# Shell Surface Pressure Load Coordination Record - -## 1. Metadata and Feature Scope - -- feature_id: `shell-surface-pressure-load` -- workflow_state: `completed` -- owner_agent: `coordinator-agent` -- request_date: `2026-08-30` -- last_updated: `2026-09-01` -- process_classification: `architectural` -- current_goal: Gates 1–8 owner evidence와 `ready-for-release` recommendation을 기록하고 내부 feature workflow를 closure한다. -- approved_scope: Abaqus subset `*SURFACE, TYPE=ELEMENT`와 `*DSLOAD`의 uniform `P`를 S4/S4R `SPOS|SNEG` surface에 적용한다. Linear static은 reference configuration load를, nonlinear static은 current-configuration follower load와 external tangent를 사용한다. -- scope_boundaries: Unsupported surface/load variants는 fail-closed로 거부하고 stable source identity와 deterministic load/reduction order를 보존한다. 기존 authoritative HDF5 output을 우선 유지하되 Stage 5 I/O gate가 evidence로 최종 확정한다. -- reference_case: `reference/shellNL-meshfine-pressure/`의 existing `.inp`와 CSV를 exact path/name 그대로 read-only 사용한다. -- user_approval: `2026-08-30` approved Abaqus-aligned design; `2026-09-01` approved the 7-Step implementation plan, phase materialization, Harness execution without push, and isolated recovery worktree with per-run `FESA_HARNESS_CODEX_SANDBOX=danger-full-access` fallback. -- active_workspace: `C:/git/FESADev/.worktrees/shell-surface-pressure-load-recovery` on `feat-shell-surface-pressure-load`; recovery baseline commit `2d07106` -- protected_backup_workspace: original `C:/git/FESADev` dirty feature workspace; do not read, modify, clean, stash, commit, reset, or execute there during recovery - -## 2. Eight-Stage Worklist - -| stage | owner | status | output paths | acceptance gate | evidence summary | blockers | attempt count | -| --- | --- | --- | --- | --- | --- | --- | --- | -| 1. Requirements | `requirement-agent` | `passed` | `docs/shell-surface-pressure-load/requirements.md` | 지원/제외 범위, verifiable acceptance criteria, verification quantities, tolerance baseline과 requirement verification matrix가 승인 설계를 손실 없이 고정함 | `FESA-REQ-SHELL-PRESSURE-001`–`024`; normative 24/matrix 24; orphan 0; exact reference input/displacement paths와 blocking/warning/excluded disposition; owner `passed`; Coordinator audit 통과 | 없음 | 1 | -| 2. Research | `research-agent` | `passed` | `docs/shell-surface-pressure-load/research.md` | 이론, benchmark, primary evidence와 applicability limit가 충분함 | Source 15개(Project/Stored 3, Tier 1 official 8, Tier 2 3, Tier 3 navigation 1), key claims 15개, benchmark 8개, normative trace gap 0; owner `passed`; Coordinator audit 통과 | 없음 | 1 | -| 3. Formulation | `formulation-agent` | `passed` | `docs/shell-surface-pressure-load/formulation.md` | Pressure virtual work, equivalent nodal load, follower linearization과 numerical integration 계약이 구현 가능함 | `ready-for-numerical-review`; force/residual/tangent sign, common `2x2` rule, `24x1`/`24x24` dimensions, dimensionless geometry contract, deterministic assembly, requirement trace 24/24; owner `passed`; Coordinator audit 통과 | 없음 | 1 | -| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/shell-surface-pressure-load/numerical-review.md`; `docs/shell-surface-pressure-load/reference-model.md` | Numerical review와 exact reference contract가 함께 `pass-for-io-definition`임 | Aligned `pass-for-io-definition`; `tau_J=1e-12`, analytical/objectivity `1e-12`, FD `h=1e-5`/error `1e-8`, global balance `1e-8`; exact 729-row reference inventory, U/UR 2,187 logical rows each; owner evidence와 Coordinator audit 통과 | 없음 | 1 | -| 5. I/O definition | `io-definition-agent` | `passed` | `docs/shell-surface-pressure-load/io.md` | Abaqus subset, semantic mapping, diagnostics, HDF5 projection과 reference rows가 명확함 | `ready-for-implementation-planning`; exact assembly `SURFACE`/step `DSLOAD P`, Domain/Step/AnalysisModel mapping, ordered fail-closed validation, unchanged schema `0/1`, exact HDF5/reference projection, trace 24/24; owner `passed`; Coordinator audit 통과 | 없음 | 1 | -| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `passed` | `docs/shell-surface-pressure-load/implementation-plan.md`; `docs/shell-surface-pressure-load/implementation-report.md`; `docs/shell-surface-pressure-load/build-test.md`; `docs/shell-surface-pressure-load/reference-comparison.md`; `docs/shell-surface-pressure-load/corrections.md` | 승인 계획, TDD evidence, MSVC/x64/Debug build/CTest와 blocking reference comparison이 모두 통과함 | Harness Steps 1–7 completed; focused `64/64`, pressure reference `9/9`, final automatic Stop build PASS/full `362/362 PASS`, 0 failed; requirements trace `24/24`; post-hook reports는 historical evidence와 `pass-for-physics-evaluation`을 기록함 | 없음 | 2 | -| 7. Physics evaluation | `physics-evaluation-agent` | `passed` | `docs/shell-surface-pressure-load/physics-evaluation.md` | Direction, symmetry, resultant, reaction과 equilibrium 검토가 `pass-for-release-agent`임 | Owner `pass-for-release-agent`; documented pressure direction/sign, current-area resultant/moment, reactions/equilibrium, symmetry/zero behavior, follower objectivity, residual/nonfinite sanity와 declared model coverage 통과; normalized force/moment balance `6.76e-14`/`3.72e-14 <= 1e-8`; Coordinator output/status/no-change audit 통과 | 없음 | 1 | -| 8. Release readiness | `release-agent` | `passed` | `docs/shell-surface-pressure-load/release.md` | Acceptance traceability와 limitation을 포함한 verdict가 `ready-for-release`임 | Owner `ready-for-release`; Gates 1–7 consistent, must requirements `24/24` traced, full `362/362`, focused `64/64`, reference `9/9`, U/UR `2187/2187`, physics force/moment balance evidence와 11개 known limitations/release notes 포함; Coordinator output/status/no-change audit 통과 | 없음 | 1 | - -## 3. Active Dispatch Package and Latest Sub-Agent Return - -### Completed Dispatch Package - -- dispatch_id: `GATE1-REQ-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `requirement-agent` -- required_inputs: - - `AGENTS.md` - - `docs/PRD.md` - - `docs/ARCHITECTURE.md` - - `docs/ADR.md` - - `docs/TOLERANCE.md` - - `docs/SOLVER_AGENT_DESIGN.md` - - approved design recorded in this file - - `reference/shellNL-meshfine-pressure/` read-only inventory -- expected_outputs: `docs/shell-surface-pressure-load/requirements.md` -- acceptance_gate: Verifiable shall requirements, explicit scope/exclusions, input/output semantics, failure behavior, deterministic identity/order, reference quantities/dispositions, common tolerance baseline and complete requirement verification matrix preserve the approved design without downstream formulation or I/O invention. -- stop_condition: `requirements.md`와 return evidence를 제출한 뒤 중지한다. Peer dispatch, Gate 2 work, source/tests/CMake/reference/tolerance 변경은 금지한다. -- missing_evidence: 없음 - -### Completed Dispatch Package — Gate 2 - -- dispatch_id: `GATE2-RES-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `research-agent` -- required_inputs: - - `AGENTS.md` - - `docs/SOLVER_AGENT_DESIGN.md` - - `docs/shell-surface-pressure-load/requirements.md` binding baseline - - `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`, `docs/TOLERANCE.md` - - exact read-only inventory under `reference/shellNL-meshfine-pressure/` - - `fesa-research-evidence`; 필요 시 `fem-theory-query` -- expected_outputs: `docs/shell-surface-pressure-load/research.md` -- acceptance_gate: Key claims마다 source/reliability tier 또는 inference label이 있고, Abaqus observable input/load semantics와 FESA-owned theory가 분리된다. Pressure virtual work, current-surface follower force, external tangent, S4/S4R applicability와 verification candidates가 target quantity, 한계, exact artifact와 requirement trace를 갖는다. -- stop_condition: `research.md`와 return evidence 제출 후 중지한다. Formulation 확정, peer dispatch, Gate 3, source/tests/CMake/reference/tolerance 변경은 금지한다. -- missing_evidence: 없음 - -### Completed Dispatch Package — Gate 3 - -- dispatch_id: `GATE3-FORM-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `formulation-agent` -- required_inputs: - - `AGENTS.md` - - `docs/SOLVER_AGENT_DESIGN.md` - - binding `docs/shell-surface-pressure-load/requirements.md` - - approved `docs/shell-surface-pressure-load/research.md` - - applicable project architecture/ADR contracts - - `fesa-formulation-spec`; 필요 시 supporting `fem-theory-query` -- expected_outputs: `docs/shell-surface-pressure-load/formulation.md` -- acceptance_gate: Strong/weak form, S4/S4R interpolation, side/sign map, reference/current geometry, quadrature/Jacobian validity, consistent pressure force, residual sign, exact external tangent, full-space deterministic assembly, units/failures, verification identities와 requirement trace가 implementation-ready이며 Abaqus internal equivalence를 주장하지 않음. -- stop_condition: `formulation.md`와 return evidence 제출 후 중지한다. Parser/API/source/test/reference 변경, peer dispatch, Numerical Review/Gate 4 수행은 금지한다. -- missing_evidence: 없음 - -### Completed Dispatch Package — Gate 4 - -- dispatch_id: `GATE4-NR-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `numerical-review-agent` -- required_inputs: - - `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md` - - binding `requirements.md`, approved `research.md`, `formulation.md` - - `docs/TOLERANCE.md`와 applicable architecture/ADR contracts - - exact read-only `reference/shellNL-meshfine-pressure/` artifacts - - `fesa-numerical-review` -- expected_outputs: `docs/shell-surface-pressure-load/numerical-review.md`; `docs/shell-surface-pressure-load/reference-model.md` -- acceptance_gate: 독립 sign/force/tangent/residual/integration/geometry/objectivity/equilibrium/determinism review가 blocking flaw 없이 통과하고, `tau_J`와 internal test thresholds가 scale-aware하게 확정된다. Exact input/required CSV identity, component/blocking classification, row prechecks와 unchanged `docs/TOLERANCE.md` policy가 I/O 정의에 충분해야 한다. -- stop_condition: 두 report와 owner verdict/return evidence 제출 후 중지한다. Upstream flaw는 문서를 조용히 수정하지 않고 precise rework로 반환한다. Source/tests/CMake/reference/tolerance 변경, peer dispatch, Gate 5 수행은 금지한다. -- missing_evidence: 없음 - -### Completed Dispatch Package — Gate 5 - -- dispatch_id: `GATE5-IO-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `io-definition-agent` -- required_inputs: - - `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md` - - approved feature `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md` - - applicable PRD/architecture/ADR/CODINGSTYLE/TOLERANCE contracts - - exact read-only `reference/shellNL-meshfine-pressure/` artifacts - - `fesa-io-contract` -- expected_outputs: `docs/shell-surface-pressure-load/io.md` -- acceptance_gate: Approved `*SURFACE TYPE=ELEMENT`/`*DSLOAD P` grammar, model/history mapping, deterministic target resolution/diagnostics, Domain/Step/AnalysisModel semantic ownership, existing authoritative HDF5 field projection, exact reference CSV identity/prechecks/common tolerance와 compatibility boundary가 구현 계획에 충분하고 upstream contract와 일치함. -- stop_condition: `io.md`와 owner return evidence 제출 후 중지한다. Parser/API implementation, source/tests/CMake/phases/reference/tolerance 변경, peer dispatch와 Gate 6 수행은 금지한다. -- missing_evidence: 없음 - -### Completed Dispatch Package — Gate 6 Planning - -- dispatch_id: `GATE6-PLAN-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `implementation-planning-agent` -- required_inputs: - - `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md` - - approved feature `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md` - - current source/tests/CMake/`.harness/config.json`/hooks/phase inventory read-only - - `fesa-cpp-msvc-tdd`, project-local `harness`, compatible `superpowers:writing-plans` -- expected_outputs: `docs/shell-surface-pressure-load/implementation-plan.md`; concise user-approval Step draft in owner return -- acceptance_gate: Multiple self-contained Steps가 각자 `RED -> observed failure -> minimal GREEN -> focused/full VERIFY`를 포함하고 exact files/signatures/tests/commands/dependencies/traceability를 지정한다. Parser/model, force/tangent, linear/nonlinear assembly, deterministic failure, HDF5/reference comparison와 final MSVC x64 Debug CTest evidence를 모두 다루며 reference immutability/atomicity를 보존한다. -- stop_condition: Plan draft와 return evidence 제출 후 사용자 승인을 기다린다. `phases/index.json`, `phases//`, source/tests/CMake/reference 수정, Harness execution, Implementation Agent dispatch는 승인 전 금지한다. -- missing_evidence: 사용자 plan approval - -### Completed Dispatch Package — Gate 6 Phase Materialization - -- dispatch_id: `GATE6-PHASE-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `implementation-planning-agent` (`GATE6-PLAN-001`과 동일 owner instance) -- required_inputs: - - approved `docs/shell-surface-pressure-load/implementation-plan.md` - - `AGENTS.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, project-local `harness` - - existing `phases/index.json`과 existing task directories -- expected_outputs: `phases/index.json`; `phases/shell-surface-pressure-load/index.json`; `phases/shell-surface-pressure-load/step1.md`–`step7.md` -- acceptance_gate: Top-level task entry와 task index의 7 pending Steps가 승인 slug/order와 정확히 일치한다. 각 Step은 독립 실행에 필요한 upstream docs, exact files/signatures, RED expected failure, minimal GREEN, focused/full MSVC x64 Debug CMake/CTest commands, dependencies, status ownership, forbidden scope와 reference immutability를 대화 참조 없이 포함한다. -- stop_condition: Planning files만 materialize하고 실행·Step selection·status advancement·timestamp·commit·push를 하지 않는다. Source/tests/CMake/docs/reference/tolerance는 변경하지 않는다. -- missing_evidence: 없음 - -### Paused Dispatch — Gate 6 Implementation Recovery - -- dispatch_id: `GATE6-IMPL-RECOVERY-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `implementation-agent` -- required_inputs: - - `AGENTS.md`, `.codex/hooks.json`, `.agents/skills/harness/SKILL.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md` - - approved feature bundle `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md` - - materialized `phases/index.json`, `phases/shell-surface-pressure-load/index.json`, `step1.md`–`step7.md` - - `fesa-cpp-msvc-tdd`; user authorization for `python scripts/execute.py shell-surface-pressure-load` without `--push` - - clean recovery worktree `C:/git/FESADev/.worktrees/shell-surface-pressure-load-recovery`, baseline `2d07106`, branch `feat-shell-surface-pressure-load-recovery` - - per-process-only `FESA_HARNESS_CODEX_SANDBOX=danger-full-access`; remove environment variable immediately after Executor returns - - root baseline evidence: approved dependency paths, MSVC x64 Debug configure/build pass, nonzero discovery, full CTest `302/302 PASS` -- expected_outputs: completed phase Step records; feature production/tests/CMake/comparator changes; `docs/shell-surface-pressure-load/implementation-report.md`; `build-test.md`; `reference-comparison.md`; actual RED/GREEN/VERIFY logs and unchanged reference hashes -- acceptance_gate: Step 1–7 executes in order with expected RED before each production behavior, minimal GREEN, focused and full MSVC x64 Debug build/CTest. Final comparison uses exact stored artifacts, deterministic identity/prechecks/common tolerance and records U blocking/UR warning-only while preserving hashes. All Gate 6 reports must support `pass-for-physics-evaluation` with no unresolved blocking failure. -- stop_condition: Execute only in the recovery worktree. Do not touch the original backup workspace, push, run Abaqus/reference solvers, change upstream contracts/tolerance/reference artifacts, advance Gate 7, or revert other agents' docs/coordination changes. Scope `danger-full-access` only to the single Executor process and remove it afterward. Repeated/unclear implementation failure returns to Coordinator for bounded correction routing. -- missing_evidence: completed Steps 1–7, three Gate 6 reports, owner return, Coordinator evidence audit - -### Completed Dispatch — Gate 6 Correction - -- dispatch_id: `GATE6-CORR-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `correction-agent` -- required_inputs: - - Step 1/2 commits `ca3e4bc`, `d5fc316`, `c3b671d`, `adebfae` and ignored `step1-output.json`, `step2-output.json` - - observed process evidence: Step 2 agent full CTest PID `21572` at `12:44:03`; Stop hook PIDs `21496/20712` at `12:45:41`; Stop full CTest PID `8816` at `12:46:01`; final test PID `21964`; parallel overlap while Harness waited for pipe EOF - - approved `implementation-plan.md`, `step3.md`–`step7.md`, `fesa-cpp-msvc-tdd`, project Harness and Stop-hook ownership contracts - - current phase index with stale pending Step 3 `started_at=2026-09-01T13:11:27+0900` -- expected_outputs: `docs/shell-surface-pressure-load/corrections.md`; minimally corrected `phases/shell-surface-pressure-load/step3.md`–`step7.md`; normalized Step 3 pending index entry if required -- acceptance_gate: Root cause/evidence, Step 1/2 RED/focused/full evidence and timeout classification are auditable. Pending Steps require agent-owned RED+focused verification only and preserve Stop hook as the single whole-project full verification owner. Acceptance/tolerance/reference strength and final Gate 6 report evidence remain unchanged; diff has no code/test/reference/upstream-contract edits. -- stop_condition: Do not commit, execute Harness/build/test, modify Step 1/2, source/tests/CMake/reference/tolerance/upstream docs, advance phase/Gate 7, or revert other agents' changes. Return exact rerun/commit recommendation to Coordinator. -- missing_evidence: 없음 - -### Completed Dispatch — Gate 6 Post-Hook Evidence Amendment - -- dispatch_id: `GATE6-EVIDENCE-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: same `implementation-agent` -- required_inputs: completed phase index/commits, Step 7 output, `.harness/build/Testing/Temporary/LastTest.log`, authoritative final automatic Stop full CTest `362/362 PASS`, 0 failed -- expected_outputs: amended `docs/shell-surface-pressure-load/build-test.md`; `implementation-report.md` only if needed for consistency -- acceptance_gate: Exact Stop configure/build/discovery/full-test command/result, exit status, `362/362`, zero failures, duration/tail and single-owner classification are historical fact rather than future tense; no source/test/CMake/reference/phase changes and no test rerun. -- stop_condition: Evidence-only docs amendment; do not run build/CTest/Harness, change implementation/reference/upstream contracts, commit/push, dispatch peers, or advance Gate 7. -- missing_evidence: 없음 - -### Completed Dispatch — Gate 7 Physics Evaluation - -- dispatch_id: `GATE7-PHYS-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `physics-evaluation-agent` -- required_inputs: approved feature bundle `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`; passing `implementation-report.md`, `build-test.md`, `reference-comparison.md`; exact read-only reference artifacts; `fesa-physics-sanity` -- expected_outputs: `docs/shell-surface-pressure-load/physics-evaluation.md` -- acceptance_gate: Passing reference rows와 implementation evidence를 바탕으로 pressure 방향/부호, resultant와 moment, reactions/equilibrium, symmetry/zero behavior, nonlinear follower objectivity/current-area behavior, nonfinite/residual sanity와 stored-case model coverage를 독립 평가하고 verdict가 `pass-for-release-agent`임. -- stop_condition: Physics report와 owner return evidence 제출 후 중지한다. Source/tests/CMake/reference/tolerance/upstream contracts를 수정하거나 Abaqus를 실행하거나 Gate 8을 수행하지 않는다. -- missing_evidence: 없음 - -### Completed Dispatch — Gate 8 Release Readiness - -- dispatch_id: `GATE8-REL-001` -- feature_id: `shell-surface-pressure-load` -- target_sub_agent: `release-agent` -- required_inputs: Gates 1–7 approved feature bundle과 owner reports: `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`, `implementation-report.md`, `build-test.md`, `reference-comparison.md`, `corrections.md`, `physics-evaluation.md`; `fesa-release-readiness` -- expected_outputs: `docs/shell-surface-pressure-load/release.md` -- acceptance_gate: Required reports가 같은 feature/status로 일치하고 full `362/362` validation, `pass-for-physics-evaluation`, `pass-for-release-agent`가 확인되며 각 `must` requirement가 acceptance/test/reference/release scope와 추적되고 known limitations 및 release notes draft를 포함한 verdict가 `ready-for-release`임. -- stop_condition: Release report와 owner return evidence 제출 후 중지한다. Source/tests/CMake/reference/tolerance/upstream contracts를 수정하거나 build/test/Harness/reference solver를 실행하거나 publish/deploy/package/tag/commit/push하지 않는다. -- missing_evidence: 없음 - -### Latest Sub-Agent Return - -- target_sub_agent: `release-agent` -- output_paths: `docs/shell-surface-pressure-load/release.md` -- status: `ready-for-release` -- evidence_summary: Gates 1–7 status/evidence consistency, must requirements `24/24` acceptance/test/reference/release trace, full `362/362`, focused `64/64`, reference `9/9`, U/UR `2187/2187`, physics force/moment balance와 exact artifact immutability를 감사함. Known limitations 11개와 release notes draft를 포함하고 내부 closure를 권고함. -- blockers: 없음 -- open_evidence_gaps: 없음 -- critical_user_question: 없음 -- forbidden_area_assertion: `release.md`만 생성; source, tests, CMake, phases, upstream reports, generated evidence, `docs/TOLERANCE.md`, reference artifact 변경 없음; build/test/reference solver 재실행 없음 - -## 4. Gate Decision Log and Workflow State - -| date | dispatch | gate decision | owner evidence | workflow state | -| --- | --- | --- | --- | --- | -| 2026-08-30 | `GATE1-REQ-001` | `passed` | Owner `passed`; `requirements.md` 24 normative IDs/24 matrix rows, complete traceability, approved design/reference boundary, blocker 없음. Coordinator 독립 구조 감사에서 orphan 0, matrix-only 0 및 필수 contract field 누락 0 확인 | `needs-research` | -| 2026-08-30 | `GATE2-RES-001` | `passed` | Owner `passed`; source 15/key claims 15/benchmark 8/trace gap 0. Coordinator audit에서 undeclared cited source 0, Abaqus observable/FESA formulation 분리, limitation과 nonblocking gap 확인 | `needs-formulation` | -| 2026-08-30 | `GATE3-FORM-001` | `passed` | Owner `passed`, document `ready-for-numerical-review`; Coordinator audit에서 required formulation sections 완비, requirement rows 24/24, upstream scope/sign/output 일치와 explicit Numerical Review handoff 확인 | `needs-numerical-review` | -| 2026-08-30 | `GATE4-NR-001` | `passed` | Owner reports aligned `pass-for-io-definition`; Coordinator audit에서 두 verdict/required sections, quantitative gates, exact artifact/row/component classification, precheck/common tolerance/immutability와 no final HDF5 projection 확인 | `needs-io-definition` | -| 2026-08-31 | `GATE5-IO-001` | `passed` | Owner `passed`, document `ready-for-implementation-planning`; Coordinator audit에서 required sections/grammar/ownership/validation/schema/reference projection 완비, trace 24/24, no new dataset/version와 no critical issue 확인 | `needs-implementation-plan` | -| 2026-08-31 | `GATE6-PLAN-001` | `passed` | Owner `passed`, document `draft-awaiting-user-approval`; Coordinator audit에서 7 Steps, TDD/commands/dependencies/24-of-24 trace, no phase/code mutation 확인. Initial `upstream-io-contract-mismatch`는 same-owner follow-up으로 multi-explicit-instance 지원과 committed source identity를 교정함. 이는 planning subgate 판정이며 Stage 6 implementation gate는 미통과 | `needs-user-decision` | -| 2026-09-01 | `GATE6-PLAN-APPROVAL` | `passed` | User explicitly approved the 7-Step draft, phase materialization, and implementation/verification execution; `--push` 금지 | `needs-implementation-plan` | -| 2026-09-01 | `GATE6-PHASE-001` | `pending` | 동일 Implementation Planning Agent의 phase materialization과 Coordinator audit 대기 | `needs-implementation-plan` | -| 2026-09-01 | `GATE6-PHASE-001` | `passed` | Owner `passed`; Coordinator audit에서 existing top index preservation, exact 7 pending slugs/files, Executor-readable paths, self-contained RED/GREEN/VERIFY와 exact reference immutability 확인 | `ready-for-implementation` | -| 2026-09-01 | `GATE6-IMPL-001` | `pending` | Exactly one Implementation Agent execution/evidence 대기 | `needs-implementation` | -| 2026-09-01 | `GATE6-IMPL-001` | `blocked` | Original shared-workspace Step 1의 공식 CMake compiler identification이 MSBuild FileTracker `0x80070005`로 차단됨. 첫 `environment/sandbox-msvc-filetracker-access-denied`; correction-agent 비대상. Dirty workspace를 backup으로 보존 | `needs-user-decision` | -| 2026-09-01 | `GATE6-RECOVERY-APPROVAL` | `passed` | User approved isolated linked recovery worktree와 per-run `danger-full-access`; root created clean baseline `2d07106` and independently verified MSVC x64 Debug configure/build, nonzero discovery, full CTest `302/302 PASS` | `ready-for-implementation` | -| 2026-09-01 | `GATE6-IMPL-RECOVERY-001` | `pending` | Same Implementation Agent controller recovery execution/evidence 대기 | `needs-implementation` | -| 2026-09-01 | `GATE6-IMPL-RECOVERY-001` | `needs-rework` | Step 1/2 commits completed, but agent full CTest and Stop-hook full CTest overlapped in parallel and caused repeated 1800-second timeout/slowdown. Harness safe-stopped after Step 2 commits; Step 3 source edit 없음 | `needs-correction` | -| 2026-09-01 | `GATE6-CORR-001` | `pending` | Exactly one Correction Agent root-cause audit/minimal verification-ownership correction 대기 | `needs-correction` | -| 2026-09-01 | `GATE6-CORR-001` | `passed` | Owner `corrected-for-implementation-rerun`; Coordinator audit에서 correction scope가 `corrections.md`, Step 3–7 wording와 stale pending Step 3 timestamp 제거에 한정되고 source/tests/CMake/hooks/reference/upstream contract no-change, focused/reference strength와 single Stop full gate 유지 확인 | `needs-implementation` | -| 2026-09-01 | `GATE6-EVIDENCE-001` | `pending` | Harness Step 7 completed, final Stop `362/362 PASS`; reports의 post-hook historical evidence amendment 대기 | `needs-implementation` | -| 2026-09-01 | `GATE6-EVIDENCE-001` | `passed` | Same Implementation Agent가 `build-test.md`와 `implementation-report.md`에 phase completion, automatic Stop build PASS, nonzero discovery, full `362/362 PASS`, 0 failed와 evidence provenance를 기록함. Coordinator cross-report audit에서 focused `64/64`, pressure reference `9/9`, requirements `24/24`, exact reference immutability와 `pass-for-physics-evaluation` 일치 확인 | `needs-physics-evaluation` | -| 2026-09-01 | `GATE7-PHYS-001` | `pending` | Exactly one Physics Evaluation Agent의 independent physical plausibility evidence 대기 | `needs-physics-evaluation` | -| 2026-09-01 | `GATE7-PHYS-001` | `passed` | Owner `pass-for-release-agent`; `physics-evaluation.md`가 documented pressure direction/sign, resultant/moment, reaction/equilibrium, symmetry/zero, follower objectivity/current-area, residual/nonfinite와 declared model coverage를 통과로 판정함. Coordinator audit에서 required sections, input handoff, `6.76e-14`/`3.72e-14 <= 1e-8`, blocker 없음과 physics-only no-change 확인 | `needs-release` | -| 2026-09-01 | `GATE8-REL-001` | `pending` | Exactly one Release Agent의 gate inventory, acceptance traceability, limitations와 closure recommendation 대기 | `needs-release` | -| 2026-09-01 | `GATE8-REL-001` | `passed` | Owner `ready-for-release`; `release.md`가 11 required sections, Gates 1–7 consistent, must trace `24/24`, full/focused/reference/physics passing evidence, known limitations와 release notes를 포함함. Coordinator audit에서 required output/status/blocker/no-change 및 internal-only release boundary 확인 | `completed` | - -## 5. Risk, Blocker, and User-Decision Register - -- active_blockers: 없음 -- critical_user_questions: 없음 -- USER-DECISION-001: `resolved 2026-09-01`; 7-Step draft, phase materialization, Harness implementation/verification execution 승인. `--push`는 승인되지 않음. -- USER-DECISION-002: `resolved 2026-09-01`; isolated linked recovery worktree와 해당 Executor process에 한정한 `danger-full-access` 승인. Original dirty workspace는 immutable backup으로 보존. -- RISK-008: Recovery Executor/commands의 workdir을 `C:/git/FESADev/.worktrees/shell-surface-pressure-load-recovery`로 고정하고 environment fallback을 process 종료 직후 제거한다. -- RISK-009: Pending Step agent가 full CTest를 실행하는 동안 Stop hook이 별도 full CTest를 시작하면 process overlap, timeout과 false failure가 발생한다. Agent는 RED+focused VERIFY, Stop hook은 single whole-project full VERIFY를 소유하도록 경계를 명시한다. -- RISK-001: Element-based `*DLOAD` pressure와 surface-based `*DSLOAD` pressure의 sign/target 의미를 혼합하지 않는다. -- RISK-002: Nonlinear follower pressure의 current-surface force와 external tangent를 fixed-global `*CLOAD`와 혼합하지 않는다. -- RISK-003: Reference artifact 또는 공통 tolerance를 기능 통과를 위해 수정하지 않는다. -- RISK-004: Directly applicable public S4/S4R follower-pressure target 부재는 analytical/tangent/equilibrium suite와 exact stored case를 함께 사용해 보완하며, target을 발명하지 않는다. -- RISK-005: External pressure tangent는 generally nonsymmetric이므로 symmetrize하지 않으며 Numerical Review가 global special-case evidence와 `tau_J`/FD acceptance를 확정한다. -- RISK-006: Stored case의 S4/SPOS/positive `P` coverage 한계는 S4R, side/sign, objectivity와 tangent blocking internal tests로 보완한다. -- RISK-007: Input compatibility는 assembly-level direct/explicit-instance ELSET surface와 parameterless `DSLOAD P` exact subset뿐이며 part-level/implicit qualification/`DLOAD`를 추정 지원하지 않는다. -- adopted_default: 승인 범위 내 secondary detail은 Abaqus surface-pressure behavior와 repository convention을 evidence-backed default로 사용한다. - -## 6. Rework-Loop Control and Stop Condition - -- normalized_failure_attempts: `upstream-io-contract-mismatch` 1회 교정 완료; `environment/sandbox-msvc-filetracker-access-denied` 1회 recovery routing 완료; `harness-parallel-duplicate-full-verification-timeout` 2회 관측, first Correction Agent response explicitly dispatched -- automatic_rework_limit: 동일 normalized failure classification `2`회 -- current_attempt: Gate 7 attempt 1 완료; Gate 8 attempt 1 완료; `post-hook-evidence-amendment` 1회 완료; implementation Steps 1–7 완료; correction 1회 완료; `implementation-planning` 1회 완료; phase materialization 1회 완료; Gates 1–8 완료 -- stop_condition: 동일 classification이 2회이면 자동 재작업을 중단하고 `needs-user-decision` 또는 `blocked`로 전환한다. - -## 7. Final Workflow Closure - -- closure_status: `completed` -- required_evidence: Gates 1–8 owner evidence와 `release.md`의 `ready-for-release` recommendation -- closure_evidence: Gates 1–8 `passed`; `release.md` status `ready-for-release`; must trace `24/24`; blocker 및 open evidence gap 없음. -- current_boundary: Internal feature workflow closed. Publish, deploy, package, tag, merge, push 또는 external release는 별도 명시 권한 없이는 수행하지 않는다. - -## 8. No-Change Assertion - -- source_code: Gate 6 approved implementation에서 변경됨; Coordinator와 post-hook evidence amendment는 변경하지 않음 -- tests: Gate 6 approved TDD implementation에서 변경됨; Coordinator와 post-hook evidence amendment는 변경하지 않음 -- CMake: Gate 6 approved implementation에서 test registration 변경됨; Coordinator와 post-hook evidence amendment는 변경하지 않음 -- reference_artifacts: 변경 없음 -- tolerance_policies: 변경 없음 -- phase_planning: `phases/index.json`에 pending entry append; `phases/shell-surface-pressure-load/index.json`과 `step1.md`–`step7.md` 생성 -- recovery_baseline: Root가 isolated recovery worktree/branch와 baseline commit `2d07106`을 준비하고 MSVC x64 Debug full baseline `302/302 PASS`를 확인함 -- correction_change: `corrections.md` 생성, Step 3–7 verification ownership 문구 최소 교정, pending Step 3 stale `started_at` 제거; source/tests/CMake/hooks/scripts/reference/tolerance/upstream docs 변경 없음 -- coordinator_change: `docs/shell-surface-pressure-load/coordination.md` 생성 및 Gates 1–5와 Gate 6 planning evidence 기록 -- specialist_change: Requirement Agent가 `requirements.md`, Research Agent가 `research.md`, Formulation Agent가 `formulation.md`, Numerical Review Agent가 `numerical-review.md`와 `reference-model.md`, I/O Definition Agent가 `io.md`, Implementation Planning Agent가 `implementation-plan.md`를 각각 생성함 -- gate6_evidence_change: Implementation Agent가 `implementation-report.md`, `build-test.md`, `reference-comparison.md`를 완성하고 post-hook final Stop evidence를 report-only amendment로 반영함; reference/tolerance 변경 없음 -- gate7_evidence_change: Physics Evaluation Agent가 `physics-evaluation.md`만 생성하고 existing HDF5/log/reference evidence를 read-only 감사함; source/tests/CMake/contracts/reference/tolerance/generated evidence 변경 없음 -- gate8_evidence_change: Release Agent가 `release.md`만 생성하고 Gates 1–7과 acceptance traceability를 감사함; source/tests/CMake/upstream reports/reference/tolerance/generated evidence 변경 및 build/test/reference solver 재실행 없음 diff --git a/docs/shell-surface-pressure-load/corrections.md b/docs/shell-surface-pressure-load/corrections.md deleted file mode 100644 index 166e7b5..0000000 --- a/docs/shell-surface-pressure-load/corrections.md +++ /dev/null @@ -1,76 +0,0 @@ -# Shell Surface Pressure Load Correction Report - -## 1. Metadata - -- feature_id: `shell-surface-pressure-load` -- source failure report: `phases/shell-surface-pressure-load/step1-output.json`, `phases/shell-surface-pressure-load/step2-output.json`, `.harness/build/Testing/Temporary/LastTest.log` -- source implementation plan: `docs/shell-surface-pressure-load/implementation-plan.md` -- status: `corrected-for-implementation-rerun` -- owner_agent: `correction-agent` -- date: `2026-09-01` -- normalized failure: `harness-parallel-duplicate-full-verification-timeout` -- attempt count: `2` - -## 2. Failure Triage - -- classification: `harness` -- first failed command: `python scripts/execute.py shell-surface-pressure-load` -- failed target or test: 제품 test 실패가 아니라 Implementation Agent가 실행한 unfiltered full CTest와 automatic Stop whole-project CTest의 중복 실행으로 인한 Harness outer timeout -- evidence tail: Step 2 agent full CTest PID `21572`가 `12:44:03`에 시작되었고, agent command가 `12:45:41`에 반환되기 전에 Codex Stop-hook `stop_validation.py` PIDs `21496`/`20712`가 시작되었다. 별도 Stop full CTest PID `8816`은 `12:46:01`에 시작되었으며 최종 test PID `21964`가 실행되는 동안 Harness는 pipe EOF를 기다렸다. 같은 형태의 overlap이 두 번의 1800초 timeout/slowdown을 만들었다. - -## 3. Root Cause Summary - -Root cause는 implementation defect, test defect 또는 CMake registration issue가 아니다. Pending Step 문서가 Implementation Agent에게 whole-project `cmake --build`와 unfiltered full CTest를 직접 실행하도록 요구하면서 `.codex/hooks.json`의 automatic Stop도 동일한 whole-project 검증을 수행했다. 장시간 reference tests가 병렬로 중복 실행되어 Executor가 Codex process와 pipe 종료를 기다리다 timeout됐다. 따라서 Step 2 output의 `exitCode: 124`는 product test failure가 아니라 Harness orchestration timeout이다. - -## 4. Correction Scope - -변경 범위는 pending Step의 실행 지시를 단일 검증 소유권으로 정규화하는 문구뿐이다. - -- changed documentation: `phases/shell-surface-pressure-load/step3.md`–`step7.md` -- new report: `docs/shell-surface-pressure-load/corrections.md` -- retained agent-owned checks: test-first RED, targeted MSVC x64 Debug build, focused feature/regression CTest, nonzero discovery, warning/contract checks -- retained Stop-owned check: exactly one automatic whole-project MSVC x64 Debug build and unfiltered full CTest -- retained final gate: literal `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`, exact artifact hashes/immutability, approved matching/tolerance and report completeness -- excluded unchanged files: source, public/private headers, tests, CMake, hooks, scripts, `.harness/config.json`, `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`, `coordination.md`, `docs/TOLERANCE.md`, reference artifacts - -`phases/shell-surface-pressure-load/index.json`의 pending Step 3 stale `started_at` 정규화는 Coordinator-owned 작업으로 남겼으며 이 correction에서는 index를 수정하지 않았다. - -## 5. Verification Evidence - -### Step 1/2 evidence audit - -| Step | RED evidence | focused evidence | whole-project evidence | audit decision | -| --- | --- | --- | --- | --- | -| Step 1 | 신규 surface/DSLOAD semantic mapping 부재로 targeted RED가 실제 관찰됨 | parser/domain focused tests `36/36 passed` | MSVC Debug build passed, full CTest `310/310 passed` in `954.19 sec`; feature commit `ca3e4bc`, output commit `d5fc316` 존재 | feature/test evidence는 신뢰 가능하며 outer 1800초 timeout은 Harness overlap으로 분리 | -| Step 2 | invalid pressure input/diagnostic negative-contract assertions의 expected RED가 실제 관찰됨 | Step 2 targeted/focused verification passed | `.harness/build/Testing/Temporary/LastTest.log` LastWrite `2026-09-01 13:11:27`, `Test Passed.` 321, `Test Failed.` 0, CTest error marker 0; feature commit `c3b671d`, output commit `adebfae` 존재 | `exitCode: 124`는 test failure가 아니라 overlapping agent/Stop full CTest timeout | - -### Correction verification - -- targeted reproducer: 실행하지 않음. 요구된 correction은 기존 두 overlap의 PID/timestamp 및 output/log evidence를 감사하는 문서/phase-instruction 교정이며 Harness/build/test 실행은 명시적으로 금지되었다. -- config-resolved full MSVC build/test: 이번 correction에서 실행하지 않음. 다음 Implementation Agent는 focused commands까지만 수행하고 automatic Stop이 exactly one whole-project validation을 소유한다. -- Stop result: 이번 correction turn에서는 Stop/Harness를 실행하지 않음. -- Harness Python pytest: hook/script/config를 변경하지 않았으므로 해당 없음. -- static verification: pending Step 3–7에서 agent-owned unfiltered full CTest와 target 없는 whole-project build가 제거되고, focused/reference commands와 automatic Stop 책임이 남는지 `rg` 및 `git diff --check`로 확인한다. - -## 6. Traceability - -| requirement id | task id | test id/evidence | failing command | corrected file | acceptance criterion | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-SHELL-PRESSURE-005`–`021` | Steps 3–5 | 각 Step의 named kernel/assembly/linear/nonlinear focused suites | agent-owned whole-project build/full CTest followed by automatic Stop | `step3.md`–`step5.md` | RED와 focused regression은 agent가 수행하고 Stop이 단 한 번 full MSVC/CTest를 수행 | -| `FESA-REQ-SHELL-PRESSURE-017`–`024` | Step 6 | `ShellSurfacePressureReference.*` 및 reference regressions | agent-owned whole-project build/full CTest followed by automatic Stop | `step6.md` | exact artifacts, projection, prechecks, common tolerance와 reference classification 유지 | -| `FESA-REQ-SHELL-PRESSURE-001`–`024` | Step 7 | feature suites, nonzero discovery, final reports and Stop evidence | duplicate full verification | `step7.md` | focused gates 뒤 `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`; automatic Stop single full gate; 24/24 report coverage | - -## 7. Handoff Recommendation - -Coordinator는 **같은 Implementation Agent**에 아래 rerun을 요청한다. - -1. `phases/shell-surface-pressure-load/index.json`에서 pending Step 3의 stale `started_at`만 Executor 계약에 맞게 제거하고 Step 1/2 completed fields와 모든 status를 보존한다. -2. 별도 승인된 기존 명령 `python scripts/execute.py shell-surface-pressure-load`로 Step 3부터 재개한다. -3. 각 Step에서 planned test-first RED와 targeted build/focused feature/regression CTest 및 nonzero discovery를 기록한 뒤 status/summary를 갱신하고 agent turn을 종료한다. -4. agent가 target 없는 whole-project build나 unfiltered full CTest를 시작하지 않도록 하며 automatic Stop이 exactly one whole-project MSVC x64 Debug build/test를 소유하게 한다. -5. Step 7은 reference artifact를 변경하지 않고 literal `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`를 완료하며, Stop/Executor evidence를 포함해 Gate 6 보고서를 완결한다. -6. 성공 후 Executor가 feature/output metadata commit을 생성하도록 하고 commit/push는 Executor 계약과 사용자 승인 범위에 따른다. - -## 8. Stop Condition - -동일 normalized classification `harness-parallel-duplicate-full-verification-timeout`이 이미 두 번 발생했으므로 automatic rework는 여기서 중단한다. 수정된 단일-owner 검증 지시로 같은 Implementation Agent rerun을 한 번 요청한다. 같은 overlap이 다시 발생하면 코드 우회 없이 `blocked`로 Coordinator에 반환한다. Upstream contract, tolerance, reference artifact 또는 formulation 변경이 필요해지는 경우에는 `needs-upstream-decision`; MSVC/path/permission 자체가 막히면 `needs-environment-fix`로 반환한다. diff --git a/docs/shell-surface-pressure-load/implementation-plan.md b/docs/shell-surface-pressure-load/implementation-plan.md deleted file mode 100644 index f09ac62..0000000 --- a/docs/shell-surface-pressure-load/implementation-plan.md +++ /dev/null @@ -1,818 +0,0 @@ -# Shell Surface Pressure Load 구현 계획 - -## 1. Metadata - -- `feature_id`: `shell-surface-pressure-load` -- `status`: `draft-awaiting-user-approval` -- `owner_agent`: `implementation-planning-agent` -- `date`: `2026-08-31` -- `source_requirement`: `docs/shell-surface-pressure-load/requirements.md` -- `source_research`: `docs/shell-surface-pressure-load/research.md` -- `source_formulation`: `docs/shell-surface-pressure-load/formulation.md` -- `source_numerical_review`: `docs/shell-surface-pressure-load/numerical-review.md` -- `source_io_definition`: `docs/shell-surface-pressure-load/io.md` -- `source_reference_models`: `docs/shell-surface-pressure-load/reference-model.md` -- `source_coordination_gate`: `docs/shell-surface-pressure-load/coordination.md` -- `proposed_phase_slug`: `shell-surface-pressure-load` -- `proposed_task_name`: `shell-surface-pressure-load` -- `authoritative_output`: input lexical sibling `_results.h5` -- `approval_hard_stop`: 이 문서는 승인용 Step 초안이다. 사용자 승인 전에는 `phases/index.json`, `phases/shell-surface-pressure-load/index.json`, `phases/shell-surface-pressure-load/stepN.md`를 생성하거나 수정하지 않는다. -- `execution_hard_stop`: Step 초안 또는 향후 phase 파일 승인은 Harness 실행 권한이 아니다. `scripts/execute.py`는 별도의 명시적 사용자 실행 요청이 있을 때만 Harness Executor가 실행한다. -- `executor_policy`: 승인 후에도 Step 선택, branch/commit, 상태·시각 기록, Stop 검증과 실행 report는 Harness Executor 소유다. 이 계획은 수동 `git commit`, 일반 sub-agent 실행 또는 대체 executor를 제안하지 않는다. - -## 2. Goal, Architecture, Tech Stack, Spec - -### Goal - -승인된 Abaqus `.inp` subset의 assembly-level `*SURFACE, TYPE=ELEMENT`와 single-static-step `*DSLOAD P`를 Domain semantic model, MITC4 pressure evaluator, 선형/비선형 full-space assembly, 기존 HDF5 결과 경로와 read-only reference comparison까지 끊김 없이 연결한다. 구현은 각 Step에서 반드시 테스트를 먼저 작성하고 실제 실패를 관찰한 뒤 최소 구현과 집중/전체 검증을 수행한다. - -### Architecture - -- `AbaqusInputReader`는 byte-level lexical contract와 `KeywordBlock`/`DataLine` source location을 소유한다. -- `DomainMappingContext`, `TopologyMapper`, 새 candidate `SurfaceDefinitionMapper`, `StepDefinitionMapper`, `DomainBuilder`가 raw input을 완전한 semantic candidate로 만든 뒤 한 번만 `Domain::Create`에 commit한다. -- `Domain`은 immutable ordered surface/facet inventory를, `StepDefinition`은 additive pressure records를 소유한다. `AnalysisModel`은 이를 복사하지 않는 active-step view만 제공하고 Domain이 더 오래 살아야 한다. -- 새 pressure evaluator는 parser, analysis procedure, HDF5, MKL/TBB에 의존하지 않는 solver-core 함수다. element-local `24 x 1` force와 `24 x 24` external tangent candidate를 반환한다. -- 새 surface-pressure assembler는 immutable Domain identity, `DofManager`, trial generalized coordinates와 `ParallelFor`를 받아 element-local candidate를 stable source order로 reduction한다. worker는 global vector/CSR을 직접 갱신하지 않는다. -- 선형 procedure는 reference-configuration pressure를 기존 CLOAD와 합쳐 full-space external load에 한 번만 반영하고, nonlinear procedure는 current-configuration follower force와 generally nonsymmetric external tangent를 같은 trial에서 평가한다. -- `Hdf5ResultsWriter` schema `0`과 `NonlinearHdf5ResultsWriter` schema `1`은 변경하지 않는다. 새 pressure dataset, schema/version/CLI option을 추가하지 않는다. -- reference utility는 FESA가 생성한 schema-1 factor-one HDF5와 exact stored displacement CSV만 비교한다. Abaqus를 실행하지 않으며 stored input/CSV를 수정하지 않는다. - -### Tech Stack - -- C++17, MSVC x64 Debug, CMake, CTest, GoogleTest -- Intel oneAPI MKL PARDISO: linear SPD path는 기존 `MklPardisoSolver`, nonlinear full-CSR unsymmetric path는 기존 `MklPardisoTangentSolver`와 `mtype=11` -- Intel oneAPI TBB behind `ParallelFor` -- HDF5 behind existing writers/self-check/atomic-finalization boundaries -- Python Harness는 phase orchestration용이며 이 기능이 Harness/Python 코드를 변경하지 않으므로 Python test 추가는 없다. - -### Binding Spec - -- 입력·진단·internal model·HDF5·comparison mapping은 `io.md` §§2–10이 우선한다. -- force/tangent, sign, configuration, integration, geometry validity와 deterministic assembly는 `formulation.md` §§6, 9–11, 13–14가 우선한다. -- analytical, finite-difference, objectivity, equilibrium, reference acceptance threshold는 `numerical-review.md` §6과 `docs/TOLERANCE.md`가 우선한다. -- exact reference paths와 dispositions는 `reference-model.md` §§3–8이 우선한다. -- 다른 solver 내부 알고리즘과의 동등성을 주장하지 않는다. Abaqus 결과는 승인된 외부 수치 reference일 뿐이다. - -## 3. Readiness Check - -| input | upstream status / gate evidence | planning disposition | -| --- | --- | --- | -| `requirements.md` | 문서 자체는 `draft-for-coordinator-gate-review`; Coordinator가 Gate 1을 통과시켰고 normative must IDs `001`–`024`가 완결 | binding | -| `research.md` | 문서 자체는 `draft-for-coordinator-gate-review`; Coordinator gate 통과 | binding evidence | -| `formulation.md` | `ready-for-numerical-review` | binding math handoff | -| `numerical-review.md` | `pass-for-io-definition` | binding numerical/reference readiness | -| `reference-model.md` | `pass-for-io-definition` | binding artifact contract | -| `io.md` | `ready-for-implementation-planning` | binding parser/model/HDF5/comparator contract | -| `coordination.md` | Gate 5 `passed`; document `ready-for-implementation-planning` | planning authorized | - -필수 comparison artifacts는 존재하며 경로·hash·cardinality가 upstream에서 고정되었다. 필수 파일은 `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`와 `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` 두 개다. reaction CSV는 존재 여부와 값이 verdict를 바꾸지 않는 review-only inventory이고 stress CSV는 비교 대상에서 제외된다. - -`C:\git\FESADev\.harness\config.json`은 현재 없고 `.harness/config.example.json`만 존재한다. 따라서 Harness Stop의 repository default는 `.harness/build`, CMake/MSVC/CTest다. 현재 `.harness/build/CMakeCache.txt`는 `Visual Studio 18 2026`, `x64`, GoogleTest `C:/git/googletest`, MKL `2026.1`, TBB `2023.1`, HDF5 `2.1.1`로 구성되어 있다. 계획 작성 중 configure/build/test는 실행하지 않았다. - -결론: 구현 계획은 진행 가능하다. blocker는 없으며 유일한 현재 사용자 결정은 아래 7-Step 초안의 승인 또는 수정 요청이다. - -## 4. Implementation Scope - -### Included - -- assembly-level element surface의 direct `instance.element-label` 및 explicit-instance assembly ELSET facet resolution. 하나의 surface가 여러 data line에서 서로 다른 explicit instance의 direct/ELSET member를 함께 포함할 수 있다. -- S4/S4R, SPOS/SNEG, one static step의 additive uniform `DSLOAD P` -- case/ASCII whitespace/numeric/cardinality/keyword continuation/source provenance contract -- exact duplicate normalization warning과 conflicting side를 포함한 deterministic fail-closed diagnostics -- bilinear `2 x 2` pressure force와 exact follower external tangent -- linear reference configuration, nonlinear current configuration, exact-once load-factor scaling -- full-space force/tangent assembly, reaction/free residual/global resultant/moment, deterministic serial/parallel reduction -- 기존 schema 0/1 HDF5 및 CLI/atomic finalization 회귀 -- exact pressure reference input/CSV에 대한 schema-1 factor-one HDF5 comparison과 common tolerance report - -### Excluded - -- `*DLOAD`, `TRVEC`, `PNU`, nonuniform/distribution pressure, nodal surface, part-level surface -- implicit-instance ELSET, 하나의 ELSET 자체가 여러 instance를 섞는 mixed-instance set, part ELSET lookup fallback. 서로 다른 explicit instance에 결속된 여러 member/ELSET를 하나의 surface에 두는 것은 포함 범위다. -- edges, other face labels, solids/beams, shells other than S4/S4R -- multi-step, amplitude, transient, eigen, contact, material/geometric extensions unrelated to pressure -- pressure-specific HDF5 dataset, schema bump, CLI option, result filter, CSV product output -- Abaqus execution, Abaqus CSV creation/repair/rename, reference input/CSV mutation -- reaction or stress external acceptance expansion - -### Non-goals - -- Abaqus internal formulation, integration, stabilization, state or result-generation equivalence -- speculative load hierarchy refactor, generalized distributed-load framework, new vendor abstraction -- unrelated parser cleanup, element refactor, tolerance policy change, documentation portfolio expansion - -## 5. Candidate Interface and Data Contracts - -아래 이름과 파일은 implementation handoff를 위한 candidate다. public compatibility와 upstream 의미를 고정하지만 최종 API/저장 배치는 Implementation Agent가 기존 style과 compile evidence에 맞춰 최소 범위에서 확정한다. - -### Semantic model candidate - -`include/fesa/model/model_types.h`에 다음 의미를 갖는 value types를 추가한다. - -```cpp -enum class ShellSurfaceSide { kSpos, kSneg }; -enum class SurfaceMemberKind { kDirect, kElset }; - -struct ElementSurfaceFacetDefinition { - EntityIndex element_index; - std::size_t facet_ordinal; - std::string part_name_raw; - std::string part_name_canonical; - std::string instance_name_raw; - std::string instance_name_canonical; - std::int64_t source_element_label; - std::string source_element_label_raw; - std::string source_element_type; - ShellSurfaceSide side; - SourceLocation first_member_location; - std::size_t first_member_ordinal; - SurfaceMemberKind member_kind; - std::string elset_name_raw; - std::string elset_name_canonical; -}; - -struct ElementSurfaceDefinition { - std::string surface_name_raw; - std::string surface_name_canonical; - std::vector facets; - SourceLocation declaration_location; - std::size_t declaration_ordinal; -}; - -struct SurfacePressureLoadDefinition { - std::string step_name_raw; - std::string step_name_canonical; - EntityIndex surface_index; - std::string surface_name_raw; - std::string surface_name_canonical; - std::string load_type; - double magnitude; - std::string magnitude_raw; - SourceLocation keyword_location; - SourceLocation data_location; - std::size_t data_ordinal; - std::size_t load_ordinal; -}; -``` - -`ModelDefinition`은 `std::vector element_surfaces`를 소유하고 `StaticStepDefinition`은 `std::vector surface_pressure_loads`를 소유한다. `ElementSurfaceDefinition`의 scope 의미는 exact `assembly`다. Committed facet은 internal lookup/scatter용 `element_index`와 별도로 part/instance raw+canonical identity, source element numeric label+raw token, exact canonical `S4|S4R` source type, side, `facet_ordinal`, 최초 contributing surface member의 file/line/member ordinal, `direct|elset` kind와 ELSET raw+canonical provenance를 계속 소유한다. 따라서 stable source identity가 internal element/equation index로 대체되지 않는다. - -Committed `SurfacePressureLoadDefinition`은 surface lookup용 `surface_index`만 남기는 record가 아니다. sole step과 referenced surface의 raw+canonical identity, exact canonical `load_type="P"`, unscaled signed finite `magnitude`와 `magnitude_raw`, keyword/data `SourceLocation`, DSLOAD block 안의 `data_ordinal`, 전체 step load data에서의 `load_ordinal`을 보존한다. 동일해 보이는 pressure rows도 distinct records이며 `(load_ordinal, facet_ordinal)` Cartesian product가 active contribution identity다. - -`Domain`/`StepDefinition`/`AnalysisModel` candidate query는 다음 의미를 갖는다. - -```cpp -const std::vector& Domain::ElementSurfaces() const noexcept; -const std::vector& -StepDefinition::SurfacePressureLoads() const noexcept; -bool StepDefinition::UsesNonlinearGeometry() const noexcept; -const std::vector& -AnalysisModel::ActiveSurfacePressureLoads() const noexcept; -``` - -모든 반환값은 non-owning immutable reference다. `AnalysisModel`은 surface/facet/load를 복사하지 않고 backing `Domain`이 더 오래 살아야 한다. pressure records는 기존 nodal `Load::ComputeContributions`에 억지로 넣지 않는다. 그 interface는 configuration-independent nodal contributions 전용이고 follower tangent를 표현하지 못하기 때문이다. - -### Local evaluator candidate - -새 `include/fesa/loads/shell_surface_pressure.h`와 `src/fesa/loads/shell_surface_pressure.cpp`는 다음 backend-neutral contract를 제공한다. - -```cpp -enum class SurfacePressureConfiguration { kReference, kCurrent }; - -struct ShellSurfacePressureInput { - std::array reference_coordinates; - std::array translational_displacements; - ShellSurfaceSide side; - double pressure_magnitude; - double load_factor; - SurfacePressureConfiguration configuration; - SourceLocation location; - std::string entity_identity; -}; - -struct ShellSurfacePressureContribution { - std::array force; - std::array external_tangent; -}; - -Result EvaluateShellSurfacePressure( - const ShellSurfacePressureInput& input); -``` - -함수는 fixed node/source order의 row-major tangent를 반환한다. force의 rotational entries와 tangent의 rotational rows/columns는 exact zero다. reference configuration은 `u`를 사용하지 않고 tangent가 exact zero이며, current configuration은 승인된 exact derivative를 반환한다. geometric validation은 pressure 또는 factor가 zero여도 생략하지 않는다. - -### Full-space assembler candidate - -새 `include/fesa/assembly/surface_pressure_assembler.h`와 `src/fesa/assembly/surface_pressure_assembler.cpp`는 다음 contract를 제공한다. - -```cpp -struct SurfacePressureAssemblyCandidate { - Vector full_external_force; - SparseMatrix full_external_tangent; - std::vector diagnostics; -}; - -Result AssembleSurfacePressure( - const AnalysisModel& model, - const DofManager& dofs, - const Vector& full_generalized_coordinates, - double load_factor, - SurfacePressureConfiguration configuration, - const ParallelFor& parallel_for); -``` - -입력 vector는 stable full-DOF `[u1,u2,u3,phi1,phi2,phi3]` order다. assembler는 pressure record source order, 각 surface의 canonical facet order, fixed Gauss order로 local candidates를 만든 뒤 동일 순서로 serial reduction한다. 실패 시 output candidate를 반환하지 않으며 caller-owned `AnalysisState`/`NonlinearTrialState`는 갱신하지 않는다. - -### Procedure composition candidate - -- Linear: `LoadAssembler::AssembleFullNodalLoad(...)` 결과와 `AssembleSurfacePressure(..., 1.0, kReference, ...)`의 full force를 checked finite addition하여 `AnalysisState::ExternalForce()`에 한 번만 assign한다. existing stiffness factorization-before-load order와 `EffectiveFreeRhs(F, Kfc, dc, dofs)`를 보존한다. -- Nonlinear: 같은 trial에서 `AssembleInternal(...)`, existing `AssembleGlobalFixedLoadContribution(...)`, `AssembleSurfacePressure(..., increment.load_factor, kCurrent, ...)`를 평가한다. `f_ext=f_fixed+f_pressure`, `K_ext=K_fixed+K_pressure`, `r=f_int-f_ext`, `K=K_int-K_ext` 순서로 candidate를 완성한 뒤 factorization/solve/validation/commit한다. `MklPardisoTangentSolver`의 existing full-CSR unsymmetric path를 유지하며 tangent를 symmetrize하지 않는다. - -## 6. Candidate Files and Ownership - -### Existing files to modify - -| path | responsibility | -| --- | --- | -| `include/fesa/io/abaqus/input_syntax.h` | continued keyword/source-line representation에 필요한 최소 lexical provenance | -| `src/fesa/io/abaqus/input_reader.cpp` | ASCII, 256-byte logical keyword, keyword-only continuation, comma/whitespace contract | -| `src/fesa/io/abaqus/domain_mapping_context.h` | raw surface/facet/DSLOAD records와 provenance | -| `src/fesa/io/abaqus/domain_mapping_context.cpp` | assembly `SURFACE`, assembly `ELSET INTERNAL`, step `DSLOAD` parsing 및 scope/cardinality diagnostics | -| `src/fesa/io/abaqus/domain_mapper.cpp` | surface resolution stage를 topology finalize와 step definition 사이에 호출 | -| `src/fesa/io/abaqus/step_definition_mapper.cpp` | DSLOAD target를 resolved surface index에 bind하고 procedure rules 검증 | -| `src/fesa/io/abaqus/domain_builder.cpp` | 완전 검증된 surface/load candidate를 ModelDefinition에 commit | -| `include/fesa/model/model_types.h` | immutable surface/facet와 Step pressure value definitions | -| `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp` | Domain/Step ownership과 immutable views | -| `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp` | active pressure non-owning view | -| `src/fesa/analysis/linear_static_procedure.cpp` | reference pressure full-space external force composition | -| `include/fesa/analysis/nonlinear_static_control.h`, `src/fesa/analysis/nonlinear_static_control.cpp` | pressure-independent fixed-load contract를 유지하면서 checked external contribution composition helper가 필요할 때만 최소 확장 | -| `src/fesa/analysis/nonlinear_static_procedure.cpp` | current follower force/tangent, residual/tangent sign, rollback/commit integration | -| `src/fesa/CMakeLists.txt` | 새 production `.cpp` 두 쌍 등록 | -| `tests/CMakeLists.txt` | 새 unit/integration/reference test sources를 기존 targets에 등록; raw `add_test` 추가 없음 | -| `tests/unit/io/abaqus/input_reader_test.cpp` | ASCII/continuation/length/comma lexical tests | -| `tests/unit/io/abaqus/domain_mapper_test.cpp` | 기존 `DLOAD` rejection 및 no-pressure regression 유지/구체화 | -| `tests/unit/io/abaqus/domain_mapping_components_test.cpp` | mapper stage atomicity와 surface resolution component tests | -| `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` | schema 0 inventory/no-pressure-dataset/atomic final regression | -| `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` | schema 1 force/residual/reaction/equilibrium projection/no-new-dataset regression | -| `tests/reference/nonlinear_static_reference_comparison.h`, `tests/reference/nonlinear_static_reference_comparison.cpp` | pressure case contract, optional review artifacts, factor-one projection/prechecks/report | - -### New files to create during implementation - -| path | responsibility / first owning Step | -| --- | --- | -| `src/fesa/io/abaqus/surface_definition_mapper.h` | raw-to-resolved assembly surface mapper internal interface / Step 1 | -| `src/fesa/io/abaqus/surface_definition_mapper.cpp` | direct/ELSET resolution, canonical sort/duplicate policy / Step 1 | -| `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp` | feature-focused valid and fail-closed semantic mapping / Step 1 | -| `include/fesa/loads/shell_surface_pressure.h` | local evaluator input/result contract / Step 3 | -| `src/fesa/loads/shell_surface_pressure.cpp` | bilinear integration, geometry checks, force/external tangent / Step 3 | -| `tests/unit/loads/shell_surface_pressure_test.cpp` | analytical, objectivity, FD, geometry evaluator tests / Step 3 | -| `include/fesa/assembly/surface_pressure_assembler.h` | full-space deterministic assembly candidate / Step 4 | -| `src/fesa/assembly/surface_pressure_assembler.cpp` | local scatter and stable reduction / Step 4 | -| `tests/unit/assembly/surface_pressure_assembler_test.cpp` | source/facet/load order, additive/exact-once, serial/parallel tests / Step 4 | -| `tests/integration/analysis/shell_surface_pressure_linear_test.cpp` | linear procedure/reaction/residual/resultant/HDF5 schema 0 / Step 4 | -| `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp` | follower Newton/tangent/rollback/balance/HDF5 schema 1 / Step 5 | -| `tests/integration/app/shell_surface_pressure_application_test.cpp` | CLI exact input syntax, existing output naming/schema/atomic/no-pressure regression / Step 4 then Step 5 additions | -| `tests/reference/shell_surface_pressure_reference_test.cpp` | exact artifact and end-to-end comparison gate / Step 6 | -| `docs/shell-surface-pressure-load/implementation-report.md` | implementation/task/test/change summary, future Step 7 | -| `docs/shell-surface-pressure-load/build-test.md` | command/exit/duration/tail/warning/runtime evidence, future Step 7 | -| `docs/shell-surface-pressure-load/reference-comparison.md` | artifact snapshots, comparison metrics/classification, future Step 7 | - -`src/fesa/app/fesa_application.cpp`, HDF5 production writers, PARDISO adapters와 existing tolerance policy는 read-first verification targets이며 원칙적으로 수정하지 않는다. 새 tests가 승인된 contract 결함을 실제로 증명할 때만 해당 Step의 bounded scope 안에서 최소 수정하고 report에 이유를 남긴다. - -## 7. Work Breakdown and Harness Step Draft - -모든 Step은 이전 Step이 green인 상태에서 시작하고 단일 reviewer-rejectable responsibility를 완결한다. 각 Step은 `RED -> observed expected failure -> minimal GREEN -> focused VERIFY -> full/Stop VERIFY`를 같은 세션 안에서 끝낸다. 아래 phase 파일들은 제안일 뿐 아직 materialize하지 않는다. - -### Step 1 — `map-pressure-input-contract` - -**Bounded responsibility:** valid assembly `SURFACE`와 step `DSLOAD P`를 immutable Domain/Step/AnalysisModel contract로 map한다. - -**Dependencies:** 없음. - -**Prerequisites/read first:** `input_syntax.h`, `input_reader.cpp`, `domain_mapping_context.h/.cpp`, `topology_mapper.h/.cpp`, `step_definition_mapper.h/.cpp`, `domain_builder.h/.cpp`, `domain_mapper.cpp`, `model_types.h`, `domain.h/.cpp`, `analysis_model.h/.cpp`, upstream `requirements.md` §§6–8, `io.md` §§2–6, `formulation.md` §3. - -**Exact files:** 위 Candidate Files의 parser/model existing files, 새 `surface_definition_mapper.h/.cpp`, 새 `shell_surface_pressure_domain_test.cpp`, `tests/CMakeLists.txt`, `src/fesa/CMakeLists.txt`. - -**RED:** 먼저 다음 named tests를 작성한다. - -- `InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines` -- `ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively` -- `ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter` -- `ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder` -- `ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder` -- `ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords` -- `ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain` -- `ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation` - -`MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder`의 RED fixture는 declaration order가 다른 `Instance-A`와 `Instance-B`, 서로 다른 casing으로 참조한 direct member와 각 instance에 explicit `INSTANCE=`로 결속된 flat assembly ELSET member를 하나의 surface data inventory에 교차 배치한다. Test는 case-insensitive resolution, raw data/member ordinal과 ELSET expansion provenance, canonical facet order, 두 instance에서 numeric label이 같아도 분리되는 part/instance/source label/source type/side identity, 각 unique facet의 first-member provenance를 exact 비교한다. Implicit-instance ELSET을 같은 test의 valid branch로 허용하지 않는다. - -실행: - -```powershell -cmake --build .harness/build --config Debug --target fesa_unit_tests -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain)\." -``` - -**Observed expected failure:** 새 mapper/header 또는 semantic accessors가 없어 compile이 실패하거나, 현재 `SURFACE`/`DSLOAD`가 unsupported input diagnostic으로 거부되어 assertions가 실패해야 한다. Multi-instance RED fixture는 한 surface의 두 explicit instance와 mixed direct/ELSET를 resolve하지 못하거나 committed identity/provenance fields가 없어 exact assertions가 실패해야 한다. unrelated failure면 Step을 중지하고 `regression`으로 분류한다. - -**Minimal GREEN:** 위 candidate semantic signatures를 최소 구현한다. reader는 keyword-only `**,` comment-aware continuation만 결합하며 logical keyword 256 bytes, ASCII, comma/cardinality와 physical source line을 보존한다. surface mapper는 topology finalize 뒤 direct `.` 또는 assembly ELSET의 explicit `INSTANCE`를 case-insensitive하게 resolve한다. 하나의 surface 안에서 direct와 ELSET member를 섞고 서로 다른 두 개 이상의 explicit instance를 참조할 수 있으며, raw data/member order와 flat ELSET expansion provenance를 보존한 뒤 unique facets를 canonical stable order로 만든다. implicit-instance syntax, 하나의 mixed-instance ELSET, part-scope fallback은 허용하지 않는다. step mapper는 parameterless `DSLOAD`, exactly three fields, `P`, finite C-locale scalar를 surface index에 bind하면서 §5 candidate provenance 전부를 보존한다. DomainBuilder는 모든 validation 이후에만 moved ModelDefinition을 commit한다. legacy `StaticStepDefinition` constructors는 empty pressure vector로 delegating하여 existing callers를 깨지 않는다. - -**Focused VERIFY:** 위 RED 명령이 exit `0`이고 모든 named tests가 pass한다. 이어 parser/domain existing suites를 실행한다. - -```powershell -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpDomainMapping|DomainMappingComponents|InpSyntax)\." -``` - -**Full/Stop VERIFY:** 공통 `V-BUILD`, `V-SHOW`, `V-FULL` 명령을 실행한다. - -**Invariants:** 한 surface 안의 mixed direct/ELSET 및 여러 explicit instance는 지원한다. raw surface data/member ordinal과 각 flat ELSET expansion provenance를 stable하게 보존하되 committed unique facet sort는 `(instance declaration ordinal, numeric element label, SPOS before SNEG)`다. S4/S4R part/instance/source label/type/side와 최초 member provenance를 internal index와 함께 보존한다. DSLOAD rows는 raw+canonical step/surface identity, canonical `P`, signed magnitude/raw token, keyword/data location, data/load ordinal을 가진 distinct/additive records다. lookup은 case-insensitive이고 raw spelling은 보존하며 Domain lifetime > AnalysisModel이다. - -**Failure/atomicity:** parse/map failure는 Domain을 반환하지 않으며 partial surface/load가 visible하지 않다. diagnostics는 backend-independent SourceLocation을 가진다. - -**Forbidden scope:** physics evaluator/assembly, `DLOAD`, general surface framework, HDF5/schema, reference artifacts. - -**Trace:** requirements `001`–`004`, `010`, `013`; `IO §§2–6`; `FORM §3`; numerical-review input readiness. - -**Evidence/report:** exact commands, exit codes, expected RED diagnostic/compile reason, mapped facet/load dumps from tests, modified/new paths, warning count. Handoff은 immutable semantic queries와 stable ordering contract다. - -### Step 2 — `reject-invalid-pressure-input` - -**Bounded responsibility:** pressure input/mapping negative semantics와 deterministic diagnostics를 fail-closed/atomic하게 완결한다. - -**Dependencies:** Step 1 green semantic output. - -**Prerequisites/read first:** Step 1 changed files/tests, `core/ascii.h`, `core/diagnostic.h`, `source_target_resolver.h/.cpp`, `io.md` §§2.5–3.4, 5.2, 9, `requirements.md` `014`–`017` acceptance, `formulation.md` §11. - -**Exact files:** `input_reader.cpp`, `domain_mapping_context.h/.cpp`, `surface_definition_mapper.h/.cpp`, `step_definition_mapper.cpp`, `domain_builder.cpp`, `shell_surface_pressure_domain_test.cpp`, existing `domain_mapper_test.cpp` and `domain_mapping_components_test.cpp`. 새 production type은 만들지 않는다. - -**RED named tests:** - -- `ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation` -- `ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds` -- `ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality` -- `ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets` -- `ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets` -- `ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning` -- `ShellSurfacePressureInput.RejectsConflictingSidesForOneElement` -- `ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes` -- `ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication` -- `ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate` -- `ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns` - -RED/focused command: - -```powershell -cmake --build .harness/build --config Debug --target fesa_unit_tests -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(ShellSurfacePressureInput|ShellSurfacePressureDomain)\." -``` - -**Observed expected failure:** Step 1의 happy-path mapper가 unsupported fields를 허용하거나 첫 발견/container order로 진단을 내고, duplicate/conflicting normalization을 구분하지 못해 assertions가 실패해야 한다. - -**Minimal GREEN:** allowed parameter/label/cardinality tables를 exact하게 적용한다. recursive/nested/cyclic ELSET expansion을 금지하고 part/implicit scope fallback을 하지 않는다. exact same-side duplicate는 한 facet으로 normalize하고 한 warning을 stable location/order로 emit하며 conflicting side는 error다. 모든 오류를 candidate validation 단계에서 모으고 `SortDiagnostics` contract로 정렬한 뒤 Domain commit 전에 반환한다. silent skip, guess, average, partial commit은 금지한다. - -**Focused VERIFY:** named negative tests와 모든 `InpDomainMapping` tests exit `0`; golden diagnostic fields `(severity,code,file,line,keyword,entity_identity,message)`와 repeated-run order가 exact하다. - -**Full/Stop VERIFY:** `V-BUILD`, `V-SHOW`, `V-FULL`. - -**Invariants:** exact duplicate warning과 incompatible duplicate error 분리; missing/extra/ambiguous/cyclic/cross-scope/nonfinite 모두 tolerance 이전 차단; legacy input without pressure unchanged. - -**Failure/atomicity:** failed candidate는 Domain/AnalysisState/HDF5로 이동하지 않는다. 실패한 input으로 기존 final output을 건드리지 않는 CLI proof는 Step 4/5에서 추가한다. - -**Forbidden scope:** evaluator, tolerance 완화, artifact rewrite, parser-wide refactor. - -**Trace:** requirements `002`–`004`, `013`–`017`; `IO §§2–6,9`; `FORM §11`; `NR §6` invalid-input rows. - -**Evidence/report:** 각 test의 expected code/location/entity, warning normalization count, repeated diagnostic sequence, RED/GREEN exits. Handoff은 fail-closed semantic model이다. - -### Step 3 — `evaluate-shell-pressure-kernel` - -**Bounded responsibility:** one four-node shell facet의 reference/current pressure force와 exact external tangent를 승인된 geometry policy로 계산한다. - -**Dependencies:** Step 1–2 semantic side/magnitude/source identity. - -**Prerequisites/read first:** `mitc4_shell.h/.cpp`, `nonlinear_mitc4_shell.h/.cpp`, `shell_geometry.h/.cpp`, `vector3.h`, `matrix.h`, existing MITC4 unit/tangent tests, `formulation.md` §§6, 9–10, 13–14, `numerical-review.md` §§3–6. - -**Exact files:** 새 `shell_surface_pressure.h/.cpp`, 새 `shell_surface_pressure_test.cpp`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`. - -**RED named tests:** - -- `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment` -- `ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude` -- `ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent` -- `ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce` -- `ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks` -- `ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective` -- `ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling` -- `ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns` -- `ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent` -- `ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint` -- `ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor` - -RED/focused command: - -```powershell -cmake --build .harness/build --config Debug --target fesa_unit_tests -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureKernel\." -``` - -**Observed expected failure:** new evaluator declaration/definition이 없어 compile/link fail해야 한다. 기존 MITC4 internal-force code를 pressure처럼 재사용하여 GREEN으로 만들지 않는다. - -**Minimal GREEN:** fixed Gauss order `(-1/sqrt(3),-1/sqrt(3))`, `(+,−)`, `(+,+)`, `(−,+)`의 common `2 x 2` rule, bilinear `N_i`, `s=+1/-1`, `f_i=-lambda*p*s*sum(w*N_i*a)`와 approved exact derivative를 직접 구현한다. current coordinates는 `X+u` translation만 사용한다. `tau_J=1e-12`와 mean/corner/Gauss chord-scaled checks, finite/fold/inversion rules를 그대로 적용한다. `max(1,...)`, absolute floor, clamp, connectivity reorder, normal flip, tangent symmetrization은 금지한다. - -**Focused VERIFY acceptance:** shape sum error `<=1e-14`; normalized resultant/moment/sign/objectivity/covariance `<=1e-12`; centered FD `h=1e-5`, normalized tangent error `<=1e-8`; zero rotational blocks exact zero; antisymmetric tangent evidence nonzero; invalid cases exact failure. - -**Full/Stop VERIFY:** focused test 뒤 existing `Mitc4Shell`, `NonlinearMitc4Shell`, `NonlinearMitc4ShellTangent` suites와 `V-BUILD`, `V-SHOW`, `V-FULL`. - -**Invariants:** force/tangent same geometry/Gauss evaluation; sign consistency for both `f_ext` and residual derivative; no state mutation; deterministic fixed loops. - -**Failure/atomicity:** function returns no contribution on any nonfinite/geometry failure; caller arrays/state remain unchanged. - -**Forbidden scope:** element internal stiffness/constitutive changes, pressure stress recovery, integration configurability, vendor dependency. - -**Trace:** requirements `005`–`009`, `016`, `020`–`021`; `FORM §§6,9–10,13–14`; `NR §6` kernel/objectivity/tangent/geometry rows. - -**Evidence/report:** normalized metrics, FD numerator/denominator/h, antisymmetric entries, exact-zero checks, diagnostic identity/location and command exits. Handoff은 pure local evaluator contract다. - -### Step 4 — `integrate-linear-shell-pressure` - -**Bounded responsibility:** reference-configuration pressure를 deterministic full-space linear load path, reaction/free residual/global balance와 existing schema-0 CLI output에 연결한다. - -**Dependencies:** Step 1–3 green. - -**Prerequisites/read first:** Step 3 evaluator, `load_assembler.h/.cpp`, `sparse_assembler.h/.cpp`, `parallel_for.h/.cpp`, `dof_manager.h/.cpp`, `linear_static_procedure.cpp`, `analysis_state.h/.cpp`, `result_recovery.h/.cpp`, `global_equilibrium_recovery.h/.cpp`, HDF5 schema-0 writer/self-check/tests, `fesa_application.cpp`, `io.md` §§7.1, 7.3, 10, `formulation.md` §§9,11–13. - -**Exact files:** 새 `surface_pressure_assembler.h/.cpp`, unit assembler test, new linear integration/app tests, `linear_static_procedure.cpp`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, schema-0 writer test only for contract assertions. HDF5 production writer는 expected no-change. - -**RED named tests:** - -- `SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder` -- `SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce` -- `SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation` -- `LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement` -- `LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction` -- `LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment` -- `LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance` -- `LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset` -- `ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate` -- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior` - -RED/focused commands: - -```powershell -cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(SurfacePressureAssembly|LinearShellSurfacePressure|ShellSurfacePressureApplication)\." -``` - -**Observed expected failure:** assembler header/definition이 없거나 linear procedure가 nodal CLOAD만 assembly하여 pressure resultant/reaction가 zero이고 pressure CLI case가 acceptance를 충족하지 못해야 한다. - -**Minimal GREEN:** local pressure candidates를 source/facet/Gauss stable order로 생성하고 worker-local buffers에서 full DOF/scatter COO를 만들며 fixed serial reduction한다. linear procedure는 stiffness partition/factorization 후 existing CLOAD와 reference pressure full force를 checked add하고, projection 전 `state.ExternalForce()`에 한 번만 commit한다. evaluator에는 load factor `1.0`을 정확히 한 번 전달한다. existing `Kff/Kfc`, 0x0 free system, `K*d-F` recovery와 output finalization order는 보존한다. - -**Focused VERIFY acceptance:** analytical normalized force/moment/reaction/mesh/order errors `<=1e-12`; global force/moment balance `<=1e-8`; free residual uses approved existing scale gates; repeated serial/parallel output and diagnostics exact; schema version `0`, existing mandatory datasets만 존재하고 pressure-specific path는 없다; failed candidate가 prior final bytes를 보존한다. - -**Full/Stop VERIFY:** existing `LoadAssembly`, `SparseAssembly`, `LinearStaticCli`, `Mitc4ShellCli`, `Hdf5ResultsWriter` suites와 `V-BUILD`, `V-SHOW`, `V-FULL`. - -**Invariants:** factorization-before-load; full-space before free/constrained projection; linear tangent exact zero; pressure load factor exact once; worker global CSR write 금지; source/internal/equation IDs 분리. - -**Failure/atomicity:** any local/nonfinite/assembly/recovery failure returns before state/result publication; HDF5 existing final preserved by current atomic writer. - -**Forbidden scope:** nonlinear follower path, schema change, linear solver backend change, output dataset addition. - -**Trace:** requirements `005`–`007`, `010`–`013`, `016`–`020`; `IO §§6–7,9–10`; `FORM §§9,11–14`; `NR §6` linear/resultant/balance rows. - -**Evidence/report:** stable contribution order, external vector/reaction/residual/resultants, schema inventory, final-file snapshots, RED/GREEN exits. Handoff은 validated linear pressure path와 reusable full-space assembler다. - -### Step 5 — `integrate-nonlinear-follower-pressure` - -**Bounded responsibility:** current-configuration follower pressure force와 generally nonsymmetric external tangent를 nonlinear full-Newton trial/commit lifecycle 및 schema-1 output에 연결한다. - -**Dependencies:** Step 1–4 green. - -**Prerequisites/read first:** Step 3–4 evaluator/assembler, `nonlinear_static_control.h/.cpp`, `nonlinear_static_procedure.h/.cpp`, `nonlinear_analysis_state.h/.cpp`, `nonlinear_mitc4_shell.h/.cpp`, `tangent_solver.h`, `mkl_pardiso_tangent_solver.h/.cpp`, nonlinear HDF5 writer/self-check/tests, `prepared_analysis.h/.cpp`, `fesa_application.cpp`, `formulation.md` §§9.2–9.4, 11–13, `numerical-review.md` §6 nonlinear suite, `io.md` §§7.2, 7.4. - -**Exact files:** `nonlinear_static_control.h/.cpp` only if checked contribution composition needs a helper, `nonlinear_static_procedure.cpp`, new nonlinear integration/app tests, nonlinear HDF5 writer test. Existing PARDISO/HDF5/app production files are no-change verification targets unless a test exposes a contract gap. - -**RED named tests:** - -- `NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry` -- `NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns` -- `NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce` -- `NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath` -- `NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence` -- `NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance` -- `NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea` -- `NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically` -- `NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput` -- `NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium` -- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior` - -RED/focused commands: - -```powershell -cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearShellSurfacePressure|ShellSurfacePressureApplication)\." -``` - -**Observed expected failure:** nonlinear procedure가 existing fixed-global CLOAD만 `f_ext`에 포함하고 pressure force/tangent를 누락하여 follower/objectivity/sign/balance assertions 또는 pressure nonlinear case가 실패해야 한다. - -**Minimal GREEN:** each Newton trial에서 current pressure candidate를 평가하고 fixed/pressure external contributions를 stable checked add한다. internal과 external은 같은 trial이다. `r=f_int-f_ext`, `K=K_int-K_ext`를 full space에서 만든 후 constrained/free extraction한다. existing `FactorizeFresh` full-CSR `mtype=11` path를 사용하고 external tangent를 symmetrize하지 않는다. convergence가 검증된 candidate만 `CommitAcceptedFrame`에 전달하며 invalid geometry/nonfinite/factorization/solve failure는 committed frame/final HDF5를 보존한다. - -**Focused VERIFY acceptance:** local FD `<=1e-8`; objectivity/current-area normalized `<=1e-12`; factor-one global force/moment balance `<=1e-8`; force/moment free residual은 existing nonzero scale relative `<=1e-2`, zero scale absolute `<=1e-3`; exact zero-scale rules 유지; schema version `1`의 unique factor-one accepted frame에 existing generalized external/internal/residual/reaction/equilibrium datasets가 일치한다; serial/parallel report order exact. - -**Full/Stop VERIFY:** existing `NonlinearStaticProcedure`, `NonlinearStaticControl`, `TangentSolver`, `NonlinearHdf5ResultsWriter`, nonlinear reference regression suites와 `V-BUILD`, `V-SHOW`, `V-FULL`. - -**Invariants:** translations only affect pressure kinematics; rotation force/tangent blocks zero; load factor exact once; generally nonsymmetric tangent retained; candidate-before-commit; stable reduction. - -**Failure/atomicity:** failure does not append an accepted frame, does not replace existing final HDF5 and records last completed Newton stage/pressure source identity deterministically. - -**Forbidden scope:** line search/arc length/new procedure, convergence threshold change, PARDISO adapter redesign, new HDF5 fields. - -**Trace:** requirements `008`–`013`, `016`–`019`, `021`; `IO §§6–7,9–10`; `FORM §§9–14`; `NR §6` follower/tangent/objectivity/open-patch/balance rows. - -**Evidence/report:** trial factor, force/tangent signs, nonsymmetry entries, solver spy events, iteration counts, free residual/balance metrics, HDF5 datasets, rollback snapshots, exits/durations/tails. - -### Step 6 — `compare-pressure-reference` - -**Bounded responsibility:** exact stored pressure artifacts와 FESA schema-1 factor-one HDF5의 deterministic displacement comparison을 기존 common tolerance policy에 연결한다. - -**Dependencies:** Step 1–5 green; exact reference files read-only. - -**Prerequisites/read first:** `reference-model.md` 전체, `io.md` §8, `numerical-review.md` §§6.2–6.3, `docs/TOLERANCE.md`, `reference_tolerance_policy.h/.cpp`, nonlinear reference comparison header/source/cases, `tests/CMakeLists.txt`, exact input/CSV. Artifact bytes는 inspection만 하고 수정하지 않는다. - -**Exact files:** `nonlinear_static_reference_comparison.h/.cpp`, new `shell_surface_pressure_reference_test.cpp`, `tests/CMakeLists.txt`. tolerance policy source와 stored reference files는 no-change. - -**RED named tests:** - -- `ShellSurfacePressureReference.AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts` -- `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame` -- `ShellSurfacePressureReference.Projects729WideRowsTo2187LogicalRowsPerFamily` -- `ShellSurfacePressureReference.MatchesByInstanceNodeLabelAndComponentNotRowOrder` -- `ShellSurfacePressureReference.RejectsSchemaIdentityCardinalityMissingExtraDuplicateAndNonfiniteBeforeTolerance` -- `ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly` -- `ShellSurfacePressureReference.ExcludesReactionAndStressFamiliesFromVerdict` -- `ShellSurfacePressureReference.UsesUnchangedCommonScaleNearZeroRelativeAndRmsPolicy` -- `ShellSurfacePressureReference.WritesDeterministicComparisonReport` - -RED/focused commands: - -```powershell -cmake --build .harness/build --config Debug --target fesa_reference_tests -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\." -``` - -**Observed expected failure:** current nonlinear case registry requires coarse/fine legacy artifact portfolios and has no pressure case identity/disposition, so exact two-file pressure contract 또는 729/2187 cardinality가 지원되지 않아 test가 fail해야 한다. - -**Minimal GREEN:** `NonlinearReferenceCase`에 pressure case의 required/optional/excluded artifact disposition을 explicit value fields로 표현한다. exact path/hash snapshot 뒤 input을 build-tree execution directory에 byte-for-byte copy하고 FESA application만 실행한다. HDF5에서 schema `1`, Step-1, unique accepted `load_factor==1`, `/model/nodes`, nodal displacement를 읽어 `(Part-1-1,node label,component)` key로 project한다. wide CSV 729 rows를 translation 2,187 + rotation 2,187 logical rows로 expand한다. all prechecks 후 기존 `EvaluateReferenceTolerance`만 호출한다. U family blocking, UR warning-only이며 reaction은 comparator family를 만들지 않고 review-only inventory, stress는 excluded다. - -**Focused VERIFY acceptance:** input and displacement CSV exact hash/byte size unchanged; 729 unique node keys; each U/UR family 2,187 rows; missing/extra/duplicate/nonfinite/schema/frame/identity failures precede tolerance; common policy `S=max(abs(reference))`, near-zero band `0.01*S`, relative `0.05`, RMS/S `0.01`, zero-scale exact; report rows/warnings/metrics stable. - -**Full/Stop VERIFY:** all `ShellSurfacePressureReference`, `NonlinearStaticReference`, `ReferenceTolerancePolicy`, `Mitc4Reference` suites와 `V-BUILD`, `V-SHOW`, `V-FULL`. - -**Invariants:** stored input/CSV immutable; Abaqus never run; FESA CSV is not product output; reference row order ignored but source keys exact; tolerance unchanged. - -**Failure/atomicity:** any artifact/precheck failure produces failed classification without tolerance result or artifact mutation. copied execution files and generated HDF5/log remain under build tree only. - -**Forbidden scope:** reference CSV generation/edit, new tolerance, reaction/stress promotion, legacy artifact rename/metadata requirement. - -**Trace:** requirements `017`–`019`, `021`–`024`; `IO §8`; reference-model §§3–8; numerical-review external acceptance. - -**Evidence/report:** before/after snapshots, copied input hash, generated HDF5 path, selected frame identity, family cardinality/scale/row/RMS/worst row, warnings, classification, exits/durations/tails. - -### Step 7 — `verify-and-report-pressure-feature` - -**Bounded responsibility:** all implementation artifacts를 inspect하고 full MSVC/CTest 및 exact pressure reference gate를 실행해 implementation-owned reports를 완결한다. 코드 수정은 이 Step의 기본 scope가 아니다. - -**Dependencies:** Step 1–6 green; clean or isolated executor worktree; no stored reference mutation. - -**Prerequisites/read first:** all prior Step outputs, `AGENTS.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, `.codex/hooks.json`, `.harness/config.json` if it exists at execution time, current CMake files, all upstream docs, exact reference bundle. - -**Exact files:** future new `implementation-report.md`, `build-test.md`, `reference-comparison.md`. Test/production/CMake files are read-only in this Step unless a verification failure is classified `implementation` and Coordinator authorizes returning to the owning earlier Step; no silent repair here. - -**RED:** report preflight must first prove the three implementation-owned reports are absent/incomplete and that no final passing classification has been recorded. This is the expected evidence-state failure, not permission to fabricate results. If any source/test/CMake change lacks a first-failing test record, classify `evidence-gap` and stop. - -**Minimal GREEN sequence:** literally execute `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` after build/test gates: - -1. **ARTIFACT CHECK:** record exact stored input/displacement CSV path, sha256, size, timestamp before run; reaction review-only and stress excluded disposition; verify source phase never invokes Abaqus. -2. **COMPARE:** run FESA on a copied exact `.inp`, locate generated schema-1 `_results.h5`, execute `ShellSurfacePressureReference` comparison, record 2,187 U and 2,187 UR rows and common tolerance metrics. -3. **CLASSIFY:** fail on U/precheck/internal equilibrium; preserve UR-only difference as warning-only; reaction/stress cannot change verdict. Distinguish `implementation`, `test`, `infrastructure`, `environment`, `artifact`, `regression`, `evidence-gap`. -4. **REPORT:** write commands, exit codes, durations, meaningful output tails, warning inventory, changed files, requirement coverage and artifact post-check to all three reports. - -**Exact commands:** execute `V-CONFIG`, `V-BUILD`, `V-SHOW`, `V-FOCUSED`, `V-FULL`, `V-REFERENCE` from §12. No Harness Python command because no Harness/Python file changes are planned. If an executor later changes `scripts/` or Harness Python behavior under separate authority, it must additionally run `uv run --with pytest python -m pytest -v -rs` and record why. - -**Observed expected failure:** any configure/build/test/reference nonzero exit, zero discovered tests, new `/W4 /WX` warning, runtime DLL staging failure, artifact mutation, cardinality mismatch or U blocking failure keeps reports non-passing and stops closure. - -**Focused/Full/Stop VERIFY:** every command exit `0`, `ctest --show-only=json-v1` reports nonzero tests including all named feature tests, full CTest passes, no new warnings, runtime execution succeeds, artifacts unchanged, reports internally consistent. - -**Invariants:** evidence before success claims; no release approval; no physics Gate 7 claim; no commit/task selection/manual status/timestamp ownership transfer from Harness Executor. - -**Failure/atomicity:** a failed gate leaves status non-passing, retains outputs for diagnosis, does not alter upstream/tolerance/reference artifacts and returns to Coordinator with precise classification. - -**Forbidden scope:** source fixes, reference generation, tolerance adjustment, phase execution expansion, release readiness. - -**Trace:** all requirements `001`–`024`; all upstream contracts; Harness Stop contract. - -**Evidence/report:** complete three-document handoff with task order, tests first, files, commands, comparison, assumptions, acceptance and open constraints. - -## 8. TDD Test Plan - -| order | test id | layer / named suite | RED cause | GREEN evidence | -| --- | --- | --- | --- | --- | -| 1 | `T-INPUT-VALID` | `InpSyntax`, `ShellSurfacePressureInput`, `ShellSurfacePressureDomain` valid tests | unsupported SURFACE/DSLOAD or missing semantic API | exact valid mapping/provenance/ownership | -| 2 | `T-INPUT-NEG` | pressure input negative tests | unsupported forms accepted or unstable/partial failure | fail-closed deterministic diagnostics and no Domain | -| 3 | `T-KERNEL-FORCE` | `ShellSurfacePressureKernel` analytical/sign/resultant/objectivity | evaluator absent | approved force integration and exact zero rotations | -| 4 | `T-KERNEL-TANGENT` | kernel FD/nonsymmetry/geometry | external derivative absent | `h=1e-5`, normalized `<=1e-8`, geometry gate exact | -| 5 | `T-ASSEMBLY` | `SurfacePressureAssembly` | full-space assembler absent | stable additive exact-once serial/parallel reduction | -| 6 | `T-LINEAR` | `LinearShellSurfacePressure` | linear procedure omits pressure | reference force/reaction/residual/resultant and schema 0 | -| 7 | `T-NONLINEAR` | `NonlinearShellSurfacePressure` | nonlinear external force/tangent omit pressure | current follower Newton convergence, rollback and schema 1 | -| 8 | `T-CLI-HDF5` | `ShellSurfacePressureApplication` plus writer tests | pressure route/output regression not covered | existing naming/schema/projection/atomic/no-pressure behavior | -| 9 | `T-REF-PRECHECK` | pressure reference precheck tests | registry/schema/cardinality unsupported | deterministic prechecks before tolerance | -| 10 | `T-REF-COMPARE` | pressure reference end-to-end tests | pressure disposition/comparison unsupported | exact U blocking/UR warning-only report | -| 11 | `E-FINAL` | full build/test/reference evidence | reports incomplete | verified commands and immutable artifact snapshots | - -모든 production change는 같은 Step에서 먼저 생성/수정되는 관련 C++ test와 연결한다. `src/fesa/CMakeLists.txt` production 등록은 corresponding unit test RED와 함께 들어가며, `tests/CMakeLists.txt` 등록은 test source를 생성한 같은 Step에서 한다. - -## 9. CMake/CTest Plan - -- `src/fesa/CMakeLists.txt`: `surface_definition_mapper.cpp`, `shell_surface_pressure.cpp`, `surface_pressure_assembler.cpp`를 existing `fesa_solver` source inventory에 추가한다. public headers는 existing include tree를 통해 노출하고 별도 library/target을 만들지 않는다. -- `tests/CMakeLists.txt`: 새 unit sources는 `fesa_unit_tests`, integration/app sources는 `fesa_integration_tests`, reference source는 `fesa_reference_tests`에 추가한다. -- existing `gtest_discover_tests`가 개별 `Suite.Test` CTest entries를 만든다. 새 raw `add_test`는 필요하지 않다. -- feature-specific selection은 exact suite-name regex로 한다. existing target-wide legacy labels를 전면 재분류하지 않는다. 필요하면 각 `gtest_discover_tests(... PROPERTIES LABELS ...)`의 existing labels에 `shell-surface-pressure-load`를 append하되 기존 labels를 삭제하지 않는다. -- `.harness/config.json`이 execution 전에 생기면 그 설정이 아래 cache-derived command보다 우선한다. 현재는 없으므로 `.harness/build` default와 현재 MSVC x64 Debug cache를 사용한다. -- `ctest --show-only=json-v1`에서 discovered test count가 zero면 success로 인정하지 않는다. -- runtime staging은 existing `fesa_cli`, integration/reference target의 MKL/TBB/HDF5 DLL copy rules를 그대로 사용하며 새 manual PATH hack을 만들지 않는다. - -## 10. Data Flow Contract - -```text -exact/approved Abaqus .inp - -> AbaqusInputReader KeywordBlock/DataLine + physical SourceLocation - -> DomainMappingContext raw SURFACE/DSLOAD candidate - -> topology finalize -> SurfaceDefinitionMapper -> StepDefinitionMapper - -> Domain-owned ordered ElementSurfaceDefinition - + Step-owned ordered SurfacePressureLoadDefinition - -> AnalysisModel non-owning active view (Domain outlives view) - -> ShellSurfacePressureEvaluator local force/tangent candidates - -> SurfacePressureAssembler stable full-space reduction - -> linear: Fext(ref), Kext=0 - nonlinear: Fext(current), Kext(current) - -> residual/reaction/equilibrium recovery - -> existing atomic HDF5 writer - -> authoritative _results.h5 - -> schema-1 factor-one HDF5 projection keyed by - (Step-1, factor=1, Part-1-1, source node label, component) - -> exact read-only displacement CSV projection - -> prechecks -> unchanged common tolerance -> deterministic report -``` - -Exact reference flow: - -- Input: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` -- Required CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` -- FESA run: input copy under `.harness/build/reference/shell-surface-pressure-load/`; never Abaqus -- HDF5: schema `1`, `Step-1`, unique accepted factor-one frame, `/model/nodes`, existing nodal displacement/generalized force/residual/reaction/equilibrium paths -- CSV: 729 wide node rows; U1/U2/U3 = 2,187 blocking logical rows; UR1/UR2/UR3 = 2,187 warning-only logical rows -- Reaction CSV: optional review-only inventory, no comparison family/verdict effect -- Stress CSV: excluded, no comparison family -- Prechecks: missing/extra/duplicate/nonfinite/schema/frame/source-id/component/cardinality before tolerance -- Tolerance: family-specific Abaqus-only `S=max(abs(reference))`; `abs(ref)<=0.01*S`이면 absolute row error `<=0.01*S`, otherwise relative error `<=0.05`; `RMS(error)/S<=0.01`; zero-scale는 FESA exact zero only. - -## 11. Acceptance Traceability Matrix - -| requirement | Step | task/test evidence | acceptance criterion | -| --- | --- | --- | --- | -| `FESA-REQ-SHELL-PRESSURE-001` | 1, 7 | `T-INPUT-VALID`; valid direct/ELSET S4/S4R tests | approved SURFACE + DSLOAD sequence exact | -| `FESA-REQ-SHELL-PRESSURE-002` | 1, 2 | finite scalar/raw text, nonfinite/D-exponent tests | one uniform finite force/area scalar per row | -| `FESA-REQ-SHELL-PRESSURE-003` | 1, 2, 4 | canonical facet/order tests; assembler order | unique deterministic instance/label/side list | -| `FESA-REQ-SHELL-PRESSURE-004` | 1, 2 | S4/S4R/SPOS/SNEG valid and unsupported inventory | only approved shell types/sides; source type/label preserved | -| `FESA-REQ-SHELL-PRESSURE-005` | 3, 4 | sign reversal and linear analytical tests | positive opposite selected normal; negative reverses | -| `FESA-REQ-SHELL-PRESSURE-006` | 3, 4 | connectivity/SPOS/SNEG reversal | SPOS connectivity normal, SNEG inverse exact | -| `FESA-REQ-SHELL-PRESSURE-007` | 3, 4 | reference geometry and prescribed-displacement invariant | linear pressure fixed to reference geometry | -| `FESA-REQ-SHELL-PRESSURE-008` | 3, 5 | current area/normal/objectivity tests | nonlinear follower uses `X+u` | -| `FESA-REQ-SHELL-PRESSURE-009` | 3, 5 | centered FD and Newton tangent sign tests | exact external derivative included | -| `FESA-REQ-SHELL-PRESSURE-010` | 1, 4, 5 | additive records/unit factor/increment factor tests | pressure magnitude scaled exactly once | -| `FESA-REQ-SHELL-PRESSURE-011` | 4, 5 | full-DOF scatter before projection tests | all pressure assembled full-space first | -| `FESA-REQ-SHELL-PRESSURE-012` | 4, 5, 7 | reaction/free residual/global balance | `K*d-F` or `f_int-f_ext` includes pressure | -| `FESA-REQ-SHELL-PRESSURE-013` | 1, 2, 4, 5, 6 | repeated serial/parallel/order/report tests | deterministic facets, reductions, rows, diagnostics | -| `FESA-REQ-SHELL-PRESSURE-014` | 2 | unsupported params/labels/distribution/type/side tests | fail closed exact | -| `FESA-REQ-SHELL-PRESSURE-015` | 2 | missing/empty/ambiguous/cyclic/scope/duplicate tests | fail closed, no guessing/averaging | -| `FESA-REQ-SHELL-PRESSURE-016` | 2, 3, 4, 5 | invalid procedure/nonfinite/geometry/rollback | no clamp/fallback/partial result | -| `FESA-REQ-SHELL-PRESSURE-017` | 2, 4, 5, 6, 7 | stable diagnostics, no Domain, final snapshots | failed candidate never published | -| `FESA-REQ-SHELL-PRESSURE-018` | 4, 5, 7 | schema 0/1 inventory tests | existing HDF5 sole authority; no pressure dataset/version | -| `FESA-REQ-SHELL-PRESSURE-019` | 4, 5, 6 | displacement/reaction/residual/equilibrium projections | existing units/coordinates/source IDs finite and observable | -| `FESA-REQ-SHELL-PRESSURE-020` | 3, 4 | analytical sign/resultant/reaction/mesh/order suite | normalized analytical checks at approved thresholds | -| `FESA-REQ-SHELL-PRESSURE-021` | 3, 5, 7 | objectivity/current-area/FD/residual/balance/open-patch | FD `<=1e-8`, balance `<=1e-8`, other approved gates | -| `FESA-REQ-SHELL-PRESSURE-022` | 6, 7 | exact artifact audit and immutable snapshots | exact required input/displacement CSV only | -| `FESA-REQ-SHELL-PRESSURE-023` | 6, 7 | 729/2187 key mapping, U/UR disposition, tolerance report | U blocking; UR warning; deterministic factor-one comparison | -| `FESA-REQ-SHELL-PRESSURE-024` | 6, 7 | absent reaction/stress families and classification tests | reaction review-only, stress excluded; internal gates retained | - -Coverage: normative IDs `24`, mapped IDs `24`, orphan IDs `0`. Every must requirement has at least one implementation/verification Step and one named test/evidence item. - -## 12. Validation Commands - -현재 execution context는 `.harness/config.json` 부재, existing `.harness/build` cache 존재다. 실행 시 config가 생겼으면 Harness가 그 값을 먼저 resolve하고 reports에 실제 command를 기록한다. - -### `V-CONFIG` — clean/config-resolved MSVC x64 Debug configure - -```powershell -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" -``` - -### `V-BUILD` - -```powershell -cmake --build .harness/build --config Debug -``` - -Acceptance: exit `0`; new MSVC warning `0`; `/W4 /WX` 유지; `fesa_solver`, `fesa_cli`, `fesa_unit_tests`, `fesa_integration_tests`, `fesa_reference_tests` all build; runtime staging errors 없음. - -### `V-SHOW` - -```powershell -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -``` - -Acceptance: exit `0`, discovered count `>0`, 모든 새 named suite가 inventory에 존재. - -### `V-FOCUSED` - -```powershell -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain|ShellSurfacePressureKernel|SurfacePressureAssembly|LinearShellSurfacePressure|NonlinearShellSurfacePressure|ShellSurfacePressureApplication|ShellSurfacePressureReference)\." -``` - -Acceptance: exit `0`, selected count `>0`, failed `0`. - -### `V-FULL` - -```powershell -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -Acceptance: exit `0`, failed `0`, existing no-pressure/beam/shell/nonlinear/reference regressions pass. - -### `V-REFERENCE` - -```powershell -ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\." -``` - -Acceptance: exit `0`; exact artifact post-snapshots equal pre-snapshots; U blocking pass; any UR deviations warning-only; internal balance pass; 729 wide/2,187 logical rows per family exact; reaction/stress verdict exclusion exact. - -Harness Python behavior/file은 범위 밖이므로 이 plan에는 Python test 실행을 넣지 않는다. 별도 승인된 Harness/Python 변경이 발생하는 경우에만 다음을 추가한다. - -```powershell -uv run --with pytest python -m pytest -v -rs -``` - -## 13. Risks and Downstream Handoff - -| risk | mitigation / stop condition | -| --- | --- | -| existing `Load` abstraction에 follower tangent를 강제로 넣어 ownership 왜곡 | 별도 evaluator/assembler candidate 유지; public nodal load contract를 변경하지 않음 | -| surface parser와 topology resolution order 혼동 | topology finalize 후 surface, surface 후 step binding 순서 고정 | -| duplicate normalization이 additive DSLOAD와 혼동 | facet exact duplicate만 normalize; DSLOAD records는 항상 distinct/additive | -| nonlinear sign 또는 factor double application | force and residual FD 두 부호 모두 test; factor at assembler boundary once | -| tangent symmetrization 또는 SPD solver 경로 | antisymmetric evidence test; existing `MklPardisoTangentSolver` `mtype=11` spy/adapter tests | -| invalid geometry가 zero load에서 bypass | evaluator zero pressure/factor geometry rejection test | -| parallel nondeterminism | worker-local candidates + fixed source/facet/Gauss serial reduction; repeated byte/metric order tests | -| HDF5 schema creep | no-new-path inventory and version `0`/`1` exact tests | -| reference utility가 legacy four-file portfolio를 강요 | per-case required/optional/excluded disposition을 explicit하게 추가; exact pressure two-file gate | -| reference comparison으로 implementation bug 은폐 | artifact/row prechecks first, tolerance unchanged, U blocking, internal balance retained | -| build environment drift | execution-time `.harness/config.json` precedence; actual commands/cache/toolchain recorded | - -Coordinator를 통한 Implementation Agent 단일 handoff: - -- task order: Step 1 → 7, 각 Step 안의 RED/GREEN/VERIFY 순서 -- first tests: §7 named tests와 §8 test IDs -- candidate files/signatures: §§5–6 -- validation commands: §12 -- HDF5/reference mapping: §10 -- tolerance/identity assumptions: common policy unchanged, factor-one, `(instance,node label,component)`, U blocking/UR warning-only -- acceptance criteria: §11 전 24 requirements + each Step metrics -- open constraints: phase files는 사용자 승인 이후 Planning Agent가 materialize; Executor는 별도 explicit request 이후만 실행; reference artifacts와 tolerance read-only - -## 14. Open Issues - -Implementation readiness를 막는 requirements/formulation/I/O/tolerance/reference/architecture gap은 없다. 다음은 blocker가 아닌 execution-time checks다. - -- Step execution 직전 `.harness/config.json` 생성 여부를 다시 확인해 config precedence를 적용한다. -- current build cache paths가 execution host에서 유효한지 `V-CONFIG`/`V-BUILD` 결과로 증명한다. -- 새 feature suite가 `ctest --show-only=json-v1`에 실제 발견되는지 확인한다. -- exact reference artifact pre/post snapshot을 같은 run에서 기록한다. - -현재 critical user decision은 이 7-Step draft의 `approve` 또는 구체적인 revision 요청이다. 승인만으로 phase 파일을 실행하거나 `scripts/execute.py`를 호출하지 않는다. - -## 15. Plan Self-Review - -- 실제 존재가 확인된 existing paths만 modify/read 대상으로 기재했다. -- 새 paths는 §6의 new-file table에서 first owning Step과 함께 명시했다. -- semantic/evaluator/assembler signatures와 linear/nonlinear caller contract를 Steps 사이에 동일하게 유지했다. -- requirements `001`–`024` 모두 Step과 named test/evidence에 연결했고 orphan이 없다. -- exact reference input/CSV, schema-1 factor-one, 729/2,187 cardinality, dispositions와 tolerance mapping을 포함했다. -- 모든 구현 Step에 test-first RED, expected failure, minimal GREEN, focused/full verification, invariants, atomicity, forbidden scope, trace, handoff evidence를 포함했다. -- final Step은 `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` 순서를 literal하게 보존하고 세 implementation-owned reports를 소유한다. -- manual commit, task selection, executor-owned timestamp/status 기록을 계획하지 않았다. -- `phases/`, source, tests, CMake, config/hooks, upstream docs, tolerance, reference artifacts는 이 planning turn에서 변경하지 않았다. -- `phases/index.json`와 phase task files는 사용자 승인 전 materialize하지 않았으며 Harness Executor 실행도 요청하지 않았다. diff --git a/docs/shell-surface-pressure-load/implementation-report.md b/docs/shell-surface-pressure-load/implementation-report.md deleted file mode 100644 index d45019d..0000000 --- a/docs/shell-surface-pressure-load/implementation-report.md +++ /dev/null @@ -1,121 +0,0 @@ -# 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 소유권이다. The Harness phase completed locally at -`2026-09-01 17:43:57`; that automatic Stop build passed, discovery was -nonzero, and its full CTest was `362/362 PASS`, `0 failed`. The historical -command/evidence detail is recorded in `build-test.md` from -`step7-output.json`, `LastTest.log`, and metadata `2c91462`, `bf2339c`, -`c4d1e2a`. - -## 한계와 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/lessons.md b/docs/shell-surface-pressure-load/lessons.md new file mode 100644 index 0000000..1249b02 --- /dev/null +++ b/docs/shell-surface-pressure-load/lessons.md @@ -0,0 +1,52 @@ +# Shell 표면 압력 수정과 시행착오 + +아래는 당시 실패 재현·원인·수정·검증 기록이다. 임시 shell/Hook/phase 복구 명령은 현재 실행 절차가 아니다. + + + + +## Shell Surface Pressure Load Correction Report + + +### 1. Metadata + +- feature_id: `shell-surface-pressure-load` +- source failure report: `phases/shell-surface-pressure-load/step1-output.json`, `phases/shell-surface-pressure-load/step2-output.json`, `.harness/build/Testing/Temporary/LastTest.log` +- source implementation plan: `docs/shell-surface-pressure-load/README.md` +- status: `corrected-for-implementation-rerun` +- date: `2026-09-01` +- normalized failure: `harness-parallel-duplicate-full-verification-timeout` +- attempt count: `2` + + +### 2. Failure Triage + +- classification: `harness` +- first failed command: `python scripts/execute.py shell-surface-pressure-load` +- failed target or test: 제품 test 실패가 아니라 Implementation Agent가 실행한 unfiltered full CTest와 automatic Stop whole-project CTest의 중복 실행으로 인한 Harness outer timeout +- evidence tail: Step 2 agent full CTest PID `21572`가 `12:44:03`에 시작되었고, agent command가 `12:45:41`에 반환되기 전에 Codex Stop-hook `stop_validation.py` PIDs `21496`/`20712`가 시작되었다. 별도 Stop full CTest PID `8816`은 `12:46:01`에 시작되었으며 최종 test PID `21964`가 실행되는 동안 Harness는 pipe EOF를 기다렸다. 같은 형태의 overlap이 두 번의 1800초 timeout/slowdown을 만들었다. + + +### 3. Root Cause Summary + +Root cause는 implementation defect, test defect 또는 CMake registration issue가 아니다. Pending Step 문서가 Implementation Agent에게 whole-project `cmake --build`와 unfiltered full CTest를 직접 실행하도록 요구하면서 `.codex/hooks.json`의 automatic Stop도 동일한 whole-project 검증을 수행했다. 장시간 reference tests가 병렬로 중복 실행되어 Executor가 Codex process와 pipe 종료를 기다리다 timeout됐다. 따라서 Step 2 output의 `exitCode: 124`는 product test failure가 아니라 Harness orchestration timeout이다. + + +### 5. Verification Evidence + + +#### Step 1/2 evidence audit + +| Step | RED evidence | focused evidence | whole-project evidence | audit decision | +| --- | --- | --- | --- | --- | +| Step 1 | 신규 surface/DSLOAD semantic mapping 부재로 targeted RED가 실제 관찰됨 | parser/domain focused tests `36/36 passed` | MSVC Debug build passed, full CTest `310/310 passed` in `954.19 sec`; feature commit `ca3e4bc`, output commit `d5fc316` 존재 | feature/test evidence는 신뢰 가능하며 outer 1800초 timeout은 Harness overlap으로 분리 | +| Step 2 | invalid pressure input/diagnostic negative-contract assertions의 expected RED가 실제 관찰됨 | Step 2 targeted/focused verification passed | `.harness/build/Testing/Temporary/LastTest.log` LastWrite `2026-09-01 13:11:27`, `Test Passed.` 321, `Test Failed.` 0, CTest error marker 0; feature commit `c3b671d`, output commit `adebfae` 존재 | `exitCode: 124`는 test failure가 아니라 overlapping agent/Stop full CTest timeout | + + +#### Correction verification + +- targeted reproducer: 실행하지 않음. 요구된 correction은 기존 두 overlap의 PID/timestamp 및 output/log evidence를 감사하는 문서/phase-instruction 교정이며 Harness/build/test 실행은 명시적으로 금지되었다. +- config-resolved full MSVC build/test: 이번 correction에서 실행하지 않음. 다음 Implementation Agent는 focused commands까지만 수행하고 automatic Stop이 exactly one whole-project validation을 소유한다. +- Stop result: 이번 correction turn에서는 Stop/Harness를 실행하지 않음. +- Harness Python pytest: hook/script/config를 변경하지 않았으므로 해당 없음. +- static verification: pending Step 3–7에서 agent-owned unfiltered full CTest와 target 없는 whole-project build가 제거되고, focused/reference commands와 automatic Stop 책임이 남는지 `rg` 및 `git diff --check`로 확인한다. diff --git a/docs/shell-surface-pressure-load/physics-evaluation.md b/docs/shell-surface-pressure-load/physics-evaluation.md deleted file mode 100644 index dd4a203..0000000 --- a/docs/shell-surface-pressure-load/physics-evaluation.md +++ /dev/null @@ -1,103 +0,0 @@ -# Shell Surface Pressure Load 물리 평가 - -## 1. Metadata - -- feature_id: `shell-surface-pressure-load` -- source reference comparison report: `docs/shell-surface-pressure-load/reference-comparison.md` -- source reference model: `docs/shell-surface-pressure-load/reference-model.md` -- status: `pass-for-release-agent` -- owner_agent: `physics-evaluation-agent` -- date: `2026-09-01` -- evaluated commit: `1eb4dce885175b78b8229b095f14cac102ea93df` - -이 판정은 승인된 물리 기대와 기존 Gate 6 evidence에 한정한다. Abaqus 내부 formulation, -integration, stabilization 또는 result recovery와의 동등성을 주장하지 않으며 release -readiness를 승인하지 않는다. - -## 2. Input Evidence - -### 2.1 Gate와 artifact - -`reference-comparison.md`는 명시적으로 `pass-for-physics-evaluation` handoff를 권고하고, -blocking `U1/U2/U3` 2,187/2,187 rows와 warning-only `UR1/UR2/UR3` 2,187/2,187 rows가 -모두 통과했음을 기록한다. Physics Gate는 그 tolerance 판정을 재승인하지 않고, 통과한 -비교 결과를 물리 plausibility의 선행 조건으로만 사용했다. - -| evidence | exact path / identity | read-only 확인 | -| --- | --- | --- | -| solver HDF5 | `.harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure_results.h5` | schema `1`, 10 accepted frames, unique factor-one frame `9` / increment `10`; SHA-256 `74f35e3e59edd05460733b1d6367994c7f4a1e847b366f2efad6fbecc03796f3` | -| nonlinear log | `.harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure_log.txt` | factor-one iteration `3`: `combined_pass=1`, `transition=accepted`; SHA-256 `8555ff365dcf1f066813d0cce6440c3d56c9840baf8246696daa7b2e7b0061a1` | -| required input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | 56,665 bytes, SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e` | -| required Abaqus CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | 729 finite wide rows; SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198` | -| optional Abaqus CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | `review-only`; SHA-256 `a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6` | -| excluded Abaqus CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | `excluded`; SHA-256 `bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128` | -| test record | `.harness/build/Testing/Temporary/LastTest.log` | existing automatic Stop evidence에서 full CTest `362/362 PASS`; 관련 physics test의 개별 pass 기록 확인 | -| optional FESA debug CSV views | 없음 | 요구되거나 생성된 debug CSV가 없으며 official output으로 사용하지 않음 | - -확인한 authoritative quantities는 factor-one global nodal displacement, generalized external/ -internal force, generalized residual, constrained reaction, global equilibrium, physical strain -energy, 기존 MITC4 generalized strain/section resultant/stress다. Model purpose는 729-node, -676-element `S4` square shell의 `SPOS`, positive `P=1e6`, `NLGEOM=YES` current-surface follower -pressure response를 end-to-end로 확인하고, stored case가 직접 포함하지 않는 sign, S4R, -linear, objectivity와 tangent 경계를 승인 internal tests로 보완하는 것이다. - -## 3. Physics Checks - -| physics check | status | evidence와 판정 | -| --- | --- | --- | -| global equilibrium | `pass` | Factor-one applied force sum은 `[8.626e-12, -7.311e-12, -1.0000000000000016e8]`이고 constrained reaction force sum은 `[-5.047e-6, -3.331e-6, 9.999999999999714e7]`이다. HDF5 stored balance를 approved current-arm scales로 다시 normalize하면 force `6.758e-14`, moment `3.725e-14`로 둘 다 `<=1e-8`이다. | -| reaction consistency | `pass` | Constrained DOF에서 `/nodal/reaction`과 `generalized_residual`은 exact 일치했다. Pressure resultant의 `-Z` `1.0e8`에 대해 masked constrained reaction은 `+Z` `9.999999999999714e7`이며, tiny `X/Y`와 moment remainder는 위 global balance gate 안이다. | -| displacement direction | `pass` | Reference connectivity의 `SPOS` vector area는 `+Z`, positive pressure resultant는 `-Z`다. Factor-one HDF5의 729개 `UZ`는 모두 nonpositive이며 625개 free nodes는 negative, 104개 constrained boundary nodes는 exact zero다. Center node의 `UZ=-5.514459701328648e-3`로 load 방향과 deformation mode가 일치한다. | -| pressure sign, resultant, and moment | `pass` | Current configuration의 quadrature vector-area oracle은 expected force `[-1.723e-12, 2.450e-11, -1.0000000000000025e8]`를 주며 HDF5 applied resultant와의 normalized error는 `8.94e-16`이다. Current-arm applied moment oracle error는 승인 `M_Sigma` 기준 `1.32e-16`이다. Existing `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment`와 `ReversesExactlyForSposSnegAndNegativeMagnitude`도 full CTest 기록에서 pass했다. | -| symmetry and expected zero | `pass` | Feature-blocking exact-zero contract인 pressure generalized external rotational entries는 factor-one HDF5에서 exact zero다. Zero pressure/factor geometry validation test도 pass했다. Stored square patch의 mirror symmetry는 보조 sanity로만 확인했으며 `UX/UY/UZ` mirror mismatch의 최대 절대값은 `1.63e-16`, `1.09e-16`, `8.89e-17` 이하다. 별도 외부 symmetry tolerance를 만들지 않았다. | -| nonlinear follower objectivity and current-area behavior | `pass` | HDF5 resultant는 factor-one current `X+u` vector-area oracle과 위 roundoff 수준으로 일치했다. Current scalar area/reference scalar area ratio는 `1.0000006316335197`로 finite하다. Stored symmetric case만으로 reference/current path를 분리하지 않고, existing tests `UsesCurrentAreaAndNormalForFollowerForce`, `IsTranslationAndRigidRotationObjective`, `IsObjectiveUnderRigidMotionAndTracksCurrentArea`, `MatchesCenteredFiniteDifferenceForForceAndResidualSigns`의 pass evidence로 rigid rotation covariance, `gamma=1.25` area/resultant scaling, follower direction과 external tangent sign을 보완했다. | -| element force balance | `not-separately-applicable` | 이 feature는 pressure-only element force row나 element end-action balance contract를 정의하지 않는다. 대신 HDF5에서 `generalized_internal_force - generalized_external_force - generalized_residual`은 element assembly 이후 nodal full space에서 exact zero이고 global resultant/moment gate가 pass했다. Existing MITC4 section resultants는 finite이며 별도 pressure comparator를 만들지 않았다. | -| stress/strain | `pass-sanity-only` | Factor-one `generalized_strain`, `section_resultant`, `stress`의 component names, units, `shell-local` coordinate system과 `midsurface`/`section-position` location은 `io.md`와 일치하고 모든 값이 finite다. 관측 range는 strain `[-9.842e-4, 1.801e-3]`, section resultant `[-4.595e6, 8.646e6]`, stress `[-1.036e8, 1.039e8]`이다. Feature-specific stress sign/reference expectation은 없고 stress CSV는 `excluded`이므로 그 이상의 pass를 주장하지 않는다. | -| rigid body mode | `pass-no-symptom` | Stored case는 104 boundary nodes의 DOF 1–6을 구속하고 625 interior nodes가 자유다. 모든 accepted frame이 finite하게 수렴했고 factor-one maximum translation은 `5.514e-3`로 10-unit span 대비 `5.514e-4`이며 unbounded translation, near-zero-stiffness 또는 impossible displacement 증상이 없다. Pressure가 support를 제공한다는 주장은 하지 않는다. | -| energy/residual | `pass` | 모든 HDF5 numeric dataset과 required U/UR rows는 finite다. Factor-one free translation residual은 `9.06582420157065e-6 / 1.47929199940215e5 = 6.12849e-11 <=1e-2`; zero-external-scale rotation residual은 `1.3758908607997e-6 <=1e-3`이다. Existing `PHYSICAL_STRAIN_ENERGY=86418.04713575779`는 finite positive 보조 evidence이며 pressure-only energy gate로 사용하지 않았다. HDF5 diagnostics는 result-neutral ignored-keyword warning 4개뿐이고 error/nonfinite diagnostic은 없다. | -| model coverage | `pass` | Stored case의 declared inventory `729 nodes / 676 S4 / SPOS / positive P / NLGEOM=YES`와 unique factor-one frame이 모두 확인됐다. Stored case가 직접 다루지 않는 `S4R`, `SNEG`, negative/zero magnitude, linear reference configuration, exact resultant/moment, current-area objectivity와 tangent는 Numerical Review가 지정한 internal portfolio에서 해당 named tests가 pass했다. 승인 범위 밖의 추가 reference portfolio는 요구하지 않는다. | - -## 4. Failure Classification - -- failure classification: `none` -- 다음 분류는 발생하지 않았다: `equilibrium-failure`, `reaction-inconsistency`, - `displacement-direction-failure`, `symmetry-failure`, `stress-location-failure`, - `element-force-inconsistency`, `rigid-body-mode-suspected`, `nonfinite-result`, - `model-coverage-gap`, `upstream-contract`, `environment`. - -`element force balance`의 `not-separately-applicable`과 stress의 `pass-sanity-only`는 upstream -contract가 의도적으로 pressure-only element/stress acceptance family를 만들지 않은 데 따른 -범위 표시이며 failure 또는 evidence gap이 아니다. - -## 5. Evaluation Verdict - -**Verdict: `pass-for-release-agent`.** - -문서화된 pressure 방향/부호, resultant/moment, reaction/equilibrium, exact-zero와 보조 symmetry, -nonlinear follower objectivity/current-area, residual/nonfinite 및 declared model coverage가 모두 -물리적으로 일관된다. Release Agent가 release readiness를 별도로 audit할 수 있다. 이 verdict는 -release approval, publish 권한 또는 reference tolerance의 재승인이 아니다. - -## 6. Handoff Recommendation - -- handoff target: `Release Agent` -- route: 항상 `Coordinator Agent`를 통해 전달 -- recommendation: Gate 8은 requirements-to-physics traceability, known limitations와 release - evidence를 독립 audit한다. Physics Evaluation Agent는 Gate 8을 시작하거나 승인하지 않는다. - -## 7. No-Change Assertion - -이 평가에서 source, header, test, CMake, Harness, phase files, `coordination.md`, upstream feature -contracts, implementation reports, reference input/CSV artifacts, `results.h5`, nonlinear log, -`docs/TOLERANCE.md`와 tolerance policy를 수정하지 않았다. 생성한 파일은 -`docs/shell-surface-pressure-load/physics-evaluation.md` 하나뿐이다. - -## 8. Open Issues - -- missing physical expectations: 없음. -- incomplete model coverage: 없음. Stored-case 한계는 승인 internal tests로 보완되며 추가 - reference case는 계약상 요구되지 않는다. -- contradictory sign conventions: 없음. -- unavailable energy/residual evidence: 없음. Existing energy와 residual HDF5/log evidence를 - 사용했으며 새 pressure-only energy quantity는 요구되지 않는다. -- blockers: 없음. diff --git a/docs/shell-surface-pressure-load/reference-comparison.md b/docs/shell-surface-pressure-load/reference-comparison.md deleted file mode 100644 index 5d3e0af..0000000 --- a/docs/shell-surface-pressure-load/reference-comparison.md +++ /dev/null @@ -1,122 +0,0 @@ -# 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의 판정 범위 밖이다. diff --git a/docs/shell-surface-pressure-load/release.md b/docs/shell-surface-pressure-load/release.md index 38f5bba..0c65a7b 100644 --- a/docs/shell-surface-pressure-load/release.md +++ b/docs/shell-surface-pressure-load/release.md @@ -1,10 +1,13 @@ # Shell Surface Pressure Load 릴리스 준비 보고서 +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + ## 1. Metadata - feature_id: `shell-surface-pressure-load` - status: `ready-for-release` -- owner_agent: `release-agent` - date: `2026-09-01` - audited_head: `e5e8ccc8ff84a97e64ab2bc1889b5ab7aaae1c77` - physics_evaluated_commit: `1eb4dce885175b78b8229b095f14cac102ea93df` @@ -17,123 +20,6 @@ 본 판정은 FESA 기능 전달 workflow의 내부 release readiness에 한정한다. Publish, deploy, package, tag, merge, commit, push 또는 외부 배포 권한을 부여하지 않는다. -## 2. Release Scope - -| 구분 | 포함 범위 | -| --- | --- | -| 기능 | Assembly-level `*SURFACE, TYPE=ELEMENT, NAME=`의 `SPOS|SNEG` member에 step-level `*DSLOAD`의 uniform finite scalar `P`를 적용 | -| analysis type | 단일 linear static의 reference-configuration pressure, 단일 `NLGEOM=YES` full-Newton nonlinear static의 current-configuration follower pressure와 external tangent | -| elements | Source type과 label을 보존하는 four-node `S4`, `S4R`; 기존 FESA MITC4 선택 | -| materials/sections | 기존 linear isotropic elastic MITC4 shell material/section; 이 기능은 material 범위를 확장하지 않음 | -| load semantics | Positive `P`는 selected surface normal 반대 방향, negative `P`는 방향 반전, load factor는 정확히 한 번 적용 | -| assembly/physics | Stable full-DOF external load/tangent assembly, free/constrained projection, reaction/free residual, current-arm global force/moment equilibrium, deterministic ordering | -| input subset | Direct `.` member와 explicit `INSTANCE=`에 결속된 flat assembly ELSET member; case-insensitive lookup과 stable raw/source identity | -| result scope | 기존 schema `0`/`1` HDF5의 displacement, generalized force/residual, reaction, global equilibrium 및 기존 MITC4 result chain; 새 pressure-only dataset 없음 | -| reference scope | Exact stored nonlinear S4/SPOS/positive-`P` case의 factor-one nodal `U1/U2/U3` blocking, `UR1/UR2/UR3` warning-only comparison | -| artifact scope | Runtime authoritative artifact는 `_results.h5`; CSV는 external reference/debug evidence이며 FESA product output이 아님 | - -Release 범위에서 제외되는 핵심 항목은 `*DLOAD`, nonuniform/field/user pressure, -node/edge/double-sided/contact surface, S4/S4R 이외 element, material nonlinearity, dynamics, -thermal/contact/buckling, multiple-step propagation, surface offset/thickness-side correction, -pressure-only result quantity 및 다른 solver 내부 알고리즘과의 동등성 주장이다. - -## 3. Gate Evidence Inventory - -| Gate evidence | feature/status 감사 결과 | release disposition | -| --- | --- | --- | -| `requirements.md` | 동일 feature, must `001`–`024`; 초기 `draft-for-coordinator-gate-review` label을 유지하지만 Coordinator Gate 1 통과 및 이후 전 단계의 binding baseline으로 사용됨 | pass | -| `research.md` | 동일 feature; 초기 gate-review label을 유지하며 formulation/reference 범위와 non-equivalence 경계가 후속 문서에 반영됨 | pass | -| `formulation.md` | `ready-for-numerical-review`; force/tangent/sign/configuration/assembly 계약이 `numerical-review.md`에서 독립 승인됨 | pass | -| `numerical-review.md` | `pass-for-io-definition`; `tau_J=1.0e-12`, analytical/objectivity/tangent/equilibrium gate 확정 | pass | -| `reference-model.md` | `pass-for-io-definition`; exact required input/CSV, row identity, U/UR disposition과 immutable artifact contract 확정 | pass | -| `io.md` | `ready-for-implementation-planning`; input subset, semantic identity, diagnostics, schema `0`/`1`, HDF5-to-CSV projection 확정 | pass | -| `implementation-plan.md` | archival pre-execution label은 `draft-awaiting-user-approval`; 승인 후 materialized Steps 1–7 실행 및 Gate 6 보고서로 plan 이행이 입증됨 | pass | -| `implementation-report.md` | `pass-for-physics-evaluation` 권고; TDD Steps 1–6와 final evidence audit 완료 | pass | -| `build-test.md` | focused `64/64`, pressure reference `9/9`, automatic Stop full MSVC/CTest `362/362`, `0 failed`, 새 `/W4 /WX` warning 없음 | pass | -| `reference-comparison.md` | explicit `pass-for-physics-evaluation`; precheck 통과, U blocking `2187/2187`, UR warning-only `2187/2187`, 두 family row/RMS 모두 pass | pass | -| `corrections.md` | 중복 full-verification Harness timeout을 implementation defect와 분리하고 단일 Stop owner로 교정; 이후 full `362/362`로 해소됨 | resolved/pass | -| `physics-evaluation.md` | `pass-for-release-agent`; force/moment normalized balance `6.758e-14`/`3.725e-14 <= 1e-8`, blocker 없음 | pass | - -Staleness 감사에서 Physics Agent가 평가한 `1eb4dce`는 현재 HEAD의 ancestor이며, 그 이후 -변경은 `coordination.md`와 `physics-evaluation.md`뿐이다. 평가 후 source, test, CMake, -reference artifact 또는 tolerance 변경은 없다. 초기 문서의 archival status label과 -`implementation-report.md`의 compact requirement/evidence shorthand는 Coordinator 승인, -`implementation-plan.md` §11, 실제 named-suite inventory, reference 및 physics evidence로 -교차 확인했다. Release acceptance를 바꾸는 미해결 상태·범위·수치 모순은 없다. - -### Release Checklist - -- [x] 필수 Gate 1–7 문서가 모두 존재하고 `feature_id`가 일치한다. -- [x] Full MSVC x64 Debug build/CTest evidence가 `362/362 PASS`, `0 failed`다. -- [x] `reference-comparison.md`가 `pass-for-physics-evaluation`이고 required comparison file이 모두 존재한다. -- [x] `physics-evaluation.md`가 `pass-for-release-agent`다. -- [x] Must requirement `24/24`가 acceptance, test/internal model, required external reference 및 release disposition에 연결된다. -- [x] Exact input/CSV hash와 path가 구현 전후 동일하다. -- [x] Blocking U family, warning-only UR family 및 internal equilibrium evidence가 모두 pass했다. -- [x] Unsupported/deferred 범위와 accepted limitations를 사용자-facing하게 기록했다. -- [x] Unresolved implementation defect, missing declared comparison file, tolerance 변경 또는 upstream decision이 없다. -- [x] 이 판정이 외부 release 권한이 아님을 명시했다. - -## 4. Acceptance Traceability - -`test id`는 `implementation-plan.md`의 TDD ID와 실제 passing named suite를 함께 나타낸다. -`BM-*`는 `research.md`의 bounded verification model이며, external case가 필요한 항목에는 -`shellnl-meshfine-pressure-s4-follower`를 명시한다. - -| requirement id | compact acceptance criterion | test id / passing evidence | reference model id | verification report | release disposition | -| --- | --- | --- | --- | --- | --- | -| `FESA-REQ-SHELL-PRESSURE-001` | Approved SURFACE+DSLOAD S4/S4R mapping과 identity 보존 | `T-INPUT-VALID`; `InpSyntax`, `ShellSurfacePressureInput` | `BM-07` + internal valid fixtures | `build-test.md` | included/pass | -| `FESA-REQ-SHELL-PRESSURE-002` | Positive/zero/negative finite scalar exact-once, nonfinite reject | `T-INPUT-VALID`, `T-INPUT-NEG`; `ShellSurfacePressureDomain` | `BM-01`, `BM-08` | `build-test.md` | included/pass | -| `FESA-REQ-SHELL-PRESSURE-003` | Unique deterministic instance/element/side inventory와 order | `T-INPUT-VALID`, `T-ASSEMBLY`; `SurfacePressureAssembly` | `BM-03` | `build-test.md` | included/pass | -| `FESA-REQ-SHELL-PRESSURE-004` | Only S4/S4R and SPOS/SNEG; source type/label 보존 | `T-INPUT-VALID`, `T-INPUT-NEG`; target rejection cases | `BM-01`, `BM-08` | `build-test.md` | constraint/pass | -| `FESA-REQ-SHELL-PRESSURE-005` | Positive pressure는 selected normal 반대, negative는 정확히 반전 | `T-KERNEL-FORCE`; `ReversesExactlyForSposSnegAndNegativeMagnitude` | `BM-01` | `build-test.md`, `physics-evaluation.md` | physics/pass | -| `FESA-REQ-SHELL-PRESSURE-006` | Connectivity-derived SPOS normal과 SNEG inverse | `T-KERNEL-FORCE`; sign/connectivity kernel cases | `BM-01`, `BM-02` | `build-test.md`, `physics-evaluation.md` | physics/pass | -| `FESA-REQ-SHELL-PRESSURE-007` | Linear pressure는 reference area/normal에서 displacement-independent | `T-KERNEL-FORCE`, `T-LINEAR`; `LinearShellSurfacePressure` | `BM-01`, `BM-02` | `build-test.md` | included/pass | -| `FESA-REQ-SHELL-PRESSURE-008` | NLGEOM pressure는 current `X+u` follower load | `T-KERNEL-FORCE`, `T-NONLINEAR`; current-area/objectivity cases | `BM-04`, `BM-07` | `build-test.md`, `physics-evaluation.md` | physics/pass | -| `FESA-REQ-SHELL-PRESSURE-009` | External follower-force derivative가 Newton tangent에 포함 | `T-KERNEL-TANGENT`, `T-NONLINEAR`; centered FD/sign cases | `BM-05`, `BM-06` | `build-test.md`, `physics-evaluation.md` | numerical/pass | -| `FESA-REQ-SHELL-PRESSURE-010` | Step load factor `0/0.5/1`을 정확히 한 번 적용 | `T-ASSEMBLY`, `T-LINEAR`, `T-NONLINEAR`; factor cases | `BM-03`, `BM-06` | `build-test.md` | numerical/pass | -| `FESA-REQ-SHELL-PRESSURE-011` | Stable full-DOF external load/tangent 후 projection | `T-ASSEMBLY`, `T-LINEAR`; full-space/order cases | `BM-03` | `build-test.md` | included/pass | -| `FESA-REQ-SHELL-PRESSURE-012` | Pressure가 constrained reaction과 free residual에 포함 | `T-LINEAR`, `T-NONLINEAR`; reaction/residual/balance cases | `BM-01`, `BM-06`, `BM-07` | `reference-comparison.md`, `physics-evaluation.md` | physics/pass | -| `FESA-REQ-SHELL-PRESSURE-013` | Resolution/reduction/result/diagnostic/comparison order 결정적 | `T-INPUT-VALID`, `T-ASSEMBLY`, `T-NONLINEAR`, `T-REF-COMPARE` | `BM-03`, `BM-07` | `build-test.md`, `reference-comparison.md` | constraint/pass | -| `FESA-REQ-SHELL-PRESSURE-014` | Unsupported SURFACE/DSLOAD variant fail-closed | `T-INPUT-NEG`; `ShellSurfacePressureInput` negative matrix | `BM-08` | `build-test.md` | constraint/pass | -| `FESA-REQ-SHELL-PRESSURE-015` | Missing/empty/ambiguous/conflicting/scope target fail-closed | `T-INPUT-NEG`; mapping failure/no-partial-candidate cases | `BM-08` | `build-test.md` | constraint/pass | -| `FESA-REQ-SHELL-PRESSURE-016` | Unsupported procedure, nonfinite, invalid geometry fail-closed | `T-INPUT-NEG`, `T-KERNEL-TANGENT`, `T-NONLINEAR`; rollback cases | `BM-04`, `BM-05`, `BM-08` | `build-test.md` | constraint/pass | -| `FESA-REQ-SHELL-PRESSURE-017` | Stable diagnostics와 failed candidate/output atomicity | `T-INPUT-NEG`, `T-CLI-HDF5`, `T-NONLINEAR`; final preservation cases | `BM-08` | `build-test.md` | output/pass | -| `FESA-REQ-SHELL-PRESSURE-018` | 기존 schema `0/1` HDF5만 authoritative; 새 pressure dataset 없음 | `T-CLI-HDF5`; schema/no-new-path writer regressions | `BM-07` | `implementation-report.md`, `build-test.md` | output/pass | -| `FESA-REQ-SHELL-PRESSURE-019` | Existing displacement/reaction/residual/equilibrium/result chain finite | `T-LINEAR`, `T-NONLINEAR`, `T-REF-COMPARE` | `BM-06`, `BM-07` | `reference-comparison.md`, `physics-evaluation.md` | output/pass | -| `FESA-REQ-SHELL-PRESSURE-020` | Linear S4/S4R sign/resultant/reaction/mesh-order suite 통과 | `T-KERNEL-FORCE`, `T-LINEAR`; analytical suites | `BM-01`–`BM-03` | `build-test.md`, `physics-evaluation.md` | verification/pass | -| `FESA-REQ-SHELL-PRESSURE-021` | Objectivity/current-area/tangent/residual/global balance 통과 | `T-KERNEL-TANGENT`, `T-NONLINEAR`; force/moment `<=1e-8` | `BM-04`–`BM-06`, `BM-07` | `reference-comparison.md`, `physics-evaluation.md` | verification/pass | -| `FESA-REQ-SHELL-PRESSURE-022` | Exact required input/CSV를 current path에서 read-only 사용 | `T-REF-PRECHECK`, `E-FINAL`; hash/size pre/post match | `shellnl-meshfine-pressure-s4-follower` | `reference-comparison.md` | verification/pass | -| `FESA-REQ-SHELL-PRESSURE-023` | Factor-one source-key mapping, U blocking/UR warning, precheck first | `T-REF-PRECHECK`, `T-REF-COMPARE`, `E-FINAL`; `2187+2187` | `shellnl-meshfine-pressure-s4-follower` | `reference-comparison.md` | verification/pass | -| `FESA-REQ-SHELL-PRESSURE-024` | Reaction CSV review-only, stress CSV excluded, internal balance 유지 | `T-REF-COMPARE`; no reaction/stress verdict family | `shellnl-meshfine-pressure-s4-follower` | `reference-comparison.md`, `physics-evaluation.md` | constraint/pass | - -Trace result: must requirements `24`, release-scoped rows `24`, orphan `0`, deferred must `0`, -missing feature-required comparison files `0`. - -## 5. Validation Evidence - -| evidence | command / source | result | -| --- | --- | --- | -| Configure | `cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ...` | exit `0`; MSVC 19.51.36252.0 | -| Focused build | `cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests fesa_reference_tests` | exit `0`; new warning `0` | -| Discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `362` discovered, feature suites nonzero | -| Focused CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain|ShellSurfacePressureKernel|SurfacePressureAssembly|LinearShellSurfacePressure|NonlinearShellSurfacePressure|ShellSurfacePressureApplication|ShellSurfacePressureReference)\."` | `64/64 PASS` | -| FESA reference execution | `fesa.exe .harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure.inp` | exit `0`; factor-one increment accepted; schema-1 HDF5 atomic publish | -| Pressure comparison | `ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."` | `9/9 PASS` before and after generated HDF5 | -| Automatic Stop build | `cmake --build .harness/build --config Debug` | PASS | -| Automatic Stop full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | `362/362 PASS`, `0 failed` | -| Harness Python pytest | N/A | Harness/Python behavior 및 file 변경이 없어 upstream plan/report에서 적용 대상이 아님 | - -Reference artifact pre/post evidence: - -- Required input: SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`, `56,665` bytes, unchanged. -- Required displacement CSV: SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`, `111,182` bytes, unchanged. -- `pressure_nodal_translation_blocking`: `2187/2187` rows pass, relative RMS `5.18831997081359e-5 <= 0.01`. -- `pressure_nodal_rotation_warning`: `2187/2187` rows pass, relative RMS `3.10406152731217e-4 <= 0.01`; warning `0`. -- Accepted free translation residual: `6.12848863188238e-11 <= 1e-2`. -- Accepted free rotation residual: zero-external-scale branch `1.3758908607997e-6 <= 1e-3`. -- Physics re-evaluation: normalized force balance `6.758e-14`, moment balance `3.725e-14`, each `<=1e-8`. - ## 6. Known Limitations 1. 입력은 assembly-level `TYPE=ELEMENT` surface와 uniform `DSLOAD P`의 승인 subset뿐이다. @@ -166,42 +52,6 @@ Reference artifact pre/post evidence: Deferred must requirement, unresolved defect, accepted blocking risk 또는 release-blocking open item은 없다. -## 7. Release Notes Draft - -### 사용자-facing 요약 - -FESA는 이제 승인된 Abaqus `.inp` subset에서 assembly named element surface의 `S4`/`S4R` -`SPOS` 또는 `SNEG` 면에 uniform `*DSLOAD P`를 적용할 수 있다. Linear static에서는 reference -surface를, `NLGEOM=YES` nonlinear static에서는 current surface follower force와 consistent -external tangent를 사용한다. Pressure는 기존 full-space load, reaction/free residual, -global equilibrium 및 HDF5 result lifecycle에 통합된다. - -### 검증 범위 - -- MSVC x64 Debug full CTest `362/362 PASS`, focused feature tests `64/64 PASS`. -- Exact stored nonlinear case에서 factor-one U blocking `2187/2187`, UR warning-only - `2187/2187` rows pass. -- Factor-one normalized global force/moment balance는 각각 `6.758e-14`, `3.725e-14`로 - 승인 gate `1e-8`을 통과했다. -- S4R, side/sign reversal, linear reference pressure, current-area objectivity, external tangent와 - invalid geometry는 독립 internal analytical/FD/fail-closed tests로 검증했다. - -### 주요 제한 및 사용 주의 - -이 release는 single-step linear 또는 approved nonlinear static, four-node S4/S4R, existing -linear-isotropic MITC4 section과 uniform single-sided pressure만 지원한다. `*DLOAD`, nonuniform -pressure, amplitude, node/edge/contact/double-sided surface, 다른 element/procedure/material 및 -surface offset/thickness correction은 지원하지 않는다. Model-consistent unit system을 사용해야 -하며 invalid current surface geometry는 fail-closed한다. UR은 warning-only이고 reaction/stress -CSV는 external verdict 대상이 아니다. Abaqus 내부 동등성이나 실험 validation은 주장하지 않는다. - -### Artifact paths - -- Runtime authoritative output: input lexical sibling `_results.h5` -- Required reference input: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` -- Required comparison CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` -- Release record: `docs/shell-surface-pressure-load/release.md` - ## 8. Release Verdict **Verdict: `ready-for-release`.** @@ -222,14 +72,6 @@ Coordinator Agent는 Gate 8을 `passed`로 기록하고 `shell-surface-pressure- 또는 upstream decision return은 필요하지 않다. Publish, deploy, package, tag, merge, commit, push 또는 external release는 별도 명시적 권한 없이는 수행하지 않는다. -## 10. No-Change Assertion - -Release Agent는 이 감사에서 `docs/shell-surface-pressure-load/release.md`만 생성했다. Source, -public/private header, test, CMake, build/Harness configuration, phase files, upstream feature -documents/reports, `coordination.md`, reference input/CSV, generated HDF5/log, -`docs/TOLERANCE.md` 및 tolerance policy는 수정하지 않았다. Abaqus, Nastran 또는 다른 -reference solver를 실행하지 않았고 build, CTest, Harness 또는 FESA CLI를 재실행하지 않았다. - ## 11. Open Issues - Missing evidence: 없음. @@ -240,3 +82,5 @@ reference solver를 실행하지 않았고 build, CTest, Harness 또는 FESA CLI - Missing declared comparison files or mappings: 없음. - Release documentation gap: 없음. - Blockers: 없음. + +현재 build·reference·물리 실행 기록은 [검증 보고서](verification.md)에 통합했다. 과거 readiness와 현재 재검증 필요를 구분하며 이 정리는 새로운 release 감사가 아니다. diff --git a/docs/shell-surface-pressure-load/verification.md b/docs/shell-surface-pressure-load/verification.md new file mode 100644 index 0000000..b5e5e8f --- /dev/null +++ b/docs/shell-surface-pressure-load/verification.md @@ -0,0 +1,339 @@ +# Shell 표면 압력 검증과 한계 + +본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 +통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git +`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. + +아래 날짜·revision·명령·수치는 당시 실제 실행 기록이다. 문서 정리에서 solver를 다시 실행하지 않았다. +현재 계약은 [요구사항](requirements.md), [정식화](formulation.md), [I/O](io.md), [공통 tolerance](../TOLERANCE.md)를 따른다. [과거 release 판정](release.md)의 재검증 경계도 유지한다. + + + + +## Shell Surface Pressure Load — 빌드·테스트 보고서 + + +### 메타데이터 + +- feature_id: `shell-surface-pressure-load` +- 상태: 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: Harness phase completed locally at + `2026-09-01 17:43:57`. The single automatic Stop whole-project MSVC x64 + Debug build passed. It ran `cmake --build .harness/build --config Debug`, + then `ctest --test-dir .harness/build -C Debug --show-only=json-v1` with + nonzero discovery, and `ctest --test-dir .harness/build -C Debug + --output-on-failure`; the final full CTest result was `362/362 PASS`, + `0 failed`. +- automatic Stop evidence sources: + `phases/shell-surface-pressure-load/step7-output.json`, + `.harness/build/Testing/Temporary/LastTest.log`, and phase/commit metadata + `2c91462`, `bf2339c`, `c4d1e2a`. Classification: `pass`; failed tests: + none. Duration: not separately preserved in committed report; completion + timestamp and LastTest log are authoritative. +- Step 7은 source/header/test/CMake/Harness/tolerance/upstream contract/reference artifact를 + 변경하지 않았고, 세 Gate 6 보고서 및 허용된 Step 7 status/summary만 변경한다. + +physics evaluation과 release readiness는 이 보고서 범위 밖이다. + + + + +## Shell Surface Pressure Load — Reference Comparison 보고서 + + +### 메타데이터와 Gate 6 판정 + +- feature_id: `shell-surface-pressure-load` +- case_id: `shellnl-meshfine-pressure-s4-follower` +- 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 | + + + + +## Shell Surface Pressure Load 물리 평가 + + +### 1. Metadata + +- feature_id: `shell-surface-pressure-load` +- source reference comparison report: `docs/shell-surface-pressure-load/verification.md` +- source reference model: `docs/shell-surface-pressure-load/reference-model.md` +- status: `pass-for-release-agent` +- date: `2026-09-01` +- evaluated commit: `1eb4dce885175b78b8229b095f14cac102ea93df` + +이 판정은 승인된 물리 기대와 기존 Gate 6 evidence에 한정한다. Abaqus 내부 formulation, +integration, stabilization 또는 result recovery와의 동등성을 주장하지 않으며 release +readiness를 승인하지 않는다. + + +### 2. Input Evidence + + +#### 2.1 Gate와 artifact + +`reference-comparison.md`는 명시적으로 `pass-for-physics-evaluation` handoff를 권고하고, +blocking `U1/U2/U3` 2,187/2,187 rows와 warning-only `UR1/UR2/UR3` 2,187/2,187 rows가 +모두 통과했음을 기록한다. Physics Gate는 그 tolerance 판정을 재승인하지 않고, 통과한 +비교 결과를 물리 plausibility의 선행 조건으로만 사용했다. + +| evidence | exact path / identity | read-only 확인 | +| --- | --- | --- | +| solver HDF5 | `.harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure_results.h5` | schema `1`, 10 accepted frames, unique factor-one frame `9` / increment `10`; SHA-256 `74f35e3e59edd05460733b1d6367994c7f4a1e847b366f2efad6fbecc03796f3` | +| nonlinear log | `.harness/build/reference/shell-surface-pressure-load/shellNL-meshfine-pressure_log.txt` | factor-one iteration `3`: `combined_pass=1`, `transition=accepted`; SHA-256 `8555ff365dcf1f066813d0cce6440c3d56c9840baf8246696daa7b2e7b0061a1` | +| required input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | 56,665 bytes, SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e` | +| required Abaqus CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | 729 finite wide rows; SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198` | +| optional Abaqus CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | `review-only`; SHA-256 `a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6` | +| excluded Abaqus CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | `excluded`; SHA-256 `bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128` | +| test record | `.harness/build/Testing/Temporary/LastTest.log` | existing automatic Stop evidence에서 full CTest `362/362 PASS`; 관련 physics test의 개별 pass 기록 확인 | +| optional FESA debug CSV views | 없음 | 요구되거나 생성된 debug CSV가 없으며 official output으로 사용하지 않음 | + +확인한 authoritative quantities는 factor-one global nodal displacement, generalized external/ +internal force, generalized residual, constrained reaction, global equilibrium, physical strain +energy, 기존 MITC4 generalized strain/section resultant/stress다. Model purpose는 729-node, +676-element `S4` square shell의 `SPOS`, positive `P=1e6`, `NLGEOM=YES` current-surface follower +pressure response를 end-to-end로 확인하고, stored case가 직접 포함하지 않는 sign, S4R, +linear, objectivity와 tangent 경계를 승인 internal tests로 보완하는 것이다. + + +### 3. Physics Checks + +| physics check | status | evidence와 판정 | +| --- | --- | --- | +| global equilibrium | `pass` | Factor-one applied force sum은 `[8.626e-12, -7.311e-12, -1.0000000000000016e8]`이고 constrained reaction force sum은 `[-5.047e-6, -3.331e-6, 9.999999999999714e7]`이다. HDF5 stored balance를 approved current-arm scales로 다시 normalize하면 force `6.758e-14`, moment `3.725e-14`로 둘 다 `<=1e-8`이다. | +| reaction consistency | `pass` | Constrained DOF에서 `/nodal/reaction`과 `generalized_residual`은 exact 일치했다. Pressure resultant의 `-Z` `1.0e8`에 대해 masked constrained reaction은 `+Z` `9.999999999999714e7`이며, tiny `X/Y`와 moment remainder는 위 global balance gate 안이다. | +| displacement direction | `pass` | Reference connectivity의 `SPOS` vector area는 `+Z`, positive pressure resultant는 `-Z`다. Factor-one HDF5의 729개 `UZ`는 모두 nonpositive이며 625개 free nodes는 negative, 104개 constrained boundary nodes는 exact zero다. Center node의 `UZ=-5.514459701328648e-3`로 load 방향과 deformation mode가 일치한다. | +| pressure sign, resultant, and moment | `pass` | Current configuration의 quadrature vector-area oracle은 expected force `[-1.723e-12, 2.450e-11, -1.0000000000000025e8]`를 주며 HDF5 applied resultant와의 normalized error는 `8.94e-16`이다. Current-arm applied moment oracle error는 승인 `M_Sigma` 기준 `1.32e-16`이다. Existing `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment`와 `ReversesExactlyForSposSnegAndNegativeMagnitude`도 full CTest 기록에서 pass했다. | +| symmetry and expected zero | `pass` | Feature-blocking exact-zero contract인 pressure generalized external rotational entries는 factor-one HDF5에서 exact zero다. Zero pressure/factor geometry validation test도 pass했다. Stored square patch의 mirror symmetry는 보조 sanity로만 확인했으며 `UX/UY/UZ` mirror mismatch의 최대 절대값은 `1.63e-16`, `1.09e-16`, `8.89e-17` 이하다. 별도 외부 symmetry tolerance를 만들지 않았다. | +| nonlinear follower objectivity and current-area behavior | `pass` | HDF5 resultant는 factor-one current `X+u` vector-area oracle과 위 roundoff 수준으로 일치했다. Current scalar area/reference scalar area ratio는 `1.0000006316335197`로 finite하다. Stored symmetric case만으로 reference/current path를 분리하지 않고, existing tests `UsesCurrentAreaAndNormalForFollowerForce`, `IsTranslationAndRigidRotationObjective`, `IsObjectiveUnderRigidMotionAndTracksCurrentArea`, `MatchesCenteredFiniteDifferenceForForceAndResidualSigns`의 pass evidence로 rigid rotation covariance, `gamma=1.25` area/resultant scaling, follower direction과 external tangent sign을 보완했다. | +| element force balance | `not-separately-applicable` | 이 feature는 pressure-only element force row나 element end-action balance contract를 정의하지 않는다. 대신 HDF5에서 `generalized_internal_force - generalized_external_force - generalized_residual`은 element assembly 이후 nodal full space에서 exact zero이고 global resultant/moment gate가 pass했다. Existing MITC4 section resultants는 finite이며 별도 pressure comparator를 만들지 않았다. | +| stress/strain | `pass-sanity-only` | Factor-one `generalized_strain`, `section_resultant`, `stress`의 component names, units, `shell-local` coordinate system과 `midsurface`/`section-position` location은 `io.md`와 일치하고 모든 값이 finite다. 관측 range는 strain `[-9.842e-4, 1.801e-3]`, section resultant `[-4.595e6, 8.646e6]`, stress `[-1.036e8, 1.039e8]`이다. Feature-specific stress sign/reference expectation은 없고 stress CSV는 `excluded`이므로 그 이상의 pass를 주장하지 않는다. | +| rigid body mode | `pass-no-symptom` | Stored case는 104 boundary nodes의 DOF 1–6을 구속하고 625 interior nodes가 자유다. 모든 accepted frame이 finite하게 수렴했고 factor-one maximum translation은 `5.514e-3`로 10-unit span 대비 `5.514e-4`이며 unbounded translation, near-zero-stiffness 또는 impossible displacement 증상이 없다. Pressure가 support를 제공한다는 주장은 하지 않는다. | +| energy/residual | `pass` | 모든 HDF5 numeric dataset과 required U/UR rows는 finite다. Factor-one free translation residual은 `9.06582420157065e-6 / 1.47929199940215e5 = 6.12849e-11 <=1e-2`; zero-external-scale rotation residual은 `1.3758908607997e-6 <=1e-3`이다. Existing `PHYSICAL_STRAIN_ENERGY=86418.04713575779`는 finite positive 보조 evidence이며 pressure-only energy gate로 사용하지 않았다. HDF5 diagnostics는 result-neutral ignored-keyword warning 4개뿐이고 error/nonfinite diagnostic은 없다. | +| model coverage | `pass` | Stored case의 declared inventory `729 nodes / 676 S4 / SPOS / positive P / NLGEOM=YES`와 unique factor-one frame이 모두 확인됐다. Stored case가 직접 다루지 않는 `S4R`, `SNEG`, negative/zero magnitude, linear reference configuration, exact resultant/moment, current-area objectivity와 tangent는 Numerical Review가 지정한 internal portfolio에서 해당 named tests가 pass했다. 승인 범위 밖의 추가 reference portfolio는 요구하지 않는다. | + + +### 4. Failure Classification + +- failure classification: `none` +- 다음 분류는 발생하지 않았다: `equilibrium-failure`, `reaction-inconsistency`, + `displacement-direction-failure`, `symmetry-failure`, `stress-location-failure`, + `element-force-inconsistency`, `rigid-body-mode-suspected`, `nonfinite-result`, + `model-coverage-gap`, `upstream-contract`, `environment`. + +`element force balance`의 `not-separately-applicable`과 stress의 `pass-sanity-only`는 upstream +contract가 의도적으로 pressure-only element/stress acceptance family를 만들지 않은 데 따른 +범위 표시이며 failure 또는 evidence gap이 아니다. + + +### 5. Evaluation Verdict + +**Verdict: `pass-for-release-agent`.** + +문서화된 pressure 방향/부호, resultant/moment, reaction/equilibrium, exact-zero와 보조 symmetry, +nonlinear follower objectivity/current-area, residual/nonfinite 및 declared model coverage가 모두 +물리적으로 일관된다. Release Agent가 release readiness를 별도로 audit할 수 있다. 이 verdict는 +release approval, publish 권한 또는 reference tolerance의 재승인이 아니다. + + +### 6. Handoff Recommendation + +- handoff target: `Release Agent` +- route: 항상 `Coordinator Agent`를 통해 전달 +- recommendation: Gate 8은 requirements-to-physics traceability, known limitations와 release + evidence를 독립 audit한다. Physics Evaluation Agent는 Gate 8을 시작하거나 승인하지 않는다. + + +### 8. Open Issues + +- missing physical expectations: 없음. +- incomplete model coverage: 없음. Stored-case 한계는 승인 internal tests로 보완되며 추가 + reference case는 계약상 요구되지 않는다. +- contradictory sign conventions: 없음. +- unavailable energy/residual evidence: 없음. Existing energy와 residual HDF5/log evidence를 + 사용했으며 새 pressure-only energy quantity는 요구되지 않는다. +- blockers: 없음. diff --git a/docs/shell-transient-heat-transfer/FEATURED_AGENTS.md b/docs/shell-transient-heat-transfer/FEATURED_AGENTS.md index 72ace23..f2c5899 100644 --- a/docs/shell-transient-heat-transfer/FEATURED_AGENTS.md +++ b/docs/shell-transient-heat-transfer/FEATURED_AGENTS.md @@ -1,63 +1,24 @@ -# Shell Transient Heat Transfer 지역 작업 지침 +# shell-transient-heat-transfer 문서·작업 지침 - Feature ID: `shell-transient-heat-transfer` -- 메인 owner: 메인 assistant -- 적용 범위: `docs/shell-transient-heat-transfer/`의 계약·계획·검토 문서. - 이 파일은 `src/`, `include/`, `tests/`에 자동 적용되는 지침이 아니다. -- 현재 범위·상태·checklist 원본: [Feature PRD](PRD.md). +- 문서 진입점·목적·사용법·Handoff: [README](README.md). +- 현재 범위·checklist: [PRD](PRD.md); 결정·승인·대체 이력: [ADR](ADR.md). +- 적용 범위: 해당 기능의 문서. 자동 로드되는 코드 영역 `AGENTS.md`가 아니다. -기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), -[공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md), -[Feature 문서 관리](../FEATURE_DOCUMENTATION.md). -이 파일은 자동 로드되는 `AGENTS.md`가 아니며, Feature 작업 시 명시적으로 참조한다. +기준: [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md), +[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [공통 tolerance](../TOLERANCE.md). -## 계약과 작업 경계 +## 보존할 계약과 인계 -- 인터뷰에서 합의한 지원 범위는 PRD, 채택 상태·이유·영향은 ADR에 기록한다. - ready에서 승인한 채택 계약과 독립 검토·실제 구현 완료 evidence를 구별한다. -- 수식 원본은 formulation, 구현 순서·코드 연결은 design-plan, 독립 지적과 검산 evidence는 - numerical-review가 소유한다. 긴 유도·검토 내용을 PRD나 이 파일에 복제하지 않는다. -- 현재 checklist는 PRD 한 곳에 둔다. 현재 구현은 사용자의 `dryforge:go` 요청으로 승인되었다. 외부 solver 실행·배포 권한은 포함하지 않는다. -- 변경이 보간·물성·geometry 근사·초기 상태·적분·시간 갱신 의미를 바꾸면 관련 ADR과 - 정식화를 먼저 갱신하고 필요한 독립 numerical review를 받는다. Specialist는 할당 문서만 수정한다. +수식·I/O·수치 기준의 원본은 README에서 연결한 전문 문서를 따른다. 기능을 재개할 때 +관련 계약과 실제 실행 revision·미해결 항목을 함께 읽는다. 과거 stage pass나 현재 문서 +정리를 solver 검증 통과로 계산하지 않는다. 요구사항·ADR ID와 승인 이력을 유지한다. +메인은 PRD·ADR·진입점·문서 참조를 관리하고 전문 작업자는 할당한 본문과 관련 범위만 수정한다. +기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다. +문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다. -## 이 Feature에서 보존할 의미 - -- 현재 목표는 단일 step의 uncoupled 열해석이다. 초기의 두께 방향 등온 선택은 대체되었으며 - 현재 요구는 균질 단면의 온도점 5개와 면내·두께 방향 열전달이다. -- Source DOF 11/13/15는 각각 아랫면/중앙면/윗면이다. Source DOF, 내부 equation 번호, - 온도점·적분점·flux recovery 위치를 구분한다. -- 검산용 54개 직접 적분 위치와 24개 flux trace 위치는 서로 다르다. 중앙면의 두께 - 미분 양쪽 값을 평균하거나 요소 경계를 넘어 flux를 합치지 않는다. -- 반력 열률은 열용량 항을 포함한 full residual로 정의한다. Fourier flux와 - 반력 열률을 같은 observable로 대체하지 않는다. -- Thin-shell 곡률 근사, 다른 두께·fold의 접속, 초기 온도 jump와 결과 schema는 - [PRD 상세 계약](PRD.md#sth-c01--모델-geometry와-자유도)을 따른다. Edge 입력 011은 이번 구현에서 연기한다. 미지원 의미를 임의 default로 처리하지 않는다. -- 기존 reference `.inp`와 CSV는 변경하지 않고 진단 비교에 사용한다. 음수 reference는 - roundoff로 단정하거나 clamp하지 않고 [TOLERANCE](../TOLERANCE.md)를 적용한다. - 새 필수 reference는 [PRD STH-C08](PRD.md#sth-c08--reference-원본과-완료-evidence)과 - [STH-ADR-015](ADR.md#sth-adr-015-원본-reference-진단-전환과-새-모델-비교)를 따른다. -- All-constrained와 단면 전체 end 온도 지정은 검산용 algebra/assembly fixture다. - 내부 온도점 경계조건을 공개 입력 기능으로 확대하는 근거로 사용하지 않는다. - -## 문서 소유권과 인계 - -| 문서 | Owner | 책임 | -| --- | --- | --- | -| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | 메인 assistant | 지역 지침·소유권·문서 연결 | -| [PRD.md](PRD.md) | 메인 assistant | 요구사항·제외·acceptance·현재 checklist | -| [ADR.md](ADR.md) | 메인 assistant | 채택 결정·승인 근거·이유와 영향 | -| [design-plan.md](design-plan.md) | 메인 assistant | 방법론 요약·코드 연결·구현 순서 | -| [formulation.md](formulation.md) | formulation-agent | 수식·geometry·보간·적분·시간 갱신·recovery | -| [numerical-review.md](numerical-review.md) | numerical-review-agent | 독립 검산·수치 위험·검증 설계 | - -I/O·구현은 design-plan의 작업별 owner에게 할당하고 physics 평가는 독립 검토자에게 할당한다. 필요한 PRD 항목과 관련 -전문 문서의 절, 수정 파일, 검증 기준을 전달하고 결과·변경 경로·미해결 항목을 반환한다. - -## 변경 확인 - -문서 변경은 요구사항 ID·결정 상태·수식의 위치/부호·상대 링크·diff 정합으로 확인한다. -문서만 바꾸면 build/test를 실행하지 않는다. 구현 시 검증 명령과 단계별 기준은 -[계획안의 검증 실행](design-plan.md#11-검증-실행과-완료-판단) 및 프로젝트 지침을 따른다. -정확 산술 검산, solver build/CTest, 외부 reference 비교, 실제 결과의 physics 검토를 -서로 다른 evidence로 기록하고 미실행 항목을 통과로 표시하지 않는다. +Uncoupled Q4×two-P2·consistent C·Backward Euler가 현재 범위다. DOF11/13/15는 bottom/mid/top이고 +공개 지정온도·열률은11/15만 지원한다. 중립면의 양쪽 flux trace를 평균하지 않는다. +원본 NT11은 수치 FAIL을 보존한 diagnostic이며 새 필수 reference는 준비 중이다. +Edge 열입력·내부 station BC·열-구조 연성을 확대하지 않는다. Private full-end fixture를 +공개 입력 지원이나 접합부의 실제3D 전도 검증으로 해석하지 않는다. diff --git a/docs/shell-transient-heat-transfer/PRD.md b/docs/shell-transient-heat-transfer/PRD.md index f1935a1..4a6b147 100644 --- a/docs/shell-transient-heat-transfer/PRD.md +++ b/docs/shell-transient-heat-transfer/PRD.md @@ -9,7 +9,7 @@ [공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md), [CODINGSTYLE](../CODINGSTYLE.md), [TOLERANCE](../TOLERANCE.md). 지역 지침은 [FEATURED_AGENTS](FEATURED_AGENTS.md), 결정 근거는 [ADR](ADR.md), -수식은 [formulation](formulation.md), 구현 순서는 [design-plan](design-plan.md), +수식은 [formulation](formulation.md), 구현 순서는 [design-plan](design.md#design-plan), 독립 수치 판정은 [numerical-review](numerical-review.md)를 따른다. 개인 연구용 솔버가 일차 목적이며 외부 배포와 양방향 열–구조 연성은 장기 목표다. diff --git a/docs/shell-transient-heat-transfer/README.md b/docs/shell-transient-heat-transfer/README.md new file mode 100644 index 0000000..d684d4f --- /dev/null +++ b/docs/shell-transient-heat-transfer/README.md @@ -0,0 +1,36 @@ +# Shell transient heat transfer + +## 목적과 개발 결과 + +5개 두께 온도점을 가진 Q4×two-P2 shell의 단일 uncoupled transient heat transfer다. +K/C, Backward Euler, 온도·24개 Fourier flux trace·열용량을 포함한 반력, 입력·CLI·atomic +HDF5 저장을 구현했다. 추가139개 검사 모두 PASS이며 전체617개는614 PASS·기존 HHT2 FAIL·1 SKIP다. +새 필수 reference 모델·NT11 CSV가 준비 중이므로 외부 검증 완료 상태는 아니다. + +## 계약과 사용법 + +- [PRD](PRD.md)·[ADR](ADR.md): 승인 범위·제외·현재 checklist·reference 진단 전환. +- [정식화](formulation.md): geometry·station·K/C·BE·flux·반력의 정확한 의미. +- [설계와 Handoff](design.md): 계산 방법과 모듈 연결. +- [독립 수치 검토](numerical-review.md), [oracle 재현](verification-oracles.md). +- [구현·전체 회귀](implementation-verification.md), [물리 평가](physics-evaluation.md), + [원본 reference 불일치](reference-comparison-conflict.md). + +환경·CLI는 [operations](../operations.md), 승인 keyword와 결과 schema는 PRD 상세 계약을 +따른다. Source DOF11/13/15는 bottom/mid/top이며 공개 지정온도·절점 열률은11/15만 지원한다. +Edge 열입력·열-구조 연성·복합재 단면·온도의존 물성은 이번 범위가 아니다. + +## 재사용 Handoff와 교훈 + +Consistent capacity와 raw 초기값을 유지하고 첫 BC jump를 투영하거나 음수를 clamp하지 않는다. +중립면의 양쪽 flux trace를 평균하지 않는다. Fold/두께 단차의 station 공유는 실제3D 접촉 전도와 +동등하지 않다. 초기 두께 경계층의 국소 flux/반력, 일반 곡면 전체 응답·점열원 수렴은 검증 한계다. +기존 NT11 비교는729행 중87행 FAIL·RMS/S 약0.0496741을 보존한 diagnostic이며 tolerance는 그대로다. +Slab 에너지/반력 oracle index 오류는 수정 후 전체 focused 검사를 다시 실행했다. + +## 다음 작업과 보존 자료 + +새 모델·CSV의 별도 경로, source identity·시점·hash를 확정하고 필수 family를 실제 비교한다. +dev 병합은 사용자의 통합 승인이고 외부 검증 통과 승인이 아니다. +삭제한 worktree의 자료는 dev checkout 기준 +`.dryforge/retained/shell-transient-heat-transfer-20261004/`에 보존했고 경로 대응은 구현 검증 보고서에 있다. diff --git a/docs/shell-transient-heat-transfer/design-plan.md b/docs/shell-transient-heat-transfer/design.md similarity index 75% rename from docs/shell-transient-heat-transfer/design-plan.md rename to docs/shell-transient-heat-transfer/design.md index d02457a..4b4feaf 100644 --- a/docs/shell-transient-heat-transfer/design-plan.md +++ b/docs/shell-transient-heat-transfer/design.md @@ -1,13 +1,20 @@ -# Shell Transient Heat Transfer 상세 설계·구현 계획안 +# 구현 방법과 재사용 Handoff + +현재 구현·검증 상태는 [PRD](PRD.md)와 [구현 검증](implementation-verification.md)을 따른다. 아래는 채택 방법론이며 새 실행 계획이 아니다. + + + + +## Shell Transient Heat Transfer 상세 설계·구현 계획안 - 상태: 사용자 승인 실행 계획. 구현·검증 진행 중이며 수치 통과 evidence와 구별한다. -- Owner: 메인 assistant - 기준: [Feature PRD](PRD.md), [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md), [CODINGSTYLE](../CODINGSTYLE.md), [TOLERANCE](../TOLERANCE.md) - 수식의 상세 원본: [정식화](formulation.md). 현재 checklist는 [PRD](PRD.md#현재-checklist)에만 둔다. - 독립 검토: [numerical-review.md](numerical-review.md). 수식의 일관성 검토이며 구현·정확도 통과 판정은 아니다. -## 1. 구현할 해석과 채택 방법 + +### 1. 구현할 해석과 채택 방법 입력의 4절점 Shell mesh에서 온도만 풀며, 한 절점에 두께 방향 온도 5개를 둔다. 요소당 20개 온도 자유도로 면내·두께 방향 전도와 열저장을 함께 계산한다. @@ -27,7 +34,8 @@ 특히 consistent C가 현재 reference의 과도응답을 공통 tolerance 안에서 재현하는지는 아직 검증하지 않았다. 시간 적분의 안정성이 양의 온도 보존이나 정확도를 보장하지도 않는다. -## 2. 온도 자유도와 보간 + +### 2. 온도 자유도와 보간 온도점의 무차원 두께 좌표는 `ζ = [-1, -1/2, 0, 1/2, 1]`, 실제 좌표는 `z=hζ/2`다. 요소 vector는 node-major 순서로 정의한다. @@ -47,7 +55,8 @@ N_a(\xi,\eta)L_s(\zeta)T_{a,s}=\mathbf H\mathbf T_e. Q4의 `N_a`와 두께의 `L_s` 및 도함수는 [정식화](formulation.md)에 명시한다. 5개의 서로 독립적인 2D 판을 만드는 것이 아니라, 두께 도함수 항으로 온도점 사이를 결합한다. -## 3. 3차원 geometry와 열전도행렬 K + +### 3. 3차원 geometry와 열전도행렬 K Midsurface를 `r(ξ,η)=Σ N_a x_a`로 나타낸다. 접선 행렬 `A=[r_,ξ r_,η]`, metric `G=AᵀA`, 면적 Jacobian `J_s=|r_,ξ×r_,η|`, 단위 법선 `n`을 계산한다. @@ -77,7 +86,8 @@ product-domain 모델의 교차항은 0이다. 평판에서 각각 대략 `kh`, 두께가 다른 요소의 단차·급한 fold의 실제 3D 접합부 열장은 이 모델의 해상 범위 밖이다. 이 접속 의미와 얇은 Shell 곡률 근사는 사용자가 채택한 물리 모델이며 상세 3D 전도를 보장하지 않는다. -## 4. 열용량행렬 C와 적분 절차 + +### 4. 열용량행렬 C와 적분 절차 밀도 `ρ>0`, 비열 `c>0`에 대해 @@ -103,7 +113,8 @@ Affine 평판은 면내 2×2 × 두께 6점, 총 24점으로도 정확하다. 5 위치, 아래의 flux trace 위치는 서로 다른 개념이다. 곡면은 면내 3×3→5×5→7×7 대조로 적분 오차를 평가하며 reduced integration이나 hourglass 안정화항을 추가하지 않는다. -## 5. 열입력과 지정 온도 + +### 5. 열입력과 지정 온도 공개 입력은 source DOF 11/15에 대한 일정한 절점 집중 power P만 지원한다. 양수는 모델로 공급되는 열이며 h·면적·shape weight를 곱하지 않는다. Source row 순서로 @@ -115,7 +126,8 @@ BC 생략값은 0이며 model 단계와 step 단계 각각에서 중복 충돌 동일 target의 model 값을 덮어쓴다. 동일 값 중복은 허용하고 다른 값은 오류다. 정확한 subset·미지원 옵션·no-op warning은 [PRD STH-C02](PRD.md#sth-c02--공개-입력-충돌과-부가-keyword)를 따른다. -## 6. Transient equation과 해법 + +### 6. Transient equation과 해법 \[ \mathbf C\dot{\mathbf T}+\mathbf K\mathbf T=\mathbf Q+\mathbf R. @@ -152,7 +164,8 @@ free/constrained partition에서 전체 구속 시 0×0 free solve를 건너뛰도록 검산한다. 다만 이번 공개 입력은 bottom/top만 구속하므로 내부 3개 온도점까지 모두 구속한 사례는 CLI 지원 모델이 아닌 algebra fixture다. -## 7. Heat flux와 reaction heat rate 복구 + +### 7. Heat flux와 reaction heat rate 복구 각 완료 증분에 element scatter로 `T_e`를 모아, 동일한 B로 @@ -183,7 +196,8 @@ free 성분은 평형 잔차, constrained 성분은 지정 온도 유지에 필 양의 반력은 모델에 추가로 공급한 열이다. transient 반력에는 열저장 항이 포함되어야 한다. 초기 온도는 저장하지만 `t=0` flux와 reaction dataset은 생성하지 않는다. 반력을 계산된 0이나 NaN으로 대체하지 않는다. -## 8. 기존 코드와 연결할 책임·파일 + +### 8. 기존 코드와 연결할 책임·파일 현재 `Element::Recover`는 displacement를 소비하고 `DofManager`는 `kDofsPerNode=6`을 전제로 한다. 따라서 parser에 DS4만 추가해서 완료할 수 없다. 다음은 실제 저장소 경로와 @@ -204,35 +218,8 @@ Domain이 정의를 소유하고 AnalysisModel이 non-owning view를 제공하 새 thermal state만 temperature/history를 소유한다. Node/Element에 equation 번호를 저장하지 않는다. 열용량 C를 structural mass field에 저장하지 않으며 vendor API는 기존 backend 경계에 둔다. -## 9. 구현 순서와 각 단계의 완료 조건 - -아래 dependency는 승인된 실행 계획이다. 같은 행의 독립 작업만 병행하며 완료 evidence 없이 -후속 수치 kernel로 진행하지 않는다. 공통 CMake 등록은 메인이 각 묶음 통합 시 소유한다. - -| 작업 | 선행 작업 | 소유 대상·목적 | 검증 | -| --- | --- | --- | --- | -| T1 | 없음 | 메인: 지역 지침/PRD/ADR/계획; 정식화 담당: formulation; 독립 numerical 담당: numerical-review | 전체 patch·roundoff·시간격자·수렴·slab 오차의 구체적 기준 확정 | -| T2 | 없음 | 구현 담당: material/model/Domain/AnalysisModel의 thermal 의미·소유권 | 양성/불량 값·source identity·structural 회귀; parser/kernel/DOF 제외 | -| T3 | T1,T2 | 구현 담당: thermal geometry·20 DOF K/C·24 trace kernel·Domain geometry 연결·공유 시간격자 계산 | Exact M/S/Z, 직접54점, rank/SPD/null, scaling·rotation·trace·geometry 음성·시간격자 경계 | -| T4 | T2 | 구현 담당: DofManager thermal layout/scatter/pattern | 구조6·열5 분리, 활성 node와 stable 번호, partition·공유 node | -| T5 | T3 | 구현 담당: Abaqus thermal subset·semantic mapping·진단 | 승인 input/default/override/no-op와 모든 미지원·충돌 사례 | -| T6 | T3,T4 | 구현 담당: deterministic assembly·thermal state/result record | K/C·source-ordered Q·초기 상태·순서와 공유 recovery 인터페이스 | -| T7 | T6 | 구현 담당: BE procedure·복구·full residual·candidate | Exact 두 증분·no BC·짧은 마지막·factor reuse·수지·실패 state 보존 | -| T8 | T6 | 구현 담당: thermal HDF5 writer·self-check | Synthetic state round trip·schema/identity/초기 dataset 부재·P=0·atomic 실패 | -| T9 | T5,T7,T8 | 구현 담당: prepared_analysis와 CLI 연결 | 양성 CLI·lexical output·exit·lease·기존 결과 보존 | -| T10 | T9 | 구현 담당: analytical physics·reference comparator/integration | 독립 oracle·온도/flux/reaction·수렴과 NT11 source mapping/tolerance | -| T11 | T10 | 검증 담당·독립 physics 검토자; 메인 완료 문서 | 전체 MSVC Debug build/CTest·새 reference 필수 비교·baseline 대비·coverage 한계 | - -행동 변경은 기대 결과를 고정한 검사에서 실패를 확인한 뒤 구현한다. 구현 구조를 복제한 -expected 값으로 정확도를 주장하지 않는다. 독립 numerical/physics 검토를 구현자의 자기 승인으로 대체하지 않는다. -각 담당은 할당 파일만 수정하고 source/reference artifact와 공통 프로젝트 계약을 임의 변경하지 않는다. - -입력의 INC 사전검사와 procedure는 같은 시간격자 계산을 사용해야 한다. T1에서 검토한 -시간격자 함수를 T3의 공통 thermal validation 경계에서 구현하고 T5와 T7이 재사용한다. -이 파일 소유권 배분은 승인된 dependency를 유지하며 parser와 procedure에 같은 수식을 -각각 구현하거나 아직 존재하지 않는 후속 procedure에 parser를 의존시키지 않기 위한 것이다. - -## 10. 방법론을 반증할 검증 사례 + +### 10. 방법론을 반증할 검증 사례 필수 사례의 원본은 [PRD STH-C07](PRD.md#sth-c07--독립-검증과-수치-계약의-선행-조건)이다. 정확 fixture·norm·시간/mesh 목록·oracle 절단 및 order 판정은 [독립 수치 검토](numerical-review.md)가 소유한다. @@ -252,33 +239,8 @@ expected 값으로 정확도를 주장하지 않는다. 독립 numerical/physics E=1ᵀCT의 기준 온도 이동에 대한 DeltaE 불변성과 BE C-norm 소산은 서로 다른 검사다. 외부 5%/1% 기준으로 내부 수지를 판정하거나 max(1,scale)로 작은 모델의 오류를 숨기지 않는다. -## 11. 검증 실행과 완료 판단 - -Production 변경 전에 전체 baseline을 실행하고 실제 실패 이름·metric·환경을 기록한다. -구현 중 관련 검사를, 기능 완료 시 아래 전체 검사를 실행한다. - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -MSVC x64 developer 환경과 승인 local GoogleTest/MKL/TBB/HDF5를 사용한다. -`.harness/config.json`이 동일 실행을 구성할 때만 `python scripts/execute.py`를 대안으로 사용한다. -개인 설정이 없다고 runner가 preset을 선택한다고 가정하지 않는다. 새 compiler warning을 추가하지 않는다. - -기존 Reference는 [PRD STH-C08](PRD.md#sth-c08--reference-원본과-완료-evidence)의 두 원본을 -승인된 dev checkout에서 byte 그대로 복사·hash 확인했다. Abaqus 실행·재생성·이름 변경·보정은 제외한다. -기존 비교의 불일치는 진단으로 보존하고 새 reference의 경로·identity·비교량이 확정된 뒤 -필수 비교를 실행한다. -실제 명령/exit, hash, baseline 및 최종 결과는 implementation-verification 문서에 기록한다. - -재현된 무관한 기존 HHT 시간수렴 실패는 전체 검사에서 제외하지 않고 마지막에도 비교한다. -새 실패나 기존 실패 악화를 허용하지 않으며 기존 실패가 남으면 전체 CTest green이라고 보고하지 않는다. -열해석의 필수 physics/reference 실패에는 이 예외를 적용하지 않는다. - -## 12. 채택 모델의 한계 + +### 12. 채택 모델의 한계 Product-domain은 실제 offset 곡률과 상세 접합부를 해상하지 않는다. 고정5점은 초기 두께 경계층을 충분히 해상하지 못할 수 있고 면내 refinement가 두께 오차를 제거하지 않는다. diff --git a/docs/shell-transient-heat-transfer/implementation-verification.md b/docs/shell-transient-heat-transfer/implementation-verification.md index 0fdf325..57e210c 100644 --- a/docs/shell-transient-heat-transfer/implementation-verification.md +++ b/docs/shell-transient-heat-transfer/implementation-verification.md @@ -112,7 +112,7 @@ Abaqus 실행·reference 재생성·이름 변경·내용 보정은 수행하지 가장 큰 mesh의 온도·flux 원시 이력은 약 77.3MiB다. - 고정5점의 초기 slab 오차·warped 3×3 적분 오차는 별도로 정량화했다. -통합된 문서의 [독립 oracle 부록](numerical-oracle-scratch.md)의 Python block 5개를 +통합된 문서의 [독립 oracle 부록](verification-oracles.md#독립-oracle와-재현)의 Python block 5개를 메인이 다시 추출 실행했다. Captured Python exit 0, `ALL SCRATCH BLOCKS COMPLETED`를 확인했고 출력은 `.dryforge/evidence/t1-oracle-replay.log`에 보존했다. diff --git a/docs/shell-transient-heat-transfer/numerical-review.md b/docs/shell-transient-heat-transfer/numerical-review.md index 0cbbdfb..f151e5f 100644 --- a/docs/shell-transient-heat-transfer/numerical-review.md +++ b/docs/shell-transient-heat-transfer/numerical-review.md @@ -10,7 +10,7 @@ 정량 기록했다. 지원 방법·geometry·외부 tolerance 변경을 제안하거나 승인하지 않는다. - 기준: [정식화](formulation.md), [승인 ADR](ADR.md), [공통 수치 기준](../TOLERANCE.md), [개발 규칙](../standards.md), [수치 주의점](../engineering-notes.md). - 재현 계산은 [scratch appendix](numerical-oracle-scratch.md)에 있다. + 재현 계산은 [scratch appendix](verification-oracles.md#독립-oracle와-재현)에 있다. Reviewer는 정식화 작성자가 아니며 production·test·reference를 수정하지 않았다. ## 1. 판정과 이전 검토의 정리 @@ -188,7 +188,7 @@ upper(||A^-1||∞)≤upper(||Z||∞)/(1−θ)가 rigorous inverse-norm bound다. 정확 coefficient의 E_A/E_b도 numerator에 E_A||T_f||∞+E_b로 더한다. 이때 stored A의 inverse 상계를 J라 하면 J E_A<1을 확인하고 정확 A*의 inverse는 J/(1−J E_A)로 넓힌다. 따라서 absolute forward bound는 -[J/(1−J E_A)](R_cert+E_A||T_f||∞+E_b)다(E_A/E_b는 ∞ norm bound). +`[J/(1−J E_A)](R_cert+E_A||T_f||∞+E_b)`다(E_A/E_b는 ∞ norm bound). 이 denominator의 조건을 증명하지 못하면 inconclusive이며 clamp/상한 확대는 금지다. 큰 **구조화된 convergence fixture**는 inverse나 최악 β_limit 없이 다음 C-norm @@ -565,7 +565,7 @@ Missing/extra/duplicate/nonfinite/frame/instance/station 오류는 tolerance 전 git rev-parse --show-toplevel로 T1 worktree를 확인했다(exit0). NumPy/SciPy import 환경 probe는 NumPy 부재로 exit1;설치 없이 표준 라이브러리 -scratch로 전환했다. [Appendix](numerical-oracle-scratch.md)의 명령은 Python blocks를 +scratch로 전환했다. [Appendix](verification-oracles.md#독립-oracle와-재현)의 명령은 Python blocks를 지정 순서로 메모리에서 실행한다. 실제 scratch exit0의 핵심 출력: - Fraction:C positive pivot20,K positive leading pivot19/K1=0,1ᵀC1=2; diff --git a/docs/shell-transient-heat-transfer/numerical-oracle-scratch.md b/docs/shell-transient-heat-transfer/verification-oracles.md similarity index 98% rename from docs/shell-transient-heat-transfer/numerical-oracle-scratch.md rename to docs/shell-transient-heat-transfer/verification-oracles.md index 7397a3d..602bfa0 100644 --- a/docs/shell-transient-heat-transfer/numerical-oracle-scratch.md +++ b/docs/shell-transient-heat-transfer/verification-oracles.md @@ -1,3 +1,7 @@ +# 독립 oracle와 재현 + +수치 검토에 사용한 exact/rational·spectral·Gauss 검산 코드를 보존한다. 코드의 결과는 당시 정식화 검산이며 실제 solver의 전체 검증을 대신하지 않는다. 실제 실행·소스·한계는 [구현 검증](implementation-verification.md)과 [수치 검토](numerical-review.md)를 따른다. + # 독립 numerical oracle scratch 이 파일은 numerical-review.md의 사전 계산을 재현하는 문서 부록이다. Solver 또는 diff --git a/docs/superpowers/plans/2026-06-11-harden-execute-runner.md b/docs/superpowers/plans/2026-06-11-harden-execute-runner.md deleted file mode 100644 index 36e55ba..0000000 --- a/docs/superpowers/plans/2026-06-11-harden-execute-runner.md +++ /dev/null @@ -1,1092 +0,0 @@ -# Harden Execute Runner Implementation Plan - -> **Historical / Superseded:** 이 계획의 `codex/` 브랜치, `allowed_paths`, explicit -> staging, 구형 workspace validation 계약은 현재 Runner 동작이 아니다. 현재 계약은 -> `docs/HARNESS_WORKFLOW.md`와 `docs/HARNESS.md`를 따른다. - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Make `scripts/execute.py` safe enough to use by enforcing `codex/` branch names, clean starting state, explicit staging, per-step file allowlists, and validation before every runner-created commit. - -**Architecture:** Keep the runner as a single Python module and add small helper methods to `StepExecutor` instead of introducing a new framework. Add focused `unittest` coverage in `scripts/test_execute.py` using temporary phase directories and mocked subprocess/git calls, then update stale docs only after behavior is covered. - -**Tech Stack:** Python 3 standard library, `unittest`, `unittest.mock`, Git command-line interface, existing `python scripts/validate_workspace.py`. - ---- - -## Scope - -This plan does not use the `harness-workflow` skill. It only prepares `scripts/execute.py` so that using it later is less likely to damage unrelated work. - -Required behavior: -- Branches created or used by the runner must use `codex/`. -- Runner startup must abort on a dirty worktree before branch checkout or Codex execution. -- Runner commits must never use broad git staging. -- Each phase step must define an allowlist of paths it may modify. -- Runner must refuse to commit disallowed file changes. -- Runner must run Python self-tests and workspace validation before every commit it creates. -- Commit failure and validation failure must stop the runner instead of only warning. - -## File Map - -- Modify `scripts/execute.py`: branch naming, dirty worktree check, allowlist parsing, explicit staging, validation-before-commit, fatal commit failures. -- Create `scripts/test_execute.py`: unit tests for runner safety behavior. -- Modify `AGENTS.md`: document `codex/` branch prefix and safer runner requirements. -- Modify `docs/ARCHITECTURE.md`: update Harness execution layer notes if they mention unsafe staging or old branch behavior. -- Modify `.codex/skills/harness-workflow/SKILL.md`: update stale documentation that says the runner creates the legacy feat task branch. Do not invoke the skill while making this edit. - -## Data Contract - -Extend each step object in `phases//index.json` with `allowed_paths`. - -```json -{ - "step": 1, - "name": "Update docs", - "status": "pending", - "summary": "", - "allowed_paths": [ - "docs/*.md", - "docs/**/*.md", - "AGENTS.md" - ] -} -``` - -Allowlist semantics: -- Paths are repository-relative and normalized to forward slashes. -- Exact file path matches are allowed. -- Directory prefix entries ending with `/` allow every path under that directory. -- Glob entries using `*`, `?`, or `[` are matched with `fnmatch.fnmatchcase`. -- Runner-managed housekeeping files are always allowed separately: - - `phases//index.json` - - `phases//step-output.json` - - `phases/index.json` - -## Task 1: Test Harness for `scripts/execute.py` - -**Files:** -- Create: `scripts/test_execute.py` -- Read: `scripts/execute.py` - -- [ ] **Step 1: Add loader and temporary phase helpers** - -Create `scripts/test_execute.py` with this initial content: - -```python -import importlib.util -import json -import subprocess -import tempfile -import unittest -from pathlib import Path -from unittest.mock import patch - - -def load_execute(): - module_path = Path(__file__).resolve().parent / "execute.py" - spec = importlib.util.spec_from_file_location("execute", module_path) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - return module - - -def write_phase(root: Path, phase_dir: str = "0-mvp", phase_name: str = "0-mvp", steps=None): - phase_path = root / "phases" / phase_dir - phase_path.mkdir(parents=True) - if steps is None: - steps = [ - { - "step": 1, - "name": "Docs", - "status": "pending", - "summary": "", - "allowed_paths": ["docs/*.md"], - } - ] - (phase_path / "index.json").write_text( - json.dumps({"project": "FESA", "phase": phase_name, "steps": steps}, indent=2), - encoding="utf-8", - ) - (phase_path / "step1.md").write_text("# Step 1\n", encoding="utf-8") - return phase_path - - -def make_executor(execute, root: Path, phase_dir: str = "0-mvp"): - with patch.object(execute, "ROOT", root): - return execute.StepExecutor(phase_dir) - - -class ExecuteRunnerSafetyTests(unittest.TestCase): - pass - - -if __name__ == "__main__": - unittest.main() -``` - -- [ ] **Step 2: Run the new empty test module** - -Run: - -```powershell -python -m unittest scripts.test_execute -``` - -Expected: pass with one empty test class loaded and no failures. - -- [ ] **Step 3: Commit the test scaffold** - -Run: - -```powershell -git add scripts/test_execute.py -git commit -m "test: add execute runner safety test scaffold" -``` - -## Task 2: `codex/` Branch Prefix - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing tests for branch naming and push branch** - -Add these methods to `ExecuteRunnerSafetyTests`: - -```python - def test_branch_name_uses_codex_prefix_and_sanitized_phase(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root, phase_name="linear truss/1d") - executor = make_executor(execute, root) - - self.assertEqual(executor._branch_name(), "codex/linear-truss-1d") - - def test_finalize_push_uses_codex_branch_name(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root, phase_name="0-mvp") - executor = make_executor(execute, root) - executor._auto_push = True - calls = [] - - def fake_git(*args): - calls.append(args) - if args == ("diff", "--cached", "--quiet"): - return subprocess.CompletedProcess(args, 0, "", "") - return subprocess.CompletedProcess(args, 0, "", "") - - with patch.object(executor, "_run_git", side_effect=fake_git): - with patch.object(executor, "_validate_before_commit", create=True): - executor._finalize() - - self.assertIn(("push", "-u", "origin", "codex/0-mvp"), calls) -``` - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because `StepExecutor` has no `_branch_name()` and `_finalize()` still uses `feat-`. - -- [ ] **Step 3: Implement branch naming** - -In `scripts/execute.py`, import `re` near the other imports: - -```python -import re -``` - -Add this method to `StepExecutor` under the `# --- git ---` section: - -```python - def _branch_name(self) -> str: - slug = re.sub(r"[^A-Za-z0-9._-]+", "-", self._phase_name.strip()) - slug = slug.strip("/.-") - if not slug: - slug = self._phase_dir_name - return f"codex/{slug}" -``` - -Replace both direct branch constructions: - -```python -branch = self._branch_name() -``` - -with: - -```python -branch = self._branch_name() -``` - -- [ ] **Step 4: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: pass. - -- [ ] **Step 5: Commit** - -Run: - -```powershell -git add scripts/test_execute.py scripts/execute.py -git commit -m "fix: use codex branch prefix in execute runner" -``` - -## Task 3: Dirty Worktree Protection - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing tests for dirty worktree guard** - -Add these methods: - -```python - def test_assert_clean_worktree_exits_when_git_status_has_changes(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - - with patch.object( - executor, - "_run_git", - return_value=subprocess.CompletedProcess([], 0, " M AGENTS.md\n?? scratch.txt\n", ""), - ): - with self.assertRaises(SystemExit) as cm: - executor._assert_clean_worktree("before checkout") - - self.assertEqual(cm.exception.code, 1) - - def test_run_checks_clean_worktree_before_checkout(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - calls = [] - - def record(name): - def inner(*args, **kwargs): - calls.append(name) - return inner - - with patch.object(executor, "_assert_clean_worktree", side_effect=record("clean")): - with patch.object(executor, "_checkout_branch", side_effect=record("checkout")): - with patch.object(executor, "_print_header"): - with patch.object(executor, "_check_blockers"): - with patch.object(executor, "_load_guardrails", return_value=""): - with patch.object(executor, "_ensure_created_at"): - with patch.object(executor, "_execute_all_steps"): - with patch.object(executor, "_finalize"): - executor.run() - - self.assertLess(calls.index("clean"), calls.index("checkout")) -``` - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because `_assert_clean_worktree()` does not exist and `run()` does not call it. - -- [ ] **Step 3: Implement dirty worktree guard** - -Add this method under `# --- git ---`: - -```python - def _assert_clean_worktree(self, context: str): - r = self._run_git("status", "--porcelain") - if r.returncode != 0: - print(" ERROR: git status failed.") - print(f" {r.stderr.strip()}") - sys.exit(1) - dirty = r.stdout.strip() - if dirty: - print(f" ERROR: dirty worktree detected {context}.") - print(" Commit, stash, or remove these changes before running scripts/execute.py:") - for line in dirty.splitlines(): - print(f" {line}") - sys.exit(1) -``` - -Change `run()` so the guard runs before branch checkout: - -```python - self._print_header() - self._check_blockers() - self._assert_clean_worktree("before branch checkout") - self._checkout_branch() -``` - -- [ ] **Step 4: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: pass. - -- [ ] **Step 5: Commit** - -Run: - -```powershell -git add scripts/test_execute.py scripts/execute.py -git commit -m "fix: block execute runner on dirty worktree" -``` - -## Task 4: Per-Step File Allowlist - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing tests for allowlist matching and missing allowlist** - -Add these methods: - -```python - def test_step_allowlist_accepts_exact_prefix_and_glob_paths(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - patterns = ["AGENTS.md", "docs/", "scripts/*.py"] - - self.assertTrue(executor._path_allowed("AGENTS.md", patterns)) - self.assertTrue(executor._path_allowed("docs/PRD.md", patterns)) - self.assertTrue(executor._path_allowed("scripts/execute.py", patterns)) - self.assertFalse(executor._path_allowed(".codex/hooks.json", patterns)) - - def test_step_without_allowed_paths_is_rejected_before_codex_invocation(self): - execute = load_execute() - steps = [{"step": 1, "name": "Unsafe", "status": "pending", "summary": ""}] - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root, steps=steps) - executor = make_executor(execute, root) - - with self.assertRaises(SystemExit) as cm: - executor._validate_step_allowlist(steps[0]) - - self.assertEqual(cm.exception.code, 1) -``` - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because allowlist helpers do not exist. - -- [ ] **Step 3: Implement allowlist helpers** - -Add `fnmatch` import: - -```python -import fnmatch -``` - -Add these methods under `# --- git ---` or a new `# --- file allowlist ---` section: - -```python - @staticmethod - def _normalize_rel_path(path: str) -> str: - return path.replace("\\", "/").lstrip("./") - - def _path_allowed(self, path: str, patterns: list[str]) -> bool: - rel = self._normalize_rel_path(path) - for raw in patterns: - pattern = self._normalize_rel_path(str(raw)) - if not pattern: - continue - if pattern.endswith("/") and rel.startswith(pattern): - return True - if any(ch in pattern for ch in "*?[") and fnmatch.fnmatchcase(rel, pattern): - return True - if rel == pattern: - return True - return False - - def _validate_step_allowlist(self, step: dict): - allowed = step.get("allowed_paths") - if not isinstance(allowed, list) or not allowed or not all(isinstance(p, str) and p.strip() for p in allowed): - print(f" ERROR: Step {step.get('step')} must define non-empty allowed_paths.") - sys.exit(1) -``` - -Call `_validate_step_allowlist(pending)` before `_execute_single_step(pending, guardrails)` in `_execute_all_steps()`. - -- [ ] **Step 4: Add allowlist to prompt context** - -In `_build_preamble`, add a parameter: - -```python - def _build_preamble(self, guardrails: str, step_context: str, - allowed_paths: list[str], - prev_error: Optional[str] = None) -> str: -``` - -Add this block before `## 작업 규칙`: - -```python - f"## Step 파일 allowlist\n\n" - f"이 step은 아래 repository-relative path만 수정할 수 있습니다.\n" - f"{chr(10).join(f'- {p}' for p in allowed_paths)}\n\n" -``` - -Update the caller in `_execute_single_step()`: - -```python -preamble = self._build_preamble(guardrails, step_context, step.get("allowed_paths", []), prev_error) -``` - -- [ ] **Step 5: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: pass. - -- [ ] **Step 6: Commit** - -Run: - -```powershell -git add scripts/test_execute.py scripts/execute.py -git commit -m "fix: require execute step file allowlists" -``` - -## Task 5: Detect and Block Disallowed Step Changes - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing tests for changed path classification** - -Add this method: - -```python - def test_classify_step_changes_splits_allowed_housekeeping_and_disallowed_paths(self): - execute = load_execute() - step = { - "step": 1, - "name": "Docs", - "status": "completed", - "summary": "", - "allowed_paths": ["docs/*.md"], - } - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - changed = [ - "docs/PRD.md", - "phases/0-mvp/index.json", - "phases/0-mvp/step1-output.json", - "scripts/execute.py", - ] - - allowed, housekeeping, disallowed = executor._classify_step_changes(1, step, changed) - - self.assertEqual(allowed, ["docs/PRD.md"]) - self.assertEqual(housekeeping, ["phases/0-mvp/index.json", "phases/0-mvp/step1-output.json"]) - self.assertEqual(disallowed, ["scripts/execute.py"]) -``` - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because `_classify_step_changes()` does not exist. - -- [ ] **Step 3: Implement changed path collection and classification** - -Add these methods: - -```python - def _changed_paths(self) -> list[str]: - paths: list[str] = [] - tracked = self._run_git("diff", "--name-only") - if tracked.returncode != 0: - print(" ERROR: git diff --name-only failed.") - print(f" {tracked.stderr.strip()}") - sys.exit(1) - paths.extend(tracked.stdout.splitlines()) - - staged = self._run_git("diff", "--cached", "--name-only") - if staged.returncode != 0: - print(" ERROR: git diff --cached --name-only failed.") - print(f" {staged.stderr.strip()}") - sys.exit(1) - paths.extend(staged.stdout.splitlines()) - - untracked = self._run_git("ls-files", "--others", "--exclude-standard") - if untracked.returncode != 0: - print(" ERROR: git ls-files --others failed.") - print(f" {untracked.stderr.strip()}") - sys.exit(1) - paths.extend(untracked.stdout.splitlines()) - - return sorted({self._normalize_rel_path(p) for p in paths if p.strip()}) - - def _housekeeping_paths(self, step_num: int) -> set[str]: - return { - f"phases/{self._phase_dir_name}/index.json", - f"phases/{self._phase_dir_name}/step{step_num}-output.json", - "phases/index.json", - } - - def _classify_step_changes(self, step_num: int, step: dict, changed_paths: list[str]) -> tuple[list[str], list[str], list[str]]: - allowed_patterns = step.get("allowed_paths", []) - housekeeping_set = self._housekeeping_paths(step_num) - allowed: list[str] = [] - housekeeping: list[str] = [] - disallowed: list[str] = [] - for path in changed_paths: - rel = self._normalize_rel_path(path) - if rel in housekeeping_set: - housekeeping.append(rel) - elif self._path_allowed(rel, allowed_patterns): - allowed.append(rel) - else: - disallowed.append(rel) - return allowed, housekeeping, disallowed -``` - -- [ ] **Step 4: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: pass. - -- [ ] **Step 5: Commit** - -Run: - -```powershell -git add scripts/test_execute.py scripts/execute.py -git commit -m "fix: classify execute step file changes" -``` - -## Task 6: Remove Broad Staging and Stage Explicit Paths Only - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing test that commit path never uses broad staging** - -Add this method: - -```python - def test_commit_step_stages_only_explicit_allowed_and_housekeeping_paths(self): - execute = load_execute() - step = { - "step": 1, - "name": "Docs", - "status": "completed", - "summary": "", - "allowed_paths": ["docs/*.md"], - } - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - calls = [] - - def fake_git(*args): - calls.append(args) - if args in { - ("diff", "--quiet", "--cached", "--"), - ("diff", "--cached", "--quiet"), - }: - return subprocess.CompletedProcess(args, 1, "", "") - return subprocess.CompletedProcess(args, 0, "", "") - - with patch.object(executor, "_changed_paths", return_value=["docs/PRD.md", "phases/0-mvp/index.json", "phases/0-mvp/step1-output.json"]): - with patch.object(executor, "_run_git", side_effect=fake_git): - with patch.object(executor, "_validate_before_commit"): - executor._commit_step(step, "Docs") - - self.assertNotIn(("add", "-A"), calls) - self.assertIn(("add", "--", "docs/PRD.md"), calls) - self.assertIn(("add", "--", "phases/0-mvp/index.json", "phases/0-mvp/step1-output.json"), calls) -``` - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because `_commit_step()` still accepts `(step_num, step_name)` and uses broad staging. - -- [ ] **Step 3: Implement explicit staging helper** - -Add this method: - -```python - def _stage_paths(self, paths: list[str]): - if not paths: - return - r = self._run_git("add", "--", *paths) - if r.returncode != 0: - print(" ERROR: git add failed.") - print(f" {r.stderr.strip()}") - sys.exit(1) -``` - -Change `_commit_step` signature: - -```python - def _commit_step(self, step: dict, step_name: str): - step_num = step["step"] -``` - -Replace the old broad staging logic with: - -```python - changed = self._changed_paths() - allowed, housekeeping, disallowed = self._classify_step_changes(step_num, step, changed) - if disallowed: - print(f" ERROR: Step {step_num} modified files outside allowed_paths:") - for path in disallowed: - print(f" {path}") - sys.exit(1) - - if allowed: - msg = self.FEAT_MSG.format(phase=self._phase_name, num=step_num, name=step_name) - self._validate_before_commit(msg) - self._stage_paths(allowed) - if self._run_git("diff", "--cached", "--quiet").returncode != 0: - r = self._run_git("commit", "-m", msg) - if r.returncode != 0: - print(f" ERROR: 코드 커밋 실패: {r.stderr.strip()}") - sys.exit(1) - print(f" Commit: {msg}") - - if housekeeping: - msg = self.CHORE_MSG.format(phase=self._phase_name, num=step_num) - self._validate_before_commit(msg) - self._stage_paths(housekeeping) - if self._run_git("diff", "--cached", "--quiet").returncode != 0: - r = self._run_git("commit", "-m", msg) - if r.returncode != 0: - print(f" ERROR: housekeeping 커밋 실패: {r.stderr.strip()}") - sys.exit(1) -``` - -Update caller: - -```python -self._commit_step(step, step_name) -``` - -- [ ] **Step 4: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail only if `_validate_before_commit()` is not implemented yet. If so, continue to Task 7 before expecting full pass. - -## Task 7: Validation Before Commit - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing tests for validation command behavior** - -Add these methods: - -```python - def test_validate_before_commit_runs_python_selftest_then_workspace_validation(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - commands = [] - - def fake_run(cmd, **kwargs): - commands.append(cmd) - return subprocess.CompletedProcess(cmd, 0, "ok", "") - - with patch.object(execute.subprocess, "run", side_effect=fake_run): - executor._validate_before_commit("feat(0-mvp): step 1") - - self.assertEqual( - commands, - [ - [sys.executable, "-m", "unittest", "discover", "-s", "scripts", "-p", "test_*.py"], - [sys.executable, "scripts/validate_workspace.py"], - ], - ) - - def test_validate_before_commit_exits_before_commit_when_validation_fails(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - executor = make_executor(execute, root) - - def fake_run(cmd, **kwargs): - return subprocess.CompletedProcess(cmd, 1, "bad", "failed") - - with patch.object(execute.subprocess, "run", side_effect=fake_run): - with self.assertRaises(SystemExit) as cm: - executor._validate_before_commit("feat(0-mvp): step 1") - - self.assertEqual(cm.exception.code, 1) -``` - -Add `import sys` to `scripts/test_execute.py`. - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because `_validate_before_commit()` does not exist. - -- [ ] **Step 3: Implement validation-before-commit** - -Add this class constant near `MAX_RETRIES`: - -```python - VALIDATION_COMMANDS = ( - [sys.executable, "-m", "unittest", "discover", "-s", "scripts", "-p", "test_*.py"], - [sys.executable, "scripts/validate_workspace.py"], - ) -``` - -Add this method: - -```python - def _validate_before_commit(self, commit_message: str): - print(f" Validation before commit: {commit_message}") - for cmd in self.VALIDATION_COMMANDS: - r = subprocess.run(cmd, cwd=self._root, capture_output=True, text=True) - if r.returncode != 0: - print(f" ERROR: validation failed before commit: {' '.join(cmd)}") - if r.stdout: - print(r.stdout[-2000:]) - if r.stderr: - print(r.stderr[-2000:]) - sys.exit(1) -``` - -- [ ] **Step 4: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: pass. - -- [ ] **Step 5: Commit** - -Run: - -```powershell -git add scripts/test_execute.py scripts/execute.py -git commit -m "fix: validate execute runner before commits" -``` - -## Task 8: Finalize Without Broad Staging - -**Files:** -- Modify: `scripts/test_execute.py` -- Modify: `scripts/execute.py` - -- [ ] **Step 1: Add failing test for final commit explicit staging** - -Add this method: - -```python - def test_finalize_stages_only_phase_indexes(self): - execute = load_execute() - with tempfile.TemporaryDirectory() as tmp: - root = Path(tmp) - write_phase(root) - (root / "phases" / "index.json").write_text('{"phases":[]}', encoding="utf-8") - executor = make_executor(execute, root) - calls = [] - - def fake_git(*args): - calls.append(args) - if args == ("diff", "--cached", "--quiet"): - return subprocess.CompletedProcess(args, 1, "", "") - return subprocess.CompletedProcess(args, 0, "", "") - - with patch.object(executor, "_run_git", side_effect=fake_git): - with patch.object(executor, "_validate_before_commit"): - executor._finalize() - - self.assertNotIn(("add", "-A"), calls) - self.assertIn(("add", "--", "phases/0-mvp/index.json", "phases/index.json"), calls) -``` - -- [ ] **Step 2: Run tests and verify failure** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: fail because `_finalize()` still uses broad staging. - -- [ ] **Step 3: Replace final staging** - -In `_finalize()`, replace: - -```python - self._run_git("add", "-A") -``` - -with: - -```python - final_paths = [f"phases/{self._phase_dir_name}/index.json"] - if self._top_index_file.exists(): - final_paths.append("phases/index.json") - self._validate_before_commit(f"chore({self._phase_name}): mark phase completed") - self._stage_paths(final_paths) -``` - -Keep the existing cached diff check and commit message, but change commit failure from silent no-op to fatal: - -```python - if r.returncode == 0: - print(f" ✓ {msg}") - else: - print(f" ERROR: phase completion commit failed: {r.stderr.strip()}") - sys.exit(1) -``` - -- [ ] **Step 4: Run targeted tests** - -Run: - -```powershell -python -m unittest scripts.test_execute -v -``` - -Expected: pass. - -- [ ] **Step 5: Commit** - -Run: - -```powershell -git add scripts/test_execute.py scripts/execute.py -git commit -m "fix: stage execute finalization explicitly" -``` - -## Task 9: Documentation and Existing Contract Tests - -**Files:** -- Modify: `AGENTS.md` -- Modify: `docs/ARCHITECTURE.md` -- Modify: `.codex/skills/harness-workflow/SKILL.md` only to remove stale legacy feat branch wording; do not use the skill. -- Modify: existing `scripts/test_*` files only if they assert stale branch or staging behavior. - -- [ ] **Step 1: Update `AGENTS.md` runner rules** - -Add these bullets under the Harness runner rules: - -```markdown -- `scripts/execute.py`는 `codex/` branch prefix만 사용한다. -- `scripts/execute.py` 실행 전 worktree는 clean 상태여야 한다. -- phase step은 `allowed_paths`를 선언해야 하며 runner는 allowlist 밖 변경을 커밋하지 않는다. -- runner는 broad staging을 사용하지 않고 explicit path만 stage한다. -- runner가 만드는 모든 commit 전에는 Python self-test와 `python scripts/validate_workspace.py`가 통과해야 한다. -``` - -- [ ] **Step 2: Update architecture docs** - -In `docs/ARCHITECTURE.md`, update the Harness execution layer section so it states: - -```markdown -scripts/execute.py: -- creates/checks out `codex/` -- refuses to run on a dirty worktree -- requires per-step `allowed_paths` -- stages only explicit allowed paths and runner housekeeping files -- runs Python self-test and workspace validation before every runner-created commit -``` - -- [ ] **Step 3: Update stale harness workflow description without invoking the skill** - -In `.codex/skills/harness-workflow/SKILL.md`, replace the sentence that says: - -```markdown -`scripts/execute.py` creates or checks out the legacy feat task branch -``` - -with: - -```markdown -`scripts/execute.py` creates or checks out `codex/{task-name}` -``` - -Also add one sentence that phase steps must provide `allowed_paths`. - -- [ ] **Step 4: Run docs-related searches** - -Run: - -```powershell -rg -n "legacy-feat-branch|broad staging|allowed_paths|codex/" AGENTS.md docs .codex scripts -``` - -Expected: -- No stale `scripts/execute.py` branch docs saying the legacy feat task branch. -- No broad staging in `scripts/execute.py`. -- `allowed_paths` appears in runner docs and tests. - -- [ ] **Step 5: Commit** - -Run: - -```powershell -git add AGENTS.md docs/ARCHITECTURE.md .codex/skills/harness-workflow/SKILL.md -git commit -m "docs: document safe execute runner contract" -``` - -## Task 10: Full Verification - -**Files:** -- Read: all changed files - -- [ ] **Step 1: Run Python self-tests** - -Run: - -```powershell -python -m unittest discover -s scripts -p "test_*.py" -``` - -Expected: - -```text -OK -``` - -- [ ] **Step 2: Run workspace validation** - -Run: - -```powershell -python scripts/validate_workspace.py -``` - -Expected in current no-CMake workspace: - -```text -No C++ validation commands configured. -Add CMakeLists.txt or set HARNESS_VALIDATION_COMMANDS. -``` - -Exit code must be `0`. - -- [ ] **Step 3: Run whitespace check** - -Run: - -```powershell -git diff --check -``` - -Expected: exit code `0`. LF-to-CRLF warnings are acceptable if there are no whitespace error lines. - -- [ ] **Step 4: Run safety searches** - -Run: - -```powershell -rg -n "legacy-feat-branch|broad staging" scripts/execute.py AGENTS.md docs .codex -``` - -Expected: no matches. - -Run: - -```powershell -rg -n "allowed_paths|codex/" scripts/execute.py scripts/test_execute.py AGENTS.md docs/ARCHITECTURE.md .codex/skills/harness-workflow/SKILL.md -``` - -Expected: matches showing the new branch prefix and allowlist contract. - -- [ ] **Step 5: Final commit if verification-only edits were needed** - -Run only if Task 10 caused additional edits: - -```powershell -git add scripts/execute.py scripts/test_execute.py AGENTS.md docs/ARCHITECTURE.md .codex/skills/harness-workflow/SKILL.md -git commit -m "fix: harden execute runner safety checks" -``` - -## Acceptance Checklist - -- `scripts/execute.py` contains no broad staging. -- `_branch_name()` returns a `codex/` branch name and `_checkout_branch()`/`_finalize()` both use it. -- `run()` calls `_assert_clean_worktree()` before `_checkout_branch()`. -- Every pending step must have a non-empty `allowed_paths`. -- Runner-managed phase index/output files are allowed as housekeeping, not mixed with code/doc step commits. -- Any path outside `allowed_paths` and housekeeping paths blocks commit and exits non-zero. -- `_validate_before_commit()` runs Python self-tests and `scripts/validate_workspace.py` before every runner-created commit. -- Validation failure exits before staging/committing. -- Commit failure exits non-zero. -- Documentation no longer describes `feat-` branches for `scripts/execute.py`. diff --git a/docs/superpowers/plans/2026-06-11-reference-csv-comparison-contract.md b/docs/superpowers/plans/2026-06-11-reference-csv-comparison-contract.md deleted file mode 100644 index 2c938d1..0000000 --- a/docs/superpowers/plans/2026-06-11-reference-csv-comparison-contract.md +++ /dev/null @@ -1,793 +0,0 @@ -# Reference CSV Comparison Contract Implementation Plan - -> **Historical / Partially Superseded:** Reference CSV/HDF5 제품 계약의 배경 기록으로만 -> 보존한다. 이 문서의 Python `unittest`, 삭제된 workspace validation script, Harness -> 환경 변수 관련 검증 절차는 폐기되었으며 현재 운영 계약은 -> `docs/HARNESS_WORKFLOW.md`와 `docs/HARNESS.md`를 따른다. -> 이 문서 아래의 `metadata.json` 필수 문구와 예시는 ADR-010의 2026-08-12 정책으로 -> 대체되었다. 현재는 Reference Model Contract가 필수 provenance를 소유하고, -> `metadata.json`은 존재할 때만 read-only로 참고하는 선택 artifact다. - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Re-align FESA reference comparison contracts so FESA solver output remains authoritative HDF5, while Abaqus-derived reference results are CSV files compared directly against the FESA `results.h5` datasets. - -**Architecture:** The active contract becomes `FESA results.h5 -> comparison normalizer -> Abaqus reference CSV`. Reference CSV files are authoritative reference artifacts; they are not deterministic CSV views derived from `reference.h5`, and `reference.h5` is no longer required. Existing documentation, skills, agent prompts, and Python contract tests must all describe the same flat reference folder shape. - -**Tech Stack:** Markdown docs, Codex skill `SKILL.md`, agent TOML/YAML metadata, Python `unittest`, existing `scripts/validate_workspace.py`. - ---- - -## Target Contract - -Use this exact vocabulary across active contracts: - -- FESA solver result: HDF5 file, normally `/results.h5`. -- Reference result: Abaqus-generated CSV files created by running the same Abaqus `.inp` model outside the agent workflow. -- Comparison: read FESA HDF5 datasets and compare their normalized rows directly with reference CSV rows. -- Reference root: `reference/`, singular, following the user-provided structure. - -Required reference structure: - -```text -reference/ - / - _displacements.csv - _reactions.csv - _internalforces.csv - _stresses.csv - _.csv -``` - -Quantity naming: - -| quantity | reference CSV | FESA HDF5 source | -| --- | --- | --- | -| displacement | `reference//_displacements.csv` | `/steps//frames//field_outputs/U` | -| reaction | `reference//_reactions.csv` | `/steps//frames//field_outputs/RF` | -| internal force | `reference//_internalforces.csv` | `/steps//frames//field_outputs/element_forces` or feature-defined equivalent | -| stress | `reference//_stresses.csv` | `/steps//frames//field_outputs/S` | - -Allowed concept: - -- A comparison command may materialize a deterministic CSV view from FESA HDF5 for debugging or review, but it is derived from `results.h5`, not an official solver output and not the reference artifact. - -Prohibited active-contract claims: - -- `reference.h5` is required. -- `results.h5` and `reference.h5` are both authoritative comparison inputs. -- Reference CSV files are deterministic views derived from `reference.h5`. -- Reference bundles live only under `references///`. - -Historical plan files under `docs/superpowers/plans/` may mention older contracts, but active docs, skills, agents, and tests must not. - -## File Structure - -Modify these active contract files: - -- `AGENTS.md`: project-level reference comparison rules. -- `docs/ProjectInitialPlanNote.md`: initial plan notes where the old HDF5/reference-HDF5 decision was recorded. -- `docs/PRD.md`: user-facing product/verification expectations. -- `docs/ARCHITECTURE.md`: result and reference data-flow architecture. -- `docs/ADR.md`: architecture decision record for HDF5 solver output and CSV reference artifacts. -- `docs/SOLVER_AGENT_DESIGN.md`: agent workflow and gates. -- `docs/SOLVER_SKILL_DESIGN.md`: skill workflow overview. -- `docs/reference-models/README.md`: reference artifact bundle contract. -- `docs/reference-verifications/README.md`: comparison report template and status rules. -- `docs/io-definitions/README.md`: FESA HDF5 schema and comparison row schema handoff. -- `docs/implementation-plans/README.md`: implementation planning data-flow contract. -- `docs/physics-evaluations/README.md`: physics evidence inventory. -- `docs/requirements/README.md`: reference artifact requirements section. - -Modify these skills and UI metadata: - -- `.codex/skills/fesa-reference-models/SKILL.md` -- `.codex/skills/fesa-reference-models/agents/openai.yaml` -- `.codex/skills/fesa-reference-comparison/SKILL.md` -- `.codex/skills/fesa-reference-comparison/agents/openai.yaml` -- `.codex/skills/fesa-io-contract/SKILL.md` -- `.codex/skills/fesa-physics-sanity/SKILL.md` -- `.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` -- `.codex/skills/fesa-release-readiness/SKILL.md` -- `.codex/skills/fesa-requirements-baseline/SKILL.md` - -Modify these agent configs: - -- `.codex/agents/reference-model-agent.toml` -- `.codex/agents/reference-verification-agent.toml` -- `.codex/agents/io-definition-agent.toml` -- `.codex/agents/implementation-planning-agent.toml` -- `.codex/agents/implementation-agent.toml` -- `.codex/agents/physics-evaluation-agent.toml` -- `.codex/agents/release-agent.toml` -- `.codex/agents/requirement-agent.toml` -- `.codex/agents/coordinator-agent.toml` -- Other `.codex/agents/*-agent.toml` files only where they contain stale `reference.h5` or `reference HDF5` claims. - -Modify these Python contract tests: - -- `scripts/test_fesa_solver_skills.py` -- `scripts/test_reference_model_agent_config.py` -- `scripts/test_reference_verification_agent_config.py` -- `scripts/test_physics_evaluation_agent_config.py` -- `scripts/test_io_definition_agent_config.py` -- `scripts/test_implementation_planning_agent_config.py` -- `scripts/test_requirement_agent_config.py` -- `scripts/test_release_agent_config.py` -- Any other `scripts/test_*_agent_config.py` that still asserts `Do not generate reference HDF5 files or deterministic CSV views.` - ---- - -### Task 1: Update Contract Tests First - -**Files:** -- Modify: `scripts/test_fesa_solver_skills.py` -- Modify: `scripts/test_reference_model_agent_config.py` -- Modify: `scripts/test_reference_verification_agent_config.py` -- Modify: `scripts/test_physics_evaluation_agent_config.py` -- Modify: `scripts/test_io_definition_agent_config.py` -- Modify: `scripts/test_implementation_planning_agent_config.py` -- Modify: `scripts/test_requirement_agent_config.py` -- Modify: `scripts/test_release_agent_config.py` - -- [ ] **Step 1: Replace reference-HDF5 expectations in reference model tests** - -In `scripts/test_reference_model_agent_config.py`, change the artifact contract expectations from `reference.h5` and nested `csv/` files to the flat user-provided structure. - -Use assertions equivalent to: - -```python -for required_text in ( - "FESA reference models use Abaqus input files.", - "reference//", - "model.inp", - "metadata.json", - "_displacements.csv", - "_reactions.csv", - "_internalforces.csv", - "_stresses.csv", -): - self.assertIn(required_text, instructions) - -self.assertNotIn("reference.h5", instructions) -self.assertNotIn("references///", instructions) -``` - -Change the boundary expectation from: - -```python -"Do not generate reference HDF5 files or deterministic CSV views.", -``` - -to: - -```python -"Do not generate or modify Abaqus reference CSV files.", -``` - -- [ ] **Step 2: Replace reference-HDF5 expectations in reference verification tests** - -In `scripts/test_reference_verification_agent_config.py`, assert that the agent compares FESA HDF5 to Abaqus reference CSV: - -```python -for required_text in ( - "results.h5", - "Abaqus reference CSV", - "reference//", - "_displacements.csv", - "_reactions.csv", - "_internalforces.csv", - "_stresses.csv", - "metadata.json", -): - self.assertIn(required_text, instructions) - -self.assertNotIn("reference.h5", instructions) -self.assertNotIn("stored reference HDF5", instructions) -``` - -Keep output section assertions for `Artifact Inventory`, `Comparison Contract`, `Quantity Results`, `Failure Classification`, `Handoff Recommendation`, and `No-Change Assertion`. - -- [ ] **Step 3: Update solver skill contract tests** - -In `scripts/test_fesa_solver_skills.py`, update the `fesa-reference-models` `body_terms` to: - -```python -"reference//", -"model.inp", -"metadata.json", -"_displacements.csv", -"_reactions.csv", -"_internalforces.csv", -"_stresses.csv", -"Coverage Matrix", -"Do not generate or modify Abaqus reference CSV files.", -``` - -Update the `fesa-reference-comparison` `body_terms` to: - -```python -"docs/reference-verifications/-reference-verification.md", -"ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT", -"results.h5", -"Abaqus reference CSV", -"reference//", -"_displacements.csv", -"_reactions.csv", -"_internalforces.csv", -"_stresses.csv", -"max absolute error", -"max relative error", -"RMS error", -"missing rows", -"extra rows", -"pass-for-physics-evaluation", -"Do not change tolerance policies.", -``` - -Keep `HDF5` in the description terms for FESA output. Replace `CSV view` description terms with `CSV` or `reference CSV` where the old phrase implies a reference HDF5-derived view. - -- [ ] **Step 4: Update shared boundary tests** - -For each affected `scripts/test_*_agent_config.py`, replace the old boundary assertion: - -```python -"Do not generate reference HDF5 files or deterministic CSV views.", -``` - -with: - -```python -"Do not generate or modify Abaqus reference CSV files.", -``` - -Use this only for agents whose scope mentions reference artifacts. Do not add the phrase to unrelated tests unless the corresponding agent config already carries a reference artifact boundary. - -- [ ] **Step 5: Run the updated tests and confirm RED** - -Run: - -```powershell -python -m unittest scripts.test_reference_model_agent_config scripts.test_reference_verification_agent_config scripts.test_fesa_solver_skills -v -``` - -Expected: FAIL. Failures should point to missing `reference//`, missing `_internalforces.csv`, or stale `reference.h5` text in active contracts. - -Commit after this task only if using a clean branch: - -```powershell -git add scripts/test_fesa_solver_skills.py scripts/test_reference_model_agent_config.py scripts/test_reference_verification_agent_config.py scripts/test_physics_evaluation_agent_config.py scripts/test_io_definition_agent_config.py scripts/test_implementation_planning_agent_config.py scripts/test_requirement_agent_config.py scripts/test_release_agent_config.py -git commit -m "test: redefine reference comparison contract" -``` - -### Task 2: Update Project-Level Documentation - -**Files:** -- Modify: `AGENTS.md` -- Modify: `docs/ProjectInitialPlanNote.md` -- Modify: `docs/PRD.md` -- Modify: `docs/ARCHITECTURE.md` -- Modify: `docs/ADR.md` - -- [ ] **Step 1: Update `AGENTS.md` project identity** - -Replace the current reference comparison statement with: - -```markdown -- 공식 solver output은 HDF5 `results.h5`이다. -- reference 결과는 FESA와 같은 Abaqus `.inp` 모델을 Abaqus로 해석해 생성한 CSV 파일이다. -- reference comparison은 FESA `results.h5`의 변위, 반력, 내력, 응력 dataset을 `reference//_*.csv` 파일과 비교한다. -- CSV는 FESA 공식 output이 아니며, FESA HDF5에서 추출한 deterministic CSV view는 비교 디버깅/검토용 보조 artifact로만 둔다. -``` - -Replace any active `references///` reference artifact examples with: - -```text -reference//_displacements.csv -reference//_reactions.csv -reference//_internalforces.csv -reference//_stresses.csv -``` - -- [ ] **Step 2: Update `docs/ProjectInitialPlanNote.md`** - -Revise the section currently stating that `reference.h5` is the stored authoritative reference. The replacement must say: - -```markdown -## HDF5 결과와 Abaqus reference CSV 비교 결정 - -FESA solver의 공식 해석 결과는 `results.h5` HDF5 파일이다. Reference 결과는 동일한 Abaqus `.inp` 모델을 Abaqus에서 해석해 추출한 CSV 파일이며, `reference//` 아래에 물리량별 파일로 저장한다. - -Reference comparison은 FESA HDF5 dataset을 deterministic row record로 읽어 `reference//_displacements.csv`, `_reactions.csv`, `_internalforces.csv`, `_stresses.csv`와 직접 비교한다. -``` - -- [ ] **Step 3: Update PRD/architecture/ADR** - -Ensure the active decision in `docs/PRD.md`, `docs/ARCHITECTURE.md`, and `docs/ADR.md` contains these three facts: - -```markdown -- FESA solver writes `results.h5`. -- Abaqus reference results are CSV files under `reference//`. -- Verification compares FESA HDF5 rows with Abaqus reference CSV rows using documented IDs, components, units, coordinate system, step/frame identity, and tolerance. -``` - -Remove or rewrite claims that `reference.h5` is required or that reference CSV files are generated from reference HDF5. - -- [ ] **Step 4: Run targeted stale-text check** - -Run: - -```powershell -rg -n "reference\.h5|stored reference HDF5|results\.h5.*reference\.h5|derived from reference\.h5|references///" AGENTS.md docs\ProjectInitialPlanNote.md docs\PRD.md docs\ARCHITECTURE.md docs\ADR.md -``` - -Expected: no matches in these active project-level docs. - -Commit: - -```powershell -git add AGENTS.md docs/ProjectInitialPlanNote.md docs/PRD.md docs/ARCHITECTURE.md docs/ADR.md -git commit -m "docs: define HDF5 to reference CSV comparison" -``` - -### Task 3: Update Reference Model Contracts - -**Files:** -- Modify: `docs/reference-models/README.md` -- Modify: `.codex/skills/fesa-reference-models/SKILL.md` -- Modify: `.codex/skills/fesa-reference-models/agents/openai.yaml` -- Modify: `.codex/agents/reference-model-agent.toml` - -- [ ] **Step 1: Rewrite the artifact bundle structure** - -Use this structure in all four files: - -```text -reference/ - / - model.inp - metadata.json - _displacements.csv - _reactions.csv - _internalforces.csv - _stresses.csv - README.md -``` - -Optional files: - -```text - _strains.csv - _energy_or_residual.csv - _.csv - notes.md -``` - -- [ ] **Step 2: Rename the reference result section** - -Change headings and output contracts from `Reference HDF5 and CSV View Requirements` to: - -```markdown -## Abaqus Reference CSV Requirements -``` - -For `docs/reference-models/README.md`, include this exact required-file wording: - -```markdown -- `_displacements.csv`: required when nodal displacement is a verification quantity. -- `_reactions.csv`: required when constrained DOF reactions or global equilibrium are verification quantities. -- `_internalforces.csv`: required when element internal force is a verification quantity. -- `_stresses.csv`: required when stress is a verification quantity. -``` - -- [ ] **Step 3: Update metadata contract** - -Replace reference HDF5 metadata fields with CSV/reference provenance fields: - -```json -{ - "feature_id": "", - "model_id": "", - "artifact_status": "draft | needs-reference-artifacts | ready-for-implementation-planning | blocked", - "input_file": "model.inp", - "abaqus_version": "", - "generation_owner": "", - "generation_date": "", - "source_documents": ["docs/requirements/.md"], - "units": "", - "coordinate_system": "global Cartesian unless otherwise documented", - "analysis_type": "", - "element_types": [""], - "material_values": {}, - "boundary_condition_summary": "", - "load_summary": "", - "output_requests": ["U", "RF", "S", ""], - "reference_csv_schema_version": "", - "reference_csv_files": [ - "_displacements.csv", - "_reactions.csv", - "_internalforces.csv", - "_stresses.csv" - ], - "tolerance_policy": "", - "limitations": [""] -} -``` - -- [ ] **Step 4: Update coverage matrix** - -Change coverage matrix columns from `hdf5_dataset` and `csv_view` to: - -```markdown -| requirement_id | model_id | compared_quantity | fesa_hdf5_dataset | reference_csv | tolerance | verification_method | status | -| --- | --- | --- | --- | --- | --- | --- | --- | -| | | displacement | /steps//frames//field_outputs/U | reference//_displacements.csv | | hdf5-to-reference-csv | draft | -| | | reaction | /steps//frames//field_outputs/RF | reference//_reactions.csv | | hdf5-to-reference-csv | draft | -| | | internal force | /steps//frames//field_outputs/element_forces | reference//_internalforces.csv | | hdf5-to-reference-csv | draft | -| | | stress | /steps//frames//field_outputs/S | reference//_stresses.csv | | hdf5-to-reference-csv | draft | -``` - -- [ ] **Step 5: Verify Task 3 tests** - -Run: - -```powershell -python -m unittest scripts.test_reference_model_agent_config scripts.test_fesa_solver_skills -v -``` - -Expected: reference model tests PASS; reference comparison skill tests may still fail until Task 4. - -Commit: - -```powershell -git add docs/reference-models/README.md .codex/skills/fesa-reference-models/SKILL.md .codex/skills/fesa-reference-models/agents/openai.yaml .codex/agents/reference-model-agent.toml -git commit -m "docs: update reference model CSV artifact contract" -``` - -### Task 4: Update Reference Verification Contracts - -**Files:** -- Modify: `docs/reference-verifications/README.md` -- Modify: `.codex/skills/fesa-reference-comparison/SKILL.md` -- Modify: `.codex/skills/fesa-reference-comparison/agents/openai.yaml` -- Modify: `.codex/agents/reference-verification-agent.toml` - -- [ ] **Step 1: Rewrite the mission** - -Use this comparison statement: - -```markdown -Reference Verification Agent는 Build/Test Executor Agent 통과 후 generated solver `results.h5`와 Abaqus reference CSV files를 tolerance 기준으로 비교한다. Reference CSV는 동일한 Abaqus `.inp` 모델을 Abaqus로 해석해 추출한 변위, 반력, 내력, 응력 결과이며, FESA HDF5 dataset에서 파생된 파일이 아니다. -``` - -- [ ] **Step 2: Update artifact check** - -Artifact check must require: - -```markdown -- `metadata.json` -- `model.inp` -- generated solver `results.h5` -- `reference//_displacements.csv` -- `reference//_reactions.csv` -- `reference//_internalforces.csv` -- `reference//_stresses.csv` -- reference CSV schema version -- FESA HDF5 schema version -- units -- coordinate system -- step/frame identity -- node/element ID matching rule -- output location -- component naming -- tolerance policy -``` - -- [ ] **Step 3: Update comparison targets** - -Replace authoritative HDF5-vs-HDF5 rows with: - -```markdown -| quantity | fesa_hdf5_dataset | reference_csv | -| --- | --- | --- | -| displacement | /steps//frames//field_outputs/U | reference//_displacements.csv | -| reaction | /steps//frames//field_outputs/RF | reference//_reactions.csv | -| internal force | /steps//frames//field_outputs/element_forces | reference//_internalforces.csv | -| stress | /steps//frames//field_outputs/S | reference//_stresses.csv | -``` - -- [ ] **Step 4: Update report template** - -Change `Artifact Inventory` rows to: - -```markdown -| item | path | status | notes | -| --- | --- | --- | --- | -| reference_model_dir | reference// | present | missing | | -| reference_input | reference//model.inp | present | missing | | -| metadata | reference//metadata.json | present | missing | | -| reference_displacements_csv | reference//_displacements.csv | present | missing | | -| reference_reactions_csv | reference//_reactions.csv | present | missing | | -| reference_internalforces_csv | reference//_internalforces.csv | present | missing | | -| reference_stresses_csv | reference//_stresses.csv | present | missing | | -| solver_hdf5 | /results.h5 | present | missing | | -| solver_debug_csv_view | /csv/ | present | missing | | -``` - -Change `Quantity Results` columns to: - -```markdown -| quantity | model_id | fesa_hdf5_dataset | reference_csv | compared_rows | missing_rows | extra_rows | max_abs_error | max_rel_error | rms_error | norm_error | worst_id | worst_component | result | -``` - -- [ ] **Step 5: Update skill and UI metadata prompts** - -Set `.codex/skills/fesa-reference-comparison/agents/openai.yaml` default prompt to: - -```yaml -default_prompt: "Use $fesa-reference-comparison to compare FESA solver results.h5 against Abaqus reference CSV files." -``` - -The skill `description` should include: - -```text -FESA solver HDF5 results against Abaqus reference CSV files -``` - -- [ ] **Step 6: Verify Task 4 tests** - -Run: - -```powershell -python -m unittest scripts.test_reference_verification_agent_config scripts.test_fesa_solver_skills -v -``` - -Expected: PASS. - -Commit: - -```powershell -git add docs/reference-verifications/README.md .codex/skills/fesa-reference-comparison/SKILL.md .codex/skills/fesa-reference-comparison/agents/openai.yaml .codex/agents/reference-verification-agent.toml -git commit -m "docs: compare solver HDF5 with Abaqus reference CSV" -``` - -### Task 5: Update Upstream and Downstream Workflow Docs - -**Files:** -- Modify: `docs/SOLVER_AGENT_DESIGN.md` -- Modify: `docs/SOLVER_SKILL_DESIGN.md` -- Modify: `docs/io-definitions/README.md` -- Modify: `docs/implementation-plans/README.md` -- Modify: `docs/physics-evaluations/README.md` -- Modify: `docs/requirements/README.md` -- Modify: `.codex/skills/fesa-io-contract/SKILL.md` -- Modify: `.codex/skills/fesa-physics-sanity/SKILL.md` -- Modify: `.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` -- Modify: `.codex/skills/fesa-release-readiness/SKILL.md` -- Modify: `.codex/skills/fesa-requirements-baseline/SKILL.md` -- Modify: `.codex/agents/io-definition-agent.toml` -- Modify: `.codex/agents/implementation-planning-agent.toml` -- Modify: `.codex/agents/implementation-agent.toml` -- Modify: `.codex/agents/physics-evaluation-agent.toml` -- Modify: `.codex/agents/release-agent.toml` -- Modify: `.codex/agents/requirement-agent.toml` -- Modify: `.codex/agents/coordinator-agent.toml` - -- [ ] **Step 1: Update I/O contract wording** - -Keep FESA `results.h5` authoritative. Reframe CSV schema sections as comparison row schema, not reference HDF5-derived view: - -```markdown -## FESA HDF5 to Reference CSV Comparison Schema - -FESA solver output is `results.h5`. Comparison tooling reads required HDF5 datasets and maps them to deterministic row records that can be matched against Abaqus reference CSV files under `reference//`. -``` - -Use `reference_csv_schema_version` for reference CSV contracts and `hdf5_schema_version` for FESA output contracts. - -- [ ] **Step 2: Update implementation planning data flow** - -Change data-flow contract to: - -```markdown -1. Abaqus `.inp` input follows docs/io-definitions/-io.md. -2. Parser/I/O path maps model data and history data into the internal semantic model. -3. Solver path produces authoritative `results.h5` with displacement, reaction, internal force, stress, or feature-specific result datasets. -4. Reference artifacts are Abaqus-generated CSV files under `reference//`. -5. Reference comparison tests compare FESA `results.h5` rows against `reference//_*.csv` rows. -``` - -- [ ] **Step 3: Update physics evidence inventory** - -Change physics evidence references from solver/reference HDF5 to: - -```markdown -- checked solver HDF5 file: `/results.h5` -- checked Abaqus reference CSV files under `reference//` -- optional FESA deterministic CSV view derived from `results.h5` for review only -``` - -Artifact inventory should not include `reference_hdf5`. - -- [ ] **Step 4: Update global agent/skill boundary text** - -Replace stale boundary sentences with: - -```text -Do not generate or modify Abaqus reference CSV files. -``` - -For agents that mention deterministic CSV views derived from FESA HDF5, use: - -```text -Do not treat FESA debug CSV views as authoritative solver output or reference artifacts. -``` - -Only add the second sentence where the agent actually discusses debug/exported FESA CSV views. - -- [ ] **Step 5: Verify upstream/downstream tests** - -Run: - -```powershell -python -m unittest scripts.test_io_definition_agent_config scripts.test_implementation_planning_agent_config scripts.test_physics_evaluation_agent_config scripts.test_requirement_agent_config scripts.test_release_agent_config -v -``` - -Expected: PASS. - -Commit: - -```powershell -git add docs/SOLVER_AGENT_DESIGN.md docs/SOLVER_SKILL_DESIGN.md docs/io-definitions/README.md docs/implementation-plans/README.md docs/physics-evaluations/README.md docs/requirements/README.md .codex/skills/fesa-io-contract/SKILL.md .codex/skills/fesa-physics-sanity/SKILL.md .codex/skills/fesa-cpp-msvc-tdd/SKILL.md .codex/skills/fesa-release-readiness/SKILL.md .codex/skills/fesa-requirements-baseline/SKILL.md .codex/agents/io-definition-agent.toml .codex/agents/implementation-planning-agent.toml .codex/agents/implementation-agent.toml .codex/agents/physics-evaluation-agent.toml .codex/agents/release-agent.toml .codex/agents/requirement-agent.toml .codex/agents/coordinator-agent.toml -git commit -m "docs: align workflow agents with reference CSV artifacts" -``` - -### Task 6: Add Stale Contract Guard - -**Files:** -- Modify: `scripts/test_fesa_solver_skills.py` - -- [ ] **Step 1: Add a stale phrase scanner for active contract files** - -Add this test to `scripts/test_fesa_solver_skills.py`: - -```python -ACTIVE_CONTRACT_FILES = ( - ROOT / "AGENTS.md", - ROOT / "docs" / "ProjectInitialPlanNote.md", - ROOT / "docs" / "PRD.md", - ROOT / "docs" / "ARCHITECTURE.md", - ROOT / "docs" / "ADR.md", - ROOT / "docs" / "SOLVER_AGENT_DESIGN.md", - ROOT / "docs" / "SOLVER_SKILL_DESIGN.md", - ROOT / "docs" / "reference-models" / "README.md", - ROOT / "docs" / "reference-verifications" / "README.md", - ROOT / "docs" / "io-definitions" / "README.md", - ROOT / "docs" / "implementation-plans" / "README.md", - ROOT / "docs" / "physics-evaluations" / "README.md", - ROOT / "docs" / "requirements" / "README.md", - ROOT / ".codex" / "agents" / "reference-model-agent.toml", - ROOT / ".codex" / "agents" / "reference-verification-agent.toml", - ROOT / ".codex" / "agents" / "io-definition-agent.toml", - ROOT / ".codex" / "agents" / "implementation-planning-agent.toml", - ROOT / ".codex" / "agents" / "implementation-agent.toml", - ROOT / ".codex" / "agents" / "physics-evaluation-agent.toml", - ROOT / ".codex" / "agents" / "release-agent.toml", - ROOT / ".codex" / "agents" / "requirement-agent.toml", - ROOT / ".codex" / "agents" / "coordinator-agent.toml", - ROOT / ".codex" / "skills" / "fesa-reference-models" / "SKILL.md", - ROOT / ".codex" / "skills" / "fesa-reference-comparison" / "SKILL.md", - ROOT / ".codex" / "skills" / "fesa-io-contract" / "SKILL.md", - ROOT / ".codex" / "skills" / "fesa-physics-sanity" / "SKILL.md", - ROOT / ".codex" / "skills" / "fesa-cpp-msvc-tdd" / "SKILL.md", - ROOT / ".codex" / "skills" / "fesa-release-readiness" / "SKILL.md", - ROOT / ".codex" / "skills" / "fesa-requirements-baseline" / "SKILL.md", -) - -STALE_REFERENCE_CONTRACT_PHRASES = ( - "reference.h5", - "stored reference HDF5", - "reference HDF5 artifact", - "results.h5 and reference.h5", - "results.h5` and `reference.h5", - "derived from reference.h5", - "references///", -) - -def test_active_contracts_do_not_require_reference_hdf5(self): - for path in ACTIVE_CONTRACT_FILES: - with self.subTest(path=str(path.relative_to(ROOT))): - text = path.read_text(encoding="utf-8") - for stale_phrase in STALE_REFERENCE_CONTRACT_PHRASES: - self.assertNotIn(stale_phrase, text) -``` - -This intentionally excludes `docs/superpowers/plans/` so old implementation plans remain historical records. - -- [ ] **Step 2: Verify stale guard catches active contract drift** - -Run: - -```powershell -python -m unittest scripts.test_fesa_solver_skills.FesaSolverSkillTests.test_active_contracts_do_not_require_reference_hdf5 -v -``` - -Expected: PASS. - -Commit: - -```powershell -git add scripts/test_fesa_solver_skills.py -git commit -m "test: guard against reference HDF5 contract drift" -``` - -### Task 7: Full Verification - -**Files:** -- No new edits expected. - -- [ ] **Step 1: Run all Python contract tests** - -Run: - -```powershell -python -m unittest discover -s scripts -p "test_*.py" -``` - -Expected: PASS. - -- [ ] **Step 2: Run workspace validation** - -Run: - -```powershell -python scripts/validate_workspace.py -``` - -Expected: exit code 0. If no C++ targets exist, the current acceptable message is: - -```text -No C++ validation commands configured. -Add CMakeLists.txt or set HARNESS_VALIDATION_COMMANDS. -``` - -- [ ] **Step 3: Run manual stale-text audit across active files** - -Run: - -```powershell -rg -n "reference\.h5|stored reference HDF5|reference HDF5 artifact|results\.h5.*reference\.h5|derived from reference\.h5|references///" AGENTS.md docs .codex scripts -``` - -Expected: - -- No matches in active docs, active skills, active agents, or tests. -- Matches are acceptable only in `docs/superpowers/plans/` historical plan files if they document old work. - -- [ ] **Step 4: Review final diff** - -Run: - -```powershell -git diff --stat -git diff --check -``` - -Expected: no whitespace errors. Review that every changed file traces to replacing the old `reference.h5`/reference-HDF5 premise with FESA-HDF5-to-Abaqus-reference-CSV comparison. - -Commit: - -```powershell -git add AGENTS.md docs .codex scripts -git commit -m "docs: finalize reference CSV comparison contract" -``` - -## Completion Criteria - -- Active contracts say FESA solver output is HDF5 `results.h5`. -- Active contracts say Abaqus reference output is CSV under `reference//`. -- Active contracts compare FESA HDF5 directly with reference CSV files for displacement, reaction, internal force, and stress. -- Active contracts state the reference CSVs come from Abaqus solving the same Abaqus `.inp` model used by FESA. -- `reference.h5` is not required anywhere in active docs, skills, agents, or contract tests. -- Python tests and workspace validation pass. - diff --git a/docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md b/docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md deleted file mode 100644 index b770913..0000000 --- a/docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md +++ /dev/null @@ -1,282 +0,0 @@ -# Linear Static 3D Euler Beam Harness Phase Construction Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Create the approved 29-step Harness phase that drives the FESA V0 single-step B33 linear-static solver from upstream contracts through release readiness. - -**Architecture:** The phase is a sequence of seven document gates, eighteen TDD implementation steps, and four final verification gates. Each `stepN.md` is self-contained, names its role/skill and owned paths, preserves the approved design as the source of truth, and delegates per-step commits and timestamps to `scripts/execute.py`. - -**Tech Stack:** Markdown and JSON phase descriptors; C++17; MSVC x64 Debug; CMake/CTest; GoogleTest from `C:/git/googletest`; Intel oneMKL/oneTBB; HDF5; Python 3 Harness runner. - -## Global Constraints - -- The approved source of truth is `docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md`; phase steps must not silently broaden or reinterpret it. -- The solver scope is one `*STEP, *STATIC` using Abaqus `TYPE=B33`; `TYPE=B31`, multiple steps, instance transforms, nested assemblies, and `*DLOAD` input remain unsupported. -- Runtime order keeps `Kff` factorization before load-vector assembly and separates factorization from substitution. -- Production C++ changes use `RED -> GREEN -> VERIFY`; every production file has a related GoogleTest file. -- Validation uses MSVC x64 Debug and the exact dependency cache variables in the approved design; production CMake must not hardcode the local GoogleTest path. -- `reference/cantilever beam/` is read-only and must not be renamed, rewritten, regenerated, or repaired by the phase. -- Beam stress is written and tested, but Abaqus stress reference comparison is explicitly N/A. -- Harness owns per-step commits and timestamps; a step must update only its phase status and must not invoke `git commit`. -- Before `python scripts/execute.py linear-static-3d-euler-beam`, use a clean worktree or a separate worktree because the current executor stages with `git add -A`. - ---- - -### Task 1: Create Phase Indexes - -**Files:** -- Create: `phases/index.json` -- Create: `phases/linear-static-3d-euler-beam/index.json` - -**Interfaces:** -- Consumes: approved phase name and 29-step table from the design specification. -- Produces: top-level pending phase registration and contiguous step numbers `0..28` with kebab-case names. - -- [ ] **Step 1: Register the phase** - -```json -{ - "phases": [ - { "dir": "linear-static-3d-euler-beam", "status": "pending" } - ] -} -``` - -- [ ] **Step 2: Create the task index** - -Use `project: "FESA Structural Solver"`, `phase: "linear-static-3d-euler-beam"`, and the exact step names from specification section 3. Do not add timestamps; the executor owns them. - -- [ ] **Step 3: Validate both JSON files** - -```powershell -Get-Content -Raw phases/index.json | ConvertFrom-Json | Out-Null -$phase = Get-Content -Raw phases/linear-static-3d-euler-beam/index.json | ConvertFrom-Json -if ($phase.steps.Count -ne 29) { throw 'Expected 29 steps' } -if (($phase.steps.step -join ',') -ne ((0..28) -join ',')) { throw 'Step numbers are not contiguous' } -``` - -- [ ] **Step 4: Executor commit checkpoint** - -Do not run `git commit`; `scripts/execute.py` commits phase execution results. The phase-construction changes remain for the user to review and commit. - -### Task 2: Create Upstream Contract Gate Steps - -**Files:** -- Create: `phases/linear-static-3d-euler-beam/step0.md` through `step6.md` - -**Interfaces:** -- Consumes: approved design, formulation, root project documents, gate-specific README files, and exact FESA skill contracts. -- Produces: requirements, research, formulation alignment, numerical review, I/O, reference-model, and implementation-plan documents. - -- [ ] **Step 1: Define role and skill ownership** - -```text -0 requirement-agent / fesa-requirements-baseline -1 research-agent / fesa-research-evidence + fem-theory-query -2 formulation-agent / fesa-formulation-spec -3 numerical-review-agent / fesa-numerical-review -4 io-definition-agent / fesa-io-contract -5 reference-model-agent / fesa-reference-models -6 implementation-planning-agent / fesa-cpp-msvc-tdd -``` - -- [ ] **Step 2: Make each document gate self-contained** - -Each step names required input paths, the exact output path, mandatory sections/status, immutable decisions, executable PowerShell checks, status-update rules, and prohibited changes. Step 2 aligns the existing formulation without changing its approved mathematical meaning; Step 5 documents the approved legacy bundle exception without modifying `reference/`. - -- [ ] **Step 3: Verify gate file structure** - -```powershell -0..6 | ForEach-Object { - $path = "phases/linear-static-3d-euler-beam/step$_.md" - if (-not (Test-Path $path)) { throw "Missing $path" } - foreach ($section in @('## 읽어야 할 파일','## 작업','## Acceptance Criteria','## 검증 절차','## 금지사항')) { - if (-not (Select-String -LiteralPath $path -SimpleMatch $section -Quiet)) { - throw "$path missing $section" - } - } -} -``` - -- [ ] **Step 4: Executor commit checkpoint** - -Do not commit manually; the executor will commit each completed gate. - -### Task 3: Create C++ TDD Implementation Steps - -**Files:** -- Create: `phases/linear-static-3d-euler-beam/step7.md` through `step24.md` - -**Interfaces:** -- Consumes: approved upstream documents produced by Steps 0–6. -- Produces: build foundation, core/model/parser/FEM/math/solver/result modules, tests, and `fesa.exe`. - -- [ ] **Step 1: Lock module order and interfaces** - -```cpp -Matrix EulerBeam3D::localStiffness() const; -Matrix EulerBeam3D::globalStiffness() const; -Vector EulerBeam3D::localEquivalentLoad(const ConstantLocalLineLoad&) const; -BeamRecovery EulerBeam3D::recover(const Vector& globalElementDisplacement) const; - -class LinearSolver { -public: - virtual ~LinearSolver() = default; - virtual Status factorize(const SparseMatrix& matrix) = 0; - virtual Status solve(const Vector& rhs, Vector& solution) const = 0; -}; -``` - -The remaining steps define signatures for diagnostics, semantic mapping, active views, DOF numbering, state, deterministic parallel assembly, constraints, load assembly, result recovery, HDF5 writing, and orchestration without exposing MKL/TBB/HDF5 types across adapter boundaries. - -- [ ] **Step 2: Encode test-first execution in every production step** - -Each Step 8–24 contains these independently verifiable actions: - -```text -1. Add the named GoogleTest cases before production edits. -2. Build and run the targeted CTest regex; record the expected missing-behavior RED failure. -3. Add only the production behavior owned by the step. -4. Rebuild and run the targeted test to GREEN. -5. Run CTest discovery and the full CTest suite for VERIFY. -``` - -Step 7 creates the build/test foundation and proves at least one discovered test. Step 24 also provides the end-to-end CLI and test-only B33 reference comparison command used read-only by Step 26. - -- [ ] **Step 3: Use the approved dependency configure command** - -```powershell -cmake -S . -B .harness/build -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" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -- [ ] **Step 4: Verify all implementation step descriptors** - -```powershell -7..24 | ForEach-Object { - $path = "phases/linear-static-3d-euler-beam/step$_.md" - if (-not (Test-Path $path)) { throw "Missing $path" } - foreach ($text in @('MSVC x64 Debug','## Acceptance Criteria','## 금지사항')) { - if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) { - throw "$path missing $text" - } - } -} -``` - -- [ ] **Step 5: Executor commit checkpoint** - -Do not commit manually; the executor creates one feature commit and one metadata commit per completed step. - -### Task 4: Create Final Verification Gate Steps - -**Files:** -- Create: `phases/linear-static-3d-euler-beam/step25.md` through `step28.md` - -**Interfaces:** -- Consumes: completed solver, generated HDF5 result, approved read-only reference CSVs, and all upstream reports. -- Produces: build/test, reference-verification, physics-evaluation, and release-readiness reports. - -- [ ] **Step 1: Define strict gate transitions** - -```text -25 pass-for-reference-verification - -> 26 pass-for-physics-evaluation - -> 27 pass-for-release-agent - -> 28 ready-for-release -``` - -Each later step must block or emit the appropriate `needs-*` status when its required predecessor is not passing. Step 26 applies the exact component-scale mixed tolerance, Step 27 checks physical equilibrium and signs, and Step 28 audits traceability and limitations without publishing anything. - -- [ ] **Step 2: Enforce read-only boundaries** - -Steps 26–28 must not edit source, tests, CMake, upstream contracts, reference artifacts, or tolerance policy. Step 26 must state stress comparison is N/A while requiring the stress output schema/test evidence. - -- [ ] **Step 3: Verify the final gate descriptors** - -```powershell -25..28 | ForEach-Object { - $path = "phases/linear-static-3d-euler-beam/step$_.md" - if (-not (Test-Path $path)) { throw "Missing $path" } - foreach ($text in @('## Acceptance Criteria','reference')) { - if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) { - throw "$path missing $text" - } - } -} -``` - -- [ ] **Step 4: Executor commit checkpoint** - -Do not commit manually; Harness owns execution commits and timestamps. - -### Task 5: Validate the Generated Phase - -**Files:** -- Read: `docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md` -- Read: `phases/index.json` -- Read: `phases/linear-static-3d-euler-beam/index.json` -- Read: `phases/linear-static-3d-euler-beam/step0.md` through `step28.md` - -**Interfaces:** -- Consumes: all generated planning artifacts. -- Produces: structural and source-contract verification evidence; no solver execution. - -- [ ] **Step 1: Parse and cross-check JSON** - -```powershell -$top = Get-Content -Raw phases/index.json | ConvertFrom-Json -$task = Get-Content -Raw phases/linear-static-3d-euler-beam/index.json | ConvertFrom-Json -if (($top.phases | Where-Object dir -eq 'linear-static-3d-euler-beam').status -ne 'pending') { throw 'Top-level phase registration is invalid' } -if ($task.project -ne 'FESA Structural Solver') { throw 'Project name mismatch' } -if ($task.phase -ne 'linear-static-3d-euler-beam') { throw 'Phase name mismatch' } -if ($task.steps.Count -ne 29) { throw 'Step count mismatch' } -``` - -- [ ] **Step 2: Check step/file correspondence and required sections** - -```powershell -$task.steps | ForEach-Object { - $path = "phases/linear-static-3d-euler-beam/step$($_.step).md" - if (-not (Test-Path $path)) { throw "Missing $path" } - if ($_.status -ne 'pending') { throw "Non-pending step $($_.step)" } -} -``` - -- [ ] **Step 3: Scan for placeholders and whitespace errors** - -```powershell -$markers = @(('T' + 'BD'), ('T' + 'ODO'), ('FIX' + 'ME'), ('PLACE' + 'HOLDER'), - ('implement' + ' later'), ('Similar' + ' to Task')) -$unfinished = rg -n ($markers -join '|') ` - docs/superpowers/plans/2026-08-09-linear-static-3d-euler-beam-harness-phase.md ` - phases/linear-static-3d-euler-beam -if ($LASTEXITCODE -eq 0) { throw "Unfinished marker found:`n$unfinished" } -git diff --check -``` - -Expected: no placeholder matches and no whitespace errors. CRLF conversion warnings without whitespace error lines are acceptable. - -- [ ] **Step 4: Confirm reference artifacts are untouched** - -```powershell -git diff --name-only -- reference/ -``` - -Expected: no output. - -- [ ] **Step 5: Execution handoff** - -After the phase-construction files and existing documentation edits are reviewed and committed, execute from a clean worktree: - -```powershell -python scripts/execute.py linear-static-3d-euler-beam -``` - -Use `--push` only when remote publication is explicitly desired. diff --git a/docs/superpowers/plans/2026-08-10-core-documentation-extension-playbook.md b/docs/superpowers/plans/2026-08-10-core-documentation-extension-playbook.md deleted file mode 100644 index 37942ff..0000000 --- a/docs/superpowers/plans/2026-08-10-core-documentation-extension-playbook.md +++ /dev/null @@ -1,158 +0,0 @@ -# FESA Core Documentation Extension Playbook Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** 미래 AI Agent가 FESA에 기능을 추가할 때 실제 해석 흐름, 소유권, CMake 설정, 수치 불변식과 검증 경계를 바로 찾을 수 있도록 핵심 문서를 보강한다. - -**Architecture:** 같은 사실을 네 문서에 반복하지 않고 문서별 책임을 분리한다. AGENTS는 프로젝트 배경·목적·핵심 개발 원칙, PRD는 사용자 관점의 제품 계약, ARCHITECTURE는 구현 구조·빌드 흐름·확장 지점, ADR은 장기 의사결정을 담당한다. - -**Tech Stack:** Markdown, C++17/MSVC, CMake/CTest, Intel oneAPI MKL/TBB, HDF5, Abaqus `.inp` subset - -## Global Constraints - -- 수정 범위는 `AGENTS.md`, `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`와 이 작업의 spec/plan 문서뿐이다. -- phase 완료 이력, commit hash, 현재 테스트 총개수는 핵심 문서에 기록하지 않는다. -- 승인되지 않은 Abaqus keyword와 해석 기능을 지원하는 것처럼 서술하지 않는다. -- project hook과 Harness는 실행하지 않는다. -- production, test, CMake, reference artifact는 수정하지 않는다. -- direct 검증은 `git diff --check`와 문서·코드·CMake 사이의 정적 대조만 사용한다. - ---- - -### Task 1: 프로젝트 배경과 핵심 개발 지침 보강 - -**Files:** -- Modify: `AGENTS.md` - -**Interfaces:** -- Consumes: root CMake options, normalized dependency targets, `Analysis::run()` lifecycle, public dependency boundaries -- Produces: FESA의 목적과 개발 판단 기준, 문서 탐색 순서, 최소 검증 진입점 - -- [x] **Step 1: 프로젝트 목적과 문서 역할을 선명하게 한다** - -FESA가 검증 가능한 구조해석 솔버라는 점, full Abaqus clone이 아니라 승인된 feature contract를 누적하는 프로젝트라는 점, PRD/ARCHITECTURE/ADR와 기능별 계약의 역할을 기록한다. - -- [x] **Step 2: 개발 시 훼손하면 안 되는 핵심 원칙을 추가한다** - -물리·수치 계약 우선, stable identity, 명시적 소유권, 결정론성, backend isolation, failure atomicity, 공식 HDF5와 read-only reference 원칙을 상위 수준 지침으로 추가한다. 상세 lifecycle은 ARCHITECTURE로 연결한다. - -- [x] **Step 3: 기능 확장 판단 기준을 추가한다** - -입력 계약, semantic model, kernel/assembly, solve/recovery, HDF5/reference/physics evidence가 함께 변경되어야 함을 명시한다. - -- [x] **Step 4: 최소 검증 진입점의 부정확한 예제를 정리한다** - -`FESA_GTEST_SOURCE_DIR`가 빠진 configure와 실제 target이 아닌 `MyProject.sln` 예제를 제거한다. 상세 package/runtime 설명은 ARCHITECTURE로 연결한다. - -- [x] **Step 5: 최소 build 명칭을 실제 CMake 옵션과 대조한다** - -Run: `rg -n "FESA_GTEST_SOURCE_DIR|MKL_DIR|TBB_DIR|HDF5_DIR|Fesa::MKL|Fesa::TBB|Fesa::HDF5" CMakeLists.txt cmake/FesaDependencies.cmake src/fesa/CMakeLists.txt tests/CMakeLists.txt AGENTS.md` - -Expected: AGENTS의 변수와 target 이름이 실제 CMake 정의와 일치한다. - -### Task 2: 제품 계약과 기능 정의 보강 - -**Files:** -- Modify: `docs/PRD.md` - -**Interfaces:** -- Consumes: 승인된 V0 input/output/diagnostic 범위 -- Produces: 사용자 관점 end-to-end 흐름과 신규 기능의 완료 정의 - -- [x] **Step 1: 제품 흐름을 입력→해석→HDF5→검증으로 명확히 한다** - -Syntax parse, semantic validation, linear solve, recovery, mandatory HDF5, optional reference comparison의 사용자 관찰 가능 결과를 기록한다. - -- [x] **Step 2: 현재 구현과 장기 방향을 구분한다** - -현재 concrete V0 model과 backend polymorphism을 정확히 기술하고, runtime-polymorphic element/material 확장은 미래 방향으로 표시한다. - -- [x] **Step 3: 신규 제품 기능의 Definition of Done을 추가한다** - -입력 노출, semantic mapping, solver lifecycle, result schema, diagnostics, unit/integration/reference/physics evidence가 모두 있어야 제품 기능으로 간주한다고 명시한다. - -### Task 3: 실제 아키텍처와 확장 지점 보강 - -**Files:** -- Modify: `docs/ARCHITECTURE.md` - -**Interfaces:** -- Consumes: `src/fesa`와 `tests`의 실제 target/module graph -- Produces: ownership/lifetime, 8-stage lifecycle, CMake/runtime graph, extension playbook - -- [x] **Step 1: directory/target 설명에서 구현과 계획을 구분한다** - -현재 존재하는 static solver library, CLI, unit/integration/reference test target을 명시하고 계획된 디렉터리는 계획이라고 표시한다. - -- [x] **Step 2: 소유권과 8단계 실행 흐름을 표로 추가한다** - -각 단계의 입력, 출력, 소유 객체, 실패 범주와 순서 불변식을 기록한다. - -- [x] **Step 3: CMake dependency와 Windows runtime staging을 설명한다** - -normalized `Fesa::*` targets, shared HDF5 preference, private product linkage, CLI/test executable 옆 runtime DLL staging을 기록한다. - -- [x] **Step 4: 기능 유형별 확장 플레이북을 추가한다** - -element, load/constraint, analysis procedure, backend, output/reference quantity별 변경 지점과 금지되는 shortcut을 기록한다. - -### Task 4: 장기 아키텍처 결정을 추가한다 - -**Files:** -- Modify: `docs/ADR.md` - -**Interfaces:** -- Consumes: 실제 CMake/runtime, deterministic assembly, essential constraints, layered verification behavior -- Produces: 향후 구현이 지켜야 할 결정과 trade-off - -- [x] **Step 1: 외부 의존성 정규화와 runtime closure ADR을 추가한다** - -Vendor target 이름을 `Fesa::*`로 정규화하고 public header에는 노출하지 않으며 Windows executable runtime closure를 staging하는 결정을 기록한다. - -- [x] **Step 2: 결정론성과 failure atomicity ADR을 추가한다** - -Stable COO/reduction, state/output candidate-commit, atomic HDF5 finalization이 성능 옵션이 아니라 correctness contract임을 기록한다. - -- [x] **Step 3: 구속 제거와 full residual ADR을 추가한다** - -`Kff`, `Ff-Kfc*dc`, valid 0x0 system, reaction=`Kd-F`의 결정과 penalty/MPC 비범위를 기록한다. - -- [x] **Step 4: 계층형 검증 ADR을 추가한다** - -Kernel 존재와 parser/CLI 노출을 구분하고 unit→integration→reference→physics gate가 각기 다른 오류를 검출한다는 결정을 기록한다. - -### Task 5: 문서 전용 정적 검증 - -**Files:** -- Verify: `AGENTS.md` -- Verify: `docs/PRD.md` -- Verify: `docs/ARCHITECTURE.md` -- Verify: `docs/ADR.md` - -**Interfaces:** -- Consumes: Tasks 1–4의 문서 변경 -- Produces: 문서 범위·형식·사실 일치 evidence - -- [x] **Step 1: 변경 범위를 확인한다** - -Run: `git status --short` - -Expected: production, test, CMake, reference 경로 변경이 없다. - -- [x] **Step 2: whitespace 오류를 확인한다** - -Run: `git diff --check` - -Expected: exit 0. - -- [x] **Step 3: stale 예제와 승인되지 않은 범위 암시를 검사한다** - -Run: `rg -n "MyProject|full Abaqus compatibility|B31.*지원|현재 테스트.*[0-9]+" AGENTS.md docs/PRD.md docs/ARCHITECTURE.md docs/ADR.md` - -Expected: stale solution 예제와 지원 범위 확대 문구가 없다. Full compatibility/B31은 거부 또는 비범위 문맥에서만 나타난다. - -- [x] **Step 4: 명령·target·lifecycle 이름을 원본과 대조한다** - -Run: `rg -n "FESA_GTEST_SOURCE_DIR|Fesa::MKL|Fesa::TBB|Fesa::HDF5|assembleAndPartitionStiffness|assembleLoadsAndEffectiveRhs|recoverAndWriteResults" AGENTS.md docs/ARCHITECTURE.md cmake/FesaDependencies.cmake src/fesa/analysis/linear_static_analysis.cpp` - -Expected: 문서의 명칭과 구현/CMake 명칭이 일치한다. diff --git a/docs/superpowers/plans/2026-08-12-harness-agent-step-execution.md b/docs/superpowers/plans/2026-08-12-harness-agent-step-execution.md deleted file mode 100644 index f040d97..0000000 --- a/docs/superpowers/plans/2026-08-12-harness-agent-step-execution.md +++ /dev/null @@ -1,190 +0,0 @@ -# Harness Agent Step Execution Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Make FESA planning and implementation agents use the approved Harness phase lifecycle, with the Implementation Agent restricted to the Executor-selected current Step. - -**Architecture:** Keep `scripts/execute.py` as the only phase runner after separate user authorization. Agent TOML files define role-specific planning/execution boundaries; the Harness and FESA TDD skills plus project guides provide the shared lifecycle without duplicating the full Harness documentation. - -**Tech Stack:** Codex Agent TOML, Markdown skills and guides, Python 3 Harness runner/hooks, pytest, PowerShell. - -## Global Constraints - -- Both agents must read `docs/HARNESS.md` and `docs/HARNESS_WORKFLOW.md` for Harness work. -- Phase files may be created only after the multi-Step draft is explicitly approved. -- `scripts/execute.py` may run only after a separate explicit user request. -- The Executor owns branch selection, pending-Step selection, retries, timestamps, commits, next-Step advancement, and top-level phase status. -- The Implementation Agent executes only the current Executor-selected `stepN.md` and completes RED, expected failure, minimal GREEN, and VERIFY inside that Step. -- PreToolUse and Stop hooks run through `.codex/hooks.json`; their Python entry points are not manual substitutes for hook execution. -- No phase execution, C++ implementation, Abaqus execution, or reference-artifact mutation belongs to this policy change. - ---- - -### Task 1: Agent Harness role contracts - -**Files:** -- Modify: `.codex/agents/implementation-planning-agent.toml` -- Modify: `.codex/agents/implementation-agent.toml` - -**Interfaces:** -- Consumes: approved design `docs/superpowers/specs/2026-08-12-harness-agent-step-execution-design.md`; current Harness lifecycle in `.agents/skills/harness/SKILL.md`, `docs/HARNESS.md`, and `docs/HARNESS_WORKFLOW.md`. -- Produces: explicit planning-agent reference/approval rules and implementation-agent current-Step execution/state ownership rules. - -- [ ] **Step 1: Run the static RED check** - -```powershell -$files = @( - '.codex/agents/implementation-planning-agent.toml', - '.codex/agents/implementation-agent.toml' -) -foreach ($file in $files) { - if (-not (Select-String -LiteralPath $file -SimpleMatch 'docs/HARNESS.md' -Quiet)) { - Write-Error "$file does not require docs/HARNESS.md" - } - if (-not (Select-String -LiteralPath $file -SimpleMatch 'docs/HARNESS_WORKFLOW.md' -Quiet)) { - Write-Error "$file does not require docs/HARNESS_WORKFLOW.md" - } -} -if (-not (Select-String -LiteralPath '.codex/agents/implementation-agent.toml' -SimpleMatch 'Executor-selected current Step' -Quiet)) { - Write-Error 'Implementation Agent is not restricted to the current Step' -} -``` - -Expected: FAIL for the missing Harness-document references and current-Step rule. - -- [ ] **Step 2: Add the Planning Agent contract** - -Add mandatory reads for `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, and -`.codex/hooks.json`. Preserve the existing sequence: - -```text -multi-Step draft -> explicit user approval -> phases planning files -separate explicit Harness execution request -> scripts/execute.py -``` - -State that the planning agent never selects or executes a Step and does not write -Executor-owned timestamps. - -- [ ] **Step 3: Add the Implementation Agent contract** - -Require this execution recipe: - -```text -approved plan + materialized phase files + Executor-selected current stepN.md --> read prerequisites and previous summaries --> RED -> observe expected failure -> minimal GREEN -> focused/full VERIFY --> update only current Step status plus summary/error_message/blocked_reason --> stop without starting the next Step -``` - -Name `.codex/hooks.json`, `scripts/hooks/pre_tool_use.py`, and -`scripts/hooks/stop_validation.py`. State that hooks run automatically, do not prove -RED, and are not manually invoked as substitutes for registered hooks. Reserve -timestamps, retry control, commits, and next-Step selection for the Executor. - -- [ ] **Step 4: Parse and rerun the static check** - -```powershell -@' -import pathlib, tomllib -for path in pathlib.Path('.codex/agents').glob('*.toml'): - with path.open('rb') as stream: - tomllib.load(stream) -print('ALL_AGENT_TOML_OK') -'@ | python - - -rg -n "docs/HARNESS.md|docs/HARNESS_WORKFLOW.md|Executor-selected current Step|scripts/execute.py|PreToolUse|Stop" ` - .codex/agents/implementation-planning-agent.toml ` - .codex/agents/implementation-agent.toml -``` - -Expected: TOML parse passes and every required boundary is visible. - -- [ ] **Step 5: Commit** - -```powershell -git add .codex/agents/implementation-planning-agent.toml .codex/agents/implementation-agent.toml -git commit -m "docs: bind implementation agents to Harness steps" -``` - -### Task 2: Shared Harness skill and guide alignment - -**Files:** -- Modify: `.agents/skills/harness/SKILL.md` -- Modify: `.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` -- Modify: `docs/SOLVER_AGENT_DESIGN.md` -- Modify: `docs/implementation-plans/README.md` - -**Interfaces:** -- Consumes: Task 1 Agent terminology and role ownership. -- Produces: one consistent Executor/Step/hook lifecycle discoverable by both agents. - -- [ ] **Step 1: Run the shared-contract RED check** - -```powershell -$files = @('.agents/skills/harness/SKILL.md', '.codex/skills/fesa-cpp-msvc-tdd/SKILL.md') -foreach ($file in $files) { - if (-not (Select-String -LiteralPath $file -SimpleMatch 'docs/HARNESS.md' -Quiet)) { - Write-Error "$file does not route to docs/HARNESS.md" - } - if (-not (Select-String -LiteralPath $file -SimpleMatch 'docs/HARNESS_WORKFLOW.md' -Quiet)) { - Write-Error "$file does not route to docs/HARNESS_WORKFLOW.md" - } -} -``` - -Expected: FAIL because the current skills omit these mandatory references. - -- [ ] **Step 2: Update the Harness skill** - -Add a concise required-reading section and an Executor/Implementation-Agent ownership -section. Preserve the existing phase schemas. Explicitly distinguish: - -```text -Executor-owned: branch, pending Step, retry, timestamps, commits, advancement -Agent-owned: current Step work and status payload fields -Hook-owned: PreToolUse interception and Stop whole-project validation -``` - -- [ ] **Step 3: Update FESA TDD skill and guides** - -Make the TDD skill require both Harness documents and materialized phase files for -implementation. Update the solver-agent and implementation-plan guides with the same -current-Step recipe, automatic hook use, status-field split, and separate Executor -authorization. Avoid copying all 600 lines of `HARNESS_WORKFLOW.md`; link to it. - -- [ ] **Step 4: Validate skills and Harness behavior** - -```powershell -python C:/Users/baram/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/harness -python C:/Users/baram/.codex/skills/.system/skill-creator/scripts/quick_validate.py .codex/skills/fesa-cpp-msvc-tdd -uv run --with pytest python -m pytest -v -rs -git diff --check -``` - -Expected: both skills are valid, Harness Python tests pass, and no whitespace error is reported. - -- [ ] **Step 5: Run final policy and scope checks** - -```powershell -rg -n "docs/HARNESS.md|docs/HARNESS_WORKFLOW.md|Executor-selected current Step|current Step|scripts/execute.py|PreToolUse|Stop" ` - .codex/agents/implementation-planning-agent.toml ` - .codex/agents/implementation-agent.toml ` - .agents/skills/harness/SKILL.md ` - .codex/skills/fesa-cpp-msvc-tdd/SKILL.md ` - docs/SOLVER_AGENT_DESIGN.md ` - docs/implementation-plans/README.md - -git diff --name-only HEAD -- reference phases src include tests CMakeLists.txt -git status --short -``` - -Expected: required policies are present; no reference, phase, C++, test, or CMake file changed. - -- [ ] **Step 6: Commit** - -```powershell -git add .agents/skills/harness/SKILL.md .codex/skills/fesa-cpp-msvc-tdd/SKILL.md ` - docs/SOLVER_AGENT_DESIGN.md docs/implementation-plans/README.md -git commit -m "docs: align Harness step execution guidance" -``` diff --git a/docs/superpowers/plans/2026-08-12-independent-reference-validation-policy.md b/docs/superpowers/plans/2026-08-12-independent-reference-validation-policy.md deleted file mode 100644 index 0ba813a..0000000 --- a/docs/superpowers/plans/2026-08-12-independent-reference-validation-policy.md +++ /dev/null @@ -1,130 +0,0 @@ -# Independent Reference Validation Policy Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Align FESA project policy and the MITC4 upstream contracts with independent black-box Abaqus reference validation and prepare the implementation-planning agent to create approved Harness Steps. - -**Architecture:** Keep FESA HDF5 as authoritative solver output and retain deterministic source-node/component comparison, while reducing the reference phase to a lightweight inventory of existing `.inp` and required CSV paths. Remove metadata, naming, portfolio, drilling-calibration, and geometry/director-calibration gates from MITC4 without changing reference artifacts or implementing C++. - -**Tech Stack:** Markdown, TOML agent prompts, project-local Codex `SKILL.md`, PowerShell static validation, Git. - -## Global Constraints - -- Do not modify files under `reference/`. -- Do not run Abaqus or another reference solver. -- Do not modify C++ source, tests, or CMake. -- Preserve HDF5 as authoritative FESA output. -- Use fixed absolute `1.0e-5` for MITC4 U/UR; U blocks and UR warns only. Keep the - separate B33 mixed tolerance unchanged. -- Retain fixed numerical drilling stabilization but exclude calibration and drilling evidence outputs. -- Remove `NR-O03` and `NR-O04` from MITC4 implementation readiness. -- Implementation Planning may create Harness phase files only after user approval of the Step draft. - ---- - -### Task 1: Align project-wide policy documents - -**Files:** -- Modify: `AGENTS.md` -- Modify: `docs/PRD.md` -- Modify: `docs/ADR.md` -- Modify: `docs/ARCHITECTURE.md` -- Modify: `docs/SOLVER_AGENT_DESIGN.md` -- Modify: `docs/SOLVER_SKILL_DESIGN.md` - -**Interfaces:** -- Consumes: approved design in `docs/superpowers/specs/2026-08-12-independent-reference-validation-policy-design.md` -- Produces: project-wide independent-solver and minimal-reference policy used by every downstream agent - -- [ ] Replace canonical/legacy/provenance bundle governance with the minimal reference-case contract. -- [ ] Separate Abaqus input syntax and external comparison from FESA formulation behavior. -- [ ] Record the new decision as a superseding ADR while preserving historical decisions. -- [ ] State the MITC4 fixed absolute tolerance and fixed drilling scope without claiming implementation exists. -- [ ] Verify changed policy terms with targeted `rg` checks and `git diff --check`. -- [ ] Commit with `docs: simplify FESA reference validation policy`. - -### Task 2: Align agent and skill workflow contracts - -**Files:** -- Modify: affected `.codex/agents/*.toml` -- Modify: affected `.codex/skills/*/SKILL.md` -- Modify: affected workflow README templates under `docs/` - -**Interfaces:** -- Consumes: Task 1 project policy -- Produces: specialist prompts that no longer recreate removed artifact gates - -- [ ] Update Requirement, Numerical Review, I/O, Reference Model, Reference Verification, Coordinator, Implementation Planning, Physics, and Release boundaries. -- [ ] Require Implementation Planning Agent to invoke `$harness`, produce a self-contained multi-Step draft, request user approval, and only then write `phases/` files. -- [ ] Keep actual Harness execution outside the planning agent unless explicitly requested. -- [ ] Validate TOML syntax, skill YAML frontmatter, required sections, and prohibited stale terms. -- [ ] Forward-test the revised skills with an independent agent prompt. -- [ ] Commit with `docs: align FESA agents with minimal reference cases`. - -### Task 3: Revise MITC4 requirements and formulation - -**Files:** -- Modify: `docs/linear-static-mitc4-shell/requirements.md` -- Modify: `docs/linear-static-mitc4-shell/research.md` -- Modify: `docs/linear-static-mitc4-shell/formulation.md` - -**Interfaces:** -- Consumes: Tasks 1-2 policy and approved fixed drilling rule -- Produces: implementation-ready feature scope without removed calibration gates - -- [ ] Correct the observed S4/S4R reference inventory and adopt fixed absolute `1.0e-5` for MITC4 U/UR. -- [ ] Replace drilling candidate/sweep language with the fixed positive rotational-diagonal rule. -- [ ] Remove drilling calibration, drilling-energy warning, `NR-O03`, `NR-O04`, and expanded portfolio requirements. -- [ ] Preserve the future nonlinear derivation as documentation-only. -- [ ] Add a research decision note without rewriting source findings as if they changed. -- [ ] Verify requirement IDs and formulation traceability contain no contradictory blocker. -- [ ] Commit with `docs: simplify MITC4 verification and drilling scope`. - -### Task 4: Revise MITC4 I/O and reference-case inventory - -**Files:** -- Modify: `docs/linear-static-mitc4-shell/io.md` -- Create: `docs/linear-static-mitc4-shell/reference-model.md` - -**Interfaces:** -- Consumes: Task 3 requirements/formulation -- Produces: exact lightweight full-integration S4 input-to-displacement-CSV pairing and HDF5 comparison mapping; S4R non-reference coverage - -- [ ] Remove canonical/legacy/metadata/provenance/schema-version readiness requirements. -- [ ] Remove mandatory drilling stiffness, ratio, and energy output evidence. -- [ ] Keep minimal source-node plus U/UR component matching and finite/unique-row checks. -- [ ] Inventory only the exact existing `reference/shell` S4 paths as acceptance inputs; keep `reference/shellR` optional and read-only without consuming it. -- [ ] Verify no file under `reference/` changed. -- [ ] Commit with `docs: define lightweight MITC4 reference cases`. - -### Task 5: Rerun MITC4 numerical review under the approved policy - -**Files:** -- Modify: `docs/linear-static-mitc4-shell/numerical-review.md` - -**Interfaces:** -- Consumes: Tasks 1-4 current source-of-truth documents -- Produces: a fresh formulation-only implementation-planning verdict - -- [ ] Reclassify removed artifact, calibration, `NR-O03`, and `NR-O04` blockers explicitly. -- [ ] Review the fixed rotational-diagonal drilling rule for dimensions, symmetry, positivity, and separation from physical recovery. -- [ ] Confirm U/UR tolerance and current S4/S4R reference pairing are downstream comparison inputs, not formulation blockers. -- [ ] Issue the verdict supported by the remaining confirmed formulation findings only. -- [ ] Run Markdown structure, targeted policy consistency, `git diff --check`, and no-reference-mutation checks. -- [ ] Commit with `docs: rerun MITC4 numerical review under minimal reference policy`. - -### Task 6: Final repository policy verification - -**Files:** -- Verify: all files changed by Tasks 1-5 - -**Interfaces:** -- Consumes: all preceding tasks -- Produces: clean, internally consistent documentation and agent/skill configuration evidence - -- [ ] Run `uv run --with pytest python -m pytest -v -rs` because project-local agent/skill workflow documents changed. -- [ ] Parse every changed TOML file and validate every changed skill frontmatter. -- [ ] Run repository-wide targeted searches for stale mandatory provenance, canonical, README, drilling sweep, `NR-O03`, and `NR-O04` language in active contracts. -- [ ] Run `git diff --check` and inspect `git status --short`. -- [ ] Confirm `git diff -- reference` is empty. -- [ ] Report any historical documents intentionally left unchanged. diff --git a/docs/superpowers/plans/2026-08-15-agent-skill-workflow-consolidation.md b/docs/superpowers/plans/2026-08-15-agent-skill-workflow-consolidation.md deleted file mode 100644 index 3edf881..0000000 --- a/docs/superpowers/plans/2026-08-15-agent-skill-workflow-consolidation.md +++ /dev/null @@ -1,1157 +0,0 @@ -# FESA Agent/Skill Workflow Consolidation Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Consolidate the FESA development workflow into eight stages, merge three redundant agents and two redundant skills into their approved owners, make `coordinator-agent` the main orchestrator, and group all feature evidence under `docs//`. - -**Architecture:** Keep one main Coordinator and ten specialist sub-agents. Merge reference-model preparation into Numerical Review and merge build/test plus reference comparison into Implementation, while retaining separate evidence documents for auditability. Migrate existing feature documents without rewriting historical owners or verdicts, and protect the resulting structure with repository-level Python contract tests. - -**Tech Stack:** Codex agent TOML, project-local Codex `SKILL.md` and `agents/openai.yaml`, Markdown workflow contracts, Python 3 standard library (`pathlib`, `tomllib`), pytest, PowerShell, Git. - -## Global Constraints - -- The approved design is `docs/superpowers/specs/2026-08-15-agent-skill-workflow-consolidation-design.md`. -- All new feature evidence lives under exactly `docs//`. -- Keep separate `implementation-report.md`, `build-test.md`, and `reference-comparison.md` files even though one Implementation Agent owns them. -- Keep separate `numerical-review.md` and `reference-model.md` files even though one Numerical Review Agent owns them. -- `coordinator-agent` is the only main agent; every other `.codex/agents/*.toml` profile is a sub-agent. -- Keep `correction-agent` as an on-demand rework sub-agent outside the eight numbered stages. -- Preserve `model_reasoning_effort = "extra high"` in every agent profile. -- Preserve historical document content, `owner_agent`, status, and numerical verdict; only relocate files and repair path references. -- Do not create empty evidence files for outputs that never existed. Create `corrections.md` only after a real correction. -- Do not modify solver C++ source, C++ tests, CMake/CTest configuration, `.codex/hooks.json`, Harness executor behavior, phase status/result content, or `reference/` artifacts. -- Keep project-local `harness` planning/execution boundaries unchanged. -- Use conventional commit messages. - ---- - -## Final File Map - -### Create - -- `tests/test_agent_skill_workflow_contract.py`: static contract tests for agent inventory, skill inventory, hierarchy, merged responsibilities, output layout, and live-path cleanup. -- `docs/linear-static-3d-euler-beam/coordination.md`: migrated feature worklist and closure inventory. -- `docs/linear-static-mitc4-shell/coordination.md`: migrated feature worklist and closure inventory. - -### Modify - -- `AGENTS.md`: eight-stage process, consolidated agent/skill table, main/sub-agent policy, and `docs//` layout. -- `.codex/agents/coordinator-agent.toml`: main-agent orchestration, dispatch loop, worklist, gate decisions, and rework control. -- `.codex/agents/requirement-agent.toml`: sub-agent contract, new paths, and Numerical Review handoff for reference evidence. -- `.codex/agents/research-agent.toml`: sub-agent contract, new paths, and Numerical Review handoff for reference candidates. -- `.codex/agents/formulation-agent.toml`: sub-agent contract, new paths, and consolidated Numerical Review handoff. -- `.codex/agents/numerical-review-agent.toml`: numerical review plus reference-model ownership. -- `.codex/agents/io-definition-agent.toml`: sub-agent contract and final HDF5 projection ownership after merged review. -- `.codex/agents/implementation-planning-agent.toml`: new paths, consolidated skill inputs, and Implementation-only downstream validation handoff. -- `.codex/agents/implementation-agent.toml`: TDD implementation, MSVC build/CTest, reference comparison, and three-document evidence ownership. -- `.codex/agents/correction-agent.toml`: on-demand rework from Implementation evidence and return to Implementation. -- `.codex/agents/physics-evaluation-agent.toml`: consume Implementation-owned reference comparison and route model gaps to Numerical Review. -- `.codex/agents/release-agent.toml`: audit consolidated Implementation evidence and new paths. -- `.codex/skills/fesa-numerical-review/SKILL.md`: absorb reference-case inventory and readiness workflow. -- `.codex/skills/fesa-numerical-review/agents/openai.yaml`: describe consolidated numerical/reference review. -- `.codex/skills/fesa-cpp-msvc-tdd/SKILL.md`: absorb build/test reporting and reference comparison workflow. -- `.codex/skills/fesa-cpp-msvc-tdd/agents/openai.yaml`: describe consolidated implementation/verification work. -- `.codex/skills/fesa-requirements-baseline/SKILL.md`: new output path and Numerical Review handoff. -- `.codex/skills/fesa-research-evidence/SKILL.md`: new output path and Numerical Review handoff. -- `.codex/skills/fesa-formulation-spec/SKILL.md`: new output path and consolidated handoff. -- `.codex/skills/fesa-io-contract/SKILL.md`: new output path and final HDF5/reference mapping responsibility. -- `.codex/skills/fesa-physics-sanity/SKILL.md`: new paths and consolidated failure routing. -- `.codex/skills/fesa-release-readiness/SKILL.md`: new paths and consolidated gate evidence. -- `docs/SOLVER_AGENT_DESIGN.md`: surviving roles, eight-stage flowchart, gates, status transitions, and output layout. -- `docs/SOLVER_SKILL_DESIGN.md`: eight workflow skills and consolidated agent-to-skill mapping. -- Moved feature documents and tracked plan/spec/phase documents containing old feature-document paths: repair path references only. - -### Delete after absorption - -- `.codex/agents/reference-model-agent.toml` -- `.codex/agents/build-test-executor-agent.toml` -- `.codex/agents/reference-verification-agent.toml` -- `.codex/skills/fesa-reference-models/` -- `.codex/skills/fesa-reference-comparison/` -- Agent-oriented output-folder README files under `docs/coordination/`, `docs/requirements/`, `docs/research/`, `docs/formulations/`, `docs/numerical-reviews/`, `docs/io-definitions/`, `docs/reference-models/`, `docs/implementation-plans/`, `docs/build-test-reports/`, `docs/corrections/`, `docs/reference-verifications/`, `docs/physics-evaluations/`, and `docs/releases/`. - ---- - -### Task 1: Add RED workflow-contract tests - -**Files:** - -- Create: `tests/test_agent_skill_workflow_contract.py` -- Read: `docs/superpowers/specs/2026-08-15-agent-skill-workflow-consolidation-design.md` - -**Interfaces:** - -- Consumes: approved agent names, skill names, feature folders, artifact filenames, and mandatory contract phrases from the design. -- Produces: pytest functions used as acceptance gates by Tasks 2–6. - -- [ ] **Step 1: Create the static contract test module** - -Add this complete test module: - -```python -from pathlib import Path -import tomllib - - -ROOT = Path(__file__).resolve().parents[1] -AGENT_DIR = ROOT / ".codex" / "agents" -SKILL_DIR = ROOT / ".codex" / "skills" - -EXPECTED_AGENTS = { - "coordinator-agent", - "correction-agent", - "formulation-agent", - "implementation-agent", - "implementation-planning-agent", - "io-definition-agent", - "numerical-review-agent", - "physics-evaluation-agent", - "release-agent", - "requirement-agent", - "research-agent", -} - -EXPECTED_SKILLS = { - "fem-theory-query", - "fesa-cpp-msvc-tdd", - "fesa-formulation-spec", - "fesa-io-contract", - "fesa-numerical-review", - "fesa-physics-sanity", - "fesa-release-readiness", - "fesa-requirements-baseline", - "fesa-research-evidence", -} - -LEGACY_OUTPUT_DIRS = { - "coordination", - "requirements", - "research", - "formulations", - "numerical-reviews", - "io-definitions", - "reference-models", - "implementation-plans", - "build-test-reports", - "corrections", - "reference-verifications", - "physics-evaluations", - "releases", -} - -FEATURE_FILES = { - "linear-static-3d-euler-beam": { - "coordination.md", - "requirements.md", - "research.md", - "formulation.md", - "numerical-review.md", - "reference-model.md", - "io.md", - "implementation-plan.md", - "implementation-report.md", - "build-test.md", - "reference-comparison.md", - "physics-evaluation.md", - "release.md", - }, - "linear-static-mitc4-shell": { - "coordination.md", - "requirements.md", - "research.md", - "formulation.md", - "numerical-review.md", - "reference-model.md", - "io.md", - "implementation-plan.md", - "build-test.md", - "reference-comparison.md", - "physics-evaluation.md", - "release.md", - }, -} - -LIVE_CONTRACT_FILES = ( - ROOT / "AGENTS.md", - ROOT / "docs" / "SOLVER_AGENT_DESIGN.md", - ROOT / "docs" / "SOLVER_SKILL_DESIGN.md", -) - -RETIRED_TOKENS = ( - "reference-model-agent", - "reference model agent", - "build-test-executor-agent", - "build/test executor agent", - "reference-verification-agent", - "reference verification agent", - "fesa-reference-models", - "fesa-reference-comparison", - "docs/coordination/", - "docs/requirements/", - "docs/research/", - "docs/formulations/", - "docs/numerical-reviews/", - "docs/io-definitions/", - "docs/reference-models/", - "docs/implementation-plans/", - "docs/build-test-reports/", - "docs/corrections/", - "docs/reference-verifications/", - "docs/physics-evaluations/", - "docs/releases/", -) - - -def read(path: Path) -> str: - return path.read_text(encoding="utf-8") - - -def live_contract_text() -> str: - paths = list(LIVE_CONTRACT_FILES) - paths.extend(sorted(AGENT_DIR.glob("*.toml"))) - paths.extend(sorted(SKILL_DIR.glob("*/SKILL.md"))) - return "\n".join(read(path) for path in paths) - - -def test_agent_inventory_is_consolidated(): - actual = {path.stem for path in AGENT_DIR.glob("*.toml")} - assert actual == EXPECTED_AGENTS - - -def test_project_skill_inventory_is_consolidated(): - actual = { - path.name - for path in SKILL_DIR.iterdir() - if path.is_dir() and (path / "SKILL.md").is_file() - } - assert actual == EXPECTED_SKILLS - - -def test_existing_feature_artifacts_are_bundled(): - docs_dir = ROOT / "docs" - for legacy_dir in LEGACY_OUTPUT_DIRS: - assert not (docs_dir / legacy_dir).exists(), legacy_dir - - for feature_id, expected_files in FEATURE_FILES.items(): - feature_dir = docs_dir / feature_id - actual_files = {path.name for path in feature_dir.glob("*.md")} - assert actual_files == expected_files - - -def test_numerical_review_absorbs_reference_model_contract(): - assert not (AGENT_DIR / "reference-model-agent.toml").exists() - assert not (SKILL_DIR / "fesa-reference-models").exists() - text = read(SKILL_DIR / "fesa-numerical-review" / "SKILL.md").lower() - for marker in ( - "numerical-review.md", - "reference-model.md", - "reference case inventory", - "source identity", - "row precheck", - "tolerance", - "pass-for-io-definition", - ): - assert marker in text - - -def test_implementation_absorbs_build_test_and_reference_comparison(): - assert not (AGENT_DIR / "build-test-executor-agent.toml").exists() - assert not (AGENT_DIR / "reference-verification-agent.toml").exists() - assert not (SKILL_DIR / "fesa-reference-comparison").exists() - text = read(SKILL_DIR / "fesa-cpp-msvc-tdd" / "SKILL.md").lower() - for marker in ( - "implementation-report.md", - "build-test.md", - "reference-comparison.md", - "artifact check -> compare -> classify -> report", - "pass-for-physics-evaluation", - ): - assert marker in text - - -def test_agent_hierarchy_is_explicit(): - coordinator = read(AGENT_DIR / "coordinator-agent.toml").lower() - assert "main agent" in coordinator - assert "docs//coordination.md" in coordinator - assert "worklist" in coordinator - assert "sub-agent dispatch" in coordinator - - for path in sorted(AGENT_DIR.glob("*.toml")): - if path.name == "coordinator-agent.toml": - continue - text = read(path).lower() - assert "sub-agent" in text, path.name - assert "coordinator agent" in text, path.name - - -def test_live_contracts_have_no_retired_names_or_paths(): - text = live_contract_text().lower() - assert "docs//" in text - for token in RETIRED_TOKENS: - assert token not in text, token - - -def test_live_guidance_declares_eight_stage_workflow(): - for path in LIVE_CONTRACT_FILES: - text = read(path) - assert "8단계" in text, path - assert "docs//" in text, path - - -def test_agent_toml_and_skill_ui_metadata_are_parseable(): - for path in sorted(AGENT_DIR.glob("*.toml")): - parsed = tomllib.loads(read(path)) - assert parsed["name"] == path.stem - assert parsed["model_reasoning_effort"] == "extra high" - - for skill_name in EXPECTED_SKILLS: - skill_dir = SKILL_DIR / skill_name - skill_text = read(skill_dir / "SKILL.md") - ui_text = read(skill_dir / "agents" / "openai.yaml") - assert f"name: {skill_name}" in skill_text - assert f"${skill_name}" in ui_text -``` - -- [ ] **Step 2: Run each new behavior test and record RED evidence** - -Run: - -```powershell -uv run --with pytest python -m pytest tests/test_agent_skill_workflow_contract.py -v -``` - -Expected: `test_agent_toml_and_skill_ui_metadata_are_parseable` passes. The other eight tests fail because the old agents, old skills, old document folders, old paths, old stage count, and non-hierarchical agent contracts still exist. - -- [ ] **Step 3: Commit the RED contract tests** - -```powershell -git add tests/test_agent_skill_workflow_contract.py -git commit -m "test: define consolidated agent workflow contract" -``` - ---- - -### Task 2: Migrate existing evidence into feature folders - -**Files:** - -- Create: `docs/linear-static-3d-euler-beam/coordination.md` -- Create: `docs/linear-static-mitc4-shell/coordination.md` -- Move: the 23 existing feature evidence files listed below. -- Delete: the 13 old agent-oriented README files after their common policy is covered by the approved design and later live-contract updates. -- Test: `tests/test_agent_skill_workflow_contract.py::test_existing_feature_artifacts_are_bundled` - -**Interfaces:** - -- Consumes: existing Markdown evidence with historical statuses and the final filename map. -- Produces: canonical `docs//` bundles consumed by every surviving agent and skill. - -- [ ] **Step 1: Create and verify the two explicit target directories** - -Run: - -```powershell -$targets = @( - (Resolve-Path -LiteralPath 'docs').Path + '\linear-static-3d-euler-beam', - (Resolve-Path -LiteralPath 'docs').Path + '\linear-static-mitc4-shell' -) -$docsRoot = (Resolve-Path -LiteralPath 'docs').Path -foreach ($target in $targets) { - if (-not $target.StartsWith($docsRoot + '\')) { throw "Target escaped docs: $target" } - New-Item -ItemType Directory -Path $target -Force | Out-Null -} -``` - -Expected: both resolved targets are direct children of `C:\git\FESADev\docs`. - -- [ ] **Step 2: Move the Euler beam evidence using this exact mapping** - -```powershell -Move-Item -LiteralPath 'docs\requirements\linear-static-3d-euler-beam.md' -Destination 'docs\linear-static-3d-euler-beam\requirements.md' -Move-Item -LiteralPath 'docs\research\linear-static-3d-euler-beam-research.md' -Destination 'docs\linear-static-3d-euler-beam\research.md' -Move-Item -LiteralPath 'docs\formulations\3d-isoparametric-euler-beam-formulation.md' -Destination 'docs\linear-static-3d-euler-beam\formulation.md' -Move-Item -LiteralPath 'docs\numerical-reviews\linear-static-3d-euler-beam-review.md' -Destination 'docs\linear-static-3d-euler-beam\numerical-review.md' -Move-Item -LiteralPath 'docs\reference-models\linear-static-3d-euler-beam-reference-models.md' -Destination 'docs\linear-static-3d-euler-beam\reference-model.md' -Move-Item -LiteralPath 'docs\io-definitions\linear-static-3d-euler-beam-io.md' -Destination 'docs\linear-static-3d-euler-beam\io.md' -Move-Item -LiteralPath 'docs\implementation-plans\linear-static-3d-euler-beam.md' -Destination 'docs\linear-static-3d-euler-beam\implementation-plan.md' -Move-Item -LiteralPath 'docs\implementation-plans\linear-static-3d-euler-beam-implementation-report.md' -Destination 'docs\linear-static-3d-euler-beam\implementation-report.md' -Move-Item -LiteralPath 'docs\build-test-reports\linear-static-3d-euler-beam.md' -Destination 'docs\linear-static-3d-euler-beam\build-test.md' -Move-Item -LiteralPath 'docs\reference-verifications\linear-static-3d-euler-beam-reference-verification.md' -Destination 'docs\linear-static-3d-euler-beam\reference-comparison.md' -Move-Item -LiteralPath 'docs\physics-evaluations\linear-static-3d-euler-beam-physics-evaluation.md' -Destination 'docs\linear-static-3d-euler-beam\physics-evaluation.md' -Move-Item -LiteralPath 'docs\releases\linear-static-3d-euler-beam-release.md' -Destination 'docs\linear-static-3d-euler-beam\release.md' -``` - -Expected: all 12 sources disappear and all 12 destinations exist without content rewriting. - -- [ ] **Step 3: Move the MITC4 evidence using this exact mapping** - -```powershell -Move-Item -LiteralPath 'docs\requirements\linear-static-mitc4-shell.md' -Destination 'docs\linear-static-mitc4-shell\requirements.md' -Move-Item -LiteralPath 'docs\research\linear-static-mitc4-shell-research.md' -Destination 'docs\linear-static-mitc4-shell\research.md' -Move-Item -LiteralPath 'docs\formulations\mitc4-shell-formulation.md' -Destination 'docs\linear-static-mitc4-shell\formulation.md' -Move-Item -LiteralPath 'docs\numerical-reviews\linear-static-mitc4-shell-review.md' -Destination 'docs\linear-static-mitc4-shell\numerical-review.md' -Move-Item -LiteralPath 'docs\reference-models\linear-static-mitc4-shell-reference-models.md' -Destination 'docs\linear-static-mitc4-shell\reference-model.md' -Move-Item -LiteralPath 'docs\io-definitions\linear-static-mitc4-shell-io.md' -Destination 'docs\linear-static-mitc4-shell\io.md' -Move-Item -LiteralPath 'docs\implementation-plans\linear-static-mitc4-shell-implementation-plan.md' -Destination 'docs\linear-static-mitc4-shell\implementation-plan.md' -Move-Item -LiteralPath 'docs\build-test-reports\linear-static-mitc4-shell-build-test.md' -Destination 'docs\linear-static-mitc4-shell\build-test.md' -Move-Item -LiteralPath 'docs\reference-verifications\linear-static-mitc4-shell-reference-verification.md' -Destination 'docs\linear-static-mitc4-shell\reference-comparison.md' -Move-Item -LiteralPath 'docs\physics-evaluations\linear-static-mitc4-shell-physics-evaluation.md' -Destination 'docs\linear-static-mitc4-shell\physics-evaluation.md' -Move-Item -LiteralPath 'docs\releases\linear-static-mitc4-shell-release.md' -Destination 'docs\linear-static-mitc4-shell\release.md' -``` - -Expected: all 11 sources disappear and all 11 destinations exist. Do not create `implementation-report.md` because no historical MITC4 implementation report exists. - -- [ ] **Step 4: Add the Euler beam coordination inventory** - -Create `docs/linear-static-3d-euler-beam/coordination.md` with this evidence, preserving the already-approved release verdict: - -```markdown -# Linear Static 3D Euler Beam Coordination Report - -## Metadata - -- feature_id: linear-static-3d-euler-beam -- status: completed -- owner_agent: coordinator-agent -- date: 2026-08-15 -- migration_note: Existing evidence was relocated without rerunning workflow gates. - -## Worklist - -| stage | owner | status | evidence | -| --- | --- | --- | --- | -| 1. requirements | requirement-agent | passed | `requirements.md` | -| 2. research | research-agent | passed | `research.md` | -| 3. formulation | formulation-agent | passed | `formulation.md` | -| 4. numerical and reference | numerical-review-agent | passed | `numerical-review.md`; `reference-model.md` | -| 5. I/O | io-definition-agent | passed | `io.md` | -| 6. implementation and verification | implementation-planning-agent; implementation-agent | passed | `implementation-plan.md`; `implementation-report.md`; `build-test.md`; `reference-comparison.md` | -| 7. physics | physics-evaluation-agent | passed | `physics-evaluation.md` | -| 8. release | release-agent | passed | `release.md` | - -## Current Progress - -- active_sub_agent: none -- next_handoff: none -- closure_evidence: `release.md` status `ready-for-release` -- workflow_disposition: completed - -## Decision Log - -| date | decision | evidence | rationale | -| --- | --- | --- | --- | -| 2026-08-15 | Record migrated workflow as completed | `release.md` | Preserve the existing release verdict without retroactive gate execution. | - -## Blockers and Rework - -- active_blockers: none -- correction_attempt_count: 0 -- needs_user_decision: false -``` - -- [ ] **Step 5: Add the MITC4 coordination inventory** - -Create `docs/linear-static-mitc4-shell/coordination.md` with this content: - -```markdown -# Linear Static MITC4 Shell Coordination Report - -## Metadata - -- feature_id: linear-static-mitc4-shell -- status: completed -- owner_agent: coordinator-agent -- date: 2026-08-15 -- migration_note: Existing evidence was relocated without rerunning workflow gates. - -## Worklist - -| stage | owner | status | evidence | -| --- | --- | --- | --- | -| 1. requirements | requirement-agent | passed | `requirements.md` | -| 2. research | research-agent | passed | `research.md` | -| 3. formulation | formulation-agent | passed | `formulation.md` | -| 4. numerical and reference | numerical-review-agent | passed | `numerical-review.md`; `reference-model.md` | -| 5. I/O | io-definition-agent | passed | `io.md` | -| 6. implementation and verification | implementation-planning-agent; implementation-agent | passed | `implementation-plan.md`; `build-test.md`; `reference-comparison.md` | -| 7. physics | physics-evaluation-agent | passed | `physics-evaluation.md` | -| 8. release | release-agent | passed | `release.md` | - -## Current Progress - -- active_sub_agent: none -- next_handoff: none -- closure_evidence: `release.md` status `ready-for-release` -- workflow_disposition: completed -- historical_gap: No standalone `implementation-report.md` existed before migration; no replacement was fabricated. - -## Decision Log - -| date | decision | evidence | rationale | -| --- | --- | --- | --- | -| 2026-08-15 | Record migrated workflow as completed | `release.md` | Preserve the existing release verdict without retroactive gate execution. | - -## Blockers and Rework - -- active_blockers: none -- correction_attempt_count: 0 -- needs_user_decision: false -``` - -- [ ] **Step 6: Remove the old output-folder README files** - -Delete only these files with `apply_patch`; do not recursively delete directories: - -```text -docs/coordination/README.md -docs/requirements/README.md -docs/research/README.md -docs/formulations/README.md -docs/numerical-reviews/README.md -docs/io-definitions/README.md -docs/reference-models/README.md -docs/implementation-plans/README.md -docs/build-test-reports/README.md -docs/corrections/README.md -docs/reference-verifications/README.md -docs/physics-evaluations/README.md -docs/releases/README.md -``` - -- [ ] **Step 7: Run the bundle contract test** - -Run: - -```powershell -uv run --with pytest python -m pytest tests/test_agent_skill_workflow_contract.py::test_existing_feature_artifacts_are_bundled -v -``` - -Expected: PASS. Broken links are allowed temporarily and are repaired in Task 6. - -- [ ] **Step 8: Commit the evidence migration** - -```powershell -git add -A docs/linear-static-3d-euler-beam docs/linear-static-mitc4-shell docs/coordination docs/requirements docs/research docs/formulations docs/numerical-reviews docs/io-definitions docs/reference-models docs/implementation-plans docs/build-test-reports docs/corrections docs/reference-verifications docs/physics-evaluations docs/releases -git commit -m "docs: group solver evidence by feature" -``` - ---- - -### Task 3: Merge Reference Model into Numerical Review - -**Files:** - -- Modify: `.codex/agents/numerical-review-agent.toml:1` -- Delete: `.codex/agents/reference-model-agent.toml` -- Modify: `.codex/skills/fesa-numerical-review/SKILL.md:1` -- Modify: `.codex/skills/fesa-numerical-review/agents/openai.yaml:1` -- Delete: `.codex/skills/fesa-reference-models/SKILL.md` -- Delete: `.codex/skills/fesa-reference-models/agents/openai.yaml` -- Test: `tests/test_agent_skill_workflow_contract.py::test_numerical_review_absorbs_reference_model_contract` - -**Interfaces:** - -- Consumes: `requirements.md`, `research.md`, `formulation.md`, stored `reference/` artifacts, and the approved tolerance contract. -- Produces: `numerical-review.md` and `reference-model.md` with status `pass-for-io-definition` when both reviews pass. - -- [ ] **Step 1: Expand the Numerical Review Agent mission and inputs** - -In `.codex/agents/numerical-review-agent.toml`, retain all math/numerical checks and add these exact responsibilities: - -```text -- Act as a sub-agent dispatched by Coordinator Agent for the consolidated numerical/reference gate. -- Inventory exact existing reference input and required CSV paths without modifying them. -- Define blocking and warning-only quantities, source identity/components, row prechecks, and approved tolerance. -- Produce docs//numerical-review.md and docs//reference-model.md. -- Hand both reports to I/O Definition Agent through Coordinator Agent. -``` - -Use this input order: - -```text -1. Coordinator handoff and user constraints. -2. AGENTS.md and docs/SOLVER_AGENT_DESIGN.md. -3. docs//requirements.md. -4. docs//research.md. -5. docs//formulation.md. -6. Existing stored reference artifacts under reference/, read-only. -``` - -The agent must not require `io.md`. It defines logical quantities and source identity; I/O Definition owns the final HDF5 dataset projection. - -- [ ] **Step 2: Define the two-document output and statuses** - -Keep the existing Numerical Review report sections and add a separate Reference Model report contract with: - -```text -Metadata -Reference Acceptance Scope -Reference Case Inventory -Source Identity and Component Contract -Row Prechecks -Tolerance and Blocking/Warning Policy -Open Issues and I/O Handoff -``` - -Use only these consolidated statuses: - -```text -pass-for-io-definition -needs-formulation-revision -needs-research -needs-reference-artifacts -needs-user-decision -blocked -``` - -- [ ] **Step 3: Merge the two skill workflows** - -Update `.codex/skills/fesa-numerical-review/SKILL.md` so its frontmatter description triggers for both numerical review and reference-case readiness. Its workflow must include: - -```text -FORMULATION REVIEW -> REFERENCE CASE INVENTORY -> CLASSIFY -> REPORT -> I/O HANDOFF -``` - -The Output Contract must name: - -```text -docs//numerical-review.md -docs//reference-model.md -``` - -Absorb exact-path inventory, blocking/warning quantities, source identity/component matching, -missing/extra/duplicate/nonfinite row prechecks, approved tolerance, and read-only artifact boundaries -from the retiring skill. Do not include final HDF5 dataset paths; route that mapping to I/O Definition. - -- [ ] **Step 4: Regenerate the consolidated skill UI metadata** - -Run: - -```powershell -$generator = Join-Path $env:USERPROFILE '.codex\skills\.system\skill-creator\scripts\generate_openai_yaml.py' -python $generator '.codex\skills\fesa-numerical-review' ` - --interface 'display_name=FESA Numerical and Reference Review' ` - --interface 'short_description=Review numerical and reference readiness' ` - --interface 'default_prompt=Use $fesa-numerical-review to review FESA numerical and reference-model readiness.' -``` - -Expected: `agents/openai.yaml` contains the three quoted interface values and the default prompt names `$fesa-numerical-review`. - -- [ ] **Step 5: Delete the absorbed agent and skill files** - -Delete the three retiring files with `apply_patch`: - -```text -.codex/agents/reference-model-agent.toml -.codex/skills/fesa-reference-models/SKILL.md -.codex/skills/fesa-reference-models/agents/openai.yaml -``` - -The empty `.codex/skills/fesa-reference-models/` directory then disappears from Git. - -- [ ] **Step 6: Run the focused consolidation test** - -Run: - -```powershell -uv run --with pytest python -m pytest tests/test_agent_skill_workflow_contract.py::test_numerical_review_absorbs_reference_model_contract -v -``` - -Expected: PASS. - -- [ ] **Step 7: Commit the numerical/reference consolidation** - -```powershell -git add -A .codex/agents/numerical-review-agent.toml .codex/agents/reference-model-agent.toml .codex/skills/fesa-numerical-review .codex/skills/fesa-reference-models -git commit -m "refactor: merge reference model into numerical review" -``` - ---- - -### Task 4: Merge Build/Test and Reference Comparison into Implementation - -**Files:** - -- Modify: `.codex/agents/implementation-agent.toml:1` -- Delete: `.codex/agents/build-test-executor-agent.toml` -- Delete: `.codex/agents/reference-verification-agent.toml` -- Modify: `.codex/skills/fesa-cpp-msvc-tdd/SKILL.md:1` -- Modify: `.codex/skills/fesa-cpp-msvc-tdd/agents/openai.yaml:1` -- Delete: `.codex/skills/fesa-reference-comparison/SKILL.md` -- Delete: `.codex/skills/fesa-reference-comparison/agents/openai.yaml` -- Test: `tests/test_agent_skill_workflow_contract.py::test_implementation_absorbs_build_test_and_reference_comparison` -- Test: `tests/test_agent_skill_workflow_contract.py::test_agent_inventory_is_consolidated` -- Test: `tests/test_agent_skill_workflow_contract.py::test_project_skill_inventory_is_consolidated` - -**Interfaces:** - -- Consumes: `implementation-plan.md`, all upstream feature documents, generated `results.h5`, exact reference input/CSV paths, `.harness/config.json`, and the unchanged Harness execution contract. -- Produces: `implementation-report.md`, `build-test.md`, and `reference-comparison.md`; success hands `pass-for-physics-evaluation` to Coordinator. - -- [ ] **Step 1: Expand the Implementation Agent execution contract** - -In `.codex/agents/implementation-agent.toml`, preserve the current Harness Step ownership rules and replace the downstream-only validation handoff with this full sequence: - -```text -RED -> OBSERVED FAILURE -> MINIMAL GREEN -> FOCUSED VERIFY - -> FULL MSVC BUILD/CTEST -> ARTIFACT CHECK - -> COMPARE -> CLASSIFY -> REPORT -``` - -Add exact ownership of: - -```text -docs//implementation-report.md -docs//build-test.md -docs//reference-comparison.md -``` - -The agent remains forbidden from modifying requirements, formulation, numerical/reference contracts, -I/O contracts, tolerance policies, declared inputs, or Abaqus reference CSV files. - -- [ ] **Step 2: Absorb Build/Test reporting** - -Move these requirements from the retiring Build/Test profile into Implementation: - -```text -- Resolve commands from .harness/config.json first, then project defaults. -- Record command, exit code, duration, stdout/stderr tail, failed test names, and environment. -- Classify configure, compile, link, test, reference-comparison, harness, environment, and upstream-contract failures. -- Stop after the first decisive failure unless the implementation plan explicitly requires another diagnostic command. -- Preserve MSVC x64 Debug and CTest command order. -``` - -`build-test.md` keeps the historical Build/Test report sections but sets `owner_agent: implementation-agent`. - -- [ ] **Step 3: Absorb Reference Comparison reporting** - -Move these requirements from the retiring Reference Verification profile into Implementation: - -```text -ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT -``` - -Require exact declared input/CSV paths, generated `results.h5`, HDF5 projection from `io.md`, -source identity/component matching, row uniqueness/finite checks, and approved tolerance. Reject -missing, extra, duplicate, and nonfinite required rows before tolerance. Preserve warning-only behavior. - -Use these final statuses: - -```text -in-progress -pass-for-physics-evaluation -needs-correction -needs-reference-artifacts -needs-environment-fix -needs-upstream-decision -blocked -``` - -- [ ] **Step 4: Expand `fesa-cpp-msvc-tdd`** - -Update its frontmatter and body to cover planning, TDD implementation, build/test reporting, -correction, and reference comparison. The Output Contract must name: - -```text -docs//implementation-plan.md -docs//implementation-report.md -docs//build-test.md -docs//reference-comparison.md -docs//corrections.md -``` - -Include the literal workflow marker used by the test: - -```text -ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT -``` - -Send `pass-for-physics-evaluation` evidence to Physics Evaluation Agent through Coordinator Agent. - -- [ ] **Step 5: Regenerate the consolidated skill UI metadata** - -Run: - -```powershell -$generator = Join-Path $env:USERPROFILE '.codex\skills\.system\skill-creator\scripts\generate_openai_yaml.py' -python $generator '.codex\skills\fesa-cpp-msvc-tdd' ` - --interface 'display_name=FESA C++ TDD and Verification' ` - --interface 'short_description=Implement and verify FESA C++ work' ` - --interface 'default_prompt=Use $fesa-cpp-msvc-tdd to plan, implement, build, test, and reference-verify FESA C++ work.' -``` - -Expected: the default prompt explicitly names `$fesa-cpp-msvc-tdd`. - -- [ ] **Step 6: Delete the absorbed agent and skill files** - -Delete with `apply_patch`: - -```text -.codex/agents/build-test-executor-agent.toml -.codex/agents/reference-verification-agent.toml -.codex/skills/fesa-reference-comparison/SKILL.md -.codex/skills/fesa-reference-comparison/agents/openai.yaml -``` - -- [ ] **Step 7: Run focused agent/skill inventory tests** - -Run: - -```powershell -uv run --with pytest python -m pytest ` - tests/test_agent_skill_workflow_contract.py::test_implementation_absorbs_build_test_and_reference_comparison ` - tests/test_agent_skill_workflow_contract.py::test_agent_inventory_is_consolidated ` - tests/test_agent_skill_workflow_contract.py::test_project_skill_inventory_is_consolidated -v -``` - -Expected: all three tests PASS. - -- [ ] **Step 8: Commit the implementation/verification consolidation** - -```powershell -git add -A .codex/agents/implementation-agent.toml .codex/agents/build-test-executor-agent.toml .codex/agents/reference-verification-agent.toml .codex/skills/fesa-cpp-msvc-tdd .codex/skills/fesa-reference-comparison -git commit -m "refactor: merge implementation verification workflow" -``` - ---- - -### Task 5: Make Coordinator the main orchestrator and normalize all sub-agent contracts - -**Files:** - -- Modify: `.codex/agents/coordinator-agent.toml:1` -- Modify: every ten surviving sub-agent TOML files under `.codex/agents/`. -- Modify: all eight surviving `fesa-*` `SKILL.md` files under `.codex/skills/`. -- Test: `tests/test_agent_skill_workflow_contract.py::test_agent_hierarchy_is_explicit` - -**Interfaces:** - -- Consumes: consolidated stage owners and canonical feature-document paths from Tasks 2–4. -- Produces: one main-agent dispatch protocol and ten bounded sub-agent return contracts. - -- [ ] **Step 1: Rewrite the Coordinator mission and execution loop** - -In `.codex/agents/coordinator-agent.toml`, identify it with the exact phrase `main agent` and define: - -```text -INTAKE -> STATE AUDIT -> WORKLIST UPDATE -> SUB-AGENT DISPATCH - -> EVIDENCE CHECK -> GATE DECISION -> STATUS REPORT -``` - -Require `docs//coordination.md`, the eight-stage worklist, and these work-item statuses: - -```text -pending | in-progress | passed | needs-rework | blocked -``` - -Each dispatch package must contain: - -```text -feature_id -target_sub_agent -required_inputs -expected_outputs -acceptance_gate -stop_condition -missing_evidence -``` - -Coordinator must update `coordination.md` before dispatch and after evidence return. It must not -perform specialist math review, code implementation, build/test, comparison, physics, or release -judgment itself. - -- [ ] **Step 2: Replace obsolete Coordinator states and routes** - -Remove these intermediate routes and statuses: - -```text -needs-reference-model -needs-build-test -needs-reference-verification -pass-for-reference-verification -``` - -Use this live workflow state set: - -```text -intake -needs-requirements -needs-research -needs-formulation -needs-numerical-review -needs-io-definition -needs-implementation-plan -ready-for-implementation -needs-implementation -needs-correction -needs-physics-evaluation -needs-release -ready-for-release -completed -needs-user-decision -blocked -``` - -Route reference artifact/tolerance gaps to Numerical Review, HDF5 projection gaps to I/O Definition, -compile/test/comparison failures to Implementation first, and repeated or unclear implementation -failures to Correction. Stop automatic rework when the same classification reaches two attempts. - -- [ ] **Step 3: Mark all specialist profiles as sub-agents** - -Add this invariant to every surviving non-Coordinator TOML: - -```text -- You are a sub-agent dispatched by Coordinator Agent. -- Work only on the assigned stage and declared docs// outputs. -- Do not dispatch peer agents or advance the workflow yourself. -- Return output paths, status, evidence summary, and blockers to Coordinator Agent. -``` - -Preserve each profile's technical hard boundaries and `model_reasoning_effort = "extra high"`. - -- [ ] **Step 4: Normalize surviving agent paths and handoffs** - -Apply these exact path/owner changes: - -| Agent | Reads | Writes or returns | -| --- | --- | --- | -| Requirement | `docs//requirements.md` when revising | `requirements.md`; theory to Research; reference acceptance to Numerical Review | -| Research | `requirements.md` | `research.md`; formulation evidence to Formulation; benchmark/reference evidence to Numerical Review | -| Formulation | `requirements.md`, `research.md` | `formulation.md`; all review evidence to Numerical Review | -| Numerical Review | `requirements.md`, `research.md`, `formulation.md` | `numerical-review.md`, `reference-model.md`; both to I/O Definition | -| I/O Definition | upstream bundle documents including `reference-model.md` | `io.md`; final HDF5 projection to Implementation Planning | -| Implementation Planning | all upstream bundle documents | `implementation-plan.md`; one handoff to Implementation | -| Implementation | all upstream bundle documents and `implementation-plan.md` | `implementation-report.md`, `build-test.md`, `reference-comparison.md` | -| Correction | Implementation-owned reports and code/test/CMake evidence | `corrections.md`; rerun request to Implementation | -| Physics Evaluation | `reference-comparison.md`, `reference-model.md`, physics contracts | `physics-evaluation.md`; model gaps to Numerical Review | -| Release | all feature bundle evidence | `release.md`; closure recommendation to Coordinator | - -- [ ] **Step 5: Normalize all surviving FESA skill paths and handoffs** - -Update the Inputs, Output Contract, Quality Gate, and Handoff sections of these files: - -```text -.codex/skills/fesa-requirements-baseline/SKILL.md -.codex/skills/fesa-research-evidence/SKILL.md -.codex/skills/fesa-formulation-spec/SKILL.md -.codex/skills/fesa-numerical-review/SKILL.md -.codex/skills/fesa-io-contract/SKILL.md -.codex/skills/fesa-cpp-msvc-tdd/SKILL.md -.codex/skills/fesa-physics-sanity/SKILL.md -.codex/skills/fesa-release-readiness/SKILL.md -``` - -Every feature-document path must start with `docs//`. Remove all handoffs to retired -agents and skills. Preserve `fem-theory-query` and project-local `harness` usage where already valid. - -- [ ] **Step 6: Run the hierarchy test** - -Run: - -```powershell -uv run --with pytest python -m pytest tests/test_agent_skill_workflow_contract.py::test_agent_hierarchy_is_explicit -v -``` - -Expected: PASS. - -- [ ] **Step 7: Commit the Coordinator and sub-agent contracts** - -```powershell -git add .codex/agents .codex/skills -git commit -m "refactor: make coordinator the main workflow agent" -``` - ---- - -### Task 6: Align repository guidance and repair document links - -**Files:** - -- Modify: `AGENTS.md:1` -- Modify: `docs/SOLVER_AGENT_DESIGN.md:1` -- Modify: `docs/SOLVER_SKILL_DESIGN.md:1` -- Modify: moved files under `docs/linear-static-3d-euler-beam/` and `docs/linear-static-mitc4-shell/` only where old paths appear. -- Modify: tracked Markdown under `docs/superpowers/plans/`, `docs/superpowers/specs/`, and `phases/` only where an old feature-document path must be repaired. -- Test: `tests/test_agent_skill_workflow_contract.py::test_live_contracts_have_no_retired_names_or_paths` -- Test: `tests/test_agent_skill_workflow_contract.py::test_live_guidance_declares_eight_stage_workflow` -- Test: `tests/test_agent_skill_workflow_contract.py::test_agent_toml_and_skill_ui_metadata_are_parseable` - -**Interfaces:** - -- Consumes: canonical agent/skill contracts and bundle paths from Tasks 2–5. -- Produces: one consistent human-readable workflow with no retired live references and valid historical links. - -- [ ] **Step 1: Rewrite the AGENTS workflow sections** - -In `AGENTS.md`: - -1. Replace agent-oriented source-of-truth folders with `docs//`. -2. Replace the numbered process with the approved eight stages. -3. Replace the Agent/Skill Workflow table with the exact stage/owner/skill/output mapping from the design. -4. State that Coordinator is the main agent and every other profile is a sub-agent. -5. Keep Correction outside the numbered stages as on-demand rework. -6. Keep the Implementation Planning Agent's project-local `harness` approval/materialization contract unchanged. -7. Remove retired agent names, retired skill names, and retired output paths. - -- [ ] **Step 2: Rewrite `docs/SOLVER_AGENT_DESIGN.md` around the surviving roles** - -The document must contain: - -```text -Coordinator main-agent orchestration -10 surviving sub-agent roles -8-stage development-process table -8-stage Mermaid workflow -Numerical/reference merged gate -I/O-owned final HDF5 projection -Implementation-owned TDD/build/test/reference comparison gate -Correction rework loop -docs// artifact tree -``` - -Remove standalone Reference Model, Build/Test Executor, and Reference Verification sections. - -- [ ] **Step 3: Rewrite `docs/SOLVER_SKILL_DESIGN.md` around eight workflow skills** - -List the eight surviving `fesa-*` skills exactly as specified in the design. Document that: - -- `fesa-numerical-review` owns both numerical and reference readiness procedures. -- `fesa-cpp-msvc-tdd` owns implementation planning, TDD, MSVC validation, correction, and reference comparison procedures. -- `fem-theory-query`, project-local `harness`, and `review` remain supporting skills. -- Skill output paths use only `docs//`. - -Update the validation count from ten workflow skills to eight. - -- [ ] **Step 4: Repair exact feature-document paths in moved and historical Markdown** - -Use `rg` to inventory references before editing: - -```powershell -rg -n --hidden --glob '!.git/**' --glob '*.md' ` - 'docs/(requirements|research|formulations|numerical-reviews|io-definitions|reference-models|implementation-plans|build-test-reports|corrections|reference-verifications|physics-evaluations|releases|coordination)/' ` - AGENTS.md docs phases -``` - -Apply the Task 2 filename mapping with `apply_patch`. Update only path strings in historical -evidence and phase/spec/plan records; preserve their agent names, statuses, timestamps, commands, -results, and verdict prose. The current consolidation design and this plan may retain old paths -inside migration descriptions because those references describe sources being removed. - -- [ ] **Step 5: Run live-contract and metadata tests** - -Run: - -```powershell -uv run --with pytest python -m pytest ` - tests/test_agent_skill_workflow_contract.py::test_live_contracts_have_no_retired_names_or_paths ` - tests/test_agent_skill_workflow_contract.py::test_live_guidance_declares_eight_stage_workflow ` - tests/test_agent_skill_workflow_contract.py::test_agent_toml_and_skill_ui_metadata_are_parseable -v -``` - -Expected: all three tests PASS. - -- [ ] **Step 6: Commit the live workflow documentation** - -```powershell -git add AGENTS.md docs phases -git commit -m "docs: align consolidated solver workflow" -``` - ---- - -### Task 7: Run full validation and close the refactor - -**Files:** - -- Verify: all files changed in Tasks 1–6. -- Do not modify: solver C++, C++ tests, CMake/CTest files, Harness hooks/executor, or reference artifacts unless a validation check reveals an accidental edit that must be reverted from this task's own changes. - -**Interfaces:** - -- Consumes: the complete consolidated workflow. -- Produces: fresh validation evidence and a clean implementation handoff. - -- [ ] **Step 1: Run the focused workflow-contract suite** - -```powershell -uv run --with pytest python -m pytest tests/test_agent_skill_workflow_contract.py -v -``` - -Expected: 9 tests PASS, 0 fail. - -- [ ] **Step 2: Run the complete Python suite** - -```powershell -uv run --with pytest python -m pytest -v -rs -``` - -Expected: all repository Python tests PASS. - -- [ ] **Step 3: Validate every remaining project-local skill** - -```powershell -$validator = Join-Path $env:USERPROFILE '.codex\skills\.system\skill-creator\scripts\quick_validate.py' -$validationFailed = $false -Get-ChildItem -LiteralPath '.codex\skills' -Directory | Sort-Object Name | ForEach-Object { - python $validator $_.FullName - if ($LASTEXITCODE -ne 0) { $validationFailed = $true } -} -if ($validationFailed) { exit 1 } -``` - -Expected: every remaining skill reports valid frontmatter and naming. - -- [ ] **Step 4: Check the final agent/skill inventory and working-tree scope** - -```powershell -Get-ChildItem -LiteralPath '.codex\agents' -Filter '*.toml' | Sort-Object Name | Select-Object -ExpandProperty Name -Get-ChildItem -LiteralPath '.codex\skills' -Directory | Sort-Object Name | Select-Object -ExpandProperty Name -git diff --check -git status --short -``` - -Expected: - -- 11 agent TOMLs: one Coordinator plus ten sub-agents. -- 9 project-local skill directories: eight FESA workflow skills plus `fem-theory-query`. -- `git diff --check` exits 0. -- No solver C++, C++ test, CMake, hook, executor, or `reference/` artifact appears in the task diff. - -- [ ] **Step 5: Confirm no final C++ validation is required** - -Inspect the changed-file list: - -```powershell -git diff --name-only HEAD~6..HEAD -``` - -Expected: only agent/skill configuration, Markdown, and the Python contract test changed. Record -that MSVC build and CTest were not run because no C++ production, C++ test, or CMake/CTest file -changed. - -- [ ] **Step 6: Commit only validation-driven corrections if any were required** - -If Steps 1–5 required corrections, stage only those corrections and commit: - -```powershell -git add -A -git commit -m "fix: correct consolidated workflow contracts" -``` - -If no corrections were required, do not create an empty commit. - ---- - -## Acceptance Traceability - -| Approved requirement | Implemented by | Verified by | -| --- | --- | --- | -| Merge reference-model stage into numerical review | Task 3 | `test_numerical_review_absorbs_reference_model_contract` | -| Merge Build/Test and Reference Comparison into Implementation | Task 4 | `test_implementation_absorbs_build_test_and_reference_comparison` | -| Merge the corresponding skills | Tasks 3–4 | focused merge tests and skill validation | -| Store evidence by feature under `docs//` | Task 2 | `test_existing_feature_artifacts_are_bundled` | -| Make Coordinator the main orchestrator | Task 5 | `test_agent_hierarchy_is_explicit` | -| Focus Coordinator output on worklist and progress | Tasks 2 and 5 | coordination documents and hierarchy test | -| Preserve historical evidence | Tasks 2 and 6 | migration diff review and bundle inventory | -| Remove stale live references | Tasks 5–6 | `test_live_contracts_have_no_retired_names_or_paths` | -| Keep configs and skill metadata valid | Tasks 3–7 | TOML/metadata pytest and `quick_validate.py` | diff --git a/docs/superpowers/plans/2026-08-16-implementation-agent-terra-model.md b/docs/superpowers/plans/2026-08-16-implementation-agent-terra-model.md deleted file mode 100644 index b74ca08..0000000 --- a/docs/superpowers/plans/2026-08-16-implementation-agent-terra-model.md +++ /dev/null @@ -1,70 +0,0 @@ -# Implementation Agent Terra Model Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Configure the project-local `implementation-agent` to use `gpt-5.6-terra` while preserving its existing reasoning effort. - -**Architecture:** Add one explicit model override to the existing Implementation Agent TOML profile. Do not introduce shared model policy, modify other profiles, or change the agent's instructions. - -**Tech Stack:** TOML, Python 3 `tomllib`, Git - -## Global Constraints - -- Set `model` to exactly `gpt-5.6-terra` only in `.codex/agents/implementation-agent.toml`. -- Preserve `model_reasoning_effort = "extra high"`. -- Do not modify other custom agents, user-global Codex configuration, solver production code, or agent instructions. -- Do not add or modify contract tests or other test files. -- Verify the change only through TOML parsing, exact-value assertions, and Git diff inspection. - ---- - -### Task 1: Add the Implementation Agent model override - -**Files:** -- Modify: `.codex/agents/implementation-agent.toml` -- Test: none, per the approved design - -**Interfaces:** -- Consumes: the existing project-local `implementation-agent` TOML profile -- Produces: `model = "gpt-5.6-terra"` with the existing `model_reasoning_effort = "extra high"` - -- [ ] **Step 1: Add the model setting** - -Insert the model key between `sandbox_mode` and `model_reasoning_effort` so the profile header is: - -```toml -name = "implementation-agent" -description = "Implements FESA solver features in C++17/MSVC by following approved TDD-first implementation plans." -sandbox_mode = "workspace-write" -model = "gpt-5.6-terra" -model_reasoning_effort = "extra high" -``` - -- [ ] **Step 2: Parse the profile and verify the exact values** - -Run: - -```powershell -python -c "import pathlib, tomllib; p = tomllib.loads(pathlib.Path('.codex/agents/implementation-agent.toml').read_text(encoding='utf-8')); assert p['model'] == 'gpt-5.6-terra'; assert p['model_reasoning_effort'] == 'extra high'" -``` - -Expected: exit code `0` with no output. - -- [ ] **Step 3: Verify the change is surgical** - -Run: - -```powershell -git diff --check -git diff -- .codex/agents/implementation-agent.toml -``` - -Expected: no whitespace errors, and the profile diff contains only the added -`model = "gpt-5.6-terra"` line. - -- [ ] **Step 4: Commit the configuration change** - -```powershell -git add -- .codex/agents/implementation-agent.toml -git commit -m "chore: use Terra for implementation agent" -``` diff --git a/docs/superpowers/plans/2026-09-07-agent-harness-documentation-update.md b/docs/superpowers/plans/2026-09-07-agent-harness-documentation-update.md deleted file mode 100644 index 331323f..0000000 --- a/docs/superpowers/plans/2026-09-07-agent-harness-documentation-update.md +++ /dev/null @@ -1,282 +0,0 @@ -# Agent·Harness 경량화 문서 갱신 Implementation Plan - -> **For agentic workers:** 후속 실행에는 `superpowers:executing-plans`를 적용하되 아래 문서 작업을 메인이 직접 수행한다. 고정 solver stage, task별 새 subagent·reviewer, 자동 commit을 추가하지 않는다. - -**Goal:** 승인된 Agent·Harness 경량화를 FESA의 공통 문서 10개에 반영하여 현재 운영 지침과 구현의 불일치를 없앤다. - -**Architecture:** `docs2/agent-harness-simplification`의 승인된 운영 변경을 현재 `.agents`, `.codex`, `scripts`에 대조하여 반영한다. FESA 제품·수치·입출력·C++ 계약은 유지하고, 공통 ADR에는 기존 결정과 구분되는 후속 결정을 기록한다. - -**Tech Stack:** 한국어 Markdown, PowerShell 기반 정적 확인. 문서에 설명할 검증 환경은 기존 CMake/MSVC x64/Debug, CTest, Python Harness다. - -**Spec:** [경량화 PRD](../../../docs2/agent-harness-simplification/PRD.md), [AH-01~05 결정](../../../docs2/agent-harness-simplification/ADR.md), [승인 계획 보존본](../../../docs2/agent-harness-simplification/implementation-details.md), [기존 구현 보고서](../../../docs2/agent-harness-simplification/implementation-report.md). - -작성일: 2026-09-07. 상태: **문서 갱신 계획안**. 이번 요청에서는 이 계획만 작성하며 대상 문서를 수정하거나 Harness를 실행하지 않는다. 아래 checkbox는 후속 문서 작업의 완료 조건이다. - -## 1. 범위와 기준 - -### Global Constraints - -- 후속 수정 범위는 사용자가 지정한 `AGENTS.md`와 `docs/` 문서 9개로 제한한다. 정확한 목록은 §3을 따른다. -- 현재 사용자의 `.agents`, `.codex`, `.harness`, `scripts`, `docs2` 변경을 보존한다. 이 계획으로 구현·테스트·설정·phase 이력을 수정하지 않는다. -- FESA의 C++17 이상, CMake/MSVC/x64/Debug, MKL/TBB/HDF5와 승인된 Abaqus 입력 subset을 유지한다. -- HDF5 `_results.h5`의 lexical sibling 경로, source identity, 결정론, state/output 보존, 기존 B33/MITC4 비교량·판정 구분을 유지한다. -- [TOLERANCE](../../TOLERANCE.md), reference artifact와 solver 구현은 수정 대상이 아니다. 수치 검토와 필요한 analytical/invariant·reference 검증을 유지한다. -- 운영 간소화를 이유로 물리 의미, 공개 schema, 지원 범위, tolerance, 외부 실행·원격·파괴 작업 권한을 확대하지 않는다. -- 작은 문서 작업에는 solver Feature 폴더·관리 문서·stage 보고서를 새로 만들지 않는다. 이 계획도 별도 solver Feature workflow를 시작하지 않는다. -- 문서만 갱신하므로 새 테스트, pytest, Harness, CMake/CTest, 수동 hook을 실행하지 않는다. 확인 범위는 문서·링크·설정·소스의 정적 대조다. -- 기존 문서의 언어·구성을 가능한 한 유지한다. 문서 전체 복사나 요청과 무관한 코딩 규약 정리는 하지 않는다. - -### 근거의 적용 순서 - -1. 현재 사용자가 요청한 문서 갱신 범위와 경량화 목적. -2. `docs2/agent-harness-simplification`에 기록된 AH-01~05의 운영 변경과 유지할 acceptance. -3. 현재 저장소의 실제 agent/skill profile, runner, config/discovery/adapter/process 구현. -4. 기존 FESA 제품·수치·아키텍처 계약과 현재 preset. 구현이 이 계약을 변경할 권한은 없다. - -`docs2`의 공통 문서는 문안 참고 자료다. 기존 FESA 문서를 통째로 대체하는 원본으로 사용하지 않는다. 승인 설명과 현재 구현이 다르면 운영 의도와 관찰된 동작을 구분하고, 문서로 미구현 기능이나 검증 통과를 선언하지 않는다. - -## 2. 현재 확인한 차이와 반영 판단 - -| 근거 | 확인한 내용 | 문서 반영 판단 | -| --- | --- | --- | -| [현재 profiles](../../../.codex/agents) | 7개 specialist만 남고 일반 역할은 `medium`, 정식화·수치·물리 역할은 `high`다. Implementation profile의 모델은 `gpt-5.6-terra`다. | 삭제된 4개 전용 역할과 일괄 `xhigh` 요구를 제거한다. 모델 선택은 profile로 연결하고 runtime 적용을 검증했다고 주장하지 않는다. | -| [runner](../../../scripts/execute.py), [harness skill](../../../.agents/skills/harness/SKILL.md) | 인자 없는 명시적 검증 실행기다. 내부 LLM, phase 상태 처리, 자동 Git·retry가 없다. | 새 CLI와 현재 exit 의미를 설명한다. 옛 CLI는 폐기 안내에서만 보여 준다. | -| [config](../../../scripts/msvc_harness/config.py), [discovery](../../../scripts/msvc_harness/discovery.py) | legacy `tdd`는 설정 로드 시 안내 후 무시한다. C++ 전체 scan과 orphan-C++ gate가 없다. | 현재 없는 TDD pattern 설정·C++ 파일 scan·자동 skip 설명을 삭제한다. | -| [config 예시](../../../.harness/config.example.json), [presets](../../../CMakePresets.json) | 예시는 `projectType=cmake`, `sourceDir=.`만 지정한다. FESA Ninja preset은 별도로 존재한다. | 예시 복사만으로 Ninja preset을 선택한다고 쓰지 않는다. 명시적 preset 설정 예시를 유지한다. | -| `docs2`의 PRD·ARCHITECTURE·구현 보고서 | solver/build metadata가 없는 framework checkout을 전제로 한다. | 현재 [CMakeLists](../../../CMakeLists.txt), [solver target](../../../src/fesa/CMakeLists.txt), [test target](../../../tests/CMakeLists.txt)이 있으므로 해당 현황 설명은 옮기지 않는다. | -| `docs2`와 현재 공통 ADR | 같은 ADR 번호가 다른 결정을 뜻한다. `docs2` ADR-013은 신뢰 경계이고, 현재 ADR-013은 선형 보 해석 범위다. | 번호를 복사하지 않는다. 현재 문서의 마지막 ID 다음인 ADR-028에서 실제 대체 대상을 명시한다. | -| `docs2`의 구현 보고서와 현재 `tests/` | 보고서의 `test_executor.py` 등과 현재 테스트 파일 구성이 다르며, 현재에는 삭제된 executor/hook을 기대하는 테스트가 남아 있다. | 과거 29건 통과를 현재 checkout의 검증 결과로 사용하지 않는다. 테스트 정합성은 §7의 별도 후속 항목으로 기록한다. | - -`docs2/agent-harness-simplification/ADR.md`의 “프로젝트 PRD·ADR 원문 보존”은 이전 구현 범위의 기록이다. 현재 요청은 두 문서의 운영 조항 갱신을 명시적으로 포함하므로 계획에서 제외하지 않는다. 기존 제품 계약과 ADR 결정 본문은 보존하면서 현행 규칙과 대체 관계를 명료하게 만든다. - -## 3. 파일별 수정 계획 - -| 대상 | 변경할 절과 내용 | 보존·확인 기준 | -| --- | --- | --- | -| [AGENTS.md](../../../AGENTS.md) | `문서 기준과 Feature 관리`, `개발 운영 인프라`, `개발 프로세스`, `Agent/Skill Workflow`, `최소 검증 진입점`을 갱신한다. 메인 직접 조정, 조건부 specialist, 핵심 문서 3개·PRD checklist, 간결한 인계, 명시적 검증을 요약한다. 소유권 절의 매 변경 RED·대응 C++ test 강제를 동작 중심 검증으로 바꾸고, reference 변경 권한의 “요청된 phase”를 “명시적으로 요청된 작업 범위”로 고친다. | 제품 정체성, FESA 기술 스택, 수치·선형 정적 불변식, reference 무결성, 사용자 변경 보존을 유지한다. 상세 CLI·workflow를 중복 복사하지 않고 전담 문서에 연결한다. | -| [docs/ADR.md](../../ADR.md) | ADR-028을 추가하고 ADR-012·024~027에 대체/부분 대체 안내를 붙인다. 머리말의 현행 운영 ADR 범위와 ADR-001·002 등의 현행 운영 참조를 확인한다. | 기존 ID와 결정 본문을 소급 재작성하지 않는다. 실제 ADR-013 및 다른 solver 결정은 변경하지 않는다. §4의 대체 범위를 사용한다. | -| [docs/ARCHITECTURE.md](../../ARCHITECTURE.md) | `Solver runtime과 개발 운영 영역`의 개발 흐름, `개발 운영 인프라`의 owner 표·실행 책임, 끝의 Feature 요구사항 원본 설명을 수정한다. 메인, specialist, 명시적 runner, backend adapter/process의 책임을 구분한다. `검증과 reference 경계`의 전문 책임을 필수 agent 순회로 읽히지 않게 정리한다. | Solver runtime 그림·모듈 책임·Domain/AnalysisModel/DofManager·의존성·수명·해석 lifecycle·출력 계약은 보존한다. Runner를 보안 sandbox나 solver correctness 판정기로 표현하지 않는다. | -| [docs/PRD.md](../../PRD.md) | 문서 역할 표의 Feature PRD를 작은 요구사항의 원본으로, `requirements.md`를 필요 시 분리하는 상세 계약으로 바꾼다. `FESA-PRD-GEN-010`은 동작 중심 테스트·가능한 버그 재현과 영향별 검증으로 수정한다. `FESA-PRD-GEN-012`의 evidence를 필수 stage/gate 기록에서 해당 계약의 검증·제한·미해결 항목으로 수정한다. `검증과 완료 기준`의 9단계 순회와 필수 release audit를 제거한다. | GEN-001~009·011과 제품 정의·품질 속성·비목표의 물리/수치 의미를 보존한다. 필요한 독립 수치 검토·물리 검증·reference 비교, 같은 계약을 지지하는 evidence와 stale 판정을 유지한다. | -| [docs/SOLVER_AGENT_DESIGN.md](../../SOLVER_AGENT_DESIGN.md) | 고정 stage·Coordinator 전용 전이·12필드 envelope·5개 outcome 강제·correction signature/budget을 제거한다. 메인의 작업 선택, 7개 specialist 호출 조건/수정 경계/기본 강도, 간단한 dispatch·return, 구현 owner의 실패 수정, 완료 evidence와 사용자 결정 경계를 정의한다. | 새 수식·요소·재료·적분·상태 갱신의 독립 numerical review를 유지한다. 상위 계약 문제의 owner 반환, 무근거 반복 금지, specialist의 범위 제한을 유지한다. | -| [docs/SOLVER_SKILL_DESIGN.md](../../SOLVER_SKILL_DESIGN.md) | `Stage` 중심 inventory를 `사용할 때 / 필요한 입력 / 결과` 중심으로 바꾼다. 8개 FEM skill과 supporting skill을 현재 `SKILL.md`에 맞춘다. implementation skill은 메인도 계획·구현·수정에 사용하고, release skill은 사용자 명시 요청 시에만 사용한다. | `fem-theory-query`의 configured vault 범위, read-only review, tolerance·reference·외부 권한 경계를 유지한다. 모든 문서 재독·공통 outcome/hash·전체 pytest를 문서 편집의 필수 절차로 강제하지 않는다. | -| [docs/HARNESS_WORKFLOW.md](../../HARNESS_WORKFLOW.md) | 요구사항→phase/index/step→Codex→hook→자동 commit 흐름을 관련 계약 확인→변경→관련 검사→기능 완료 시 전체 검사 흐름으로 재구성한다. 현행 runner의 config→discovery→toolchain→adapter→execute_plan 순서와 실패 중단을 설명한다. 문서·일반 버그·새 수치 기능의 3개 사례를 둔다. | 현행 config/경로 검사, MSVC 확인, CTest discovery, timeout·실패 진단은 보존한다. 폐기한 phase schema·출력 JSON·owned_paths·attempt_history를 새 절차에 요구하지 않는다. | -| [docs/HARNESS.md](../../HARNESS.md) | 설치·설정·명령·진단에 집중한다. Harness 실행의 Codex CLI 의존 설명을 제거한다. 인자 없는 CLI, 자동 감지, exit 0/1/2, preset 설정, legacy `tdd`와 옛 CLI 안내를 §5대로 작성한다. hook·sandbox 환경변수·자동 Git·phase 복구·TDD 확장 절을 정리한다. | Windows/MSVC·CMake/CTest·dependency 준비, Python 요구와 재사용 MSBuild adapter 안내를 유지한다. FESA 제품 검증은 CMake/CTest라는 구분을 보존한다. | -| [docs/CODINGSTYLE.md](../../CODINGSTYLE.md) | `Test와 변경 관리` 및 `Implementation Agent Checklist`를 메인/구현 담당자 공통 지침으로 바꾼다. 모든 C++ 변경의 test-file 동반·Step별 RED/full 강제를 영향별 테스트와 검증으로 바꾼다. 충분한 기존 coverage가 있는 rename/refactor에는 형식적 새 테스트를 요구하지 않는다. | PascalCase, include guard, 2-space/80-column, production Doxygen, vendor 경계, 신규 warning 금지 등을 유지한다. B33/MITC4 output 변경의 필수 reference 재검증을 유지한다. | -| [docs/FEATURE_DOCUMENTATION.md](../../FEATURE_DOCUMENTATION.md) | 새 Feature가 필요한 조건과 메인 소유 핵심 문서 3개를 명시한다. 현재 checklist는 PRD 한 곳, 작은 요구사항도 PRD 원본, 별도 requirements/matrix·상세 보고서는 필요한 경우만 생성하도록 바꾼다. 간단한 구현·build/test·reference evidence는 한 보고서에 합칠 수 있게 한다. | `FEATURED_AGENTS.md`의 비자동 로드 성격, 상대 링크, specialist의 할당 문서 소유권과 필수 근거를 유지한다. 기존 `coordination.md`, `docs/features/` 자료는 이력으로 보존하고 신규 상태기계나 일괄 이관을 만들지 않는다. | - -## 4. ADR-028에 기록할 결정 - -제안 제목: **ADR-028: 메인이 필요한 전문 작업을 조정하고 Harness를 명시적 검증 실행기로 사용한다**. - -근거는 현재 사용자 요청, 경량화 Feature의 AH-01~05와 실제 source다. 이 계획에서 ADR-028을 이미 작성·승인된 문서처럼 표시하지 않는다. 후속 반영 시 기존 경량화 승인과 이번 문서 동기화 근거를 구분해 연결한다. - -| 기존 ADR | 대체할 운영 부분 | 유지되는 부분 | -| --- | --- | --- | -| ADR-012 | 전용 Planning/Executor/Hook 분업과 hook 기반 강제 검증 | 실제 테스트 실행과 단순 파일 존재의 구분, 검증 evidence의 필요성 | -| ADR-024 | 전용 Coordinator, 고정 상태 전이, correction 1회/rerun 1회, 필수 release stage | 승인 범위 안의 자율 작업, 필요한 사용자 결정, 미실행·실패를 통과로 표시하지 않음, 외부 권한 분리 | -| ADR-025 | 관리 문서 4개, `coordination.md` 상태 원본, 모든 요구의 `requirements.md` 분리, 매 dispatch의 전체 bundle 필수화 | 프로젝트/Feature 계약 구분, 전문 문서 소유권, 상대 링크와 중복 방지, 실제 계약 변경에 따른 evidence 영향 확인 | -| ADR-026 | Executor의 Git·transport 관리, hook TDD/Stop, 자체 sandbox 승인 장치 | config/preset/command의 신뢰 경계, 사용자 변경 보존, 실제 runtime 권한, 검증 범위와 미실행의 명확한 보고 | -| ADR-027 | phase Step payload, `owned_paths`, `attempt_history`, 자동 commit 경계와 transport 재시도 계약 | 실패 증거와 사용자 변경을 보존하고 범위 밖 작업을 하지 않는 일반 원칙 | - -ADR-028 본문에는 AH-01~05의 효과를 한 번만 기록한다: 메인 orchestration, 명시적 runner, 영향에 맞는 검사, 필요한 문맥만 전달, 핵심 문서 3개와 선택적 상세 기록. 상세 명령과 산출물 형식은 각각 HARNESS·FEATURE_DOCUMENTATION으로 연결한다. 과거 본문의 폐기된 역할/명령 검색 결과는 이력임을 분명히 표시한다. - -## 5. 현행 Harness 설명에 넣을 정확한 계약 - -### 명령과 설정 - -```powershell -python scripts/execute.py -``` - -이 명령은 명시적으로 선택/발견한 backend의 전체 검증을 한 번 수행한다. Focused check는 실제 configured backend 명령으로 직접 실행한다. Runner가 Feature 문서에서 reference 명령을 찾아 추가 실행하거나 `phases/`를 읽고 갱신한다고 설명하지 않는다. - -FESA Ninja preset을 사용하려면 기존 개인 설정을 보존하면서 다음 필드를 함께 맞춘다. 이번 문서 작업에서 개인 설정은 편집하지 않는다. - -```json -{ - "version": 1, - "projectType": "cmake", - "cmake": { - "sourceDir": ".", - "binaryDir": ".harness/build-ninja-msvc-debug", - "configurePreset": "windows-msvc-ninja-debug", - "buildPreset": "windows-msvc-ninja-debug", - "testPreset": "windows-msvc-ninja-debug" - } -} -``` - -현재 `.harness/config.example.json`에는 preset 필드가 없다. `CMakePresets.json`이 존재하거나 예시 설정을 복사했다는 사실만으로 preset이 선택되지는 않는다. Preset 없는 adapter 기본값과 FESA preset 사용법을 구분하여 설명한다. - -### 결과와 보장 범위 - -| 조건 | 현재 동작 | -| --- | --- | -| 구성된 검증이 모두 성공 | runner exit 0, 실행 명령·cwd·exit와 test 출력 요약 | -| config/discovery/toolchain/adapter 오류, backend 실패·timeout, non-MSVC, CTest 0개 등 | runner exit 1. Backend의 원래 nonzero는 진단에 남지만 runner가 같은 숫자를 그대로 반환하는 것은 아님 | -| 자동 감지에서 build metadata 없음 | `not configured`와 exit 2. 검증 통과나 조용한 skip이 아님 | -| 명시한 projectType에 필요한 metadata가 없음 | 잘못된 명시 설정 경로의 실패로 exit 1 | -| 옛 ``, `--push`, `--approve-danger-full-access` 인자 | argparse usage error, exit 2. 검증을 시작하지 않음 | -| legacy `tdd` 항목 | `load_config` 호출 시 폐기 안내를 내고 무시. Config를 자동 수정하지 않음 | -| CMake 경로 | configure → MSVC 확인 → build → CTest discovery/0개 거부 → test | -| MSBuild adapter 경로 | build → 명시된 testCommand. FESA의 solution-only 검증을 승인하는 의미가 아님 | - -명령은 `shell=False`로 실행하며 repository-relative 설정 경로와 cwd 범위, timeout을 검사한다. 전체 deadline은 현재 1,800초이고 각 명령에는 남은 시간과 명령 timeout 중 짧은 값이 적용된다. 실패 후 후속 단계나 자동 재시도를 실행하지 않는다. Config·preset·실행 파일 자체의 side effect를 sandbox처럼 격리하는 기능은 아니다. - -내부 Codex 호출·프롬프트 주입, phase 상태기계, branch/commit/push, 대응 파일명 TDD gate, 등록된 PreToolUse/Stop과 자체 sandbox 승인은 제거되었다. 실제 도구·runtime 권한은 계속 따른다. 기존 phase·hook 기록은 이력으로 남기며 새 runner의 입력이나 필수 정리 대상으로 삼지 않는다. - -## 6. 실행 순서와 문서별 완료 확인 - -### Task 1: 공통 운영 결정과 제품 완료 기준 - -**Modify:** `docs/ADR.md`, `docs/PRD.md`. - -**입력:** AH-01~05, 현재 공통 ADR-012·024~027, GEN-010·012. **결과:** 나머지 문서가 참조할 단일 현행 운영 결정과 완료 기준. - -- [ ] ADR-028과 §4의 대체 안내를 작성하고 기존 결정 본문·번호를 보존한다. -- [ ] PRD의 문서 역할, GEN-010·012, 검증·완료 절을 §3대로 수정한다. -- [ ] 새 수치 변경의 독립 검토, 필요한 물리/수치/reference evidence가 여전히 필수인지 확인한다. Release audit는 명시 요청일 때만 수행하도록 맞춘다. -- [ ] 두 문서의 diff를 읽어 운영 이외 제품 요구가 변경되지 않았고, 현재 FESA의 ADR-013에 경량화 신뢰 경계를 덮어쓰지 않았는지 확인한다. - -### Task 2: Agent·Skill·Feature 문서 운영 - -**Modify:** `docs/SOLVER_AGENT_DESIGN.md`, `docs/SOLVER_SKILL_DESIGN.md`, `docs/FEATURE_DOCUMENTATION.md`. - -**입력:** Task 1, 현재 profile·SKILL.md. **결과:** 조건부 역할 선택, 최소 인계, 핵심 문서 3개의 일관된 계약. - -- [ ] 7개 역할을 호출 조건과 기본 강도로 설명하고 메인의 직접 계획·구현·수정 책임을 명시한다. -- [ ] 고정 stage/envelope/outcome/retry budget을 제거한다. Dispatch는 작업·관련 경로/절·수정 파일·검증 기준, return은 결과·변경 파일·검사 결과·미해결 항목으로 정리한다. -- [ ] 필요한 문서만 읽고 연속 수정은 같은 owner가 수행하도록 정리한다. 지원되는 경우 `fork_turns="none"`을 사용하되 실제 도구·역할 설정이 기준임을 유지한다. -- [ ] PRD checklist·선택적 requirements 및 상세 보고서, 기존 coordination 이력 보존을 세 문서에서 일치시킨다. -- [ ] 기존 numerical/reference/physics 검토의 실질적 내용이 단순 역할 삭제와 함께 사라지지 않았는지 확인한다. - -### Task 3: Harness 사용법과 실행 흐름 - -**Modify:** `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`. - -**입력:** Task 1~2, runner/config/discovery/adapter/process, 현재 preset. **결과:** §5와 일치하는 사용법과 영향별 검증 사례. - -- [ ] HARNESS에는 설치·설정·정확한 CLI·exit·이전 방식 변경 안내를 둔다. 기존 설정을 무조건 덮어쓰는 복사 안내는 피한다. -- [ ] HARNESS_WORKFLOW는 메인의 개발 흐름과 runner 내부 실행 순서로 재작성한다. 설치/JSON 예시는 HARNESS에 연결하여 중복을 줄인다. -- [ ] 문서만 변경하면 정적 검토, 일반 버그는 재현·관련 검사, 새 수치 기능은 필요한 정식화·독립 검토·구현·물리/reference 검사로 분기하는 표를 작성한다. -- [ ] 도움말·usage·backend 결과는 소스로 대조한다. 문서 갱신 확인을 위해 실제 runner나 pytest를 실행하지 않는다. - -### Task 4: 루트 지침·아키텍처·코딩 지침 동기화 - -**Modify:** `AGENTS.md`, `docs/ARCHITECTURE.md`, `docs/CODINGSTYLE.md`. - -**입력:** Task 1~3의 현행 계약. **결과:** 다음 작업부터 적용되는 짧고 모순 없는 루트 지침. - -- [ ] AGENTS의 운영·Feature 관리·검증 절을 갱신하고 상세 전담 문서에 링크한다. 모든 문서·모든 stage를 매 작업마다 읽으라는 의무를 제거한다. -- [ ] ARCHITECTURE의 개발 흐름과 owner 표를 바꾸고 solver runtime 책임과 물리/수치 계약을 보존한다. -- [ ] CODINGSTYLE의 동작 검증·refactor 예외·전체 검증 시점·담당자 checklist만 수정한다. Doxygen/naming/formatting 요구는 유지한다. -- [ ] “agent profile 제거”와 “해당 전문 skill/검증 제거”를 혼동한 문장이 없는지 확인한다. - -### Task 5: 통합 정적 확인과 인계 - -**Modify:** 앞선 10개 문서의 발견된 모순만 수정한다. 새 자동화·테스트 파일을 추가하지 않는다. - -- [ ] AH-01은 AGENTS/AGENT_DESIGN/ARCHITECTURE, AH-02는 HARNESS/WORKFLOW, AH-03은 PRD/CODINGSTYLE, AH-04는 AGENT_DESIGN/SKILL_DESIGN, AH-05는 FEATURE_DOCUMENTATION/PRD에 반영됐는지 확인한다. 공통 근거는 ADR-028로 연결한다. -- [ ] 아래 검색 결과를 현행 규칙, 폐기 안내, 과거 ADR 본문으로 분류한다. 폐기한 기능을 현행 의무로 설명하는 결과가 없어야 한다. -- [ ] 변경 문서의 상대 링크·절 링크·agent/skill 이름·CLI·preset 값을 확인한다. 삭제된 profile/hook 경로는 현재 파일 링크로 두지 않는다. -- [ ] root AGENTS의 byte 크기를 확인한다. 내용을 줄이되 필수 FESA 계약을 제거하여 분량만 맞추지 않는다. -- [ ] 최종 diff가 요청한 10개 문서에 한정되는지 확인하고 기존 사용자 변경은 보존한다. 문서 정합성과 미실행 검사를 구분하여 보고한다. - -정적 검색·diff 예시(PowerShell, 저장소 루트): - -```powershell -$docTargets = @( - 'AGENTS.md', 'docs/ADR.md', 'docs/ARCHITECTURE.md', 'docs/PRD.md', - 'docs/SOLVER_AGENT_DESIGN.md', 'docs/SOLVER_SKILL_DESIGN.md', - 'docs/HARNESS_WORKFLOW.md', 'docs/HARNESS.md', 'docs/CODINGSTYLE.md', - 'docs/FEATURE_DOCUMENTATION.md' -) -rg -n 'coordinator-agent|implementation-planning-agent|correction-agent|release-agent|xhigh|coordination\.md|owned_paths|attempt_history|retry_key|PreToolUse|Stop|hooks\.json|FEM_HARNESS_CODEX_SANDBOX|approve-danger-full-access|--push|9개|정규 stage' @docTargets -rg -n 'execute\.py|GEN-010|GEN-012|ADR-028|medium|high|reference|TOLERANCE' @docTargets -git diff --check -- $docTargets -git diff --stat -- $docTargets -git diff -- $docTargets -(Get-Item -LiteralPath 'AGENTS.md').Length -``` - -검색어를 전부 없애는 것이 합격 조건은 아니다. ADR 이력과 명시적인 폐기 안내는 허용하며, solver의 해석 step/state/retry 의미를 개발 phase와 혼동하여 삭제하지 않는다. UTF-8과 기존 개행을 보존하며 링크와 의미는 사람이 함께 확인한다. 자동 문자열·heading 맞춤 테스트를 만들지 않는다. - -## 7. 범위 밖 후속 정합성 항목 - -다음은 현재 파일을 읽어 확인한 불일치다. 테스트를 실행하여 얻은 실패 결과는 아니며, 이번 문서 수정의 코드/테스트 작업으로 편입하지 않는다. - -| 파일 | 현재 남아 있는 기대 | 후속 작업의 방향 | -| --- | --- | --- | -| [tests/test_execute.py](../../../tests/test_execute.py), [tests/test_execute_ownership.py](../../../tests/test_execute_ownership.py) | 삭제된 `StepExecutor`, phase·Git·owned_paths·retry 처리 | 별도 구현 작업에서 새 runner의 성공·실패·timeout·Git 무변경 동작에 맞는 coverage로 정리 | -| [tests/test_hook_validation_scope.py](../../../tests/test_hook_validation_scope.py) | 삭제된 `scripts.hooks` import와 Stop 동작 | 폐기된 hook 검사와 유지할 실행기 검증을 구분 | -| [tests/test_agent_skill_workflow_contract.py](../../../tests/test_agent_skill_workflow_contract.py) | 전용 Coordinator, 9단계, `xhigh`, phase 예시 preflight | 실제 7개 profile과 조건부 skill 계약에 맞추되 문구 강제를 새로운 합격 기준으로 만들지 않음 | -| [tests/test_harness_preset_contract.py](../../../tests/test_harness_preset_contract.py) | tracked config 예시가 Ninja preset 필드를 모두 포함한다고 기대 | 간소화된 예시와 FESA 명시 preset 지원을 구분하여 검증 | - -문서 10개를 갱신하는 일은 이 불일치의 해결과 별개로 완료할 수 있다. 다만 저장소 전체 Python 검사, 실제 C++ build/test, 수치/reference 검증이 통과했다고 보고할 수는 없다. 이번 계획과 후속 문서 작업에는 이 실행들을 포함하지 않는다. - -## 8. AGENTS.md Quality Report - -### Summary - -- Files found: `AGENTS.md`, `docs2/AGENTS.md`의 2개. 수정·평가 대상은 요청된 루트 파일 1개다. -- Active project chain at `C:/git/FESADev`: `AGENTS.md`. 프로젝트 내 override는 발견되지 않았다. -- `docs2/AGENTS.md`는 별도 subtree에만 적용되는 참고 자료다. 루트 체인에 합산하지 않으며 전역 사용자 지침은 이번 audit 범위 밖이다. -- Average score: **60/100**. Files needing update in scope: **1**. -- Combined selected project-chain size: **24,487 bytes**; 기본 비교 한도 32 KiB 이내다. 전역 지침을 포함한 runtime 실제 주입량을 측정한 값은 아니다. - -### File-by-File Assessment - -#### 1. AGENTS.md (project root; active) - -**Score: 60/100 (Grade: C)**. 점수는 문서 정합성 평가이며 솔버 품질 평가가 아니다. - -| Criterion | Score | Evidence | -| --- | ---: | --- | -| Commands and workflows | 10/20 | CMake/CTest 진입점은 남아 있으나 phase CLI·hook·전용 Coordinator workflow는 현재 구현과 다름 | -| Repository map and instruction scope | 15/20 | FESA runtime/Feature 경계는 유효하나 삭제한 profile·hook 경로를 현행 지침으로 참조 | -| Non-obvious constraints and gotchas | 15/15 | Source identity, 수치/물리 검증, reference 무결성, state·HDF5 보존의 구체적 제약 유지 | -| Conciseness and duplication | 5/15 | stage·handoff·retry·hook의 상세 의무를 여러 전담 문서와 중복 유지 | -| Currency against the codebase | 5/15 | 7개 profile·medium/high·인자 없는 runner·hook 삭제를 아직 반영하지 않음 | -| Actionability and verifiability | 10/15 | 검증 명령과 경계는 구체적이나 현재 수행할 수 없는 절차를 의무화 | - -**Issues:** 삭제된 운영 기능을 요구하고, 간소화된 skill보다 더 강한 상태기계·파일명 TDD·전체 검증 반복을 지시한다. - -**Recommended changes:** §3의 AGENTS 수정 범위만 반영한다. 상세 기술·수치 규칙은 유지하고 전담 문서와의 중복 운영 설명을 줄인다. - -### Update: AGENTS.md - -**Why:** AH-01~05와 실제 profile/runner/skill에 맞게 현행 지침을 바꾼다. 아래는 핵심 문구의 제안 diff이며 전체 적용 범위는 §3·Task 4를 따른다. 이 계획 작성 중에는 적용하지 않는다. - -```diff -- CRITICAL: 새 기능 또는 동작 변경은 테스트를 먼저 작성하고 실패를 확인한 뒤 구현한다. -- CRITICAL: C++ production file을 바꿀 때는 관련 C++ test file이 있어야 한다. -+ 동작 추가·수정은 해당 동작을 확인하는 테스트로 검증한다. 버그는 가능한 경우 실패를 재현한 뒤 최소 수정한다. -+ 기존 coverage가 충분한 rename·refactor나 문서 수정에는 형식적인 새 테스트를 요구하지 않는다. -``` - -```diff -- Codex custom agent의 `model_reasoning_effort`는 `xhigh`이며, 모델과 역할별 설정은 [.codex/agents](.codex/agents)의 현재 profile을 따른다. -+ 일반 specialist의 기본 추론 강도는 `medium`, 정식화·수치·물리 검토는 `high`다. 모델과 역할별 설정은 [.codex/agents](.codex/agents)의 현재 profile을 따른다. -``` - -```diff -- 기능 개발은 아래 `Agent/Skill Workflow`의 9개 정규 stage를 순서대로 통과한다. -+ 메인 assistant가 범위를 파악하고 필요한 전문 작업만 위임하며 구현·검증·결과 확인을 조정한다. -+ 수식·요소·재료·적분·상태 갱신 변경의 독립 numerical review와 필요한 analytical/invariant·reference 검증은 유지한다. -+ 변경 중에는 관련 검사를, 솔버 기능 완료 시에는 구성된 전체 build/test와 필수 reference 비교를 한 번 수행한다. 이후 변경·실패가 없으면 반복하지 않는다. -``` - -```diff -- python scripts/execute.py -+ python scripts/execute.py -``` - -새 CLI 한 줄 교체만으로 완료하지 않는다. 기존 phase 인자·push·sandbox·hook 설명을 §5에 맞게 함께 갱신하고, 관리 문서 표에서 신규 `coordination.md` 요구를 제거하여 PRD checklist로 연결한다. - -## 9. 최종 산출물과 완료 기준 - -- 요청된 문서 10개의 검토 가능한 diff와 ADR-028의 명확한 대체 관계. -- 현재 역할·skill·CLI·설정·검증 시점이 일치하고 폐기 기능을 현행 필수 절차로 요구하지 않음. -- FESA 제품·수치·입출력·코딩 계약과 필요한 독립 검증이 보존됨. -- 상대 링크·소스 대조·diff/공백 검사를 정적으로 확인하고, 과거 evidence와 현재 미실행 항목을 구분해 보고함. -- 사용자 구현 변경·테스트·개인 설정·기존 phase/Feature 이력은 보존됨. 저장소 전체 검증 완료나 commit/push 완료로 확대하여 보고하지 않음. diff --git a/docs/superpowers/plans/2026-09-08-agent-harness-guidance-followup.md b/docs/superpowers/plans/2026-09-08-agent-harness-guidance-followup.md deleted file mode 100644 index ab33d5c..0000000 --- a/docs/superpowers/plans/2026-09-08-agent-harness-guidance-followup.md +++ /dev/null @@ -1,203 +0,0 @@ -# Agent·Harness 경량화 문서 정합성 분석 및 보완 계획 - -> **For agentic workers:** 후속 문서 반영에는 `superpowers:executing-plans`를 적용한다. 메인이 직접 수행하며 task별 agent·reviewer 호출, solver stage 순회, 자동 commit을 추가하지 않는다. - -**Goal:** 경량화된 실제 운영과 네 공통 문서의 일치 여부를 확인하고, 기존 작업 재개와 검증 범위를 오해할 수 있는 부분만 보완한다. - -**Architecture:** 현재 profile·skill·runner를 공통 문서와 대조한다. 운영 정책의 원본은 ADR, 실행 책임은 ARCHITECTURE, 행동 지침은 AGENTS에 두며 제품·수치 acceptance는 PRD에 유지한다. - -**Tech Stack:** 한국어 Markdown, Git·파일·소스 정적 검토. 설명 대상은 Python Harness와 MSVC x64 Debug CMake/CTest이다. - -**Spec:** 2026-09-08 사용자 요청(네 문서 분석 및 보완 계획), [ADR-028](../../ADR.md#adr-028), [직전 갱신 계획](2026-09-07-agent-harness-documentation-update.md). - -작성 기준: `2395b05`와 현재 worktree. 상태: **계획안 — 대상 문서 변경·구현·테스트 실행 미승인/미실행**. 이번 요청은 이 분석·계획 파일 작성까지이며 후속 실행을 뜻하지 않는다. 직전 계획의 분석은 변경 전 기준이므로 현재 평가로 재사용하지 않는다. - -## Global Constraints - -- 이번 산출물은 이 파일 하나다. 기존 미커밋 문서·phase 변경 16개를 보존한다. -- 후속 문서 반영 범위는 `AGENTS.md`, `docs/ADR.md`, `docs/ARCHITECTURE.md`다. `docs/PRD.md`는 검토 후 유지한다. -- `.agents`, `.codex`, `scripts`, `tests`, config, 기존 Feature·phase·hook 이력은 이 문서 보완 작업에서 수정하지 않는다. -- FESA의 MSVC x64 Debug CMake/CTest, Abaqus 입력 subset, HDF5 결과, source identity, tolerance, 결정론과 state/output 보존 계약은 유지한다. -- 기존 사용자 요구와 Feature별 필수 검증·명시 요청된 감사는 운영 경량화만으로 취소하지 않는다. -- 문서 작업은 정적 검토로 확인한다. pytest, Harness, CMake/CTest, 수동 hook, 외부 solver를 실행하지 않는다. -- 계획·과거 기록을 일괄 수정하거나 승인·통과·현재 evidence로 소급 표시하지 않는다. Commit/push는 이 계획의 작업에 포함하지 않는다. - -## 1. 분석 결론 - -**네 문서는 전반적으로 현재 변경에 적합하다. 전면 개정이나 추가 agent 제거는 필요하지 않다.** - -| 대상 | 판정 | 확인 근거와 최소 조치 | -| --- | --- | --- | -| [AGENTS.md](../../../AGENTS.md) | 적합, 재개·검증 안내 보완 | 7개 specialist의 조건부 호출, medium/high, 인자 없는 runner, hook/자동 Git 제거, 문서 정적 검토를 반영했다. 기존 작업 재개의 운영/계약 구분과 Python 검사 범위를 짧게 보완한다. | -| [docs/ADR.md](../../ADR.md) | 적합, ADR-028 해석 보완 | ADR-012·024~027에 대체 안내가 있고 머리말도 옛 본문을 이력으로 명시한다. ADR-028에 기존 Feature 재개 시 유지할 승인 요구와 폐기된 실행 방식의 관계만 설명한다. | -| [docs/ARCHITECTURE.md](../../ARCHITECTURE.md) | 적합, 검증 책임 보완 | Runtime/운영 분리와 main/specialist/runner/adapter 책임이 현재 코드에 맞는다. 구성된 CTest와 Harness 자체 Python 회귀 검사의 범위를 명시한다. | -| [docs/PRD.md](../../PRD.md) | 적합, 수정 불필요 | GEN-010·011·012, 조건부 전문 작업, 필요한 독립 numerical review, 기능 완료 시 전체 검증, 요청된 release 감사가 현행 지침과 일치한다. CLI·timeout·테스트 파일 현황을 제품 PRD에 추가하지 않는다. | - -### 확인된 일치 사항 - -- `.codex/agents/*.toml`은 7개다. 일반 역할은 `medium`, formulation/numerical/physics는 `high`다. Implementation profile의 모델은 `gpt-5.6-terra`다. -- `.codex/config.toml`, `.codex/hooks.json`, `scripts/hooks/pre_tool_use.py`, `scripts/hooks/stop_validation.py`, `scripts/msvc_harness/tdd_policy.py`는 없다. -- [runner](../../../scripts/execute.py)는 config → discovery → toolchain → adapter → process만 호출하고 phase 인자·내부 LLM·Git·자동 retry를 구현하지 않는다. -- [config](../../../scripts/msvc_harness/config.py)는 legacy `tdd`를 경고 후 무시하지만 경로·허용 field·preset 조합 검사는 유지한다. “느슨하게”는 모든 validation 제거를 뜻하지 않는다. -- [process](../../../scripts/msvc_harness/process.py)는 backend 실패, deadline, MSVC 확인과 CTest 0개 거부를 유지한다. 문서와 동일하다. -- 현재 preset 이름과 AGENTS의 네 CMake/CTest 명령은 [CMakePresets.json](../../../CMakePresets.json), [CMake adapter](../../../scripts/msvc_harness/adapters/cmake.py)에 대응한다. 실제 build 성공을 확인한 것은 아니다. -- 네 문서의 로컬 Markdown 링크 대상 경로 67건을 확인했고 누락은 없었다. Fragment 전체의 자동 검증은 수행하지 않았으며 주요 `adr-028` anchor는 직접 확인했다. - -## 2. 부족한 부분과 영향 - -### F1. 기존 Feature 재개 시 운영 절차와 승인 요구의 구분이 덜 명확하다 — 문서 보완 - -공통 문서는 checklist를 Feature PRD에 두고 coordination/phase를 이력으로 보존하라고 이미 정한다. [Feature 문서 관리](../../FEATURE_DOCUMENTATION.md)의 `시작과 참조`에도 기존 파일을 자동 이동·복제하지 않는 규칙이 있다. 따라서 기본 정책 누락은 아니다. - -그러나 현재 [MITC4 FEATURED_AGENTS](../../mitc4-shell-feast-eigen/FEATURED_AGENTS.md):4~7·14·23~24와 [Feature PRD](../../mitc4-shell-feast-eigen/PRD.md):4~16은 삭제된 coordinator, 9개 stage, coordination 상태 원본을 현재 절차 또는 과거 사용자 요구로 함께 표현한다. 두 파일은 사용자 미커밋 변경이 있는 실제 재개 입력이다. - -영향: 다음 작업자가 삭제된 profile/phase runner를 재가동하려 하거나, 반대로 옛 문서를 통째로 이력 처리하여 승인된 acceptance·명시 요청된 감사까지 빠뜨릴 수 있다. - -보완: ADR-028에 **운영 방식은 현행 규칙, 승인된 제품·검증 요구는 관련 Feature 계약**이라는 적용 방법을 추가한다. 재개가 실제로 요청되면 현재 할 일과 근거 링크만 PRD checklist로 정리한다. 기존 phase payload/status를 새 runner 입력으로 변환하거나 완료로 표시하지 않는다. 특정 Feature의 상태를 이번 공통 문서 작업에서 대신 수정하지 않는다. - -### F2. Python 회귀 테스트가 제거된 운영 기능을 아직 요구한다 — 구현 후속 필요 - -정적 근거: - -- [test_agent_skill_workflow_contract.py](../../../tests/test_agent_skill_workflow_contract.py):15~27은 11개 profile을 기대하고, :349의 검사는 고정 9단계 workflow, :396은 `xhigh`를 요구한다. -- [test_hook_validation_scope.py](../../../tests/test_hook_validation_scope.py):4와 [test_harness_timeouts.py](../../../tests/test_harness_timeouts.py):10은 삭제된 hook 모듈을 import한다. -- [test_execute.py](../../../tests/test_execute.py):62 등은 더 이상 없는 `StepExecutor`를 사용한다. [ownership tests](../../../tests/test_execute_ownership.py)도 이 executor와 과거 자동 Git 계약을 전제로 한다. -- [pytest.ini](../../../pytest.ini)는 `tests`를 수집한다. [CMake test registration](../../../tests/CMakeLists.txt):179·185·191은 GoogleTest discovery이며 현재 구성은 이 Python suite를 등록하지 않는다. - -따라서 문서의 pytest 명령 자체가 잘못된 것은 아니지만 현재 테스트 내용이 새 구현에 맞지 않는다. pytest 설치만으로 정합성이 해결된다고 볼 수 없다. 이는 직전 계획의 별도 후속 항목에도 기록된 미해결 문제이며 이번에 실행 실패 건수를 측정한 것은 아니다. - -보완: AGENTS와 ARCHITECTURE에 **구성된 solver build/test 성공과 Harness 구현의 Python 회귀 검증은 별개**임을 간단히 명시한다. 일시적인 실패 목록은 루트 운영 규칙에 누적하지 않고 이 분석의 후속 항목으로 둔다. 테스트를 통과시키기 위해 문서를 11개 agent/9단계로 되돌려서는 안 된다. - -### 수정 사유로 삼지 않을 관찰 - -- ADR-012·024~027의 옛 Coordinator/Hook/owned_paths 문구는 명시적으로 이력이다. 본문 삭제·일괄 치환·새 `Accepted` 표시는 불필요하다. -- CLI deadline은 [execute.py](../../../scripts/execute.py):23의 **1,800초**다. [models.py](../../../scripts/msvc_harness/models.py):65와 [process.py](../../../scripts/msvc_harness/process.py):66의 **7,200초**는 현재 브랜치에 남은 내부 기본값이다. CLI가 전달하는 deadline과 `min(command timeout, remaining)` 때문에 [HARNESS](../../HARNESS.md)의 1,800초 설명은 맞다. 문서를 7,200초로 바꾸거나 이번에 상수를 통일하지 않는다. -- Release profile이 없어도 [release skill](../../../.codex/skills/fem-release-readiness/SKILL.md)은 명시 요청된 감사를 수행할 수 있다. “profile 삭제”와 “이미 요청한 감사 취소”는 다르다. -- 전문 책임을 유지한 PRD·ARCHITECTURE의 Numerical Review/I/O/Physics 설명은 별도 고정 stage 의무가 아니다. 실제 수치 검증을 더 완화할 근거는 없다. - -## 3. AGENTS.md Quality Report - -### Summary - -- Files found: 1 (`AGENTS.md`). 생성물·VCS·dependency를 제외한 프로젝트 범위에서 nested `AGENTS.override.md`/`AGENTS.md`는 발견되지 않았다. -- Active chain: repository root `AGENTS.md` → 현재 root 작업 디렉토리. 사용자/global 지침은 이번 파일 감사 범위 밖이다. -- Average score: **88/100 (B)**. 문서 적합성 평가이며 solver 품질 점수가 아니다. -- Files needing update: 1 (선택적·국소 보완). -- Combined active-chain size: **20,421 bytes**. 감사 기준 기본 32 KiB 대비 약 62%. 세 `docs/*.md`는 자동 로드 지침 파일 크기에 합산하지 않았다. 실제 runtime의 별도 limit override는 조사하지 않았다. - -### File-by-File Assessment - -#### 1. AGENTS.md (project root; active) - -**Score: 88/100 (Grade: B)** - -| Criterion | Score | Evidence | -| --- | ---: | --- | -| Commands and workflows | 18/20 | 새 CLI와 preset은 일치. Python suite와 configured CTest의 구분을 더 명시할 수 있음 | -| Repository map and instruction scope | 20/20 | 7개 profile·관련 skill·문서 링크가 존재하고 root 범위가 적절함 | -| Non-obvious constraints and gotchas | 15/15 | Identity·수치/물리·reference·state 보존과 preset 묶음 설정을 구체적으로 유지 | -| Conciseness and duplication | 10/15 | 기술 제약은 유용하나 여러 운영 문서와 역할·검증 설명을 반복함; 이번에는 전면 축약하지 않음 | -| Currency against the codebase | 13/15 | 실행기/profile의 경량화는 반영. 구형 테스트 및 재개 입력과의 접점에 보완 여지가 있음 | -| Actionability and verifiability | 12/15 | 명령·완료 기준은 구체적. 기존 작업을 현행 운영으로 이어가는 해석을 더 명시할 수 있음 | - -**Issues:** F1의 재개 해석과 F2의 검증 범위 구분. 삭제된 agent를 신규 필수 역할로 요구하는 문제는 이미 해결됐다. - -**Recommended changes:** 아래 AGENTS 제안 문구만 추가한다. 미해결 테스트 목록, 새 gate·hash·retry budget과 solver 진행 상태를 루트에 넣지 않는다. - -## 4. 제안 diff - -아래 diff는 검토용이며 아직 적용하지 않았다. 현재 문서의 구성과 인접 문장을 유지한다. - -### Update: AGENTS.md - -**Why:** 기존 Feature 재개 시 상세 적용 규칙을 ADR-028로 연결하고 Python 검사와 solver runner의 범위를 구분한다. - -```diff - - 기존 `coordination.md`, `docs/features//`와 phase 자료는 이력으로 보존하고 필요한 경로·계약 revision을 참조한다. 자동 이동·복제하거나 신규 coordination 상태 파일을 만들지 않는다. -+- 기존 Feature 재개 시 운영 절차와 승인된 요구사항을 구분하여 [ADR-028](docs/ADR.md#adr-028)을 적용한다. 현재 할 일과 근거 링크만 Feature PRD의 checklist에 정리한다. -``` - -`### Harness Python 검증`의 명령 설명 바로 뒤: - -```diff -+이 Python suite는 Harness 구현을 검증한다. 현재 CMake/CTest 구성은 이를 실행하지 않으므로 -+`python scripts/execute.py`의 성공을 Python 회귀 검사 통과로 보고하지 않는다. -``` - -### Update: docs/ADR.md - -**Why:** ADR-028의 운영 경량화를 기존 계약·사용자 요구의 자동 취소로 해석하지 않도록 적용 방법을 명시한다. 새 정책·새 ADR 번호·새 승인 사실은 만들지 않는다. - -ADR-028의 결정 목록 뒤, `이 결정은 ADR-012·024~027...` 문단 앞에 추가: - -```diff -+기존 Feature를 재개할 때 삭제된 profile·phase 실행 절차에는 이 결정을 적용하고, -+승인된 제품 범위·수치 계약·필수 검증과 명시 요청된 감사는 해당 Feature 계약으로 유지한다. -+메인은 남은 작업과 기존 근거 링크만 Feature PRD의 현재 checklist에 정리한다. -+과거 coordination·phase·실패 기록을 재작성하거나 새 runner 입력으로 변환하지 않는다. -+운영 전환만으로 기존 evidence가 새로 검증되었거나 실제 blocker가 해결되었다고 표시하지 않는다. -``` - -### Update: docs/ARCHITECTURE.md - -**Why:** Runner가 소유한 configured backend 검증과 개발 도구 자체의 회귀 검사 책임을 구분한다. 실제 CMake adapter/CTest 등록과 일치하는 설명이다. - -`개발 운영 인프라`의 owner 표 다음에 추가: - -```diff -+구성된 solver build/test와 Harness 구현의 Python 회귀 검증은 별도 범위다. -+현재 CMake adapter와 CTest 등록은 Harness Python suite를 실행하지 않는다. -+Harness 동작 변경의 Python 검사는 구현 담당자가 변경 영향에 맞게 별도로 수행하며, -+Runner 성공을 미실행한 Python 검사나 reference 비교의 통과로 확장하지 않는다. -``` - -### Update: docs/PRD.md - -**Why:** 현재 제품·완료 기준이 경량화와 일치하므로 **제안 diff 없음**. GEN ID·acceptance·수치 검증·reference 정책을 유지한다. - -## 5. 후속 문서 반영 작업 - -### Task 1: 기존 Feature 재개 안내 보완 - -**Files:** Modify `docs/ADR.md`, `AGENTS.md`. Read-only `docs/FEATURE_DOCUMENTATION.md`, 관련 기존 Feature PRD·FEATURED_AGENTS. - -**입출력:** ADR-028과 기존 승인 요구를 입력으로 사용하고, §4의 두 재개 안내를 산출한다. - -- [ ] 최신 worktree에서 해당 절과 사용자 변경 여부를 확인한다. 기존 Feature 원문은 수정하지 않는다. -- [ ] ADR-028에 §4의 5문장 적용 설명을 추가한다. 과거 결정 본문·상태·승인 근거는 유지한다. -- [ ] AGENTS에 ADR-028 링크와 PRD checklist 안내 1개 bullet을 추가한다. -- [ ] 정적으로 대조한다: 삭제된 profile 호출·phase 실행 없음, 기존 acceptance·명시 감사 유지, history 수정 없음, 미해결 blocker의 임의 해소 없음. - -### Task 2: 검증 범위 명시 및 네 문서 최종 대조 - -**Files:** Modify `AGENTS.md`, `docs/ARCHITECTURE.md`. Read-only `docs/PRD.md`, `scripts/execute.py`, `scripts/msvc_harness/adapters/cmake.py`, `tests/CMakeLists.txt`. - -**입출력:** 현재 backend 명령·CTest 등록을 입력으로 사용하고, §4의 검증 범위 문구와 정적 확인 결과를 산출한다. - -- [ ] AGENTS·ARCHITECTURE에 §4의 Python/solver 검증 구분을 추가한다. -- [ ] PRD의 GEN-010·011·012와 `검증과 완료 기준`이 유지됨을 확인한다. PRD에 변경을 만들지 않는다. -- [ ] `git diff --check -- AGENTS.md docs/ADR.md docs/ARCHITECTURE.md docs/PRD.md`로 whitespace를 확인한다. -- [ ] `git diff --stat -- AGENTS.md docs/ADR.md docs/ARCHITECTURE.md docs/PRD.md` 및 실제 diff를 확인한다. 추가가 위 제안 범위이고 PRD diff가 없어야 한다. -- [ ] AGENTS의 링크 대상·`adr-028` anchor·파일 크기를 다시 확인한다. 누락 링크나 새 자동 로드 지침 파일을 만들지 않는다. -- [ ] 실행하지 않은 build/test는 미실행으로 보고하고 문서 정합성 확인과 구분한다. Commit·Feature 실행은 하지 않는다. - -완료 기준: F1/F2의 안내가 적용되고, 네 문서의 나머지 계약과 기존 사용자 변경이 보존되며, 새 lifecycle·승인 gate·반복 전체 검증이 추가되지 않는다. - -## 6. 별도 후속 범위: Python 테스트 정비와 실제 Feature 재개 - -이 항목들은 이번 문서 계획의 실행 작업에 포함하지 않는다. 문서 수정만으로 해결되었다고 보고할 수 없다. - -| 후속 작업 | 범위·방법 | 완료 시 확인할 결과 | -| --- | --- | --- | -| Harness Python 테스트 정비 | `tests/test_execute.py`, `tests/test_execute_ownership.py`, `tests/test_hook_validation_scope.py`, `tests/test_harness_timeouts.py`, `tests/test_agent_skill_workflow_contract.py`의 구형 동작 기대를 현행 계약과 분류한다. 새 runner의 CLI/exit, config/preset, deadline, 실패 중단, 결과 검사와 자동 Git/phase 변경 부재를 동작 중심으로 검증하도록 별도 구현 계획을 세운다. 유효한 backend coverage를 blanket 삭제·skip하지 않는다. | 필요한 실패 재현과 수정 후 Python suite의 실제 결과. 7개 agent·medium/high를 유지하고 삭제된 hook/StepExecutor를 되살리지 않음. 문서 문자열 일치만으로 동작 검증을 대신하지 않음 | -| 진행 중 Feature 재개 | 해당 작업이 요청되면 현재 PRD/FEATURED_AGENTS의 운영 안내만 최소 갱신하고 남은 승인 작업을 checklist로 연결한다. 기존 계약·실패·차단 사유를 먼저 확인한다. | 현행 runner로 가능한 검증과 별도 구현/수치/reference 작업이 구분되고, 과거 stage 상태나 report만으로 완료를 선언하지 않음 | - -내부 7,200초 기본값과 CLI 1,800초의 차이는 필요하다면 테스트 정비에서 명시적으로 검증한다. 이 계획은 timeout 변경·새 설정 필드 도입을 승인하지 않는다. - -## 7. 이번 분석의 검증 범위 - -수행: Git 상태·이력, profile/skill/runner/config/adapter와 관련 테스트 소스 대조, 네 문서 읽기, 링크 대상 존재·AGENTS 크기 확인. Python은 파일을 읽는 정적 점검에만 사용했다. - -미실행: pytest collection/실행, Harness, CMake/CTest, 수치/reference 비교. 문서 분석 요청이므로 수행하지 않았고 통과로 보고하지 않는다. 사용자 전역 설정·외부 설치 환경·실행 중 agent profile 반영 여부는 감사 범위 밖이다. - -적용 여부는 이 계획 검토 후 정한다. 현재는 계획 파일만 작성했으며 대상 네 문서는 변경하지 않았다. diff --git a/docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md b/docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md deleted file mode 100644 index ac400f9..0000000 --- a/docs/superpowers/specs/2026-08-08-linear-static-3d-euler-beam-design.md +++ /dev/null @@ -1,624 +0,0 @@ -# Linear Static 3D Euler Beam End-to-End Design - -## Metadata - -- feature_id: `linear-static-3d-euler-beam` -- phase_name: `linear-static-3d-euler-beam` -- status: `approved` -- approved_by: user -- approved_on: `2026-08-08` -- amended_on: `2026-08-18` -- source_formulation: `docs/linear-static-3d-euler-beam/formulation.md` -- reference_baseline: exact read-only artifacts under `reference/cantilever beam/` -- implementation_environment: C++17, MSVC, CMake, CTest, GoogleTest, Intel oneMKL, Intel oneTBB, HDF5 - -2026-08-18 amendment: the former node-station projection and mixed absolute-floor tolerance are -superseded by the direct element-endpoint identity and common family-scale row/RMS policy in -`2026-08-17-common-reference-tolerance-design.md` and ADR-022. - -## 1. 목적 - -이 설계는 Abaqus `.inp` keyword subset을 읽어 2절점 3차원 -Euler–Bernoulli beam의 단일 선형 정적 step을 해석하고, 변위·반력·요소 내력·축응력을 -authoritative HDF5 파일 `results.h5`에 기록하는 FESA V0 파이프라인을 정의한다. - -런타임 순서는 다음과 같이 고정한다. - -```text -.inp 입력 --> Domain 생성 --> 현재 step의 AnalysisModel 생성 --> DofManager 및 sparse pattern 생성 --> 요소강성 계산과 전역강성 조립 --> free/constrained partition --> MKL PARDISO factorization --> 전체 하중벡터 조립과 effective RHS 생성 --> PARDISO substitution --> 전체 변위벡터 복구 --> 반력·요소 내력·요소 축응력 복구 --> results.h5 기록 --> 정상 종료 -``` - -## 2. 범위 - -### 2.1 포함 범위 - -- 입력 파일당 하나의 `*STEP, *STATIC` -- small displacement, small rotation, 선형 탄성 해석 -- 2절점 직선 3D Euler–Bernoulli beam -- 절점당 자유도 `[UX, UY, UZ, URX, URY, URZ]` -- 축, 두 방향 굽힘, Saint-Venant 비틀림 -- nodal concentrated load와 prescribed displacement -- formulation의 constant local line-load equivalent nodal vector kernel -- nonzero prescribed displacement를 포함한 자유/구속 partition -- deterministic COO-to-CSR sparse assembly -- MKL PARDISO factorization과 substitution의 분리 -- oneTBB 기반 element-local 계산 -- 변위, 반력, equilibrium end action, section resultant, axial `S11` 출력 -- 승인된 `reference/cantilever beam/` B33 bundle의 변위·반력·section resultant comparison - -### 2.2 제외 범위 - -- Abaqus full compatibility -- Abaqus B31/Timoshenko beam -- 다중 analysis step과 step 간 load/BC propagation -- instance translation/rotation, nested assembly, dependent/independent mesh 차이 -- `I12 != 0`, taper, offset, release, curved beam, warping -- distributed load용 Abaqus `*DLOAD` 입력과 Domain load object 생성 -- 기하·재료비선형, dynamics, contact, thermal effects -- transverse shear stress와 torsional shear stress recovery -- beam stress에 대한 Abaqus reference comparison -- reference artifact의 자동 생성, 수정 또는 Abaqus 실행 - -## 3. Phase 구성 - -단일 Harness task `linear-static-3d-euler-beam`은 다음 29개 step으로 구성한다. -각 step은 하나의 gate 또는 하나의 C++ 모듈만 소유한다. - -### 3.1 문서 및 계약 gate - -| Step | Name | Primary output | -| ---: | --- | --- | -| 0 | `requirements-baseline` | `docs/linear-static-3d-euler-beam/requirements.md` | -| 1 | `research-evidence` | `docs/linear-static-3d-euler-beam/research.md` | -| 2 | `formulation-alignment` | `docs/linear-static-3d-euler-beam/formulation.md` | -| 3 | `numerical-review` | `docs/linear-static-3d-euler-beam/numerical-review.md` | -| 4 | `io-contract` | `docs/linear-static-3d-euler-beam/io.md` | -| 5 | `reference-model-contract` | `docs/linear-static-3d-euler-beam/reference-model.md` | -| 6 | `implementation-plan` | `docs/linear-static-3d-euler-beam/implementation-plan.md` | - -### 3.2 C++ TDD 구현 - -| Step | Name | Module responsibility | -| ---: | --- | --- | -| 7 | `cmake-test-foundation` | CMake, GoogleTest, CTest, dependency discovery | -| 8 | `core-diagnostics` | IDs, source locations, diagnostics, status | -| 9 | `dense-math-adapters` | MKL BLAS `Matrix` and `Vector` | -| 10 | `domain-model` | Immutable model definitions and source identities | -| 11 | `inp-syntax-parser` | Keyword/data/comment lexical and syntax parsing | -| 12 | `inp-domain-mapping` | Part/Assembly/Instance semantic mapping | -| 13 | `analysis-model` | Active single-step views into Domain | -| 14 | `dof-manager` | DOFs, constraints, numbering, sparse pattern | -| 15 | `analysis-state` | Displacement, forces, residual, step/frame state | -| 16 | `euler-beam-element` | B33 element stiffness, transformation, load/recovery kernels | -| 17 | `parallel-for-tbb` | oneTBB adapter for deterministic element-local work | -| 18 | `sparse-assembly` | COO contribution collection and CSR finalization | -| 19 | `essential-constraints` | Matrix partition and full/reduced vector mapping | -| 20 | `mkl-pardiso-solver` | PARDISO adapter, factorization, substitution, diagnostics | -| 21 | `load-assembly` | Nodal load vector and prescribed-displacement RHS | -| 22 | `result-recovery` | Reactions, end actions, resultants, axial stress | -| 23 | `hdf5-results-writer` | Versioned HDF5 schema and atomic finalization | -| 24 | `linear-static-cli` | Analysis orchestration and `fesa.exe` entry point | - -### 3.3 최종 gate - -| Step | Name | Primary output | -| ---: | --- | --- | -| 25 | `build-test-verification` | `docs/linear-static-3d-euler-beam/build-test.md` | -| 26 | `reference-verification` | `docs/linear-static-3d-euler-beam/reference-comparison.md` | -| 27 | `physics-sanity` | `docs/linear-static-3d-euler-beam/physics-evaluation.md` | -| 28 | `release-readiness` | `docs/linear-static-3d-euler-beam/release.md` | - -## 4. 아키텍처와 소유권 - -### 4.1 Domain 계층 - -`Domain`은 parser가 만든 전체 모델을 소유하며 parsing 이후 가능한 한 불변으로 -취급한다. 최소 semantic object는 다음과 같다. - -- `Node` -- `EulerBeam3DDefinition` -- `LinearElasticMaterial` -- `GeneralBeamSection` -- `NodeSet`, `ElementSet` -- `BoundaryCondition`, `NodalLoad` -- `StaticStepDefinition` - -Part 내부 source label은 변경하지 않는다. 외부 identity는 -`SourceEntityId { instance_name, source_label }`로 유지하고, Domain은 별도의 stable -internal index를 부여한다. 같은 part의 여러 identity instance는 허용하지만 instance -transform data가 있으면 입력 오류로 처리한다. - -### 4.2 AnalysisModel - -`AnalysisModel`은 단일 static step에 활성화된 element, load, boundary condition, -material, section의 ID/reference view를 제공한다. Domain 객체를 복사하거나 수정하지 -않는다. 두 번째 `*STEP`은 V0 unsupported diagnostic을 발생시킨다. - -### 4.3 DofManager - -`DofManager`만 다음 정보를 소유한다. - -- node별 6개 DOF 정의 -- full DOF index -- constrained/free mapping -- free equation numbering -- element scatter map -- sparse matrix pattern -- full/reduced vector reconstruction - -Node와 Element에는 equation ID를 저장하지 않는다. - -### 4.4 AnalysisState - -`AnalysisState`는 다음 해석 중 상태를 소유한다. - -- full displacement -- external force -- internal force -- residual -- constrained reaction -- current step/frame identity -- element recovery rows - -V0에서는 velocity, acceleration, temperature, iteration history를 할당하지 않는다. - -### 4.5 요소 계약 - -`EulerBeam3D`는 -`docs/linear-static-3d-euler-beam/formulation.md`의 부호, DOF 순서, -2점 Gauss rule, transformation을 따른다. 구현 API는 다음 책임을 분리한다. - -```cpp -Matrix localStiffness() const; -Matrix globalStiffness() const; -Vector localEquivalentLoad(const ConstantLocalLineLoad& load) const; -BeamRecovery recover(const Vector& globalElementDisplacement) const; -``` - -요소는 equation ID를 소유하지 않는다. `BeamRecovery`는 endpoint equilibrium end -action, endpoint section resultant, Gauss-point generalized strain/resultant, section-point -`S11`을 구분한다. `localEquivalentLoad`는 정식화의 constant local line-load vector를 -검증하기 위한 element kernel이지만 V0 `.inp` parser는 `*DLOAD`를 생성하지 않으므로 -CLI 해석에서는 호출되지 않는다. - -### 4.6 LinearSolver 계약 - -Solver core에는 MKL 타입을 노출하지 않는다. - -```cpp -class LinearSolver { -public: - virtual ~LinearSolver() = default; - virtual Status factorize(const SparseMatrix& matrix) = 0; - virtual Status solve(const Vector& rhs, Vector& solution) const = 0; -}; -``` - -`MklPardisoSolver`는 factorization 상태를 소유하고 같은 matrix에 여러 RHS -substitution을 수행할 수 있다. singularity와 invalid CSR은 구조화된 diagnostic으로 -반환한다. V0는 constrained `Kff`를 real symmetric positive definite matrix로 -factorize하며, positive-definite factorization 실패를 unconstrained, singular 또는 -invalid model diagnostic으로 분류한다. - -## 5. Matrix, Vector 및 SparseMatrix - -### 5.1 Vector - -`Vector`는 연속된 `double` 데이터와 크기를 소유한다. copy/move semantics와 -bounds-checked access를 제공한다. 다음 연산은 MKL CBLAS를 사용한다. - -- copy -- `dot` -- Euclidean norm -- `scale` -- `axpy` - -### 5.2 Matrix - -`Matrix`는 연속된 row-major `double` 데이터, row count, column count를 소유한다. -copy/move semantics와 bounds-checked access를 제공한다. matrix-vector와 -matrix-matrix 연산은 `CBLAS_ROW_MAJOR`의 MKL CBLAS를 사용한다. beam의 3x3, 4x12, -12x12 dense 연산도 이 타입을 사용한다. - -MKL header와 MKL-specific type은 `.cpp` adapter 경계 밖으로 노출하지 않는다. - -### 5.3 SparseMatrix - -`SparseMatrix`는 CSR 전용 별도 타입이며 `Matrix`를 상속하지 않는다. CSR row pointer, -column index, values를 소유하고 0-based indexing을 사용한다. PARDISO adapter가 -필요한 indexing과 descriptor 변환은 adapter 내부에서 수행한다. - -## 6. 입력 계약 - -### 6.1 지원 keyword - -- `*HEADING` -- `*PART`, `*END PART` -- `*NODE` -- `*ELEMENT, TYPE=B33` -- `*NSET`, `*ELSET`, including `GENERATE` -- `*MATERIAL`, `*ELASTIC` -- `*BEAM GENERAL SECTION, SECTION=GENERAL` -- `*SECTION POINTS` -- `*ASSEMBLY`, `*END ASSEMBLY` -- `*INSTANCE`, `*END INSTANCE` -- `*BOUNDARY` -- `*CLOAD` -- `*STEP`, `*STATIC`, `*END STEP` - -Keyword와 parameter는 case-insensitive이고 label identity는 원문 값을 보존한다. -Comment line은 `**`로 시작한다. - -`*BOUNDARY`는 `target, first_dof, last_dof[, value]` 형식만 지원하고 DOF 범위는 -1부터 6까지다. value가 없으면 0으로 해석한다. `*CLOAD`는 -`target, dof, magnitude` 형식만 지원하고 DOF 범위는 1부터 6까지다. target은 source -node label 또는 node set이며 assembly-level set의 `INSTANCE` parameter를 해석한다. - -### 6.2 General beam section mapping - -`*BEAM GENERAL SECTION, SECTION=GENERAL`의 data는 -`A, I11, I12, I22, J` 순서로 읽는다. - -- `MATERIAL` parameter는 필수이며 해당 `*MATERIAL`의 isotropic `*ELASTIC` data는 - 정확히 `E, nu`를 제공해야 한다. -- `I12`는 0이어야 한다. -- Abaqus first beam section axis `n1`을 FESA local `y`로 둔다. -- `t x n1`을 FESA local `z`로 둔다. -- `Iy = I11`, `Iz = I22`로 매핑한다. -- `E`와 Poisson ratio `nu`로 `G = E / (2(1 + nu))`를 계산한다. -- `E`, `G`, `A`, `Iy`, `Iz`, `J`는 양수여야 한다. -- `coordinate_scale = max(1, norm(X1), norm(X2))`에 대해 - `L > 1e-12 * coordinate_scale`이어야 한다. -- guide vector는 0이 아니어야 하며 - `norm(a_perp) > 1e-12 * max(1, norm(a))`이어야 한다. - -이 축 계약은 Abaqus의 right-handed `(t, n1, n2)` section system 및 현재 formulation의 -`(x, y, z)` system과 일치한다. - -### 6.3 B33 의미 보존 - -Abaqus B31은 transverse shear deformation을 포함하는 Timoshenko beam이고 B33은 -2절점 cubic Euler–Bernoulli beam이다. FESA V0는 `TYPE=B33`만 Euler 요소로 매핑한다. -`TYPE=B31`은 `unsupported-element-formulation` 오류로 거부한다. -`reference/cantilever beam/cantilever beam.inp`는 `TYPE=B33`으로 생성된 승인 reference -input이다. Reference artifact check는 비교 전에 -이 element type을 다시 확인하며 B31로 되돌아간 입력이나 결과를 허용하지 않는다. - -이 결정은 [[Abaqus Structural Element Families]], [[Beam and Frame Finite Elements]], -[[Abaqus-Analysis-User-s-Guide-Volume-IV|Abaqus Analysis User's Guide Volume IV]]의 -beam-family 구분을 따른다. - -### 6.4 Instance 제한 - -- 같은 part의 여러 identity instance를 허용한다. -- instance name과 source node/element/set label을 보존한다. -- source identity를 stable Domain index로 deterministic하게 매핑한다. -- translation 또는 rotation data가 있으면 `unsupported-instance-transform` 오류를 낸다. -- nested assembly와 dependent/independent mesh semantics는 지원하지 않는다. - -### 6.5 No-op allowlist - -다음 keyword와 관련 data line은 구조화된 warning을 기록하고 해석에서는 사용하지 -않는다. - -- `*PREPRINT` -- `*RESTART` -- `*TRANSVERSE SHEAR STIFFNESS` -- `*OUTPUT, FIELD` -- `*OUTPUT, HISTORY` -- `*NODE OUTPUT` -- `*ELEMENT OUTPUT` -- `*CONTACT OUTPUT` -- 위 output request에 속한 미지원 variable data - -이 allowlist 밖의 미지원 keyword는 오류다. FESA의 기본 출력은 Abaqus output request와 -무관하게 항상 생성된다. - -## 7. 선형 정적 알고리즘 - -1. `AbaqusInputReader`가 syntax model과 source location을 만든다. -2. semantic mapper가 immutable `Domain`을 만든다. -3. `AnalysisModel`이 단일 static step의 active view를 만든다. -4. `DofManager`가 DOF, constraints, scatter map, sparse pattern을 만든다. -5. `ParallelFor`가 element-local global stiffness를 계산한다. -6. element internal index 순서로 COO contribution을 deterministic하게 reduce하고 CSR로 - finalize한다. -7. free/constrained partition으로 `Kff`, `Kfc`, `Kcf`, `Kcc`를 만든다. -8. `MklPardisoSolver::factorize(Kff)`를 호출한다. -9. nodal load를 full `F`에 조립한다. -10. `rhs = Ff - Kfc * dc`를 만든다. -11. `solve(rhs, df)`로 substitution하고 full `d`를 복구한다. -12. `Rc = Kcf * df + Kcc * dc - Fc`로 reaction을 복구한다. -13. element displacement를 gather하여 end action, section resultant, strain, `S11`을 - 복구한다. -14. `ResultsWriter`가 임시 HDF5 파일을 완성한 뒤 최종 `results.h5`로 교체한다. - -반력은 요소 끝력의 별도 합산 경로가 아니라 전체 조립 residual `K*d-F`에서 구한다. - -## 8. 결과 복구 - -### 8.1 변위와 반력 - -모든 node에 전역 성분 `[UX, UY, UZ, URX, URY, URZ]`를 기록한다. 반력은 동일한 -6성분 순서로 기록하고 free DOF의 값은 수치 residual 검사에 사용한다. - -### 8.2 요소 내력 - -다음 데이터를 서로 다른 dataset으로 유지한다. - -- equilibrium end action: `Kl*dl-fl_dist`, local `[FX,FY,FZ,MX,MY,MZ]` -- section resultant: endpoint `xi=-1,+1`의 `[N,T,My,Mz]` -- generalized strain/resultant: 두 Gauss point의 formulation 값 - -Abaqus internal-force CSV는 equilibrium end action이 아니라 section resultant와 -비교한다. 일반 component mapping은 다음과 같다. - -| Abaqus | FESA local component | -| --- | --- | -| `SF1` | `FX` / `N` | -| `SF3` | `FY` | -| `SF2` | `FZ` | -| `SM3` | `MX` / `T` | -| `SM1` | `MY` | -| `SM2` | `MZ` | - -승인된 B33 reference의 `cantilever beam elemental forces.csv`는 `Frame`, -`Part Instance Name`, `Element Label`, `Node Label`, `SF1`, `SM1`, `SM2`, `SM3`을 -기록한다. -따라서 이 파일의 comparison은 다음 규칙을 사용한다. - -- Reference row key는 `(Step-1, frame 0, instance name, source element label, - endpoint source node label, component)`다. - 단일 step invariant에 따라 CSV의 `Increment 1: Step Time = 1.000`을 - `(Step-1, frame 0)`으로 정규화한다. -- 각 B33 element에는 input connectivity의 두 source node label과 일치하는 endpoint row가 - 정확히 두 개 있어야 하며, 각 row를 해당 HDF5 element endpoint에 직접 대응한다. - Missing, extra, duplicate 또는 connectivity mismatch는 tolerance 전에 실패한다. -- Comparator는 같은 source node의 인접 endpoint를 node station으로 축약하거나 대표값을 - 선택하거나 평균하지 않는다. -- 이 bundle에서 비교하는 mapping은 `SF1 -> N`, `SM1 -> My`, `SM2 -> Mz`, - `SM3 -> T`다. CSV에 없는 `SF2`와 `SF3`는 reference comparison 대상이 아니며, - FESA equilibrium end action의 transverse force는 unit/analytical test와 physics sanity로 - 검증한다. - -### 8.3 Axial stress - -General beam section은 section point에서 axial stress만 복구한다. - -```text -S11 = E * (epsilon0 + x2*kappa1 - x1*kappa2) -``` - -FESA 좌표로는 `x1=y`, `x2=z`, `kappa1=kappa_y`, `kappa2=kappa_z`다. -`*SECTION POINTS`가 있으면 지정 순서대로 출력한다. 없으면 FESA-specific centroid -point `(0,0)`을 만들고 `source=fesa-default`로 기록한다. Stress는 두 Gauss point에서 -평가한다. Transverse shear stress와 torsional shear stress는 출력하지 않는다. - -이 계약은 [[Abaqus Beam and Shell Section Definitions]]과 -[[Abaqus-Analysis-User-s-Guide-Volume-IV|Abaqus Analysis User's Guide Volume IV]]의 -general beam section output 제한을 따른다. - -## 9. HDF5 schema v0 - -Authoritative output은 `results.h5` 하나다. 최소 schema는 다음과 같다. - -```text -/metadata -/model/nodes -/model/elements -/steps//frames/0/nodal/displacement -/steps//frames/0/nodal/reaction -/steps//frames/0/element/end_force_local -/steps//frames/0/element/section_resultant -/steps//frames/0/element/generalized_strain -/steps//frames/0/element/stress_s11 -/diagnostics -``` - -`/metadata`에는 schema version, solver version, source input identity, unit-system label, -coordinate convention, element formulation을 기록한다. Node/element group은 stable internal -ID와 instance/source label mapping을 함께 저장한다. - -Abaqus `.inp` 자체에는 단위 선언이 없으므로 일반 solver run의 unit-system label은 -`user-consistent-unspecified`로 기록하고 solver가 입력 파일만 보고 SI를 추론하지 -않는다. 승인된 cantilever B33 reference에 한해서는 이 설계와 후속 Reference Model -Contract가 입력 수치의 단위계를 SI로 선언하고, reference verification이 동일한 입력으로 -생성된 FESA 결과에 그 외부 단위 계약을 적용한다. 새 reference model도 승인된 -Reference Model Contract에 단위계를 선언한다. 선택 `metadata.json`이 존재하면 그 -단위 선언을 read-only 보조 자료로 계약과 대조한다. - -- displacement: `[node_count, 6]` -- reaction: `[node_count, 6]` -- end force: `[element_count, 2, 6]` -- section resultant: `[element_count, 2, 4]`, `xi={-1,+1}` -- generalized strain: `[element_count, 2, 4]`, two Gauss points -- stress: flat row identity with element, Gauss point, section point, `(x1,x2)`, `S11` - -HDF5 API는 `Hdf5ResultsWriter` implementation 밖으로 노출하지 않는다. Writer failure 시 -불완전한 최종 `results.h5`를 남기지 않는다. - -## 10. CLI와 diagnostics - -```powershell -fesa.exe --output -``` - -`--output`을 생략하면 현재 작업 디렉터리에 `results.h5`를 생성한다. - -| Exit code | Meaning | -| ---: | --- | -| 0 | success | -| 2 | CLI usage error | -| 3 | input syntax or semantic mapping error | -| 4 | model validation error | -| 5 | factorization or substitution error | -| 6 | HDF5 output error | - -각 diagnostic은 `severity`, `code`, `file`, `line`, `keyword`, `entity_identity`, -`message`를 가진다. CLI는 오류 diagnostic을 stderr에 deterministic한 순서로 출력한다. - -## 11. TDD와 검증 - -### 11.1 C++ step 규칙 - -각 production C++ step은 다음 순서를 같은 step 안에서 증명한다. - -1. GoogleTest 작성 -2. 관련 test target 실행과 요구사항을 재현하는 RED 실패 확인 -3. 최소 production 구현 -4. 관련 CTest GREEN 확인 -5. 전체 MSVC x64 Debug build와 CTest VERIFY - -새 경고를 허용하지 않으며 FESA target에만 MSVC `/W4 /WX`를 적용한다. Third-party -GoogleTest target에는 FESA warning policy를 강제하지 않는다. - -### 11.2 테스트 포트폴리오 - -- Matrix/Vector ownership, bounds, dimension mismatch, BLAS result checks -- parser case-insensitivity, comments, set generation, wrapper nesting, allowlist diagnostics -- B31 rejection, B33 acceptance, instance transform rejection, unknown keyword rejection -- Domain duplicate label와 dangling reference validation -- AnalysisModel active view와 Domain non-copy/non-mutation 검사 -- DofManager numbering, constraints, scatter map, full/reduced reconstruction -- Hermite interpolation, B matrix, 2-point Gauss vs closed-form stiffness -- symmetry, rank 6, six rigid modes, positive deformation energy -- local/global transform orthogonality와 energy invariance -- deterministic parallel COO reduction과 CSR structure -- nonzero prescribed displacement와 reaction recovery -- PARDISO factorization/substitution 분리, repeated RHS, singular diagnostic -- axial, torsion, y/z bending cantilever analytical cases -- HDF5 schema, identity, component, metadata, atomic finalization -- CLI `.inp -> results.h5` integration -- 승인된 B33 CSV header/Frame 정규화와 element-endpoint direct identity 검사 -- zero 및 near-zero reference row를 포함한 공통 family-scale 상대오차/RMS 검사 - -### 11.3 수치 tolerance - -| Check | Criterion | -| --- | --- | -| matrix symmetry and Gauss/closed-form comparison | normalized `1e-12` | -| rigid-mode and linear-system residual | normalized `1e-10` | -| analytical solution tests | relative `1e-9` | -| Abaqus reference row relative error | `0.05` | -| near-zero threshold ratio | reference family scale의 `0.01` | -| reference family scale-relative RMS | `0.01` | - -Reference row 판정은 같은 model, step/frame, quantity, component로 구성한 reference -family별 공통 규칙을 사용한다. Reference 값으로만 family scale을 계산한다. - -```text -S = max(abs(reference_value_i)) -near_zero_i = abs(reference_value_i) <= 0.01 * S -row_pass_i = abs(fesa_value_i - reference_value_i) / abs(reference_value_i) <= 0.05 - if not near_zero_i -row_pass_i = abs(fesa_value_i - reference_value_i) <= 0.01 * S - if near_zero_i -relative_rms = sqrt(mean((fesa_value_i - reference_value_i)^2)) / S -family_pass = all(row_pass_i) and relative_rms <= 0.01 -``` - -- Family는 displacement, rotation, force, moment 및 각 component를 섞지 않는다. -- Scale은 read-only Abaqus reference 값만 사용하며 FESA 결과로 조정하지 않는다. -- `S == 0`이면 모든 FESA 값이 정확히 0일 때만 통과한다. 하나라도 0이 아니면 - `zero-reference-scale-nonzero-error`로 실패한다. -- 모든 row를 개별 판정하며 reference 값을 zero-clamp하거나 row를 제거하지 않는다. -- Missing/extra row, nonfinite value, schema 또는 identity mismatch는 tolerance 계산 전에 - 실패한다. -- Report는 family scale, max absolute error, max row relative error, scale-relative RMS, - worst row/component와 판정 reason을 기록한다. 독립적인 absolute-error gate는 없다. - -### 11.4 공통 build/test command - -GoogleTest checkout은 `C:/git/googletest`에 있고 승인 당시 revision은 -`04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4`다. 절대경로를 production CMake에 -하드코딩하지 않고 cache variable로 전달한다. - -```powershell -cmake -S . -B .harness/build -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" - -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -``` - -CTest discovery 결과는 한 개 이상의 test를 포함해야 한다. - -## 12. Reference 및 release gate - -`reference/cantilever beam/`을 V0의 승인된 Abaqus B33 reference baseline으로 사용한다. -논리 model ID는 `cantilever-beam-b33`이다. 기존 `abaqus-cae-report-csv-v0`과 source -commit `2b34d0b` 기록은 2026-08-09 당시 inventory의 역사적 provenance이며, 2026-08-18 -regenerated elemental-force CSV의 현재 readiness gate가 아니다. Input header가 기록한 -generator는 `Abaqus/CAE Learning Edition 2024`다. 모델은 SI 단위계, global -Cartesian nodal output, beam local section-force output, `Step-1`, increment 1, -step time 1.0 계약으로 해석한다. - -| Purpose | Approved artifact | -| --- | --- | -| analysis input | `reference/cantilever beam/cantilever beam.inp` | -| displacement | `reference/cantilever beam/cantilever beam displacements.csv` | -| reaction | `reference/cantilever beam/cantilever beam reactions.csv` | -| section resultant | `reference/cantilever beam/cantilever beam elemental forces.csv` | -| stress | N/A: beam stress reference comparison은 승인 범위에서 제외 | - -이 기존 bundle의 space-containing filename과 CAE report header는 승인된 legacy alias로 -그대로 지원하며 reference artifact를 rename하거나 rewrite하지 않는다. `README.md`는 이 -baseline에 한해서 N/A다. `metadata.json`은 프로젝트 전역에서 선택 artifact이며 이 -bundle에는 존재하지 않는다. 이 설계와 Step 5의 Reference Model Contract가 model ID, -provenance, units, coordinate system, schema, file inventory, tolerance와 stress N/A 사유를 -기록한다. 이후 추가하는 reference model에는 canonical artifact 이름과 `README.md`를 -요구하며, 선택 `metadata.json`이 존재하면 계약과 대조한다. - -Reference verification은 build/test gate 통과 후 승인 input으로 FESA `results.h5`를 -생성하고 다음을 직접 비교한다. - -- nodal displacement: CSV `U1/U2/U3/UR1/UR2/UR3`과 HDF5 displacement -- nodal reaction: CSV `RF1/RF2/RF3/RM1/RM2/RM3`과 HDF5 reaction -- section resultant: CSV `SF1/SM1/SM2/SM3`과 element label 및 endpoint node label로 - 직접 대응한 HDF5 section resultant -- stress: 명시적 N/A - -Artifact check는 네 파일의 존재, B33 element type, expected header, 유일한 row key, -finite value를 확인한다. 하나라도 충족하지 않으면 `needs-reference-artifacts` 또는 -`schema-mismatch`로 분류하고 comparison을 시작하지 않는다. `metadata.json` 부재는 모든 -bundle에서 허용되며, 현재 baseline의 `README.md` 부재도 승인된 legacy 예외로 차단하지 -않는다. - -Agent와 Harness는 Abaqus를 실행하거나 reference artifact를 생성·수정하지 않는다. - -Reference comparison이 pass한 뒤에만 physics sanity를 수행한다. Physics sanity는 -global force/moment equilibrium, reaction sign, displacement direction, symmetry, element -section-force consistency, normalized residual을 검사한다. Release readiness는 모든 이전 -gate evidence와 known limitations를 확인한다. - -## 13. 완료 조건 - -다음 조건을 모두 만족해야 phase를 완료할 수 있다. - -1. 요구조건, 연구, 정식화, 수치 검토, I/O, reference model, 구현 계획 문서가 승인 - 상태다. -2. 모든 production C++ 변경에 대응 테스트와 RED/GREEN/VERIFY evidence가 있다. -3. MSVC x64 Debug configure, build, CTest discovery, 전체 CTest가 성공한다. -4. `fesa.exe`가 승인된 B33 single-step input에서 `results.h5`를 생성한다. -5. HDF5 변위·반력·내력 rows가 승인된 cantilever B33 reference CSV와 component-scale - 혼합 tolerance 안에서 일치한다. -6. Beam stress reference comparison은 명시적 N/A이고 stress output schema/test는 - 통과한다. -7. Physics sanity가 pass한다. -8. Release report에 지원 subset과 모든 V0 제한사항이 기록된다. diff --git a/docs/superpowers/specs/2026-08-10-core-documentation-extension-playbook-design.md b/docs/superpowers/specs/2026-08-10-core-documentation-extension-playbook-design.md deleted file mode 100644 index 181477a..0000000 --- a/docs/superpowers/specs/2026-08-10-core-documentation-extension-playbook-design.md +++ /dev/null @@ -1,46 +0,0 @@ -# FESA Core Documentation Extension Playbook Design - -## 목적 - -`AGENTS.md`, `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`를 현재 구현에 맞게 보강한다. 작업 완료 이력이나 일시적인 테스트 개수 대신, 다음 기능을 추가할 AI Agent가 바로 사용할 수 있는 해석 흐름, 소유권, 빌드 설정, 수치 불변식, 확장 경계를 기록한다. - -## 문서별 책임 - -- `AGENTS.md`: FESA의 배경과 목적, 전체 프로젝트에서 훼손하면 안 되는 개발 원칙, 문서 탐색 순서와 기능 확장 시의 판단 기준을 제공한다. 상세 구현·빌드 매뉴얼의 대체물이 아니다. -- `docs/PRD.md`: 사용자가 관찰하는 제품 흐름, 구현된 V0 지원 경계, 신규 기능이 제품 기능으로 인정되기 위한 조건을 정의한다. -- `docs/ARCHITECTURE.md`: 실제 모듈과 target, 객체 소유권, 8단계 해석 수명주기, CMake dependency/runtime graph, 기능 유형별 확장 지점을 설명한다. -- `docs/ADR.md`: 정규화된 외부 의존성, 결정론적·failure-atomic 경계, 구속 제거와 full residual, 계층형 검증을 장기 결정으로 남긴다. - -## 기록할 구현 사실 - -1. 입력은 syntax parse와 semantic mapping을 거쳐 불변 `Domain`이 되고, `AnalysisModel`은 이를 복사하지 않는 view이다. -2. `Analysis::run()`은 initialize, model view, DOF/pattern, stiffness/partition, factorization, load/effective RHS, solve/reconstruct, recovery/write 순서를 고정한다. -3. `DofManager`가 full/free/constrained numbering과 0-based CSR pattern을 단독 소유하며, Node/Element에는 equation ID를 저장하지 않는다. -4. assembly는 element-local buffer, stable COO order, serial ordered reduction으로 결정론적 CSR을 만든다. global sparse storage를 병렬로 직접 갱신하지 않는다. -5. essential constraints는 full K를 `Kff/Kfc/Kcf/Kcc`로 분할하고 `Ff - Kfc*dc`를 푼다. fully constrained 0x0 `Kff`도 유효하다. -6. reaction/equilibrium evidence는 full residual `K*d - F`를 사용한다. constrained 성분은 physical reaction이고 free 성분은 equilibrium residual이다. -7. 외부 API는 `LinearSolver`, `ParallelFor`, `ResultsWriter`와 math adapter 뒤에 둔다. public header에 MKL/TBB/HDF5/Win32 type을 노출하지 않는다. -8. HDF5 writer는 같은 directory의 temporary file, checked close/reopen self-check, atomic finalization을 사용한다. -9. element end action, section resultant, generalized result, stress identity와 sign convention을 섞지 않으며 station mismatch를 평균내지 않는다. - -## 빌드 및 검증 설계 - -- direct build는 Visual Studio generator, x64, Debug를 명시한다. 상세 target graph와 runtime 설명은 `docs/ARCHITECTURE.md`에 두고, `AGENTS.md`에는 최소 검증 진입점만 둔다. -- `FESA_GTEST_SOURCE_DIR`는 필수 local source path이다. `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`는 설치 환경에서 package discovery가 되지 않으면 명시한다. -- production은 `Fesa::MKL`, `Fesa::TBB`, `Fesa::HDF5` normalized target만 사용한다. -- Windows에서는 CLI와 GoogleTest discovery 전에 MKL/TBB/HDF5 및 transitive oneAPI runtime DLL이 executable 옆에 staging되어야 한다. -- 문서 작업 검증은 project hook/Harness를 실행하지 않고 `git diff --check`, 링크·경로·명령·target 이름의 정적 대조로 제한한다. - -## 기능 확장 플레이북 - -- 새 element: 요구조건/정식화/I/O mapping을 먼저 고정하고 kernel, model mapping, DOF pattern, assembly, recovery, output, reference/physics evidence를 함께 확장한다. -- 새 load/constraint: semantic target identity, stable source order, full-space vector/matrix, partition/effective RHS, diagnostics와 output을 함께 검토한다. -- 새 analysis procedure: 기존 V0 lifecycle을 조용히 변경하지 않고 별도 orchestration/state/equation 계약과 gate를 정의한다. -- 새 numerical backend: public interface를 유지하고 adapter 내부에만 vendor API, lifecycle, runtime dependency를 격리한다. -- 새 output/reference quantity: mandatory HDF5 schema, units/coordinates/identity, recovery sign, comparison projection과 tolerance를 동시에 정의한다. - -## 범위 제한 - -- phase 완료 이력, commit hash, 현재 테스트 총개수 같은 일시적 사실을 핵심 문서에 넣지 않는다. -- full Abaqus compatibility, B31 지원, transform/nested assembly, distributed-load parser exposure 등 승인되지 않은 범위를 암시하지 않는다. -- 문서 보강 외 production, test, CMake, reference artifact를 수정하지 않는다. diff --git a/docs/superpowers/specs/2026-08-12-harness-agent-step-execution-design.md b/docs/superpowers/specs/2026-08-12-harness-agent-step-execution-design.md deleted file mode 100644 index 96e84a0..0000000 --- a/docs/superpowers/specs/2026-08-12-harness-agent-step-execution-design.md +++ /dev/null @@ -1,129 +0,0 @@ -# Harness Agent Step Execution Design - -## Status - -- date: `2026-08-12` -- status: `approved-approach-awaiting-written-spec-review` -- approved_approach: `executor-centered-single-path` -- scope: Implementation Planning Agent, Implementation Agent, Harness workflow guidance - -## Purpose - -FESA implementation work shall use one explicit Harness execution path. The -Implementation Planning Agent converts an approved implementation plan into -self-contained phase Steps after user approval. The Step Executor selects and runs -those Steps sequentially. The Implementation Agent executes only the current Step and -does not independently expand its scope to the remaining implementation plan. - -## Required Reading - -Both the Implementation Planning Agent and Implementation Agent shall read these -documents before Harness planning or execution: - -- `AGENTS.md` -- `.agents/skills/harness/SKILL.md` -- `docs/HARNESS.md` -- `docs/HARNESS_WORKFLOW.md` -- `docs/SOLVER_AGENT_DESIGN.md` -- the approved feature implementation plan and applicable upstream feature contracts - -The agents shall also inspect `.codex/hooks.json`, `.harness/config.json` when present, -and the relevant `phases/` indexes and Step file for execution work. - -## Planning Contract - -The Implementation Planning Agent shall: - -1. prepare a multi-Step draft from approved upstream contracts; -2. keep one layer or module in each self-contained Step; -3. include required-reading paths, RED/GREEN/VERIFY work, exact acceptance commands, - status rules, and concrete prohibitions; -4. obtain explicit user approval before creating or updating `phases/` planning files; -5. create only `phases/index.json`, `phases//index.json`, and approved - `phases//stepN.md` files; -6. never run `scripts/execute.py` merely because a plan or phase draft is ready. - -Harness execution requires a separate explicit user request. - -## Execution Contract - -After an explicit Harness execution request, `scripts/execute.py ` is the -single phase runner. It owns branch selection, first-pending-Step selection, Step -session creation, retries, timestamps, commit separation, next-Step advancement, and -top-level phase completion. - -The Implementation Agent shall: - -1. require an approved implementation plan and materialized phase files; -2. execute only the current `stepN.md` selected and supplied by the Executor; -3. read the Step prerequisites and relevant previous-Step summaries before editing; -4. complete RED, observed expected failure, minimal GREEN, focused VERIFY, and the - Step's full acceptance commands within the same Step; -5. avoid starting a later pending Step or performing unlisted implementation-plan - work; -6. update only the current Step's Codex-owned status fields: - - success: `status=completed` plus one-line `summary`; - - after the allowed failed correction attempts: `status=error` plus - `error_message`; - - user intervention required: `status=blocked` plus `blocked_reason`, then stop; -7. leave `started_at`, `completed_at`, `failed_at`, `blocked_at`, task timestamps, - next-Step selection, and top-level phase status to the Executor. - -If approved phase files are absent or the supplied Step conflicts with an approved -upstream contract, the Implementation Agent shall not fall back to the broad plan. It -shall report `needs-upstream-decision` or `blocked` through the documented handoff. - -## Hooks and Scripts - -`.codex/hooks.json` is the authoritative hook registration used during Harness Step -sessions: - -- PreToolUse calls `scripts/hooks/pre_tool_use.py` to reject dangerous commands and - enforce the related-test-file guardrail for C++ production edits. -- Stop calls `scripts/hooks/stop_validation.py` to run the discovered whole-project - MSVC build/test validation before a Step may end. - -These hooks run automatically through Codex hook registration. Agents shall inspect -the registration and comply with hook outcomes, but shall not manually invoke the -hook Python entry points as a substitute for actual tool interception or Stop. -PreToolUse is not proof that RED occurred; the Implementation Agent must execute and -record the Step's RED and GREEN commands itself. - -The approved script boundary is: - -- `scripts/execute.py`: phase runner; run only after a separate explicit user request; -- Step acceptance commands: run by the Implementation Agent as written, resolving - `.harness/config.json` first and otherwise using documented Harness defaults; -- `uv run --with pytest python -m pytest -v -rs`: additionally required only when - Harness Python, hook, runner, or Agent/Skill configuration behavior is changed. - -## Files to Align - -The implementation will make surgical changes to: - -- `.codex/agents/implementation-planning-agent.toml` -- `.codex/agents/implementation-agent.toml` -- `.agents/skills/harness/SKILL.md` -- `.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` -- `docs/SOLVER_AGENT_DESIGN.md` -- `docs/implementation-plans/README.md` - -`docs/HARNESS.md` and `docs/HARNESS_WORKFLOW.md` already document the runner, hooks, -validation, retry, and state lifecycle. They become mandatory references rather than -being duplicated in full in every Agent or Skill instruction. - -## Validation - -The change is complete when: - -- both Agent TOML files parse; -- the changed skills pass `quick_validate.py`; -- both agents explicitly require `docs/HARNESS.md` and - `docs/HARNESS_WORKFLOW.md`; -- the Implementation Agent explicitly follows only the Executor-selected current - Step and respects Executor-owned fields; -- hook behavior and `scripts/execute.py` authorization are consistent across the - Agent, Skill, and guide documents; -- Harness Python tests pass because hook/Agent/Skill behavior is in scope; -- no phase execution, C++ implementation, reference mutation, or Abaqus execution - occurs as part of this policy edit. diff --git a/docs/superpowers/specs/2026-08-12-independent-reference-validation-policy-design.md b/docs/superpowers/specs/2026-08-12-independent-reference-validation-policy-design.md deleted file mode 100644 index bfde27e..0000000 --- a/docs/superpowers/specs/2026-08-12-independent-reference-validation-policy-design.md +++ /dev/null @@ -1,190 +0,0 @@ -# Independent Reference Validation Policy Design - -## Status - -- date: `2026-08-12` -- amended_on: `2026-08-18` -- status: `approved` -- scope: FESA project policy, agents, skills, and `linear-static-mitc4-shell` upstream contracts -- implementation_code: out of scope -- reference_artifact_mutation: prohibited - -2026-08-18 amendment: the former MITC4 fixed absolute tolerance is superseded by the common -family-scale row/RMS policy in `2026-08-17-common-reference-tolerance-design.md` and ADR-022. -The independent-solver, minimal-reference-case and drilling decisions remain unchanged. - -## Decision - -FESA is an independent finite element solver. It accepts an approved subset of the -Abaqus `.inp` syntax, but it does not reproduce or claim equivalence with Abaqus -element formulations, integration rules, stabilization, internal state, or result -generation procedures. Abaqus CSV values are external numerical reference values. -Exact equality is allowed but is neither required nor evidence of identical internal -behavior. - -A feature passes reference verification when FESA solves the declared input and its -required comparison quantities satisfy the feature-approved tolerance. Reference -artifact governance that does not participate in that comparison must not block -implementation planning or verification. - -## Minimal Reference Case Contract - -A reference case requires only: - -- the declared `.inp` file used by both solvers; -- the declared Abaqus CSV file for each blocking or warning-only quantity; -- the FESA `results.h5` produced from that `.inp`; -- a deterministic mapping of the compared source identity and components; -- the approved tolerance. - -The following are not readiness requirements: - -- canonical directory or filename conventions; -- legacy-alias approval; -- bundle `README.md`; -- `metadata.json`; -- Abaqus version or generation provenance; -- duplicated unit, coordinate, model, step, final-frame, material, thickness, or - element-type metadata; -- a reference CSV schema version. - -Reference paths and filenames are consumed as declared without rename or repair. -Reference artifacts remain read-only. A comparator must still reject ambiguous or -unsafe comparisons: missing files, missing required source IDs/components, duplicate -IDs, unmatched required rows, and nonfinite values. This is an executable matching -contract, not a metadata or bundle-governance contract. - -For a feature with one supported static step and one final frame, the input/CSV pair -implicitly identifies that result state. Model properties and source element types are -read from the `.inp` rather than copied into another metadata file. - -## Reference Model Phase - -The Reference Model phase remains in the workflow as a lightweight reference-case -inventory. It records: - -- the purpose of each existing case; -- exact input and required CSV paths; -- blocking and warning-only quantities; -- FESA HDF5 projection and source-ID/component matching; -- the approved tolerance; -- whether the required files are present and readable. - -It does not design a broad benchmark portfolio unless the feature requirements -explicitly request one. It does not gate on naming, README, metadata, provenance, or -duplicated descriptive fields. - -## MITC4 Reference Acceptance - -Both source element types map to the same internal `FESA-MITC4` formulation, but the -2026-08-13 feature-scope amendment uses only the full-integration S4 case for Abaqus -acceptance comparison: - -- `reference/shell/shell.inp` and `reference/shell/shell displacements.csv` cover - source `S4`; -- source `S4R` is covered by parser/common-kernel/deterministic-assembly/HDF5 metadata - tests without consuming an Abaqus S4R artifact. - -Only matched global `U1/U2/U3` rows are blocking. `UR1/UR2/UR3` rows are compared and -reported as warning-only evidence. Reactions and stresses may be inspected but are not -reference pass/fail quantities. - -The project-wide common policy now evaluates each matched U/UR component family: - -```text -S = max(abs(reference_value_i)) -near_zero_i = abs(reference_value_i) <= 0.01 * S -ordinary_row_pass_i = abs(error_i) / abs(reference_value_i) <= 0.05 -near_zero_row_pass_i = abs(error_i) <= 0.01 * S -relative_rms = sqrt(mean(error_i^2)) / S <= 0.01 -``` - -The scale is computed from read-only reference values in the same model, step/frame, -quantity and component family. If `S == 0`, only exact-zero FESA values pass; otherwise -the reason is `zero-reference-scale-nonzero-error`. There is no independent absolute-error -gate. Values are not zero-clamped. Missing, duplicate, unmatched, or nonfinite required -rows fail before numeric tolerance evaluation. U tolerance failure fails reference -verification; UR tolerance exceedance emits a deterministic warning only. B33 uses the -same row and family-RMS thresholds. - -No additional locking, convergence, distorted, curved, director-angle, or invalid -geometry reference portfolio is required for this MITC4 implementation acceptance. -The previously open `NR-O03` and `NR-O04` calibration/inspection requirements are -removed from the feature gate. - -## MITC4 Drilling Boundary - -Drilling calibration is excluded, but a fixed numerical stabilization remains required -to make the external six-DOF shell system solvable. The feature does not implement a -physical drilling strain or accept director-parallel nodal moments. - -Use one element-level scalar computed from the positive diagonal entries of the -physical rotational stiffness block: - -```text -k_d = 1e-3 * min(K_phys[i,i] | i is a physical rotational DOF and K_phys[i,i] > 0) -K_drill_local = k_d * I4 -K_drill_global = T_d^T * K_drill_local * T_d -``` - -Restricting the minimum to rotational entries preserves the `force*length` dimension. -The literal minimum over mixed translational and rotational diagonals is not approved. -The stabilization must be finite, symmetric, positive, deterministic, and excluded -from physical generalized strain, resultant, and stress recovery. - -The following are out of scope: - -- reference-family selection and `rho_d` normalization; -- coefficient sweeps, stable plateaus, rank/conditioning calibration, and adjacent - decade sensitivity; -- drilling-to-physical energy thresholds or warning policies; -- mandatory drilling stiffness, ratio, or energy result datasets. - -Basic unit tests may verify construction, symmetry, positivity, deterministic behavior, -and removal of the four nonphysical drilling null modes. Current reference cases contain -no drilling-direction load; their blocking safeguard against unacceptable physical -response contamination is the approved U comparison. - -## Numerical Review Boundary - -Numerical Review decides whether the documented formulation is internally complete and -consistent enough to plan implementation. It must not fail because a later Reference -Model document, canonical bundle, README, metadata, provenance, extended benchmark -portfolio, or comparison result is absent. - -For MITC4: - -- fixed drilling stabilization closes `NR-O01` and removes `NR-O02` by scope; -- `NR-O03` and `NR-O04` are removed from the approved verification scope; -- the common family-scale row/RMS policy closes the blocking part of `NR-O05`; -- missing heavyweight reference metadata is `not-required-by-policy`; -- confirmed formulation defects remain blocking. - -## Agent and Skill Workflow - -Requirement, I/O, Reference Model, Reference Verification, Coordinator, Implementation -Planning, Physics Evaluation, and Release instructions must use the minimal reference -case contract. Numerical Review must remain independent of later artifact governance. - -Implementation Planning must use the project-local `harness` skill when the user asks -for an implementation plan. It must: - -1. prepare a multi-Step draft with one layer or module per Step; -2. make each Step self-contained for an independent Codex execution; -3. include prerequisite documents, TDD RED/GREEN/VERIFY work, exact MSVC/CMake/CTest - acceptance commands, and specific prohibitions; -4. request user approval for the Step draft; -5. only after approval create or update `phases/index.json`, - `phases//index.json`, and `phases//stepN.md`; -6. leave Harness execution to an explicit subsequent user request. - -## Scope Preservation - -- Do not modify files under `reference/`. -- Do not run Abaqus or another reference solver. -- Do not add C++ MITC4 implementation in this policy-alignment change. -- Keep the future geometric-nonlinear residual/tangent derivation documentation, but do - not authorize nonlinear product execution. -- Historical research evidence may retain its original cautions. Current requirements, - formulation decisions, I/O contracts, and the latest numerical review must clearly - identify the approved policy that supersedes earlier recommendations. diff --git a/docs/superpowers/specs/2026-08-15-agent-skill-workflow-consolidation-design.md b/docs/superpowers/specs/2026-08-15-agent-skill-workflow-consolidation-design.md deleted file mode 100644 index 03ed122..0000000 --- a/docs/superpowers/specs/2026-08-15-agent-skill-workflow-consolidation-design.md +++ /dev/null @@ -1,276 +0,0 @@ -# FESA Agent/Skill 개발 프로세스 통합 설계 - -## Metadata - -- date: 2026-08-15 -- status: approved-design -- scope: FESA 개발 workflow, custom agent, project-local skill, agent 산출물 배치 - -## 목표 - -FESA 기능 개발 workflow를 요구사항 단위로 단순화한다. 중복된 agent와 skill을 실제로 -병합하고, `coordinator-agent`를 유일한 main agent로 두며, 모든 단계별 산출물을 -`docs//`에 모은다. - -이 변경은 개발 운영 계약만 바꾼다. Solver C++ 구현, CMake/CTest target, Harness executor, -hook 동작, Abaqus reference artifact와 승인된 FEM 기능 계약은 변경하지 않는다. - -## 핵심 결정 - -1. 기존 reference model 계약 준비 단계는 Numerical Review 단계에 병합한다. -2. 기존 Build/Test와 Reference Comparison 단계는 C++ Implementation 단계에 병합한다. -3. 병합된 단계의 agent와 skill도 각각 하나로 병합한다. -4. Agent 수를 줄이되 build/test와 reference comparison 증거 문서는 별도로 유지한다. -5. 모든 agent 산출물은 `docs//` 아래에 둔다. -6. `coordinator-agent`는 main agent이고 나머지 agent는 Coordinator가 호출하는 sub-agent다. -7. `correction-agent`는 정규 단계가 아니라 반복되거나 원인이 불명확한 실패를 다루는 - 재작업 sub-agent로 유지한다. - -## 단순화된 개발 프로세스 - -| 단계 | 담당 sub-agent | 필수 skill | 산출물 | -| --- | --- | --- | --- | -| 1. 요구조건 | `requirement-agent` | `fesa-requirements-baseline` | `requirements.md` | -| 2. 연구 | `research-agent` | `fesa-research-evidence`, 필요 시 `fem-theory-query` | `research.md` | -| 3. 정식화 | `formulation-agent` | `fesa-formulation-spec` | `formulation.md` | -| 4. 수치 검토 + reference model 계약 | `numerical-review-agent` | 확장된 `fesa-numerical-review` | `numerical-review.md`, `reference-model.md` | -| 5. I/O 정의 | `io-definition-agent` | `fesa-io-contract` | `io.md` | -| 6. 구현 계획 + C++ 구현 + build/test + reference comparison | `implementation-planning-agent`, `implementation-agent` | 확장된 `fesa-cpp-msvc-tdd`와 계획 시 project-local `harness` | `implementation-plan.md`, `implementation-report.md`, `build-test.md`, `reference-comparison.md` | -| 7. 물리 검토 | `physics-evaluation-agent` | `fesa-physics-sanity` | `physics-evaluation.md` | -| 8. 배포 준비 | `release-agent` | `fesa-release-readiness` | `release.md` | - -`coordinator-agent`는 위 단계 밖에서 전체 workflow와 handoff를 관리하고 -`coordination.md`를 소유한다. `correction-agent`는 Coordinator가 재작업을 요청할 때만 -`corrections.md`에 원인, 수정, 재검증 결과를 추가한다. - -## Agent 통합 - -### Numerical Review 통합 - -`reference-model-agent`의 책임을 `numerical-review-agent`에 흡수하고 -`.codex/agents/reference-model-agent.toml`을 제거한다. - -병합된 Numerical Review Agent는 다음 두 판단을 함께 소유한다. - -- 정식화의 차원, 부호, 좌표 변환, Jacobian, 적분, locking, rigid-body mode와 검증 준비도 -- 기존 reference input/CSV의 존재, 비교량, blocking/warning 정책, source identity/component, - row precheck와 승인된 tolerance - -기존 Reference Model Agent가 I/O 문서를 입력으로 요구하던 순환 의존성은 제거한다. -`reference-model.md`는 exact input/CSV, 비교량, source identity/component와 tolerance를 -확정한다. 다음 I/O 단계가 이를 소비해 `io.md`에서 최종 HDF5 dataset projection과 CSV -column mapping을 정의한다. - -### Implementation 통합 - -`build-test-executor-agent`와 `reference-verification-agent`의 책임을 -`implementation-agent`에 흡수하고 다음 파일을 제거한다. - -- `.codex/agents/build-test-executor-agent.toml` -- `.codex/agents/reference-verification-agent.toml` - -병합된 Implementation Agent는 한 단계 안에서 다음 순서를 완료한다. - -```text -RED -> observed failure -> minimal GREEN -> focused VERIFY - -> full MSVC x64 Debug build/CTest -> reference artifact check - -> blocking/warning reference comparison -> report -``` - -하나의 agent가 수행하더라도 증거는 다음 세 문서로 분리한다. - -- `implementation-report.md`: 구현 범위, RED/GREEN/VERIFY, 코드 변경과 traceability -- `build-test.md`: 환경, 명령, exit code, 실패 분류와 CTest 결과 -- `reference-comparison.md`: artifact inventory, row identity, tolerance와 quantity별 결과 - -Implementation 단계의 최종 성공 상태는 `pass-for-physics-evaluation`이다. Compile, link, -ordinary test 또는 명확한 implementation-owned mismatch는 Implementation Agent가 먼저 -수정한다. 같은 failure classification이 반복되거나 원인이 불명확하면 Coordinator가 -`correction-agent`를 호출한다. - -## Skill 통합 - -### Numerical Review skill - -`fesa-reference-models`의 reference inventory, comparison scope, identity, row precheck, -tolerance와 handoff 계약을 `fesa-numerical-review`에 흡수한다. 다음 디렉터리를 제거한다. - -- `.codex/skills/fesa-reference-models/` - -확장된 `fesa-numerical-review`는 `numerical-review.md`와 `reference-model.md`를 모두 -산출하고 I/O Definition Agent에 두 문서를 handoff한다. - -### C++ TDD skill - -`fesa-reference-comparison`의 `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`, deterministic -row matching, nonfinite/누락/추가/중복 row rejection과 tolerance 적용 계약을 -`fesa-cpp-msvc-tdd`에 흡수한다. 다음 디렉터리를 제거한다. - -- `.codex/skills/fesa-reference-comparison/` - -확장된 `fesa-cpp-msvc-tdd`는 구현 계획, TDD 구현, MSVC build/CTest, failure correction과 -reference comparison을 하나의 구현 단계 절차로 정의한다. Project-local `harness`의 계획 -승인, phase materialization, executor와 hook 계약은 변경하지 않는다. - -통합 후 FESA workflow skill은 다음 8개다. - -- `fesa-requirements-baseline` -- `fesa-research-evidence` -- `fesa-formulation-spec` -- `fesa-numerical-review` -- `fesa-io-contract` -- `fesa-cpp-msvc-tdd` -- `fesa-physics-sanity` -- `fesa-release-readiness` - -`fem-theory-query`와 project-local `harness`, `review`는 별도 보조 skill로 유지한다. - -## Agent 계층과 Coordinator Orchestration - -통합 후 `.codex/agents/`에는 main agent 1개와 sub-agent 10개가 남는다. - -- main: `coordinator-agent` -- sub-agents: `requirement-agent`, `research-agent`, `formulation-agent`, - `numerical-review-agent`, `io-definition-agent`, `implementation-planning-agent`, - `implementation-agent`, `correction-agent`, `physics-evaluation-agent`, `release-agent` - -Coordinator는 다음 순서로 동작한다. - -```text -INTAKE -> STATE AUDIT -> WORKLIST UPDATE -> SUB-AGENT DISPATCH - -> EVIDENCE CHECK -> GATE DECISION -> STATUS REPORT -``` - -Coordinator는 한 번에 다음 유효 단계의 owner만 호출한다. Sub-agent는 전달받은 단계와 -산출물만 처리하고 peer agent를 직접 호출하거나 다음 단계로 진행하지 않는다. 완료 후 -산출물 경로, status, 핵심 evidence, blocker를 Coordinator에 반환한다. - -`docs//coordination.md`는 다음 정보를 중심으로 작성한다. - -- feature scope와 현재 목표 -- 8단계 worklist -- 단계별 owner, 상태, 산출물 경로와 완료 evidence -- 현재 실행 중인 sub-agent와 다음 handoff -- blocker, 사용자 결정과 failure classification -- correction attempt count와 반복 실패 stop condition -- gate transition decision log와 최종 workflow closure - -Worklist 항목 상태는 `pending | in-progress | passed | needs-rework | blocked`만 사용한다. -동일 failure classification이 두 번 반복되면 자동 재작업을 중단하고 전체 workflow를 -`needs-user-decision` 또는 `blocked`로 전환한다. - -## Gate 계약 - -1. Requirements gate: `requirements.md`가 승인된 범위, acceptance criteria, 검증량과 - tolerance를 가진다. -2. Research gate: `research.md`가 필요한 이론과 검증 evidence를 제공한다. -3. Formulation gate: `formulation.md`가 구현 가능한 수치 계약을 제공한다. -4. Numerical/reference gate: `numerical-review.md`와 `reference-model.md`가 모두 통과한다. -5. I/O gate: `io.md`가 reference identity를 authoritative HDF5 dataset과 연결한다. -6. Implementation gate: 구현 계획, RED/GREEN evidence, MSVC build/CTest와 blocking reference - comparison이 모두 통과한다. -7. Physics gate: `physics-evaluation.md`가 `pass-for-release-agent`다. -8. Release gate: `release.md`가 `ready-for-release`이고 Coordinator가 closure를 기록한다. - -## 요구사항 단위 산출물 구조 - -```text -docs// -├── coordination.md -├── requirements.md -├── research.md -├── formulation.md -├── numerical-review.md -├── reference-model.md -├── io.md -├── implementation-plan.md -├── implementation-report.md -├── build-test.md -├── reference-comparison.md -├── corrections.md -├── physics-evaluation.md -└── release.md -``` - -산출물이 필요하지 않았거나 기존 workflow에서 생성되지 않은 경우 빈 placeholder 문서를 -만들지 않는다. `corrections.md`는 실제 correction이 발생할 때만 생성한다. - -## 기존 문서 마이그레이션 - -현재 agent별 폴더의 기능 문서를 다음 두 요구사항 폴더로 이동한다. - -- `docs/linear-static-3d-euler-beam/` -- `docs/linear-static-mitc4-shell/` - -파일 내용과 당시 `owner_agent`, status, numerical verdict는 역사적 evidence이므로 바꾸지 -않는다. 내부 문서 경로만 새 위치로 갱신한다. 삭제된 agent 이름이 기존 evidence의 -소유자로 기록된 경우도 그대로 보존한다. - -기존 `docs/requirements/`, `docs/research/`, `docs/formulations/`, -`docs/numerical-reviews/`, `docs/io-definitions/`, `docs/reference-models/`, -`docs/implementation-plans/`, `docs/build-test-reports/`, `docs/corrections/`, -`docs/reference-verifications/`, `docs/physics-evaluations/`, `docs/releases/`, -`docs/coordination/`의 기능 문서와 필요한 내부 링크를 옮긴 뒤 agent별 README는 제거한다. -공통 운영 계약은 `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, -`docs/SOLVER_SKILL_DESIGN.md`에 통합한다. - -기존 두 기능은 `ready-for-release` evidence를 가지고 있으므로 새 `coordination.md`에서 -`completed`로 inventory한다. 누락된 과거 산출물을 새 문서로 꾸미거나 새 workflow를 -소급 실행하지 않는다. - -다음 항목은 이동하거나 변경하지 않는다. - -- `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md` -- `docs/reference-papers/`와 기타 공통 기술 문서 -- `reference/` 아래의 Abaqus input/CSV artifact -- `phases/`의 실행 상태와 Harness 실행 결과 본문. 이동된 문서를 가리키는 path reference만 - 기계적으로 갱신할 수 있다. -- Solver C++ source, tests, CMake/CTest configuration - -## 문서와 참조 갱신 - -현재 실행 계약에서는 제거된 agent/skill과 기존 agent별 산출물 경로를 사용하지 않는다. -다음 파일군을 새 workflow와 `docs//` 경로로 갱신한다. - -- `AGENTS.md` -- `.codex/agents/*.toml` -- `.codex/skills/*/SKILL.md`와 대상 `agents/openai.yaml` -- `docs/SOLVER_AGENT_DESIGN.md` -- `docs/SOLVER_SKILL_DESIGN.md` -- 이동한 기능 문서의 내부 링크 -- 기존 경로를 입력으로 사용하는 관련 계획, spec, phase 문서 - -역사적 산출물 본문에 기록된 과거 agent 이름과 status는 stale reference 검사 대상에서 -제외하지만, 새 입력 경로를 가리키는 링크는 유효해야 한다. - -## 검증 전략 - -`tests/test_agent_skill_workflow_contract.py`를 추가해 다음 정적 계약을 검증한다. - -- 남은 agent 파일 집합이 main 1개와 sub-agent 10개인지 확인 -- 제거 대상 agent 3개와 skill 2개가 존재하지 않는지 확인 -- Coordinator가 main 역할과 `docs//coordination.md` worklist를 정의하는지 확인 -- 모든 다른 agent가 sub-agent 역할과 Coordinator handoff를 정의하는지 확인 -- 병합 대상 skill의 핵심 workflow와 output contract가 destination skill에 존재하는지 확인 -- 현재 실행 계약에 제거된 agent/skill 이름이나 기존 agent별 출력 경로가 없는지 확인 -- 모든 TOML이 parse되고 각 skill의 frontmatter와 UI metadata가 유효한지 확인 - -검증 명령은 다음과 같다. - -```powershell -uv run --with pytest python -m pytest -v -rs -python /scripts/quick_validate.py .codex/skills/ -git diff --check -``` - -`quick_validate.py`는 남아 있는 project-local skill 각각에 실행한다. 이번 변경은 C++ -production과 CMake/CTest를 수정하지 않으므로 MSVC build와 CTest는 필수 검증 범위가 아니다. - -## 완료 기준 - -- 8단계 workflow가 `AGENTS.md`, agent config와 설계 문서에서 동일하다. -- 삭제 대상 agent와 skill이 제거되고 모든 책임과 quality gate가 destination에 보존된다. -- `coordinator-agent`가 main agent로서 sub-agent dispatch와 worklist 갱신을 소유한다. -- 모든 새 산출물 경로가 `docs//` 규칙을 따른다. -- 기존 기능 문서가 새 폴더에 모이고 역사적 verdict가 보존된다. -- 자동 계약 테스트, 전체 Python pytest, skill validation과 `git diff --check`가 통과한다. diff --git a/docs/superpowers/specs/2026-08-16-cpp-object-oriented-modular-refactoring-design.md b/docs/superpowers/specs/2026-08-16-cpp-object-oriented-modular-refactoring-design.md deleted file mode 100644 index d770d03..0000000 --- a/docs/superpowers/specs/2026-08-16-cpp-object-oriented-modular-refactoring-design.md +++ /dev/null @@ -1,355 +0,0 @@ -# FESA C++ Object-Oriented Modular Refactoring Design - -## 상태 - -- 설계 대화 승인: 2026-08-16 -- 서면 spec 리뷰: 승인 완료 (2026-08-16) -- 구현 상태: not-started - -## 목적 - -현재 B33 Euler beam, MITC4 shell과 linear static solver의 수치 및 외부 동작을 -유지하면서 C++ production code를 객체 책임 중심으로 재구성한다. 이번 리팩터링은 -Google C++ Style Guide 기반의 일관된 코드 스타일, 중복 제거, production Doxygen 문서화, -명시적인 추상 경계와 응집된 모듈을 제공해야 한다. - -효율성은 runtime 성능 향상이 아니라 다음 유지보수 특성을 의미한다. - -- 새 element, element property, material, analysis, load 또는 boundary condition을 추가할 - 때 기존 concrete 구현을 수정하는 범위를 줄인다. -- 하나의 의미를 여러 translation unit에서 다시 구현하지 않는다. -- parser semantic data, numerical kernel, assembly, recovery와 output 책임을 구분한다. -- 수치식과 I/O 계약을 사람이 직접 대조할 수 있는 단순한 dependency direction을 유지한다. - -## 범위 - -### 포함 - -- production 및 test C++ 전체의 Google-style naming과 formatting 전환 -- production header의 `.hpp`에서 `.h`로 전환과 header guard 적용 -- production 함수와 class의 Doxygen 문서화 -- `ElementDefinition`, `Element`, `ElementProperty`, `Material`, `Analysis`, `Load`, - `BoundaryCondition` 추상 경계 -- B33, MITC4, isotropic linear elasticity, beam/shell property, linear static analysis, - concentrated nodal load와 prescribed displacement의 concrete 구현 연결 -- `Vector3`, source-target resolution, DOF invariant validation과 dense-BLAS adapter의 - 중복 제거 -- `domain_mapper.cpp`, `hdf5_results_writer.cpp`, `result_recovery.cpp`의 책임별 분할 -- style, Doxygen, MSVC/CTest와 reference comparison 검증 -- `docs/CODINGSTYLE.md` 유지관리 문서와 Implementation Agent 필수 참조 연결 - -### 제외 - -- MITC3, solid hexa/tetra 또는 다른 element 구현 -- density, plasticity, anisotropic material 동작 구현 -- dynamic, eigenvalue, response spectrum 또는 random vibration analysis 구현 -- distributed load, body force 또는 MPC 구현 -- 승인된 formulation, sign, units, coordinate, HDF5 schema, reference artifact 또는 - tolerance 변경 -- runtime 성능 최적화 또는 parallel reduction policy 변경 -- general plugin registry, global static registration 또는 shared ownership framework - -## 근거와 제약 - -현재 production code는 semantic record와 numerical kernel을 이미 구분하지만 Domain은 -element, material, property, load와 boundary를 concrete vector로 각각 소유한다. -`SparseAssembler`, `DofManager`와 `ResultRecovery`는 B33/MITC4 concrete storage를 직접 -알아야 한다. B33과 MITC4라는 두 실제 element가 있으므로 element abstraction은 현재 -구현으로 검증할 수 있다. - -반면 아직 구현되지 않은 plastic integration, dynamic state, MPC enforcement의 메서드를 -base class에 미리 추가할 근거는 없다. 추상 class는 현재 concrete 구현이 실제로 공유하는 -계약만 제공하고 future capability는 해당 기능의 requirements/formulation/ADR이 승인될 때 -추가한다. - -다음 기존 계약은 리팩터링보다 우선한다. - -- Domain은 semantic definition을 단독 소유하고 parsing 이후 불변으로 취급한다. -- AnalysisModel은 Domain을 복사하지 않는 non-owning stable-index view다. -- DofManager는 DOF와 equation numbering 및 sparse pattern을 단독 소유한다. -- assembly worker는 global CSR storage를 직접 수정하지 않는다. -- stiffness partition과 factorization은 load assembly보다 먼저 수행한다. -- reaction과 free-equilibrium evidence는 full residual `K*d-F`에서 구한다. -- result recovery와 final HDF5는 candidate validation 후 commit한다. -- B33 및 MITC4 reference identity와 tolerance는 변경하지 않는다. - -## 추상 계층과 소유권 - -```text -Domain -├─ ElementDefinition* -│ ├─ EulerBeam3DDefinition -│ └─ Mitc4ShellDefinition -├─ ElementProperty* -│ ├─ GeneralBeamSection -│ └─ ShellSection -├─ Material* -│ └─ IsotropicLinearElasticMaterial -└─ StepDefinition - ├─ Load* - │ └─ ConcentratedNodalLoad - └─ BoundaryCondition* - └─ PrescribedDisplacementBoundaryCondition - -Analysis -└─ LinearStaticAnalysis - -Element -├─ EulerBeam3D -└─ Mitc4Shell -``` - -Domain은 각 base type을 `std::unique_ptr`로 단독 소유한다. Public access는 const이며 -collection의 vector position은 기존 stable `EntityIndex` 의미를 유지한다. AnalysisModel과 -후속 solver object는 raw ownership을 획득하지 않고 Domain 수명 안에서 index 또는 const -reference만 사용한다. Copy를 지원하기 위한 speculative `Clone()`과 `std::shared_ptr`는 -추가하지 않는다. - -`ElementDefinition`과 `Element`는 서로 다른 책임이다. - -- `ElementDefinition`은 source identity, source element type, node connectivity와 - property/material identity를 제공하는 semantic model이다. -- `Element`는 active DOF layout, stiffness contribution, transformation과 result recovery를 - 제공하는 numerical kernel이다. -- `ElementFactory`는 definition, property와 material compatibility를 검증한 뒤 concrete - kernel을 만든다. -- 잘못된 조합은 `dynamic_cast` 실패나 undefined behavior로 넘기지 않고 기존 - `Status`/`Result` diagnostic으로 fail-closed 처리한다. - -Element result는 모든 element에 의미 없는 field를 추가한 비대한 base record가 아니다. -공통 step/frame/source identity를 가진 backend-neutral result bundle이 beam 및 shell row를 -각자의 명확한 record로 보관한다. ResultRecovery와 ResultsWriter는 stable row identity를 -보존하며 서로 다른 result location을 평균하거나 합치지 않는다. - -## Material과 Element Property - -`Material` base는 identity, source location과 수명 계약만 제공한다. 현재 concrete type은 -물리 의미를 드러내도록 `IsotropicLinearElasticMaterial`로 명명한다. 현재 element factory가 -필요로 하는 isotropic elastic capability만 노출한다. - -다음 future concern은 이번 interface에 빈 메서드나 optional field로 미리 넣지 않는다. - -- density와 inertia contribution -- anisotropic elastic constitutive data -- plastic history state와 return mapping -- temperature 또는 rate dependency - -이 concern은 각 기능이 승인될 때 별도의 capability 또는 구성 객체로 추가한다. 같은 -원칙으로 `ElementProperty`는 identity를 제공하고 `GeneralBeamSection`과 `ShellSection`은 -각자 필요한 기하 property를 소유한다. Solid property를 예상해 비어 있는 thickness/area -accessor를 base에 추가하지 않는다. - -## Analysis 계층 - -현재 `Analysis` base의 8개 protected hook은 linear-static lifecycle에 특화되어 있다. -이를 모든 future procedure에 강제하지 않는다. - -```cpp -class Analysis { - public: - virtual ~Analysis() = default; - virtual Status Run(const AnalysisRequest& request) = 0; -}; -``` - -현재 승인 순서는 `LinearStaticAnalysis::Run()`의 private 단계로 유지한다. - -```text -initialize --> build analysis model --> build DOF map and sparse pattern --> assemble and partition stiffness --> factorize Kff --> assemble loads and effective RHS --> substitute and reconstruct --> recover and write results -``` - -Dynamic, eigenvalue와 stochastic procedure는 추가될 때 별도 state, equation, solver와 output -lifecycle을 정의한다. 기존 linear-static hook 사이에 condition이나 unused future state를 -추가하지 않는다. 이 책임 변경은 구현 전에 ADR-007을 대체하거나 개정하는 ADR로 기록한다. - -## Load와 Boundary Condition - -`Load` concrete object는 자신의 semantic target과 magnitude를 소유하고 ordered full-DOF -contribution을 생성한다. `LoadAssembler`는 active source order로 contribution을 모아 기존 -fixed accumulation order로 global vector에 반영한다. Polymorphic load가 global vector를 -직접 병렬 갱신하지 않는다. - -현재 concrete load는 `ConcentratedNodalLoad`다. Future distributed load와 body force는 -element-local contribution을 생성할 수 있지만 stable global reduction은 계속 assembler가 -소유한다. - -`BoundaryCondition`은 enforcement algorithm을 직접 수행하지 않고 constraint definition을 -생성한다. 현재 concrete type은 nonzero 값을 포함하는 -`PrescribedDisplacementBoundaryCondition`이다. `EssentialConstraintPolicy`가 기존 stable -elimination과 full/reduced reconstruction을 수행한다. - -Future MPC는 별도 constraint equation과 enforcement policy를 요구한다. Prescribed -displacement, MPC, penalty와 Lagrange multiplier를 하나의 bool/enum branch가 누적된 class로 -합치지 않는다. - -## 공통 수학과 중복 제거 - -### Vector3 - -좌표, local axis, shell director와 cross-product는 고정 크기 `Vector3` 값 class를 사용한다. -동적 크기와 MKL-backed storage를 소유하는 기존 `Vector`와 역할을 섞지 않는다. - -`Vector3`는 현재 반복되는 다음 연산을 한 번만 정의한다. - -- component access -- addition, subtraction과 scalar multiplication -- `Dot()` -- `Cross()` -- `Norm()` -- `Normalized()` -- `IsFinite()` - -Normalization failure policy는 호출 위치에서 기존 scale-aware diagnostic을 유지한다. -`Vector3`가 임의 tolerance, zero clamp 또는 solver diagnostic을 소유하지 않는다. - -### 다른 공통 책임 - -- `SourceTargetResolver`: source label, instance와 set target을 stable identity로 해석한다. -- `DofManager::ValidateInvariants()`: full/free/constrained ordering과 equation mapping을 owner가 - 한 번 검증한다. -- private dense-BLAS adapter: Matrix와 Vector의 MKL integer conversion 및 copy operation을 - 공유한다. Vendor type은 public header에 노출하지 않는다. -- ASCII utility: case-insensitive name comparison과 positive source-label parsing을 공유한다. - -중복 제거는 같은 의미와 failure policy가 반복될 때만 적용한다. 이름만 비슷하지만 units, -identity 또는 diagnostic owner가 다른 계산을 하나로 합치지 않는다. State가 없는 helper를 -static-only class로 포장하지 않고 internal namespace/module을 사용한다. - -## 모듈 구조 - -```text -include/fesa/ -├─ analysis/ -│ ├─ analysis.h -│ └─ linear_static_analysis.h -├─ elements/ -│ ├─ element.h -│ ├─ element_definition.h -│ ├─ element_factory.h -│ ├─ euler_beam_3d.h -│ └─ mitc4_shell.h -├─ properties/ -│ ├─ element_property.h -│ ├─ general_beam_section.h -│ └─ shell_section.h -├─ materials/ -│ ├─ material.h -│ └─ isotropic_linear_elastic_material.h -├─ loads/ -│ ├─ load.h -│ └─ concentrated_nodal_load.h -├─ constraints/ -│ ├─ boundary_condition.h -│ ├─ prescribed_displacement.h -│ └─ essential_constraint_policy.h -├─ math/ -│ ├─ vector.h -│ ├─ vector3.h -│ ├─ matrix.h -│ └─ sparse_matrix.h -└─ model/ - ├─ domain.h - ├─ analysis_model.h - └─ source_target_resolver.h -``` - -`model_types.hpp`의 unrelated record는 각 owner module로 이동한다. Top-level orchestration -file은 다음과 같이 분리한다. - -- Abaqus mapping: topology, material/property, step/load/BC와 final Domain assembly -- HDF5 output: RAII/primitives, model dataset, result dataset, self-check와 atomic finalization -- Result recovery: global equilibrium, beam recovery, shell recovery와 atomic state commit - -Public header와 implementation dependency direction을 역전하지 않는다. MKL, TBB, HDF5와 -Win32 type은 기존 adapter/private implementation 경계 안에 남는다. - -## 코드 스타일과 문서화 - -`docs/CODINGSTYLE.md`를 FESA C++ style의 project-local source of truth로 사용한다. Google -C++ Style Guide가 baseline이고 FESA 계약이 우선한다. - -주요 결정은 다음과 같다. - -- C++17/MSVC 호환을 유지한다. Google guide의 현재 C++20 language target은 적용하지 않는다. -- 함수와 accessor를 포함한 production API는 PascalCase로 전면 전환한다. -- type은 PascalCase, 변수는 snake_case, constant/enumerator는 `kPascalCase`, class member는 - trailing underscore를 사용한다. -- Header는 `.h`와 full-path Google header guard를 사용한다. -- Source는 기존 FESA/CMake 관례인 `.cpp`를 유지하는 project exception으로 둔다. -- Formatting은 `BasedOnStyle: Google`, 2-space indentation과 80-column limit를 사용한다. -- Production public/protected declaration에는 Doxygen contract를 기록한다. -- Production internal function은 definition에 목적과 비자명한 수치/순서 의미를 기록한다. -- Test code에는 Doxygen coverage를 요구하지 않는다. - -Repository는 `.clang-format`, selected C++17-compatible `.clang-tidy`, `Doxyfile`과 optional -CMake docs target을 제공한다. Generated HTML은 source control에 넣지 않는다. - -Implementation Agent의 profile은 구현 전에 `docs/CODINGSTYLE.md`를 mandatory global input으로 -읽도록 변경한다. Agent workflow contract test는 해당 profile이 문서를 직접 참조하는지 -검증한다. - -## 오류 처리 - -- 모든 polymorphic base는 public virtual destructor를 갖는다. -- Factory는 null object를 성공 결과로 반환하지 않는다. -- Element/property/material incompatibility는 structured model diagnostic으로 거부한다. -- Public solver 경계는 기존 `Status`/`Result`를 사용한다. -- Backend exception은 현재 failure category와 atomicity contract를 유지해 번역한다. -- Unknown future kind를 silent fallback이나 default concrete type으로 바꾸지 않는다. -- Failed candidate는 Domain, AnalysisState 또는 final HDF5를 부분 변경하지 않는다. - -## 단계적 마이그레이션 - -1. 기존 unit/integration/reference 및 HDF5 contract baseline을 기록하고 architecture ADR을 - 갱신한다. -2. `.clang-format`, header rename/guard와 PascalCase를 module slice별 mechanical change로 - 적용한다. -3. `Vector3`, ASCII utility, SourceTargetResolver, DOF invariant validation과 private BLAS - adapter를 도입한다. -4. Domain semantic hierarchy와 current concrete material/property/load/boundary type을 - 연결한다. -5. Element runtime hierarchy와 factory를 DofManager, SparseAssembler와 ResultRecovery에 - 연결한다. -6. Ordered load contribution과 essential constraint policy를 연결한다. -7. Minimal Analysis base와 LinearStaticAnalysis-owned lifecycle로 전환한다. -8. Mapper, HDF5 writer와 recovery를 책임별로 분할하고 Doxygen/style coverage를 완료한다. - -Mechanical formatting, API rename와 semantic restructuring을 같은 review unit에 섞지 않는다. -각 slice는 buildable하고 독립 검증 가능해야 한다. - -## TDD와 검증 - -각 production change는 관련 C++ test와 같은 Step에서 `RED -> GREEN -> VERIFY`를 수행한다. - -- abstract base와 concrete polymorphic use를 검증하는 compile-time/unit test -- factory success와 incompatible property/material rejection test -- base interface를 통한 B33/MITC4 stiffness 및 recovery test -- stable element, load와 boundary source-order test -- Domain ownership, AnalysisModel lifetime와 stable identity test -- Vector3 arithmetic, finite and normalization-boundary test -- 기존 parser/I/O, HDF5 schema와 atomicity test -- B33 및 MITC4 integration/reference comparison -- repeated execution의 sparse structure, result row와 diagnostic order test -- Doxygen warning, formatting과 selected lint check -- full MSVC x64 Debug `/W4 /WX` build와 CTest - -수치 산술 순서를 의도적으로 변경하지 않은 slice는 가능한 한 exact equality를 요구한다. -Feature-approved reference tolerance는 최종 external comparison에만 그대로 적용한다. - -## 완료 기준 - -- 승인된 abstraction과 current concrete implementation이 base interface를 통해 연결된다. -- DofManager, assembler와 recovery에 B33/MITC4 type branch 또는 duplicate geometry helper가 - 남지 않는다. -- Production 및 test C++가 `docs/CODINGSTYLE.md`의 naming/formatting 규칙을 만족한다. -- Production API와 non-obvious internal function에 요구된 Doxygen가 존재한다. -- Implementation Agent profile이 `docs/CODINGSTYLE.md`를 mandatory input으로 참조한다. -- 전체 MSVC x64 Debug build/CTest와 B33/MITC4 reference comparison이 통과한다. -- HDF5 schema, stable identity, diagnostic, tolerance와 reference artifact에 변경이 없다. diff --git a/docs/superpowers/specs/2026-08-16-implementation-agent-terra-model-design.md b/docs/superpowers/specs/2026-08-16-implementation-agent-terra-model-design.md deleted file mode 100644 index 382a897..0000000 --- a/docs/superpowers/specs/2026-08-16-implementation-agent-terra-model-design.md +++ /dev/null @@ -1,38 +0,0 @@ -# Implementation Agent Terra 모델 지정 설계 - -## Metadata - -- date: 2026-08-16 -- status: approved-design -- scope: project-local `implementation-agent` 모델 선택 - -## 목표 - -FESA의 `implementation-agent`가 명시적으로 `gpt-5.6-terra`를 사용하도록 설정한다. -기존 `model_reasoning_effort = "extra high"` 설정은 그대로 유지한다. - -## 설계 - -`.codex/agents/implementation-agent.toml`에 다음 모델 설정만 추가한다. - -```toml -model = "gpt-5.6-terra" -``` - -이 설정은 프로젝트 로컬 `implementation-agent` 프로필에만 적용된다. 다른 custom agent, -사용자 전역 Codex 설정, agent 지시문과 solver production 코드는 변경하지 않는다. - -## 검증 - -새 계약 테스트나 테스트 파일 변경은 추가하지 않는다. 변경 후 다음 항목만 확인한다. - -1. `implementation-agent.toml`이 유효한 TOML로 파싱된다. -2. `model` 값이 정확히 `gpt-5.6-terra`이다. -3. `model_reasoning_effort` 값이 기존의 `extra high`로 유지된다. -4. Git diff에 설계된 설정 외의 구현 변경이 없다. - -## 완료 조건 - -- `implementation-agent`에만 `gpt-5.6-terra` 모델 override가 존재한다. -- 기존 reasoning effort와 agent 동작 계약은 변경되지 않는다. -- 새 계약 테스트는 추가되지 않는다. diff --git a/docs/superpowers/specs/2026-08-17-common-reference-tolerance-design.md b/docs/superpowers/specs/2026-08-17-common-reference-tolerance-design.md deleted file mode 100644 index 2b26bda..0000000 --- a/docs/superpowers/specs/2026-08-17-common-reference-tolerance-design.md +++ /dev/null @@ -1,227 +0,0 @@ -# Common Reference Tolerance Policy Design - -## Status - -- date: `2026-08-17` -- status: `implemented-and-verified` -- verified_on: `2026-08-18` -- scope: 모든 FESA 외부 reference comparison -- production_solver_behavior: 변경 없음 -- reference_artifact_mutation: 금지 - -현재 운영 상수, 검증 순서, report schema와 변경 관리는 `docs/TOLERANCE.md`를 source of -truth로 사용한다. 이 문서는 승인 결정의 설계 근거와 대안 검토를 보존한다. - -## 목적 - -B33, MITC4 및 이후 추가되는 기능이 서로 다른 수치 tolerance 식을 만들지 않도록 공통 -reference comparison 규칙을 정의한다. 이 정책은 Abaqus CSV와 FESA HDF5에서 결정적으로 -대응된 행을 비교하는 외부 reference gate에만 적용한다. Element formulation, analytical -solution, matrix symmetry, residual 및 physics sanity tolerance는 이 정책의 범위가 아니다. - -## 결정 - -모든 reference comparison은 다음 세 개의 무차원 상수를 사용한다. - -```text -near_zero_ratio = 0.01 -relative_tolerance = 0.05 -relative_rms_tolerance = 0.01 -``` - -독립적인 absolute-error gate는 두지 않는다. Absolute error는 reference 값이 0에 가까워 -행별 상대오차를 안정적으로 계산할 수 없는 경우의 대체 판정과 진단에만 사용한다. - -## Comparison Family와 Scale - -Tolerance scale은 개별 component가 아니라 동일한 물리 차원의 component family마다 -계산한다. 하나의 family는 최소한 다음 identity가 모두 같은 행으로 제한한다. - -- model/reference case -- step 및 frame -- logical quantity -- unit dimension -- coordinate system -- blocking 또는 warning-only behavior - -서로 다른 quantity나 단위 차원의 값은 scale을 공유하지 않는다. Family scale은 대응된 -reference 값만 사용해 계산한다. - -\[ -S_g = \max_{i \in g}|R_i| -\] - -여기서 \(g\)는 comparison family, \(R_i\)는 원본 reference 값이다. Reference 값은 scale -계산 전후에 clamp, rewrite 또는 생략하지 않는다. - -현재 기능의 family mapping은 다음과 같다. - -| feature | logical quantity / dimension | components | behavior | -| --- | --- | --- | --- | -| B33 | displacement / length | `UX`, `UY`, `UZ` | blocking | -| B33 | displacement / rotation | `URX`, `URY`, `URZ` | blocking | -| B33 | reaction / force | `RF1`, `RF2`, `RF3` | blocking | -| B33 | reaction / moment | `RM1`, `RM2`, `RM3` | blocking | -| B33 | section resultant / force | `N` | blocking | -| B33 | section resultant / moment | `T`, `My`, `Mz` | blocking | -| MITC4 | displacement / length | `U1`, `U2`, `U3` | blocking | -| MITC4 | displacement / rotation | `UR1`, `UR2`, `UR3` | warning-only | - -새 quantity는 해당 기능의 requirements와 reference-model 계약에서 logical quantity, -dimension, components 및 behavior를 명시해 family에 배치한다. 물리 차원이 같다는 이유만으로 -서로 다른 logical quantity를 자동으로 합치지 않는다. - -### B33 element-endpoint identity amendment - -2026-08-18에 사용자가 다시 생성한 -`reference/cantilever beam/cantilever beam elemental forces.csv`는 `Element Label`과 -`Node Label`을 모두 포함하고 B33 요소마다 두 endpoint 행을 제공한다. Section-resultant -comparison은 다음 key로 각 CSV 행을 HDF5 `[element, endpoint, component]` 행에 직접 -대응시킨다. - -```text -(model_id, step/frame, instance_name, source_element_label, - source_node_label, quantity, component) -``` - -Component mapping은 `SF-SF1 -> N`, `SM-SM1 -> My`, `SM-SM2 -> Mz`, -`SM-SM3 -> T`다. Comparator는 이 CSV를 source-node station으로 collapse하거나 인접 -endpoint를 평균하지 않는다. Missing, extra, duplicate 또는 connectivity-mismatched -element-endpoint identity는 tolerance 전에 실패한다. Production -`ResultRecovery::NormalizeSectionResultantsToNodeStations` 계약과 그 단위 테스트는 이 외부 -reference identity 변경의 범위가 아니다. - -## 행별 판정 - -각 대응 행에 대해 다음 absolute error를 계산한다. - -\[ -E_i = |F_i-R_i| -\] - -Family scale이 양수이면 near-zero band는 다음과 같다. - -\[ -Z_g = 0.01S_g -\] - -행은 다음 두 분기 중 정확히 하나로 판정한다. - -1. \(|R_i| \le Z_g\)이면 near-zero 행이다. 이 행은 \(E_i \le Z_g\)일 때 통과한다. -2. \(|R_i| > Z_g\)이면 일반 상대오차 행이다. 이 행은 - \(E_i/|R_i| \le 0.05\)일 때 통과한다. - -따라서 absolute error는 모든 행에 적용되는 별도 acceptance gate가 아니다. Near-zero -분기는 0 또는 0에 가까운 reference 행에서 정의되지 않거나 과도하게 증폭되는 raw relative -error를 대체한다. - -### Zero-scale family - -\(S_g=0\)이면 해당 family의 모든 reference 값이 정확히 0이다. 사용자가 독립 absolute -floor를 제외했으므로 이 경우에는 다음 fail-closed 규칙을 사용한다. - -- 모든 FESA 값도 정확히 0이면 모든 행과 family relative RMS가 통과한다. -- 하나라도 0이 아닌 FESA 값이 있으면 해당 행과 family가 실패한다. - -Comparator는 이 경우 infinity 또는 NaN을 report에 기록하지 않고 -`zero-reference-scale-nonzero-error` 진단을 기록한다. - -## Scale-relative RMS - -Family 전체의 평균적인 오차 수준은 scale-relative RMS로 판정한다. - -\[ -\operatorname{relative\_rms}_g = -\frac{\sqrt{\frac{1}{N_g}\sum_{i \in g} E_i^2}}{S_g} -\] - -\[ -\operatorname{relative\_rms}_g \le 0.01 -\] - -이 값은 raw row-relative error의 RMS가 아니다. Error RMS를 같은 family의 reference 최대 -scale로 정규화한 무차원 값이다. 행별 gate가 국부적인 큰 오차를 검출하고, relative RMS -gate가 family 전체의 평균 오차를 검출한다. 두 gate를 모두 통과해야 한다. - -## 판정 순서 - -1. 필요한 artifact와 schema를 확인한다. -2. Source identity 및 component를 결정적으로 대응시킨다. -3. Missing, extra, duplicate, identity-mismatched 또는 nonfinite required row를 tolerance 전에 - 실패시킨다. -4. Comparison family와 reference-only scale을 계산한다. -5. 모든 행에 near-zero 또는 일반 상대오차 판정을 적용한다. -6. Family scale-relative RMS를 계산한다. -7. Blocking family는 모든 행과 RMS가 통과해야 reference gate를 통과한다. -8. Warning-only family의 동일한 실패는 deterministic warning을 생성하지만 전체 reference - verdict를 실패시키지 않는다. - -Tolerance 정책은 feature별 blocking/warning-only quantity 선택을 변경하지 않는다. - -## Report Contract - -Comparator report는 최소한 다음 항목을 보존한다. - -- family identity와 component 목록 -- reference scale와 near-zero band -- 전체 행 수와 near-zero 행 수 -- 각 행의 원본 FESA/reference 값, absolute error, 적용된 분기 및 판정 -- 일반 상대오차 행의 relative error -- family scale-relative RMS와 판정 -- maximum absolute error와 worst row를 진단 정보로 기록하되 독립 gate로 사용하지 않음 -- blocking 실패와 warning-only exceedance의 구분 - -## 현재 B33/MITC4 Evidence - -MSVC Debug build와 214개 CTest를 통과한 현재 comparator가 다음 ledger를 생성했다. -Reference artifact는 수정하지 않았으며 B33은 regenerated 20-row element-endpoint identity를 -직접 비교한다. - -- `.harness/build/reference/cantilever-beam-b33/comparison.json` -- `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` - -| case | row gate | maximum family relative RMS | RMS gate | verdict | -| --- | --- | ---: | --- | --- | -| B33 direct endpoint | 모든 212 blocking 행 통과 | 약 `1.17e-8` | 통과 | 통과 | -| MITC4 U | 모든 blocking 행 통과 | 약 `1.03e-3` | 통과 | 통과 | -| MITC4 UR | 모든 warning-only 행 통과 | 약 `2.98e-3` | 통과 | warning 없음 | - -개별 component scale을 사용하면 MITC4 `U1/U2`의 최대 reference가 약 `3.12e-23`이어서 -near-zero 행 판정과 relative RMS가 실패한다. Translation family의 `U1/U2/U3`가 공통 -scale을 사용하면 물리적으로 zero-like인 in-plane residue를 실제 translational response와 -같은 차원에서 판정할 수 있다. - -## 검토한 대안 - -### Component별 scale - -규칙은 단순하지만 component 전체가 zero-like이면 수치 residue 자체가 scale이 된다. 현재 -MITC4 `U1/U2`가 실패하므로 채택하지 않는다. - -### Reference RMS를 분모로 한 relative L2 norm - -`sqrt(sum(error^2)/sum(reference^2))`는 일반적인 상대 norm이지만 zero-dominant component나 -family에서 분모가 불안정하거나 정의되지 않는다. Near-zero 행 규칙과 동일한 scale 의미를 -공유하지 않으므로 공통 정책으로 채택하지 않는다. - -### Near-zero 보정 row-relative error의 RMS - -각 행의 분모를 `max(abs(reference), near_zero_band)`로 바꿔 RMS를 계산할 수 있다. 그러나 -행별 near-zero 판정을 다시 집계해 같은 오차를 중복 평가하고 해석이 복잡해지므로 채택하지 -않는다. - -## 구현 및 계약 정렬 범위 - -이 문서의 승인은 목표 tolerance 정책을 고정하지만 기존 comparator와 기능 문서를 즉시 -변경하지 않는다. 후속 implementation plan은 TDD로 다음을 함께 정렬해야 한다. - -- 공통 comparison policy와 metric 구현 -- B33 및 MITC4 comparator의 공통 정책 사용 -- positive, boundary, zero-scale, near-zero, nonfinite 및 row-identity 테스트 -- B33와 MITC4 requirements, numerical review, reference model, I/O 및 reference comparison - 문서의 tolerance 부분 -- `AGENTS.md`와 `docs/ADR.md`의 기존 B33/MITC4 tolerance 결정을 새 공통 정책으로 대체 - -기존 reference input과 CSV는 생성, rename, rewrite 또는 보정하지 않는다. Production solver -formulation, HDF5 output schema, component mapping, blocking/warning-only 분류 및 physics gate도 -이 tolerance 변경으로 수정하지 않는다. diff --git a/docs/tracking/findings.md b/docs/tracking/findings.md index 662528c..6871440 100644 --- a/docs/tracking/findings.md +++ b/docs/tracking/findings.md @@ -25,17 +25,17 @@ - 후속 방향: 유효한 동작·권한·검증 범위를 검사하도록 기대값을 정리하고 Python suite를 별도로 실행한다. 현재 CTest의 성공으로 대체하지 않는다. -## 열 reference의 작업 사본 내 부재 +## Shell 열해석의 새 필수 reference 비교 대기 -- 조건·현상: 열해석 계획은 기존 `shell-thermal.inp`와 `shell-thermal NodalTemperature.csv`를 - 지정하지만 이 작업 사본의 `reference/shell-thermal`에는 해당 파일이 없다. 앞선 계획 - 작업에서는 별도 기존 저장소의 원본을 읽기 전용으로 확인했다. -- 영향: 이 작업 사본만으로 열 reference 비교를 재현할 수 없다. CSV는 t=37의 NT11 - 한 frame만 포함하므로 원본 확보 뒤에도 flux·반력·두께 온도 분포의 검증을 대신하지 않는다. -- 현재 해결하지 않는 이유: Reference 생성·복원·복사는 현재 요청에 포함되지 않는다. - 명명 규칙 때문에 새 artifact나 보조 metadata를 만들지 않는다. -- 후속 방향: 실제 비교 작업 시 사용할 기존 원본 경로를 명시하고 허용된 접근으로 - 읽는다. 보존된 원본의 행·identity·값을 수정하지 않는다. +- 조건·현상: 기존 INP/CSV는 `reference/shell-thermal/`에 보존돼 실제 비교했다. + Step-1/t=37/NT11의729행 중87행 FAIL, RMS/S 약0.0496741로 공통1%를 초과했다. + 승인식의 독립 oracle도 같은 불일치를 보였으며 [사용자 결정](../shell-transient-heat-transfer/ADR.md#sth-adr-015-원본-reference-진단-전환과-새-모델-비교)에 따라 diagnostic으로 유지한다. +- 영향: 구현·내부 검증과 별개로 새 필수 외부 family의 통과가 없어 열해석 기능 검증 + 완료를 선언할 수 없다. 원본 NT11 한 성분·시점은 flux·반력·두께 분포의 대체 검증도 아니다. +- 현재 해결하지 않는 이유: 사용자가 새 모델·CSV를 별도 경로에 준비 중이다. + 문서 정리는 reference 생성·보정이나 Abaqus 실행을 포함하지 않는다. +- 후속 방향: 새 파일의 경로·source identity·시점·성분·hash를 확정하고 승인 tolerance로 + 실제 비교한다. 원본 diagnostic의 행·값·실패 metric과 물리 한계를 유지한다. ## 외부 배포 결정의 공백 diff --git a/docs/tracking/status.md b/docs/tracking/status.md index 0380cde..999f39b 100644 --- a/docs/tracking/status.md +++ b/docs/tracking/status.md @@ -1,33 +1,38 @@ # 개발 현황 -기준일은 2026-09-28이다. 현재 주목적은 개인 연구용 솔버 개발이며 외부 사용자 배포는 -장기 목표다. 아래 검증 상태는 기존 실행 기록의 범위이며 이번 문서 작업에서 solver나 -검증 suite를 새로 실행한 결과가 아니다. +기준일은 2026-10-04이다. 주목적은 개인 연구용 솔버 개발이며 외부 사용자 배포는 장기 +목표다. 문서 정리에서 solver나 검증 suite를 다시 실행하지 않았다. 아래는 보존된 실제 +실행과 기능별 계약을 대조한 요약이며 상세 checklist를 대신하지 않는다. + +최신 전체 MSVC x64 Debug 통합 회귀는 source `9f7fb2e`에서 **617개: 614 PASS·2 FAIL·1 SKIP**, +native CTest exit **8**이다. 기존 478개 검사가 포함되고 추가139개 모두 PASS다. +두 HHT 실패와 skipped 항목은 구현 전 baseline의 status·metric body와 정확히 같다. +실행·복구·보존 경로는 [전체 회귀 보고서](../shell-transient-heat-transfer/implementation-verification.md#통합-전체-회귀와-남은-완료-조건)에 있다. +dev 병합 `858e87b`는 검증한 구현과 동일한 tree이고 별도의 새 실행을 뜻하지 않는다. ## 구현과 검증 상태 | 영역 | 구현 상태 | 확인된 evidence와 한계 | | --- | --- | --- | -| Abaqus 입력·Domain·source identity | 구현됨 | Reader/mapper/invalid input 테스트가 존재. 최신 전체 suite 통과를 새로 주장하지 않음 | -| B33·MITC4 선형 정적 | 구현됨 | Local·integration·reference 검사가 존재. 과거 readiness는 이후 기준 변경으로 재검증 대기 표시가 있으므로 현재 release 통과로 승계하지 않음 | -| MITC4 비선형 정적·표면 압력 | 구현됨 | Newton·pressure tangent·result/reference 관련 검사와 실행 기록이 있음. 현 checkout 전체 재검증 없음 | -| MITC4 frequency | 승인된 첫 구현 완료 기록 | 당시 전체 417개 검사와 모드별 외부 Value 5% 비교·독립 검토 통과. 추가 검증 S3와 정확도 향상은 보류 | -| HHT 동해석 | 입력부터 HDF5까지 구현, 기능 검증 미완료 | 101-frame U 비교 PASS 기록, UR 경고 200건. Shell 시간수렴 두 사례 실패와 잔여 physics coverage 유지 | +| Abaqus 입력·Domain·source identity | 구현됨 | 최신 통합 회귀의 기존 reader/mapper 검사는 PASS. 허용 subset·identity는 [공통 계약](../contracts.md)을 따름 | +| B33·MITC4 선형 정적 | 구현됨 | 기존 local·integration·reference 검사 PASS. [Beam](../linear-static-3d-euler-beam/README.md)·[Shell](../linear-static-mitc4-shell/README.md)의 과거 readiness를 현재 release 통과로 승계하지 않음 | +| MITC4 비선형 정적·표면 압력 | 구현됨 | 기존 Newton·pressure tangent·결과/reference 검사 PASS. [비선형](../nonlinear-static-newton-raphson/README.md)·[압력](../shell-surface-pressure-load/README.md)의 물리 coverage와 경고 범위를 유지 | +| MITC4 frequency | 승인된 첫 구현 완료 기록 | 당시417개 검사·외부 Value5%·독립 검토 PASS, 최신 기존 회귀도 PASS. [S3·정확도 개선](../mitc4-shell-feast-eigen2/README.md#실패와-남은-범위)은 보류 | +| HHT 동해석 | 입력부터 HDF5까지 구현, 기능 검증 미완료 | 101-frame U 비교 PASS 기록·UR 경고200건. [두 시간수렴 실패와 잔여 coverage](../hht-implicit-dynamics/README.md#실패시행착오다음-작업) 유지 | | HHT 굽힘 단면력 복구 | 두께 계수 수정됨 | 관련 Debug 14 tests와 원본 HDF5 재생성·독립 식 대조 완료 기록. 전체 동해석 완료와 별개 | -| HHT 관련 전체 CTest | 일부 실패·미실행 범위 존재 | 최근 기록은 두 시간수렴 검사를 제외한 475 PASS/1 SKIP. 제외한 검사를 통과로 계산하지 않음 | -| Shell transient heat transfer | 요구사항·상세 수치 계획 작성, solver 미구현 | 5개 온도점·uncoupled 범위 합의. 수식 검산은 제한된 algebra evidence이며 solver/reference 통과 아님 | +| HHT 관련 전체 CTest | 기존 실패2개·SKIP1개 유지 | 최신617개 검사에서 제외 없이 실행. 기존 metric과 동일하며 전체 green 아님 | +| Shell transient heat transfer | 구현·내부 검증 완료, 필수 외부 비교 대기 | [추가139개 PASS·수렴/수지·독립 수치/물리 검토](../shell-transient-heat-transfer/README.md). 기존 NT11은87/729행 수치 FAIL인 diagnostic; 새 모델·CSV 준비 중 | | Python 검증 실행기 | 구현됨 | 명시 build/test runner와 별도 Python suite가 존재. 일부 운영 계약 검사는 현행 절차와 맞지 않는 기대값을 유지 | | 외부 사용자 배포 | 계획 | 배포 방식·설치·지원 정책과 dependency 재배포 검토가 아직 정해지지 않음 | ## 남은 작업과 의존성 -1. Shell 열해석은 geometry·두께 station 접속·시간 종료 규칙·초기 온도 jump·edge 입력· - 결과 schema를 확정한다. 채택된 정식화의 독립 검토 이후 semantic mapping, DOF, - 행렬·시간 적분·recovery·HDF5와 검증을 연결한다. 단일 시점 NT11 비교 외 물리 검증을 - 별도로 마련해야 한다. 현재 진행 요청에 가장 가까운 구현 준비 작업이다. +1. Shell 열해석은 준비 중인 새 reference 모델·CSV의 별도 경로·identity·시점·hash를 + 확정하고 승인 tolerance로 필수 비교를 실행한다. 기존 NT11 diagnostic FAIL과 고정 + 5점 두께 모델의 해상도·곡면·접합부 검증 한계를 유지한다. 구현을 처음부터 재개하지 않는다. 2. HHT는 기존 시간수렴 실패를 유지한 상태에서 물리 가속도 복구 후보의 정식화·독립 검증·채택 여부를 결정한다. 강체 병진 전체 이력, Newton 경계·실패 보존, 반복 결정론, - partition·좌표변환 coverage를 완료하고 필수 전체 검사를 다시 수행해야 한다. + partition·좌표변환 coverage를 완료한다. 변경 후 관련 검사와 필수 전체 검사를 수행한다. 3. Python 운영 계약 검사는 폐기된 profile·고정 단계·phase 인자 기대값을 현행 명시 실행 절차에 맞게 정리하는 별도 작업이 필요하다. 현재 문서 수정에 테스트 코드 변경을 포함하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen-execution-prep/step0.md b/phases/mitc4-shell-feast-eigen-execution-prep/step0.md index 3784b68..da6075d 100644 --- a/phases/mitc4-shell-feast-eigen-execution-prep/step0.md +++ b/phases/mitc4-shell-feast-eigen-execution-prep/step0.md @@ -1,9 +1,13 @@ # Step 0: 유한 실행시간 조정과 정상 검증 경로 보존 +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -38,39 +42,39 @@ Feature 폴더 `docs/mitc4-shell-feast-eigen/`와 다음 management/approved bun - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -추가 필수: [현재 Executor](../../scripts/execute.py), [등록 hooks](../../.codex/hooks.json), -[Stop](../../scripts/hooks/stop_validation.py), [CommandSpec](../../scripts/msvc_harness/models.py), +추가 필수: [현재 Executor](../../scripts/execute.py), 등록 hooks (당시 경로: `../../.codex/hooks.json`, 현재 checkout에 없음), +Stop (당시 경로: `../../scripts/hooks/stop_validation.py`, 현재 checkout에 없음), [CommandSpec](../../scripts/msvc_harness/models.py), [process](../../scripts/msvc_harness/process.py), [config](../../scripts/msvc_harness/config.py), [CMake adapter](../../scripts/msvc_harness/adapters/cmake.py), [HARNESS](../../docs/HARNESS.md), -[WORKFLOW](../../docs/HARNESS_WORKFLOW.md), [환경·activation 상세](../../docs/mitc4-shell-feast-eigen/implementation-environment.md). +[WORKFLOW](../../docs/HARNESS_WORKFLOW.md), [환경·activation 상세](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지). 현재 config schema에는 timeout option이 없다. 이번에 새 config field를 만들지 않는다. -재개 시 [복구 계획](../../docs/mitc4-shell-feast-eigen/implementation-recovery.md)과 -[실제 classifier 재현](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json)을 +재개 시 [복구 계획](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)과 +실제 classifier 재현 (당시 경로: `../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json`, 현재 checkout에 없음)을 추가 입력으로 읽는다. 아래 classifier delta는 기존 owned scripts/execute.py/tests/test_execute.py에 한정된 TDD 작업이다. 현재 blocked history와 실제 Hook 쓰기 거부는 그대로 보존한다. 현재 WIP 보존 뒤 별도 Correction Agent가 classifier 소스/테스트와 corrections.md를 먼저 @@ -183,7 +187,7 @@ Exit0, failures0, 현재 sandbox/terminal/ownership regressions 보존을 확인 위 신규 classifier test3개의 실제 collection 이름과 parameter case 존재도 확인한다. 등록된 기존 suite만 실행되었다고 새로운 behavior가 검증됐다고 보고하지 않는다. -이미 GREEN인 timeout/classifier source는 기존 [Correction evidence](../../docs/mitc4-shell-feast-eigen/corrections.md)와 +이미 GREEN인 timeout/classifier source는 기존 [Correction evidence](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)와 보존된 RED/GREEN을 읽고 재검증한다. RED를 다시 만들려고 source를 되돌리지 않는다. 현재 classifier37/timeout4/focused136과 전체 pytest를 실제 확인한다. diff --git a/phases/mitc4-shell-feast-eigen/step0.md b/phases/mitc4-shell-feast-eigen/step0.md index d872022..6f7712b 100644 --- a/phases/mitc4-shell-feast-eigen/step0.md +++ b/phases/mitc4-shell-feast-eigen/step0.md @@ -1,9 +1,13 @@ # Step 0: Frequency semantic model과 exact 입력 subset +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [io-input.md#i3-density-material-mapping](../../docs/mitc4-shell-feast-eigen/io-input.md#i3-density-material-mapping), [io-mapping.md#m1-input에서-equationresult까지](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m1-input에서-equationresult까지), [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약), [io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md), [io-schema.md#o2-metadata-모델과-source-요청](../../docs/mitc4-shell-feast-eigen/io-schema.md#o2-metadata-모델과-source-요청), [io-mapping.md#m5-구현test-obligations와-requirement-연결](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m5-구현test-obligations와-requirement-연결). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [io-input.md#i3-density-material-mapping](../../docs/mitc4-shell-feast-eigen/io.md#io-input--i3-density-material-mapping), [io-mapping.md#m1-input에서-equationresult까지](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m1-input에서-equationresult까지), [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e1-조립-단위-scaling과-실제-global-제약), [io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input), [io-schema.md#o2-metadata-모델과-source-요청](../../docs/mitc4-shell-feast-eigen/io.md#io-schema--o2-metadata-모델과-source-요청), [io-mapping.md#m5-구현test-obligations와-requirement-연결](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m5-구현test-obligations와-requirement-연결). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step1.md b/phases/mitc4-shell-feast-eigen/step1.md index ff31ff9..80812f6 100644 --- a/phases/mitc4-shell-feast-eigen/step1.md +++ b/phases/mitc4-shell-feast-eigen/step1.md @@ -1,9 +1,13 @@ # Step 1: 공변 drilling scale과 정적 회귀 +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md), [numerical-review-evidence.md#nr-mfe-001-직접-계산-반례](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md#nr-mfe-001-직접-계산-반례), [numerical-review-controls.md#c7-승인된-정적-회귀-기준](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c7-승인된-정적-회귀-기준). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization), [numerical-review-evidence.md#nr-mfe-001-직접-계산-반례](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례), [numerical-review-controls.md#c7-승인된-정적-회귀-기준](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c7-승인된-정적-회귀-기준). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step2.md b/phases/mitc4-shell-feast-eigen/step2.md index 6d7d517..7c2e48b 100644 --- a/phases/mitc4-shell-feast-eigen/step2.md +++ b/phases/mitc4-shell-feast-eigen/step2.md @@ -1,9 +1,13 @@ # Step 2: Consistent→lumped 질량과 deterministic 조립 +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md), [numerical-review-evidence.md#독립-mass-oracle](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md#독립-mass-oracle), [numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction), [formulation-mass.md#m4-계산된-consistent-moment에서-nodal-block-유도](../../docs/mitc4-shell-feast-eigen/formulation-mass.md#m4-계산된-consistent-moment에서-nodal-block-유도), [formulation-mass.md#m5-보존되는-양과-근사되는-양](../../docs/mitc4-shell-feast-eigen/formulation-mass.md#m5-보존되는-양과-근사되는-양), [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass), [numerical-review-evidence.md#독립-mass-oracle](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence--독립-mass-oracle), [numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c2-matrix-mass-stabilization와-reduction), [formulation-mass.md#m4-계산된-consistent-moment에서-nodal-block-유도](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass--m4-계산된-consistent-moment에서-nodal-block-유도), [formulation-mass.md#m5-보존되는-양과-근사되는-양](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass--m5-보존되는-양과-근사되는-양), [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e1-조립-단위-scaling과-실제-global-제약). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step3.md b/phases/mitc4-shell-feast-eigen/step3.md index e78a8bb..fa6f44a 100644 --- a/phases/mitc4-shell-feast-eigen/step3.md +++ b/phases/mitc4-shell-feast-eigen/step3.md @@ -1,9 +1,13 @@ # Step 3: 실제 제약의 null 공간과 sparse whitening +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약), [formulation-eigen.md#e2-nullpositive-basis를-node마다-결정](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e2-nullpositive-basis를-node마다-결정), [formulation-eigen.md#e5-spd-whitening-복원과-sparsity](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e5-spd-whitening-복원과-sparsity), [numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e1-조립-단위-scaling과-실제-global-제약), [formulation-eigen.md#e2-nullpositive-basis를-node마다-결정](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e2-nullpositive-basis를-node마다-결정), [formulation-eigen.md#e5-spd-whitening-복원과-sparsity](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e5-spd-whitening-복원과-sparsity), [numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c2-matrix-mass-stabilization와-reduction). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step4.md b/phases/mitc4-shell-feast-eigen/step4.md index 29344a8..dcf41a2 100644 --- a/phases/mitc4-shell-feast-eigen/step4.md +++ b/phases/mitc4-shell-feast-eigen/step4.md @@ -1,9 +1,13 @@ # Step 4: MKL FEAST adapter와 bounded lowest-N 검색 +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [formulation-eigen.md#e7-feast-경계와-deterministic-실행](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e7-feast-경계와-deterministic-실행), [numerical-review-controls.md#c5-feast-controls와-bounded-interval-정책](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c5-feast-controls와-bounded-interval-정책), [numerical-review-controls.md#c6-initial-subspace-thread와-storage](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c6-initial-subspace-thread와-storage), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m2-backend와-failure-lifecycle), [formulation-eigen.md#e6-유한-search-interval과-요청-개수](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e6-유한-search-interval과-요청-개수), [io-schema.md#o4-backend와-검증-evidence](../../docs/mitc4-shell-feast-eigen/io-schema.md#o4-backend와-검증-evidence). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [formulation-eigen.md#e7-feast-경계와-deterministic-실행](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e7-feast-경계와-deterministic-실행), [numerical-review-controls.md#c5-feast-controls와-bounded-interval-정책](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c5-feast-controls와-bounded-interval-정책), [numerical-review-controls.md#c6-initial-subspace-thread와-storage](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c6-initial-subspace-thread와-storage), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m2-backend와-failure-lifecycle), [formulation-eigen.md#e6-유한-search-interval과-요청-개수](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e6-유한-search-interval과-요청-개수), [io-schema.md#o4-backend와-검증-evidence](../../docs/mitc4-shell-feast-eigen/io.md#io-schema--o4-backend와-검증-evidence). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step5.md b/phases/mitc4-shell-feast-eigen/step5.md index 6d193b4..3815844 100644 --- a/phases/mitc4-shell-feast-eigen/step5.md +++ b/phases/mitc4-shell-feast-eigen/step5.md @@ -1,9 +1,13 @@ # Step 5: 전체 c 검증과 별도 frequency procedure +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md), [numerical-review-controls.md#c3-eigenpair-및-물리-내부-판정](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c3-eigenpair-및-물리-내부-판정), [numerical-review-controls.md#c4-repeated-subspace와-결정론](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md#c4-repeated-subspace와-결정론), [io-schema.md#o3-고유치와-modal-vectors](../../docs/mitc4-shell-feast-eigen/io-schema.md#o3-고유치와-modal-vectors), [io-schema.md#o4-backend와-검증-evidence](../../docs/mitc4-shell-feast-eigen/io-schema.md#o4-backend와-검증-evidence), [io-mapping.md#m1-input에서-equationresult까지](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m1-input에서-equationresult까지), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m2-backend와-failure-lifecycle), [formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md), [formulation-stabilization.md#s6-nr-mfe-001의-새-algebraic-target과-정적-대응](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md#s6-nr-mfe-001의-새-algebraic-target과-정적-대응). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification), [numerical-review-controls.md#c3-eigenpair-및-물리-내부-판정](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c3-eigenpair-및-물리-내부-판정), [numerical-review-controls.md#c4-repeated-subspace와-결정론](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls--c4-repeated-subspace와-결정론), [io-schema.md#o3-고유치와-modal-vectors](../../docs/mitc4-shell-feast-eigen/io.md#io-schema--o3-고유치와-modal-vectors), [io-schema.md#o4-backend와-검증-evidence](../../docs/mitc4-shell-feast-eigen/io.md#io-schema--o4-backend와-검증-evidence), [io-mapping.md#m1-input에서-equationresult까지](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m1-input에서-equationresult까지), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m2-backend와-failure-lifecycle), [formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen), [formulation-stabilization.md#s6-nr-mfe-001의-새-algebraic-target과-정적-대응](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization--s6-nr-mfe-001의-새-algebraic-target과-정적-대응). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step6.md b/phases/mitc4-shell-feast-eigen/step6.md index b5d6f32..241ac0a 100644 --- a/phases/mitc4-shell-feast-eigen/step6.md +++ b/phases/mitc4-shell-feast-eigen/step6.md @@ -1,9 +1,13 @@ # Step 6: Additive HDF5와 CLI candidate transaction +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m2-backend와-failure-lifecycle), [io-input.md#i6-fail-closed-validation과-diagnostics](../../docs/mitc4-shell-feast-eigen/io-input.md#i6-fail-closed-validation과-diagnostics), [formulation-eigen.md#e8-mode-identity-normalization과-상태](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md#e8-mode-identity-normalization과-상태). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m2-backend와-failure-lifecycle), [io-input.md#i6-fail-closed-validation과-diagnostics](../../docs/mitc4-shell-feast-eigen/io.md#io-input--i6-fail-closed-validation과-diagnostics), [formulation-eigen.md#e8-mode-identity-normalization과-상태](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e8-mode-identity-normalization과-상태). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths diff --git a/phases/mitc4-shell-feast-eigen/step7.md b/phases/mitc4-shell-feast-eigen/step7.md index e9c301c..bc1e54b 100644 --- a/phases/mitc4-shell-feast-eigen/step7.md +++ b/phases/mitc4-shell-feast-eigen/step7.md @@ -1,9 +1,13 @@ # Step 7: Value-only comparator·fresh reference·구현 evidence +> **과거 실행 기록:** 아래 지시·소유 경로는 당시 계획이며 현재 실행 입력이 아니다. +> 원문은 Git `858e87b`에서 확인한다. 문서 링크는 통합된 기록으로 연결하며 새 작업은 +> [현재 문서 안내](../../docs/README.md)와 기능 PRD를 따른다. + > **현재 실행 계약(r2):** 모든 configure/build/CTest는 `mfe-workspace-msvc-ninja-debug`를 사용한다. > MSVC x64 Debug, 동일 Ninja graph의 manual/registered 검증과 `CMAKE_BUILD_PARALLEL_LEVEL=1`을 유지한다. > 과거 `.harness/build` VS 명령과 public preset 명령은 이 Step의 실행 명령을 대체하지 않는다. -> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 적용한다. +> Targets/regex/필수 test identity·owned_paths·수치 계약은 그대로다. [E10.2/E11](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 적용한다. > 긴 도구 호출은 **결과 전체**를 전달한다. `session_id`가 있으면 `write_stdin`으로 종료까지 이어받고, > functions가 running cell을 반환했을 때만 해당 `cell_id`로 `functions.wait`를 사용한다. > `r.output`만 비었다고 같은 명령을 다시 실행하지 않는다. 통과한 focused 검증은 새 변경/실패 없이 반복하지 않는다. @@ -39,32 +43,32 @@ Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력 - [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md) - [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/PRD.md) - [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/ADR.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/coordination.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research-evidence.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation-mass.md) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation-eigen.md) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation-verification.md) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation-stabilization.md) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review-evidence.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review-controls.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md) +- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements) +- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence) +- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/research.md#research) +- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/research.md#research-evidence) +- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) +- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) +- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) +- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) +- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) +- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review) +- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-evidence) +- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-controls) +- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases) - [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io-input.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io-schema.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io-mapping.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/implementation-plan.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/implementation-environment.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/implementation-interfaces.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/implementation-verification.md) +- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/io.md#io) +- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/io.md#io-input) +- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/io.md#io-schema) +- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping) +- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) +- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지) -이 Step의 직접 계약: [io-mapping.md#m3-원본-txt-grammar와-deterministic-value-projection](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m3-원본-txt-grammar와-deterministic-value-projection), [io-mapping.md#m4-판정보고와-기존-static의-역할](../../docs/mitc4-shell-feast-eigen/io-mapping.md#m4-판정보고와-기존-static의-역할), [reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md), [../TOLERANCE.md](../../docs/mitc4-shell-feast-eigen/../TOLERANCE.md), [requirements-evidence.md#필수-회귀-포트폴리오와-identity](../../docs/mitc4-shell-feast-eigen/requirements-evidence.md#필수-회귀-포트폴리오와-identity), [numerical-review-cases.md#p4-ioreference운영-closure](../../docs/mitc4-shell-feast-eigen/numerical-review-cases.md#p4-ioreference운영-closure). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/implementation-verification.md)을 함께 적용한다. +이 Step의 직접 계약: [io-mapping.md#m3-원본-txt-grammar와-deterministic-value-projection](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m3-원본-txt-grammar와-deterministic-value-projection), [io-mapping.md#m4-판정보고와-기존-static의-역할](../../docs/mitc4-shell-feast-eigen/io.md#io-mapping--m4-판정보고와-기존-static의-역할), [reference-model.md](../../docs/mitc4-shell-feast-eigen/reference-model.md), [../TOLERANCE.md](../../docs/mitc4-shell-feast-eigen/../TOLERANCE.md), [requirements-evidence.md#필수-회귀-포트폴리오와-identity](../../docs/mitc4-shell-feast-eigen/requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity), [numerical-review-cases.md#p4-ioreference운영-closure](../../docs/mitc4-shell-feast-eigen/numerical-review.md#numerical-review-cases--p4-ioreference운영-closure). +논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/development-notes.md#실패와-재발-방지)을 함께 적용한다. ## Owned paths