diff --git a/.gitignore b/.gitignore index 6f7db5e..9c998cf 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/AGENTS.md b/AGENTS.md index 9a9ae45..e9a15d3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,6 +12,7 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존 ├── CLAUDE.md → 같은 내용의 작업 진입점 ├── docs/ │ ├── README.md → 기능별 기술 요약 색인 +│ ├── development-context.md → 읽기 범위와 컨텍스트 예상량 │ ├── solver-core/README.md → 공통 구조·I/O·수치 기준·빌드 방법 │ └── / → 기능 요약과 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//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`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다. diff --git a/CLAUDE.md b/CLAUDE.md index 9a9ae45..e9a15d3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,6 +12,7 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존 ├── CLAUDE.md → 같은 내용의 작업 진입점 ├── docs/ │ ├── README.md → 기능별 기술 요약 색인 +│ ├── development-context.md → 읽기 범위와 컨텍스트 예상량 │ ├── solver-core/README.md → 공통 구조·I/O·수치 기준·빌드 방법 │ └── / → 기능 요약과 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//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`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다. diff --git a/HANDOFF.md b/HANDOFF.md deleted file mode 100644 index 8a59fdf..0000000 --- a/HANDOFF.md +++ /dev/null @@ -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하지 않았다. diff --git a/docs/README.md b/docs/README.md index dcbc5f5..6813fe4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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) diff --git a/docs/calculation-performance/README.md b/docs/calculation-performance/README.md index 4474217..c0b6f28 100644 --- a/docs/calculation-performance/README.md +++ b/docs/calculation-performance/README.md @@ -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는 별도 작업으로 남긴다. diff --git a/docs/cpp-object-oriented-modular-refactoring/README.md b/docs/cpp-object-oriented-modular-refactoring/README.md index ba5b085..2832bac 100644 --- a/docs/cpp-object-oriented-modular-refactoring/README.md +++ b/docs/cpp-object-oriented-modular-refactoring/README.md @@ -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 동일성을 보장하지 않는다. diff --git a/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md b/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md index 0dbbeca..9fc6954 100644 --- a/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md +++ b/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md @@ -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#병합-결과와-검증-범위)에 정리했다. diff --git a/docs/development-context.md b/docs/development-context.md new file mode 100644 index 0000000..772d610 --- /dev/null +++ b/docs/development-context.md @@ -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·반복 실행 로그는 +필요한 구간을 먼저 검색하고, 수식 변경에는 관련 유도·가정·실패 경계와 독립 검증을 생략하지 않는다. diff --git a/docs/hex8-structural-analysis/formulation.md b/docs/hex8-structural-analysis/formulation.md index f3748a6..81109fe 100644 --- a/docs/hex8-structural-analysis/formulation.md +++ b/docs/hex8-structural-analysis/formulation.md @@ -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는 diff --git a/docs/hex8-structural-analysis/precision-formulation.md b/docs/hex8-structural-analysis/precision-formulation.md index ac1ab9e..995cc76 100644 --- a/docs/hex8-structural-analysis/precision-formulation.md +++ b/docs/hex8-structural-analysis/precision-formulation.md @@ -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), 판정 원본은 diff --git a/docs/hht-implicit-dynamics/README.md b/docs/hht-implicit-dynamics/README.md index dc9949a..30bb178 100644 --- a/docs/hht-implicit-dynamics/README.md +++ b/docs/hht-implicit-dynamics/README.md @@ -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)을 따른다. +이 실행 범위 변경은 정식화·허용치·시간수렴 요구 자체의 변경이 아니다. diff --git a/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md b/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md index a1f6094..d3ca61a 100644 --- a/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md +++ b/docs/hht-implicit-dynamics/formulation-acceleration-recovery.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 | 모델/조작 | 반드시 확인할 결과 | | --- | --- | --- | diff --git a/docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md b/docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md index 76a7120..c2c16d3 100644 --- a/docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md +++ b/docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md @@ -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. 적용 가정과 보존량 diff --git a/docs/hht-implicit-dynamics/formulation-carried-a-noise.md b/docs/hht-implicit-dynamics/formulation-carried-a-noise.md index a9c755d..696bcb2 100644 --- a/docs/hht-implicit-dynamics/formulation-carried-a-noise.md +++ b/docs/hht-implicit-dynamics/formulation-carried-a-noise.md @@ -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. 실제 연산 경로 diff --git a/docs/hht-implicit-dynamics/formulation-dae-research-20261012.md b/docs/hht-implicit-dynamics/formulation-dae-research-20261012.md index 54a138b..6bf824e 100644 --- a/docs/hht-implicit-dynamics/formulation-dae-research-20261012.md +++ b/docs/hht-implicit-dynamics/formulation-dae-research-20261012.md @@ -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 선택과 물리 동등성의 조건 diff --git a/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md b/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md index d850705..7c9600f 100644 --- a/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md +++ b/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md @@ -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는 실행하지 않았다. diff --git a/docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md b/docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md index 09a6af8..9fa078a 100644 --- a/docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md +++ b/docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md @@ -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; diff --git a/docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md b/docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md index 0daecf2..2543239 100644 --- a/docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md +++ b/docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md @@ -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의 보고서가 소유하며 본 문서가 스스로 승인하지 않는다. diff --git a/docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md b/docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md index 14dbeda..b1bbe7e 100644 --- a/docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md +++ b/docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md @@ -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 다른 후보와 채택하지 않은 이유 diff --git a/docs/hht-implicit-dynamics/formulation-inertia.md b/docs/hht-implicit-dynamics/formulation-inertia.md index fc7c170..fcfdbbb 100644 --- a/docs/hht-implicit-dynamics/formulation-inertia.md +++ b/docs/hht-implicit-dynamics/formulation-inertia.md @@ -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)을 따르며, 구현의 존재는 최신 전체 수치 검증 통과를 뜻하지 않는다. diff --git a/docs/hht-implicit-dynamics/formulation-momentum-research-20261012.md b/docs/hht-implicit-dynamics/formulation-momentum-research-20261012.md index 20554a3..3711c68 100644 --- a/docs/hht-implicit-dynamics/formulation-momentum-research-20261012.md +++ b/docs/hht-implicit-dynamics/formulation-momentum-research-20261012.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. 가정과 검산 diff --git a/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md b/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md index f8ce340..8aa87b4 100644 --- a/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md +++ b/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md @@ -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의 승인 계약을 참조하며 본 수식 문서가 새로운 영속 문자열을 정하지 않는다. diff --git a/docs/hht-implicit-dynamics/formulation.md b/docs/hht-implicit-dynamics/formulation.md index 5803676..7120902 100644 --- a/docs/hht-implicit-dynamics/formulation.md +++ b/docs/hht-implicit-dynamics/formulation.md @@ -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 `_results.h5`다. `U/UR`, 물리적 `v/a`, `omega/omega_dot`, algorithmic `A`, 반력과 에너지의 **공개 여부 및 영속 schema는 미결정**이다. Algorithmic `A`를 physical acceleration이라는 이름으로 공개해서는 안 된다. 출력 선택과 무관하게 검증에는 서로 구별되는 내부 quantity가 필요하다. +공식 출력은 lexical sibling `_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의 보고서가 소유하며 본 문서가 스스로 승인하지 않는다. diff --git a/docs/linear-static-3d-euler-beam/formulation.md b/docs/linear-static-3d-euler-beam/formulation.md index 6e64706..779bb72 100644 --- a/docs/linear-static-3d-euler-beam/formulation.md +++ b/docs/linear-static-3d-euler-beam/formulation.md @@ -1,5 +1,8 @@ # 3D Isoparametric Euler–Bernoulli Beam Formulation +> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와 +> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다. + ## Metadata - feature_id: `3d-isoparametric-euler-beam` diff --git a/docs/linear-static-mitc4-shell/formulation.md b/docs/linear-static-mitc4-shell/formulation.md index a5bf629..ecb787b 100644 --- a/docs/linear-static-mitc4-shell/formulation.md +++ b/docs/linear-static-mitc4-shell/formulation.md @@ -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 보류를 유지한다. diff --git a/docs/mitc4-shell-feast-eigen/formulation.md b/docs/mitc4-shell-feast-eigen/formulation.md index 679d38f..010a6e8 100644 --- a/docs/mitc4-shell-feast-eigen/formulation.md +++ b/docs/mitc4-shell-feast-eigen/formulation.md @@ -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 이력에서 확인한다. diff --git a/docs/mitc4-shell-feast-eigen2/formulation-eigen.md b/docs/mitc4-shell-feast-eigen2/formulation-eigen.md index 20dff58..27a9411 100644 --- a/docs/mitc4-shell-feast-eigen2/formulation-eigen.md +++ b/docs/mitc4-shell-feast-eigen2/formulation-eigen.md @@ -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)에 따른다. diff --git a/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md b/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md index 127541d..d554302 100644 --- a/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md +++ b/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md @@ -1,5 +1,8 @@ # 질량과 공변 numerical stabilization +> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와 +> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다. + Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)의 적용·채택 경계를 따른다. ## M1. 운동학과 physical stiffness diff --git a/docs/mitc4-shell-feast-eigen2/formulation.md b/docs/mitc4-shell-feast-eigen2/formulation.md index f4dfab5..217454c 100644 --- a/docs/mitc4-shell-feast-eigen2/formulation.md +++ b/docs/mitc4-shell-feast-eigen2/formulation.md @@ -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). diff --git a/docs/nonlinear-static-newton-raphson/README.md b/docs/nonlinear-static-newton-raphson/README.md index 493ea18..771156a 100644 --- a/docs/nonlinear-static-newton-raphson/README.md +++ b/docs/nonlinear-static-newton-raphson/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와 +전용 비교 계약도 구현되어 있지 않으므로 자료 확보만으로 비교를 재개할 수 없다. diff --git a/docs/nonlinear-static-newton-raphson/formulation.md b/docs/nonlinear-static-newton-raphson/formulation.md index 7d376b3..60ded28 100644 --- a/docs/nonlinear-static-newton-raphson/formulation.md +++ b/docs/nonlinear-static-newton-raphson/formulation.md @@ -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 보류를 유지한다. diff --git a/docs/shell-surface-pressure-load/formulation.md b/docs/shell-surface-pressure-load/formulation.md index bfac1b8..30fed7f 100644 --- a/docs/shell-surface-pressure-load/formulation.md +++ b/docs/shell-surface-pressure-load/formulation.md @@ -1,5 +1,8 @@ # Shell Surface Pressure Load Formulation +> 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와 +> 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다. + ## 1. Metadata - feature_id: `shell-surface-pressure-load` diff --git a/docs/shell-transient-heat-transfer/formulation.md b/docs/shell-transient-heat-transfer/formulation.md index 2d5b397..576760d 100644 --- a/docs/shell-transient-heat-transfer/formulation.md +++ b/docs/shell-transient-heat-transfer/formulation.md @@ -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)|`를 저장·입력·반력 항 절댓값 합으로 정규화한다. diff --git a/docs/solver-core/README.md b/docs/solver-core/README.md index eaf35b0..a08195d 100644 --- a/docs/solver-core/README.md +++ b/docs/solver-core/README.md @@ -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와 결과 경계 diff --git a/phases/cpp-object-oriented-modular-refactoring/index.json b/phases/cpp-object-oriented-modular-refactoring/index.json deleted file mode 100644 index d7a0e6a..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/index.json +++ /dev/null @@ -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 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 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" -} \ No newline at end of file diff --git a/phases/cpp-object-oriented-modular-refactoring/step0.md b/phases/cpp-object-oriented-modular-refactoring/step0.md deleted file mode 100644 index a4462b1..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step0.md +++ /dev/null @@ -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의 소유권이다. diff --git a/phases/cpp-object-oriented-modular-refactoring/step1.md b/phases/cpp-object-oriented-modular-refactoring/step1.md deleted file mode 100644 index 5a5d57d..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step1.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step10.md b/phases/cpp-object-oriented-modular-refactoring/step10.md deleted file mode 100644 index 9b086f5..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step10.md +++ /dev/null @@ -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 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step11.md b/phases/cpp-object-oriented-modular-refactoring/step11.md deleted file mode 100644 index 6d5ded4..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step11.md +++ /dev/null @@ -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 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 entries); - const std::vector& 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> 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step12.md b/phases/cpp-object-oriented-modular-refactoring/step12.md deleted file mode 100644 index ab5b0b6..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step12.md +++ /dev/null @@ -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`, 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step13.md b/phases/cpp-object-oriented-modular-refactoring/step13.md deleted file mode 100644 index f9c4ce1..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step13.md +++ /dev/null @@ -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& 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::vector>`, and - `std::vector>`. 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step14.md b/phases/cpp-object-oriented-modular-refactoring/step14.md deleted file mode 100644 index 650958f..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step14.md +++ /dev/null @@ -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 node_indices; - std::vector components_per_node; -}; - -struct ElementStiffnessContribution { - ElementDofLayout layout; - Matrix values; -}; - -struct BeamElementResultRows { - std::vector endpoint_rows; - std::vector gauss_rows; - std::vector stress_rows; -}; - -struct ShellElementResultRows { - std::vector rows; - double physical_strain_energy; -}; - -using ElementResultPayload = - std::variant; - -struct ElementResultBundle { - SourceEntityId source_id; - ElementResultPayload payload; -}; - -class Element { - public: - virtual ~Element() = default; - virtual const ElementDofLayout& DofLayout() const noexcept = 0; - virtual Result ComputeStiffness() const = 0; - virtual Result Recover( - const Vector& full_displacement) const = 0; -}; - -using ElementView = std::vector>; - -class ElementFactory { - public: - Result> Create( - const ElementDefinition& definition, - const Domain& domain) const; -}; -``` - -5. The linear-static candidate owns `std::vector>` 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step15.md b/phases/cpp-object-oriented-modular-refactoring/step15.md deleted file mode 100644 index c7028cb..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step15.md +++ /dev/null @@ -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> 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step16.md b/phases/cpp-object-oriented-modular-refactoring/step16.md deleted file mode 100644 index 6c4fa9c..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step16.md +++ /dev/null @@ -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 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step17.md b/phases/cpp-object-oriented-modular-refactoring/step17.md deleted file mode 100644 index ffaeded..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step17.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step18.md b/phases/cpp-object-oriented-modular-refactoring/step18.md deleted file mode 100644 index 0a99578..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step18.md +++ /dev/null @@ -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> ComputeContributions( - const LoadContext& context) const = 0; -}; - -class ConcentratedNodalLoad final : public Load { - public: - ConcentratedNodalLoad(SourceTargetQuery target, - std::array global_components, - std::size_t source_order); - Result> ComputeContributions( - const LoadContext& context) const override; - - private: - SourceTargetQuery target_; - std::array global_components_; - std::size_t source_order_; -}; -``` - -5. Domain StepDefinition owns loads through `unique_ptr` 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step19.md b/phases/cpp-object-oriented-modular-refactoring/step19.md deleted file mode 100644 index 1a4fb9f..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step19.md +++ /dev/null @@ -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> 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> 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 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`. -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step2.md b/phases/cpp-object-oriented-modular-refactoring/step2.md deleted file mode 100644 index 53ba84e..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step2.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step20.md b/phases/cpp-object-oriented-modular-refactoring/step20.md deleted file mode 100644 index 583c600..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step20.md +++ /dev/null @@ -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` 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step21.md b/phases/cpp-object-oriented-modular-refactoring/step21.md deleted file mode 100644 index 1fc0b5d..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step21.md +++ /dev/null @@ -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 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step22.md b/phases/cpp-object-oriented-modular-refactoring/step22.md deleted file mode 100644 index 58ff2d4..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step22.md +++ /dev/null @@ -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` 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step23.md b/phases/cpp-object-oriented-modular-refactoring/step23.md deleted file mode 100644 index 50711c1..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step23.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step24.md b/phases/cpp-object-oriented-modular-refactoring/step24.md deleted file mode 100644 index a3330a7..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step24.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step3.md b/phases/cpp-object-oriented-modular-refactoring/step3.md deleted file mode 100644 index dacfaa8..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step3.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step4.md b/phases/cpp-object-oriented-modular-refactoring/step4.md deleted file mode 100644 index 78f9221..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step4.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step5.md b/phases/cpp-object-oriented-modular-refactoring/step5.md deleted file mode 100644 index f2a715a..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step5.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step6.md b/phases/cpp-object-oriented-modular-refactoring/step6.md deleted file mode 100644 index 6357517..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step6.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step7.md b/phases/cpp-object-oriented-modular-refactoring/step7.md deleted file mode 100644 index 36db03f..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step7.md +++ /dev/null @@ -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 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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step8.md b/phases/cpp-object-oriented-modular-refactoring/step8.md deleted file mode 100644 index 5bdd627..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step8.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/cpp-object-oriented-modular-refactoring/step9.md b/phases/cpp-object-oriented-modular-refactoring/step9.md deleted file mode 100644 index 271e2b2..0000000 --- a/phases/cpp-object-oriented-modular-refactoring/step9.md +++ /dev/null @@ -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를 수동 실행하지 마라. diff --git a/phases/index.json b/phases/index.json deleted file mode 100644 index 4875989..0000000 --- a/phases/index.json +++ /dev/null @@ -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" - } - ] -} \ No newline at end of file diff --git a/phases/linear-static-3d-euler-beam/index.json b/phases/linear-static-3d-euler-beam/index.json deleted file mode 100644 index 8c2afa5..0000000 --- a/phases/linear-static-3d-euler-beam/index.json +++ /dev/null @@ -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" -} diff --git a/phases/linear-static-3d-euler-beam/step0.md b/phases/linear-static-3d-euler-beam/step0.md deleted file mode 100644 index 98a8a43..0000000 --- a/phases/linear-static-3d-euler-beam/step0.md +++ /dev/null @@ -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를 관리한다. diff --git a/phases/linear-static-3d-euler-beam/step1.md b/phases/linear-static-3d-euler-beam/step1.md deleted file mode 100644 index 078d396..0000000 --- a/phases/linear-static-3d-euler-beam/step1.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step10.md b/phases/linear-static-3d-euler-beam/step10.md deleted file mode 100644 index a965806..0000000 --- a/phases/linear-static-3d-euler-beam/step10.md +++ /dev/null @@ -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 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 firstAxis; std::vector> sectionPoints; -}; -struct EulerBeam3DDefinition { - SourceEntityId sourceId; std::array 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 boundaries; - std::vector 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step11.md b/phases/linear-static-3d-euler-beam/step11.md deleted file mode 100644 index 8eafe4d..0000000 --- a/phases/linear-static-3d-euler-beam/step11.md +++ /dev/null @@ -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 value; }; -struct DataLine { std::vector fields; SourceLocation location; }; -struct KeywordBlock { - std::string canonicalName; - std::string originalLine; - std::vector parameters; - std::vector data; - SourceLocation location; -}; -struct ParsedInput { std::vector blocks; }; -class AbaqusInputReader { -public: - Result 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step12.md b/phases/linear-static-3d-euler-beam/step12.md deleted file mode 100644 index 0fcf4a7..0000000 --- a/phases/linear-static-3d-euler-beam/step12.md +++ /dev/null @@ -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 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`, `-10`과 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step13.md b/phases/linear-static-3d-euler-beam/step13.md deleted file mode 100644 index 88ba591..0000000 --- a/phases/linear-static-3d-euler-beam/step13.md +++ /dev/null @@ -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 create(const Domain& domain); - const Domain& domain() const noexcept; - const StaticStepDefinition& step() const noexcept; - const std::vector& activeElements() const noexcept; - const std::vector& activeMaterials() const noexcept; - const std::vector& activeSections() const noexcept; - const std::vector& activeBoundaryConditions() const noexcept; - const std::vector& activeLoads() const noexcept; -}; -``` - -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step14.md b/phases/linear-static-3d-euler-beam/step14.md deleted file mode 100644 index b68dc2d..0000000 --- a/phases/linear-static-3d-euler-beam/step14.md +++ /dev/null @@ -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 rowOffsets; - std::vector columnIndices; }; -class DofManager { -public: - static Result create(const AnalysisModel& model); - std::size_t fullDofCount() const noexcept; - std::size_t freeDofCount() const noexcept; - std::size_t constrainedDofCount() const noexcept; - std::size_t fullDof(EntityIndex node, DofComponent component) const; - std::optional freeEquation(std::size_t fullDof) const; - const std::array& elementScatter(EntityIndex element) const; - const std::vector& freeDofs() const noexcept; - const std::vector& constrainedDofs() const noexcept; - const Vector& prescribedValues() const noexcept; - const SparsePattern& sparsePattern() const noexcept; -}; -``` - -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step15.md b/phases/linear-static-3d-euler-beam/step15.md deleted file mode 100644 index 6582cd0..0000000 --- a/phases/linear-static-3d-euler-beam/step15.md +++ /dev/null @@ -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 endAction; - std::array sectionResultant; }; -struct GaussResultRow { EntityIndex element; int gaussPoint; - std::array generalizedStrain; - std::array generalizedResultant; }; -struct StressS11Row { EntityIndex element; int gaussPoint; std::size_t sectionPoint; - double x1; double x2; double s11; std::string source; }; -class AnalysisState { -public: - static AnalysisState create(const DofManager& dofs, StepFrameIdentity identity); - Vector& displacement() noexcept; - 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step16.md b/phases/linear-static-3d-euler-beam/step16.md deleted file mode 100644 index ceaa813..0000000 --- a/phases/linear-static-3d-euler-beam/step16.md +++ /dev/null @@ -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, 2> equilibriumEndActions; - std::array, 2> endpointSectionResultants; - std::array, 2> gaussGeneralizedStrains; - std::array, 2> gaussGeneralizedResultants; - std::vector stressPoints; -}; -class EulerBeam3D { -public: - static Result 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step17.md b/phases/linear-static-3d-euler-beam/step17.md deleted file mode 100644 index c5047ce..0000000 --- a/phases/linear-static-3d-euler-beam/step17.md +++ /dev/null @@ -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& 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step18.md b/phases/linear-static-3d-euler-beam/step18.md deleted file mode 100644 index 75a0f72..0000000 --- a/phases/linear-static-3d-euler-beam/step18.md +++ /dev/null @@ -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 fromCoo(std::size_t rows, std::size_t columns, - std::vector contributions, - const SparsePattern& expectedPattern); - std::size_t rows() const noexcept; - std::size_t columns() const noexcept; - const std::vector& rowOffsets() const noexcept; - const std::vector& columnIndices() const noexcept; - const std::vector& values() const noexcept; - Vector multiply(const Vector& rhs) const; - Status validate() const; -}; -``` - -`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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step19.md b/phases/linear-static-3d-euler-beam/step19.md deleted file mode 100644 index e987384..0000000 --- a/phases/linear-static-3d-euler-beam/step19.md +++ /dev/null @@ -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 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step2.md b/phases/linear-static-3d-euler-beam/step2.md deleted file mode 100644 index f172369..0000000 --- a/phases/linear-static-3d-euler-beam/step2.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step20.md b/phases/linear-static-3d-euler-beam/step20.md deleted file mode 100644 index edc1246..0000000 --- a/phases/linear-static-3d-euler-beam/step20.md +++ /dev/null @@ -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_; -}; -``` - -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step21.md b/phases/linear-static-3d-euler-beam/step21.md deleted file mode 100644 index bcaca94..0000000 --- a/phases/linear-static-3d-euler-beam/step21.md +++ /dev/null @@ -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 assembleFullNodalLoad(const AnalysisModel& model, - const DofManager& dofs); - static Result 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step22.md b/phases/linear-static-3d-euler-beam/step22.md deleted file mode 100644 index 5e39649..0000000 --- a/phases/linear-static-3d-euler-beam/step22.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step23.md b/phases/linear-static-3d-euler-beam/step23.md deleted file mode 100644 index cfbee8b..0000000 --- a/phases/linear-static-3d-euler-beam/step23.md +++ /dev/null @@ -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& diagnostics) = 0; -}; -class Hdf5ResultsWriter final : public ResultsWriter { -public: - Status write(const std::filesystem::path& outputPath, - const Domain& domain, - const AnalysisState& state, - const std::vector& diagnostics) override; -}; -``` - -다음 group/dataset을 exact path와 승인 shape/component order로 기록한다. - -```text -/metadata -/model/nodes -/model/elements -/steps//frames/0/nodal/displacement -/steps//frames/0/nodal/reaction -/steps//frames/0/element/end_force_local -/steps//frames/0/element/section_resultant -/steps//frames/0/element/generalized_strain -/steps//frames/0/element/generalized_resultant -/steps//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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step24.md b/phases/linear-static-3d-euler-beam/step24.md deleted file mode 100644 index f86c80d..0000000 --- a/phases/linear-static-3d-euler-beam/step24.md +++ /dev/null @@ -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& 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 --output `와 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step25.md b/phases/linear-static-3d-euler-beam/step25.md deleted file mode 100644 index 12b2bcc..0000000 --- a/phases/linear-static-3d-euler-beam/step25.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step26.md b/phases/linear-static-3d-euler-beam/step26.md deleted file mode 100644 index 8f0e718..0000000 --- a/phases/linear-static-3d-euler-beam/step26.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step27.md b/phases/linear-static-3d-euler-beam/step27.md deleted file mode 100644 index 2542534..0000000 --- a/phases/linear-static-3d-euler-beam/step27.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step28.md b/phases/linear-static-3d-euler-beam/step28.md deleted file mode 100644 index b520270..0000000 --- a/phases/linear-static-3d-euler-beam/step28.md +++ /dev/null @@ -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을 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step3.md b/phases/linear-static-3d-euler-beam/step3.md deleted file mode 100644 index d5b89a5..0000000 --- a/phases/linear-static-3d-euler-beam/step3.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step4.md b/phases/linear-static-3d-euler-beam/step4.md deleted file mode 100644 index 90b225b..0000000 --- a/phases/linear-static-3d-euler-beam/step4.md +++ /dev/null @@ -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//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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step5.md b/phases/linear-static-3d-euler-beam/step5.md deleted file mode 100644 index 4523f8c..0000000 --- a/phases/linear-static-3d-euler-beam/step5.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step6.md b/phases/linear-static-3d-euler-beam/step6.md deleted file mode 100644 index eefea4d..0000000 --- a/phases/linear-static-3d-euler-beam/step6.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step7.md b/phases/linear-static-3d-euler-beam/step7.md deleted file mode 100644 index ae54c68..0000000 --- a/phases/linear-static-3d-euler-beam/step7.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step8.md b/phases/linear-static-3d-euler-beam/step8.md deleted file mode 100644 index 3a40f8b..0000000 --- a/phases/linear-static-3d-euler-beam/step8.md +++ /dev/null @@ -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 diagnostics); - bool isOk() const noexcept; - const std::vector& diagnostics() const noexcept; -}; -template class Result; -``` - -`Result`는 성공 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가 담당한다. diff --git a/phases/linear-static-3d-euler-beam/step9.md b/phases/linear-static-3d-euler-beam/step9.md deleted file mode 100644 index 519d471..0000000 --- a/phases/linear-static-3d-euler-beam/step9.md +++ /dev/null @@ -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가 담당한다. diff --git a/phases/linear-static-mitc4-shell/index.json b/phases/linear-static-mitc4-shell/index.json deleted file mode 100644 index 400c99a..0000000 --- a/phases/linear-static-mitc4-shell/index.json +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/phases/linear-static-mitc4-shell/step0.md b/phases/linear-static-mitc4-shell/step0.md deleted file mode 100644 index 41816b0..0000000 --- a/phases/linear-static-mitc4-shell/step0.md +++ /dev/null @@ -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를 실행하지 마라. diff --git a/phases/linear-static-mitc4-shell/step1.md b/phases/linear-static-mitc4-shell/step1.md deleted file mode 100644 index 925e120..0000000 --- a/phases/linear-static-mitc4-shell/step1.md +++ /dev/null @@ -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` 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 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step10.md b/phases/linear-static-mitc4-shell/step10.md deleted file mode 100644 index 44cbadf..0000000 --- a/phases/linear-static-mitc4-shell/step10.md +++ /dev/null @@ -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 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step11.md b/phases/linear-static-mitc4-shell/step11.md deleted file mode 100644 index 619f1ce..0000000 --- a/phases/linear-static-mitc4-shell/step11.md +++ /dev/null @@ -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 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step12.md b/phases/linear-static-mitc4-shell/step12.md deleted file mode 100644 index 3b5d877..0000000 --- a/phases/linear-static-mitc4-shell/step12.md +++ /dev/null @@ -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 --output ` 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 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step13.md b/phases/linear-static-mitc4-shell/step13.md deleted file mode 100644 index ef272da..0000000 --- a/phases/linear-static-mitc4-shell/step13.md +++ /dev/null @@ -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 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step2.md b/phases/linear-static-mitc4-shell/step2.md deleted file mode 100644 index 0f16f09..0000000 --- a/phases/linear-static-mitc4-shell/step2.md +++ /dev/null @@ -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 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step3.md b/phases/linear-static-mitc4-shell/step3.md deleted file mode 100644 index 970c70e..0000000 --- a/phases/linear-static-mitc4-shell/step3.md +++ /dev/null @@ -1,55 +0,0 @@ -# Step 3: MITC4 Kinematics and Constitutive Law - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../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 031-038/050-052 -- `../../docs/linear-static-mitc4-shell/README.md` -- `../../docs/linear-static-mitc4-shell/formulation.md` Sections 3-11, 17 -- `../../docs/linear-static-mitc4-shell/README.md` Sections 5.1-5.6, 6.1-6.2 -- `../../docs/linear-static-mitc4-shell/README.md` -- `../../docs/linear-static-mitc4-shell/README.md` -- phase indexes, `step3.md`, Step 2 geometry paths/summary -- `/include/fesa/elements/euler_beam_3d.hpp`와 cpp는 concrete value-kernel style 참고용 -- Candidate new `/include/fesa/elements/mitc4_shell.hpp` -- Candidate new `/src/fesa/elements/mitc4_shell.cpp` -- Candidate new `/tests/unit/elements/mitc4_shell_test.cpp` -- source/test CMakeLists - -## 작업 - -1. `MITC4-KIN-001..005` tests를 먼저 작성한다. -2. Public common Element hierarchy 없이 concrete `Mitc4Shell` value type을 만든다. -3. Candidate creation seam은 four nodes, four initial directors, `ShellSection`, - `LinearElasticMaterial`을 받아 validated `Result`을 반환한다. -4. Shape/derivative identities, local frames, `T_p`/`T_d` channel maps, direct - membrane/bending columns, four covariant MITC edge-midpoint tying samples와 - interpolation weights, engineering shear factors를 구현한다. -5. `C_ps`, `C_5`, `A`, `D`, `A_s`의 exact coefficients, dimensions, symmetry, - positive definiteness와 unit rescaling을 구현한다. -6. `2x2x2` Gauss point/weight order를 고정하고 intermediate physical matrices는 - 20 DOF contract를 유지한다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected missing kernel/kinematics RED를 기록한 뒤 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -현재 Step의 RED와 focused/full evidence만 기록하고 상태 payload만 갱신한다. - -## 금지사항 - -- Global assembly, drilling stiffness, recovery/HDF5를 구현하지 마라. -- S4R source type으로 quadrature를 분기하지 마라. -- Nonlinear state/residual/tangent를 구현하지 마라. -- Vendor type을 public header에 노출하거나 직접 commit/hook 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step4.md b/phases/linear-static-mitc4-shell/step4.md deleted file mode 100644 index 64e03c8..0000000 --- a/phases/linear-static-mitc4-shell/step4.md +++ /dev/null @@ -1,49 +0,0 @@ -# Step 4: MITC4 Stiffness and Drilling Stabilization - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../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 031-038/050-056 -- `../../docs/linear-static-mitc4-shell/README.md` -- `../../docs/linear-static-mitc4-shell/formulation.md` Sections 10-14, 17 -- `../../docs/linear-static-mitc4-shell/README.md` Sections 5.7, 6.1-6.2 -- `../../docs/linear-static-mitc4-shell/README.md` -- `../../docs/linear-static-mitc4-shell/README.md` -- phase indexes, `step4.md`, completed Step 3 kernel/header/test and summary - -## 작업 - -1. `MITC4-KERNEL-001..006`를 production edit 전에 작성한다. -2. Common `2x2x2` integration으로 physical `K20`을 만들고 deterministic - 20-to-24 congruence로 global-coordinate `K24 physical`을 만든다. -3. `R+`는 eight physical tangent-rotation diagonal의 finite positive values만 - 사용하고 `k_ref=min(R+)`, `k_d=1e-3*k_ref`, - `K_drill=T_d^T(k_d I4)T_d`를 정확히 구현한다. -4. Empty/nonfinite `R+`는 structured deterministic failure다. -5. Scaled symmetry <=1e-12, transform energy <=1e-12, physical rigid action <=1e-10, - physical rank 14, stabilized rank 18/nullity 6, positive non-rigid energy, - membrane/bending/shear/twist patch fields를 독립 test로 검증한다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected missing stiffness/drilling RED를 확인한 뒤 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -RED/VERIFY evidence와 exact formula를 summary에 기록하고 현재 Step 상태만 갱신한다. - -## 금지사항 - -- Translational diagonal을 `R+`에 넣지 마라. -- Coefficient sweep, calibration, drill energy/result, physical recovery를 구현하지 마라. -- S4R reduced integration/hourglass와 future nonlinear tangent를 구현하지 마라. -- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step5.md b/phases/linear-static-mitc4-shell/step5.md deleted file mode 100644 index 22775a5..0000000 --- a/phases/linear-static-mitc4-shell/step5.md +++ /dev/null @@ -1,48 +0,0 @@ -# Step 5: MITC4 Physical 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 035/042-046/052/056 -- `../../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` result component/location order -- `../../docs/linear-static-mitc4-shell/README.md` -- phase indexes, `step5.md`, completed Steps 3-4 kernel/header/test and summaries - -## 작업 - -1. `MITC4-KERNEL-007`과 `MITC4-PHYSREC-001`을 먼저 작성한다. -2. `Mitc4Shell` 내부에 global element displacement 24개를 받아 physical-only - shell recovery를 반환하는 candidate seam을 최소 구현한다. -3. Fixed GP1..GP4에서 local frame, eight generalized strain/resultant를 계산하고 - BOTTOM/MIDDLE/TOP에서 direct `[S11,S22,S12]`를 계산한다. -4. Physical element strain energy만 반환하며 drilling stiffness/action은 모든 - physical recovery와 energy에서 제외한다. -5. Pure drill vector가 stabilized action은 가지지만 모든 physical recovery/energy가 - zero임을 검증한다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected missing recovery seam/pure-drill exclusion RED 후 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -현재 Step만 status/summary payload를 갱신하고 RED/GREEN/VERIFY를 기록한다. - -## 금지사항 - -- AnalysisState/global result rows, ResultRecovery orchestration, HDF5를 수정하지 마라. -- Drilling output/stress/resultant/energy를 추가하지 마라. -- Location averaging 또는 Abaqus integration-point identity를 만들지 마라. -- 직접 commit/hook 실행이나 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step6.md b/phases/linear-static-mitc4-shell/step6.md deleted file mode 100644 index 91ea6ab..0000000 --- a/phases/linear-static-mitc4-shell/step6.md +++ /dev/null @@ -1,49 +0,0 @@ -# Step 6: Shell DOF Scatter - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../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 005/025 -- `../../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` -- phase indexes, `step6.md`, Step 0 shell model and Step 5 summary -- `/include/fesa/fem/dof_manager.hpp`, `/src/fesa/fem/dof_manager.cpp` -- `/tests/unit/fem/dof_manager_test.cpp` -- `/tests/unit/constraints/essential_constraints_test.cpp` - -## 작업 - -1. `MITC4-DOF-001..003` tests를 먼저 작성한다. -2. 기존 node DOF order `[ux,uy,uz,urx,ury,urz]`를 유지한다. -3. B33 12-entry scatter를 보존하면서 shell four-node/source-order 24-entry typed - scatter와 sorted unique sparse pattern을 `DofManager` 단독 소유로 추가한다. -4. Free/constrained numbering과 no/mixed/all constraint, nonzero prescribed value - round trip을 shell-sized system에서 검증한다. -5. All-constrained `0x0 Kff`가 valid하도록 existing constraint behavior를 보존한다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Current 12-entry-only behavior의 expected RED 뒤 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -RED/VERIFY evidence를 기록하고 current Step의 Codex-owned fields만 갱신한다. - -## 금지사항 - -- Node/Element에 equation id를 저장하지 마라. -- Load/constraint ownership이나 sparse reduction을 이동하지 마라. -- 기존 B33 scatter behavior를 제거하지 마라. -- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step7.md b/phases/linear-static-mitc4-shell/step7.md deleted file mode 100644 index 3cd783c..0000000 --- a/phases/linear-static-mitc4-shell/step7.md +++ /dev/null @@ -1,51 +0,0 @@ -# Step 7: Shell Sparse Assembly - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../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 027/030/037/050/056 -- `../../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` -- phase indexes, `step7.md`, completed Steps 4/6 paths and summaries -- `/include/fesa/assembly/sparse_assembler.hpp` -- `/src/fesa/assembly/sparse_assembler.cpp` -- `/src/fesa/math/sparse_matrix.cpp` -- `/tests/unit/assembly/sparse_assembler_test.cpp` - -## 작업 - -1. `MITC4-ASM-001..003` tests를 먼저 작성한다. -2. Shell topology를 concrete MITC4 global 24x24 stiffness에 dispatch한다. -3. Active source-element order로 worker-owned local buffers를 만들고 element당 - 576 COO entries에 stable `elementOrder`와 `localOrder`를 부여한다. -4. Existing `SparseMatrix::fromCoo` canonical reduction과 every diagonal slot을 - 보존하며 worker가 global CSR을 직접 수정하지 않게 한다. -5. Serial/TBB/repeated run CSR bytes/values를 비교하고 identical semantic S4/S4R - fixtures가 identical K를 만드는지 검증한다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Four-node/24-DOF RED를 확인하고 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -RED와 deterministic focused/full evidence를 summary에 기록하고 current Step만 갱신한다. - -## 금지사항 - -- Worker가 global CSR을 직접 갱신하거나 unordered reduction을 사용하지 마라. -- Source type으로 quadrature/hourglass를 분기하지 마라. -- Load, solve, recovery를 구현하지 마라. -- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step8.md b/phases/linear-static-mitc4-shell/step8.md deleted file mode 100644 index 30780d4..0000000 --- a/phases/linear-static-mitc4-shell/step8.md +++ /dev/null @@ -1,50 +0,0 @@ -# Step 8: Shell Load Validation - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../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 017-020/028 -- `../../docs/linear-static-mitc4-shell/README.md` -- `../../docs/linear-static-mitc4-shell/formulation.md` Sections 8, 13 -- `../../docs/linear-static-mitc4-shell/README.md` -- `../../docs/linear-static-mitc4-shell/README.md` Sections 4.2-4.3 -- `../../docs/linear-static-mitc4-shell/README.md` -- phase indexes, `step8.md`, completed Steps 2/7 paths and summaries -- `/include/fesa/assembly/load_assembler.hpp` -- `/src/fesa/assembly/load_assembler.cpp` -- `/tests/unit/assembly/load_assembler_test.cpp` -- `/tests/unit/constraints/essential_constraints_test.cpp` - -## 작업 - -1. `MITC4-LOAD-001..004`를 먼저 작성한다. -2. Existing global six-DOF full-space CLOAD assembly와 constraint partition을 재사용한다. -3. Node별 global force/moment를 stable source order로 먼저 aggregate한다. -4. Moment가 exact zero면 별도 나눗셈 없이 accept한다. Nonzero면 approved director로 - `rho_M=abs(dot(d,M))/norm(M)`을 계산해 `rho_M<=1e-12`만 accept한다. -5. Rejected moment는 `unsupported-drilling-load`로 RHS/substitution/drill stabilization - 이전에 실패해야 한다. Existing `Ff-Kfc*dc`와 factorization-before-load를 보존한다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Moment projection/diagnostic RED 뒤 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -현재 Step의 RED/GREEN/VERIFY evidence와 exact threshold를 summary에 기록한다. - -## 금지사항 - -- DLOAD/equivalent/follower/distributed load를 구현하지 마라. -- Numerical drilling을 load channel로 사용하지 마라. -- Factorization/load lifecycle을 재정렬하지 마라. -- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step9.md b/phases/linear-static-mitc4-shell/step9.md deleted file mode 100644 index 3d063df..0000000 --- a/phases/linear-static-mitc4-shell/step9.md +++ /dev/null @@ -1,51 +0,0 @@ -# Step 9: Shell Analysis State - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../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 026/041-046/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` Sections 6.3-6.5 -- `../../docs/linear-static-mitc4-shell/README.md` -- phase indexes, `step9.md`, Step 5 recovery types and Step 8 summary -- `/include/fesa/results/result_records.hpp` -- `/include/fesa/analysis/analysis_state.hpp` -- `/src/fesa/analysis/analysis_state.cpp` -- `/tests/unit/results/result_records_test.cpp` - -## 작업 - -1. `MITC4-STATE-001..003`을 먼저 작성한다. -2. Additive shell record types를 정의한다: stable element, GP1..GP4 natural location, - local 3x3 frame, eight generalized strain/resultant, three section positions의 - `[S11,S22,S12]`. -3. AnalysisState에 shell rows, physical strain energy, six equilibrium components, - three normalized verification metrics를 candidate-owned storage로 추가한다. -4. Validated candidate가 완성된 뒤에만 state로 commit하며 invalid/nonfinite/ - inventory mismatch가 기존 state를 바꾸지 않게 한다. -5. Nonlinear director history, iteration, velocity, acceleration을 할당하지 않는다. - -## Acceptance Criteria - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Missing shell state/rollback RED 뒤 minimal GREEN. 이후: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -## 검증 및 상태 갱신 - -RED/VERIFY evidence를 기록하고 현재 Step 상태 payload만 갱신한다. - -## 금지사항 - -- Element calculation, ResultRecovery orchestration, HDF5를 구현하지 마라. -- Nonlinear/dynamic state나 drilling-specific row를 추가하지 마라. -- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/mitc4-shell-feast-eigen-execution-prep/index.json b/phases/mitc4-shell-feast-eigen-execution-prep/index.json deleted file mode 100644 index 363d8d1..0000000 --- a/phases/mitc4-shell-feast-eigen-execution-prep/index.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "project": "FESA Structural Solver", - "phase": "mitc4-shell-feast-eigen-execution-prep", - "steps": [ - { - "step": 0, - "name": "bounded-execution-deadlines", - "status": "blocked", - "owned_paths": [ - ".codex/hooks.json", - "tests/test_execute.py", - "tests/test_harness_timeouts.py", - "docs/solver-core/README.md", - "docs/mitc4-shell-feast-eigen/README.md" - ], - "started_at": "2026-09-06T10:04:44+0900", - "attempt_history": [ - { - "attempt": 1, - "recorded_at": "2026-09-06T10:28:44+0900", - "exit_code": 0, - "reported_status": "blocked", - "reported_reason": "Environment denies the assigned .codex/hooks.json write; registered Stop timeout remains 1800 instead of required 7500.", - "classification": "environment", - "reason": "Codex Windows sandbox helper를 실행할 수 없습니다.", - "diagnostic": "2026-09-06T01:09:28.776688Z ERROR codex_core::tools::router: error=patch rejected: writing outside of the project; rejected by user approval settings\n2026-09-06T01:09:49.032848Z ERROR codex_core::tools::router: error=patch rejected: writing outside of the project; rejected by user approval settings\n2026-09-06T01:10:02.403178Z ERROR codex_core::tools::router: error=patch rejected: writing outside of the project; rejected by user approval settings" - }, - { - "attempt": 2, - "recorded_at": "2026-09-06T15:17:40+0900", - "exit_code": 0, - "reported_status": "error", - "reported_reason": "Full CTest exit 8: 361/362 passed; ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior failed with output-busy outside Step 0 owned paths.", - "classification": "reported-error", - "reason": "Full CTest exit 8: 361/362 passed; ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior failed with output-busy outside Step 0 owned paths.", - "diagnostic": "tside Step 0 owned paths. Full pytest was not run because CTest failed.\\n Registered Stop/Codex terminal exit remains unobserved.\\nfailure_classification: test\\nretry_key: mitc4-shell-feast-eigen|implementation|test|r2\\nattempt: 1\\nescalation_class: null\\nblocker: >\\n Coordinator must classify the output-busy integration failure and authorize any bounded correction\\n or rerun; Step 0 is recorded as error with its prior attempt_history preserved.\\n```\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_44\",\"type\":\"agent_message\",\"text\":\"등록 Stop이 실제로 실행되어 동일한 CTest failure를 다시 확인했습니다(362개 중 1개, exit 8). 이 증거를 Step 보고서에 반영하되, 이미 기록한 `error` 상태와 failure history는 변경하지 않겠습니다.\"}}\n{\"type\":\"item.started\",\"item\":{\"id\":\"item_45\",\"type\":\"file_change\",\"changes\":[{\"path\":\"C:\\\\Users\\\\baram\\\\orca\\\\workspaces\\\\FESADev\\\\Eigen\\\\docs\\\\mitc4-shell-feast-eigen\\\\implementation-prep-evidence.md\",\"kind\":\"update\"}],\"status\":\"in_progress\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_45\",\"type\":\"file_change\",\"changes\":[{\"path\":\"C:\\\\Users\\\\baram\\\\orca\\\\workspaces\\\\FESADev\\\\Eigen\\\\docs\\\\mitc4-shell-feast-eigen\\\\implementation-prep-evidence.md\",\"kind\":\"update\"}],\"status\":\"completed\"}}\n{\"type\":\"item.started\",\"item\":{\"id\":\"item_46\",\"type\":\"command_execution\",\"command\":\"\\\"C:\\\\\\\\Program Files\\\\\\\\WindowsApps\\\\\\\\Microsoft.PowerShell_7.6.5.0_x64__8wekyb3d8bbwe\\\\\\\\pwsh.exe\\\" -Command 'git diff --check; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; $phase = Get-Content -Raw '\\\"'phases/mitc4-shell-feast-eigen-execution-prep/index.json' | ConvertFrom-Json; \\\\\\\"STEP0=\\\"'$($phase.steps[0].status)\\\"; \\\"STOP_TIMEOUT=$((Get-Content -Raw '\\\"'.codex/hooks.json' | ConvertFrom-Json).hooks.Stop[0].hooks[0].timeout)\\\\\\\"\\\"\",\"aggregated_output\":\"\",\"exit_code\":null,\"status\":\"in_progress\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_46\",\"type\":\"command_execution\",\"command\":\"\\\"C:\\\\\\\\Program Files\\\\\\\\WindowsApps\\\\\\\\Microsoft.PowerShell_7.6.5.0_x64__8wekyb3d8bbwe\\\\\\\\pwsh.exe\\\" -Command 'git diff --check; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; $phase = Get-Content -Raw '\\\"'phases/mitc4-shell-feast-eigen-execution-prep/index.json' | ConvertFrom-Json; \\\\\\\"STEP0=\\\"'$($phase.steps[0].status)\\\"; \\\"STOP_TIMEOUT=$((Get-Content -Raw '\\\"'.codex/hooks.json' | ConvertFrom-Json).hooks.Stop[0].hooks[0].timeout)\\\\\\\"\\\"\",\"aggregated_output\":\"warning: in the working copy of '.codex/hooks.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/mitc4-shell-feast-eigen-execution-prep/index.json', LF will be replaced by CRLF the next time Git touches it\\nSTEP0=error\\r\\nSTOP_TIMEOUT=7500\\r\\n\",\"exit_code\":0,\"status\":\"completed\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_47\",\"type\":\"agent_message\",\"text\":\"```yaml\\nfeature_id: mitc4-shell-feast-eigen\\nstage: implementation\\noutcome: retry\\nnext_owner: coordinator-agent\\nevidence_paths:\\n - .codex/hooks.json\\n - docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md\\n - phases/mitc4-shell-feast-eigen-execution-prep/index.json\\nevidence_digest: >\\n Registered Stop also ran full CTest and reproduced the same result: exit 8,\\n 361/362 passed, with only ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior\\n failing as output-busy. Step 0 remains error; Stop timeout is 7500.\\nfailure_classification: test\\nretry_key: mitc4-shell-feast-eigen|implementation|test|r2\\nattempt: 1\\nescalation_class: null\\nblocker: >\\n Output-busy failure is outside Step 0 owned paths; Coordinator must classify and authorize a bounded follow-up.\\n```\"}}\n{\"type\":\"turn.completed\",\"usage\":{\"input_tokens\":11094334,\"cached_input_tokens\":10849280,\"cache_write_input_tokens\":0,\"output_tokens\":21838,\"reasoning_output_tokens\":11305}}" - }, - { - "attempt": 3, - "recorded_at": "2026-09-06T15:59:03+0900", - "exit_code": 0, - "reported_status": "blocked", - "reported_reason": "CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.", - "classification": "reported-blocked", - "reason": "CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.", - "diagnostic": "\\\"):\\n json.loads(Path(value).read_text(encoding=\\\\\\\"utf-8\\\\\\\"))\\nprint(\\\\\\\"JSON_PARSE=0\\\\\\\")\\n'@ | python -B -\\nif (\\\"'$LASTEXITCODE -ne 0) { exit $LASTEXITCODE }\\ngit diff --check\\nif ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }\\ngit diff --name-only\\ngit diff --stat\\ngit status --short --untracked-files=all\\n$phase = Get-Content -LiteralPath '\\\"'phases/mitc4-shell-feast-eigen-execution-prep/index.json' -Raw -Encoding utf8 | ConvertFrom-Json\\nWrite-Output \\\\\\\"STEP0_STATUS=\\\"'$($phase.steps[0].status)\\\"\\nWrite-Output \\\"STEP0_BLOCKER=$($phase.steps[0].blocked_reason)\\\"'\",\"aggregated_output\":\"JSON_PARSE=0\\r\\nwarning: in the working copy of 'docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/mitc4-shell-feast-eigen-execution-prep/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/mitc4-shell-feast-eigen-execution-prep/index.json', LF will be replaced by CRLF the next time Git touches it\\ndocs/mitc4-shell-feast-eigen/implementation-prep-evidence.md\\nphases/index.json\\nphases/mitc4-shell-feast-eigen-execution-prep/index.json\\nwarning: in the working copy of 'docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/mitc4-shell-feast-eigen-execution-prep/index.json', LF will be replaced by CRLF the next time Git touches it\\n .../implementation-prep-evidence.md | 30 ++++++++++++++++++++--\\n phases/index.json | 3 +--\\n .../index.json | 9 +++----\\n 3 files changed, 33 insertions(+), 9 deletions(-)\\nwarning: could not open directory '.pytest_cache/': Permission denied\\n M docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md\\n M phases/index.json\\n M phases/mitc4-shell-feast-eigen-execution-prep/index.json\\nSTEP0_STATUS=blocked\\r\\nSTEP0_BLOCKER=CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.\\r\\n\",\"exit_code\":0,\"status\":\"completed\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_19\",\"type\":\"agent_message\",\"text\":\"feature_id: mitc4-shell-feast-eigen\\nstage: implementation\\noutcome: blocked-environment\\nnext_owner: coordinator-agent\\nevidence_paths:\\n - docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md\\n - docs/mitc4-shell-feast-eigen/corrections.md\\n - phases/mitc4-shell-feast-eigen-execution-prep/index.json\\nevidence_digest: >-\\n Short-TEMP regression passed: classifier 37 passed (6/16/15 cases) and focused\\n suite 136 passed. CMake configure exited 0, but Debug build exited 1 at ZERO_CHECK:\\n MSVC FileTracker raised UnauthorizedAccessException 0x80070005. Per sequential\\n Full VERIFY, CTest discovery/run and full pytest were not run. Step 0 is blocked\\n with history/timestamps preserved.\\nfailure_classification: environment\\nretry_key: mitc4-shell-feast-eigen|implementation|environment|r2\\nattempt: 1\\nescalation_class: null\\nblocker: >-\\n Re-run the configured MSVC build in an environment that permits FileTracker\\n initialization; then restart Full VERIFY from configure.\"}}\n{\"type\":\"turn.completed\",\"usage\":{\"input_tokens\":1529453,\"cached_input_tokens\":1403392,\"cache_write_input_tokens\":0,\"output_tokens\":11597,\"reasoning_output_tokens\":6229}}" - }, - { - "attempt": 4, - "recorded_at": "2026-09-06T17:22:28+0900", - "exit_code": 0, - "reported_status": "error", - "reported_reason": "Ninja CMake build exit 1: CMake GoogleTest discovery for fesa_integration_tests failed at ParseTestList.cmake:96; direct list/JSON and generated discovery-script diagnostics later exited 0, but required CTest and full pytest were not run.", - "classification": "reported-error", - "reason": "Ninja CMake build exit 1: CMake GoogleTest discovery for fesa_integration_tests failed at ParseTestList.cmake:96; direct list/JSON and generated discovery-script diagnostics later exited 0, but required CTest and full pytest were not run.", - "diagnostic": "2026-09-06T07:46:08.505692Z ERROR codex_core::tools::router: error=exec_command failed: CreateProcess { message: \"Rejected(\\\"`\\\\\\\"C:\\\\\\\\\\\\\\\\Program Files\\\\\\\\\\\\\\\\WindowsApps\\\\\\\\\\\\\\\\Microsoft.PowerShell_7.6.5.0_x64__8wekyb3d8bbwe\\\\\\\\\\\\\\\\pwsh.exe\\\\\\\" -Command '$binary = Resolve-Path '\\\\\\\"'.harness/build-ninja-msvc-debug/tests/fesa_integration_tests.exe'; \\\\\\\"'$out = Join-Path (Split-Path $binary) '\\\\\\\"'manual-gtest-output.json'; Remove-Item -LiteralPath \\\\\\\"'$out -Force -ErrorAction SilentlyContinue; & $binary --gt…96 chars truncated…T_OUTPUT_EXIT=$exit\\\\\\\"; if(Test-Path -LiteralPath $out){Get-Item -LiteralPath $out | Format-List FullName,Length,LastWriteTimeUtc; Get-Content -LiteralPath $out -TotalCount 40; try { $p=Get-Content -Raw $out|ConvertFrom-Json; Write-Output \\\\\\\"GTEST_OUTPUT_PARSE=0\\\\\\\" } catch {Write-Output \\\\\\\"GTEST_OUTPUT_PARSE_ERROR=$($_.Exception.Message)\\\\\\\"}} else {Write-Output '\\\\\\\"'GTEST_OUTPUT_MISSING'}; exit \\\\\\\"'$exit'` rejected: blocked by policy\\\")\" }\n2026-09-06T07:48:34.713482Z ERROR codex_core::tools::router: error=apply_patch verification failed: Failed to find expected lines in C:\\Users\\baram\\orca\\workspaces\\FESADev\\Eigen\\docs\\mitc4-shell-feast-eigen\\implementation-prep-evidence.md:\n현재 process의 registered Stop/Codex terminal exit는 미관찰이며, hook을 수동 실행하지 않았다. 환경이 `FileTracker` 초기화에 필요한 접근을 허용한 뒤 동일한 Full VERIFY를 configure부터 재실행해야 한다." - }, - { - "attempt": 5, - "recorded_at": "2026-09-06T22:37:15+0900", - "exit_code": 0, - "reported_status": "blocked", - "reported_reason": "CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.", - "classification": "reported-blocked", - "reason": "CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.", - "diagnostic": "oks.json').read_text(encoding='utf-8'))\\nprint(f\\\\\\\"STOP_TIMEOUT={hooks['hooks']['Stop'][0]['hooks'][0]['timeout']}\\\\\\\")\\n'@ | python -B -\\n\\\"'$parseExit = $LASTEXITCODE\\nif ($parseExit -ne 0) { exit $parseExit }\\ngit diff --check\\n$diffExit = $LASTEXITCODE\\nif ($diffExit -ne 0) { exit $diffExit }\\ngit diff --name-only\\nexit 0'\",\"aggregated_output\":\"\",\"exit_code\":null,\"status\":\"in_progress\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_22\",\"type\":\"command_execution\",\"command\":\"\\\"C:\\\\\\\\Program Files\\\\\\\\WindowsApps\\\\\\\\Microsoft.PowerShell_7.6.5.0_x64__8wekyb3d8bbwe\\\\\\\\pwsh.exe\\\" -Command \\\"@'\\nimport json\\nfrom pathlib import Path\\nfor value in [\\n 'phases/index.json',\\n 'phases/mitc4-shell-feast-eigen-execution-prep/index.json',\\n '.codex/hooks.json',\\n]:\\n json.loads(Path(value).read_text(encoding='utf-8'))\\nprint('JSON_PARSE=0')\\nphase = json.loads(Path('phases/mitc4-shell-feast-eigen-execution-prep/index.json').read_text(encoding='utf-8'))\\nprint(f\\\\\\\"STEP0_STATUS={phase['steps'][0]['status']}\\\\\\\")\\nprint(f\\\\\\\"STEP0_BLOCKER={phase['steps'][0]['blocked_reason']}\\\\\\\")\\nhooks = json.loads(Path('.codex/hooks.json').read_text(encoding='utf-8'))\\nprint(f\\\\\\\"STOP_TIMEOUT={hooks['hooks']['Stop'][0]['hooks'][0]['timeout']}\\\\\\\")\\n'@ | python -B -\\n\\\"'$parseExit = $LASTEXITCODE\\nif ($parseExit -ne 0) { exit $parseExit }\\ngit diff --check\\n$diffExit = $LASTEXITCODE\\nif ($diffExit -ne 0) { exit $diffExit }\\ngit diff --name-only\\nexit 0'\",\"aggregated_output\":\"JSON_PARSE=0\\r\\nSTEP0_STATUS=blocked\\r\\nSTEP0_BLOCKER=CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.\\r\\nSTOP_TIMEOUT=7500\\r\\nwarning: in the working copy of 'docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/mitc4-shell-feast-eigen-execution-prep/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/index.json', LF will be replaced by CRLF the next time Git touches it\\nwarning: in the working copy of 'phases/mitc4-shell-feast-eigen-execution-prep/index.json', LF will be replaced by CRLF the next time Git touches it\\ndocs/mitc4-shell-feast-eigen/implementation-prep-evidence.md\\nphases/index.json\\nphases/mitc4-shell-feast-eigen-execution-prep/index.json\\n\",\"exit_code\":0,\"status\":\"completed\"}}\n{\"type\":\"item.completed\",\"item\":{\"id\":\"item_23\",\"type\":\"agent_message\",\"text\":\"```yaml\\nfeature_id: mitc4-shell-feast-eigen\\nstage: implementation\\noutcome: blocked-environment\\nnext_owner: coordinator-agent\\nevidence_paths:\\n - docs/mitc4-shell-feast-eigen/implementation-prep-evidence.md\\n - phases/mitc4-shell-feast-eigen-execution-prep/index.json\\nevidence_digest: >-\\n Classifier regression 37 passed and timeout regression 4 passed. CMake configure\\n exited 0, but MSVC Debug build exited 1 at ZERO_CHECK because FileTracker raised\\n UnauthorizedAccessException 0x80070005. CTest discovery/run and full pytest were\\n not run per the sequential Full VERIFY contract. Step 0 is blocked; JSON parsing\\n and git diff --check passed.\\nfailure_classification: environment\\nretry_key: mitc4-shell-feast-eigen|implementation|environment|r2\\nattempt: 2\\nescalation_class: null\\nblocker: >-\\n Re-run Full VERIFY from configure in an MSVC environment that permits FileTracker\\n initialization; preserve the existing Step history and Executor-owned phase state.\\n```\"}}\n{\"type\":\"turn.completed\",\"usage\":{\"input_tokens\":1980090,\"cached_input_tokens\":1849856,\"cache_write_input_tokens\":0,\"output_tokens\":10825,\"reasoning_output_tokens\":6109}}" - } - ], - "blocked_reason": "CMake build exit 1: MSVC FileTracker initialization for ZERO_CHECK failed with UnauthorizedAccessException (0x80070005, E_ACCESSDENIED); Full VERIFY stopped before CTest and full pytest.", - "blocked_at": "2026-09-06T22:37:15+0900" - } - ], - "created_at": "2026-09-06T10:04:44+0900" -} diff --git a/phases/mitc4-shell-feast-eigen-execution-prep/step0.md b/phases/mitc4-shell-feast-eigen-execution-prep/step0.md deleted file mode 100644 index c1bf234..0000000 --- a/phases/mitc4-shell-feast-eigen-execution-prep/step0.md +++ /dev/null @@ -1,161 +0,0 @@ -# Step 0: 유한 실행시간 조정과 정상 검증 경로 보존 - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen-execution-prep` -- Requirement: `FEM-REQ-MITC4-EIGEN-023/025`; `MFE-C27`, `IO-T11` -- 이 Step은 운영준비이고 solver physics/C++ 기능 변경이 아니다. - -## 필수 입력 - -Feature 폴더 `docs/mitc4-shell-feast-eigen/`와 다음 management/approved bundle을 읽는다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -[WORKFLOW](../../docs/solver-core/README.md), [환경·activation 상세](../../docs/mitc4-shell-feast-eigen/README.md). -현재 config schema에는 timeout option이 없다. 이번에 새 config field를 만들지 않는다. - -재개 시 [복구 계획](../../docs/mitc4-shell-feast-eigen/README.md)과 -실제 classifier 재현 (당시 경로: 과거 검증 자료(정리됨), 현재 checkout에 없음)을 -한정된 TDD 작업이다. 현재 blocked history와 실제 Hook 쓰기 거부는 그대로 보존한다. -현재 WIP 보존 뒤 별도 Correction Agent가 classifier 소스/테스트와 corrections.md를 먼저 -완성한다. 그 실제 결과·별도 checkpoint 감사·수정 classifier를 읽는 새 process activation이 -완료되기 전 이 prep를 재실행하지 않는다. 재개 Implementation은 선행 RED/GREEN evidence를 -읽고 아래 회귀를 다시 실행하며, 이미 통과한 assertion을 새 RED라고 주장하지 않는다. - -## Owned paths - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -타 owner 변경을 보존한다. `../../docs/solver-core/README.md`는 실제 deadline 값의 설명 문단만 수정하고 workflow/approval/Git/Hook 계약을 바꾸지 않는다. - -## RED - -먼저 `tests/test_harness_timeouts.py`를 작성한다. 실제 hook를 수동 실행하지 않고 기존 Python tests 방식으로 clock/subprocess/adapter를 주입한다. - -1. `StepExecutor._invoke_codex`가 기본14400초를 전달함과 실제 TimeoutExpired가 terminal result 없을 때만 최대2번 재시도되는 것을 검사한다. 기존 `tests/test_execute.py`의1800 message 기대값은 승인 default14400으로 갱신하되 explicit injected1800 exception의 actual timeout message는 그대로 구분한다. -2. `stop_validation.run_validations`에서 새 shared deadline7200이 discovery/toolchain/execute_plan까지 같은 deadline으로 전달되는지 검사한다. Hook entry/reentry/doc-only 정책은 기존 tests로 보존한다. -3. `CommandSpec` default7200 및 `execute_plan` 자체 default7200을 검사한다. Fake elapsed2000 뒤 다음 command cap이 remaining5200이고 explicit cap5이면5를 유지하는지, deadline 만료·nonzero subprocess가 계속 failure인지 확인한다. 실제 대기는 하지 않는다. -4. 등록 Stop timeout7500이 shared7200보다 크며 command/matcher/PreToolUse timeout30이 그대로인지 검사한다. Executor14400>registered7500 관계와 finite positive 값을 확인한다. -5. One-time module invocation은 딱 `StepExecutor.CODEX_TIMEOUT_SECONDS`만 유한14400으로 지정하고 unchanged `execute.main()`을 호출한다는 계약을 mock entry로 검사한다. Sandbox modes/default, MAX_TRANSPORT_ATTEMPTS, ownership/preflight/branch/commit/terminal result는 기존 tests를 유지한다. - -6. `tests/test_execute.py`에서 실제 `_codex_environment_failure`와 `_classify_attempt`, 기존 - `step_runtime`을 사용하는 회귀를 먼저 추가한다. 필수 이름은 - `test_environment_classifier_ignores_successful_source_echo`, - `test_environment_classifier_retains_runtime_helper_failure`, - `test_successful_source_echo_preserves_terminal_and_retry`다. 첫 test는 archive의 source - excerpt와 실제 JSONL `item.completed/command_execution/exit_code=0`의 marker 포함 - `aggregated_output`을 주입해 `None`을 기대한다. 성공 command가 실제 helper 오류 문장까지 - source로 출력한 경우도 포함한다. 현재 broad substring은 environment로 오판하므로 RED다. - 두 번째는 기존 실제 stderr helper diagnostic을 exit0/1에서 계속 검출하고, 성공 source echo와 - 진짜 stderr failure가 함께 있을 때도 차단함을 확인한다. 마지막은 성공 echo만 있는 - completed/exit0의 완료, 명시 error/blocked의 원래 reason·history 보존, pending/exit0의 - missing-result 오류, 실제 wrapper timeout만 최대2회 재시도되는 기존 분기를 검증한다. - 이 positive regression들은 최초부터 pass할 수 있으므로 새 RED로 주장하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Case3개의 collection inventory/parameter 전개와 actual failure를 기록한다. 무관 import/setup -오류는 classifier RED가 아니다. 마지막 attempt1의 test-only `.value` 수정은 별도 미검증이므로 -기존 focused 명령으로 실제 재확인하고 원 보고서도 Implementation owner가 수정한다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Actual nonzero exit와 기존1800 기본값 때문에 실패한 assertions를 기록한다. Import/setup/인증 오류는 RED가 아니다. - -## Minimal GREEN - -변경은 아래 다섯 runtime 설정의 literal default와 필요한 설명, 이어지는 재현된 classifier -결함의 최소 수정에 한정한다. - -| 파일 / symbol | 기존 | 새 값 | -| --- | ---: | ---: | -| .codex/hooks.json / Stop command timeout | 1800 | 7500 | - -Classifier GREEN은 `_codex_environment_failure`의 helper marker 판별만 좁힌다. 성공한 -source/tool 출력의 임의 substring을 runtime diagnostic으로 사용하지 않는다. Stderr의 실제 -helper diagnostic과 관찰된 명시 runtime failure 형식을 보존하고, JSONL 성공 command의 -command/aggregated_output 같은 source payload는 제외한다. Plain `Source excerpt:` 문장도 -진짜 runtime error 형식이 아니므로 무시한다. 모든 exit0을 정상으로 간주하거나 stderr 검사를 -기존 auth/CLI nonzero 진단, explicit terminal·history, retry 분기와 횟수는 바꾸지 않는다. - -`min(command cap, shared remaining)` 알고리즘은 그대로 둔다. 이 classifier delta 외의 함수· -sandbox·transport/Coordinator retry·Hook scope/active flags·ownership/Git/API를 변경하지 않는다. -`../../docs/solver-core/README.md`의 이전1800 설명은 위 유한 deadline/새 process activation을 정확히 -반영한다. Config field/환경변수/새 public CLI timeout option은 만들지 않는다. - -## Focused VERIFY - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Exit0, failures0, 현재 sandbox/terminal/ownership regressions 보존을 확인한다. PreToolUse/Stop unit tests는 mock 테스트이고 실제 등록 Stop 통과 evidence가 아니다. - -위 신규 classifier test3개의 실제 collection 이름과 parameter case 존재도 확인한다. -등록된 기존 suite만 실행되었다고 새로운 behavior가 검증됐다고 보고하지 않는다. - -이미 GREEN인 timeout/classifier source는 기존 [Correction evidence](../../docs/mitc4-shell-feast-eigen/README.md)와 -보존된 RED/GREEN을 읽고 재검증한다. RED를 다시 만들려고 source를 되돌리지 않는다. -현재 classifier37/timeout4/focused136과 전체 pytest를 실제 확인한다. - -## Full VERIFY - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -이 clean-first/verbose는 새 Ninja graph의 실제 세 executable link/POST_BUILD discovery를 직렬로 실행한다. -`fesa_unit_tests_576e7e9d_discovery.cmake`, `fesa_integration_tests_d537bc73_discovery.cmake`, -`fesa_reference_tests_ac7cf2f0_discovery.cmake`의 실제 호출과 대응 executable/등록 identity를 raw에 남긴다. -unit289/integration34/reference39의 실제 호출·등록 identity와 전체362 discovery를 확인하고, -새 Debug library/executable hash·mtime 및 fresh manual solve를 남긴다. -No-op build/기존 자동 결과만으로 manual 성공을 주장하지 않는다. - -C++는 수정하지 않는다. 기존 same-binary cache를 쓰는 helper와 항상 fresh solver를 호출하는 nonlinear helper를 구별한다. 모든 full CTest를 실제 실행하고 완결 count/exit/duration을 기록한다. Cached outputs를 이번 eigen 신규 검증이라고 부르지 않는다. 등록 Stop도 정상 수행하며 full VERIFY를 생략/분할 성공으로 대체하지 않는다. - -현재 prep Executor와 Codex는 E11의 local preset/유한14400과 실제 승인·신뢰된 등록 Stop7500/shared7200을 사용한다. 실제 등록 Stop 초과/실패 시 정상 terminal evidence와 원시 로그를 보존해 Coordinator에 반환한다. Hook 직접 실행, 재진입 flag/state 조작, 거짓 Markdown-only skip으로 우회하지 않는다. - -보고서는 현재 attempt의 actual manual과 registered 결과, 과거 wording을 구분한다. -기존 full CTest는 static reference를 읽고 비교한다. 원본 직접 수정 없음과 새 eigen comparison -미실행을 그 사실과 구분하며 당시 실패/미실행 기록을 보존한다. - -## Evidence / result - -`../../docs/mitc4-shell-feast-eigen/README.md`에 feature/owner/r2, 각 RED/GREEN command/exit/duration, 전체 pytest/CTest counts, cap before/after, 실제 code diff 범위, current loaded wrapper14400과 실제 등록 Stop7500/shared7200, 그 시점에 관찰된 Stop/Codex exit 또는 아직 확인 대기인 항목을 기록한다. Raw logs는 ignored 과거 검증 자료(정리됨)다. CTest log는 즉시 복사 보존한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -이 Step의 manual AC가 통과하면 현재 phase index Step0의 `completed/summary`만 기록한다. 실패는 `error/error_message` 또는 `blocked/blocked_reason`이며 attempt_history/timestamps/다른Step/top index는 건드리지 않는다. 최종 phase commit/branch/checkpoint는 Executor가 수행한다. 마지막 응답은 common envelope다. Main invocation은 prep Executor의 실제 종료·completed·registered Stop 성공·actual Codex exit0·code/control commit·clean 및 Coordinator 사후 감사 완료 후 Coordinator가 새 process로 시작한다. diff --git a/phases/mitc4-shell-feast-eigen/index.json b/phases/mitc4-shell-feast-eigen/index.json deleted file mode 100644 index 51c6143..0000000 --- a/phases/mitc4-shell-feast-eigen/index.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "project": "FESA Structural Solver", - "phase": "mitc4-shell-feast-eigen", - "steps": [ - { - "step": 0, - "name": "frequency-model-and-input", - "status": "pending", - "owned_paths": [ - "include/fesa/model/model_types.h", - "include/fesa/model/frequency_step.h", - "src/fesa/model/frequency_step.cpp", - "include/fesa/model/domain.h", - "src/fesa/model/domain.cpp", - "include/fesa/analysis/analysis_model.h", - "src/fesa/analysis/analysis_model.cpp", - "src/fesa/fem/dof_manager.cpp", - "tests/unit/model/model_types_test.cpp", - "tests/unit/model/frequency_step_test.cpp", - "tests/unit/model/domain_test.cpp", - "tests/unit/analysis/analysis_model_test.cpp", - "tests/unit/fem/dof_manager_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/io/abaqus/input_syntax.h", - "src/fesa/io/abaqus/input_reader.cpp", - "src/fesa/io/abaqus/domain_mapping_context.h", - "src/fesa/io/abaqus/domain_mapping_context.cpp", - "tests/unit/io/abaqus/input_syntax_test.cpp", - "tests/unit/io/abaqus/input_reader_test.cpp", - "tests/unit/io/abaqus/domain_mapping_context_test.cpp", - "tests/unit/io/abaqus/frequency_domain_test.cpp", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 1, - "name": "covariant-drilling-stabilization", - "status": "pending", - "owned_paths": [ - "src/fesa/elements/mitc4_drilling_scale.h", - "src/fesa/elements/mitc4_drilling_scale.cpp", - "src/fesa/elements/mitc4_shell.cpp", - "tests/unit/elements/mitc4_drilling_scale_test.cpp", - "tests/unit/elements/mitc4_shell_test.cpp", - "tests/unit/elements/nonlinear_mitc4_shell_test.cpp", - "tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp", - "tests/integration/analysis/mitc4_covariance_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 2, - "name": "consistent-and-lumped-mass", - "status": "pending", - "owned_paths": [ - "include/fesa/elements/mitc4_shell.h", - "src/fesa/elements/mitc4_shell_mass.cpp", - "tests/unit/elements/mitc4_shell_test.cpp", - "tests/unit/elements/mitc4_shell_mass_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/elements/element_factory.h", - "src/fesa/elements/element_factory.cpp", - "include/fesa/assembly/shell_mass_assembler.h", - "src/fesa/assembly/shell_mass_assembler.cpp", - "tests/unit/elements/element_factory_test.cpp", - "tests/unit/assembly/shell_mass_assembler_test.cpp", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 3, - "name": "constrained-mass-reduction", - "status": "pending", - "owned_paths": [ - "include/fesa/fem/dof_manager.h", - "src/fesa/fem/dof_manager.cpp", - "src/fesa/analysis/eigen_reduction.h", - "src/fesa/analysis/eigen_reduction.cpp", - "tests/unit/fem/dof_manager_test.cpp", - "tests/unit/analysis/eigen_reduction_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 4, - "name": "feast-lowest-mode-solver", - "status": "pending", - "owned_paths": [ - "src/fesa/solvers/eigen/feast_backend.h", - "src/fesa/solvers/eigen/feast_backend.cpp", - "src/fesa/solvers/eigen/feast_initial_space.h", - "src/fesa/solvers/eigen/feast_initial_space.cpp", - "tests/unit/solvers/eigen/feast_backend_test.cpp", - "tests/unit/solvers/eigen/feast_initial_space_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/solvers/eigen/eigen_solver.h", - "include/fesa/solvers/eigen/mkl_feast_eigen_solver.h", - "src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp", - "src/fesa/solvers/eigen/feast_search.h", - "src/fesa/solvers/eigen/feast_search.cpp", - "tests/unit/solvers/eigen/eigen_solver_test.cpp", - "tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp", - "tests/unit/solvers/eigen/feast_search_test.cpp", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 5, - "name": "validated-frequency-procedure", - "status": "pending", - "owned_paths": [ - "include/fesa/analysis/eigen_analysis_state.h", - "src/fesa/analysis/eigen_analysis_state.cpp", - "src/fesa/analysis/eigen_validation.h", - "src/fesa/analysis/eigen_validation.cpp", - "tests/unit/analysis/eigen_analysis_state_test.cpp", - "tests/unit/analysis/eigen_validation_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/analysis/linear_frequency_procedure.h", - "src/fesa/analysis/linear_frequency_procedure.cpp", - "tests/integration/analysis/linear_frequency_procedure_test.cpp", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 6, - "name": "eigen-output-transaction", - "status": "pending", - "owned_paths": [ - "include/fesa/results/eigen_results_writer.h", - "include/fesa/io/hdf5/eigen_hdf5_results_writer.h", - "src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp", - "src/fesa/io/hdf5/eigen_hdf5_schema.h", - "src/fesa/io/hdf5/eigen_hdf5_schema.cpp", - "src/fesa/io/hdf5/hdf5_model_writer.h", - "src/fesa/io/hdf5/hdf5_model_writer.cpp", - "tests/unit/results/eigen_results_writer_test.cpp", - "tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp", - "tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp", - "tests/unit/io/hdf5/hdf5_model_writer_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/analysis/prepared_analysis.h", - "src/fesa/analysis/prepared_analysis.cpp", - "src/fesa/app/fesa_application.cpp", - "tests/unit/analysis/prepared_analysis_test.cpp", - "tests/integration/app/fesa_application_test.cpp", - "tests/integration/app/frequency_application_test.cpp", - "tests/integration/analysis/linear_frequency_procedure_test.cpp", - "docs/mitc4-shell-feast-eigen/README.md" - ] - }, - { - "step": 7, - "name": "fresh-reference-and-evidence", - "status": "pending", - "owned_paths": [ - "tests/reference/eigen_reference_comparison.h", - "tests/reference/eigen_reference_comparison.cpp", - "tests/reference/eigen_reference_comparison_test.cpp", - "tests/CMakeLists.txt", - "tests/reference/eigen_reference_cases_test.cpp", - "tests/reference/mitc4_eigen_static_regression_test.cpp", - "tests/integration/analysis/linear_frequency_procedure_test.cpp", - "docs/mitc4-shell-feast-eigen/README.md" - ] - } - ] -} diff --git a/phases/mitc4-shell-feast-eigen/step0.md b/phases/mitc4-shell-feast-eigen/step0.md deleted file mode 100644 index 9c89090..0000000 --- a/phases/mitc4-shell-feast-eigen/step0.md +++ /dev/null @@ -1,155 +0,0 @@ -# Step 0: Frequency semantic model과 exact 입력 subset - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: execution-prep의 실제 completed·registered Stop 성공 및 새 main invocation -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-001`, `FEM-REQ-MITC4-EIGEN-002`, `FEM-REQ-MITC4-EIGEN-003`, `FEM-REQ-MITC4-EIGEN-004`, `FEM-REQ-MITC4-EIGEN-007`, `FEM-REQ-MITC4-EIGEN-009`, `FEM-REQ-MITC4-EIGEN-015`, `FEM-REQ-MITC4-EIGEN-016`, `FEM-REQ-MITC4-EIGEN-018`, `FEM-REQ-MITC4-EIGEN-024` -- Logical cases: `MFE-C06`, `MFE-C07`, `MFE-C13`, `MFE-C23`, `MFE-C26` -- I/O obligations: `IO-T01`, `IO-T02`, `IO-T03`, `IO-T04`, `IO-T10` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [io-input.md#i3-density-material-mapping](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m1-input에서-equationresult까지](../../docs/mitc4-shell-feast-eigen/README.md), [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e1-조립-단위-scaling과-실제-global-제약), [io-input.md](../../docs/mitc4-shell-feast-eigen/README.md), [io-schema.md#o2-metadata-모델과-source-요청](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m5-구현test-obligations와-requirement-연결](../../docs/mitc4-shell-feast-eigen/README.md). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "include/fesa/model/model_types.h", - "include/fesa/model/frequency_step.h", - "src/fesa/model/frequency_step.cpp", - "include/fesa/model/domain.h", - "src/fesa/model/domain.cpp", - "include/fesa/analysis/analysis_model.h", - "src/fesa/analysis/analysis_model.cpp", - "src/fesa/fem/dof_manager.cpp", - "tests/unit/model/model_types_test.cpp", - "tests/unit/model/frequency_step_test.cpp", - "tests/unit/model/domain_test.cpp", - "tests/unit/analysis/analysis_model_test.cpp", - "tests/unit/fem/dof_manager_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/io/abaqus/input_syntax.h", - "src/fesa/io/abaqus/input_reader.cpp", - "src/fesa/io/abaqus/domain_mapping_context.h", - "src/fesa/io/abaqus/domain_mapping_context.cpp", - "tests/unit/io/abaqus/input_syntax_test.cpp", - "tests/unit/io/abaqus/input_reader_test.cpp", - "tests/unit/io/abaqus/domain_mapping_context_test.cpp", - "tests/unit/io/abaqus/frequency_domain_test.cpp", - "docs/mitc4-shell-feast-eigen/implementation-step0-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. Density 정의, frequency step과 non-owning 실행 view - -Symbols: `DensityDefinition, FrequencyStepDefinition, FrequencyStep; Domain::FrequencySteps/Densities; AnalysisModel::IsFrequency/GetFrequencyStep/BoundaryConditions/StepLocation; DofManager::Build/Create`. - -**RED:** ModelTypes/Domain/AnalysisModel/DofManager tests에 두 material의 서로 다른 rho·t와 frequency-only ModelDefinition을 만든다. FrequencyStep에 요청 N/source options/BC를 보존하고 view의 주소가 Domain storage와 같은지 검사한다. 현재 타입/API 부재의 compile failure 또는 exactly-one-static-step 거부를 관찰한다. Missing/zero/negative/nonfinite active density, multiple/static+frequency step, ambiguous source BC를 각각 거부하고 기존 density 없는 static fixture는 유지한다. - -**Minimal GREEN:** Density는 material identity에 연결된 Domain-owned composition record로 저장한다. Material base에 가짜 기본 density/no-op capability를 추가하지 않는다. 기존 StaticStepDefinition/StepDefinition API를 유지하면서 별도 FrequencyStep을 소유한다. AnalysisModel은 sole active procedure에 대한 boundary/location view를 제공하고 DofManager의 Step() 직접 접근만 해당 공통 view로 바꾼다. Static legacy constructors/loads/0x0 Kff 의미는 유지한다. Parser·solver·writer는 다음 단계이며 아직 CLI frequency 지원을 주장하지 않는다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -### 2. Density/FREQUENCY exact parser와 원문 보존 - -Symbols: `DataLine::original_line; AbaqusInputReader::Read; DomainMappingContext::Impl/ParseSyntax/FinalizeMaterialProperties/FinalizeStep/Commit`. - -**RED:** 기존 InputSyntax/InputReader에 spaces·빈 slot·CRLF를 포함한 원 data line 보존 기대값을 먼저 추가한다. FrequencyDomain tests는 원본 input 그대로 729/676/104 nodes/elements/boundary, Step-2/N10, rho2700/t0.5와 exact warnings/source records를 검사하여 현재 FREQUENCY/DENSITY 거부를 관찰한다. 테스트 fixture 안에서만 S4R 변경, density/step/option/field/BC/no-op scope별 양성·음성 입력을 만든다. - -**Minimal GREEN:** I1~I6의 exact allowlist를 기존 private context의 parse/finalize 책임에 통합한다. 물리 data line 원문을 보존하고 numeric label/lexical identity는 재사용한다. Density의 rho 또는 rho, 한 row만 허용; N은 1~7 fields 첫 양의 checked int64, 나머지 blank. Explicit SIM/acoustic와 source Lanczos의 stable warning을 보존한다. Active density 검사와 source location/category를 연결한다. Static Density subset은 확대하지 않는다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(ModelTypes|FrequencyStep|Domain|AnalysisModel|DofManager|InputSyntax|InputReader|DomainMappingContext|FrequencyDomain|DomainMapper|ShellSurfacePressureDomain)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(ModelTypes|FrequencyStep|Domain|AnalysisModel|DofManager|InputSyntax|InputReader|DomainMappingContext|FrequencyDomain|DomainMapper|ShellSurfacePressureDomain)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `FrequencyStep.MfeC23SemanticOwnership` -- `FrequencyDomain.MfeC07DensityFailures` -- `FrequencyDomain.MfeC23ExactReferenceSubset` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 0에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 0만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step0-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step1.md b/phases/mitc4-shell-feast-eigen/step1.md deleted file mode 100644 index af5625c..0000000 --- a/phases/mitc4-shell-feast-eigen/step1.md +++ /dev/null @@ -1,133 +0,0 @@ -# Step 1: 공변 drilling scale과 정적 회귀 - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 0 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-002`, `FEM-REQ-MITC4-EIGEN-014`, `FEM-REQ-MITC4-EIGEN-023`, `FEM-REQ-MITC4-EIGEN-024`, `FEM-REQ-MITC4-EIGEN-027` -- Logical cases: `MFE-C08`, `MFE-C09`, `MFE-C10`, `MFE-C11`, `MFE-C12`, `MFE-C26` -- I/O obligations: `IO-T10` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization), [numerical-review-evidence.md#nr-mfe-001-직접-계산-반례](../../docs/mitc4-shell-feast-eigen/README.md), [numerical-review-controls.md#c7-승인된-정적-회귀-기준](../../docs/mitc4-shell-feast-eigen/README.md). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "src/fesa/elements/mitc4_drilling_scale.h", - "src/fesa/elements/mitc4_drilling_scale.cpp", - "src/fesa/elements/mitc4_shell.cpp", - "tests/unit/elements/mitc4_drilling_scale_test.cpp", - "tests/unit/elements/mitc4_shell_test.cpp", - "tests/unit/elements/nonlinear_mitc4_shell_test.cpp", - "tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp", - "tests/integration/analysis/mitc4_covariance_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "docs/mitc4-shell-feast-eigen/implementation-step1-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. 공변적인 초기 rotary trace scale과 기존 정적 회귀 - -Symbols: `mitc4_internal::ComputeDrillingScale; Mitc4Shell::Stiffness; existing NonlinearMitc4Shell::Create/Evaluate`. - -**RED:** NR-MFE-001 원 rectangle와 Z45 회전에서 complete K를 각각 재계산해 kd=19/4800, Kff=10369/7500, static thetaZ=7500/10369 및 full reaction covariance를 기대한다. 현재 min(R+)는 실패해야 한다. Inventory [0,0,2,4,0,6,0,4]→kref2, allzero/negative/NaN/Inf/DBL_MAX/subnormal cases를 별도 test로 고정한다. C12에서는 기존 nonlinear gamma의 directional schedule/objectivity와 초기 kd 고정을 검사한다. - -**Minimal GREEN:** S1/S2의 여덟 rotary 대각 전체를 fixed order로 scaled mean하고 1e-3을 곱하는 private helper를 도입하여 기존 min 계산만 교체한다. 기존 test의 old min/old kd literal 기대 부분만 승인된 trace oracle로 바꾼다. Physical K, Tphys/Tdrill, geometry, recovery는 변경하지 않는다. Nonlinear source는 이미 초기 linear kd를 저장하므로 read-only 재사용하고 tests로 frozen lifecycle과 derivatives를 확인한다. Physical admissible moment m=(5/3)b를 사용한다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(Mitc4DrillingScale|Mitc4Shell[^.]*|Mitc4Covariance|NonlinearMitc4[^.]*|NonlinearStaticProcedure|LinearStaticAnalysis)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(Mitc4DrillingScale|Mitc4Shell[^.]*|Mitc4Covariance|NonlinearMitc4[^.]*|NonlinearStaticProcedure|LinearStaticAnalysis)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `Mitc4Covariance.MfeC08PartialBcCovariance` -- `Mitc4Covariance.MfeC09StaticReactionCovariance` -- `Mitc4DrillingScale.MfeC10TraceInventory` -- `NonlinearMitc4Tangent.MfeC12FrozenCovariantScale` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 1에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 1만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step1-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step2.md b/phases/mitc4-shell-feast-eigen/step2.md deleted file mode 100644 index 8a3087c..0000000 --- a/phases/mitc4-shell-feast-eigen/step2.md +++ /dev/null @@ -1,148 +0,0 @@ -# Step 2: Consistent→lumped 질량과 deterministic 조립 - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 1 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-003`, `FEM-REQ-MITC4-EIGEN-004`, `FEM-REQ-MITC4-EIGEN-005`, `FEM-REQ-MITC4-EIGEN-006`, `FEM-REQ-MITC4-EIGEN-007`, `FEM-REQ-MITC4-EIGEN-011`, `FEM-REQ-MITC4-EIGEN-014`, `FEM-REQ-MITC4-EIGEN-018`, `FEM-REQ-MITC4-EIGEN-026` -- Logical cases: `MFE-C01`, `MFE-C02`, `MFE-C03`, `MFE-C04`, `MFE-C05`, `MFE-C06`, `MFE-C07`, `MFE-C11`, `MFE-C20` -- I/O obligations: `IO-T02`, `IO-T04`, `IO-T11` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass), [numerical-review-evidence.md#독립-mass-oracle](../../docs/mitc4-shell-feast-eigen/README.md), [numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction](../../docs/mitc4-shell-feast-eigen/README.md), [formulation-mass.md#m4-계산된-consistent-moment에서-nodal-block-유도](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass--m4-계산된-consistent-moment에서-nodal-block-유도), [formulation-mass.md#m5-보존되는-양과-근사되는-양](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass--m5-보존되는-양과-근사되는-양), [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e1-조립-단위-scaling과-실제-global-제약). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "include/fesa/elements/mitc4_shell.h", - "src/fesa/elements/mitc4_shell_mass.cpp", - "tests/unit/elements/mitc4_shell_test.cpp", - "tests/unit/elements/mitc4_shell_mass_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/elements/element_factory.h", - "src/fesa/elements/element_factory.cpp", - "include/fesa/assembly/shell_mass_assembler.h", - "src/fesa/assembly/shell_mass_assembler.cpp", - "tests/unit/elements/element_factory_test.cpp", - "tests/unit/assembly/shell_mass_assembler_test.cpp", - "docs/mitc4-shell-feast-eigen/implementation-step2-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. 27점 consistent scalar moments와 물리 관성 - -Symbols: `Mitc4ConsistentMass; Mitc4Shell::ConsistentMass(double density); fixed 3x3x3 mass quadrature`. - -**RED:** Flat4x2 rho3 t1/2의 exact C0/C1/C2, 24-matrix energy 및 physical20 positive rank/null을 검사해 API 부재 failure를 관찰한다. Rational warped/director-varying fixture는 NR의 exact coefficient/row oracle를 test-local 독립 polynomial integration 또는 5-point direct particle integration으로 구성한다. Production ShapeFunctions/EvaluateGeometry 재호출 oracle는 금지한다. 강제 C1=0/2-point/flat C2 mutation은 오류를 검출해야 한다. - -**Minimal GREEN:** Mitc4Shell의 기존 geometry evaluator를 같은 sign/원형상으로 27점에 적용하는 member 구현을 새 cpp에 둔다. M5의 C0/C1/C2 snapshot과 consistent24를 먼저 완성·검증해 반환한다. Quadrature loop 순서/finite/positive geometry와 rho 검사는 계약대로 한다. 5/6을 mass에 곱하거나 곡면 odd coupling을 생략하지 않는다. Lumped/FEAST/global dense MC는 이 단계에 넣지 않는다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -### 2. Moment 유도 lumping과 deterministic nodal 조립 - -Symbols: `Mitc4LumpedMass; DeriveLumpedMass(consistent snapshot, directors); ElementFactory::CreateMitc4Shell; ShellMassAssembler::Assemble`. - -**RED:** C1/C2 symmetric perturbation을 consistent snapshot에 주어 derived block도 독립 integral대로 변하는지 먼저 실패시킨다. m/h/j positivity·central variance·rank5·drill null·spatial centroid와 Jensen work를 검사한다. m=1,2,4 grid의 velocity(x,0,0)에서 MC work4/3, difference8/(3m²)를 독립 기대값으로 사용한다. Two-rho/t patch의 source/scatter 및 parallel scheduling permutations를 검사한다. - -**Minimal GREEN:** M6/M7의 scalar moment row-sum으로 nodal6 blocks를 만든다. 원 snapshot을 덮어쓰지 않는다. Typed factory 생성 경계에서 generic Element 생성과 동일 검증·runtime layout을 재사용하고 solver consumer의 downcast/type switch를 추가하지 않는다. Mass assembler는 DOF owner의 scatter로 index-owned contributions를 stable source order로 reduce한다. K는 기존 SparseAssembler/ElementView 경로를 재사용한다. Source/section/material별 rho·t 및 nodal incident kd 합을 보존한다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(Mitc4ShellMass|Mitc4ShellKinematics|Mitc4ShellKernel|ElementFactory|ShellMassAssembler|SparseAssembler)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(Mitc4ShellMass|Mitc4ShellKinematics|Mitc4ShellKernel|ElementFactory|ShellMassAssembler|SparseAssembler)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `Mitc4ShellMass.MfeC01FlatMomentOracle` -- `Mitc4ShellMass.MfeC02CurvedParticleOracle` -- `Mitc4ShellMass.MfeC03DerivedSnapshotAndJensen` -- `ShellMassAssembler.MfeC04RefinementEnergy` -- `Mitc4ShellMass.MfeC05RotatedMassAndCentroid` -- `ShellMassAssembler.MfeC06SourceAndParallelOrder` -- `Mitc4ShellMass.MfeC07InvalidMassGeometry` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 2에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 2만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step2-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step3.md b/phases/mitc4-shell-feast-eigen/step3.md deleted file mode 100644 index 97fe79a..0000000 --- a/phases/mitc4-shell-feast-eigen/step3.md +++ /dev/null @@ -1,131 +0,0 @@ -# Step 3: 실제 제약의 null 공간과 sparse whitening - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 2 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-006`, `FEM-REQ-MITC4-EIGEN-007`, `FEM-REQ-MITC4-EIGEN-008`, `FEM-REQ-MITC4-EIGEN-009`, `FEM-REQ-MITC4-EIGEN-012`, `FEM-REQ-MITC4-EIGEN-013`, `FEM-REQ-MITC4-EIGEN-014`, `FEM-REQ-MITC4-EIGEN-018` -- Logical cases: `MFE-C08`, `MFE-C11`, `MFE-C13`, `MFE-C14`, `MFE-C15`, `MFE-C16`, `MFE-C20` -- I/O obligations: `IO-T04`, `IO-T05` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [formulation-eigen.md#e1-조립-단위-scaling과-실제-global-제약](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e1-조립-단위-scaling과-실제-global-제약), [formulation-eigen.md#e2-nullpositive-basis를-node마다-결정](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e2-nullpositive-basis를-node마다-결정), [formulation-eigen.md#e5-spd-whitening-복원과-sparsity](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e5-spd-whitening-복원과-sparsity), [numerical-review-controls.md#c2-matrix-mass-stabilization와-reduction](../../docs/mitc4-shell-feast-eigen/README.md). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "include/fesa/fem/dof_manager.h", - "src/fesa/fem/dof_manager.cpp", - "src/fesa/analysis/eigen_reduction.h", - "src/fesa/analysis/eigen_reduction.cpp", - "tests/unit/fem/dof_manager_test.cpp", - "tests/unit/analysis/eigen_reduction_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "docs/mitc4-shell-feast-eigen/implementation-step3-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. 실제 BC의 analytic null, nodal Cholesky와 sparse whitening - -Symbols: `DofManager::BuildEigenLayout/EigenSparsePattern; eigen_internal::ReduceEigenSystem/RestoreEigenvector; EigenReduction`. - -**RED:** C13의 supported director/component-mask inventory로 exact n/nz/P/Z와 global n0/N>n 실패를 고정한다. C14 p=1/2000 positive5 pass, p=1e-8 analytic5 conditioning fail, p=0 null1을 검사한다. C15의 일반 singular pencil exact2.5 vs 삭제3을 test-local oracle로 보존하고 production에 nonzero Kpz/nonpositive Kzz를 주입해 거부시킨다. C16 SPD pencil의2,10/3 및 full original residual 복원을 검사한다. - -**Minimal GREEN:** E1~E5와 C2의 analytic BC/director intersection만 rank로 사용한다. Nodal≤6 P/Z/L과 rcond>=2^-32, MZ/KZ/PZ/Kzz checks 및 global scale ell을 계산한다. Positive counts는 DOF owner로 넘겨 stable finite offsets/pattern을 받고 block triangular congruence로 sparse A를 구성한다. 원 free K/ML은 residual용으로 보존한다. Global inverse/dense Schur/artificial mass/cutoff/local URZ 삭제는 금지한다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenReduction|DofManager|ShellMassAssembler|Mitc4Covariance)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenReduction|DofManager|ShellMassAssembler|Mitc4Covariance)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `EigenReduction.MfeC13ExactBoundaryNullIntersection` -- `EigenReduction.MfeC14NearNullConditioning` -- `EigenReduction.MfeC15RejectsInvalidDecoupling` -- `EigenReduction.MfeC16NodalWhitening` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 3에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 3만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step3-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step4.md b/phases/mitc4-shell-feast-eigen/step4.md deleted file mode 100644 index fe009c4..0000000 --- a/phases/mitc4-shell-feast-eigen/step4.md +++ /dev/null @@ -1,151 +0,0 @@ -# Step 4: MKL FEAST adapter와 bounded lowest-N 검색 - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 3 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-009`, `FEM-REQ-MITC4-EIGEN-010`, `FEM-REQ-MITC4-EIGEN-011`, `FEM-REQ-MITC4-EIGEN-012`, `FEM-REQ-MITC4-EIGEN-013`, `FEM-REQ-MITC4-EIGEN-023` -- Logical cases: `MFE-C17`, `MFE-C18`, `MFE-C19`, `MFE-C21`, `MFE-C22` -- I/O obligations: `IO-T06` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [formulation-eigen.md#e7-feast-경계와-deterministic-실행](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e7-feast-경계와-deterministic-실행), [numerical-review-controls.md#c5-feast-controls와-bounded-interval-정책](../../docs/mitc4-shell-feast-eigen/README.md), [numerical-review-controls.md#c6-initial-subspace-thread와-storage](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/README.md), [formulation-eigen.md#e6-유한-search-interval과-요청-개수](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e6-유한-search-interval과-요청-개수), [io-schema.md#o4-backend와-검증-evidence](../../docs/mitc4-shell-feast-eigen/README.md). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "src/fesa/solvers/eigen/feast_backend.h", - "src/fesa/solvers/eigen/feast_backend.cpp", - "src/fesa/solvers/eigen/feast_initial_space.h", - "src/fesa/solvers/eigen/feast_initial_space.cpp", - "tests/unit/solvers/eigen/feast_backend_test.cpp", - "tests/unit/solvers/eigen/feast_initial_space_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/solvers/eigen/eigen_solver.h", - "include/fesa/solvers/eigen/mkl_feast_eigen_solver.h", - "src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp", - "src/fesa/solvers/eigen/feast_search.h", - "src/fesa/solvers/eigen/feast_search.cpp", - "tests/unit/solvers/eigen/eigen_solver_test.cpp", - "tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp", - "tests/unit/solvers/eigen/feast_search_test.cpp", - "docs/mitc4-shell-feast-eigen/implementation-step4-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. 실제 MKL FEAST call, CSR/자원/initial-space 계약 - -Symbols: `eigen_internal::FeastBackend/FeastCallRequest/FeastCallResult; BuildFeastInitialSpace; actual feastinit/dfeast_scsrgv private calls`. - -**RED:** Private request tests에 malformed/missing/duplicate/nonfinite/0-based/out-of-range CSR, n²/n*m0/nnz+1 representation overflow와 allocation injection을 추가한다. Fixed uint64 sequence와 QR orthogonality/rank-failure, thread-local restore on every exit를 검사한다. 실제 linked MKL의 full-enclosure count/solve smoke test를 추가해 부재를 관찰한다. Mock call 성공을 real backend evidence로 대신하지 않는다. - -**Minimal GREEN:** C5/C6의 one-based upper CSR/identity B, fpm snapshots, count scratch n×n, m0 overwritten count와 solve m 구분을 구현한다. Neutral std integer records 밖 vendor MKL_INT를 노출하지 않는다. Per-call feastinit, fixed seed/nonpivoted QR, local thread guard, checked allocation RAII, raw status/history를 보존한다. API smoke의 enclosure는 matrix-derived로 만들고 known values로 fitting하지 않는다. Lowest-N search/completeness gate는 Step4에서 완성한다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -### 2. Prefix/guard/count 기반 lowest-N FEAST 탐색 - -Symbols: `EigenSolver::SolveLowest; MklFeastEigenSolver::SolveLowest; eigen_internal::SearchFeastSpectrum; EigenSolveResult/FeastCallEvidence`. - -**RED:** Actual C17 zero/N=n/simple spectra 및 C18 fortyfold cluster>N/tight distinct/dense-pattern spectra를 production search로 풀고 independent known ordered values/count history와 대조한다. Injected false count/low-mode omission이 residual·Gram만 통과해도 search는 실패해야 한다. C21 statuses/endpoint/nonmonotone/total!=n/m!=c와 C22 count512/solve3 경계 및 certified fallback을 먼저 실패시킨다. - -**Minimal GREEN:** A의 stable inf scale와 outward Gershgorin, C5 delta/guard/prefix/32+32 search/384+128 budget/ordered collision offsets를 구현한다. Safe c>=N bracket 및 m0 formula, admissible retry3·금지 retry, final prefix0/actual interval count 및 all-c columns를 반환한다. Count source는 실제 backend, zero count는 info0만 인정한다. Public request N은 불변이며 scale0의 model-derived fallback은 caller가 전달한다. Actual raw negative 값을 backend에서 clamp하지 않는다. C3의 full original-space validation은 Step5 소유다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(FeastBackend|FeastInitialSpace|MklPardisoSolver|EigenSolver|MklFeastEigenSolver|FeastSearch)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(FeastBackend|FeastInitialSpace|MklPardisoSolver|EigenSolver|MklFeastEigenSolver|FeastSearch)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `MklFeastEigenSolver.MfeC17KnownLowestSpectra` -- `MklFeastEigenSolver.MfeC18RepeatedAndTightClusters` -- `FeastBackend.MfeC19RawSignedSpectra` -- `FeastSearch.MfeC21StatusAndHistoryFailures` -- `FeastSearch.MfeC22FiniteBudgetsAndCapacity` -- `FeastInitialSpace.MfeC22SeedQrAndRepresentation` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 4에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 4만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step4-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step5.md b/phases/mitc4-shell-feast-eigen/step5.md deleted file mode 100644 index 92f80b6..0000000 --- a/phases/mitc4-shell-feast-eigen/step5.md +++ /dev/null @@ -1,147 +0,0 @@ -# Step 5: 전체 c 검증과 별도 frequency procedure - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 4 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-001`, `FEM-REQ-MITC4-EIGEN-002`, `FEM-REQ-MITC4-EIGEN-003`, `FEM-REQ-MITC4-EIGEN-007`, `FEM-REQ-MITC4-EIGEN-008`, `FEM-REQ-MITC4-EIGEN-009`, `FEM-REQ-MITC4-EIGEN-010`, `FEM-REQ-MITC4-EIGEN-011`, `FEM-REQ-MITC4-EIGEN-012`, `FEM-REQ-MITC4-EIGEN-013`, `FEM-REQ-MITC4-EIGEN-014`, `FEM-REQ-MITC4-EIGEN-017`, `FEM-REQ-MITC4-EIGEN-018`, `FEM-REQ-MITC4-EIGEN-019` -- Logical cases: `MFE-C06`, `MFE-C08`, `MFE-C11`, `MFE-C13`, `MFE-C14`, `MFE-C16`, `MFE-C17`, `MFE-C18`, `MFE-C19`, `MFE-C20`, `MFE-C21`, `MFE-C23`, `MFE-C24`, `MFE-C27` -- I/O obligations: `IO-T01`, `IO-T02`, `IO-T04`, `IO-T05`, `IO-T06`, `IO-T07`, `IO-T11` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification), [numerical-review-controls.md#c3-eigenpair-및-물리-내부-판정](../../docs/mitc4-shell-feast-eigen/README.md), [numerical-review-controls.md#c4-repeated-subspace와-결정론](../../docs/mitc4-shell-feast-eigen/README.md), [io-schema.md#o3-고유치와-modal-vectors](../../docs/mitc4-shell-feast-eigen/README.md), [io-schema.md#o4-backend와-검증-evidence](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m1-input에서-equationresult까지](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/README.md), [formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen), [formulation-stabilization.md#s6-nr-mfe-001의-새-algebraic-target과-정적-대응](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization--s6-nr-mfe-001의-새-algebraic-target과-정적-대응). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "include/fesa/analysis/eigen_analysis_state.h", - "src/fesa/analysis/eigen_analysis_state.cpp", - "src/fesa/analysis/eigen_validation.h", - "src/fesa/analysis/eigen_validation.cpp", - "tests/unit/analysis/eigen_analysis_state_test.cpp", - "tests/unit/analysis/eigen_validation_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/analysis/linear_frequency_procedure.h", - "src/fesa/analysis/linear_frequency_procedure.cpp", - "tests/integration/analysis/linear_frequency_procedure_test.cpp", - "docs/mitc4-shell-feast-eigen/implementation-step5-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. 전체 c 검증, raw mode 분류와 N개 candidate state - -Symbols: `EigenAnalysisState::Swap; eigen_internal::ValidateEigenpairs; EigenMode/EigenpairCheck/EigenVerificationEvidence`. - -**RED:** C16 wrong mass/lambda/pairing/constraint/null coordinate 및 c>N의 버려질 column만 손상한 결과를 주입해 실패시킨다. eta_r/eta_w/rho_B/Gram/norm/energy 각각 boundary와 zero branch를 검사한다. Actual C18 solver 결과에 all-c metrics를 적용하고 repeated projector3회, C19 ±tau/nextafter·smallnegative frequency omission·positive underflow/overflow를 검사한다. - -**Minimal GREEN:** V1~V5/C1~C4의 같은 실제 ML로 복원·mass normalize·full original free residual·operator residual·전체 c Gram/energy를 계산한다. 실패한 column을 truncation으로 숨기지 않는다. Stable paired sort/sign/connected diagnostic cluster 뒤 처음 N만 state에 저장하고 전체 c scalar checks/call history는 보존한다. O3/O4 raw negative/classification/frequency subset와 validity flags를 정확히 구현한다. Prepared state의 Swap은 allocation/validation 없이 noexcept이어야 한다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -### 2. 별도 frequency lifecycle의 domain-to-mode 통합 - -Symbols: `LinearFrequencyProcedureExecutor::Execute; LinearFrequencyExecutionResult`. - -**RED:** Small input→Domain→actual FEAST→candidate의 typed integration을 먼저 추가한다. C08 lambda10369/450와 rotated same BC, free6 rigid modes, n0/N>n/mixed-node-rank0, source renumbering, density4/unit1024와 원 constraints를 검증한다. Spy static/nonlinear executor를 전혀 호출하지 않음, 실패 시 기존 accepted state 미변경을 검사한다. - -**Minimal GREEN:** Executor는 typed factory/kernel→consistent snapshot→lumped→deterministic K/ML→DofManager→ReduceEigenSystem→SolveLowest→ValidateEigenpairs 순서를 소유한다. Model validation 완료 후 source location을 backend diagnostics에 연결한다. Domain/view/workspace lifetime을 유지하고 candidate를 반환한다. LinearStaticAnalysis::Run은 변경하지 않는다. Output path/log/final replacement는 Step6에서 연결하며 이 단계는 저장 성공을 주장하지 않는다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenAnalysisState|EigenValidation|MklFeastEigenSolver|EigenReduction|LinearFrequencyProcedure|FrequencyDomain|Mitc4Covariance)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenAnalysisState|EigenValidation|MklFeastEigenSolver|EigenReduction|LinearFrequencyProcedure|FrequencyDomain|Mitc4Covariance)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `EigenValidation.MfeC16OriginalMassAndPairing` -- `EigenValidation.MfeC19RawSignedEigenvalues` -- `LinearFrequencyProcedure.MfeC11SixPhysicalRigidModes` -- `LinearFrequencyProcedure.MfeC20DensityAndUnits` -- `LinearFrequencyProcedure.MfeC08PartialBcEigenvalue` -- `EigenValidation.MfeC21RejectsUnselectedColumnCorruption` -- `EigenAnalysisState.MfeC24NoFailSwap` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 5에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 5만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step5-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step6.md b/phases/mitc4-shell-feast-eigen/step6.md deleted file mode 100644 index fe11e59..0000000 --- a/phases/mitc4-shell-feast-eigen/step6.md +++ /dev/null @@ -1,154 +0,0 @@ -# Step 6: Additive HDF5와 CLI candidate transaction - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 5 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-001`, `FEM-REQ-MITC4-EIGEN-015`, `FEM-REQ-MITC4-EIGEN-016`, `FEM-REQ-MITC4-EIGEN-017`, `FEM-REQ-MITC4-EIGEN-018`, `FEM-REQ-MITC4-EIGEN-019`, `FEM-REQ-MITC4-EIGEN-021`, `FEM-REQ-MITC4-EIGEN-024` -- Logical cases: `MFE-C19`, `MFE-C23`, `MFE-C24`, `MFE-C26` -- I/O obligations: `IO-T01`, `IO-T03`, `IO-T05`, `IO-T07`, `IO-T08`, `IO-T10` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m2-backend와-failure-lifecycle](../../docs/mitc4-shell-feast-eigen/README.md), [io-input.md#i6-fail-closed-validation과-diagnostics](../../docs/mitc4-shell-feast-eigen/README.md), [formulation-eigen.md#e8-mode-identity-normalization과-상태](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen--e8-mode-identity-normalization과-상태). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "include/fesa/results/eigen_results_writer.h", - "include/fesa/io/hdf5/eigen_hdf5_results_writer.h", - "src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp", - "src/fesa/io/hdf5/eigen_hdf5_schema.h", - "src/fesa/io/hdf5/eigen_hdf5_schema.cpp", - "src/fesa/io/hdf5/hdf5_model_writer.h", - "src/fesa/io/hdf5/hdf5_model_writer.cpp", - "tests/unit/results/eigen_results_writer_test.cpp", - "tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp", - "tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp", - "tests/unit/io/hdf5/hdf5_model_writer_test.cpp", - "src/fesa/CMakeLists.txt", - "tests/CMakeLists.txt", - "include/fesa/analysis/prepared_analysis.h", - "src/fesa/analysis/prepared_analysis.cpp", - "src/fesa/app/fesa_application.cpp", - "tests/unit/analysis/prepared_analysis_test.cpp", - "tests/integration/app/fesa_application_test.cpp", - "tests/integration/app/frequency_application_test.cpp", - "tests/integration/analysis/linear_frequency_procedure_test.cpp", - "docs/mitc4-shell-feast-eigen/implementation-step6-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. Additive eigen HDF5 write/self-check - -Symbols: `EigenResultsWriter::Write; EigenHdf5ResultsWriter::Write; hdf5_internal::WriteEigenSchema/SelfCheckEigen; model-only WriteModelData`. - -**RED:** 독립 HDF5 C API reader test에서 O1~O5 inventory의 exact types/compound fields/shapes/attributes를 기대해 missing writer/schema failure를 관찰한다. N/c/request/source Step-2 vs group Step-1, negative/zero/positive frequencies, flags/units/source records/128 fpm를 검증한다. Missing/duplicate/extra mode/nonfinite/wrong procedure/mass/backend/dimension 및 reopen/self-check failure를 각각 주입한다. 기존 static schema0/1 reader test도 실행한다. - -**Minimal GREEN:** 새 eigen serializer/self-check를 별도 private module로 구현한다. 기존 model writer에서 metadata-free model dataset 작성 seam만 분리해 공유하며 static WriteModel의 output은 보존한다. N persistent vectors, all-c scalar metrics/call history와 exact source identity를 쓴다. Candidate write/flush/close/reopen/self-check 후 기존 AtomicFinalizeValidatedCandidate를 사용한다. HDF5/Win32 types는 private이고 official final path 계약은 그대로다. Static result/reaction/accepted_frames를 eigen에 만들지 않는다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -### 2. CLI dispatch, log/lock와 final-state transaction - -Symbols: `PreparedAnalysisOutcome frequency variant; ExecutePreparedAnalysis/FinalizePreparedAnalysisResult frequency overload; FesaApplication::Run`. - -**RED:** FesaApplication의 유일 CLI 입력으로 small frequency file을 실행해 lexical sibling h5/log와 exit0를 기대한다. 원본 no-op provenance와 stable source diagnostics, input/model/solver/output exit3/4/5/6를 검사한다. 기존 final/state hash를 준비하고 solve, validation, log open/close, lease, write/flush/close/reopen/self-check/replace failure를 각각 주입한다. First-run failure는 final 부재를 검사한다. - -**Minimal GREEN:** Prepared boundary에 별도 frequency executor/result/writer를 선택하는 overload를 추가하며 static 호출부 호환성을 유지한다. 기존 exclusive lease→log open/truncate→prepare/execute→log close→candidate finalization 순서에 연결한다. Eigen 정상 log는0bytes. Final replacement 성공 뒤 이미 준비된 EigenAnalysisState의 noexcept swap만 수행한다. 실패 state/final 보존을 generic 성공 bool로 숨기지 않는다. 테스트 주입 seam은 기존 private/injected interfaces 안에 두며 public CLI 옵션은 추가하지 않는다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenResultsWriter|EigenHdf5ResultsWriter|EigenHdf5Schema|Hdf5ModelWriter|Hdf5ResultsWriter|NonlinearHdf5ResultsWriter|Hdf5WriterComponents|PreparedAnalysis|FrequencyApplication|FesaApplication|LinearFrequencyProcedure|ShellSurfacePressureApplication)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenResultsWriter|EigenHdf5ResultsWriter|EigenHdf5Schema|Hdf5ModelWriter|Hdf5ResultsWriter|NonlinearHdf5ResultsWriter|Hdf5WriterComponents|PreparedAnalysis|FrequencyApplication|FesaApplication|LinearFrequencyProcedure|ShellSurfacePressureApplication)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `EigenHdf5Schema.MfeC24RoundTripAndRejection` -- `FrequencyApplication.MfeC24PreservesFinalAndState` -- `EigenHdf5ResultsWriter.MfeC24AtomicCandidateFailures` -- `PreparedAnalysis.MfeC23DispatchesFrequency` -- `Hdf5ModelWriter.MfeC26StaticInventoryPreserved` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 6에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 최종 fresh portfolio의 권위는 Step 7이다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 6만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step6-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/mitc4-shell-feast-eigen/step7.md b/phases/mitc4-shell-feast-eigen/step7.md deleted file mode 100644 index ad05d38..0000000 --- a/phases/mitc4-shell-feast-eigen/step7.md +++ /dev/null @@ -1,153 +0,0 @@ -# Step 7: Value-only comparator·fresh reference·구현 evidence - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/mitc4-shell-feast-eigen/README.md)을 따른다. - -- Feature ID: `mitc4-shell-feast-eigen` -- Input contract revision: `r2` -- Phase: `mitc4-shell-feast-eigen` -- Dependency: 동일 phase의 Step 6 completed -- Requirement IDs: `FEM-REQ-MITC4-EIGEN-001`, `FEM-REQ-MITC4-EIGEN-002`, `FEM-REQ-MITC4-EIGEN-003`, `FEM-REQ-MITC4-EIGEN-004`, `FEM-REQ-MITC4-EIGEN-005`, `FEM-REQ-MITC4-EIGEN-006`, `FEM-REQ-MITC4-EIGEN-007`, `FEM-REQ-MITC4-EIGEN-008`, `FEM-REQ-MITC4-EIGEN-009`, `FEM-REQ-MITC4-EIGEN-010`, `FEM-REQ-MITC4-EIGEN-011`, `FEM-REQ-MITC4-EIGEN-012`, `FEM-REQ-MITC4-EIGEN-013`, `FEM-REQ-MITC4-EIGEN-014`, `FEM-REQ-MITC4-EIGEN-015`, `FEM-REQ-MITC4-EIGEN-016`, `FEM-REQ-MITC4-EIGEN-017`, `FEM-REQ-MITC4-EIGEN-018`, `FEM-REQ-MITC4-EIGEN-019`, `FEM-REQ-MITC4-EIGEN-020`, `FEM-REQ-MITC4-EIGEN-021`, `FEM-REQ-MITC4-EIGEN-022`, `FEM-REQ-MITC4-EIGEN-023`, `FEM-REQ-MITC4-EIGEN-024`, `FEM-REQ-MITC4-EIGEN-025`, `FEM-REQ-MITC4-EIGEN-026`, `FEM-REQ-MITC4-EIGEN-027` -- Logical cases: `MFE-C06`, `MFE-C08`, `MFE-C09`, `MFE-C11`, `MFE-C12`, `MFE-C17`, `MFE-C18`, `MFE-C20`, `MFE-C23`, `MFE-C24`, `MFE-C25`, `MFE-C26`, `MFE-C27` -- I/O obligations: `IO-T01`, `IO-T04`, `IO-T05`, `IO-T07`, `IO-T08`, `IO-T09`, `IO-T10`, `IO-T11` - -## 필수 입력과 계약 - -Feature 폴더는 `docs/mitc4-shell-feast-eigen/`다. 아래 current r2 입력을 읽고 기존 완료 Step 코드와 evidence를 대조한다. 연결된 upstream contract는 read-only다. - -- [AGENTS.md](../../AGENTS.md) -- [docs/SOLVER_AGENT_DESIGN.md](../../docs/solver-core/README.md) -- [docs/FEATURE_DOCUMENTATION.md](../../docs/solver-core/README.md) -- [docs/PRD.md](../../docs/solver-core/README.md) -- [docs/ARCHITECTURE.md](../../docs/solver-core/README.md) -- [docs/ADR.md](../../docs/solver-core/README.md) -- [docs/CODINGSTYLE.md](../../docs/solver-core/README.md) -- [docs/TOLERANCE.md](../../docs/solver-core/README.md) -- [docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/PRD.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/ADR.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/coordination.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/requirements-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/research-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/formulation.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation) -- [docs/mitc4-shell-feast-eigen/formulation-mass.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-mass) -- [docs/mitc4-shell-feast-eigen/formulation-eigen.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-eigen) -- [docs/mitc4-shell-feast-eigen/formulation-verification.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-verification) -- [docs/mitc4-shell-feast-eigen/formulation-stabilization.md](../../docs/mitc4-shell-feast-eigen/formulation.md#formulation-stabilization) -- [docs/mitc4-shell-feast-eigen/numerical-review.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-evidence.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-controls.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/numerical-review-cases.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-input.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-schema.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/io-mapping.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-plan.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-environment.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-interfaces.md](../../docs/mitc4-shell-feast-eigen/README.md) -- [docs/mitc4-shell-feast-eigen/implementation-verification.md](../../docs/mitc4-shell-feast-eigen/README.md) - -이 Step의 직접 계약: [io-mapping.md#m3-원본-txt-grammar와-deterministic-value-projection](../../docs/mitc4-shell-feast-eigen/README.md), [io-mapping.md#m4-판정보고와-기존-static의-역할](../../docs/mitc4-shell-feast-eigen/README.md), [reference-model.md](../../docs/mitc4-shell-feast-eigen/README.md), [../TOLERANCE.md](../../docs/solver-core/README.md), [requirements-evidence.md#필수-회귀-포트폴리오와-identity](../../docs/mitc4-shell-feast-eigen/README.md), [numerical-review-cases.md#p4-ioreference운영-closure](../../docs/mitc4-shell-feast-eigen/README.md). -논리 case의 전체 parameter/threshold/음성 inventory는 NR 원문과 [verification mapping](../../docs/mitc4-shell-feast-eigen/README.md)을 함께 적용한다. - -## Owned paths - -다음 목록은 phase index `owned_paths`와 exact equality를 유지한다. 목록 밖 파일이 필요하면 보존하고 Coordinator에 반환한다. 다른 agent도 같은 worktree를 사용하므로 타인 변경을 되돌리지 않는다. - -```json -[ - "tests/reference/eigen_reference_comparison.h", - "tests/reference/eigen_reference_comparison.cpp", - "tests/reference/eigen_reference_comparison_test.cpp", - "tests/CMakeLists.txt", - "tests/reference/eigen_reference_cases_test.cpp", - "tests/reference/mitc4_eigen_static_regression_test.cpp", - "tests/integration/analysis/linear_frequency_procedure_test.cpp", - "docs/mitc4-shell-feast-eigen/implementation-report.md", - "docs/mitc4-shell-feast-eigen/build-test.md", - "docs/mitc4-shell-feast-eigen/reference-comparison.md", - "docs/mitc4-shell-feast-eigen/reference-comparison-detail.md", - "docs/mitc4-shell-feast-eigen/implementation-step7-evidence.md" -] -``` - -## 같은 session의 behavior별 TDD - -각 소단위는 아래 순서로 RED→observed failure→minimal GREEN→focused VERIFY를 완료한다. 마지막 소단위 뒤 full VERIFY를 한 번 수행하고 등록 Stop의 정상 전체검증도 받는다. Missing API의 정확한 compile/link failure는 RED일 수 있으나 configure/dependency 오류는 RED가 아니다. 이미 통과한 test를 새 RED라고 보고하지 않는다. - -### 1. 원본 TXT Value-only deterministic comparator - -Symbols: `EigenReferenceComparison::Compare/WriteDeterministicJson; exact TXT parser and source-key projection`. - -**RED:** Test-local synthetic TXT/HDF5 fixture로 reordered rows/equalValue distinct IDs와 Freq token 변경을 허용하고 missing/extra/duplicate/malformed/BOM/NaN/Inf/wronglabel/step/quantity/unit/mass/backend/schema를 tolerance 이전 실패시킨다. 양수 singleton 1% RMS 경계/nextafter·5% row 경계/nextafter, rowpass-RMSfail, generic near-zero B 경계 및 S0 cases를 먼저 고정한다. - -**Minimal GREEN:** IO-M3 full-match grammar의 모든 nonempty TXT rows를 읽고 입력 sole source step/N을 authority로 연결한다. Official modes.eigenvalue만 추출하고 source content identity/path를 확인한다. Existing ReferenceTolerancePolicy::Evaluate를 10singleton family에 적용하며 policy source는 수정하지 않는다. Deterministic report는 raw r/f/e, source keys/family/S/branch/RMS/prechecks를 모두 기록한다. Diagnostic all-c, frequencies/vectors는 비교량이나 fallback이 아니다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -### 2. Fresh 10모드·static portfolio·반복 실행 및 최종 구현 evidence - -Symbols: `EigenReferenceCases.FreshInputUsesTenBlockingValueFamilies; EigenReferenceCases.ReplaysPersistentModesAndRepeatsDeterministically; Mitc4EigenStaticRegression.FreshApprovedPortfolio`. - -**RED:** 새 fresh-run harness에 invocation counter/identity corruption fixture를 먼저 추가해 stale HDF5 또는 다른 binary/source content의 결과를 거부하는 failure를 관찰한다. 이미 구현된 eigenvalue가 reference와 통과할 수 있다는 이유로 의도적인 물리 failure를 만들지 않는다. Tests는 고유 execution directory에 원본 bytes 복사→직접 FesaApplication 호출→HDF5 읽기를 요구하고 cache-only path는 failure로 만든다. 이후 실제 지정 reference 및 기존 static portfolio를 실행한다. - -**Minimal GREEN:** Reference 실행 wrapper와 evidence projection만 보완한다. 원본 SHA-256/bytes/mtime 전후 동일, copied input byte equality, actual run exit/duration, binary/library hash와 result/log timestamp/hash를 기록한다. 새 eigen은 같은binary/runtime/thread/input3runs에서 N10/n3125/nz625와 raw Value10singleton 비교·N벡터 residual 재현·C4 결정론을 검증한다. Static shell/shellNL/shellNL-meshfine fresh solve와 source-key Ublocking/URwarning/reactionreview 및 factor1 equilibrium을 기존 comparators로 평가한다. Canonical3 reports와 detail에 전 requirements 연결 및 full counts/exits/누락0를 기록하고 Physics/Release 판단은 남긴다. - -**Focused VERIFY:** 아래 regex 중 해당 suite를 먼저 discovery하여 tests>0을 확인하고 같은 test를 재실행한다. Exact exit와 실패 이유를 behavior별로 기록한다. - -## Focused 명령 - -현재 `tests/CMakeLists.txt`에서 `fesa_tests`는 unit/integration/reference 세 executable을 -모두 의존하는 aggregate다. 이 Step의 새 `tests/reference/` 파일은 -`fesa_reference_tests`에 등록하며 아래 build는 이를 포함한다. Registration 누락은 -필수 신규 이름별 discovery 검사에서 실패로 처리하고 full build로 RED를 대체하지 않는다. - -Workspace root의 PowerShell에서 실행한다. 초기 missing API RED라면 build의 expected failure를 기록하고 production 구현 후 같은 명령을 다시 실행한다. - -```powershell -$env:CMAKE_BUILD_PARALLEL_LEVEL = '1' -cmake --preset mfe-workspace-msvc-ninja-debug -cmake --build --preset mfe-workspace-msvc-ninja-debug --target fesa_tests -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenReferenceComparison|ReferenceTolerancePolicy|EigenReferenceCases|Mitc4EigenStaticRegression|Mitc4S4Reference|NonlinearStaticReference|ShellSurfacePressureReference)\.' --show-only=json-v1 -ctest --preset mfe-workspace-msvc-ninja-debug -R '^(EigenReferenceComparison|ReferenceTolerancePolicy|EigenReferenceCases|Mitc4EigenStaticRegression|Mitc4S4Reference|NonlinearStaticReference|ShellSurfacePressureReference)\.' --output-on-failure -``` - -Configure exit는 항상0이어야 한다. GREEN에서는 위 모든 exit0, discovered selected tests>0, failures0이어야 한다. 각 호출의 `$LASTEXITCODE`를 즉시 기록하고 실패 뒤 후속 명령으로 덮어쓰지 않는다. - -### 필수 신규 test discovery inventory - -- `EigenReferenceCases.MfeC25FreshTenValueFamilies` -- `EigenReferenceCases.MfeC27FreshAndRepeatedEvidence` -- `Mitc4EigenStaticRegression.MfeC26FreshApprovedPortfolio` -- `EigenReferenceComparison.MfeC25PrechecksAndToleranceBoundaries` - -위 이름 모두를 focused 및 full discovery JSON의 `tests[].name`에서 확인한다. Parameterized 전개가 필요하면 원 obligation→실제 discovered 이름을 evidence에 명시하고 모든 전개 case를 실행한다. 단지 selected count>0이거나 기존 suite만 존재하는 것은 실패다. V2의 해당 독립 oracle/mutation과 이 Step의 behavior assertions를 실제 구현해 각 결과를 기록한다. - -## Full VERIFY - -현재 backend는 local user preset `mfe-workspace-msvc-ninja-debug`/MSVC x64 Debug다. 이 Step의 명령을 직접 실행하며 local config/preset과 다른 graph로 fallback하지 않는다. - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -전체 discovery의 test count와 실제 실행 count를 대조하고 skipped/missing/unobserved를 성공으로 합치지 않는다. 기존 target의 `/W4 /WX`를 유지하고 새 compiler/link warning0을 확인한다. 등록 Stop의 전체 검증은 그대로 수행되며 수동 hook 실행·state/reentry 조작으로 대체하지 않는다. Step 7에서 영향받는 C++ binary가 바뀌면 기존 reference helper의 cache 재사용 여부와 실제 solve 호출을 구분한다. 이 Step에서 최종 fresh portfolio를 완료한다. - -## Evidence와 종료 - -- `../../docs/mitc4-shell-feast-eigen/README.md` -- `../../docs/mitc4-shell-feast-eigen/README.md` -- `../../docs/mitc4-shell-feast-eigen/README.md` -- `../../docs/mitc4-shell-feast-eigen/README.md` -- `../../docs/mitc4-shell-feast-eigen/README.md` - -이 Step의 evidence에는 Feature/owner/r2, exact owned changed paths, RED→GREEN 명령·actual exits·기간·핵심 수치, focused/full counts, MSVC/x64/Debug/dependency/runtime selection, warning 수, upstream case/requirement 연결, 미실행 및 residual risk를 기록한다. Raw logs는 Git ignored 과거 검증 자료(정리됨)에 보존한다. 각 CTest 호출 직후 해당 `Testing/Temporary/LastTest.log`를 고유 RED/focused/full 이름으로 복사하여 이후 Stop 로그와 섞지 않는다. Binary/reference/result hash와 run freshness는 적용되는 경우 기록한다. - -보고서 작성 시점에는 마지막 registered Stop/Codex exit가 아직 발생하지 않을 수 있다. Implementation은 실제 완료된 manual 검증과 미관찰 Stop을 구분하고 미래 성공을 선기록하지 않는다. `completed` payload는 그 자체로 Stop 성공 증거가 아니다. Executor 종료 뒤 Coordinator가 raw output·등록 Hook evidence·actual exit를 management 문서에서 사후 감사한다. Specialist 보고서 본문은 Coordinator가 대신 수정하지 않는다. - -Manual AC가 성공하면 Executor가 허용한 `phases/mitc4-shell-feast-eigen/index.json`의 **현재 Step 7만** `status=completed`와 비어 있지 않은 `summary`를 기록한다. 구현/검증 실패는 `error/error_message`, 환경·필수 준비 차단은 `blocked/blocked_reason`이다. `owned_paths`, 이름/번호, 다른 Step/top index, timestamp, attempt_history는 수정하지 않는다. `step7-output.json`은 Executor 생성 기록이며 ignored 상태를 유지한다. 마지막 응답은 공통 handoff envelope다. Phase 전체 또는 workflow gate의 자기 승인은 하지 않는다. - -## 제외와 중단 조건 - -Physics/formulation/I/O/tolerance/원본 reference·기존 feature 보고서 변경, 외부 solver, spectrum fitting, eigen 외부 vector/frequency/stress gate, sparse rank cutoff, sandbox 확대, retry-budget 변경, Git branch/commit/push/tag/release는 소유 범위 밖이다. 명백한 구현 결함은 이 exact scope 안에서 최소 수정한다. 계약 결함은 정확한 owner로 `return-upstream`, 실행 환경 실패는 actual command/exit와 함께 Coordinator로 반환한다. 동일 실패를 transport timeout으로 가장하거나 evidence를 지우고 재실행하지 않는다. diff --git a/phases/nonlinear-static-newton-raphson/index.json b/phases/nonlinear-static-newton-raphson/index.json deleted file mode 100644 index 4bd35b4..0000000 --- a/phases/nonlinear-static-newton-raphson/index.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "project": "FESA Structural Solver", - "phase": "nonlinear-static-newton-raphson", - "steps": [ - { - "step": 0, - "name": "cli-output-lease-and-derived-names", - "status": "completed", - "summary": "Derived lexical sibling result/log paths, removed --output, and added an exclusive output lease with regression coverage.", - "started_at": "2026-08-24T01:41:01+0900", - "completed_at": "2026-08-24T10:42:14+0900" - }, - { - "step": 1, - "name": "nonlinear-static-domain-contract", - "status": "completed", - "summary": "Mapped NLGEOM static procedure identity and raw controls while keeping PRESELECT output requests warning-only no-ops.", - "started_at": "2026-08-24T10:42:14+0900", - "completed_at": "2026-08-24T13:17:17+0900" - }, - { - "step": 2, - "name": "finite-rotation-state", - "status": "completed", - "summary": "Added checked SO(3) finite-rotation state, Jacobians, branch rejection, and unit coverage.", - "started_at": "2026-08-24T13:17:18+0900", - "completed_at": "2026-08-24T13:26:00+0900" - }, - { - "step": 3, - "name": "nonlinear-mitc4-kinematics-and-recovery", - "status": "completed", - "summary": "Added nonlinear MITC4 fixed-reference kinematics, MITC recovery rows, and finite-rotation/objectivity coverage.", - "started_at": "2026-08-24T13:26:00+0900", - "completed_at": "2026-08-24T13:36:34+0900" - }, - { - "step": 4, - "name": "nonlinear-mitc4-residual-and-tangent", - "status": "completed", - "summary": "Added same-trial nonlinear MITC4 internal residual/tangent with objective drilling and directional, symmetry, objectivity, patch, and nonfinite coverage.", - "started_at": "2026-08-24T13:36:35+0900", - "completed_at": "2026-08-24T14:00:06+0900" - }, - { - "step": 5, - "name": "load-boundary-path-and-convergence-gates", - "status": "completed", - "started_at": "2026-08-24T14:00:07+0900", - "summary": "Implemented fixed nonlinear load/boundary control, external tangent assembly, and typed Newton convergence gates with regression coverage.", - "completed_at": "2026-08-24T14:13:14+0900" - }, - { - "step": 6, - "name": "backend-neutral-tangent-solver", - "status": "completed", - "started_at": "2026-08-24T14:13:14+0900", - "summary": "Added an unsymmetric full-CSR PARDISO tangent solver with fail-closed pivot handling and regression coverage while preserving SPD solver behavior.", - "completed_at": "2026-08-24T14:25:05+0900" - }, - { - "step": 7, - "name": "newton-iteration-log-writer", - "status": "completed", - "started_at": "2026-08-24T14:25:05+0900", - "summary": "Added fixed-schema Newton iteration log serialization with fail-closed file lifecycle and regression coverage.", - "completed_at": "2026-08-24T14:34:19+0900" - }, - { - "step": 8, - "name": "nonlinear-state-commit-rollback", - "status": "completed", - "summary": "Added transactional nonlinear committed/trial state with stable full source identities, validated accepted frames, and rollback regression coverage.", - "started_at": "2026-08-24T14:34:19+0900", - "completed_at": "2026-08-24T14:52:08+0900" - }, - { - "step": 9, - "name": "nonlinear-hdf5-schema-v1-writer", - "status": "completed", - "summary": "Added atomic schema-v1 nonlinear HDF5 accepted-frame output with deterministic diagnostics and regression coverage.", - "started_at": "2026-08-24T14:52:08+0900", - "completed_at": "2026-08-24T15:19:06+0900" - }, - { - "step": 10, - "name": "prepared-analysis-flow-and-full-procedure", - "status": "completed", - "summary": "Prepared parse-once analysis flow, separated linear/nonlinear procedures, and delayed HDF5 finalization until log close.", - "started_at": "2026-08-24T15:19:07+0900", - "completed_at": "2026-08-24T15:49:07+0900" - }, - { - "step": 11, - "name": "equilibrium-projection-and-reference-gate", - "status": "completed", - "summary": "Verified accepted current-arm spatial balance output and the comparator-only inclusive 1e-8/zero-scale global balance gates with focused boundary and schema/procedure checks.", - "started_at": "2026-08-24T15:49:08+0900", - "completed_at": "2026-08-28T09:22:33+0900" - }, - { - "step": 12, - "name": "execution-closure-and-evidence-docs", - "status": "completed", - "summary": "Collected fresh MSVC/CTest and nonlinear reference evidence, wrote Stage 6 reports, and synchronized directly superseded documentation contracts.", - "started_at": "2026-08-28T19:44:23+0900", - "completed_at": "2026-08-28T21:08:58+0900" - } - ], - "created_at": "2026-08-24T01:41:01+0900", - "completed_at": "2026-08-28T21:08:58+0900" -} \ No newline at end of file diff --git a/phases/nonlinear-static-newton-raphson/step0.md b/phases/nonlinear-static-newton-raphson/step0.md deleted file mode 100644 index f9c2b0e..0000000 --- a/phases/nonlinear-static-newton-raphson/step0.md +++ /dev/null @@ -1,135 +0,0 @@ -# Step 0: cli-output-lease-and-derived-names - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `.codex/hooks.json` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `src/fesa/app/fesa_application.cpp` -- `include/fesa/app/fesa_application.h` -- `include/fesa/analysis/analysis.h` -- `tests/integration/app/fesa_application_test.cpp` -- `src/fesa/CMakeLists.txt` -- `tests/CMakeLists.txt` - -## 이전 Step 전제 - -없음. 이 Step은 app/CLI output lifecycle의 첫 변경이다. - -## 소유 파일 - -- Create: `include/fesa/app/output_paths.h` -- Create: `src/fesa/app/output_paths.cpp` -- Create: `tests/unit/app/output_paths_test.cpp` -- Modify: `include/fesa/analysis/analysis.h` -- Modify: `include/fesa/app/fesa_application.h` -- Modify: `src/fesa/app/fesa_application.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` -- Test: `tests/integration/app/fesa_application_test.cpp` - -## 인터페이스 - -```cpp -namespace fesa { - -struct DerivedOutputPaths { - std::filesystem::path input_path; - std::filesystem::path results_path; - std::filesystem::path log_path; -}; - -class OutputWriteLease { - public: - OutputWriteLease(const OutputWriteLease&) = delete; - OutputWriteLease& operator=(const OutputWriteLease&) = delete; - OutputWriteLease(OutputWriteLease&&) noexcept; - OutputWriteLease& operator=(OutputWriteLease&&) noexcept; - ~OutputWriteLease(); - - private: - class Impl; - friend Result AcquireOutputWriteLease( - const DerivedOutputPaths& paths); - explicit OutputWriteLease(std::unique_ptr impl) noexcept; - std::unique_ptr impl_; -}; - -Result DeriveSingleInputOutputPaths( - const std::vector& arguments, - const std::filesystem::path& invocation_cwd); - -Result AcquireOutputWriteLease( - const DerivedOutputPaths& paths); - -struct AnalysisRequest { - std::filesystem::path input_path; - std::filesystem::path output_path; - std::filesystem::path log_path; -}; - -} // namespace fesa -``` - -`OutputWriteLease`는 acquisition-only private constructor와 private pimpl storage로 lock lifetime을 보존한다. Win32 handle, file handle, 또는 platform lock 표현은 `Impl` 안에만 둔다. `FesaApplication`은 lease를 log close와 HDF5 finalization이 끝날 때까지 보관한다. - -## RED - -테스트를 먼저 추가한다. - -- `NSNR-CLI-001`: argv의 모든 token을 왼쪽에서 오른쪽으로 검사하고, case-sensitive substring `--output`을 포함한 첫 token에서 exit code `2`와 diagnostic code `cli-usage`가 하나만 출력된다. -- `NSNR-CLI-002`: `abc--outputdef`, `--output-path`, `--output=foo`, `--output` 모두 input path resolution 전에 실패한다. -- `NSNR-CLI-003`: `--output` 실패는 parser, Analysis construction, lease acquisition, log create/truncate, HDF5 candidate creation을 호출하지 않는다. -- `NSNR-CLI-004`: relative `.inp` path는 invocation CWD 기준으로 lexical normalization만 하고 `_results.h5`, `_log.txt`를 같은 directory에 만든다. -- `NSNR-CLI-005`: final extension `.inp`는 case-insensitive이고 stem은 마지막 extension만 제거하며 basename case와 preceding dots를 보존한다. -- `NSNR-CLI-006`: output-busy lease collision은 exit code `6`이며 log와 HDF5를 만들거나 바꾸지 않는다. -- `NSNR-CLI-007`: previous result/log files가 있는 상태에서 `--output` 실패 후 bytes와 timestamps가 변하지 않는다. -- `NSNR-CLI-008`: existing default `fesa.exe ` invocation은 더 이상 cwd `results.h5`를 기본값으로 쓰지 않는다. -- `NSNR-CLI-009`: `AnalysisRequest`가 `input_path`, `output_path`, `log_path`를 함께 전달한다. - -실행: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "FesaApplication|OutputPath" --output-on-failure -``` - -기대: 새 테스트가 컴파일 실패 또는 assertion 실패로 실패한다. 새 테스트가 예상 없이 통과하면 구현을 중단하고 Coordinator에게 보고한다. - -## GREEN - -- `output_paths` module에 argv 검사, lexical path derivation, input extension validation, lease acquisition을 구현한다. -- `FesaApplication`은 `DeriveSingleInputOutputPaths` 성공 뒤 `AcquireOutputWriteLease`를 호출한다. -- 이 Step에서는 nonlinear procedure를 만들지 않는다. -- `LinearStaticAnalysis` 호출은 기존 방식대로 유지하되 `AnalysisRequest::output_path`가 `_results.h5`를 가리키게 한다. - -## VERIFY - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. Run: - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "FesaApplication|OutputPath" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -## 상태 기록 - -Executor가 선택한 current Step 0만 `completed`, `error`, `blocked` 중 하나로 갱신한다. 성공 시 summary 한 줄만 기록한다. timestamp, retry, commit, advancement는 Executor 소유다. - -## 금지사항 - -- `--output` alias 또는 deprecation path를 남기지 마라. 이유: 승인된 public compatibility가 fail-closed removal이다. -- path를 symlink, junction, short-name, case-normalized realpath로 resolve하지 마라. 이유: io.md가 lexical user-addressed identity를 요구한다. -- log/HDF5 작업이 끝나기 전에 `OutputWriteLease`를 파기하지 마라. 이유: exclusive ownership 보장이 깨진다. -- nonlinear analysis 분기를 `LinearStaticAnalysis` private lifecycle에 넣지 마라. 이유: Step 10의 별도 prepared flow가 소유한다. diff --git a/phases/nonlinear-static-newton-raphson/step1.md b/phases/nonlinear-static-newton-raphson/step1.md deleted file mode 100644 index dcd01a7..0000000 --- a/phases/nonlinear-static-newton-raphson/step1.md +++ /dev/null @@ -1,134 +0,0 @@ -# Step 1: nonlinear-static-domain-contract - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/model/model_types.h` -- `include/fesa/model/domain.h` -- `src/fesa/model/domain.cpp` -- `src/fesa/io/abaqus/step_definition_mapper.cpp` -- `src/fesa/io/abaqus/domain_mapping_context.h` -- `src/fesa/io/abaqus/domain_mapping_context.cpp` -- `tests/unit/model/model_types_test.cpp` -- `tests/unit/model/domain_test.cpp` -- `tests/unit/io/abaqus/domain_mapper_test.cpp` -- `tests/unit/io/abaqus/domain_mapping_components_test.cpp` -- Step 0 files: `include/fesa/app/output_paths.h`, `include/fesa/analysis/analysis.h`, `src/fesa/app/fesa_application.cpp` - -## 이전 Step 전제 - -Step 0이 app-level path/log request fields를 만들었고 기존 linear invocation이 `_results.h5`를 사용한다. - -## 소유 파일 - -- Modify: `include/fesa/model/model_types.h` -- Modify: `include/fesa/model/domain.h` -- Modify: `src/fesa/model/domain.cpp` -- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp` -- Modify: `src/fesa/io/abaqus/domain_mapping_context.h` -- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp` -- Test: `tests/unit/model/model_types_test.cpp` -- Test: `tests/unit/model/domain_test.cpp` -- Test: `tests/unit/io/abaqus/domain_mapper_test.cpp` -- Test: `tests/unit/io/abaqus/domain_mapping_components_test.cpp` - -## 인터페이스 - -```cpp -namespace fesa { - -enum class StaticProcedureKind { - kLinearSmallDisplacement, - kNonlinearFullNewton -}; - -struct StaticStepDefinition { - std::string name; - std::vector boundaries; - std::vector loads; - StaticProcedureKind procedure_kind; - bool nlgeom; - double initial_increment; - double time_period; - double minimum_increment; - double maximum_increment; - SourceLocation location; -}; - -class StepDefinition { - public: - StaticProcedureKind ProcedureKind() const noexcept; - bool IsNonlinearStatic() const noexcept; - double InitialIncrement() const noexcept; - double TimePeriod() const noexcept; - double MinimumIncrement() const noexcept; - double MaximumIncrement() const noexcept; -}; - -} // namespace fesa -``` - -Domain stores procedure identity and raw four `*STATIC` values only. Factor sequence is derived in Step 5. PRESELECT output requests are warning no-ops and do not create Domain, Analysis, or HDF5 state. - -## RED - -Add tests first. - -- `NSNR-IO-001`: `*STEP, NLGEOM=YES` maps to `StaticProcedureKind::kNonlinearFullNewton`. -- `NSNR-IO-002`: `*STEP, NLGEOM=NO` maps to `kLinearSmallDisplacement` and existing shell linear tests keep passing. -- `NSNR-IO-003`: missing `NLGEOM` keeps current linear behavior. -- `NSNR-IO-004`: nonlinear `*STATIC` requires four finite positive values and time period exactly `1.0`. -- `NSNR-IO-005`: raw values are preserved in `StepDefinition` without derived factor list. -- `NSNR-IO-006`: unsupported nonlinear procedure or mixed linear/nonlinear steps fail closed with `unsupported-analysis-procedure`. -- `NSNR-IO-007`: S4 and S4R shell definitions remain approved nonlinear semantic inputs. -- `NSNR-IO-008`: mixed B33/S4 nonlinear model fails with `unsupported-mixed-element-model`. -- `NSNR-IO-009`: `*OUTPUT, FIELD, VARIABLE=PRESELECT` is accepted with deterministic warning and no Domain state. -- `NSNR-IO-010`: `*OUTPUT, HISTORY, VARIABLE=PRESELECT` is accepted with deterministic warning and no Domain state. -- `NSNR-IO-011`: malformed PRESELECT parameters fail as input errors. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "Domain|DomainMapping|Abaqus" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops the Step. - -## GREEN - -- Extend `StaticStepDefinition` and `StepDefinition` exactly with the fields and accessors above. -- Update domain construction so source-order boundaries and loads remain deterministic. -- Update `domain_mapping_context` to parse `NLGEOM=YES`, preserve raw `*STATIC`, emit PRESELECT warnings, and keep PRESELECT out of Domain state. -- Preserve existing linear shell and beam mappings. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "Domain|DomainMapping|Abaqus" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Only Step 1 status and one-line summary/error/blocked payload may be updated by the Implementation Agent. Executor owns timestamps, commits, retry, and next Step selection. - -## 금지사항 - -- Do not add `LoadFactorSequence()` to Domain. 이유: factor sequence ownership belongs to Step 5 control. -- Do not store PRESELECT flags in Domain or HDF5 state. 이유: approved I/O contract makes PRESELECT an ignored warning no-op. -- Do not alter requirements or I/O docs. 이유: upstream contracts are approved. diff --git a/phases/nonlinear-static-newton-raphson/step10.md b/phases/nonlinear-static-newton-raphson/step10.md deleted file mode 100644 index 05b7a4d..0000000 --- a/phases/nonlinear-static-newton-raphson/step10.md +++ /dev/null @@ -1,181 +0,0 @@ -# Step 10: prepared-analysis-flow-and-full-procedure - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/analysis/analysis.h` -- `include/fesa/analysis/linear_static_analysis.h` -- `src/fesa/analysis/linear_static_analysis.cpp` -- `src/fesa/app/fesa_application.cpp` -- `include/fesa/io/hdf5/hdf5_results_writer.h` -- `include/fesa/results/results_writer.h` -- `include/fesa/results/nonlinear_results_writer.h` -- Step 0 files: `include/fesa/app/output_paths.h`, `src/fesa/app/output_paths.cpp` -- Step 1 files: `include/fesa/model/domain.h`, `src/fesa/io/abaqus/domain_mapping_context.cpp` -- Step 5 files: `include/fesa/analysis/nonlinear_static_control.h` -- Step 6 files: `include/fesa/solvers/linear/tangent_solver.h` -- Step 7 files: `include/fesa/analysis/newton_iteration_log.h` -- Step 8 files: `include/fesa/analysis/nonlinear_analysis_state.h` -- Step 9 files: `include/fesa/results/nonlinear_results_writer.h`, `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h` - -## 이전 Step 전제 - -Steps 0-9 provide path/lease, Domain procedure identity, nonlinear element/control/solver/log/state, and nonlinear HDF5 writer. - -## 소유 파일 - -- Create: `include/fesa/analysis/prepared_analysis.h` -- Create: `src/fesa/analysis/prepared_analysis.cpp` -- Create: `include/fesa/analysis/linear_static_procedure.h` -- Create: `src/fesa/analysis/linear_static_procedure.cpp` -- Create: `include/fesa/analysis/nonlinear_static_procedure.h` -- Create: `src/fesa/analysis/nonlinear_static_procedure.cpp` -- Modify: `include/fesa/analysis/linear_static_analysis.h` -- Modify: `src/fesa/analysis/linear_static_analysis.cpp` -- Modify: `src/fesa/app/fesa_application.cpp` -- Test: `tests/integration/analysis/linear_static_analysis_test.cpp` -- Create: `tests/integration/analysis/nonlinear_static_procedure_test.cpp` -- Test: `tests/integration/app/fesa_application_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -struct PreparedAnalysisInput { - Domain domain; - std::vector diagnostics; -}; - -Result PrepareAnalysisInput( - const std::filesystem::path& input_path); - -struct LinearStaticExecutionResult { - AnalysisState state; - std::vector diagnostics; -}; - -class LinearStaticProcedureExecutor { - public: - LinearStaticProcedureExecutor(const ParallelFor& parallel_for, - LinearSolver& linear_solver); - Result Execute(const Domain& domain) const; - - private: - const ParallelFor& parallel_for_; - LinearSolver& linear_solver_; -}; - -struct NonlinearStaticExecutionResult { - NonlinearAnalysisState state; - std::vector diagnostics; -}; - -class NonlinearStaticProcedureExecutor { - public: - NonlinearStaticProcedureExecutor(const ParallelFor& parallel_for, - TangentSolver& tangent_solver); - Result Execute( - const Domain& domain, NewtonIterationLogWriter& log) const; - - private: - const ParallelFor& parallel_for_; - TangentSolver& tangent_solver_; -}; - -using PreparedAnalysisOutcome = - std::variant; - -Result ExecutePreparedAnalysis( - const Domain& domain, - LinearStaticProcedureExecutor& linear_executor, - NonlinearStaticProcedureExecutor& nonlinear_executor, - NewtonIterationLogWriter& log); - -Status FinalizePreparedAnalysisResult( - const DerivedOutputPaths& paths, - const Domain& domain, - const PreparedAnalysisOutcome& outcome, - const std::vector& diagnostics, - ResultsWriter& linear_writer, - NonlinearResultsWriter& nonlinear_writer); - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-PROC-001`: app validates argv, derives paths, acquires `OutputWriteLease`, opens log, then parses/maps exactly once. -- `NSNR-PROC-002`: parse/map diagnostics are sorted and preserved in prepared input. -- `NSNR-PROC-003`: linear `NLGEOM=NO` run uses `LinearStaticProcedureExecutor` and preserves existing numerical/HDF5 meaning except output names and log lifecycle. -- `NSNR-PROC-004`: nonlinear `NLGEOM=YES` run uses `NonlinearStaticProcedureExecutor`. -- `NSNR-PROC-005`: linear executor receives injected `ParallelFor` and existing `LinearSolver`; nonlinear executor receives injected `ParallelFor` and `TangentSolver`. -- `NSNR-PROC-006`: app constructs and owns concrete `TbbParallelFor`, `MklPardisoSolver`, `MklPardisoTangentSolver`, `Hdf5ResultsWriter`, and `NonlinearHdf5ResultsWriter`. -- `NSNR-PROC-007`: procedure computation/recovery returns a validated outcome without opening HDF5. -- `NSNR-PROC-008`: app closes log successfully before calling injected linear or nonlinear writer. -- `NSNR-PROC-009`: log close failure blocks HDF5 candidate creation. -- `NSNR-PROC-010`: nonlinear executor builds `NonlinearStateBaselineInput` from Domain nodes in stable internal order, preserving each node's `EntityIndex` and full `SourceEntityId`, then constructs state through `NonlinearAnalysisState::Create(domain, dofs, baseline)` before the first increment; the factor-zero baseline is committed state only and is not an accepted frame. -- `NSNR-PROC-011`: nonlinear increment loop uses factors from Step 5 and iterations `1..100`. -- `NSNR-PROC-012`: each entered iteration performs fresh tangent factorization and solves `Kff * delta = -r_f`. -- `NSNR-PROC-013`: global external vector/tangent from Step 5 is assembled once and combined with approved signs `r = f_int - f_ext`, `K_T = K_int - K_ext`; the fixed-moment tangent is subtracted once and is never duplicated per incident element. -- `NSNR-PROC-014`: iteration 100 can accept if gates pass; failure at 100 emits `nonlinear-nonconvergence` with no retry. -- `NSNR-PROC-015`: nonfinite data, factorization failure, solve failure, invalid accepted state, and log failure map to approved diagnostics. -- `NSNR-PROC-016`: constrained correction is zero and reactions/free residuals come from full residual `r = f_int - f_ext`. -- `NSNR-PROC-017`: failed nonlinear run preserves prior final HDF5 according to output lifecycle. -- `NSNR-PROC-018`: deterministic repeat produces same sparse structure, nodal source-identity order, result row order, diagnostics, and log line ordering. - -### USER-DECISION-003 option-1 revision addendum - -Step 10의 completed status, summary, timestamps와 commits는 보존한다. Existing procedure는 same-trial free residual/internal/external vectors를 force와 moment channel별로 분리하여 `EvaluateNewtonConvergence`에 전달하고 fresh same-iteration correction을 별도로 전달한다. 따라서 option 1의 production correction은 Step 11의 `nonlinear_static_control.cpp`에 한정하며 `nonlinear_static_procedure.cpp`, prepared-analysis API와 log writer production 변경은 예상하지 않는다. Step 11의 shellNL copied-input run과 log assertions이 unloaded rotational external channel의 exact-zero branch, loaded force channel의 retained relative branch, four-channel AND 및 intended factors `0.1..1.0`을 integration 수준에서 검증한다. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Refactor current parse/map and linear compute/recovery out of `LinearStaticAnalysis::Run()` into `PrepareAnalysisInput` and `LinearStaticProcedureExecutor`. Keep `LinearStaticAnalysis` as a compatibility wrapper that delegates through the new flow and does not contain nonlinear conditions. Implement `NonlinearStaticProcedureExecutor` in `nonlinear_static_procedure.*` using Steps 2-8, constructing state only through `NonlinearAnalysisState::Create(...)` with one baseline per Domain node in stable internal order, forming `r = f_int - f_ext` and `K_T = K_int - K_ext`, preserving `EntityIndex` plus full `SourceEntityId` into final writer inputs, and delaying all HDF5 work until `FinalizePreparedAnalysisResult`. The app owns concrete adapters and passes them through interfaces. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 10 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not parse/map twice. 이유: source identity, diagnostics, and Domain lifetime must be deterministic. -- Do not reconstruct nodal identity from source labels alone. 이유: labels can repeat across instances and HDF5/reference matching requires full `SourceEntityId`. -- Do not open HDF5 before log close succeeds. 이유: io.md requires log close success before HDF5 candidate open/write/final replace. -- Do not insert nonlinear branches into `LinearStaticAnalysis` private lifecycle. 이유: new procedure owns its own lifecycle. -- Do not replace final HDF5 on failed analysis, log failure, or HDF5 failure. 이유: asymmetric preservation contract requires prior valid final preservation. -- Do not construct MKL/TBB/HDF5 backends inside procedure executors. 이유: dependencies are injected so tests can observe lifecycle and no backend type crosses analysis/core public boundaries. -- Do not duplicate the option-1 selector in the procedure or log writer. 이유: the existing procedure already transports the three residual vectors separately and convergence ownership remains in `nonlinear_static_control`. diff --git a/phases/nonlinear-static-newton-raphson/step11.md b/phases/nonlinear-static-newton-raphson/step11.md deleted file mode 100644 index 865f7e7..0000000 --- a/phases/nonlinear-static-newton-raphson/step11.md +++ /dev/null @@ -1,408 +0,0 @@ -# Step 11: equilibrium-projection-and-reference-gate - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 목적 - -USER-DECISION-004 option 1과 `AUDIT-001`을 구현·검증한다. 같은 accepted factor-one state에서 -accepted free residual, constrained reaction resultant, global applied-plus-reaction balance error를 -서로 다른 quantity로 재구성하고, 기존 schema-v1 `/global/equilibrium`에는 balance error만 저장한다. -Fine nonlinear case는 primary, coarse nonlinear case는 companion으로 검증한다. Local nodal -`RF1/RF2/RF3`와 physical spatial `RM1/RM2`는 deterministic review-only evidence이고 blocking -verdict를 바꾸지 않는다. Global force와 moment balance는 각각 fixed normalized `<=1e-8` -comparator gate를 사용하며 runtime configuration 또는 product solver acceptance로 노출하지 않는다. - -## 읽어야 할 파일 - -- `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/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` §§11.4, 13.1, 13.4, 14.1 -- `../../docs/nonlinear-static-newton-raphson/README.md` §§3.2, 6.2, 6.3 -- `../../docs/nonlinear-static-newton-raphson/README.md` §§3–6 -- `../../docs/nonlinear-static-newton-raphson/README.md` §§7.3–7.5.1, 8.1–8.7 -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` §13 -- `phases/nonlinear-static-newton-raphson/index.json` -- `include/fesa/analysis/nonlinear_analysis_state.h` -- `include/fesa/analysis/nonlinear_static_procedure.h` -- `include/fesa/analysis/nonlinear_static_control.h` -- `src/fesa/analysis/nonlinear_static_procedure.cpp` -- `src/fesa/analysis/nonlinear_static_control.cpp` -- `include/fesa/results/nonlinear_results_writer.h` -- `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h` -- `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` -- `tests/integration/analysis/nonlinear_static_procedure_test.cpp` -- `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` -- `tests/unit/analysis/nonlinear_static_control_test.cpp` -- `tests/unit/analysis/newton_iteration_log_test.cpp` -- `tests/reference/reference_tolerance_policy.h` -- `tests/reference/reference_tolerance_policy.cpp` -- `tests/reference/nonlinear_static_reference_comparison.h` -- `tests/reference/nonlinear_static_reference_comparison.cpp` -- `tests/reference/nonlinear_static_reference_cases_test.cpp` -- `tests/CMakeLists.txt` -- 과거 검증 자료(정리됨) -- `CMakePresets.json` - -## 이전 Step과 보존 전제 - -- Steps 0–10은 completed다. 그 status, summary, timestamp, commit 또는 구현을 replay, amend, - reset하거나 다시 작성하지 않는다. -- 현재 worktree의 `NSNR-CTRL-018..021`, `NSNR-LOG-012`, `NSNR-PROC-019`, - `NSNR-HDF5-014`, residual-selector GREEN과 `NSNR-REF-001..023` comparator/CMake 작업은 - 이전 blocked Step 11에서 생성된 보존 대상이다. 삭제·재생성·reset하지 말고 현재 내용에서 - 계속한다. -- 현재 comparator의 shared `<=1e-10` global force/moment gate는 이전 blocker를 재현하는 - 보존된 implementation state다. 새 RED가 approved between-threshold metric을 거부하는 것을 - 증명한 뒤 comparator 내부 gate만 `<=1e-8`로 변경한다. -- Selector RED는 이미 과거 실행 evidence에 속한다. 이 재실행에서 selector RED를 fabricate하거나 - 다시 실패시키지 않는다. 기존 테스트가 계속 green인지 focused VERIFY에서 확인한다. -- Step 12는 pending이며 이 Step에서 시작하지 않는다. - -## 소유 파일 - -RED test를 먼저 추가한 뒤 필요한 production file만 최소 수정한다. - -- Modify test first: `tests/integration/analysis/nonlinear_static_procedure_test.cpp` -- Modify test first: `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` -- Preserve and extend test-private comparator: `tests/reference/nonlinear_static_reference_comparison.h` -- Preserve and extend test-private comparator: `tests/reference/nonlinear_static_reference_comparison.cpp` -- Preserve and extend tests: `tests/reference/nonlinear_static_reference_cases_test.cpp` -- Preserve existing registration; edit only if the current sources are not registered: - `tests/CMakeLists.txt` -- Minimal GREEN: `src/fesa/analysis/nonlinear_static_procedure.cpp` -- Minimal GREEN: `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` -- Preserve existing partial GREEN/tests without redesign: - `src/fesa/analysis/nonlinear_static_control.cpp`, - `tests/unit/analysis/nonlinear_static_control_test.cpp`, - `tests/unit/analysis/newton_iteration_log_test.cpp` - -No public header, new CMake target, new HDF5 dataset, schema-version change or reference artifact is -owned by this Step. - -## Authoritative HDF5 입력과 test-private report 경계 - -Comparator는 아래 existing schema-v1 paths만 읽는다. - -```text -/model/nodes [node_count] -/model/nodal_constraint_mask [node_count,6] -/steps/Step-1/accepted_frames unique factor-one row -/steps/Step-1/frames//nodal/displacement [node_count,6] -/steps/Step-1/frames//nodal/generalized_internal_force [node_count,6] -/steps/Step-1/frames//nodal/generalized_external_force [node_count,6] -/steps/Step-1/frames//nodal/generalized_residual [node_count,6] -/steps/Step-1/frames//nodal/reaction [node_count,6] -/steps/Step-1/frames//global/equilibrium [6] -``` - -`/global/equilibrium` component order is -`FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3` and its required -`location` is `global-balance-error`. - -Preserve the current test-private types and make only the extensions needed by the approved -dispositions and distinct internal evidence. Add the required standard `` and `` -includes to the test-private header. Candidate signature-level shape: - -```cpp -namespace fesa::test { - -enum class NonlinearReferenceDisposition { - kBlocking, - kWarningOnly, - kReviewOnly, - kExcluded, -}; - -struct NonlinearReferencePrecheckFinding { - std::string family_identity; - NonlinearReferenceDisposition disposition; - std::string diagnostic_code; - std::vector affected_keys; -}; - -struct NonlinearInternalEquilibriumReport { - std::string family_identity; - std::size_t row_count; - double numerator; - double scale; - std::optional normalized_metric; - bool passed; - std::string diagnostic_code; -}; - -struct ConstrainedReactionResultantReport { - std::array force; - std::array moment; -}; - -struct NonlinearReferenceComparisonReport { - std::string case_id; - std::filesystem::path original_input_path; - std::filesystem::path copied_input_path; - std::filesystem::path generated_results_hdf5; - std::filesystem::path generated_log_path; - std::vector pre_run_artifacts; - std::vector post_run_artifacts; - std::vector families; - std::vector precheck_findings; - std::vector internal_equilibrium; - ConstrainedReactionResultantReport constrained_reaction_resultant; - bool external_blocking_passed; - bool internal_blocking_passed; - bool blocking_passed; -}; - -} // namespace fesa::test -``` - -These are test-support interfaces only. Match the existing aggregate/data style and avoid a public -solver API. For an exact-zero internal scale, leave `normalized_metric` empty and use -`diagnostic_code` plus the exact-zero numerator/pass rule instead of writing NaN or Inf. - -## Required physical algorithm - -For each node in stable Domain order at the accepted state: - -1. Read `X` from Domain/model identity and `u, phi` from the accepted state. Set `x=X+u`. -2. Read generalized applied force/covector from `generalized_external_force`. -3. Build constrained generalized reaction by applying the exact component mask to - `generalized_residual` before any rotational conversion. -4. Convert applied and constrained-reaction rotational covectors independently with - `InverseTransposeLeftJacobianSO3(phi)`. Do not convert their sum as a shortcut and do not mix - free generalized residual into reaction. -5. Accumulate, about global origin `[0,0,0]`: - -```text -F_applied += applied spatial force -M_applied += x cross F_applied_node + applied spatial physical moment -F_reaction += constrained reaction spatial force -M_reaction += x cross F_reaction_node + reaction spatial physical moment -global balance error = [F_applied + F_reaction, - M_applied + M_reaction] -``` - -Store only the six-component balance error in the existing accepted-frame -`global_equilibrium` and existing `/global/equilibrium` dataset. Reconstruct the constrained -reaction resultant and accepted free residual separately in the comparator; do not add summary -datasets or a public header. - -For internal blocking gates: - -- Force scale is `max(sum(||F_applied_node||2), sum(||F_reaction_node||2))`. -- Moment scale is - `max(sum(||x cross F_applied_node + M_applied_node||2), - sum(||x cross F_reaction_node + M_reaction_node||2))`. -- Force and moment use separate `||balance_error||2/scale <= 1e-8` gates. If scale is exact zero, - only exact-zero balance passes. No floor, `max(1,scale)` or clamp is allowed. -- Accepted free translation-force and rotation-moment rows use the exact free mask and reproduce - NSNR-069: nonzero matching external scale uses - `||residual||inf/max(||internal||inf,||external||inf) <= 1e-2`; exact-zero external scale uses - typed absolute `<=1e-3`. Finite checks occur first. -- `../../docs/solver-core/README.md` is not used for these internal gates. - -## RED - -기존 dirty `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-020..023`은 재작성하지 않는다. -먼저 existing `NSNR-REF-022`를 실행해 old shared gate failure를 다시 관찰·기록한 뒤, -`NSNR-REF-024..025`를 comparator threshold 변경 전에 test-first로 추가한다. Procedure/HDF5 -behavior는 threshold rework를 위해 추가 변경하지 않는다. - -- Approved draft label `NSNR-PROC-011` collides with completed Step 10's historical - `NSNR-PROC-011` increment-loop identity. Preserve that history and use collision-resolved test ID - `NSNR-PROC-019` with exact GTest symbol - `NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance`. - Use a supported nonlinear shell input with nonzero prescribed translation and rotation plus a - resolved fixed-global load. Independently reconstruct the six balance components from accepted - `X,u,phi`, external force and masked residual. Expected RED: the current helper uses initial - coordinates, raw full-residual summation and raw rotational residual, so the current-arm/spatial - expected vector or distinct constrained/free projection assertion fails. -- `NSNR-HDF5-014` - `NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation` checks existing path/shape, - exact component names, schema version 1 and `location=global-balance-error`. Expected RED: current - writer emits `location=global-origin`. -- `NSNR-REF-020` - `NonlinearStaticReference.AuditsFinePrimaryAndCoarseCompanionArtifacts` checks all exact fine, - coarse and linear input/CSV hashes, fine/coarse independent execution directories and case roles. - Expected RED: current case inventory supports only coarse nonlinear and linear cases. -- `NSNR-REF-021` - `NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict` injects or observes - failing local RF/RM row/RMS decisions while U and internal blocking families pass. It requires - deterministic local error/precheck reporting and an unchanged blocking pass. Expected RED: - current local RF/RM dispositions are `kBlocking`. -- `NSNR-REF-022` - `NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual` fails each coarse/fine - global-force, global-moment, free-force-residual and free-moment-residual family one at a time, - then passes all. It also asserts the constrained reaction resultant is a distinct review summary. - Expected RED for this re-execution: the preserved comparator applies the old shared `<=1e-10` - gate, so the approved coarse metric `1.413750912531167e-10` and fine metric - `2.7454660159924086e-10` are rejected even though both are below `1e-8`. -- `NSNR-REF-023` - `NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings` - covers blocking, warning-only and review-only families. Blocking precheck failure changes the - blocking verdict; warning/review failures remain ordered findings. Expected RED: the current - comparator cannot retain review-only precheck findings independently of the blocking verdict. -- `NSNR-REF-024` - `NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate` uses a - test-private balance evaluator for distinct force and moment family identities. It requires an - approved between-threshold metric such as `5e-9` and exact `1e-8` to pass, and - `nextafter(1e-8,+infinity)` to fail for both identities. Expected decisive RED: the preserved - shared `<=1e-10` comparison rejects `5e-9` and `1e-8`. -- `NSNR-REF-025` - `NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance` exercises - force and moment identities independently and requires exact-zero scale plus exact-zero numerator - to pass while any nonzero numerator fails without NaN/Inf or a fabricated normalized metric. This - is an unchanged-contract regression and may already pass in the RED batch; it must be present - before GREEN. - -Run and record the observed failures: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter|NonlinearStaticReference)\." --output-on-failure -``` - -The new tests must fail for the stated reasons. A compile failure caused only by the test-first -enum/report extension is valid RED when the diagnostic identifies the missing planned production/ -test-support behavior. An unexpected pass or unrelated failure stops the Step for classification. - -## Minimal GREEN - -1. Replace the private raw-residual/initial-coordinate global helper in - `src/fesa/analysis/nonlinear_static_procedure.cpp` with the Required physical algorithm above. - Keep stable node order, mask-before-conversion, independent applied/reaction conversion and - finite failure behavior. Do not change the public procedure header or accepted-state layout. -2. In `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp`, preserve the path, shape, component - names and schema version; change the exact `/global/equilibrium` location attribute to - `global-balance-error` and keep writer validation finite/fail-closed. -3. Extend the existing comparator without deleting its partial work: - - add fine primary inventory and keep coarse companion/linear control independent; - - add `kReviewOnly` and keep local RF/RM key/schema/inventory/finite/row/RMS evidence; - - reconstruct the constrained reaction resultant and accepted free residual from the exact HDF5 - paths/mask; never use `/nodal/reaction` or `/global/equilibrium` as a substitute for all three; - - apply internal gates exactly as specified above, using one test-private/internal shared - `1.0e-8` constant for both distinct force and moment families; - - keep U blocking, UR warning-only, local RF/RM review-only, RM3/stress excluded; - - reject blocking missing/extra/duplicate/nonfinite rows before tolerance and retain ordered - nonblocking findings; - - set overall blocking verdict from blocking external U families AND all internal global/free - families only. -4. Preserve existing `NSNR-CTRL-018..021`, `NSNR-LOG-012`, Full Newton, fixed factors, iteration - limit, 39-field log schema and the already corrected residual selector unchanged. -5. Do not change production solver/configuration behavior for the balance threshold. No `fesa.env`, - environment variable, CLI option, public API or HDF5 schema change is part of this GREEN. - -## Exact read-only artifact inventory - -| case | exact path | rows | SHA-256 | -| --- | --- | ---: | --- | -| fine primary | `reference/shellNL-meshfine/shellNL-meshfine.inp` | input | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | -| fine primary | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 729 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | -| fine primary | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 729 | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | -| fine optional | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | 5,408 | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | -| coarse companion | `reference/shellNL/shellNL.inp` | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | -| coarse companion | `reference/shellNL/shellNL displacements.csv` | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | -| coarse companion | `reference/shellNL/shellNL reactions.csv` | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | -| coarse optional | `reference/shellNL/shellNL stresses.csv` | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | -| linear control | `reference/shell/shell.inp` | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | -| linear control | `reference/shell/shell displacements.csv` | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | -| linear optional | `reference/shell/shell reactions.csv` | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | -| linear optional | `reference/shell/shell stresses.csv` | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | - -For every case, snapshot original inventory, bytes, SHA-256, size and timestamp; copy only the `.inp` -bytes to a unique build-local directory; run only the copy; consume copied-sibling `_results.h5` and -`_log.txt`; compare against original read-only CSVs; then prove the original inventory is unchanged. - -## External comparison and classification - -- Fine and coarse `U1/U2/U3` are separate blocking families. -- Linear `U1/U2/U3` is a blocking regression family. -- All `UR1/UR2/UR3` families are warning-only. -- Fine/coarse local `RF1/RF2`, `RF3`, spatial `RM1/RM2` are separate review-only families with exact - mask-derived keys and complete common-policy error reports. -- `RM3` and all stress values have no numerical family. Stress files remain hash-audited optional - inventory; the known fine malformed optional stress key is not repaired. -- External families use exactly `../../docs/solver-core/README.md`: reference-only `S=max(abs(reference))`, - `B=0.01*S`, near-zero row `abs(error)<=B`, other-row relative `<=0.05`, family - `RMS(error)/S<=0.01`, exact-zero family exact-zero FESA only. No absolute floor, averaging, - collapse, row-order identity, clamp or tolerance relaxation. - -The final gate order is literally: - -```text -ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT -``` - -## Focused and full VERIFY - -After minimal GREEN, run in this order and retain command, exit code, duration and output tail for -Step 12: - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -The Harness launch environment must be VsDevCmd x64 and inherit `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, -`TBB_DIR`, and `HDF5_DIR`. Do not substitute the solution-only MSBuild path. - -## Acceptance Criteria - -- New RED tests fail first for their declared current behavior, then pass after minimal GREEN. -- `/global/equilibrium` remains schema v1 `[6]` with the same component names and stores only the - current-arm/spatial-moment applied-plus-reaction balance error with - `location=global-balance-error`. -- Fine/coarse global force and moment normalized metrics are each `<=1e-8`; exact-zero scale follows - the exact-zero rule. -- Fine/coarse accepted free force and moment residual gates pass NSNR-069 independently. -- Fine/coarse U blocking and linear U regression pass `../../docs/solver-core/README.md`. -- UR differences remain warning-only. Local RF/RM findings remain review-only and cannot fail the - blocking verdict. RM3/stress remain excluded. -- Missing/extra/duplicate/nonfinite blocking rows fail before tolerance; warning/review findings are - deterministic and nonblocking. -- Original reference artifact content, inventory, size, timestamp and hash are unchanged. -- Focused tests, test discovery and full CTest pass without new compiler warnings. - -## 상태 기록 - -On success, update only Step 11 to `completed` and add one concise `summary`. On an implementation, -build, test or reference-comparison failure, classify it and update only the Executor-selected Step's -allowed payload. Executor owns retry, timestamps, commits, advancement and top-level status. Do not -start Step 12. - -## 금지사항 - -- Do not edit any reference artifact. 이유: exact stored files are immutable external evidence. -- Do not run FESA on an original reference `.inp`. 이유: derived sibling outputs would mutate the - reference directory. -- Do not add HDF5 datasets, change schema version/path/shape/components or add public headers. 이유: - Stage 5 requires reconstruction from existing schema-v1 datasets. -- Do not use initial coordinates or raw rotational covectors for global physical moment. 이유: - `AUDIT-001` requires accepted current arms and spatial moment conversion. -- Do not apply the constraint mask after spatial conversion. 이유: partial rotational constraints - would mix free residual into reaction. -- Do not use `/global/equilibrium`, local `/nodal/reaction` or a raw full-residual sum as a substitute - for all three equilibrium quantities. 이유: their physical identities differ. -- Do not make local reaction rows blocking or omit their review evidence. 이유: USER-DECISION-004 - fixes review-only with deterministic findings. -- Do not compare `RM3` or stress values, average/collapse rows, match by row order, clamp zero values, - add `max(1,S)`, relax tolerance or repair CSVs. 이유: approved identity/tolerance contracts forbid it. -- Do not add `fesa.env`, runtime configuration, product solver acceptance, CLI or public API behavior - for the `1e-8` gate. 이유: this fixed threshold belongs only to comparator-owned internal verification. -- Do not replay or fabricate selector RED, delete partial Step 11 work, reset history, commit, push, - run a reference solver, start Step 12, or claim Physics/Release readiness. -- Stop and return a classified blocker if the required behavior needs an upstream contract, public - API, HDF5 schema, tolerance or reference-artifact change. diff --git a/phases/nonlinear-static-newton-raphson/step12.md b/phases/nonlinear-static-newton-raphson/step12.md deleted file mode 100644 index 2216786..0000000 --- a/phases/nonlinear-static-newton-raphson/step12.md +++ /dev/null @@ -1,234 +0,0 @@ -# Step 12: execution-closure-and-evidence-docs - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 목적 - -Step 11이 실제로 통과한 뒤에만 fresh MSVC/CTest와 reference gate evidence를 수집하고 Stage 6 -canonical reports를 actual output으로 작성한다. 직접 superseded된 PRD/ARCHITECTURE/ADR 문장만 -최소 동기화한다. 이 Step은 solver 동작을 새로 구현하지 않는다. - -## 읽어야 할 파일 - -- `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/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` §§11.4, 13.1, 13.4, 14.1 -- `../../docs/nonlinear-static-newton-raphson/README.md` §§3.2, 6.2, 6.3 -- `../../docs/nonlinear-static-newton-raphson/README.md` §§3–6 -- `../../docs/nonlinear-static-newton-raphson/README.md` §§7.5.1, 8.1–8.7 -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` §13 -- `phases/nonlinear-static-newton-raphson/index.json` -- `phases/nonlinear-static-newton-raphson/step11.md` -- All source/test/CMake files actually changed by Steps 0–11 -- 과거 검증 자료(정리됨) -- `CMakePresets.json` - -## 시작 전 hard gate - -- Steps 0–10의 completed history를 그대로 유지한다. -- Step 11 must be `completed` with an actual summary and passing RED/GREEN/VERIFY evidence. -- If Step 11 is not completed, stop without creating/updating evidence docs or global docs. -- Do not infer Step 11 success from a prior blocked run, diagnostic spike or translation-only report. - -## 소유 파일 - -- Modify only directly superseded statements: `../../docs/solver-core/README.md` -- Modify only directly superseded statements: `../../docs/solver-core/README.md` -- Modify only directly superseded decisions or add the minimum accepted decision record: - `../../docs/solver-core/README.md` -- Create from actual outputs: `../../docs/nonlinear-static-newton-raphson/README.md` -- Create from actual outputs: `../../docs/nonlinear-static-newton-raphson/README.md` -- Create from actual outputs: `../../docs/nonlinear-static-newton-raphson/README.md` - -No C++ production, public header, test, CMake, Harness, reference or tolerance file is owned by this -Step. - -## RED: evidence freshness audit - -Perform this audit before writing reports. The expected initial result is failure because the three -canonical reports are missing or do not contain this Step's fresh evidence. - -- `NSNR-EVID-001`: `implementation-report.md` is missing or stale unless it records every Step 11 new - RED test, the observed reason, minimal GREEN diff, focused/full VERIFY and preserved - `NSNR-CTRL-018..021`/`NSNR-LOG-012` evidence. -- `NSNR-EVID-002`: `build-test.md` is missing or stale unless it records fresh configure, build, - discovery, focused/full CTest commands with exit code, duration, output tail, MSVC x64 Debug - environment, warning audit and failure classification. -- `NSNR-EVID-003`: `reference-comparison.md` is missing or stale unless it records the literal - `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` run with exact paths/hashes, generated HDF5/log - paths, projection, row decisions, metrics, classification and no-change evidence. -- `NSNR-EVID-004`: evidence or global docs are stale if they still classify local RF/RM as blocking, - omit review-only findings, identify coarse shellNL as the only nonlinear case, or describe - `/global/equilibrium` as raw full-residual/initial-arm evidence. -- `NSNR-EVID-005`: reference evidence is stale if it lacks fine-primary/coarse-companion/linear-control - inventory, separate U/UR/local reaction families, four coarse and four fine internal blocking - equilibrium families, the inclusive `1e-8` force/moment boundary and exact-zero-scale regressions, - and the distinct constrained-reaction summary. -- `NSNR-EVID-006`: implementation evidence is stale unless it closes `AUDIT-001` with actual tests for - nonzero prescribed translation/rotation, `x=X+u`, mask-before-conversion, independent - `InverseTransposeLeftJacobianSO3(phi)` conversion, and `location=global-balance-error`. -- `NSNR-EVID-007`: command evidence is stale if copied from an earlier run, omits artifact pre/post - immutability, lacks command output/exit/duration, changes the required stage order, or claims a - verdict before CLASSIFY. - -Record this expected failing freshness audit in `implementation-report.md` only after fresh evidence -has been collected. If the audit unexpectedly passes before this Step's commands, stop and report the -evidence provenance conflict. - -## GREEN: fresh evidence execution - -Use the ignored 과거 검증 자료(정리됨) and tracked `windows-msvc-ninja-debug` preset. The parent -environment must be VsDevCmd x64 and contain `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and -`HDF5_DIR`. - -### 1. Fresh build and regression evidence - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Record command, working directory, exit code, duration, stdout/stderr tail and failed-test inventory. -Audit new compiler warnings. Stop at the first decisive failure and classify it as -`configure | compile | link | test | reference-comparison | harness | environment | upstream-contract`. - -### 2. Final reference gate in literal order - -#### ARTIFACT CHECK - -- Verify every exact fine/coarse/linear input/CSV path and SHA-256 from `reference-model.md` and - `step11.md`. -- Verify readable headers, exact nonlinear factor-one Frame, source node/component inventories, - uniqueness and finite required values. -- Snapshot original inventory, size, timestamps and hashes before any copied-input run. -- Verify generated results will be written only under unique build-local copied-input directories. - -#### COMPARE - -```powershell -ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure -ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure -``` - -Compare by `(case_id, accepted_state, canonical_instance_name, source_node_label, component)`, never -by row order. Apply `../../docs/solver-core/README.md` only to external U/UR/local-review families. Apply internal -`1e-8` force/moment balance and NSNR-069 free-residual gates separately. Preserve the exact -blocking/warning/review/excluded dispositions. - -#### CLASSIFY - -- Blocking pass requires fine/coarse U families, linear U regression and all eight fine/coarse - internal equilibrium families to pass. -- UR failure is warning-only. -- Local RF/RM precheck/row/RMS failure is a deterministic review finding and cannot change blocking - pass/fail. -- RM3/stress values are excluded. -- Any blocking missing/extra/duplicate/nonfinite row fails before tolerance. -- Classify actual failures without relaxing tolerance, changing artifacts or claiming external solver - internal equivalence. - -#### REPORT - -Only after CLASSIFY, write the three canonical reports from actual outputs. - -## Report contracts - -### `implementation-report.md` - -Record metadata, approved upstream hashes, Steps 0–10 preserved summaries, Step 11 RED failures, -minimal GREEN file/symbol changes, focused/full VERIFY commands and results, `AUDIT-001` closure, -requirement/test traceability, no-change assertion, classification and open issues. Do not invent -unobserved output. - -### `build-test.md` - -Use `owner_agent: implementation-agent`. Record execution environment, exact commands, working -directories, exit codes, durations, output tails, discovered test inventory, focused/full results, -new-warning audit, failure classification, failed tests, handoff recommendation, no-change assertion -and open issues. - -### `reference-comparison.md` - -Record exact input/CSV SHA inventory, copied input and generated HDF5/log paths, accepted factor-one -frame, every HDF5 projection/path/component, stable source-key matching, row prechecks, external -common tolerance, internal gates, per-family/per-row decisions, max absolute error, applicable -relative error, RMS/scale metric, constrained-reaction summary, warnings/review findings, final -classification, original artifact post-run identity, no-change assertion and open issues. - -The report must explicitly state that FESA HDF5 is authoritative, CSV is external comparison -evidence, and numerical agreement does not imply Abaqus S4 internal formulation equivalence. - -## Minimal PRD/ARCHITECTURE/ADR sync - -After actual passing evidence exists, update only statements directly superseded by the implemented -feature: - -- repository-wide derived result/log names and removal of `--output`; -- prepared parse-once linear/nonlinear procedure boundary and separate nonlinear state/solver/writer; -- nonlinear HDF5 schema v1 accepted-frame meaning; -- `/global/equilibrium` as current-arm/spatial-moment applied-plus-reaction balance error; -- distinct accepted free residual and constrained reaction resultant projections; -- fine primary/coarse companion, U blocking, UR warning-only, local RF/RM review-only and RM3/stress - exclusion. - -Do not rewrite unrelated V0 history, refactor architecture prose or add future scope. - -## Final validation - -```powershell -git diff --check -git status --short -``` - -Confirm the original reference pre/post hashes, sizes, timestamps and inventory are equal. Confirm -that every required report statement is backed by a command or deterministic artifact observation. -Harness Python validation is not required because this Step does not change Harness Python, hooks or -agent configuration. - -## Acceptance Criteria - -- Evidence freshness audit initially fails for the declared stale/missing reason and is recorded. -- Fresh configure/build/discovery/focused/full CTest all pass with MSVC x64 Debug and no new warnings. -- Final gate executes in exact order `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. -- All blocking external and internal families pass; warnings and review findings remain - nonblocking and are fully reported. -- `AUDIT-001`, fine/coarse roles and reaction disposition have direct test/output evidence. -- Three canonical Stage 6 reports contain reproducible commands, metrics, classifications and - no-change assertions. -- PRD/ARCHITECTURE/ADR edits are limited to directly superseded statements. -- `git diff --check` passes and reference artifacts remain byte-for-byte unchanged. - -## 상태 기록 - -On success, update only Step 12 to `completed` and add one concise `summary`. Executor owns -timestamps, commits, top-level completion and advancement. A passing Step 12 returns Stage 6 evidence -to Coordinator; it does not itself dispatch Physics or Release. - -## 금지사항 - -- Do not create or update evidence reports before actual fresh output exists. 이유: Stage 6 reports - are execution evidence, not predictions. -- Do not change C++ code, tests, CMake, Harness configuration, tolerance or reference artifacts. - 이유: Step 12 is evidence closure only. -- Do not reorder or collapse `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. 이유: schema and - identity failures must precede tolerance and verdict. -- Do not make local RF/RM blocking, omit their errors, or compare RM3/stress. 이유: - USER-DECISION-004 fixes the disposition. -- Do not use Abaqus CSV/tolerance for internal balance/free-residual gates or claim Abaqus internal - equivalence. 이유: external comparison and internal physics evidence are distinct. -- Do not broadly rewrite PRD/ARCHITECTURE/ADR, alter Steps 0–11 history, commit, push, run a reference - solver, or claim Physics/Release readiness. diff --git a/phases/nonlinear-static-newton-raphson/step2.md b/phases/nonlinear-static-newton-raphson/step2.md deleted file mode 100644 index 40a8444..0000000 --- a/phases/nonlinear-static-newton-raphson/step2.md +++ /dev/null @@ -1,100 +0,0 @@ -# Step 2: finite-rotation-state - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/math/vector3.h` -- `include/fesa/math/matrix.h` -- `tests/unit/math/vector3_test.cpp` -- `tests/unit/math/matrix_test.cpp` -- Step 1 files: `include/fesa/model/model_types.h`, `include/fesa/model/domain.h` - -## 이전 Step 전제 - -Step 1 exposes nonlinear static semantic selection. This Step adds finite rotation math used by nonlinear MITC4 and state recovery. - -## 소유 파일 - -- Create: `include/fesa/elements/finite_rotation.h` -- Create: `src/fesa/elements/finite_rotation.cpp` -- Create: `tests/unit/elements/finite_rotation_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -struct FiniteRotationState { - Vector3 phi; - Matrix q; - Vector3 director; -}; - -Matrix ExpSkew(const Vector3& phi); -Matrix LeftJacobianSO3(const Vector3& phi); -Matrix InverseTransposeLeftJacobianSO3(const Vector3& phi); -Result MakeFiniteRotationState( - const Vector3& phi, const Matrix& initial_frame); -Result ApplyGlobalRotationIncrement( - const FiniteRotationState& committed, - const Vector3& delta_phi, - const Matrix& initial_frame); - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-ROT-001`: zero `phi` returns `Q0` and `director=Q0*e3`. -- `NSNR-ROT-002`: finite `phi` satisfies `Q=exp(phi^)Q0`, `Q^T Q=I`, `det(Q)=1`, `director=Qe3`. -- `NSNR-ROT-003`: update uses `Q+ = exp((phi + delta_phi)^)Q0`. -- `NSNR-ROT-004`: principal branch margin `sqrt(epsilon_double)` rejects ambiguous rotations near `pi`. -- `NSNR-ROT-005`: `LeftJacobianSO3` and inverse-transpose are finite and derivative-consistent for small, medium, and near-branch-safe rotations. -- `NSNR-ROT-006`: nonfinite rotation components fail with `invalid-accepted-state` or the Step-introduced finite-rotation diagnostic. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "FiniteRotation" --output-on-failure -``` - -Expected: tests fail because the rotation module does not exist. Unexpected pass stops. - -## GREEN - -Implement the SO(3) helper functions with finite checks and principal-branch validation. Use existing FESA math types and keep MKL/vendor types out of public headers. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "FiniteRotation" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 2 status and summary/error/blocked payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not normalize invalid rotation matrices to make tests pass. 이유: invalid nonlinear state must fail closed. -- Do not add element residual or tangent code here. 이유: this Step owns only finite rotation state. -- Do not expose backend/vendor types. 이유: public solver core must remain backend-neutral. diff --git a/phases/nonlinear-static-newton-raphson/step3.md b/phases/nonlinear-static-newton-raphson/step3.md deleted file mode 100644 index 0966337..0000000 --- a/phases/nonlinear-static-newton-raphson/step3.md +++ /dev/null @@ -1,123 +0,0 @@ -# Step 3: nonlinear-mitc4-kinematics-and-recovery - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/elements/mitc4_shell.h` -- `src/fesa/elements/mitc4_shell.cpp` -- `tests/unit/elements/mitc4_shell_test.cpp` -- `include/fesa/model/shell_geometry.h` -- `src/fesa/model/shell_geometry.cpp` -- `include/fesa/model/model_types.h` -- `include/fesa/results/result_records.h` -- Step 2 files: `include/fesa/elements/finite_rotation.h`, `src/fesa/elements/finite_rotation.cpp` - -## 이전 Step 전제 - -Step 2 provides finite rotation state and SO(3) Jacobian helpers. - -## 소유 파일 - -- Create: `include/fesa/elements/nonlinear_mitc4_shell.h` -- Create: `src/fesa/elements/nonlinear_mitc4_shell.cpp` -- Create: `tests/unit/elements/nonlinear_mitc4_shell_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -struct NonlinearMitc4TrialDofs { - std::array displacement; - std::array rotation_vector; -}; - -struct NonlinearMitc4RecoveryPoint { - ShellMidsurfaceLocation location; - std::array natural_coordinates; - Mitc4LocalFrame local_frame; - std::array generalized_strain; - std::array section_resultant; - std::array stress; -}; - -struct NonlinearMitc4Recovery { - std::array gauss_points; - double physical_strain_energy; -}; - -class NonlinearMitc4Shell { - public: - static Result Create( - std::array nodes, - std::array initial_frames, - const ShellSection& section, - const LinearElasticMaterial& material); - - Result EvaluateKinematics( - const NonlinearMitc4TrialDofs& trial) const; - Result RecoverState( - const NonlinearMitc4TrialDofs& trial) const; -}; - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-ELEM-KIN-001`: initial undeformed state produces zero generalized strain and zero material stress. -- `NSNR-ELEM-KIN-001A`: `NonlinearMitc4Shell::Create` requires exactly four `Node` pointers, four corresponding `ShellNodeInitialFrame` records, one `ShellSection`, and one `LinearElasticMaterial`; invalid or mismatched inputs fail closed. -- `NSNR-ELEM-KIN-002`: fixed-initial Total Lagrangian geometry uses initial midsurface and initial directors. -- `NSNR-ELEM-KIN-003`: current director interpolation for strain uses unnormalized interpolated director where formulation requires it. -- `NSNR-ELEM-KIN-004`: opposed or degenerate director state fails closed. -- `NSNR-ELEM-KIN-005`: small-rotation linear limit matches existing `Mitc4Shell` recovery within numerical-review tolerance. -- `NSNR-ELEM-KIN-006`: finite rigid translation/rotation produces objective zero physical strain/stress. -- `NSNR-ELEM-KIN-007`: recovery emits exactly four midsurface Gauss rows in `ShellMidsurfaceLocation` order; each row has generalized strain `[E11,E22,2E12,K11,K22,2K12,G13,G23]`, section resultant `[N11,N22,N12,M11,M22,M12,Q13,Q23]`, and stress positions `[BOTTOM,MIDDLE,TOP]` with components `[S11,S22,S12]`. -- `NSNR-ELEM-KIN-008`: recovery emits no S33, S13, S23 and no nodal extrapolated/corner/averaged stress. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure -``` - -Expected: compile or test failure because nonlinear MITC4 files do not exist. Unexpected pass stops. - -## GREEN - -Implement nonlinear MITC4 creation, kinematics, and recovery using approved 2x2x2 integration, MITC4 edge-midpoint shear tying, initial shell frames, homogeneous isotropic materially linear response, fixed-size row shapes, and source-order recovery rows. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 3 status and one-line result payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not change existing `Mitc4Shell` behavior. 이유: linear MITC4 reference regression must remain stable. -- Do not create stress quantities outside approved schema. 이유: I/O excludes S33/S13/S23 and nodal stress projections. -- Do not add residual/tangent solve logic here. 이유: Step 4 owns residual and tangent. diff --git a/phases/nonlinear-static-newton-raphson/step4.md b/phases/nonlinear-static-newton-raphson/step4.md deleted file mode 100644 index 54b6417..0000000 --- a/phases/nonlinear-static-newton-raphson/step4.md +++ /dev/null @@ -1,98 +0,0 @@ -# Step 4: nonlinear-mitc4-residual-and-tangent - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/elements/nonlinear_mitc4_shell.h` -- `src/fesa/elements/nonlinear_mitc4_shell.cpp` -- `tests/unit/elements/nonlinear_mitc4_shell_test.cpp` -- Step 2 files: `include/fesa/elements/finite_rotation.h` -- Step 3 files: `include/fesa/elements/nonlinear_mitc4_shell.h` - -## 이전 Step 전제 - -Step 3 provides nonlinear MITC4 creation, kinematics, and recovery rows. - -## 소유 파일 - -- Modify: `include/fesa/elements/nonlinear_mitc4_shell.h` -- Modify: `src/fesa/elements/nonlinear_mitc4_shell.cpp` -- Create: `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -struct NonlinearMitc4InternalEquilibrium { - Vector internal_residual; - Matrix internal_tangent; - Vector internal_force; - NonlinearMitc4Recovery recovery; - double physical_strain_energy; -}; - -Result EvaluateInternalResidualAndTangent( - const NonlinearMitc4Shell& element, - const NonlinearMitc4TrialDofs& trial); - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-ELEM-TAN-001`: residual and tangent are evaluated at the same trial state. -- `NSNR-ELEM-TAN-002`: directional derivative schedule uses `h={1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7}` and requires at least two observed orders `>=1.5`. -- `NSNR-ELEM-TAN-003`: one interior scaled derivative error is `<=1e-6`. -- `NSNR-ELEM-TAN-004`: zero analytical directions produce scaled absolute error `<=1e-10`. -- `NSNR-ELEM-TAN-005`: no-moment tangent satisfies scaled Frobenius symmetry `<=1e-12` after `Dq^T K_T Dq`. -- `NSNR-ELEM-TAN-006`: internal tangent contains no external fixed-load contribution; applying the same element to two incident-element load-sharing scenarios does not change internal residual/tangent. -- `NSNR-ELEM-TAN-007`: finite rigid motion keeps physical residual/objectivity invariants. -- `NSNR-ELEM-TAN-008`: patch/sign recovery identities pass relative `<=1e-9`. -- `NSNR-ELEM-TAN-009`: nonfinite trial/residual/tangent data fails closed. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Implement same-trial internal residual/tangent, exact rotation derivative terms through `J_l`, map Hessian terms, objective drilling contribution, and physical recovery in the element-local contract. External CLOAD vector and tangent are not element inputs and are assembled globally in Step 5. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 4 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not symmetrize the internal tangent as a cleanup step. 이유: derivative and symmetry tests must observe the mathematically assembled operator; Step 5 owns external moment tangent nonsymmetry. -- Do not add solver factorization in this Step. 이유: Step 6 owns tangent solver backend. -- Do not pass nodal CLOAD force or moment into each incident element. 이유: it duplicates source-node loads; Step 5 owns global-once external assembly. -- Do not claim Abaqus internal equivalence. 이유: FESA only uses Abaqus CSV as external numeric reference. diff --git a/phases/nonlinear-static-newton-raphson/step5.md b/phases/nonlinear-static-newton-raphson/step5.md deleted file mode 100644 index b0903d4..0000000 --- a/phases/nonlinear-static-newton-raphson/step5.md +++ /dev/null @@ -1,188 +0,0 @@ -# Step 5: load-boundary-path-and-convergence-gates - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/core/diagnostic.h` -- `include/fesa/fem/dof_manager.h` -- `include/fesa/math/sparse_matrix.h` -- `include/fesa/math/vector3.h` -- Step 1 files: `include/fesa/model/domain.h`, `include/fesa/model/model_types.h` -- Step 4 files: `include/fesa/elements/nonlinear_mitc4_shell.h` - -## 이전 Step 전제 - -Step 1 stores raw nonlinear static values in Domain. Step 4 provides internal-only element residual/tangent. This Step owns global-once fixed CLOAD, absolute boundary path assembly, and the external contribution sign contract used by Step 10: `r = f_int - f_ext`, `K_T = K_int - K_ext`. - -## 소유 파일 - -- Create: `include/fesa/analysis/nonlinear_static_control.h` -- Create: `src/fesa/analysis/nonlinear_static_control.cpp` -- Create: `tests/unit/analysis/nonlinear_static_control_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -struct LoadFactorIncrement { - std::uint32_t increment_index; - double load_factor; - bool is_factor_one; -}; - -enum class NewtonChannelUnit { - kForce, - kForceLength, - kLength, - kDimensionless -}; - -inline constexpr double kNewtonRelativeThreshold = 1.0e-2; -inline constexpr double kNewtonZeroScaleThreshold = 1.0e-3; - -struct NewtonResidualChannelInput { - std::string identity; - Vector free_residual; - Vector free_internal; - Vector free_external; -}; - -struct NewtonCorrectionChannelInput { - std::string identity; - Vector fresh_correction; - Vector current_increment; -}; - -struct NewtonConvergenceInput { - NewtonResidualChannelInput force_residual; - NewtonResidualChannelInput moment_residual; - NewtonCorrectionChannelInput translation_correction; - NewtonCorrectionChannelInput rotation_correction; -}; - -enum class NewtonConvergenceBranch { - kRelative, - kZeroScale -}; - -struct NewtonChannelDecision { - std::string identity; - double numerator_norm; - double denominator_scale; - NewtonConvergenceBranch branch; - double threshold; - NewtonChannelUnit threshold_unit; - bool passed; -}; - -struct NewtonConvergenceResult { - NewtonChannelDecision force_residual; - NewtonChannelDecision moment_residual; - NewtonChannelDecision translation_correction; - NewtonChannelDecision rotation_correction; - bool combined_passed; -}; - -struct GlobalFixedLoadContribution { - Vector generalized_external_force; - SparseMatrix generalized_external_tangent; - std::vector diagnostics; -}; - -Result> BuildFixedLoadFactorSequence( - const StepDefinition& step); -Result ApplyAbsolutePrescribedDisplacementTarget( - const StepDefinition& step, double load_factor); -Result AssembleGlobalFixedLoadContribution( - const Domain& domain, - const DofManager& dofs, - const Vector& trial_generalized_coordinates, - double load_factor); -Status CheckMomentAdmissibility(const Vector3& director, - const Vector3& source_moment); -NewtonConvergenceResult EvaluateNewtonConvergence( - const NewtonConvergenceInput& input); - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-CTRL-001`: raw `initial_increment=0.1` and `time_period=1.0` produce factors `0.1..1.0`. -- `NSNR-CTRL-002`: final factor is assigned exact `1.0`, not accumulated past one. -- `NSNR-CTRL-003`: positive minimum/maximum values are accepted but not used for runtime stepping. -- `NSNR-CTRL-004`: nonzero `*BOUNDARY` value is absolute factor-one target from step-start committed state. -- `NSNR-CTRL-005`: constrained Newton correction remains exactly zero. -- `NSNR-CTRL-006`: `*CLOAD` force and moment directions remain fixed global dead loads and scale by factor. -- `NSNR-CTRL-007`: moment admissibility accepts `rho_M <= 1e-12` and rejects larger drilling-aligned moment. -- `NSNR-CTRL-008`: `AssembleGlobalFixedLoadContribution` contributes each aggregated source node load exactly once, independent of incident element count. -- `NSNR-CTRL-009`: source-order load rows produce deterministic global vector and tangent order. -- `NSNR-CTRL-010`: fixed-spatial moment projection and `J_l`/map-Hessian tangent terms pass directional derivative checks and may make `K_ext` nonsymmetric. -- `NSNR-CTRL-011`: global fixed-load assembly returns external quantities consumed with approved signs `r = f_int - f_ext` and `K_T = K_int - K_ext`; the fixed-moment tangent is subtracted once and is never duplicated per incident element. -- `NSNR-CTRL-012`: `NewtonConvergenceInput` has no caller-supplied threshold or unit fields; `EvaluateNewtonConvergence` owns exact immutable constants `kNewtonRelativeThreshold=1.0e-2` and `kNewtonZeroScaleThreshold=1.0e-3`. -- `NSNR-CTRL-013`: four convergence gates expose identity, `numerator_norm`, `denominator_scale`, branch, typed threshold, `threshold_unit`, pass, and combined pass. -- `NSNR-CTRL-014`: nonzero-denominator relative branches use threshold `1.0e-2` and threshold unit `kDimensionless` for all four channels. -- `NSNR-CTRL-015`: zero-scale branches use threshold `1.0e-3` with units `kForce`, `kForceLength`, `kLength`, and `kDimensionless` for residual force, residual moment, correction translation, and correction rotation respectively. -- `NSNR-CTRL-016`: empty free channels evaluate with `numerator_norm=0`, `denominator_scale=0`, branch `kZeroScale`, exact zero-scale threshold/unit, and pass. -- `NSNR-CTRL-017`: iteration numbering remains `1..100` with no iteration `101`. - -### USER-DECISION-003 option-1 revision addendum - -Step 5의 completed status, summary, timestamps와 commits는 보존한다. 다음 correction tests와 minimal GREEN은 재실행된 Step 5가 아니라 Executor-selected Step 11 안에서 수행한다. - -- `NSNR-CTRL-018`: force와 force-length residual channel 각각에서 matching external vector가 finite exact zero이고 internal/residual이 nonzero여도 `kZeroScale`을 선택한다. Numerator exact `1.0e-3`은 pass, `std::nextafter(1.0e-3, +infinity)`는 fail이며 decision denominator는 exact `0`, threshold unit은 각각 `kForce`, `kForceLength`다. Empty free channel pass도 유지한다. -- `NSNR-CTRL-019`: matching external scale이 nonzero이면 internal-dominant와 external-dominant case 모두 denominator `max(||f_int||inf,||f_ext||inf)`를 쓴다. Ratio exact `1.0e-2`는 pass, 바로 위는 fail이다. Numerator가 typed `1.0e-3`보다 작아도 relative ratio가 실패하는 case를 포함하여 absolute/relative OR가 없음을 증명한다. -- `NSNR-CTRL-020`: residual/internal/external vector 또는 derived norm의 NaN/Inf는 branch/tolerance acceptance 전에 fail하고 combined pass를 만들지 않는다. `std::nextafter(0.0,+infinity)`인 matching external scale은 tolerance band, zero clamp, `max(1,...)` 없이 nonzero relative branch를 선택한다. -- `NSNR-CTRL-021`: force residual, moment residual, translation correction, rotation correction을 하나씩 실패시키는 truth table과 네 channel 모두 pass하는 case로 logical AND를 고정한다. NSNR-070 correction selector, denominators, thresholds와 units는 변경하지 않는다. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Implement factor sequence derivation, load/BC scaling, global-once fixed-load external vector `f_ext` and external tangent `K_ext` assembly, moment admissibility, and typed convergence-channel evaluation. For the USER-DECISION-003 correction, validate the residual/internal/external values and norms first, select a residual branch from the matching external scale itself, emit denominator exact `0` and typed absolute `1.0e-3` when that scale is exact zero, and otherwise emit retained `max(internal,external)` with relative `1.0e-2`. Correction denominator selection remains derived from current increment values. Thresholds and threshold units are not caller inputs; `EvaluateNewtonConvergence` assigns the exact branch/channel constants from `requirements.md` and `io.md`. Return structured diagnostics for invalid nonlinear static data, unsupported drilling load, nonfinite Newton data, and nonconvergence readiness. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 5 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not put factor sequence storage into Domain. 이유: control layer derives runtime factors. -- Do not implement cutback, line search, damping, or automatic growth. 이유: approved Full Newton path excludes them. -- Do not mutate source load vectors. 이유: fixed-global source identity must remain immutable. -- Do not distribute full source-node CLOAD into every incident element. 이유: this would multiply loads by incident element count and violate formulation §11.2. -- Do not emit convergence branch labels outside `relative` and `zero-scale`. 이유: io.md exposes exactly those two branches. -- Do not accept per-call convergence thresholds or units. 이유: NSNR-069/070 fix branch thresholds and typed units globally. -- Do not use internal scale, tolerance bands, clamps, `max(1,...)`, or absolute/relative OR to select a residual branch. 이유: revised NSNR-069 selects only from the finite matching external scale's exact-zero identity. diff --git a/phases/nonlinear-static-newton-raphson/step6.md b/phases/nonlinear-static-newton-raphson/step6.md deleted file mode 100644 index 8f2cd3b..0000000 --- a/phases/nonlinear-static-newton-raphson/step6.md +++ /dev/null @@ -1,104 +0,0 @@ -# Step 6: backend-neutral-tangent-solver - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/solvers/linear/linear_solver.h` -- `include/fesa/solvers/linear/mkl_pardiso_solver.h` -- `src/fesa/solvers/linear/mkl_pardiso_solver.cpp` -- `tests/unit/solvers/linear/linear_solver_test.cpp` -- `tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp` -- Step 4 files: `include/fesa/elements/nonlinear_mitc4_shell.h` - -## 이전 Step 전제 - -Step 4 defines generally nonsymmetric nonlinear tangent matrices. Current SPD `MklPardisoSolver` must remain unchanged. - -## 소유 파일 - -- Create: `include/fesa/solvers/linear/tangent_solver.h` -- Create: `include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h` -- Create: `src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp` -- Create: `tests/unit/solvers/linear/tangent_solver_test.cpp` -- Test: `tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -class TangentSolver { - public: - virtual ~TangentSolver() = default; - virtual Status FactorizeFresh(const SparseMatrix& matrix) = 0; - virtual Status SolveCorrection(const Vector& rhs, - Vector& correction) const = 0; -}; - -class MklPardisoTangentSolver final : public TangentSolver { - public: - MklPardisoTangentSolver(); - ~MklPardisoTangentSolver() override; - Status FactorizeFresh(const SparseMatrix& matrix) override; - Status SolveCorrection(const Vector& rhs, Vector& correction) const override; -}; - -} // namespace fesa -``` - -The MKL tangent adapter uses unsymmetric PARDISO full CSR with `mtype=11`. Existing `MklPardisoSolver` keeps `mtype=2`, SPD symmetry validation, and upper-triangle copy unchanged. - -## RED - -Add tests first. - -- `NSNR-SOLVER-001`: nonsymmetric 2x2 matrix factorizes and solves a known correction. -- `NSNR-SOLVER-002`: `0x0` matrix factorize/solve succeeds with zero-size vectors. -- `NSNR-SOLVER-003`: nonfinite matrix or RHS values fail without modifying output correction. -- `NSNR-SOLVER-004`: singular/factorization failure maps to deterministic solver diagnostic. -- `NSNR-SOLVER-005`: solve before successful factorization fails with solver diagnostic. -- `NSNR-SOLVER-006`: existing SPD `MklPardisoSolver` still rejects nonsymmetric public CSR and passes prior tests. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "TangentSolver|MklPardiso" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Implement backend-neutral tangent solver boundary and MKL full-CSR adapter. Factorization is fresh per call, releases previous backend state, validates dimensions and finite values, and translates PARDISO errors to FESA `Status`. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "TangentSolver|MklPardiso" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 6 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not modify SPD `MklPardisoSolver` behavior except tests proving it is unchanged. 이유: existing linear solver contract must remain stable. -- Do not symmetrize or regularize tangent matrices. 이유: approved tangent may be nonsymmetric and failures must surface. -- Do not expose MKL types in public headers. 이유: backend types remain behind solver boundaries. diff --git a/phases/nonlinear-static-newton-raphson/step7.md b/phases/nonlinear-static-newton-raphson/step7.md deleted file mode 100644 index 9865f53..0000000 --- a/phases/nonlinear-static-newton-raphson/step7.md +++ /dev/null @@ -1,138 +0,0 @@ -# Step 7: newton-iteration-log-writer - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- Step 0 files: `include/fesa/app/output_paths.h`, `src/fesa/app/output_paths.cpp`, `include/fesa/analysis/analysis.h` -- Step 5 files: `include/fesa/analysis/nonlinear_static_control.h` - -## 이전 Step 전제 - -Step 0 gives app-owned log path and lease lifetime. Step 5 defines convergence-channel data that log records consume. - -## 소유 파일 - -- Create: `include/fesa/analysis/newton_iteration_log.h` -- Create: `src/fesa/analysis/newton_iteration_log.cpp` -- Create: `tests/unit/analysis/newton_iteration_log_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -enum class NewtonIterationStage { - kEntered, - kKinematicsEvaluated, - kInternalAssembled, - kExternalAssembled, - kSolvedCorrection, - kConvergenceEvaluated, - kAccepted, - kFailed -}; - -struct NewtonIterationFailure { - bool present; - NewtonIterationStage stage; - std::string diagnostic_code; - std::string reason; -}; - -struct NewtonIterationLogRecord { - std::string step_name; - std::uint32_t increment_index; - double load_factor; - std::uint32_t iteration; - NewtonIterationStage last_completed_stage; - NewtonIterationFailure failure; - std::string transition; - std::string outcome; - std::string diagnostic_code; - NewtonChannelDecision force_residual; - NewtonChannelDecision moment_residual; - NewtonChannelDecision translation_correction; - NewtonChannelDecision rotation_correction; - bool combined_passed; -}; - -class NewtonIterationLogWriter { - public: - Status Open(const std::filesystem::path& log_path); - Status Write(const NewtonIterationLogRecord& record); - Status Flush(); - Status Close(); -}; - -} // namespace fesa -``` - -The serializer, not callers, owns the exact 39 labels and fixed order from `io.md`. For evaluated convergence channels it serializes only `relative` or `zero-scale` branch labels from `NewtonConvergenceBranch`. For unevaluated typed fields it writes `not-evaluated(reason)` using `NewtonIterationFailure::reason`. Callers cannot inject arbitrary fields. - -## RED - -Add tests first. - -- `NSNR-LOG-001`: a complete Newton iteration writes exactly one LF-terminated line. -- `NSNR-LOG-002`: line is UTF-8 without BOM, no header, no trailer. -- `NSNR-LOG-003`: line has exactly 39 TAB-separated `label=value` fields in approved order. -- `NSNR-LOG-004`: finite numeric values round-trip without locale dependence. -- `NSNR-LOG-005`: each convergence channel serializes identity, `numerator_norm`, `denominator_scale`, branch, threshold, `threshold_unit`, and pass from `NewtonChannelDecision`. -- `NSNR-LOG-006`: evaluated empty free-channel decisions serialize `numerator_norm=0`, `denominator_scale=0`, threshold `1.0e-3`, the channel-specific zero-scale `threshold_unit`, and branch `zero-scale`; no other branch label appears. -- `NSNR-LOG-007`: combined pass, transition, outcome, failure stage, and diagnostic code are serialized from explicit record fields. -- `NSNR-LOG-008`: early failure fields after the failed stage use `not-evaluated(reason)`. -- `NSNR-LOG-009`: embedded tab, LF, CR, and backslash are escaped deterministically. -- `NSNR-LOG-010`: write/flush/close failure returns `log-output-failure` and prevents success classification. -- `NSNR-LOG-011`: non-Newton controlled failure path can leave a zero-byte log owned by app lifecycle. - -### USER-DECISION-003 option-1 revision addendum - -Step 7의 completed status, summary, timestamps와 commits는 보존한다. Executor-selected Step 11에서 `tests/unit/analysis/newton_iteration_log_test.cpp`에 다음 RED assertion을 추가한다. - -- `NSNR-LOG-012`: synthetic `NewtonChannelDecision`이 아니라 `EvaluateNewtonConvergence`가 만든 residual decisions를 record에 넣는다. Exact-zero matching external channel은 denominator exact `0`, branch `zero-scale`, threshold `1.0e-3`, force 또는 force-length unit으로 직렬화하고, nonzero matching external channel은 retained denominator, branch `relative`, threshold `1.0e-2`, unit `1`로 직렬화한다. 같은 line이 기존 39 labels/order, TAB separation, LF termination을 그대로 유지해야 하므로 기존 selector에서는 RED가 된다. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NewtonIterationLog" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Implement a small log writer with explicit open/write/flush/close state, serializer-owned 39-field order, deterministic escaping, finite numeric formatting, `relative`/`zero-scale` convergence branch mapping, typed `not-evaluated(reason)` substitution, and structured `Status` failures. USER-DECISION-003는 evaluator-produced decision semantics만 바꾸므로 log writer production 또는 `nsnr-log-v1` schema 변경은 예상하지 않는다. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NewtonIterationLog" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 7 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not duplicate per-iteration log lines to stderr. 이유: approved log is file-only. -- Do not accept arbitrary caller-provided field vectors. 이유: io.md requires an exact fixed schema and order. -- Do not write HDF5 trial history. 이유: log is diagnostic and HDF5 stores accepted frames only. -- Do not continue after log write/flush/close failure. 이유: log failure blocks result commit. -- Do not add, remove, rename, reorder, or re-delimit any `nsnr-log-v1` field. 이유: option 1 changes only residual decision values, not the approved 39-field external log contract. diff --git a/phases/nonlinear-static-newton-raphson/step8.md b/phases/nonlinear-static-newton-raphson/step8.md deleted file mode 100644 index 28dafb6..0000000 --- a/phases/nonlinear-static-newton-raphson/step8.md +++ /dev/null @@ -1,168 +0,0 @@ -# Step 8: nonlinear-state-commit-rollback - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/formulation.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/analysis/analysis_state.h` -- `src/fesa/analysis/analysis_state.cpp` -- `include/fesa/core/source_identity.h` -- `include/fesa/fem/dof_manager.h` -- `include/fesa/model/domain.h` -- `include/fesa/results/result_records.h` -- Step 3 files: `include/fesa/elements/nonlinear_mitc4_shell.h` -- Step 4 files: `include/fesa/elements/nonlinear_mitc4_shell.h` -- Step 5 files: `include/fesa/analysis/nonlinear_static_control.h` -- Step 6 files: `include/fesa/solvers/linear/tangent_solver.h` -- Step 7 files: `include/fesa/analysis/newton_iteration_log.h` - -## 이전 Step 전제 - -Steps 3-7 provide nonlinear element recovery, residual/tangent, controls, tangent solver, and Newton log record types. - -## 소유 파일 - -- Create: `include/fesa/analysis/nonlinear_analysis_state.h` -- Create: `src/fesa/analysis/nonlinear_analysis_state.cpp` -- Create: `tests/unit/analysis/nonlinear_analysis_state_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -struct NonlinearNodeBaseline { - EntityIndex node_index; - SourceEntityId source_id; - std::array, 3> triad; - std::array director; -}; - -struct NonlinearStateBaselineInput { - std::vector node_baselines; -}; - -struct NonlinearTrialState { - std::uint32_t increment_index; - double load_factor; - bool is_factor_zero_baseline; - std::vector nodal_internal_order; - std::vector nodal_source_ids; - Vector generalized_coordinates; - Vector displacement; - Vector rotation_vector; - std::vector, 3>> nodal_triad; - std::vector> nodal_director; - Vector internal_force; - Vector external_force; - Vector residual; - Vector reaction; - std::vector shell_results; - double physical_strain_energy; - std::array global_equilibrium; -}; - -struct AcceptedFrameState { - std::uint32_t frame_index; - std::uint32_t increment_index; - double load_factor; - std::uint32_t iteration_count; - bool is_factor_one; - std::vector nodal_internal_order; - std::vector nodal_source_ids; - Vector generalized_coordinates; - Vector displacement; - Vector rotation_vector; - std::vector, 3>> nodal_triad; - std::vector> nodal_director; - Vector internal_force; - Vector external_force; - Vector residual; - Vector reaction; - std::vector shell_results; - double physical_strain_energy; - std::array global_equilibrium; -}; - -class NonlinearAnalysisState { - public: - static Result Create( - const Domain& domain, - const DofManager& dofs, - const NonlinearStateBaselineInput& baseline); - - Result BeginTrialFromCommitted() const; - Status CommitAcceptedFrame(const AcceptedFrameState& frame); - void DiscardTrial() noexcept; - const std::vector& AcceptedFrames() const noexcept; - const NonlinearTrialState& CommittedState() const noexcept; -}; - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-STATE-000`: `NonlinearAnalysisState::Create` requires exactly one `NonlinearNodeBaseline` per `Domain.Nodes()` entry in stable internal order; each entry has `node_index` equal to its vector offset and `source_id` equal to `Domain.Nodes()[node_index].source_id`. -- `NSNR-STATE-001`: `NonlinearAnalysisState::Create` rejects missing, extra, duplicate, out-of-order, or instance-label mismatched node identities before any mutable state is produced. -- `NSNR-STATE-002`: `NonlinearAnalysisState::Create` validates node/DOF/frame inventory, sizes all vectors, preserves `nodal_internal_order` and `nodal_source_ids`, and creates a committed factor-zero baseline with `increment_index=0`, `load_factor=0.0`, `is_factor_zero_baseline=true`, and no accepted frames. -- `NSNR-STATE-003`: duplicate source labels across different instances remain distinct when `SourceEntityId::instance_name` differs. -- `NSNR-STATE-004`: trial state starts from committed state and can be discarded without mutation. -- `NSNR-STATE-005`: accepted frames are appended in stable accepted-factor order. -- `NSNR-STATE-006`: frame index is zero-based accepted-frame order; the factor-zero committed baseline is metadata/state only and is never appended as an accepted frame. -- `NSNR-STATE-007`: final frame at load factor `1.0` has `is_factor_one=true`. -- `NSNR-STATE-008`: residual and reaction are stored from full residual `r = f_int - f_ext`. -- `NSNR-STATE-009`: accepted frame owns generalized coordinates, displacement, rotation vector, per-node identity/order, per-node triad/director, internal/external/residual/reaction, stable `ShellResultRow` recovery, physical strain energy, and global equilibrium. -- `NSNR-STATE-010`: all accepted-frame vectors match node/DOF counts and all `ShellResultRow` rows are stable element/midsurface order. -- `NSNR-STATE-011`: commit validates finite values for every approved scalar and atomically rejects nonfinite frames with `invalid-accepted-state`. -- `NSNR-STATE-012`: failed trial preserves prior committed state. -- `NSNR-STATE-013`: no unapproved verification data is stored. -- `NSNR-STATE-014`: committed and accepted nodal identity vectors are preserved for Step 9 HDF5 node datasets and Step 11 HDF5-to-reference source mapping; source label alone is never used as identity. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Implement `NonlinearAnalysisState::Create` as the only construction seam for a valid nonlinear state. It uses `Domain`, `DofManager`, and `NonlinearStateBaselineInput` to require one baseline per Domain node in stable internal order, match both `EntityIndex` and full `SourceEntityId`, allocate zero generalized/displacement/rotation/internal/external/residual/reaction vectors, preserve nodal order/source identity for HDF5/reference mapping, install finite per-node triads/directors, and establish the committed factor-zero baseline without adding an accepted frame. Commit validates inventory, order, shape, identity, and finiteness before mutating committed state. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 8 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not put equation ids into Node or Element objects. 이유: `DofManager` owns equation numbering. -- Do not identify baseline nodes by source label alone. 이유: labels are not unique across instances and cannot support stable HDF5/reference mapping. -- Do not commit trial data before convergence gates pass. 이유: rollback/preservation contract depends on committed-state isolation. -- Do not expand existing `AnalysisState` for future nonlinear features. 이유: this Step owns only approved NSNR state. -- Do not store stress projections or verification data outside approved `ShellResultRow`, physical energy, and global equilibrium fields. 이유: schema v1 has a bounded accepted-state contract. diff --git a/phases/nonlinear-static-newton-raphson/step9.md b/phases/nonlinear-static-newton-raphson/step9.md deleted file mode 100644 index e07815b..0000000 --- a/phases/nonlinear-static-newton-raphson/step9.md +++ /dev/null @@ -1,117 +0,0 @@ -# Step 9: nonlinear-hdf5-schema-v1-writer - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/nonlinear-static-newton-raphson/README.md)을 따른다. - -## 읽어야 할 파일 - -- `AGENTS.md` -- `../../docs/solver-core/README.md` -- `../../docs/solver-core/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `../../docs/nonlinear-static-newton-raphson/README.md` -- `include/fesa/io/hdf5/hdf5_results_writer.h` -- `include/fesa/results/results_writer.h` -- `src/fesa/io/hdf5/hdf5_results_writer.cpp` -- `src/fesa/io/hdf5/hdf5_primitives.h` -- `src/fesa/io/hdf5/hdf5_primitives.cpp` -- `src/fesa/io/hdf5/hdf5_self_check.h` -- `src/fesa/io/hdf5/hdf5_self_check.cpp` -- `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` -- Step 8 files: `include/fesa/analysis/nonlinear_analysis_state.h` - -## 이전 Step 전제 - -Step 8 provides committed nonlinear accepted-frame state. Step 0 and Step 10 own the rule that log close succeeds before this writer is invoked. - -## 소유 파일 - -- Create: `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h` -- Create: `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` -- Create: `include/fesa/results/nonlinear_results_writer.h` -- Create: `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` -- Modify: `src/fesa/io/hdf5/hdf5_primitives.h` -- Modify: `src/fesa/io/hdf5/hdf5_primitives.cpp` -- Modify: `src/fesa/io/hdf5/hdf5_self_check.h` -- Modify: `src/fesa/io/hdf5/hdf5_self_check.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -## 인터페이스 - -```cpp -namespace fesa { - -class NonlinearResultsWriter { - public: - virtual ~NonlinearResultsWriter() = default; - virtual Status Write(const std::filesystem::path& output_path, - const Domain& domain, - const NonlinearAnalysisState& state, - const std::vector& diagnostics) = 0; -}; - -class NonlinearHdf5ResultsWriter final : public NonlinearResultsWriter { - public: - Status Write(const std::filesystem::path& output_path, - const Domain& domain, - const NonlinearAnalysisState& state, - const std::vector& diagnostics) override; -}; - -} // namespace fesa -``` - -## RED - -Add tests first. - -- `NSNR-HDF5-001`: `/metadata` has `schema_version=1`, `feature_id=nonlinear-static-newton-raphson`, and approved procedure/formulation/integration attributes. -- `NSNR-HDF5-002`: `/model/nodes`, `/model/elements`, shell section/material/frame/director/constraint datasets match I/O schema. -- `NSNR-HDF5-003`: `/steps/Step-1/accepted_frames` has one row per committed increment. -- `NSNR-HDF5-004`: final row has load factor `1.0` and `is_factor_one=1`. -- `NSNR-HDF5-005`: factor zero metadata exists and factor zero is not a frame. -- `NSNR-HDF5-006`: per-frame nodal displacement, triad, director, internal, external, residual, reaction datasets have approved shapes and column ordering. -- `NSNR-HDF5-007`: reaction rotational columns store `J_l(phi)^(-T)` spatial physical moment. -- `NSNR-HDF5-008`: element shell local frame, generalized strain, section resultant, stress datasets exist with approved shape and identity. -- `NSNR-HDF5-009`: `/global/energy` and `/global/equilibrium` exist for each accepted frame. -- `NSNR-HDF5-010`: no trial history dataset is written. -- `NSNR-HDF5-011`: HDF5 candidate failure preserves prior final file. -- `NSNR-HDF5-012`: writer consumes `std::vector` and writes deterministic diagnostics. -- `NSNR-HDF5-013`: `NonlinearHdf5ResultsWriter` implements backend-neutral `NonlinearResultsWriter`, and no HDF5 handle/type appears in analysis/core public headers. - -Run: - -```powershell -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure -``` - -Expected: new tests fail. Unexpected pass stops. - -## GREEN - -Implement `include/fesa/results/nonlinear_results_writer.h` as the backend-neutral boundary and implement schema-v1 nonlinear HDF5 writer using existing HDF5 RAII/primitives/self-check style. Keep HDF5 and platform types private to `src/fesa/io/hdf5`. - -## VERIFY - -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure -``` - -Use the ignored 과거 검증 자료(정리됨) preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. - -## 상태 기록 - -Update only Step 9 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. - -## 금지사항 - -- Do not open, write, or replace HDF5 before log close succeeds. 이유: Step 10 app lifecycle enforces log-before-HDF5 finalization. -- Do not write compression, chunking, or trial history. 이유: io.md requires contiguous accepted-state storage. -- Do not make CSV an authoritative output. 이유: official solver output is HDF5. -- Do not include HDF5 headers from analysis/core public headers. 이유: output backend types stay behind writer interfaces. diff --git a/phases/shell-surface-pressure-load/index.json b/phases/shell-surface-pressure-load/index.json deleted file mode 100644 index 1973072..0000000 --- a/phases/shell-surface-pressure-load/index.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "project": "FESA Structural Solver", - "phase": "shell-surface-pressure-load", - "steps": [ - { - "step": 1, - "name": "map-pressure-input-contract", - "status": "completed", - "started_at": "2026-09-01T11:27:48+0900", - "summary": "Mapped assembly element surfaces and additive DSLOAD P records into immutable Domain/Step views with deterministic facet identity.", - "completed_at": "2026-09-01T12:34:29+0900" - }, - { - "step": 2, - "name": "reject-invalid-pressure-input", - "status": "completed", - "started_at": "2026-09-01T12:34:30+0900", - "summary": "Hardened shell pressure input rejection, target diagnostics, duplicate handling, and atomic mapping coverage.", - "completed_at": "2026-09-01T13:11:27+0900" - }, - { - "step": 3, - "name": "evaluate-shell-pressure-kernel", - "status": "completed", - "started_at": "2026-09-01T14:05:23+0900", - "summary": "Added a validated reference/current four-node pressure evaluator with exact follower tangent and focused kernel tests.", - "completed_at": "2026-09-01T14:31:41+0900" - }, - { - "step": 4, - "name": "integrate-linear-shell-pressure", - "status": "completed", - "started_at": "2026-09-01T14:31:41+0900", - "summary": "Assembled deterministic reference-configuration shell pressure into the linear full-space load path with reaction, schema, and CLI preservation coverage.", - "completed_at": "2026-09-01T15:03:28+0900" - }, - { - "step": 5, - "name": "integrate-nonlinear-follower-pressure", - "status": "completed", - "started_at": "2026-09-01T15:03:28+0900", - "summary": "Integrated current-configuration follower pressure force and exact external tangent into nonlinear full-Newton trial assembly with schema-1 regression coverage.", - "completed_at": "2026-09-01T15:48:52+0900" - }, - { - "step": 6, - "name": "compare-pressure-reference", - "status": "completed", - "started_at": "2026-09-01T15:48:52+0900", - "summary": "Added deterministic schema-1 pressure-reference comparison with exact artifact checks, U blocking/UR warning-only projection, and common-tolerance coverage.", - "completed_at": "2026-09-01T17:00:55+0900" - }, - { - "step": 7, - "name": "verify-and-report-pressure-feature", - "status": "completed", - "started_at": "2026-09-01T17:00:55+0900", - "summary": "Completed Gate 6 pressure reports with fresh MSVC focused validation, immutable artifact audit, FESA-only schema-1 comparison, and U/UR reference evidence.", - "completed_at": "2026-09-01T17:43:56+0900" - } - ], - "created_at": "2026-09-01T01:29:29+0900", - "completed_at": "2026-09-01T17:43:57+0900" -} \ No newline at end of file diff --git a/phases/shell-surface-pressure-load/step1.md b/phases/shell-surface-pressure-load/step1.md deleted file mode 100644 index fd0816b..0000000 --- a/phases/shell-surface-pressure-load/step1.md +++ /dev/null @@ -1,202 +0,0 @@ -# Step 1: map-pressure-input-contract - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -이 Step의 단일 책임은 valid assembly-level `*SURFACE, TYPE=ELEMENT`와 sole static Step의 `*DSLOAD P`를 immutable Domain/Step semantic objects와 non-owning `AnalysisModel` view로 mapping하는 것이다. 이 Step 안에서 `RED -> observed expected failure -> minimal GREEN -> focused VERIFY -> full/Stop VERIFY`를 끝내고 green 상태로 종료한다. - -Implementation Agent는 Executor가 선택한 이 Step만 수행한다. 성공 시 `phases/shell-surface-pressure-load/index.json`의 Step 1 `status`와 한 줄 `summary`만, 오류/차단 시 각각 `error_message` 또는 `blocked_reason`만 기록할 수 있다. branch, retry, timestamps, commits, 다음 Step 선택, top-level phase status와 `step1-output.json`은 Harness Executor 소유다. - -## 읽어야 할 파일 - -먼저 전부 읽는다. - -- `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/solver-core/README.md` -- `.codex/hooks.json` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/formulation.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `include/fesa/io/abaqus/input_syntax.h` -- `include/fesa/io/abaqus/input_reader.h` -- `src/fesa/io/abaqus/input_reader.cpp` -- `src/fesa/io/abaqus/domain_mapping_context.h` -- `src/fesa/io/abaqus/domain_mapping_context.cpp` -- `src/fesa/io/abaqus/topology_mapper.h` -- `src/fesa/io/abaqus/topology_mapper.cpp` -- `src/fesa/io/abaqus/step_definition_mapper.h` -- `src/fesa/io/abaqus/step_definition_mapper.cpp` -- `src/fesa/io/abaqus/domain_builder.h` -- `src/fesa/io/abaqus/domain_builder.cpp` -- `src/fesa/io/abaqus/domain_mapper.cpp` -- `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` -- `tests/unit/io/abaqus/input_reader_test.cpp` -- `tests/unit/io/abaqus/input_syntax_test.cpp` -- `tests/unit/io/abaqus/domain_mapper_test.cpp` -- `tests/unit/io/abaqus/domain_mapping_components_test.cpp` -- `src/fesa/CMakeLists.txt` -- `tests/CMakeLists.txt` - -이 Step에는 이전 Step 산출물이 없다. Existing parser/domain behavior를 먼저 이해하고 legacy beam/shell inputs를 보존한다. - -## 소유 파일 - -먼저 test files를 생성/수정한 뒤 production files를 변경한다. - -- Modify: `include/fesa/io/abaqus/input_syntax.h` -- Modify: `src/fesa/io/abaqus/input_reader.cpp` -- Modify: `src/fesa/io/abaqus/domain_mapping_context.h` -- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp` -- Create: `src/fesa/io/abaqus/surface_definition_mapper.h` -- Create: `src/fesa/io/abaqus/surface_definition_mapper.cpp` -- Modify: `src/fesa/io/abaqus/domain_mapper.cpp` -- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp` -- Modify: `src/fesa/io/abaqus/domain_builder.cpp` -- Modify: `include/fesa/model/model_types.h` -- Modify: `include/fesa/model/domain.h` -- Modify: `src/fesa/model/domain.cpp` -- Modify: `include/fesa/analysis/analysis_model.h` -- Modify: `src/fesa/analysis/analysis_model.cpp` -- Modify/Test: `tests/unit/io/abaqus/input_reader_test.cpp` -- Create/Test: `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -`domain_mapper_test.cpp`와 `domain_mapping_components_test.cpp`는 focused regression 대상으로 우선 읽는다. 이 Step의 valid mapping에 직접 필요한 assertion이 새 feature test로 표현되지 않는 경우에만 최소 수정한다. - -## 인터페이스와 semantic contract - -`include/fesa/model/model_types.h`에 다음 의미의 candidate value types를 구현한다. Existing style상 이름을 최소 조정해야 하면 upstream semantic fields와 아래 accessors를 빠짐없이 보존하고 summary에 조정 이유를 기록한다. - -```cpp -enum class ShellSurfaceSide { kSpos, kSneg }; -enum class SurfaceMemberKind { kDirect, kElset }; - -struct ElementSurfaceFacetDefinition { - EntityIndex element_index; - std::size_t facet_ordinal; - std::string part_name_raw; - std::string part_name_canonical; - std::string instance_name_raw; - std::string instance_name_canonical; - std::int64_t source_element_label; - std::string source_element_label_raw; - std::string source_element_type; - ShellSurfaceSide side; - SourceLocation first_member_location; - std::size_t first_member_ordinal; - SurfaceMemberKind member_kind; - std::string elset_name_raw; - std::string elset_name_canonical; -}; - -struct ElementSurfaceDefinition { - std::string surface_name_raw; - std::string surface_name_canonical; - std::vector facets; - SourceLocation declaration_location; - std::size_t declaration_ordinal; -}; - -struct SurfacePressureLoadDefinition { - std::string step_name_raw; - std::string step_name_canonical; - EntityIndex surface_index; - std::string surface_name_raw; - std::string surface_name_canonical; - std::string load_type; - double magnitude; - std::string magnitude_raw; - SourceLocation keyword_location; - SourceLocation data_location; - std::size_t data_ordinal; - std::size_t load_ordinal; -}; -``` - -Required queries: - -```cpp -const std::vector& -Domain::ElementSurfaces() const noexcept; - -const std::vector& -StepDefinition::SurfacePressureLoads() const noexcept; - -bool StepDefinition::UsesNonlinearGeometry() const noexcept; - -const std::vector& -AnalysisModel::ActiveSurfacePressureLoads() const noexcept; -``` - -`ModelDefinition` owns `element_surfaces`; `StaticStepDefinition` owns `surface_pressure_loads`; committed `Domain`/`StepDefinition` remain immutable. `AnalysisModel` returns non-owning references and never copies/reorders the surface inventory; Domain must outlive it. Pressure records do not enter the existing configuration-independent nodal `Load::ComputeContributions` interface. - -## RED - -Write and register these tests before production implementation: - -- `InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines` -- `ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively` -- `ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter` -- `ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder` -- `ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder` -- `ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords` -- `ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain` -- `ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation` - -The mixed-instance fixture declares `Instance-A` and `Instance-B` in distinct declaration order, interleaves differently cased direct members and flat assembly ELSET members bound by explicit `INSTANCE=`, and uses the same numeric element label in both instances. It must compare case-insensitive resolution, raw data/member ordinals, flat ELSET provenance, canonical facet order, distinct part/instance/source label/source type/side identities and first-member provenance exactly. It must not accept implicit-instance syntax. - -After test edits and CMake test registration, run: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected RED: missing mapper/header/semantic accessors produces compile/link failure, or current unsupported `SURFACE`/`DSLOAD` behavior fails assertions. The mixed-instance fixture must fail because the two explicit instances/mixed direct+ELSET are not resolved or committed identity/provenance is absent. Record command, exit code, duration and meaningful output tail. An unrelated existing failure is `regression`; an unexpected pass is an `evidence-gap`. Stop before production changes until the expected RED is observed. - -## Minimal GREEN - -- Support physical-line ASCII/256-byte policy, comma/cardinality, physical locations and keyword-parameter-only continuation exactly as `io.md` §3 defines. Do not invent inline comments or data continuation. -- Parse assembly-only element surfaces and parameterless step-level DSLOAD. Surface parameters are exactly `TYPE=ELEMENT` and `NAME`; DSLOAD data is exactly `,P,`. -- Run `SurfaceDefinitionMapper` after topology finalization and before Step binding. Resolve direct `.` and flat assembly ELSETs with explicit `INSTANCE=` case-insensitively. -- One surface may mix direct/ELSET members and multiple explicit instances. Preserve raw data/member order and ELSET expansion provenance, then sort unique committed facets by `(instance declaration ordinal, numeric element label, SPOS before SNEG)`. -- Preserve each facet's internal `element_index` plus part/instance raw+canonical identity, source label/raw token, exact `S4|S4R`, side, facet ordinal and first-member provenance. -- Preserve each Step pressure record's step/surface raw+canonical identity, `load_type="P"`, signed magnitude/raw token, keyword/data locations, data ordinal and total Step load ordinal. Records remain distinct/additive. -- Bind pressure surface references only after every candidate target validates. DomainBuilder commits once. Legacy `StaticStepDefinition` constructors delegate with an empty pressure vector. - -## VERIFY and Acceptance Criteria - -If 과거 검증 자료(정리됨) exists at execution time, its complete configure/build/test selection takes precedence and the exact resolved commands must be recorded. Otherwise execute: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Acceptance requires exit `0`, nonzero discovered tests, all named tests present/pass, no new MSVC `/W4 /WX` warnings, and all legacy tests green. The automatic Stop hook performs another whole-project MSVC validation; do not call hook scripts manually. - -## 불변식, 실패 처리와 증거 - -- Supported: mixed direct/ELSET and multiple explicit instances in one surface. Unsupported: implicit-instance ELSET, one ELSET mixing instances, part-scope fallback. -- Same numeric label in different instances is never merged. Source identity is not replaced by internal/equation index. -- Parse/map failure returns no Domain and exposes no partial surface/load. Do not update AnalysisState or HDF5. -- Evidence must record RED/GREEN/VERIFY commands, exits, durations/tails, mapped facet/load inventory, source identity/order, warnings and changed files. -- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`. - -Trace: `FESA-REQ-SHELL-PRESSURE-001`–`004`, `010`, `013`; `io.md` §§2–6; `formulation.md` §3. - -## 금지사항 - -- Do not implement pressure force/tangent or procedure assembly. 이유: Steps 3–5 ownership이다. -- Do not support `*DLOAD`, implicit-instance ELSET, part surface, generalized distributed loads or additional element types. 이유: approved subset 밖이다. -- Do not change HDF5 schema, CLI output contract, upstream docs, tolerance or reference artifacts. diff --git a/phases/shell-surface-pressure-load/step2.md b/phases/shell-surface-pressure-load/step2.md deleted file mode 100644 index 65d095b..0000000 --- a/phases/shell-surface-pressure-load/step2.md +++ /dev/null @@ -1,112 +0,0 @@ -# Step 2: reject-invalid-pressure-input - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -이 Step의 단일 책임은 Step 1의 pressure input/model mapping에 deterministic fail-closed negative semantics, duplicate rules, diagnostics and atomic commit behavior를 완결하는 것이다. 동일 Step 안에서 RED부터 full green까지 끝낸다. - -Implementation Agent는 Executor-selected Step 2만 수행하고 task index의 Step 2 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor가 timestamps, commits, retry, advancement, top-level status와 output JSON을 소유한다. - -## 읽어야 할 파일 - -- `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/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/formulation.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `include/fesa/core/ascii.h` -- `include/fesa/core/diagnostic.h` -- `include/fesa/model/source_target_resolver.h` -- `src/fesa/model/source_target_resolver.cpp` -- `include/fesa/io/abaqus/input_syntax.h` -- `src/fesa/io/abaqus/input_reader.cpp` -- `src/fesa/io/abaqus/domain_mapping_context.h` -- `src/fesa/io/abaqus/domain_mapping_context.cpp` -- `src/fesa/io/abaqus/surface_definition_mapper.h` -- `src/fesa/io/abaqus/surface_definition_mapper.cpp` -- `src/fesa/io/abaqus/step_definition_mapper.cpp` -- `src/fesa/io/abaqus/domain_builder.cpp` -- `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp` -- `tests/unit/io/abaqus/domain_mapper_test.cpp` -- `tests/unit/io/abaqus/domain_mapping_components_test.cpp` - -Read Step 1's implementation and tests closely. Its required outputs are the Domain-owned immutable surface/facet inventory, Step-owned provenance-rich pressure records, multi-explicit-instance valid support and non-owning AnalysisModel accessors. Do not replace those contracts. - -## 소유 파일 - -- Modify/Test first: `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp` -- Modify/Test if needed: `tests/unit/io/abaqus/domain_mapper_test.cpp` -- Modify/Test if needed: `tests/unit/io/abaqus/domain_mapping_components_test.cpp` -- Modify: `src/fesa/io/abaqus/input_reader.cpp` -- Modify: `src/fesa/io/abaqus/domain_mapping_context.h` -- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp` -- Modify: `src/fesa/io/abaqus/surface_definition_mapper.h` -- Modify: `src/fesa/io/abaqus/surface_definition_mapper.cpp` -- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp` -- Modify: `src/fesa/io/abaqus/domain_builder.cpp` - -Do not add another production type or parser framework. - -## RED - -Add these named tests first: - -- `ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation` -- `ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds` -- `ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality` -- `ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets` -- `ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets` -- `ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning` -- `ShellSurfacePressureInput.RejectsConflictingSidesForOneElement` -- `ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes` -- `ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication` -- `ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate` -- `ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns` - -Run before production edits: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected RED: the Step 1 happy-path mapper accepts at least one unsupported form, lacks complete stable diagnostics, or does not distinguish exact same-side normalization from conflicting-side failure. Record command, exit, duration and tail. Unexpected pass is an evidence gap; unrelated failure is regression and must be resolved/classified before GREEN. - -## Minimal GREEN - -- Apply exact allowed parameter/label/cardinality tables from `io.md` §§2–3. Reject unsupported flags, types, labels, distributions, scopes and target kinds without reinterpretation. -- Reject non-ASCII/control/overlength physical input, illegal continuation, malformed or nonfinite numeric tokens, `D` exponent and locale-dependent forms at the actual failing source line. -- Reject missing, empty, ambiguous, cross-scope, implicit-instance, nested/cyclic and malformed ELSET targets. A single mixed-instance ELSET remains unsupported; multiple separately explicit-instance members in one surface remain valid from Step 1. -- Normalize an exact same `(instance, element label, side)` duplicate to one facet and emit exactly one deterministic `duplicate-surface-member-normalized` warning after the first identity. Reject conflicting SPOS/SNEG for the same instance/element and duplicate case-insensitive surface declarations. -- Never deduplicate identical DSLOAD rows: each remains a distinct additive `load_ordinal`. -- Validate every raw target before semantic commit, sort diagnostics by `(file source order, line, member/load ordinal, code, entity identity)`, and return no Domain on error. Preserve full `entity_identity` fields from `io.md` §9. - -## VERIFY and Acceptance Criteria - -If 과거 검증 자료(정리됨) exists, use its resolved commands first. Otherwise run: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Acceptance requires every named negative test and legacy parser/domain test green, exact diagnostic tuple `(severity,code,file,line,keyword,entity_identity,message)`, repeated-run diagnostic order exact, no partial Domain, nonzero CTest discovery, no new warning and full CTest pass. Let Stop hook run automatically. - -## 불변식, 실패 처리와 증거 - -- Exact duplicate normalization and incompatible duplicate error are distinct. -- All missing/extra/ambiguous/cyclic/cross-scope/nonfinite failures occur before tolerance/analysis/HDF5. -- Existing inputs without pressure remain unchanged. -- Evidence records RED and GREEN commands/exits/durations/tails, expected diagnostic codes/locations/entities, warning count and repeated diagnostic sequence. -- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`. - -Trace: `FESA-REQ-SHELL-PRESSURE-002`–`004`, `013`–`017`; `io.md` §§2–6, 9; `formulation.md` §11; `numerical-review.md` §6 invalid-input checks. - -## 금지사항 - -- Do not implement the evaluator/assembler, change tolerance, rewrite artifacts or refactor the general parser. 이유: 이 Step의 negative semantic scope 밖이다. -- Do not weaken the valid multi-explicit-instance contract from Step 1. -- Do not modify upstream docs, HDF5 writers, source reference files or phase statuses other than Step 2's Executor-selected record. diff --git a/phases/shell-surface-pressure-load/step3.md b/phases/shell-surface-pressure-load/step3.md deleted file mode 100644 index 824213f..0000000 --- a/phases/shell-surface-pressure-load/step3.md +++ /dev/null @@ -1,145 +0,0 @@ -# Step 3: evaluate-shell-pressure-kernel - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -이 Step의 단일 책임은 one four-node shell facet의 reference/current surface-pressure `24x1` external force와 exact `24x24` external tangent를 backend-neutral하게 계산하는 것이다. Parser, full-space assembler, analysis procedure and HDF5 integration은 범위 밖이다. Same Step에서 RED, expected failure, minimal GREEN and focused VERIFY를 수행한 뒤 종료하며, automatic Stop hook이 exactly one whole-project full verification을 소유한다. - -Implementation Agent는 Step 3 record의 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor는 branch, retry, timestamps, commit, advancement, top-level status and output JSON을 소유한다. - -## 읽어야 할 파일 - -- `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/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/formulation.md` §§6, 9–10, 13–14 -- `../../docs/shell-surface-pressure-load/README.md` §§3–6 -- `../../docs/shell-surface-pressure-load/README.md` §§4–6, 9 -- `../../docs/shell-surface-pressure-load/README.md` -- `include/fesa/model/model_types.h` -- `include/fesa/model/shell_geometry.h` -- `src/fesa/model/shell_geometry.cpp` -- `include/fesa/elements/mitc4_shell.h` -- `src/fesa/elements/mitc4_shell.cpp` -- `include/fesa/elements/nonlinear_mitc4_shell.h` -- `src/fesa/elements/nonlinear_mitc4_shell.cpp` -- `include/fesa/math/vector3.h` -- `include/fesa/math/matrix.h` -- `tests/unit/elements/mitc4_shell_test.cpp` -- `tests/unit/elements/nonlinear_mitc4_shell_test.cpp` -- `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp` -- `src/fesa/CMakeLists.txt` -- `tests/CMakeLists.txt` - -Prior-Step files to read: `src/fesa/io/abaqus/surface_definition_mapper.h/.cpp`, `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`, `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`. They define immutable side/magnitude/source identity only; this Step must not revise parser semantics. - -## 소유 파일과 인터페이스 - -- Create test first: `tests/unit/loads/shell_surface_pressure_test.cpp` -- Create: `include/fesa/loads/shell_surface_pressure.h` -- Create: `src/fesa/loads/shell_surface_pressure.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -Implement this semantic interface: - -```cpp -enum class SurfacePressureConfiguration { kReference, kCurrent }; - -struct ShellSurfacePressureInput { - std::array reference_coordinates; - std::array translational_displacements; - ShellSurfaceSide side; - double pressure_magnitude; - double load_factor; - SurfacePressureConfiguration configuration; - SourceLocation location; - std::string entity_identity; -}; - -struct ShellSurfacePressureContribution { - std::array force; - std::array external_tangent; -}; - -Result EvaluateShellSurfacePressure( - const ShellSurfacePressureInput& input); -``` - -The tangent is fixed-node/source-order row-major. Translation DOFs occupy local components 0–2 per node; all rotation force entries and all tangent rows/columns touching components 3–5 are exact zero. No MKL, TBB, HDF5, parser or procedure type may cross this public solver-core boundary. - -## RED - -Write and register these tests before the new production header/source: - -- `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment` -- `ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude` -- `ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent` -- `ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce` -- `ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks` -- `ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective` -- `ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling` -- `ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns` -- `ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent` -- `ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint` -- `ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor` - -Run: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected RED: compile/link fails because the evaluator declaration/definition is absent. If the header is staged first, physics assertions must fail until implementation exists. Record exact command, exit, duration and tail. Do not use existing MITC4 internal-force code as pressure GREEN. Unexpected pass is evidence-gap; unrelated failure is regression. - -## Minimal GREEN - -- Use one common `2x2` Gauss rule in fixed order `(-1/sqrt(3),-1/sqrt(3))`, `(+,-)`, `(+,+)`, `(-,+)` and bilinear four-node `N_i`/derivatives. -- Let `s=+1` for SPOS and `s=-1` for SNEG. At each point use the approved area vector and compute `f_i = -lambda*p*s*sum(w*N_i*a)`. -- Reference configuration ignores displacement and returns an exactly zero tangent. Current configuration uses only translations in `x=X+u`. -- Implement the exact current follower derivative - `K_ext,ij = lambda*p*s*sum(w*N_i*(N_j,xi*[g_eta]_x - N_j,eta*[g_xi]_x))`. - Test both external-force derivative and residual-sign form. Never symmetrize it. -- Validate finite input/intermediates and the approved mean/corner/Gauss chord-scaled geometry rules with the single dimensionless `tau_J=1e-12`. Validate geometry even if `p==0` or `lambda==0`. -- Do not use `max(1,...)`, absolute floors, zero clamps, connectivity reorder or normal flips. - -## VERIFY and Acceptance Criteria - -Use 과거 검증 자료(정리됨) first if present; otherwise: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Acceptance: - -- shape-function sum error `<=1e-14`; -- normalized resultant, moment, sign, objectivity and covariance errors `<=1e-12`; -- centered FD uses `h=1e-5` and normalized tangent error `<=1e-8`; -- rotation blocks are bitwise/exact zero; -- at least one approved off-diagonal antisymmetric tangent pair is nonzero; -- every invalid geometry/nonfinite case fails without a contribution; -- nonzero CTest inventory, focused feature/regression pass, no new MSVC warning; -- automatic Stop의 exactly one whole-project MSVC x64 Debug build/unfiltered CTest pass. - -위 명령과 증거를 기록한 뒤 Step status/summary를 갱신하고 agent turn을 종료한다. Implementation Agent는 target 없는 whole-project build 또는 unfiltered full CTest를 실행하지 않는다. Stop hook이 자동으로 exactly one whole-project build/full CTest를 수행하며 hook entry point를 수동 실행하지 않는다. - -## 불변식, 실패 처리와 증거 - -- Force and tangent use identical geometry and Gauss evaluations. -- Failure returns no contribution and does not mutate caller arrays/state. -- Fixed loop/order yields deterministic values and diagnostics. -- Record RED/GREEN/VERIFY commands, exits, durations/tails, normalized metrics, FD numerator/denominator/h, antisymmetric entries, exact-zero checks and diagnostic identity/location. -- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`. - -Trace: `FESA-REQ-SHELL-PRESSURE-005`–`009`, `016`, `020`–`021`; formulation §§6, 9–10, 13–14; numerical-review kernel/objectivity/tangent/geometry checks. - -## 금지사항 - -- Do not alter MITC4 internal constitutive/stiffness formulation, add pressure stress recovery, configurable integration or vendor dependencies. -- Do not implement full-space assembly or linear/nonlinear procedure changes; those belong to Steps 4–5. -- Do not modify parser contracts, upstream docs, HDF5, tolerance or reference artifacts. -- Do not run reference solvers, create output JSON, invoke Executor, advance Step 4, commit or push. diff --git a/phases/shell-surface-pressure-load/step4.md b/phases/shell-surface-pressure-load/step4.md deleted file mode 100644 index f7d22e7..0000000 --- a/phases/shell-surface-pressure-load/step4.md +++ /dev/null @@ -1,155 +0,0 @@ -# Step 4: integrate-linear-shell-pressure - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -이 Step의 single responsibility는 Step 3 local evaluator를 deterministic full-space pressure assembler와 linear-static reference-configuration path에 연결하고 existing schema-0/CLI/reaction/equilibrium behavior를 검증하는 것이다. Nonlinear follower procedure는 Step 5 범위다. - -Complete test-first RED, expected failure, minimal GREEN and focused VERIFY in this Step, then end so automatic Stop owns exactly one whole-project full verification. Update only Step 4's selected status and one-line Codex-owned payload. Executor owns branch, retry, timestamps, commit, advancement, top-level phase status and output JSON. - -## 읽어야 할 파일 - -- `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/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/formulation.md` §§9, 11–14 -- `../../docs/shell-surface-pressure-load/README.md` §6 -- `../../docs/shell-surface-pressure-load/README.md` §§6–7, 9–10 -- `../../docs/shell-surface-pressure-load/README.md` -- Prior semantic outputs: `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` -- Prior evaluator outputs: `include/fesa/loads/shell_surface_pressure.h`, `src/fesa/loads/shell_surface_pressure.cpp`, `tests/unit/loads/shell_surface_pressure_test.cpp` -- `include/fesa/assembly/load_assembler.h` -- `src/fesa/assembly/load_assembler.cpp` -- `include/fesa/assembly/sparse_assembler.h` -- `src/fesa/assembly/sparse_assembler.cpp` -- `include/fesa/assembly/parallel_for.h` -- `src/fesa/assembly/parallel_for.cpp` -- `include/fesa/fem/dof_manager.h` -- `src/fesa/fem/dof_manager.cpp` -- `src/fesa/analysis/linear_static_procedure.cpp` -- `include/fesa/analysis/analysis_state.h` -- `src/fesa/analysis/analysis_state.cpp` -- `include/fesa/results/result_recovery.h` -- `src/fesa/results/result_recovery.cpp` -- `src/fesa/results/global_equilibrium_recovery.h` -- `src/fesa/results/global_equilibrium_recovery.cpp` -- `include/fesa/io/hdf5/hdf5_results_writer.h` -- `src/fesa/io/hdf5/hdf5_results_writer.cpp` -- `src/fesa/io/hdf5/hdf5_self_check.h` -- `src/fesa/io/hdf5/hdf5_self_check.cpp` -- `src/fesa/app/fesa_application.cpp` -- `tests/unit/assembly/load_assembler_test.cpp` -- `tests/unit/assembly/sparse_assembler_test.cpp` -- `tests/integration/analysis/linear_static_analysis_test.cpp` -- `tests/integration/app/fesa_application_test.cpp` -- `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` -- `src/fesa/CMakeLists.txt` -- `tests/CMakeLists.txt` - -## 소유 파일과 인터페이스 - -- Create test first: `tests/unit/assembly/surface_pressure_assembler_test.cpp` -- Create test first: `tests/integration/analysis/shell_surface_pressure_linear_test.cpp` -- Create test first: `tests/integration/app/shell_surface_pressure_application_test.cpp` -- Create: `include/fesa/assembly/surface_pressure_assembler.h` -- Create: `src/fesa/assembly/surface_pressure_assembler.cpp` -- Modify: `src/fesa/analysis/linear_static_procedure.cpp` -- Modify/Test assertions only: `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` -- Modify: `src/fesa/CMakeLists.txt` -- Modify: `tests/CMakeLists.txt` - -HDF5 production writer and `fesa_application.cpp` are expected no-change verification targets. Modify them only if a new RED test proves a direct approved-contract gap, and record that evidence and minimal reason. - -Assembler contract: - -```cpp -struct SurfacePressureAssemblyCandidate { - Vector full_external_force; - SparseMatrix full_external_tangent; - std::vector diagnostics; -}; - -Result AssembleSurfacePressure( - const AnalysisModel& model, - const DofManager& dofs, - const Vector& full_generalized_coordinates, - double load_factor, - SurfacePressureConfiguration configuration, - const ParallelFor& parallel_for); -``` - -The input vector is stable full-DOF `[u1,u2,u3,phi1,phi2,phi3]`. Produce local candidates in `(load_ordinal, facet_ordinal, instance declaration ordinal, element label, local row[,column])`, use worker-local buffers and reduce in that exact serial order. Workers never update global vector/CSR directly. - -## RED - -Write/register first: - -- `SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder` -- `SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce` -- `SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation` -- `LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement` -- `LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction` -- `LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment` -- `LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance` -- `LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset` -- `ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate` -- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior` - -Run before production implementation: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected RED: assembler compile/link failure, or linear procedure assembles only CLOAD so pressure resultant/reaction remains zero and pressure CLI assertions fail. Record command, exit, duration and output tail. Unexpected pass is evidence-gap; unrelated failure is regression. - -## Minimal GREEN - -- Create evaluator inputs from immutable Domain source identity and stable DofManager scatter. Evaluate every `(load_ordinal, facet_ordinal)`, including zero pressure/factor geometry validation. -- Keep worker-local force/tangent contributions. Validate all candidates before fixed serial reduction; no global concurrent writes. -- In `LinearStaticProcedureExecutor`, preserve element stiffness assembly, `Kff/Kfc` partition and `Kff` factorization-before-load order. -- Assemble existing CLOAD and reference pressure separately, checked-finite add their full-space forces, and assign `AnalysisState::ExternalForce()` exactly once before free/constrained projection. -- Call pressure assembler with load factor exactly `1.0`, reference configuration and a full generalized-coordinate vector of the required size. Linear pressure tangent is exact zero and does not change stiffness. -- Preserve `EffectiveFreeRhs(Ff-Kfc*dc)`, valid `0x0 Kff`, full displacement reconstruction and `K*d-F` recovery. Constrained residual is reaction; free residual is equilibrium evidence. -- Preserve current schema version `0`, mandatory result inventory, CLI sibling naming and atomic candidate finalization. Add no surface/load/pressure dataset or metadata. - -## VERIFY and Acceptance Criteria - -Use 과거 검증 자료(정리됨) first if present; otherwise: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -위 targeted build, focused feature/regression tests와 nonzero discovery evidence를 기록한 뒤 Step status/summary를 갱신하고 agent turn을 종료한다. Implementation Agent는 target 없는 whole-project build 또는 unfiltered full CTest를 실행하지 않는다. Automatic Stop hook이 exactly one whole-project MSVC x64 Debug build/full CTest를 수행한다. - -Acceptance: - -- normalized analytical force/moment/reaction/mesh/order errors `<=1e-12`; -- global force and moment balance `<=1e-8` and approved existing free-residual gates; -- serial/parallel external vectors, diagnostics and row order exact; -- schema `0`, existing mandatory datasets only, no pressure-specific path; -- failed pressure candidate leaves prior final bytes unchanged or no misleading final; -- inputs without pressure retain current results; -- nonzero CTest inventory, focused feature/regression pass, no new MSVC warning and runtime staging succeeds; -- automatic Stop의 exactly one whole-project MSVC x64 Debug build/unfiltered CTest pass. - -## 불변식, 실패 처리와 증거 - -- Full-space completion precedes projection; source/internal/equation IDs remain distinct. -- Load factor is applied exactly once; repeated pressure records remain additive. -- Any local/nonfinite/assembly/recovery failure returns before state/result publication. -- Record RED/GREEN/VERIFY commands, exits, durations/tails, contribution order, external/reaction/residual/resultant values, schema inventory and final-file snapshots. -- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`. - -Trace: `FESA-REQ-SHELL-PRESSURE-005`–`007`, `010`–`013`, `016`–`020`; io §§6–7, 9–10; formulation §§9, 11–14; numerical-review linear/resultant/balance checks. - -## 금지사항 - -- Do not implement nonlinear follower procedure, change the linear solver backend, HDF5 schema or output inventory. -- Do not refactor existing load hierarchy beyond the new pressure assembler or expose MKL/TBB/HDF5 in public core. -- Do not modify upstream docs, tolerance/reference artifacts or Abaqus files. -- Do not run Abaqus, create output JSON, invoke Executor, advance Step 5, commit or push. diff --git a/phases/shell-surface-pressure-load/step5.md b/phases/shell-surface-pressure-load/step5.md deleted file mode 100644 index f2f6cbd..0000000 --- a/phases/shell-surface-pressure-load/step5.md +++ /dev/null @@ -1,136 +0,0 @@ -# Step 5: integrate-nonlinear-follower-pressure - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -이 Step의 단일 책임은 current-configuration follower pressure force와 generally nonsymmetric exact external tangent를 nonlinear full-Newton trial/commit lifecycle과 existing schema-1 output에 연결하는 것이다. Same Step에서 test-first RED, expected failure, minimal GREEN and focused VERIFY를 완료한 뒤 종료하며, automatic Stop hook이 exactly one whole-project full verification을 소유한다. - -Implementation Agent는 Executor-selected Step 5만 수행하고 Step 5 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor가 branch, retry, timestamps, commits, advancement, top-level status and output JSON을 소유한다. - -## 읽어야 할 파일 - -- `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/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/formulation.md` §§9.2–9.4, 11–14 -- `../../docs/shell-surface-pressure-load/README.md` §6 nonlinear suite -- `../../docs/shell-surface-pressure-load/README.md` §§6–7, 9–10 -- `../../docs/shell-surface-pressure-load/README.md` -- Prior outputs: `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` -- Prior evaluator/assembler: `include/fesa/loads/shell_surface_pressure.h`, `src/fesa/loads/shell_surface_pressure.cpp`, `include/fesa/assembly/surface_pressure_assembler.h`, `src/fesa/assembly/surface_pressure_assembler.cpp`, their unit tests -- `include/fesa/analysis/nonlinear_static_control.h` -- `src/fesa/analysis/nonlinear_static_control.cpp` -- `include/fesa/analysis/nonlinear_static_procedure.h` -- `src/fesa/analysis/nonlinear_static_procedure.cpp` -- `include/fesa/analysis/nonlinear_analysis_state.h` -- `src/fesa/analysis/nonlinear_analysis_state.cpp` -- `include/fesa/elements/nonlinear_mitc4_shell.h` -- `src/fesa/elements/nonlinear_mitc4_shell.cpp` -- `include/fesa/solvers/linear/tangent_solver.h` -- `include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h` -- `src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp` -- `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h` -- `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` -- `src/fesa/io/hdf5/hdf5_self_check.h` -- `src/fesa/io/hdf5/hdf5_self_check.cpp` -- `include/fesa/analysis/prepared_analysis.h` -- `src/fesa/analysis/prepared_analysis.cpp` -- `src/fesa/app/fesa_application.cpp` -- `tests/integration/analysis/nonlinear_static_procedure_test.cpp` -- `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` -- `tests/unit/solvers/linear/tangent_solver_test.cpp` -- `tests/integration/app/shell_surface_pressure_application_test.cpp` -- `tests/CMakeLists.txt` - -Step 4 must already provide a validated full-space assembler and linear path. Do not change its reference-configuration semantics. - -## 소유 파일과 procedure contract - -- Create test first: `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp` -- Modify test first: `tests/integration/app/shell_surface_pressure_application_test.cpp` -- Modify test assertions: `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` -- Modify: `src/fesa/analysis/nonlinear_static_procedure.cpp` -- Modify only if checked contribution composition requires a helper: `include/fesa/analysis/nonlinear_static_control.h`, `src/fesa/analysis/nonlinear_static_control.cpp` -- Modify: `tests/CMakeLists.txt` - -Existing PARDISO, HDF5 writer/self-check and application production files are expected no-change verification targets unless RED proves a direct approved-contract defect. - -For each Newton trial, use the existing Step 4 interface: - -```cpp -Result AssembleSurfacePressure( - const AnalysisModel& model, - const DofManager& dofs, - const Vector& full_generalized_coordinates, - double load_factor, - SurfacePressureConfiguration configuration, - const ParallelFor& parallel_for); -``` - -Evaluate internal and external candidates at the same trial. Compose -`f_ext=f_fixed+f_pressure`, `K_ext=K_fixed+K_pressure`, `r=f_int-f_ext`, `K=K_int-K_ext`. Use the existing full-CSR unsymmetric `TangentSolver::FactorizeFresh`; never symmetrize pressure tangent. - -## RED - -Write/register first: - -- `NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry` -- `NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns` -- `NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce` -- `NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath` -- `NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence` -- `NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance` -- `NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea` -- `NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically` -- `NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput` -- `NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium` -- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior` - -Run before production edits: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected RED: current nonlinear procedure includes fixed CLOAD only, so follower force/tangent, objectivity, sign, convergence or balance tests fail. Record command, exit, duration and tail. Unexpected pass is evidence-gap; unrelated failure is regression. - -## Minimal GREEN - -- At every Newton trial call `AssembleSurfacePressure` with current full generalized coordinates, exact current increment `load_factor` and `kCurrent`. -- Checked-finite add fixed and pressure force/tangent in stable order. Apply source pressure magnitude and load factor exactly once. -- Keep pressure kinematics translation-only; rotation force and tangent blocks stay zero. Retain generally nonsymmetric external tangent and existing `MklPardisoTangentSolver` full CSR `mtype=11` path. -- Form residual and tangent with approved signs in full space before constrained/free extraction. Internal/external residual and tangent must be from the same trial. -- Complete and validate candidate kinematics, force/tangent, residual, equilibrium and convergence before `CommitAcceptedFrame`. Invalid geometry/nonfinite/factorization/solve failures must not append frames or replace final HDF5. -- Preserve existing force/moment convergence channels and thresholds; do not add line search/arc length or alter factor sequence. -- Preserve schema `1` and existing generalized internal/external/residual/reaction/global equilibrium datasets. Add no pressure dataset/version/metadata. - -## VERIFY and Acceptance Criteria - -Use 과거 검증 자료(정리됨) first if present; otherwise: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -위 targeted build, focused feature/regression tests와 nonzero discovery evidence를 기록한 뒤 Step status/summary를 갱신하고 agent turn을 종료한다. Implementation Agent는 target 없는 whole-project build 또는 unfiltered full CTest를 실행하지 않는다. Automatic Stop hook이 exactly one whole-project MSVC x64 Debug build/full CTest를 수행한다. - -Acceptance: local FD `<=1e-8`; objectivity/current-area normalized error `<=1e-12`; factor-one global force/moment balance `<=1e-8`; existing free force/moment residual nonzero-scale relative `<=1e-2`, zero-scale absolute `<=1e-3`; exact zero-scale rules; schema-1 unique factor-one frame projections exact; serial/parallel order exact; invalid trial rollback exact; focused tests pass with nonzero discovery and no warning/runtime staging failure; automatic Stop's exactly one whole-project MSVC x64 Debug build/unfiltered CTest passes. - -## 불변식, 실패 처리와 증거 - -- Candidate-before-commit and same-trial internal/external data are mandatory. -- Failure records deterministic last-completed Newton stage and pressure source identity but publishes no invalid state/output. -- Record RED/GREEN/VERIFY commands, exits, durations/tails, load factor, force/tangent signs and nonsymmetry, solver spy events, iteration count, residual/balance metrics, HDF5 inventory and rollback snapshots. -- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`. - -Trace: `FESA-REQ-SHELL-PRESSURE-008`–`013`, `016`–`019`, `021`; io §§6–7, 9–10; formulation §§9–14; numerical-review follower/tangent/objectivity/open-patch/balance checks. - -## 금지사항 - -- Do not add line search, arc length, new procedure, convergence threshold changes, PARDISO redesign or HDF5 fields. -- Do not alter Step 3 force/tangent math or Step 4 linear path except a test-proven defect returned to the owning Step through Coordinator. -- Do not modify upstream docs, tolerance/reference artifacts or run Abaqus. -- Do not create output JSON, invoke Executor, advance Step 6, commit or push. diff --git a/phases/shell-surface-pressure-load/step6.md b/phases/shell-surface-pressure-load/step6.md deleted file mode 100644 index 234fe2e..0000000 --- a/phases/shell-surface-pressure-load/step6.md +++ /dev/null @@ -1,128 +0,0 @@ -# Step 6: compare-pressure-reference - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -이 Step's single responsibility is to add deterministic comparison support between FESA schema-1 factor-one HDF5 and the exact stored shell-pressure displacement CSV using the unchanged common tolerance. It does not generate reference data and does not write final Gate 6 reports; Step 7 owns closure reports. - -Complete RED, expected failure, minimal GREEN and focused VERIFY here, then end so automatic Stop owns exactly one whole-project full verification. Update only Step 6's status and one-line Codex-owned payload. Executor owns all timestamps, commits, retry/advancement, top-level status and output JSON. - -## 읽어야 할 파일 - -- `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/solver-core/README.md` -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` §§6.2–6.3 -- `../../docs/shell-surface-pressure-load/README.md` -- `../../docs/shell-surface-pressure-load/README.md` §8 -- `../../docs/shell-surface-pressure-load/README.md` -- All prior implemented/test files from Steps 1–5, especially `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp` -- `tests/reference/reference_tolerance_policy.h` -- `tests/reference/reference_tolerance_policy.cpp` -- `tests/reference/reference_tolerance_policy_test.cpp` -- `tests/reference/nonlinear_static_reference_comparison.h` -- `tests/reference/nonlinear_static_reference_comparison.cpp` -- `tests/reference/nonlinear_static_reference_cases_test.cpp` -- `tests/reference/mitc4_reference_comparison.h` -- `tests/reference/mitc4_reference_comparison.cpp` -- `tests/reference/mitc4_reference_cases_test.cpp` -- `tests/CMakeLists.txt` -- Read-only exact artifacts listed below - -## Exact read-only artifact contract - -- Required input: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`, 56,665 bytes, SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`. -- Required comparison CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv`, 111,182 bytes, SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`. -- Optional review-only reaction CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv`, never verdict-changing. -- Excluded stress CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv`, no comparison family. - -Never rename, rewrite, normalize, repair, regenerate or reorder any artifact. Never run Abaqus or another reference solver. Run FESA only on a byte-identical copy under 과거 검증 자료(정리됨). - -## 소유 파일과 interface boundary - -- Create test first: `tests/reference/shell_surface_pressure_reference_test.cpp` -- Modify: `tests/reference/nonlinear_static_reference_comparison.h` -- Modify: `tests/reference/nonlinear_static_reference_comparison.cpp` -- Modify: `tests/CMakeLists.txt` - -Preserve existing public operations and extend their per-case value contract minimally: - -```cpp -Result> ArtifactCheck( - const NonlinearReferenceCase& reference_case); -Result CopyInputToExecutionDirectory( - const NonlinearReferenceCase& reference_case); -Result RunFesaApplicationOnCopiedInput( - const NonlinearReferenceCase& reference_case, - const std::filesystem::path& copied_input_path); -Result CompareHdf5ToReferenceCsv( - const NonlinearReferenceCase& reference_case, - const std::filesystem::path& hdf5_results_path); -NonlinearReferenceClassification ClassifyReferenceComparison( - const NonlinearReferenceComparisonReport& report); -``` - -Represent required input/displacement, optional reaction and excluded stress disposition as explicit per-case value fields. Do not change `reference_tolerance_policy.*`. - -## RED - -Write/register first: - -- `ShellSurfacePressureReference.AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts` -- `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame` -- `ShellSurfacePressureReference.Projects729WideRowsTo2187LogicalRowsPerFamily` -- `ShellSurfacePressureReference.MatchesByInstanceNodeLabelAndComponentNotRowOrder` -- `ShellSurfacePressureReference.RejectsSchemaIdentityCardinalityMissingExtraDuplicateAndNonfiniteBeforeTolerance` -- `ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly` -- `ShellSurfacePressureReference.ExcludesReactionAndStressFamiliesFromVerdict` -- `ShellSurfacePressureReference.UsesUnchangedCommonScaleNearZeroRelativeAndRmsPolicy` -- `ShellSurfacePressureReference.WritesDeterministicComparisonReport` - -Run before comparator implementation: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Expected RED: current nonlinear registry has no pressure case/disposition and assumes a legacy artifact portfolio, so the exact two-required-file contract, schema/frame projection or 729/2187 cardinality fails. Record command, exit, duration and tail. Unexpected pass is evidence-gap; unrelated failure is regression. - -## Minimal GREEN - -- Snapshot exact required artifacts before run, byte-copy only the input into the build tree, and run FESA application only. -- Require HDF5 schema `1`, exact `Step-1`, a unique accepted frame with `load_factor==1`/`is_factor_one`, `/model/nodes`, and existing nodal displacement. -- Join HDF5 nodes and CSV by `(instance_name="Part-1-1", source node label, component)`, never row order/internal index. Expand 729 wide rows to 2,187 `U1/U2/U3` logical rows and 2,187 `UR1/UR2/UR3` rows. -- Reject schema/frame/identity/cardinality, missing, extra, duplicate and nonfinite rows before tolerance. -- After prechecks only, call unchanged `EvaluateReferenceTolerance`: `S=max(abs(reference))`; near-zero band `0.01*S`; near-zero absolute row error `<=0.01*S`; otherwise relative `<=0.05`; `RMS(error)/S<=0.01`; zero-scale requires FESA exact zero. -- Translation is blocking; rotation is warning-only. Reaction creates no numerical comparator family and is review-only; stress is excluded. -- Produce deterministic row, family metric, warning and classification order. HDF5-derived CSV, if any, is debug-only and not official output. - -## VERIFY and Acceptance Criteria - -Use 과거 검증 자료(정리됨) first if present; otherwise: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -위 targeted build, focused pressure/reference regressions와 nonzero discovery evidence를 기록한 뒤 Step status/summary를 갱신하고 agent turn을 종료한다. Implementation Agent는 target 없는 whole-project build 또는 unfiltered full CTest를 실행하지 않는다. Automatic Stop hook이 exactly one whole-project MSVC x64 Debug build/full CTest를 수행한다. - -Acceptance: exact input/CSV size+hash unchanged before/after; 729 unique node keys; 2,187 rows in each U/UR family; all prechecks precede tolerance; common policy unchanged; U blocking and UR warning-only; reaction/stress dispositions exact; deterministic report; focused tests pass with nonzero discovery and no new warning/runtime staging failure; automatic Stop's exactly one whole-project MSVC x64 Debug build/unfiltered CTest passes. - -## 불변식, 실패 처리와 증거 - -- Artifact/precheck failure returns a failed classification without tolerance evaluation or artifact mutation. -- Copied input/generated HDF5/log live only under build tree. -- Record pre/post snapshots, copy/generated paths, selected frame identity, cardinalities, family scale/row/RMS/worst row, warnings, classification and RED/GREEN/VERIFY command evidence. -- Failure classification: `configure | compile | link | test | reference-comparison | artifact | harness | environment | upstream-contract | regression | evidence-gap`. - -Trace: `FESA-REQ-SHELL-PRESSURE-017`–`019`, `021`–`024`; io §8; reference-model §§3–8; numerical-review external acceptance. - -## 금지사항 - -- Do not generate/edit/rename reference files, change tolerance, promote reaction/stress, add metadata requirements or run Abaqus. -- Do not modify solver production unless failure is returned through Coordinator to the owning implementation Step. -- Do not write final reports yet, create output JSON, invoke Executor, advance Step 7, commit or push. diff --git a/phases/shell-surface-pressure-load/step7.md b/phases/shell-surface-pressure-load/step7.md deleted file mode 100644 index 327790e..0000000 --- a/phases/shell-surface-pressure-load/step7.md +++ /dev/null @@ -1,104 +0,0 @@ -# Step 7: verify-and-report-pressure-feature - -> 과거 개발 계획이다. 아래 작업·상태·예시는 현재 실행 지시가 아니다. -> 현재 구현과 검증 한계는 [기능 요약](../../docs/shell-surface-pressure-load/README.md)을 따른다. - -## 실행 범위와 상태 소유권 - -This final Implementation-owned Step inspects all prior artifacts, performs fresh targeted MSVC/focused CTest and exact pressure-reference gates, and completes the three Gate 6 evidence documents. Code changes are not the default scope. The required sequence is literally `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` after agent-owned focused gates; automatic Stop owns exactly one whole-project full verification. - -Implementation Agent may update only Step 7's `status` and one-line `summary`/`error_message`/`blocked_reason`. Executor owns branch, retry, timestamps, commits, advancement, top-level phase completion and output JSON. This Step does not approve physics Gate 7 or release readiness. - -## 읽어야 할 파일 - -- `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/solver-core/README.md` -- `.codex/hooks.json` -- 과거 검증 자료(정리됨) if it exists at execution time -- `CMakeLists.txt`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt` -- Every `../../docs/shell-surface-pressure-load/README.md` upstream and approved plan -- `phases/shell-surface-pressure-load/index.json` -- All production/test files created or modified in Steps 1–6 -- `tests/reference/shell_surface_pressure_reference_test.cpp` -- `tests/reference/nonlinear_static_reference_comparison.h/.cpp` -- Exact read-only artifacts listed in Step 6 and `reference-model.md` - -Read all prior Step summaries and changed files. Verify that every production change has a first-failing test record and that source/interface names remain consistent with the approved plan. - -## 소유 파일 - -- Create/complete: `../../docs/shell-surface-pressure-load/README.md` -- Create/complete: `../../docs/shell-surface-pressure-load/README.md` -- Create/complete: `../../docs/shell-surface-pressure-load/README.md` - -Production, tests, CMake and phase files are read-only in this Step except Step 7's selected status/payload. If verification exposes an implementation defect, classify and return it to Coordinator/the owning earlier Step; do not silently repair it here. - -## RED evidence preflight - -First prove the three reports are absent/incomplete or contain no fresh final passing evidence. This expected evidence-state failure is Step 7 RED. Then inspect prior reports/summaries for recorded test-first RED commands and expected failures. If any source/test/CMake change lacks RED evidence, classify `evidence-gap` and stop; do not fabricate history. - -Record the preflight result before running final gates. - -## Fresh MSVC x64 Debug gates - -If 과거 검증 자료(정리됨) exists, it takes precedence and the reports must record its exact resolved configure/build/test commands. Otherwise run exactly: - -과거 도구 실행·출력 지시는 정리했으며, 현재 검증 방법은 기능 요약을 따른다. - -Acceptance requires every agent-owned exit `0`, nonzero discovered tests including every named feature suite, focused CTest pass, no new `/W4 /WX` warning, correct MSVC/x64/Debug selection and successful MKL/TBB/HDF5 runtime staging. Record these results, complete the reports and selected Step status/summary, then end the agent turn. Do not run a targetless whole-project build or unfiltered full CTest: automatic Stop runs exactly one whole-project MSVC x64 Debug build/unfiltered CTest and its result is authoritative Harness evidence. No Harness/Python files are in scope, so do not run Python tests unless separately authorized Harness/Python changes actually occurred; then record `uv run --with pytest python -m pytest -v -rs` and why. - -## ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT - -### ARTIFACT CHECK - -Before running the pressure case, record path, SHA-256, bytes and timestamp for: - -- required input `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`: 56,665 bytes, `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`; -- required displacement CSV: 111,182 bytes, `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`; -- reaction CSV as review-only inventory; -- stress CSV as excluded inventory. - -Confirm source history/commands do not invoke Abaqus. Copy only the exact input to 과거 검증 자료(정리됨). - -### COMPARE - -Run FESA only on the copied input and locate generated schema-1 `_results.h5` and log. Use `ShellSurfacePressureReference` comparison to select exact Step-1 unique factor-one accepted frame and project `/model/nodes` plus nodal displacements by `(Part-1-1, source node label, component)`. Require 729 wide CSV rows, 2,187 U logical rows and 2,187 UR logical rows. Reject missing/extra/duplicate/nonfinite/schema/frame/identity errors before unchanged common tolerance. - -### CLASSIFY - -- Blocking fail: any precheck, U1/U2/U3 tolerance, required internal free-residual/global-equilibrium or artifact immutability failure. -- Warning-only: UR1/UR2/UR3 deviations when all blocking gates pass. -- Review-only/excluded: reaction/stress cannot change the verdict. -- Classify failures as `implementation | test | configure | compile | link | reference-comparison | infrastructure | environment | artifact | regression | evidence-gap | upstream-contract`. - -Any nonzero command, zero tests, new warning, runtime staging failure, artifact mutation, cardinality mismatch or U/internal blocking failure leaves Step non-completed. Retain evidence and return to Coordinator; do not adjust tolerance or artifacts. - -### REPORT - -Write complete Korean Markdown reports: - -- `implementation-report.md`: metadata, task order, RED/GREEN/VERIFY evidence per Step, exact changed files/interfaces, 24-requirement coverage, implementation acceptance, limitations and handoff. -- `build-test.md`: `owner_agent: implementation-agent`, environment/toolchain/config selection, each agent-owned command, exit, duration, stdout/stderr tail, test discovery/count/results, warning/runtime inventory, automatic Stop whole-project command ownership/evidence disposition, failure classification, no-change assertion and open issues. -- `reference-comparison.md`: exact artifact inventory and pre/post snapshots, generated HDF5/log, schema/frame projection, source identity/component matching, row prechecks, unchanged tolerance, per-family/per-row decisions, maximum absolute/relative applicable error, RMS and other contract-applicable metrics, U/UR disposition, internal gates, deterministic classification, no-change assertion and open issues. - -Do not claim release readiness. A passing Gate 6 report recommends only `pass-for-physics-evaluation` through Coordinator. - -## Final Acceptance Criteria - -- All 24 `FESA-REQ-SHELL-PRESSURE-001`–`024` map to at least one implemented task and passing test/evidence; orphan count zero. -- Fresh targeted MSVC x64 Debug build, focused suite and nonzero discovery pass with zero new warnings; automatic Stop's exactly one whole-project MSVC x64 Debug build/unfiltered CTest passes. -- Exact artifacts remain byte-for-byte unchanged after FESA-only run. -- Schema 0/1 contracts and no-pressure regressions pass; no pressure dataset/schema/version/CLI expansion. -- Pressure reference U blocking passes, UR remains warning-only, reaction review-only, stress excluded; internal equilibrium passes. -- Reports contain commands, exits, durations, tails and classification; no fabricated RED evidence. -- Automatic Stop whole-project validation succeeds. Do not run hook entry points manually. - -## 금지사항 - -- Do not fix source/tests/CMake silently, generate reference data, run Abaqus, alter tolerance, upstream docs or artifact bytes. -- Do not select another Step. 이유: this is the final Executor-selected implementation evidence Step only. diff --git a/reference/shell-thermal/shell-thermal_log.txt b/reference/shell-thermal/shell-thermal_log.txt new file mode 100644 index 0000000..e69de29 diff --git a/reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_log.txt b/reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_log.txt new file mode 100644 index 0000000..e69de29 diff --git a/scripts/AGENTS.md b/scripts/AGENTS.md index 70e2802..cfe2007 100644 --- a/scripts/AGENTS.md +++ b/scripts/AGENTS.md @@ -1,6 +1,6 @@ # 비교 보조 도구 -`verification/compare_hex8.py`와 `compare_hht_dynamic.py`는 입력·reference·결과를 +`verification/compare_hex8.py`와 `verification/compare_hht_dynamic.py`는 입력·reference·결과를 읽고 요청한 JSON report만 기록한다. Solver를 실행하지 않는다. - 실행 전에 argv, 의존성, report 경로와 덮어쓰기 방지 검사를 확인한다. diff --git a/src/fesa/elements/AGENTS.md b/src/fesa/elements/AGENTS.md index e1e753b..4b7e3ef 100644 --- a/src/fesa/elements/AGENTS.md +++ b/src/fesa/elements/AGENTS.md @@ -1,6 +1,7 @@ # 요소 local 계산 -Elements는 Euler beam·MITC4 shell의 local 강성·내력·관성·복구용 응답을 소유한다. +Elements는 Euler beam·MITC4 shell·Hex8의 local 강성·내력·관성·복구용 응답과 +thermal shell의 전도·열용량·복구용 응답을 소유한다. Global equation 번호, 공유 sparse write와 파일 저장은 소유하지 않는다. - Local node/DOF 순서, 축·회전 chart·director와 부호를 정식화와 일치시킨다. diff --git a/src/fesa/properties/AGENTS.md b/src/fesa/properties/AGENTS.md index 2809857..f0a2595 100644 --- a/src/fesa/properties/AGENTS.md +++ b/src/fesa/properties/AGENTS.md @@ -1,6 +1,7 @@ # 요소 단면과 property 이 영역은 beam general section과 shell section의 물리적 데이터 및 재료 연결을 소유한다. +SolidSection의 재료 연결 계약은 대응 공개 header에서 함께 확인한다. Material 구성식이나 global assembly, 실행 중 solution state는 소유하지 않는다. - 면적·두께·단면 관성·축의 units와 유효 조건을 보존한다. 값이 없거나 다른 element와 diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 9997247..b027e31 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -15,12 +15,9 @@ Tests는 solver 동작·수학적 일관성·외부 비교와 C++ 개발 규약 입력 자유도를 공개 CLI 지원으로 승격하지 않는다. - 미실행·skip·제외·실패를 PASS로 계산하거나 폐기된 workflow를 복원하지 않는다. -- 직접 MSVC와 CMake의 세 executable 전체 등록 identity를 대조한다. 이번 병합은 - 2026-10-18 사용자 변경에 따라 정적·공통 계약 검사를 명시적으로 선택해 직렬 실행한다. - 두 실행의 TMP/TEMP·XML·raw 경로를 분리하고 inherited filter/sharding을 제거한다. - 실제 선택·제외 identity와 body 기반 이유를 남긴다. HHT·dynamic·eigen·transient thermal은 - 이번 실행 범위에서 제외하며, 제외를 통과나 테스트 삭제 근거로 삼지 않는다. +- 직접 MSVC와 CMake의 세 executable 전체 등록 identity를 대조한다. + 두 실행의 짧고 고유한 TMP/TEMP·XML·raw 경로를 분리하고 inherited filter/sharding을 제거한다. + 실제 선택·제외 identity와 body 기반 이유를 남긴다. 제외를 통과나 테스트 삭제 근거로 삼지 않는다. - `reference/temp`는 검증에 사용하지 않는다. 정식 reference 부재는 자료 누락으로 기록한다. - 승인된 정적 통합 검증 전에는 중복·폐기 내부구조 검사도 최종 삭제하지 않는다. - 자료 없는 비교의 유일 검증과 비정적 테스트는 유지한다. 삭제 시 이관표에 + 자료 부재·실행 유예만을 이유로 검사를 삭제하지 않는다. 삭제 시 이관표에 동등한 대체 identity·실패 경계·수치 조건 또는 폐기 구조를 연결한다.