modify repository

This commit is contained in:
KOKO\Mimi
2026-10-18 14:32:55 +09:00
parent 762bd4b5b7
commit 945d899b2f
146 changed files with 336 additions and 11285 deletions
-3
View File
@@ -20,9 +20,6 @@ __pycache__/
*.h5
.worktrees/
# phase execution outputs
phases/**/phase*-output.json
phases/**/step*-output.json
/CMakeUserPresets.json
# local document backups and initialization state
+10 -7
View File
@@ -12,6 +12,7 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존
├── CLAUDE.md → 같은 내용의 작업 진입점
├── docs/
│ ├── README.md → 기능별 기술 요약 색인
│ ├── development-context.md → 읽기 범위와 컨텍스트 예상량
│ ├── solver-core/README.md → 공통 구조·I/O·수치 기준·빌드 방법
│ └── <feature-id>/ → 기능 요약과 formulation 원문
├── include/fesa/
@@ -62,17 +63,19 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존
## 작업 전 확인
기본적으로 [솔버 공통 요약](docs/solver-core/README.md), 변경할 기능의
[기술 요약](docs/README.md)과 해당 영역의 AGENTS.md를 확인한다.
먼저 [기능 색인](docs/README.md), 변경할 기능의 README와 해당 영역의 AGENTS.md를 확인한다.
[솔버 공통 요약](docs/solver-core/README.md)은 아래 변경 성격에 해당하는 절을 읽는다.
색인의 다른 기능·연구 이력·대형 이관 자료를 일괄 필독으로 확장하지 않는다.
같은 문맥에서 읽고 바뀌지 않은 자료는 다시 읽지 않는다.
Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확인한다.
- 범위·physics·절차 변경: 기능 요약의 채택 범위·수식·구현 한계와 formulation을 확인한다.
- 범위·physics·절차 변경: 기능 요약의 채택 범위·구현 한계와 관련 formulation 절의
유도·가정·검증 요구를 함께 확인한다.
- 입력·결과·비교 변경: 공통 I/O·수치 기준과 해당 기능의 identity·reference mapping을 확인한다.
- C++ 구현: 공통 요약의 코딩 규약, 해당 영역 지침과 행동을 검증할 검사를 확인한다.
- 빌드 변경: 실제 preset·target graph·dependency와 명령의 side effect를 실행 전에 확인한다.
- 기능 재개: 해당 기능 요약의 현재 구현·검증·미해결 범위를 대조한다.
과거 phase 파일은 보존된 개발 이력이며 현재 실행 지시가 아니다.
과거 단계별 개발 계획은 Git 이력에서 확인하며 현재 실행 지시로 사용하지 않는다.
기능별 요약은 `docs/<feature-id>/README.md` 한 곳에 두고 수식은 formulation 원문을 따른다.
기존 승인된 기술 의미·수치 기준·source identity와 관련 없는 사용자 변경을 보존한다.
@@ -95,7 +98,7 @@ Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확
직접 MSBuild가 주 개발 빌드이며 CMake/Ninja는 같은 제품·검사 source를 사용하는 보조 경로다.
실제 명령·환경·`.build/native/Debug` 및 `.build/cmake-debug` 출력은 solver-core를 따른다.
두 경로의 전체 검사 등록과 실제 실행 범위를 구분하고 별도 Python·reference 결과를 기록한다.
이번 병합은 2026-10-18 사용자 변경에 따라 정적해석·공통 계약 검사와 정식 정적5모델만
실행해 다음 단계로 진행한다. HHT·동해석·고유치·과도 열해석 실행은 미검증으로 남기고
해당 테스트는 보존한다. 일반 솔버 기능의 전체 검증 의무를 이 한정 병합으로 대체하지 않는다.
2026-10-18 병합의 한정 검증 결과와 미검증 범위는
[병합 현황](docs/cpp-object-oriented-modular-refactoring/README.md#병합-결과와-검증-범위)을 따른다.
당시 한정 실행으로 이후 일반 솔버 기능의 전체 검증 의무를 대체하지 않는다.
`reference/temp`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다.
+10 -7
View File
@@ -12,6 +12,7 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존
├── CLAUDE.md → 같은 내용의 작업 진입점
├── docs/
│ ├── README.md → 기능별 기술 요약 색인
│ ├── development-context.md → 읽기 범위와 컨텍스트 예상량
│ ├── solver-core/README.md → 공통 구조·I/O·수치 기준·빌드 방법
│ └── <feature-id>/ → 기능 요약과 formulation 원문
├── include/fesa/
@@ -62,17 +63,19 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존
## 작업 전 확인
기본적으로 [솔버 공통 요약](docs/solver-core/README.md), 변경할 기능의
[기술 요약](docs/README.md)과 해당 영역의 AGENTS.md를 확인한다.
먼저 [기능 색인](docs/README.md), 변경할 기능의 README와 해당 영역의 AGENTS.md를 확인한다.
[솔버 공통 요약](docs/solver-core/README.md)은 아래 변경 성격에 해당하는 절을 읽는다.
색인의 다른 기능·연구 이력·대형 이관 자료를 일괄 필독으로 확장하지 않는다.
같은 문맥에서 읽고 바뀌지 않은 자료는 다시 읽지 않는다.
Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확인한다.
- 범위·physics·절차 변경: 기능 요약의 채택 범위·수식·구현 한계와 formulation을 확인한다.
- 범위·physics·절차 변경: 기능 요약의 채택 범위·구현 한계와 관련 formulation 절의
유도·가정·검증 요구를 함께 확인한다.
- 입력·결과·비교 변경: 공통 I/O·수치 기준과 해당 기능의 identity·reference mapping을 확인한다.
- C++ 구현: 공통 요약의 코딩 규약, 해당 영역 지침과 행동을 검증할 검사를 확인한다.
- 빌드 변경: 실제 preset·target graph·dependency와 명령의 side effect를 실행 전에 확인한다.
- 기능 재개: 해당 기능 요약의 현재 구현·검증·미해결 범위를 대조한다.
과거 phase 파일은 보존된 개발 이력이며 현재 실행 지시가 아니다.
과거 단계별 개발 계획은 Git 이력에서 확인하며 현재 실행 지시로 사용하지 않는다.
기능별 요약은 `docs/<feature-id>/README.md` 한 곳에 두고 수식은 formulation 원문을 따른다.
기존 승인된 기술 의미·수치 기준·source identity와 관련 없는 사용자 변경을 보존한다.
@@ -95,7 +98,7 @@ Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확
직접 MSBuild가 주 개발 빌드이며 CMake/Ninja는 같은 제품·검사 source를 사용하는 보조 경로다.
실제 명령·환경·`.build/native/Debug` 및 `.build/cmake-debug` 출력은 solver-core를 따른다.
두 경로의 전체 검사 등록과 실제 실행 범위를 구분하고 별도 Python·reference 결과를 기록한다.
이번 병합은 2026-10-18 사용자 변경에 따라 정적해석·공통 계약 검사와 정식 정적5모델만
실행해 다음 단계로 진행한다. HHT·동해석·고유치·과도 열해석 실행은 미검증으로 남기고
해당 테스트는 보존한다. 일반 솔버 기능의 전체 검증 의무를 이 한정 병합으로 대체하지 않는다.
2026-10-18 병합의 한정 검증 결과와 미검증 범위는
[병합 현황](docs/cpp-object-oriented-modular-refactoring/README.md#병합-결과와-검증-범위)을 따른다.
당시 한정 실행으로 이후 일반 솔버 기능의 전체 검증 의무를 대체하지 않는다.
`reference/temp`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다.
-246
View File
@@ -1,246 +0,0 @@
# HHT implicit dynamics 인수인계
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. 원문은 Git 이력에서 확인한다.
> 현재 구현과 검증 한계는 [HHT 기능 요약](docs/hht-implicit-dynamics/README.md)을 따른다.
최초 작성: 2026-09-22. 이 문서는 중단·재개를 위한 작업 상태 기록이다. **기능 완료 보고서가 아니며, 미실행·진행 중·INCONCLUSIVE를 PASS로 해석하면 안 된다.** 후속 작업은 아래 실행 일지에 덧붙인다. Feature의 공식 acceptance/checklist 원본은 [PRD](docs/hht-implicit-dynamics/README.md)다.
## dev 병합 및 worktree 정리 — 2026-09-27
- 사용자 요청으로 HHT branch의 `a7fd347`까지 `dev`에 fast-forward 병합했다. 병합 직후 두 tree의 차이는 없었다. 현재 작업 위치는 `C:/git/FESADev`, branch는 `dev`다.
- HHT worktree 및 이전 `dev-consistent-mass-comparison`, `mitc4-thesis-alignment` worktree 등록을 Git/Orca에서 정리했다. 병합된 HHT branch 이름은 삭제했고 기존 실험 두 branch는 보존했다.
- 이전 미커밋 비교 자료는 `dev-consistent-mass-comparison`의 `3c8f82a`, 논문 재현 실험은 `mitc4-thesis-alignment`의 `3f33f19`로 보존했다. 두 실험의 코드는 dev에 병합하지 않았다. 보존 commit은 신규 검증 통과를 의미하지 않는다.
- 전체 작업 디렉터리와 ignored/untracked 검증 결과는 `C:/Users/baram/orca/archives/FESADev/2026-09-27-worktree-cleanup/<기존 worktree 이름>/`에 보관했다. `manifest.json`에 commit·원경로·파일수·크기를 기록했고 이동 전후 inventory가 일치한다. 아카이브는 Git worktree가 아니며 `.git` 포인터는 `git-worktree-pointer.txt`라는 이력 파일이다.
- 아래 이력의 기존 worktree 절대 경로와 과거 검증 자료(정리됨) evidence는 해당 아카이브에서 찾는다. 새 실행은 dev에서 CMake를 다시 configure해야 하며 이동된 build cache를 그대로 재사용하지 않는다.
- 이번 병합은 코드 변화 없는 fast-forward다. 기존 검증을 반복 실행하지 않았으며 C08 실패·C04a INCONCLUSIVE·복구 후보 미채택 상태는 그대로다. 전체 기능 완료나 physics gate PASS를 의미하지 않는다. 원격 push는 수행하지 않았다.
## 재개 시 우선 확인 — 2026-09-27
아래 §1–9는 최초 snapshot이며 최신 결과는 §10과 이 요약이 우선한다. 구현 `f0dc42a` 이후 굽힘 수정 `7b700ab`, exact-rest 테스트 `d465245`, mapper 회귀 `219473e`, C08/복구 후보 evidence `c8f6619`를 커밋했다.
- Original reference 100 increments 완료: U 101 families PASS, UR 경고 200건. 최초 HDF5는 새로 발견한 굽힘 단면력 복구 오류를 포함하므로 해당 필드는 수정 전 evidence다.
- C08 optimized 재현: `c08-diagnostic-20260926.log`, exit1, 3 tests/1 PASS/2 FAIL. Finest C08a angular-a error `5.67565924e-4`, 최대 시점 `t=.0390625`; 그 node의 null 성분 `5.58582318e-4`, physical 성분 `1.00582661e-4`. Null 보정만으로 통과한다고 단정할 수 없다.
- Decimal80 독립 cubic DAE 반례에서 v 2차/a 1차. 초기 A0만 변경해도 해결되지 않는다. 재현 코드와 선택지는 [독립 수치 검토](docs/hht-implicit-dynamics/README.md)에 있다.
- 사용자 결정: 정확도 요구를 유지하고 제약조건 기반 가속도 복구를 별도 정식화·검증한 뒤 채택 여부를 결정한다(HHT-ADR-011). Production history/output 의미를 아직 바꾸지 않는다.
- C08b grid 초기값·시간 대응·갱신 코드의 구체적 오류는 발견하지 못했다. 회전 q/v/a self convergence는 FAIL이며 원인 미확정. Roundoff 수준 P에 감소를 요구하는 판정 문제는 별개다.
- 굽힘 recovery `M=∫zS dz`의 두께 인자 하나 누락을 확인해 수정했다. 두께 .2/.5/2의 stress-face first moment 회귀는 수정 전 FAIL, 수정 후 optimized 관련 13 tests PASS. 내부 force/tangent에는 영향이 없다. 최신 Debug 관련14 tests PASS 및 원본 재생성·독립 물리 확인을 완료했다. C08 temporal2개 제외 회귀는475 PASS/1 SKIP이며 전체 feature PASS가 아니다.
## 1. 사용자 요청과 권한
사용자는 HHT implicit 동적 해석의 requirement/research, formulation, numerical review 이후 **consistent mass**를 선택했고, 이어서 **I/O definition, implementation, physics evaluation gate를 모두 수행**하도록 요청했다. 이후 **Git에 커밋하면서 진행**, 이번에는 **HANDOFF.md 작성 후에도 계속 진행하며 추가 결과를 기록**하도록 요청했다.
- 승인 범위: 기존 격리 worktree에서 구현, 테스트, 지정 reference 해석·비교, 독립 수치·물리 검토, 로컬 커밋.
- 외부 Abaqus 실행, reference 입력/CSV 수정, push, release는 승인되지 않았다.
- reference는 외부 수치 비교 대상이다. Abaqus 내부 알고리즘 동등성을 주장하지 않는다.
- 원래 MITC4 논문 재현/eigen 실험과 현재 HHT 기능은 구별한다. 현재 작업에서 기존 static/eigen 질량 계약을 변경하지 않는다.
## 2. 저장소와 커밋
- 작업 worktree: `C:/Users/baram/orca/workspaces/FESADev/hht-implicit-dynamics`
- branch: `hht-implicit-dynamics`
- 원본 저장소: `C:/git/FESADev` — 해당 dev 작업 트리는 건드리지 않는다.
- 시작 commit: `23b37ca644563b51472654af3b22811f077f15f6`
- `1dbd8cc docs: define consistent-mass HHT dynamics contracts`: Feature 계약 15개 문서.
- `0820259 feat: map fixed-step HHT shell dynamics input`: 입력/semantic model 및 parser tests.
- 이 문서 작성 시점에서 **관성·적분·procedure·state·writer·대부분 테스트와 comparator는 아직 미커밋**이다. 파일은 공유 worktree에 존재한다. 다음 담당자는 reset/clean/전체 stage로 잃거나 생성 결과를 섞지 말 것.
- main만 stage/commit한다. Agent들은 source/doc/test 파일만 수정했다.
## 3. 우선 읽을 계약
[Feature 지침](docs/hht-implicit-dynamics/README.md), [PRD](docs/hht-implicit-dynamics/README.md), [ADR](docs/hht-implicit-dynamics/README.md), [정식화](docs/hht-implicit-dynamics/formulation.md), [관성 정식화](docs/hht-implicit-dynamics/formulation-inertia.md), [수치 기준](docs/hht-implicit-dynamics/README.md), [검증 C01–C12](docs/hht-implicit-dynamics/README.md), [I/O 계약](docs/hht-implicit-dynamics/README.md), [reference 계약](docs/hht-implicit-dynamics/README.md).
공통 [TOLERANCE](docs/solver-core/README.md), [ARCHITECTURE](docs/solver-core/README.md), [CODINGSTYLE](docs/solver-core/README.md), 프로젝트 AGENTS.md를 따른다. 프로젝트 PRD/ADR/AGENTS는 일반 Feature 작업에서 읽기 전용이다. Feature 문서는 한국어로 작성한다.
### 고정된 수학·지원 범위
- Original negative-alpha HHT: `alpha=-.05`, `beta=.275625`, `gamma=.55`.
- physical endpoint acceleration `a`와 auxiliary acceleration `A`를 분리한다.
- `A0=a0`, `A_(n+1)=(1+alpha)a_(n+1)-alpha*a_n`.
- `q_p=q_n+h*v_n+h²*(.5-beta)*A_n`, `v_p=v_n+h*(1-gamma)*A_n`.
- `A=(q-q_p)/(beta*h²)`, `v=v_p+gamma*(q-q_p)/(beta*h)`, `a=(A+alpha*a_n)/(1+alpha)`.
- Endpoint residual: `I(q,v,a)+f_int(q)-F(t)`.
- Tangent: `Kint+DqI+gamma/(beta*h)*DvI+M/((1+alpha)*beta*h²)`.
- Current configuration consistent kinetic mass. 임의 drilling 질량, epsilon, mass-null cutoff, pseudoinverse-only initialization 금지.
- 초기 a는 positive physical range 식을 푼 뒤 differentiated drilling constraint로 null 성분을 결정한다.
- 단일 NLGEOM shell `*DYNAMIC,DIRECT`, 균일 고정 dt, zero 초기 q/v, homogeneous fixed BC, constant translational CLOAD만 공개 지원한다.
- Newton100/no cutback. Residual와 correction/rate 각각1e-10, linear backward1e-12. 모든 scale은 계약대로 dimensionally consistent, finite-first, zero-scale exact branch.
- **HHT-ADR-010**: Newton 시작 좌표를 `q_n`으로 명시 변경했다. Constant-A 외삽은 지정 큰 dt에서 최초 geometry를 무효화했다. HHT predictor/rate/tangent와 dt/tolerance는 그대로다. 수렴 후 또는 trial 실패 시 retry/clamp는 없다. 독립 reviewer는 이 변경이 physics/scheme 변경이 아닌 시작값 선택임을 확인했고, N2 문구도 갱신했다.
## 4. 구현 현황과 파일 소유권
### 입력/semantic — 커밋됨
`include/fesa/model/{model_types,domain}.h`, `src/fesa/model/domain.cpp`, `src/fesa/io/abaqus/domain_mapping_context.cpp`, `tests/unit/io/abaqus/hht_dynamic_domain_test.cpp`.
DynamicStepDefinition, step/domain accessor, rho 연결, schedule/INC 검증, fail-closed unsupported controls, 원본 reference 무수정 mapping을 구현했다. 원본의 `0.1,10.,` 끝 빈 field도 허용한다. 추가 nonempty field는 거부한다. 기존 static/frequency 입력 의미는 유지한다.
### 적분과 procedure — main
- `include/fesa/analysis/hht_time_integration.h`
- `src/fesa/analysis/hht_time_integration.cpp`
- `include/fesa/analysis/hht_dynamic_procedure.h`
- `src/fesa/analysis/hht_dynamic_procedure.cpp`
- `src/fesa/analysis/hht_dynamic_internal.h`
- `src/fesa/analysis/hht_dynamic_assembly.cpp`
- `include/fesa/analysis/prepared_analysis.h`, `src/fesa/analysis/prepared_analysis.cpp`
- `src/fesa/app/fesa_application.cpp`
별도 dynamic lifecycle로 parse→initial a→full Newton→전체 accepted history→atomic HDF5를 연결했다. 기존 static lifecycle에 동적 분기를 누적하지 않았다. Deterministic local parallel evaluation 뒤 stable source reduction을 한다. Physical reaction은 full endpoint residual constrained selector, moment balance는 `Jl^-T` 공간 moment로 검증한다.
### 관성 및 대수 제약 — hht_inertia_completion
- `include/fesa/elements/nonlinear_mitc4_inertia.h`
- `src/fesa/elements/nonlinear_mitc4_inertia.cpp`
- `src/fesa/analysis/hht_dynamic_algebra.cpp`
- `tests/unit/elements/nonlinear_mitc4_inertia_test.cpp`
- `tests/unit/analysis/hht_dynamic_algebra_test.cpp`
- `tests/unit/analysis/hht_temporal_verification_test.cpp`
- `tests/unit/analysis/hht_energy_verification_test.cpp`
Exact director D1/D2/D3, I/M/c/DqI/DvI, T/P/L/rates, analytic moving null, scaled positive complement, local conditioning, global SPD factorization, W-scaled regularity, P/Z Gram, 초기 hidden constraints를 구현했다. 독립 검토에서 찾은 inverse cofactor 이중 부호와 `c=I-Ma` cancellation은 수정했다. 물리 20차원 local mass/rcond 및 partial-BC actual-free checks가 있다.
### 기존 nonlinear shell 확장 — main
`include/fesa/elements/nonlinear_mitc4_shell.h`, `src/fesa/elements/nonlinear_mitc4_shell.cpp`, `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`.
- physical/drilling force, drill energy/tangent/metric 분리.
- exact directional third energy variation으로 `D²f[v,v]`.
- 작은각 ExpSkew D3 cancellation을 stable series의 추가 directional derivative로 수정.
- **영변형 산술 수정**: decimal 좌표에서 초기 drill force가 약1.7e-9 생기고 normalized residual1이 되는 반례를 확인했다. Covariant increment에서 Green strain과 `F=I+delta_g⊗Gdual`을 직접 계산한다. Clamp 없이 수학적으로 같은 식이며 초기 exact-zero 회귀가 통과했다.
- **exact hidden2 scale**: 처음의 `sum_e |D²f_e[v,v]|`는 N3의 `|ψqq|[|v|,|v|]`와 달랐다. 독립 reviewer가 `ψ_i=σ_i Σ_e kd_e γ_ei`, `σ=1/||Jl^-1 d||`를 유도했다. 기존 second-order Jet로 scalar ψ Hessian을 구하고 **global (j,k)별 합산 후 abs contraction**하여 exact scale을 조립한다. 현재 공개 rotational F=0 조건의 식이다.
- 위 scalarψ/gradient/Hessian은 finite+warped fixture에서 nᵀf, n′ᵀf+nᵀK, Hessian FD와 대조해 통과했다.
### 상태/HDF5/log/comparator — hht_output_completion
- `include/fesa/analysis/dynamic_analysis_state.h`, `src/fesa/analysis/dynamic_analysis_state.cpp`
- `include/fesa/results/dynamic_results_writer.h`
- `include/fesa/io/hdf5/dynamic_hdf5_results_writer.h`, `src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp`
- `include/fesa/analysis/newton_iteration_log.h`, `src/fesa/analysis/newton_iteration_log.cpp`
- state/writer/log unit tests
State는 complete validated frame만 commit하고 실패 candidate는 기존 history를 보존한다. q/v/a/A 분리, frame0, zero corrections, triad/director/chart, source identity, residual/reaction 등을 검증한다. Writer는 full schema·dtype·attrs·values readback 뒤 atomic replace한다. Density/BC mask, physical spatial reaction, HDF5 diagnostic source_file/source_line 이름을 명시했다. 기존 static diagnostic file/line은 유지한다. Log는 별도 hht-log-v1; accepted frame마다 flush한다.
Comparator는 원본 101×9행, full HDF5 101×729×6 U/UR identity·finite 검사 후 projection, 202 families, 모든 scalar/error/branch, blocking U와 warning UR를 JSON으로 쓴다. Precheck 오류는 UR도 blocking이다.
## 5. 검증 결과 — 최초 작성 시점
### 이미 확보한 제한 evidence
- MSVC x64 **Debug** fesa_solver/fesa_cli/unit target build 통과(전체 configured Harness는 아직 미실행).
- 과거 검증 자료(정리됨): 29 tests PASS. State/writer/log, input, rotation 등을 포함한다. 전체 기능 suite를 뜻하지 않는다.
- 관성8 + rotation4 + algebra8 + C07 4개는 최신 최적화 focused binary에서 PASS.
- C01/C02/C03/C04b scalar temporal verification: prescribed grids의 q/v/physical a 차수·오차와 N7 evidence 확보.
- C07 alpha0 energy maximum defect `1.14353e-13`; default alpha endpoint energy defect `-2.45134e-5`; rho(omega*h=1000)≈`.904763`, analytic limit `.904762`; physical inertial support reaction oracle PASS.
- 작은각 threshold 양쪽/2e-4/1e-3 internal third derivative 검사, finite/warped scalar ψ Hessian 검사 PASS.
- `uv run --with h5py --with pytest python -B -m pytest -q tests/test_compare_hht_dynamic.py`: **41 passed**, main도 재실행 확인.
### C04a qualification — 지우거나 PASS로 바꾸지 말 것
C04a 시간수렴은 통과한다. Finest binary64 full2×2 대 scalar reduction의 acceleration 차이는 약 `3.079e-10`으로 계약1e-10보다 크지만 N7 산술/solve resolution 약 `6.296e-10`보다 작다. 해당 비교는 별도 `GTEST_SKIP`으로 **INCONCLUSIVE**를 남긴다. Coarse binary grids는 통과했고 decimal80 독립 수식 계산의 finest 차이는 `1.69e-73`이다.
과거 검증 자료(정리됨)은 고정밀 수학 identity 근거다. FESA binary64 finest 통과를 대체하지 않는다. Numerical reviewer가 이 구분을 N7에 맞는 qualification으로 확인했다.
### 아직 완료되지 않은 검증
- 최신 Debug focused 실행이 진행 중이다. 종료코드·최종 summary 확인 필요.
- Original reference는 **16/100 increments accepted**까지만 최초 작성 시 확인했다. 최종 HDF5/전체 비교는 아직 없다.
- C08a actual shell manufactured rigid orbit의 **시간 적분 검증은 미구현**. Pointwise independent volume oracle test는 작성되었으나 아직 빌드/실행 전이다.
- C08b free deformable 4-element plate의 5-grid, q/v/a self-convergence, energy/P/L, N7 test 파일은 작성되었으나 **아직 CMake 등록/빌드/실행 전**이다.
- C09–C11 일부 단위 evidence는 있으나 전체 production empty-channel/rigid-translation/failure100/determinism3회/회전된 전체모델 등 coverage를 acceptance 원문과 대조해야 한다.
- configured 전체 Debug build/CTest, 기존 static/eigen/reference regression, final physics evaluation은 미완료.
`focused-optimized.log`에는 과거 LargeDirectStep fixture의 부적절한 displacement<.1 예상 때문에 failure가 있다. 실제 첫 increment는 수렴했고 약-.3235였다. 해당 검사는 하중 방향·실제 N2 잔차 및 초기 가속도 크기로 수정했다. **수정 후 최신 Debug 결과를 확인해야 하며 이전 실패 로그를 통과로 승계하면 안 된다.** 같은 fixture의 두 번째 큰 dt increment가 chart 밖으로 나가는 것은 별도 negative evidence이며 현재 테스트는 시작값 회귀를 위해 최초 increment만 다룬다.
## 6. 현재 실행 중인 작업
세션 ID는 현 tool 세션에서만 유효하다. 새 세션에서 ID가 없으면 process/log/file 상태를 확인한다. 원본 input/CSV는 수정하지 않는다.
| 작업 | 상태/위치 |
|---|---|
| Original reference, optimized + MKL/OMP1 | `exec session_id=70291`; 과거 검증 자료(정리됨); live `reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_log.txt` |
| 최신 Debug focused suite | `exec session_id=81971`; 과거 검증 자료(정리됨) |
| Comparator pytest | 종료0, 41 passed; session88341 종료 확인 완료 |
| C08 작성 owner | `/root/hht_output_completion`; `tests/unit/analysis/hht_shell_physics_test.cpp` 준비, C08a temporal pending |
| Physics reviewer | `/root/hht_physics_evaluation`; 독립 `docs/hht-implicit-dynamics/README.md` 초안 및 실제 결과 기다리는 중 |
| Numerical reviewer | `/root/hht_formulation_review`; `implementation-numerical-review.md` 작성. NR005/006 closed, ADR010/N2 시작값 문서 갱신 전달 필요 |
| Inertia/algebra/temporal owner | `/root/hht_inertia_completion`; 현재 담당 파일 완료/idle, 추가 수정 시 재사용 |
main이 빌드를 직렬 조정한다. **빌드 중 public header를 변경하지 말 것.** 실제로 null_second 필드 제거와 optimized compile이 겹쳐 ABI 혼합/SEH가 발생했다. 해당 header touch 후 모든 의존 object를 재빌드하여 해소했고 kernel/rotation 재검증이 통과했다. 새로운 compile failure가 아니라 stale mixed ABI였으며 실패 로그는 보존한다.
## 7. 실행 환경과 명령
로컬 helper 과거 검증 자료(정리됨)이 VsDevCmd x64 환경과 dependency CMake dirs를 설정한다. 이 helper와 build 디렉터리는 개인 exclude이며 commit하지 않는다.
- VS: `C:/Program Files/Microsoft Visual Studio/18/Community`
- GoogleTest: `C:/git/googletest`
- MKL2026.1, TBB2023.1, HDF5 2.1.1
- 기본 검증: 과거 검증 자료(정리됨), preset `windows-msvc-ninja-debug`
- reference/긴 physics 실험용 추가 최적화 빌드: 과거 검증 자료(정리됨)
- 과거 검증 자료(정리됨)은 Debug preset과 binaryDir로 설정되어 있다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
PowerShell helper의 `-B`는 named parameter로 잘못 bind될 수 있어 위 array splat을 사용한다. `clang-format`은 `C:/Program Files/LLVM/bin/clang-format.exe`다. Python은 Korean Git output을 읽을 때 UTF-8 encoding을 명시한다. 환경 전체/자격증명을 출력하지 않는다.
## 8. 지정 reference 및 비교 정책
- 입력: `reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp`
- 비교 CSV: `reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv`
- INP SHA256: `b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5`
- CSV SHA256: `422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5`
- 729 nodes/676 S4, 10×10 flat plate, t=.5, E=2.1e11, nu=.3, rho2700.
- 104 boundary nodes all6 fixed; 625 free nodes, 3750 free DOFs; analytic mass positive3125/null625.
- Center node2, F=(-100000,-100000,-100000), constant STEP; h=.1,T=10,N=100,frames101.
- CSV: 101frames×9nodes=909rows; nodes2,21,22,69,70,165,309,442,586; U/UR6.
- 202 frame×family metrics. U blocking, UR warning; missing/extra/duplicate/nonfinite/time/identity 오류는 모두 blocking.
- `S=max(abs(reference))`, near-zero `.01S`, 일반 relative5%, family RMS1%, S0 exactzero. 공통 policy를 변경하지 않는다.
- CSV decimal schedule과 HDF5 double(n)*double(.1)을 각각 검증하고 increment로 대응한다. 최근접/보간은 금지한다.
- `h/T1≈7.4567`로 시간 해상도가 거칠다. Reference 일치만으로 finite-rotation/time accuracy/velocity/acceleration/energy를 검증한 것은 아니다.
## 9. 남은 작업의 권장 순서
1. 실행 중인 Debug focused의 종료·skip/failure 상세를 확인하고 필요한 수정만 수행한다. 검증된 I/O/kernel/procedure를 검토 가능한 단위로 commit한다.
2. C08 파일을 CMake에 등록하고 먼저 compile과 pointwise oracle, 이후 5-grid test를 실행한다. Optimized 실험에 더해 Debug에서 필요한 검증을 수행한다.
3. C08a의 time-dependent generalized F(t)는 trial null과 직교하지 않으므로 공개 zero-moment용 hidden 검사를 그대로 사용할 수 없다. Test-only에서 `ψ=nᵀ(f-F(t))`, `ψt=-nᵀFdot`, `ψqt=-n′ᵀFdot`, `ψtt=-nᵀFddot`와 full hidden derivatives를 계산한다. 외력은 독립 volume oracle에서 생성하며 production I를 다시 호출해 정답을 만들지 않는다. 현 owner에게 이 방침을 전달했다.
4. Original100increments 종료 후 HDF5를 comparator에 넣고 raw precheck/metrics 전량을 저장한다. 불일치를 분석하며 reference/tolerance를 조정하지 않는다.
5. Physics reviewer에 실제 C08/HDF5/comparison을 전달한다. Missing coverage와 물리적 타당성을 구별해 보고한다.
6. C09–C11, determinism3회, fail lifecycle, 기존 static/eigen 영향 검증을 보충하고 구성된 전체 Debug Harness/CTest와 필수 reference 비교를 수행한다.
7. Feature PRD·implementation report·numerical/physics reports를 실제 결과로 갱신한다. 이전의 전체 NOT RUN 기록은 이력과 현재 상태를 구별한다. C04a qualification은 유지한다.
8. 최종 diff/format/links/reference hashes를 확인하고 작업 파일만 commit한다. 생성 HDF5/log/build/개인 helper는 commit하지 않으며 push하지 않는다.
## 10. 추가 작업 기록
이 절에 시각, 변경, 실행 명령/결과, commit, 잔여 작업을 추가한다. 중간 상태를 최종 PASS로 덮어쓰지 않는다.
- 2026-09-22 최초 기록: 본문 snapshot 작성. Reference 16/100 accepted, 최신 Debug focused 실행 중. Comparator 41 tests의 main 재실행 PASS를 확인했고 작업을 계속한다.
- 2026-09-22 후속 확인: 독립 physics reviewer가 `physics-evaluation.md` 초안을 작성했다. 최신 Debug focused는 68 tests 중67 PASS/1 C04a INCONCLUSIVE SKIP으로 종료했다. Main은 다음 명령에서 종료코드와 summary를 직접 확인한다. C08 및 최종 reference 검증은 계속 PENDING이다.
- 2026-09-22 후속 작업: main이 Debug focused session81971 종료코드0을 직접 확인했다. 68 tests/67 PASS/1 INCONCLUSIVE SKIP, 총117.526s. Comparator41tests도 main 확인 완료. 구현 묶음을 로컬 커밋한 뒤 C08 파일을 등록한다. 신규 private test는 아직 이 Debug 실행에 포함되지 않았다.
- 2026-09-22 구현 커밋: `f0dc42a`에 HHT core/state/writer/log/comparator와 검증된 테스트를 커밋했다. 이후 `hht_shell_physics_test.cpp`를 tests/CMakeLists.txt에 등록했다. C08 build/run 결과는 다음 기록에 추가한다.
- 2026-09-22T21:41:48: C08 첫 Debug snapshot build PASS. 이후 owner가 C08a temporal fixture를 추가했고 optimized compile에서 GridEvidence.algorithmic_acceleration_gap 누락으로 실패했다. 테스트 파일 owner가 필드 위치 및 q_n 시작값을 수정 중이다. Production reference는75/100 accepted까지 확인했으며 최종 파일은 아직 기다린다.
- 2026-09-22T21:47:38: **원본 reference 완료**. Optimized MSVC/MKL1/OMP1 실행 session70291 exit0. 101frames HDF5 생성 완료. `reference-comparison.json` precheck441774scalars PASS, U101families PASS, blocking_failure0, UR100frames의 row/RMS 경고200건. 비교 exit0은 UR 일치나 전체 물리 gate PASS를 뜻하지 않는다. HDF5 공식 경로는 §8 input의 lexical sibling `shellNL-dyn-meshfine_results.h5`.
- 후속 검증: C08a pointwise independent volume force/power/momentum 및 explicit-time hidden checks PASS(max phi=.547572rad). **C08a temporal FAIL**: finest angular/chart-a 전체 최대오차5.67565924e-4>1e-4, 마지막 두 차수1.02867/1.02897<1.8. 일부 finest rate는 N7 error/noise100배 분리도 미달(INCONCLUSIVE). C08b도 FAIL로 종료했다. 전체 C08 optimized는3tests/1PASS/2FAIL,136.265s. 세부 실패는 c08-optimized.log에 있으며 원인 분석 중이다.
- 독립 수치 검토의 원인 후보: massless prescribed coordinate z(t)의 A0=a0 startup은 `a1-z''(h)=h*(1/(6*beta*(1+alpha))-1)*z'''(0)+O(h²)`를 만들어 일반 nonzero jerk에서 최대시간 acceleration 오차가1차다. C08 phi'''(0)는0이 아니고 관측 first/late 오차 경향이 일치한다. 이 주장은 독립 scalar 재현·null/physical error 분해로 추가 확인 중이다. **허용값을 완화하거나 startup 물리 계약을 몰래 바꾸지 말 것.** 실제 알고리즘/acceptance 변경이 필요하면 프로젝트 사용자 결정 경계를 따른다.
- 수정/커밋: `7b700ab fix: restore thickness factor in shell bending resultants`; flat face stress moment oracle에서 thickness .2/.5/2 모두 수정 전 FAIL을 확인했다(`bending-moment-red.log`). 수정 후 optimized 관련13 tests PASS(`recovery-green-optimized.log`). `d465245 test: cover unloaded HHT free degree channels`는 전체 free/병진만 free/회전만 free의 exact-rest 3 variants를 추가했고 optimized PASS다.
- 사용자 선택을 HHT-ADR-011로 기록: 정확도 요구를 유지하고 별도 acceleration recovery 후보를 정식화·검증한 다음 채택 여부를 결정한다. `formulation-acceleration-recovery.md`와 독립 검토 NR-012/013을 작성했다. 시간적분 history/공식 HDF5/schema는 변경하지 않았다.
- 진단 fixture는 `a_rec=a_h+N*eta`를 원 frame과 분리해 저장한다. `c08-recovery-probe-20260926.log` 전체3 tests/1 PASS/2 FAIL, exit1. C08a split loop가 빈 analytic metadata를 순회해 false-zero를 출력한 문제는 vector size 기반으로 수정했으며 `c08-recovery-split-spectrum-20260927.log`에서 다시 실행했다(2 tests/1 PASS/1 FAIL). 첫 로그의 C08a null/physical split=0은 유효 evidence가 아니다; full error와 C08b는 별도 검토했다.
- 복구 후보 결과: C08a finest angular-a `1.005829141075e-4`, 마지막 두 차수 `1.77942349/1.99162617`; 승인 기준 미달. 재실행 split의 null `4.64641213e-7`, physical `1.00582661e-4`. C08b finest recovered angular-a self difference `.8689386613`, physical `.8689381530`; q/v 실패는 그대로다. Hidden2와 Mdeltaa의 작은 값은 대수 보정 근거이며 실제 정확도 통과가 아니다. C08a N3 exact denominator 및 recovery-specific N7 noise 평가가 남아 있으므로 채택하지 않는다.
- 초기 spectrum 진단: 54 DOF 원 M/K를 별도 test로 출력하고 알려진 UR3 9개를 static condensation했다. Physical mass Cholesky PASS, condensed K symmetry defect0. 최고 각진동수319.8401253, h=1/1024에서 omega*h=.31234387. 과거 검증 자료(정리됨)에 raw eigenvalues와 grid별 값을 보존했다. 이는 initial linearized spectrum이며 nonlinear C08b 실패 원인 확정 또는 grid/tolerance 변경 승인이 아니다.
- 수정 후 원본 reference 재실행 exit0(session5757). `reference-after-recovery-fix.json` comparator exit0: 441774 scalars precheck, U101 PASS, UR200 warnings 유지. 원 INP/CSV SHA256은 §8과 동일하다.
- HDF5 대조: 수정 전 archive `reference-before-recovery-fix.h5`의 SHA256 `23bac93d1f7998b2f74a0f68767ae98a9899ee92c53f5170d08a814d3ee936d4`; 수정 후 공식 HDF5 `f07beddaa232abe314e20210534a243d6deaf1f677c598c64f9334428bbecb56`. 전체2033 datasets 중100개 noninitial section_resultant만 변경됐고 bending3 components는 정확히 기존의1/2, 나머지 모든 datasets는 bitwise identical이다. `reference-recovery-audit-20260927.json`에 기록했다. 직접 face stress 차분에는 tiny strain/high stiffness cancellation이 있어 별도 relative error3.868e-10을 기록했으며 1e-12 PASS로 주장하지 않는다.
- 전체 Debug Harness는 source 수정 전 snapshot으로 시작했다(session16398, `full-debug-20260926.log`). C08a FAIL 재현 후 장시간의 stale C08b만 main이 중단했다. CTest는 이를 non-pass로 기록하고 다른 검사를 계속하므로 전체 PASS로 해석하면 안 된다. 최신 core/recovery/C09/spectrum Debug build는 exit0이며 targeted run(session3213, `recovery-green-debug-20260927.log`)의 종료 결과를 아래에 추가한다.
- 2026-09-27 최신 Debug targeted exit0: `recovery-green-debug-20260927.log`,14 tests PASS/28.5s. Whole Debug snapshot은 exit1,475tests 중3failed/1skipped였다. C08a actualFAIL, C08b main중단, 기존 InpDomainMapping의 Dynamic-unsupported 기대가 실패 원인이다. 원 CTest 상세는 `full-debug-stale-snapshot-ctest.log`로 보존했다.
- Legacy mapper regression은 “other-procedure” fixture를 이제 지원하는 Dynamic 대신 미지원 Buckle로 바꿨다. 승인된 dynamic rejection/acceptance는 기존 HHT 전용 tests가 검증한다. 최신 전체 Debug build exit0 후 C08 temporal2개만 명시 제외한476test CTest를 실행 중이다(session11819, `regression-debug-excluding-c08-temporal-20260927.log`). 이것은 전체 solver gate PASS의 대체가 아니다.
- Physics reviewer가 새 HDF5를 독립 확인했다. 모든101frames M과 `t³Cκ/12`의 최대 symmetric relative error `1.94601e-16`, absolute `1.45519e-11`로 굽힘 오류 해소를 확인했다. Source/CSV/reference를 보정한 결과가 아니라 solver 재실행 결과다. `physics-evaluation.md` HHT-PHY-005는 해소하되 C08와 feature gate는 미통과로 유지했다.
- Spectrum 독립 재현은 original K/M eigenpair residual `2.63e-15`, mass orthogonality `8.79e-15`, analytic6 rigid-field K-action `2.28e-17`을 확인했다. Negative roundoff eigenvalues를 clamp하지 않았다. v=0 rest elastic spectrum이므로 실제 C08b finite initial velocity의 convective Jacobian/모드 가진/비선형 trajectory를 검증한 것은 아니다.
다음 담당자가 할 일: 회복 후보를 production에 넣지 말고 C08b physical q/v/a 차이의 시점·공간·모드별 원인을 분리, 필요하면 추가 fine-grid를 diagnostic으로 조사하되 기존 지정 grid FAIL은 보존; C08a recovery-specific N7 및 정확한 N3 scale 검증을 보충; C09–C11 잔여 항목을 PRD 원본과 대조; 정식화/정확도/출력 계약 채택은 구체적인 통과·실패 evidence를 제시한 뒤 결정한다. 현재 candidate는 검증 기준을 충족하지 않아 미채택이다.
- 2026-09-27 최종 확인: 최신 Debug CTest 명시 subset exit0,476개 중475 PASS/1 C04a SKIP,271.54s. 제외 항목은 C08a/C08b temporal2개이며 이 둘의 기존 FAIL을 숨기거나 전체 gate PASS로 바꾸지 않는다. Command는 과거 검증 자료(정리됨)다. Helper에 -E/-B를 줄 때 array splat을 사용한다.
- Commit `219473e`는 legacy unsupported-procedure fixture, `c8f6619`는 C08 failure/recovery/spectrum probes와 정식화·독립 검토·HANDOFF evidence를 보존한다. 이 실행의 모든 solver/test process는 종료 확인했다. 새 테스트/문서의 링크와 staged diff 정적 확인을 수행했고 원 input/CSV는 변경하지 않았다. CTest가 생성한 `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_log.txt`는 보조 untracked output이며 commit하지 않았다.
+26
View File
@@ -2,6 +2,32 @@
현재 구현의 목적·경계·소유권·검증 한계를 기능별로 요약한다. 정식화 원문은 유도와 당시 가정을 보존하며 현재 채택 여부는 README에서 구분한다. 문서 정리는 새 build/test 또는 외부 검증 통과를 뜻하지 않는다.
## 작업에 필요한 읽기 범위
시작은 루트 작업 지침, 해당 기능 README와 변경 영역의 지침이다. 아래 목록의 모든 문서나
링크를 한 번에 읽는 대신, 변경에 필요한 계약·유도·검사만 추가한다. AGENTS.md와 CLAUDE.md는
같은 지침의 도구별 진입점이므로 수동 읽기 목록에는 하나만 포함한다.
| 변경 내용 | 추가로 확인할 자료 |
| --- | --- |
| 공개 API·소유권·조립·상태 수명 | solver-core의 책임과 수명·공통 procedure 절, 대응 src와 consumer |
| 입력·결과·reference 비교 | solver-core의 CLI와 입력·결과와 reference 비교 절, 기능별 mapping과 검사 |
| C++ 구현·실패 처리 | solver-core의 개발 교훈과 검증 경계 절, 변경 동작을 검증하는 테스트 |
| 빌드·dependency | solver-core의 빌드와 직접 검사 절, cmake/msvc 지침과 실제 preset·target |
| 수식·물리·적분·절차 | 기능 README에서 채택한 formulation의 관련 유도·가정·검증 절 |
| 과거 연구·테스트 이관 감사 | 해당 연구 문서, manifest의 필요한 key 또는 이관표의 해당 identity 행 |
Formulation의 수식·가정은 원문으로 보존한다. 문서 안의 ready/미구현·후속 owner·옛 문서명은
작성 당시 기록일 수 있으므로 현재 구현·검증 여부는 기능 README에서 구분한다. 현재 요약으로
연결된 옛 ADR/research 링크가 원문 전체를 제공한다는 뜻은 아니다. 원문은 Git 이력에서 확인한다.
연구·과거 수식은 해당 문제를 조사할 때 선택하며 일반 기능 개발의 기본 읽기 목록에 넣지 않는다.
2026-10-18 통합의 실제 실행 범위와 미검증 항목은 [병합 현황](cpp-object-oriented-modular-refactoring/README.md#병합-결과와-검증-범위)에 있다.
과거 PASS를 최신 source의 미실행 범위로 승계하지 않는다. 읽기 묶음별 예상량은
[개발 컨텍스트 추정](development-context.md)에 정리했다.
## 기능별 요약
- [솔버 공통 구조·입출력·수치 비교](solver-core/README.md)
- [3D Euler beam](linear-static-3d-euler-beam/README.md)
- [MITC4 선형 정적 shell](linear-static-mitc4-shell/README.md)
+4 -3
View File
@@ -36,12 +36,13 @@ Hex8 기하 packet 수정본의 관련 Debug/Release82개씩, 독립 snapshot9,8
Shell 명시 영 seed 이후 SW60 수집은 partial이며 collector native4·target 종료 미관측, increment1까지 진행했다. 함수 sample의 Jet 산술·할당·작은 MKL 호출·OpenMP spin은 비용 후보지만 sample 부재를 cache hit 보장으로 바꾸거나 nested inclusive CPU를 합산해 wall time을 만들지 않는다. 전체 shell100초·최종 전체 Debug·원본5개 재실행·최종 물리 평가는 미완료다. 보류 후보의 PASS를 복원 source나 최신 통합본에 승계하지 않는다.
## Refactor 채택 시 보존할 성능 한계
## Refactor 통합 후 남은 성능 한계
Refactor의 2026-10-16 `0b8de3a` 당시 기록은 ShellNL whole elapsed가 원본 대비
Native+86.52%·CMake+120.91% 회귀했다고 보고한다. 이는 해당 source·환경의 과거 단일 기록이며
변산·메모리·배경 부하와 원인은 미확정이다. 이후 객체 복사 제거 revision의 정적 검증을
새 Release 성능 향상으로 승계하지 않는다. 원본 `.build` archive는 통합 작업 공간으로
자동 전달되지 않았으며 이번 병합에서 해당 시간의 원시 근거를 새로 재현한 것은 아니다.
이번 작업은 제품 bytes를 채택하고 검증하는 범위다. 지속 SpMV cache나 새 산술 최적화를
도입하지 않으며 성능 회귀 원인 해결·새 benchmark는 별도 작업으로 남긴다.
통합된 코드와 정적 검증 범위는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md)을 따른다.
새 Release 성능은 측정하지 않았다. 지속 SpMV cache나 새 산술 최적화를 도입한 것은 아니며,
성능 회귀 원인 해결·새 benchmark는 별도 작업으로 남긴다.
@@ -28,9 +28,12 @@ CLI는 입력 `.inp` 하나, lexical sibling HDF5·log, warning/오류 진단과
## Refactor 코드 채택 후 구조
2026-10-18 통합은 FESADev `7438c827` 이력에 Refactor `11f09eeb`의 제품 `.h/.cpp`
274개와 직접 MSVC 빌드를 선별 도입한다. 옛 구현을 섞는 호환 계층이나 새 정식화는 추가하지 않는다.
274개와 직접 MSVC 빌드를 선별 도입했다. 옛 구현을 섞는 호환 계층이나 새 정식화는 추가하지 않는다.
[파일 manifest](merge-manifest.json)는 원본 Git blob과 working bytes, 보존·도입 방침을 구분하고,
[테스트 이관표](test-migration.tsv)는 양쪽 기존 identity·assertion·oracle와 최종 위치를 연결한다.
Manifest의 초기 inventory와 중간 snapshot은 각 revision의 이력이며 현재 파일 목록이 아니다.
최종 범위는 `t5_static_scope_verification`·`t6_test_cleanup`·`t7_final_handoff`와 아래 반영 결과로
구분한다. 일반 기능 개발에는 두 대형 파일 전체가 아니라 필요한 key와 검사 identity 행만 읽는다.
- [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h)와
[factory](../../src/fesa/analysis/prepared_analysis.cpp)는 shell linear/nonlinear static,
@@ -59,166 +62,50 @@ CLI는 입력 `.inp` 하나, lexical sibling HDF5·log, warning/오류 진단과
출처 일치·compile·테스트 통과만으로 수치 동등성을 선언하지 않으며 독립 수치 검토와
영향받은 analytical/invariant·물리·reference 검증을 별도로 수행한다.
## 이번 병합의 현재 검증 상태
## 병합 결과와 검증 범위
T2/T3 단계에서 직접 MSVC와 CMake/Ninja의 Debug solver/CLI 및 세 테스트 target build가 완료됐다.
제품274개는 Refactor working bytes와 일치한다. 양쪽 실제 discovery는 unit849,
integration72, reference43으로 총964개이며 canonical identity가 일치한다.
당시 선별 실행은 CMake176개, Native15개, 합성 reference comparator28개,
Python145개가 failure/error/skip 없이 통과했다. 이는 전체964개 실행·실제 모델 비교 완료가 아니다.
근거는 작업 공간의 `.build/merge-verification/t2-20261018-01/`와
`t3-20261018-01/`에 있다. 원래 dev와 Refactor 저장소 및 기준자료는 보존했다.
2026-10-18 `dev`에 merge commit `762bd4b`로 반영했다. 제품 소스·헤더274개는
Refactor `11f09eeb`의 working bytes와 일치하며 직접 MSBuild가 주 개발 빌드다.
기존 FESADev 기능별 문서와 formulation23개를 보존했다. 과거 단계별 계획과 HHT 인계서는
현재 작업 트리에서 제거했으며 병합 직후 commit `762bd4b`의 `phases/`와 `HANDOFF.md`에서
원문을 복원할 수 있다. 현재 계약과 미해결 사항은 기능별 README가 소유한다.
2026-10-18 사용자 지시로 `reference/temp`는 검증에 사용하지 않는다. 정식 경로에 없는
`shellNL-meshfine`, `shellNL-meshfine_02`, `shellNL-meshfine-pressure` 자료는 복사·복원하지 않는다.
해당 실제 비교는 자료 미확보로 미완료이며 테스트를 skip 처리하거나 통과로 바꾸지 않는다.
전체 Debug 검증·독립 수치 검토·정식 자료 비교의 현재 진행은 아래 T5 중간 기록과 구분한다.
정리 전 필수 검증을 충족하지 못하면 테스트 삭제와 최종 병합 완료 판정을 진행하지 않는다.
T4 문서 갱신 자체로 build/test를 추가 실행하지 않았다.
Native와 CMake/Ninja의 MSVC x64 Debug 전체 target build, public header111개의 독립 TU
compile과 runtime DLL7개 대조가 통과했다. 양쪽 실제 discovery는 unit849·integration72·
reference43, 총964개로 일치한다. 사용자 지시로 정적·공통631개(unit555·integration35·
reference41)만 Native/CMake 직접 실행과 CTest에서 검증했고 failure/error/skip0이었다.
Python 합성·정책145개도 통과했다. 비정적333개는 보존했으며 미검증이다.
### T5 최초 중간 snapshot — 2026-10-18 03:00 UTC, 이후 범위 변경 전 이력
정식 정적5모델(beam, shell, shellNL, Hex8 linear/nonlinear static)은 fresh Refactor 기준·
통합 Native·통합 CMake 실행물에서 같은 scratch 입력 bytes와 경로로 총15회 실행했다.
등록 비교15개·보고서 검증15개·schema/identity/field parity5개를 포함한50단계가 exit0이었다.
Beam6가족212행, shell2가족294행과 Hex8 정적 U/RF/S는 기존 판정 계약을 따랐다.
ShellNL의 U blocking·UR warning-only, 내부 평형과 accepted free residual은 통과했으나
RF/RM3가족은 false/review-only이며 stress mapping은 미판정이다.
2026-10-18에 전체 Native Debug 솔루션, CMake Debug configure/build와 Ninja dependency
검사를 새로 실행해 모두 exit0을 확인했다. 제품102 compile unit의 dependency가 유효하고,
양쪽 세 테스트 executable의 실제 identity는 unit849·integration72·reference43,
CTest964개로 일치한다. Public header111개는 각각 독립 TU로 private/vendor include 경로 없이
MSVC C++17 `/EHsc /W4 /WX /MDd /Zs` 검사를 통과했다. CLI·test의 네 runtime 디렉터리에서
DLL7개의 SHA256이 같다. 제품274개와 정식 reference32개 bytes도 중간 기록 전에 재확인했다.
`reference/temp`의12개 경로는 byte 검증 대상에서 제외했고 입력·CSV·결과를 사용하지 않았다.
테스트·helper 삭제는0개다. 동등 대체나 폐기 구조 전용임을 입증하지 못한 항목은
[정리 검토](test-cleanup-review.md)에 따라 유지했다. 이관표의 원래2,876행·12열을
보존하고 최종 판단3열만 추가했다. 최종 단계는 문서만 변경했으므로 build/test/solver를
반복하지 않고, 코드·검사·등록·실행물·입력 hash가 같은 정리 전 실제 근거를 재사용했다.
독립 최종 검토는 차단사항0이며 전체 솔버 물리 검증 승인을 뜻하지 않는다.
Native unit 전체는 필터 없이 계속 실행 중이며 **전체 종료 코드와 XML은 아직 없다**.
중간 stdout에서 완료57개 identity를 관측했으며 다음 개별 검사는 새로 PASS 종료했다.
## 검증 기록과 후속 확인
- `ReducedManufacturedControllerKeepsExactInitialOrbit`: 396862ms.
- `C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence`: 7-grid, 7153515ms.
- `C08bInitialPhysicalSpectrumProbe`: 716ms.
- `PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid`: 539678ms.
근거는 저장소 root의 `.build/merge-verification/refactor-integration-final-20261018-01/`에
보존했다. `archive-inventory.json`은 원래 경로와 보관 위치·SHA256·크기를 연결한다.
실행물9개·DLL35개·fresh Refactor source304개와 실패·중단 기록을 포함한1,379개 파일의
복사 hash를 확인했다. `worker-raw/t7-20261018/final-static-state.json`,
`final-review-ko.md`와 `post-merge-check.json`이 최종 검토·반영 결과를 기록한다.
기록이 없는 다른 checkout에서 과거 통과를 현재 실행 결과로 취급하지 않는다.
현재 `C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`의8-grid를 수행한다.
h=1/64·1/128·1/256·1/512·1/1024의 계산 요약이 생성됐으나 남은8192·16384·32768증분
fine-grid와 최종 시간수렴·물리 gate는 미완료다. 모든 grid의 총 증분수는57840이다.
CPU/RSS 상승이나 부분 로그를 전체 통과 근거로 삼지 않는다. Native 나머지 executable,
전체 CTest와 Python suite는 같은 직렬 큐에서 대기하며 임의 timeout·skip·필터를 추가하지 않았다.
최초 integration 실행은 긴 TMP의260/261자 lease 경로 때문에 output-busy로 실패했다.
동일 exe/identity에서 긴 TMP exit1→짧은 TMP exit0을 확인하고 양쪽 integration35개
전체를 짧고 고유한 TMP에서 다시 실행해 통과했다. 원실패는 보존했으며 제품·검사·
허용치는 바꾸지 않았다. 후속 실행도 짧고 고유한 TMP/TEMP를 사용한다.
Refactor 원본 밖 별도 source snapshot304개에서 Native Debug 기준 solver/CLI를 새로
빌드해 exit0과 DLL7개 일치를 확인했다. 정적5모델을 포함한 정식 입력11개에 대해 기준·Native·
CMake 실행물을 같은 scratch 입력 경로와 bytes에서 직렬 실행하고 schema·identity·각 field를
대조하는 후속 큐를 준비했다. **새 실제 모델 실행·비교는 아직 시작하지 않았다.** 보고서 JSON의
case·policy·quantity와 실제 exit를 확인하며, parity의 빈 결과·자료 부재·dtype 차이·불일치는
nonzero로 남긴다. Exact field assertion의 불일치를 새 물리 허용치 위반으로 승격하지 않고
출처·dtype·identity·rounding 차이를 분류한 뒤 기존 승인 기준과 대조한다. 임시 도구의 합성
증거 하한 검사9건은 솔버나 물리 검증 통과가 아니다. 빈 결과·자료 누락의 옛 false-green을
각각 exit0으로 재현하고 수정 후 exit1·exit2가 되는 것을 확인했다.
독립 수치 검토는 명백한 식 오류나 승인 기준 변경을 발견하지 못했으나 `CONCERNS`다.
inverse→factor solve·Jet·eigen whitening·paired 산술과 spatial RM 변환은 rounding graph에
영향이 있어 비트 보존을 가정하지 않는다. 특히 `hdf5_primitives.cpp`, dynamic/nonlinear HDF5
writer의 `J^T m=g` LU action은 T2 영향 routing 누락을 T5 manifest에 보충하고 finite-rotation
virtual-work·완전 inverse action·HDF5 reaction readback 검사 identity에 연결했다.
이 정적 검토를 실제 전체 실행·reference closure의 승인으로 해석하지 않는다.
정식 `shellNL-meshfine`·`shellNL-meshfine-pressure`는 자료 미확보로 미실행이고,
`shellNL-meshfine_02`는 자료 부재와 현재 comparator 연결 부재를 함께 남긴다.
Thermal 새 필수 reference 부재와 기존 NT11 diagnostic/nonblocking 불일치도 유지한다.
필수 gate를 충족하지 않았으므로 테스트 삭제·T6 진입·최종 병합 완료 판정을 진행하지 않는다.
중간 근거는 `.build/merge-verification/t5-20261018-01/before-prune/`에 있으며
`running-checkpoint.json`과 `progress.jsonl`이 실행 큐·PID·현재 관측을 보존한다.
파일 manifest의 `t5_before_prune_verification`은 이 중간 snapshot을 기록하며 T1/T2/T3 원필드는 보존했다.
### T5 사용자 승인 정적 범위 — 검증 완료, 제한 유지
사용자는 장시간 HHT 동해석 검증을 중단하고 정적 해석 검증 후 다음 단계로 진행하도록
범위를 변경했다. 위 최초 snapshot의 전체 큐·미완료 gate 설명은 당시 이력이다. 현재는
HHT·solid dynamic·eigen/frequency·transient thermal 실제 수치 실행을 유예하고 해당 테스트를
보존한다. 기존 전체 큐와 후속 watcher는 `user_cancelled_static_only`로 종료했으며,
부분 stdout·미생성 XML·취소 근거를 보존했다. 이를 수치 실패나 통과로 계산하지 않는다.
현재964개 identity를 source body·경로·행·SHA256에 대응시켜 정적·공통631개(unit555,
integration35, reference41)를 선택하고333개를 유예했다. 과거 정적553개는 분류 근거로만
읽었으며 그중11개를 유예하고 현재 추가 공통89개를 포함했다. 순수 SO3 미분·좌표변환,
mock 수명·dispatch, parser/mapping 및 합성 comparator 정책 검사는 포함하고 실제 비정적
procedure를 호출하는 검사는 제외했다. 선택표는 `before-prune/static-only/selection.json`에 있다.
새 직렬 실행은 Native·CMake의 선택631개, 명시적 목록 CTest631개 및 Python 합성·정책
검사다. 고유 C++ 검사 수는631개이며 실행 경로별 수를 합쳐 고유 검사 수로 보고하지 않는다.
Native·CMake 각631개 및 CTest631개가 실제 exit0·skip0으로 확인됐다. Native/CMake의
unit555·reference41은 처음 실행에서 통과했고 integration35는 아래 환경 대조 후 전부 통과했다.
CTest JUnit의 실제 이름을 canonical identity로 역매핑해 선택631개와 누락·중복0을 확인했다.
Python 합성·정책145개도 exit0·failure/error/skip0이며 실제 비정적 물리 검증으로 세지 않는다.
정식 정적5모델도 fresh Refactor 기준·통합 Native·통합 CMake에서 같은 scratch 입력 bytes/경로로
총15번 실행했고 등록 비교15개·보고서 검증15개·schema/identity/field parity5개가 모두 exit0이다.
추가 정식 shellNL 자료의 부재와 `_02` comparator 연결 부재는 미완료로 유지하며, 확보된
정적 범위의 gate가 충족되면 다음 단계로 진행할 수 있다는 사용자 지시를 따른다.
임시 parity 도구의0길이 dataset만 있는 파일 false-green도 실제 exit0으로 재현했다.
필수 inventory와 파일 전체의 비어있지 않은 data 검사를 추가한 도구는 같은 경우 exit1,
의미있는 합성 동일값 exit0·불일치 exit1을 보였다. 개별0길이 dataset은 허용한다.
이는 임시 도구 검증이며 제품 물리·reference 통과를 대신하지 않는다. 현재 근거 경로는
`.build/merge-verification/t5-20261018-01/before-prune/static-only/run-20261018-01/`이다.
정적 모델의 beam은 U/UR·RF/RM·section actions6가족212행, shell은 U blocking·UR warning-only
2가족294행을 기존 기준으로 비교했다. ShellNL은 translation blocking·rotation warning-only와
내부 force/moment balance·accepted free residual을 통과했다. RF/RM3가족의 수치 비교는
**false/review-only**로 보존하며 stress mapping은 여전히 미판정이다. Hex8 선형·비선형 정적은
각 Step-1/increment10의 U(length)·RF(force)·S(force/length²)를 원본 CSV·source identity와
기존5%/1% 기준으로 비교했다. 개별 quantity/frame/policy·원본/실행물/결과 hash 및 literal
argv/cwd/env는 manifest와 raw `final-static-summary.json`·각 closed execution record에 있다.
초기 Native/CMake integration에서는 같은 application 검사1개가 각각 output-busy로 실패했다.
Native 실패 lock 경로261자, CMake260자였으며 동일 Native exe·동일 identity에서 TMP/TEMP만
바꾼 대조가 긴 경로 exit1→짧은 task-owned 경로 exit0을 보였다. 짧은 고유 TMP에서 양쪽
integration35개 전체를 다시 실행해 identity35·exit0·failure/error/skip0을 확인했다. 원래
실패 XML/log와 최초 큐 aggregate exit1은 환경/경로 한계로 보존했다. 제품·테스트·허용치는
바꾸지 않았다. 모델 input/result/lock 길이도 사전 확인했으며 최대193자다.
독립 정적 수치 보충 검토는 `CONCERNS / required_static_missing=false`다. 선택631개의
정적 수치 필수 coverage 누락은 발견하지 못했으며, 이를 RF/RM·stress mapping 또는 유예
기능의 물리 승인으로 확대하지 않는다. 사용자 수정 범위의 정리 전 정적 gate는 충족했으므로
다음 단계로 진행할 수 있다. 비정적333개·누락 정식 fine/_02/pressure 비교·열해석 새 reference
부재와 기존 NT11 diagnostic 제한은 미완료로 유지한다. 테스트 정리·최종 병합은 아직 수행하지 않았다.
### T6 정적 범위 검사 정리 — 삭제 0개
[최종 정리 검토](test-cleanup-review.md)에 따라 검사·helper를 모두 보존했다.
실제 본문에서 public/private owner, 실패 뒤 출력·factor 보존, TLS·FP flags·비트 및
독립 frozen oracle의 경계가 달라 동등 대체를 입증하지 못했다. 폐기 구조만 검사한다고
확정할 근거도 없었다. 비정적333개와 자료 없는 fine/_02/pressure 관련 검사는 보존한다.
이관표2,876행의 원래12열은 그대로 두고 최종 판정·근거 연결3열만 추가했다.
검사 source·helper·양쪽 등록 변경이0이므로 문서 전용 정적 검토만 수행했다.
T6 raw `.build/merge-verification/t6-20261018/`는 원셀 보존, 현재964개 body와 선택631개,
Native/CMake 등록·제품274개·T5 실행물/hash 보존을 확인한다. T5 당시 실행 결과를
새 실행으로 보고하지 않으며 전체964개 PASS도 주장하지 않는다. 최종 정적 검증과
병합 완료 판정은 T7에 남긴다.
### T7 최종 정적 검증과 근거 보존 — 통합 승인 전
이 절이 위의 최초 전체 실행 snapshot·T5/T6 진행 상태보다 최신이다. T6/T7에서 코드·검사·
helper·비교 도구·빌드 등록을 바꾸지 않았으므로 문서 전용 변경에 대한 지침에 따라 build/test와
모델을 반복 실행하지 않았다. 대신 T5 검증 commit `4841f122`와 최종 코드 상태 `4846206e`의
해당 입력 집합이 같음을 확인하고 실제 실행물·DLL·입력·결과의 hash를 대조했다. 이 확인을
통과한 **T5 실제 실행 근거를 재사용**하며 T7의 새 실행으로 세지 않는다.
새 정적 검토는 제품274개 Refactor bytes,964개 검사 body·631개 선택/333개 보존, 이관표
원셀·정리 판정, 양쪽 등록과 실행물, 성공 XML8개와 정적5모델×3실행물의 closed record15개·
전체50단계 exit0을 확인했다. Formulation23개와 상대 링크397개, 루트 AGENTS/CLAUDE 동일성,
원래 두 저장소 pin과 정식 reference32개를 확인했다. 최초 보호 목록55개 중 temp12개를
읽기·hash 대상에서 제외하고 나머지43개 원본·로그·설정·과거 계획을 대조했다.
삭제한 검사·helper는0개이며 전체964개 또는 유예333개를 통과로 보고하지 않는다.
원시 근거는 작업 worktree 정리 뒤에도 유지하도록 원래 FESADev root의
`.build/merge-verification/refactor-integration-final-20261018-01/`에 복사했다.
`archive-inventory.json`은 원래 절대 경로→보존 위치·SHA256·크기를 연결한다. Worker raw,
base의 문서/독립 수치 검토 raw, 실제 실행물9개·runtime DLL35개(5디렉터리×7개), 새로 빌드한
Refactor 기준 source304개 등1,379개 파일의 복사 hash를 확인했다. 기존 실패·중단·옛 임시 도구
기록도 포함하며 원본을 이동·삭제하거나 과거 argv/cwd를 다시 쓰지 않았다. 현재 근거는
`worker-raw/t7-20261018/final-static-state.json`과 `archive-integrity.json`에서 찾을 수 있다.
HHT 등 비정적 검증과 미확보 fine/_02/pressure 비교, ShellNL RF/RM false/review-only·응력
mapping 미판정, 열해석 reference/NT11 제한은 그대로 남는다. 승인된 정적 범위의 최종 상태를
확인했으며 독립 최종 검토와 사용자 통합 승인 후 원래 dev에 반영한다. 아직 원래 dev 병합·
원격 push를 수행하지 않았다.
HHT 전체 큐는 사용자 요청 중단으로 보존하며 수치 FAIL/PASS로 세지 않는다.
HHT·solid dynamic·eigen/frequency·transient thermal 수치 실행, 정식 fine/_02/pressure
자료 누락과 `_02` comparator 연결 부재, 열해석 새 reference와 NT11 diagnostic 제한은
미완료다. `reference/temp`는 검증에 사용하지 않는다. 정적 통과를 이 범위의 완료나
테스트 삭제 근거로 확대하지 않는다. 수치 변경의 독립 검토도 rounding graph 변화와
실제 runtime 미검증 영역을 구분하며 과거 Dev와 bit 동일성을 보장하지 않는다.
@@ -1,15 +1,15 @@
# T6 검사 정리 판정 — 승인된 정적 범위
# 2026-10-18 병합 테스트 정리 근거
삭제는 **0개**다. 검사 본문·helper·CMake/MSVC 등록을 변경하지 않았다.
같은 행동·실패 경계·수치 조건의 동등 대체 또는 폐기된 내부 구조만 검사한다는 근거가
충분한 후보를 찾지 못했다. 모든 검사가 서로 독립적이라고 증명했다는 뜻은 아니다.
판정이 불충분한 검사를 보존한다는 R6 계약을 적용했다.
동등한 대체 또는 폐기 구조 전용임을 입증하지 못한 검사는 보존한다는 기준을 적용했다.
[이관표](test-migration.tsv)의 기존 2,876행·12열·identity·assertion 셀은 보존하고
`cleanup_decision`, `cleanup_reason_id`, `cleanup_evidence` 3열만 덧붙였다.
Dev/Refactor의 같은 최종 검사로 연결되는 두 행은 출처 이력이며 실행 중복이 아니다.
삭제가 없으므로 대체 identity도 없다. 아래 identity는 **대체 지정이 아닌 비교 검토 대상**이다.
`disposition`, `final_sha256` 등 옛 셀과 T3 manifest는 당시 이력으로 그대로 둔다.
`disposition`, `final_sha256` 등 옛 셀과 manifest의 이관 당시 기록은 그대로 둔다.
## R-DEFER
@@ -78,7 +78,7 @@ dtype/shape·없는 자료의 not-run도 solver 실제 실행과 다른 합성
## R-STATIC
현재 정적·공통 선택 identity는 유지한다. T5의 source body/행/hash와 현재 본문을
정리 당시 정적·공통 선택 identity는 유지했다. 정리 전 source body/행/hash와 최종 본문을
대조하고 이관표의 최종 macro identity에 연결했다. 완전한 대체의 행동·실패 경계·수치
조건을 입증하지 못했으므로 기존 assertion과 독립 oracle를 보존한다. 실행 성공·장시간·
과거 제외 여부를 삭제 근거로 사용하지 않았다.
@@ -90,15 +90,17 @@ dtype/shape·없는 자료의 not-run도 solver 실제 실행과 다른 합성
변경이 만든 orphan은 없다. 기존 helper의 모든 간접 참조를 의미적으로 입증했다고
주장하지 않으며, 참조 없는 폐기 구조라고 확정할 근거가 부족한 항목도 보존한다.
## 정적 검증과 인계
## 검증 기록과 최종 반영
T6 raw는 `.build/merge-verification/t6-20261018/`다. `audit.py`는 솔버/테스트를 실행하지
않고 TSV 원셀·전체 최종 행 분류, T5 964개 body 및 631/333 선택, 양쪽 source 등록,
제품274개 Refactor bytes, T5 실행물·기준자료·원본 manifest 보존을 검사한다.
구체 명령·exit·hash·검사 수는 `audit.json`과 manifest의 `t6_test_cleanup`에 기록한다.
검사 source·등록 변화가 0이므로 AGENTS의 문서 전용 규칙에 따라 build/test를 재실행하지 않았다.
당시 정적 감사 자료는 저장소 root의
`.build/merge-verification/refactor-integration-final-20261018-01/worker-raw/t6-20261018/`에
보존했다. `audit.py`와 `audit.json`은 TSV 원셀·최종 분류, 964개 body·631/333 선택,
양쪽 등록·제품274개·실행물·기준자료의 보존을 확인한 당시 명령과 결과다.
옛 절대 경로와 보관 위치의 대응은 상위 보관 폴더의 `archive-inventory.json`에서 찾는다.
문서 전용 변경에 새 build/test를 실행한 기록은 아니다.
T5 Native/CMake/CTest 각631·Python145, 정식 정적5모델의 기존 실행 근거를 그대로
인계한다. T6 정적 검토를 새 solver 실행·전체964개 PASS로 보고하지 않는다.
정리 전 실제 Native/CMake/CTest 각631개·Python145개와 정적5모델 근거를 최종 상태와
대조했고 `762bd4b`로 dev에 반영했다. 전체964개 PASS를 뜻하지 않는다.
비정적333·fine/_02/pressure·thermal 새 reference와 NT11 제한, ShellNL RF/RM
false/review-only와 stress mapping 미판정은 유지한다. T7 최종 정적 검증은 별도 작업이다.
false/review-only와 stress mapping 미판정은 유지한다. 최종 실행 범위와 자료 위치는
[병합 결과](README.md#병합-결과와-검증-범위)에 정리했다.
+60
View File
@@ -0,0 +1,60 @@
# 기능 개발 문서와 컨텍스트 예상량
2026-10-18 작업 트리의 UTF-8 텍스트를 기준으로 한 대략값이다. 모델별 tokenizer 실측이
아니며 대화·시스템 지침·도구 정의·새 로그·작성 중인 코드와 답변은 포함하지 않는다.
같은 자료를 다시 출력하면 그만큼 더 사용하므로 아래 표는 파일을 한 번씩 읽는 경우다.
## 작업별 문서 묶음
먼저 [기능 색인](README.md)의 변경별 읽기 범위에 따라 필요한 자료를 선택한다.
루트 지침은 읽기 묶음마다 한 번만 계산하며 AGENTS.md와 동일한 CLAUDE.md를 중복 합산하지 않는다.
저장소의 지침24개를 모두 읽는 대신 실제 변경 경로의 상위 지침과 관련 영역 지침을 선택한다.
| 읽는 범위 | 예상 토큰 |
| --- | ---: |
| 루트 AGENTS.md 하나 | 약 2천~4천 |
| 루트 → src/fesa → analysis 지침 한 경로 | 약 3천~6천 |
| 일반 beam C++ 개발 문서 | 약 6천~1만2천 |
| 위 문서와 beam formulation 원문 전체 | 약 1만8천~3만4천 |
| HHT 현행 수식 문서 묶음 전체 | 약 2만9천~5만4천 |
| 일반 beam 개발 문서와 아래 소스·테스트3개 전체 | 약 2만2천~3만8천 |
일반 beam 묶음은 루트 지침·색인·beam README, include/fesa·src/fesa·elements·tests 지침과
solver-core의 개발 교훈·검증 경계 절이다. 수식 변경 예시는 책임·수명 절과 formulation 전체를
추가했다. API·I/O·빌드가 바뀌면 해당 공통 절과 consumer를 더 확인해야 한다.
HHT 묶음은 관련 기본 지침·README·공통 수명/검증 절과 현행 관성·축소 좌표·고정 null 기저·
carried-A noise 원문이다. 과거 full-coordinate/consistent 수식과 미채택 연구까지 일괄 포함한
값은 아니다. 실제 변경에 해당하는 절만 읽으면 원문 전체를 읽는 예시보다 줄일 수 있다.
소스 포함 예시는 [공개 beam header](../include/fesa/elements/euler_beam_3d.h),
[beam 구현](../src/fesa/elements/euler_beam_3d.cpp),
[요소 테스트](../tests/unit/elements/euler_beam_3d_test.cpp) 전체를 읽는 경우다.
다른 기능의 소스·테스트·실행 출력 크기는 다르므로 이 값을 전체 기능의 고정 예산으로 쓰지 않는다.
기존의 공통 요약 전체를 기본 필독으로 읽던 같은 beam 예시는 약 9천~1만7천 토큰이었다.
관련 절을 고르는 현재 안내는 그 예시의 중간 추정량을 약 25~30% 줄인다. 수식과 검증 기준을
삭제해서 얻는 감소가 아니며, 코드·도구 출력까지 포함한 전체 세션의 절감률도 아니다.
## 통째로 읽을 때 큰 자료
| 자료 | 예상 토큰 |
| --- | ---: |
| 현재 관리 Markdown64개, 생성물·보관본 제외, CLAUDE 중복·조건부 스킬 포함 | 약 18만~34만 |
| 병합 manifest JSON + 테스트 이관 TSV, 약4.74MB | 추가 약 100만~168만 |
Manifest는 초기 목록과 후속 단계의 검증을 누적한 감사 자료다. 필요한 key를 선택하고,
이관표는 `original_identity`·`final_identity`·`final_path` 등으로 해당 행만 찾는다.
전체 자료를 기본 개발 컨텍스트로 넣지 않는다. 상세 수식·역사적 연구는 관련 쟁점을
검토할 때 읽으며, 과거 PASS와 미검증 범위는 각 기능 README에서 확인한다.
## 추정 방법과 한계
실제 문자 수를 ASCII·한글 음절/자모·기타 Unicode로 나눴다. ASCII는 3~5문자당1토큰,
한글은 문자당1~2토큰, 기타 문자는0.5~2토큰이라는 넓은 가정으로 범위를 계산했다.
중간값은 각각4문자당1·문자당1.5·문자당1로 두었다. 이 계수는 예측을 위한 가정이며
특정 모델의 토큰 분할 규칙이 아니다. 영어 식별자·LaTeX·숫자·한글 혼합 비율에 따라 달라진다.
실제 세션에는 사용자 요청·이전 대화·플랫폼 지침과 도구 결과가 더해진다. 문서 추정량을
모델의 전체 context 한도나 요금으로 해석하지 않는다. 큰 테스트 파일·JSON·반복 실행 로그는
필요한 구간을 먼저 검색하고, 수식 변경에는 관련 유도·가정·실패 경계와 독립 검증을 생략하지 않는다.
@@ -1,5 +1,8 @@
# Hex8 정식화와 검증 불변량
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
적용: [PRD](README.md)의 FEM-REQ-HEX8-002–007,012–018,021.
물리 선택은 [ADR](README.md)에 있다. 이 문서는 승인된 식의 구현용 유도이며
외부 결과에 맞추어 physics를 바꾸는 권한이 아니다. 수치 controls는
@@ -1,6 +1,6 @@
# Hex8 동해석 high+low 정식화
2026-10-11 질량 정책 변경: [HEX8-ADR-010](README.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](README.md)의 현재 checklist를 따른다.
2026-10-11 질량 정책 변경: [HEX8-ADR-010](README.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 현재 구현·재검증 상태는 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와 옛 source 문서명은 작성 당시 이력이며 원문은 Git 이력에서 확인한다.
적용: 사용자가 2026-10-09 선택 A로 승인한 [정밀도 제안](README.md).
기본 물리식·DOF·부호·적분점 순서는 [formulation](formulation.md), 판정 원본은
+12 -13
View File
@@ -8,7 +8,7 @@ MITC4 shell의 유한회전 기하비선형 동해석이다. S4/S4R은 FESA-MITC
shell schema v2**다. 과거 consistent 질량·full-coordinate v1 근거를 변경본 통과로 승계하지 않는다.
2026-10-13 기록에서 ADR-018의 실제 C09와 공식 Release C08a 7-grid는 통과했다.
최신 전체 Debug는 856개 중 44개 PASS 후 사용자 중단됐고 Release C08b도 중단됐다.
당시 전체 Debug는 856개 중 44개 PASS 후 사용자 중단됐고 Release C08b도 중단됐다.
당시 원본 Release 해석은 증분99·t=9.9까지 accepted 로그만 남아 HDF5 비교가 불가능했다.
사용자 중단 exit -1은 수치 FAIL이나 PASS가 아니다. 이후 2026-10-14 성능 baseline은
원본을6372.325621초/native0으로 완료하고 schema v2·729nodes/101frames를 확인했다.
@@ -18,9 +18,11 @@ shell schema v2**다. 과거 consistent 질량·full-coordinate v1 근거를 변
## 채택 방법과 산술 의미
[기본 정식화](formulation.md), [관성](formulation-inertia.md),
[축소 좌표](formulation-reduced-coordinate.md), [고정 null 기저](formulation-fixed-null-basis.md)가
수식의 상세 원본이다. 초기 null과 실제 free 공간의 교집합에서 고정 sparse 열 Lp/Lz를
현재 물리·관성은 [관성 상세](formulation-inertia.md), 시간적분·graph는
[축소 좌표](formulation-reduced-coordinate.md), plane basis·scaling은
[고정 null 기저](formulation-fixed-null-basis.md)를 순서대로 읽는다.
[기본 정식화](formulation.md)의 full-coordinate recurrence는 비교 이력이다.
초기 null과 실제 free 공간의 교집합에서 고정 sparse 열 Lp/Lz를
만들고 coupled graph root를 풀어 full `q=Q(p,t)`를 재구성한다. v와 physical a는 Q의
chain rule로 복원한다. 부분 회전구속을 full clamp로 바꾸거나 모든 node에 동일 reduced
차원을 강제하지 않는다. Fixed patch 밖에서 검증된 history transport가 없으면 실패한다.
@@ -36,7 +38,7 @@ Lumped는 회전 block의 scalar diagonal 치환이 아니다. Epsilon inertia
Primitive hidden-gradient authority, tiny director increment와 coefficient-first inertia contraction은
큰 병진과 작은 회전의 소실을 줄이는 구현이다. Force·tangent·recovery는 같은 state/energy를
사용한다. [Carried-A 산술](formulation-carried-a-noise.md)은 noise indicator의 범위를,
[가속도 복구 후보](formulation-acceleration-recovery.md)는 채택 경로와 다른 후보를 설명한다.
[가속도 복구 후보](formulation-acceleration-recovery.md)는 미채택 후보의 과거 연구를 설명한다.
## 입력·출력·reference 계약
@@ -134,13 +136,10 @@ C08b finer-grid·최신 최적화 source의 원본 HDF5 비교·전체 회귀·
[ShellHhtIntegrator](../../src/fesa/analysis/hht_reduced_integrator.h)는 predictor/rate 복원을,
[EquilibriumStep](../../src/fesa/analysis/equilibrium_algorithm.h)은0부터 시작하는 correction과
typed pending을 분리한다. History는 procedure가 소유하고 동일 acceptance 뒤 commit한다.
빌드·선별 검사 결과는 [통합 현황](../cpp-object-oriented-modular-refactoring/README.md)을 따르며,
과거 interrupted run·finest binary64 noise의 미판정을 새 전체 통과로 바꾸지 않는다.
## 이번 병합 검증의 사용자 변경
2026-10-18 사용자가 장시간 HHT 검증을 중단하고 정적해석만 검증해 다음 단계로
진행하도록 변경했다. Native 전체 실행의 부분 stdout·기존 결과는 보존하되 현재 HHT
전체 PASS나 수치 FAIL로 계산하지 않는다. 비정적 테스트는 삭제하지 않는다. 완료된 개별
검사와 중단된 C08b의 범위·근거는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md)에
구분한다. 이 실행 범위 변경은 정식화·허용치·시간수렴 요구 자체의 변경이 아니다.
진행하도록 변경했다. Native 전체 실행의 부분 stdout·기존 결과와 비정적 테스트는
보존했다. 당시 interrupted run·finest binary64 noise의 미판정은 현재 HHT 전체 PASS나
수치 FAIL로 승계하지 않았다. 완료된 개별 검사와 중단된 C08b 및 병합 선별 검사의
범위·근거는 [통합 현황](../cpp-object-oriented-modular-refactoring/README.md)을 따른다.
이 실행 범위 변경은 정식화·허용치·시간수렴 요구 자체의 변경이 아니다.
@@ -1,11 +1,15 @@
# 제약 일관 가속도 복구 후보
2026-10-11 질량 정책 변경: [HHT-ADR-012](README.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](README.md)의 현재 checklist를 따른다.
읽기 구분: 2026-09-26의 미채택 acceleration-recovery 후보 기록이다. 아래 기존 적분·검토·실패는 당시 consistent/full-coordinate 경로를 가리킨다. 현재 reduced physical-rate 복원은 [축소 좌표](formulation-reduced-coordinate.md), 채택·검증 상태는 [기능 요약](README.md)을 따른다.
- 상태: `candidate-for-independent-review; not-adopted`, 2026-09-26.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
2026-10-11 질량 정책 변경: `HHT-ADR-012`([현재 요약](README.md))에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [기능 요약](README.md)의 현재 검증 경계를 따른다.
- 작성 당시 상태: `candidate-for-independent-review; not-adopted`, 2026-09-26.
- Owner: `formulation-agent`. 할당 범위는 이 문서이며 source·시험·상위 계약은 변경하지 않는다.
- 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../solver-core/README.md), [공통 ADR](../solver-core/README.md), [Feature PRD](README.md), [시간적분](formulation.md), [관성 상세](formulation-inertia.md).
- 발견 근거: [구현 수치 검토 NR-009 이후](README.md), [C08](README.md), [N1–N7](README.md).
- 기준: [프로젝트 지침](../../AGENTS.md), [솔버 공통 요약](../solver-core/README.md), [공통 계약 요약](../solver-core/README.md), [기능 요약](README.md), [시간적분](formulation.md), [관성 상세](formulation-inertia.md).
- 발견 근거: `구현 수치 검토 NR-009 이후`, `C08`, `N1–N7`.
## 1. 제안과 변경 경계
@@ -25,7 +29,7 @@
각 admissible nodal null은 `[0;J_l(phi)^(-1)d]`다. 현재 total rotation-vector chart, geometry 및 swing/twist 유효성과 일정 null rank, 양의 physical mass 및 bounded algebraic inverse가 전 구간에서 필요하다. Partial BC는 null과 free 공간의 **교집합**을 구한다. N의 constrained 성분을 단순 삭제하거나 작은 positive mass를 null로 재분류하지 않는다. Empty null에서는 `a_rec=a_h`; all-fixed 모델도 empty recovery로 처리한다.
이 문서의 N은 [N3/N4](README.md)의 고정 scale `D=diag(ell I3,I3)`, `x=D^-1 q`, 연속 정규화 analytic basis Z와 **`N=D_f Z(x)`**로 대응한다. 따라서 `psi=N^T g_f=Z^T(D^Tg)_f`, `g=f_int-F`. 미분 시 basis도 현재 q의 함수로 미분한다. N은 시간 grid와 무관한 같은 정의·source 순서를 사용하며 eigen/SVD 부호 변경으로 선택하지 않는다.
이 문서의 N은 `N3/N4`의 고정 scale `D=diag(ell I3,I3)`, `x=D^-1 q`, 연속 정규화 analytic basis Z와 **`N=D_f Z(x)`**로 대응한다. 따라서 `psi=N^T g_f=Z^T(D^Tg)_f`, `g=f_int-F`. 미분 시 basis도 현재 q의 함수로 미분한다. N은 시간 grid와 무관한 같은 정의·source 순서를 사용하며 eigen/SVD 부호 변경으로 선택하지 않는다.
## 3. 복구 방정식과 필요한 미분
@@ -115,7 +119,7 @@ Basis 표현에도 주의한다. `tilde psi=S(q,t)psi`에서 연속 2차 미분
## 6. 독립 검토용 반증 사례
아래는 추가 검증 제안이며 [기존 C08/N7](README.md)의 grid·전체 시점·원 정확도 요구를 바꾸지 않는다. 기존 a_h와 후보 a_rec를 함께 보존하고 실패 결과를 대체하지 않는다.
아래는 추가 검증 제안이며 `기존 C08/N7`의 grid·전체 시점·원 정확도 요구를 바꾸지 않는다. 기존 a_h와 후보 a_rec를 함께 보존하고 실패 결과를 대체하지 않는다.
| ID | 모델/조작 | 반드시 확인할 결과 |
| --- | --- | --- |
@@ -1,8 +1,10 @@
# C08b Newton 잔차 재정식화 후보
상태: 연구 후보이며 production 채택·수치 정확도 승인이 아니다. 2026-10-12 formulation owner 작업은 이 문서만 소유한다. 질량·시간적분·내력·초기화·tolerance·원본을 바꾸지 않는다. 독립 numerical review와 실제 prototype 결과는 별도 owner가 소유한다.
읽기 구분: 2026-10-12 full-coordinate C08b의 잔차 후보 연구다. 아래 현재·기존·미해결은 연구 당시의 상태이며 이 후보 전체의 채택을 뜻하지 않는다. 현재 Newton·graph 경로는 [축소 좌표](formulation-reduced-coordinate.md)·[고정 null 기저](formulation-fixed-null-basis.md), 검증 상태는 [기능 요약](README.md)을 따른다.
계약: [기존 정식화](formulation.md), [관성·null 상세 §4](formulation-inertia.md#4-mass-null과-초기-일관성), [ADR-010/012](README.md). 실제 trial은 [analysis.json](README.md)에 있으며 아래 기전 설명은 그 수치를 바탕으로 한 조사 후보이다.
작성 당시 상태: 연구 후보이며 production 채택·수치 정확도 승인이 아니다. 2026-10-12 formulation owner 작업은 이 문서만 소유한다. 질량·시간적분·내력·초기화·tolerance·원본을 바꾸지 않는다. 독립 numerical review와 실제 prototype 결과는 별도 owner가 소유한다.
계약: [기존 정식화](formulation.md), [관성·null 상세 §4](formulation-inertia.md#4-mass-null과-초기-일관성), `ADR-010/012`. 조사 당시 원자료 `analysis.json`의 실제 trial 수치를 근거로 하며 아래 기전 설명은 그 수치를 바탕으로 한 조사 후보이다. 현재 README는 원자료 JSON을 제공하지 않으며 [현재 요약](README.md)으로만 연결한다.
## 1. 적용 가정과 보존량
@@ -1,6 +1,10 @@
# Carried-A HHT의 arithmetic/noise 인계
상태: `implementation-ready-estimator; independent-review-pending`, 2026-10-12. [축소 좌표 정식화](formulation-reduced-coordinate.md)와 별개로, 동일 full-coordinate HHT에서 A를 직접 갱신하는 산술을 다룬다. 기존 [N7](README.md)의 separation 기준을 완화하지 않는다. Half-ULP `q-qp-sA` closure는 이전 predictor·seed·update 오차 또는 history bound가 아니다.
읽기 구분: 현재 CA radius 계산이 참조하는 산술 원본이다. 아래 full-coordinate carried-A 연산 경로 자체는 비교 이력이며, 현재 reduced Ar·pair update와 basis radius 적용 범위는 [축소 좌표](formulation-reduced-coordinate.md)·[고정 null 기저](formulation-fixed-null-basis.md)를 따른다. 현재 검증은 [기능 요약](README.md)에서 확인한다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
작성 당시 상태: `implementation-ready-estimator; independent-review-pending`, 2026-10-12. [축소 좌표 정식화](formulation-reduced-coordinate.md)와 별개로, 동일 full-coordinate HHT에서 A를 직접 갱신하는 산술을 다룬다. 기존 `N7`의 separation 기준을 완화하지 않는다. Half-ULP `q-qp-sA` closure는 이전 predictor·seed·update 오차 또는 history bound가 아니다.
## 1. 실제 연산 경로
@@ -1,8 +1,10 @@
# 대수좌표 제거 DAE 연구: 수식과 실행 결과
상태: 연구 후보·독립 검토 대기. Owner: formulation, 2026-10-12. [연구의 권장 후보](README.md)를 소형 문제로 비교했다. Production·tests·PRD·ADR·reference·tolerance는 수정하지 않았다. 실제 shell 검증이나 새 적분법 채택이 아니다.
읽기 구분: 2026-10-12 소형 DAE 연구 당시의 결과와 capability gap을 보존한다. 아래 현재·미구현·미결정은 그 시점의 기술이다. 이후 채택된 shell 경로는 [축소 좌표](formulation-reduced-coordinate.md)·[고정 null 기저](formulation-fixed-null-basis.md), 현재 검증은 [기능 요약](README.md)을 따른다.
재현 자료는 [Decimal80 probe](README.md), [실제 native 기록](README.md), [stdout](README.md), [전체 grid·오차·조건 결과](README.md)다. `python -B compare.py` 실행 native0이며 FESA build/CTest는 실행하지 않았다. 모든 문제는 `t∈[0,1]`, `h=1/16,...,1/256`, exact frame0의 q/v/a와 `A0=a0`, `alpha=-.05,beta=.275625,gamma=.55`를 사용했다. 초기 구간을 제외하지 않고 모든 `n+1` endpoint의 component infinity-norm 최대 오차를 구했다. 이 raw absolute error는 FESA N7의 normalized/noise-certified metric이 아니다.
작성 당시 상태: 연구 후보·독립 검토 대기. Owner: formulation, 2026-10-12. `연구의 권장 후보`를 소형 문제로 비교했다. Production·tests·PRD·ADR·reference·tolerance는 수정하지 않았다. 실제 shell 검증이나 새 적분법 채택이 아니다.
당시 원자료는 `Decimal80 probe`, `실제 native 기록`, `stdout`, `전체 grid·오차·조건 결과`였다. 이 문서에 그 원자료 경로는 제공하지 않으며 [현재 요약](README.md)은 현재 기능 상태를 안내한다. `python -B compare.py` 실행 native0이며 FESA build/CTest는 실행하지 않았다. 모든 문제는 `t∈[0,1]`, `h=1/16,...,1/256`, exact frame0의 q/v/a와 `A0=a0`, `alpha=-.05,beta=.275625,gamma=.55`를 사용했다. 초기 구간을 제외하지 않고 모든 `n+1` endpoint의 component infinity-norm 최대 오차를 구했다. 이 raw absolute error는 FESA N7의 normalized/noise-certified metric이 아니다.
## 1. 관찰과 범위
@@ -110,9 +112,9 @@ Exact reduced 해는 `y=sin(t),ydot=cos(t),yddot=-sin(t)`이며 Decimal80 sin/co
- 같은 계수와 exact frame0을 쓴다고 reduced history가 승인된 full-coordinate history와 같아지지 않는다. Production 채택에는 수식·수치 검토와 명시적인 algorithm/state 결정이 필요하다. Tolerance/reference 변경은 제안하지 않는다.
- Full E·반력·hidden0/1/2·물리적 a와 공간 rate·energy/P/L·현행 C08·원본 비교는 각각 필수 evidence다. 이 oscillator는 frequency1이므로 C08b의 stiff-mode 시간 해상도 문제를 해결하지 않는다.
## 6. 실제 shell chart 후보와 구현-ready capability gap
## 6. 연구 당시 실제 shell chart 후보와 구현-ready capability gap
현재 source는 읽기만 했다. [shell evaluator API](README.md)와 [내부 Jet·scalar constraint](README.md), [관성 API](README.md)를 대조했다. 소형 prototype가 구현한 것은 해석적으로 알려진 polynomial Q와 독립 scalar reduced HHT뿐이다. Actual shell algebraic branch solver·Q 미분·reduced trial/state·assembly·tangent는 **구현하지 않았다**.
연구 당시 source는 읽기만 했다. [shell evaluator API](../../include/fesa/elements/nonlinear_mitc4_shell.h)와 내부 Jet·scalar constraint, 관성 API를 대조했다. 소형 prototype가 구현한 것은 해석적으로 알려진 polynomial Q와 독립 scalar reduced HHT뿐이다. Actual shell algebraic branch solver·Q 미분·reduced trial/state·assembly·tangent는 **구현하지 않았다**.
### 6.1 Chart 선택과 물리 동등성의 조건
@@ -1,13 +1,17 @@
# 고정 초기 null 기저의 sparse reduced HHT 정식화
상태: `implementation-ready; independent-review-and-runtime-pending`, 2026-10-13.
승인 범위는 [고정 null 기저 제안](README.md)과
[HHT-ADR-018](README.md)의 사용자 결정이다. 본 문서는 수식·연산 계약이며
읽기 구분: 현재 고정 null 기저·sparse lift·augmented scaling의 수식 원본이다. [축소 좌표](formulation-reduced-coordinate.md)를 전제로 읽는다. 아래 인계 당시의 대기·미구현 표현은 그 시점의 기록이며 현재 구현·검증은 [기능 요약](README.md)을 따른다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
작성 당시 상태: `implementation-ready; independent-review-and-runtime-pending`, 2026-10-13.
승인 범위는 `고정 null 기저 제안`과
`HHT-ADR-018`([현재 요약](README.md))의 사용자 결정이다. 본 문서는 수식·연산 계약이며
자기 수치 승인이나 현재 production PASS 기록이 아니다.
[기존 축소 정식화](formulation-reduced-coordinate.md)의 fully-free rotation
component selector를 아래 고정 ON 기저로 대체한다. 기존
[N1–N7](README.md), [제한 Newton](README.md),
[독립 검토](README.md)와 허용값은 유지한다.
`N1–N7`, `제한 Newton`,
`독립 검토`와 허용값은 유지한다.
## 1. 적용 가정과 물리 계약
@@ -217,10 +221,10 @@ scale underflow/overflow는 실패다. 역변환 `d=Sx dhat` 후 다음 map을
N2-L의 분자/분모는 **실제로 factor/solve한 operator**에서
`||Khat dhat-bhat||inf / || |Khat||dhat|+|bhat| ||inf`, 원 `1e-12`다.
대조 시점의 read-only source augmented assembly/solve는 raw `Kaug,baug`를 전달하고
explicit FB-06이 없다. Raw 검산 evidence는 FB-06 scaled 검산의 증거가 아니다.
FB-06은 승인된 scaled-operator 계약의 동등 representation으로 구현하며 actual
scaling/undo를 source 및 focused evidence로 닫아야 한다. Full physical N2 residual/correction은 기존 global
정식화 작성 당시 read-only source는 raw `Kaug,baug`를 전달했다. 현재
`AssembleAugmentedReducedSystem`은 FB-06의 row/unknown scaling을 구성하고
`MapAugmentedCorrection`이 물리 보정을 복원한다. 구현의 존재와 해당 revision의
focused/full runtime 검증은 구분하며 현재 범위는 [기능 요약](README.md)을 따른다. Full physical N2 residual/correction은 기존 global
free channels에서 FB-07로 평가하며 selector `Ep`만으로 endpoint를 통과시키지 않는다.
ADR-017 restricted operator는 **actual scaled** `Khat[J,J]`이며 J에는 angular p와
@@ -497,9 +501,10 @@ full defect solve 실패를 restricted 성공으로 대신하지 않는다. Read
2/4/8-step 진단, C08a7/C08b8 원 grid/hidden/physical q-v-a/P-E-L/N7,
configured full Debug/CTest와 원101-frame reference. 실행은 fresh source identity에 연결한다.
남은 증거: actual diagonal scaling, 비영 private 초기상태 roundtrip 운용,
정식화 인계 당시 남긴 확인 항목: actual diagonal scaling, 비영 private 초기상태 roundtrip 운용,
새 basis coefficient CA, condition/transversality 실측 및 전체 runtime 항목은
implementation owner와 독립 review가 확인한다. 새 tolerance/physics/schema/reference
implementation owner와 독립 review의 확인 대상이었다. 현재 구현 존재와 최신 검증의
구분은 [기능 요약](README.md)을 따른다. 새 tolerance/physics/schema/reference
변경은 정하지 않았다. Empty null은 원 full-coordinate HHT로, all-fixed는 empty
free solve와 원 full reaction으로 환원한다. 문서 정적 대조만 수행했으며
build/test·외부 solver는 실행하지 않았다.
@@ -1,7 +1,10 @@
# ADR-018 graph BL/solve certificate controller draft
Status: private design only. Shared test source is frozen while the configured
Debug focused run is active.
읽기 구분: 2026-10-12 test-local graph certificate 설계 초안이다. 수식 범위는 [고정 null 기저의 certificate 계약](formulation-fixed-null-basis.md#51-고정-basis-coefficient-radius의-실행-계약), 현재 구현·검증은 [기능 요약](README.md)을 따른다. 아래 작업 동결·추가 계획은 초안 작성 당시 기록이다.
상태: 과거 private 설계 초안이다. 작성 당시 configured Debug focused run 중에는
shared test source를 동결했다. 현재 test-local certificate 구현의 존재와
최신 실행 검증 범위는 구분하며 [기능 요약](README.md)을 따른다.
## Scope
@@ -53,7 +56,7 @@ Undo any actual rate scaling before using `Bx` in physical lifted radii.
## Tests
Add only after the current focused run closes:
초안 작성 당시 focused run 종료 뒤 추가하려던 검사 목록:
- small chart with plane coefficient value zero / positive BL, proving BG/BP
remain nonzero after an omitted-BL mutation;
- 1x1 and 4x4 source-order graph replay, N2-L checked;
@@ -1,13 +1,17 @@
# HHT implicit dynamics 정식화
- 상태: `independently-reviewed-candidate; physics-and-validation-pending`.
보존본: 2026-10-04 문서 정리 시점의 consistent/full-coordinate 후보 원문이다. 아래 현재·이번·미결정 표현은 당시 상태이며, 현행 lumped/reduced/fixed-null 채택·검증은 [기능 요약](README.md)을 따른다. 수식·유도는 비교 이력으로 보존한다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
- 작성 당시 상태: `independently-reviewed-candidate; physics-and-validation-pending`.
- Owner: `formulation-agent`, 2026-09-22. 문서 gate 산출물이며 구현 승인이나 수치 검증 통과가 아니다.
- 기준: [프로젝트 지침](../../AGENTS.md), [제품 PRD](../solver-core/README.md), [공통 ADR](../solver-core/README.md), [Feature PRD](README.md), [요구사항](README.md), [연구](README.md).
- 관성의 전개식·초기 일관성·정확도 근거는 [formulation-inertia](formulation-inertia.md)가 소유한다. 영속 schema, C++ 저장 구조와 tolerance는 정의하지 않는다.
- 기준: [프로젝트 지침](../../AGENTS.md), [솔버 공통 요약](../solver-core/README.md), [공통 계약 요약](../solver-core/README.md), [기능 요약](README.md), 당시 요구사항, 당시 연구 기록.
- 관성의 전개식·초기 일관성·정확도 근거는 [formulation-inertia](formulation-inertia-historical-docs-cleanup-20261004.md)가 소유한다. 영속 schema, C++ 저장 구조와 tolerance는 정의하지 않는다.
## 1. 결론과 적용 범위
**추천 후보는 유한회전 kinetic energy에서 유도한 관성력과, 물리적 가속도 `a` / 알고리즘 가속도 `A`를 분리하는 HHT 확장이다.** 일정 질량의 표준 HHT force weighting으로 정확히 환원한다. 단순히 `M(q)`를 기존 일정 질량 잔차에 대입하는 식은 추천하지 않는다. 이 차이는 [상세 §5](formulation-inertia.md#5-시간-정확도와-대안의-경계)에 유도한다.
**추천 후보는 유한회전 kinetic energy에서 유도한 관성력과, 물리적 가속도 `a` / 알고리즘 가속도 `A`를 분리하는 HHT 확장이다.** 일정 질량의 표준 HHT force weighting으로 정확히 환원한다. 단순히 `M(q)`를 기존 일정 질량 잔차에 대입하는 식은 추천하지 않는다. 이 차이는 [상세 §5](formulation-inertia-historical-docs-cleanup-20261004.md#5-시간-정확도와-대안의-경계)에 유도한다.
**사용자가 shell 속도 보간의 운동에너지를 그대로 적분하는 consistent mass를 선택했다.** 따라서 HHT 기본값과 이번 구현 범위는 consistent mass다. 같은 운동학의 scalar-moment nodal lumped 식은 비교용 이론 및 기존 eigen 회귀 참고이며 이번 HHT 구현 요구가 아니다. 선행 eigen 결과나 동적 reference와의 적합도로 선택한 것이 아니다. 유한회전 지원 범위를 작은 회전으로 축소하지 않는다.
@@ -56,7 +60,7 @@ x(\xi,\eta,\zeta;q)=\sum_i N_i(X_i+u_i+z d_i),\quad z=t\zeta/2,
\ddot d_i=\dot\omega_i\times d_i+\omega_i\times(\omega_i\times d_i).
\]
따라서 `v_phi`와 `a_phi`는 공간 각속도·각가속도가 아니다. `A_phi`는 이 물리 회복식에 넣지 않는다. `J_l`과 미분의 구현 가능한 정의는 [상세 §1](formulation-inertia.md#1-회전과-관성의-미분)에 있다.
따라서 `v_phi`와 `a_phi`는 공간 각속도·각가속도가 아니다. `A_phi`는 이 물리 회복식에 넣지 않는다. `J_l`과 미분의 구현 가능한 정의는 [상세 §1](formulation-inertia-historical-docs-cleanup-20261004.md#1-회전과-관성의-미분)에 있다.
물리 내력은 기존 [비선형 정식화 §§6–13](../nonlinear-static-newton-raphson/formulation.md)를 따른다. Green–Lagrange strain의 MITC assumed shear와 fixed-reference local engineering strain
`ē=[E11,E22,2E12,2E13,2E23]`에 대해
@@ -106,7 +110,7 @@ T_L=\frac12\sum_i\left(m_i|v_{ui}|^2+2s_i v_{ui}\cdot B_iv_{\phi i}
\qquad F(t)=F^\star\ (t\ge0+).
\]
이는 parent `rho_0 ẍ=Div_0 P`, `P=F_def S`의 가상일 이산화다. 강형의 `F_def`는 deformation gradient이며 nodal force `F`와 구별한다. 물리적 damping은 0이다. Tangent에는 `DM·a`, convective force의 configuration/velocity 미분을 모두 포함한다. 구체적인 matrix block, quadrature, derivative action과 null 조건은 [상세 §§1–4](formulation-inertia.md)에 고정한다.
이는 parent `rho_0 ẍ=Div_0 P`, `P=F_def S`의 가상일 이산화다. 강형의 `F_def`는 deformation gradient이며 nodal force `F`와 구별한다. 물리적 damping은 0이다. Tangent에는 `DM·a`, convective force의 configuration/velocity 미분을 모두 포함한다. 구체적인 matrix block, quadrature, derivative action과 null 조건은 [상세 §§1–4](formulation-inertia-historical-docs-cleanup-20261004.md)에 고정한다.
## 4. 초기화와 HHT 시간적분 후보
@@ -117,9 +121,9 @@ 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`다. [공개 기본값 근거](README.md)와 [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`다. `공개 기본값 근거`와 [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 생성 절차를 확인한 주장이 아니다.
**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-historical-docs-cleanup-20261004.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 생성 절차를 확인한 주장이 아니다.
[Brüls–Arnold (2008), 식 (5)–(8)](https://orbi.uliege.be/bitstream/2268/27088/1/pa_BrulsArnold2008_TheGeneralizedAlphaSchemeAsALinearMultistepIntegrator.pdf)의 보조가속도 형식을 `alpha_m=0`, `alpha_f=−alpha`로 전문화한다. 아래 `a`는 물리적 좌표 가속도, `A`는 시간적분 보조변수다:
@@ -210,6 +214,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 없음 |
수식 후보의 [독립 검토](README.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 승인·검증 통과로 표시하지 않는다.
수식 후보의 `독립 검토`는 완료되었으며 표시된 수식에서 새 오류는 발견되지 않았다. 질량 선택은 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 대조, 일차 문헌 대조와 수식 유도 및 문서 정적 검토다. [독립 시간정확도 검산](README.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 대조, 일차 문헌 대조와 수식 유도 및 문서 정적 검토다. `독립 시간정확도 검산`은 variable-mass SDOF와 moving-null 예제에서 추천 후보의 약 2차 q/v/physical-a 수렴을 관찰했고 naive 확대의 약 1차 오차를 구별했다. 이는 shell solver 검증이나 일반 drilling DAE 증명을 대신하지 않는다. Build/test·solver/reference 실행은 문서 작업 범위가 아니므로 미실행이다. 독립 검산과 Numerical Review 결과는 해당 owner의 보고서가 소유하며 본 문서가 스스로 승인하지 않는다.
@@ -1,6 +1,10 @@
# 유한회전 관성·초기화·HHT 상세
[주 정식화](formulation.md)의 구현 수식 상세다. 상태와 미결정 항목은 주 문서를 따른다. 아래 전개는 명시한 FESA 운동학에서의 자체 유도이며 Abaqus 내부 절차의 기술이 아니다.
보존본: 2026-10-04 문서 정리 시점의 consistent/full-coordinate 후보 원문이다. 아래 현재·이번·미결정 표현은 당시 상태이며, 현행 lumped/reduced/fixed-null 채택·검증은 [기능 요약](README.md)을 따른다. 수식·유도는 비교 이력으로 보존한다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
[당시 주 정식화](formulation-historical-docs-cleanup-20261004.md)의 구현 수식 상세다. 상태와 미결정 항목은 주 문서를 따른다. 아래 전개는 명시한 FESA 운동학에서의 자체 유도이며 Abaqus 내부 절차의 기술이 아니다.
사용자 선택에 따라 이번 HHT 기본 및 구현 질량은 consistent `T_C/M_C`다. Lumped 식은 비교용 이론·기존 eigen 회귀 참고로 보존하며 이번 HHT 구현·검증 요구를 추가하지 않는다. 다른 physics·알고리즘·공개 output의 승인은 이 선택과 별개다.
@@ -196,7 +200,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에 대한 보편 정리를 요구하지 않는다. [독립 검토](README.md)는 현 수식 후보를 대조했고, [독립 검산](README.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에 대한 보편 정리를 요구하지 않는다. `독립 검토`는 현 수식 후보를 대조했고, `독립 검산`의 smooth variable-mass / moving-null 예제는 이를 지지한다. 이 제한된 evidence가 실제 shell/drilling 검증을 대신하지 않으며 유한회전 지원 범위를 축소하는 근거도 아니다.
### 5.3 다른 후보와 채택하지 않은 이유
@@ -1,8 +1,12 @@
# 유한회전 관성·초기화·HHT 상세
[주 정식화](formulation.md)의 구현 수식 상세다. 상태와 미결정 항목은 주 문서를 따른다. 아래 전개는 명시한 FESA 운동학에서의 자체 유도이며 Abaqus 내부 절차의 기술이 아니다.
읽기 구분: 현재 채택한 nodal-lumped kinetic 관성의 수식 원본이다. Consistent 식과 full-coordinate 시간정확도 논의는 비교 이력이다. 현재 시간적분은 [축소 좌표](formulation-reduced-coordinate.md)·[고정 null 기저](formulation-fixed-null-basis.md), 구현·검증 상태는 [기능 요약](README.md)을 따른다.
2026-10-11 승인 [HHT-ADR-012](README.md)에 따라 이번 HHT 질량은 nodal lumped `T_L/M_L`다. Consistent 식은 비교와 미분 유도 이력으로 보존한다. 다른 physics·알고리즘·공개 output의 승인은 이 선택과 별개다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
[주 정식화](formulation.md)의 구현 수식 상세다. 현재 채택·구현·검증 상태는 [기능 요약](README.md)을 따른다. 아래 전개는 명시한 FESA 운동학에서의 자체 유도이며 Abaqus 내부 절차의 기술이 아니다.
2026-10-11 승인 `HHT-ADR-012`([현재 요약](README.md))에 따라 이번 HHT 질량은 nodal lumped `T_L/M_L`다. Consistent 식은 비교와 미분 유도 이력으로 보존한다. 다른 physics·알고리즘·공개 output의 승인은 이 선택과 별개다.
## 1. 회전과 관성의 미분
@@ -218,7 +222,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에 대한 보편 정리를 요구하지 않는다. [독립 검토](README.md)는 현 수식 후보를 대조했고, [독립 검산](README.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에 대한 보편 정리를 요구하지 않는다. `독립 검토`는 현 수식 후보를 대조했고, `독립 검산`의 smooth variable-mass / moving-null 예제는 이를 지지한다. 이 제한된 evidence가 실제 shell/drilling 검증을 대신하지 않으며 유한회전 지원 범위를 축소하는 근거도 아니다.
### 5.3 다른 후보와 채택하지 않은 이유
@@ -228,4 +232,4 @@ v_{n+1}-v_n=h\{-\alpha(1-\gamma)a_{n-1}
| Ambient director | 독립 `y=(u_i,d_i)`에 일정 moment mass, `d_i·d_i=1` holonomic constraint와 drill orientation의 algebraic equation을 둔 HHT | Newmark ambient director rates의 constraint drift, rotation-vector state와의 정확한 rate mapping, additional multiplier/drill coordinate가 필요. 기존 6DOF state와 단순 동치라고 볼 수 없음 |
| Physical/algorithmic acceleration 분리 | 주 문서 후보; current `M_C(q)`만으로 physical endpoint equation을 풀며 null을 보존 | Shell mass-null의 시간 정확도·regularity 검증 필요. Consistent mass 선택이 이 시간적분 후보의 채택 승인까지 의미하지는 않음 |
기존 source는 nonlinear 내부력의 second derivative까지 계산하지만 관성 tangent에는 director의 third derivative가 필요하다. 기존 [small-rotation mass kernel](../../src/fesa/elements/mitc4_shell.cpp)의 moment는 재사용 가능한 기준이고 그 initial global mass를 유한회전 전체에 고정하는 것은 본 후보가 아니다. [정적 상태](../../include/fesa/analysis/nonlinear_analysis_state.h)는 `a/A` distinction을 제공하지 않으므로 현재 구현이 이 알고리즘을 지원한다고 보고하지 않는다.
기존 source는 nonlinear 내부력의 second derivative까지 계산하지만 관성 tangent에는 director의 third derivative가 필요하다. 기존 [small-rotation mass kernel](../../src/fesa/elements/mitc4_shell.cpp)의 moment는 재사용 가능한 기준이고 그 initial global mass를 유한회전 전체에 고정하는 것은 본 후보가 아니다. 최초 정식화 당시의 [정적 상태](../../include/fesa/analysis/nonlinear_analysis_state.h)는 `a/A` distinction을 제공하지 않았다. 현재 [동적 상태](../../include/fesa/analysis/dynamic_analysis_state.h)와 채택 경로는 [기능 요약](README.md)을 따르며, 구현의 존재는 최신 전체 수치 검증 통과를 뜻하지 않는다.
@@ -1,8 +1,10 @@
# C08b linear momentum: 정확한 이산 불변량과 판정 후보
상태: 수식 검토 후보·독립 numerical review 및 사용자 결정 대기. Owner: formulation, 2026-10-12. 공식 acceptance·tolerance·tests·production은 변경하지 않았다. 현재 C08b FAIL을 유지한다. 이 문서는 새 수치 tolerance를 정하지 않는다.
읽기 구분: 2026-10-12 full-coordinate C08b의 불변량·acceptance 검토 후보 기록이다. 이 문서는 acceptance 변경의 채택을 뜻하지 않는다. 현재 reduced 경로는 [축소 좌표](formulation-reduced-coordinate.md)·[고정 null 기저](formulation-fixed-null-basis.md), 현재 검증은 [기능 요약](README.md)을 따른다.
기준은 [현재 시간적분 정식화](formulation.md), [lumped 관성 상세](formulation-inertia.md), [현재 연구](README.md)다. 별도 [DAE 비교](formulation.md)는 full-coordinate와 reduced 시간적분의 구별을 소유한다. 아래 증명은 **현재 C08b의 원 full-coordinate HHT**에 대한 자체 유도이며 reduced 후보를 자동 포함하지 않는다.
작성 당시 상태: 수식 검토 후보·독립 numerical review 및 사용자 결정 대기. Owner: formulation, 2026-10-12. 공식 acceptance·tolerance·tests·production은 변경하지 않았다. 연구 당시 C08b FAIL은 해당 이력으로 유지한다. 이 문서는 새 수치 tolerance를 정하지 않는다.
기준은 [당시 full-coordinate 시간적분 정식화](formulation.md), [lumped 관성 상세](formulation-inertia.md), [연구 위치의 현재 요약](README.md#보존한-과거-수식과-연구의-위치)다. 별도 [DAE 비교](formulation-dae-research-20261012.md)는 full-coordinate와 reduced 시간적분의 구별을 소유한다. 아래 증명은 **2026-10-12 연구 당시 C08b의 full-coordinate HHT**에 대한 자체 유도이며 reduced 후보를 자동 포함하지 않는다.
## 1. 가정과 검산
@@ -1,6 +1,10 @@
# Shell 축소 좌표 HHT 정식화
상태: `implementation-ready; independent-review-and-shell-verification-pending`, 2026-10-12. 사용자는 실제 shell의 축소 좌표 HHT 구현·검증과 full A의 진단용 filter-combination 의미/schema 구분을 승인했다. 본 문서는 수식 인계이며 구현 또는 수치 통과를 승인하지 않는다. [기존 정식화](formulation.md), [현재 관성](formulation-inertia.md), [실험·실패 보고](README.md)를 전제로 한다. Carried-A의 동일 full-coordinate HHT 산술은 [별도 N7 상세](formulation-carried-a-noise.md)가 소유한다.
읽기 구분: 현재 축소 적분·graph·physical-rate 복원의 수식 원본이다. Fully-free rotation의 component selector는 [고정 null 기저](formulation-fixed-null-basis.md)가 대체한다. 아래 구현 제안·검토 대기는 작성 당시의 기록이며 현재 구현·검증은 [기능 요약](README.md)을 따른다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
작성 당시 상태: `implementation-ready; independent-review-and-shell-verification-pending`, 2026-10-12. 사용자는 실제 shell의 축소 좌표 HHT 구현·검증과 full A의 진단용 filter-combination 의미/schema 구분을 승인했다. 본 문서는 수식 인계이며 구현 또는 수치 통과를 승인하지 않는다. [기존 정식화](formulation.md), [현재 관성](formulation-inertia.md), `실험·실패 보고`를 전제로 한다. Carried-A의 동일 full-coordinate HHT 산술은 [별도 N7 상세](formulation-carried-a-noise.md)가 소유한다.
## 1. 물리와 좌표
@@ -53,7 +57,7 @@ Empty null에서는 `Q(p)=L_p p`, `J=L_p`, `Q_t=Q''=Q'''=0`이며 원 full-coord
않는다. Primitive의 source-ordered assembly와 안정적인 contraction으로 같은 수식을
계산하고, physical mass range solve 및 original/reconstructed frame0의 full residual
판정은 유지한다. 이 산술 정정의 원인·실행 범위는
[후속 검증 기록](README.md)을 따른다.
`후속 검증 기록`을 따른다.
\[
Ar_{n+1}=(1+\alpha)ap_{n+1}-\alpha ap_n,\quad
@@ -178,7 +182,7 @@ scaled norm과 private `delta Ar`를 검사한다. Public
고정된다. N7에서도 augmented defect의 모든 auxiliary block을 위 식으로
변환해야 한다. `delta p`만 남기거나 hidden defect를 무시하면 해당 noise
판정은 유효하지 않다. 독립 소형 Schur 검산과 실제 shell 검증의 범위는
[수치 검토](README.md)에 구분하여 기록한다.
`수치 검토`에 구분하여 기록한다.
### 5.2 Newton 좌표 증분과 carried Ar의 산술 표현
@@ -212,15 +216,15 @@ Predictor의 inherited bound와 초기 low를 포함하고 accepted high의 unce
다음 step으로 넘긴다. 기존 pp+Ar 또는 plain p addition bound를 이 새 경로의
완전한 evidence로 승계하거나 radius를 reset/clamp하지 않는다. 이는 같은 수학
recurrence의 산술 표현이며 stored high가 원 N3를 만족하지 못하면 여전히 실패다.
독립 exact replay와 적용 한계는 [수치 검토](README.md)를 따른다.
독립 exact replay와 적용 한계는 `수치 검토`를 따른다.
위 high-only 실패 정책은 승인 이전 evidence다. [HHT-ADR-016](README.md)에 따라
위 high-only 실패 정책은 승인 이전 evidence다. `HHT-ADR-016`([현재 요약](README.md))에 따라
reduced whole/requested 두 증분은 실제 candidate pair의 increment
`(p_high+p_low)-old_accepted_high`를 EFT expansion으로 비교하고, 저장 high의
RN-even 일치를 별도로 검사한다. 원래 각 scale와 `1e-12`, zero-scale exact-zero,
독립 requested trace와 CA radius는 유지한다. Raw high-only 실패값을 보존하며
승인 이전 FAIL을 변경본 PASS로 승계하지 않는다. 상세 범위와 표현 경계 검증은
[승인된 제안](README.md)을 따른다.
`승인된 제안`을 따른다.
## 6. 필요한 local operator와 시간 항
@@ -244,7 +248,10 @@ T[(u,0),(v,1),(v,1)]
Fixed-time Newton에는 RC-15의 T만 필요하므로 **F'''는 불필요하다**. 일반 pure Qttt 요청에는 F'''가 필요하지만 이번 구현에서 요청하지 않는다. Constant public CLOAD에서는 F'=F''=0이다. Generalized rotational F가 nonzero이면 n의 pure-q 미분은 여전히 필요하다. C08a oracle에 Fdot/Fddot=0을 대입하면 잘못된 구현이다. External time-mixed second contraction은 n의 nodal Hessian에서 계산하며 force finite difference로 대체하지 않는다.
## 7. 최소 구현 인계
## 7. 당시 최소 구현 인계
다음 파일명과 인터페이스는 2026-10-12 제안이며 현재 파일 배치를 뜻하지 않는다.
현재 source flow는 [기능 요약](README.md)을 따른다.
| Owner / 파일 제안 | 대응 operator / 책임 |
| --- | --- |
@@ -265,6 +272,6 @@ Private interface는 `EvaluateAlgebraicOperators(q,t,F,Fdot,Fddot,v)`, `SolveEmb
- C08a all-time full q/v/physical-a 차수와 실제 shell C08b physical high-frequency convergence는 별개다. 축소법의 null-rate 개선만으로 C08b finest fixed-grid 기준 통과를 주장하지 않는다. Original reference 비교·현재 full suite는 implementation owner가 수행한다.
- Fixed component graph는 general chart/rank transport, smoothness가 깨진 null cutting BC, nonprincipal branch, nonsmooth F를 지원하지 않는다. 이 경계는 fail-closed 구현과 진단으로 드러나야 하며 tolerance/rank clipping으로 숨기지 않는다.
Owner의 [Decimal96 polynomial probe](README.md)는 explicit-time coupled 2-constraint graph의 RC-07/09와 RC-10/11을 세 상태에서 계산했다. [결과](README.md), [native0 기록](README.md)을 보존한다. Implicit derivatives를 polynomial Q의 직접 미분과 비교하고, 원 평형 밖의 임의 smooth covector에서 exact tangent와 central difference를 비교하여 `delta J` 생략 효과가 nonzero임을 확인했다. 이는 수식 bookkeeping 검산이며 실제 shell 물리 모델·production 실행 또는 독립 numerical review가 아니다.
당시 원자료 `Decimal96 polynomial probe`는 explicit-time coupled 2-constraint graph의 RC-07/09와 RC-10/11을 세 상태에서 계산했다. 원자료명 `결과`, `native0 기록`은 당시 evidence를 가리키며 이 문서에서 원자료 경로를 제공하지 않는다. [현재 요약](README.md)은 현재 기능 상태를 안내한다. Implicit derivatives를 polynomial Q의 직접 미분과 비교하고, 원 평형 밖의 임의 smooth covector에서 exact tangent와 central difference를 비교하여 `delta J` 생략 효과가 nonzero임을 확인했다. 이는 수식 bookkeeping 검산이며 실제 shell 물리 모델·production 실행 또는 독립 numerical review가 아니다.
독립 numerical reviewer가 RC-01–15와 actual implementation operator/BC/branch 대응을 검토해야 한다. Public A/schema details는 I/O owner의 승인 계약을 참조하며 본 수식 문서가 새로운 영속 문자열을 정하지 않는다.
+12 -8
View File
@@ -1,8 +1,12 @@
# HHT implicit dynamics 정식화
- 상태: `independently-reviewed-candidate; physics-and-validation-pending`.
읽기 구분: 물리 유도와 과거 full-coordinate 시간적분 기록이다. 아래 후보 상태·구현 전 판단은 최초 정식화 당시의 것이며, 현재 채택·입출력·검증은 [기능 요약](README.md)을 따른다. 현재 시간적분은 [축소 좌표](formulation-reduced-coordinate.md)와 [고정 null 기저](formulation-fixed-null-basis.md)를 읽는다.
본문의 검토·ADR·N1–N7 등 과거 기록명은 당시 근거의 식별명이며, 이 문서의 현재 요약 링크가 원자료 전문을 제공한다는 뜻은 아니다.
- 작성 당시 상태: `independently-reviewed-candidate; physics-and-validation-pending`.
- Owner: `formulation-agent`, 2026-09-22. 문서 gate 산출물이며 구현 승인이나 수치 검증 통과가 아니다.
- 기준: [프로젝트 지침](../../AGENTS.md), [제품 PRD](../solver-core/README.md), [공통 ADR](../solver-core/README.md), [Feature PRD](README.md), [요구사항](README.md), [연구](README.md).
- 기준: [프로젝트 지침](../../AGENTS.md), [솔버 공통 요약](../solver-core/README.md), [공통 계약 요약](../solver-core/README.md), [기능 요약](README.md), 당시 요구사항, 당시 연구 기록.
- 관성의 전개식·초기 일관성·정확도 근거는 [formulation-inertia](formulation-inertia.md)가 소유한다. 영속 schema, C++ 저장 구조와 tolerance는 정의하지 않는다.
2026-10-12 사용자는 actual shell의 축소 좌표 HHT 구현·검증과 full A의 진단용 filter-combination 의미/schema 구분을 승인했다. 채택 방향의 수식은 [축소 좌표 HHT](formulation-reduced-coordinate.md)가 소유한다. 아래 full-coordinate recurrence는 기존 구현과 비교 이력이며 축소법의 full q/v update 식으로 승계하지 않는다. 승인과 actual solver 검증 완료는 구분한다.
@@ -11,7 +15,7 @@
**추천 후보는 유한회전 kinetic energy에서 유도한 관성력과, 물리적 가속도 `a` / 알고리즘 가속도 `A`를 분리하는 HHT 확장이다.** 일정 질량의 표준 HHT force weighting으로 정확히 환원한다. 단순히 `M(q)`를 기존 일정 질량 잔차에 대입하는 식은 추천하지 않는다. 이 차이는 [상세 §5](formulation-inertia.md#5-시간-정확도와-대안의-경계)에 유도한다.
**2026-10-11 사용자가 고유치·HHT lumped mass를 승인했다([HHT-ADR-012](README.md)).** HHT는 아래 nodal kinetic measure의 `T_L/M_L`을 채택하고 기존 shell eigen nodal block lumping을 유지한다. `T_C/M_C`는 비교·유도 이력으로 보존한다. 선행 eigen 결과나 동적 reference와의 적합도로 선택한 것이 아니다. 유한회전 지원 범위를 작은 회전으로 축소하지 않는다.
**2026-10-11 사용자가 고유치·HHT lumped mass를 승인했다(`HHT-ADR-012`([현재 요약](README.md))).** HHT는 아래 nodal kinetic measure의 `T_L/M_L`을 채택하고 기존 shell eigen nodal block lumping을 유지한다. `T_C/M_C`는 비교·유도 이력으로 보존한다. 선행 eigen 결과나 동적 reference와의 적합도로 선택한 것이 아니다. 유한회전 지원 범위를 작은 회전으로 축소하지 않는다.
아래 HHT 확장과 `0+` 초기화는 HHT-ADR-009에서 채택한 계약을 유지한다. 이번 lumped mass 선택은 그 밖의 physics·알고리즘·공개 output 범위를 확대하지 않는다.
@@ -79,7 +83,7 @@ U_{drill}=\frac12\sum_{e,i}k_{de}\chi_{ei}(q)^2,\quad
f_{int}=\nabla_q(U_{phys}+U_{drill}),\quad K_{int}=\nabla_q^2(U_{phys}+U_{drill}).
\]
Drilling stiffness는 물리적 회전 관성이 아니다. `U_phys`와 `U_drill`을 구별하여 에너지 evidence를 계산하고, drill stress/resultant를 만들지 않는다. 재료 내부변수·소성 update는 없다. 재사용 대상 [evaluator](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 `PhysicalEnergy`, `DrillingEnergy`, `EvaluateInternalResidualAndTangent`도 이 구분에 대조한다. 현재 공개 equilibrium/recovery 결과는 `physical_strain_energy`만 노출하므로 drill energy evidence의 전달은 후속 구현 작업이며 현 API가 이를 이미 제공한다고 보지 않는다.
Drilling stiffness는 물리적 회전 관성이 아니다. `U_phys`와 `U_drill`을 구별하여 에너지 evidence를 계산하고, drill stress/resultant를 만들지 않는다. 재료 내부변수·소성 update는 없다. 재사용 대상 [evaluator](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 `PhysicalEnergy`, `DrillingEnergy`, `EvaluateInternalResidualAndTangent`도 이 구분에 대조한다. 최초 정식화 당시 공개 equilibrium/recovery 결과는 `physical_strain_energy`만 노출했다. 현재 dynamic frame은 `drilling_energy`를 별도로 보존하며 공개 결과 계약은 [기능 요약](README.md)을 따른다.
## 3. 질량·관성·연속 평형
@@ -119,7 +123,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`다. [공개 기본값 근거](README.md)와 [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`다. `공개 기본값 근거`와 [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 생성 절차를 확인한 주장이 아니다.
@@ -198,7 +202,7 @@ W_{0\to n}=F^{\star T}(q_n-q_0),\quad
6. `time,increment,q,v,a,A,orientation,forces,recovery,evidence`가 한 identity를 이루는 candidate만 원자적으로 commit한다. 모든 101 accepted frames를 보존한다. Newton iteration은 time frame이 아니다.
7. 비수렴·invalid chart/geometry·nonfinite·선형 solve·회복·출력 실패는 trial을 폐기하고 마지막 committed 상태/history와 기존 최종 HDF5를 보존한다. 고정 `DIRECT`를 cutback/adaptive로 바꾸거나 실패 frame을 성공으로 내보내지 않는다.
공식 출력은 lexical sibling `<stem>_results.h5`다. `U/UR`, 물리적 `v/a`, `omega/omega_dot`, algorithmic `A`, 반력과 에너지의 **공개 여부 및 영속 schema는 미결정**이다. Algorithmic `A`를 physical acceleration이라는 이름으로 공개해서는 안 된다. 출력 선택과 무관하게 검증에는 서로 구별되는 내부 quantity가 필요하다.
공식 출력은 lexical sibling `<stem>_results.h5`다. `U/UR`, 물리적 `v/a`, `omega/omega_dot`, algorithmic `A`, 반력과 에너지의 공개 여부 및 영속 schema는 최초 정식화 당시 미결정이었다. 현재 공개 계약은 [기능 요약](README.md)의 shell schema v2를 따른다. Algorithmic `A`를 physical acceleration이라는 이름으로 공개해서는 안 된다. 출력 선택과 무관하게 검증에는 서로 구별되는 내부 quantity가 필요하다.
## 7. 검증 인계와 미해결 결정
@@ -212,6 +216,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 없음 |
수식 후보의 [독립 검토](README.md)는 완료되었으며 표시된 수식에서 새 오류는 발견되지 않았다. 현재 질량 선택은 HHT-ADR-012의 nodal lumped로 대체되었다. 이후 구현 전 상태를 설명하는 이 문단은 최초 정식화 당시의 기록이며 변경본 검증의 통과를 뜻하지 않는다. 구현 전 남은 계약은 (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 승인·검증 통과로 표시하지 않는다.
수식 후보의 `독립 검토`는 완료되었으며 표시된 수식에서 새 오류는 발견되지 않았다. 현재 질량 선택은 HHT-ADR-012의 nodal lumped로 대체되었다. 이후 구현 전 상태를 설명하는 이 문단은 최초 정식화 당시의 기록이며 변경본 검증의 통과를 뜻하지 않는다. 구현 전 남은 계약은 (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 대조, 일차 문헌 대조와 수식 유도 및 문서 정적 검토다. [독립 시간정확도 검산](README.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 대조, 일차 문헌 대조와 수식 유도 및 문서 정적 검토다. `독립 시간정확도 검산`은 variable-mass SDOF와 moving-null 예제에서 추천 후보의 약 2차 q/v/physical-a 수렴을 관찰했고 naive 확대의 약 1차 오차를 구별했다. 이는 shell solver 검증이나 일반 drilling DAE 증명을 대신하지 않는다. Build/test·solver/reference 실행은 문서 작업 범위가 아니므로 미실행이다. 독립 검산과 Numerical Review 결과는 해당 owner의 보고서가 소유하며 본 문서가 스스로 승인하지 않는다.
@@ -1,5 +1,8 @@
# 3D Isoparametric Euler–Bernoulli Beam Formulation
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
## Metadata
- feature_id: `3d-isoparametric-euler-beam`
@@ -1,5 +1,8 @@
# FESA Linear Static MITC4 Shell Formulation
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
>
> 적용 경계: 물리 정식화와 당시 수치 stabilization 유도를 구분한다. 현재 공변 trace-average
> scale·frozen lifecycle은 [고유치 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을
> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않으며 S3 partial-BC 보류를 유지한다.
+1 -1
View File
@@ -1,6 +1,6 @@
# MITC4 질량·축소·stabilization 유도 근거
이 폴더는 이전 MFE baseline의 유도·반례 근거다. 현재 구현 계약은 [eigen2](../mitc4-shell-feast-eigen2/README.md)이며 채택·비채택 범위는 그 정식화에서 명시한다. 아래 과거 controls·reference portfolio·pass를 자동 승계하지 않는다.
이 폴더는 이전 MFE baseline의 유도·반례 근거다. 현재 구현 계약은 [eigen2](../mitc4-shell-feast-eigen2/README.md)이며 채택·비채택 범위는 그 정식화에서 명시한다. 아래 과거 controls·reference portfolio·pass를 자동 승계하지 않는다. 아래 준비 상태·owner 인계와 옛 source 문서명도 작성 당시 이력이며 원문은 Git 이력에서 확인한다.
<a id="formulation"></a>
@@ -1,5 +1,8 @@
# 구속된 lumped pencil, FEAST와 modal 복구
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)와
[질량·stabilization](formulation-mass-stabilization.md)의 기호를 사용한다.
Intel evidence는 [research R04/G01/G02](README.md)에 따른다.
@@ -1,5 +1,8 @@
# 질량과 공변 numerical stabilization
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)의 적용·채택 경계를 따른다.
## M1. 운동학과 physical stiffness
@@ -1,5 +1,8 @@
# MITC4 질량·공변 stabilization·FEAST 정식화
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
- Feature: `mitc4-shell-feast-eigen2`; Owner: `formulation-agent`; 정식화 revision: `r1`.
- 입력: [requirements r1](README.md), [근거](README.md), [Feature ADR](README.md).
- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../solver-core/README.md), [ADR-028](../solver-core/README.md), [ARCHITECTURE](../solver-core/README.md).
@@ -81,5 +81,6 @@ local trial은 [ShellTrialElement](../../include/fesa/elements/element_capabilit
Kernel은 immutable·stable-address borrowed object이고 accepted candidate는 procedure 소유다.
Full Newton의 typed pending·iteration 순서는 [모듈화 요약](../cpp-object-oriented-modular-refactoring/README.md)을 따른다.
정식 `reference/shellNL-meshfine/`와 `reference/shellNL-meshfine_02/` 자료가 없어 해당 비교는 미완료다.
2026-10-18 사용자 지시에 따라 `reference/temp`로 대체하지 않는다. 정식 자료가 확보되어야
hash·source identity·comparator 지원을 확인하고 실제 비교를 재개할 수 있다.
2026-10-18 사용자 지시에 따라 `reference/temp`로 대체하지 않는다. Fine 사례는 정식 자료 확보 후
hash·source identity를 확인해야 비교를 재개할 수 있다. `_02`는 별도로 comparator의 case identity와
전용 비교 계약도 구현되어 있지 않으므로 자료 확보만으로 비교를 재개할 수 없다.
@@ -1,5 +1,8 @@
# Nonlinear Static Newton–Raphson 정식화
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
>
> 적용 경계: 물리 정식화와 당시 수치 stabilization 유도를 구분한다. 현재 공변 trace-average
> scale·frozen lifecycle은 [고유치 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을
> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않으며 S3 partial-BC 보류를 유지한다.
@@ -1,5 +1,8 @@
# Shell Surface Pressure Load Formulation
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
## 1. Metadata
- feature_id: `shell-surface-pressure-load`
@@ -1,5 +1,8 @@
# Shell 과도 열전달 정식화
> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와
> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다.
- 상태: **2026-09-29 승인된 물리·방법을 반영한 구현용 정식화**.
독립 검토의 판정과 검증 기준은 [numerical-review](README.md)를 따른다.
- 담당 범위: `FEM-REQ-SHELL-THERMAL-001`–`018`의 수식·물리 의미와 검증 함의.
@@ -623,7 +626,8 @@ strip은 두께 경계층을 포함한 독립 해 또는 동등한 조건의 ora
Slab 해석해에 대한 두께 오차와 초기 `sqrt(αt)` 열침투 깊이를 확인해야 한다. 더 미세한
두께 모델은 독립 검증용 oracle이며 제품 입력의 온도점 수 확대를 뜻하지 않는다.
Reference CSV 한 시점은 다른 4개 온도점, flux, reaction 또는 전체 이력의 evidence가 아니다.
Consistent C와 본 적분·초기화 선택이 reference 정확도에 미치는 영향은 아직 측정되지 않았다.
정식화 작성 당시에는 consistent C와 본 적분·초기화 선택이 reference 정확도에 미치는 영향을 측정하지 않았다.
이후 확인한 87/729행 diagnostic FAIL과 새 필수 reference 미확보 상태는 [기능 요약](README.md)을 따른다.
Residual backward error는 `||r_f||/(||A_ff|| ||T_f||+||b_f||)`로, physical balance
defect는 `|ΔE−δ(1ᵀQ+1_cᵀR_c)|`를 저장·입력·반력 항 절댓값 합으로 정규화한다.
+8 -11
View File
@@ -86,17 +86,14 @@ Debug/Release의 binary·DLL·검사 목록·실행 근거를 섞지 않는다.
source에만 적용하며 CRT·정밀도·source·link·runtime DLL과 검사 identity를 두 경로에서 대조한다.
`fesa_docs`는 Doxygen을 찾았을 때만 생기는 선택적 target이다.
이번 통합 검증은 2026-10-18 사용자 변경에 따라 정적해석·공통 계약 검사로 한정한다.
전체 등록 identity를 대조하되 실제 선택/제외 목록과 이유를 기록하고, 새로 이관한 정적 검사도
포함한다. 위 명령은 일반 전체 실행 예시이며 이번에는 명시적 정적 선택 목록을 사용한다.
정식 정적5모델(beam·linear/nonlinear shell·linear/nonlinear Hex8)을 새 기준 실행물과
Native/CMake에서 비교한다. Python 정책·합성 비교기는 실제 비정적 solver를 실행하는지
확인해 별도로 검사한다. HHT·solid dynamic·eigen/frequency·transient thermal 실행은 제외하고
미검증으로 남긴다. 과거 정적 PASS도 현재 실행으로 승계하지 않는다. Native/CTest는
서로 다른 실행 전용 TMP/TEMP와 raw 출력 경로를 사용해 직렬 실행한다. 상속된 필터·sharding을
제거하고 실제 identity·수·exit·XML/log를 discovery와 대조한다. Skip·0건·자료 누락은 PASS가 아니다.
모델은 hash가 확인된 새 작업 복사본에서만 실행한다. `reference/temp`는 검증에 사용하지 않는다.
현재 진행 결과와 미완료 비교는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md)에 기록한다.
위 명령은 일반 전체 실행 예시다. 실행 범위를 한정할 때는 선택/제외 identity와 이유를 기록한다.
2026-10-18 병합은 사용자 지시로 정적·공통 검사와 정식 정적5모델만 검증했다.
그 결과와 비정적 미검증 범위는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md#병합-결과와-검증-범위)에 있으며 이후 기능 검증의 기본 범위를 제한하지 않는다.
Native/CTest는 짧고 고유한 TMP/TEMP와 raw 출력 경로를 분리해 직렬 실행한다. 긴 lease 경로는
output failure를 일으킬 수 있다. 상속된 필터·sharding을 제거하고 실제 identity·수·exit·XML/log를
discovery와 대조한다. Python 합성 비교와 실제 solver 실행을 구분한다. Skip·0건·자료 누락은
PASS가 아니다. 모델은 hash가 확인된 새 작업 복사본에서만 실행한다. `reference/temp`는 검증에 사용하지 않는다.
## 공통 procedure와 결과 경계
@@ -1,208 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "cpp-object-oriented-modular-refactoring",
"steps": [
{
"step": 0,
"name": "coding-style-agent-contract",
"status": "completed",
"summary": "RED: P-AGENT-001 missing mandatory input assertion failed; GREEN/VERIFY: targeted pytest 13/13, clean-env full pytest 20/20, VS18 Debug build and CTest 144/144 passed; implementation-agent now requires docs/CODINGSTYLE.md before C++ Steps and production-only Doxygen.",
"started_at": "2026-08-16T02:57:41+0900",
"completed_at": "2026-08-16T03:10:54+0900"
},
{
"step": 1,
"name": "cpp-style-tooling",
"status": "completed",
"summary": "RED: P-STYLE-001 failed on missing .clang-format/.clang-tidy/Doxyfile; GREEN/VERIFY: targeted pytest 1/1, clean-env full pytest 21/21, clang-format/clang-tidy 22.1.8 and tidy config validation, VS18 Debug build, and CTest 144/144 passed; added style/lint/Doxygen configs, optional non-default fesa_docs target, and ignored .harness/doxygen output.",
"started_at": "2026-08-16T03:10:54+0900",
"completed_at": "2026-08-16T03:19:17+0900"
},
{
"step": 2,
"name": "architecture-boundaries",
"status": "completed",
"summary": "Documentation-only: ARCHITECTURE/ADR now fix Domain unique_ptr/stable-index ownership, ElementDefinition/runtime ElementFactory separation, generic element/load/constraint pipeline boundaries, minimal Analysis::Run with a private LinearStaticAnalysis lifecycle, and facade module splits while preserving B33/MITC4/HDF5/reference contracts; contract rg, git diff --check, MSVC Debug build, CTest discovery, and full CTest 144/144 passed.",
"started_at": "2026-08-16T03:19:17+0900",
"completed_at": "2026-08-16T03:27:17+0900"
},
{
"step": 3,
"name": "foundation-google-style",
"status": "completed",
"summary": "RED: test-first status.h/PascalCase contract failed with expected MSVC C1083 missing-header error; GREEN/VERIFY: VS18 x64 Debug focused build and CTest 22/22, mandatory clang-format, full build, CTest discovery 144, and full CTest 144/144 passed; foundation core/math/linear-solver/build-info APIs now use .h guards, PascalCase names, approved identifiers, production-only Doxygen, and mechanically updated consumers without numerical/reference changes.",
"started_at": "2026-08-16T03:27:17+0900",
"completed_at": "2026-08-16T04:26:14+0900"
},
{
"step": 4,
"name": "model-element-google-style",
"status": "completed",
"summary": "RED: MSVC direct /c of tests/unit/model/domain_test.cpp against the Step 3 HEAD include tree exited 2 with expected C1083 missing fesa/model/domain.h; GREEN/VERIFY: fesa_unit_tests build, focused CTest 37/37, clang-format 14 files, full MSVC Debug build, CTest discovery 144, and full CTest 144/144 passed; migrated the five model/element headers, APIs, members, enums, helpers, and repository callsites to .h guards and Google naming with production-only Doxygen while preserving B33/MITC4 numerical and reference contracts.",
"started_at": "2026-08-16T04:26:15+0900",
"completed_at": "2026-08-16T05:37:40+0900"
},
{
"step": 5,
"name": "solver-workflow-google-style",
"status": "completed",
"summary": "RED: current analysis_model_test.cpp against Step 4 HEAD headers failed with expected MSVC C1083 missing fesa/analysis/analysis_model.h; GREEN/VERIFY: VS18 x64 Debug focused build, focused CTest 57/57, clang-format 31/31, full build, CTest discovery 144, and full CTest 144/144 passed; solver workflow headers/APIs/callsites now use .h guards, PascalCase, and production-only Doxygen while preserving lifecycle, deterministic assembly, full residual, 0x0 Kff, and atomic state contracts.",
"started_at": "2026-08-16T05:37:40+0900",
"completed_at": "2026-08-16T06:20:08+0900"
},
{
"step": 6,
"name": "io-application-google-style",
"status": "completed",
"summary": "RED: current input_syntax_test.cpp against the Step 5 HEAD include tree failed with expected MSVC C1083 missing fesa/io/abaqus/input_reader.h; GREEN/VERIFY: focused targets built, I/O/HDF5/app/reference CTest 36/36 (Hdf5ResultsWriter 9/9, B33 reference 1/1, MITC4 S4 reference 2/2), clang-format 23/23, full MSVC Debug build, CTest discovery 144, and full CTest 144/144 passed; I/O, application, and test-only reference helpers now use .h guards, PascalCase, approved identifiers, and production-only Doxygen without schema, tolerance, or artifact changes.",
"started_at": "2026-08-16T06:20:09+0900",
"completed_at": "2026-08-16T06:59:50+0900"
},
{
"step": 7,
"name": "vector3-value-type",
"status": "completed",
"summary": "RED: fesa_unit_tests build exited 1 with expected MSVC C1083 missing fesa/math/vector3.h; GREEN/VERIFY: header-only Vector3 arithmetic, right-handed cross product, finite checks, and exact zero/nonfinite normalization rejection passed focused CTest 7/7, clang-format and clang-tidy exited 0, full VS18 MSVC Debug build succeeded, CTest discovered 151 tests, and full CTest 151/151 passed without migrating existing consumers.",
"started_at": "2026-08-16T06:59:50+0900",
"completed_at": "2026-08-16T07:08:42+0900"
},
{
"step": 8,
"name": "element-geometry-vector3",
"status": "completed",
"summary": "RED: C-DUP-001 typed array-to-Vector3 seam failed with expected MSVC C2440/C2676/C2039 errors; GREEN/VERIFY: exact rotated B33, MITC4 stiffness/recovery/patch, and warped-geometry regressions passed in focused CTest 44/44, the duplicate primitive scan found 0 definitions, clang-format passed, and the full MSVC Debug build and CTest 155/155 passed; element/model geometry now uses the shared Vector3 without changing public array or result contracts.",
"started_at": "2026-08-16T07:08:42+0900",
"completed_at": "2026-08-16T07:27:50+0900"
},
{
"step": 9,
"name": "result-io-vector3",
"status": "completed",
"summary": "RED: C-DUP-002 Vector3 characterizations fixed global-origin moment, large-finite mapper geometry, shell director/frame scalar serialization, finite rejection, stable dataset identity, and atomic replacement while the duplicate scan failed on the old local Dot/Norm helpers; GREEN/VERIFY: ResultRecovery/InpDomainMapping/Hdf5ResultsWriter passed 33/33, duplicate definitions were 0, clang-format passed, and the full VS18 MSVC Debug build and CTest 156/156 including B33/MITC4 references passed without schema, tolerance, or artifact changes.",
"started_at": "2026-08-16T07:27:51+0900",
"completed_at": "2026-08-16T07:40:16+0900"
},
{
"step": 10,
"name": "dense-blas-adapter",
"status": "completed",
"summary": "RED: fesa_unit_tests build exited 1 with expected C1083 missing math/dense_blas_internal.h; GREEN/VERIFY: private Result<MKL_INT> conversion and BLAS copy adapter passed focused CTest 4/4, helper scan showed one definition family with Vector/Matrix consumers, public vendor scan returned 0 matches, clang-format passed, full VS18 MSVC Debug build succeeded, and CTest passed 158/158.",
"started_at": "2026-08-16T07:40:16+0900",
"completed_at": "2026-08-16T07:49:57+0900"
},
{
"step": 11,
"name": "source-target-resolver",
"status": "completed",
"summary": "RED: temp HEAD+test-only fesa_unit_tests build exited 1 with expected C1083 missing fesa/core/ascii.h and fesa/model/source_target_resolver.h; corrective RED: after moving +1 to invalid labels, rebuilt Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels failed 1/1 because +1 still parsed; GREEN/VERIFY: removed plus-skip behavior, targeted Ascii 1/1 and focused CTest 44/44 passed, helper scan showed only shared ascii.cpp definition/internal call, clang-format passed, full Debug build passed, and CTest discovery/full 164/164 passed.",
"started_at": "2026-08-16T07:49:57+0900",
"completed_at": "2026-08-16T08:34:09+0900"
},
{
"step": 12,
"name": "material-property-hierarchy",
"status": "completed",
"summary": "RED: fesa_unit_tests failed with expected C1083 missing material/property base headers; GREEN/VERIFY: checked Material/ElementProperty hierarchies, virtual base ownership, stable source/internal identity, exact current fields, and invalid rejection passed focused CTest 11/11, clang-format, VS18 Debug full build, CTest discovery 170, and full CTest 170/170 without Domain ownership or numerical/reference changes.",
"started_at": "2026-08-16T08:34:09+0900",
"completed_at": "2026-08-16T08:48:18+0900"
},
{
"step": 13,
"name": "element-definition-domain",
"status": "completed",
"summary": "RED: fesa_unit_tests failed with the expected missing element_definition.h and ownership APIs; GREEN/VERIFY: Domain now uniquely owns mixed ElementDefinition, ElementProperty, and Material bases with stable const views and move-only lifetime, focused ownership/AnalysisModel/mapper CTest passed 20/20, clang-format passed, full VS18 Debug build passed, CTest discovered 172 tests, and full CTest passed 172/172 including B33/MITC4 references.",
"started_at": "2026-08-16T08:48:18+0900",
"completed_at": "2026-08-16T09:10:38+0900"
},
{
"step": 14,
"name": "runtime-element-factory",
"status": "completed",
"summary": "RED: fesa_unit_tests failed with expected MSVC C1083 missing element.h; GREEN/VERIFY: direct B33/MITC4 Element implementations and the fail-closed factory passed success, incompatible/unknown/missing-frame rejection, virtual destruction, owner-bounded stable ElementView, and base stiffness/recovery tests in focused CTest 35/35; dynamic_cast scan found 0 matches, clang-format passed, full VS18 Debug build passed, CTest discovered 176 tests, and full CTest passed 176/176 including B33/MITC4 references.",
"started_at": "2026-08-16T09:10:38+0900",
"completed_at": "2026-08-16T09:38:30+0900"
},
{
"step": 15,
"name": "generic-dof-manager",
"status": "completed",
"summary": "RED: fake Element/layout and invariant-owner tests exposed missing generic APIs and CSR missing/extra acceptance; GREEN/VERIFY: source-ordered generic scatter, atomic owner validation, exact scatter-derived CSR, focused CTest 21/21, zero concrete/helper branches, clang-format, full VS18 Debug build, discovery 178, and full CTest 178/178 passed.",
"started_at": "2026-08-16T09:38:30+0900",
"completed_at": "2026-08-16T10:07:01+0900"
},
{
"step": 16,
"name": "generic-sparse-assembler",
"status": "completed",
"summary": "RED: fake 2x2/3x3 runtime contribution build failed with the expected missing generic Assemble seam; GREEN/VERIFY: exact nonconsecutive-DOF CSR and repeated serial/TBB/reverse byte identity passed SparseAssembly 9/9, concrete branch count was 0, clang-format and the full VS18 Debug build passed, and CTest discovery/full passed 179/179 including B33/MITC4 references.",
"started_at": "2026-08-16T10:07:02+0900",
"completed_at": "2026-08-16T10:24:28+0900"
},
{
"step": 17,
"name": "generic-result-recovery",
"status": "completed",
"summary": "RED: C-RECOVERY-001 fake bundles failed with expected MSVC C2660 for the missing seven-argument generic Recover seam; GREEN/VERIFY: fake beam/shell bundles preserved stable row identity, end-action versus section-resultant signs, physical-only shell energy, and whole-state rollback, focused CTest passed 53/53, concrete branch count was 0, clang-format and the full VS18 Debug build passed, and CTest discovery/full passed 182/182 including B33/MITC4 references.",
"started_at": "2026-08-16T10:25:16+0900",
"completed_at": "2026-08-16T10:40:49+0900"
},
{
"step": 18,
"name": "load-hierarchy",
"status": "completed",
"summary": "RED: fake Load, generic assembler, and StepDefinition ownership tests failed with missing Load headers/APIs; GREEN/VERIFY: Domain-owned unique_ptr<Load> hierarchy and validation-before-candidate deterministic accumulation passed focused CTest 29/29, clang-format, full VS18 Debug build, discovery 186, and full CTest 186/186 including B33/MITC4 references.",
"started_at": "2026-08-16T10:40:49+0900",
"completed_at": "2026-08-16T10:56:57+0900"
},
{
"step": 19,
"name": "boundary-condition-policy",
"status": "completed",
"summary": "RED: fake BoundaryCondition and policy tests failed with expected C1083 missing boundary_condition.h; GREEN/VERIFY: Domain-owned prescribed definitions, stable partition/reconstruction including nonzero and 0x0 Kff, duplicate/conflict/nonfinite atomic rejection, focused CTest 29/29, clang-format, full MSVC Debug build, discovery, and full CTest 191/191 passed.",
"started_at": "2026-08-16T10:56:57+0900",
"completed_at": "2026-08-16T11:23:20+0900"
},
{
"step": 20,
"name": "analysis-hierarchy",
"status": "completed",
"summary": "RED: the new minimal Analysis contract test failed with expected MSVC C1083 missing fesa/analysis/analysis.h; GREEN/VERIFY: base-only Run dispatch, virtual destruction, Status propagation, procedure-owned generic runtime elements, factorize-before-invalid-load, exactly one factorization, 0x0 all-constrained solve, and invalid-recovery writer suppression passed focused CTest 12/12, format/boundary scans, full VS18 Debug build, CTest discovery 193, and full CTest 193/193 including B33/MITC4 references.",
"started_at": "2026-08-16T11:23:20+0900",
"completed_at": "2026-08-16T11:33:07+0900"
},
{
"step": 21,
"name": "domain-mapper-modules",
"status": "completed",
"summary": "RED: fesa_unit_tests failed with expected MSVC C1083 missing private domain_builder.h; GREEN/VERIFY: topology, material/property, step/load/BC candidate seams and exact diagnostics passed focused CTest 17/17, domain_mapper.cpp now orchestrates private Status stages with atomic DomainBuilder commit, clang-format and full VS18 Debug build passed, and CTest discovery/full passed 197/197 including B33/MITC4 references.",
"started_at": "2026-08-16T11:33:08+0900",
"completed_at": "2026-08-16T11:45:33+0900"
},
{
"step": 22,
"name": "result-recovery-modules",
"status": "completed",
"summary": "RED: temporary HEAD+test-only fesa_unit_tests build failed with expected MSVC C1083 for missing results/analysis_state_commit.h; GREEN/VERIFY: focused recovery/AnalysisState CTest passed 28/28, all five component files, facade wiring, and clang-format passed, and the full VS18 Debug build, discovery, and CTest 203/203 preserved B33/MITC4 identity, signs, order, global-origin equilibrium, physical-only energy, and later-invalid rollback.",
"started_at": "2026-08-16T11:45:34+0900",
"completed_at": "2026-08-16T12:52:10+0900"
},
{
"step": 23,
"name": "hdf5-writer-modules",
"status": "completed",
"summary": "RED: fesa_unit_tests failed with expected MSVC C1083 for missing private io/hdf5/hdf5_atomic_file.h; GREEN/VERIFY: private RAII, primitives, model, result, reopen self-check, and atomic-finalization components passed focused schema/atomicity CTest 13/13, component/facade scans and zero public HDF5 vendor leaks passed with clang-format, and full VS18 Debug build, discovery, and CTest passed 206/206 while preserving schema-v0 and existing-final behavior.",
"started_at": "2026-08-16T12:52:11+0900",
"completed_at": "2026-08-16T13:28:06+0900"
},
{
"step": 24,
"name": "final-quality-reference-gate",
"status": "completed",
"started_at": "2026-08-16T13:28:07+0900",
"summary": "Style gate passed with clean-env pytest 21/21, clang-format 163 files, clang-tidy 46 public headers, and 0 .hpp files; fresh VS18 Debug build passed, CTest discovery/full passed 206/206, approved B33/MITC4 reference suites passed 3/3 with generated results.h5 for cantilever-beam-b33 and mitc4-shell-s4-comparison, blocking comparisons passed with reference tree unchanged against 1e5758f, and reports were written to docs/cpp-object-oriented-modular-refactoring/{implementation-report.md,build-test.md,reference-comparison.md}.",
"completed_at": "2026-08-16T13:54:51+0900"
}
],
"created_at": "2026-08-16T02:57:41+0900",
"completed_at": "2026-08-16T13:54:51+0900"
}
@@ -1,64 +0,0 @@
# Step 0: Coding Style Agent Contract
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `/.codex/hooks.json`
- `/tests/test_agent_skill_workflow_contract.py`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step0.md`
필수 파일이 없거나 승인 설계와 충돌하면 현재 Step을 `blocked`로 기록하고 중단한다.
## 작업
Requirement `R-AGENT-001`만 구현한다.
1. `tests/test_agent_skill_workflow_contract.py`에 `P-AGENT-001`을 먼저 추가한다.
2. Test는 `implementation-agent.toml`의 mandatory global input 구간이 literal path
`../../docs/solver-core/README.md`를 직접 포함하고, C++ Step 시작 전에 읽도록 지시하는지 검증한다.
3. RED에서 현재 profile이 이 contract를 만족하지 않아 assertion failure가 발생함을 기록한다.
```text
Before every C++ implementation Step, read docs/CODINGSTYLE.md as a mandatory global
input and apply it to production and test code. Doxygen coverage applies only to
production code.
```
5. 다른 agent profile, solver 문서, production C++, CMake는 수정하지 않는다.
## Acceptance Criteria
RED와 GREEN을 다음 명령으로 구분해 기록한다.
```powershell
uv run --with pytest python -m pytest -v -rs `
tests/test_agent_skill_workflow_contract.py
uv run --with pytest python -m pytest -v -rs
```
Repository Stop 검증과 동일한 C++ 회귀 확인:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED assertion, GREEN targeted/full pytest, C++ regression 결과를 summary에 남긴다.
- 성공 시 현재 Step만 `completed`와 한 줄 `summary`로 갱신한다.
- 실패면 `error`/`error_message`, 사용자 개입이 필요하면
`blocked`/`blocked_reason`을 기록한다.
- timestamp, retry, commit, 다음 Step 선택은 Executor 소유다.
## 금지사항
- C++ 또는 CMake를 수정하지 마라. 이유: 이 Step은 agent contract만 소유한다.
- 다른 agent profile에 동일 문구를 일괄 추가하지 마라. 이유: 승인 범위를 넓힌다.
- 직접 commit하거나 hook script를 수동 실행하지 마라. 이유: Executor와 hook의 소유권이다.
@@ -1,56 +0,0 @@
# Step 1: C++ Style Tooling
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/CMakeLists.txt`
- `/.gitignore`
- `/tests/test_agent_skill_workflow_contract.py`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step1.md`
## 작업
Requirements `R-STYLE-001`과 `R-DOC-001`의 repository tooling만 구현한다.
1. `/tests/test_cpp_policy_contract.py`에 `P-STYLE-001`을 먼저 작성한다. 다음 literal
contract를 검사한다.
- `.clang-format`: `BasedOnStyle: Google`, `IndentWidth: 2`, `ColumnLimit: 80`.
- `.clang-tidy`: C++17-compatible checks와 FESA PascalCase/snake_case identifier rules.
- `Doxyfile`: `INPUT = include src`, tests 제외, `WARN_AS_ERROR = YES`, generated HTML은
source control 밖의 build 경로.
- Root CMake의 optional `fesa_docs` target은 Doxygen가 발견될 때만 등록되고 default
configure에는 Doxygen를 요구하지 않는다.
2. RED에서 설정 파일 부재로 test failure를 확인한다.
3. `/.clang-format`, `/.clang-tidy`, `/Doxyfile`을 추가한다.
4. `/CMakeLists.txt`에 `find_package(Doxygen QUIET)`와 발견 시에만 등록되는
`fesa_docs` custom target을 추가한다. Default build dependency에 넣지 않는다.
5. Generated Doxygen HTML 경로가 ignore되지 않았다면 `/.gitignore`에 정확한 output
directory만 추가한다.
6. Doxygen executable은 실행하지 않는다. 사용자가 문서 생성을 추후 수행하기로 했다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Expected GREEN에는 Doxygen 실행이나 generated HTML이 포함되지 않는다.
## 검증 및 상태 갱신
- RED policy failure와 GREEN pytest/tool version/config/full CTest를 summary에 남긴다.
- 성공 시 현재 Step만 `completed`로 갱신하고 생성한 설정 파일을 summary에 기록한다.
- 환경에 두 LLVM executable이 없으면 `blocked`와 정확한 경로를 기록한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- 기존 C++를 format하지 마라. 이유: 기계적 migration은 Step 3–6 소유다.
- Doxygen를 실행하거나 generated HTML을 commit하지 마라. 이유: 사용자 결정으로 생성은 연기됐다.
- Doxygen를 default build 필수 dependency로 만들지 마라. 이유: 현재 blocking gate가 아니다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,66 +0,0 @@
# Step 10: Dense BLAS Adapter
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/math/vector.h`, `/src/fesa/math/vector.cpp`
- `/include/fesa/math/matrix.h`, `/src/fesa/math/matrix.cpp`
- `/tests/unit/math/vector_test.cpp`, `/tests/unit/math/matrix_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step10.md`
## 작업
Requirement `R-DUP-002`의 dense-BLAS duplication만 제거한다.
1. `/tests/unit/math/dense_blas_internal_test.cpp`를 먼저 추가하고 `C-DUP-003`을 작성한다.
Test는 zero/normal/overflow length conversion과 zero/nonzero contiguous copy behavior를
검증한다.
2. Missing internal adapter include/symbol로 RED compile failure를 기록한다.
3. Private candidate module은 `/src/fesa/math/dense_blas_internal.h`와
`/src/fesa/math/dense_blas_internal.cpp`다.
Tests에 private include directory가 필요하면 `fesa_unit_tests`에만
`${PROJECT_SOURCE_DIR}/src/fesa`를 PRIVATE로 추가한다.
4. Candidate functions:
```cpp
namespace fesa::dense_blas_internal {
Result<MKL_INT> ToMklSize(std::size_t size);
void CopyValues(const double* source, std::size_t size, double* destination);
} // namespace fesa::dense_blas_internal
```
5. `MKL_INT` and MKL includes are permitted only in this private implementation boundary and
existing backend `.cpp`; no file under `/include/fesa/` may expose them.
6. Matrix/Vector의 duplicated conversion/copy helpers를 adapter call로 교체한다. Exception,
Status/failure meaning, row-major layout and BLAS call order stay unchanged.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
The public-header vendor scan must return no matches. The private helper scan must show one
definition family and the two intended consumers only.
## 검증 및 상태 갱신
- RED missing seam, focused conversion/copy behavior, scans and full CTest를 summary에 기록한다.
- Public vendor type leak or behavior regression이면 `error`로 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Public math API에 MKL type을 추가하지 마라.
- Matrix layout 또는 BLAS operation order를 바꾸지 마라.
- SIMD, allocation or runtime performance optimization을 하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,113 +0,0 @@
# Step 11: Source Target Resolver
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/core/source_identity.h`
- `/include/fesa/model/domain.h`, `/src/fesa/model/domain.cpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/src/fesa/fem/dof_manager.cpp`
- `/src/fesa/assembly/load_assembler.cpp`
- `/src/fesa/results/result_recovery.cpp`
- matching mapper/DOF/load/recovery tests
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step11.md`
## 작업
Requirement `R-DUP-002`의 ASCII/source-target owner를 구현한다.
1. `/tests/unit/core/ascii_test.cpp`와
`/tests/unit/model/source_target_resolver_test.cpp`를 먼저 추가한다.
2. `C-DUP-004` tests cover ASCII-only lower/equality, positive source-label parsing,
separate node/element set namespaces, instance identity, declaration-order expansion,
duplicate/missing/ambiguous/nonpositive rejection and deterministic diagnostic order.
3. Missing headers/symbols로 RED compile failure를 기록한다.
4. Create `/include/fesa/core/ascii.h`, `/src/fesa/core/ascii.cpp`,
`/include/fesa/model/source_target_resolver.h`, and
`/src/fesa/model/source_target_resolver.cpp`; register both sources and both tests in CMake.
5. Candidate core functions:
```cpp
char AsciiLower(char value) noexcept;
bool AsciiCaseInsensitiveEquals(std::string_view lhs,
std::string_view rhs) noexcept;
Result<std::int64_t> ParsePositiveSourceLabel(std::string_view text);
```
6. Candidate model interface:
```cpp
enum class SourceEntityKind { kNode, kElement };
struct SourceTargetIndexEntry {
SourceEntityKind entity_kind;
std::string instance_name;
std::string target_name;
SourceEntityId source_id;
EntityIndex entity_index;
std::size_t declaration_order;
};
class SourceTargetIndex {
public:
explicit SourceTargetIndex(std::vector<SourceTargetIndexEntry> entries);
const std::vector<SourceTargetIndexEntry>& Entries() const noexcept;
};
struct SourceTargetQuery {
SourceEntityKind entity_kind;
std::string instance_name;
std::string target_name_or_label;
};
struct ResolvedSourceTarget {
SourceEntityId source_id;
EntityIndex entity_index;
};
class SourceTargetResolver {
public:
explicit SourceTargetResolver(const SourceTargetIndex& index) noexcept;
Result<std::vector<ResolvedSourceTarget>> Resolve(
const SourceTargetQuery& query) const;
};
```
7. `SourceTargetIndex` is an immutable index built from validated candidate or Domain semantic
records. It owns its compact entries; the resolver stores a non-owning reference, so the index
lifetime must outlive the resolver and Doxygen must state it.
8. Replace repeated `AsciiLower`, equal-name, positive-integer, and same-meaning source resolution
helpers only. Preserve each owner-specific diagnostic category/source location.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
The helper scan may show only the shared definitions and intentional calls, not repeated local
definitions. Full diagnostics and stable order tests must pass.
## 검증 및 상태 갱신
- RED, focused resolution cases, duplicate scan and full CTest를 summary에 기록한다.
- Identity/diagnostic order regression이면 `error`; missing upstream identity contract이면
`blocked`로 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Unicode case folding이나 locale behavior를 추가하지 마라. 이유: input contract is ASCII.
- Node와 element set namespace를 합치지 마라.
- Domain mapper를 responsibility files로 split하지 마라. 이유: Step 21 소유다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,91 +0,0 @@
# Step 12: Material and Element Property Hierarchy
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/model/model_types.h`
- `/include/fesa/model/domain.h`, `/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`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step12.md`
## 작업
Requirement `R-MODEL-001`의 material/property type system만 구현한다. Domain polymorphic
ownership migration은 Step 13에서 수행한다.
1. `/tests/unit/materials/material_test.cpp`와
`/tests/unit/properties/element_property_test.cpp`를 먼저 만든다.
2. `C-MODEL-001` tests create each concrete through `std::unique_ptr<Base>`, verify virtual
destruction, source/internal identity, concrete kind, exact current fields and invalid input
rejection. Missing base headers cause RED compile failure.
3. Candidate interfaces:
```cpp
enum class MaterialKind { kIsotropicLinearElastic };
class Material {
public:
virtual ~Material() = default;
virtual MaterialKind Kind() const noexcept = 0;
virtual const SourceEntityId& SourceId() const noexcept = 0;
};
class IsotropicLinearElasticMaterial final : public Material {
public:
double YoungsModulus() const noexcept;
double PoissonsRatio() const noexcept;
};
enum class ElementPropertyKind { kGeneralBeamSection, kShellSection };
class ElementProperty {
public:
virtual ~ElementProperty() = default;
virtual ElementPropertyKind Kind() const noexcept = 0;
virtual const SourceEntityId& SourceId() const noexcept = 0;
};
```
4. Create these exact production files and register their `.cpp` sources in CMake:
- `/include/fesa/materials/material.h`
- `/include/fesa/materials/isotropic_linear_elastic_material.h`
- `/src/fesa/materials/isotropic_linear_elastic_material.cpp`
- `/include/fesa/properties/element_property.h`
- `/include/fesa/properties/general_beam_section.h`
- `/include/fesa/properties/shell_section.h`
- `/src/fesa/properties/general_beam_section.cpp`
- `/src/fesa/properties/shell_section.cpp`
5. Add concrete `GeneralBeamSection` and `ShellSection` classes preserving their current validated
fields, units, source identity and optional frame meaning.
6. Move concrete record responsibility out of unrelated `model_types.h` only as required to avoid
duplicate definitions; update current compile consumers minimally.
7. No base contains density, plastic state, anisotropic tensor, thickness, area or no-op virtual
methods that are not common to every concrete.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED missing interfaces, concrete validation, virtual ownership and full CTest를 summary에 기록한다.
- Any future-only field/interface or current property regression is an `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Density/plasticity/anisotropy APIs를 추가하지 마라. 이유: 승인된 현재 behavior가 아니다.
- Domain을 `shared_ptr` repository로 바꾸지 마라.
- ElementFactory 또는 numerical kernel을 수정하지 마라. 이유: Step 14 소유다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,78 +0,0 @@
# Step 13: Element Definition and Domain Ownership
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 11 `source_target_resolver` files
- Step 12 material/property headers and tests
- `/include/fesa/model/model_types.h`
- `/include/fesa/model/domain.h`, `/src/fesa/model/domain.cpp`
- `/include/fesa/analysis/analysis_model.h`, `/src/fesa/analysis/analysis_model.cpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- matching Domain, AnalysisModel and DomainMapper tests
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step13.md`
## 작업
Requirements `R-MODEL-001` and `R-ELEMENT-001`의 semantic ownership을 구현한다.
1. Domain/AnalysisModel/mapper tests에 `C-MODEL-002`를 먼저 추가한다. Tests verify mixed
B33/MITC4 definition ownership through base references, vector-position `EntityIndex`, insertion
order, const access, move-only Domain, and Domain-outlives-AnalysisModel contract.
2. Missing base/ownership API로 RED compile failure를 기록한다.
3. Candidate interface:
```cpp
enum class ElementDefinitionKind { kEulerBeam3D, kMitc4Shell };
class ElementDefinition {
public:
virtual ~ElementDefinition() = default;
virtual ElementDefinitionKind Kind() const noexcept = 0;
virtual const SourceEntityId& SourceId() const noexcept = 0;
virtual std::string_view SourceElementType() const noexcept = 0;
virtual const std::vector<EntityIndex>& NodeIndices() const noexcept = 0;
virtual EntityIndex PropertyIndex() const noexcept = 0;
};
```
4. Create `/include/fesa/elements/element_definition.h`. Keep concrete definitions in the
current `/include/fesa/elements/euler_beam_3d.h` and
`/include/fesa/elements/mitc4_shell.h` ownership modules rather than creating a second record
location.
5. Existing `EulerBeam3DDefinition` and `Mitc4ShellDefinition` become final concrete definitions;
preserve B33 vs S4/S4R source type and FESA internal identity.
6. Domain owns `std::vector<std::unique_ptr<ElementDefinition>>`,
`std::vector<std::unique_ptr<ElementProperty>>`, and
`std::vector<std::unique_ptr<Material>>`. Accessors return const base references or const
collection views; Domain copy is disabled and move is allowed if existing construction needs it.
7. Mapper builds a complete validated candidate before moving it into Domain. Failed mapping must
not leave a partially visible Domain.
8. AnalysisModel remains a non-owning active index/reference view and never copies Domain.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED, stable ownership/order/lifetime focused tests, mapper and full CTest를 summary에 기록한다.
- Index/order/lifetime regression is `error`; missing ownership decision is `blocked`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- `Clone()` or `shared_ptr`를 추가하지 마라. 이유: Domain has unique immutable ownership.
- Node/Element에 equation id를 저장하지 마라.
- Runtime Element methods를 semantic definition에 넣지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,116 +0,0 @@
# Step 14: Runtime Element and Factory
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 12 material/property hierarchy files
- Step 13 element definition and Domain files
- `/include/fesa/elements/euler_beam_3d.h`, `/src/fesa/elements/euler_beam_3d.cpp`
- `/include/fesa/elements/mitc4_shell.h`, `/src/fesa/elements/mitc4_shell.cpp`
- element/model/result record tests
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step14.md`
## 작업
Requirement `R-ELEMENT-001`의 numerical runtime boundary를 구현한다.
1. `/tests/unit/elements/element_factory_test.cpp`를 먼저 추가한다. `C-ELEMENT-001` covers
base-pointer virtual destruction, B33 and MITC4 factory success, stable DOF layout, stiffness
and recovery through base, unknown/mismatched property/material/null rejection.
2. Missing `element.h` and `element_factory.h` cause RED compile failure.
3. Create `/include/fesa/elements/element.h`,
`/include/fesa/elements/element_factory.h`, and
`/src/fesa/elements/element_factory.cpp`; register the source and factory test in CMake.
4. Candidate interfaces:
```cpp
struct ElementDofLayout {
SourceEntityId source_id;
std::vector<EntityIndex> node_indices;
std::vector<DofComponent> components_per_node;
};
struct ElementStiffnessContribution {
ElementDofLayout layout;
Matrix values;
};
struct BeamElementResultRows {
std::vector<EndpointResultRow> endpoint_rows;
std::vector<GaussResultRow> gauss_rows;
std::vector<StressS11Row> stress_rows;
};
struct ShellElementResultRows {
std::vector<ShellResultRow> rows;
double physical_strain_energy;
};
using ElementResultPayload =
std::variant<BeamElementResultRows, ShellElementResultRows>;
struct ElementResultBundle {
SourceEntityId source_id;
ElementResultPayload payload;
};
class Element {
public:
virtual ~Element() = default;
virtual const ElementDofLayout& DofLayout() const noexcept = 0;
virtual Result<ElementStiffnessContribution> ComputeStiffness() const = 0;
virtual Result<ElementResultBundle> Recover(
const Vector& full_displacement) const = 0;
};
using ElementView = std::vector<std::reference_wrapper<const Element>>;
class ElementFactory {
public:
Result<std::unique_ptr<Element>> Create(
const ElementDefinition& definition,
const Domain& domain) const;
};
```
5. The linear-static candidate owns `std::vector<std::unique_ptr<Element>>` and builds an
`ElementView` whose lifetime is bounded by that owner. Carrier type locations may be adjusted
to avoid circular public dependencies, but semantics and names must stay consistent for
Steps 15–17.
6. Factory centralizes explicit definition/property/material kind compatibility, bounds checks,
and structured diagnostic. It may use a checked kind discriminator and concrete access after
validation; downstream consumers must not downcast.
7. Existing B33/MITC4 numerical kernels implement `Element` without changing formulation or adding
fields meaningless to the other element.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
The downcast scan must show no newly scattered consumer downcasts. If the centralized factory uses
a checked cast, document the preceding kind validation and keep it in the factory only.
## 검증 및 상태 갱신
- RED, success/rejection cases, base stiffness/recovery, downcast scan and full CTest를 summary에 기록한다.
- Formulation or result identity changes are `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Semantic definition and runtime kernel을 one class로 합치지 마라.
- Future element registry/global static registration을 추가하지 마라.
- Giant common result record with meaningless optional fields를 만들지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,70 +0,0 @@
# Step 15: Generic DofManager
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 13 Domain/AnalysisModel files
- Step 14 `element.h`, `element_factory.h`, concrete runtime elements
- `/include/fesa/fem/dof_manager.h`, `/src/fesa/fem/dof_manager.cpp`
- `/tests/unit/fem/dof_manager_test.cpp`
- `/tests/unit/assembly/sparse_assembler_test.cpp`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step15.md`
## 작업
Requirement `R-PIPELINE-001`의 DofManager portion과 `R-DUP-002`의 DOF invariant owner를
구현한다.
1. `dof_manager_test.cpp`에 `C-DOF-001`을 먼저 추가한다. A test-only fake `Element`
supplies a layout not named B33 or MITC4; DofManager must number/scatter it in source order.
2. Tests also corrupt duplicate/full/free/constrained/equation mappings through an approved test seam
and expect `ValidateInvariants()` to reject each exact inconsistency.
3. Current DofManager cannot consume fake base layouts or expose owner validation, producing RED.
4. Candidate API:
```cpp
Status DofManager::Build(
const AnalysisModel& analysis_model,
const ElementView& elements);
Result<std::vector<std::size_t>> DofManager::ElementScatter(
const ElementDofLayout& layout) const;
Status DofManager::ValidateInvariants() const;
```
5. Replace B33/MITC4 concrete scatter/pattern branches with the ordered layout. Node DOF ownership,
constrained/free mappings, equation numbering and sparse pattern remain solely in DofManager.
6. Preserve stable node/source/component order, no/mixed/all-constraint behavior, and valid 0 free
equations. Do not store equation ids in Node/Element.
7. Remove same-meaning `ValidateDofOrder` helpers from other modules only after their callers use
`ValidateInvariants()` or an owner-issued immutable mapping.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
`ValidateDofOrder` scan must show no duplicate local definitions. Existing public compatibility
wrappers may remain temporarily only if they delegate to DofManager and are removed by Step 20.
## 검증 및 상태 갱신
- RED fake-element/invariant failures, focused stable ordering, branch scan and full CTest를 summary에 기록한다.
- Equation or sparse pattern ordering regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Element에 equation ids or global CSR를 저장하지 마라.
- DOF component order를 element kind switch로 재구성하지 마라.
- Sparse assembly algorithm을 수정하지 마라. 이유: Step 16 소유다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,63 +0,0 @@
# Step 16: Generic SparseAssembler
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 14 runtime Element contribution contract
- Step 15 DofManager and invariant contract
- `/include/fesa/assembly/sparse_assembler.h`, `/src/fesa/assembly/sparse_assembler.cpp`
- `/include/fesa/assembly/parallel_for.h`, `/src/fesa/assembly/parallel_for.cpp`
- `/tests/unit/assembly/sparse_assembler_test.cpp`
- `/tests/unit/elements/euler_beam_3d_test.cpp`
- `/tests/unit/elements/mitc4_shell_test.cpp`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step16.md`
## 작업
Requirement `R-PIPELINE-001`의 assembly portion을 구현한다.
1. `sparse_assembler_test.cpp`에 `C-ASSEMBLY-001`을 먼저 추가한다. A fake runtime Element
emits a known 2x2/3x3 local contribution with nonconsecutive full DOFs; tests verify exact CSR
structure/values and repeated serial/TBB byte identity.
2. Current assembler's concrete storage branch fails to assemble the fake, providing RED.
3. Candidate API:
```cpp
Result<SparseMatrix> SparseAssembler::Assemble(
const ElementView& elements,
const DofManager& dof_manager,
ParallelFor& parallel_for) const;
```
4. Each stable element index owns one local COO buffer created from
`Element::ComputeStiffness()` and DofManager scatter. Worker threads never mutate global CSR.
5. Concatenate and reduce in the existing stable tuple ordering. Do not replace exact fixed
reduction with atomics, unordered containers or nondeterministic task completion order.
6. Remove B33/MITC4 concrete branches from SparseAssembler after both current elements flow through
the interface.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED fake contribution, exact CSR/repeated determinism, branch scan and full CTest를 summary에 기록한다.
- Any ordering/numeric regression is `error`; do not relax equality.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Worker가 global CSR storage를 직접 수정하게 하지 마라.
- Floating-point reduction order or TBB policy를 변경하지 마라.
- Load assembly를 이 interface에 합치지 마라. 이유: separate responsibility.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,69 +0,0 @@
# Step 17: Generic ResultRecovery
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 14 `ElementResultBundle` contract
- Step 15 DofManager and Step 16 assembly files
- `/include/fesa/results/result_recovery.h`, `/src/fesa/results/result_recovery.cpp`
- `/include/fesa/results/result_records.h`, `/include/fesa/analysis/analysis_state.h`
- matching result/element unit tests
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step17.md`
## 작업
Requirement `R-PIPELINE-001`의 recovery portion을 구현한다.
1. `result_recovery_test.cpp`에 `C-RECOVERY-001`을 먼저 추가한다. A fake Element returns a
valid backend-neutral bundle and a failing bundle; tests verify stable insertion and whole-state
rollback without knowing a concrete element kind.
2. Current concrete B33/MITC4 branches fail the generic test, providing RED.
3. Candidate facade call:
```cpp
Status ResultRecovery::Recover(
const AnalysisModel& analysis_model,
const ElementView& elements,
const DofManager& dof_manager,
const SparseMatrix& full_stiffness,
const Vector& full_displacement,
const Vector& full_external_force,
AnalysisState& state) const;
```
4. Elements own element-local physical recovery; ResultRecovery owns full residual, reactions,
free equilibrium, stable bundle aggregation, cross-element/global evidence and atomic commit.
5. Beam end action, positive-local-x section resultant, Gauss generalized results and section-point
stress remain distinct rows. Shell physical recovery excludes drilling energy/results.
6. Remove B33/MITC4 kind branches from the facade. Distinct bundle variant/collections may be
visited without downcasting the Element itself.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED generic bundle, identity/sign/rollback tests, branch scan and full CTest를 summary에 기록한다.
- Row merge/average, sign, energy or atomicity regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Different result locations를 average/merge하지 마라.
- Drilling stabilization을 physical shell results에 포함하지 마라.
- HDF5 schema or writer를 수정하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,94 +0,0 @@
# Step 18: Load Hierarchy
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 11 source-target resolver files
- Step 13 Domain/AnalysisModel files
- Step 15 DofManager files
- `/include/fesa/assembly/load_assembler.h`, `/src/fesa/assembly/load_assembler.cpp`
- `/tests/unit/assembly/load_assembler_test.cpp`
- `/tests/unit/analysis/analysis_model_test.cpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step18.md`
## 작업
Requirement `R-LOAD-001`을 구현한다.
1. `/tests/unit/loads/load_test.cpp`와 LoadAssembler generic test를 먼저 추가한다.
`C-LOAD-001` uses a fake Load to emit ordered contributions, verifies signed duplicate target
accumulation and rejects nonfinite/index errors before global mutation.
2. Missing Load base/contribution API or concrete-vector-only assembler gives RED.
3. Create `/include/fesa/loads/load.h`,
`/include/fesa/loads/concentrated_nodal_load.h`, and
`/src/fesa/loads/concentrated_nodal_load.cpp`; register the source and load test in CMake.
4. Candidate interfaces:
```cpp
struct LoadContribution {
std::size_t source_order;
std::size_t full_dof_index;
double value;
};
struct LoadContext {
const Domain& domain;
const DofManager& dof_manager;
const SourceTargetResolver& target_resolver;
};
class Load {
public:
virtual ~Load() = default;
virtual Result<std::vector<LoadContribution>> ComputeContributions(
const LoadContext& context) const = 0;
};
class ConcentratedNodalLoad final : public Load {
public:
ConcentratedNodalLoad(SourceTargetQuery target,
std::array<double, 6> global_components,
std::size_t source_order);
Result<std::vector<LoadContribution>> ComputeContributions(
const LoadContext& context) const override;
private:
SourceTargetQuery target_;
std::array<double, 6> global_components_;
std::size_t source_order_;
};
```
5. Domain StepDefinition owns loads through `unique_ptr<Load>` and exposes const active order.
6. `LoadAssembler` requests contributions in active source order, validates them, then accumulates
into a candidate full vector in the existing deterministic order.
7. Current drilling-moment validation, exact-zero aggregate handling, nonzero prescribed effective
RHS behavior and diagnostics remain unchanged.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED fake load, ordered/validation focused tests and full CTest를 summary에 기록한다.
- Reduction/order/diagnostic regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Load object가 global Vector를 직접 mutate하게 하지 마라.
- Distributed load, body force or new keyword를 구현하지 마라.
- Parallel accumulation or order optimization을 추가하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,120 +0,0 @@
# Step 19: Boundary Condition Policy
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 11 source resolver, Step 13 Domain and Step 15 DofManager files
- `/include/fesa/constraints/essential_constraints.h`
- `/src/fesa/constraints/essential_constraints.cpp`
- `/tests/unit/constraints/essential_constraints_test.cpp`
- `/tests/unit/fem/dof_manager_test.cpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step19.md`
## 작업
Requirement `R-BC-001`을 구현한다.
1. `/tests/unit/constraints/boundary_condition_test.cpp`와 policy-focused tests를 먼저 추가한다.
`C-BC-001` uses a fake BoundaryCondition and concrete prescribed displacement to verify stable
definitions, duplicates/conflicts/nonfinite rejection and nonzero reconstruction.
2. Missing base/policy API provides RED.
3. Create `/include/fesa/constraints/boundary_condition.h`,
`/include/fesa/constraints/prescribed_displacement.h`,
`/include/fesa/constraints/essential_constraint_policy.h`,
`/src/fesa/constraints/prescribed_displacement.cpp`, and
`/src/fesa/constraints/essential_constraint_policy.cpp`; register sources/tests in CMake.
4. Candidate interfaces:
```cpp
struct ConstraintDefinition {
std::size_t source_order;
std::size_t full_dof_index;
double prescribed_value;
};
struct BoundaryConditionContext {
const Domain& domain;
const DofManager& dof_manager;
const SourceTargetResolver& target_resolver;
};
class BoundaryCondition {
public:
virtual ~BoundaryCondition() = default;
virtual Result<std::vector<ConstraintDefinition>> ResolveConstraints(
const BoundaryConditionContext& context) const = 0;
};
class PrescribedDisplacementBoundaryCondition final
: public BoundaryCondition {
public:
PrescribedDisplacementBoundaryCondition(SourceTargetQuery target,
DofComponent component,
double prescribed_value,
std::size_t source_order);
Result<std::vector<ConstraintDefinition>> ResolveConstraints(
const BoundaryConditionContext& context) const override;
private:
SourceTargetQuery target_;
DofComponent component_;
double prescribed_value_;
std::size_t source_order_;
};
struct PartitionedStiffness {
SparseMatrix k_ff;
SparseMatrix k_fc;
SparseMatrix k_cf;
SparseMatrix k_cc;
};
class EssentialConstraintPolicy {
public:
Result<PartitionedStiffness> Partition(
const SparseMatrix& full_stiffness,
const DofManager& dof_manager) const;
Vector GatherFree(const Vector& full_values,
const DofManager& dof_manager) const;
Vector GatherConstrained(const Vector& full_values,
const DofManager& dof_manager) const;
Vector ReconstructFull(const Vector& free_values,
const Vector& constrained_values,
const DofManager& dof_manager) const;
};
```
5. Domain StepDefinition owns boundary conditions through `unique_ptr<BoundaryCondition>`.
6. Move the existing `PartitionedStiffness` record plus stable elimination, Kff/Kfc/Kcf/Kcc
extraction, prescribed vector and full/reduced reconstruction behind
`EssentialConstraintPolicy` without changing algebra or order.
7. A valid all-constrained model keeps 0x0 Kff semantics. Conflicting definitions fail before
mutating an accepted candidate.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED fake boundary, partition/reconstruction/all-constrained tests and full CTest를 summary에 기록한다.
- Algebra/order or nonzero prescribed behavior regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- MPC, penalty, Lagrange multiplier or new BC keyword를 구현하지 마라.
- BoundaryCondition이 K matrix를 직접 partition하게 하지 마라.
- Prescribed displacement를 bool/enum mega-policy로 future behavior와 합치지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,64 +0,0 @@
# Step 2: Architecture Boundaries
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step2.md`
## 작업
Requirements `R-MODEL-001`, `R-ELEMENT-001`, `R-PIPELINE-001`, `R-LOAD-001`,
`R-BC-001`, `R-ANALYSIS-001`, `R-MODULE-001`의 ownership 방향을 문서화한다.
1. `../../docs/solver-core/README.md`에 다음 dependency/ownership graph를 반영한다.
```text
Domain owns ElementDefinition / ElementProperty / Material / StepDefinition
AnalysisModel is a non-owning stable-index view into Domain
ElementFactory creates runtime Element candidates from compatible definitions
DofManager -> ElementDofLayout
SparseAssembler -> ElementStiffnessContribution
ResultRecovery -> ElementResultBundle
LoadAssembler -> ordered LoadContribution
EssentialConstraintPolicy -> ConstraintDefinition
Analysis <- LinearStaticAnalysis
```
2. `../../docs/solver-core/README.md`에서 기존 ADR-007의 linear-static-specific protected hook contract를
최소 `Analysis::Run(const AnalysisRequest&)` base와 private
`LinearStaticAnalysis` lifecycle 결정으로 대체하거나 supersede한다.
3. ADR에 `ElementDefinition`/runtime `Element` 분리, Domain `unique_ptr` ownership,
no speculative material capability, load contribution/constraint policy 분리를 기록한다.
4. 기존 B33/MITC4 수치 및 HDF5/reference contract가 우선한다는 문구를 유지한다.
5. 문서에서 미래 MITC3/solid/dynamic/plastic 동작을 구현됐다고 표현하지 않는다.
Documentation-only contract 고정이므로 artificial RED를 만들지 않는다. 구현 Step은 이
문서를 먼저 읽고 test-first로 진행한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- 문서 search evidence와 full regression 결과를 summary에 남긴다.
- 승인 설계와 기존 ADR이 양립할 수 없으면 임의 결정하지 말고 `blocked`로 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- C++ production, tests, CMake를 수정하지 마라. 이유: 이 Step은 architecture 기록만 소유한다.
- 새로운 물리 기능 또는 입력/HDF5 계약을 ADR에 추가하지 마라.
- 기존 formulation/reference 문서를 리팩터링에 맞춰 고치지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,96 +0,0 @@
# Step 20: Analysis Hierarchy
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 15–19 generic element/load/constraint pipeline files
- `/include/fesa/analysis/analysis_model.h`
- `/include/fesa/analysis/analysis_state.h`
- `/include/fesa/analysis/linear_static_analysis.h`
- `/src/fesa/analysis/linear_static_analysis.cpp`
- `/src/fesa/app/fesa_application.cpp`
- `/tests/integration/analysis/linear_static_analysis_test.cpp`
- `/tests/integration/app/fesa_application_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step20.md`
## 작업
Requirement `R-ANALYSIS-001`을 구현한다.
1. `/tests/unit/analysis/analysis_test.cpp`와 integration cases를 먼저 추가한다.
`C-ANALYSIS-001` invokes `LinearStaticAnalysis` through `std::unique_ptr<Analysis>` and verifies
virtual destruction, Status propagation, factorize-before-load, exactly one factorization,
0x0 all-constrained solve, failure atomicity and writer-after-validation.
2. Missing minimal base or old protected-hook contract causes RED.
3. Create `/include/fesa/analysis/analysis.h` and move the base/request contract there. Keep
`/include/fesa/analysis/linear_static_analysis.h` and
`/src/fesa/analysis/linear_static_analysis.cpp` as the concrete procedure owner; register
`/tests/unit/analysis/analysis_test.cpp` in CMake.
4. Candidate interface:
```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 LinearStaticAnalysis final : public Analysis {
public:
LinearStaticAnalysis(const ParallelFor& parallel_for,
LinearSolver& linear_solver,
ResultsWriter& results_writer);
Status Run(const AnalysisRequest& request) override;
private:
Status InitializeCandidate(const AnalysisRequest& request);
Status BuildAnalysisModel();
Status BuildDofMapAndSparsePattern();
Status AssembleAndPartitionStiffness();
Status FactorizeFreeSystem();
Status AssembleLoadsAndEffectiveRhs();
Status SubstituteAndReconstruct();
Status RecoverAndWrite();
};
```
5. The request keeps the existing input/output path contract and the concrete constructor keeps
existing backend dependency injection. The base class exposes only
destructor and `Run()`. Do not place linear-static lifecycle hooks in the base.
6. FesaApplication chooses the current linear-static concrete based on the already validated single
`*STATIC` procedure; it does not accumulate future-procedure conditionals.
7. Remove obsolete duplicated DOF-order validation wrappers after DofManager ownership is proven.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED base/lifecycle failure, focused order/count/atomicity and full CTest를 summary에 기록한다.
- Approved lifecycle or output timing regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Dynamic/eigen/spectrum/random analysis behavior or state를 추가하지 마라.
- Future procedure hooks를 Analysis base에 추가하지 마라.
- Factorization/load order를 변경하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,67 +0,0 @@
# Step 21: Domain Mapper Modules
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 11 SourceTargetResolver
- Step 12–14 semantic hierarchy/Domain files
- Step 18–19 Load and BoundaryCondition files
- `/include/fesa/io/abaqus/domain_mapper.h`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/tests/unit/io/abaqus/domain_mapper_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step21.md`
## 작업
Requirement `R-MODULE-001`의 mapper split을 구현한다.
1. `/tests/unit/io/abaqus/domain_mapping_components_test.cpp`를 먼저 추가한다.
`C-MODULE-001` exercises component seams with valid and invalid syntax records and verifies
topology, material/property, step/load/BC candidate content plus exact stable diagnostic order.
2. Missing private component headers causes RED compile failure.
3. Keep public facade
`Result<Domain> AbaqusDomainMapper::Map(const ParsedInput& input) const` in
`domain_mapper.h`. Candidate private modules under `/src/fesa/io/abaqus/`:
```text
domain_mapping_context.h shared candidate state, source locations and diagnostics
topology_mapper.h/.cpp nodes, elements, sets, identity instances
material_property_mapper.h/.cpp current isotropic material and beam/shell section assignments
step_definition_mapper.h/.cpp one STATIC step, concentrated loads, prescribed displacement
domain_builder.h/.cpp final cross-reference validation and atomic Domain construction
```
4. Private methods consume syntax/semantic candidate references and return `Status`; no component
commits to public Domain before final validation.
5. Preserve allowlist warnings, B31 rejection, S4/S4R common FESA-MITC4 mapping, set namespace,
source identity, declaration order and every existing diagnostic code/message/source location.
6. Reduce `domain_mapper.cpp` to orchestration. Do not add a registry or public parser plugin API.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED missing components, component/facade diagnostics, facade wiring and full CTest를 summary에 기록한다.
- Diagnostic/order/semantic mapping regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Abaqus keyword subset or unsupported behavior를 넓히지 마라.
- Failed candidate를 partial Domain에 commit하지 마라.
- Reference input을 mapper refactor에 맞춰 변경하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,66 +0,0 @@
# Step 22: Result Recovery Modules
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 17 generic ResultRecovery files
- `/include/fesa/results/result_records.h`
- `/include/fesa/analysis/analysis_state.h`
- `/src/fesa/results/result_recovery.cpp`
- `/tests/unit/results/result_recovery_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step22.md`
## 작업
Requirement `R-MODULE-001`의 recovery split을 구현한다.
1. `/tests/unit/results/result_recovery_components_test.cpp`를 먼저 추가한다.
`C-MODULE-002` directly tests candidate creation/validation for global equilibrium, beam rows,
shell rows and all-or-nothing commit, including a later-invalid bundle rollback.
2. Missing component headers/symbols provides RED.
3. Keep `ResultRecovery` as public facade. Candidate private modules:
```text
recovery_candidate.h/.cpp owns all mutable candidate rows/evidence before commit
global_equilibrium_recovery.h/.cpp computes K*d-F, reactions, free residual and global moments
beam_result_recovery.h/.cpp validates/orders distinct beam result identities
shell_result_recovery.h/.cpp validates/orders physical shell rows and energy
analysis_state_commit.h/.cpp validates complete candidate and atomically updates state
```
4. Private functions return `Status`/`Result<T>` and do not mutate `AnalysisState` until the final
commit module succeeds.
5. Preserve exact B33 endpoint/section/Gauss/stress distinctions, MITC4 GP/stress ordering,
drilling exclusion, equilibrium scale rules and global origin.
6. Reduce `result_recovery.cpp` to facade orchestration without changing public behavior.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED missing components, focused sign/order/rollback, facade wiring and full CTest를 summary에 기록한다.
- Any identity/sign/atomicity regression is `error`.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Result rows를 station mismatch 평균으로 합치지 마라.
- Failed candidate에서 partial AnalysisState를 commit하지 마라.
- HDF5 concerns를 recovery components에 넣지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,67 +0,0 @@
# Step 23: HDF5 Writer Modules
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- Step 22 recovery candidate/result records
- `/include/fesa/io/hdf5/hdf5_results_writer.h`
- `/src/fesa/io/hdf5/hdf5_results_writer.cpp`
- `/include/fesa/results/results_writer.h`
- `/tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step23.md`
## 작업
Requirement `R-MODULE-001`의 HDF5 split을 구현한다.
1. `/tests/unit/io/hdf5/hdf5_writer_components_test.cpp`를 먼저 추가한다.
`C-MODULE-003` tests backend-neutral dataset plans, finite inventory validation, self-check
failure and atomic final-file preservation through private component seams.
2. Missing component headers/symbols provides RED.
3. Keep `Hdf5ResultsWriter` as the only public facade and keep all HDF5 ids/types private.
Candidate modules:
```text
hdf5_raii.h move-only private HDF5 handle wrappers
hdf5_primitives.h/.cpp scalar/string/array/group/attribute operations
hdf5_model_writer.h/.cpp exact model/source identity datasets
hdf5_result_writer.h/.cpp exact mandatory beam/shell/global result datasets
hdf5_self_check.h/.cpp reopen, shape, attribute and finite inventory checks
hdf5_atomic_file.h/.cpp candidate path, preservation and final replacement
```
4. Testable backend-neutral plan records may be private to `src/fesa/io/hdf5`; tests may receive a
PRIVATE include directory. Do not expose `hid_t`, HDF5 headers or storage handles in
`/include/fesa/`.
5. Preserve every schema-v0 path, shape, attribute, units, row order, mandatory-output behavior,
warning dataset, reopen self-check and existing-final preservation.
6. Reduce `hdf5_results_writer.cpp` to facade orchestration.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED missing components, schema/atomicity focused suite, facade/vendor scans and full CTest를 summary에 기록한다.
- Schema, required output or preservation regression is `error`; never edit I/O docs to pass.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- HDF5 schema version, dataset paths/shapes/attributes를 변경하지 마라.
- HDF5 types/lifetime을 public solver core에 노출하지 마라.
- Invalid candidate로 existing final file을 replace하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,109 +0,0 @@
# Step 24: Final Quality and Reference Gate
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `/tests/reference/b33_reference_comparison_test.cpp`
- `/tests/reference/mitc4_reference_cases_test.cpp`
- all Step 0–23 summaries and changed files
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step24.md`
## 작업
Requirements `R-PRESERVE-001`, `R-STYLE-001`, `R-DOC-001`, `R-SCOPE-001` and every
traceability row를 최종 검증한다. No production behavior is added in this Step.
1. Review all prior diffs against the approved design. Remove only orphaned compatibility includes,
declarations or helpers created by this phase; do not clean unrelated pre-existing code.
2. Verify every production/test header under `include`, `src`, `tests` uses `.h`; every production
public/protected API follows PascalCase and production Doxygen policy; tests have no imposed
Doxygen boilerplate.
3. Run clang-format on every tracked C++ file in dry-run error mode and the selected clang-tidy
C++17 public-header check. Do not run Doxygen; generation is deferred by user decision.
4. Fresh configure and full MSVC x64 Debug `/W4 /WX` build/CTest.
5. ARTIFACT CHECK before comparison:
- Assert exact B33 input and three CSV files exist under `/reference/cantilever beam/`.
- Assert exact MITC4 S4 input and displacement CSV exist under `/reference/shell/`.
- Snapshot/diff reference tree against baseline commit `1e5758f`.
6. COMPARE by running only the approved B33 and MITC4 S4 reference suites. Confirm generated:
- 과거 검증 자료(정리됨)
- 과거 검증 자료(정리됨)
7. CLASSIFY missing/extra/duplicate/nonfinite/tolerance failure before reporting. B33 retains its
existing component-scale policy. MITC4 U1/U2/U3 use fixed `1.0e-5`; UR1/UR2/UR3 remain warning-only.
8. REPORT by creating/updating:
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
9. `implementation-report.md` records each Step RED/GREEN/VERIFY command and result summary.
10. `build-test.md` records metadata with `owner_agent: implementation-agent`, environment,
command/exit code/duration/output tail, test inventory, classification, no-change assertion,
handoff and open issues.
11. `reference-comparison.md` records exact artifact inventory, generated HDF5 paths, HDF5-to-CSV
identity/component projection, row prechecks, approved tolerances, per-row decisions and only
contract-applicable metrics, classification and no-change assertion.
## Acceptance Criteria
Style and policy:
```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
$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 src tests -g "*.hpp")
if ($legacyHeaders.Count -ne 0) {
$legacyHeaders
throw "Legacy .hpp headers remain"
}
```
Fresh MSVC build and full tests:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
ARTIFACT CHECK, COMPARE and post-check:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- Do not mark complete until every command and report section has observed evidence.
- Success summary names style gate, full discovered test count, both generated results, blocking
comparison verdicts, reference no-change assertion and report paths.
- Implementation-owned compile/test/comparison failure is `error` with classification and exact
failed command. Missing tool or declared artifact is `blocked` with exact path.
- On success update only current Step to `completed`; final timestamps, commit and top-level phase
completion are Executor-owned.
## 금지사항
- Doxygen executable을 실행하거나 generated docs를 commit하지 마라. 이유: 사용자 결정으로 연기됐다.
- Reference artifact, input, CSV, tolerance or comparator contract를 변경하지 마라.
- Passing comparison만으로 release or physics readiness를 승인하지 마라.
- Failure를 숨기기 위해 clamp, missing-row ignore, average or tolerance relaxation을 추가하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,73 +0,0 @@
# Step 3: Foundation Google Style
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/core/diagnostic.hpp`
- `/include/fesa/core/source_identity.hpp`
- `/include/fesa/core/status.hpp`
- `/include/fesa/math/vector.hpp`
- `/include/fesa/math/matrix.hpp`
- `/include/fesa/math/sparse_matrix.hpp`
- `/include/fesa/solvers/linear/linear_solver.hpp`
- `/include/fesa/solvers/linear/mkl_pardiso_solver.hpp`
- `/include/fesa/build_info.hpp`
- `/src/fesa/core/diagnostic.cpp`, `/src/fesa/core/status.cpp`
- `/src/fesa/math/vector.cpp`, `/src/fesa/math/matrix.cpp`,
`/src/fesa/math/sparse_matrix.cpp`
- `/src/fesa/solvers/linear/mkl_pardiso_solver.cpp`, `/src/fesa/build_info.cpp`
- `/tests/unit/core/diagnostic_test.cpp`, `/tests/unit/core/source_identity_test.cpp`,
`/tests/unit/core/status_test.cpp`
- `/tests/unit/math/vector_test.cpp`, `/tests/unit/math/matrix_test.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`
- `/tests/unit/build_info_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step3.md`
## 작업
Requirement `R-STYLE-001`의 foundation slice와 `R-DOC-001`을 구현한다. 동작 또는
수치식은 변경하지 않는다.
1. Focused tests의 include를 `.h`로, 모든 function/accessor call을 PascalCase로 먼저
변경하고 missing header/member compile failure를 RED로 기록한다.
2. 다음 production headers를 같은 basename의 `.h`로 이동하고 full-path include guard를
사용한다: core headers, `vector`, `matrix`, `sparse_matrix`, `linear_solver`,
`mkl_pardiso_solver`, `build_info`.
3. 이 slice가 소유하는 public/protected function과 production internal function 이름을
PascalCase로 바꾼다. Parameters/local variables는 snake_case, class members는 trailing
underscore, enum values/constants는 `kPascalCase`로 바꾼다.
4. Public/protected declarations에 `@brief`와 필요한 ownership/failure/backend contract를
Doxygen으로 기록한다. Tests에는 Doxygen를 추가하지 않는다.
5. 모든 repository consumer include/callsite를 기계적으로 갱신하되 다른 모듈의 함수
정의나 책임은 바꾸지 않는다.
6. Matrix/Vector 연산 순서, MKL calls, Status category, diagnostic text는 보존한다.
## Acceptance Criteria
RED 후 GREEN focused/full verification:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED compile error, focused GREEN, formatting, full CTest를 summary에 남긴다.
- 성공 시 현재 Step만 `completed`; 반복 compile failure는 `error`로 기록한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- `Vector3`나 BLAS adapter를 추가하지 마라. 이유: Step 7과 10의 semantic work다.
- 수치 expression/reduction 순서를 바꾸지 마라. 이유: style-only review unit이다.
- Test에 Doxygen를 추가하지 마라. 이유: 승인 문서화 범위는 production뿐이다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,64 +0,0 @@
# Step 4: Model and Element Google Style
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/model/domain.hpp`, `/include/fesa/model/model_types.hpp`,
`/include/fesa/model/shell_geometry.hpp`
- `/src/fesa/model/domain.cpp`, `/src/fesa/model/shell_geometry.cpp`
- `/include/fesa/elements/euler_beam_3d.hpp`,
`/include/fesa/elements/mitc4_shell.hpp`
- `/src/fesa/elements/euler_beam_3d.cpp`, `/src/fesa/elements/mitc4_shell.cpp`
- `/tests/unit/model/domain_test.cpp`, `/tests/unit/model/model_types_test.cpp`,
`/tests/unit/model/shell_geometry_test.cpp`
- `/tests/unit/elements/euler_beam_3d_test.cpp`,
`/tests/unit/elements/mitc4_shell_test.cpp`
- Step 3에서 전환한 foundation `.h` headers와 callsites
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step4.md`
## 작업
Requirement `R-STYLE-001`의 model/element slice와 `R-DOC-001`을 구현한다.
1. Model/element tests를 `.h` include와 PascalCase calls로 먼저 바꿔 RED compile failure를
확인한다.
2. `analysis_model.hpp`는 아직 analysis slice이므로 건드리지 않는다. 다음 소유 범위만
`.h`와 header guard로 전환한다: `model/domain`, `model/model_types`,
`model/shell_geometry`, `elements/euler_beam_3d`, `elements/mitc4_shell`.
3. Production function/accessor, enum, constant, member naming을 CODINGSTYLE에 맞추고
repository callsites를 갱신한다.
4. Production public/protected declarations와 비자명한 local-axis, director, stiffness,
recovery, sign/order helper에 Doxygen를 추가한다. Tests에는 추가하지 않는다.
5. B33/MITC4 formula, quadrature, physical/drilling separation, scale-aware validation,
result signs와 floating-point operation order를 그대로 유지한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED에서는 updated test callsite가 old production API와 불일치해야 한다. GREEN에서는
focused suites와 전체 CTest가 통과해야 한다.
## 검증 및 상태 갱신
- RED/Green commands와 test inventory를 현재 Step summary에 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- upstream formulation과 충돌하면 구현하지 말고 `blocked`로 기록한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- 추상 element/material/property hierarchy를 추가하지 마라. 이유: Step 12–14 소유다.
- duplicate vector helper를 제거하지 마라. 이유: Step 7–9에서 test-first로 수행한다.
- formulation 또는 reference tolerance를 수정하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,77 +0,0 @@
# Step 5: Solver Workflow Google Style
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/analysis/analysis_model.hpp`,
`/include/fesa/analysis/analysis_state.hpp`,
`/include/fesa/analysis/linear_static_analysis.hpp`
- `/src/fesa/analysis/analysis_model.cpp`, `/src/fesa/analysis/analysis_state.cpp`,
`/src/fesa/analysis/linear_static_analysis.cpp`
- `/include/fesa/assembly/load_assembler.hpp`, `/include/fesa/assembly/parallel_for.hpp`,
`/include/fesa/assembly/sparse_assembler.hpp`
- `/src/fesa/assembly/load_assembler.cpp`, `/src/fesa/assembly/parallel_for.cpp`,
`/src/fesa/assembly/sparse_assembler.cpp`
- `/include/fesa/constraints/essential_constraints.hpp`,
`/src/fesa/constraints/essential_constraints.cpp`
- `/include/fesa/fem/dof_manager.hpp`, `/src/fesa/fem/dof_manager.cpp`
- `/include/fesa/results/result_records.hpp`,
`/include/fesa/results/result_recovery.hpp`,
`/include/fesa/results/results_writer.hpp`
- `/src/fesa/results/result_recovery.cpp`
- `/tests/unit/analysis/analysis_model_test.cpp`,
`/tests/unit/analysis/analysis_state_test.cpp`
- `/tests/unit/assembly/load_assembler_test.cpp`,
`/tests/unit/assembly/parallel_for_test.cpp`,
`/tests/unit/assembly/sparse_assembler_test.cpp`
- `/tests/unit/constraints/essential_constraints_test.cpp`,
`/tests/unit/fem/dof_manager_test.cpp`
- `/tests/unit/results/result_records_test.cpp`,
`/tests/unit/results/result_recovery_test.cpp`,
`/tests/unit/results/results_writer_test.cpp`
- `/tests/integration/analysis/linear_static_analysis_test.cpp`
- Step 3–4에서 생성한 `.h` foundation/model/element headers
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step5.md`
## 작업
Requirement `R-STYLE-001`의 solver workflow slice와 `R-DOC-001`을 구현한다.
1. Matching unit/integration tests를 `.h` include와 PascalCase calls로 먼저 바꿔 RED
compile failure를 기록한다.
2. Analysis, assembly, constraints, fem, results production headers를 `.h`와 full-path
include guards로 전환한다.
3. Function/accessor, enum, constants, members와 repository callsites를 CODINGSTYLE에
맞춘다. Type names와 diagnostic text는 의미를 바꾸지 않는다.
4. Production public/protected declarations와 ordering, partition, factorization,
deterministic reduction, candidate commit에 관한 internal helpers에 Doxygen를 작성한다.
5. 다음 approved order를 변경하지 않는다: stiffness/partition, Kff factorization,
load/effective RHS, substitute/reconstruct, recovery/write.
6. Full residual `K*d-F`, source-order accumulation, 0x0 Kff validity, atomic state commit을
그대로 유지한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED compile failure, focused/full GREEN과 formatting 결과를 summary에 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- lifecycle or numeric regression이면 `error`로 기록하고 다른 Step으로 진행하지 않는다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Analysis/Load/Boundary/Element 추상화를 추가하지 마라. 이유: Step 14–20 소유다.
- sparse ordering, factorization order, result signs를 바꾸지 마라.
- Test에 Doxygen를 추가하지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,72 +0,0 @@
# Step 6: I/O and Application Google Style
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/io/abaqus/domain_mapper.hpp`,
`/include/fesa/io/abaqus/input_reader.hpp`,
`/include/fesa/io/abaqus/input_syntax.hpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`, `/src/fesa/io/abaqus/input_reader.cpp`
- `/include/fesa/io/hdf5/hdf5_results_writer.hpp`,
`/src/fesa/io/hdf5/hdf5_results_writer.cpp`
- `/include/fesa/app/fesa_application.hpp`, `/src/fesa/app/fesa_application.cpp`,
`/src/fesa/app/main.cpp`
- `/tests/unit/io/abaqus/domain_mapper_test.cpp`,
`/tests/unit/io/abaqus/input_reader_test.cpp`,
`/tests/unit/io/abaqus/input_syntax_test.cpp`
- `/tests/unit/io/hdf5/hdf5_results_writer_test.cpp`,
`/tests/integration/app/fesa_application_test.cpp`
- `/tests/reference/reference_comparison.hpp`,
`/tests/reference/mitc4_reference_comparison.hpp`
- `/tests/reference/reference_comparison.cpp`,
`/tests/reference/reference_comparison_test.cpp`,
`/tests/reference/b33_reference_comparison_test.cpp`,
`/tests/reference/mitc4_reference_comparison.cpp`,
`/tests/reference/mitc4_reference_comparison_test.cpp`,
`/tests/reference/mitc4_reference_cases_test.cpp`
- Step 3–5가 생성한 `.h` headers와 callsites
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step6.md`
## 작업
Requirement `R-STYLE-001`의 I/O/application slice와 `R-DOC-001`을 구현한다.
1. I/O, app, reference helper tests의 include와 calls를 먼저 전환해 RED compile failure를
기록한다.
2. Production I/O/application headers와 test-only reference helper headers를 `.h`와
full-path guards로 전환한다.
3. Production 및 test C++ functions/accessors를 PascalCase로 전환하고 variables/members,
enums/constants를 CODINGSTYLE에 맞춘다.
4. Production parser/mapping/HDF5/application declarations와 atomic finalization,
source identity, backend lifetime에 관한 internal helper에 Doxygen를 추가한다.
5. Test files에는 Doxygen를 추가하지 않는다.
6. Abaqus keyword subset, diagnostics, HDF5 path/attributes/dataset order, atomic replacement,
comparator tolerance와 required/warning quantity를 변경하지 않는다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED/Green evidence와 HDF5/reference focused inventory를 summary에 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- schema/reference regression이면 `error`로 기록하고 artifacts를 고치지 않는다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Mapper/HDF5 writer를 아직 분할하지 마라. 이유: Step 21과 23 소유다.
- Reference CSV, `.inp`, tolerance 또는 comparator 의미를 변경하지 마라.
- Generated Doxygen를 만들지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,73 +0,0 @@
# Step 7: Vector3 Value Type
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/math/vector.h`
- `/src/fesa/math/vector.cpp`
- `/tests/unit/math/vector_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step7.md`
## 작업
Requirement `R-DUP-001`의 reusable value type만 구현한다. Existing consumers는 아직
migrate하지 않는다.
1. `/tests/unit/math/vector3_test.cpp`를 먼저 만들고 `C-VEC3-001`을 작성한다.
2. Test는 component access, exact add/subtract/scalar operations, Dot, Cross orientation,
Norm, finite/nonfinite, zero/nonfinite normalization rejection을 검증한다.
3. Test가 missing `fesa/math/vector3.h`로 compile failure가 나는 RED를 기록한다.
4. Candidate interface는 다음 의미를 제공한다.
```cpp
class Vector3 {
public:
constexpr Vector3() noexcept;
constexpr Vector3(double x, double y, double z) noexcept;
constexpr double X() const noexcept;
constexpr double Y() const noexcept;
constexpr double Z() const noexcept;
constexpr double operator[](std::size_t index) const noexcept;
constexpr Vector3 operator+(const Vector3& rhs) const noexcept;
constexpr Vector3 operator-(const Vector3& rhs) const noexcept;
constexpr Vector3 operator*(double scalar) const noexcept;
double Dot(const Vector3& rhs) const noexcept;
Vector3 Cross(const Vector3& rhs) const noexcept;
double Norm() const noexcept;
std::optional<Vector3> Normalized() const noexcept;
bool IsFinite() const noexcept;
};
```
5. `Normalized()`는 arbitrary tolerance, clamp, diagnostic을 소유하지 않는다. Exact zero
또는 nonfinite norm만 empty result로 거부하고 scale-aware geometry rejection은 caller에
남긴다.
6. Trivial implementation은 header-only로 둘 수 있다. 별도 `.cpp`를 만들면 CMake에
등록하고 두 경우 모두 production Doxygen를 작성한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- Missing header RED, arithmetic GREEN, tidy/format/full CTest를 summary에 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- normalization policy가 승인 설계와 충돌하면 `blocked`로 기록한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Dynamic `Vector` storage/API를 Vector3에 합치지 마라. 이유: 서로 다른 ownership/size 계약이다.
- Tolerance 또는 FESA diagnostic을 Vector3에 넣지 마라.
- Beam/shell/results/I/O consumers를 수정하지 마라. 이유: Step 8–9 소유다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,57 +0,0 @@
# Step 8: Element and Geometry Vector3 Migration
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/math/vector3.h`, `/tests/unit/math/vector3_test.cpp`
- `/include/fesa/elements/euler_beam_3d.h`, `/src/fesa/elements/euler_beam_3d.cpp`
- `/include/fesa/elements/mitc4_shell.h`, `/src/fesa/elements/mitc4_shell.cpp`
- `/include/fesa/model/shell_geometry.h`, `/src/fesa/model/shell_geometry.cpp`
- matching element/model unit tests
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step8.md`
## 작업
Requirement `R-DUP-001`의 element/model consumer migration을 구현한다.
1. Existing element/model tests에 `C-DUP-001` exact regression assertions를 먼저 추가한다.
Rotated axes, warped shell geometry, stiffness, recovery and patch cases가 migration 전
captured results와 exact equality를 유지하도록 한다.
2. New assertions가 현재 duplicated helper seam을 직접 대체할 수 없어 compile failure 또는
missing typed interface failure가 나는 RED를 기록한다.
3. Euler beam, MITC4, shell geometry에서 local `Add`, `Subtract`, `Scale`, `Dot`, `Cross`,
`Norm`, finite helper를 제거하고 `Vector3`를 사용한다.
4. Weighted and derivative sums may remain formulation-specific expressions, but their primitive
vector operations must use `Vector3` and their evaluation order must remain unchanged.
5. Caller가 기존 scale-aware geometry tolerance와 exact diagnostic category/message를 소유한다.
6. B33 transform, MITC4 director/tangent frame, Jacobian and drilling/physical separation을
변경하지 않는다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
The `rg` command must return no duplicate local primitive definition; member calls such as
`.Dot()` are allowed.
## 검증 및 상태 갱신
- RED seam failure, exact focused regressions, duplicate scan과 full CTest를 summary에 기록한다.
- 수치 결과가 달라지면 commonization을 억지로 진행하지 말고 `error`로 기록한다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- Formulation-specific sign/weighted sum을 이름 유사성만으로 합치지 마라.
- Runtime performance optimization 또는 loop reordering을 하지 마라.
- ResultRecovery/mapper/HDF5를 수정하지 마라. 이유: Step 9 소유다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
@@ -1,58 +0,0 @@
# Step 9: Result and I/O Vector3 Migration
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/cpp-object-oriented-modular-refactoring/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/cpp-object-oriented-modular-refactoring/README.md`
- `/include/fesa/math/vector3.h`
- Step 8에서 migration한 element/model files
- `/include/fesa/results/result_recovery.h`, `/src/fesa/results/result_recovery.cpp`
- `/include/fesa/io/abaqus/domain_mapper.h`, `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/include/fesa/io/hdf5/hdf5_results_writer.h`,
`/src/fesa/io/hdf5/hdf5_results_writer.cpp`
- matching result/I/O tests
- `/phases/cpp-object-oriented-modular-refactoring/index.json`
- `/phases/cpp-object-oriented-modular-refactoring/step9.md`
## 작업
Requirement `R-DUP-001`의 remaining production consumers를 구현한다.
1. ResultRecovery, DomainMapper, Hdf5ResultsWriter tests에 `C-DUP-002` characterization을
먼저 추가한다: global moment origin, shell frame/director serialization, finite rejection,
stable row/dataset identity and atomic replacement.
2. Tests가 new shared `Vector3` seam을 참조하도록 해 old local helper state에서 RED를 확인한다.
3. 세 production files의 repeated fixed-size add/subtract/scale/dot/cross/norm/finite helpers를
`Vector3` calls로 바꾸고 helper definitions를 제거한다.
4. HDF5 storage remains three scalar components in the exact existing dataset/schema; `Vector3`
must not become an HDF5 public or compound datatype.
5. Result location/sign, global-origin moment balance, source identity, mapper diagnostics와
floating-point accumulation order를 유지한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
The duplicate scan must return no local primitive definitions. Existing HDF5 and reference
tests must pass without tolerance/schema edits.
## 검증 및 상태 갱신
- RED, focused suites, duplicate scan, full CTest를 summary에 기록한다.
- Schema, identity or numeric regression이면 `error`로 기록하고 artifacts를 수정하지 않는다.
- 성공 시 현재 Step만 `completed`로 갱신한다.
- timestamp, retry, commit, advancement는 Executor 소유다.
## 금지사항
- HDF5 schema 또는 stored component representation을 변경하지 마라.
- Result identity/location을 공통 Vector3 record로 합치지 마라.
- Mapper/recovery/writer file split을 수행하지 마라. 이유: Step 21–23 소유다.
- 직접 commit하거나 hook script를 수동 실행하지 마라.
-37
View File
@@ -1,37 +0,0 @@
{
"phases": [
{
"dir": "linear-static-3d-euler-beam",
"status": "pending"
},
{
"dir": "linear-static-mitc4-shell",
"status": "completed",
"completed_at": "2026-08-13T10:14:08+0900"
},
{
"dir": "cpp-object-oriented-modular-refactoring",
"status": "completed",
"completed_at": "2026-08-16T13:54:51+0900"
},
{
"dir": "nonlinear-static-newton-raphson",
"status": "completed",
"completed_at": "2026-08-28T21:08:58+0900"
},
{
"dir": "shell-surface-pressure-load",
"status": "completed",
"completed_at": "2026-09-01T17:43:57+0900"
},
{
"dir": "mitc4-shell-feast-eigen-execution-prep",
"status": "blocked",
"blocked_at": "2026-09-06T22:37:15+0900"
},
{
"dir": "mitc4-shell-feast-eigen",
"status": "pending"
}
]
}
@@ -1,239 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "linear-static-3d-euler-beam",
"steps": [
{
"step": 0,
"name": "requirements-baseline",
"status": "completed",
"started_at": "2026-08-09T01:35:55+0900",
"summary": "docs/requirements/linear-static-3d-euler-beam.md에 44개 연속 shall 요구조건과 검증 행렬을 작성하고 2026-08-09 amendment의 approved B33 baseline을 고정함",
"completed_at": "2026-08-09T01:53:04+0900"
},
{
"step": 1,
"name": "research-evidence",
"status": "completed",
"started_at": "2026-08-09T01:54:38+0900",
"summary": "FEM wiki 근거로 B31/B33, Hermite·Gauss, general beam section/output, analytical benchmark, SPD·assembly·reference 적용 한계를 정리한 research brief를 작성함",
"completed_at": "2026-08-09T02:12:54+0900"
},
{
"step": 2,
"name": "formulation-alignment",
"status": "completed",
"started_at": "2026-08-09T02:14:26+0900",
"summary": "기존 3D Euler–Bernoulli strong/weak form과 DOF·부호·2점 Gauss·12×12 강성 의미를 보존하면서 B33 n1/section/geometry 및 recovery/tolerance 계약을 승인 V0 요구조건·연구에 정렬함",
"completed_at": "2026-08-09T02:33:50+0900"
},
{
"step": 3,
"name": "numerical-review",
"status": "completed",
"started_at": "2026-08-09T02:33:50+0900",
"summary": "DOF·theta_y=-w'·end-action 부호, 4x12 B/12x12 강성·2-point Gauss·rank 6/rigid modes·좌표변환·line-load·partition/SPD를 독립 검토하고 pass-for-implementation-planning 판정과 11개 테스트 권고를 기록함",
"completed_at": "2026-08-09T02:52:47+0900"
},
{
"step": 4,
"name": "io-contract",
"status": "completed",
"started_at": "2026-08-09T02:52:47+0900",
"summary": "승인된 Abaqus B33 keyword subset, stable source identity, HDF5 schema v0와 legacy CSV normalization/component-scale tolerance 계약을 정의함",
"completed_at": "2026-08-09T03:16:25+0900"
},
{
"step": 5,
"name": "reference-model-contract",
"status": "completed",
"started_at": "2026-08-09T03:16:25+0900",
"summary": "code·analytical·B33 reference 검증을 분리하고 analytical/invalid model inventory와 read-only legacy 4-file provenance·schema·tolerance coverage를 계약화함",
"completed_at": "2026-08-09T03:29:44+0900"
},
{
"step": 6,
"name": "implementation-plan",
"status": "completed",
"started_at": "2026-08-09T03:29:45+0900",
"summary": "승인 upstream 계약을 Step 7–24의 exact 파일·시그니처·GoogleTest RED/GREEN/VERIFY·CMake/CTest·44개 요구조건 traceability와 read-only B33 comparison handoff로 매핑한 ready-for-implementation 계획을 작성함",
"completed_at": "2026-08-09T03:53:12+0900"
},
{
"step": 7,
"name": "cmake-test-foundation",
"status": "completed",
"started_at": "2026-08-09T03:53:12+0900",
"summary": "C++17 MSVC x64 Debug CMake foundation, normalized MKL/TBB/HDF5 targets, GoogleTest BuildInfo 2-test suite와 누적 implementation report를 RED/GREEN/VERIFY로 구축함",
"completed_at": "2026-08-09T04:44:04+0900"
},
{
"step": 8,
"name": "core-diagnostics",
"status": "completed",
"started_at": "2026-08-09T10:51:14+0900",
"summary": "stable source identity, deterministic diagnostic ordering, categorized Status와 value/error-exclusive Result를 TDD로 구현하고 MSVC x64 Debug 5-test full suite를 검증함",
"completed_at": "2026-08-09T10:54:29+0900"
},
{
"step": 9,
"name": "dense-math-adapters",
"status": "completed",
"started_at": "2026-08-09T11:13:43+0900",
"summary": "contiguous double Vector와 row-major Matrix의 MKL CBLAS copy/dot/norm/scale/axpy/GEMV/GEMM adapter를 TDD로 구현하고 DenseMath 2/2·MSVC x64 Debug full 7/7·public-header leak 0건을 검증함",
"completed_at": "2026-08-09T11:35:31+0900"
},
{
"step": 10,
"name": "domain-model",
"status": "completed",
"started_at": "2026-08-09T11:49:47+0900",
"summary": "SourceLocation을 포함한 semantic records와 static timing, part/instance source-index mapping, warnings/source identity를 소유하는 effectively immutable Domain을 TDD로 구현하고 DomainModel 3/3 및 전체 10/10을 검증함",
"completed_at": "2026-08-09T12:07:11+0900"
},
{
"step": 11,
"name": "inp-syntax-parser",
"status": "completed",
"started_at": "2026-08-09T15:06:01+0900",
"completed_at": "2026-08-09T15:19:17+0900",
"summary": "keyword/parameter name만 uppercase canonicalize하고 raw value/data/originalLine, normalized source path, exact-byte fnv1a64 identity와 file/line 위치를 보존하는 syntax-only reader를 TDD로 구현해 InpSyntax 4/4, 전체 14/14 및 legacy 30-block read-only parse를 검증함"
},
{
"step": 12,
"name": "inp-domain-mapping",
"status": "completed",
"started_at": "2026-08-09T15:27:22+0900",
"completed_at": "2026-08-09T16:15:17+0900",
"summary": "승인 B33 단일 static-step Abaqus subset을 immutable Domain으로 mapping하고 identity instance·stable source/internal ID·set/target expansion·material/section·model/step BC/CLOAD·warning no-op와 exact rejection portfolio를 TDD로 구현해 InpDomainMapping 5/5 및 전체 19/19를 검증함"
},
{
"step": 13,
"name": "analysis-model",
"status": "completed",
"started_at": "2026-08-09T16:36:20+0900",
"completed_at": "2026-08-09T16:50:12+0900",
"summary": "단일 static step의 Domain을 비소유 참조로 유지하고 active element·BC·load stable index와 reachable material/section의 오름차순 dedup view를 TDD로 구현해 address identity·불변성·missing/multiple-step diagnostic, AnalysisModel 3/3 및 전체 22/22를 검증함"
},
{
"step": 14,
"name": "dof-manager",
"status": "completed",
"started_at": "2026-08-09T16:56:29+0900",
"completed_at": "2026-08-09T17:10:22+0900",
"summary": "절점당 6-DOF full/free/constrained numbering, validated boundary target expansion과 prescribed dc, 12-DOF scatter 및 sorted-unique full CSR pattern을 DofManager 단독 소유로 TDD 구현해 DofManager 4/4와 전체 26/26을 검증함"
},
{
"step": 15,
"name": "analysis-state",
"status": "completed",
"started_at": "2026-08-09T17:19:21+0900",
"completed_at": "2026-08-09T17:31:51+0900",
"summary": "fullDofCount 크기의 독립 zero-initialized displacement/external/internal/residual/reaction과 StepFrameIdentity·stable endpoint/Gauss/S11 rows를 TDD 구현하고 velocity·acceleration·temperature·iteration/nonlinear state 미할당, AnalysisState 3/3 및 전체 29/29를 검증함"
},
{
"step": 16,
"name": "euler-beam-element",
"status": "completed",
"started_at": "2026-08-09T17:38:34+0900",
"completed_at": "2026-08-09T18:04:40+0900",
"summary": "Implemented the exact two-node 3D Euler-Bernoulli beam kernel with reviewed local signs, two-point Gauss stiffness and line loading, strict geometry/property validation, transform, end/Gauss/S11 recovery, and 10/10 targeted plus 39/39 full tests passing."
},
{
"step": 17,
"name": "parallel-for-tbb",
"status": "completed",
"started_at": "2026-08-09T18:41:51+0900",
"completed_at": "2026-08-09T18:52:20+0900",
"summary": "Backend-free ParallelFor/Serial/Tbb adapter가 caller-owned index-addressed slot에서 zero/one/many exact-once와 stable output을 보장하고 oneTBB cancellation의 body exception을 그대로 전파하며 global thread/oversubscription 설정 없이 targeted 3/3 및 전체 42/42를 검증함"
},
{
"step": 18,
"name": "sparse-assembly",
"status": "completed",
"started_at": "2026-08-09T19:07:39+0900",
"completed_at": "2026-08-09T19:27:34+0900",
"summary": "ParallelFor index-owned 12x12 element buffers를 stable COO tuple order로 fixed-sum하여 exact sorted-unique 0-based CSR pattern과 structural zero를 보존하고 serial/TBB/repeated byte identity, SparseAssembly 5/5 및 전체 47/47을 검증함"
},
{
"step": 19,
"name": "essential-constraints",
"status": "completed",
"started_at": "2026-08-09T19:37:55+0900",
"completed_at": "2026-08-09T19:46:22+0900",
"summary": "Stable free/constrained DOF order로 full CSR을 Kff/Kfc/Kcf/Kcc에 exact partition하고 structural zero와 nonzero prescribed displacement full/reduced roundtrip을 보존해 EssentialConstraints 4/4 및 전체 51/51을 검증함"
},
{
"step": 20,
"name": "mkl-pardiso-solver",
"status": "completed",
"started_at": "2026-08-09T19:50:41+0900",
"completed_at": "2026-08-09T20:05:06+0900",
"summary": "Private PImpl oneMKL PARDISO SPD adapter가 full CSR 검증과 checked upper-triangle 변환 뒤 phase 11/22 factorization을 유지하고 phase 33 repeated RHS substitution 및 phase -1 RAII release를 수행하며, structured 실패·conditioning과 targeted 6/6 및 전체 57/57을 검증함"
},
{
"step": 21,
"name": "load-assembly",
"status": "completed",
"started_at": "2026-08-09T20:22:02+0900",
"completed_at": "2026-08-09T20:34:21+0900",
"summary": "Semantic node/set CLOAD를 stable full-DOF source order로 합산하고 constrained load를 보존하며 exact Ff-Kfc*dc, nonfinite/dimension/order validation, zero-free/zero-constrained cases를 구현해 LoadAssembly 5/5 및 전체 62/62를 검증함"
},
{
"step": 22,
"name": "result-recovery",
"status": "completed",
"started_at": "2026-08-09T20:42:15+0900",
"completed_at": "2026-08-09T21:14:47+0900",
"summary": "Full K*d-F residual을 reaction에 보존해 constrained physical reaction과 free residual evidence를 원자적으로 복구하고 stable endpoint/Gauss/S11 rows 및 unloaded consistent two-endpoint station no-average normalization을 구현해 ResultRecovery 6/6 및 전체 68/68을 검증함"
},
{
"step": 23,
"name": "hdf5-results-writer",
"status": "completed",
"started_at": "2026-08-09T21:23:14+0900",
"completed_at": "2026-08-09T22:03:33+0900",
"summary": "Backend-free ResultsWriter 경계 뒤 schema v0의 exact metadata/model/Step-1 frame-0 결과와 stable identity/diagnostics를 mandatory HDF5로 기록하고 same-directory temp flush/checked-close/read-only self-check 뒤 ReplaceFileW 또는 write-through MoveFileExW로 원자화했으며 shared HDF5/libmmd runtime을 stage해 Hdf5ResultsWriter 5/5 및 전체 73/73을 검증함"
},
{
"step": 24,
"name": "linear-static-cli",
"status": "completed",
"started_at": "2026-08-09T22:13:49+0900",
"completed_at": "2026-08-09T22:54:33+0900",
"summary": "Exact factorize-before-load single-step lifecycle과 argv0-excluded fesa.exe 0/2/3/4/5/6 CLI를 구현하고 repeated/unknown option token을 usage로 거부하며 read-only legacy B33/HDF5 comparator로 176 rows, 16 metrics, deterministic JSON/physics evidence를 생성해 Step24 10/10 및 전체 83/83을 검증함"
},
{
"step": 25,
"name": "build-test-verification",
"status": "completed",
"started_at": "2026-08-09T23:16:20+0900",
"summary": "HEAD 400db19에서 fresh Visual Studio 18 2026/MSVC x64 Debug configure와 clean full build를 warning 0건으로 통과하고 JSON discovery 83개, feature-label 83/83, full CTest 83/83, Step 7-24 RED/GREEN/VERIFY 및 reference read-only audit를 확인해 pass-for-reference-verification으로 인계함",
"completed_at": "2026-08-09T23:25:28+0900"
},
{
"step": 26,
"name": "reference-verification",
"status": "completed",
"started_at": "2026-08-09T23:34:22+0900",
"completed_at": "2026-08-09T23:43:22+0900",
"summary": "Approved legacy B33 4-file artifact precheck와 read-only HDF5 schema/source identity/stress audit를 통과하고 exact B33ReferenceComparison을 두 번 1/1 실행해 deterministic comparison.json의 passed=true, 176/176 rows, 16/16 metrics, displacement/reaction/section 66/66/44 rows 및 reference immutability를 독립 검산했으며 final review에서 exact acceptance probe도 authoritative passed boolean으로 정렬·재검증하여 pass-for-physics-evaluation으로 인계함"
},
{
"step": 27,
"name": "physics-sanity",
"status": "completed",
"started_at": "2026-08-09T23:45:30+0900",
"summary": "Reference gate와 exact B33 HDF5/JSON/reference identity를 확인하고 force/origin-moment equilibrium, constrained reaction와 normalized free residual, displacement/rotation sign, zero symmetry, endpoint/section balance, local/global 및 S11 sanity, finite/energy/mode와 analytical coverage를 검토해 pass-for-release-agent로 인계함",
"completed_at": "2026-08-09T23:59:16+0900"
},
{
"step": 28,
"name": "release-readiness",
"status": "completed",
"started_at": "2026-08-10T00:08:50+0900",
"completed_at": "2026-08-10T00:11:51+0900",
"summary": "Build/Test·Reference Verification·Physics Evaluation의 exact pass gate와 Steps 0-27 completion을 감사하고 44/44 must 요구조건을 acceptance·exact test/evidence·reference/analytical 근거·final disposition에 연결했으며 stale implementation aggregate header를 nonblocking으로 판정하고 limitations·accepted Minors·release notes를 기록해 internal ready-for-release로 인계함"
}
],
"created_at": "2026-08-09T01:35:55+0900"
}
@@ -1,97 +0,0 @@
# Step 0: Requirements Baseline
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
먼저 아래 파일을 읽고 승인된 범위와 프로젝트 규칙을 파악하라.
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `/reference/cantilever beam/cantilever beam.inp`
승인된 설계 문서의 `status: approved`와 2026-08-09 amendment를 이 step의 사용자 승인
근거로 사용한다.
## 작업
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라. 문서는 다음 계약을
downstream agent가 추측 없이 사용할 수 있는 `shall` 요구조건과 검증 행렬로 바꿔야 한다.
- Metadata: `feature_id: linear-static-3d-euler-beam`, `status: approved`,
`owner_agent: requirement-agent`, 현재 날짜, 승인된 설계 경로를 기록한다.
- 목적, In Scope, Out Of Scope, Analysis Definition, Input Requirements, Output
Requirements, Verification Quantities, Tolerance Policy, Reference Artifact
Requirements, Requirement Verification Matrix, Downstream Handoff를 포함한다.
- 한 입력당 단일 `*STEP, *STATIC`, 2절점 3D Euler–Bernoulli, node당 6 DOF,
`TYPE=B33`만 지원하고 B31은 오류로 거부하는 요구조건을 분리한다.
- `*PART/*ASSEMBLY/*INSTANCE` identity wrapper, stable source identity, 여러 identity
instance 허용, transform/nested assembly 거부를 요구조건으로 만든다.
- 지원 keyword와 warning no-op allowlist를 정확히 열거하고 allowlist 밖 model-affecting
keyword는 오류로 요구한다.
- factorization-before-load 순서, nonzero prescribed displacement, deterministic
COO-to-CSR, MKL/TBB/HDF5 adapter 경계, CLI exit code, HDF5 schema/output을 요구한다.
- B33 legacy reference bundle은 read-only이며 exact filename을 보존하고 stress reference
comparison은 N/A지만 `S11` output과 test는 필수임을 명시한다.
- reference tolerance는 같은 model/step/frame/quantity/component의 read-only Abaqus
scale만 사용해 `absolute_floor + 1e-6 * reference_scale`을 모든 row에 적용한다.
SI floor는 displacement/rotation `1e-9`, force/moment `1e-3`이다.
- 모든 `must` 요구조건에 acceptance criterion, verification method, tolerance 또는 N/A,
downstream agent, status를 매핑한다. 숫자 ID는
`FESA-REQ-LS3DEB-001`부터 중복 없이 연속 부여한다.
설계가 이미 승인했으므로 새 정책 결정을 만들지 말고, 충돌을 발견하면 문서를 승인
상태로 꾸미지 말고 phase step을 `blocked`로 기록하라.
## Acceptance Criteria
```powershell
$path = 'docs/linear-static-3d-euler-beam/requirements.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @(
'feature_id: `linear-static-3d-euler-beam`',
'status: `approved`',
'## In Scope',
'## Out Of Scope',
'## Requirement Verification Matrix',
'TYPE=B33',
'TYPE=B31',
'absolute_floor + 1e-6 * reference_scale',
'reference/cantilever beam/'
)
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing contract text: $text"
}
}
$ids = Select-String -LiteralPath $path -Pattern 'FESA-REQ-LS3DEB-\d{3}' -AllMatches |
ForEach-Object { $_.Matches.Value }
if (($ids | Sort-Object -Unique).Count -lt 1) { throw 'No requirement ids found' }
git diff --check -- $path
```
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. 설계 문서 2절, 6절, 9절, 10절, 11절, 12절의 각 필수 계약이 최소 한 요구조건과
verification matrix row에 추적되는지 점검한다.
3. 수치값, 단위, 좌표계, artifact path가 설계와 정확히 일치하는지 확인한다.
4. `/phases/linear-static-3d-euler-beam/index.json`의 Step 0을 갱신한다.
- 성공: `status`를 `completed`로 바꾸고 생성 파일과 승인 baseline을 `summary` 한 줄에 기록한다.
- 수정 3회 후 실패: `status: error`와 `error_message`를 기록한다.
- 승인 설계와 프로젝트 문서가 충돌해 사용자 결정이 필요하면 `status: blocked`와
`blocked_reason`을 기록하고 중단한다.
## 금지사항
- C++ API나 파일 구조를 설계하지 마라. 이유: Requirement Agent의 책임 범위를 넘는다.
- formulation 수식을 수정하지 마라. 이유: 수학 계약은 후속 gate가 담당한다.
- Abaqus 또는 reference solver를 실행하지 마라. 이유: 승인된 read-only artifact만 사용한다.
- `/reference/` 파일을 생성·수정·rename하지 마라. 이유: correctness baseline을 오염시킨다.
- 직접 commit하지 마라. 이유: Harness executor가 commit과 timestamp를 관리한다.
@@ -1,76 +0,0 @@
# Step 1: Research Evidence
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
Step 0 산출물과 phase index의 완료 summary를 확인한 뒤 작업하라.
## 작업
FEM wiki에서 다음 연구 질문을 query하고
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라.
- Abaqus B31과 B33의 formulation 차이 및 B33을 Euler–Bernoulli 의미로 사용하는 근거
- 2절점 spatial Euler beam의 cubic Hermite interpolation, 6 rigid modes, rank 6,
two-point Gauss exactness, local/global transformation과 end-force sign
- Abaqus general beam section의 `A, I11, I12, I22, J`, first axis `n1`, section
resultant `SF*`/`SM*`, axial `S11` 의미
- analytical cantilever axial/torsion/two-plane bending benchmark와 검증 가능한 물리량
- PARDISO SPD factorization, deterministic sparse assembly, reference comparison에 필요한
기술 근거와 적용 한계
문서는 Metadata(`status: ready-for-formulation`), Research Questions, Source Inventory,
Extracted Facts, Candidate Benchmarks, Verification Relevance, Applicability Limits,
Open Issues, Downstream Handoff를 포함해야 한다. Source Inventory에는 문서명, 제공 기관,
wiki page identity, 원 출처/매뉴얼 identity, reliability tier와 적용 범위를 기록한다.
확인된 사실과 설계에서 도출한 inference를 구분한다. 기존 정식화 식을 최종 승인하거나
새 tolerance를 만들지 않는다.
## Acceptance Criteria
```powershell
$path = 'docs/linear-static-3d-euler-beam/research.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @(
'status: `ready-for-formulation`',
'## Research Questions',
'## Source Inventory',
'## Extracted Facts',
'## Candidate Benchmarks',
'## Applicability Limits',
'B31',
'B33',
'Hermite',
'general beam section'
)
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing research evidence: $text"
}
}
git diff --check -- $path
```
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. 주요 claim마다 source tier 또는 inference 표시가 있는지 확인한다.
3. benchmark마다 target quantity와 검증할 수 없는 범위를 함께 기록했는지 확인한다.
4. Step 1을 `completed`와 한 줄 `summary`로 갱신한다. 반복 실패는 `error`, 실제 source
부재나 상충으로 사용자 판단이 필요하면 `blocked`로 기록한다.
## 금지사항
- 웹 검색 결과나 LLM 기억만을 source로 쓰지 마라. 이유: 사용자가 FEM wiki manual을 허용했다.
- formulation을 최종화하거나 C++ API를 설계하지 마라. 이유: downstream 책임이다.
- tolerance나 reference 값을 발명하지 마라. 이유: 승인 설계 값을 그대로 사용해야 한다.
- Abaqus 실행 및 `/reference/` 변경을 하지 마라. 이유: artifact는 read-only다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,86 +0,0 @@
# Step 10: Domain Model
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/core/source_identity.hpp`
- `/include/fesa/core/status.hpp`
- `/src/fesa/CMakeLists.txt`
- `/tests/CMakeLists.txt`
## 소유 파일
- Create: `/include/fesa/model/model_types.hpp`
- Create: `/include/fesa/model/domain.hpp`
- Create: `/src/fesa/model/domain.cpp`
- Create: `/tests/unit/model/model_types_test.cpp`
- Create: `/tests/unit/model/domain_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
parser와 analysis가 공유할 immutable semantic model을 위 exact paths에 구현하라.
최소 model types는 다음을 포함한다.
```cpp
using EntityIndex = std::uint32_t;
struct Node { SourceEntityId sourceId; std::array<double, 3> coordinates; };
struct LinearElasticMaterial { std::string name; double youngsModulus; double poissonRatio; };
struct GeneralBeamSection {
std::string name; double area; double i11; double i12; double i22; double torsionalConstant;
std::array<double, 3> firstAxis; std::vector<std::array<double, 2>> sectionPoints;
};
struct EulerBeam3DDefinition {
SourceEntityId sourceId; std::array<EntityIndex, 2> nodeIndices;
EntityIndex materialIndex; EntityIndex sectionIndex;
};
struct BoundaryCondition { std::string target; int firstDof; int lastDof; double value; };
struct NodalLoad { std::string target; int dof; double magnitude; };
struct StaticStepDefinition { std::string name; std::vector<BoundaryCondition> boundaries;
std::vector<NodalLoad> loads; };
```
`PartDefinition`과 `InstanceDefinition`은 source name, referenced part, identity-instance
restriction과 source-to-internal mapping을 보존한다. `NodeSet`, `ElementSet`,
part/instance/source label mapping을 포함한다. `Domain`은 vectors와
stable lookup을 소유하고 construction 완료 후 const access만 제공한다. 필요한 builder는
construction 경계에만 두고 Domain을 복사하지 않아도 view를 만들 수 있는 stable index를
보장한다. Node/element에는 equation ID를 저장하지 않는다.
Tests는 source identity equality/order, same-part multiple-instance distinction, stable
insertion order/index, deep ownership, const access, one static step storage, equation-ID 부재를
검증하고 `DomainModel` regex로 등록한다.
## Acceptance Criteria
RED targeted command 후 최소 구현으로 GREEN을 만든다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. Domain tests를 먼저 추가하고 compile/test RED를 확인한다.
2. 최소 semantic types와 immutable Domain ownership으로 GREEN을 만든다.
3. full VERIFY와 public dependency direction을 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 10 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 10을 `completed`로 갱신하고 model types/stable identity를 summary에 기록한다.
## 금지사항
- Abaqus keyword string을 Domain의 핵심 의미로 저장하지 마라. 이유: syntax/model 경계를 깨뜨린다.
- Domain에 equation numbering이나 mutable analysis vector를 넣지 마라. 이유: DofManager/AnalysisState 책임이다.
- parser를 이 step에서 구현하지 마라. 이유: Step 11–12 범위다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,86 +0,0 @@
# Step 11: Abaqus INP Syntax Parser
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/core/diagnostic.hpp`
- `/include/fesa/core/status.hpp`
- `/src/fesa/CMakeLists.txt`
- `/tests/CMakeLists.txt`
- `/reference/cantilever beam/cantilever beam.inp`
## 소유 파일
- Create: `/include/fesa/io/abaqus/input_syntax.hpp`
- Create: `/include/fesa/io/abaqus/input_reader.hpp`
- Create: `/src/fesa/io/abaqus/input_reader.cpp`
- Create: `/tests/unit/io/abaqus/input_syntax_test.cpp`
- Create: `/tests/unit/io/abaqus/input_reader_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
keyword/data/comment lexical 및 syntax parsing만 위 exact paths에 구현하라. Semantic
Domain mapping은 Step 12에 남긴다. 최소 계약은 다음과 같다.
```cpp
struct KeywordParameter { std::string name; std::optional<std::string> value; };
struct DataLine { std::vector<std::string> fields; SourceLocation location; };
struct KeywordBlock {
std::string canonicalName;
std::string originalLine;
std::vector<KeywordParameter> parameters;
std::vector<DataLine> data;
SourceLocation location;
};
struct ParsedInput { std::vector<KeywordBlock> blocks; };
class AbaqusInputReader {
public:
Result<ParsedInput> read(const std::filesystem::path& inputPath) const;
};
```
Keyword와 parameter name은 uppercase canonical form으로 비교하되 parameter value와
data label 원문을 보존한다. `**` comment line은 무시하고 blank line, comma-separated
field, valueless parameter, line number와 file identity를 처리한다. Keyword/data 구분,
malformed keyword, keyword 전 data line, unreadable file은 structured diagnostic으로
반환한다. Wrapper 의미, keyword allowlist, numeric conversion은 구현하지 않는다.
Tests는 mixed case, comments, blank/empty trailing fields, parameters, source locations,
malformed syntax, legacy cantilever syntax parse를 포함하고 `InpSyntax` regex로 등록한다.
## Acceptance Criteria
RED targeted command:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. syntax tests를 먼저 추가하고 reader 부재 RED를 확인한다.
2. semantic 판단이 없는 최소 reader로 GREEN을 만든다.
3. legacy input을 read-only fixture로 읽고 전체 VERIFY를 수행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 11 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 11을 `completed`로 갱신하고 parsed syntax/source-location evidence를 summary에 기록한다.
## 금지사항
- B33/B31 또는 supported keyword 정책을 syntax reader에 넣지 마라. 이유: semantic mapper 책임이다.
- source label/value case를 canonicalize하지 마라. 이유: stable source identity를 보존해야 한다.
- `*INCLUDE` 같은 미승인 기능을 추가하지 마라. 이유: scope 밖이다.
- reference input을 수정하지 마라. 이유: read-only fixture다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,101 +0,0 @@
# Step 12: INP to Domain Mapping
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/model/model_types.hpp`
- `/include/fesa/model/domain.hpp`
- `/src/fesa/model/domain.cpp`
- `/tests/unit/model/domain_test.cpp`
- `/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_reader_test.cpp`
- `/reference/cantilever beam/cantilever beam.inp`
## 소유 파일
- Create: `/include/fesa/io/abaqus/domain_mapper.hpp`
- Create: `/src/fesa/io/abaqus/domain_mapper.cpp`
- Create: `/tests/unit/io/abaqus/domain_mapper_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
ParsedInput을 검증된 immutable Domain으로 바꾸는 semantic mapper를 구현하라.
```cpp
class AbaqusDomainMapper {
public:
Result<Domain> map(const ParsedInput& input) const;
};
```
지원 범위는 승인 I/O contract와 정확히 같아야 한다.
- `*HEADING`, `*PART`/`*END PART`, `*NODE`, `*ELEMENT, TYPE=B33`,
`*NSET`/`*ELSET` 및 `GENERATE`, `*MATERIAL`/`*ELASTIC`,
`*BEAM GENERAL SECTION, SECTION=GENERAL`, `*SECTION POINTS`,
`*ASSEMBLY`/`*END ASSEMBLY`, `*INSTANCE`/`*END INSTANCE`,
`*BOUNDARY`, `*CLOAD`, `*STEP`/`*STATIC`/`*END STEP`를 mapping한다.
- 같은 part의 여러 identity instance를 deterministic stable internal IDs로 expand하고
`SourceEntityId {instance_name, source_label}`를 보존한다.
- assembly set의 `INSTANCE` parameter와 node/set target을 해석한다.
- `A,I11,I12,I22,J`, `E,nu`, `G=E/(2*(1+nu))`, `Iy=I11`, `Iz=I22`,
`n1 -> local y`를 mapping한다. `E>0`, `-1<nu<0.5`, 계산한 `G>0`과 section
properties의 positivity를 검증한다.
- `*STEP`의 `NLGEOM`은 absent/`NO`만 accept하고 `YES`는 model diagnostic으로 거부한다.
`*STATIC`의 1개 또는 2–4개 time-control data field를 finite positive 값으로 읽되 V0는
하나의 final frame 0만 만든다. Step 앞의 model-level `*BOUNDARY`는 sole static step에
활성화하고 step 안 `*CLOAD`와 함께 `StaticStepDefinition`에 연결한다.
- B31은 `unsupported-element-formulation`, instance translation/rotation data는
`unsupported-instance-transform` diagnostic으로 거부한다. Second step, nested assembly,
`I12!=0`, invalid DOF, duplicate label, dangling target/reference, nonpositive properties,
invalid geometry에도 설계/I/O contract가 정한 structured diagnostic code를 반환한다.
- `*PREPRINT`, `*RESTART`, `*TRANSVERSE SHEAR STIFFNESS`, `*OUTPUT, FIELD`,
`*OUTPUT, HISTORY`, `*NODE OUTPUT`, `*ELEMENT OUTPUT`, `*CONTACT OUTPUT`와 그
output-variable data는 warning으로 보존하고 무시한다. 이 allowlist 밖 unknown keyword는
error다. FESA default outputs를 output request로 필터링하지 않는다.
Tests는 모든 supported keyword의 positive path, mixed case, Generate, multiple identity
instances, allowlist warning, unknown keyword, B31 rejection, transform/nested/multi-step,
duplicate/dangling/invalid numeric와 approved legacy input mapping을 포함하고
`InpDomainMapping` regex로 등록한다.
## Acceptance Criteria
RED targeted command:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. semantic positive/negative tests를 production mapper보다 먼저 작성하고 RED를 확인한다.
2. 승인 subset에 필요한 최소 mapping/validation만 구현해 GREEN을 만든다.
3. diagnostic field/order와 Domain non-mutation을 점검하고 전체 VERIFY를 수행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 12 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 12를 `completed`로 갱신하고 supported mapping/negative diagnostics를 summary에 기록한다.
## 금지사항
- B31을 Euler element로 alias하지 마라. 이유: 물리 formulation 의미가 다르다.
- transform을 무시하거나 fallback local axis를 선택하지 마라. 이유: 입력 의미를 왜곡한다.
- `*DLOAD` 또는 multiple-step propagation을 구현하지 마라. 이유: 승인 범위 밖이다.
- reference input/CSV를 수정하지 마라. 이유: read-only baseline이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,82 +0,0 @@
# Step 13: AnalysisModel Active View
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/model/model_types.hpp`
- `/include/fesa/model/domain.hpp`
- `/src/fesa/model/domain.cpp`
- `/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`
## 소유 파일
- Create: `/include/fesa/analysis/analysis_model.hpp`
- Create: `/src/fesa/analysis/analysis_model.cpp`
- Create: `/tests/unit/analysis/analysis_model_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
단일 static step에서 활성 entity를 stable index/reference view로 분류하는
`AnalysisModel`만 구현하라.
```cpp
class AnalysisModel {
public:
static Result<AnalysisModel> create(const Domain& domain);
const Domain& domain() const noexcept;
const StaticStepDefinition& step() const noexcept;
const std::vector<EntityIndex>& activeElements() const noexcept;
const std::vector<EntityIndex>& activeMaterials() const noexcept;
const std::vector<EntityIndex>& activeSections() const noexcept;
const std::vector<EntityIndex>& activeBoundaryConditions() const noexcept;
const std::vector<EntityIndex>& activeLoads() const noexcept;
};
```
AnalysisModel은 Domain 객체나 semantic entity를 복사·수정하지 않고, 자체 소유가 필요한
경우 stable ID 목록만 가진다. Element에서 reachable material/section을 deterministic한
internal index 순으로 deduplicate한다. 정확히 하나의 static step만 허용하며 missing 또는
multiple step은 structured diagnostic이다.
Tests는 active classification, stable ordering/deduplication, reference address identity,
Domain 불변성, missing/multiple step rejection을 포함하고 `AnalysisModel` regex로 등록한다.
## Acceptance Criteria
RED targeted command:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. active-view tests를 먼저 작성하고 missing class/behavior RED를 확인한다.
2. stable ID view의 최소 구현으로 GREEN을 만든다.
3. Domain address/state 불변성과 전체 MSVC x64 Debug VERIFY를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 13 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 13을 `completed`로 바꾸고 active view/non-copy evidence를 summary에 기록한다.
## 금지사항
- Domain entity를 AnalysisModel에 복제하지 마라. 이유: source of truth가 분산된다.
- load/BC propagation이나 multi-step activation을 추가하지 마라. 이유: V0는 single step이다.
- equation number나 numeric state를 저장하지 마라. 이유: DofManager/AnalysisState 책임이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,88 +0,0 @@
# Step 14: DofManager
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/model/domain.hpp`
- `/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`
## 소유 파일
- Create: `/include/fesa/fem/dof_manager.hpp`
- Create: `/src/fesa/fem/dof_manager.cpp`
- Create: `/tests/unit/fem/dof_manager_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
node별 여섯 DOF, prescribed constraints, full/free numbering, element scatter map와 sparse
pattern을 단독 소유하는 `DofManager`를 구현하라.
```cpp
enum class DofComponent : std::uint8_t { ux, uy, uz, urx, ury, urz };
struct SparsePattern { std::vector<std::size_t> rowOffsets;
std::vector<std::size_t> columnIndices; };
class DofManager {
public:
static Result<DofManager> 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<std::size_t> freeEquation(std::size_t fullDof) const;
const std::array<std::size_t, 12>& elementScatter(EntityIndex element) const;
const std::vector<std::size_t>& freeDofs() const noexcept;
const std::vector<std::size_t>& constrainedDofs() const noexcept;
const Vector& prescribedValues() const noexcept;
const SparsePattern& sparsePattern() const noexcept;
};
```
Node internal index와 fixed component 순서로 full DOF를 부여하고, free/constrained mapping도
stable하게 만든다. Boundary target expansion과 overlapping equal prescriptions를 처리하고,
서로 다른 prescribed value conflict는 diagnostic으로 거부한다. Sparse pattern은 active
element scatter에서 생성하고 각 row column을 sorted unique로 유지한다. Node/Element model
objects를 수정하지 않는다. `prescribedValues()`는 `constrainedDofCount()` 크기이며
`constrainedDofs()`와 동일 순서의 `dc`를 반환한다.
Tests는 6-DOF numbering, set expansion, zero/nonzero constraints, overlapping/conflicting BC,
free equation mapping, 12-DOF element scatter, CSR pattern sorted uniqueness, full/reduced
round-trip를 포함하고 `DofManager` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
위 command의 RED를 확인한 뒤 구현하고 다음 GREEN/VERIFY를 실행한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. numbering/constraint/pattern tests를 먼저 작성하고 RED를 확인한다.
2. deterministic mapping에 필요한 최소 구현으로 GREEN을 만든다.
3. model objects에 equation ID가 추가되지 않았는지 review하고 full VERIFY를 수행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 14 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 14를 `completed`로 갱신하고 numbering/pattern evidence를 summary에 기록한다.
## 금지사항
- equation ID를 Node나 Element에 저장하지 마라. 이유: DofManager 단독 ownership 계약이다.
- penalty method, MPC, RBE를 추가하지 마라. 이유: V0 essential elimination 범위 밖이다.
- sparse numeric values를 저장하지 마라. 이유: assembly step 책임이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,87 +0,0 @@
# Step 15: AnalysisState
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/math/vector.hpp`
- `/include/fesa/analysis/analysis_model.hpp`
- `/include/fesa/fem/dof_manager.hpp`
- `/src/fesa/fem/dof_manager.cpp`
## 소유 파일
- Create: `/include/fesa/results/result_records.hpp`
- Create: `/include/fesa/analysis/analysis_state.hpp`
- Create: `/src/fesa/analysis/analysis_state.cpp`
- Create: `/tests/unit/results/result_records_test.cpp`
- Create: `/tests/unit/analysis/analysis_state_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
V0에서 실제 할당하는 mutable analysis quantities와 output row identity를 소유하는
`AnalysisState`를 위 exact paths에 구현하라. 최소 계약은 다음 의미를 가진다.
```cpp
struct StepFrameIdentity { std::string stepName; std::size_t frameIndex; };
struct EndpointResultRow { EntityIndex element; int endpoint; SourceEntityId node;
std::array<double, 6> endAction;
std::array<double, 4> sectionResultant; };
struct GaussResultRow { EntityIndex element; int gaussPoint;
std::array<double, 4> generalizedStrain;
std::array<double, 4> 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;
Vector& externalForce() noexcept;
Vector& internalForce() noexcept;
Vector& residual() noexcept;
Vector& reaction() noexcept;
// const overloads and owned element-recovery row accessors
};
```
각 full vector 크기는 `fullDofCount()`이고 zero-initialized다. Reaction은 constrained value를
동일 full-index space에 두며 free component는 residual sanity에 사용할 수 있어야 한다.
Endpoint/Gauss/stress row는 stable element/point order로 저장한다. Velocity, acceleration,
temperature, iteration history, nonlinear state storage를 만들지 않는다.
Tests는 allocation/zero initialization, independent ownership, step/frame identity, row ordering,
copy/move policy, forbidden-state API 부재 review를 포함하고 `AnalysisState` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. state ownership tests를 먼저 작성하고 RED를 확인한다.
2. V0에서 필요한 field만 최소 구현해 GREEN을 만든다.
3. 전체 VERIFY와 output row identity/order를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 15 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 15를 `completed`로 갱신하고 allocated fields/omitted fields를 summary에 기록한다.
## 금지사항
- velocity, acceleration, temperature, nonlinear iteration history를 할당하지 마라. 이유: V0 범위 밖이다.
- Domain 정의를 state에 복사하지 마라. 이유: model/state ownership을 분리해야 한다.
- HDF5 API를 state에 노출하지 마라. 이유: ResultsWriter adapter 책임이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,98 +0,0 @@
# Step 16: 3D Euler Beam Element
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/math/vector.hpp`
- `/include/fesa/math/matrix.hpp`
- `/include/fesa/model/model_types.hpp`
- `/include/fesa/results/result_records.hpp`
- `../../docs/linear-static-3d-euler-beam/README.md`
## 소유 파일
- Create: `/include/fesa/elements/euler_beam_3d.hpp`
- Create: `/src/fesa/elements/euler_beam_3d.cpp`
- Create: `/tests/unit/elements/euler_beam_3d_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
승인 formulation을 그대로 구현하는 2-node `EulerBeam3D` kernel을 작성하라.
```cpp
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<std::array<double, 6>, 2> equilibriumEndActions;
std::array<std::array<double, 4>, 2> endpointSectionResultants;
std::array<std::array<double, 4>, 2> gaussGeneralizedStrains;
std::array<std::array<double, 4>, 2> gaussGeneralizedResultants;
std::vector<BeamStressPoint> stressPoints;
};
class EulerBeam3D {
public:
static Result<EulerBeam3D> create(/* two nodes, guide, E, G, A, Iy, Iz, J, section points */);
Matrix localStiffness() const;
Matrix globalStiffness() const;
Vector localEquivalentLoad(const ConstantLocalLineLoad& load) const;
BeamRecovery recover(const Vector& globalElementDisplacement) const;
};
```
- Local DOF order와 부호는 formulation의 12-component order를 그대로 쓴다.
- `R` rows는 `(ex,ey,ez)`, `T=diag(R,R,R,R)`, `dl=T*dg`, `Kg=T^T*Kl*T`다.
- `Kl`은 두 Gauss point로 `B^T D B`를 적분하고 closed-form과 normalized `1e-12`로
검증한다. Production에서 1-point reduced integration을 사용하지 않는다.
- `coordinate_scale=max(1,norm(X1),norm(X2))`에 대해
`L>1e-12*coordinate_scale`, `norm(a_perp)>1e-12*max(1,norm(a))`를 요구한다.
`E,G,A,Iy,Iz,J>0`을 검증하고 fallback axis를 쓰지 않는다.
- line-load kernel은 constant `[px,py,pz,mx]` consistent vector만 제공한다. Parser/CLI load
object로 연결하지 않는다.
- Recovery는 equilibrium end action과 section resultants를 구분하고 two Gauss generalized
values 및 section point `S11=E(epsilon0+x2*kappa_y-x1*kappa_z)`를 생성한다. Element
identity가 없는 kernel-level `BeamStressPoint`를 Step 22가 `StressS11Row`로 감싼다.
Section point가 없으면 `(0,0), source=fesa-default` 하나를 사용한다.
Tests는 Hermite endpoint/derivative, B matrix, Gauss/closed stiffness, symmetry, six rigid
modes/rank 6, positive deformation energy, transform orthogonality/determinant/energy invariance,
line-load signs, axial/torsion/y-z bending analytical displacement/recovery, invalid geometry와
stress formula를 포함하고 `EulerBeam3D` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. formulation invariant/analytical tests를 먼저 작성해 RED를 확인한다.
2. 가장 작은 kernel 구현으로 GREEN을 만들고 normalized tolerance를 그대로 적용한다.
3. 수식/코드 component ordering을 대조하고 전체 MSVC x64 Debug VERIFY를 수행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 16 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 16을 `completed`로 갱신하고 element/recovery test evidence를 summary에 기록한다.
## 금지사항
- B31/Timoshenko shear deformation을 섞지 마라. 이유: 승인 formulation이 아니다.
- 1-point bending integration이나 fallback orientation을 쓰지 마라. 이유: spurious mode/의미 왜곡 위험이다.
- transverse/torsional shear stress를 만들어내지 마라. 이유: section 정보가 부족하고 범위 밖이다.
- `*DLOAD` parser/CLI 지원을 추가하지 마라. 이유: kernel test만 승인됐다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,77 +0,0 @@
# Step 17: oneTBB ParallelFor Adapter
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/core/status.hpp`
- `/include/fesa/elements/euler_beam_3d.hpp`
- `/src/fesa/elements/euler_beam_3d.cpp`
- `/tests/unit/elements/euler_beam_3d_test.cpp`
- `/cmake/FesaDependencies.cmake`
- `/src/fesa/CMakeLists.txt`
- `/tests/CMakeLists.txt`
## 소유 파일
- Create: `/include/fesa/assembly/parallel_for.hpp`
- Create: `/src/fesa/assembly/parallel_for.cpp`
- Create: `/tests/unit/assembly/parallel_for_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
solver core에서 oneTBB header/type을 숨기는 element-local loop adapter를 구현하라.
```cpp
class ParallelFor {
public:
virtual ~ParallelFor() = default;
virtual void execute(std::size_t count,
const std::function<void(std::size_t)>& body) const = 0;
};
class SerialParallelFor final : public ParallelFor { /* same contract */ };
class TbbParallelFor final : public ParallelFor { /* oneTBB implementation in .cpp */ };
```
각 index는 정확히 한 번 처리하고 `count==0`은 no-op이다. Element-local 결과는 호출자가
index-addressed storage에 기록해 scheduling과 무관한 ordering을 갖게 한다. Adapter는
전역 sparse matrix write나 reduction을 수행하지 않는다. Oversubscription 정책은
implementation comment와 test/implementation report에 남기고, 이 step에서 임의 global
thread setting을 바꾸지 않는다.
Tests는 zero/one/many counts, exact-once, serial/TBB semantic equivalence, stable
index-addressed output, exception propagation policy를 검증하고 `ParallelFor` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
마지막 scan은 public header에서 no-match여야 한다.
## 검증 절차
1. adapter conformance tests를 먼저 작성하고 RED를 확인한다.
2. Serial과 oneTBB 최소 구현으로 GREEN을 만든다.
3. public boundary scan과 전체 VERIFY를 실행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 17 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 17을 `completed`로 갱신하고 deterministic-use contract를 summary에 기록한다.
## 금지사항
- 전역 sparse storage에 병렬 write하지 마라. 이유: ordering/race는 Step 18이 통제한다.
- TBB type/header를 public API에 노출하지 마라. 이유: adapter boundary 계약이다.
- process-wide thread count를 임의 변경하지 마라. 이유: MKL/TBB policy가 불명확해진다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,93 +0,0 @@
# Step 18: Deterministic Sparse Assembly
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/math/vector.hpp`
- `/include/fesa/math/matrix.hpp`
- `/include/fesa/fem/dof_manager.hpp`
- `/include/fesa/elements/euler_beam_3d.hpp`
- `/include/fesa/assembly/parallel_for.hpp`
- `/src/fesa/assembly/parallel_for.cpp`
## 소유 파일
- Create: `/include/fesa/math/sparse_matrix.hpp`
- Create: `/src/fesa/math/sparse_matrix.cpp`
- Create: `/include/fesa/assembly/sparse_assembler.hpp`
- Create: `/src/fesa/assembly/sparse_assembler.cpp`
- Create: `/tests/unit/math/sparse_matrix_test.cpp`
- Create: `/tests/unit/assembly/sparse_assembler_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
element-local stiffness contributions를 deterministic하게 COO로 수집하고 0-based CSR로
finalize하는 별도 sparse module을 구현하라.
```cpp
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<SparseMatrix> fromCoo(std::size_t rows, std::size_t columns,
std::vector<CooContribution> contributions,
const SparsePattern& expectedPattern);
std::size_t rows() const noexcept;
std::size_t columns() const noexcept;
const std::vector<std::size_t>& rowOffsets() const noexcept;
const std::vector<std::size_t>& columnIndices() const noexcept;
const std::vector<double>& values() const noexcept;
Vector multiply(const Vector& rhs) const;
Status validate() const;
};
```
`SparseMatrix`는 `Matrix`를 상속하지 않는다. COO는 `(row,column,elementOrder,localOrder)`로
stable sort한 후 duplicate를 고정 순서로 합산한다. Zero value 보존/제거 policy는
implementation plan과 I/O-independent math contract에 맞춰 하나로 고정하고 test한다.
Row offsets/column indices는 0-based, columns sorted unique, sizes/ranges consistent해야 한다.
Element stiffness 계산은 ParallelFor로 index-addressed buffer에 넣고 global reduction은
element internal index 순서로 수행한다.
Tests는 known matrix CSR/matrix-vector product, duplicate sum, invalid index/pattern, empty row, symmetry,
serial-vs-TBB byte-identical row/column/value vectors, repeated runs를 포함하고
`SparseAssembly` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. CSR invariant/determinism tests를 먼저 작성하고 RED를 확인한다.
2. ordered COO reduction과 CSR ownership의 최소 구현으로 GREEN을 만든다.
3. repeated serial/TBB equivalence와 전체 VERIFY를 수행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 18 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 18을 `completed`로 갱신하고 CSR/determinism evidence를 summary에 기록한다.
## 금지사항
- `SparseMatrix`를 dense `Matrix`에서 상속하지 마라. 이유: storage/backend 의미가 다르다.
- TBB worker가 shared CSR value에 직접 쓰게 하지 마라. 이유: race와 nondeterminism이 생긴다.
- PARDISO-specific descriptor/index type을 public sparse API에 넣지 마라. 이유: Step 20 adapter 책임이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,83 +0,0 @@
# Step 19: Essential Constraints and Matrix Partition
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/math/vector.hpp`
- `/include/fesa/math/sparse_matrix.hpp`
- `/include/fesa/fem/dof_manager.hpp`
- `/include/fesa/assembly/sparse_assembler.hpp`
- `/src/fesa/assembly/sparse_assembler.cpp`
## 소유 파일
- Create: `/include/fesa/constraints/essential_constraints.hpp`
- Create: `/src/fesa/constraints/essential_constraints.cpp`
- Create: `/tests/unit/constraints/essential_constraints_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
조립된 full CSR matrix를 DofManager의 stable free/constrained ordering으로 partition하고
full/reduced vector를 mapping하는 essential-constraint module을 구현하라.
```cpp
struct PartitionedStiffness {
SparseMatrix kff;
SparseMatrix kfc;
SparseMatrix kcf;
SparseMatrix kcc;
};
class EssentialConstraints {
public:
static Result<PartitionedStiffness> 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);
};
```
Partition은 numeric value와 row/column order를 보존하고 0-based CSR invariants를 다시
검증한다. `dc`는 DofManager prescribed values에서 가져오며 zero로 가정하지 않는다.
이 step은 load vector나 RHS를 조립하지 않고 matrix/vector mapping만 소유한다.
Tests는 hand-computed block extraction, no/all/mixed constraints, nonzero prescribed values,
full-free-constrained round trip, invalid dimensions/order를 검증하고
`EssentialConstraints` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. partition/mapping tests를 먼저 추가하고 RED를 확인한다.
2. elimination에 필요한 최소 block extraction으로 GREEN을 만든다.
3. nonzero `dc`와 전체 VERIFY를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 19 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 19를 `completed`로 갱신하고 partition/reconstruction evidence를 summary에 기록한다.
## 금지사항
- prescribed displacement를 zero로 덮어쓰지 마라. 이유: 승인된 nonzero BC를 깨뜨린다.
- penalty/MPC solver를 추가하지 마라. 이유: V0는 essential partition만 지원한다.
- RHS/load assembly를 이 step에 섞지 마라. 이유: factorization-before-load 순서를 검증해야 한다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,79 +0,0 @@
# Step 2: Formulation Alignment
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/solver-core/README.md`
Step 0–1 산출물과 완료 summary를 확인하라.
## 작업
기존 `../../docs/linear-static-3d-euler-beam/formulation.md`를 승인된 V0 요구조건과
연구 근거에 맞춰 정렬하라. 기존 정식화의 정확한 수학적 의미를 유지해야 하며, 이
step은 새 요소를 다시 설계하는 작업이 아니다.
- Metadata의 source requirement/research 경로와 status를 실제 산출물에 맞게 바꾸고
`feature_id: 3d-isoparametric-euler-beam`, `status: ready-for-numerical-review`를 기록한다.
- 기존 strong/weak form, DOF 순서, `theta_y=-w'`, B matrix, constitutive matrix,
2-point Gauss, 12x12 stiffness, transformation, line-load vector, recovery 식을 유지한다.
- 승인된 입력 의미를 수학 계약에 연결한다: `n1 -> local y`, `t x n1 -> local z`,
`Iy=I11`, `Iz=I22`, `I12=0`, scale-aware geometry validation.
- equilibrium end action, endpoint section resultant, Gauss generalized values, section-point
axial `S11`을 구분하고 stress reference comparison은 N/A임을 분명히 한다.
- 기존 Open Issues 중 승인 설계에서 해결된 tolerance, orientation, HDF5 distinction,
requirement/research 부재 항목을 제거하거나 resolved decision으로 바꾼다.
- Euler–Bernoulli slenderness 적용 범위는 limitation으로 유지하되 승인되지 않은 임의
warning/error threshold를 추가하지 않는다.
수식 결함을 발견해 정확한 의미를 보존하면서 정렬할 수 없으면 문서를 조용히 수정하지
말고 Step 2를 `blocked`로 기록한다.
## Acceptance Criteria
```powershell
$path = 'docs/linear-static-3d-euler-beam/formulation.md'
$required = @(
'status: `ready-for-numerical-review`',
'docs/linear-static-3d-euler-beam/requirements.md',
'docs/linear-static-3d-euler-beam/research.md',
'theta_y=-',
'2점 Gauss',
'equilibrium end action',
'section resultant',
'S11',
'n1'
)
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing aligned formulation contract: $text"
}
}
if (Select-String -LiteralPath $path -SimpleMatch 'status: `needs-research`' -Quiet) {
throw 'Stale formulation status remains'
}
git diff --check -- $path
```
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. 기존 수식의 DOF/component 순서와 부호가 승인 전 문서 의미와 동일한지 diff로 검토한다.
3. requirement/research의 모든 math handoff가 정식화 section 또는 limitation에 연결되는지 확인한다.
4. Step 2를 `completed`와 변경 요약으로 갱신한다. 수학 결함이나 upstream 충돌은
`blocked`, 반복 편집 실패는 `error`로 기록한다.
## 금지사항
- C++ class, header, storage API를 설계하지 마라. 이유: formulation은 수학 계약이다.
- 승인된 부호·DOF·적분 규칙을 편의상 바꾸지 마라. 이유: reference 의미가 달라진다.
- B31/Timoshenko 또는 `*DLOAD` parser 지원을 추가하지 마라. 이유: V0 범위 밖이다.
- Abaqus 실행 및 reference artifact 변경을 하지 마라. 이유: 이 gate는 문서 정렬만 담당한다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,91 +0,0 @@
# Step 20: MKL PARDISO Linear Solver
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/core/status.hpp`
- `/include/fesa/core/diagnostic.hpp`
- `/include/fesa/math/vector.hpp`
- `/include/fesa/math/sparse_matrix.hpp`
- `/src/fesa/math/sparse_matrix.cpp`
- `/cmake/FesaDependencies.cmake`
## 소유 파일
- Create: `/include/fesa/solvers/linear/linear_solver.hpp`
- Create: `/include/fesa/solvers/linear/mkl_pardiso_solver.hpp`
- Create: `/src/fesa/solvers/linear/mkl_pardiso_solver.cpp`
- Create: `/tests/unit/solvers/linear/linear_solver_test.cpp`
- Create: `/tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
MKL PARDISO를 solver core에서 숨기며 SPD `Kff` factorization과 RHS substitution을 분리하는
adapter를 구현하라. Public interface는 승인된 계약과 동일해야 한다.
```cpp
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> impl_;
};
```
Adapter는 0-based CSR을 명시적으로 처리하고 real symmetric positive definite matrix
descriptor를 사용한다. Factorization state/workspace를 RAII로 소유하고 destructor와
re-factorization에서 누수 없이 해제한다. 동일 factorization에 여러 RHS를 substitution할
수 있어야 한다. invalid CSR, solve-before-factorize, dimension mismatch, nonfinite RHS,
PARDISO singular/positive-definite failure를 deterministic structured diagnostic으로 반환한다.
MKL header/type은 `.cpp`/private Impl 밖에 노출하지 않는다.
Tests는 known SPD solution/residual `1e-10`, repeated RHS, re-factorization, invalid CSR,
singular/indefinite matrix, solve-before-factorize, dimension mismatch를 포함하고
`MklPardisoSolver` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
마지막 scan은 public header에서 no-match여야 한다.
## 검증 절차
1. adapter tests를 먼저 작성하고 missing solver RED를 확인한다.
2. factorize/solve phase를 분리한 최소 PARDISO adapter로 GREEN을 만든다.
3. repeated RHS, RAII, residual, public boundary와 전체 VERIFY를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 20 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 20을 `completed`로 갱신하고 factorization/substitution evidence를 summary에 기록한다.
## 금지사항
- factorization과 solve를 하나의 opaque method로 합치지 마라. 이유: 승인 runtime order를 깨뜨린다.
- MKL type/header를 public interface에 노출하지 마라. 이유: adapter boundary 계약이다.
- singularity에 임의 regularization을 적용하지 마라. 이유: invalid model을 숨긴다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,78 +0,0 @@
# Step 21: Nodal Load Assembly and Effective RHS
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/analysis/analysis_model.hpp`
- `/include/fesa/fem/dof_manager.hpp`
- `/include/fesa/constraints/essential_constraints.hpp`
- `/src/fesa/constraints/essential_constraints.cpp`
## 소유 파일
- Create: `/include/fesa/assembly/load_assembler.hpp`
- Create: `/src/fesa/assembly/load_assembler.cpp`
- Create: `/tests/unit/assembly/load_assembler_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
single-step `*CLOAD`를 full external force vector에 deterministic하게 조립하고 effective
free RHS를 만드는 module을 구현하라.
```cpp
class LoadAssembler {
public:
static Result<Vector> assembleFullNodalLoad(const AnalysisModel& model,
const DofManager& dofs);
static Result<Vector> effectiveFreeRhs(const Vector& fullLoad,
const SparseMatrix& kfc,
const Vector& prescribedValues,
const DofManager& dofs);
};
```
Node label/node set target은 semantic Domain의 expanded stable identity를 사용한다. 같은
full DOF의 multiple CLOAD는 source order로 합산하고 output vector ordering은 full DOF
ordering과 같다. `rhs=Ff-Kfc*dc`를 정확히 구현하며 `dc`는 constrained ordering으로 gather한다.
Nonfinite load와 dimension mismatch는 diagnostic이다. 이 module은 element line load나
`*DLOAD` object를 만들지 않는다.
Tests는 single node/set loads, multiple accumulation, six components, negative magnitude,
nonfinite rejection, constrained load partition, nonzero prescribed `Kfc*dc` hand calculation,
zero loads를 포함하고 `LoadAssembly` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. nodal load/effective RHS tests를 먼저 작성하고 RED를 확인한다.
2. nodal-only deterministic assembly와 RHS 최소 구현으로 GREEN을 만든다.
3. nonzero prescribed displacement와 전체 VERIFY를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 21 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 21을 `completed`로 갱신하고 load/RHS evidence를 summary에 기록한다.
## 금지사항
- factorization을 이 module에서 호출하지 마라. 이유: orchestration order는 Step 24가 소유한다.
- `*DLOAD` 또는 Domain distributed-load object를 추가하지 마라. 이유: V0 입력 범위 밖이다.
- prescribed displacement contribution을 생략하지 마라. 이유: `rhs=Ff-Kfc*dc` 계약이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,85 +0,0 @@
# Step 22: Result Recovery
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/analysis/analysis_model.hpp`
- `/include/fesa/analysis/analysis_state.hpp`
- `/include/fesa/fem/dof_manager.hpp`
- `/include/fesa/elements/euler_beam_3d.hpp`
- `/include/fesa/math/sparse_matrix.hpp`
- `/include/fesa/constraints/essential_constraints.hpp`
- `/include/fesa/assembly/load_assembler.hpp`
## 소유 파일
- Create: `/include/fesa/results/result_recovery.hpp`
- Create: `/src/fesa/results/result_recovery.cpp`
- Create: `/tests/unit/results/result_recovery_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
full displacement로 전체 residual 반력과 element outputs를 복구해 AnalysisState에 채우는
module을 구현하라.
```cpp
class ResultRecovery {
public:
static Status recover(const AnalysisModel& model,
const DofManager& dofs,
const SparseMatrix& fullStiffness,
AnalysisState& state);
};
```
- `internalForce=K*d`, `residual=internalForce-externalForce`를 full space에서 계산하고
constrained DOF reaction을 residual에서 복구한다. Element end action을 별도 합산해
reaction을 만들지 않는다.
- Free residual normalized criterion은 `1e-10`이고 nonfinite를 실패시킨다.
- Active element internal index 순서로 global 12-DOF vector를 gather하고 `EulerBeam3D::recover`
결과를 endpoint/Gauss/stress rows에 안정적으로 저장한다.
- Equilibrium end action `[FX,FY,FZ,MX,MY,MZ]`, endpoint section resultant `[N,T,My,Mz]`,
Gauss generalized strain/resultant, section-point `S11`을 서로 다른 row/data로 유지한다.
- Reference용 node-station normalization helper는 동일 section-cut sign으로 endpoint를
변환하고 interior endpoint 불일치를 평균으로 숨기지 않으며, 일치한 경우 작은 stable
element ID를 대표 row로 선택한다.
Tests는 hand matrix reaction, nonzero prescribed displacement, free residual, axial/torsion/
y-z bending signs, end action vs section resultant distinction, stress point order/default centroid,
interior endpoint match/mismatch와 stable representative를 포함하고 `ResultRecovery` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. reaction/recovery/sign/normalization tests를 먼저 작성하고 RED를 확인한다.
2. residual 기반 최소 recovery 구현으로 GREEN을 만든다.
3. formulation component ordering과 full VERIFY를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 22 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 22를 `completed`로 갱신하고 recovered quantities/residual evidence를 summary에 기록한다.
## 금지사항
- reaction을 element endpoint 합산 경로로 계산하지 마라. 이유: nodal load와 nonzero BC를 놓친다.
- interior endpoint mismatch를 average로 숨기지 마라. 이유: tolerance failure evidence다.
- shear stress나 nodal stress averaging을 추가하지 마라. 이유: V0 recovery 범위 밖이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,108 +0,0 @@
# Step 23: HDF5 Results Writer
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/core/diagnostic.hpp`
- `/include/fesa/model/domain.hpp`
- `/include/fesa/analysis/analysis_state.hpp`
- `/include/fesa/results/result_records.hpp`
- `/cmake/FesaDependencies.cmake`
## 소유 파일
- Create: `/include/fesa/results/results_writer.hpp`
- Create: `/include/fesa/io/hdf5/hdf5_results_writer.hpp`
- Create: `/src/fesa/io/hdf5/hdf5_results_writer.cpp`
- Create: `/tests/unit/results/results_writer_test.cpp`
- Create: `/tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
HDF5 API를 adapter 안에 숨기고 schema v0를 임시 파일에 완성한 후 final path로 교체하는
ResultsWriter를 구현하라.
```cpp
class ResultsWriter {
public:
virtual ~ResultsWriter() = default;
virtual Status write(const std::filesystem::path& outputPath,
const Domain& domain,
const AnalysisState& state,
const std::vector<Diagnostic>& diagnostics) = 0;
};
class Hdf5ResultsWriter final : public ResultsWriter {
public:
Status write(const std::filesystem::path& outputPath,
const Domain& domain,
const AnalysisState& state,
const std::vector<Diagnostic>& diagnostics) override;
};
```
다음 group/dataset을 exact path와 승인 shape/component order로 기록한다.
```text
/metadata
/model/nodes
/model/elements
/steps/<step-name>/frames/0/nodal/displacement
/steps/<step-name>/frames/0/nodal/reaction
/steps/<step-name>/frames/0/element/end_force_local
/steps/<step-name>/frames/0/element/section_resultant
/steps/<step-name>/frames/0/element/generalized_strain
/steps/<step-name>/frames/0/element/generalized_resultant
/steps/<step-name>/frames/0/element/stress_s11
/diagnostics
```
승인 설계의 schema 목록은 minimum contract이며, 별도 `generalized_resultant` dataset은
설계가 요구한 Gauss-point generalized resultant를 손실 없이 기록하기 위한 필수 sibling이다.
Metadata는 schema/solver version, source input identity, `user-consistent-unspecified` unit
label, coordinate convention, `B33 Euler-Bernoulli` formulation을 가진다. Model rows는 stable
internal ID와 instance/source label을 함께 쓴다. 모든 field에는 component/output-location
identity를 기록한다. HDF5 handle은 RAII로 닫고 failure 시 incomplete final `results.h5`를
남기지 않는다. Existing final 교체도 Windows에서 실패 중간 상태를 만들지 않는 adapter
내 정책과 test를 제공한다. HDF5/Windows API type은 public header에 노출하지 않는다.
Tests는 complete schema/shape/metadata/identity/component, diagnostics warning, no section
points centroid, failed path/no partial final, successful replacement을 포함하고
`Hdf5ResultsWriter` regex로 등록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
마지막 scan은 public header에서 no-match여야 한다.
## 검증 절차
1. schema/atomicity tests를 먼저 작성하고 writer 부재 RED를 확인한다.
2. exact schema와 RAII/temporary finalization의 최소 구현으로 GREEN을 만든다.
3. HDF5 inspection, failure cleanup, public boundary와 전체 VERIFY를 확인한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 23 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 23을 `completed`로 갱신하고 schema/atomicity evidence를 summary에 기록한다.
## 금지사항
- CSV를 공식 solver output으로 추가하지 마라. 이유: authoritative output은 HDF5 하나다.
- Abaqus output request로 dataset을 생략하지 마라. 이유: FESA default output은 항상 생성된다.
- HDF5 type/header를 public API에 노출하지 마라. 이유: adapter boundary 계약이다.
- 실패 후 incomplete final file을 남기지 마라. 이유: output integrity 계약이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,148 +0,0 @@
# Step 24: Linear Static Orchestration and CLI
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/io/abaqus/input_reader.hpp`
- `/include/fesa/io/abaqus/domain_mapper.hpp`
- `/include/fesa/analysis/analysis_model.hpp`
- `/include/fesa/analysis/analysis_state.hpp`
- `/include/fesa/fem/dof_manager.hpp`
- `/include/fesa/assembly/parallel_for.hpp`
- `/include/fesa/assembly/sparse_assembler.hpp`
- `/include/fesa/constraints/essential_constraints.hpp`
- `/include/fesa/solvers/linear/linear_solver.hpp`
- `/include/fesa/assembly/load_assembler.hpp`
- `/include/fesa/results/result_recovery.hpp`
- `/include/fesa/results/results_writer.hpp`
- `/include/fesa/io/hdf5/hdf5_results_writer.hpp`
- `/src/fesa/CMakeLists.txt`
- `/tests/CMakeLists.txt`
- `/reference/cantilever beam/`의 승인된 네 파일
## 소유 파일
- Create: `/include/fesa/analysis/linear_static_analysis.hpp`
- Create: `/src/fesa/analysis/linear_static_analysis.cpp`
- Create: `/include/fesa/app/fesa_application.hpp`
- Create: `/src/fesa/app/fesa_application.cpp`
- Create: `/src/fesa/app/main.cpp`
- Create: `/tests/integration/analysis/linear_static_analysis_test.cpp`
- Create: `/tests/integration/app/fesa_application_test.cpp`
- Create: `/tests/reference/reference_comparison.hpp`
- Create: `/tests/reference/reference_comparison.cpp`
- Create: `/tests/reference/reference_comparison_test.cpp`
- Create: `/tests/reference/b33_reference_comparison_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
전체 single-step lifecycle과 `fesa.exe` CLI를 구현하고 Step 26이 재사용할 read-only
reference comparison test utility를 완성하라.
```cpp
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 { /* V0 hook implementations */ };
class FesaApplication {
public:
int run(const std::vector<std::string>& arguments);
};
```
`LinearStaticAnalysis::run`은 다음 event order를 exact하게 고정하고 각 실패를 diagnostic/
exit category에 연결한다.
```text
parse input -> Domain -> AnalysisModel -> DofManager/sparse pattern
-> parallel element stiffness -> deterministic COO-to-CSR
-> free/constrained partition -> factorize(Kff)
-> assemble full nodal load -> rhs=Ff-Kfc*dc
-> solve substitution -> reconstruct full displacement
-> residual/reaction/element recovery -> atomic HDF5 write
```
Spy/fake adapters를 사용한 orchestration test는 `factorize` event가 load assembly보다 먼저고
`solve`가 factorization을 재수행하지 않음을 검증한다. 실제 production default는
TbbParallelFor, MklPardisoSolver, Hdf5ResultsWriter를 사용한다.
CLI는 `fesa.exe <model.inp> --output <results.h5>`와 output 생략 시 current directory
`results.h5`를 지원한다. Exit code는 `0 success`, `2 usage`, `3 input syntax/semantic`,
`4 model validation`, `5 factorization/substitution`, `6 HDF5 output`이다. Error diagnostics는
stderr에 deterministic order로 쓰고 warning은 output diagnostics에도 보존한다. CMake
executable target은 내부 이름이 다르더라도 `OUTPUT_NAME fesa`를 설정해 Debug output이
실제로 `fesa.exe`가 되게 한다.
Test-only reference support를 `tests/reference/` 아래 구현하라.
- approved input으로 과거 검증 자료(정리됨)를 생성한다.
- legacy displacement/reaction/elemental-force CSV를 read-only로 parse하고 실제 CAE header
`U-U*`, `UR-UR*`, `RF-RF*`, `RM-RM*`, `SF-SF1`, `SM-SM*`을 canonical component로 normalize한다.
- row matching 전에 expected header, B33 input, unique identity, missing/extra/nonfinite를 검사한다.
- same model/step/frame/quantity/component의 Abaqus-only scale과
`absolute_floor + 1e-6*reference_scale`로 모든 row를 판정한다.
- section resultants는 node station과 `SF1->N`, `SM1->My`, `SM2->Mz`, `SM3->T`로 비교한다.
- Stress comparison은 N/A로 기록하되 HDF5 stress dataset/test 통과를 요구한다.
- max absolute, component-scale normalized, RMS, norm, worst row/component를
과거 검증 자료(정리됨)에 결정적으로 기록한다.
- 같은 JSON에 matched FESA/reference rows, full free residual norm, applied/reaction force와
origin 기준 moment 합, endpoint consistency를 `physics_evidence`로 기록해 Step 27이
source/test 변경 없이 물리 sanity를 독립 검토할 수 있게 한다.
Tests는 orchestration order, CLI default/explicit output, all exit codes, output-request no-op,
approved input end-to-end, reference tolerance zero/near-zero/failure cases를 포함한다.
CTest regex/label은 `LinearStaticCli`, `ReferenceComparisonContract`,
`B33ReferenceComparison`으로 실행 가능하게 한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
위 command에서 missing orchestration/CLI/reference utility RED를 확인한 후 구현한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. orchestration/CLI/reference contract tests를 먼저 작성하고 targeted RED를 확인한다.
2. exact lifecycle과 minimal CLI/test utility로 targeted GREEN을 만든다.
3. approved input end-to-end, comparison metrics, CTest discovery/full VERIFY를 실행한다.
4. reference artifacts가 unchanged인지 확인한다.
5. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 24 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output, 변경 파일과 generated HDF5/comparison evidence를 기록한다.
6. Step 24를 `completed`로 갱신하고 CLI path, exit codes, generated HDF5/metrics와
RED/GREEN/VERIFY evidence를 summary에 기록한다.
## 금지사항
- load assembly를 factorization 앞으로 옮기지 마라. 이유: 승인 runtime order와 반대다.
- factorize와 substitution을 합치지 마라. 이유: solver contract와 repeated RHS 검증을 깨뜨린다.
- B31/multiple-step/transform/`*DLOAD`를 지원하지 마라. 이유: V0 범위 밖이다.
- reference CSV를 보정·rename·rewrite하지 마라. 이유: comparison baseline을 오염시킨다.
- stress reference comparison을 만들어내지 마라. 이유: 승인 범위에서 명시적 N/A다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,70 +0,0 @@
# Step 25: Build and Test Verification
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/CMakeLists.txt`와 모든 CMake/test registration
- `/phases/linear-static-3d-euler-beam/index.json`의 Step 7–24 summary
## 작업
fresh MSVC x64 Debug configure/build/test evidence를 수집해
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라.
- Metadata status는 모든 gate 통과 시 `pass-for-reference-verification`이다.
- Environment/dependency revision과 config-resolved command를 기록한다.
- Configure, build, targeted feature tests, CTest discovery, full CTest 각각에 command,
start/end 또는 duration, exit code, stdout/stderr tail, verdict를 기록한다.
- CTest discovery가 하나 이상의 test를 포함하고 compiler metadata가 MSVC인지 확인한다.
- `/W4 /WX`로 새 product warning이 없는지 build output/CMake setting으로 확인한다.
- implementation report의 Step 7–24 RED/GREEN/VERIFY evidence가 모두 present인지 감사한다.
- 실패는 `configure | compile | link | test | reference-comparison | harness | environment |
upstream-contract` 중 하나로 분류하고 correction handoff를 기록한다.
## Acceptance Criteria
아래 명령을 fresh evidence로 실행한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Report structural check:
```powershell
$path = 'docs/linear-static-3d-euler-beam/build-test.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @('status: `pass-for-reference-verification`', 'MSVC', 'x64', 'Debug',
'configure', 'build', 'show-only=json-v1', 'output-on-failure', 'exit code', 'duration')
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing build/test evidence: $text"
}
}
git diff --check -- $path
```
## 검증 절차
1. 모든 command를 새로 실행하고 실제 exit code/duration/output tail을 기록한다.
2. implementation evidence와 CTest discovered tests를 대조한다.
3. 모두 성공한 경우에만 report와 Step 25를 pass/completed로 갱신한다.
4. 실패 시 report에 정확한 classification과 correction handoff를 기록하고 Step 25를
`error`로 둔다. 환경/사용자 조치가 필수인 경우만 `blocked`로 둔다.
## 금지사항
- source, tests, CMake를 수정하지 마라. 이유: independent build/test gate다.
- 실패 test를 disable/filter-out하지 마라. 이유: 회귀를 숨긴다.
- reference artifact나 tolerance를 수정하지 마라. 이유: 이 gate의 책임 밖이다.
- command 결과를 추정하거나 이전 summary를 fresh evidence로 대체하지 마라. 이유: gate 신뢰성을 잃는다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,90 +0,0 @@
# Step 26: Abaqus B33 Reference Verification
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/reference/cantilever beam/cantilever beam.inp`
- `/reference/cantilever beam/cantilever beam displacements.csv`
- `/reference/cantilever beam/cantilever beam reactions.csv`
- `/reference/cantilever beam/cantilever beam elemental forces.csv`
- Step 24가 생성한 reference comparison test/command 계약과 build-directory result/metrics
## 작업
Build/Test report status가 `pass-for-reference-verification`인지 먼저 확인한다. 통과했다면
승인 input으로 solver output을 재생성하고, test-only comparison utility가 기록한 raw
normalized rows/metrics를 독립 검토해
`../../docs/linear-static-3d-euler-beam/README.md`를 작성하라.
Artifact check:
- exact legacy 네 파일 존재, input `TYPE=B33`, expected CAE CSV headers, unique row keys,
finite values를 검사한다.
- `metadata.json` 부재는 프로젝트 전역 정책에 따라 허용한다. 이 bundle의 `README.md`와
stress CSV 부재는 승인된 legacy 예외이므로 차단하지 않는다. Contract에서
provenance/units/schema/stress N/A를 확인한다.
- generated HDF5 schema/version/units/coordinate/step-frame/source identity를 검사한다.
Comparison:
- displacement CSV `U-U1/U-U2/U-U3/UR-UR1/UR-UR2/UR-UR3`, reaction CSV
`RF-RF1/RF-RF2/RF-RF3/RM-RM1/RM-RM2/RM-RM3`, section-resultant CSV
`SF-SF1/SM-SM1/SM-SM2/SM-SM3`을 canonical component로 normalize한 뒤 exact
identity/component mapping으로 비교한다.
- CSV increment 1/time 1.0을 `(Step-1, frame 0)`으로 normalize한다.
- interior endpoint consistency를 먼저 검사하고 평균으로 숨기지 않는다.
- 같은 model/step/frame/quantity/component의 read-only reference rows에서만
`reference_scale=max(abs(reference_value_i))`를 계산한다.
- 모든 row에 `absolute_floor + 1e-6*reference_scale`을 적용한다. SI displacement/rotation
floor `1e-9`, force/moment floor `1e-3`; scale zero면 floor만 적용한다.
- Missing/extra/nonfinite/schema/identity mismatch는 tolerance 전에 fail한다.
- max absolute error, component-scale normalized error, RMS, norm, worst row/component를 기록한다.
- Stress reference comparison은 N/A라고 명시하고 HDF5 stress schema/unit test evidence를 연결한다.
모든 비교 통과 시 Metadata status는 `pass-for-physics-evaluation`이다. No-Change Assertion에
source/test/CMake/reference/tolerance가 모두 unchanged임을 기록한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
```powershell
$path = 'docs/linear-static-3d-euler-beam/reference-comparison.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @('status: `pass-for-physics-evaluation`', '## Artifact Inventory',
'## Comparison Contract', '## Quantity Results', '## No-Change Assertion',
'cantilever-beam-b33', 'absolute_floor + 1e-6 * reference_scale', 'stress', 'N/A')
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing reference verification evidence: $text"
}
}
git diff --check -- $path
```
## 검증 절차
1. Artifact check를 comparison보다 먼저 완료한다.
2. B33ReferenceComparison을 fresh 실행하고 comparison JSON과 HDF5를 직접 확인한다.
3. 모든 row/metric/tolerance가 통과한 경우에만 report와 Step 26을 pass/completed로 갱신한다.
4. 실패는 정해진 classification과 handoff를 report에 기록하고 Step 26을 `error`로 둔다.
사용자/외부 artifact 조치가 필수인 경우만 `blocked`로 둔다.
## 금지사항
- source, tests, CMake, upstream contract를 수정하지 마라. 이유: independent comparison gate다.
- FESA 결과나 reference value로 scale/tolerance를 조정하지 마라. 이유: acceptance를 오염시킨다.
- row를 zero-clamp, 삭제, 평균 처리하지 마라. 이유: mismatch를 숨긴다.
- reference artifact를 생성·수정·rename하지 마라. 이유: read-only baseline이다.
- Abaqus를 실행하지 마라. 이유: 저장된 CSV만 authoritative reference다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,77 +0,0 @@
# Step 27: Physics Sanity
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- 과거 검증 자료(정리됨)
- 과거 검증 자료(정리됨)
- `/reference/cantilever beam/`의 승인된 read-only artifact
## 작업
Reference Verification status가 `pass-for-physics-evaluation`인지 먼저 확인하고
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라.
다음 physical check를 documented expectation과 observed HDF5/comparison evidence로 각각
판정한다.
- global applied force + reaction force equilibrium
- origin 기준 applied/reaction force moment와 reaction moment equilibrium
- constrained DOF reaction consistency와 free residual normalized `1e-10`
- load 방향에 대한 displacement/rotation direction과 sign
- expected zero/symmetry components
- adjacent element endpoint section resultant consistency와 boundary end action balance
- local/global component mapping, section-force signs, `S11` location/sign sanity
- nonfinite, rigid-body-mode, 비정상 magnitude/energy 징후
- B33 cantilever가 검증하는 범위와 line-load/rotated/analytical unit test가 보완하는 coverage
각 check에 식, unit, coordinate system, observed value/norm, criterion, verdict를 기록한다.
Stress는 Abaqus reference comparison 없이 schema/unit/analytical evidence로만 sanity를
평가한다고 명시한다. 모든 documented check가 통과하면 Metadata와 Evaluation Verdict를
`pass-for-release-agent`로 둔다. No-Change Assertion을 포함한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
```powershell
$path = 'docs/linear-static-3d-euler-beam/physics-evaluation.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @('status: `pass-for-release-agent`', '## Input Evidence', '## Physics Checks',
'global equilibrium', 'reaction consistency', 'displacement direction',
'element force', 'stress', '## No-Change Assertion')
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing physics evidence: $text"
}
}
git diff --check -- $path
```
## 검증 절차
1. Passing reference report와 exact solver artifact identity를 확인한다.
2. 각 physical expectation을 HDF5/metrics/test evidence로 계산·검토한다.
3. 모두 통과한 경우에만 report와 Step 27을 pass/completed로 갱신한다.
4. 실패는 physics classification과 owning agent handoff를 기록하고 Step 27을 `error`로 둔다.
추가 reference model/사용자 결정이 필수이면 `blocked`로 둔다.
## 금지사항
- source, tests, CMake, upstream reports/contracts를 수정하지 마라. 이유: independent physics gate다.
- reference tolerance 성공을 다시 판정하거나 완화하지 마라. 이유: Step 26 책임이다.
- undocumented expectation으로 pass를 만들지 마라. 이유: 검토 traceability가 사라진다.
- Abaqus 실행 또는 reference artifact 변경을 하지 마라. 이유: read-only evidence다.
- release readiness를 승인하지 마라. 이유: Step 28 책임이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,96 +0,0 @@
# Step 28: Release Readiness
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/phases/linear-static-3d-euler-beam/index.json`의 모든 completed summary
## 작업
모든 gate evidence를 감사하고
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라.
- 같은 feature ID, source design revision, implementation scope와 artifact identity가 모든
문서에서 일치하는지 확인한다.
- Build/Test `pass-for-reference-verification`, Reference Verification
`pass-for-physics-evaluation`, Physics Evaluation `pass-for-release-agent`를 필수로 요구한다.
- 모든 `FESA-REQ-LS3DEB-*` must requirement를 acceptance criterion, test ID, reference/
analytical evidence, final disposition에 연결한다.
- Release Scope, Gate Evidence Inventory, Acceptance Traceability, Validation Evidence,
Known Limitations, Release Notes Draft, Release Verdict, Handoff, No-Change Assertion을 작성한다.
- Known Limitations에는 B31, multiple steps, transforms/nested assembly, `I12!=0`, `*DLOAD`,
nonlinear/dynamic/contact/thermal, shear/warping stress, beam stress reference N/A, legacy
artifact exception을 포함한다.
- 모든 evidence가 present/passing이고 unresolved blocker가 없을 때만
`status: ready-for-release`와 같은 verdict를 발행한다.
이 verdict는 내부 feature readiness이며 publish, package, tag, push 또는 external release를
수행하는 권한이 아니다.
## Acceptance Criteria
```powershell
$gates = @{
'docs/linear-static-3d-euler-beam/build-test.md' = 'status: `pass-for-reference-verification`'
'docs/linear-static-3d-euler-beam/reference-comparison.md' = 'status: `pass-for-physics-evaluation`'
'docs/linear-static-3d-euler-beam/physics-evaluation.md' = 'status: `pass-for-release-agent`'
}
foreach ($entry in $gates.GetEnumerator()) {
if (-not (Select-String -LiteralPath $entry.Key -SimpleMatch $entry.Value -Quiet)) {
throw "Gate is not passing: $($entry.Key)"
}
}
$phase = Get-Content -Raw 'phases/linear-static-3d-euler-beam/index.json' | ConvertFrom-Json
if (($phase.steps | Where-Object { $_.step -lt 28 -and $_.status -ne 'completed' }).Count -ne 0) {
throw 'One or more prerequisite phase steps are incomplete'
}
```
```powershell
$path = 'docs/linear-static-3d-euler-beam/release.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @('status: `ready-for-release`', '## Release Scope', '## Gate Evidence Inventory',
'## Acceptance Traceability', '## Validation Evidence', '## Known Limitations',
'## Release Notes Draft', '## Release Verdict', '## No-Change Assertion',
'TYPE=B33', 'TYPE=B31', 'stress reference', 'N/A')
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing release evidence: $text"
}
}
git diff --check -- $path
git diff --exit-code -- reference/
```
## 검증 절차
1. Gate status와 feature/source identity를 먼저 감사한다.
2. 모든 must requirement의 test/reference/final disposition trace를 확인한다.
3. limitations와 N/A가 Release Notes Draft에 누락되지 않았는지 확인한다.
4. 모든 조건을 만족한 경우에만 report와 Step 28을 ready/completed로 갱신한다.
5. evidence가 missing/failing/contradictory면 적절한 `needs-*` verdict와 handoff를 report에
기록하고 Step 28을 `error`로 둔다. 사용자 결정이 필수인 경우만 `blocked`로 둔다.
## 금지사항
- source, tests, CMake, upstream gate report, reference artifact, tolerance를 수정하지 마라. 이유: audit 독립성이다.
- failed/missing gate를 override하지 마라. 이유: release verdict 신뢰성을 깨뜨린다.
- publish, deploy, package, tag, push를 수행하지 마라. 이유: 사용자 명시 권한이 없다.
- 직접 commit하지 마라. 이유: Harness executor가 phase metadata commit을 담당한다.
@@ -1,75 +0,0 @@
# Step 3: Numerical Review
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/solver-core/README.md`
## 작업
`../../docs/linear-static-3d-euler-beam/README.md`를 생성해 구현 전 수치
검토를 수행하라.
- Metadata와 `Review Verdict`를 포함하고 통과 시
`status: pass-for-implementation-planning`을 사용한다.
- `[u,v,w,theta_x,theta_y,theta_z]` DOF 순서, `theta_y=-w'`, `My=-EIy*w''`, natural
boundary/end-action 부호를 독립 재유도한다.
- 4x12 B matrix와 12x12 closed-form stiffness의 대응, 2-point Gauss exactness,
symmetry, rank 6, six rigid modes, positive deformation energy를 검토한다.
- `R`, `T` orthogonality/right-handedness와 energy invariance를 검토한다.
- consistent constant line-load vector의 component와 부호를 검토하되 `*DLOAD` input은
범위 밖임을 유지한다.
- free/constrained partition, nonzero prescribed displacement, residual reaction,
SPD factorization 가정과 singularity/conditioning 위험을 검토한다.
- 구현 테스트 권고를 구체적 test id/criterion으로 제시하고 confirmed defect, risk,
open issue를 분리한다.
확인된 수학 결함이 하나라도 있으면 `pass-for-implementation-planning`을 발행하지 말고
`needs-formulation-revision`으로 보고한 뒤 phase step을 `blocked`로 기록한다.
## Acceptance Criteria
```powershell
$path = 'docs/linear-static-3d-euler-beam/numerical-review.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @(
'status: `pass-for-implementation-planning`',
'## Review Verdict',
'## Critical Findings',
'## Numerical Risk Assessment',
'## Consistency Checks',
'## Verification Readiness',
'rank 6',
'rigid',
'2-point'
)
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing numerical review evidence: $text"
}
}
git diff --check -- $path
```
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. review가 formulation을 직접 수정하지 않았는지 확인한다.
3. 모든 numerical risk가 test recommendation 또는 explicit limitation으로 연결되는지 확인한다.
4. 통과 시 Step 3을 `completed`와 verdict summary로 갱신한다. 수학 revision이 필요하면
`blocked`, 문서 생성 자체가 반복 실패하면 `error`로 기록한다.
## 금지사항
- formulation 문서를 직접 편집하지 마라. 이유: 독립 review evidence를 보존해야 한다.
- C++ API/file ownership을 설계하거나 구현하지 마라. 이유: 다음 gate 책임이다.
- reference comparison 성공을 판정하지 마라. 이유: solver 결과가 아직 없다.
- Abaqus 실행과 `/reference/` 변경을 하지 마라. 이유: read-only baseline이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,92 +0,0 @@
# Step 4: I/O Contract
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/solver-core/README.md`
- `/reference/cantilever beam/cantilever beam.inp`
- `/reference/cantilever beam/cantilever beam displacements.csv`
- `/reference/cantilever beam/cantilever beam reactions.csv`
- `/reference/cantilever beam/cantilever beam elemental forces.csv`
## 작업
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라. Metadata status는
`ready-for-implementation-planning`으로 둔다.
- 지원 keyword별 위치, parameter, data grammar, case policy, source-location 보존,
duplicate/dangling reference validation을 표로 정의한다.
- `*PART/*ASSEMBLY/*INSTANCE` nesting grammar, 여러 identity instance, stable
`SourceEntityId`, assembly set의 `INSTANCE` parameter를 정의한다.
- B33 acceptance, B31 rejection, transform/nested assembly/multiple-step rejection code를
포함한다.
- `*STEP`의 `NLGEOM`은 absent 또는 `NO`만 허용하고 `YES`는 거부한다. `*STATIC`의 승인
legacy data `initial increment, time period, minimum increment, maximum increment` 네 값을
accept하되 V0 결과 identity는 `(Step-1, frame 0)`으로 고정한다.
- `*BOUNDARY target, first_dof, last_dof[, value]`와
`*CLOAD target, dof, magnitude`, DOF 1..6 의미를 정확히 정의한다.
- General section의 `A,I11,I12,I22,J`, material `E,nu`, `G`, guide vector/geometry
validation과 local axis mapping을 정의한다.
- `*PREPRINT`, `*RESTART`, `*TRANSVERSE SHEAR STIFFNESS`, `*OUTPUT, FIELD`,
`*OUTPUT, HISTORY`, `*NODE OUTPUT`, `*ELEMENT OUTPUT`, `*CONTACT OUTPUT` 및 그 output
variable data의 warning no-op allowlist와 unknown model-affecting keyword error를 분리한다.
- HDF5 schema v0의 exact dataset path, shape, row identity, component order, units label,
metadata, diagnostics, atomic finalization을 정의한다.
- legacy CSV header의 `U-U1/U-U2/U-U3`, `UR-UR1/UR-UR2/UR-UR3`,
`RF-RF1/RF-RF2/RF-RF3`, `RM-RM1/RM-RM2/RM-RM3`, `SF-SF1`,
`SM-SM1/SM-SM2/SM-SM3`을 canonical component로 바꾸는 규칙과
frame/instance/node-station normalization 및
`SF1->N`, `SM1->My`, `SM2->Mz`, `SM3->T`, interior endpoint consistency를 정의한다.
- 일반 end-action/section mapping은 `SF1->FX/N`, `SF3->FY`, `SF2->FZ`,
`SM3->MX/T`, `SM1->MY`, `SM2->MZ`로 정의한다. 승인 legacy comparison에는 CSV에
존재하는 `SF1/SM1/SM2/SM3`만 사용하고 `SF2/SF3`를 reference row로 만들어내지 않는다.
- component-scale tolerance와 missing/extra/nonfinite precheck를 정의한다.
- CLI syntax와 exit code `0,2,3,4,5,6`을 포함한다.
## Acceptance Criteria
```powershell
$path = 'docs/linear-static-3d-euler-beam/io.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$required = @(
'status: `ready-for-implementation-planning`',
'## Abaqus Input Scope',
'## Syntax Policy',
'## Model Data Mapping',
'## Output HDF5 Schema',
'## FESA HDF5 to Reference CSV Comparison Schema',
'*OUTPUT, FIELD',
'SF1',
'/steps/<step-name>/frames/0/nodal/displacement',
'absolute_floor + 1e-6 * reference_scale'
)
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing I/O contract: $text"
}
}
git diff --check -- $path
```
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. 지원 keyword마다 purpose, required data, unsupported behavior가 있는지 확인한다.
3. HDF5 dataset과 reference CSV component/identity가 양방향으로 추적되는지 확인한다.
4. Step 4를 `completed`와 schema summary로 갱신한다. upstream 충돌은 `blocked`, 반복
생성 실패는 `error`로 기록한다.
## 금지사항
- parser나 HDF5 writer를 구현하지 마라. 이유: 이 step은 I/O 계약만 소유한다.
- full Abaqus compatibility를 주장하지 마라. 이유: 승인 subset만 지원한다.
- output request가 FESA 기본 output을 끄도록 정의하지 마라. 이유: 승인 의미와 반대다.
- reference CSV를 rewrite하거나 tolerance를 변경하지 마라. 이유: 승인 baseline이다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,86 +0,0 @@
# Step 5: Reference Model Contract
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/solver-core/README.md`
- `/reference/cantilever beam/cantilever beam.inp`
- `/reference/cantilever beam/cantilever beam displacements.csv`
- `/reference/cantilever beam/cantilever beam reactions.csv`
- `/reference/cantilever beam/cantilever beam elemental forces.csv`
## 작업
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라.
Metadata status는 `ready-for-implementation-planning`으로 둔다.
- code verification, analytical solution verification, B33 reference comparison을 분리한다.
- analytical inventory에 axial, torsion, local y/z bending, rotated beam, nonzero prescribed
displacement, invalid input cases를 포함하고 각 target quantity/test를 연결한다.
- 승인 reference record는 `model_id: cantilever-beam-b33`, logical schema
`abaqus-cae-report-csv-v0`, source commit `2b34d0b`, generator
`Abaqus/CAE Learning Edition 2024`, SI, `Step-1`, increment 1/time 1.0을 기록한다.
- exact legacy paths 네 개를 inventory에 기록하고 B33 element type, expected header,
unique row key, finite value artifact check를 요구한다.
- `metadata.json` 부재는 프로젝트 전역 선택-artifact 정책에 따라 허용하고, 이 legacy
bundle에 한해서 `README.md`와 stress CSV가 N/A임을 명시한다. 설계와 이 contract가
provenance/schema/tolerance/stress 사유를 기록한다.
- 이후 reference model에는 canonical file names와 `README.md`를 요구한다.
`metadata.json`이 존재하면 read-only로 contract와 대조한다.
- displacement, reaction, section resultant coverage와 HDF5 dataset/CSV/component/tolerance를
연결하는 Coverage Matrix를 작성한다. Stress comparison은 N/A지만 output unit/analytical
verification을 연결한다.
- artifact 상태를 실제 파일 inventory에 따라 기록하되 reference 값을 재계산하지 않는다.
## Acceptance Criteria
```powershell
$path = 'docs/linear-static-3d-euler-beam/reference-model.md'
if (-not (Test-Path $path)) { throw "Missing $path" }
$artifacts = @(
'reference/cantilever beam/cantilever beam.inp',
'reference/cantilever beam/cantilever beam displacements.csv',
'reference/cantilever beam/cantilever beam reactions.csv',
'reference/cantilever beam/cantilever beam elemental forces.csv'
)
foreach ($artifact in $artifacts) {
if (-not (Test-Path $artifact)) { throw "Missing approved artifact: $artifact" }
if (-not (Select-String -LiteralPath $path -SimpleMatch $artifact -Quiet)) {
throw "Artifact is not inventoried: $artifact"
}
}
$required = @('status: `ready-for-implementation-planning`', 'cantilever-beam-b33',
'2b34d0b', 'abaqus-cae-report-csv-v0', 'stress', 'N/A', '## Coverage Matrix')
foreach ($text in $required) {
if (-not (Select-String -LiteralPath $path -SimpleMatch $text -Quiet)) {
throw "Missing reference contract: $text"
}
}
git diff --check -- $path
git diff --exit-code -- reference/
```
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. 네 legacy artifact가 exact path로만 참조되고 rename 제안이 없는지 확인한다.
3. 모든 must requirement가 model/test/quantity 또는 명시적 N/A에 연결되는지 확인한다.
4. Step 5를 `completed`와 inventory summary로 갱신한다. artifact 필수 조건 불충족은
승인된 legacy 예외를 먼저 적용한 뒤 실제 결함만 `blocked`로 기록한다.
## 금지사항
- Abaqus나 다른 reference solver를 실행하지 마라. 이유: 이 step은 계약만 준비한다.
- `/reference/` 아래 어떤 파일도 생성·수정·rename하지 마라. 이유: baseline은 read-only다.
- legacy bundle에 metadata/README/stress CSV를 요구해 차단하지 마라. 이유: 승인된 예외다.
- reference comparison을 수행하거나 pass를 선언하지 마라. 이유: solver result가 아직 없다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,62 +0,0 @@
# Step 6: Implementation Plan
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/formulation.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/solver-core/README.md`
- `/phases/linear-static-3d-euler-beam/step7.md`부터 `/step24.md`까지
## 작업
`../../docs/linear-static-3d-euler-beam/README.md`를 생성하라. 승인 설계가 이
경로를 명시하므로 README의 기본 suffix보다 이 경로를 우선한다.
- Metadata와 Readiness Check를 작성하고 upstream status가 모두 준비된 경우
`status: ready-for-implementation`을 사용한다.
- Implementation Scope와 Non-goals를 승인 설계와 동일하게 기록한다.
- Step 7–24 각각을 독립 Work Breakdown task로 매핑하고 exact candidate source/header,
test, CMake file을 제시한다. 한 file은 한 책임을 가져야 한다.
- 각 task에 consumes/produces signature를 정의한다. 특히 `Vector`, row-major `Matrix`,
CSR `SparseMatrix`, `Domain`, `AnalysisModel`, `DofManager`, `AnalysisState`,
`EulerBeam3D`, `ParallelFor`, `LinearSolver`, `ResultsWriter`, orchestration API를 일관되게 쓴다.
- 각 production task에 GoogleTest test ID, RED condition, GREEN condition, targeted CTest
regex, full VERIFY command를 연결한다.
- parser negative cases, beam invariants/analytical cases, deterministic CSR, nonzero
prescribed displacement, PARDISO repeated RHS/singular diagnostics, HDF5 atomicity,
CLI/reference integration을 빠짐없이 배치한다.
- Requirement-to-task/test/reference Acceptance Traceability Matrix와 implementation report
evidence 형식을 포함한다.
- Step 24에서 test-only reference comparison executable/test를 완성해 Step 26이 source/test
변경 없이 다시 실행하고 report를 작성할 수 있게 계획한다.
- reference artifact, upstream contract, tolerance를 변경하는 correction을 금지한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. Acceptance Criteria 명령을 실행한다.
2. 모든 must requirement가 최소 한 task와 test에 연결되는지 확인한다.
3. later task가 사용하는 type/signature가 earlier task 정의와 정확히 같은지 대조한다.
4. 각 production task에 RED/GREEN/VERIFY command가 있고 reference step이 read-only인지 확인한다.
5. Step 6을 `completed`와 plan readiness summary로 갱신한다. upstream gate 미통과는
`blocked`, 반복 작성 실패는 `error`로 기록한다.
## 금지사항
- C++ source, test, CMake를 작성하거나 실행하지 마라. 이유: 이 step은 계획만 소유한다.
- upstream 요구조건·정식화·I/O·tolerance를 바꾸지 마라. 이유: 이미 승인된 계약이다.
- reference artifact를 생성·수정하지 마라. 이유: read-only baseline이다.
- API를 승인 문서와 모순되게 확정하지 마라. 이유: downstream task 간 계약이 깨진다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,86 +0,0 @@
# Step 7: CMake and GoogleTest Foundation
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `/CMakeLists.txt`가 이미 생겼다면 그 파일
## 소유 파일
- Create: `/CMakeLists.txt`
- Create: `/cmake/FesaDependencies.cmake`
- Create: `/include/fesa/build_info.hpp`
- Create: `/src/fesa/build_info.cpp`
- Create: `/src/fesa/CMakeLists.txt`
- Create: `/tests/CMakeLists.txt`
- Create: `/tests/unit/build_info_test.cpp`
- Create: `../../docs/linear-static-3d-euler-beam/README.md`
## 작업
MSVC x64 Debug에서 이후 모든 C++ step을 TDD로 실행할 최소 build/test foundation을
구현하라. Step 6이 정한 exact file layout을 우선하되 최소 책임은 다음과 같다.
- `CMakeLists.txt`: C++17, `enable_testing()`, FESA target 구성과 하위 CMake 진입점.
- `cmake/FesaDependencies.cmake`: cache variable `FESA_GTEST_SOURCE_DIR`을 검증하고
`C:/git/googletest`를 source tree로 받을 수 있게 한다. 이 절대경로를 default나
production source에 하드코딩하지 않는다. oneMKL, oneTBB, HDF5 CONFIG package를 찾고
dependency target 차이는 이 파일 안에서 정규화한다.
- `include/fesa/build_info.hpp`, `src/fesa/build_info.cpp`: HDF5 metadata가 재사용할
`std::string_view solverVersion() noexcept`의 최소 안정 API.
- `src/fesa/CMakeLists.txt`: `fesa_solver` static library와 FESA에만 `/W4 /WX` 적용.
- `tests/CMakeLists.txt`, `tests/unit/build_info_test.cpp`: GoogleTest 연결,
`gtest_discover_tests`, `BuildInfo` regex와 공통 `linear-static-3d-euler-beam` label을 가진
최소 제품 test. 이후 이 phase의 모든 CTest는 같은 공통 label을 상속한다.
- `../../docs/linear-static-3d-euler-beam/README.md`:
feature metadata, dependency/configure evidence와 Step 7–24별 RED/GREEN/VERIFY command,
exit code, 핵심 output, 변경 파일, requirement/test trace를 누적할 implementation report.
GoogleTest external target에는 `/W4 /WX`를 전파하지 않는다. MKL/TBB/HDF5 header나 type을
`build_info.hpp` 또는 다른 public header에 노출하지 않는다. 외부 checkout을 수정하거나
network fetch를 하지 않는다.
## Acceptance Criteria
먼저 `C:/git/googletest`의 revision을 read-only로 확인하라.
```powershell
if (-not (Test-Path 'C:/git/googletest/CMakeLists.txt')) { throw 'GoogleTest checkout is missing' }
$gtestRevision = git -C C:/git/googletest rev-parse HEAD
if ($gtestRevision -ne '04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4') {
throw "Unexpected GoogleTest revision: $gtestRevision"
}
```
구성·build·discovery·test를 실행한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 절차
1. build_info test를 먼저 작성하고 API가 없어 compile RED가 발생하는지 확인한 뒤
`build_info` production 파일을 추가한다.
2. 위 명령을 실행해 GREEN과 전체 VERIFY를 확인한다.
3. MSVC compiler metadata와 FESA target `/W4 /WX`, third-party warning 격리를 확인한다.
4. implementation report에 Step 7 RED/GREEN/VERIFY의 실제 command, exit code와 핵심
output을 기록한다.
5. Step 7을 `completed`로 바꾸고 build files, target names, dependency resolution을
`summary`에 기록한다. 설치 경로/환경이 실제로 없으면 `blocked`, 반복 구현 실패는
`error`로 기록한다.
## 금지사항
- dependency source를 vendor하거나 download하지 마라. 이유: 승인된 local install을 사용한다.
- GoogleTest 절대경로를 CMake default로 하드코딩하지 마라. 이유: cache variable 계약이다.
- FESA warning option을 third-party target에 적용하지 마라. 이유: 외부 코드 경고는 제품 책임이 아니다.
- 이후 solver module을 미리 만들지 마라. 이유: 이 step은 build/test foundation만 소유한다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,94 +0,0 @@
# Step 8: Core Diagnostics
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/build_info.hpp`
- `/src/fesa/CMakeLists.txt`
- `/tests/CMakeLists.txt`
## 소유 파일
- Create: `/include/fesa/core/source_identity.hpp`
- Create: `/include/fesa/core/diagnostic.hpp`
- Create: `/include/fesa/core/status.hpp`
- Create: `/src/fesa/core/diagnostic.cpp`
- Create: `/src/fesa/core/status.cpp`
- Create: `/tests/unit/core/source_identity_test.cpp`
- Create: `/tests/unit/core/diagnostic_test.cpp`
- Create: `/tests/unit/core/status_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
Step 6의 file plan을 따르며 core ID, source location, diagnostic, status/result type만 구현하라.
최소 public 계약은 아래 의미를 제공해야 한다.
```cpp
struct SourceLocation { std::filesystem::path file; std::size_t line; };
struct SourceEntityId { std::string instanceName; std::int64_t sourceLabel; };
enum class Severity { warning, error };
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<Diagnostic> diagnostics);
bool isOk() const noexcept;
const std::vector<Diagnostic>& diagnostics() const noexcept;
};
template<class T> class Result;
```
`Result<T>`는 성공 value 또는 실패 `Status`를 소유하고 실패 value access를 거부한다.
Diagnostic ordering helper는 file, line, keyword, entity identity, code 순으로 stable하게
정렬한다. `core` public header는 MKL/TBB/HDF5에 의존하지 않는다.
위 exact 파일을 생성하고 각 production stem에 대응하는 test를 먼저 작성하라.
Test suite label/regex는
`CoreDiagnostics`로 식별 가능해야 한다.
## Acceptance Criteria
RED에서는 production 파일을 만들기 전에 다음 targeted command가 missing header/symbol로
실패하는 것을 확인하고 구현 report 또는 step summary용 evidence를 남긴다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
구현 후 GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Tests는 value/error exclusivity, move/copy, failed access, exact diagnostic fields와
deterministic ordering을 검증해야 한다.
## 검증 절차
1. GoogleTest를 먼저 추가하고 targeted RED를 관찰한다.
2. 최소 production 구현으로 targeted GREEN을 만든다.
3. 전체 MSVC x64 Debug build/CTest VERIFY를 실행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 8 section에 실제 RED/GREEN/VERIFY command, exit code, 핵심 output과 변경 파일을 기록한다.
5. public header dependency를 검토하고 Step 8에 `completed`와 RED/GREEN/VERIFY 요약을 기록한다.
## 금지사항
- parser-specific keyword policy를 core에 넣지 마라. 이유: layer dependency를 역전시킨다.
- exception text에 backend-specific detail을 노출하지 마라. 이유: structured diagnostic이 계약이다.
- 기존 build/test 동작을 재구성하지 마라. 이유: Step 7 범위다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
@@ -1,95 +0,0 @@
# Step 9: Dense Math Adapters
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-3d-euler-beam/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `../../docs/linear-static-3d-euler-beam/README.md`
- `/include/fesa/core/status.hpp`
- `/src/fesa/CMakeLists.txt`
- `/tests/CMakeLists.txt`
## 소유 파일
- Create: `/include/fesa/math/vector.hpp`
- Create: `/include/fesa/math/matrix.hpp`
- Create: `/src/fesa/math/vector.cpp`
- Create: `/src/fesa/math/matrix.cpp`
- Create: `/tests/unit/math/vector_test.cpp`
- Create: `/tests/unit/math/matrix_test.cpp`
- Modify: `/src/fesa/CMakeLists.txt`
- Modify: `/tests/CMakeLists.txt`
## 작업
연속 `double` storage를 소유하는 `Vector`와 row-major `Matrix`를 위 exact paths에
구현하라. Public 의미는 다음과 같아야 한다.
```cpp
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;
};
```
copy/move semantics를 검증하고 모든 index access는 bounds-checked여야 한다. dimension
mismatch는 `std::invalid_argument`, bounds 위반은 `std::out_of_range`로 일관되게 처리한다.
copy, dot, Euclidean norm, scale, axpy, GEMV, GEMM은 `.cpp` 내부 MKL CBLAS adapter를
사용한다. `mkl.h`, `MKL_INT`, `CBLAS_*`가 public header에 나타나면 안 된다.
Tests는 zero-size policy, ownership/deep-copy, move safety, bounds, mismatch, non-square
row-major GEMV/GEMM과 known BLAS values를 검증하고 `DenseMath` regex로 실행 가능하게 한다.
## Acceptance Criteria
RED targeted command:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
GREEN/VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
마지막 `rg`는 no-match여야 한다.
## 검증 절차
1. `vector_test.cpp`, `matrix_test.cpp`를 먼저 작성하고 missing behavior RED를 확인한다.
2. 최소 adapter/ownership 구현으로 GREEN을 만든다.
3. 전체 MSVC x64 Debug VERIFY와 public-header dependency scan을 실행한다.
4. `../../docs/linear-static-3d-euler-beam/README.md`의
Step 9 section에 실제 RED/GREEN/VERIFY command, exit code,
핵심 output과 변경 파일을 기록한다.
5. Step 9를 `completed`로 바꾸고 operations/test evidence를 summary에 기록한다.
## 금지사항
- `Matrix`를 sparse storage로 재사용하지 마라. 이유: CSR은 별도 타입이다.
- MKL type/header를 public API에 노출하지 마라. 이유: adapter boundary 계약이다.
- expression template이나 lazy evaluation을 추가하지 마라. 이유: 승인되지 않은 일반화다.
- 직접 commit하지 마라. 이유: Harness executor가 담당한다.
-120
View File
@@ -1,120 +0,0 @@
{
"project": "FESA Structural Solver",
"phase": "linear-static-mitc4-shell",
"steps": [
{
"step": 0,
"name": "shell-semantic-model",
"status": "completed",
"summary": "RED unit build failed on missing shell semantic types/accessors; GREEN added S4/S4R and FESA-MITC4 records, shell section/frame ownership, and Domain const accessors; DomainModel 5/5 and full CTest 85/85 passed.",
"started_at": "2026-08-12T17:50:02+0900",
"completed_at": "2026-08-12T18:46:02+0900"
},
{
"step": 1,
"name": "shell-domain-mapping",
"status": "completed",
"summary": "RED failed on valid S4/S4R mapping and missing shell diagnostics; GREEN added stable multi-instance FESA-MITC4 mapping, centered shell section/material resolution, and fail-closed shell diagnostics; focused 18/18 and full CTest 89/89 passed.",
"started_at": "2026-08-12T18:46:02+0900",
"completed_at": "2026-08-12T19:13:23+0900"
},
{
"step": 2,
"name": "shell-director-geometry",
"status": "completed",
"summary": "RED unit build failed with C1083 on missing shell_geometry.hpp; GREEN added deterministic center normals, source-sorted area-weighted nodal directors/right-handed frames, and 17-location finite/positive Jacobian validation wired into shell mapping; focused 18/18 and full CTest 93/93 passed.",
"started_at": "2026-08-12T19:13:23+0900",
"completed_at": "2026-08-12T19:28:54+0900"
},
{
"step": 3,
"name": "mitc4-kinematics-constitutive",
"status": "completed",
"summary": "RED unit build failed with C1083 on missing mitc4_shell.hpp; GREEN added the validated concrete 20-DOF MITC4 shape/frame/channel-map, covariant tying/engineering-strain, constitutive/section-matrix, and fixed 2x2x2 quadrature seams; focused 9/9 and full CTest 98/98 passed.",
"started_at": "2026-08-12T19:28:55+0900",
"completed_at": "2026-08-12T19:41:51+0900"
},
{
"step": 4,
"name": "mitc4-stiffness-drilling",
"status": "completed",
"summary": "RED MSVC unit build failed with C2039 on missing Mitc4Shell::stiffness; GREEN added K20=sum(Bbar^T*C5*Bbar*J*w), Kphys24=Tp^T*K20*Tp, kd=1e-3*min(R+) from the eight tangent-rotation diagonals only, and Kdrill24=Td^T*(kd*I4)*Td with deterministic nonfinite failure; focused 10/10 and full CTest 104/104 passed.",
"started_at": "2026-08-12T19:41:51+0900",
"completed_at": "2026-08-12T19:54:27+0900"
},
{
"step": 5,
"name": "mitc4-physical-recovery",
"status": "completed",
"summary": "RED MSVC unit build failed with C2039 on missing Mitc4Shell::recoverPhysical; GREEN added fixed GP1..GP4 physical-only generalized strain/resultant, BOTTOM/MIDDLE/TOP stress and physical energy recovery with exact pure-drill exclusion; focused 5/5 and full CTest 106/106 passed.",
"started_at": "2026-08-12T19:54:27+0900",
"completed_at": "2026-08-12T20:02:04+0900"
},
{
"step": 6,
"name": "shell-dof-scatter",
"status": "completed",
"summary": "RED MSVC unit build failed with C2039 on missing DofManager::shellElementScatter; GREEN added source-order 24-entry shell scatter and combined sorted-unique sparse pattern while preserving B33, plus shell-sized no/mixed/all constraint round trips; focused 16/16 and full CTest 109/109 passed.",
"started_at": "2026-08-12T20:02:04+0900",
"completed_at": "2026-08-12T20:10:16+0900"
},
{
"step": 7,
"name": "shell-sparse-assembly",
"status": "completed",
"summary": "RED SparseAssembly failed 3/8 because shell produced zero CSR values and zero worker dispatch; GREEN added source-ordered 576-entry worker COO buffers for concrete FESA-MITC4 24x24 stiffness with canonical reduction and S4/S4R parity; focused 17/17 and full CTest 112/112 passed.",
"started_at": "2026-08-12T20:10:16+0900",
"completed_at": "2026-08-12T20:21:31+0900"
},
{
"step": 8,
"name": "shell-load-validation",
"status": "completed",
"summary": "RED LoadAssembly 003/004 failed because drilling moments were accepted; GREEN added stable post-aggregation exact-zero handling and overflow-safe equivalent rho_M=abs(dot(d,M))/norm(M)<=1e-12 validation with unsupported-drilling-load before RHS; focused 23/23 and full CTest 116/116 passed.",
"started_at": "2026-08-12T20:21:31+0900",
"completed_at": "2026-08-12T20:33:52+0900"
},
{
"step": 9,
"name": "shell-analysis-state",
"status": "completed",
"summary": "RED MSVC build failed with C2039 on missing shell state API and rollback negatives failed when invalid candidates committed; GREEN added exact GP1..GP4/frame/strain/resultant/BOTTOM-MIDDLE-TOP stress records plus candidate-owned physical energy/equilibrium/verification metrics with atomic validation; focused 11/11 and full CTest 119/119 passed.",
"started_at": "2026-08-12T20:33:52+0900",
"completed_at": "2026-08-12T20:46:40+0900"
},
{
"step": 10,
"name": "shell-result-recovery",
"status": "completed",
"summary": "RED ResultRecovery failed on stale shell evidence after beam-only recovery; GREEN added full-residual reaction/free evidence, stable physical-only GP/stress recovery, deterministic physical energy/global-origin equilibrium metrics, and atomic whole-state commit; focused 20/20 and full CTest 126/126 passed.",
"started_at": "2026-08-12T20:46:40+0900",
"completed_at": "2026-08-12T21:24:06+0900"
},
{
"step": 11,
"name": "shell-hdf5-output",
"status": "completed",
"summary": "RED HDF5 tests exposed missing shell schema and unsafe invalid-inventory replacement; GREEN added additive schema-v0 MITC4 metadata/model/constraint/fixed-location/result/global datasets with finite reopen self-check and atomic preservation; focused 28/28 and full CTest 130/130 passed.",
"started_at": "2026-08-12T21:24:06+0900",
"completed_at": "2026-08-12T21:42:13+0900"
},
{
"step": 12,
"name": "shell-linear-static-flow",
"status": "completed",
"summary": "RED prescribed-only shell flow failed free-residual normalization; GREEN added FLOW-001..004 lifecycle/CLI coverage and Kff/Kfc/Ff term-scale recovery normalization while preserving one factorization, singular failure, valid 0x0 solve, and validated writer commit; focused 10/10 and full CTest 135/135 passed.",
"started_at": "2026-08-12T21:42:14+0900",
"completed_at": "2026-08-12T21:54:14+0900"
},
{
"step": 13,
"name": "shell-reference-comparison",
"status": "completed",
"summary": "RED fixed-boundary test exposed scale-derived 2.001e-6/1e-9 tolerances and the S4 E2E failure; GREEN made the MITC4 test-only comparator use fixed 1.0e-5 while retaining diagnostic reference scale, U-blocking/UR-warning behavior, and deterministic reporting; focused 8/8 and full CTest 144/144 passed with reference hashes unchanged.",
"started_at": "2026-08-12T21:54:14+0900",
"completed_at": "2026-08-13T10:14:08+0900"
}
],
"created_at": "2026-08-12T17:50:02+0900",
"completed_at": "2026-08-13T10:14:08+0900"
}
-77
View File
@@ -1,77 +0,0 @@
# Step 0: Shell Semantic Model
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`
- `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `/phases/index.json`
- `/phases/linear-static-mitc4-shell/index.json`
- `/phases/linear-static-mitc4-shell/step0.md`
- `/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`
필수 파일이 없거나 승인 계약과 충돌하면 현재 Step을 `blocked`로 기록하고 중단한다.
## 작업
Requirements 002-016, 024의 semantic ownership만 구현한다.
1. 먼저 `MITC4-MODEL-001`과 `MITC4-MODEL-002`를 기존 model tests에 추가한다.
2. Tests는 four-node connectivity, stable `SourceEntityId`, source type `S4|S4R`와
internal `FESA-MITC4` identity 분리, finite positive thickness와 material/section
indices, optional initial nodal director/frame storage, declaration order를 검증한다.
3. Production은 `model_types.hpp`와 필요한 `Domain` const accessor에만 최소 추가한다.
Candidate records are `ShellSourceElementType`, `ShellSection`,
`Mitc4ShellDefinition` and a shell-only node director/frame record.
4. 기존 `EulerBeam3DDefinition`, `GeneralBeamSection`, B33 accessors를 보존한다.
5. Node/Element에 equation id를 넣지 않는다. Director는 dimensionless unit vector이고
thickness와 별도다.
## Acceptance Criteria
먼저 다음 configure를 실행한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
RED test를 작성한 뒤 아래 build/test가 missing shell semantic behavior 때문에 실패함을
기록한다. Compile failure면 그 expected failure를 기록하고 CTest는 GREEN 뒤 실행한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
GREEN 뒤 focused와 full VERIFY:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
- RED command와 예상 failure, GREEN/focused/full 결과를 다음 Step summary에 남긴다.
- 성공 시 현재 Step만 `completed`와 한 줄 `summary`로 갱신한다.
- 3회 후 실패면 `error`/`error_message`, 사용자 결정이 필요하면
`blocked`/`blocked_reason`을 기록한다.
- timestamp, retry, commit, 다음 Step 선택은 Executor 소유다.
## 금지사항
- Parser, element kernel, DOF, assembly를 수정하지 마라. 이유: Step 0은 model layer만 소유한다.
- 공통 public Element hierarchy를 만들지 마라. 이유: 승인된 아키텍처 범위가 아니다.
- 기존 B33 record를 제거하거나 의미를 바꾸지 마라. 이유: V0 회귀를 막는다.
- 직접 commit하거나 hook script를 수동 실행하지 마라. 이유: Executor/hook 소유권이다.
- `reference/` 파일을 수정하거나 Abaqus를 실행하지 마라.
-59
View File
@@ -1,59 +0,0 @@
# Step 1: Shell Domain Mapping
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Requirements 001-010, 017-023
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Sections 1-5, 8-9
- `/phases/index.json`, task index, `/phases/linear-static-mitc4-shell/step1.md`
- Step 0에서 수정한 model/Domain paths와 Step 0 summary
- `/include/fesa/io/abaqus/domain_mapper.hpp`
- `/src/fesa/io/abaqus/domain_mapper.cpp`
- `/tests/unit/io/abaqus/domain_mapper_test.cpp`
- `/include/fesa/io/abaqus/input_syntax.hpp`와 `input_reader.hpp`는 경계 확인용으로만 읽는다.
## 작업
1. `MITC4-MAP-001..004`를 먼저 작성한다.
2. `AbaqusDomainMapper::map(const ParsedInput&) -> Result<Domain>` signature를 유지하고
exact `TYPE=S4|S4R` four-node connectivity와 single-row centered
`*SHELL SECTION, MATERIAL=...`를 semantic model로 mapping한다.
3. ELSET/material을 element마다 exactly once resolve하고 source type과
`FESA-MITC4` identity를 분리한다.
4. identity PART/ASSEMBLY/INSTANCE 및 multiple identity instances의 stable mapping을
유지한다. Mixed beam-shell은 `unsupported-mixed-element-model`로 거부한다.
5. Invalid connectivity/section/material/unsupported option/second or nonlinear step/
DLOAD를 I/O 계약의 exact diagnostic class로 fail closed 한다.
6. Existing six-DOF BOUNDARY/CLOAD grammar와 output-request no-op behavior를 재사용한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Valid S4/S4R mapping 또는 negative diagnostic assertion의 expected RED를 기록한 뒤
minimal GREEN만 작성한다. GREEN 뒤:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
RED/focused/full evidence를 기록하고 현재 Step만 `completed`/`summary` 또는
`error`/`error_message`, `blocked`/`blocked_reason`으로 갱신한다. Timestamp,
commit, advancement는 Executor 소유다.
## 금지사항
- `AbaqusInputReader`에 semantic policy를 넣지 마라.
- Element math, geometry calibration, equation numbering을 구현하지 마라.
- Unsupported 의미를 무시하거나 S4R reduced integration을 암시하지 마라.
- Reference artifact, tolerance, upstream 문서를 수정하지 마라.
- 직접 commit/hook 실행을 하지 마라.
@@ -1,50 +0,0 @@
# Step 10: Shell Result Recovery
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Requirements 029/035/041-046/048/057
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md` Sections 14, 16
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Sections 6.3-6.5
- `../../docs/linear-static-mitc4-shell/README.md`
- phase indexes, `step10.md`, completed Steps 5/9 paths and summaries
- `/include/fesa/results/result_recovery.hpp`
- `/src/fesa/results/result_recovery.cpp`
- `/tests/unit/results/result_recovery_test.cpp`
## 작업
1. `MITC4-REC-001..005`를 먼저 작성한다.
2. Existing full `K*d-F` residual을 nodal reaction/free residual evidence로 유지한다.
3. Shell element displacement는 24-entry scatter로 추출하고 Step 5
physical-only recovery를 호출해 stable source-element/GP/section order로 candidate를 채운다.
4. Deterministic element reduction으로 physical energy를 합산한다. Applied CLOAD와
constrained reaction으로 global origin about force/moment balance와 normalized
metrics를 계산한다.
5. 모든 row/component/location/finite validation 뒤 AnalysisState에 원자적으로 commit한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Beam-only recovery/absent shell rows의 expected RED 후 minimal GREEN. 이후:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
RED와 focused/full result evidence를 기록하고 current Step만 갱신한다.
## 금지사항
- Result record type 또는 HDF5 schema를 이 Step에서 새로 만들지 마라.
- Location averaging, Abaqus point relabeling, drilling recovery/energy를 추가하지 마라.
- Reaction을 shell resultants의 별도 합으로 정의하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
@@ -1,53 +0,0 @@
# Step 11: Shell HDF5 Output
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Requirements 039-048
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Section 6 exact schema
- `../../docs/linear-static-mitc4-shell/README.md`
- phase indexes, `step11.md`, completed Steps 9/10 paths and summaries
- `/include/fesa/results/results_writer.hpp`
- `/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`
## 작업
1. `MITC4-H5-001..004`를 먼저 작성한다.
2. Generic `ResultsWriter::write(path,Domain,AnalysisState,diagnostics)` 경계를 유지한다.
3. I/O contract exact metadata, four-node element identity, director/frame,
materials/sections, masks/prescribed values, fixed locations와 all mandatory shell
result/global datasets를 schema v0에 additive하게 기록한다.
4. Exact shapes/dtypes/component attributes/unit dimensions/coordinate/location/step/frame
identity와 finite/order를 self-check한다.
5. Output request와 무관하게 mandatory inventory를 기록하고 drilling paths/S33/S13/S23를
만들지 않는다.
6. Existing same-directory temp, flush/close, read-only reopen/self-check, atomic replace를 재사용한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Missing shell schema/atomic validation RED 후 minimal GREEN. 이후:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
RED/schema/focused/full evidence를 기록하고 current Step 상태 payload만 갱신한다.
## 금지사항
- B33 dataset 의미를 migrate/reinterpret하지 마라.
- CSV를 solver output으로 만들거나 partial final HDF5를 남기지 마라.
- Drilling/calibration output을 추가하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
@@ -1,53 +0,0 @@
# Step 12: Shell Linear Static Flow
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Requirements 024-030/051/057
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` CLI/diagnostic contract
- `../../docs/linear-static-mitc4-shell/README.md`
- phase indexes, `step12.md`, completed Steps 7-11 paths and summaries
- `/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`
- `/include/fesa/app/fesa_application.hpp`와 implementation은 dispatch 확인용
## 작업
1. `MITC4-FLOW-001..004` integration tests를 먼저 작성한다.
2. Shell Domain을 existing eight-hook `Analysis::run()` lifecycle에 연결한다.
3. Stiffness assemble/partition, `Kff` factorize, load/effective RHS, substitute,
full displacement reconstruct, full residual/physical recovery, validated state/output
commit 순서를 유지하고 factorization은 exactly once다.
4. Nonzero prescribed displacement의 `Ff-Kfc*dc`, singular support failure,
all-constrained `0x0 Kff` success를 검증한다.
5. CLI syntax와 exit 0/2/3/4/5/6 semantics를 유지하며 shell input도 같은
`fesa.exe <model.inp> --output <results.h5>` route를 사용한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Shell pipeline RED를 확인하고 minimal GREEN. 이후:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
RED/lifecycle/focused/full evidence를 기록하고 current Step 상태 payload만 갱신한다.
## 금지사항
- Analysis lifecycle을 재정렬하거나 0x0 Kff를 singular로 바꾸지 마라.
- Nonlinear procedure, distributed load, mixed beam-shell execution을 추가하지 마라.
- Candidate validation 전 state/output을 commit하지 마라.
- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.
@@ -1,71 +0,0 @@
# Step 13: Shell Reference Comparison
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Requirements 053/058-072
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Section 7
- `../../docs/linear-static-mitc4-shell/README.md`
- phase indexes, `step13.md`, completed Steps 11/12 paths and summaries
- `/tests/reference/reference_comparison.hpp`와 cpp/test는 B33 identity/report precedent
- Candidate new `/tests/reference/mitc4_reference_comparison.hpp`
- Candidate new `/tests/reference/mitc4_reference_comparison.cpp`
- Candidate new `/tests/reference/mitc4_reference_comparison_test.cpp`
- Candidate new `/tests/reference/mitc4_reference_cases_test.cpp`
- `/tests/CMakeLists.txt`
- Read-only:
`/reference/shell/shell.inp`,
`/reference/shell/shell displacements.csv`
## 작업
1. 기존 `MITC4-REF-003`을 먼저 고정 절대 tolerance boundary test로 바꾸고 현재
scale-dependent comparator에서 예상대로 실패하는 RED를 확인한다. 나머지
`MITC4-REF-001..006`, `MITC4-E2E-S4-001/002` coverage는 유지한다.
2. Test-only comparator는 각 case의 exact input/displacement CSV와 FESA HDF5만 요구한다.
`Part Instance Name`와 `Node Label`을 HDF5 node identity에 match하고 CSV
`U-U1..U-U3, UR-UR1..UR-UR3`를 displacement columns 0..5에 match한다.
3. Header/schema/row set/missing/extra/duplicate/nonfinite/source identity를 numeric
comparison 전에 fail한다.
4. 모든 matched U/UR row에 고정 절대 tolerance `1.0e-5`를 scale/clamp/row denominator
없이 적용한다. Reference scale은 report diagnostic으로만 남길 수 있다.
U1/U2/U3만 blocking이고 UR1/UR2/UR3 exceedance는 deterministic warning-only다.
5. 모든 row decision, max absolute, normalized, RMS, vector norm, worst source row/component를
deterministic report/JSON에 남긴다.
6. S4 HDF5가 source type `S4`와 `FESA-MITC4` full-integration rule을 기록하는지
검증한다. S4R common-path/source-metadata coverage는 완료된 Steps 1/7/11 tests가
소유하며 이 Step은 S4R Abaqus artifact를 소비하지 않는다.
7. Declared case가 solver production defect를 드러내면 current Step을 중단하고
Correction/Coordinator에 owning prior module로 handoff한다. 이 Step에서 그 production
file을 수정하지 않는다.
## Acceptance Criteria
먼저 exact expected hashes를 검증한다.
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
기존 mixed-tolerance 구현에 대한 fixed-boundary RED를 확인하고 test-only minimal GREEN. 이후:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
RED/comparator/E2E/full/hash evidence를 기록하고 current Step 상태 payload만 갱신한다.
## 금지사항
- Abaqus/reference solver를 실행하거나 reference 파일을 생성·수정·rename·repair하지 마라.
- README, metadata.json, provenance, Abaqus version을 gate로 만들지 마라.
- UR warning을 blocking으로 바꾸거나 고정 `1.0e-5`를 scale/calibration/clamp로 대체하지 마라.
- B33 comparator 또는 B33 tolerance를 수정하지 마라.
- Reaction/stress equality gate나 Abaqus formulation equivalence를 추가하지 마라.
- Solver production file을 수정하거나 직접 commit/hook 실행을 하지 마라.
-52
View File
@@ -1,52 +0,0 @@
# Step 2: Shell Director Geometry
> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다.
> 현재 구현과 검증 한계는 [기능 요약](../../docs/linear-static-mitc4-shell/README.md)을 따른다.
## 읽어야 할 파일
- `/AGENTS.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`
- `../../docs/solver-core/README.md`, `../../docs/solver-core/README.md`, `/.codex/hooks.json`
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/README.md` Requirements 011-016/050/051/054
- `../../docs/linear-static-mitc4-shell/README.md`
- `../../docs/linear-static-mitc4-shell/formulation.md` Sections 4, 9, 17
- `../../docs/linear-static-mitc4-shell/README.md` Sections 5.2, 5.5, 6.1
- `../../docs/linear-static-mitc4-shell/README.md` Sections 3.3, 8-9
- `../../docs/linear-static-mitc4-shell/README.md`
- phase indexes, `step2.md`, Step 0-1 modified paths/summaries
- Candidate new `/include/fesa/model/shell_geometry.hpp`
- Candidate new `/src/fesa/model/shell_geometry.cpp`
- Candidate new `/tests/unit/model/shell_geometry_test.cpp`
- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt`
## 작업
1. `MITC4-GEO-001..004`를 먼저 작성하고 CMake에 test source를 등록한다.
2. Backend-neutral model geometry module에 element normal candidate, deterministic
area-weighted nodal director, pairwise positive orientation, right-handed nodal
tangent frame with documented axis tie-break, structured validation seam을 만든다.
3. Center, eight stiffness points, four tying points, four committed recovery points에서
finite bases, nonzero surface measure, positive finite Jacobian을 검사한다.
4. Valid planar/rotated/warped cases와 duplicate, bow-tie, zero-area, reversed,
nonfinite, nonpositive-J, opposed-normal cases를 검증한다.
## Acceptance Criteria
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
Expected missing geometry API/behavior RED를 확인한 뒤 minimal GREEN. 이후:
과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다.
## 검증 및 상태 갱신
RED/VERIFY evidence를 summary에 남기고 현재 Step 상태만 갱신한다. Executor-owned
timestamp/retry/commit/advancement를 쓰지 않는다.
## 금지사항
- Calibrated smooth angle, warp/distortion threshold, NR-O03/NR-O04를 추가하지 마라.
- Parser keyword policy나 element stiffness를 구현하지 마라.
- Invalid geometry를 clamp/repair하지 마라.
- Reference/upstream 문서를 수정하거나 직접 commit/hook 실행을 하지 마라.

Some files were not shown because too many files have changed in this diff Show More