modify documents

This commit is contained in:
KOKO\Mimi
2026-10-04 03:32:59 +09:00
parent 858e87be64
commit c1d5cc3c0d
176 changed files with 9615 additions and 25355 deletions
+22 -20
View File
@@ -6,14 +6,16 @@
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md).
문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)에 있다.
이 문서는 이전 MFE baseline의 승인·운영 결정 이력이다. 현재 구현 상태는
[eigen2 PRD](../mitc4-shell-feast-eigen2/PRD.md), 이전 환경 실패는
[개발 교훈](development-notes.md#실패와-재발-방지)을 따른다. 과거 stage/Hook 결정을 현행 실행 절차로 복원하지 않는다.
## MFE-ADR-001 — 사용자 지정 backend와 reference 범위
- 상태: 사용자 요청으로 확정된 intake 범위.
- 결정 owner: user; 기록 owner: coordinator-agent.
- 결정: MITC4 질량행렬 및 고유치해석을 구현하고 고유치 계산에는 MKL FEAST를 사용한다. 지정된 `reference/shellNL-eigen-meshfine` reference에서 외부 비교는 고유치만 수행한다.
- 근거: 2026-09-06 사용자 요청; [Feature PRD 사용자 요구](PRD.md#사용자-요구).
- 근거: 2026-09-06 사용자 요청; [Feature PRD 사용자 요구](PRD.md#사용자-요구와-승계-경계).
- 영향: backend 대체, 외부 mode-shape acceptance 추가 또는 reference 변경으로 요구를 우회하지 않는다.
## MFE-ADR-002 — MITC4 질량 이산화
@@ -21,7 +23,7 @@
- 상태: 사용자 후속 요구로 확정됨; 상세 lumping 수식은 Research/Formulation 소유.
- 결정 owner: user; 선택지 검토 owner: requirement-agent; 상세 수식 owner: formulation-agent.
- 결정: `consistent mass`를 계산하고 이를 이용하여 `lumped mass`도 계산한다. 앞서 제안한 둘 중 하나의 선택이 아니라 두 계산의 연결이 사용자 요구이다.
- 근거: 2026-09-06 사용자 후속 답변 “mass matrix는 consistent mass를 계산하고 이를 이용해서 lumped mass를 계산합니다.”; [원래 질문 evidence](requirements-evidence.md#중요한-결정).
- 근거: 2026-09-06 사용자 후속 답변 “mass matrix는 consistent mass를 계산하고 이를 이용해서 lumped mass를 계산합니다.”; [원래 질문 evidence](requirements.md#requirements-evidence--중요한-결정).
- 영향: Requirement owner는 r1에서 두 계산과 관계를 baseline에 반영한다. 실제 FEAST 질량은 후속 명시 답변으로 lumped로 확정되었으며 MFE-ADR-004를 따른다.
- 경계: 기존 비물리 drilling DOF에 인공 관성을 추가하지 않는 방향을 권고한다. FEAST generalized problem의 mass SPD 조건과 질량 없는 drilling 처리는 Research와 Formulation이 물리 spectrum 보존 근거를 제시해야 한다. 축소 수식은 이 관리문서에서 정하지 않는다.
@@ -42,7 +44,7 @@
- 결정 owner: user; 대안·영향 owner: requirement-agent.
- 결정: `consistent mass -> lumped mass -> 고유치 해석` 순서로 수행하고 FEAST/reference baseline의 `M`은 derived lumped mass를 사용한다. Consistent는 lumping 원본과 내부 질량 검증 대상으로 유지한다.
- 이유와 영향: 사용자가 최종 계산 흐름과 해석 사용 질량을 직접 명시했다. Modal residual, normalization 및 orthogonality의 기준 `M`도 실제 사용한 lumped mass이다.
- 근거: 2026-09-06 사용자 답변 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”; [Requirement owner r1 결정 evidence](requirements-evidence.md#중요한-결정)의 `MFE-OQ-002`를 해소한다.
- 근거: 2026-09-06 사용자 답변 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”; [Requirement owner r1 결정 evidence](requirements.md#requirements-evidence--중요한-결정)의 `MFE-OQ-002`를 해소한다.
- 경계: 두 mass variant 외부 비교 또는 사용자 선택 API를 추가 요구하지 않는다. Lumping 수식은 Research/Formulation이 계약과 evidence로 구체화한다.
## MFE-ADR-005 — 요청 고유치 개수의 입력 권위
@@ -50,7 +52,7 @@
- 상태: 사용자 명시 확인; 기존 r1 요구사항의 의미 유지.
- 결정 owner: user; 기록 owner: coordinator-agent.
- 결정: 고유치 개수는 `.inp`의 `*FREQUENCY` data를 사용한다. 지정 input의 요청은 `10`개이며 reference 행수나 FEAST 내부 count 추정으로 요청 개수를 역추론하지 않는다.
- 근거: 2026-09-06 사용자 답변 “inp 파일의 고유치 개수를 사용합니다”; [r1 FEM-REQ-MITC4-EIGEN-009/015](requirements.md#requirement-verification-matrix).
- 근거: 2026-09-06 사용자 답변 “inp 파일의 고유치 개수를 사용합니다”; [r1 FEM-REQ-MITC4-EIGEN-009/015](requirements.md#requirements--requirement-verification-matrix).
- 영향: 기존 mode-count 의미의 확인이므로 contract revision은 `r1`을 유지한다. FEAST interval/subspace는 입력 요청의 낮은 N개와 multiplicity·누락 검증을 충족하기 위한 내부 처리이다. 새 입력 설정 기능을 추가하지 않는다.
## MFE-ADR-006 — 질량 lumping과 질량 없는 좌표의 정식화
@@ -58,39 +60,39 @@
- 상태: Formulation owner 수학 계약 및 r2 독립 Numerical Review gate 확인.
- 결정 owner: formulation-agent; 기록 owner: coordinator-agent.
- 결정: Consistent scalar moments를 같은 `3×3×3` volume quadrature로 계산하고 moment row-sum에서 nodal `6×6` block lumped mass를 유도한다. 기존 global 제약 뒤 analytic director null과 기존 stabilization의 decoupling을 이용해 finite 공간을 투영하고 sparse nodal whitening으로 FEAST에 연결한다.
- 근거: [Formulation 핵심 계약](formulation.md#핵심-계약), [mass M1~M10](formulation-mass.md), [eigen E1~E8](formulation-eigen.md).
- 근거: [Formulation 핵심 계약](formulation.md#formulation--핵심-계약), [mass M1~M10](formulation.md#formulation-mass), [eigen E1~E8](formulation.md#formulation-eigen).
- 영향: 곡면 coupling 및 mass/centroid·energy 차이를 명시하고 인공 drilling mass와 일반 dense Schur는 도입하지 않는다. Numerical Review는 수식·conditioning·FEAST controls·reference 준비를 독립 검토한다.
- 후속 검토: r1 NR-MFE-001로 확인된 기존 basis-dependent stabilization과 REQ-014 충돌은 MFE-ADR-007의 사용자 승인 개선 범위로 해결한다. r2 [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)는 complete K와 supported partial BC 검증을 명시하며 수식의 독립 판정은 NR가 수행한다.
- 후속 검토: r1 NR-MFE-001로 확인된 기존 basis-dependent stabilization과 REQ-014 충돌은 MFE-ADR-007의 사용자 승인 개선 범위로 해결한다. r2 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)는 complete K와 supported partial BC 검증을 명시하며 수식의 독립 판정은 NR가 수행한다.
## MFE-ADR-007 — 기존 stabilization과 좌표 불변성 acceptance 정합
- 상태: 사용자 명시 승인; `MFE-OQ-003`의 좌표 공변적인 stabilization 개선 및 영향받는 정적/eigen 재검증 범위 추가안 선택.
- 발견 owner: numerical-review-agent; requirement intent owner: requirement-agent; 기록 owner: coordinator-agent.
- 근거: [NR-MFE-001](numerical-review.md#blocking-finding), [재현 가능한 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례).
- 근거: [NR-MFE-001](numerical-review.md#numerical-review--blocking-finding), [재현 가능한 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례).
- 발견: 동일 물리 partial rotation BC를 유지한 회전에서 기존 basis-dependent `kd=min(tangent diagonals)` 때문에 고유치가 상대 `1.1291343961675893e-5`만큼 달라진다. 새 mass 또는 analytic reduction의 확인된 결함은 아니다.
- 판단 근거: [Requirement owner 검토](requirements-evidence.md#nr-mfe-001-requirements-intent-검토)는 `FEM-REQ-MITC4-EIGEN-002/008/014`와 기존 shell의 fixed `kd` 계약을 대조했다. 알려진 지원 모델 반례를 제외하는 것은 acceptance 변경이며 기존 강성의 교체·삭제도 묵시적으로 승인되지 않았다.
- 판단 근거: [Requirement owner 검토](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토)는 `FEM-REQ-MITC4-EIGEN-002/008/014`와 기존 shell의 fixed `kd` 계약을 대조했다. 알려진 지원 모델 반례를 제외하는 것은 acceptance 변경이며 기존 강성의 교체·삭제도 묵시적으로 승인되지 않았다.
- 검토했던 대안: 기존 stabilization과 partial BC 지원을 유지하며 좌표 의존성을 한계로 수용하고 `014` 적용 범위를 변경하는 안과, 좌표 공변적인 stabilization 개선 및 영향받는 기존 정적/eigen 계약·회귀 검증을 추가하는 안을 비교했다.
- 권고 owner와 이유: requirement-agent는 같은 물리 모델의 축 선택 의존성을 해결하는 후자를 권고한다. 기존 강성 계약 영향 검토와 정식화·회귀 검증 작업이 늘어나며 대체 수식은 Formulation 소유이다.
- 승인 근거: 2026-09-06 사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함해주세요.” Root가 원문과 권고안 B 승인 사실을 Coordinator에 전달했다.
- 결정 owner: user; 상세 요구 owner: requirement-agent; 개선 수식 owner: formulation-agent.
- 영향: 승인된 scope 변경으로 contract revision을 `r2`로 올린다. Requirement owner가 기존 물리 kernel 재사용과 개선된 stabilized pencil 보존을 구분하고 해당 static/eigen 회귀 요구를 명시한다. 영향받는 Research/Formulation/NR evidence는 owner별 최소 delta 검토 후 갱신한다.
- 경계: Partial BC 지원, 질량 흐름·FEAST 사용 mass·입력 N, reference 원본과 공통 tolerance를 유지한다. 기존 feature 보고서는 읽기 전용 이력으로 참조하며 현재 feature에서 대체되는 stabilization 계약의 범위를 명시한다. 사용자 승인으로 NR의 수치 gate나 구현 검증을 대신 통과시키지 않는다.
- 후속 근거: [Research R07](research-evidence.md#r07--r2-stabilization-근거와-영향)에 trace/spectral 기반의 기저 불변 scale 후보와 초기 고정 nonlinear 미분 구조, linear positive/null 조건을 기록했다. 이는 연구 후보이며 수식 채택은 Formulation owner가 수행한다.
- 후속 근거: [Research R07](research.md#research-evidence--r07--r2-stabilization-근거와-영향)에 trace/spectral 기반의 기저 불변 scale 후보와 초기 고정 nonlinear 미분 구조, linear positive/null 조건을 기록했다. 이는 연구 후보이며 수식 채택은 Formulation owner가 수행한다.
## MFE-ADR-008 — 초기 physical trace 평균 stabilization scale
- 상태: r2 승인 개선 범위 안의 Formulation owner 수학 계약; 독립 NR에서 반례 해소 및 적용 경계 확인.
- 결정 owner: formulation-agent; 기록 owner: coordinator-agent.
- 결정: 초기 physical `K20`의 여덟 접평면 회전 대각 전체를 평균해 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 사용한다. Zero 대각도 포함하며 기존 numerical map과 nonlinear 초기 고정 lifecycle을 유지한다.
- 근거: [S1~S7](formulation-stabilization.md), [V8의 exact arithmetic·정적 evidence](formulation-verification.md#v8-r2-영향-확인과-bounded-evidence).
- 근거: [S1~S7](formulation.md#formulation-stabilization), [V8의 exact arithmetic·정적 evidence](formulation.md#formulation-verification--v8-r2-영향-확인과-bounded-evidence).
- 이유·경계: 접평면 기저의 scalar invariant를 쓰면서 spectral subtraction과 positive nodal block 선별을 피한다. 양성 inventory·단위·연산 순서·invalid 실패, partial BC에 남는 stabilization 및 기존 physical/nonphysical 구분은 해당 수학 계약을 따른다. 계수나 mass를 reference에 맞추어 조정하지 않는다.
- 검증 인계: NR-MFE-001의 새 algebraic target `k_d=19/4800`, `lambda=10369/450` 및 물리 tangent moment의 정적 response를 NR가 독립 직접 적분으로 확인했다. [r2 evidence](numerical-review-evidence.md)는 기존 실패와 새 complete K/질량/response/reaction 공변성 결과를 보존한다. 실제 C++/FEAST/reference 통과나 release evidence는 아니다.
- 검증 인계: NR-MFE-001의 새 algebraic target `k_d=19/4800`, `lambda=10369/450` 및 물리 tangent moment의 정적 response를 NR가 독립 직접 적분으로 확인했다. [r2 evidence](numerical-review.md#numerical-review-evidence)는 기존 실패와 새 complete K/질량/response/reaction 공변성 결과를 보존한다. 실제 C++/FEAST/reference 통과나 release evidence는 아니다.
## MFE-ADR-009 — NR 내부 controls와 외부 비교의 분리
- 상태: r2 Numerical Review owner가 고정한 수치·검증 계약; gate evidence audit 완료.
- 결정 owner: numerical-review-agent; 기록 owner: coordinator-agent.
- 결정: [Controls C1~C7](numerical-review-controls.md)의 같은 단위 metric/zero branch·analytic rank/conditioning·modal residual/Gram·FEAST parameter/seed/thread/storage/budget과 [27개 필수 case](numerical-review-cases.md)를 적용한다. 구체 수치의 원본은 해당 owner 문서다.
- 결정: [Controls C1~C7](numerical-review.md#numerical-review-controls)의 같은 단위 metric/zero branch·analytic rank/conditioning·modal residual/Gram·FEAST parameter/seed/thread/storage/budget과 [27개 필수 case](numerical-review.md#numerical-review-cases)를 적용한다. 구체 수치의 원본은 해당 owner 문서다.
- 외부 비교: [reference-model](reference-model.md)의 source Step-2/mode-frame 1~10, Value=`omega²[T^-2]`, 10개 singleton family와 공통 TOLERANCE를 유지한다. 현재 양수 값의 실효 mode별 1%는 공통 RMS 정책의 결과이며 새 tolerance 변경이 아니다.
- 영향: I/O와 Planning/Implementation은 수치 threshold·mass·source identity를 임의로 바꾸지 않는다. 실제 FEAST known spectra·fresh reference 및 영향받은 static 회귀는 아직 수행할 필수 작업이다. 기존 static U/UR·reaction 역할을 새 eigen Value-only와 혼동하지 않는다.
@@ -98,25 +100,25 @@
- 상태: r2 I/O owner의 계약과 정적 evidence gate 확인.
- 결정 owner: io-definition-agent; 기록 owner: coordinator-agent.
- 결정: [입력 I1~I6](io-input.md)의 constant density·단일 frequency·입력 N·부수 옵션 subset을 적용한다. [O1~O5](io-schema.md)의 eigen procedure discriminant와 source step identity, 공개 N개 scalar/vector 및 전체 c 검증·FEAST call evidence를 저장한다.
- 결정: [입력 I1~I6](io.md#io-input)의 constant density·단일 frequency·입력 N·부수 옵션 subset을 적용한다. [O1~O5](io.md#io-schema)의 eigen procedure discriminant와 source step identity, 공개 N개 scalar/vector 및 전체 c 검증·FEAST call evidence를 저장한다.
- 이유·영향: 기존 static schema0/1의 의미와 mandatory inventory는 유지한다. 새 eigen은 `(schema_version=0, eigen_schema_version=1, analysis_procedure=linear-frequency)`와 Feature ID로 구분한다. Raw negative lambda와 unavailable real frequency를 명시적으로 분리하며 기존 non-Newton log lifecycle은 보존한다.
- 근거·경계: [M1~M5](io-mapping.md)의 책임·candidate replace 후 no-fail swap·원본 TXT full grammar 및 27개 요구 mapping을 따른다. 외부 projection은 공개 modes의 Value만 사용하고 10개 singleton family의 공통 판정을 유지한다. 영속 N개 vector는 내부 재현용이며 외부 mode-shape gate를 추가하지 않는다. 실제 parser/HDF5/FEAST/comparator 성공은 아직 미실행이다.
- 근거·경계: [M1~M5](io.md#io-mapping)의 책임·candidate replace 후 no-fail swap·원본 TXT full grammar 및 27개 요구 mapping을 따른다. 외부 projection은 공개 modes의 Value만 사용하고 10개 singleton family의 공통 판정을 유지한다. 영속 N개 vector는 내부 재현용이며 외부 mode-shape gate를 추가하지 않는다. 실제 parser/HDF5/FEAST/comparator 성공은 아직 미실행이다.
## MFE-ADR-011 — 유한 실행 준비와 검증 단위
- 상태: r2 Planning owner의 실행 계약 및 정적 gate 확인; 실제 실행은 미완료.
- 결정 owner: implementation-planning-agent; 사용자 실행 권한 해석: Root; 기록 owner: coordinator-agent.
- 결정: [계획](implementation-plan.md)의 별도 prep 1개 step 뒤 새 invocation으로 main 8개 step을 실행한다. 결합된 API/data 단위를 통합해 불필요한 full VERIFY 반복을 줄이고 각 step의 TDD·focused/full VERIFY·등록 Stop은 유지한다.
- 운영 근거: 기존 전체 검증의 약27.9분 합산 추정과 여러 1800초 deadline, nonlinear helper의 매번 solve 및 이미 로드된 Executor/Stop의 activation 경계를 [환경 E2/E3](implementation-environment.md)에 대조했다. 준비에서는 단일 유한 class timeout만 지정 후 실제 Executor main을 호출하며 runtime default의 최소 변경과 대응 Harness tests를 수행한다.
- 결정: [계획](development-notes.md#실패와-재발-방지)의 별도 prep 1개 step 뒤 새 invocation으로 main 8개 step을 실행한다. 결합된 API/data 단위를 통합해 불필요한 full VERIFY 반복을 줄이고 각 step의 TDD·focused/full VERIFY·등록 Stop은 유지한다.
- 운영 근거: 기존 전체 검증의 약27.9분 합산 추정과 여러 1800초 deadline, nonlinear helper의 매번 solve 및 이미 로드된 Executor/Stop의 activation 경계를 [환경 E2/E3](development-notes.md#실패와-재발-방지)에 대조했다. 준비에서는 단일 유한 class timeout만 지정 후 실제 Executor main을 호출하며 runtime default의 최소 변경과 대응 Harness tests를 수행한다.
- 경계: Bootstrap은 기존 CLI option이나 sandbox 확대가 아니다. 정확한 값/명령은 Planning 문서의 원본을 따르고 Hook state·reentry·실행 메서드·retry·ownership guard를 override하지 않는다. Root/Coordinator도 active invocation 동안 non-owned 편집·커밋을 멈춘다. 보고 시점의 manual evidence와 Executor 종료 뒤 registered Stop/actual exit 사후 확인을 구분하며 성공 전 main activation을 하지 않는다.
- 실제 결과: [prep attempt1](coordination.md#execution-prep-attempt-1-실제-결과)은 기본 workspace-write에서 지정 `.codex/hooks.json` 변경을 거부당해 `blocked-environment`로 종료했다. Partial runtime/test/doc 변경과 마지막 test 수정 미검증을 보존한다. 현재 결정은 sandbox 확대나 성공 판정 권한을 포함하지 않으며, guarded Executor checkpoint 복구 계획 후 해당 실행 직전 명시적 사용자 승인 경계를 적용한다.
- 실제 결과: [prep attempt1](development-notes.md#실패와-재발-방지)은 기본 workspace-write에서 지정 `.codex/hooks.json` 변경을 거부당해 `blocked-environment`로 종료했다. Partial runtime/test/doc 변경과 마지막 test 수정 미검증을 보존한다. 현재 결정은 sandbox 확대나 성공 판정 권한을 포함하지 않으며, guarded Executor checkpoint 복구 계획 후 해당 실행 직전 명시적 사용자 승인 경계를 적용한다.
## MFE-ADR-012 — Source echo 분류 오탐의 bounded 운영 correction
- 상태: 실제 최소 Correction1회와 targeted GREEN37 확인; 전체 prep gate는 환경 차단으로 미완료.
- 발견·재현 owner: Root; 계획 owner: implementation-planning-agent; correction dispatch owner: coordinator-agent.
- 근거: [실제 raw/순수함수 재현](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json), [복구 R4](implementation-recovery.md#r4-조건부-exact-dfa-invocation과-후속-검증), [prep TDD](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md).
- 근거: 실제 raw/순수함수 재현(당시 경로: `../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json`, 현재 checkout에 없음), [복구 R4](development-notes.md#실패와-재발-방지), [prep TDD](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md).
- 결정: 성공한 source-read 출력의 helper marker를 실제 runtime failure로 오인하는 분류 결함만 기존 `scripts/execute.py`/`tests/test_execute.py` 안에서 먼저 수정한다. 진짜 helper 진단, 명시 terminal/history, 실제 wrapper timeout만 허용되는 retry 및 sandbox/ownership 보호를 유지한다.
- 순서·이유: 기존 timeout-only AST guard로 현재 blocked/WIP를 먼저 보존하고 별도 Correction 뒤 새 Executor process를 시작한다. 이미 import된 classifier는 child source 수정만으로 바뀌지 않으며 reload/guard override로 성공을 만들지 않는다. 실제 Hook 쓰기 거부는 별도 환경 blocker로 보존한다.
- 경계: Physics/schema/tolerance `r2`와 선행6개 기술 계약을 바꾸지 않는다. Correction은 별도 signature의 unused allowance 확인 후 명시 dispatch하며 성공·검증·커밋은 실제 결과 뒤에만 기록한다. Exact-run sandbox 사용자 승인과 full VERIFY는 유지한다.
- 실제 evidence: [Correction owner 보고서](corrections.md)는 RED21fail/16pass 후 GREEN37pass, full Python152pass/Hook assertion1fail, manual build의 FileTracker TEMP 접근 거부 및 CTest 미실행을 기록한다. [Coordinator 사후 관찰](coordination.md#현재-bounded-dispatch)은 native/registered Stop/CTest의 실제 exit0, 별도 자동362pass와 비소유 bytes 보존을 확인했다. Source/test 교정은 아직 checkpoint 전이며 두 번째 Correction을 허용하지 않는다. 확인된 process-local workspace 환경과 unchanged Executor 보존 절차는 Planning의 후속 delta에서 고정한다.
- 실제 evidence: [Correction owner 보고서](development-notes.md#실패와-재발-방지)는 RED21fail/16pass 후 GREEN37pass, full Python152pass/Hook assertion1fail, manual build의 FileTracker TEMP 접근 거부 및 CTest 미실행을 기록한다. [Coordinator 사후 관찰](development-notes.md#실패와-재발-방지)은 native/registered Stop/CTest의 실제 exit0, 별도 자동362pass와 비소유 bytes 보존을 확인했다. Source/test 교정은 아직 checkpoint 전이며 두 번째 Correction을 허용하지 않는다. 확인된 process-local workspace 환경과 unchanged Executor 보존 절차는 Planning의 후속 delta에서 고정한다.
+16 -70
View File
@@ -1,76 +1,22 @@
# MITC4 Shell Mass Matrix와 FEAST 고유치해석
# mitc4-shell-feast-eigen 문서·작업 지침
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Input contract revision: `r2` (사용자 승인 stabilization 개선 범위 반영)
- 목적: MITC4 shell의 질량행렬과 MKL FEAST 고유치해석을 입력부터 HDF5 결과와 독립 검증까지 연결한다.
- 현재 workflow 상태 원본: [coordination.md](coordination.md)
- 문서 진입점·목적·사용법·Handoff: [README](README.md).
- 현재 범위·checklist: [PRD](PRD.md); 결정·승인·대체 이력: [ADR](ADR.md).
- 적용 범위: 해당 기능의 문서. 자동 로드되는 코드 영역 `AGENTS.md`가 아니다.
## 기준과 지역 지침
기준: [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md),
[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [공통 tolerance](../TOLERANCE.md).
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
[ARCHITECTURE](../ARCHITECTURE.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md),
[FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md), [TOLERANCE](../TOLERANCE.md)를 읽기 전용으로 적용한다.
## 보존할 계약과 인계
사용자는 requirements부터 release-readiness까지 9개 stage의 문서·계획·구현·local 검증을 요청했다.
중요한 physics, scope, acceptance, 비호환 public contract 결정만 사용자에게 묶어서 요청한다.
일반 문서나 stage handoff의 반복 승인은 요구하지 않는다.
Reference는 `reference/shellNL-eigen-meshfine`의 기존 경로와 내용을 그대로 사용한다.
외부 reference 비교량은 고유치만이며 mode shape를 외부 acceptance로 추가하지 않는다.
내부 수학적·물리적 검증은 별도 evidence로 요구한다. 사용자 후속 요구는 consistent mass 계산 후 이를 이용한 lumped mass 계산이다.
Actual FEAST mass는 사용자 명시 승인에 따라 derived lumped mass이다. `consistent -> lumped -> FEAST` 순서와 lumped 기준 modal 검증을 유지하고 상세 lumping 수식은 owner가 evidence와 함께 정의한다.
사용자는 기존 drilling stabilization의 좌표 공변적 개선과 영향받는 기존 정적/eigen 재검증까지 범위에 포함하도록 승인했다. 기존 물리 kernel·질량·reference·공통 tolerance는 유지하며 승인된 변경의 상세 계약과 증거는 각 owner가 갱신한다.
수식·I/O·수치 기준의 원본은 README에서 연결한 전문 문서를 따른다. 기능을 재개할 때
관련 계약과 실제 실행 revision·미해결 항목을 함께 읽는다. 과거 stage pass나 현재 문서
정리를 solver 검증 통과로 계산하지 않는다. 요구사항·ADR ID와 승인 이력을 유지한다.
메인은 PRD·ADR·진입점·문서 참조를 관리하고 전문 작업자는 할당한 본문과 관련 범위만 수정한다.
기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다.
문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다.
Specialist는 하나의 assigned stage만 수행하고 peer dispatch, workflow 전이 또는 자기 최종 승인을 하지 않는다.
각 dispatch와 Harness step은 이 폴더와 [이 문서](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)를 필수 입력으로 명시한다.
기본 보고서는 간결하게 작성하고 긴 상세 계약은 같은 Feature 폴더에 상대 링크로 분리한다.
Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실행 및 push/tag/publish/deploy/package는 범위 밖이다.
## 문서 목록
| 경로 | Owner | Revision | 검토 상태 |
| --- | --- | --- | --- |
| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | coordinator-agent | r2 | 후속 승인 범위 반영 |
| [PRD.md](PRD.md) | coordinator-agent | r2 | 사용자 요구 요약 |
| [ADR.md](ADR.md) | coordinator-agent | r2 | MFE-ADR-007 사용자 승인 기록 |
| [coordination.md](coordination.md) | coordinator-agent | r2 | workflow 상태 원본 |
| [requirements.md](requirements.md) | requirement-agent | r2 | 27개 must; 승인 범위 delta baseline gate pass |
| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r2 | fixed kd 대체 경계·기존 static 회귀·승인 evidence audit 완료 |
| [research.md](research.md) | research-agent | r2 | 27개 coverage·승인 delta evidence gate pass |
| [research-evidence.md](research-evidence.md) | research-agent | r2 | R07 공변 scale 후보·nonlinear lifecycle·null 조건; 기존 근거 보존 확인 |
| [formulation.md](formulation.md) | formulation-agent | r2 | 27개 coverage·수학 handoff 및 독립 NR gate pass |
| [formulation-mass.md](formulation-mass.md) | formulation-agent | r2 | 질량 수학 근거 보존 확인; numerical scale만 r2 연결 |
| [formulation-eigen.md](formulation-eigen.md) | formulation-agent | r2 | 개선된 K의 null 처리·finite spectrum·복원 수학 계약 |
| [formulation-verification.md](formulation-verification.md) | formulation-agent | r2 | complete K/partial BC·static 회귀 갱신; NR controls와 함께 적용 |
| [formulation-stabilization.md](formulation-stabilization.md) | formulation-agent | r2 | trace 평균 scale·positivity·covariance·nonlinear lifecycle·반례 exact target |
| [numerical-review.md](numerical-review.md) | numerical-review-agent | r2 | 독립 수학·controls·logical reference readiness gate pass |
| [numerical-review-evidence.md](numerical-review-evidence.md) | numerical-review-agent | r2 | r1 실패 보존 및 r2 독립 반례 해소·정적 audit |
| [numerical-review-controls.md](numerical-review-controls.md) | numerical-review-agent | r2 | 내부 metric/zero/conditioning·FEAST parameter/budget/seed·정적 회귀 기준 고정 |
| [numerical-review-cases.md](numerical-review-cases.md) | numerical-review-agent | r2 | 27개 requirement와 27개 필수 logical case mapping |
| [reference-model.md](reference-model.md) | numerical-review-agent | r2 | 10개 Value·singleton family·공통 policy logical readiness; 실제 비교 미실행 |
| [io.md](io.md) | io-definition-agent | r2 | 입력·별도 eigen lifecycle·additive schema·projection gate pass |
| [io-input.md](io-input.md) | io-definition-agent | r2 | density/frequency exact subset·source N·warning/진단 및 공식 syntax 근거 |
| [io-schema.md](io-schema.md) | io-definition-agent | r2 | 기존 static 보존·eigen discriminant·N vectors/all-c evidence·self-check |
| [io-mapping.md](io-mapping.md) | io-definition-agent | r2 | 책임·candidate 보존·TXT Value-only·27개 요구/11개 I/O 검증 obligation |
| [implementation-plan.md](implementation-plan.md) | implementation-planning-agent | r2 | Prep 1/main 8개 step 및 실행 계획 gate pass |
| [implementation-environment.md](implementation-environment.md) | implementation-planning-agent | r2 | E10 local 복구·E11 invocation 및 canonical7500/trusted 확인; attempt5 수동 명령 미준수와 registered 실제 결과는 coordination |
| [implementation-recovery.md](implementation-recovery.md) | implementation-planning-agent | r2 | R11 완료·R13 attempt5 WIP 보존/별도 status-only/control 계획 감사 완료; 실제 R13 미실행 |
| [implementation-interfaces.md](implementation-interfaces.md) | implementation-planning-agent | r2 | 기존 확장점·API/source-test·vendor/state/transaction 책임 |
| [implementation-verification.md](implementation-verification.md) | implementation-planning-agent | r2 | 요구27/NR27/I/O11·신규 test40·독립 oracle·fresh evidence·실제 validator |
| [implementation-prep-evidence.md](implementation-prep-evidence.md) | implementation-agent | r2 | attempt5 수동 과거 VS 명령 실패·manual full 미충족; actual focused3회/registered362·Stop0 및 owner 표기 차이는 coordination 참조 |
| [msvc-build-access-error.md](msvc-build-access-error.md) | Root (사용자 요청 설명문서) | r2 | 접근 오류·E10 local 복구·canonical exact1 commit 및 공식 API7500/trusted 실제 근거; native 검증은 별도 |
| [corrections.md](corrections.md) | correction-agent | r2 | source echo 최소 교정1회·RED/GREEN37 확인; full Python Hook1실패와 manual build 환경 차단 보존, registered Stop362 pass는 coordination 후속 evidence |
| [phases/index.json](../../phases/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | 기존5개 보존; prep blocked/main pending |
| [prep index](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | actual attempt5 blocked/history5; 이전 history4 보존·수동 명령 정합 owner 반환 |
| [prep step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md) | implementation-planning-agent | r2 | 현재 local preset·직렬 clean-first·세 discovery·전체 검증/종료 poll 직접 명시; 기존 RED/GREEN 보존 |
| [main index](../../phases/mitc4-shell-feast-eigen/index.json) | implementation-planning-agent(정의), Executor(진행) | r2 | Step0~7 pending; exact owned paths 검증 |
| [main step0](../../phases/mitc4-shell-feast-eigen/step0.md) | implementation-planning-agent | r2 | Frequency model/parser |
| [main step1](../../phases/mitc4-shell-feast-eigen/step1.md) | implementation-planning-agent | r2 | 공변 stabilization/static 회귀 |
| [main step2](../../phases/mitc4-shell-feast-eigen/step2.md) | implementation-planning-agent | r2 | Consistent/lumped/assembly |
| [main step3](../../phases/mitc4-shell-feast-eigen/step3.md) | implementation-planning-agent | r2 | Actual BC/null/whitening |
| [main step4](../../phases/mitc4-shell-feast-eigen/step4.md) | implementation-planning-agent | r2 | FEAST call/search |
| [main step5](../../phases/mitc4-shell-feast-eigen/step5.md) | implementation-planning-agent | r2 | All-c validation/frequency procedure |
| [main step6](../../phases/mitc4-shell-feast-eigen/step6.md) | implementation-planning-agent | r2 | HDF5/CLI transaction |
| [main step7](../../phases/mitc4-shell-feast-eigen/step7.md) | implementation-planning-agent | r2 | Comparator/fresh eigen/static/구현 evidence |
아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다.
이 폴더는 이전 MFE 요구·유도·반례의 이력이다. 현재 구현은 [eigen2](../mitc4-shell-feast-eigen2/README.md)가
소유한다. 이전 controls/schema/reference portfolio의 자동 승계와 prep/Hook 복원을 금지한다.
이전 MFE ID와 새 MFE2 ID의 대응·채택/비채택 범위를 확인한다.
+29 -37
View File
@@ -1,24 +1,16 @@
# MITC4 Shell Mass Matrix와 FEAST 고유치해석 PRD
# 이전 MITC4 질량·FEAST 요구 baseline
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Input contract revision: `r2`
- 검토 상태: r2 requirements부터 implementation-planning까지 6개 gate pass; execution-prep attempt1은 지정 Hook 설정 쓰기 거부로 blocked-environment. 부분 runtime/test 변경과 미검증 test 수정을 보존하며 solver 구현·실제 reference 비교는 미실행이다.
- Feature ID: `mitc4-shell-feast-eigen`; 이전 input contract revision: `r2`.
- 현재 용도: MFE 요구사항·승인·유도·반례의 이력. 새 구현 상태는 [eigen2 PRD](../mitc4-shell-feast-eigen2/PRD.md)가 소유한다.
- 진입점과 이전 실행 실패: [README](README.md), [개발 교훈](development-notes.md).
- 승인 이력: [ADR](ADR.md); 요구 ID·근거: [requirements](requirements.md).
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md).
지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다.
## 사용자 요구와 승계 경계
## 사용자 요구
1. MITC4 Shell 요소의 Mass Matrix를 구현한다.
2. 고유치해석 procedure를 구현하며 고유치 계산 backend는 Intel MKL FEAST로 한다.
3. `reference/shellNL-eigen-meshfine`에 있는 모델과 결과를 검증 기준으로 사용한다.
4. 외부 reference 검증은 고유치만 비교한다.
5. Coordinator 주도 requirements부터 release-readiness까지 9개 stage를 수행하며 중요한 사안만 인터뷰·검토를 요청한다.
6. Consistent mass를 먼저 계산하고 이를 이용하여 lumped mass를 계산하며, 고유치해석에는 lumped mass를 사용한다.
7. `FESA_GTEST_SOURCE_DIR=C:\git\googletest`를 사용하고 작업 중 완료된 변경을 Git에 커밋한다.
8. 고유치 개수는 `.inp`의 `*FREQUENCY` data를 사용한다. 지정 모델의 요청은 `10`개이다.
9. 기존 drilling stabilization을 좌표 공변적으로 개선하고 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함한다.
Consistent mass로부터 lumped mass를 유도하고 실제 FEAST·입력 N·Value-only 원본 비교를
구현하며 공변 drilling 개선과 영향받는 정적/eigen 재검증을 요구했던 baseline이다.
과거9-stage·Hook prep는 현재 실행 절차가 아니다. 수학 근거의 채택/비채택과 MFE→MFE2
대응은 새 baseline에서 명시하며 이전 pass·controls·test 수를 자동 승계하지 않는다.
## 범위와 acceptance
@@ -26,32 +18,32 @@
구체적인 질량 정식화, 해석 기준 상태, 모드 요청 의미, 출력량 및 지원 subset은 Requirement Agent가 evidence를 조사하고 후속 owner와 critical decision 절차로 고정한다.
외부 mode-shape 비교, reference 생성·수정·복원과 외부 배포는 요청된 범위에 포함되지 않는다.
MSVC x64 Debug CMake/CTest, TDD, common tolerance, failure preservation과 독립 physics 검토를 적용한다.
Requirement ID별 원본 계약과 검증 matrix는 [requirements.md](requirements.md#requirement-verification-matrix)가 소유한다.
Requirement ID별 원본 계약과 검증 matrix는 [requirements.md](requirements.md#requirements--requirement-verification-matrix)가 소유한다.
| Requirement IDs (`FEM-REQ-MITC4-EIGEN-`) | Acceptance 요약 및 원본 계약 |
| --- | --- |
| `001`~`004` | [원형상 procedure, 기존 shell mapping, material density와 section 연결](requirements.md#requirement-verification-matrix) |
| `005`~`008` | [질량 이산화 선택, 물리 관성, 조립, massless 좌표 admissibility](requirements.md#requirement-verification-matrix) |
| `009`~`014` | [낮은 모드, multiplicity, FEAST, 실패 처리, 내부 eigenpair 및 physics evidence](requirements.md#requirement-verification-matrix) |
| `015`~`019` | [입력 subset, 진단, HDF5, source/modal identity 및 candidate 보존](requirements.md#requirement-verification-matrix) |
| `020`~`022` | [고유치-only 외부 비교, identity 사전검사 및 common tolerance](requirements.md#requirement-verification-matrix) |
| `023`~`025` | [TDD·MSVC 검증, 기존 정적 회귀 및 동일 revision의 독립 closure](requirements.md#requirement-verification-matrix) |
| `026` | [Consistent에서 lumped 유도 및 질량·관성 불변식](requirements.md#requirement-verification-matrix) |
| `027` | [좌표 공변적인 numerical stabilization 및 영향받는 static/eigen 검증](requirements.md#requirement-verification-matrix) |
| `001`~`004` | [원형상 procedure, 기존 shell mapping, material density와 section 연결](requirements.md#requirements--requirement-verification-matrix) |
| `005`~`008` | [질량 이산화 선택, 물리 관성, 조립, massless 좌표 admissibility](requirements.md#requirements--requirement-verification-matrix) |
| `009`~`014` | [낮은 모드, multiplicity, FEAST, 실패 처리, 내부 eigenpair 및 physics evidence](requirements.md#requirements--requirement-verification-matrix) |
| `015`~`019` | [입력 subset, 진단, HDF5, source/modal identity 및 candidate 보존](requirements.md#requirements--requirement-verification-matrix) |
| `020`~`022` | [고유치-only 외부 비교, identity 사전검사 및 common tolerance](requirements.md#requirements--requirement-verification-matrix) |
| `023`~`025` | [TDD·MSVC 검증, 기존 정적 회귀 및 동일 revision의 독립 closure](requirements.md#requirements--requirement-verification-matrix) |
| `026` | [Consistent에서 lumped 유도 및 질량·관성 불변식](requirements.md#requirements--requirement-verification-matrix) |
| `027` | [좌표 공변적인 numerical stabilization 및 영향받는 static/eigen 검증](requirements.md#requirements--requirement-verification-matrix) |
Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상세 관찰과 단위 의미는
[requirements evidence](requirements-evidence.md#원본-reference-관찰)에 있다.
[requirements evidence](requirements.md#requirements-evidence--원본-reference-관찰)에 있다.
두 질량 계산의 연결에 관한 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)는 사용자 후속 요구로 확정되었다.
실제 FEAST mass는 [MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 따라 lumped로 승인되었다. 상세 lumping 수식은 Research/Formulation owner가 정의한다.
Primary-source 근거와 적용 한계는 [research](research.md), 상세 근거는 [research-evidence](research-evidence.md)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다.
구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md), 고정된 내부 수치 기준은 [NR controls](numerical-review-controls.md), 필수 검증은 [27개 cases](numerical-review-cases.md)에 있다.
Primary-source 근거와 적용 한계는 [research](research.md#research), 상세 근거는 [research-evidence](research.md#research-evidence)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다.
구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md#formulation), 고정된 내부 수치 기준은 [NR controls](numerical-review.md#numerical-review-controls), 필수 검증은 [27개 cases](numerical-review.md#numerical-review-cases)에 있다.
[Reference artifact·logical readiness](reference-model.md)와 독립 수학/controls evidence를 함께 확인하여 r2 NR gate를 통과했다.
[I/O 계약](io.md)은 [exact 입력 subset](io-input.md), [additive HDF5와 내부 modal evidence](io-schema.md), [책임·failure·Value projection](io-mapping.md)을 정의했다. Source Step-2와 canonical storage Step-1, 입력 요청 N과 전체 검증 c를 구분하며 기존 static 계약은 보존한다. 구현 계획은 27개 요구와 I/O 검증 obligation을 실제 TDD·full VERIFY·fresh reference 경로에 연결해야 한다.
[실행 계획](implementation-plan.md)은 운영 준비 1개와 main 8개 step으로 구체화했고 [verification mapping](implementation-verification.md)에 요구27/NR27/I/O11 및 필수 test40개를 연결했다. 정확한 owned paths·actual backend·유한 실행시간·fresh solve·등록 Stop 사후 확인은 [환경 계약](implementation-environment.md)과 각 phase step을 따른다. 실제 실행 성공과 독립 physics/release gate는 아직 남아 있다.
r1의 [NR-MFE-001 실패 이력](numerical-review-evidence.md)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계였다.
[I/O 계약](io.md#io)은 [exact 입력 subset](io.md#io-input), [additive HDF5와 내부 modal evidence](io.md#io-schema), [책임·failure·Value projection](io.md#io-mapping)을 정의했다. Source Step-2와 canonical storage Step-1, 입력 요청 N과 전체 검증 c를 구분하며 기존 static 계약은 보존한다. 구현 계획은 27개 요구와 I/O 검증 obligation을 실제 TDD·full VERIFY·fresh reference 경로에 연결해야 한다.
[실행 계획](development-notes.md#실패와-재발-방지)은 운영 준비 1개와 main 8개 step으로 구체화했고 [verification mapping](development-notes.md#실패와-재발-방지)에 요구27/NR27/I/O11 및 필수 test40개를 연결했다. 정확한 owned paths·actual backend·유한 실행시간·fresh solve·등록 Stop 사후 확인은 [환경 계약](development-notes.md#실패와-재발-방지)과 각 phase step을 따른다. 실제 실행 성공과 독립 physics/release gate는 아직 남아 있다.
r1의 [NR-MFE-001 실패 이력](numerical-review.md#numerical-review-evidence)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계였다.
Requirement owner는 알려진 partial-BC 반례를 단순 clarification으로 제외할 수 없다고 판단했다.
[MFE-OQ-003 대안·영향](requirements-evidence.md#nr-mfe-001-requirements-intent-검토) 중 좌표 공변적인 stabilization 개선과 영향받는 정적/eigen 재검증 범위 추가가 사용자에게 승인되었다. 단순 한계 수용 및 acceptance 축소안은 선택되지 않았다.
[MFE-OQ-003 대안·영향](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토) 중 좌표 공변적인 stabilization 개선과 영향받는 정적/eigen 재검증 범위 추가가 사용자에게 승인되었다. 단순 한계 수용 및 acceptance 축소안은 선택되지 않았다.
사용자가 확정한 질량 계산 흐름·FEAST 사용 mass·입력 N·외부 Value-only 범위는 유지한다. 개선 수식과 실제 구현·검증은 해당 owner의 후속 gate를 거쳐야 한다.
기존 fixed scale의 [대체 경계](requirements.md#r2의-기존-계약-대체-범위)와 [필수 static 회귀 포트폴리오](requirements-evidence.md#r2-승인-범위와-정적-재검증)는 Requirement owner r2에 명시되어 있다. 과거 정적 reference의 U/UR 및 reaction 검토 정책은 해당 기존 계약으로 재검증하고 새 eigen 비교량은 Value로 유지한다.
[r2 research delta](research-evidence.md#r07--r2-stabilization-근거와-영향)는 기저 불변 scale 후보, 초기 고정 nonlinear lifecycle 및 linear massless 처리의 조건을 구분한다. 최종 수식 채택과 반례 해소 판정은 후속 owner 소유이다.
[r2 stabilization 정식화](formulation-stabilization.md)는 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 채택하고 양성 inventory·complete K의 공변성·nonlinear 고정 lifecycle 및 반례의 고유치/정적 exact target을 정의한다. NR는 반례를 독립 직접 적분으로 재검산해 r2 수학 계약의 해소를 확인했다. 실제 C++/FEAST 구현 및 fresh reference 재검증은 후속 필수 gate다.
기존 fixed scale의 [대체 경계](requirements.md#requirements--r2의-기존-계약-대체-범위)와 [필수 static 회귀 포트폴리오](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)는 Requirement owner r2에 명시되어 있다. 과거 정적 reference의 U/UR 및 reaction 검토 정책은 해당 기존 계약으로 재검증하고 새 eigen 비교량은 Value로 유지한다.
[r2 research delta](research.md#research-evidence--r07--r2-stabilization-근거와-영향)는 기저 불변 scale 후보, 초기 고정 nonlinear lifecycle 및 linear massless 처리의 조건을 구분한다. 최종 수식 채택과 반례 해소 판정은 후속 owner 소유이다.
[r2 stabilization 정식화](formulation.md#formulation-stabilization)는 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 채택하고 양성 inventory·complete K의 공변성·nonlinear 고정 lifecycle 및 반례의 고유치/정적 exact target을 정의한다. NR는 반례를 독립 직접 적분으로 재검산해 r2 수학 계약의 해소를 확인했다. 실제 C++/FEAST 구현 및 fresh reference 재검증은 후속 필수 gate다.
+9
View File
@@ -0,0 +1,9 @@
# 이전 MITC4 질량·FEAST baseline
현재 기능은 [mitc4-shell-feast-eigen2](../mitc4-shell-feast-eigen2/README.md)를 따른다.
이 폴더는 이전 요구·결정과 채택된 유도 근거를 보존하며 미완료 prep를 재개하는 계획이 아니다.
- [PRD](PRD.md), [ADR](ADR.md), [요구사항](requirements.md#requirements): 기존 ID와 승인 이력.
- [정식화](formulation.md#formulation), [수치 검산](numerical-review.md#numerical-review), [연구](research.md#research): 채택·비채택을 구분할 근거.
- [이전 I/O](io.md#io), [이전 reference 계약](reference-model.md): 당시 의미; 현재 schema/portfolio 아님.
- [환경 실패·교훈·Handoff](development-notes.md): 재발 방지와 실제 실패/미실행의 구분.
@@ -1,515 +0,0 @@
# MITC4 Shell Mass Matrix와 FEAST 고유치해석 coordination
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Contract revision: `r2` (사용자 승인 stabilization 개선·영향받는 정적/eigen 재검증 범위)
- Stage: `implementation` (E11 attempt5 보존 및 정합된 Step 재개)
- Outcome: `retry`
- Next owner: `implementation-agent` (R13 WIP 보존·별도 Planning status-only/control checkpoint·clean 확인 후 정상 E11)
- Attempt: `5` (actual Step0 blocked/history5; 이전 history4 보존)
- Completion: 미완료
- Failure classification: `environment`
- Retry key: `mitc4-shell-feast-eigen|implementation|environment|r2`
- Escalation class: `null`
- Blocker: `null` (실패 보존·status-only/control checkpoint는 실행 전 필수이고 manual full VERIFY는 여전히 미충족이다.)
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md).
문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 범위는 [PRD.md](PRD.md), 결정은 [ADR.md](ADR.md)를 따른다.
## Gate evidence
| Gate | Evidence | Coordinator 판정 |
| --- | --- | --- |
| intake | 사용자 요청, 공통 운영 계약 및 관리문서 4개 생성 | pass |
| requirements r0 초안 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md) | needs-user-decision; 질량 선택 미승인으로 baseline pass 보류 |
| requirements r1 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md), MFE-ADR-002/004 사용자 명시 결정 | pass; 26개 must와 owner/revision/hash 검증, 미결정 0 |
| research r1 | [research](research.md), [primary-source 상세 근거](research-evidence.md) | pass; primary source 11개 그룹·프로젝트 근거2개, 26개 requirement coverage 및 API 보장 한계 확인 |
| formulation r1 | [기본 수학 계약](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md) | pass; owner/revision/상세 수식·26개 coverage·정적 evidence 확인, 독립 수치판정은 NR 소유 |
| numerical-review r1 | [NR verdict](numerical-review.md), [반례·독립 evidence](numerical-review-evidence.md), [reference-model](reference-model.md) | return-upstream; NR-MFE-001, 전체 internal controls 미확정, gate 미통과 |
| requirements r1 intent 재검토 | [Requirement 판단](requirements.md), [MFE-OQ-003 대안·영향](requirements-evidence.md#nr-mfe-001-requirements-intent-검토) | needs-user-decision; 원래 26개 matrix 행 유지, 단순 clarification으로 반례 제외 불가 |
| requirements r2 | [27개 must](requirements.md), [승인 delta·회귀 범위](requirements-evidence.md#r2-승인-범위와-정적-재검증), MFE-ADR-007 | pass; 사용자 승인 반영, owner/revision/27개 ID/43 local links 및 미결정 0 확인 |
| research r2 | [research](research.md), [R07 delta](research-evidence.md#r07--r2-stabilization-근거와-영향) | pass; 27개 coverage/32 local links, 추가 primary S12/S13 및 r1 질량·FEAST·reference 근거 보존 확인 |
| formulation r2 | [main](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md), [stabilization](formulation-stabilization.md) | pass; 5개 문서/27개 coverage/57개 상대 경로 및 단일 scale·수학 적용 경계 확인; 독립 판정은 NR 소유 |
| numerical-review r2 | [verdict](numerical-review.md), [독립 evidence](numerical-review-evidence.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [reference-model](reference-model.md) | pass; NR-MFE-001 수학적 해소, 내부 수치 기준/27개 case/27개 requirement 및 logical reference readiness 모두 확인 |
| io-definition r2 | [main](io.md), [input](io-input.md), [schema](io-schema.md), [mapping](io-mapping.md) | pass; 4개 owner/r2 문서·27개 requirement·66개 상대 링크 및 원본 grammar/identity·additive schema·failure 보존 확인 |
| implementation-planning r2 | [main](implementation-plan.md), [environment](implementation-environment.md), [interfaces](implementation-interfaces.md), [verification](implementation-verification.md), [prep](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json), [main phase](../../phases/mitc4-shell-feast-eigen/index.json) | pass; 실제 read-only StepExecutor validator·16산출물·1+8 steps·owned128회/고유110·요구27/NR27/I/O11·신규test40·links575/anchor0 확인 |
| implementation r2 prep attempt 1 | [작성 시점 보고서](implementation-prep-evidence.md), [실제 terminal 상태](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json), [원시 Codex 결과](../../phases/mitc4-shell-feast-eigen-execution-prep/step0-output.json) | blocked-environment; Hook 설정 미변경, 마지막 test 수정 미검증, 수동 full VERIFY 및 solver 구현/reference 미실행 |
| correction r2 attempt 1 | [owner 보고서](corrections.md), [실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-result.json), [검증 inventory](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json) | blocked-environment; source echo RED 21 fail/16 pass 후 GREEN 37 pass. Full Python 152 pass/Hook assertion1 fail, manual build 접근 거부/CTest 미실행. 별도 registered Stop/CTest는 실제 exit0·362 pass. 전체 prep gate는 미통과 |
| implementation-planning r2 recovery delta | [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건), [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp), [main](implementation-plan.md) | pass; owner 3문서/hash/67 links/기존 AST 보존 확인, Python code AST3·PowerShell9 blocks/errors0. Actual source checkpoint·status reset·DFA·추가 검증은 미실행이며 environment block 유지 |
공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다.
확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다.
Root의 intake 시작 Git 조사에서는 worktree clean을 확인했다. 당시 구현·build/test·외부 reference comparison은 미실행이었다. 이후 실제 실행 결과는 아래 prep attempt 기록으로 구분한다.
관리문서 상대 링크 검사 결과는 `4`문서, 끊긴 local link `0`, exit code `0`이며 `git diff --check`도 exit code `0`이다.
## 현재 bounded dispatch
Planning의 정확11개 반환을 수용했다. Prep/main9개 Step의 active CMake/CTest 명령68개를 local preset으로 직접 정합했고, 세 실제 discovery 파일과 긴 tool session의 종료 poll을 본문에 명시했다. Owner 정적 감사는 regex16·pytest 대상·owned_path128회 보존, local links500 누락0, PowerShell32 오류0/Python AST11, 보호12hash·canonical/history5/이전 Recovery 이력 불변 및 diff-check exit0이다. Coordinator는 실제 Step 명령과 [R13 보존·재개 blocks](implementation-recovery.md#r13-attempt5-명령-정합과-실패-보존)의 current hashes/정확 경로/unchanged Executor/분리 commit·상태 보존을 대조했다. 정확13개 관리/Planning/Step checkpoint 뒤 R13 첫 block(report1/controls2 WIP), 별도 할당된 Planning의 status1값 복구, R13 두 번째 control checkpoint, clean 확인과 E11 기본 workspace-write 한 번을 순서대로 실행한다. 실제 WIP/복구/native 결과는 아직 미실행이며 이후 원시 evidence로 감사한다. Source Correction budget과 r2 수치·schema·tolerance는 바뀌지 않았다.
E11 attempt5는 native exit2/`2325.465`초, raw Codex exit0/transportFailure=null, Step blocked/history5로 종료됐다. [terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/terminal-archive.json), [실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/e11-result.json), [Coordinator 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/coordinator-terminal-audit.json), [수동 command events](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/manual-command-events-observation.json)를 보존했다. 직전 R11 control1 commit은 `c051adc9c3feb4ff85758eeaf06ae08be277b097`이며 terminal HEAD도 같다. Report1/control2만 변경됐고 다른 tracked bytes와 이전 history4는 그대로다.
Owner는 E11 대체 명령 대신 `cmake -S . -B .harness/build -A x64`(exit0), `cmake --build .harness/build --config Debug`(exit1 FileTracker)를 실행했다. 이는 현재 local Ninja backend의 실패 증거가 아니다. Actual classifier37/deadline4는 exit0이며 focused136은 raw completed events에서 세 실행 모두 exit0으로 확인됐다. 보고서의 summary 미관찰·attempt2 표기는 실제 attempt5/raw 결과와 구분한다. Manual CTest와 full pytest는 미실행이다. 이후 실제 local preset registered CTest는362 pass/0 fail/End testing과 exit0, Stop Python2개/wrapper도 actual exit0으로 종료됐다. Wrapper 수명 약1954초는 이전1800초를 넘었다. [Root observer](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-process-observations-resumed.jsonl)의 중단 구간 build exit는 미관찰이고 PID 재사용/command-null row는 판정에서 제외한다. 기존 Executor argv의 `--dangerously-bypass-hook-trust`는 변경하지 않았으며 [적용 Hook10개 상태](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-all-hook-trust-observation.json)는 모두 enabled/trusted였다.
다음 bounded Planning은 prep Step0와 main8 Step의 active 명령을 실제 `mfe-workspace-msvc-ninja-debug`로 직접 정합하고 session 결과는 poll로 수집하도록 명시한다. 기존 exact owned_paths/TDD 대상/전체 검증/physics·schema·tolerance를 유지한다. 새 source Correction이나 사용자 승인 요청 없이 실제 실패 report/control 보존 → 별도 owner status-only → unchanged Executor checkpoint → 정상 E11 재개를 구체화한다. 현재는 status를 바꾸거나 새 native를 시작하지 않는다. 아래 기존 승인/재개 문단은 attempt5 이전 이력이며 현재 결과는 이 문단과 terminal evidence가 우선한다.
Root는 승인된 canonical Stop `1800 -> 7500` 한 값만 적용하고 exact1 commit `42a4847da54b525ab62a746bee06525ad28aab4b`로 보존했다. [공식 API 신뢰 검토 결과](../../.harness/build/mitc4-eigen-evidence/prep/hook-timeout-activation/trust-review-official-api.json)는 native exit0, exact Stop `trusted_hash` 한 필드의 변경 및 `hooks/list`의 canonical source/timeout7500/enabled=true/trustStatus=trusted를 확인한다. File SHA-256은 `c8065e7b60882da5db3f90d57b265da25b3c25980bf669d0b1da863e621871ca`, definition hash는 `sha256:a6bfcf3553d81e134065da4e66e8124e245d302c11e90b09ecdf07ff79b034a8`이다. MFE-OQ-004 승인·설정 확인 조건은 해소됐으며 이 설정 조회는 registered Hook 실행/통과 증거가 아니다.
Planning의 별도 status-only 반환을 audit했다. Step0 `error -> pending`만 변경했고 history4/나머지 JSON·bytes/보호11hash·HEAD를 보존했다. Index SHA-256은 `389fa3d16015187903a7b194bd68f59629a63ee897738fd1233dd2ff2f8bc047`, owner 정적 검사와 diff-check exit0이다. Coordinator는 이 bounded 반환을 수용한다. 다음 순서는 관리문서 checkpoint 뒤 [R11](implementation-recovery.md#r11-r10-뒤의-별도-status-only-복구)의 unchanged Executor `_commit_paths`로 control1만 실제 commit하고 clean/protected-byte 조건을 확인한 다음, [E11](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation) 첫 block의 기본 `workspace-write` prep1회 실행이다. Actual R11/E11 결과는 별도 ignored evidence에 보존하며 성공을 미리 기록하지 않는다. Source Correction budget은 그대로이고 실패 history를 지우거나 강한 sandbox/remote 권한을 추가하지 않는다. Active Executor 동안 Root/Coordinator/Planning의 비소유 tracked 편집과 Git은 동결한다. Prep gate가 실제 통과한 뒤 같은 E11의 승인된 main8 steps 및 stages8~9를 계속한다.
최신 사용자 원문은 **“작업을 계속 해주세요”**다. Root는 앞선 구체적 MFE-OQ-004 질문과 직전 공유 Hook 승인 대기 안내에 대한 이 응답을, 제시한 canonical Stop `1800 -> 7500` 한 값과 변경 정의의 정상 신뢰 검토 진행 승인으로 해석했다. Coordinator는 이 사용자 응답과 문맥·Root 판단을 승인 근거로 기록하며 같은 질문을 반복하지 않는다. 이전 E6의 한 번 승인된 workspace 실행은 이미 소비됐고 이번 승인은 새 DFA/remote/publish 권한으로 확대하지 않는다. 앞서 들어온 configure 실패 Hook prompt 자체는 승인 근거가 아니었다. 세부 대상·공유 영향은 Root 소유 [MSVC 접근 오류와 설정 경계](msvc-build-access-error.md)를 따른다.
현재 Root는 canonical 파일의 현재 hash와 공식 신뢰 처리 방법을 확인하고 승인된 한 값의 정상 변경을 소유한다. Planning은 실제 E10 local hashes/선행 `.gitignore` commit을 반영한 [R11](implementation-recovery.md#r11-r10-뒤의-별도-status-only-복구)과 [E11 정상 invocation](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)을 반환했다. Coordinator는 exact ignore commit/현재 local hashes·unchanged Executor guards·workspace-write/terra/xhigh/finite14400 및 local preset preflight를 대조하고 이 문서 delta를 pass로 수용했다. Owner 정적 감사는 PowerShell26 오류0/Python AST9/links114 누락0/보호12hash·Executor AST·HEAD/error-history4 불변·diff-check exit0이다. E11의 prep gate 뒤 main 시작 순서도 owner가 한 문구 정정했다. Source/Hook/config/phase 변경은 이 Planning에 없었다. Actual `7500`/enabled/trusted 확인과 동결 문서 checkpoint 전 status reset/native는 실행하지 않는다. Source Correction budget과 error/history4는 유지한다.
이 결정과 독립적으로 Planning은 소유 세 문서의 [E10 정상 local setup](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)과 [R12 stale hash 경계](implementation-recovery.md#r12-user-preset-setup-이후의-stale-hash-경계)를 반환했다. Coordinator는 owner/revision/명령·수명·소유를 대조하고 이 문서 delta를 pass로 수용했다. Owner 정적 감사는 PowerShell25 오류0/Python AST9/local links110 누락0/보호11hash·HEAD·error-history4 불변 및 actual adapter4 명령·7200 cap 대조 exit0이다. 기존 preset-contract test가 tracked public/example만 검사한다는 read-only 대조도 완료했으며 test 실행 증거로 취급하지 않는다.
완료된 Root bounded assignment는 **E10.1 첫 PowerShell block 그대로의 local setup/configure-only**였다. 선행 exact5 문서 commit `72f566cf44b006ca323bc747aff63dc0fffaf2bc`/clean과 활성 build/test 부재를 확인하고 원본 bytes/hash를 backup했다. Root 소유 tracked 변경은 `.gitignore`의 `/CMakeUserPresets.json` 한 줄이며 ignored UserPresets/local config·새 짧은 TEMP·Ninja cache만 준비했다. Public preset/source/test/Hook/trust/reference/phase/기존 VS cache와 parent 환경 복원 경계를 유지했다. Build/test/Hook/nativephase 실행은 이 assignment에 포함하지 않았고 실행 동안 Coordinator/Planning은 tracked 편집/Git을 동결했다.
| E10 실제 evidence | 결과와 한계 |
| --- | --- |
| [최초 exact setup](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/result.json) | exit1, `4.672`초. Preset/config·ignore1줄 생성 뒤 compiler 경로의 `Hostx64`/`HostX64` 차이를 CMake가 변경으로 인식해 cache를 재초기화했고 dependency cache를 잃어 configure가 실패했다. 원시 warning/실패와 보호8·canonical·HEAD 불변을 보존했다. |
| [별도 bounded configure 후속](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configure-followup/result.json) | compiler cache와 preset 문자열 동일성을 먼저 확인하고 기존 설정을 그대로 사용하는 새 env4-unset process에서 동일 local preset configure1회만 할당했다. Exit0, `1.656`초, stderr0·보호11·HEAD 불변이다. 전체 setup/삭제/rollback/build/CTest는 반복하지 않았다. |
| [설정/adapter 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configuration-observation.json) | dependency4 복원, Ninja/Debug/MSVC19.51·pointer8, 기존 Debug archive 경로, adapter configure/build/discovery/test4 명령의 `mfe-workspace-msvc-ninja-debug` 선택을 확인했다. Adapter plan 실행은 미실행이고 실제 solver library SHA `679db6...04d4`도 그대로다. |
| Root exact ignore commit | `3cfbefb000dfbe8afc7a743213146ab7253cbbc0`; `/CMakeUserPresets.json` 한 줄, commit 뒤 clean. Canonical Hook/trust/phase/history4 변경0이며 prep 통과 또는 새 attempt를 뜻하지 않는다. |
실제 local UserPreset SHA-256은 `c4665b004be903c4beb913967143c0b0ac4da7e7d857a8c2f09e48754e865e9c`, config는 `47ea5f1da7f6c0312429ead5a3d6d1c71fa884c49e511c1608e7fcccd90d796d`, Ninja cache는 `4c2ad564d2f84deb1b8f5e055941ff18f8ba1826b4cd7f197f0bdfbdafe074b5`다. 설정의 짧은 TEMP는70자이고 dependency4를 parent env에 두지 않은 실제 configure가 성공했다. R12대로 이후 Planning이 R11의 stale hashes와 선행 `.gitignore` commit 허용 경로를 갱신하기 전 기존 checkpoint 명령을 실행하지 않는다. 이 정상 로컬 복구는 MFE-OQ-004의 공유 Hook 변경·재신뢰 승인이나 실제 native 전체 검증을 대신하지 않는다.
Root의 [별도 outer Stop 실패 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)은 실제 `cmake --preset windows-msvc-ninja-debug` configure exit1과 parent dependency4 unset을 기록했다. Preset의 env cache 치환으로 새 Ninja cache의 dependency4가 모두 빈 값이 됐으며 [당시 cache](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/CMakeCache.txt) SHA-256은 `125a4dbd163c5a0a6d94bd03d3186790c41e6a0d8e0ed7b9c72f18fdf619d66e`다. 이는 phase attempt5가 아니며 history4와 미승인 상태를 유지한다. 이전 R11 cache hash는 stale이므로 정상 local setup의 실제 결과 전 재사용하지 않는다. `CMakeUserPresets.json`은 현재 없고 ignore되지 않았다는 Root 관찰도 계획 입력이다. 최소 MSVC 환경과 짧은 workspace TEMP의 지속 적용을 구성하되 pytest basetemp의 새 경로, test 자체의 고유 하위 경로와 기존 evidence 보존을 유지한다.
| 결정 가능한 경로 | 영향 |
| --- | --- |
| 권고: 실제 canonical `.codex/hooks.json`의 Stop timeout `1800 -> 7500` 한 값과 변경된 Hook의 정상 재신뢰를 명시 승인 | 현재 resolver가 이 파일을 공유하는 다른 worktree에도 outer timeout이 적용된다. 나머지 Hook 내용·full validation·sandbox/재시도/소유 guard는 유지하고, 정상 workspace-write E9 준비 및 실제 재검증을 이어갈 수 있다. |
| 현재 공유 설정 유지 | 현재1800초 경계를 그대로 유지한다. 실제 required 전체 검증의 wrapper 성공을 보장할 정상 대안이 아직 없어 environment block을 유지하고 실행을 시작하지 않는다. |
승인된 검토 대상은 `C:/git/FESADev/.codex/hooks.json`이며 승인 요청 때 SHA-256은 `0ab23dad4643f45238f4a60402083e32d8801f5c41fd6ba12b68ef6a9fc5fc28`이었다. Root는 현재 파일을 재확인한 뒤 한 값만 적용한다. 이는 current feature owned_paths 밖의 공유 설정·신뢰 경계 결정이고 일반 계획/검증의 반복 승인이 아니다. 승인 사실만으로 실제 변경·신뢰 완료·검증 성공을 주장하지 않으며 새 native/DFA나 phase status를 자동 변경하지 않는다. Feature physics/schema/reference/tolerance와 contract `r2`는 그대로다.
### R10 실제 보존과 다음 실행 준비
Root exact5 문서 commit `87ffa4f4e5556d002f4f5e8e68bb879fff93c38d` 뒤 [R10 actual unchanged Executor](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/r10-wip-checkpoint-result.json)는 native/managed exit0, `1.641`초로 완료했다. Report1 WIP commit은 `fc032212f75b9008f0a46e0f2d9f3736f184b05f`, controls2 error/history4 보존 commit은 `aa03fc3d049b82f519db1962b5da592524a1c496`이다. 명령 내부 exact commit 경로·모든 tracked bytes·raw·history4 불변과 clean preflight를 확인했으며 status reset이나 prep 성공을 기록하지 않았다.
다음은 위 중요 결정 수신과 정확한 정상 설정 적용 evidence가 확보된 뒤에만 R11 status-only/Executor control checkpoint/E9 native 순서로 별도 할당한다. 아래 Planning 문서 판정은 이 조건부 준비를 의미한다.
E8.2 native는 자연 종료했다. Planning은 소유 세 문서의 [R10 실패 보존](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)과 [E9 조건부 직렬 환경](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)을 반환했다. R10은 기존 unchanged guarded Executor의 report1/control2 WIP 보존을 current exact hash/history4로 고정하고 Root [MSVC 접근 오류 설명](msvc-build-access-error.md)의 exact1 선행 문서 commit을 허용 경로에 포함한다. E9는 `CMAKE_BUILD_PARALLEL_LEVEL=1`의 parent/manual/registered 공통 적용과 한 번의 정상 clean-first/verbose build에서 실제 세 discovery 및 등록 identity 검증을 정의한다. Installed module, source/test, discovery guard, timeout 또는 sandbox 정책은 수정하지 않는다. Planning 정적 감사는 PowerShell24 오류0/Python AST9/local links101 누락0/보호11hash·Executor AST·HEAD/error-history4 보존과 diff-check exit0이며, Coordinator는 R10 명령·소유·현재 hash와 조건부 activation 경계를 대조해 문서 delta를 pass로 수용했다. 이는 prep gate 통과가 아니다. 계획된 R10의 실제 완료는 위에 기록했으며 status-only recovery/추가 native는 아직 할당하지 않는다.
Root의 [현재 Hook 설정 해석](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json)은 설치 CLI0.153.2의 config-only `hooks/list`에서 현재 worktree cwd의 enabled/trusted Stop source를 canonical checkout `.codex/hooks.json`, `timeoutSec=1800`으로 확인했다(exit0). Linked 파일7500과 달라 실제 wrapper 수명 약1802.6초를 설명하는 근거이며, 과거 native raw에 설정 로드 경로 event가 없다는 한계는 유지한다. Inline Hook 추가는 additive라 기존1800을 대체한다고 가정하지 않는다. Root는 정상 per-invocation/worktree 설정 지원 여부만 마지막 bounded read-only로 확인하며 canonical/Hook/trust 파일을 변경하지 않는다. 이 확인은 실패 WIP 보존과 독립적으로 진행한다. 현재 추가 native, status reset, main8steps 또는 downstream gate 전이는 없다.
Root의 [최종 bounded 설정 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-source-audit.json)는 공식 지원 `project_root_markers`를 이용한 strict-config 목록조회도 같은 canonical1800을 선택함을 확인했다(server exit0). 조사한 문서/schema에서는 기존 sourcePath/timeout을 대체하는 정상 per-invocation 방법을 찾지 못했다. 두 Hook 파일은 Stop timeout 외 의미가 같지만 canonical 파일은 현재 exact ownership 밖이다. Root의 권한 해석에 따라 공유 설정 변경·재신뢰는 위 MFE-OQ-004로 요청하며 임의 변경·새 DFA 실행·Hook 생략을 하지 않는다. 독립적인 실패 보존 R10은 완료했다.
### E8.2 이전 dispatch와 activation 경계
Root exact5문서 commit `7d714c2713bf945f07fc78f85e49ec27e3184134` 뒤 [E8.1 실제 setup](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/result.json)은 native exit `0`, `7.446`초로 완료했다. Tracked 변경0/HEAD·clean·기존 VS cache 불변이다. [설정 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/configuration-observation.json)은 새 Ninja/Debug/MSVC Hostx64/x64, 승인된 dependency4, 실제 archive 경로와 config=example 동일성을 확인한다. 이는 configure-only이며 library/build/CTest는 아직 미실행이다. 이어 별도 Planning이 status 한 값만 `blocked`→`pending`으로 바꾸고 나머지 bytes/JSON/history3·보호10hash 보존을 확인했다(exit `0`, phase SHA-256 `6d0bfcfe89ebaee0f76d27c8917da91085069c92a55e1088dc05bd3053e37e32`). [R9 actual Executor checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r9-status-checkpoint-result.json)는 native/managed exit `0`, `1.531`초이며 commit `9766724a5d363fc9ff8800a99726a63bdba55314`의 exact index1·pending/history3·protected bytes·clean을 검증했다. Top blocked/history3는 보존했다.
현재 actual dispatch는 **E8.2 첫 PowerShell block 그대로의 prep1회**다. Required inputs는 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 원래 prep Step0 및 E8/R9와 attempt3 evidence다. Official implementation-agent profile, 원래 owned9, 기본 workspace-write와 finite14400/Stop7500/shared7200 및 existing terminal/retry/ownership guards를 유지한다. E8.3의 정확한 Ninja preset mapping이 과거 VS 고정 명령을 명시 대체한다. 이미 GREEN인 source를 되돌리지 않고 classifier37/focused/full Python, native MSVC/x64/Debug configure/build/discovery/full CTest, 실제 library 위치/hash/mtime·fresh reference 및 registered same graph를 검증한다. 과거 manual 실패·미실행/automatic pass와 report reference 문구 정정은 Implementation owner가 맡는다. Native error/blocked 또는 guard/contract 실패 시 실제 terminal을 보존하며 두 번째 source Correction이나 무단 transport retry를 하지 않는다. Root/Coordinator는 이번 관리 checkpoint 뒤 active invocation 동안 non-owned 편집/Git을 동결한다. Actual prep pass 전 main/physics/release 전이는 없다.
Root outer Stop/일반 후속 사용 환경에는 이 process-local setup이 지속된다고 가정하지 않는다. 이번 native와 그 registered Stop의 명시 환경은 E8.2로 고정하며, feature closure에서 local 설정 수명과 일반 사용 환경을 별도로 대조한다. 전역 env 또는 Hook state를 변경하지 않는다.
### E8.2 attempt4 실제 terminal 감사
[Actual Executor 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/executor-result.json)는 PowerShell exit `1`, `2833.812`초, 시작/종료 HEAD `23c4ebe526260d584247804d8cbe2f7aa8cc60ac` 및 branch 불변, 비소유 tracked/config/기존 VS cache 변경0을 확인했다. [원시·상태·보고서·CTest archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/terminal-archive.json)에 raw SHA-256 `c74f18d0b681f6ab7480b825de4458188fb6b204147ab84b08582820039cab61`, Step0 `error`/history4, top 및 owner report를 보존했다. Raw Codex exit `0`, `transportFailure=null`이며 explicit error는 transport retry가 아니다. 이 시점 dirty는 report1/control2뿐이다.
[Coordinator terminal audit](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/coordinator-terminal-audit.json)는 exit0으로 이전 history3의 JSON 동일성, source/test/Hook 8개 불변 및 관리문서 local links 191개/누락0을 확인했다.
| 실제 검증 경계 | 판정과 한계 |
| --- | --- |
| 현재 Python regression | classifier37 exit0; focused136은 raw상 3회 모두 exit0, `45.510/45.390/45.635`초. 다음 실행에서 이미 통과한 같은 대상을 근거 없이 반복할 필요는 없다. |
| Manual Ninja full VERIFY | configure0/build1. MSVC x64 compile/link 뒤 integration GoogleTest JSON parse failure. 순차 CTest/full pytest는 미실행이며 후속 diagnostic으로 대체하지 않는다. |
| Registered validation | incremental Ninja build0, 실제 CTest21912 exit0/362 pass. LastTest SHA-256 `4d9c71b7caa4ca58f81ee5670f6a0c5af323a0fe20b6ac0195a0420a7a8784d9`, 616282 bytes. 실제 pwsh23560은 약1802.6초 후 exit1, Python3492/24968은 각각0이므로 registered wrapper 전체 성공으로 보고하지 않는다. |
| Solver feature gate | prep와 별개인 MITC4 mass/FEAST 본 구현·고유치 reference comparison·physics/release는 미실행이다. |
[선택 raw events](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/raw-audit-selected-events.json)와 [실제 process exits](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json)를 대조했다. Parent DevShell 성공 뒤 child tool-shell의 script 실행은 policy로 거부됐지만 상속된 MSVC x64 환경을 확인하고 compile/link를 실행했다. `integration-discovery-rerun.log`는 stdout이 없었던 native cmake exit0을 나중에 쓴 관찰 메모다. 원시 item67은 cmake0 뒤 로그 조회 실패로 shell1, item68은 메모 작성/hash0이며 메모를 원시 stdout으로 취급하지 않는다. 역사상 reference를 "읽지 않았다"는 owner 표현은 full CTest 내부 기존 reference 읽기와 구분해 다음 owner가 정정한다.
[Root의 installed/generated module 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json)은 `TEST_TARGET` 누락으로 세 discovery가 같은 empty-target hash JSON을 REMOVE/run/READ하는 구조를 확인했다. 이는 병렬 경합을 강하게 뒷받침하지만 최초 race를 재현한 실험은 아니다. Owner의 `test`/`harness` 라벨과 반환 attempt2는 그대로 보존하고, Coordinator는 실제 실행 history4와 환경 근거를 기준으로 기존 `environment|r2`에 정규화한다. 새 source Correction 또는 tolerance/계약 revision 변경은 허용하지 않는다.
사용자 요청 설명문서는 Root가 exact1 commit `b81f7cf636e890d7c144a8b1857e58d7d0a5d4c3`으로 추가했다. SHA-256 `0722dff075e706977d55eb1ac2514d4318b1341adab30a51fc82c744315f1c9f`이며 정적 links/whitespace/fences와 staged diff-check는 exit0이다. 이 문서 commit은 Solver/Hook/source gate 통과를 뜻하지 않는다.
### E8 설정 및 계획 감사 이력
Owner의 [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)·[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint) 상세를 owner/r2/현재 hash와 대조해 계획 gate `pass`로 수락했다. 실제 adapter의 preset 명령4/7200 cap·기존 guard, PowerShell18 blocks/errors0, Python AST7, local links91/missing0, 고정 hash7·Executor AST·blocked/history3 보존과 diffcheck가 exit `0`이다. Root는 설치 DevShell의 실제 인수, config.example/preset의 `.harness/build-ninja-msvc-debug`, load_config 필드 및 process 환경 전체 finally 복원을 read-only 확인했다. Native Ninja 성공은 아직 미검증이다.
동결된 management2/Planning3 정확5문서의 Root checkpoint 이후 **E8.1 첫 PowerShell block 그대로**를 Root 환경 지원에 할당한다. Owned 범위는 기존 예시와 같은 ignored `.harness/config.json`, 새 `.harness/build-ninja-msvc-debug` cache 및 새 짧은 ignored TEMP뿐이다. Source/Hook/reference/기존 VS cache/phase/status/Git은 setup에서 변경하지 않는다. Actual configure 및 config-selected graph/exit·전후 tracked bytes/clean 확인이 setup gate다. 이 prepare configure를 native build/full 검증으로 대체하지 않는다. 실패하면 실제 결과와 남은 ignored 설정을 보존하고 재실행하지 않는다. 성공 후 Coordinator가 audit하고 별도 Planning의 R9 status 한 값 복구와 actual Executor checkpoint를 할당한다. E8.2 native invocation은 그 이후 clean 상태에서 별도로 시작한다.
Root exact5문서 commit `c0f3dc7c11eca7959a10ca9f8aecb5343b831d13` 뒤 [R8 실제 보존 실행](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r8-wip-checkpoint-result.json)은 native/managed exit `0`, `2.094`초로 완료했다. Actual unchanged Executor가 report1을 `9601b1f53e8a11d3e08d49cf9528fa6f028108cf`, blocked controls2를 `96efbffa425ff5ce9cd1b7cebe673555273122b9`로 구분 commit했다. [실제 stdout](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/r8-wip-checkpoint-stdout.log)은 exact paths, 전후 bytes/전체 JSON/history3/raw/branch 보존과 clean을 확인한다. `_commit_step` 또는 성공 전환은 없었다.
후속 Planning의 소유는 기존 plan/environment/recovery 3문서다. 이미 확인한 정상 Ninja preset과 표준 archive output 설정의 exact Root local setup, 별도 build directory, Step0/main8·registered Stop의 같은 graph 명령 mapping 및 실제 library 존재/hash/mtime 확인을 구체화한다. Source/기존 VS cache/reference 및 검사 guard를 보존하고, default workspace-write·명시 DevShell/dependency/Python/짧은 TEMP 환경과 기존 finite14400/7500/7200 한도를 유지한다. 이후 별도 할당의 status 한 값 복구/actual Executor checkpoint와 native 검증 순서도 문서화한다. 현재 config/status/재실행은 미할당이며 이 상세 delta의 syntax·owner·경로/명령 감사 전에는 실행하지 않는다. Root는 정확히 동결된 local 환경 설정만 수행하고 Coordinator는 실제 Executor invocation/전이·audit를 맡는다.
Owner의 [R8 실패 보존 명령](implementation-recovery.md#r8-attempt3의-blocked-기록-보존)을 현재 hash/role/guard와 대조해 계획 gate `pass`로 수락했다. 정적 결과는 local links82/missing0·Python AST6·R8 PowerShell errors0·고정 hash7/Executor AST/blocked history3 불변, exit `0`이다. Coordinator 관리2문서는 local links175/missing0·diffcheck exit `0`을 확인했다. Root가 동결된 management2/Planning3 정확5문서를 checkpoint한 뒤 R8 actual unchanged Executor가 report1과 controls2를 별도 WIP commit한다. 이는 실제 prep 검증 통과가 아니다. [E8 정상 Ninja 대안](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)은 현재 미실행 요약이며 WIP 보존/clean 이후 별도 Planning이 exact local config/bootstrap·같은 graph의 명령 mapping·status-only/activation을 확정한다. 지금 config/status를 변경하거나 재실행하지 않는다.
E7 attempt3는 [실제 wrapper result](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/executor-result.json)의 native PowerShell/managed exit `2`, `1372.328`초로 종료했다. HEAD `dc6b9b1cf70b0ca1685eb1ac5476aa6f8cd3dab6`와 branch, 모든 비소유 bytes는 불변이다. Dirty는 Implementation report1/control2뿐이며 source/tests/Hook은 변하지 않았다. [Terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/terminal-archive.json)는 raw SHA-256 `d106f7ade2d678b6e0b383439b1b9b8d25f5ec32e883aed50c6fb4949a8983f1`, blocked/history3와 이전 history2 equality를 보존한다(exit `0`). Actual Codex exit `0`, 명시 reported-blocked 및 transportFailure null을 별도로 기록하며 transport retry로 재분류하지 않는다. Owner의 attempt1 표기는 전이 요청 이력으로 보존하고 Coordinator 원본은 실제 history3다.
Native classifier `37 passed`, focused `136 passed`, configure exit `0` 뒤 Debug build가 FileTracker 초기화 `UnauthorizedAccessException/0x80070005`로 exit `1`이었다. Manual CTest discovery/run 및 full pytest는 순차 검증 때문에 미실행이다. [Root의 실제 build shell 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-manual-build-environment-observation.json) SHA-256 `3013fbe0afd85b25450ddcec9257ee31f809f4fd471f144c3aad04b728fedff5`는 raw item14가 같은 shell 안에서 새 짧은 TEMP 경로/80자 이하를 검사하고 TEMP/TMP를 명시 대입한 사실을 확인한다. 따라서 대입 누락 가설은 배제한다. 실패 뒤의 경로 출력은 미도달이므로 실제 GetTempPath 문자열을 관찰했다고 주장하지 않는다.
별도 [등록 process 실제 exits](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-process-observations.json)는 Stop wrapper/Python·Debug build·CTest 모두 exit `0`이다. [등록 CTest 원시 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/registered-LastTest.log)는 `362 passed/0 failed`, SHA-256 `256f5380dbdab51059bd499d37d9558563d47fb302ff1b5b791884f4cbf15cbe`다. 이는 native manual build 접근 거부나 미실행 검증을 대체하지 않으며 prep gate는 미통과다.
현재 Planning 할당은 기존 plan/environment/recovery 3문서의 최소 delta다. Required inputs는 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, Step0/phase 및 실제 attempt3 raw/환경 감사다. Report1 및 blocked controls2의 unchanged Executor WIP 보존 명령과 그 이후 별도 status-only 복구를 먼저 구체화한다. 프로젝트가 이미 지원하는 CMake/MSVC/x64/Debug Ninja preset이 기본 workspace-write에서 사용할 정상 backend 대안인지 read-only로 제한 검토한다. 실제 성공 증거 없이 해소됐다고 주장하거나 FileTracker/test/Hook guard를 끄지 않는다. 정상 대안이 없다면 실제 필요한 exact-run 권한 결정만 구체화하며 이미 사용된 E6 one-time 승인을 확장하지 않는다. Planning은 source/tests/Hook/report/phase/status/Git 및 실제 실행을 변경하지 않는다. Syntax·경로·hash·guard 감사와 frozen3 반환이 이번 gate이며, 관리문서 checkpoint→실제 실패 WIP 보존 전에는 reset/재실행을 하지 않는다. 두 번째 source Correction은 금지하며 r2 수치 계약은 유지한다.
### E7 실제 실행 전 handoff 이력
Root의 정확5문서 checkpoint `2f7103ac37559563279fc8fe384fba568a9891e5` 뒤 [R7 WIP 실행](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/r7-wip-checkpoint-result.json)은 native/managed exit `0`, `2.109`초로 완료했다. Actual unchanged Executor는 Hook/report2를 `3ce0e4eb0aa3b395e4aa0dc442bea990b2302fe5`, error controls2를 `858aab2adc9e4e563952148040f0320f64fbf603`로 분리 commit했고 모든 bytes/history2/raw/error와 branch 보존 및 clean을 검증했다. 이후 별도 할당한 Planning은 Step0.status 한 문자열만 `error`→`pending`으로 바꾸고 나머지 JSON equality를 확인했다(exit `0`, hash `78922f3eb5597f095e385d428efc5ca87de89bc0f2c847aac7a56d8741192d22`). [R7 status checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/r7-status-checkpoint-result.json)는 native/managed exit `0`, `1.453`초이며 actual Executor commit `ab34ac77005eafa905862c517ead0fcde2209363`의 exact index1·pending/history2·raw/top 보존·clean을 검증했다. Top error는 과거 결과로 그대로 남는다.
현재 할당은 [E7 첫 PowerShell block](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개)의 실제 prep1회다. Required inputs는 Feature 폴더, FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 기존 Step0 및 R7/E7와 원시 실패 evidence다. Official implementation-agent profile과 원래 owned9를 유지하며 기본 workspace-write, short TEMP/TMP, short pytest basetemp, 기존 finite14400/full VERIFY/등록 Stop/terminal 및 retry guards를 사용한다. 이미 실제 확인한 RED/GREEN을 보존하고 focused/full Python·MSVC/x64/Debug CMake/CTest 전체를 다시 확인한다. Report reference 문구와 실패 이력 정정은 Implementation owner가 맡는다. Explicit error/blocked, ownership 또는 계약 실패가 발생하면 terminal을 보존하고 무단 재시도하지 않는다. Source Correction 재할당이나 새 DFA 승인은 없다. Root/Coordinator는 이번 관리 checkpoint 뒤 active invocation 동안 non-owned 편집과 Git을 동결한다. 실제 prep gate 통과 전 main/physics/release 전이는 없다.
### R7 계획 및 attempt2 판정 이력
Planning의 [R7](implementation-recovery.md#r7-attempt2-실패-보존과-정상-workspace-write-재개)·[E7](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개) 최소 delta는 owner/revision 및 현재 hash/정확 실행 순서를 확인해 계획 gate `pass`로 수락했다. Owner 정적 결과는 Python AST5·PowerShell13 blocks/errors0·link74·고정 artifact hash7·Executor AST 불변, exit `0`이다. Coordinator의 변경5문서 경로 검사는 local links239/missing0, exit `0`이다. 이는 실제 prep 검증 통과가 아니다. Root가 동결된 management2/Planning3 정확5문서를 먼저 checkpoint한 뒤 R7 첫 block을 unchanged Executor로 실행한다. 이때 source/tests·Hook/report·phase/raw는 지금 실제 실패 bytes 그대로 보존되며, 다음 status-only 편집은 그 WIP commit과 clean 확인 뒤에만 별도 할당한다.
E6 실제 실행은 `2655.156`초 뒤 native PowerShell/managed exit `1`, Codex actual exit `0`으로 종료했다. [wrapper result](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/executor-result.json)는 HEAD `d64cd1403ac41fb1397dfb088361ce18ad1d59bd` 및 branch 유지, 비소유 bytes 변경 `0`, dirty가 Hook/report와 control2의 정확4개임을 확인한다. [보존 원시 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/step0-output.json) SHA-256은 `8852e0ddae9ef94d885e8b4ae4b8a3b2e3a9d9161a3801bc7e56ea157e9411f4`다. Phase는 `error`, history2이며 첫 history의 JSON equality를 원래 attempt1 archive와 확인했다(exit `0`). `transportFailure=null`이며 명시 `reported-error`를 transport retry로 바꾸지 않는다. Owner가 요청한 `test` 분류/attempt1은 전이 권한이 없으므로 원시 반환으로 보존하고, Coordinator는 실제 환경 pair와 history에 따라 `environment`/attempt2로 기록한다.
수동 CTest는 `1086.77`초, 등록 CTest는 `982.52`초이며 둘 다 `361 passed/1 failed`, 실제 exit `8`이다. 등록 Stop wrapper와 Python의 실제 exit `0`은 test pass가 아니다. [수동 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/manual-ctest-observation.json)와 [등록 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/registered-ctest-observation.json)를 분리했다. Full Python은 순차 VERIFY의 CTest 실패 때문에 이번 실행에서 미실행이다. 승인된 Hook7500만 적용됐고 classifier source/test hashes는 이전 Correction 이후 불변이다. 기존 full CTest는 저장된 정적 reference를 읽고 비교하므로 owner report의 포괄적 reference 미열람 문구는 다음 Implementation에서 직접 원본 편집·새 eigen 비교 부재라는 정확한 의미로 정정하도록 인계한다.
Raw item18의 첫 focused는 깊은 pytest basetemp에서 exit `1`, `130 passed/6 failed`였고 item20은 짧은 `.harness/build/mfe-focus-<8자>`로 바꾼 동일 대상에서 exit `0`, `136 passed`였다. 앞선 실패를 지우거나 최초부터 통과했다고 기록하지 않는다. 새 환경 명령은 C++ TEMP/TMP와 pytest basetemp를 모두 짧게 지정하며, 통과한 기존 assertion을 변경하지 않는다.
Root에 할당한 동일 binary의 단일 test323 환경 probe는 새 긴 TEMP152자에서 결과251자/lock261자로 exit `1`, 새 짧은 TEMP70자에서 같은 test exit `0`을 기록했다. [Probe observation](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/path-length-probe-e15c1747/observation.json) SHA-256은 `511b30e183759b378e6f33f30aa3be4c940b58d1eabde12068151173a0a91979`이며 기존 CTest shared log/source/control/reference를 변경하지 않았다. 이 증거는 전체 gate를 대체하지 않는다. 실제 Win32 `GetLastError`를 관찰했다고 주장하지 않는다.
현재 Planning 소유 작업은 기존 implementation-plan/environment/recovery 3문서의 최소 delta다. Required inputs는 Feature 폴더 및 FEATURED_AGENTS/PRD/ADR/coordination, r2 계약, 원래 Step0/phase, [attempt2 terminal archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt2/terminal-archive.json)와 TEMP pair다. 실패 Hook/report 및 controls의 정확 bytes/hash/history를 unchanged Executor `_commit_paths`로 구분 보존하는 명령, 이후 별도 할당의 status-only 복구, 짧은 새 workspace TEMP/TMP를 native와 등록 Stop에 함께 상속하는 기본 workspace-write 명령만 구체화한다. Root는 먼저 frozen 관리/계획 문서만 checkpoint한다. Planning은 source/test/Hook/Implementation report/phase/status/Git을 수정하거나 실행하지 않는다. Syntax·ownership·hash 정적 검증과 exact frozen 경로 반환이 이번 gate이며, status reset은 실패 보존 commit 뒤 별도 할당한다. 새 DFA 승인, solver 계약 변경, 두 번째 source Correction 또는 framework 확대는 필요 없다. 현재 한 번의 DFA 승인은 이미 사용됐고 후속 prep/main은 기본 workspace-write다.
### E6 실제 실행 전 handoff 이력
R3 Planning은 prep index의 Step0.status 한 값만 `blocked`→`pending`으로 변경했다. Coordinator가 나머지 JSON·history1 보존과 hash `10de90d5cde92797a0dfeedc716a5d5a267000304260c063d55ae6bc53bb4cf5`를 확인했다(exit `0`). [실제 R3 checkpoint](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r3-approved-status-checkpoint-result.json)는 unchanged Executor 호출 native PowerShell/managed exit `0`, `1.531`초이며, control commit `671feb7c620d0f4e5d13d48cf7f312a02067c6aa`의 정확 index1개·pending·history/raw/top 보존·clean을 [stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r3-approved-status-checkpoint-stdout.log)에 확인했다. Top은 blocked 그대로다.
다음 실제 dispatch는 E6의 정확 prep1회이며 Execution owner는 공식 implementation-agent profile이다. Required inputs는 이 Feature 폴더와 FEATURED_AGENTS/PRD/ADR/coordination, r2 선행 계약, prep Step0, implementation-plan/environment/recovery 및 실제 corrections evidence다. Owned outputs는 Step0의 원래 exact9개이고 result payload는 `completed`와 nonempty summary 또는 명시 error/blocked다. Existing RED/GREEN을 보존한 재검증, 남은 Hook7500, 원래 implementation-prep-evidence 보고서 정정, full Python/MSVC/x64/Debug CMake/CTest 및 실제 registered Stop/terminal evidence가 gate다. Source echo Correction의 후속 Implementation rerun은 이번 1회만 할당하며 두 번째 Correction은 금지한다. Guard/ownership/upstream 실패나 명시 terminal 발생 시 원시 결과를 보존하고 무단 재시도하지 않는다. Root/Coordinator는 active invocation 동안 모든 non-owned 편집과 Git을 동결한다. 실제 gate audit 전 main/physics/release 전이는 없다.
사용자는 Root가 전달한 E6 exact prep 1회 승인 요청에 **“네 허용합니다. 작업을 계속 진행해주세요”**라고 응답했다. 이는 `mitc4-shell-feast-eigen-execution-prep`의 이번 한 번에만 적용되며 main은 기본 workspace-write다. Root의 재개 확인은 HEAD `83e15818bd025b6557d4af9940f6c6a7b8148f7f`, linked branch `feat-mitc4-shell-feast-eigen-execution-prep`, clean worktree였다. 별도 일반 승인을 추가하지 않고 [R3](implementation-recovery.md#r3-승인-후에만-가능한-status-only-checkpoint)의 exact phase index에서 step0 `blocked`→`pending` 한 field만 Planning owner에게 할당한다. 기존 timestamp/reason/attempt_history 및 top index·raw는 보존한다. Owner 반환 audit 뒤 unchanged Executor control checkpoint와 clean 검사를 거쳐 [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)의 명시 환경·유한14400·승인 flag로 실행한다. 이번 실행의 실제 결과가 나오기 전 성공·main 전이·추가 Correction을 기록하지 않는다.
### Exact-run 승인 요청 당시의 보존 기록
Root는 정확7문서를 `0a98b2c4fa708c1110e423c3ab3997e58dd81846`로 checkpoint했다. Ack 후 Coordinator가 소유 계획 [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)의 PowerShell block을 그대로 실제 호출했다. [보존 실행 기록](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r6-source-checkpoint-result.json)의 native PowerShell/managed exit는 `0`, 실제 block 실행 `1.765`초다. Unchanged Executor `_commit_paths`가 `scripts/execute.py`, `tests/test_execute.py` 정확2개를 `2641d2787586c3fdfe769415fb9f129c7d3d2751`로 WIP commit했다. [실제 stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/r6-source-checkpoint-stdout.log)은 linked branch 유지, clean, blocked/history1 및 source/report/phase/raw/Hook bytes 불변을 확인한다. `_commit_step`이나 상태 성공 전환은 없었다.
남은 중요 결정은 [E6의 exact prep invocation](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp) **한 번**에 대한 명시 sandbox 승인이다. [기본 workspace-write 실제 실패](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/step0-output.json)의 assigned `.codex/hooks.json` 쓰기 거부는 classifier 교정 뒤에도 원래 `reported-blocked` 사유로 보존된다. 사용자 일반 계속·commit 승인을 이 별도 승인으로 해석하지 않는다.
- 권고안: 이번 `mitc4-shell-feast-eigen-execution-prep` 실행에만 `danger-full-access`와 `--approve-danger-full-access`를 명시 승인한다. E6의 유한14400초·workspace Python/cache/TEMP/TMP·환경 복원, 원래 exact ownership/등록 Stop/전체 VERIFY/terminal·retry 보호를 유지한다. 이후 main은 기본 workspace-write다.
- 대안: 기본 workspace-write에서 지정 Hook 경로 편집이 가능하도록 환경 정책을 해소한 뒤 재개한다. 현재 변경과 blocked/history evidence는 보존하며 실행 성공으로 전환하지 않는다.
이는 [프로젝트 sandbox 조항](../../AGENTS.md), [Harness skill](../../.agents/skills/harness/SKILL.md), [SOLVER_AGENT_DESIGN §7](../SOLVER_AGENT_DESIGN.md#7-자율-진행과-사용자-escalation)의 신뢰 경계 승인이다. 승인 후에만 별도 Planning 할당의 R3 status-only 변경·Executor checkpoint 및 E6의 새 process 실행이 가능하다. 이번 기록을 포함한 마지막 문서 checkpoint 뒤 clean linked 상태를 다시 확보하여 Root가 결정 요청을 전달한다.
Correction owner가 반환한 source/test/report와 실제 명령·hash·27개 상대 링크를 audit했다(exit `0`, missing link `0`). Native continuation3는 `1914.797`초 뒤 native/wrapper exit `0`으로 끝났고 branch/HEAD와 비소유 bytes가 모두 불변이었다. [등록 process 종료](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-registered-exits.json)의 Stop 두 process 및 CTest exit는 모두 `0`이다. [보존 archive](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-3-archive.json)의 완료 CTest는 `362 passed/0 failed`, log SHA-256 `58abb8e4ad1c826c796ab2fd274081b6c6e9e8966c27b7d6c9dd69792693bee6`이며 보고서 SHA-256은 `d4ea3fb18accc2b2316eb439f56f5106d8ae6640fe79452cef6cb341b1933ee4`다. 보고서 작성 후 실제 관찰이므로 당시 미관찰 서술을 덮어쓰지 않는다. 이 자동 검증은 owner의 별도 manual build failure/CTest 미실행을 대체하지 않는다.
Planning은 기존 `implementation-plan.md`, `implementation-environment.md`, `implementation-recovery.md`의 최소 delta를 완료했다. Root가 frozen 관리/계획 문서와 독립 owner의 `corrections.md` 정확7개를 먼저 checkpoint하고, 원래 prep owned_paths의 `scripts/execute.py`, `tests/test_execute.py`만 unchanged Executor `_commit_paths`로 보존하는 [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)를 확정했다. 기존 R2와 blocked/history/raw는 그대로 둔다. [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)는 확인된 workspace Python/pytest cache·고유 basetemp와 process-local UV offline/TEMP/TMP recipe를 실제 후속 invocation 및 복원 경계에 묶었다. Root의 [FileTracker IL 관찰](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/filetracker-initialization-observation.json)은 `Path.GetTempPath()`에서 얻은 경로가 관찰된 `GetLongFilePath` 접근 거부 위치임을 입증했다(SHA-256 `8d47f96ba913a9adc2d89772cef4b27ea2187f613416912d894608be9730c5cc`). 새 TEMP/TMP remedy의 실제 native build 성공은 아직 검증하지 않았다. Source/Hook/phase 제어 수정·status reset·test/Executor 실행은 이번 Planning에서 수행하지 않았다.
### 이전 실제 보존과 native dispatch 이력
Root가 아래 정확8개 문서를 `7dca487da1790c167058cc4fc07b7afc902fe31f`로 checkpoint했다. 이후 Coordinator는 문서 [R2](implementation-recovery.md#r2-root-checkpoint-이후의-정확한-wip-보존-명령)의 PowerShell block을 그대로 실제 실행했다. Python native exit를 즉시 전파한 managed command exit는 `0`, 약1.90초였다. 실제 Executor `_commit_paths`가 구현8개를 `6e00dba117d836fce02c6918abec06cbae9dbdeb`, blocked control2개를 `5dfbea7e543b64fdefcea292de43237adb790a72`로 각각 보존했다. 모든 owned/control/step/raw bytes, blocked/history1 및 branch가 전후 동일했고 최종 clean/정상 preflight를 확인했다. 변경을 통과 상태로 바꾸지 않았으며 보호된 Hook은 그대로다.
`mitc4-shell-feast-eigen|implementation|harness|r2`의 unused Correction allowance에 대한 첫 bounded dispatch를 요청했다. 그러나 `collaboration.spawn_agent(agent_type=correction-agent, task_name=classifier_correction)`는 `agent thread limit reached`를 반환했고 새 agent/session이 생성되지 않았다. 실제 source/test 수정·RED/GREEN/full 검증은 시작되지 않았으며 allowance를 소비하지 않는다. 현재 root/Coordinator와 완료된 Formulation/Planning thread가 보이고 사용 가능한 tool에는 agent close 기능이 없다. 기존 specialist의 hard role을 대리 Correction으로 바꾸지 않고 Root에 서비스 capacity 문제를 전달했다.
Capacity 해소 후 처음 할당할 정확한 수정 소유는 `scripts/execute.py`, `tests/test_execute.py`, 현재 Feature의 `corrections.md`다. 실제 source-echo reproducer와 prep의 classifier 회귀3개를 RED→최소 GREEN→focused/configured full 검증하며 true helper·terminal/history·실제 timeout retry 보호를 유지한다. Hook/index/status/Git/타 owner 보고서/reference는 읽기 전용이다. 미적용 Hook의 환경 실패도 실제 결과와 미실행을 정확히 분리하며 검사 제외나 성공 대체를 하지 않는다.
현재 Planning task는 종료되었다. Correction 실제 결과를 받은 뒤에만 Planning을 재개해 수정 source/report checkpoint를 구체화하고 사용자 exact-run 승인 준비를 완료한다. 이 Correction의 결과와 후속 Implementation rerun 전에는 main/physics/release를 진행하지 않는다.
Root도 collaboration close 기능이 없음을 확인했고, 기존 Harness와 같은 native `codex exec` 경로로 공식 [Correction profile](../../.codex/agents/correction-agent.toml)을 그대로 주입하는 bounded 대안을 확인했다. Local `codex exec --help`는 exit `0`; 실제 Harness의 profile prompt 주입·xhigh/workspace-write/등록 Hook flags·stdin 전달 경로를 읽었다. 해당 profile은 model을 지정하지 않으므로 CLI의 기존 model 설정을 임의 변경하지 않는다.
별도 one-time native Correction은 유한14400초·재시도0으로 실행하고 stdout/stderr/native exit와 branch/HEAD·비소유 bytes·phase/history/raw 불변을 ignored `.../prep/classifier-correction/`에 보존한다. Phase Executor나 그 transport attempt가 아니며 현재 phase index를 쓰지 않는다. Source/Hook runtime을 이 실행 wrapper에서 고치거나 classifier를 override하지 않는다. Root/Coordinator도 해당 세션 중 non-owned 편집·커밋을 멈춘다.
첫 native thread `01a07476-082e-7863-b5be-3ca71003d70d`, managed session `76065`는 461.218초 뒤 native/wrapper exit `0`으로 종료했다. [실제 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-result.json)는 branch/HEAD와 비소유 bytes 불변, source/test 변경0을 확인한다. Owner [corrections](corrections.md)의 outcome은 `blocked-environment`이며 pytest entry가 collection 전에 uv cache 접근 거부로 exit `2`였다. 따라서 RED/GREEN/전체 검증과 실제 classifier 수정은 모두0이다. 작성 당시 보고서 SHA-256 `6bd03c4336d2958eb668d1bf07ef55059c317e4fc105bed0e16dd5179d3c3263`와 [원본 보고서 복사본](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-entry-blocked-report.md)을 보존한다.
Root가 정상 도구 설정으로 새 workspace ignored `.../classifier-correction/uv-cache`와 실제 절대 `uv.exe`/hermes venv `python.exe`를 지정해 pytest 실행 진입을 준비했다(exit `0`, 4.17초, pytest9.1.1). 기존 거부 cache/Hook/source/test는 변경하지 않았으며 native 접근 가능이나 RED/검증 증거를 대신하지 않는다. 이제 **동일 thread·동일 Correction attempt1**을 이 환경 해소로 이어간다. 새 classifier 수정 회차·새 retry key·추가 allowance를 만들지 않으며 아직 한 번도 수정하지 않은 bounded 결함만 수행한다. 다음 native command는 `codex exec ... resume <해당 thread> -`와 동일 profile/xhigh/workspace-write/유한14400초를 사용하고 첫 진입 실패와 후속 실제 결과를 각각 보존한다.
### 복구계획 감사와 WIP 실행 이력
Planning owner의 복구계획 반환4개를 감사했다. [R2](implementation-recovery.md#r2-root-checkpoint-이후의-정확한-wip-보존-명령)의 unchanged `_commit_paths` 호출은 timeout-only AST·origin 이후 정확8개 문서 경로·linked identity·role·default sandbox·source8/control2 dirty 범위·blocked/history/raw/모든 파일 bytes 불변을 확인한다. 구현 WIP와 blocked metadata를 별도 commit하고 성공 상태를 만들지 않는다. [R3/R4](implementation-recovery.md#r3-승인-후에만-가능한-status-only-checkpoint)는 실제 Correction/후속 checkpoint/해당 실행 직전 사용자 승인 뒤에만 조건부 실행한다.
Owner 정적 검증은 Python checkpoint AST2/local links107/EOF·whitespace와 PowerShell block3 syntax errors0, 각 exit `0`이다. Coordinator는 반환4개 owner/r2/hash·links107/AST2를 재확인했고 exit `0`, 실제 read-only Executor constructor/identity/profile/linked/default sandbox 확인도 exit `0`이었다. `implementation-verification.md`, source/tests/index/top/raw는 이 Planning 작업에서 변경하지 않았다. 이 audit는 복구계획만 수용하며 implementation outcome은 `blocked-environment`를 유지한다.
실행 순서는 Root의 정확8문서 checkpoint → Coordinator가 R2의 실제 Executor WIP 두 commit을 할당 → 공식 Correction Agent가 재현된 classifier 결함만 수정·검증 → 실제 결과에 대한 Planning의 후속 checkpoint 감사 → 사용자 exact-run 승인 및 status-only recovery → 새 prep process다. 이미 로드된 classifier를 reload/override하지 않는다. 현재는 Correction 미실행이고 별도 allowance를 아직 사용하지 않았다. R2 실행 중에는 모든 non-owned 문서/코드 편집과 Root Git 작업을 동결한다.
아래는 완료된 bounded Planning dispatch 이력이다. Native prep attempt가 종료되어 관리문서 동결을 해제하고 Planning owner에게 실제 실패를 보존하는 복구 계획과 아래 classifier 결함의 최소 TDD 계획만 할당했다. 할당 범위는 `implementation-plan.md`, `implementation-environment.md`, 필요한 같은 폴더 `implementation-recovery.md`, `implementation-verification.md` 및 prep `step0.md`였으며 source/test/Implementation 보고서/phase index·status/Git은 수정하지 않았다.
기존 unchanged Executor의 guarded `_commit_paths`로 부분 구현과 control metadata를 별도 blocked/WIP commit하는 최소 절차를 구체화한다. 새 관리/계획 문서는 Root가 정확 경로로 먼저 checkpoint하여 현재 Step의 경로 검사 밖 dirty 파일을 남기지 않아야 한다. 이 작업은 `_commit_step`이나 성공 판정·pending reset을 호출하지 않으며 Hook 설정 거부를 우회하는 편집을 하지 않는다.
실제 native 실패, clean linked worktree와 해당 실행 직전 사용자 명시 승인이 필요한 sandbox 경계는 [Harness skill](../../.agents/skills/harness/SKILL.md#elevated-and-remote-execution)을 따른다. 권한 결정 이전에는 기존 failure history를 보존한 채 중단한다. 별도 사용자 승인은 아직 없다.
### Execution-prep attempt 1 실제 결과
Root는 최종 Planning checkpoint를 `d533b61`로 커밋했고 exact20 paths/staged check/commit/status를 확인했다. 재개 직전 clean, Git root 일치, 기본 sandbox 및 활성 중복 process 없음을 확인한 뒤 아래 승인된 E3 명령을 실행했다.
```powershell
python -B -c "from scripts import execute; execute.StepExecutor.CODEX_TIMEOUT_SECONDS = 14400; execute.main()" mitc4-shell-feast-eigen-execution-prep
```
Managed session `27453`은 shell exit `1`로 종료했다. 별도로 측정하지 않은 Python Executor exit를 추정하지 않는다. Raw Codex `exitCode=0`, `transportFailure=null`, 명시적 `blocked`가 보존되었고 Executor는 transport retry 없이 prep/top phase를 `blocked`로 기록했다. 실제 시작은 `2026-09-06T10:04:44+0900`, terminal history는 `2026-09-06T10:28:44+0900`이다. Branch는 `feat-mitc4-shell-feast-eigen-execution-prep`, HEAD는 여전히 `d533b615410751fe023dc73ac2be994f05d37d30`이며 Executor가 생성한 새 commit은 없다.
Raw JSON SHA-256은 `0d5c0fe0aeba5604c5289764e7aad1834902548ca02158f8feac03484b195941`이다. Stderr에는 `patch rejected: writing outside of the project; rejected by user approval settings`가 3회 기록되었다. Native report의 대상은 `.codex/hooks.json`이며 실제 해당 파일은 변경되지 않았다. Executor의 일반 분류 문구 `Codex Windows sandbox helper를 실행할 수 없습니다.`를 모든 도구의 실행 불능으로 확대하지 않는다.
Focused command는 `uv run --with pytest python -B -m pytest -v -rs tests/test_harness_timeouts.py`였다. Raw JSONL event62에서 첫 test fixture 오류를 포함해 4 failures, event64 test-only 수정 뒤 event66에서 의도한 1800 기본값에 대한 4 failures를 확인했다(각 exit `1`, 약0.40초). 이후 runtime 값 변경 뒤 event78은 exit `1`, `2 passed, 2 failed`, 1.86초였다.
- `test_stop_passes_one_shared_deadline_to_root_toolchain_and_plan`: 7200 값과 deadline 전파는 도달했지만 서로 다른 import의 `ProjectKind.CMAKE` 객체 비교가 실패했다. Event80에서 `.value` 비교로 test-only 수정했으며 이후 pytest 실행은 없다. 적용된 수정은 미검증이다.
- `test_registered_hook_and_one_time_invocation_contract`: Hook timeout `1800 != 7500` 실패다. 지정 `.codex/hooks.json` 쓰기 거부와 연결되며 설정은 1800으로 남아 있다.
[Implementation 작성 시점 보고서](implementation-prep-evidence.md)는 두 실패와 후속 test-only 수정의 검증 상태를 충분히 구분하지 않는다. Coordinator는 본문을 수정하지 않고 raw 순서로 gate를 판정하며 재개 Implementation owner에게 정확한 보고서 갱신을 요구한다. Python·Hook의 runtime 일부와 tests/doc 변경은 owned 범위에 있으나 manual configure/build/CTest/full pytest는 실행하지 않았다. 뒤의 aggregate shell exit `0`에는 `python` CommandNotFound가 섞여 있어 개별 command 성공 증거가 아니다. 추가 `uv run python -B -c ...` 상태 확인은 사용자 uv cache 접근 거부로 exit `1`이었다.
Native Codex의 실제 등록 Stop process `21804`와 CTest child `21716`를 관찰했다. 명령은 `python -X utf8 .../scripts/hooks/stop_validation.py`, `ctest --test-dir .../.harness/build -C Debug --output-on-failure`였고 실제 Debug/x64 build process도 관찰했다. 이는 수동 full VERIFY가 아니다. [CTest LastTest.log](../../.harness/build/Testing/Temporary/LastTest.log)는 362 `Test Passed`, 0 `Test Failed`, 시작10:12/종료10:28을 기록했다. 크기606010 bytes, SHA-256 `f32e535ba6d6b8b8ed7910b0790600698cfa5f20035d12ec5c6821c76df2291f`다. 별도 Stop/CTest process exit는 측정하지 못했으므로 `exit 0`으로 기록하지 않는다. 이 로그는 이후 실행으로 교체될 수 있는 ignored generated evidence다.
Root가 workspace 내부의 ignored [attempt1 archive](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/observation.json)에 `LastTest.log`, `step0-output.json`, `phase-index.json`, `top-index.json`을 복사하고 원본/복사본 hash 일치를 확인했다(exit `0`). [보존 CTest 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/LastTest.log)와 [보존 raw 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/step0-output.json)를 이후 audit의 안정 경로로 사용한다. Source/control/reference와 Hook state는 변경하지 않았다.
Root의 추가 read-only/pure-function 재현은 [classifier observation](../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json)에 있다(SHA-256 `74c80fbdfc1eb5d4e28c5e1c77caf33d23af30858bbb7fb9742358e0d8df7eb5`, exit `0`). Raw stdout의 `orchestrator_helper_launch_failed` 7회는 성공한 source/test read command 4개(JSONL lines20/28/44/58, 각 exit `0`)에만 있고 stderr에는 없다. 기존 `_codex_environment_failure`는 성공한 source excerpt 문자열만 있는 exit0 payload도 helper failure로 반환했다. 따라서 현재 helper-launch reason은 source echo에 의한 Harness 분류 오탐이며 실제 도구 launch 실패의 evidence가 아니다. `.codex/hooks.json`의 실제 승인 설정 거부와 명시적 `blocked`는 여전히 유효하고 history를 수정하지 않는다.
같은 source read가 재실행의 성공 결과도 막을 수 있으므로 Planning에 기존 prep 소유 `scripts/execute.py`/`tests/test_execute.py` 안의 최소 TDD 회귀 계획을 추가로 할당했다. 실제 helper failure, 명시 terminal, sandbox·transport retry·ownership 보호를 유지하는 분류 수정만 다음 Implementation에 포함하며 Coordinator/Root는 source를 수정하지 않는다. 이는 운영 결함의 계획 delta로 physics/schema/tolerance `r2`를 바꾸거나 Correction budget을 새로 만들지 않는다.
Main Step0~7, solver C++ 변경, FEAST/reference 비교, physics/release는 미실행이다. Prep의 현재 outcome으로 구현 gate나 timeout activation을 통과시키지 않는다. Failure history·부분 구현을 보존하는 checkpoint 계획은 routine local 준비이며, 환경/사용자 결정 해소 후에만 Planning의 명시적 status-only recovery와 정확한 재실행을 허용한다.
### 최초 Implementation dispatch 이력
Planning owner의 r2 `pass` envelope와 계획 main/detail 4개 및 phase 제어문서 12개를 감사하여 implementation으로 전이한다. Source 변경·C++/FEAST/reference 성공을 뜻하지 않는다.
초기 14개 main 단위를 결합된 API/data 경계 기준으로 8개로 통합했고 각 step의 behavior별 RED/GREEN·focused/full VERIFY·등록 Stop은 유지한다. 운영 prep 1개는 다섯 deadline default와 관련 Harness tests만 소유하며 physics·schema·sandbox·retry·ownership을 바꾸지 않는다.
Owner는 첫 감사에서 Step2 대응 test owned 누락과 anchor 두 곳을 찾아 index/Markdown·정확한 링크를 수정했다. Actual `StepExecutor` read-only schema/owned validator와 최종 정적 감사는 exit `0`이다. Coordinator도 [V7의 실제 command](implementation-verification.md#v7-계획-정적-감사)를 읽은 뒤 재실행해 같은 결과와 16개 bundle SHA-256 `a28b78ad52a7e9606d026100934fea3ff324218be4210aa772e89cbaae42b413`를 확인했다.
결과는 prep1/main8, owned paths128회/고유110, Step별 upstream22 필수입력, 요구27/NR27/I/O11, 신규 필수 test40, local links575/anchor warning0, 기존 top index5개 entry/history 보존, `git diff --check` exit `0`이다. `fesa_tests` aggregate가 unit/integration/reference targets 모두를 의존한다는 실제 graph와 각 필수 새 test의 discovery 확인도 계획에 명시되어 있다.
Root의 최초 `git diff --cached --check`는 새 plan/verification/prep index의 EOF blank 3개를 검출해 exit `1`이었다. Planning owner가 해당 3개만 수정하고 V7에 unstaged diff의 신규파일 검사 한계 및 EOF 검사를 보완했다. Coordinator의 V7 재실행은 전체 EOF 검사·동일 coverage·위 갱신 hash를 확인하며 exit `0`이다. Phase JSON 의미·metadata·계약은 변하지 않았고 구현 correction/revision 변경으로 취급하지 않는다. Root의 재staging/checkpoint 완료 전 실행하지 않는다.
실행 dispatch는 `feature_id=mitc4-shell-feast-eigen`, `stage=implementation`, `outcome=pass`(Planning gate), `next_owner=implementation-agent`, `contract_revision=r2`, `attempt=0`, failure/retry/escalation/blocker=`null`을 적용한다. 필수 evidence inputs는 Feature 폴더/관리3개·승인 upstream22개·Planning4개 및 assigned prep index/step0이며 정확한 경로는 [prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md)에 포함된다.
Root의 정확 경로 checkpoint와 clean/active process/sandbox preflight 후 [E3의 one-time module invocation](implementation-environment.md#e3-one-time-bootstrap와-새-process-activation)으로 execution-prep Step0를 할당한다. Implementation은 그 Step의 exact code/tests/evidence paths와 terminal result만 소유하고 Executor가 branch/attempt/commit/phase 진행을 소유한다. 이 invocation 동안 Root/Coordinator는 관리문서를 포함한 non-owned 편집·커밋을 동결한다.
종료 뒤 actual manual evidence·raw Executor result·등록 Stop/actual exit·정확 source/control commits/clean을 감사한 다음에만 새 main invocation을 할당한다. 실패 시 상태/로그를 보존하고 실제 분류로 반환하며 pending reset/즉시 재실행을 하지 않는다. 실제 구현/전체 검증/reference 및 physics/release gate는 아직 미완료다.
### Implementation Planning r2 이력
I/O owner의 r2 `pass` envelope와 실제 기본 1개/상세 3개 문서를 감사하여 implementation-planning으로 전이한다.
Constant density와 frequency options/data의 exact subset, 공식 공개 syntax 근거와 source warning, 별도 eigen procedure, 기존 static을 보존하는 additive schema 및 candidate/state 보존을 확인했다. Source Step-2/canonical Step-1과 공개 N/all-c 검증을 분리하고 raw lambda·frequency validity·실제 lumped mass/backend를 보존한다.
Owner의 `python -B -` 정적 audit은 owned 4개 metadata, relative links 66개/anchors 13개, requirement 27행, 원본 N10/data fields6 및 TXT full grammar 10행/hash 일치, exit `0`이었다. Owned paths의 `git diff --check`와 별도 untracked whitespace/table 검사도 exit `0`이다. 잘못된 초기 directory/glob 검색과 해소는 owner evidence에 기록되어 있다.
Coordinator는 전체 22문서의 local-link 누락 0, I/O 4개 owner/r2 metadata·반환 SHA-256 일치 및 coverage 27행을 확인했다(`python -B -`, exit `0`). External Value-only/10 singleton/common tolerance 및 기존 static U/UR·reaction 역할은 유지한다.
Planning은 모든 승인 문서와 27개 NR cases/11개 I/O obligations를 실행 가능한 정확한 owned paths, RED/GREEN/focused/full VERIFY와 fresh reference evidence에 연결한다. 실제 MSVC/x64/Debug backend, dependency cache, Executor/Stop의 1800초 경계 및 Git·sandbox·retry 소유권은 아래 준비 evidence와 현재 Harness 구현을 대조한다. 아직 C++/FEAST/eigen reference 비교는 미실행이다.
Root는 I/O r2 exact 8개 경로 checkpoint를 `1d4f5ac` (`docs: define MITC4 eigen input and result contracts`)로 커밋했고 staged path set/diff/commit exit `0`, 이후 clean을 확인했다.
Planning owner에게 `implementation-plan.md`와 필요한 같은 폴더 상세, `phases/index.json`의 신규 entry 및 `phases/mitc4-shell-feast-eigen/`의 index/연속 step 문서를 할당했다. 운영 준비를 별도 invocation으로 완료해야 한다고 판단하는 경우에만 `phases/mitc4-shell-feast-eigen-execution-prep/`의 index/step과 entry도 할당했다. 기존 phase 이력과 모든 runtime/source/test/config는 read-only이며 실행은 아직 할당하지 않았다.
이미 로드된 Executor는 자기 source 수정 후에도 최초 timeout 값을 유지할 수 있으므로 계획에서 새 process activation 경계를 명시해야 한다. 이 관찰은 timeout·sandbox·Hook 정책의 임의 우회 승인이 아니다.
### I/O r2 이력
NR owner의 r2 `pass` envelope와 실제 5개 기본/상세 문서를 감사하여 io-definition으로 전이한다.
NR-MFE-001의 r1 실패를 보존하고 독립 직접 적분의 r2 complete K/질량/고유치/정적 response·reaction covariance 결과로 수학 계약의 해소를 확인했다. 문서에서 추출한 `python -B -` 재현도 exit `0`이다.
V1~V6의 단위·zero branch·analytic rank/conditioning·원 residual/Gram·FEAST controls/seed/QR/thread/정수·memory/budget과 27개 필수 case/요구 mapping이 고정되었다. MFE-C13의 BC 조합은 실제 global component BC로 표현 가능한 경우만 적용함을 owner가 명시했다.
Owner 정적 audit은 5문서/64 local links/27개 요구/27개 cases/8개 기존 static artifacts, exit `0`; `git diff --check` exit `0`이다. 최초 audit의 encoding/URL-decoding 오류와 수정 후 재확인은 전문 evidence에 보존했다.
Coordinator는 18문서의 local-link 누락 0, NR 5개 문서 owner/r2 metadata·반환 hash, 27개 case/27개 requirement mapping 행을 확인했다(`python -B -`, exit `0`). 원본 input/TXT hash와 외부 Value-only/10 singleton/common policy는 유지한다.
I/O owner는 승인된 입력 subset·부수 옵션·density mapping, 별도 eigen procedure state와 additive HDF5/source/modal identity·failure preservation·deterministic 비교 projection을 고정한다. 수식/수치 기준을 다시 선택하지 않으며 실제 C++/FEAST/fresh reference 비교는 Implementation의 후속 필수 작업이다.
Root는 NR r2 exact 9개 경로 checkpoint를 `ea883ad` (`docs: complete MITC4 eigen numerical review`)로 커밋했고 staged path set/diff/commit exit `0`, 이후 clean을 확인했다.
### Numerical-review r2 이력
Formulation owner의 r2 `pass` envelope와 실제 5개 문서의 변경·상세 수식/단위/ordering/실패/검증 경계를 감사하여 numerical-review로 전이한다.
Owner가 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 확정했고 S1~S8에 positivity, complete K 공변성, partial BC, physical rigid/null 및 nonlinear 초기 고정 potential/Hessian의 적용 경계를 명시했다.
Exact arithmetic `python -B -`는 exit `0`, `kd=19/4800`, `lambda=10369/450`, 단위 tangent moment 응답 `7500/10369`이며 formulation 식의 산술 확인이다. NR의 독립 반례 해소나 runtime 결과로 취급하지 않는다.
Owner 정적 검사는 5문서/57개 상대 경로/27개 coverage/issues 0, exit `0`; `git diff --check` exit `0`이다. Coordinator는 16문서 local-link 누락 0, 5개 owner/r2 metadata와 반환 SHA-256 일치를 확인했다(`python -B -`, exit `0`).
NR는 r1의 비충돌 mass oracle/API/reference 근거를 보존하고 새 stabilization을 독립 재검토한다. 이어 미완료 V1~V6 내부 threshold·conditioning·FEAST controls/endpoint/count/solve budget·seed 및 27개 요구의 필수 case matrix를 모두 고정해야 한다. 논리 reference readiness도 r2로 확인한 뒤에만 I/O로 전이할 수 있다.
Root는 formulation r2의 exact 9개 경로를 `4d30383` (`docs: define covariant MITC4 stabilization formulation`)로 커밋했고 staged diff/commit exit `0`, 이후 clean을 확인했다.
NR owner의 중간 독립 계산은 기존 R block을 입력하지 않고 평판 membrane/curvature/MITC shear work를 직접 적분해 complete `24×24 K`를 구성했다. 회전 전후 `lambda=23.04222222222223`, `thetaZ=0.7233098659465717`이 같고 K/M/response/reaction covariance 오차는 각각 `7.90e-17`/`4.66e-17`/`0`/`1.15e-16`이었다(`python -B -`, exit `0`). 최종 보고서/controls/coverage 반환 후 gate를 감사하며 C++/FEAST runtime evidence와 구분한다.
### Formulation r2 이력
Research owner의 r2 `pass` envelope, 두 owned 문서와 추가 R07 상세 근거를 감사하여 formulation으로 전이한다.
Trace/spectral scale 후보, 초기 고정 nonlinear potential의 미분 구조 및 linear `Kzz>0`/`Kpz=0` 전제를 구분했고 특정 수식이나 수치 반례 해소를 연구 gate로 승인하지 않았다.
Owner의 Python 정적 검사는 2문서/32 local links/27개 coverage/issues 0, exit `0`; 기존 S01~S11/R01/R02/R04/R05 보존 비교와 `git diff --check`도 exit `0`이다.
Coordinator는 15문서 local-link 누락 0, owner/r2 metadata·반환 hash 일치를 확인했다(`python -B -`, exit `0`).
`research.md` SHA-256은 `8b552b35342a1e0c81ee8c4effd03f240ea88c7553a5e3eee523b1c0f3cf55f6`, `research-evidence.md`는 `b1825090886ca71510d33c335fc0048f61a53f5f58441fc3d36fffe0e894c492`이다.
Formulation owner는 승인된 범위 안에서 하나의 공변 scale을 정하고 positivity·완전 K 변환·partial BC·initial-fixed nonlinear 계약 및 finite/null 처리 증명을 최소 delta로 갱신한다. 아직 외부 수치 comparison·새 구현·r2 NR gate는 미실행이다.
Root는 research r2 checkpoint 6개 exact paths를 `b99a5e5` (`docs: record covariant MITC4 stabilization research`)로 커밋하고 diff/commit exit `0`, clean을 확인했다.
### Research r2 이력
Requirement owner의 r2 `pass` envelope와 두 owned 문서 delta를 감사하여 research로 전이한다.
기존 26개 ID를 보존하고 `002/008/014/020/024`를 승인 범위에 정합시켰으며 `027`을 추가했다. 기존 fixed scale의 대체 경계와 linear/nonlinear 정적 회귀 portfolio·identity·정책을 연결했고 물리 kernel·source/schema·공통 tolerance는 변경하지 않았다.
Owner의 `Get-Content`/`rg`와 Python audit은 exit `0`, 27개 요구/43 local links/깨진 링크 0이다. Coordinator audit은 15문서/깨진 링크 0/27 unique IDs, exit `0`이다.
`requirements.md` SHA-256은 `bcc17774190cc19b28595b3d0151c0202f4470a14aa90947c5cba6188c9ef909`, `requirements-evidence.md`는 `452ea5ed49b43ffaea3f6065fecf62003ea74f0e6bb3eae7812b9af8e7b8d514`이다.
Research owner는 r1 근거를 보존하며 승인된 stabilization 공변성, 기존 static scale lifecycle과 finite-null 처리에 필요한 근거만 최소 delta로 보완한다. 수식·threshold·NR 판정은 후속 owner 소유이며 실제 구현·수치 재검증은 미실행이다.
Root는 r2 requirements checkpoint 6개 exact paths를 `adef07e` (`docs: baseline covariant MITC4 stabilization requirements`)로 커밋하고 `git diff --check`/commit/status exit `0`, worktree clean을 확인했다.
### Requirements r2 갱신 이력
사용자가 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함해주세요.”라고 답하여 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)의 개선안을 명시적으로 승인했다.
Coordinator는 승인된 scope 변경에 따라 `r2`로 전이하고 Requirement owner에게 필요한 요구·검증 matrix와 기존 fixed `kd` 계약의 대체 범위를 최소 delta로 갱신하도록 할당한다.
기존 질량 흐름·입력 N·reference Value-only·공통 tolerance는 유지한다. r1 NR 반례는 개선 후 필수 회귀 evidence로 연결하며 사용자 승인 자체를 NR gate 통과로 해석하지 않는다.
이후 Research, Formulation, NR의 영향받는 evidence를 순서대로 owner 검토하고 5~9단계로 진행한다. 새 r2 실패는 아직 없고 r1 retry signature의 correction 사용은 0회다.
Root는 앞선 결정 요청 6개 exact paths를 `78d2943` (`docs: record MITC4 stabilization decision request`)로 커밋했고 재개 시 clean 및 기존 VS18/x64 dependency cache를 확인했다.
Root가 이전 자동 Stop으로 보이는 실행 중 CTest를 read-only 추적하고 있다. 수동 중복 build/test/Hook를 실행하지 않으며 최종 결과가 확인되면 환경 evidence로 별도 기록한다.
Requirement owner의 중간 검토는 기존 physical kernel/director/mapping을 유지하면서 numerical stabilization 개선을 분리하고, 개선된 constrained pencil의 spectrum 보존 및 NR 부분 BC 반례의 blocking 좌표 검증을 명시하는 방향이다. 보고서 반환 전 r2 requirements gate를 통과로 처리하지 않는다.
### Requirements 사용자 결정 대기 이력
Requirement owner의 두 owned 보고서와 `needs-user-decision` envelope를 감사했다.
원래 r1의 지원 partial BC 반례를 acceptance에서 제외하는 것은 실제 변경이며, 기존 stabilization 개선 또한 scope/physics 변경이라는 판단과 두 대안·권고를 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)에 기록했다.
질량·FEAST·입력 N의 승인 선택은 유지하고 Root에 한 건의 결정 묶음을 전달했다. 사용자 응답 전 계약 변경·다음 stage 통과는 보류한다.
Requirement owner의 `Get-Content`/`rg` 및 Python 정적 검사는 exit `0`, matrix 26행은 기존 HEAD와 동일하고 링크 누락이 없다. 수식 유도·수치 재실행·source 변경은 하지 않았다.
당시 SHA-256은 `requirements.md`: `ae08d2c7a52cce5261e3420618e5b84b3f25c20258d0992b1b6941511baa7d09`,
`requirements-evidence.md`: `528bdf8a948a964f269cc100c2072d68e65ebaff333b9246b1f718a2052d408e`이다.
Coordinator의 `python -B -` 정적 audit은 15문서/끊긴 local link 0, matrix 26행과 HEAD 동일, exit `0`이다. 최초 audit helper는 ID의 backtick을 잘못 가정하여 0행/exit `1`을 반환했고 실제 문서 형식에 맞춘 패턴으로 수정해 재확인했다. 문서나 계약을 변경하여 검사에 맞추지 않았다.
`git diff --check`는 exit `0`; 변경 경로는 관리 4문서와 Requirement owner 2문서뿐이다.
Root는 NR finding 7개 exact paths checkpoint를 `c8876da` (`docs: record MITC4 numerical review contract finding`)로 커밋하고 clean을 확인했다.
### Requirements return-upstream 이력
NR owner의 실제 보고서 3개와 `return-upstream` envelope를 확인하여 정확한 Requirement owner로 반환한다.
같은 지원 partial BC를 보존한 45도 회전의 직접 계산에서 `lambda=23.04088888888889 -> 23.040628726287263`,
상대차 `1.1291343961675893e-5`가 재현되었다(`python -B -`, exit `0`). 기존 `kd` 규칙과 REQ-014의 acceptance intent 사이의 발견이다.
NR의 independent rational mass oracle, Intel API/count/trace 검토와 reference 원본/10-mode logical readiness evidence는 보존한다.
Owner 정적 검사는 3문서/35 local links/issues0, exit `0`; 수치 reference comparison·FEAST runtime·구현은 미실행이다.
`014`에 영향을 받는 research R06 coverage와 formulation V5/coverage를 부분 stale로 표시하고, 나머지 수학·reference evidence는 향후 revision 영향 검토 후 재사용한다.
Requirement owner는 기존 literal intent의 기술적 정합 가능성과 실제 critical acceptance/physics 선택을 구분한다. 새로운 사용자 결정을 이미 필요하거나 승인된 것으로 표시하지 않는다.
이번 건은 upstream 계약 문제이며 Implementation/Correction Agent로 보내지 않는다. Correction 및 transport 재시도 budget은 사용하지 않았다.
### Numerical-review 이력
Formulation owner의 r1 `pass` envelope와 실제 기본/상세 문서 4개를 감사하여 numerical-review로 전이한다.
Owner 정적 검사는 `4`문서, `38` local links, requirement coverage `26`, issues `0`, `python -B -` exit `0` 및 `git diff --check` exit `0`이다.
Coordinator는 모든 상세 문서의 metadata·수식/단위/identity/오류/검증/한계 절과 링크를 읽고 필수 항목 존재를 확인했으며 수학적 correctness verdict를 대신하지 않았다.
NR는 수학 correctness와 reference-model readiness를 모두 검토하고 명시된 metric/zero branch의 수치값, FEAST controls·bounded budgets 및 필수 verification portfolio를 고정한다.
Root의 두 독립 감사 포인트를 필수 handoff로 포함한다: count 기능의 실제 API 보장보다 강한 completeness를 주장하지 않을 것;
기존 basis-dependent drilling stabilization과 `FEM-REQ-MITC4-EIGEN-014`의 coordinate-invariance coverage 관계를 명시하여 acceptance의 조용한 축소를 막을 것.
현재 새 사용자 미결정이나 implementation correction은 없다.
Formulation checkpoint는 Root가 `2c3a86a` (`docs: define MITC4 mass and FEAST formulation`)로 8개 exact paths를 커밋했고 이후 clean을 확인했다.
### Formulation 이력
Research owner의 r1 `pass` 반환을 Coordinator가 감사하여 formulation으로 전이한다.
연구 기본/상세 문서의 owner, r1, source locators, Fact/Derivation/Candidate 구분, 실제 명령 exit code 및 미실행 항목을 확인했다.
연구 문서 SHA-256: `research.md` = `c044031f844798f32bedc95fd998c181f965fbac00c3ed8f594a48d0164b8956`,
`research-evidence.md` = `aa7cf3be8c3858a9358ca2bd3d117ca0e85a6a0d42c1b439bd812f4ee3d3120f`.
Coordinator local-link audit은 Feature 8문서/끊긴 링크0, exit code `0`; `git diff --check`도 exit code `0`이다.
설치 header와 공식 count 기능 존재는 runtime 또는 완전성의 자동 통과 증거가 아니다. 실제 API의 수치적 한계, endpoint/count 실패, 독립 작은 spectrum 검증이 연구 보고서에 기록되었다.
Formulation owner는 approved MITC4 geometry에 대한 consistent 적분, derived block lumping·물리 관성·massless drilling/constraints,
FEAST의 낮은 N개 계산·복원·실패 보존 및 modal evidence 식을 구현 가능한 계약으로 작성한다. 최종 numerical/reference acceptance는 다음 NR가 독립 검토한다.
Research checkpoint는 Root가 `a7c13ff` (`docs: record MITC4 mass and FEAST research evidence`)로 완료 문서 6개를 커밋했고 이후 clean을 확인했다.
Formulation owner의 중간 관찰은 기존 `Tphys/Tdrill`과 양의 nodal drilling 강성에 기반한 `Kpz=0` 증명,
곡면의 `C1` coupling을 유지하는 derived block lumping과 `3×3×3` mass 적분 차수 검토이다.
이는 작성 중인 정식화의 owner 관찰이며 formulation 또는 numerical gate 통과를 뜻하지 않는다.
### Research 및 baseline 이력
Requirement owner의 최종 r1 `pass` 반환을 Coordinator가 감사하여 requirements gate를 통과시키고 research로 전이한다.
당시 SHA-256은 `requirements.md`: `1ebe65f231e49ffc15a9a1985dcdbbb7e6fc47b9e1ddb5a76f2c2489e5982690`,
`requirements-evidence.md`: `2241ef8dacc7e07d40c731667e202bd9c104ae43b1a5f6eab4530a6831fea918`이다.
Coordinator 정적 audit은 Feature 6문서, 끊긴 local link 0, must rows/unique IDs `26/26`, exit code `0`; `git diff --check` exit code `0`이다.
Research owner는 승인된 consistent→lumped→FEAST, 물리 관성·massless drilling·제약·최저 모드 완전성 및 독립 verification의 primary-source evidence를 수집한다.
연구 계약은 다음 stage의 수식을 대신 승인하지 않는다. Reference 비교량, tolerance 및 사용자 mass 선택은 변경하지 않는다.
요구조건 checkpoint는 Root가 `29d88b4` (`docs: baseline MITC4 lumped-mass FEAST requirements`)로 6개 exact paths를 커밋했고 이후 clean을 확인했다.
사용자가 “inp 파일의 고유치 개수를 사용합니다”라고 확인했다. 기존 r1의 `FEM-REQ-MITC4-EIGEN-009/015`와 일치하므로 [MFE-ADR-005](ADR.md#mfe-adr-005--요청-고유치-개수의-입력-권위)에 설명을 기록하고 r1을 유지한다.
Research와 후속 Formulation/NR은 FEAST interval count 기능의 exact guarantee와 stochastic estimate를 구분하고 공식 API가 보장하는 범위를 넘는 completeness 주장을 하지 않는다.
### Requirements 이력
2026-09-06 사용자 후속 답변을 수신했다. Consistent mass를 계산하고 이를 이용한 lumped mass도 계산한다는 요구로 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)를 갱신했다.
`r1` 입력을 Requirement owner에게 반환하여 양자택일 초안과 matrix를 수정하고 actual FEAST mass/lumping 의미의 중요 미결정 여부를 확인한다.
Requirement owner는 두 mass의 계산 관계만으로 FEAST의 실제 `M`이 유일하게 결정되지 않는다고 판단했다.
[MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 derived lumped 사용 권고와 consistent 사용 대안, spectrum·residual 영향 및 질문을 기록하고 Root에 전달했다.
Detailed lumping 수식은 Research/Formulation이 담당하며 현재 질문은 FEAST 사용 질량 한 건이다.
같은 날 사용자 명시 답변으로 `consistent mass -> lumped mass -> 고유치 해석` 순서와 FEAST의 lumped mass 사용이 확정되었다.
`MFE-OQ-001`과 `MFE-OQ-002`는 해소되었으며 Requirement owner에게 r1 baseline 확정과 pass 검토 요청을 전달했다.
FEAST 및 내부 modal residual/normalization/orthogonality는 사용된 lumped `M`을 기준으로 한다. 같은 선택에 대한 재질문은 하지 않는다.
아래 r0 기록은 이력이며 현재 승인을 뜻하지 않는다. r0 requirements 결정 항목은 stale이고 후속 stage 산출물은 아직 없다.
Requirement Agent는 r0 입력에서 요구사항과 검증 matrix, reference 관찰 사실 및 중요한 미결정 사항을 작성한다.
질량 정식화나 reference 해석 의미를 승인으로 추정하지 않으며 질문이 필요하면 선택지·영향·권고를 하나로 묶어 Coordinator에게 반환한다.
일반 문서·계획·local 실행은 사용자 요청으로 승인되었으며 반복적인 stage 승인을 추가하지 않는다.
Requirement owner의 중간 조사에서 단일 `Step-2`의 `nlgeom=NO, perturbation`, `*Frequency` 요청 `10`모드,
선행 정적 step·하중·preload 없음이 확인되었다. 이 관찰은 무하중 원형상 procedure 의미를 뒷받침하며 최종 requirements 보고서에서 추적한다.
`Value`와 `Freq(cycles/time)`가 별도로 있는 원본 txt는 Mode `1..10`을 포함한다. 수치 비교는 아직 수행하지 않았다.
Requirement owner는 `consistent mass`와 `nodal lumped mass`가 유한 mesh의 고유치·운동에너지 의미를 달리하는 critical 선택임을 반환했다.
[MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)의 권고/대안/영향을 Root에 전달하여 사용자에게 하나의 질문으로 요청한다.
Requirements 기본·상세 보고서 2개의 owner `requirement-agent`, input revision `r0`를 확인했다.
Coordinator 정적 audit: 전체 Feature `6`문서, 끊긴 local link `0`, must matrix `25`행 및 고유 ID `25`, exit code `0`.
원본 reference 2개 SHA-256이 specialist 기록과 일치했다. Requirements 초안은 질량 선택 대기를 명시하며 연구 이후 gate의 빈 보고서는 없다.
기본 보고서 SHA-256: `8d5fbcb8ba2c2bd25d736418450b1b69e7aba7a84c8370d6e2a89e4e259daa66`.
상세 보고서 SHA-256: `85ee91dd745f74cc65ef8e660227465a8fa5ad302e639a51464d0ba31f449d22`.
결정에 의존하는 baseline pass 및 다음 stage는 보류한다. 응답 수신 뒤 Requirement owner가 승인 선택을 반영하고 Coordinator가 revision과 gate를 다시 감사한다.
## 후속 실행 준비 관찰
후속 사용자 지정 `FESA_GTEST_SOURCE_DIR=C:\git\googletest`에 대해 Root가 `CMakeLists.txt` 존재를 확인했다.
Root는 다른 dependency·Harness 환경을 별도로 조사하며 완료 문서 checkpoint와 사용자 수정 `AGENTS.md` 커밋을 담당한다.
실제 implementation 실행 전 환경 준비와 configure/build/test 성공이 필요하며 아래 과거 Stop failure를 소급 변경하지 않는다.
사용자 수정 `AGENTS.md`의 경로 예시 한 줄은 Root가 `fab168b` (`docs: document local GoogleTest source path`)로 커밋했다.
Root read-only 환경 조사에서 다음 설치 경로를 확인했다. 이 목록은 설치 존재 evidence이며 configure/build/test 성공은 아니다.
| 항목 | 확인 경로 |
| --- | --- |
| GoogleTest | `C:/git/googletest` |
| MKL CMake config | `C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl` |
| TBB CMake config | `C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb` |
| HDF5 CMake config | `C:/Program Files/HDF_Group/HDF5/2.1.1/cmake` |
| Ninja executable | `C:/Program Files/Microsoft Visual Studio/18/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe` |
VS `18/Community` DevShell script/dll이 존재하며 Ninja는 현재 PATH에 없다. Planning/Executor는 각 실행 subprocess의 MSVC x64 Developer 환경과 dependency 환경을 명시해야 한다.
Root는 global environment, Hook state/code를 변경하지 않았다.
후속 Root read-only `Get-Command`에서 `python`, `uv`, `cmake`, `ctest`, `codex`가 해석되었다. Codex launcher는 `C:/Users/baram/AppData/Local/Programs/OpenAI/Codex/bin/codex.exe`다. Launcher 실행·로그인·설정 변경은 없었고 tool availability는 Harness transport 성공 evidence가 아니다.
추가 Root read-only 확인: Python `3.11.15`, oneMKL `mkl_rt.lib`/`bin/mkl_rt.3.dll` 및 FEAST 선언이 존재한다.
현재 작업 경로는 primary `C:/git/FESADev`의 linked worktree이며 branch는 `Eigen`이다.
Implementation profile은 `gpt-5.6-terra` / `xhigh` / `workspace-write`이고 당시 configure/link/runtime는 미실행이었다.
Root가 읽은 현재 config schema는 dependency environment/cacheVariables를 직접 받지 않으며, root preset은 dependency `$env{...}` 값을 cacheVariables로 지정한다.
개별 subprocess environment가 부모 Stop process에 전파된다고 가정하지 않는다. Planning은 실제 Hook backend/환경과 CMake cache·preset을 함께 대조한다.
AGENTS의 Ninja preset은 예시이며 필수 검증은 MSVC/x64/Debug CMake/CTest다. 자동 감지의 VS18 cache 재사용도 현재 환경에서 가능한지 평가할 수 있으나,
과거 native sandbox의 FileTracker 한계와 현재 runner 정책까지 확인해야 한다. 당시 backend 선택·config 변경·실행은 하지 않았으며 이후 Root의 configure 환경 교정은 아래에 구분해 기록한다.
현재 `.harness/config.json`은 없고 preset과 `.harness/config.example.json`은 있다.
Planning은 자동 감지 결과와 승인 MSVC preset을 대조하여 실행명령 및 Hook backend를 명시해야 한다.
`scripts/execute.py`의 preflight는 selected phase 제어 파일 외의 dirty 경로를 거부한다.
따라서 구현 실행 전에 Feature 문서 baseline과 Executor의 path-scoped Git 처리 경계를 Planning에서 구체화한다.
이 관찰은 환경 실패 판정이나 별도 사용자 승인 요청이 아니다.
Root가 전달한 자동 Stop hook configure 실패는 별도의 실제 환경 evidence로 보존한다.
실행 명령은 `C:/Program Files/CMake/bin/cmake.exe -S C:/Users/baram/orca/workspaces/FESADev/Eigen -B C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build -A x64`, exit code `1`이며
`cmake/FesaDependencies.cmake:9`에서 `FESA_GTEST_SOURCE_DIR` 미설정을 보고했다.
Root의 read-only 원인 조사에서 현재 process의 `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`가 모두 미설정이고,
자동 감지는 `Visual Studio 18` generator를 사용하며 local config가 없어 승인 Ninja/MSVC preset과 맞지 않음이 확인되었다.
당시 수동 Hook·CMake·CTest 재실행, config 변경 또는 Hook state 조작은 하지 않았다.
당시 requirements gate의 critical 질량 선택과 별개로 Implementation Planning에서 dependency 경로·설정된 backend를 준비하고 검증하도록 보존한 기록이다.
이 실패를 build/test 통과로 보고하거나 현 단계의 미실행 검증을 대체하는 증거로 사용하지 않는다.
### Root의 configure 환경 교정 확인
2026-09-06 Root는 사용자 지정 GoogleTest와 확인된 dependency 경로로 기존 자동 감지 backend의 cache를 구성하고 이전 실패 명령을 재확인했다.
```powershell
cmake -S . -B .harness/build -A x64 "-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" "-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" "-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" "-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
cmake -S C:/Users/baram/orca/workspaces/FESADev/Eigen -B C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build -A x64
```
각 명령 exit `0`이며 실행 시간은 약 5초와 1.5초였다. `CMakeCache.txt`의 dependency 경로 4개 및 `Visual Studio 18 2026`/x64를 확인했고 MKL `2026.1`, dynamic/`intel_ilp64`/`intel_thread`가 선택되었다.
Cache는 Git ignored이며 source·설정·Hook code/state를 변경하지 않았다. 수동 Hook·build·CTest·FEAST 실행은 없었다.
이전 configure 원인은 해소되었지만 build/link/test 또는 feature TDD gate 통과 evidence는 아니다. Planning은 실제 backend와 cache를 대조하고 Debug를 build `--config Debug` 및 CTest `-C Debug`로 명시해야 한다.
### 자동 Stop baseline 중단 관찰
Root가 기존 CTest PID `21104`의 `--test-dir .harness/build -C Debug --output-on-failure` 실행을 read-only로 관찰했다.
362개 중 test 355 `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame`는 약 193.43초 뒤 `Test Failed`를 기록했고, test 356 `Projects729WideRowsTo2187LogicalRowsPerFamily`는 보고 시점에 진행 중이었다.
원시 출력은 `.harness/build/Testing/Temporary/LastTest.log.tmpe803a`에 있다. 실패 출력은 RUN 이후 종료되어 원인을 아직 단정하지 않는다. 최종 CTest exit code도 아직 없다.
이 관찰은 신규 source 변경 없는 baseline 실행이며 feature correction budget을 사용하지 않는다. Root가 최종 결과·환경 원인을 추적하고 Planning/Implementation 전에 분류할 evidence로 전달한다.
일부 앞선 nonlinear reference test가 약 460초 뒤 통과한 사실은 전체 suite 통과를 뜻하지 않는다. 수동 중복 test·Hook 또는 source 수정은 수행하지 않았다.
Root의 후속 관찰에서 CTest와 parent/test process는 종료되었다. Observer shell은 exit `0`이지만 관찰한 `ctest.ExitCode`는 빈 값이어서 CTest 실제 종료 코드는 확인하지 못했다.
Raw log 집계는 `354 Test Passed`, `1 Test Failed`, 요청 362개 중 완료 기록 355개로 suite가 미완료다. 첫 실패의 solver log는 target 0.3 iteration 2 continue에서, 후속 test는 target 0.5 iteration 3 accepted에서 끝났고 후속 test의 완결 HDF5는 없다.
이 evidence만으로 코드 결함, timeout 또는 turn interruption 중 원인을 선택하지 않는다. 관련 Windows ApplicationError 기록도 확인되지 않았다.
Root가 원시 CTest 기록을 Git ignored `.harness/build/baseline-before-mitc4-eigen/`에 복사 보존했다. `LastTest.log.tmpe803a` 크기는 `592656` bytes이며 현재 활성 build/test process는 없다.
Planning/Implementation은 이 중단 baseline과 구분되는 실제 전체 suite exit code 및 완전한 결과를 확보해야 한다. 관찰 shell의 성공을 CTest 성공으로 대체하지 않는다.
Root는 활성 중복 실행이 없음을 확인한 뒤 아래 단독 재현을 같은 source/test/환경으로 실행했다.
```powershell
ctest --test-dir .harness/build -C Debug -R '^ShellSurfacePressureReference\.SelectsUniqueSchemaOneFactorOneAcceptedFrame$' --output-on-failure
```
Managed session `2839`의 실제 exit는 `0`, `1/1 passed`, 전체 실행 시간 `636.99`초였다. 이전 실패는 동일 조건에서 재현되지 않았지만 최초 중단 원인을 확정하지 않는다.
기록은 Git ignored `.harness/build/baseline-before-mitc4-eigen/focused-rerun/`의 로그 및 `observation.json`에 있고, `LastTest.log` SHA-256은 `56e13949bf6af8b43c9a9177d1e261d1a13b115ac688c4f86318aa8156ae3690`이다.
전체 362개 suite 통과나 새 feature TDD evidence는 아니다. 현재 해당 단독 실행은 종료되었다.
Root의 read-only 관찰에서 이 test는 `fesa_solver.lib` mtime에 따라 기존 HDF5를 재사용한다. Planning/Implementation은 영향받는 최종 reference 검증이 새 binary에 대한 fresh solve인지 명시적으로 확인해야 한다.
Root는 이전 중단에서 미관찰된 나머지 pressure 7개를 같은 binary와 위 단독 재현의 fresh HDF5로 확인했다.
```powershell
ctest --test-dir .harness/build -C Debug -R '^ShellSurfacePressureReference\.' -E '(AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts|SelectsUniqueSchemaOneFactorOneAcceptedFrame)$' --output-on-failure
```
Exit `0`, `7/7 passed`, `1.09`초이며 Git ignored `.harness/build/baseline-before-mitc4-eigen/remaining-pressure-tests/`의 `LastTest.log`/`observation.json`에 보존했다.
로그 SHA-256은 `60823270ffc3c9386a5936ddc8f3ac3fb89a5895412046b2689216ec7a50472f`다. 변경 전 baseline의 중단 실행 354 pass, 단독 재현 1 pass, 나머지 7 pass를 각각 확보했으나 단일 전체 suite 성공으로 합쳐 보고하지 않는다.
Root의 baseline 분류 작업은 종료되었고 source/test/환경/reference 변경은 없었다. 새 binary의 TDD·전체 suite·fresh reference 검증은 Implementation owner의 필수 작업이다.
Root의 read-only 시간 집계는 보존된 355개 duration 합 `1228.04`초에서 중단된 pressure `193.43`초를 성공 단독 실행 `636.97`초로 대체하고 나머지 7개 `1.09`초를 더한 `1672.67`초(약 27.9분)다.
이는 서로 다른 관찰의 합산 추정이며 실제 단일 전체 suite wall time 또는 pass evidence가 아니다. Planning은 full VERIFY와 fresh reference solve의 실제 소요를 고려하되 이 추정으로 timeout 변경·test 생략·검증 축소를 승인받았다고 해석하지 않는다.
### Executor와 등록 Stop의 실행시간 경계
Coordinator의 read-only `rg`/`Get-Content`(exit `0`)에서 [Executor](../../scripts/execute.py)의 `CODEX_TIMEOUT_SECONDS=1800`이 각 Codex `subprocess.run`의 전체 coding/RED/build/VERIFY session에 적용되고 별도 CLI timeout 인수가 없음을 확인했다.
Root의 후속 read-only 조사(실제 adapter 구성 import `python -B -`, exit `0`)는 다음 경계를 확인했다.
| 경계 | 현재 실제 설정 |
| --- | --- |
| [.codex/hooks.json](../../.codex/hooks.json) 등록 Stop | outer timeout 1800초 |
| [stop_validation.py](../../scripts/hooks/stop_validation.py) | `TOTAL_TIMEOUT_SECONDS=1800`; repo/toolchain/configure/build/discovery/CTest 전체 shared deadline |
| [models.py](../../scripts/msvc_harness/models.py) | `CommandSpec.timeout_seconds=1800` |
| [process.py](../../scripts/msvc_harness/process.py) | 각 command cap과 shared remaining의 최솟값 사용 |
| [config.py](../../scripts/msvc_harness/config.py) 및 실제 adapter | local config 없음, timeout field 지원 없음/unknown key 거부; 자동 CMake/VS18/x64/Debug plan은 각 command cap1800, preset 없음 |
이 관찰은 Hook 실행이나 실제 timeout 실패가 아니다. 전체 VERIFY 합산 추정과 비교하면 coding/RED/build 및 등록 Stop까지 포함할 여유가 작으며 Executor만 변경해도 다른 cap은 늘지 않는다.
Planning은 기존 지원 설정 유무와 실제 full/fresh VERIFY를 대조해 최소 실행 방식을 구체화해야 한다. 기존 knob가 없다면 Root가 확인한 사용자 실행 승인 범위 안의 필요한 가역적 운영 개선으로, 대응 Harness tests를 갖춘 bounded timeout 설정/수정을 검토할 수 있다. 정확한 변경·owned paths·검증은 계획이 확정하며 현재 어떤 runtime/config/source도 수정하지 않았다.
Sandbox, transport retry 횟수·증거, ownership, full VERIFY 및 Hook 검증 의미는 유지한다. Cached reference를 새 실행으로 주장하거나 unobserved process로 deadline을 피하지 않는다. Runtime 변경 자체로 새 사용자 승인 gate를 만들지 않되 별도의 명시 critical boundary가 생기면 그 규칙을 따른다.
Planning의 실제 helper 대조에서 nonlinear `RunFesaApplicationOnCopiedInput()`은 매번 FESA application을 호출하므로 pressure 일부 helper의 cache로 전체 prep VERIFY가 빨라진다고 가정할 수 없음이 확인되었다. 또한 `process.execute_plan`의 default shared fallback과 prep Codex launch 당시 등록된 Stop outer cap의 수명도 대조해야 한다.
Root는 사용자 승인된 가역적 운영준비 범위 안에서, 실제 repository `StepExecutor`/`main`을 호출하기 직전 **단 하나의 유한 `CODEX_TIMEOUT_SECONDS` 값만 지정하는 one-time Python module invocation**을 계획에 명시할 수 있다고 판단했다. 이는 기존 CLI timeout option이 아니며 아직 실행하지 않았다. 정확한 값·명령·activation 경계는 Planning owner가 고정한다.
해당 준비 실행도 기본 `workspace-write`, native failure 뒤 별도 승인이 필요한 확대 경계, exact ownership, Executor branch/commit, full VERIFY, registered Stop, terminal result와 retry budget을 유지한다. Hook state/reentry flag, 실행 메서드, tests 또는 다른 guard를 override하지 않는다. Prep process가 이전 Stop outer 1800초를 유지할 가능성을 기록하고 실제 성공 evidence 없이 활성화를 주장하지 않는다. Active Executor 동안 Root/Coordinator의 관리문서 편집·커밋도 중지한다.
## Retry 기록
`mitc4-shell-feast-eigen|implementation|environment|r2`: actual attempt `1`, native terminal `blocked`, transport retry `0`, Correction `0`, Implementation rerun `0`이다. Specialist가 반환한 `focused-verify` 문구를 implementation gate로 정규화했으며 새로운 실패 key를 만들지 않았다.
Focused test의 마지막 적용 수정은 미검증으로 남는다. 이를 환경 실패로 통과 처리하거나 새 correction allowance로 취급하지 않는다. 환경 해소 후 같은 Step owner가 해당 test와 전체 필수 검증을 완료해야 한다.
`mitc4-shell-feast-eigen|implementation|harness|r2`: collaboration spawn 요청은 서비스 thread 한도로 거부되어 실행/allowance를 소비하지 않았다. 공식 profile의 첫 native Correction `1회`를 할당하며 같은 key의 추가 Correction은 금지한다. Implementation rerun은 아직 `0회`다. 실제 Hook 환경 key를 문구만 바꾸어 재발급한 것이 아니라 독립 재현된 분류 결함을 분리한 것이다.
동일 native thread의 continuation3에서 실제 최소 source 교정 `1회`와 새 37개 GREEN을 완료했다. 따라서 harness key의 Correction allowance는 사용되었고 두 번째 source correction은 금지한다. 전체 gate의 environment block과 향후 한 번의 Implementation rerun은 별도로 유지한다. Native/등록 Stop 종료 전후 추가 source cycle, phase transport retry 또는 history reset은 없었다.
첫 native는 collection 이전 환경 진입에서 끝나 실제 수정0이었다. Root의 새 local cache/interpreter 준비 뒤 동일 thread를 resume하는 것은 이 한 Correction의 미완료 작업을 계속하는 것이며 두 번째 corrective change나 phase transport retry가 아니다. 첫 결과와 비용·실패 이력은 삭제하지 않는다.
첫 environment continuation도 제공된 hermes interpreter의 metadata 접근 거부로 collection 이전 exit `2`였다. Owner는 source/test 수정0과 미실행 검증을 보고서에 추가했고 [native continuation1 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-result.json)는 native/wrapper exit `0`, 1243.328초, branch/HEAD·비소유 bytes 불변을 확인했다. 별도 등록 Stop/CTest를 실행 중 process handle로 관찰하여 각각 exit `0`을 확보했다([실제 종료 코드](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-registered-exits.json)). 이는 classifier 수정 전 자동 검증이며 수동 full 또는 RED/GREEN 증거가 아니다. [완료 로그·보고서 archive](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-1-archive.json)에 당시 파일과 hash를 보존했다.
Root가 거부된 interpreter를 복사하거나 다른 방식으로 읽지 않고 Python3.11.15의 독립 배포본을 새 workspace ignored `.../classifier-correction/python-runtime/cpython-3.11.15-windows-x86_64-none/python.exe`에 설치했다(`uv python install --no-bin --no-registry`, exit `0`, 5.42초). 새 `workspace-python-cache`를 이용한 Root 실행 진입도 exit `0`, 2.59초, pytest9.1.1 및 해당 workspace base prefix를 확인했다. 동일 미수정 Correction/thread의 environment continuation2는 uv의 PyPI 재확인에서 network `os10051`, entry exit `2`로 collection 전에 종료했다. [실제 native 결과](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-2-result.json)는 native/wrapper exit `0`, 227.593초, branch/HEAD·비소유 bytes 불변을 확인했다. [당시 owner 보고서](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/native-continuation-2-blocked-report.md)를 보존했으며 source/test 변경 및 RED 실행은 여전히 없다.
Root는 같은 독립 workspace Python을 base로 영속 `.../classifier-correction/pytest-venv/Scripts/python.exe`를 만들고 cached pytest9.1.1을 offline 설치했다. 생성·설치·직접 import는 exit `0`, 1.49초이며 별도 PowerShell의 직접 import도 exit `0`, 0.89초다. 동일 thread의 environment continuation3는 이 영속 interpreter를 직접 사용한다. 정상적인 대안은 같은 workspace runtime/cache의 `uv run --offline`이며, 필요 시 새 ignored pytest cache 및 고유 `--basetemp` 경로를 사용한다. 두 정상 진입 대안을 같은 작업 안에서 확인하되 거부된 기존 cache/interpreter 접근·network·권한 확대·test skip은 허용하지 않는다. 준비된 Root 환경 성공은 native RED/GREEN 증거가 아니며 실제 실행을 기다린다. 같은 미완료 Correction attempt `1`과 원시 이력을 유지한다.
-112
View File
@@ -1,112 +0,0 @@
# Source echo classifier 최소 교정 결과
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `correction-agent`
- Input contract revision: `r2`
- Outcome: `blocked-environment`; 다음 owner: `coordinator-agent`
- Dispatched failure_classification: `harness`
- Retry key: `mitc4-shell-feast-eigen|implementation|harness|r2`
- Attempt: `1`; 동일 unfinished assignment에서 ONE minimal correction을 수행했다. 이전 환경 continuation은 추가 allowance 또는 phase transport retry가 아니다.
기준: [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [MFE-ADR-012](ADR.md#mfe-adr-012--source-echo-분류-오탐의-bounded-운영-correction),
[dispatch](coordination.md), [implementation-plan](implementation-plan.md), [환경](implementation-environment.md),
[복구 R4](implementation-recovery.md#r4-조건부-exact-dfa-invocation과-후속-검증), [verification](implementation-verification.md),
[prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md).
Trace: `FEM-REQ-MITC4-EIGEN-023/025`, `MFE-C27`, `IO-T11`.
## 핵심 결과
**Source echo 오탐은 교정됐고 신규 37개 회귀가 통과했다.**
전체 gate는 MSVC build의 환경 접근 거부와 protected Hook timeout 불일치로 미완료다.
Full pytest는 `152 passed, 1 failed`이며 실패 assertion을 변경하거나 제외하지 않았다.
Production 변경은 [execute.py](../../scripts/execute.py)의 기존 `_codex_environment_failure`와
새 private `_stdout_has_helper_failure`뿐이다. Stderr helper 검사를 유지하고 stdout은
runtime prefix 또는 구조화된 `error/turn.failed`를 판별한다. Failed command의 출력도
runtime prefix를 확인한다. 성공 command의 source/command payload와 agent의 source 설명을
runtime failure로 사용하지 않는다. Auth/CLI 진단, terminal/history, retry, sandbox, ownership 함수는 변경하지 않았다.
[사전 재현](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-baseline.json)은 수정 전 synthetic source excerpt와 archive raw 모두의 잘못된 helper 판정을 기록한다.
[교정 후 audit](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-corrected-audit.json)은 같은 archive에서 helper 판정 `null` 및
원래 명시적 Hook 쓰기 거부 사유의 `reported-blocked`를 확인한다. Historical phase/history/raw를 수정한 것이 아니다.
AST 비교도 위 두 method만의 변경을 확인했다.
## RED → GREEN 및 검증
실행 Python은 workspace의
`C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build/mitc4-eigen-evidence/prep/classifier-correction/pytest-venv/Scripts/python.exe`이며
Python `3.11.15` / pytest `9.1.1`이다. Direct entry는 성공했고 uv/network fallback은 사용하지 않았다.
Python 명령은 `-B -X utf8 -m pytest -v -rs`, 허용된 workspace `cache_dir`와 실행별 새 `--basetemp`를 사용했다.
최초 RED만 기본 temp와 UTF-8 옵션 전 명령이었다. 실제 absolute command, stdout/stderr 경로·hash 및
전체 parameter inventory는 [검증 summary](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-verification-summary.json)와 각 실행 JSON에 있다.
| 실행 / exact command record | Exit | Wall seconds | 실제 결과 |
| --- | ---: | ---: | --- |
| [최초 RED](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-red.json) | 1 | 4.2882233 | 6 failed, 16 passed, 15 setup errors; 기본 `pytest-of-Mimi` temp 접근 거부를 별도 분류 |
| [새 workspace temp RED](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-red-workspace-temp.json) | 1 | 8.1127850 | **21 failed, 16 passed**, 37 selected/36 deselected; setup errors 0 |
| [같은 targeted GREEN](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-green.json) | 0 | 8.8222791 | **37 passed**, 36 deselected; pytest 자체 duration 8.03 s |
| [Step0 전체 focused](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-focused.json) | 1 | 45.3687980 | 135 passed, 1 failed; pytest duration 44.58 s |
| [`cmake -S . -B .harness/build -A x64`](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-configure.json) | 0 | 0.8602958 | VS18/MSVC/x64 cache configure 완료 |
| [`cmake --build .harness/build --config Debug`](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-build.json) | 1 | 0.5442108 | FileTracker 초기화 접근 거부 |
| [전체 pytest](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-full-pytest.json) | 1 | 45.8682791 | **152 passed, 1 failed**, skip 0; pytest duration 45.03 s |
새 필수 tests는 [test_execute.py](../../tests/test_execute.py)의
`test_environment_classifier_ignores_successful_source_echo` 6 cases,
`test_environment_classifier_retains_runtime_helper_failure` 16 cases,
`test_successful_source_echo_preserves_terminal_and_retry` 15 cases다.
RED에서 6개 echo 오판과 15개 terminal/retry 오판을 관찰한 **뒤** production을 수정했다.
처음부터 통과한 true-runtime 16개를 새 RED로 주장하지 않는다.
GREEN은 stdout/stderr의 실제 helper failure를 exit0/1에서 유지하고 mixed echo+failure도 차단한다.
Completed/exit0, explicit error/blocked의 원래 reason/history, pending missing-result,
nonzero/124만으로 retry 금지, 실제 wrapper timeout의 최대2회 시도 및 terminal 우선 처리를 확인했다.
Focused는 지정된 timeout/Executor/ownership/Hook scope/preset 전체 targets를 포함한다.
기존 timeout tests의 마지막 `.value` 수정도 focused/full에서 실제 통과했으며 해당 파일은 수정하지 않았다.
## 남은 환경 blocker와 미실행 gate
[Build stdout](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-build.stdout.log)의 결정적 실패는
`ZERO_CHECK.vcxproj`의 `GetOutOfDateItems` → `Microsoft.Build.Utilities.FileTracker`
type initializer에서 발생한 `MSB4018 / UnauthorizedAccessException / 0x80070005 (E_ACCESSDENIED)`다.
Source compile correctness 실패로 재해석하거나 build guard를 변경하지 않았다.
선행 full build 실패에 따라 아래 CTest 명령은 미실행이며 count/exit/duration을 주장하지 않는다.
- `ctest --test-dir .harness/build -C Debug --show-only=json-v1`
- `ctest --test-dir .harness/build -C Debug --output-on-failure`
[Focused/full pytest failure](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-full-pytest.stdout.log)는
`tests/test_harness_timeouts.py:175 / test_registered_hook_and_one_time_invocation_contract`의
`assert 1800 == 7500` 한 건이다. Protected `.codex/hooks.json`은 편집하지 않았고 해당 test도 유지했다.
두 환경 blocker 해소 후 승인된 full build/CTest와 전체 pytest 검증이 남아 있다.
기존 registered Stop/CTest의 source 변경 전 `362 tests / exit0` 관찰은 이번 manual full evidence를 대신하지 않는다.
등록 Stop은 활성 상태 그대로이며 수동 호출·state 조작 없이 이번 최종 결과는 보고 시점 미관찰이다.
이 운영 correction에는 별도 eigen/reference comparison이 적용되지 않는다.
## 이전 환경 진입 이력
| Entry | 보존된 결과 |
| --- | --- |
| [최초 기본 uv entry](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906020757Z-red-entry.json) | exit2 / 0.0395046 s; 사용자 cache 접근 거부, collection 전 중단 |
| [continuation1](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906021629Z-continuation-entry-failure.json) | exit2 / managed 0.133794 s; hermes interpreter metadata 접근 거부 |
| [continuation2](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906024054Z-continuation2-entry.json) | exit2 / 11.5178819 s; PyPI network os10051, Python 실행 전 중단 |
각 환경-only entry와 이전 blocked 보고서/native records는 보존했다.
이번 named venv 및 새 temp 선택은 Coordinator가 허용한 동일 correction의 환경 해소이며
접근 거부된 cache/interpreter 재접근, network 사용 또는 sandbox 확대는 없었다.
## 소유 파일과 인계
| Changed artifact | SHA-256 |
| --- | --- |
| `scripts/execute.py` | `64f5165fc544b3b17904c633ef3b222de79b52a0960e254c5b5c4eb99e79c2d0` |
| `tests/test_execute.py` | `0eb0c1ca0f25199e00686b7e3ab57672b1390437d09da218a929added0346dd6` |
이 보고서의 hash와 non-owned byte/branch/HEAD/link 검토는 [최종 audit](../../.harness/build/mitc4-eigen-evidence/prep/classifier-correction/20260906025404Z-continuation3-final-audit.json)에 둔다.
정확히 지정된 source/test/report 3개와 허용된 ignored evidence/cache/temp만 변경했다.
Coordinator의 dirty management 2개, upstream, phase/status/history, reference와 native records는 보존한다.
Branch `feat-mitc4-shell-feast-eigen-execution-prep`, HEAD `5dfbea7e543b64fdefcea292de43237adb790a72`를 유지한다.
Root Git writes, phase Executor, peer dispatch, 외부 solver, physics/release 승인 또는 workflow 전이는 없다.
ONE minimal correction 이후 추가 수정 cycle은 수행하지 않는다. Targeted 교정 성공과 전체 gate의
`blocked-environment`를 구분하여 Coordinator에 반환한다. 환경 해소·exact-run 조건 감사와
한 번의 후속 Implementation rerun dispatch는 Coordinator 소유이며 즉시 `retry`로 전이시키지 않는다.
@@ -0,0 +1,33 @@
# 이전 MFE 실행 실패와 Handoff
## 현재 위치
이전 `mitc4-shell-feast-eigen`의 준비 작업은 현행 구현 절차가 아니다. 재시도 계획·
Hook/Stop trust 설정·bounded dispatch·stage 소유권과 개인 workspace 복구 명령은 제거했다.
실제 구현은 [mitc4-shell-feast-eigen2](../mitc4-shell-feast-eigen2/README.md)에서 완료됐다.
이전 pass/timeout/test 수를 새 기능의 완료 evidence로 승계하지 않는다.
## 실패와 재발 방지
- Source를 출력한 stdout를 runtime error로 오분류한 문제가 있었다. exit 0의 source echo와
실제 helper failure를 구분하도록 교정했다. 당시 targeted RED 21 failed/16 passed → GREEN 37 passed.
- 교정 시 전체 pytest는 152 passed/1 failed였고 MSVC build는 FileTracker 접근 거부로 실패했다.
targeted pass를 전체 pass로 표시하지 않는다. Hook 쓰기 거부는 승인된 수식의 실패가 아니다.
- `FileTracker`의 `UnauthorizedAccessException`/`0x80070005`와 CMake discovery 실패는 별도로 진단한다.
같은 환경 실패를 반복하지 말고 실제 실행 argv·compiler·dependency·exit를 확인한다.
- MSVC x64+Ninja preset을 사용하며 compiler 경로의 `Hostx64`/`HostX64` 문자열 차이로 cache가
재초기화된 사례가 있었다. 부모 환경 설정과 child 설정의 유효 범위를 확인한다.
- 과거 자동 실행은 362 tests/exit0 기록이 있지만 수동 build는 여전히 실패한 시점이 있었다.
서로 다른 실행을 하나의 성공으로 합치지 않는다. 프로세스 PID/출력만으로 native exit를 추정하지 않는다.
- 출력 파일 lease 경합의 `output-busy`는 수식 오류나 reference 불일치와 다르다.
병렬 검사끼리 같은 최종 경로를 공유하지 않는지 확인한다.
- 개인 `.harness/config.json`·`CMakeUserPresets.json`과 당시 14400/7500/7200초의 timeout은
그 workspace 실행 이력이다. 현재 Hook를 복원하거나 공통 기본값으로 강제하지 않는다.
## 재사용과 evidence 경계
MFE 요구사항 ID·ADR, 질량·stabilization·축소 유도 및 rational 반례는 이 폴더에 남긴다.
현재의 FEAST residual stopping·모드별5%·S3 보류와 실제 실행은 eigen2가 소유한다.
환경 준비와 검사 명령은 [operations](../operations.md)·[HARNESS](../HARNESS.md)를 따른다.
원문 실행 로그·복구 계획은 Git `858e87b`의 기존 경로에 남아 있다. 현재 checkout에
존재하지 않는 ignored artifact는 당시 evidence 위치이며 재실행·검증 근거가 새로 생긴 것은 아니다.
@@ -1,286 +0,0 @@
# 제약 후 질량 공간, 유한 spectrum과 FEAST
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `formulation-agent`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md)
[질량 유도 M1~M10](formulation-mass.md), [research evidence](research-evidence.md)의
`S03`~`S08`, `P01`, `R03/R04/R07`를 적용한다. 아래 reduction은
[r2 scale](formulation-stabilization.md)로 개선된 원형상 stabilized stiffness와
**derived lumped mass**의 pencil에 정확히 대응한다. 기존 nonlinear trial tangent와는 별개다.
## E1. 조립, 단위 scaling과 실제 global 제약
Element gather `A_e`를 stable source node/component 순서로 정의하면
`K=sum A_e^T K_e A_e`, `M=sum A_e^T M_L,e A_e`이다. 이하 `M`은 항상 lumped이다.
Element contribution→stable COO key→고정 순서 reduction으로 두 행렬을 조립한다.
Lumped nodal block이므로 `M`의 node 간 block은 0이다. Worker는 global storage를
동시에 갱신하지 않는다. Source identity와 equation index는 다른 번호다.
혼합 단위를 가진 6 DOF를 그대로 Euclidean norm으로 합하지 않는다.
활성 shell의 기존 최대 edge 길이들 중 최대값 `ell>0 [L]`을 characteristic length로
선택하고 `D=blockdiag(ell I3,I3)`를 node마다 둔다. `q=D y`에서 `y`는 무차원,
`Khat=D^T K D [ML²/T²]`, `Mhat=D^T M D [ML²]`이다.
이는 congruence이며 physics와 lambda를 변경하지 않는다.
원 global homogeneous BC의 free injection을 `C`라 한다. 고정 DOF의 행은 0,
free DOF의 행은 하나의 1이며 free 순서는 DofManager의 stable 순서다.
\[
y=C y_f,\qquad K_f=C^TKhat C,\qquad M_f=C^TMhat C. \tag{E1}
\]
Nonzero prescribed base state는 이 procedure의 입력 오류다. 먼저 local 회전을 임의
삭제한 뒤 global BC를 적용하지 않는다. 특히 global `UR3`와 drilling은 같지 않다.
## E2. Null/positive basis를 node마다 결정
각 active node의 원 질량 null은 M8로부터 `z_i=[0;d_i]` 한 방향이다.
따라서 node별 실제 free 좌표에서 null이 존재하는 필요충분조건은
**constrained rotational component마다 해당 `d_i` 성분이 정확히 0**인 것이다.
그때 `Z_i=C_i^T z_i`는 unit null vector이며 otherwise null dimension은 0이다.
Translation constraint는 이 판정에 영향을 주지 않는다. 모든 회전이 고정이면 null도 없다.
이 판정은 analytic nullspace와 실제 입력 BC의 교집합이다. 작은 nonzero constrained
director 성분을 임계값으로 0으로 바꾸지 않는다. 거의 정렬된 경우 작은 양의 physical
mass가 남을 수 있으며 이를 보존한다. Numerical conditioning 검증을 통과하지 못하면
명시적 실패로 처리하고 free DOF를 추가 삭제하지 않는다.
각 node에서 `Z_i`의 Euclidean 직교 여공간 basis를 `P_i^f`라 한다.
회전 3개가 free이면 기존 tangent basis `(a_i,b_i)`를 사용할 수 있다. Free 회전 2개
안에 null이 있으면 그 평면에서 `d_i`에 수직인 단위벡터 하나, 회전 1개가 null이면
positive 회전 basis는 없다. Free translation axis는 그대로 유지한다.
Null이 없으면 `P_i^f=I`다. Source component 순서, basis sign/tie는 고정한다.
Householder 등 동등한 작은 orthogonal construction을 쓸 수 있으나 physical rank를
수치 eigenvalue cutoff로 정하지 않는다.
\[
P=\operatorname{blockdiag}(P_i^f),\quad Z=\operatorname{blockdiag}(Z_i),\quad
[P\ Z]^T[P\ Z]=I,\quad M_p=P^TM_fP\succ0,\quad M_fZ=0. \tag{E2}
\]
여기서 `P_i^f`와 [M2의 tangent projector](formulation-mass.md)는 서로 다른 기호다.
실제 positive dimension `n=cols(P)`, null dimension `nz=cols(Z)`이다.
Reference의 full clamped flat mesh에서는 625개 interior node,
`nf=3750`, `nz=625`, `n=3125`가 예상된다. 실제 assembly와 rank evidence로 확인한다.
## E3. 개선된 stiffness에서 decoupling의 정확한 증명
공통 node director는 [shell geometry](../../src/fesa/model/shell_geometry.cpp)가 한 번
정의하고 [ElementFactory::CreateShell](../../src/fesa/elements/element_factory.cpp)이
node identity로 각 element에 전달한다. [MITC4 kernel](../../src/fesa/elements/mitc4_shell.cpp)의
`PhysicalTransformation20`, `DrillingTransformation4`, `Stiffness`에서 M4의 구조를 확인했다.
옛 계수만 [S1/S2](formulation-stabilization.md)로 대체하며 모든 incident element의
`k_d,e`는 finite positive다. Physical kernel과 공통 director·nodal drill map은 그대로다.
한 node에만 `[0;d_i]`가 있는 full vector `z_i`에 대해 `T_p A_e z_i=0`이다.
Drilling 부분은 해당 node에만 작용하므로
\[
Khat z_i=\kappa_i z_i,\qquad
\kappa_i=\sum_{e\ni i}k_{d,e}>0,\qquad
K_f Z=Z\operatorname{diag}(\kappa_i). \tag{E3}
\]
마지막 등식은 E2에서 `z_i`가 **실제로 free space에 있을 때** 성립한다.
따라서
\[
K_{pz}=P^TK_fZ=0,\quad K_{zz}=Z^TK_fZ=\operatorname{diag}(\kappa_i)\succ0,
\quad K_p=P^TK_fP,\qquad K_p p=\lambda M_p p. \tag{E4}
\]
Finite mode의 massless 성분은 `z=0`이다. 이 projection은 arbitrary small coupling을
버리는 근사가 아니라 승인된 physical/drilling separation의 항등식이다.
Null이 없는 부분 제약 node에서는 `P=I`이고 개선된 drilling contribution이 `K_p`에
그대로 남는다. 이를 빼면 원 constrained stabilized pencil을 바꾸므로 금지한다.
여기서 원 pencil은 r2의 실제 BC 적용 후 K/M이다. 옛 K와 새 K의 spectrum 동일성은
요구하지 않는다. S3의 complete K 공변성은 이 partial-BC contribution까지 포함한다.
실제 floating-point matrix와 basis의 `M_f Z`, `K_fZ-Z diag(kappa)`, `P^T Z`를
별도 evidence로 남긴다. 증명된 analytic null만 구조적으로 제거하고 계산된 tiny coupling을
근거 없이 threshold로 버리지 않는다. 이 항등식의 roundoff 검증 및 복원 후 full free
residual이 NR 기준을 넘으면 assembly/director/conditioning 실패로 중단한다.
추가 massless mode를 찾아 제거하거나 개선된 K를 재조정하지 않는다.
S5의 nonlinear Hessian에는 corotation coupling이 있으므로 E3/E4를 모든 nonlinear
상태, preload 또는 prestressed eigenproblem에 적용하지 않는다.
## E4. 일반 Schur 식과 비정상 rank의 의미
E3의 구조가 없는 일반 symmetric pencil을 비교하면, `Kzz`가 가역일 때만
\[
z=-K_{zz}^{-1}K_{zp}p,\quad
(K_{pp}-K_{pz}K_{zz}^{-1}K_{zp})p=\lambda M_p p. \tag{E5}
\]
이는 massless row를 푼 정확한 elimination이며 massive DOF의 근사 Guyan reduction이
아니다. 예를 들어 `K=[[6,2],[2,4]]`, `M=diag(2,0)`이면
`lambda=5/2`, `z=-p/2`이다. 첫 행만 남기는 `lambda=3`은 잘못이다.
E5는 independent small-pencil 검산과 잘못된 projection을 잡는 기준이다.
이 Feature의 production shell 경로에는 E3이 적용되므로 일반 dense Schur 구현을 요구하지
않는다. E3과 불일치하는 input을 E5로 자동 fallback하여 승인 geometry 문제를 숨기지 않는다.
- `nz=0`: null 처리 없이 실제 constrained `Kf,Mf`의 문제다.
- Local positive rank 0: 모든 free DOF가 null이면 해당 node의 finite 좌표는 없고
양의 `Kzz`에 의해 그 free coordinate는 0으로 복원한다. Fully constrained node도
finite 좌표 0개다. 다른 node의 유효 finite 좌표는 계속 보존한다.
- Global `n=0` 또는 `N>n`: 요청 모드가 존재할 수 없으므로 명시적 model/solve 실패다.
정적 해석의 유효 `0×0 Kff` 계약과 이 양의 mode-count 요구를 혼동하지 않는다.
- 예상 `Kzz`가 singular/nonpositive이거나 활성 node에 mass contribution이 없음:
유효 shell의 E3 전제가 깨진 것이다. Common `K/M` null이면 임의 lambda에 대한
indeterminate direction이며 ordinary finite eigenmode가 아니다. 제거하거나 pseudoinverse,
stiffness/mass epsilon으로 정규화하지 않고 진단한다.
- 일반 indefinite `Kzz`의 singular/nonzero `Kpz` case는 descriptor-pencil의 추가
constraint를 요구한다. 이번 positive stabilized shell과 다른 문제이며 자동 해석하지 않는다.
## E5. SPD whitening, 복원과 sparsity
`M_p`는 node별 최대 `6×6` SPD block이다. 각 block을 Cholesky하여
`M_p=L L^T`를 얻고 다음을 정의한다.
\[
A=L^{-1}K_pL^{-T},\quad p=L^{-T}x,\quad
A x=\lambda I x,\quad
\phi=D C P L^{-T}x. \tag{E6}
\]
Inverse를 dense global matrix로 만들지 않고 작은 block triangular solve로 congruence를
구성한다. `phi`는 source node의 global 6 DOF로 복원되고 constrained entries는 정확히 0이다.
`phi^T M phi=x^T x`다. Identity mass를 전달하는 E6도 실제 lumped mass에서 얻은
generalized SPD 문제다. Consistent mass 또는 인공 unit physical mass로 바꾼 것이 아니다.
Projection/whitening은 node 간 topology를 늘리지 않는다. 기존 node coupling마다 작은
dense block만 생기며 전체 `O(n²)` Schur matrix와 dense inverse를 피한다.
Sparse shifted FEAST factorization 자체의 fill은 별도 존재한다. Full `M_C`는 element별
`24×24`와 세 `4×4` moment로 검증할 수 있고 global dense consistent matrix는 불필요하다.
Allocation/nnz/factorization memory 실패는 불완전 모드의 성공이 아니라 명시적 failure다.
## E6. 유한 search interval과 요청 개수
요청 `N`은 `.inp *FREQUENCY`의 양의 정수이며 현재 reference는 10이다.
Reference Value/Freq/행수는 interval, scale, count 또는 parameter 선정에 사용하지 않는다.
먼저 `s=||A||inf [T^-2]`를 안정된 합으로 계산한다. `s>0`이면 `B=A/s`로 두고,
반환값은 `lambda=s mu`다. `A=0`이면 `s=min_e E_e/(rho_e ell²)>0`라는
모델 유래 time scale을 사용하며 `B=0`이다. 이 zero-matrix case도 N개의 0 모드를
FEAST에서 계산·검증한다. Invalid/underflow/overflow scale을 임의 1로 바꾸지 않는다.
각 행의 off-diagonal absolute sum을 `r_i`라 하면 Gershgorin에 의해
`min_i(Bii-ri)<=mu<=max_i(Bii+ri)`다. 안정된 directed-outward accumulation 또는
동등하게 증명된 roundoff bound를 포함하여 finite enclosure `[gL,gU]`를 만든다.
`B=0`에서는 알고리즘용 dimensionless enclosure `[-1,1]`을 사용한다.
Nonzero B의 endpoint margin은 NR가 정할 dimensionless coefficient와 `||B||inf` 및
endpoint ULP로 결정하고, outward `nextafter`를 적용해 `a0<gL<=gU<b0`를 확보한다.
이는 물리 mass/eigenvalue floor나 zero clamp가 아니다.
CSR count `c(a,b)`는 endpoint가 분리된 interval에 대해 Intel `fpm[49]=1`이 반환한
count와 status다. `c(a0,b0)=n`을 먼저 확인한다. 다음은 finite search의 결정적 규칙이다.
1. 모든 count는 원 enclosing lower bound `a0`부터의 prefix count로 평가한다.
`lo=a0`의 알려진 prefix count는 0, `hi=b0`의 count는 n이다.
Upper search에서 midpoint `v`의 count가 `N` 미만이면 `lo=v`, 아니면 `hi=v`로 둔다.
성공한 `hi`와 count를 항상 보존한다. `N<=count<=min(n,2N+8)`인 upper endpoint를
얻으면 이 최적화를 끝낼 수 있다. 이는 workspace 목표이며 N의 변경이나 mode cap이 아니다.
2. Cluster 때문에 목표 count로 줄일 수 없어도 `count>=N`인 마지막 safe upper를 쓴다.
Representable midpoint가 없거나 NR endpoint separation 폭에 도달하면 subdivision을
끝낸다. 경계에 있는 반복 고유치의 일부만 count하도록 tolerance를 조정하지 않는다.
3. 불필요하게 먼 lower bound를 줄이기 위해 `a=a0`, 위에서 얻은 `b=hi`로 시작한다.
`v=(a+b)/2`의 prefix count가 0이면 `a=v`로 이동하고, 양수이면 이 하한 축소를 끝낸다.
따라서 `(a0,a)`의 empty-prefix evidence를 잃지 않는다. 아주 작은 고립 cluster에서
넓은 구간이 검색 실패를 유발하는 Intel의 경고를 이 과정과 후검증으로 다룬다.
4. 최종 `(a,b)`에서 다시 count하여 `c>=N`이고 알려진 prefix와 일치함을 확인한다.
Capacity는 `m0=min(n,max(c+8,ceil(3c/2)))`로 한다. `c=n`이면 `m0=n`이다.
Checked integer arithmetic을 쓰며 큰 multiplicity도 전체 count를 수용한다.
5. Solve 성공 후 모든 `c`개를 독립 검증하고 정렬하여 첫 N개를 결과 candidate에 넣는다.
같은 eigenvalue의 multiplicity를 지우거나 평균내지 않는다. N번째가 repeated/cluster의
내부에 있으면 내부 계산 group은 보존하고 출력 row는 정확히 N개다.
Midpoint·endpoint 이동은 overflow-safe하게 수행한다. NR는 count-call budget,
endpoint separation coefficient와 perturbation 횟수를 구현 전에 고정한다. Budget은
각 search 및 endpoint 재시도까지 포함하는 유한 정수다. `-5` 등의 endpoint 실패 시
기록된 bracket 안에서 NR가 정한 간격으로 양옆의 endpoint 후보를 순서대로 평가하며,
성공한 prefix/count evidence 없이는 bracket을 갱신하지 않는다. 마지막 valid bracket이
없거나 count monotonicity/total count가 맞지 않으면 실패다. Search 최적화 budget에
도달하면 이미 검증된 enclosing bracket을 쓸 수 있으나 실패한 count를 성공으로 바꾸지 않는다.
Postsolve에서는 returned `m=c`, finite paired vectors/values, Gram rank, interval 내부
및 endpoints와의 separation을 확인한다. Endpoint에 너무 가깝거나 `info=1/2/3`,
count/solve mismatch이면 NR가 정한 유한 회수 안에서 safe bracket 확대·재count·capacity
확대만 허용한다. 매번 count/solve history를 보존한다. 그 뒤에도 불일치하면 실패하고
부분 모드 또는 다른 eigensolver로 fallback하지 않는다. Formulation은 이 수학적 알고리즘을
NR에 인계한다. 구현 진입 bundle은 다음 stage가 수치값·budget을 고정한 뒤 완성된다.
Full enclosing bound, empty-prefix, interval count와 solve-count/Gram 검증은 낮은 N개의
누락을 탐지하는 서로 다른 evidence다. Intel의 documented total count를 모든 conditioning,
endpoint 및 floating-point 상황의 completeness theorem으로 확대하지 않는다.
독립 known-spectrum의 zero/negative/cluster/repeated/size1/request=n case와 실제
설치 runtime 검증이 필수 연결점이며 선택 및 수치 기준은 NR가 소유한다.
## E7. FEAST 경계와 deterministic 실행
Actual eigenpairs는 `dfeast_scsrgv`로 E6의 `(A,I)` 또는 E6에서 동일하게 scale한
`(B,I)`를 풀어 구한다. Real symmetric, SPD second matrix, `n>0`,
`0<m0<=n`, strict finite `emin<emax`를 만족한다. `uplo=U`로 A와 identity mass의
각 CSR을 전달하며 row/column 증가 순서, duplicate-free, 1-based row pointer,
terminal `nnz+1`을 검증한다. 두 pattern이 같을 필요는 없다.
`MKL_INT`, `n`, `nnz+1`, column index와 `n*m0*sizeof(double)`의 변환/곱은 checked다.
FEAST vendor type과 scratch resource는 private backend에만 있다.
Call마다 `feastinit`한 128-entry parameter 배열에서 이번 call의 설정을 채운다.
CSR check, SPD check를 켜고 subspace-only mode는 끈다. Zero mode에도 적용할 수 있도록
trace stopping을 사용하고 독립 residual을 반드시 후검증한다. `epsout`만으로 pass하지
않는다. Contour points, stopping exponent, finite loop bound는 NR가 정한다.
User initial subspace를 선택하고 고정 seed/명시된 integer generator 및 고정 QR 순서로
full-column-rank 초기 공간을 만든다. `m0=n`에서는 identity를 쓴다.
Initial guess가 모든 eigenspace와 충분히 overlap한다는 보장은 없으므로 count/solve/Gram
검증으로 부족한 projection을 검출한다. Seed를 바꾸며 통과할 때까지 반복하지 않는다.
Backend의 thread/재현 설정과 seed는 실행 evidence에 기록한다. 동일 source 입력의
sparse structure, reduction, row 및 diagnostic 순서는 고정하며 repeated mode의 개별
벡터 방향은 수학적으로 유일하지 않다는 제한을 유지한다.
Solve는 `e,res`의 m0 entries와 column-major `x[n*m0]`를 준비하며 첫 m columns만
소비한다. Count call의 m0는 output count로 overwrite되므로 solve 요청수/실제 allocation
capacity와 분리한다. 설치 API가 count-only workspace의 작은 용량을 명시하지 않은
경우 보수적으로 count scratch는 `m0=n`, `x[n*n]`까지 준비하고 count 단계 사이에
재사용한다. Solve 전 해제할 수 있다. Reference n=3125에서 이 scratch는 약 78.1 MB
(74.5 MiB)이고 10모드의 실제 solve subspace는 이보다 작다. Count용 보수적 allocation은
dense Schur와 별개지만 `O(n²)` memory 비용이므로 Planning/Implementation이 peak 및
shifted sparse factorization fill을 측정한다. Allocation 실패 시 N을 줄이지 않는다.
Intel 근거: [API/storage/capacity](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html),
[C-index parameter와 count](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html),
[status/endpoint/고립 cluster 주의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html).
2026-09-06 확인. `info=0` 이외의 빈 interval, 미수렴, subspace 부족, count/inner solver,
allocation 또는 SPD 실패는 status와 stage를 보존하여 진단한다. Count success는 eigenpair
success가 아니며, caller의 count authority는 끝까지 `.inp`다.
## E8. Mode identity, normalization과 상태
모든 returned eigenpair를 lambda 오름차순으로 함께 정렬한다. Equal lambda의 tie는
original solver column order로 안정 정렬한다. Near-equal 값을 평균하거나 merge하지 않는다.
양의 modal mass로 column별 normalize하고, 가장 큰 absolute scaled global component의
sign이 양수가 되도록 한다(source DOF 순서로 tie 결정). 서로 다른 eigenvalues의 벡터를
Gram 보정 목적으로 임의 혼합하지 않는다. Failed orthogonality는 solve/validation 실패다.
정확한 repeated eigenspace의 다른 orthonormal basis는 같은 해이고 mode-shape external
matching은 없다. Density scaling/좌표 테스트는 repeated group의 projector로 비교한다.
Normalized `phi^T M phi=1`의 수치 convention에서 `phi_u`의 차원은 `M^-1/2`,
`phi_theta`는 `M^-1/2 L^-1`이고 modal amplitude가 `M^1/2 L`를 가진다.
Mode vector는 실제 응답 변위가 아니다. Scalar `lambda [T^-2]`와 source step/mode
identity를 분리하고 internal node/equation number를 source label로 노출하지 않는다.
원형상·density 검증→consistent/moment 검증→lumped 검증→K/M 조립→실제 BC→E2~E6
admissibility→E6~E7 FEAST→global 복원/독립 검증→candidate 결과 순서다.
반환 lambda는 부호를 보존한다. NR 기준상 유의한 음수는 불안정/invalid spectrum 실패,
near-zero는 분류와 raw value를 함께 유지하며 0으로 clamp하지 않는다.
양수에서만 `f=sqrt(lambda)/(2pi)`를 파생한다. 정확한 0은 f=0이고 작은 음수에는
실수 frequency를 만들지 않는다. 이 validity의 저장 방식은 I/O owner가 정한다.
N개 검증이 끝나기 전에 accepted state를 바꾸지 않는다. 검증된 candidate HDF5를
완성·검증·close한 뒤 final replacement를 수행하고 성공 뒤 준비된 state를 교환한다.
Replacement 이후 state 교환은 실패하지 않도록 준비한다. 제어된 solve/validation/write/
finalization failure에서 이전 accepted state와 기존 final HDF5를 보존한다.
Crash/power loss까지 원자성을 새로 주장하지 않는다. Live log lifecycle은 별도다.
Modal residual의 constrained 성분을 static reaction으로 출력하지 않는다.
@@ -1,217 +0,0 @@
# MITC4 consistent mass와 nodal block lumping 유도
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `formulation-agent`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md)
근거는 [research evidence](research-evidence.md)의 `S01`, `S02`, `P01`, `R01`~`R03`이다.
아래 유도는 FESA의 승인된 운동학에 대한 것이며 Abaqus 내부 질량과의 동등성 주장이 아니다.
r2는 M4의 numerical scale만 [S1](formulation-stabilization.md#s1-초기-physical-trace로-고정하는-단일-scale)로
대체한다. M1/M2 및 M5~M10의 질량·quadrature·moment·lumping 식은 영향 확인 후 보존했다.
## M1. 변수, 원형상과 운동학
길이·질량·시간 차원을 각각 `L`, `M`, `T`라 한다. 각 element는 원형상 좌표
`X_i [L]`, 기존 patch에서 얻은 공통 unit nodal director `d_i`, 일정한 centered thickness
`t>0 [L]`, section의 material에서 결정된 일정 density `rho>0 [M/L³]`를 사용한다.
`E>0 [M/(LT²)]`, `-1<nu<0.5`와 기존 단일층 등방성 plane-stress 재료를 유지한다.
모든 입력 및 중간 결과는 finite여야 한다. 여기의 `t`는 두께이며 시간은 `tau`로 쓴다.
자연 좌표는 `(xi,eta,zeta) in [-1,1]^3`, source node 순서는
`(-1,-1),(1,-1),(1,1),(-1,1)`이다. 다음 형상함수와 실제 volume mapping을 사용한다.
\[
N_i=\tfrac14(1+\xi_i\xi)(1+\eta_i\eta),\quad z=t\zeta/2,\quad
X=\sum_iN_i(X_i+z d_i),\quad J=\det[X_{,\xi},X_{,\eta},X_{,\zeta}],
\quad dV=J\,d\xi d\eta d\zeta. \tag{M1}
\]
`sum Ni=1`, `Ni>=0`이다. Interpolated director를 normalization하여 M1의 geometry를
변경하지 않는다. 기존 kernel의 `EvaluateGeometry`와 같은 Jacobian 및 부호를 사용한다.
기존 [정식화](../linear-static-mitc4-shell/formulation.md)의 §§3~5, 8~11이
director 생성, tangent frame `(a_i,b_i,d_i)`, 기하 허용 조건과 MITC strain을 소유한다.
전역 nodal 좌표는 `q_i=[u_X,u_Y,u_Z,theta_X,theta_Y,theta_Z]^T`이다.
`u [L]`, `theta [1]`이고 양의 director 변화는 `theta cross d`이다. 다음 map을 정의한다.
\[
S_i=-[d_i]_\times,\quad P_i=I-d_i d_i^T=S_i^TS_i,\quad
G_i(z)=[I_3\ \ zS_i],\quad H=[N_1G_1\ \cdots\ N_4G_4]. \tag{M2}
\]
따라서 입자 변위/속도는 `u(X)=Hq`, `v(X)=H q_dot`이다. Physical nodal coordinates
`[u_X,u_Y,u_Z,alpha,beta]`에서 회전 열은 `[-z b_i, z a_i]`이다.
`alpha=a_i^T theta`, `beta=b_i^T theta`, `gamma=d_i^T theta`이며
`S_i d_i=0`이다. 20↔24 변환은 기존 `PhysicalTransformation20`/`DrillingTransformation4`
그대로이다. MITC assumed shear와 `5/6` shear factor는 strain/stiffness에만 작용한다.
속도 보간과 질량에 이 factor를 적용하지 않는다.
## M2. Strong/weak form과 기존 stiffness
원형상·무응력 상태의 소변형 무감쇠 자유진동에 대해 continuum parent는
`rho u_ddot = div sigma`, `sigma=C_ps:epsilon`, `sigma_33=0`이다.
자유 표면·자유 edge의 generalized traction은 0이고 essential data는 동차 global DOF
제약이다. 허용한 thickness 운동학과 MITC projection에 제한한 약형은
\[
\int_{\Omega_0}\rho\,\delta u^T\ddot u\,dV+
\int_{\Omega_0}\delta\bar e^T C_5\bar e\,dV+
\delta\gamma^T K_d\gamma=0. \tag{M3}
\]
원형상 physical elastic Hessian과 quadrature는 기존 stiffness 계약을 유지한다.
\[
C_5=\operatorname{diag}\left(
\frac{E}{1-\nu^2}\begin{bmatrix}1&\nu&0\\\nu&1&0\\0&0&(1-\nu)/2\end{bmatrix},
\frac56\frac{E}{2(1+\nu)}I_2\right),
\quad K_{20}=\sum_{g\in2\times2\times2}\bar B_g^TC_5\bar B_gJ_gw_g,
\]
\[
K_e=T_p^TK_{20}T_p+T_d^T(k_d I_4)T_d,\quad
k_d=10^{-3}k_{ref,e}. \tag{M4}
\]
`bar e=[epsilon11,epsilon22,gamma12,gamma13,gamma23]`이다. `k_ref,e`는
[r2 scale S1](formulation-stabilization.md#s1-초기-physical-trace로-고정하는-단일-scale)으로 계산한다.
기존 [정식화 §12](../linear-static-mitc4-shell/formulation.md)의 physical kernel·변환·
drilling map은 유지하고 옛 최소 대각 scale만 사용자 승인 범위에서 대체한다.
[현재 source](../../src/fesa/elements/mitc4_shell.cpp)는 아직 옛 식이며 구현 완료 근거가 아니다.
Drilling energy는 수치 stabilization이며 물리 strain/stress가 아니다.
`K_e q_e`는 내부 elastic generalized force, `M_L,e q_ddot,e`는 inertia다.
최종 반이산식은 `M_L q_ddot + Kq=0`이다. Harmonic ansatz
`q(phi,tau)=phi cos(omega tau)`에서 `Kphi=lambda M_L phi`, `lambda=omega² [T^-2]`를 얻는다.
새 constitutive/history state, geometric stiffness, damping, preload, nonlinear tangent,
time integrator 또는 modal stress/reaction recovery는 없다.
## M3. Consistent matrix와 충분한 quadrature
`T_C=1/2 integral rho |H q_dot|² dV`에서
\[
C^{(k)}_{ij}=\int_{\Omega_0}\rho N_iN_j z^k dV\quad(k=0,1,2),
\qquad
(M_C)_{ij}=\begin{bmatrix}
C^{(0)}_{ij}I_3&C^{(1)}_{ij}S_j\\
C^{(1)}_{ij}S_i^T&C^{(2)}_{ij}S_i^TS_j
\end{bmatrix}. \tag{M5}
\]
세 scalar moment matrix는 각각 symmetric `4×4`이다. 차원은 `C(k) [M L^k]`,
mass의 `uu/u-theta/theta-theta` block은 각각 `M/ML/ML²`이다.
`M_C [24×24]`는 global block 형식이며 20 physical mass의 congruence와 동일하다.
원본 `M_C`와 그것을 구성한 `C(0..2)`를 완성·검증한 후 lumping 입력으로 사용한다.
Global consistent sparse matrix를 eigen solve에 조립할 필요는 없지만 계산 원본을
lumped 결과로 덮어쓰거나 별도의 mass를 생성한 뒤 consistent에서 유도했다고 부르지 않는다.
M1은 각 자연 좌표에 최대 1차이다. Jacobian의 세 열의 최대 다항 차수는 각각
`(0,1,1)`, `(1,0,1)`, `(1,1,0)`이므로 determinant의 성분별 최대 차수는 `(2,2,2)`다.
`Ni Nj z^k J`의 차수는 최대 `(4,4,k+2)`, 즉 `(4,4,4)`이다. 따라서 **질량에는
3×3×3 Gauss–Legendre**를 사용한다. 각 축의 points는
`[-sqrt(3/5),0,+sqrt(3/5)]`, weights는 `[5/9,8/9,5/9]`이다.
3-point rule의 5차 정확성으로 M5의 모든 항을 이 geometry에서 정확 적분한다
(floating-point roundoff 제외). 추가 density/thickness 변화를 가정한 결론이 아니다.
Loop 순서는 증가하는 `xi`, 그 안의 `eta`, 가장 안의 `zeta`, 이후 `i<=j`, `k=0,1,2`로
고정하고 대칭 항을 복사한다. Mass 계산의 27개 실제 평가점에서도 기존 geometry
predicate를 적용한다. `J<=0`, nonfinite frame/basis 등의 실패를 weight 절댓값,
점 생략이나 flat replacement로 수리하지 않는다. 기존 stiffness 8-point 경로는 변경하지
않는다. 이 검사는 27점에서의 positivity를 보장하며 volume 모든 위치의 injectivity에
대한 새 theorem이나 기존 warp/curvature 범위의 확대를 주장하지 않는다.
왜곡된 flat element라도 같은 식을 쓴다. 서로 다른 director가 있으면 `J(zeta)`의 1차 항
때문에 `C(1)`이 0이 아닐 수 있다. Centered section만을 이유로 coupling을 버리거나
`C(2)=t² C(0)/12`를 일반식으로 사용하지 않는다.
## M4. 계산된 consistent moment에서 nodal block 유도
각 node의 세 row sum과 질량 block을 정의한다.
\[
m_i=\sum_j C^{(0)}_{ij},\quad h_i=\sum_j C^{(1)}_{ij},\quad
j_i=\sum_j C^{(2)}_{ij},\qquad
L_i=\begin{bmatrix}m_iI_3&h_iS_i\\h_iS_i^T&j_iP_i\end{bmatrix},
\quad M_{L,e}=\operatorname{blockdiag}(L_1,L_2,L_3,L_4). \tag{M6}
\]
이는 scalar moment row sum 후 tensor로 재구성하는 **nodal block lumping**이다.
Global 전체 행의 합, absolute row sum, diagonal scaling 또는 nodal quadrature와
혼용하지 않는다. 같은 source node의 incident element block은 기존 source element 순서로
합한다. 공통 `d_i` 때문에 조립 후에도 M6 형태다. Local와 global에서 diagonal이 아닌
`6×6` coupling은 허용한 lumped mass의 일부다.
`sum Nj=1`을 M5에 대입하면 정확히
\[
(m_i,h_i,j_i)=\int\rho N_i(1,z,z^2)dV,\quad
L_i=\int\rho N_i G_i(z)^TG_i(z)dV. \tag{M7}
\]
`m_i>0`, `j_i>0`, `m_i j_i-h_i²>0`이다. 마지막 부등식은 양의 measure에 대해
`z`가 상수가 아닌 점(양의 두께 및 서로 다른 thickness Gauss점)과 strict
Cauchy–Schwarz에서 따른다. 이를 이용하면
\[
q_i^TL_iq_i=m_i\left|u_i+\frac{h_i}{m_i}S_i\theta_i\right|^2+
\left(j_i-\frac{h_i^2}{m_i}\right)|S_i\theta_i|^2. \tag{M8}
\]
따라서 `L_i`의 rank는 5, null은 정확히 `[0;d_i]`의 span이다.
`zbar_i=h_i/m_i [L]`, `j_i-h_i²/m_i [ML²]`는 node에 할당된 thickness
measure의 centroid와 central tangent inertia다. 음/영 variance나 nonfinite를 clamp하지
않고 mass 검증 실패로 처리한다. 모든 노드에 최소 한 활성 shell이 연결되어야 한다.
M6의 유도 연결은 `C(k)` 원본→row sum→block reconstruction으로 추적한다.
동시에 M7을 독립 직접 적분하여 두 결과의 일치를 검증할 수 있다.
서로 다른 nodal frame의 rotary component를 직접 더하지 않는다.
## M5. 보존되는 양과 근사되는 양
모든 등식은 동일 원형상·density와 quadrature measure에 관한 것이다.
1. 총 병진 질량 `m=sum mi=integral rho dV` 및 모든 uniform translation의 kinetic
energy가 consistent와 정확히 같다. 각 방향의 total mass가 `m`이며 `trace(Muu)`를
총 질량이라고 정의하지 않는다.
2. Thickness scalar moment는 `sum hi=integral rho z dV`,
`sum ji=integral rho z² dV`다. 각 nodal tangent tensor는 `ji Pi`이고 drilling inertia는
0이다. 이는 물리 director의 회전 관성 정의이며 모든 rigid rotation의 전체 tensor를
consistent와 같게 만드는 계약은 아니다.
3. Lumping measure의 위치를 `x_i(z)=X_i+z d_i`로 보면 spatial first moment
`sum_i(mi Xi+hi di)=integral rho X dV`이므로 center of mass가 보존된다.
Node의 `Xi`에만 `mi`를 놓고 `hi di`를 누락하면 곡면에서 이 등식이 깨진다.
4. `v_i(z)=u_dot_i+z S_i theta_dot_i`에 대해 Jensen identity가 다음을 준다.
\[
\dot q^T(M_L-M_C)\dot q=
\frac12\int\rho\sum_{i,j}N_iN_j|v_i-v_j|^2dV\ \ge0. \tag{M9}
\]
두 kinetic energy의 차이는 M9의 절반이다. Equality는 positive-weight point마다 모든
`v_i`가 같을 때 성립한다. 일반 속도장 및 rigid angular motion의 orbital inertia는
달라질 수 있으며 lumped 값이 그 quadratic form에서 작아지지 않는다.
Rigid spatial rotation은 `u_i=Omega cross Xi`, `theta_i=Pi Omega`로 재현된다.
이때 M9는 nodal 위치 분산으로 생기는 angular-inertia 차이를 정확히 설명한다.
두 spectrum의 동일성, arbitrary mesh의 특정 수렴 차수 또는 Abaqus lumping 동등성을
acceptance로 요구하지 않는다. Smooth refinement에서 차이가 감소하는지는 독립 evidence다.
Proper orthogonal global rotation `Q`에 대해 `D_Q=blockdiag(Q,Q)`를 두면
`S(Qd)=Q S(d) Q^T`, `L'_i=D_Q L_i D_Q^T`이며 consistent에도 같은 congruence가
성립한다. 이는 tangent basis 선택과 독립적이다. Constraint도 같은 물리 공간으로 변환한
경우에만 spectrum의 좌표 불변성을 비교한다.
## M6. 직접 적분 가능한 평판 oracle
평행 director와 affine 직사각형 면적 `A`에서는
\[
C^{(0)}=\frac{\rho t A}{36}
\begin{bmatrix}4&2&1&2\\2&4&2&1\\1&2&4&2\\2&1&2&4\end{bmatrix},
\quad C^{(1)}=0,\quad C^{(2)}=\frac{t^2}{12}C^{(0)}. \tag{M10}
\]
각 node는 `mi=rho t A/4`, `hi=0`, `ji=rho t³ A/48`이다.
이는 production quadrature를 호출하지 않고 다항 적분으로 얻는 oracle다.
곡면에서는 M5~M9와 independent volume integration을 사용한다.
두께 `t` 변경 시 stiffness와 rotary inertia는 다른 차수로 변하므로 전체 spectrum에
하나의 thickness power law를 강제하지 않는다.
@@ -1,243 +0,0 @@
# 좌표 공변적인 drilling scale과 적용 경계
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `formulation-agent`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md)
승인 근거는 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합),
`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및 [기존 계약 대체 범위](requirements.md#r2의-기존-계약-대체-범위)다.
[연구 R07](research-evidence.md#r07--r2-stabilization-근거와-영향)의 후보에서 아래 하나를 선택한다.
식 S1~S8은 FESA 계약에 대한 유도이며 외부 solver의 stabilization과 동일하다는 주장이 아니다.
## S1. 초기 physical trace로 고정하는 단일 scale
[M4](formulation-mass.md#m2-strongweak-form과-기존-stiffness)의 원형상 physical matrix를
`K20^0`라 한다. 각 source node i의 local physical 순서는 `[uX,uY,uZ,alpha,beta]`이고,
`R_i [2×2]`는 그 matrix에서 `alpha,beta`에 해당하는 principal block이다. 두 회전은
orthonormal tangent basis의 무차원 성분이다. Element별로
\[
k_{ref,e}=\frac18\sum_{i=1}^4\operatorname{tr}R_i,
\qquad k_{d,e}=\eta_d k_{ref,e},\qquad \eta_d=10^{-3},
\qquad K_d^l=k_{d,e}I_4. \tag{S1}
\]
`k_ref,k_d,R_i`의 단위는 force·length=`ML²/T²`다. Translation 대각, lumped/consistent
mass, density, constrained tangent, trial tangent 또는 reference 오차는 이 식의 입력이 아니다.
초기 physical K의 **여덟 회전 대각 전체**를 평균하며 양수인 항만 선별해 분모를 바꾸지 않는다.
기존 coefficient `10^-3`와 네 node에 같은 scalar를 쓰는 numerical 역할을 유지한다.
새 사용자 parameter·coefficient sweep·reference tuning은 없다.
Trace 평균은 모든 방향의 회전 강성을 사용하면서 eigenvalue subtraction과 positive
nodal-block 선별을 피한다. 최소 spectral 값도 불변량이지만 이번 scale에 필요하지 않은
작은 고유값 conditioning 문제를 추가한다. 이는 R07 후보의 단순성에 따른 선택이며,
LAPACK이 FESA의 평균 규칙을 제안한다는 뜻이 아니다. 작은 고유값의 상쇄 한계는
[LAPACK DLAEV2 원문, Further Details](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html)에 있다.
## S2. Positive inventory, 유효 geometry와 계산 순서
기존 승인 geometry·director·section·material 검증을 먼저 적용한다. 기존 8개 stiffness
점에서 `J_g>0,w_g>0`, `t>0,E>0,-1<nu<0.5`이면 `C5≻0`이고 M4에 의해
\[
d_r=(K_{20}^0)_{rr}
=\sum_g J_gw_g\|C_5^{1/2}\bar B_g e_r\|^2\ge0,
\quad r=(\alpha_1,\beta_1,\ldots,\alpha_4,\beta_4). \tag{S2}
\]
따라서 S1이 양수인 필요충분조건은 이 여덟 값 중 적어도 하나가 양수인 것이다.
이는 [기존 요구 034/036](../linear-static-mitc4-shell/requirements.md)의 유효 physical
rotation inventory 조건과 같다. 개별 `R_i`가 모두 PD여야 한다는 새 조건은 없다.
Exact zero diagonal/block도 합에 포함하므로 기존 허용 geometry를 선별해 줄이지 않는다.
유효 geometry는 noncollinear midsurface를 가지며, 기존 physical kernel의 non-rigid
positivity 계약상 translation 0인 비영 tangent-rotation field 전체가 zero-energy일 수 없다.
그 field가 rigid라면 모든 node에서 `c+Omega×X_i=0`이므로 noncollinearity에서 `Omega=c=0`이다.
이것이 기존 물리 rank 조건과 양의 inventory의 연결이다. Geometry predicate만으로 모든
왜곡 element의 rank를 검증했다고 주장하지 않고 기존 physical rank/patch 검증을 유지한다.
계산·실패 순서는 다음으로 고정한다.
1. 기존 순서의 quadrature로 초기 `K20^0`를 완성하고 모든 항의 finiteness를 확인한다.
Node1→4, 각 node의 alpha→beta 순서로 정확히 여덟 `d_r`를 읽는다.
2. Negative diagonal은 S2와 불일치하는 numerical stiffness failure다. Zero는 허용한다.
Nonfinite/negative를 생략·절댓값·0으로 보정하지 않는다. Physical symmetry/PSD의 독립
검증을 양의 trace 하나로 대체하지 않는다.
3. `d_max=max_r d_r`를 구한다. `d_max=0`이면 빈 positive inventory failure다.
그 외에는 고정된 순서의 안정된 합으로
`k_ref=d_max*((sum_r(d_r/d_max))/8)`을 평가한다. 이는 S1의 동치 계산이며 임의 floor가 아니다.
Exact 산술에서 괄호는 `[1/8,1]`이므로 유한한 최댓값보다 큰 중간 trace를 만들 필요가 없다.
4. `k_ref`와 `k_d=10^-3 k_ref`가 각각 finite·strictly positive인지 확인한다.
Underflow로 0, overflow 또는 invalid가 되면 실패하고 최소 양수로 대체하지 않는다.
안정된 합도 연산 불능을 감추지 않으며 수치 기준·conditioning은 NR가 고정한다.
5. Source element/node 순서의 기존 reduction으로 조립한다. 임의의 좌표 회전에 대한
bitwise equality와 고정 입력·reduction 순서의 결정론은 구분한다. 전자는 NR의 정규화
congruence 기준을 만족해야 하며 기준 밖 실패를 floating-point라는 말로 수용하지 않는다.
Mass나 geometry rank cutoff를 새로 만들지 않는다. 유효한 positive stiffness라도
표현 범위를 넘는 경우의 numerical failure는 지원 geometry 종류를 축소하는 대체 규칙이 아니다.
## S3. 독립 재계산한 complete K와 제약의 공변성
`U_i=[a_i b_i]`, `G∈SO(3)`를 전역 좌표 회전이라 하자. 새 geometry에서 tangent를
독립 생성하면 `U_i'=G U_i O_i`, `d_i'=Gd_i`인 orthogonal `O_i`가 존재한다.
오른손 frame끼리는 `O_i∈SO(2)`다. 각 node의 physical 좌표 변환을
`A_i=diag(G,O_i^T)`, 전체 `A=blockdiag(A_i)`, global 24 DOF 변환을
`S_G=blockdiag_i(G,G)`라 두면 `q20'=A q20`, `q24'=S_G q24`다.
MITC strain은 같은 물리 tensor를 보간하고 isotropic C5의 quadratic work와 J는 회전에
불변이다. 따라서 물리 운동학으로 독립 재계산한 `K20'^0=A K20^0 A^T`이며
\[
R_i'=O_i^T R_i O_i,\quad \operatorname{tr}R_i'=\operatorname{tr}R_i,
\quad k_{d,e}'=k_{d,e},\quad
T_p'S_G=A T_p,\quad T_d'S_G=T_d. \tag{S3}
\]
이 등식을 M4에 대입하면
\[
K_{phys,e}'=S_G K_{phys,e}S_G^T,\quad
K_{drill,e}'=S_G K_{drill,e}S_G^T,\quad
K_e'=S_G K_e S_G^T. \tag{S4}
\]
`G=I`인 독립 node별 tangent basis 변경에도 같다. Element의 local strain frame이
재생성되더라도 isotropic work는 같다. Frame 생성 tie로 basis가 달라지는 것도 포함한다.
이미 계산한 old K에 S를 곱하는 검사만으로 S3를 검증할 수 없다. 새 geometry·frame에서
physical K와 S1을 다시 계산해야 한다. Translation of origin도 geometry derivatives,
K 및 M를 바꾸지 않는다. Mirror reflection·source connectivity reversal은 이 SO(3) 증명의 대상이 아니다.
전체 model의 block rotation을 `S`라 하면 stable assembly 뒤 `K'=S K S^T`, `M'=S M S^T`다.
E1의 `ell`은 회전에 불변이고 D와 S는 commute한다. 같은 물리 free space를 나타내는
`C,C'`에는 `SC=C'W`인 orthogonal W가 있어
\[
K_f'=W K_f W^T,\quad M_f'=W M_f W^T,
\quad y_f'=W y_f,\quad\lambda'=\lambda. \tag{S5}
\]
이는 supported partial rotation BC에도 적용된다. 비교 대상 양쪽의 같은 물리 subspace가
현재 component BC로 표현되어야 한다. 임의 회전 뒤 BC component를 그대로 유지하여 다른
문제를 비교하거나 새 MPC 기능을 요구하지 않는다. NR-MFE-001의 global Z축 회전은 그
URZ free space를 유지하므로 필수 사례다. Complete K 안의 partial-BC stabilization을
삭제하거나 acceptance를 full-free/full-clamp로 한정하지 않는다.
Static load도 `F'=SF`, prescribed displacement도 같은 물리량으로 변환하면 기존
partition/effective RHS의 해와 full residual/reaction이 함께 변환한다. Unique free 해의
경우 `q'=Sq`, `r'=Sr`, physical strain energy는 불변이다. S5는 eigen 근사식이 아니라
개선된 실제 constrained K/M의 congruence다.
## S4. Linear rigid modes와 massless drilling의 다른 의미
Linear/eigen 물리 rigid field는 `u_i=c+Omega×X_i`,
`theta_i=(I-d_i d_i^T)Omega`다. M2에 넣으면 입자 변위는 `c+Omega×X`이고
물리 strain 및 `T_d q`가 모두 0이다. 따라서 S1의 양수 값과 관계없이 `K_e q=0`이다.
비퇴화 shell의 여섯 물리 rigid motions는 positive lumped mass를 가진다. 기존 physical
non-rigid positivity와 함께 complete free element의 nullity가 여섯이라는 검증을 유지한다.
반면 한 node의 pure numerical drill `z_i=[0;d_i]`는 `T_p z_i=0`, `M z_i=0`이고
numerical stiffness만 양수다. Physical recovery에는 strain/stress/resultant를 만들지 않는다.
Full spatial Omega를 linear UR에 넣어 numerical drill까지 가진 field는 위 five-DOF
rigid 대표값과 다르다. 이 구분은 기존 물리 계약이며 새 eigen rigid acceptance의 축소가 아니다.
S1에서 모든 element의 `k_d,e>0`이고 nodal director가 incident element 사이에 공통이므로
[E3/E4](formulation-eigen.md#e3-개선된-stiffness에서-decoupling의-정확한-증명)의
`K_f Z=Z diag(sum_e k_d,e)`, `Kzz≻0`, `Kpz=0`가 그대로 성립한다. E2의 실제
global BC와 null의 교집합을 먼저 구한다. Finite mode의 null coefficient는 0이며
positive 공간으로의 투영은 개선된 원 pencil의 모든 finite spectrum을 보존한다.
Null이 없는 partial BC에는 개선된 drilling term이 finite 공간에 남는다. 이 항을 제거하거나
옛 spectrum과 같게 조정하지 않는다. Consistent→lumped의 spectrum equality는 별개로 요구하지 않는다.
## S5. Nonlinear objective potential와 초기 고정 lifecycle
기존 [nonlinear §10.1~10.4](../nonlinear-static-newton-raphson/formulation.md#10-objective-numerical-drilling-contract)의
polar element corotation `R_e`, total nodal rotation `R_i`, minimal swing `S_ei` 및
`gamma_i=atan2(s_gamma,i,c_gamma,i)`를 그대로 사용한다. 초기 reference physical K20만으로
S1을 한 번 계산하고 모든 trial/commit/increment/iteration 및 rollback 동안 같은 scalar를 쓴다.
State-dependent scale·trial 재선정·기존 objective gamma의 교체는 승인 범위 밖이다.
\[
Dk_{d,e}=D^2k_{d,e}=0,\quad
\Pi_d^e=\tfrac12 k_{d,e}\gamma^T\gamma,\quad
r_d^e=k_{d,e}D_\gamma^T\gamma,
\]
\[
K_d^e=k_{d,e}\left(D_\gamma^TD_\gamma+
\sum_i\gamma_i H_i^\gamma\right),\qquad
D_\gamma=D\gamma,\quad H_i^\gamma=D^2\gamma_i. \tag{S6}
\]
모든 polar/swing/rotation/atan2 미분과 branch validation은 기존 계약을 유지한다.
Positive k_d는 potential 비음성과 pure-drill 양의 작용을 뜻한다. 일반 nonlinear Hessian은
`sum gamma_i H_i` 때문에 모든 상태에서 SPD라는 결론이 없다. 초기 `gamma=0`에서도
`D_gamma`에는 corotation coupling이 있으므로 이를 linear `T_d`와 동일시하지 않는다.
기존 pure-drill directional quadratic form과 physical 선형극한·Newton tangent consistency를
각자의 계약대로 재검증하며 complete nonlinear Hessian의 모든 entry가 linear M4와 같다고 요구하지 않는다.
같은 물리 nonlinear 상태를 G로 표현하면 모든 rotation tensor와 initial director가
conjugation/rotation되고 scalar gamma는 같다. Initial S1도 같으므로 potential은 불변이다.
Work-conjugate Cartesian perturbation에 대해 chain rule로 residual과 tangent의 공변성이 따른다.
Superposed finite rigid motion에서는 기존 `R_e^+=R R_e`, `R_i^+=R R_i`에 의해 gamma가
같고, stress-free rigid state에는 gamma=0·physical strain=0이다. 따라서 finite rigid motion의
영에너지 및 objective rigid orbit를 따른 변분 검증을 유지한다. S4의 linear tangent-projected
UR field를 nonlinear total triad 회전에 대신 넣지 않는다.
현재 [nonlinear 생성 경로](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의
`NonlinearMitc4Shell::Create`는 초기 linear `Stiffness()`의 `drilling_stiffness`를 받아 저장한다.
이 경계에서 S1의 같은 값을 사용해야 한다. 물리 strain/material, exact external moment work,
Newton/line-search/cutback, accepted state 및 physical output은 기존 계약이다.
S4/E3 projection은 이 nonlinear Hessian·preload·prestressed eigen으로 확장하지 않는다.
## S6. NR-MFE-001의 새 algebraic target과 정적 대응
[NR 소유 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례)의 독립 적분 block을
입력 근거로 사용한다. 그 geometry·source BC·material 및 옛 실패 이력은 보존한다.
각 corner에서 `R_aa=49/12`, `R_bb=23/6`, `R_ab=±1/8`이므로
\[
k_{ref}=95/24,\quad k_d=19/4800,\quad
M_{ff}=3/50,\quad K_{ff}=10369/7500,\quad
\lambda=10369/450=23.042222\ldots . \tag{S7}
\]
Global Z축 45° 회전 뒤 재생성한 tangent basis에서도 trace는 `95/12`이므로 같은 식이다.
이는 production/FEAST 실행 결과가 아닌 r2 formula의 exact target이다. 독립 재계산과
runtime에서 반례가 해소되는지는 NR/Implementation이 각각 검증한다.
정적 대응에는 node1에 `m=(5/3)M0 b`, 다른 load는 0을 사용한다. 여기서
`b=(-4/5,0,3/5)`와 `M0`는 finite 비영 moment amplitude `[force·length]`다.
`d·m=0`, `mZ=M0`이므로 기존 physical moment admissibility를 지킨다. 단순 `m=M0 eZ`는
drilling 성분을 가져 기존 load 계약을 위반하므로 사용하지 않는다. 같은 모든 DOF 고정,
node1 URZ만 free에서
\[
\theta_{1Z}=\frac{M0}{K_{ff}},\quad
q_{constrained}=0,\quad r=Kq-F. \tag{S8}
\]
회전된 input에서는 `m'=Gm`을 component load로 주고, `mZ'=M0`와 같은 BC를 유지한다.
Supported component BC/load만으로 `thetaZ`, complete response·full reaction의 공변성을
검증할 수 있다. Physical recovery와 numerical contribution의 의미는 합치지 않는다.
## S7. 대체·보존 범위와 필수 verification
기존 linear `FESA-REQ-LSMITC4-034`, `056`의 최소 positive diagonal 선정·그 공식 검증만
S1/S2로 대체한다. 기존 `036`의 invalid positive inventory 의미는 S2로 유지한다.
Nonlinear §10.3은 초기 scale 식만 대체하고 §10.1/10.2/10.4 및 frozen lifecycle은 유지한다.
기존 feature 문서·과거 실패 evidence를 소급 수정하지 않는다.
필수 수학 검증은 S1 직접 평균/단위/zero inventory·잘못된 finite/sign 처리,
독립 node별 tangent 재생성과 global geometry 회전의 S3/S4, S7/S8의 supported partial BC,
physical six rigid modes와 pure drilling rank/separation, E3의 KZ/MZ/Kpz/Kzz 및 원 free
residual이다. Nonlinear은 같은 초기 scale·immutability, objective rigid motion,
exact first/second directional derivatives·물리 선형극한·정적 평형/reaction/energy·rollback을
기존 계약으로 재검증한다. Density 없는 기존 static 모델도 계속 유효하다.
실행해야 하는 기존 `shell`, `shellNL`, `shellNL-meshfine` 및 linear-limit closure portfolio와
후속 meshfine-02 이력의 구분, source identity, U blocking/UR warning-only, reaction review-only는
[requirements evidence의 단일 portfolio](requirements-evidence.md#r2-승인-범위와-정적-재검증)를 따른다.
새 eigen 외부 비교는 지정 input/TXT의 10개 Value만 사용한다. Static reference를 eigen
mode-shape gate로 추가하거나 기존 static 회귀를 Value-only를 이유로 삭제하지 않는다.
Numerical threshold·필수 case 구체화·FEAST control/budget/seed와 독립 반례 해소 판정은 NR,
TDD/runtime/reference 실행은 Implementation, 독립 물리 판단은 Physics 소유다.
@@ -1,298 +0,0 @@
# 질량과 modal candidate의 검증식 및 Numerical Review 인계
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `formulation-agent`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md)
[질량 식 M1~M10](formulation-mass.md), [축소·복원 식 E1~E8](formulation-eigen.md),
[개선된 scale·공변성 S1~S8](formulation-stabilization.md)의
기호를 사용한다. 이 문서는 측정량과 zero branch를 정의하며 수치 acceptance 값과
필수 benchmark 선정은 Numerical Review가 독립 검토하여 고정한다.
외부 기준의 수치는 [TOLERANCE](../TOLERANCE.md)를 그대로 적용한다.
## V1. 공통 scale과 zero branch
행렬·벡터 norm을 계산하기 전에 E1의 길이 congruence를 적용한다. 질량은 모두
`ML²`, stiffness는 `ML²/T²` 단위가 된 행렬에서 norm을 계산한다. Element-only
oracle에서는 `ell=Le`를 사용하고 assembled 비교에는 동일 global `ell`을 사용한다.
Norm과 sum-of-squares는 overflow/underflow를 피하는 scaled accumulation을 사용한다.
입력/행렬/각 eigenpair가 finite인지 먼저 검사한다.
이 문서의 모든 ratio `a/b`는 `b>0`에서만 계산한다. `a=b=0`이면 해당 항등식의
zero-case metric은 0이다. `b=0,a!=0`이면 named zero-scale failure이며 무한값/NaN
metric으로 성공 결과를 만들지 않는다. `max(1,b)`, arbitrary floor 또는 zero clamp는 없다.
대칭성은 `eta_sym(Q)=||Q-Q^T||F/||Q||F`이다. Diagonal copy로 생성한 symmetry와
독립 quadratic-work 검증은 구분한다. Cross-basis equality `R=S`는
`||R-S||F/(||R||F+||S||F)`로 측정한다. Mass/stiffness를 같은 norm의 분모에 직접 더하지
않고 필요한 lambda나 시간 scale을 곱한다.
## V2. 질량, rank와 보존 검증
- M10의 entrywise scalar oracle와 `M_C` quadratic form을 독립 적분과 비교한다.
계수·부호/두께 차수가 같은지를 component별 확인한 뒤 전체 norm을 사용한다.
- M5에서 구성한 `M_C`와 원본 moment, M6의 row-sum 결과, M7의 independent direct
integration을 따로 비교한다. 변조한 C(1)/C(2)가 lumped 결과 및 검증에 반영되는지
확인하여 두 mass 계산이 끊긴 우회 경로를 잡는다.
- Mass original과 derived 모두 `d_i` 방향의 null action을 검사한다.
Element/global scaled matrix에서 `eta_null=||Mhat z||2/(||Mhat||F ||z||2)`를 쓴다.
Lumped는 M8의 양의 두 항 및 physical positive-space Cholesky로 rank5를 검증한다.
Consistent physical 20-coordinate matrix도 positive여야 한다. 잘못된 quadrature에
의한 추가 hourglass/null mass를 허용하지 않는다.
- `mi>0`, `ji>0`, `zi=hi/mi`, `vi=ji/mi-zi²>0`를 검사한다.
`vi/ell²`, `|hi|/sqrt(mi ji)`는 dimensionless conditioning evidence다.
양의 `vi`를 낮은 rank로 바꾸는 기준을 두지 않는다. Direct centered integral
`integral rho Ni (z-zi)² dV`와 `ji-hi²/mi`의 일치는 cancellation을 드러낸다.
- Scaled node positive mass의 Cholesky reconstruction error와 reciprocal condition
estimate를 기록한다. 후자는 작은 block inverse action의 norm으로 계산할 수 있다.
물리 positive/null rank는 E2로 정하고 ill-conditioning은 별도 실패다.
- 총 질량은 uniform translation의 `q^TMq/|u|²`, geometry 적분의 `m=sum mi`를
비교한다. Spatial centroid는 M5의 scalar moment로 얻은
`sum(mi Xi+hi di)`와 독립 `integral rho X dV`를 비교한다.
좌표 원점으로 인한 cancellation을 피하려면 한 source node `Xref`를 공통 원점으로
잡고 first moment 차이를 `m ell`로 나눈다.
- M9의 `Delta=q_dot^T(M_L-M_C)q_dot`와 nonnegative pairwise integral을 독립 비교한다.
Scale은 `q_dot^T M_L q_dot + q_dot^T M_C q_dot`이며 zero motion/null-only field는
별도 zero branch다. Arbitrary velocity에서 equality를 요구하지 않는다.
## V3. Reduction과 full modal residual
`y_f=C^T D^-1 phi`, `k=||Kf||F`, `m=||Mf||F`라 두면
\[
r_f=K_f y_f-\lambda M_f y_f,\qquad
\eta_r=\frac{\|r_f\|_2}{(k+|\lambda|m)\|y_f\|_2}. \tag{V1}
\]
이것이 **모든 원 free DOF**의 inertia/elastic force balance다. 물리 공간에
project한 residual만으로 drilling/null 복원 오류를 놓치지 않는다.
`Kf y_f` 및 `Mf y_f`를 solve에 사용한 축소 matrix를 재사용하지 않고 원 조립값에서
검산한다. `Mf`는 actual lumped이며 consistent로 바꾸면 잘못된 metric이다.
`lambda=0`에서도 `k>0`이면 유효한 denominator가 있다. `Kf=0,lambda=0`은 zero branch,
zero eigenvector는 normalization 이전부터 실패다.
Whitened solve의 추가 metric은 `eta_w=||A x-lambda x||2 /
((||A||F+|lambda|)||x||2)`다. Backend `res/epsout`, eta_w, eta_r은 서로 다른 evidence다.
E3의 identity도 다음으로 검산한다.
\[
\eta_{KZ}=\frac{\|K_fZ-Z\operatorname{diag}(\kappa)\|_F}
{\|K_f\|_F\|Z\|_F+\|Z\operatorname{diag}(\kappa)\|_F},\quad
\eta_{MZ}=\frac{\|M_fZ\|_F}{\|M_f\|_F\|Z\|_F},\quad
\eta_{PZ}=\|P^TZ\|_F. \tag{V2}
\]
`nz=0`이면 V2는 적용 대상 없음으로 기록한다. M8/E3의 analytic proof가 먼저이고
V2 threshold만으로 새로운 nullspace를 발견하거나 coupling을 생략하지 않는다.
Kzz positivity와 `n/nz/nf`를 source node별 예상 null 여부와 연결한다.
Constraint metric은 `||(I-CC^T)D^-1 phi||2/||D^-1 phi||2`이며 source에 복원한
constrained components 자체도 exact zero를 확인한다.
## V4. Mass normalization, Gram, energy와 Rayleigh
각 mode의 generalized mass `g_i=phi_i^T M phi_i=y_i^T Mf y_i`는 finite, strictly
positive여야 한다. `phi_i <- phi_i/sqrt(g_i)`로 normalization한 뒤 재계산한다.
계산된 전체 c개 column에 대해
\[
G_{ij}=\phi_i^T M\phi_j,\quad
\eta_{norm,i}=|G_{ii}-1|,\quad
\eta_{orth,ij}=\frac{|G_{ij}|}{\sqrt{G_{ii}G_{jj}}}\ (i\ne j),\quad
\eta_G=\frac{\|G-I\|_F}{\sqrt c}. \tag{V3}
\]
Column pairing과 linear independence를 확인하며 FEAST의 c와 N을 구분한다.
부족한 rank를 같은 vector 복사로 채우면 V3에서 실패한다.
\[
h_i=y_i^TK_fy_i,\quad R_i=h_i/g_i,\qquad
\eta_{energy,i}=\frac{|h_i-\lambda_i g_i|}
{(k+|\lambda_i|m)\|y_i\|_2^2}. \tag{V4}
\]
`R_i [T^-2]`는 Rayleigh quotient다. V4는 eigenvalue가 0인 경우에도 쓸 수 있고
`|R_i-lambda_i|/|lambda_i|`만을 강제하지 않는다. 단위 modal amplitude에서 elastic
energy는 `h_i/2`, peak kinetic energy는 `lambda_i g_i/2`다. Physical/drilling 분해가
필요한 내부 검산에서는 `h_phys+h_drill=h_i`를 확인하되 별도의 drilling-energy
acceptance나 output quantity를 추가하지 않는다.
## V5. Rigid mode, coordinate 및 density 불변식
Free valid shell/patch의 rigid fields는 `u_i=c+Omega cross Xi`,
`theta_i=(I-di di^T)Omega`이다. 그 span에는 세 병진과 세 회전이 있다.
각 vector의 scaled K action을 `||Khat y||2/(||Khat||F ||y||2)`로 검증하고
mass Gram rank로 여섯 물리 움직임의 independence를 확인한다.
`Omega`의 full normal 성분을 UR에 넣어 drilling energy를 자극한 field는 이 테스트가 아니다.
Physical rigid zero eigenvalues는 finite mass 모드이고 E2의 massless drilling과 다르다.
Clamped reference에 여섯 zero mode를 요구하지 않는다.
Global rigid coordinate rotation과 독립 node별 tangent 재생성에서 두 질량,
physical/numerical contribution 및 **complete stiffness**의 congruence와 E1~E6 spectrum
불변성을 검사한다. S1의 scale을 새 geometry/frame에서 다시 계산하여 S3/S4를 검증한다.
고정된 tensor에 회전행렬만 곱하는 검사로 대체하지 않는다. Norm은 V1의 same-unit
congruence ratio, scalar scale은 `|kd'-kd|/(|kd'|+|kd|)`다. Spectrum은 같은 operator
time scale `s`로 `|lambda_i'-lambda_i|/s`를 측정하며 repeated 그룹은 아래 projector를 쓴다.
같은 물리 BC가 양쪽에서 지원되는 **partial rotation BC**를 포함하고,
[S6](formulation-stabilization.md#s6-nr-mfe-001의-새-algebraic-target과-정적-대응)의
NR-MFE-001 geometry/45° 회전 및 대응 정적 response/reaction을 필수 통과 사례로 둔다.
Full-free/full-clamp만으로 대체하거나 반례를 warning-only로 내리지 않는다.
Partial BC에 남는 개선된 stabilization도 포함하며 기존 K와 새 K의 값이 같을 필요는 없다.
Rotation 후 다른 물리 component BC를 같은 문제로 비교하거나 새 MPC 입력을 추가하지 않는다.
Nonlinear rigid motion은 기존 total triad의 finite rotation과 objective gamma를 사용한다.
S5의 potential/residual/Hessian을 검증하며 위 linear tangent-projected UR field 및
massless projection을 nonlinear 상태에 적용하지 않는다. 개선 전 scale 공식만을 기대한
기존 검사는 S1로 갱신하고 나머지 rigid/patch/physical positivity acceptance는 보존한다.
모든 density를 동일 `c_rho>0`로 바꾸고 geometry/material stiffness/BC를 유지하면
\[
M_C'=c_\rho M_C,\quad M_L'=c_\rho M_L,\quad
\lambda_i'=\lambda_i/c_\rho,\quad
\Phi'=\Phi Q/\sqrt{c_\rho}. \tag{V5}
\]
단일 simple eigenvalue에서는 Q가 sign이고 repeated group에서는 orthogonal mixing이다.
Eigenvalue scaling error는 `|c_rho lambda_i'-lambda_i|/s`로 측정한다
(`s`는 baseline E6 operator time scale). Group vector 비교는
`U=L^T P^T C^T D^-1 Phi`, `U'=L^T P^T C^T D^-1(sqrt(c_rho) Phi')`로 정의한
projector 차이 `||UU^T-U'U'^T||F/sqrt(2r)`를 사용한다. r은 group dimension이다.
Dense projector를 구성하지 않고 orthonormal U/U'의 cross-Gram으로 같은 norm을 계산할
수 있다. Arbitrary clustered-but-distinct vectors를 회전하여 다른 eigenpairs로 만들지 않는다.
## V6. Lowest N, cluster, near-zero와 오류 판정 소유권
E6 count/solve history는 각 `(a,b)`, prefix empty evidence, status, count, m0,
returned m, loop/epsout, bounds source와 final selected ranks를 보존한다.
모든 returned pair에 interval separation을 검사하고 requested N개만 검사하지 않는다.
Near-zero/negative 분류 scale은 `s` 또는 그와 동등한 E6 operator scale이며 reference
최소값이나 arbitrary absolute frequency가 아니다. Raw lambda는 바꾸지 않는다.
NR가 구현 전에 결정해야 할 항목은 다음과 같다.
| 대상 | 수치값/필수 검사 소유권과 필요한 scale |
| --- | --- |
| Matrix symmetry, moment/oracle/centroid/M9 | V1/V2의 same-unit norm, total mass 및 `m ell`; roundoff/독립 적분 오차 분리 |
| Null/orthogonal basis, KZ/MZ, mass conditioning | M8/E2 analytic rank, V2 및 작은 positive block condition; near-null 삭제 금지 |
| Residual, Gram, energy, rigid modes | V1~V4, V5 K-action; machine precision·차원·conditioning 근거 |
| Near-zero/negative/cluster 분류 | `|lambda|/s`, pairwise `|lambda_i-lambda_j|/s`; raw value 보존 |
| FEAST control | Contour points/precision exponent/refinement bound, finite count/endpoint/solve retry budget |
| Endpoint safety | Operator scale와 ULP, count monotonicity, enclosing total n, solve/count 및 full-rank Gram |
| Independent test portfolio | 평판 M10, warped/director-varying M5~M9, 비축정렬/부분 BC/E5 오류 case, FEAST known spectra, density/rigid/좌표 tests |
| r2 stabilization/static | S1~S8의 positivity/재계산 공변성·partial BC eigen/static, nonlinear 고정 scale·exact variation과 기존 static portfolio |
| External reference | r1 NR의 원본 input+TXT 10개 Value·singleton family·모두 blocking 논리 계약을 r2 영향 확인 후 유지 |
Small independent pencil은 손으로 대각화 가능한 값을 사용하고 동일 production
mass/reduction/eigensolver를 기대값 계산에 호출하지 않는다. API wrapper의 injected status
검사와 실제 FEAST runtime known-spectrum 검사는 모두 필요하다. Size1, N=n, repeated
group>N, tight cluster, zero/negative, empty interval, insufficient subspace, count collision,
unresolved conditioning 및 allocation/index failure가 해당 공식 계약을 검증한다.
Case의 구체적 목록·숫자는 NR가 정하고 Planning이 tests와 TDD steps에 연결한다.
외부 비교는 지정 [원본 input](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp)과
[원본 TXT](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt)의
`Value`만 사용한다. `lambda [T^-2]`, source `Step-2`, mode 1..10이 의미적 대응이다.
Frequency 재계산, mode shape correlation이나 다른 mass variant의 더 가까운 결과 선택으로
이를 대체하지 않는다. Mode/frame은 NR/I/O가 common same-frame family 규칙에 맞춰
정의하고 missing/extra/duplicate/nonfinite를 tolerance 전에 거부한다.
[r1 reference-model](reference-model.md)의 10개 singleton family·모두 blocking 계약과
공통 정책에 따른 실효 mode별 1%는 보존할 근거다. Formulation이 이를 재선택하지 않으며
r2 영향 재확인은 NR 소유다. V1~V6의 내부 수치 기준은 아직 NR에서 최종 고정하지 않았다.
Schema 경로/저장 field/public diagnostic 이름은 I/O owner의 계약이다.
## V7. 실행 evidence와 남는 위험
이 절의 명령·hash·4문서 검사는 **r1 이력**이다. r2 갱신 evidence는 V8에 둔다.
Formulation 단계에서는 승인 문서와 실제 source를 read-only로 대조하고 자체 수식을
전개했다. 다음 입력은 변경하지 않았다: requirements/research, 관리문서, source/tests/build,
Harness, 공통 tolerance 및 원본 reference. External solver, CMake/CTest, Harness, FEAST
runtime, numerical reference comparison은 실행하지 않았다. 이 문서는 수치 통과 evidence가 아니다.
`Get-Content`, scoped `rg`로 M4의 변환·stabilization과 공통 nodal frame 전달을 확인했다.
한 scoped `rg` 호출은 존재하지 않는 `runtime_element_factory.cpp`와 PowerShell literal
glob 경로 때문에 exit `1`이었다. `rg --files`/`rg -n ... src/fesa`로 실제
`element_factory.cpp`, `shell_geometry.cpp`를 찾아 재조회했고 exit `0`이었다.
Intel parameter/API/status의 공식 문서를 2026-09-06 다시 열어 count 의미,
endpoint/count failure와 m0 capacity를 확인했다(E7의 URL 및 research S05~S07).
`Get-FileHash`는 exit `0`이며 원본 SHA-256은 upstream과 같다.
Input: `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`.
TXT: `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`.
Owned 4개 문서를 `python -B -` read-only here-script(`pathlib`, `re`,
`urllib.parse.unquote`)로 정적 검사했다. Owner/Feature/revision, 26개 requirement
coverage, 상대 링크 실재, trailing whitespace/final newline, display-math delimiter와
언어 혼입을 검사했다. Exit `0`, documents `4`, local links `38`, requirements `26`,
issues `0`이다. `git diff --check`도 exit `0`이며 Coordinator 소유 `coordination.md`의
LF/CRLF warning만 출력되었다. 새 untracked owned 문서의 whitespace는 위 Python 검사로
별도 확인했다. `git status --short`에서 owned 4개와 타 owner coordination 변경을 구분했으며
stage/commit 또는 타 owner 수정은 하지 않았다.
잔여 위험은 매우 얇은 shell/거의 정렬된 부분 BC의 mass conditioning, geometry quadrature
검사점 밖의 전역 injectivity 한계, floating-point FEAST count/endpoint와 repeated subspace,
count scratch 및 shifted factorization memory다. NR가 위 metric·수치 기준·case를 고정하고
Implementation이 실제 설치 backend와 reference evidence를 제시해야 해소된다.
## V8. r2 영향 확인과 bounded evidence
r2에서는 M4의 scale, E3의 개선된 pencil 명시, V5의 complete K/partial-BC coverage와
정적 회귀 연결을 갱신했다. Mass M1/M2/M5~M10 및 FEAST E6~E8, V1~V4의 검증식은
numerical scale 선정과 독립이거나 동일 개선된 K를 대입하는 식이므로 보존한다.
r1 NR의 curved rational mass oracle·27점 degree 결과, count/trace API 근거와 reference
identity는 읽고 재사용 범위를 확인했으며 새 실행 결과로 바꾸지 않았다.
`Get-Content`와 scoped `rg`로 r2 승인 요구/연구·기존 선형 요구 034/036/038/056,
nonlinear §10.1~10.4 및 아래 실제 source를 대조했다. 이 조회는 exit `0`이었다.
```powershell
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_reference|drilling_stiffness' src/fesa/elements/mitc4_shell.cpp
rg -n 'drilling|Drilling|Stiffness\(' src/fesa/elements -g '*nonlinear*'
```
처음 nonlinear source 검색에 literal `src/fesa/elements/*nonlinear*`를 사용한 호출은
PowerShell 경로 오류를 출력했다. 해당 검색을 위 `-g` 방식으로 고쳐 exit `0`을 확인했다.
원본 reference 및 기존 NR mass oracle/옛 반례를 다시 실행하지 않았다.
2026-09-06 web `open`으로 S1의 LAPACK 공식 문서상 작은 eigenvalue 상쇄 경고를 확인했다.
Configured vault grounding 요청이 없으므로 `fem-theory-query`는 별도 적용하지 않았다.
다음은 NR의 R block을 사용해 **새 scale 식의 exact arithmetic만** 확인한 명령이다.
Production source prototype, C++ test, FEAST 또는 독립 NR 판정을 대체하지 않는다.
```powershell
@'
from fractions import Fraction as F
aa,bb=F(49,12),F(23,6)
base=[]; rotated=[]
for ab in [F(1,8),-F(1,8),F(1,8),-F(1,8)]:
base.extend([aa,bb])
rotated.extend([(25*aa+16*bb+40*ab)/41,
(16*aa+25*bb-40*ab)/41])
ref=sum(base)/8
assert ref == sum(rotated)/8 == F(95,24)
kd=ref/1000
mass=F(3,50)
stiffness=F(9,25)*bb+F(16,25)*kd
assert kd == F(19,4800)
assert stiffness == F(10369,7500)
assert stiffness/mass == F(10369,450)
assert F(3,5)*(-F(4,3))+F(4,5) == 0 # d dot (5b/3)
print('k_ref=',ref,'k_d=',kd,'Mff=',mass,'Kff=',stiffness,
'lambda=',stiffness/mass,'theta_per_unit_moment=',1/stiffness)
'@ | python -B -
```
실제 위 here-script를 문서에서 추출해 `python -B -`로 실행했다. Exit `0`,
`k_ref=95/24`, `k_d=19/4800`, `Mff=3/50`, `Kff=10369/7500`,
`lambda=10369/450`, 단위 moment 응답 `7500/10369`를 얻었다.
Owned 5개 문서의 metadata·27 requirement coverage·57개 상대 경로·whitespace·final newline·
display-math delimiter·언어 혼입을 read-only Python으로 검사했고 exit `0`, issues `0`이었다.
`git diff --check`도 exit `0`; LF/CRLF 안내만 있었으며 compiler warning 검증과는 별개다.
Stage/commit은 하지 않았고 `git status --short`의 Coordinator 변경은 보존했다.
이 exact 식에 수치 tolerance를 추가하지 않는다. NR가 S1~S8을 독립 검토하고 V6의 내부 기준·
FEAST budget/seed·mandatory matrix를 완성해야 한다. Implementation은 승인된 기존 static
portfolio와 새 eigen Value-only 비교의 실제 TDD/runtime evidence를 생성해야 한다.
Source/tests/build/phase/Hook/reference/Git 및 다른 owner 문서를 편집하지 않았다.
CMake/CTest·Harness·FEAST·외부 solver·reference numerical comparison은 이 단계에서 미실행이다.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,110 +0,0 @@
# 구현 경계와 source/test 대응
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `implementation-planning-agent`
- Input contract revision: `r2`
- 기본 보고서: [implementation-plan](implementation-plan.md)
## 실제 repository 확장점
기존 `DomainMappingContext::Impl`이 syntax·material/property·sole step candidate를 소유하고
thin mapper들이 finalize를 호출한다. 이 범위를 확장하며 parallel parser/새 registry를 만들지
않는다. `KeywordBlock`에는 physical_lines가 있지만 `DataLine`에는 fields/location만 있어
I/O의 raw count/density data를 보존하려면 `original_line`이 필요하다.
`Domain::Steps()`와 `AnalysisModel::Step()`은 기존 static API다. 별도 frequency 정의를
추가하고 active boundary/location view로 DofManager를 연결한다. StaticStep의 미사용 time/load
fields에 frequency 의미를 끼워 넣지 않는다. FrequencyStep은 boundaries/source options/N을
소유하고 density는 material identity에 연결된 Domain composition record다. Concrete material
base를 optional capability로 늘리지 않는다.
현재 `ElementFactory::CreateShell`은 private이고 `unique_ptr<Element>`를 반환한다. 승인
shell-only procedure에 필요한 typed `CreateMitc4Shell` 생성 seam을 추가하되 기존 generic
Create도 같은 checked construction을 사용한다. Consumer의 downcast/type-switch 없이
typed mass contribution과 기존 ElementView stiffness contribution을 같은 layout/scatter에 준다.
Global equation/index/pattern은 끝까지 DofManager 소유다.
`Mitc4Shell::Stiffness`는 현재 min rotary diagonal을 사용하고
`NonlinearMitc4Shell::Create`는 그 초기 kd를 저장한다. 새 private trace helper로 앞 경계만
바꾸면 nonlinear은 기존 frozen path를 재사용한다. Tests는 formula 값 변경뿐 아니라
완전한 geometry/frame 재생성·partial BC·반력·objective tangent를 검증한다.
`hdf5_internal::WriteModel`은 model datasets와 static metadata를 함께 쓴다. Model-only seam을
분리하고 기존 WriteModel이 같은 static metadata와 datasets를 호출하도록 유지한다. Eigen은
그 model-only 함수와 eigen-only metadata/schema를 사용한다. 기존 static reader inventory는
그대로 두며 eigen discriminant 없이 새 파일을 static으로 읽지 않게 테스트한다.
## Step별 API와 책임
| Step | 완성되는 경계 | 소유 데이터와 호출 규칙 |
| --- | --- | --- |
| 0 | FrequencyStep, Domain::FrequencySteps/Densities, active view, exact mapping | Raw syntax→validated immutable records; density/t/source resolution; static API/순서 보존 |
| 1 | ComputeDrillingScale→Mitc4Shell::Stiffness | 초기 physical20만 입력, eight diagonals scaled mean; nonlinear 초기 저장 경로 재사용 |
| 2 | ConsistentMass→DeriveLumpedMass→ShellMassAssembler | Original24/C0..2 snapshot 보존, nodal6 blocks, stable COO/reduction; same source scatter |
| 3 | ReduceEigenSystem/RestoreEigenvector, DofManager finite layout | Original free K/ML 별도 보존, node P/Z/L/rcond와 finite pattern, sparse block whitening |
| 4 | FeastBackend/InitialSpace/Search→EigenSolver::SolveLowest | Vendor-private actual calls, neutral scalar/vector/history output; actual N/n/c/m0 각각 구분 |
| 5 | ValidateEigenpairs→LinearFrequencyProcedureExecutor::Execute | All-c 검증 후 paired N candidate, 전체 c metrics/history, Domain/view 수명, 아직 accepted commit 아님 |
| 6 | EigenResultsWriter/WriteEigenSchema/SelfCheckEigen→prepared CLI finalization | Log close, candidate close/readback, final replacement 뒤 nofail state swap |
| 7 | EigenReferenceComparison와 fresh-run portfolio | Source-key Value-only join/common policy, raw/new-binary evidence, canonical3 보고서 |
Private helper names는 Step에 지정한 책임·signature 역할을 지킨다. Parameter type의 상세 배치와
작은 private structs는 Implementation이 routine 선택할 수 있지만 승인 owned files 밖 확장,
physics/schema/tolerance 변경은 Coordinator에 반환한다. Public header는 standard/FESA value
type만 노출하고 MKL_INT, HDF5 hid_t, Win32 handle/header는 private source에 둔다.
## TDD file boundary
각 Step index는 tests/build/reports를 포함한 정확한 path 목록을 가진다. 현재
`scripts/msvc_harness/tdd_policy.py`는 production basename에 대응하는 test basename을
찾으므로 새 C++ header/source의 test를 반드시 먼저 생성한다. 아래는 새 경계별 대응이며
기존 production은 해당 existing test와 추가 feature suite를 함께 사용한다.
| Production basename | Related test path |
| --- | --- |
| frequency_step | `tests/unit/model/frequency_step_test.cpp` |
| domain_mapping_context | `tests/unit/io/abaqus/domain_mapping_context_test.cpp` |
| mitc4_drilling_scale | `tests/unit/elements/mitc4_drilling_scale_test.cpp` |
| mitc4_shell_mass | `tests/unit/elements/mitc4_shell_mass_test.cpp` |
| shell_mass_assembler | `tests/unit/assembly/shell_mass_assembler_test.cpp` |
| eigen_reduction | `tests/unit/analysis/eigen_reduction_test.cpp` |
| feast_backend | `tests/unit/solvers/eigen/feast_backend_test.cpp` |
| feast_initial_space | `tests/unit/solvers/eigen/feast_initial_space_test.cpp` |
| feast_search | `tests/unit/solvers/eigen/feast_search_test.cpp` |
| eigen_solver | `tests/unit/solvers/eigen/eigen_solver_test.cpp` |
| mkl_feast_eigen_solver | `tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` |
| eigen_analysis_state | `tests/unit/analysis/eigen_analysis_state_test.cpp` |
| eigen_validation | `tests/unit/analysis/eigen_validation_test.cpp` |
| linear_frequency_procedure | `tests/integration/analysis/linear_frequency_procedure_test.cpp` |
| eigen_results_writer | `tests/unit/results/eigen_results_writer_test.cpp` |
| eigen_hdf5_results_writer | `tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp` |
| eigen_hdf5_schema | `tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp` |
| hdf5_model_writer | `tests/unit/io/hdf5/hdf5_model_writer_test.cpp` |
| prepared_analysis | `tests/unit/analysis/prepared_analysis_test.cpp` |
Existing stem의 `model_types/domain/analysis_model/dof_manager/input_syntax/input_reader/
mitc4_shell/element_factory/fesa_application`은 현재 대응 tests가 있고 각 Step의 관련 test와
함께 검증한다. 새 test registration은 `tests/CMakeLists.txt`, 새 library cpp는
`src/fesa/CMakeLists.txt`만 소유한다. Root CMake/dependency/preset 변경은 필요하지 않다.
Vendor link/runtime는 기존 Fesa::MKL/HDF5/TBB target closure로 실제 API를 실행해 확인한다.
명백한 missing runtime가 발견되면 임의 PATH 우회나 scope 확대 대신 exact evidence를 반환한다.
현재 `tests/CMakeLists.txt`의 `fesa_tests`는 세 executable `fesa_unit_tests`,
`fesa_integration_tests`, `fesa_reference_tests`에 의존하는 aggregate target이다.
따라서 Step의 `--target fesa_tests`는 reference까지 빌드한다. 새 `tests/unit/` 파일은
unit executable, `tests/integration/` 파일은 integration executable, `tests/reference/`
파일은 reference executable에 등록한다. 각 executable의 기존 runtime staging과
`gtest_discover_tests`를 유지한다. Focused inventory에서 새 이름 모두가 존재해야 한다.
## Candidate commit과 테스트 주입
별도 `EigenAnalysisState`는 N vectors와 raw scalars/source, all-c checks/history만 소유한다.
Working reduction/solver scratch는 procedure 실행 동안 유지되고 accepted state에 global dense
matrix나 미래 dynamics state를 남기지 않는다. `Swap`은 `noexcept`이고 소유 vector/record
교환만 수행한다. Execute 반환 candidate를 accepted state라고 보고하지 않는다.
Prepared/static 기존 overload는 보존하고 frequency executor/result/writer가 있는 overload를
추가하여 procedure 선택을 한 경계에 둔다. Output finalization은 candidate를 완성/검증/close하고
final replacement 성공 뒤 state swap을 수행한다. 이 순서에 fallible callback/allocation을
남기지 않는다. Failure injection은 EigenSolver/EigenResultsWriter 및 private backend/schema
seam에 제한한다. 새로운 public CLI failure flags는 없다. Raw HDF5 mutation은 test-local
generated file에서만 하고 저장 reference input/TXT/CSV는 read-only다.
@@ -1,110 +0,0 @@
# MITC4 질량·FEAST 구현 계획
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `implementation-planning-agent`
- Input contract revision: `r2`
- 요청 outcome: `pass`; 다음 owner: `implementation-agent`
- 의미: 실행 가능한 계획의 Coordinator gate 검토 요청이다. 구현/검증 완료 판정이 아니다.
최초 prep attempt1은 지정 Hook 설정 쓰기 거부로 종료되었다. 부분 구현·blocked 기록의
보존과 승인 후 조건부 재개는 [복구 계획](implementation-recovery.md)을 따른다.
원 6단계 gate와 아래 main 계획은 유지하며 WIP 보존을 구현 성공으로 판정하지 않는다.
Prep에는 성공한 source echo를 helper failure로 오판한 재현 결함의 최소 classifier TDD도
포함한다. 기존 scripts/execute.py/tests/test_execute.py 소유 안에서 수행한다.
별도 Correction은 실제 RED21fail/16pass 뒤 GREEN37pass를 확보했다. 전체 pytest의 Hook
불일치와 manual build의 TEMP 접근 거부는 남아 있다. [R6](implementation-recovery.md#r6-실제-correction-source2의-보존과-남은-실행-조건)의
source2 보존 뒤 [E6](implementation-environment.md#e6-correction-후의-pythonpytest와-process-temp)의
확인된 Python 및 정상 TEMP/TMP 설정으로 후속 검증을 준비한다. 현재 source checkpoint,
status reset과 DFA 실행은 미실행이며 exact-run 명시 승인도 아직 없다.
위 E6 승인·재개는 이후 실제 attempt2로 수행됐다. Hook7500/focused136pass와 build는
완료됐지만 긴 inherited TEMP의 test323 실패로 전체 gate는 미완료다. 현재 복구는
[R7](implementation-recovery.md#r7-attempt2-실패-보존과-정상-workspace-write-재개)의
error/history2 WIP 보존 뒤 [E7](implementation-environment.md#e7-짧은-temp를-사용하는-정상-재개)의
짧은 TEMP와 정상 workspace-write를 사용한다. 이번에는 추가 DFA 승인이나 source Correction이 없다.
이후 attempt3은 짧은 TEMP를 같은 shell에 지정해도 manual build의 FileTracker 접근 거부로
종료됐다. 현재 작업은 [R8](implementation-recovery.md#r8-attempt3의-blocked-기록-보존)의
report1/controls2 blocked/history3 WIP 보존이다. [E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)의
정상 Ninja 대안은 후속 bounded delta에서 명령을 확정하며 이번에는 설정·status reset·재실행하지 않는다.
R8 report/controls 보존은 실제 두 commit과 clean 확인까지 완료됐다. 현재
[E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)은 Root의 ignored 설정 준비와
Coordinator의 별도 정상 Ninja invocation, 기존 Step 명령 대응을 확정한다.
[R9](implementation-recovery.md#r9-e8-활성화-전의-status-only-checkpoint)의 status-only 변경·checkpoint는
후속 할당으로 남는다. 이번 delta는 문서/정적 확인이며 native Ninja 성공은 아직 미검증이다.
Attempt4의 최초 manual Ninja build는 GoogleTest discovery JSON 오류로 실패했다.
[R10](implementation-recovery.md#r10-attempt4의-errorhistory4-보존)이 report1/controls2의
error/history4 보존을 고정한다. [E9](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)는
정상 병렬도1·실제 clean-first 검증을 계획한다. 현재 resolver의 canonical Stop1800 해석은
확인됐지만 정상 override 지원·적용 방법은 미확정이다. R11 status-only 변경과 재실행은 별도 할당 전 수행하지 않는다.
새 Root configure 실패는 parent env4에 의존한 cache overwrite다.
[E10](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)은 Root 소유의
ignore1줄·ignored UserPresets/local config를 계획한다. 실제 setup은 아직 미실행이고
[R12](implementation-recovery.md#r12-user-preset-setup-이후의-stale-hash-경계)의 R11 hash 갱신은
actual setup 뒤 별도 할당한다. MFE-OQ-004 공유 Hook·재신뢰 결정은 계속 별도 미승인이다.
이후 E10 configure 복구와 ignore1줄 commit은 실제 완료됐다. 현재 R11은 관찰된 local
hash를 반영했고 [E11](implementation-environment.md#e11-실제-local-설정에-대한-정상-invocation)이
local preset preflight/정상 invocation을 고정한다. MFE-OQ-004는 사용자 후속 응답으로
Root가 승인 해석했으며, actual canonical7500/enabled/trusted 확인 전 native는 시작하지 않는다.
현재 attempt5는 과거 VS 수동 명령 실행으로 blocked/history5다. Prep와 main8의 Step 본문을
local preset 명령으로 직접 정합했고 [R13](implementation-recovery.md#r13-attempt5-명령-정합과-실패-보존)에
report1/controls2 보존과 별도 status-only 복구를 고정했다. 첫4 history·현재 raw는 보존하며
registered local 성공을 미완료 manual full VERIFY로 대체하지 않는다. 이번 delta는 계획/정적 확인뿐이다.
[FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)와
[coordination](coordination.md), 승인된 [requirements](requirements.md), [research](research.md),
[formulation](formulation.md), [NR](numerical-review.md), [I/O](io.md) 및 각 상세 r2를 적용한다.
공통 [architecture](../ARCHITECTURE.md), [tolerance](../TOLERANCE.md),
[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md),
[harness](../../.agents/skills/harness/SKILL.md),
[fem-implementation-tdd](../../.codex/skills/fem-implementation-tdd/SKILL.md)가 실행 기준이다.
## 실행 구성
별도 execution-prep1 Step을 마친 뒤 새 invocation에서 main8 Steps를 수행한다.
각 Step은 behavior별 RED→observed failure→minimal GREEN→focused VERIFY를 끝내고
전체 MSVC/x64/Debug CMake/CTest와 등록 Stop을 통과한다. 새 compiler warning은0이다.
| 순서 | 완결되는 범위 | 실행 artifact |
| --- | --- | --- |
| Prep0 | 다섯 유한 deadline 설정·Harness regression·activation | [prep Step0](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md) |
| 0 | Frequency semantic model과 exact 입력 subset | [Step0](../../phases/mitc4-shell-feast-eigen/step0.md) |
| 1 | 공변 drilling scale과 정적 회귀 | [Step1](../../phases/mitc4-shell-feast-eigen/step1.md) |
| 2 | Consistent→lumped 질량과 deterministic 조립 | [Step2](../../phases/mitc4-shell-feast-eigen/step2.md) |
| 3 | 실제 제약의 null 공간과 sparse whitening | [Step3](../../phases/mitc4-shell-feast-eigen/step3.md) |
| 4 | MKL FEAST adapter와 bounded lowest-N 검색 | [Step4](../../phases/mitc4-shell-feast-eigen/step4.md) |
| 5 | 전체 c 검증과 별도 frequency procedure | [Step5](../../phases/mitc4-shell-feast-eigen/step5.md) |
| 6 | Additive HDF5와 CLI candidate transaction | [Step6](../../phases/mitc4-shell-feast-eigen/step6.md) |
| 7 | Value-only comparator·fresh reference·구현 evidence | [Step7](../../phases/mitc4-shell-feast-eigen/step7.md) |
[실행 환경](implementation-environment.md)은 actual autodetect VS18/x64/Debug cache/dependencies,
one-time prep module invocation과 새 main activation, 유한 timeout·Git ownership을 고정한다.
8개로 합친 이유와 시간 추정의 한계도 명시했다. [API/source-test 경계](implementation-interfaces.md)는
기존 확장점과 vendor 격리·별도 state/procedure·candidate commit을 정한다.
[Verification mapping](implementation-verification.md)은 must27/NR27/I/O11 및 formulation/schema
items를 독립 oracle·mutation·실제 test discovery/full evidence에 연결한다.
## 계약과 handoff
계산은 `consistent -> moment-derived lumped -> actual MKL FEAST`이며 all-c residual/Gram도
같은 ML을 사용한다. 입력 N은 원본 FREQUENCY의10, 공개 N과 검증 c를 구분한다.
공변 trace stabilization과 영향 static 재검증을 포함한다. 새 eigen external comparison은 원본
TXT의 Value10개와10singleton common families이며 기존 static U/UR/reaction 역할은 유지한다.
모든 exact implementation/test/build/report paths는 [main index](../../phases/mitc4-shell-feast-eigen/index.json)와
[prep index](../../phases/mitc4-shell-feast-eigen-execution-prep/index.json)에 있다.
미래 보고서를 미리 생성하지 않았다. Planning 소유는 이 main/detail4문서와 할당된 phase files뿐이다.
Solver C++·FEAST·reference comparison은 미실행이다. 운영 prep의 부분 변경과 실제 검증
관찰은 [현재 상태](coordination.md)와 [복구 계획](implementation-recovery.md)에 구분한다.
계획 정적 감사 명령/exit/coverage는 [V7](implementation-verification.md#v7-계획-정적-감사)에 기록한다.
현재 upstream physics/schema/tolerance 미결정은 없다. Native Codex sandbox/runtime와 실제
FEAST count/condition/메모리/외부 오차는 실행 전 성공을 보장할 수 없다. Actual failure는 계약된
owner/환경 경로로 반환하고 수치 기준을 바꾸지 않는다. Workflow 전이·독립 Physics/Release와
closure는 Coordinator/각 owner 소유이며 push/tag/publish/deploy/package 권한은 없다.
@@ -1,219 +0,0 @@
# Execution-prep evidence
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `implementation-agent`
- Input contract revision: `r2`
- Step: `mitc4-shell-feast-eigen-execution-prep` / `0 bounded-execution-deadlines`
- Outcome: `blocked-environment` — R7 재검증에서 MSVC `FileTracker` 접근 거부가
다시 발생하여 Full VERIFY를 완료할 수 없다.
## RED
`uv run --with pytest python -B -m pytest -v -rs tests/test_harness_timeouts.py`
returned exit code `1` twice. The first run exposed one test-double setup issue; after
that test-only correction, the second run failed `4/4` on the intended pre-change
defaults: Executor `1800`, Stop shared deadline `1800`, `CommandSpec` `1800`, and
registered Stop `1800`.
## Applied scope and partial GREEN
The following owned runtime defaults now match the approved finite limits:
- `scripts/execute.py`: `StepExecutor.CODEX_TIMEOUT_SECONDS = 14400`
- `scripts/hooks/stop_validation.py`: `TOTAL_TIMEOUT_SECONDS = 7200`
- `scripts/msvc_harness/models.py`: `CommandSpec.timeout_seconds = 7200`
- `scripts/msvc_harness/process.py`: `execute_plan(... total_timeout_seconds=7200)`
- `docs/HARNESS_WORKFLOW.md`: shared `7200`-second deadline and `7500`-second
registered Stop explanation
The next focused command returned exit code `1`: `2 passed, 2 failed`. The executor
and shared-deadline/process tests passed. The remaining hook contract test fails
because `.codex/hooks.json` still contains registered Stop timeout `1800`.
## Blocker and unexecuted verification
The assigned `apply_patch` edit for `.codex/hooks.json` was rejected twice by the
workspace sandbox as outside the writable project scope. The file is therefore
unchanged; no alternate write mechanism was used. This is an `environment` failure,
not a tolerance, contract, or implementation reinterpretation.
Focused verification cannot reach exit `0` until the approved `1800 -> 7500` hook
edit is writable. Consequently the prescribed CMake configure/build/CTest and full
pytest verification were not run. No reference comparison is applicable to this
operational Step. The source currently loads an Executor wrapper deadline of `14400`,
but this session's actual registered Stop/Codex exit remains unobserved and the
registered config still declares `1800`.
`git diff --check` completed with exit code `0`. A later read-only JSON status check
through `uv run python -B -c ...` could not initialize the user `uv` cache because
access to `C:\Users\baram\AppData\Local\uv\cache\sdists-v9\.git` was denied; it did
not modify the Step status and is additional environment evidence rather than a
replacement for the required verification.
## Handoff
Required environment action: make the owned repository file `.codex/hooks.json`
writable to this Step, then apply only its registered Stop timeout change to `7500`
and rerun Focused VERIFY followed by Full VERIFY. Existing `started_at` is preserved;
no `attempt_history`, timestamp, branch, commit, upstream contract, or reference
artifact was changed.
## 재개 실행 결과 (authoritative)
이 절은 위 attempt 1의 historical record를 대체하는 현재 Step 0 실행 결과다.
Feature/owner/revision은 `mitc4-shell-feast-eigen` / `implementation-agent` / `r2`이며,
요구 trace는 `FEM-REQ-MITC4-EIGEN-023/025`, `MFE-C27`, `IO-T11`이다.
### RED → GREEN
- 최초 `uv run --with pytest python -B -m pytest -v -rs
tests/test_harness_timeouts.py`는 exit `1`이었다. 등록 Stop `1800` 대 `7500`의
intended RED와, 상속된 `FEM_HARNESS_CODEX_SANDBOX=danger-full-access` 때문에
발생한 test-double setup failure를 구분했다.
- workspace-write와 짧은 새 `--basetemp`를 사용한 direct venv 재현은 exit `1`,
`3 passed, 1 failed`였다. 유일한 failure는 `stop["timeout"] == 7500`에 대한
실제 `1800` 값으로, 승인된 intended RED다.
- 최소 GREEN은 [.codex/hooks.json](../../.codex/hooks.json)의 Stop `timeout`만
`1800`에서 `7500`으로 변경했다. 이전 Correction의 `scripts/execute.py` classifier
변경과 `tests/test_execute.py`는 재변경하지 않았다.
- 같은 timeout test는 exit `0`, `4 passed`였다. 새로운 short workspace
`--basetemp`로 Focused VERIFY를 재실행해 exit `0`, `136 passed`, `45.05 s`를
확인했다. classifier inventory는
`test_environment_classifier_ignores_successful_source_echo` 6 cases,
`test_environment_classifier_retains_runtime_helper_failure` 16 cases,
`test_successful_source_echo_preserves_terminal_and_retry` 15 cases로 통과했다.
### Full VERIFY와 terminal failure
| Command | Exit | Result |
| --- | ---: | --- |
| `cmake -S . -B .harness/build -A x64` | 0 | MSVC x64 cache configure, 3.79 s |
| `cmake --build .harness/build --config Debug` | 0 | Debug build, 5.88 s |
| `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | 362 tests discovered, 2.14 s |
| `ctest --test-dir .harness/build -C Debug --output-on-failure` | 8 | 361/362 passed, 1086.77 s |
`ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior`
한 건이 `output-busy` (application exit `6`)로 실패했다. 실패 output identity는
이전 classifier-correction workspace `TEMP/TMP` 아래였고, 실행 종료 뒤 live
`fesa`, `fesa_integration_tests`, `fesa_reference_tests` process 및 해당 output
directory는 없었다. 이 Step의 owned path 밖인 nonlinear application/integration
failure이므로 source나 test를 변경하거나 terminal failure를 즉시 재실행하지 않았다.
순차 Full VERIFY는 CTest nonzero에서 중단했으므로 전체 pytest는 이번 실행에서
**미실행**이다. 이 operating-prep Step에는 external reference comparison이 적용되지
않으며, reference artifact를 읽거나 변경하지 않았다. 현재 source의 wrapper value는
`14400`, 등록 Stop JSON은 `7500`, shared validation/default command deadline은 각각
`7200`이다. 수동 test/build evidence와 registered Stop/Codex process exit는 별개이며,
후자는 이 보고서 시점에 미관찰이다.
Raw logs와 copied CTest `LastTest.log`는 ignored
`.harness/build/mitc4-eigen-evidence/prep/manual-20260906143832/`에 보존했다.
현재 실행에서 변경한 tracked implementation artifact는
`.codex/hooks.json`과 이 보고서뿐이다. Phase Step result는 Executor history/timestamp를
보존한 채 `error`로 반환한다.
### 등록 Stop 관찰
후속 registered Stop (`stop:9`)도 같은 build directory에서
`ctest --test-dir C:\\Users\\baram\\orca\\workspaces\\FESADev\\Eigen\\.harness\\build -C Debug --output-on-failure`를
실행했다. 종료는 exit `8`, `361/362 passed`, real `982.52 s`였고 동일한
`ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior`
만 실패했다. 따라서 새 등록 Stop deadline이 CTest 실행을 차단하지는 않았지만,
이 Step은 정상 terminal validation을 통과하지 못했다. Codex process의 최종 exit는 이
hook observation 자체로 주장하지 않는다.
## R7 재개 재검증
이 재개는 [corrections.md](corrections.md)의 이미 완료된 classifier RED/GREEN을 읽고
현재 source를 재검증한 것이다. GREEN source를 다시 변경하여 RED를 만들지 않았다.
모든 Python 실행은 기존 workspace venv(Python 3.11.15/pytest 9.1.1)와 새 짧은
workspace `TEMP` 및 `--basetemp`(각각 80자 이하)를 사용했다.
| Command | Exit | Result |
| --- | ---: | --- |
| `tests/test_execute.py -k 'environment_classifier or successful_source_echo'` | 0 | `37 passed, 36 deselected`, 8.02 s; 신규 test inventory는 6/16/15 case다. |
| Step 0 Focused VERIFY의 5개 Python target | 0 | `136 passed`; timeout, terminal, ownership, hook scope와 preset contract를 유지했다. |
| `cmake -S . -B .harness/build -A x64` | 0 | MSVC x64 configure 완료. |
| `cmake --build .harness/build --config Debug` | 1 | `ZERO_CHECK`의 `Microsoft.Build.Utilities.FileTracker` 초기화에서 `UnauthorizedAccessException` / `0x80070005 (E_ACCESSDENIED)`가 발생했다. |
configure부터 build failure까지의 실제 wall time은 3.4 s였다. Full VERIFY의 순차 계약에
따라 CTest discovery, CTest run, full pytest는 실행하지 않았다. 이 실패는 C++ compile 또는
테스트 assertion 실패가 아니라 기존 correction evidence와 같은 MSVC host-access 환경
차단이다. 이 Step에는 external reference comparison이 적용되지 않으며 reference artifact는
읽거나 변경하지 않았다.
이번 재검증에서 source, test, Hook configuration은 변경하지 않았다. `scripts/execute.py`의
wrapper deadline `14400`, registered Stop `7500`, shared/default command deadline `7200`은
그대로 확인했다. 현재 process의 registered Stop/Codex terminal exit는 미관찰이며, hook을
수동 실행하지 않았다. 환경이 `FileTracker` 초기화에 필요한 접근을 허용한 뒤 동일한 Full
VERIFY를 configure부터 재실행해야 한다.
## E8.2 Ninja 재개 결과
Feature/owner/revision은 `mitc4-shell-feast-eigen` / `implementation-agent` / `r2`이며,
이 절은 E8.1 configure 및 R9 `pending` checkpoint 뒤의 actual prep 재개 결과다.
`Launch-VsDevShell.ps1`은 현재 PowerShell execution policy로 실행할 수 없었지만, 이 tool
shell에는 이미 `VSINSTALLDIR`, `VSCMD_ARG_TGT_ARCH=x64`, `INCLUDE`, `LIB`, `cl.exe`와
`ninja.exe`가 설정돼 있음을 확인했다. E8이 고정한 dependency 4개와 짧은 새
`TEMP`/`TMP`(80자 이하)는 각 manual command에 process-local로 설정하고 복원했다.
### 현재 Harness regression
| Command | Exit | Duration | Result |
| --- | ---: | ---: | --- |
| `tests/test_execute.py -k 'environment_classifier or successful_source_echo'` | 0 | 8.850 s | `37 passed, 36 deselected`; classifier inventory `6/16/15` 확인 |
| Step 0 Focused VERIFY의 5개 Python target | 0 | 45.635 s | `136 passed`; timeout, terminal, ownership, hook scope와 preset contract 유지 |
| `cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=<E8 archive>"` | 0 | configure/build sequence의 첫 단계 | MSVC x64 Debug Ninja cache configure 완료 |
| `cmake --build --preset windows-msvc-ninja-debug` | 1 | 68.894 s (configure 시작부터 build 종료까지) | `fesa_integration_tests` GoogleTest discovery JSON parse failure |
보존된 correction의 `RED 21 fail / 16 pass -> GREEN 37 pass`는 새 RED로 주장하지 않았다.
이 재개에서 현재 source의 Green regression만 다시 확인했다. 새 source/test/Hook 수정은 없다.
### Full VERIFY terminal failure
Build는 `fesa_solver.lib`와 세 test executable을 link했지만,
`fesa_integration_tests_d537bc73_discovery.cmake`의 CMake 4.4
`GoogleTest/ParseTestList.cmake:96`에서 empty JSON parse로 exit `1`이 됐다. 따라서
필수 순차 흐름에 따라 CTest discovery/run과 full pytest는 **미실행**이다. external
reference comparison은 이 운영 prep Step에 적용되지 않는다.
새 Ninja library는 `src/fesa/Debug/fesa_solver.lib`에 존재하며 68,759,340 bytes,
`mtime_utc_ns=1788680681336813300`,
SHA-256 `679db6fade801c4f0d106c3d1ef90af54fc24798195a401aff83fac92b9704d4`다.
진단은 source 변경 없이 수행했다. 같은 `fesa_integration_tests`의
`--gtest_list_tests --gtest_output=json:<new-file>`는 exit `0`과 유효한 34-test JSON을
생성했고, 동일 generated discovery CMake script의 별도 실행도 exit `0`으로
`fesa_integration_tests_d537bc73_tests.cmake`(30,420 bytes)를 만들었다. 최초 required
build command가 nonzero였으므로 이 후속 관찰을 Full VERIFY pass로 대체하지 않는다.
Raw configure/build 및 rerun-discovery logs는 ignored
`.harness/build/mitc4-eigen-evidence/prep/attempt4/manual-cmake-d2d41bcf6bb242f4b484ea02850d762e/`
및 `.harness/build/mitc4-eigen-evidence/prep/attempt4/integration-discovery-rerun.log`에
있다. `failure_classification`은 `test`이며, Coordinator가 same-r2 test-discovery
failure의 recovery/correction authority를 판정해야 한다.
## R11 status-only 재개 결과
Feature/owner/revision은 `mitc4-shell-feast-eigen` / `implementation-agent` / `r2`이다.
이 재개는 기존 Correction의 RED/GREEN을 읽고 Green source를 재변경하지 않았다.
`phases/index.json`과 이 phase의 Step 0 status-only `pending` 변경은
Planning/Executor 소유로 보존했다.
| Command | Exit | Duration | Result |
| --- | ---: | ---: | --- |
| `tests/test_execute.py -k 'environment_classifier or successful_source_echo'` | 0 | 10.611 s | `37 passed, 36 deselected`; source echo 6 cases, runtime helper diagnostic 16 cases, terminal/retry 15 cases |
| `tests/test_harness_timeouts.py` | 0 | 0.844 s | `4 passed`; 14400/7500/7200 deadline contract 유지 |
| Step 0 Focused VERIFY의 5개 Python target | terminal summary 미관찰 | - | 첫 실행에서 `136` items를 collection했고 failure output은 관찰되지 않았으나, tool output이 terminal summary/exit를 반환하지 않아 exit-0 evidence로 사용하지 않았다. |
| `cmake -S . -B .harness/build -A x64` | 0 | 2.238 s | MSVC x64 configure 완료 |
| `cmake --build .harness/build --config Debug` | 1 | 0.445 s | `ZERO_CHECK`에서 `Microsoft.Build.Utilities.FileTracker` 초기화가 `UnauthorizedAccessException` / `0x80070005 (E_ACCESSDENIED)`로 실패 |
Full VERIFY는 build nonzero에서 중단했다. 따라서 CTest discovery/run과 full pytest는
이번 재개에서 **미실행**이다. 이 operating-prep Step에는 external reference comparison이
적용되지 않으며 reference artifact를 읽거나 변경하지 않았다. 등록 Stop/Codex terminal
exit도 이 manual command evidence에서 관찰되지 않았다.
이 실패는 C++ source, Hook default, Python assertion 또는 upstream contract가 아니라 MSVC
`FileTracker` host-access 환경에 해당한다. `scripts/execute.py`의 wrapper deadline `14400`,
등록 Stop `7500`, shared/default command deadline `7200`은 그대로 확인했다. Full VERIFY를
`cmake -S`부터 재개할 수 있도록 FileTracker 초기화 권한이 있는 MSVC 환경이 필요하다.
File diff suppressed because it is too large Load Diff
@@ -1,285 +0,0 @@
# 구현 검증과 계약 traceability
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `implementation-planning-agent`
- Input contract revision: `r2`
- 기본 보고서: [implementation-plan](implementation-plan.md)
- 권위: [requirements](requirements.md), [NR cases](numerical-review-cases.md),
[NR controls](numerical-review-controls.md), [I/O obligations](io-mapping.md#m5-구현test-obligations와-requirement-연결).
- 아래 테스트는 계획 이름이다. 실제 discovery/실행 전 통과 또는 구현 완료를 뜻하지 않는다.
## V1. 의미 있는 RED와 전체 suite
각 Step은 소단위별 test-first RED/expected failure 기록→최소 GREEN→focused VERIFY 뒤
full CMake/MSVC/x64/Debug CTest 및 Python regression을 완료한다. 기존 회귀가 이미 통과한
사실은 새 RED가 아니다. 부재 API로 인한 정확한 compile/link error는 RED로 기록할 수 있으나
환경/import/dependency failure와 구분한다. Mutations는 test-local data/fixture/injected
backend에서 수행하며 stored reference나 production을 임시로 오염시키지 않는다.
아래 mandatory test names는 해당 Step이 완성될 때 CTest discovery inventory에 **각각 존재**해야
한다. 같은 combined regex가 기존 tests 몇 개만 선택했다고 성공시키지 않는다. New production
basename의 대응 test 파일과 등록된 해당 behavior assertion도 함께 대조한다. 실제 test를
parameterized tests로 쪼갠 경우 원 named obligation→실제 discovered names의 일대일/일대다
대응을 step evidence에 기록한다. Case를 test 이름만 등록하고 assertions를 비워 두지 않는다.
## V2. NR cases의 구체 실행 대응
Threshold와 전체 fixture inventory는 NR 원문이다. 표의 요약을 이유로 그 inventory를 축소하지 않는다.
각 row의 primary test 외 관련 단계의 preprocessing/injection/schema tests를 함께 수행한다.
| Case ID | Steps | Mandatory primary test / file | 독립 oracle·오류 검출 |
| --- | --- | --- | --- |
| MFE-C01 | 2 | `Mitc4ShellMass.MfeC01FlatMomentOracle`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | 4x2, rho3,t1/2의 exact C0/C1/C2; node m3,j1/16; direct energy/physical20 Cholesky/null; rho4/t2 powers. Wrong shear factor/rotary scaling을 검출. |
| MFE-C02 | 2 | `Mitc4ShellMass.MfeC02CurvedParticleOracle`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | NR rational X/d의 independent polynomial 또는 고차 direct particle integral. C1 zero/2-point/flat C2 mutation의 error가 기준을 넘는지 확인. |
| MFE-C03 | 2 | `Mitc4ShellMass.MfeC03DerivedSnapshotAndJensen`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | C1/C2 symmetric perturbation→moment snapshot/consistent/derived block을 각각 대조. Independent nodal integral, central variance, spatial first moment, four velocity families의 Jensen work. |
| MFE-C04 | 2 | `ShellMassAssembler.MfeC04RefinementEnergy`<br>`tests/unit/assembly/shell_mass_assembler_test.cpp` | m1/2/4 square mesh, velocity(x,0,0); direct MC work4/3, ML-MC8/(3m²), constant velocity total4. Spectrum convergence 주장은 하지 않음. |
| MFE-C05 | 2 | `Mitc4ShellMass.MfeC05RotatedMassAndCentroid`<br>`tests/unit/elements/mitc4_shell_mass_test.cpp` | NR rational proper Q+shift(7,-3,5), geometry/directors 새 생성; two mass congruence/centroid/null. d=(1,1,1)/sqrt3에서 global scalar-row lump mutation 검출. |
| MFE-C06 | 0, 2, 5 | `ShellMassAssembler.MfeC06SourceAndParallelOrder`<br>`tests/unit/assembly/shell_mass_assembler_test.cpp` | Shared nodes와 두 rho/t, 선언/label permutation, independent source/scatter mapping. Fixed input sequential/TBB 재실행의 CSR/reduction exact order와 source-renumbered 대응 결과를 구분. |
| MFE-C07 | 0, 2 | `FrequencyDomain.MfeC07DensityFailures`<br>`tests/unit/io/abaqus/frequency_domain_test.cpp` | Density scope/arity/duplicate/unresolved/missing/zero/negative/NaN/Inf/temperature/dependencies. Kernel 27-point invalid·geometry/t/material 거부는 Mitc4ShellMass에서 별도; density 없는 static 유지. |
| MFE-C08 | 1, 3, 5 | `Mitc4Covariance.MfeC08PartialBcCovariance`<br>`tests/integration/analysis/mitc4_covariance_test.cpp` | NR001 rectangle/Z45에서 새 K/kd와 two mass, actual BC URZ-only. kd19/4800,Kff10369/7500,Mff3/50; Step5 actual FEAST lambda10369/450/full residual. Old min mutation 실패. |
| MFE-C09 | 1, 7 | `Mitc4Covariance.MfeC09StaticReactionCovariance`<br>`tests/integration/analysis/mitc4_covariance_test.cpp` | Admissible physical moment (5/3)b, thetaZ7500/10369. Fresh geometry/load 재생성 후 full Kq-F의 모든 reaction component와 physical projection 기준 확인. |
| MFE-C10 | 1 | `Mitc4DrillingScale.MfeC10TraceInventory`<br>`tests/unit/elements/mitc4_drilling_scale_test.cpp` | [0,0,2,4,0,6,0,4]→kref2, zero/negative/nonfinite/large/subnormal; node별 독립 tangent rotation angles. Positive-only mean/min/floor mutation 검출. |
| MFE-C11 | 1, 2, 3, 5 | `LinearFrequencyProcedure.MfeC11SixPhysicalRigidModes`<br>`tests/integration/analysis/linear_frequency_procedure_test.cpp` | Free element/patch six tangent-projected rigid fields vs four massless drills. PhysicalK20 rank14/MC20PD/K24rank18, finite20·six near-zero actual modes와 mass Gram; preprocessing tests도 포함. |
| MFE-C12 | 1, 7 | `NonlinearMitc4Tangent.MfeC12FrozenCovariantScale`<br>`tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp` | Initial S1 scale의 trial/commit/rollback 불변, existing gamma의 full FD schedule/index3/tangent/objectivity/physical linear limit/recovery. 기존 tests는 회귀이며 새 RED로 가장하지 않음. |
| MFE-C13 | 0, 3, 5 | `EigenReduction.MfeC13ExactBoundaryNullIntersection`<br>`tests/unit/analysis/eigen_reduction_test.cpp` | NR 세 director와 supported mask 조합, drill-only는 axis-aligned URZ만; per-node rank0를 global failure로 오인하지 않음. Global n0/N>n, source constraint exact0. |
| MFE-C14 | 3, 5 | `EigenReduction.MfeC14NearNullConditioning`<br>`tests/unit/analysis/eigen_reduction_test.cpp` | p1/2000 analytic5 pass, p1e-8 analytic5 conditioning/Cholesky fail, p0 null1. rcond2^-32 equality/nextafter tests; tiny positive를 삭제하면 failure. |
| MFE-C15 | 3 | `EigenReduction.MfeC15RejectsInvalidDecoupling`<br>`tests/unit/analysis/eigen_reduction_test.cpp` | Test-local K[[6,2],[2,4]],Mdiag2,0 finite2.5/z=-p/2. Production Kpz nonzero/Kzz nonpositive injected rejection; 삭제3 또는 general Schur fallback 금지. |
| MFE-C16 | 3, 5 | `EigenValidation.MfeC16OriginalMassAndPairing`<br>`tests/unit/analysis/eigen_validation_test.cpp` | M[[2,1],[1,2]],K[[6,4],[4,6]]→2,10/3; triangular whitening/restoration. Wrong M/lambda/vector/null/constraint corruption을 full original-space 검사로 탐지. |
| MFE-C17 | 4, 5 | `MklFeastEigenSolver.MfeC17KnownLowestSpectra`<br>`tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | Actual API+production search: n1; [0,0,0,2,5,9] N1/4/6; [1,2,4,8] N1/2/4; allzero n4 N1/4. Matrix-derived enclosure/count history와 independent ordered spectrum. |
| MFE-C18 | 4, 5 | `MklFeastEigenSolver.MfeC18RepeatedAndTightClusters`<br>`tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp` | Actual n64 fortyfold1+2..25 N1/41; tight[1,1+2^-28,1+2^-27,8] N2; fixed Givens dense CSR. c>N/all-c Gram와 gap/8, repeated projector 기준. 개별 repeated vector equality 아님. |
| MFE-C19 | 4, 5, 6 | `EigenValidation.MfeC19RawSignedEigenvalues`<br>`tests/unit/analysis/eigen_validation_test.cpp` | Actual [-2,0,3],[-1e-12,0,1] backend raw; procedure significant negative failure. ±tauzero 및 nextafter, frequency ID subset/finite/underflow. Small positive도 N에 포함. |
| MFE-C20 | 2, 3, 5 | `LinearFrequencyProcedure.MfeC20DensityAndUnits`<br>`tests/integration/analysis/linear_frequency_procedure_test.cpp` | TwoM×4,lambda/4,amplitude1/2; repeated projector; length1024/rho1024^-3/E1024^-1/t1024의 lambda invariance. Baseline s와 동일 물리 BC. |
| MFE-C21 | 4, 5, 6 | `FeastSearch.MfeC21StatusAndHistoryFailures`<br>`tests/unit/solvers/eigen/feast_search_test.cpp` | C21 전체 raw status inventory, endpoint/zero count/nonmonotonicity/total!=n/m!=c, invalidCSR/fpm/SPD/QR/pair/residual. c>N의 뒤 column 손상과 false-lowest success를 검출; 허용 retry 외 즉시 실패. |
| MFE-C22 | 4, 6 | `FeastSearch.MfeC22FiniteBudgetsAndCapacity`<br>`tests/unit/solvers/eigen/feast_search_test.cpp` | 512count/3solve inclusive와 초과,384 optimization+128reserve, certified fallback. n²/n*m0/nnz+1/byte overflow 및 allocation injected failure; 큰 allocation 실제 고갈을 유발하지 않음. |
| MFE-C23 | 0, 5, 6, 7 | `FrequencyDomain.MfeC23ExactReferenceSubset`<br>`tests/unit/io/abaqus/frequency_domain_test.cpp` | 원본729/676/Step-2/N10, density/t/S4R/warnings/source records. N invalid·fields2~7 nonempty0/eighth empty·unsupported enum/procedure/load/acoustic/mixed/nonzero BC; I1~I6 전 inventory. |
| MFE-C24 | 5, 6, 7 | `EigenHdf5Schema.MfeC24RoundTripAndRejection`<br>`tests/unit/io/hdf5/eigen_hdf5_schema_test.cpp` | O1~O5 independent reader/mutation, N/c/source/units/backend/ML/flags/types/ranks. FrequencyApplication failure matrix는 이전 final/state hash와 최초final부재를 각각 확인. |
| MFE-C25 | 7 | `EigenReferenceCases.MfeC25FreshTenValueFamilies`<br>`tests/reference/eigen_reference_cases_test.cpp` | 원본TXT full grammar+source join/10singleton 실제fresh eigen 비교. EigenReferenceComparison 음성/1%RMS·5%row·near-zero·S0 boundaries, Freq mutation 판정불변. |
| MFE-C26 | 1, 6, 7 | `Mitc4EigenStaticRegression.MfeC26FreshApprovedPortfolio`<br>`tests/reference/mitc4_eigen_static_regression_test.cpp` | shell/shellNL/shellNL-meshfine와 linear-limit 역할. 원본copy→actualrun→기존 Ublocking/URwarning/localreactionreview+factor1 internalbalance. Existing meshfine-02 post-closure·pressure fullsuite 유지. |
| MFE-C27 | 0, 1, 2, 3, 4, 5, 6, 7 | `EigenReferenceCases.MfeC27FreshAndRepeatedEvidence`<br>`tests/reference/eigen_reference_cases_test.cpp` | 모든 Step RED/GREEN/full 실제exits/warnings/identity; 같은 binary/runtime/thread/input3회 CSR/row/diagnostic exact와 scalar/projector. Fresh binary/source/result evidence·canonical reports, 독립Physics/Release는 후속gate. |
C07은 추가 `Mitc4ShellMass.MfeC07InvalidMassGeometry`, C08은
`LinearFrequencyProcedure.MfeC08PartialBcEigenvalue`, C24는
`FrequencyApplication.MfeC24PreservesFinalAndState`, comparator 음성/경계는
`EigenReferenceComparison.MfeC25PrechecksAndToleranceBoundaries`를 mandatory로 둔다.
각 companion은 해당 Step의 discovery에서 확인하고 record한다.
## V3. 전체 must requirement 대응
전27개 requirement의 NR case mapping을 그대로 옮겨 실행 Step에 연결했다. Requirement025의
Implementation evidence는 여기서 준비하되 독립 Physics/Release gate는 후속 owner가 수행한다.
| Requirement ID | Required NR cases | Implementation steps |
| --- | --- | --- |
| FEM-REQ-MITC4-EIGEN-001 | MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-003 | MFE-C06, MFE-C07, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-004 | MFE-C01, MFE-C02, MFE-C07 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md) |
| FEM-REQ-MITC4-EIGEN-005 | MFE-C01, MFE-C02, MFE-C03 | [2](../../phases/mitc4-shell-feast-eigen/step2.md) |
| FEM-REQ-MITC4-EIGEN-006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) |
| FEM-REQ-MITC4-EIGEN-007 | MFE-C06, MFE-C13, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) |
| FEM-REQ-MITC4-EIGEN-009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 | [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md) |
| FEM-REQ-MITC4-EIGEN-014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md) |
| FEM-REQ-MITC4-EIGEN-015 | MFE-C23, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-016 | MFE-C07, MFE-C21, MFE-C23 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-017 | MFE-C24, MFE-C25 | [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-019 | MFE-C21, MFE-C22, MFE-C24 | [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-020 | MFE-C25, MFE-C26 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-021 | MFE-C25 | [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-022 | MFE-C25 | [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-023 | MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-025 | MFE-C27 | [0](../../phases/mitc4-shell-feast-eigen/step0.md), [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [4](../../phases/mitc4-shell-feast-eigen/step4.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
| FEM-REQ-MITC4-EIGEN-026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 | [2](../../phases/mitc4-shell-feast-eigen/step2.md) |
| FEM-REQ-MITC4-EIGEN-027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 | [1](../../phases/mitc4-shell-feast-eigen/step1.md), [2](../../phases/mitc4-shell-feast-eigen/step2.md), [3](../../phases/mitc4-shell-feast-eigen/step3.md), [5](../../phases/mitc4-shell-feast-eigen/step5.md), [6](../../phases/mitc4-shell-feast-eigen/step6.md), [7](../../phases/mitc4-shell-feast-eigen/step7.md) |
## V4. I/O obligation 대응
| Obligation ID | Steps | Positive/negative evidence |
| --- | --- | --- |
| IO-T01 | 0, 5, 6, 7 | C23; 원본 unchanged semantic snapshot/source warnings→actual backend→HDF5. |
| IO-T02 | 0, 2 | C01/02/06/07; material/section/rho/t 관계와 semantic/kernel negative inventory. |
| IO-T03 | 0, 6 | C07/13/23; exact parameter/slot/count/procedure/BC 실패와 exit category. |
| IO-T04 | 0, 2, 3, 5 | C06/13/14/24; source renumbering/ambiguity와 actual BC의 rank/복원. |
| IO-T05 | 3, 5, 6, 7 | C16/19/24; O1~O5/Nvectors/all-c raw metrics, source identity와 sameML replay. |
| IO-T06 | 4, 5, 6 | C17/18/19/21/22; actual API와 injected failure/budget/availability history. |
| IO-T07 | 5, 6 | C24; solve/validation/log/lease/write/flush/close/reopen/selfcheck/replace 전 failure matrix. |
| IO-T08 | 7 | C25; all-row parser/schema/identity finite prechecks, Freq structure-only mutation. |
| IO-T09 | 7 | C25; existing policy inclusive boundaries/near-zero/S0·singleton RMS independently checked. |
| IO-T10 | 0, 1, 6, 7 | C26/27; density없는static/parser/schema 보존·fresh portfolio·mode-shape reference 미요구. |
| IO-T11 | 0, 1, 2, 3, 4, 5, 6, 7 | C27; step별 meaningfulRED/실제fullcounts/새warning0/3repeat·freshhash. |
## V5. 수학·backend·schema의 누락 방지
| Upstream item | Implementation / independent evidence |
| --- | --- |
| Mass M1~M10 | Step2 C01~07; sign S=-[d]x, exact quadrature order, original moments, two matrix energy/centroid/Jensen, no artificial drill |
| Stabilization S1~S8 | Step1 C08~12, Step3/5 partial-BC original pencil, Step7 static fresh portfolio; old formula만 대체 |
| Eigen E1~E5 | Step3 C13~16; D,C,P,Z,L과 DOF pattern owner, exact ranks/rcond/zero branches/original residual 보존 |
| Eigen E6/E7 + C5/C6 | Step4 actual FEAST·all count/status history, per-call fpm128·seed/QR·thread restore·index/allocation/capacity·유한 budgets |
| V1~V5 + C1~C4 | Step5 all-c original ML residual/Gram/energy/rhoB/rigid/scale/projector; Step7 N persistent replay |
| Eigen E8 + IO-M2 | Step5 candidate, Step6 final replacement 후 noexcept swap, all failure matrix/oldfinal hash; zero-byte log 독립 |
| I1~I6 | Step0 grammar/source/semantic positives+negatives, Step6 actual CLI exits/stable warnings; sourceN와 internalc 분리 |
| O1/O2 | Step6 discriminant/types/mandatory metadata/model identities/source_records/densities; Step7 input-byte identity |
| O3 | Step5 raw paired N/cluster/classification/frequency subset/sign, Step6 N×nn×6 persistence/units/constraint0 |
| O4/O5 | Step4/5 all-c evidence source, Step6 exact schema/fpm128/available flags/readback/relations/self-check |
| IO-M3/M4 + common tolerance | Step7 full-row TXT/source join10singleton/Value only; external Freq/vector gate 없음; static roles 보존 |
원 full K/M 및 independent particle/polynomial 기대값은 solve의 reduced A나 serializer 자기
복사에서 생성하지 않는다. Self-check는 저장 일관성 검사이며 independent physics를 대신하지 않는다.
FEAST의 documented count는 무조건 completeness theorem이 아니다. Count/empty-prefix/guard/
solve-count/전체 c residual·Gram 및 known spectra를 함께 확보한다.
## V6. Fresh reference 실행과 보고서
새 eigen 원본은 [reference-model](reference-model.md)의 input/TXT를 그대로 사용한다.
Step7의 unique generated execution directories 아래 bytes를 복사하고 FesaApplication을 실제
호출한다. Reference 전후 SHA-256/byte size/mtime, copied input exact bytes, actual binary/lib
SHA-256, start/end/exit, final h5/log hash를 기록한다. Metadata source path는 실제 copied lexical
input path와 맞아야 하며 원본과는 byte identity를 따로 확인한다.
Fresh eigen 세 run은 같은 input bytes/runtime/thread/settings를 사용한다. 각 run10modes,
nf3750/nz625/n3125와 all-c checks/call histories, N persistent vectors의 sameML 원 residual을
확인한다. Same-input deterministic replay는 각 run을 같은 lexical input path에서 직접 solver로
재실행한 뒤 run별 결과를 고유 evidence directory로 복사해 비교할 수 있다. 복사본 schema의
source path는 원 실행 path 그대로 보존한다. 모드 벡터 외부 reference는 요구하지 않는다.
Count x의3125²×8=78,125,000bytes는 한 scratch allocation 크기다. 실제 reference test process의
peak working set/private memory를 관찰해 peak 측정 범위와 PID/command를 기록한다.
이 수를 전체 peak나 sparse shifted fill로 대체하지 않는다. Process 전체 peak는 solver-only
allocation peak의 upper bound임을 구분한다. 관찰은 managed test process의 actual exit까지
연결하고 unobserved detached 실행은 하지 않는다.
Static portfolio는 [기존 요구](requirements-evidence.md#필수-회귀-포트폴리오와-identity)의
8개 required/review-only artifacts와 같은 input/source identity를 사용한다. Existing comparator의
artifact disposition을 적용하여 제외 stress/RM3를 새 mandatory로 만들지 않는다.
`shell-s4`/`shell-s4-linear-limit`는 같은 fresh solve를 두 역할에 쓸 수 있으나 보고서는
분리한다. Nonlinear final factor1 accepted-state/U blocking/UR warning/RF1..3와 spatial RM1..2
review-only, internal force/moment balance blocking은 보존한다. Registered
`shellnl-meshfine-02-s4-final`는 별도 post-closure 역할이며 pressure를 포함한 기존 full suite도
실행한다. 기존 reports는 수정하지 않고 현재 r2 새 evidence를 남긴다.
Future outputs는 Step7의 `implementation-report.md`, `build-test.md`,
`reference-comparison.md`, `reference-comparison-detail.md`다. Step별
`implementation-stepN-evidence.md`와 prep evidence는 실제 실행 때만 생성한다.
Final canonical3 보고서는 같은 r2의 실제 command/exit/count/수치·원본보존·실제 미실행 내역·전체
requirement trace를 연결한다. 마지막 registered Stop/actual exit가 아직 미관찰이면 확인 대기로
구분하며 Executor 종료 뒤 Coordinator의 management 사후 감사를 받는다. Physics/Release
판정과 외부 release 권한을 대신하지 않는다.
## V7. 계획 정적 감사
정적 감사에서 actual `StepExecutor`의 read/validation methods만 호출했다. Executor 실행,
CMake/CTest/Python tests, 실제 FEAST 또는 reference solve는 호출하지 않았다.
첫 감사는 Step2의 `mitc4_shell.h`에 대응하는 기존 C++ test의 owned 목록 누락을 찾아 exit1이었다.
`mitc4_shell_test.cpp`를 같은 Step index/Markdown에 추가한 뒤 전체 audit exit0을 확인했다.
Local link target 검사에서 발견한 I/O M1 anchor 두 곳도 실제 heading으로 수정했다.
최종 read-only command의 actual exit0 결과: prep1/main8, 계획 산출물16, owned path128회
(고유110), 모든 Step의 upstream22 입력, must27/NR27/I/O11, 필수 신규 test 이름40개,
local Markdown links575개, 누락/anchor warning0. 기존 top index의5개 entry/status/history는
HEAD와 deep equality다. 모든 새 Step은 pending이며 JSON/Markdown owned 목록이 동일하다.
최초 `git diff --check` exit0은 unstaged diff만 검사하여 당시 untracked 신규 파일을
포함하지 않았다. 별도 line trailing whitespace 검사도 여분 EOF blank를 검출하지 못했다.
Root의 checkpoint staged 검사에서 EOF blank3개를 발견하여 지정된3파일만 정리했다.
아래 전체 산출물 검사는 EOF newline/여분 blank 검사까지 보완한 뒤 actual exit0을 확인했다.
Root의 재staging과 staged 검사는 별도 소유 작업이며 여기서 그 성공을 선기록하지 않는다.
Hash는 아래 command가 산출한 SHA-256을 handoff에 기록한다. Bundle digest는 sorted path,
NUL, raw bytes를 이어 hash하며 자기 digest를 이 문서에 삽입하지 않는다.
아래는 workspace root에서 수행한 정확한 read-only 감사 command다. Test 이름 검사는
**계획 inventory/regex/등록 target의 정적 일관성**이며 아직 존재하지 않는 C++ test의 실제
discovery/실행 성공을 주장하지 않는다. 해당 실제 검증은 각 Implementation Step의 AC다.
```powershell
@'
import hashlib,json,re,subprocess
from pathlib import Path
from urllib.parse import unquote
from scripts.execute import StepExecutor
root=Path.cwd(); feature="mitc4-shell-feast-eigen"; doc=root/"docs"/feature
phases=[feature+"-execution-prep",feature]
artifacts=[doc/n for n in ("implementation-plan.md","implementation-environment.md","implementation-interfaces.md","implementation-verification.md")]
artifacts += [root/"phases"/"index.json"]
counts=[]; owners=[]; names=[]; steps=[]
required=["FEATURED_AGENTS.md","PRD.md","ADR.md","coordination.md","requirements.md","requirements-evidence.md","research.md","research-evidence.md","formulation.md","formulation-mass.md","formulation-eigen.md","formulation-verification.md","formulation-stabilization.md","numerical-review.md","numerical-review-evidence.md","numerical-review-controls.md","numerical-review-cases.md","reference-model.md","io.md","io-input.md","io-schema.md","io-mapping.md"]
assert all((doc/n).is_file() for n in required)
for phase in phases:
ex=StepExecutor(phase); ex._read_top_index(); data=ex._read_phase_index()
assert all(s["status"]=="pending" for s in data["steps"])
artifacts.append(root/"phases"/phase/"index.json"); counts.append(len(data["steps"]))
for step in data["steps"]:
path=root/"phases"/phase/f'step{step["step"]}.md'
artifacts.append(path); steps.append((phase,step,path))
body=path.read_text(encoding="utf-8"); owned=ex._step_owned_paths(step)
for p in owned: ex._validate_owned_file(p)
assert list(owned)==json.loads(re.search(r"\x60{3}json\n(.*?)\n\x60{3}",body,re.S)[1]),path
assert all(f"docs/{feature}/{p}" in body for p in required),path
assert all(x in body for x in ("Input contract revision:","implementation-interfaces.md","RED","GREEN","Full VERIFY","error_message","blocked_reason","actual exit","사후 감사")),path
assert len(owned)>0
owners.extend(owned)
if phase==feature:
inv=body.split("### 필수 신규 test discovery inventory\n",1)[1].split("## Full VERIFY",1)[0]
planned=re.findall(r"^- \x60([^\x60]+)\x60",inv,re.M)
regex=re.search(r"-R '([^']+)'",body)[1]
assert planned and all(re.search(regex,n) for n in planned),(path,planned,regex)
names.extend(planned); assert "--target fesa_tests" in body
for p in owned:
if p.startswith(("src/fesa/","include/fesa/")) and Path(p).suffix in (".cpp",".h"):
stem=Path(p).stem+"_test.cpp"
assert any(Path(t).name==stem and t.startswith("tests/") for t in owned),(path,p)
base=json.loads(subprocess.check_output(["git","show","HEAD:phases/index.json"],text=True))
top=json.loads((root/"phases/index.json").read_text(encoding="utf-8"))
assert top["phases"][:-2]==base["phases"]
assert [p["dir"] for p in top["phases"][-2:]]==phases
assert counts==[1,8] and len(artifacts)==16
v=(doc/"implementation-verification.md").read_text(encoding="utf-8")
nr=(doc/"numerical-review-cases.md").read_text(encoding="utf-8")
reqmap={m[0]:re.findall(r"MFE-C\d{2}",m[1]) for m in re.findall(r"^\| (\d{3}) \| ([^|]+) \|",nr,re.M)}
planmap={m[0]:re.findall(r"MFE-C\d{2}",m[1]) for m in re.findall(r"^\| FEM-REQ-MITC4-EIGEN-(\d{3}) \| ([^|]+) \|",v,re.M)}
assert reqmap==planmap and len(planmap)==27
assert len(re.findall(r"^\| MFE-C\d{2} \|",v,re.M))==27
assert len(re.findall(r"^\| IO-T\d{2} \|",v,re.M))==11
primary=re.findall(r"^\| MFE-C\d{2} \| [^|]+\| \x60([^\x60]+)\x60",v,re.M)
assert len(primary)==27 and set(primary)<=set(names)
links=0; anchor_warnings=[]
def slug(s):
s=s.replace(chr(96),"").strip().lower()
s=re.sub(r"[^\w\- ]","",s)
return s.replace(" ","-")
for p in artifacts:
body=p.read_text(encoding="utf-8")
assert body.endswith("\n") and not body.endswith("\n\n"),p
assert not any(line.rstrip()!=line for line in body.splitlines()),p
if p.suffix!=".md": continue
for target in re.findall(r"\[[^\]]+\]\(([^)]+)\)",body):
if re.match(r"^[a-z]+://",target): continue
pathpart,_,anchor=unquote(target.strip("<>")).partition("#")
linked=(p.parent/pathpart).resolve() if pathpart else p
assert linked.is_file(),(p,target)
links+=1
if anchor and linked.suffix==".md":
headings=[slug(h) for h in re.findall(r"^#+ (.+)$",linked.read_text(encoding="utf-8"),re.M)]
if anchor not in headings: anchor_warnings.append((p.relative_to(root).as_posix(),target))
for p in ("implementation-report.md","build-test.md","reference-comparison.md","physics-evaluation.md","release.md"):
assert not (doc/p).exists(),p
cm=(root/"tests/CMakeLists.txt").read_text(encoding="utf-8")
assert re.search(r"add_custom_target\(\s*fesa_tests\s+DEPENDS\s+fesa_unit_tests\s+fesa_integration_tests\s+fesa_reference_tests",cm)
diff=subprocess.run(["git","diff","--check","--"]+[p.relative_to(root).as_posix() for p in artifacts],capture_output=True,text=True)
assert diff.returncode==0,diff.stdout+diff.stderr
digest=hashlib.sha256()
for p in sorted(artifacts):
digest.update(p.relative_to(root).as_posix().encode());digest.update(b"\0");digest.update(p.read_bytes())
print(json.dumps({"phase_steps":counts,"artifacts":len(artifacts),"owned_path_occurrences":len(owners),"unique_owned_paths":len(set(owners)),"required_inputs":len(required),"requirement_rows":len(planmap),"nr_cases":len(primary),"io_obligations":11,"mandatory_test_names":len(names),"local_links":links,"anchor_warnings":anchor_warnings,"git_diff_check":diff.returncode,"bundle_sha256":digest.hexdigest()},ensure_ascii=False))
for p in artifacts[:4]: print(p.name,hashlib.sha256(p.read_bytes()).hexdigest())
'@ | python -B -
```
관리 문서 `coordination.md`의 동시 owner 변경은 이 계획 patch에 포함하지 않았다.
현재 실행 준비 완료는 계획 materialization을 뜻한다. Native transport, prep 실제 full VERIFY/
등록 Stop 및 새 main invocation의 구현·FEAST/reference 성공은 후속 execution evidence가 필요하다.
-197
View File
@@ -1,197 +0,0 @@
# MITC4 eigen 입력 subset과 진단
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `io-definition-agent`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md)
## I1. 문법과 source identity
기존 [linear shell I/O §1](../linear-static-mitc4-shell/io.md),
[현재 pressure I/O §3](../shell-surface-pressure-load/io.md)의 공통 lexical 계약을 재사용한다.
현재 [input reader](../../src/fesa/io/abaqus/input_reader.cpp)와
[mapping context](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 읽기 전용 대조했다.
예전 nonlinear 문서의 continuation 미지원 설명보다 후속 승인된 pressure lexical 규칙이 우선한다.
- CRLF/LF를 수용한다. Physical line은 종결자를 제외해 최대 256 ASCII bytes이며 printable
ASCII와 horizontal tab만 허용한다. `**` comment와 blank line은 semantic effect가 없다.
Inline comment, data continuation, include, substitution, quoted/escaped 이름은 지원하지 않는다.
- Keyword/parameter/enum/name lookup은 ASCII case-insensitive다. Parameter 순서는 무관하지만
duplicate name은 값이 같아도 실패한다. Raw spelling, keyword physical lines, data fields와
normalized lexical input path/1-based line을 보존한다. Keyword terminal comma는 기존
parameter continuation이며 직후 comment/blank/new keyword/EOF interruption은 실패한다.
- Comma split은 빈 필드를 보존한다. 각 token 주변 space/tab만 trim한다. 아래 명시된
공란 외에 arbitrary trailing-empty 제거를 적용하지 않는다.
- Source node/element label은 positive decimal int64이고 raw digits와 numeric identity를
분리한다. Scope 내 같은 numeric label은 duplicate다. Name/target는 기존 shell의
비어 있지 않은 ASCII 이름·qualification 규칙을 재사용한다. 새 step name도 같은
name token이며 생략 시 source name은 `Step-1`이다. HDF5 path에 raw name을 삽입하지 않는다.
- 새 `rho` numeric token은 `[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?`다.
C-locale full consumption과 binary64 finite conversion을 요구한다. NaN/Inf, hex, D exponent,
overflow/underflow conversion error는 실패한다. N은 `[0-9]+`와 checked int64 범위이며
값이 양수여야 한다. 기존 keyword의 승인된 numeric parsing은 이 기능 때문에 바꾸지 않는다.
## I2. 지원 keyword와 위치
Eigen input의 문법은 `heading? preprint? part+ assembly material+ model-boundary* step EOF`다.
Comments/blank는 블록 사이에 허용한다. 기존 mesh/set nesting과 forward material/section
resolution은 유지한다. 활성 모델은 S4/S4R shell만 포함한다.
| Keyword | Eigen subset·data | 의미와 validation |
| --- | --- | --- |
| `*HEADING` | Optional 첫 keyword, parameter 없음, text rows | Heading provenance. Duplicate/nesting 오류 거부 |
| `*PART`, `*END PART` | `NAME` 하나; close parameter/data 없음 | Part-local topology. 중첩/중복/미종결 거부 |
| `*NODE` | Part scope, parameter 없음; `label,x,y,z` | Finite initial global midsurface coordinates. 중복·잘못된 arity 거부 |
| `*ELEMENT` | Part scope, `TYPE=S4` 또는 `TYPE=S4R`만; `label,n1,n2,n3,n4` | 같은 MITC4 physical/mass path와 별도 source type. 네 distinct resolved nodes 필요 |
| `*NSET`, `*ELSET` | Part/assembly scope; 해당 `NSET=name` 또는 `ELSET=name`, optional flag `GENERATE`; assembly는 `INSTANCE=name` 필수. 기존 assembly ELSET의 `INTERNAL` flag도 유지 | Explicit positive labels, 또는 `first,last,increment` inclusive generate. 기존 set row trailing comma 허용. Nonpositive/역순/도달 불가능 range·empty·duplicate definition·dangling/cyclic/mixed-instance 거부 |
| `*SHELL SECTION` | Part scope, `ELSET`, `MATERIAL` 필수; 한 row `t[,integration_points]` | Centered homogeneous layer, constant finite t>0, element별 유일 assignment. Optional second field가 있으면 positive decimal integer; 아래 예외 적용 |
| `*ASSEMBLY`, `*END ASSEMBLY` | Top-level 하나, `NAME`; close parameter/data 없음 | Assembly scope, nested/duplicate 거부 |
| `*INSTANCE`, `*END INSTANCE` | Assembly scope, `NAME`, `PART`; data 없음 | Identity instances; 같은 part의 여러 identity instance 허용. Transform/dangling/duplicate 거부 |
| `*MATERIAL` | Top-level model data, `NAME`; data 없음 | Named material 소유. Case-insensitive unique |
| `*ELASTIC` | Current material, parameter 없음; 한 row `E,nu` | 기존 finite E>0, -1<nu<0.5; constant isotropic. Missing/duplicate/dependent 거부 |
| `*DENSITY` | Current material, parameter 없음; I3 | Constant positive volume mass density |
| `*BOUNDARY` | Model data 또는 sole step의 FREQUENCY 뒤·output requests 전; parameter 없음; `target,first,last[,value]` | 1<=first<=last<=6, value 생략은 exact0; 있으면 finite exact0만 허용. 네 번째 empty token은 생략과 다르며 거부 |
| `*STEP`, `*END STEP` | I4; 정확히 하나의 top-level step | Prior/multiple/nested step·preload 없음 |
| `*FREQUENCY` | I4; sole step 첫 procedure | Original configuration, undamped real lowest-N eigenproblem |
| 부수 output keywords | I5의 exact combinations만 | Mandatory output 선택/억제 기능 없음, warning provenance |
`t,5`의 두 번째 값은 [기존 사용자 승인 예외](../linear-static-mitc4-shell/io.md#11-shell-section-data-rule)에
따라 warning 없이 읽는 source provenance다. 별도 physical property를 만들지 않는다.
Stiffness는 기존 2×2×2, mass는 [M5](formulation-mass.md)의 3×3×3이며 이 값으로 바뀌지 않는다.
이 예외를 다른 section/material option에 일반화하지 않는다.
Boundary target는 기존 source resolver의 bare node label 또는 unique node-set name이다.
Assembly NSET의 INSTANCE binding으로 원하는 instance를 지정한다. 여러 instance에서
bare target가 모호하면 거부하며 새로운 dotted boundary qualification을 추가하지 않는다.
Model BC 다음 step BC 순서로 resolve하고 node/component별 exact-zero union을 적용한다.
같은 zero constraint 재선언은 동일 constraint다. Nonzero row를 상쇄·override하여 허용하지 않는다.
원본 `(Part-1-1,Set-2)`의 104 nodes×6 DOF가 모두 고정됨을 확인한다.
Global component 제약만 지원하며 tangent/local/MPC constraint를 새로 추론하지 않는다.
## I3. Density material mapping
`*DENSITY`는 한 material에 최대 한 번, 정확히 한 data row이며 첫 field는 rho다.
`rho` 또는 `rho,`만 허용한다. 후자는 원본 `2700.,`의 빈 temperature slot이며
temperature dependence가 없는 constant 값으로 대응한다. Nonempty temperature/field variable,
두 개 이상의 추가 comma, 추가 data row, `DEPENDENCIES`(0 포함), `PORE FLUID`, `SLURRY`,
distribution 이름과 다른 parameter는 거부한다. Elastic과 Density의 상대 선언 순서는 자유다.
Numeric rho가 finite이며 strict >0이어야 한다. Material scope 밖 Density도 실패다.
모든 활성 shell의 `element -> section -> material -> rho`가 정확히 하나로 결정되어야 한다.
Missing rho를 0이나 기본값으로 채우지 않는다. 서로 다른 material/section의 rho/t를
global 평균으로 바꾸지 않는다. 사용하지 않은 material의 Density가 존재하면 문법·양성 검증은
동일하며, rho 존재의 필수성은 활성 material에 적용한다. Material/section reference 오류는
밀도가 있는 다른 material로 fallback하지 않는다. 단위는 `mass/length^3`, 변환 없음.
Density의 새 입력 허용은 이 eigen procedure에 속한다. 기존 static parser의 Density 지원
범위를 넓히지 않고, density가 없는 기존 static input과 material 생성 경로를 보존한다.
Material의 내부 optional density를 만들더라도 static에 필수값을 요구하지 않는다.
## I4. Step와 Frequency의 exact options
`*STEP` 허용 parameter는 optional `NAME=<name>`, optional `NLGEOM=NO`, optional
value 없는 `PERTURBATION`뿐이며 data는 없다. NLGEOM 생략은 NO다. PERTURBATION이 없어도
FREQUENCY가 원형상 linear perturbation procedure를 결정하고 source flag 유무를 보존한다.
`NLGEOM=YES`, flag NLGEOM, `PERTURBATION=...`, `INC`, 다른 option은 eigen에서 거부한다.
Frequency 외 procedure, step description data, 두 번째 procedure/step, 선행 상태는 지원하지 않는다.
| FREQUENCY parameter | 허용·기본 의미 | Observable mapping |
| --- | --- | --- |
| `EIGENSOLVER` | 생략 또는 `LANCZOS` | Source default=LANCZOS; actual=`MKL FEAST`. Explicit/omitted provenance와 backend mapping warning 기록 |
| `SIM` | 생략, value 없는 flag, `YES` | Source effective=YES. FESA SIM architecture 기능을 만들지 않음. Explicit일 때 no-op warning |
| `ACOUSTIC COUPLING` | 생략 또는 `ON` | Acoustic/ASI/TIE/coupling 정의가 전혀 없는 structural-only 모델에서만 적용 대상 없음. Explicit일 때 no-op warning |
| `NORMALIZATION` | 생략 또는 `MASS` | Source SIM=YES의 mass default를 적용. FESA 실제 ML로 phi^T ML phi=1; 값 변경 warning 없음 |
`SIM=NO`, `NORMALIZATION=DISPLACEMENT`, `AMS/SUBSPACE/FEAST` source enum,
`ACOUSTIC COUPLING=OFF|PROJECTION`, `DAMPING PROJECTION`, `RESIDUAL MODES`,
`PROPERTY EVALUATION`, `NSET` 및 다른 parameter는 지원하지 않는다.
사용자 backend 요구를 Abaqus 문법의 새 `EIGENSOLVER=FEAST` 지원으로 바꾸지 않는다.
Data는 정확히 한 physical row, comma split 후 **1~7 fields**다. 첫 field N은 mandatory
positive decimal integer이며 2~7은 존재하면 모두 empty여야 한다. 생략된 trailing fields도
unspecified다. 원본 `10, , , , ,`는 여섯 fields로 유효하다. Fields 2/3은 frequency bounds,
4는 shift, 5/6은 Lanczos controls, 7은 acoustic range factor의 source slot이다.
공란은 숫자0이 아니다. 어느 slot의 nonempty `0`도 지원하지 않으며, eighth empty field도
arity 오류다. 추가 row는 residual-mode input으로 해석하지 않고 거부한다.
이 제한은 [공식 FREQUENCY syntax](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의
선택된 부분집합이다. N은 마지막까지 input authority이고 TXT 행수/count scratch/returned m과 다르다.
`N>finite_dimension` 및 빈 finite problem은 equation 구성 뒤 명시적으로 실패한다.
## I5. Result-neutral allowlist와 warning
아래 keyword는 parameter 순서만 자유이며 duplicate/추가 parameter·data row는 거부한다.
동일 조합의 반복 output request는 각 keyword당 warning 한 개를 남기며 결과를 바꾸지 않는다.
| Keyword | 정확한 조합·위치 | Warning code |
| --- | --- | --- |
| `*PREPRINT` | Optional top-level; `ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO` 정확히 네 개, data 없음 | `ignored-input-keyword` |
| `*RESTART` | FREQUENCY/BC 뒤; flag WRITE와 FREQUENCY=0, data 없음 | `ignored-input-keyword` |
| `*OUTPUT` | FREQUENCY/BC 뒤; FIELD 또는 HISTORY flag 하나; optional VARIABLE=PRESELECT; data 없음 | `ignored-input-keyword` |
| `*NODE OUTPUT` | 활성 OUTPUT FIELD 아래; VARIABLE=PRESELECT 하나, data 없음 | `ignored-input-keyword` |
| `*ENERGY OUTPUT` | 활성 OUTPUT HISTORY 아래; VARIABLE=ALL 하나, data 없음 | `ignored-input-keyword` |
새 OUTPUT root는 앞의 output scope를 닫고, RESTART/END STEP도 닫는다. Child scope mismatch는
거부한다. Restart READ/nonzero write frequency, output variables data, element/contact output,
node history request 등 표 밖 조합은 eigen에서는 fail-closed다. 기존 static allowlist를 축소하지 않는다.
Warning message는 raw keyword와 `mandatory-eigen-output-unchanged` 이유를 포함한다.
RESTART frequency0은 write 중단 옵션이고 출력 요청들은 model equations를 바꾸지 않는
output selection이다. FESA는 이 selection을 구현하지 않는다는 차이를 알린다.
FREQUENCY에는 `source-eigensolver-mapped-to-feast` warning을 항상 하나 기록한다.
Explicit SIM에는 `source-sim-option-not-applied`, explicit acoustic ON에는
`acoustic-option-inapplicable-structural-only`를 기록한다.
위 세 code를 포함한 출력 순서는 기존 source tuple의 code 정렬을 따른다. Invalid model은
이 warning을 근거로 acoustic/coupling semantics를 버려서는 안 된다.
## I6. Fail-closed validation과 diagnostics
표 밖 model/history keyword는 eigen analysis 전에 거부한다. 특히 어떤 위치의
`CLOAD/DLOAD/DSLOAD`, initial condition/stress/temperature, damping, acoustic/ASI elements,
TIE/contact/MPC, transform/orientation/explicit director, surface/beam/solid/mixed model,
concentrated/nonstructural mass, composite/offset/variable thickness, amplitudes, restart read와
다중 step은 지원하지 않는다. Zero-valued load/damping 입력도 지원되는 무하중 모델로 바꾸지 않는다.
진단 record는 기존 `severity,code,file,line,keyword,entity_identity,message`를 사용한다.
file은 lexical normalized path, line은 source 1-based다. Material/section/node/element/step,
DOF 또는 invalid parameter/field ordinal을 가능한 한 entity/message에 포함한다.
Numerical scale·threshold·observed value는 binary64 round-trip 가능한 decimal로 보고한다.
Source location 없는 backend failure도 sole Frequency location과 step을 연결한다.
기존 SortDiagnostics 순서와 same-key discovery order를 유지한다.
| Condition | Stable code | CLI exit |
| --- | --- | --- |
| Lexical/arity/duplicate parameter/name/unresolved source | 기존 `invalid-input-character`, `input-line-too-long`, `invalid-data-arity`, `invalid-keyword-parameter`, `unresolved-reference` 등 해당 기존 code | 3 |
| Density scope/data/dependency/duplicate | `invalid-density-data` / `unsupported-density-option` / `duplicate-density` | 3 |
| Active rho missing / numeric nonfinite 또는 nonpositive | `missing-material-density` / `invalid-material-density` | 4 |
| New rho malformed numeric token | `invalid-density-data` | 3 |
| Frequency parameter/count/data mismatch | `unsupported-frequency-option` / `invalid-frequency-data` | 3 |
| Multiple/preload/unsupported procedure | `unsupported-analysis-procedure` | 3 |
| Nonzero base/prescribed BC | `unsupported-eigen-boundary` | 3 |
| Model-affecting exclusion / unsupported element | `unsupported-keyword` / `unsupported-element-formulation` / `unsupported-mixed-element-model` | 3 |
| Invalid geometry/section/material | 기존 model code; mass27-point invalid는 `invalid-shell-mass-geometry` | 4 |
| Global finite n=0 / N>n | `empty-eigenproblem` / `insufficient-finite-modes` | 4 |
| Analytic/null/positive mass or conditioning 실패 | `invalid-eigen-mass-space` / `eigen-mass-conditioning` | 5 |
| Index/storage/allocation/FEAST/count/budget/negative/validation 실패 | [M2 diagnostic mapping](io-mapping.md#m2-backend와-failure-lifecycle) | 5 |
| Candidate/write/close/self-check/replace/log/lock 실패 | 기존 output category와 [M2](io-mapping.md#m2-backend와-failure-lifecycle) | 6 |
`NaN/Inf` rho는 nonfinite model value(4)로 분류하고 그 외 malformed token은 syntax(3)다.
같은 실패를 여러 code로 중복 보고하지 않고 첫 발견 원인을 유지한다. Fatal 뒤 solve/commit을
실행하지 않는다. CLI usage2/success0과 stderr format은 기존 공통 계약을 유지한다.
## 공개 근거와 적용 한계
2026-09-06 공식 Abaqus 2025 문서를 `web.open`으로 확인했다. 사실은 syntax/외부 의미이고,
위 exact subset/default/warning policy는 승인된 FESA 요구에 대한 I/O mapping이다.
| Source | Locator와 사용 |
| --- | --- |
| [DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm) | Data lines 1~2와 optional dependencies; constant rho 및 ML^-3 차원. 온도·distribution 지원은 포함하지 않음 |
| [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm) | Optional parameters와 Lanczos data line 1~7. Source defaults·bounds/shift 공란을 구분; FESA Lanczos 내부 동작의 근거가 아님 |
| [STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm) | NAME/NLGEOM/PERTURBATION. 선행 history 전달은 제외 |
| [RESTART](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-restart.htm) | WRITE/FREQUENCY=0 및 no-data. Restart 지원을 주장하지 않음 |
| [OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-output.htm) | Output selection root |
| [NODE OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-nodeoutput.htm) | FIELD와 VARIABLE=PRESELECT |
| [ENERGY OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-energyoutput.htm) | HISTORY와 VARIABLE=ALL; 새 modal energy output 요청으로 확대하지 않음 |
| [Input Syntax Rules](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-inputsyntax.htm) | Keyword/data/256-byte/continuation convention; FESA bounded 차이와 기존 정책은 I1이 권위 |
질량 정식화·private parser/model·solution algorithm·ODB internals의 동등성을 추론하지 않는다.
-234
View File
@@ -1,234 +0,0 @@
# MITC4 eigen 책임·실패·비교 대응
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `io-definition-agent`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md)
- 입력 원본: [io-input.md](io-input.md); 영속 schema 원본: [io-schema.md](io-schema.md)
## M1. Input에서 equation/result까지
아래는 implementation-neutral 책임 계약이며 정확한 C++ 타입/파일 분해는 Planning 소유다.
현행 [Domain](../../include/fesa/model/domain.h),
[model records](../../include/fesa/model/model_types.h),
[syntax records](../../include/fesa/io/abaqus/input_syntax.h),
[AnalysisModel](../../include/fesa/analysis/analysis_model.h)의 수명·의존성을 따른다.
| 경계 | 소유·전달할 최소 의미 | 금지되는 의미 혼합 |
| --- | --- | --- |
| Input adapter | 원본 path/content identity, keyword/parameter/data raw text와 line; validated density/step/options/count, unresolved targets | TXT row수로 N 생성, source enum으로 actual backend 변경 |
| Domain | Topology/source instance/labels, E/nu, section/t, optional material rho, initial director/frame, 유일 frequency 정의와 resolved homogeneous BC, warnings/provenance | Mutable mode/equation/vendor handle 소유 |
| Frequency definition | Raw/canonical source step, source option presence/effective values, count data N, source locations, procedure=linear-frequency | Static increment/time/frame state를 frequency count에 재사용 |
| AnalysisModel | Domain lifetime 아래 활성 shells/materials/sections/BC/frequency 정의의 const non-owning view | Domain copy 또는 새로운 geometry/material ownership |
| DofManager | Source node×UX/UY/UZ/URX/URY/URZ, full/free/constrained injection과 stable equation indices, scatter/sparse pattern | Element/Node 내부에 equation ID 저장 |
| Element/assembly | M1~M10 consistent/moments snapshot→nodal lumped blocks, r2 K contribution, source ordered reduction. 같은 source scatter와 실제 BC | Global scalar row lumping, artificial drilling mass, source S4R의 별도 kernel |
| Eigen procedure | Candidate workspace/state, [E1~E8](formulation-eigen.md) 순서, analytic rank/positive/null projection, whitening, actual FEAST, all-c validation, N개 global 복원/결과와 commit | 기존 LinearStaticAnalysis::Run에 eigen lifecycle 누적, pretrained/preloaded state, static reaction/modal stress 복구 |
| Private backend | C5/C6 controls, checked CSR/index conversion, vendor resources/thread guard, actual values/vectors/count/status와 call history | MKL_INT/HDF5/Win32 types 또는 vendor headers를 public solver core에 노출 |
| Result/Output adapter | Validated source/global modal pair와 O1~O5 serialization/self-check/replacement | Near-zero clamp, physical 수치 또는 identity 재계산으로 실패 은폐 |
Density/property lookup은 element마다 확정된 material identity를 사용한다. Consistent 원본을
lumped 저장으로 덮어쓰지 않고 element-wise snapshot+moments로 검사 가능하게 한다.
Full dense global MC나 일반 dense Schur는 필수가 아니다. 실제 global BC를 먼저 적용하고
director null은 [E2](formulation-eigen.md#e2-nullpositive-basis를-node마다-결정)의 exact intersection으로만
결정한다. Tiny positive mass는 정식화/NR conditioning 실패이며 input 지원에서 제거하지 않는다.
Source `(instance_name, numeric label)`과 raw label spelling은 전체 경로에서 보존한다.
Internal row order는 기존 identity-instance expansion/declaration order이며 DOF order는 고정이다.
Renumbering은 geometry/connectivity/BC를 같이 대응하여 검사한다. 숫자가 우연히 같은
source label/internal ID/equation ID를 비교키로 대체하지 않는다. 새로운 source order의 결과를
행 위치끼리 비교하거나 repeated eigenspace의 특정 vector 방향을 동일하다고 요구하지 않는다.
Accepted eigen state는 input/source step identity, N개의 paired raw scalar/global vector,
source mapping 및 전체 c의 validation/call evidence만 소유한다. Domain·AnalysisModel·DOF
정의와 수명 관계를 복사로 숨기지 않는다. Persistent N vectors로 같은 입력의 K/ML를
재조립해 constraint/normalization/원 residual을 다시 검사할 수 있어 REQ-018을 충족한다.
반복군의 개별 벡터 비유일성과 외부 mode-shape 비교 제외는 유지한다.
## M2. Backend와 failure lifecycle
FEAST fpm/interval/seed/thread/storage와 내부 수치 한계의 유일 원본은
[NR C1~C6](numerical-review-controls.md)다. I/O나 CLI에서 parameter override를 만들지 않는다.
Source N, reduced finite dimension n, prefix count, allocated m0, returned m, validated c,
public N을 각각 유지한다. 전체 c eigenpairs의 full original free residual/ML Gram/energy 및
endpoint/count consistency 뒤 첫 N개만 선택한다. Wrong mass·count·residual을 tolerance나
다른 solver로 우회하지 않는다.
| Failure | Code / exit5 | 보존할 context |
| --- | --- | --- |
| Checked CSR/index/capacity 산술 실패 | `eigen-index-overflow` 또는 `invalid-eigen-csr` | n/nnz/N/m0, 실패한 bound와 stage |
| Allocation 실패 | `eigen-allocation-failed` | allocation 역할·checked requested bytes; N 축소 없음 |
| FEAST non-success / forbidden retry | `eigen-feast-failed` | raw info, count/solve kind, interval/m0, C5 허용 재시도 여부 |
| Count/returned m/monotonicity·endpoint mismatch | `eigen-count-inconsistent` 또는 `eigen-endpoint-separation` | actual count history와 마지막 certified bracket |
| 유한 budget 소진 | `eigen-search-budget-exhausted` | count/solve attempts·마지막 valid bracket; optimization fallback 가능 여부는 C5 그대로 |
| Significant negative spectrum | `negative-eigenvalue-spectrum` | raw lambda/mu/s, mode rank, C3 threshold |
| Nonfinite/underflow conversion 또는 invalid frequency | `invalid-eigenvalue-result` | raw scalar·stage·source step |
| Raw pair/Gram/원 free residual/energy 검증 실패 | `eigenpair-validation-failed` | metric name, observed value, C3 limit, solver column/rank; failed raw values를 accepted result에 넣지 않음 |
위 code는 기존 FailureCategory::kSolver로 전달하며 새로운 exit category를 추가하지 않는다.
Model/preflight 오류는 [I6](io-input.md#i6-fail-closed-validation과-diagnostics)를 따른다.
Eigen backend failure의 returned Status는 실패까지의 call history를 message에 round-trip
decimal/ordinal 순으로 포함한다. 한 leading fatal diagnostic에 history를 부속하고 성공 count
call에 fictitious error severity를 붙이지 않는다. CLI는 기존 ordered stderr diagnostic 경로로
반환하며 caller는 Status에서 evidence를 읽을 수 있다. Allocation failure 시 추가 문자열
allocation을 보장할 수 없는 한계는 기존 best-effort stderr 범위를 따른다.
Public CLI는 기존 `fesa.exe <model.inp>`뿐이다. Output override 부재, `.inp` lexical
stem/대소문자/여러 dot/path 규칙, same-derived-pair nonblocking exclusive lock와 usage2는
[공통 lifecycle §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 유지한다.
1. CLI usage validation→lexical output pair→exclusive ownership 뒤 `<stem>_log.txt`를
open/truncate한다. Non-Newton eigen은 log에 Newton iteration/FEAST 행을 만들지 않는다.
정상 log는 기존 계약대로 zero-byte다. Log open/close failure는 output exit6다.
2. Input/model/eigen solve와 all-c validation은 candidate에 수행한다. Existing accepted
state와 final HDF5는 건드리지 않는다. Controlled failure는 기존 state와 final hash를 보존한다.
3. Successful candidate를 준비하고 log close 성공을 확인한다. 같은 directory에 exclusive-create
private HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다.
4. Final replacement가 성공한 뒤 **이미 준비된 state의 no-fail swap**을 수행한다.
Swap에 allocation/validation/fallible callback을 남겨 두지 않는다. 순서는 [E8](formulation-eigen.md#e8-mode-identity-normalization과-상태)다.
5. Write/flush/close/reopen/self-check/replace 실패는 exit6이며 이전 final/state를 보존한다.
Failed candidate는 authoritative가 아니다. 정리는 best effort이고 다른 run의 파일을 지우지 않는다.
Current log는 rollback하지 않는다. 잠금 실패는 log/final도 변경하지 않는다.
과거 final이 없으면 controlled failure 후 final도 생성하지 않는다. Directory collision,
nonregular destination, lock/replacement refusal는 성공으로 처리하지 않는다. Process crash나
power-loss 전체 원자성을 약속하지 않는다. Reference artifact는 읽기 전용이며 solver의
새 HDF5/log는 별도 generated output이다. Reference 원본을 덮어쓸 output path는 없다.
## M3. 원본 TXT grammar와 deterministic Value projection
Case `shellNL-eigen-meshfine`의 input/TXT 경로·hash와 logical quantity/family 원본은
[reference-model](reference-model.md)이다. TMP/CSV 변환·filename alias·추가 provenance 파일을
reference readiness 조건으로 만들지 않는다. TXT에는 source step이 없으므로 **지정 input의
유일한 source frequency step Step-2**를 연결한다. ODB storage frame index는 추정하지 않는다.
각 LF/CRLF logical line에서 공백-only 행만 생략한다. 모든 다른 행은 아래 full-match다.
`ws`는 ASCII space/tab 0개 이상, `ws1`은 1개 이상이며 literal의 대소문자는 정확하다.
```text
number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?
id := [0-9]+ # positive checked decimal integer
row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number
ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws
```
Header/footer, BOM, comment, 잘못된 Value/Freq label·추가 token·malformed number는 schema
failure다. `Value`는 finite binary64로 full conversion하고 overflow/underflow parsing error를
거부한다. NaN/Inf spelling은 grammar부터 실패한다. `Freq`는 숫자 token 구조만 검사하고
수치 변환/물리 일치/오차 비교에 사용하지 않는다. 반올림된 Freq로 Value를 재계산하지 않는다.
같은 숫자의 다른 mode ID는 정상이며 같은 numeric ID의 재등장은 duplicate다.
다음 순서를 tolerance 전에 완료한다.
1. 지정 input/TXT와 O1 eigen HDF5의 존재·source_input_identity·procedure/schema/unit/mass/
actual backend를 검사한다. `mass_variant=derived-lumped`, `mass_origin=consistent-moment-row-sum`,
normalization mass 및 runtime FEAST metadata가 필수다. 다른 mass의 좋은 오차를 선택하지 않는다.
2. Input의 유일 source step/N=10을 직접 확인하고 HDF5 source name/요청수/공개수에 대응한다.
TXT row count에서 N을 추정하거나 HDF5 내부 c를 공개 모드 수로 사용하지 않는다.
3. TXT 모든 nonempty row를 먼저 parse하면서 duplicate를 검사한다. Dictionary overwrite
또는 malformed-row skip은 금지다. Required identity는 양쪽 모두 정확히 mode1..10이다.
4. HDF5 `modes`의 field/type/shape/단위/순서와 모든 eigenvalue의 finiteness를 확인한다.
Wrong quantity/mass/schema·missing/extra/duplicate/nonfinite를 먼저 실패시킨다.
5. 유일 source key로 join한 뒤 mode ID ascending으로 projection한다. TXT 행 재배열은
허용하지만 HDF5 sort contract 위반은 reader가 재정렬하여 숨기지 않는다.
Projection row는
`(case_id,source_step_name,mode_id,component=Value,reference_value,fesa_value)`다.
FESA value는 `/steps/Step-1/eigen/modes.eigenvalue`만 사용한다. Diagnostic all-c table,
frequencies/vectors 또는 static fields를 fallback으로 읽지 않는다. 현재 component는 scalar
eigenvalue=`omega^2`, `time^-2`, coordinates=`scalar`, impact=`blocking`이다.
## M4. 판정·보고와 기존 static의 역할
Family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue,dimension=time^-2,
coordinates=scalar,impact=blocking)`다. **10개의 singleton family**에
[common-reference-tolerance](../TOLERANCE.md)를 그대로 적용한다. 각 family의
`S=max|r|`, `B=0.01S`, near-zero inclusive row branch 또는 5% relative row branch와
1% relative RMS를 모두 계산한다. 현재 양수 singleton은 실효 mode별1%다.
S=0이면 exact-zero FESA만 성공이며 불일치는 `zero-reference-scale-nonzero-error`다.
Source modal frame이 다르면 한 table에 저장되어도 family를 합치지 않는다.
Comparator report는 input/reference/result identity와 freshness evidence, prechecks,
family/source key/component/count/S, raw r/f/error, 적용 branch·row verdict, RMS/verdict,
blocking failure와 전체 verdict를 mode order로 남긴다. Undefined zero-scale metric은 named
state로 표현하고 NaN/Inf나 absolute floor를 넣지 않는다. CSV view가 필요하면 이 projection을
HDF5에서 추출한 보조 artifact라고 표시하며 공식 output/원본 reference를 대체하지 않는다.
기존 static의 r2 재검증은 [Requirement portfolio](requirements-evidence.md#필수-회귀-포트폴리오와-identity),
[NR C7](numerical-review-controls.md#c7-승인된-정적-회귀-기준), [C26](numerical-review-cases.md)을 따른다.
기존 linear source node/static frame와 nonlinear factor-one accepted-state identity를 유지한다.
U1/U2/U3 length/global blocking, UR1/UR2/UR3 rotation warning-only는 기존 common families다.
Nonlinear RF1/RF2/RF3·physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를
유지하는 review-only다. RM3/stress와 eigen vector는 새 external gate가 아니다.
Internal force/moment equilibrium은 별도의 blocking physical evidence다.
`shellnl-meshfine-02-s4-final`의 별도 post-closure 역할도 유지한다.
과거 cache/static 수치를 새 binary의 fresh solve로 표시해서는 안 된다.
## M5. 구현·test obligations와 requirement 연결
아래 표의 `nn` 등 fixture 수를 제외한 threshold는 [NR cases/controls](numerical-review-cases.md)의
원본을 사용한다. Parser/mapper/schema/comparator의 실제 tests는 Planning/Implementation 소유다.
| Obligation ID | 필수 positive/negative 검증 | NR cases |
| --- | --- | --- |
| IO-T01 | 원본 unchanged input의 729 nodes/676 S4, source Step-2/N10, rho2700/t0.5, source options/no-op warnings와 실제 FEAST 선택. S4R source-only 변경도 같은 semantic physical path | MFE-C23 |
| IO-T02 | 두 material·두께의 element-section-density 연결, missing/duplicate/unresolved/0/negative/NaN/Inf/temperature/dependencies/extra row·field, section/geometry/27-point invalid 거부; static density 부재 허용 | MFE-C06, MFE-C07, MFE-C23, MFE-C26 |
| IO-T03 | N의 blank/0/negative/fraction/overflow, fields2~7에 nonempty0, eighth empty field, duplicate parameter, unsupported enums/procedure/preload/load/damping/acoustic/mixed/非영 BC 거부 | MFE-C07, MFE-C13, MFE-C23 |
| IO-T04 | Source labels/instance/set renumbering·중복/모호함, partial rotations/fullfree/fullclamp/drill-only/fully constrained source mask 복원; tiny nonzero director rank 보존·conditioning 실패, n0/N>n 명시 실패 | MFE-C06, MFE-C13, MFE-C14, MFE-C24 |
| IO-T05 | O1~O5 schema round-trip, input byte identity, N/c/source step/rank/units/actual backend/mass pairing, N vectors의 원 residual·normalization 재현. Near-zero positive/negative/exact0/±threshold 및 lambda conversion 경계 | MFE-C16, MFE-C19, MFE-C24 |
| IO-T06 | Invalid index/CSR/SPD/parameter/capacity/count/endpoint/NaN/Gram/residual/budget; actual FEAST known zero/repeated/cluster cases의 all-c history와 returned-N 분리. Output diagnostic unavailable와 raw λ 보존 | MFE-C17, MFE-C18, MFE-C19, MFE-C21, MFE-C22 |
| IO-T07 | 이전 accepted state/final hash를 준비하고 solve/validation/log/lock/write/flush/close/reopen/self-check/replace 실패를 각각 주입. 처음 실행의 실패에서 final 미생성. 성공 final 후 no-fail state swap | MFE-C24 |
| IO-T08 | TXT reorder/equal Value distinct modes 허용. Missing/extra/duplicate/nonfinite/malformed/wrong field/step/quantity/units/mass/backend/schema 실패를 tolerance 전에 확인. Freq 변화가 Value 판정을 바꾸지 않음 | MFE-C25 |
| IO-T09 | 공통 policy의 inclusive 1% RMS·5% row 경계와 양옆, generic near-zero \|r\|=B 경계·zero-scale 양성/음성. Singleton이므로5% row pass라도1% RMS fail임을 확인 | MFE-C25 |
| IO-T10 | Density 없는 기존 linear/nonlinear input·model/static output reader 불변, r2 scale 영향 portfolio를 fresh binary로 재검증. Mode-shape reference 미요구 | MFE-C26, MFE-C27 |
| IO-T11 | 세 반복의 exact sparse/row/diagnostic order 및 scalar/projector C4 기준. RED→observed failure→GREEN→focused/full MSVC x64 Debug 검증·새 warning 없음·fresh reference identity/hash | MFE-C27 |
Coverage ID 접두사는 모두 `FEM-REQ-MITC4-EIGEN-`다. 아래 표는 requirement 원문을 대체하지
않고 I/O의 기여와 다른 owner evidence를 구분한다.
| Requirement suffix | I/O 연결·verification obligation |
| --- | --- |
| 001 | I2/I4/M1; IO-T01/T03 |
| 002 | I2/O2 source type와 r2 stabilization identity; IO-T01/T10; physical kernel C01/C08/C12는 해당 owner |
| 003 | I3/O2 densities; IO-T02 |
| 004 | I2/I6/M1; IO-T02; geometry oracle C01/C02는 NR 원본 |
| 005 | M1 consistent snapshot 의미, O2 mass_origin; C01~03 구현 evidence |
| 006 | M1/O4 node rank와 restored vector; IO-T04; inertia/null C01/C03/C11 |
| 007 | M1 source/DOF/reduction ordering; IO-T04/T11 |
| 008 | M1/O4 analytic counts/conditioning, M2; IO-T04/T05; C15 spectrum oracle |
| 009 | I4/O2 N·n·c/O3 rank; IO-T03/T04/T06 |
| 010 | O3 stable paired sort/cluster identity, M3 join; IO-T05/T08/T11 |
| 011 | I4/O2/M2 actual mass/backend discriminant; IO-T01/T05/T06 |
| 012 | I6/M2/O4 validity and bounded failure; IO-T06/T07 |
| 013 | O3 vectors/O4 all-c metrics; IO-T05/T06; C11/C16~18 independent evidence |
| 014 | M1 units/source transformation/O3 replay; IO-T04/T05; C01~05/C08/C11/C20 physics |
| 015 | I4/I5/O2 source_records; IO-T01/T03 |
| 016 | I2~I6/M2; IO-T02/T03/T06 |
| 017 | O1~O5/M3 authoritative additive schema; IO-T05/T08 |
| 018 | M1/O3 persistent N vectors/source replay; IO-T04/T05; external shapes 제외 |
| 019 | M2 candidate/commit/log lifecycle; IO-T07 |
| 020 | M3/M4 Value-only + 별도 static policy; IO-T08/T10 |
| 021 | O5/M3 full prechecks; IO-T08 |
| 022 | M4 공통 family/policy/report; IO-T09 |
| 023 | IO-T11; 실행 계획/RED/GREEN/full 증거는 Planning/Implementation 소유 |
| 024 | I3/M4 existing static compatibility/portfolio; IO-T10/T11 |
| 025 | M5 coverage + 동일 r2 handoff; Physics/Release closure 소유권 유지 |
| 026 | M1 consistent→lumped/O2 mass_origin; C01~05 independent mass evidence |
| 027 | O2 stabilization_rule/M4 static 역할; IO-T10; C08~12/C26 물리 검증 |
## 정적 감사 evidence
실제 조사 명령은 `Get-Content`, `rg --files`, scoped `rg -n`, `web.open`이었다.
입력 keyword inventory와 TXT 10개 행을 읽었고 numerical quantity/formulation 계산을
재실행하지 않았다. 한 번의 `rg docs/shell-surface-pressure/io*.md`는 잘못된 directory/glob로
exit1이었고 `rg --files docs`로 실제 `docs/shell-surface-pressure-load/io.md`를 확인해
읽기 전용 대조를 완료했다(exit0). 이 검색 오류는 feature numerical failure가 아니다.
최종 감사 `python -B -` here-script는 exit0으로 owned4 metadata/66개 relative links/
requirement suffix1..27, reference10 rows/full grammar/finite Value/ID1..10 및 두 원본 SHA-256
일치를 확인했다. `git diff --check -- docs/mitc4-shell-feast-eigen/io.md
docs/mitc4-shell-feast-eigen/io-input.md docs/mitc4-shell-feast-eigen/io-schema.md
docs/mitc4-shell-feast-eigen/io-mapping.md`도 exit0이었다. 아직 untracked인 owned 문서는
별도 Python whitespace/Markdown table 검사로 확인하며 diff만으로 내용 검증했다고 하지 않는다.
실제 final audit 결과와 owned hashes는 I/O handoff에 보고한다.
이는 문서·원본 inventory 검증이며 parser/comparator 구현 test 또는 실제 수치 비교가 아니다.
CMake/CTest/Harness/FEAST/외부 solver는 이 문서 단계에서 실행하지 않는다.
-219
View File
@@ -1,219 +0,0 @@
# MITC4 eigen authoritative HDF5 schema
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `io-definition-agent`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md)
- 수학: [E1~E8](formulation-eigen.md), [V1~V6](formulation-verification.md)
- Numerical authority: [C1~C6](numerical-review-controls.md)
## O1. Container, version과 공통 규칙
공식 결과는 input lexical sibling `<stem>_results.h5`다. 기존 linear schema0와 nonlinear
schema1은 각각의 [현행 static 계약](../shell-surface-pressure-load/io.md#71-version-and-filename-decision)을
유지한다. Eigen은 기존 shell model container에 새 procedure를 추가하며 discriminant는
`(schema_version=0, feature_id=mitc4-shell-feast-eigen, analysis_procedure=linear-frequency,
eigen_schema_version=1)`이다. `eigen_schema_version`은 새 procedure 전용 revision이다.
Static reader가 schema_version만 보고 eigen을 static으로 해석해서는 안 된다.
기존 static 파일에 새 eigen mandatory fields를 요구하거나 재작성/migration하지 않는다.
앞으로 unknown additive optional field는 무시할 수 있지만 known field의 type/의미 변경,
unknown procedure 또는 eigen_schema_version은 reader의 명시적 unsupported schema 실패다.
Float는 `H5T_IEEE_F64LE`, unsigned/signed integer는 명시된 `H5T_STD_U{8,64}LE`/
`H5T_STD_I64LE`, string은 variable-length UTF-8이다. Compound field의 byte offset/padding은
private이며 field name/type/array extent가 authoritative다. Shape의 `nn,ne,nmat`는 model
node/element/material 수, `N`은 입력 요청, `c`는 최종 solve의 전체 검증 column 수,
`Lcalls`는 모든 actual FEAST calls 수다. 모든 shape/capacity는 checked integer다.
새 numeric dataset의 required attrs는 `schema_version=0`, `eigen_schema_version=1`,
`component_names`, `component_unit_dimensions`, `coordinate_system`, `location`이다.
Compound에서 component attrs는 수치 quantity fields만 table의 명시 순서로 나열하고
identity/flag/counter는 schema 정의를 따른다. 새 modal result에는 추가로
`step_name=Step-1`, `source_step_name=<raw source>`, `domain=mode`를 기록한다.
Tokenized dimension은 아래 `mass`, `length`, `time`를 사용하며 SI label을 붙이지 않는다.
모든 mandatory physical/검증 real 값은 finite다. Optional backend diagnostic의
unavailable는 O4의 명시적 validity flag만 사용한다. NaN payload를 공개하지 않는다.
## O2. Metadata, 모델과 source 요청
`/metadata`의 아래 attributes는 mandatory다.
| Attribute | Type / 값 |
| --- | --- |
| `schema_version`, `eigen_schema_version` | uint64 `0`, `1` |
| `feature_id`, `analysis_procedure` | UTF-8 `mitc4-shell-feast-eigen`, `linear-frequency` |
| `solver_version` | 실제 실행 binary의 기존 version string |
| `source_input_identity` | 기존 `path=<absolute lexical generic path>;content_identity=fnv1a64:<16 lower hex>`; parser가 실제 읽은 원본 bytes 기준 |
| `unit_system_label` | `user-consistent-unspecified` |
| `coordinate_convention` | `global-cartesian; shell-local=initial-reference; positive-thickness=+zeta` |
| `internal_formulation` | `FESA-MITC4` |
| `integration_rule`, `mass_integration_rule` | `2x2x2-gauss; mitc4-edge-midpoint-shear`, `3x3x3-gauss` |
| `stabilization_rule` | `initial-physical-rotary-trace-mean-r2` |
| `step_name`, `source_step_name`, `frame_indexing` | `Step-1`, raw input name(현재 Step-2), `mode-rank-one-based` |
| `mass_variant`, `mass_origin`, `normalization` | `derived-lumped`, `consistent-moment-row-sum`, `mass` |
| `eigensolver_backend`, `eigensolver_routine` | `MKL FEAST`, `dfeast_scsrgv` |
| `backend_problem` | `scaled-whitened-lumped-with-identity-mass` |
| `numerical_contract` | `mitc4-shell-feast-eigen:r2` |
Source identity는 [현재 writer primitive](../../src/fesa/io/hdf5/hdf5_primitives.cpp)의 byte
identity와 동일하다. SHA-256 reference audit와 FNV source identity는 다른 목적이다.
Filename만으로 동일 input이라고 간주하지 않는다. Comparator는 실제 지정 input bytes의
content identity와 lexical input path를 metadata에 대조한다.
| Dataset | Shape/type와 fields | Identity·단위·ordering |
| --- | --- | --- |
| `/model/nodes` | `[nn]` 기존 compound: `internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3]` | Internal ID 0..nn-1, 기존 instance expansion/declaration order; coordinates length, global-cartesian |
| `/model/elements` | `[ne]` 기존 shell compound: `internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64` | Internal ID order; source S4/S4R 구별; formulation FESA-MITC4 |
| `/model/shell/materials` | `[nmat]` 기존 compound: `internal_material_id:u64,name:utf8,E:f64,nu:f64` | Declaration order; E force/length^2, nu1. 기존 field에 rho를 끼워 넣지 않음 |
| `/model/shell/sections` | 기존 compound: `internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64` | Declaration order, thickness length, centered-single-layer |
| `/model/shell/nodal_director`, `/model/shell/nodal_frame` | `[nn,3]`, `[nn,3,3]` f64 | 기존 source node rows; D components, frame axes A/B/D×global X/Y/Z, dimension1 |
| `/model/nodal_constraint_mask` | `[nn,6]` u8 | Existing DOF order UX,UY,UZ,URX,URY,URZ; free0/constrained1 |
| `/model/prescribed_displacement` | `[nn,6]` f64 | 같은 DOF order, 모든 값 exact0; units length×3,radian×3 |
| `/model/shell/densities` | `[density_count]` 새 compound: `material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64` | Material ID ascending, rho mass/length^3, location model-material; declared density별 한 row, 활성 material 모두 존재 |
| `/model/eigen/source_records` | `[record_count]` compound: `ordinal:u64,source_line:u64,keyword:utf8,physical_text:utf8` | 아래 source provenance 대상의 실제 physical line 순서, ordinal0부터 |
| `/diagnostics` | `[diagnostic_count]` 기존 compound: `severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8` | 기존 SortDiagnostics 순서. 성공 파일에는 warning만 존재 |
공통 model dataset의 기존 attrs는 [linear model schema](../linear-static-mitc4-shell/io.md)와
[현재 writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)를 따른다. Eigen-specific attrs는
새 dataset에만 필수이며 기존 static dataset type/attrs를 바꾸지 않는다.
기존 model-only midsurface_locations/section_positions를 공유 writer가 추가 저장해도 허용하나
eigen result/acceptance quantity는 아니며 eigen의 mandatory replay dataset이 아니다.
`source_records` 대상은 STEP, FREQUENCY(그 count data 포함), DENSITY(data 포함), I5
no-op keyword와 그 parameter-continuation physical lines다. Comments는 포함하지 않는다.
`keyword`는 canonical parent keyword이고 `physical_text`는 CR/LF를 제거한 원문이다.
Frequency 선언 유무·blank slot 수·raw values를 여기서 보존한다. 물리 domain의 기준은
validated semantic fields이며 output consumer가 raw text를 다시 실행하지 않는다.
`/steps/Step-1` group attrs는 아래와 같다. Canonical group명과 source name을 구분한다.
| Attribute | Type / 의미 |
| --- | --- |
| `source_step_name`, `source_step_name_canonical` | utf8 raw name / ASCII uppercase key |
| `step_source_line`, `frequency_source_line`, `frequency_data_line` | u64 실제 source1-based line |
| `source_nlgeom`, `source_perturbation_present` | u8 effective NO=0 / explicit flag 유무0 또는1 |
| `source_eigensolver`, `source_sim`, `source_acoustic_coupling`, `source_normalization` | utf8 effective `LANCZOS,YES,ON,MASS`; explicit/omitted는 source_records에서 구분 |
| `requested_mode_count`, `returned_mode_count` | u64 N,N; table row수로 입력 N을 덮어쓰지 않음 |
| `full_dof_count`, `free_dof_count`, `mass_null_dimension`, `finite_dimension` | u64 6nn,nf,nz,n, nf=n+nz |
| `validated_eigenpair_count` | u64 c, N<=c<=n; publicly returned mode 수와 구별 |
## O3. 고유치와 modal vectors
Path prefix는 `/steps/Step-1/eigen`이다. `modes`만 공개 eigenvalue row authority다.
| Relative dataset | Shape/type/fields | 의미·attrs |
| --- | --- | --- |
| `modes` | `[N]` compound `mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64` | Row k는 mode_id=k+1; quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame |
| `frequencies` | `[Nv]` compound `mode_id:u64,frequency:f64` | 정확히 lambda>=0인 modes의 ID subset, mode ID ascending. quantity=cycle-frequency, component_names=Freq, dimension=time^-1, scalar/modal-frame; mandatory dataset이며 Nv=0도 유효 |
| `vectors` | `[N,nn,6]` f64 | mode axis는 modes와 동일, node axis는 model/nodes, component_names=UX,UY,UZ,URX,URY,URZ; global-cartesian, location=nodal-modal-vector |
`vectors.component_unit_dimensions`는 `mass^-1/2` 세 개와 `mass^-1/2*length^-1` 세 개다.
추가 attrs `normalization=mass`, `amplitude_unit_dimension=mass^1/2*length`,
`mass_variant=derived-lumped`, `interpretation=normalized-mode-not-response-displacement`를 둔다.
각 node의 세 회전 성분은 initial global infinitesimal rotation coordinates다. Constrained
component는 exact0이며 source node label을 internal/equation index로 바꾸지 않는다.
기존 `/nodal/displacement`, reaction, stress, nonlinear accepted_frames를 modal 결과로 생성하지 않는다.
Full matrices/consistent matrix/modal stress를 영속 mandatory output으로 추가하지 않는다.
Raw lambda의 오름차순 stable paired sort와 exact tie의 original FEAST column 순서를 따른다.
Sign은 [C4](numerical-review-controls.md#c4-repeated-subspace와-결정론)대로 largest absolute
scaled global component(translation/ell,rotation)의 양수, tie는 source DOF 순서다.
여기서 source DOF 순서는 model/nodes의 stable row order×정해진 component order다.
Cluster는 전체 c sorted columns에서 C4의 connected rule로 1부터 매기고 첫 N개에 같은 ID를
투영한다. Cluster ID는 진단용이며 값을 평균하거나 결과 multiplicity를 줄이지 않는다.
`operator_scale=s`는 O4에 저장한다. `mu=lambda/s`에서 `mu<-1e-9`는 성공 파일을 만들 수
없는 negative spectrum failure다. `abs(mu)<=1e-9`이면 classification=0(`near-zero`),
그 외는 classification=1(`positive`)이다. Raw lambda와 부호를 그대로 기록하며 ±boundary는
near-zero다. Frequency는 classification이 아닌 raw lambda 부호로 결정한다:
lambda>0이면 sqrt(lambda)/(2pi), lambda==0이면 exact0, lambda<0이면 row가 없다.
따라서 small positive near-zero에도 real frequency가 있고 small negative에는 없다.
Negative row의 부재 이유는 `frequencies@unavailable_rule=negative-raw-eigenvalue`로 명시한다.
Frequency overflow/양수의 underflow-to-zero도 파생 결과 실패로 처리한다. Mandatory lambda
및 mu→lambda conversion은 C3의 finite/underflow 조건을 그대로 따른다.
## O4. Backend와 검증 evidence
Prefix `/steps/Step-1/eigen/verification`의 attrs:
| Attribute | Type / 의미 |
| --- | --- |
| `characteristic_length`, `operator_scale` | positive finite f64 ell[length], s[time^-2] |
| `eta_gram`, `max_eta_orth` | finite f64, 전체 c의 V3 Gram와 pairwise 최대 metric; c=1이면 max_eta_orth=0 |
| `eta_mz`, `eta_kz`, `eta_pz`, `null_checks_applicable` | f64×3 및 u8; nz=0이면 applicable0와 storage값0, N/A이지 수행 통과로 보고하지 않음 |
| `validation_scope`, `numerical_contract` | utf8 `all-computed-c-columns`, `mitc4-shell-feast-eigen:r2` |
| Dataset | Fields / shape | 의미 |
| --- | --- | --- |
| `verification/nodal_reduction` | `[nn]` compound `free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64` | Source node row 대응; E2 analytic counts. Nonempty positive block에 rcond_available1, C2 cutoff 통과; 빈 block은0/0 storage. nf/nz/n과 합 일치 |
| `verification/eigenpair_checks` | `[c]` compound `sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64` | sorted_rank1..c, solver_column은 원 FEAST column0-based unique; 실제 ML의 V3/V4/C3 metrics. 첫 N ranks의 lambda는 modes와 exact equal |
Nodal reduction의 quantity component는 `rcond_inf`, dimension1, coordinates=scalar,
location=nodal-mass-reduction이다. Eigenpair checks의 component_names는 표의 f64 fields
순서이고 dimensions는 eigenvalue와 rayleigh_quotient만 time^-2, 나머지는1이다.
Coordinates=scalar, location=eigenpair-verification이며 mandatory finite 검증량과
optional backend_res의 validity를 구분한다.
`eigenpair_checks`는 내부 count/검증 evidence다. c>N 진단행은 추가 공개 modal frame이
아니며 comparator는 여기서 Value를 추출하지 않는다. c개 vector 전부는 검사 동안 유지하고
accepted state에는 공개 N개 vector와 전체 c의 check evidence를 보존한다. 전체 c Gram의
runtime/독립 검증은 C17/18 evidence로 확인하며 N개 persistent vectors만으로 full-c Gram를
재검산했다고 주장하지 않는다. N개 원 residual/normalization은 model 데이터에서 K/ML를
독립 재구성하여 재현할 수 있다. Consistent/lumped 독립 oracle는 NR cases의 내부 테스트다.
Backend `res`가 0-eigenvalue의 상대분모 때문에 unavailable인 경우만
backend_res_available0, backend_res storage0을 사용하고 dataset attr
`unavailable_reason=zero-eigenvalue-relative-residual`를 둔다. Available 값은 finite이고,
nonzero eigenvalue의 nonfinite backend diagnostic은 failure다. Storage0을 residual evidence0으로
해석하지 않는다. mandatory eta_*는 모든 경우 자체 zero branch와 함께 finite다.
Prefix `/steps/Step-1/eigen/backend` attrs는 `runtime_version:utf8`(실제 MKL query),
`integer_abi:utf8`(`LP64|ILP64` 실제 linked ABI), `thread_count:u64=1`,
`seed:u64=0x4D495443344D4645`, `count_calls:u64`, `solve_calls:u64`,
`final_count:u64=c`, `final_solve_ordinal:u64`, `selected_ranks:utf8=1..N`,
`enclosure_lower:f64`, `enclosure_upper:f64`, `solve_lower:f64`, `solve_upper:f64`다.
Bounds는 모두 dimensionless B-space이며 physical frequency bound가 아니다.
| Relative dataset | Shape / fields | 의미 |
| --- | --- | --- |
| `calls` | `[Lcalls]` compound `ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64` | ordinal0-based 실제 call 순서; kind=count/solve, strict bounds, 실제 allocated capacity. Count의 overwritten m0와 solve의 m을 count로 구분 저장 |
| `fpm` | `[Lcalls,128]` i64 | 각 call 직전 feastinit 이후의 exact parameter snapshot; vendor type을 public core에 노출하지 않음 |
`purpose`는 `total-enclosure`, `upper-prefix`, `lower-prefix`, `endpoint-guard`,
`final-prefix`, `final-interval`, `solve` 중 하나이며 실제 C5 단계에 대응한다.
Calls의 component_names는 `lower,upper,epsout`, dimensions는 `1,1,1`,
coordinates=scalar, location=backend-call이다. Fpm은 component_names=fpm,
dimension1, coordinates=none, location=backend-parameter이며 128개 C-index 순서다.
Calls의 unavailable output은 flag0+storage0이고 원인을 info로 해석한다. Undefined vendor
output을 읽거나 garbage를 저장하지 않는다. `info=0`이면 count_available1; 성공 solve는
loop/epsout도 available1이고 epsout finite. 내부 허용 재시도의 실패 call도 삭제하지 않는다.
최종 성공과 C5 guard/prefix/total count 관계는 chronological calls/bounds로 재구성 가능해야 한다.
Allocated_m0와 input N은 독립이다. Effective fpm와 seed/budget은 C5/C6와 일치해야 한다.
Count-only res/epsout을 fabricated physical result로 사용하지 않는다.
## O5. Self-check와 compatibility tests
Writer는 candidate를 flush/close한 뒤 read-only reopen하여 type/field/shape/required attrs,
finite required values, enum/validity domains 및 다음 관계를 확인하고 검사용 handle도 닫는다.
1. Source identity·input semantic snapshot이 writer 입력과 일치한다. Node/element/material IDs,
connectivity/section/material/density links가 unique/in-range이고 모든 활성 material rho>0이다.
2. Source step은 한 개이고 canonical Step-1과 raw name의 관계가 유일하다. Input N,
requested N, returned N, modes/vector row수가 같다. mode IDs는 정확히1..N이다.
3. Modes가 raw 오름차순이며 classification/cluster는 C3/C4 규칙과 맞는다. Frequencies의
ID set은 lambda>=0 set과 exact equal이며 각 값은 candidate 파생값과 같고 finite다.
4. Vectors는 finite, source constraint component exact0, scalar/vector pair는 candidate와
일치한다. Selected vectors의 ML normalization/원 residual은 serializer 전 C3 gate에서
검증되었고 해당 metrics 및 read-back values를 대조한다. Serializer 자기복사를 독립 physics로 부르지 않는다.
5. `nf=n+nz`, node별 counts 합, N<=c<=n, 전체 c check rows와 solver-column uniqueness,
첫 N lambda exact equality, modal_mass>0, 모든 적용 C2/C3 metric 한계가 맞는다.
6. Calls/fpm row수·ordinals·strict endpoints·finite available diagnostics, fpm controls,
counts/budgets(<=512 count, <=3 solve), final solve info0/returned m=c와 selected1..N이 맞는다.
증거 없는 성공 bool 하나로 대체하지 않는다.
7. `/diagnostics`는 기존 compound `severity,code,file,line,keyword,entity_identity,message`를
유지하며 source order warnings를 저장한다. 성공 파일에 fatal error diagnostic은 없다.
이 mandatory inventory는 reader version dispatch, round-trip, 누락/extra mode/duplicate ID,
nonfinite/wrong dimension/type/mass/backend/source, close/reopen/self-check failure tests의 기준이다.
Optional unknown dataset의 존재를 extra-mode로 오인하지 않는다. Static 파일은 기존 schema
inventory로 계속 검증하고, eigen reader는 static 또는 unknown eigen revision을 명시적으로 거부한다.
+702 -17
View File
@@ -1,51 +1,59 @@
# MITC4 mass와 FEAST I/O 계약
# 이전 MFE 입력·결과·mapping 계약
이전 baseline의 계약 이력이다. 현재 입력·schema·controls는 [eigen2 I/O](../mitc4-shell-feast-eigen2/io.md#io)가 원본이다.
<a id="io"></a>
<a id="io--mitc4-mass와-feast-io-계약"></a>
## MITC4 mass와 FEAST I/O 계약
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `io-definition-agent`
- Input contract revision: `r2`
- 요청 outcome: `pass`; 다음 owner: `implementation-planning-agent`
- 의미: Stage 5 계약 검토 요청이며 workflow 전이·구현 완료 판정이 아니다.
지역 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[coordination](coordination.md)이다. [Requirements](requirements.md)와
[승인 evidence](requirements-evidence.md), [research](research.md)/[상세 근거](research-evidence.md),
[formulation](formulation.md), [NR](numerical-review.md)/[독립 evidence](numerical-review-evidence.md),
[controls](numerical-review-controls.md), [cases](numerical-review-cases.md),
[coordination](development-notes.md#실패와-재발-방지)이다. [Requirements](requirements.md#requirements)와
[승인 evidence](requirements.md#requirements-evidence), [research](research.md#research)/[상세 근거](research.md#research-evidence),
[formulation](formulation.md#formulation), [NR](numerical-review.md#numerical-review)/[독립 evidence](numerical-review.md#numerical-review-evidence),
[controls](numerical-review.md#numerical-review-controls), [cases](numerical-review.md#numerical-review-cases),
[reference-model](reference-model.md)의 r2를 적용했다.
[프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md),
[TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 관리](../FEATURE_DOCUMENTATION.md)가 공통 기준이다.
## 핵심 계약
<a id="io--핵심-계약"></a>
### 핵심 계약
1. [입력·validation](io-input.md)은 constant material density, 원형상 단일 frequency step,
1. [입력·validation](io.md#io-input)은 constant material density, 원형상 단일 frequency step,
입력 requested N, homogeneous global BC와 원본의 부수 옵션을 고정한다. Source
Lanczos/SIM과 actual FEAST를 구분한다. 기존 static은 density 없이 계속 동작한다.
2. [결과 schema](io-schema.md)는 기존 static schema를 보존하고 eigen procedure 전용
2. [결과 schema](io.md#io-schema)는 기존 static schema를 보존하고 eigen procedure 전용
additive 계약을 정의한다. 공식 파일은 lexical sibling `<stem>_results.h5`이고,
source step과 mode 1..N, raw lambda, actual lumped mass/backend 및 내부 검증 증거를
저장한다. N개 global modal vectors는 내부 검증 재현을 위해 mandatory다.
3. [책임·failure·comparison mapping](io-mapping.md)은 Domain/view/DOF/별도 eigen state의
3. [책임·failure·comparison mapping](io.md#io-mapping)은 Domain/view/DOF/별도 eigen state의
경계, candidate commit, source identity, 원본 TXT의 Value-only projection과
27개 requirement 및 I/O test obligations를 연결한다. 외부 mode-shape gate는 없다.
`consistent -> derived lumped -> MKL FEAST` 및 [mass](formulation-mass.md),
[reduction/commit](formulation-eigen.md), [verification](formulation-verification.md),
[r2 stabilization](formulation-stabilization.md)의 수학을 변경하지 않는다.
`consistent -> derived lumped -> MKL FEAST` 및 [mass](formulation.md#formulation-mass),
[reduction/commit](formulation.md#formulation-eigen), [verification](formulation.md#formulation-verification),
[r2 stabilization](formulation.md#formulation-stabilization)의 수학을 변경하지 않는다.
FEAST 수치 controls와 외부 10개 singleton family의 공통 판정도 그대로다.
Routine field layout·새 procedure의 additive schema를 정의했으며 기존 public 계약의
비호환 변경 또는 새 사용자 결정은 발견하지 않았다.
## Evidence와 한계
<a id="io--evidence와-한계"></a>
### Evidence와 한계
`Get-Content`, scoped `rg`로 원본 input/TXT, 기존 linear/nonlinear/pressure I/O,
실제 syntax/model mapping, HDF5 writer, source identity 및 diagnostics 경계를 대조했다.
새 keyword 의미는 공식 Abaqus 2025 공개 문서를 확인했고 locator·적용 한계를
[입력 출처](io-input.md#공개-근거와-적용-한계)에 기록했다. Abaqus는 외부 syntax/quantity
[입력 출처](io.md#io-input--공개-근거와-적용-한계)에 기록했다. Abaqus는 외부 syntax/quantity
convention이며 내부 parser, mass, integration, stabilization 또는 ODB와 동등성을 주장하지 않는다.
정적 검증 명령·exit, owned metadata/links/coverage와 원본 inventory는
[감사 evidence](io-mapping.md#정적-감사-evidence)에 기록한다.
[감사 evidence](io.md#io-mapping--정적-감사-evidence)에 기록한다.
새로 작성한 문서는 이 보고서와 `io-input.md`, `io-schema.md`, `io-mapping.md`뿐이다.
Source/tests/build/phase/Hook/Git 및 upstream/reference는 수정하지 않았다.
문서 단계이므로 C++ build/test, Harness, 실제 FEAST, 외부 solver 및 FESA/reference
@@ -54,5 +62,682 @@ Source/tests/build/phase/Hook/Git 및 upstream/reference는 수정하지 않았
Planning은 각 test obligation을 정확한 owned paths와 RED/GREEN/focused/full VERIFY에
연결하고, Implementation/Physics는 fresh eigen 결과 및 승인된 static 회귀를 검증해야 한다.
Ill-conditioned positive mass의 명시적 실패, FEAST floating-point count/cluster 한계,
count scratch와 shifted factorization 비용은 [NR controls](numerical-review-controls.md)의
count scratch와 shifted factorization 비용은 [NR controls](numerical-review.md#numerical-review-controls)의
잔여 위험이며 I/O가 cutoff·fallback·새 tolerance로 우회하지 않는다.
<a id="io-input"></a>
<a id="io-input--mitc4-eigen-입력-subset과-진단"></a>
## MITC4 eigen 입력 subset과 진단
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md#io)
<a id="io-input--i1-문법과-source-identity"></a>
### I1. 문법과 source identity
기존 [linear shell I/O §1](../linear-static-mitc4-shell/io.md),
[현재 pressure I/O §3](../shell-surface-pressure-load/io.md)의 공통 lexical 계약을 재사용한다.
현재 [input reader](../../src/fesa/io/abaqus/input_reader.cpp)와
[mapping context](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 읽기 전용 대조했다.
예전 nonlinear 문서의 continuation 미지원 설명보다 후속 승인된 pressure lexical 규칙이 우선한다.
- CRLF/LF를 수용한다. Physical line은 종결자를 제외해 최대 256 ASCII bytes이며 printable
ASCII와 horizontal tab만 허용한다. `**` comment와 blank line은 semantic effect가 없다.
Inline comment, data continuation, include, substitution, quoted/escaped 이름은 지원하지 않는다.
- Keyword/parameter/enum/name lookup은 ASCII case-insensitive다. Parameter 순서는 무관하지만
duplicate name은 값이 같아도 실패한다. Raw spelling, keyword physical lines, data fields와
normalized lexical input path/1-based line을 보존한다. Keyword terminal comma는 기존
parameter continuation이며 직후 comment/blank/new keyword/EOF interruption은 실패한다.
- Comma split은 빈 필드를 보존한다. 각 token 주변 space/tab만 trim한다. 아래 명시된
공란 외에 arbitrary trailing-empty 제거를 적용하지 않는다.
- Source node/element label은 positive decimal int64이고 raw digits와 numeric identity를
분리한다. Scope 내 같은 numeric label은 duplicate다. Name/target는 기존 shell의
비어 있지 않은 ASCII 이름·qualification 규칙을 재사용한다. 새 step name도 같은
name token이며 생략 시 source name은 `Step-1`이다. HDF5 path에 raw name을 삽입하지 않는다.
- 새 `rho` numeric token은 `[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?`다.
C-locale full consumption과 binary64 finite conversion을 요구한다. NaN/Inf, hex, D exponent,
overflow/underflow conversion error는 실패한다. N은 `[0-9]+`와 checked int64 범위이며
값이 양수여야 한다. 기존 keyword의 승인된 numeric parsing은 이 기능 때문에 바꾸지 않는다.
<a id="io-input--i2-지원-keyword와-위치"></a>
### I2. 지원 keyword와 위치
Eigen input의 문법은 `heading? preprint? part+ assembly material+ model-boundary* step EOF`다.
Comments/blank는 블록 사이에 허용한다. 기존 mesh/set nesting과 forward material/section
resolution은 유지한다. 활성 모델은 S4/S4R shell만 포함한다.
| Keyword | Eigen subset·data | 의미와 validation |
| --- | --- | --- |
| `*HEADING` | Optional 첫 keyword, parameter 없음, text rows | Heading provenance. Duplicate/nesting 오류 거부 |
| `*PART`, `*END PART` | `NAME` 하나; close parameter/data 없음 | Part-local topology. 중첩/중복/미종결 거부 |
| `*NODE` | Part scope, parameter 없음; `label,x,y,z` | Finite initial global midsurface coordinates. 중복·잘못된 arity 거부 |
| `*ELEMENT` | Part scope, `TYPE=S4` 또는 `TYPE=S4R`만; `label,n1,n2,n3,n4` | 같은 MITC4 physical/mass path와 별도 source type. 네 distinct resolved nodes 필요 |
| `*NSET`, `*ELSET` | Part/assembly scope; 해당 `NSET=name` 또는 `ELSET=name`, optional flag `GENERATE`; assembly는 `INSTANCE=name` 필수. 기존 assembly ELSET의 `INTERNAL` flag도 유지 | Explicit positive labels, 또는 `first,last,increment` inclusive generate. 기존 set row trailing comma 허용. Nonpositive/역순/도달 불가능 range·empty·duplicate definition·dangling/cyclic/mixed-instance 거부 |
| `*SHELL SECTION` | Part scope, `ELSET`, `MATERIAL` 필수; 한 row `t[,integration_points]` | Centered homogeneous layer, constant finite t>0, element별 유일 assignment. Optional second field가 있으면 positive decimal integer; 아래 예외 적용 |
| `*ASSEMBLY`, `*END ASSEMBLY` | Top-level 하나, `NAME`; close parameter/data 없음 | Assembly scope, nested/duplicate 거부 |
| `*INSTANCE`, `*END INSTANCE` | Assembly scope, `NAME`, `PART`; data 없음 | Identity instances; 같은 part의 여러 identity instance 허용. Transform/dangling/duplicate 거부 |
| `*MATERIAL` | Top-level model data, `NAME`; data 없음 | Named material 소유. Case-insensitive unique |
| `*ELASTIC` | Current material, parameter 없음; 한 row `E,nu` | 기존 finite E>0, -1<nu<0.5; constant isotropic. Missing/duplicate/dependent 거부 |
| `*DENSITY` | Current material, parameter 없음; I3 | Constant positive volume mass density |
| `*BOUNDARY` | Model data 또는 sole step의 FREQUENCY 뒤·output requests 전; parameter 없음; `target,first,last[,value]` | 1<=first<=last<=6, value 생략은 exact0; 있으면 finite exact0만 허용. 네 번째 empty token은 생략과 다르며 거부 |
| `*STEP`, `*END STEP` | I4; 정확히 하나의 top-level step | Prior/multiple/nested step·preload 없음 |
| `*FREQUENCY` | I4; sole step 첫 procedure | Original configuration, undamped real lowest-N eigenproblem |
| 부수 output keywords | I5의 exact combinations만 | Mandatory output 선택/억제 기능 없음, warning provenance |
`t,5`의 두 번째 값은 [기존 사용자 승인 예외](../linear-static-mitc4-shell/io.md#11-shell-section-data-rule)에
따라 warning 없이 읽는 source provenance다. 별도 physical property를 만들지 않는다.
Stiffness는 기존 2×2×2, mass는 [M5](formulation.md#formulation-mass)의 3×3×3이며 이 값으로 바뀌지 않는다.
이 예외를 다른 section/material option에 일반화하지 않는다.
Boundary target는 기존 source resolver의 bare node label 또는 unique node-set name이다.
Assembly NSET의 INSTANCE binding으로 원하는 instance를 지정한다. 여러 instance에서
bare target가 모호하면 거부하며 새로운 dotted boundary qualification을 추가하지 않는다.
Model BC 다음 step BC 순서로 resolve하고 node/component별 exact-zero union을 적용한다.
같은 zero constraint 재선언은 동일 constraint다. Nonzero row를 상쇄·override하여 허용하지 않는다.
원본 `(Part-1-1,Set-2)`의 104 nodes×6 DOF가 모두 고정됨을 확인한다.
Global component 제약만 지원하며 tangent/local/MPC constraint를 새로 추론하지 않는다.
<a id="io-input--i3-density-material-mapping"></a>
### I3. Density material mapping
`*DENSITY`는 한 material에 최대 한 번, 정확히 한 data row이며 첫 field는 rho다.
`rho` 또는 `rho,`만 허용한다. 후자는 원본 `2700.,`의 빈 temperature slot이며
temperature dependence가 없는 constant 값으로 대응한다. Nonempty temperature/field variable,
두 개 이상의 추가 comma, 추가 data row, `DEPENDENCIES`(0 포함), `PORE FLUID`, `SLURRY`,
distribution 이름과 다른 parameter는 거부한다. Elastic과 Density의 상대 선언 순서는 자유다.
Numeric rho가 finite이며 strict >0이어야 한다. Material scope 밖 Density도 실패다.
모든 활성 shell의 `element -> section -> material -> rho`가 정확히 하나로 결정되어야 한다.
Missing rho를 0이나 기본값으로 채우지 않는다. 서로 다른 material/section의 rho/t를
global 평균으로 바꾸지 않는다. 사용하지 않은 material의 Density가 존재하면 문법·양성 검증은
동일하며, rho 존재의 필수성은 활성 material에 적용한다. Material/section reference 오류는
밀도가 있는 다른 material로 fallback하지 않는다. 단위는 `mass/length^3`, 변환 없음.
Density의 새 입력 허용은 이 eigen procedure에 속한다. 기존 static parser의 Density 지원
범위를 넓히지 않고, density가 없는 기존 static input과 material 생성 경로를 보존한다.
Material의 내부 optional density를 만들더라도 static에 필수값을 요구하지 않는다.
<a id="io-input--i4-step와-frequency의-exact-options"></a>
### I4. Step와 Frequency의 exact options
`*STEP` 허용 parameter는 optional `NAME=<name>`, optional `NLGEOM=NO`, optional
value 없는 `PERTURBATION`뿐이며 data는 없다. NLGEOM 생략은 NO다. PERTURBATION이 없어도
FREQUENCY가 원형상 linear perturbation procedure를 결정하고 source flag 유무를 보존한다.
`NLGEOM=YES`, flag NLGEOM, `PERTURBATION=...`, `INC`, 다른 option은 eigen에서 거부한다.
Frequency 외 procedure, step description data, 두 번째 procedure/step, 선행 상태는 지원하지 않는다.
| FREQUENCY parameter | 허용·기본 의미 | Observable mapping |
| --- | --- | --- |
| `EIGENSOLVER` | 생략 또는 `LANCZOS` | Source default=LANCZOS; actual=`MKL FEAST`. Explicit/omitted provenance와 backend mapping warning 기록 |
| `SIM` | 생략, value 없는 flag, `YES` | Source effective=YES. FESA SIM architecture 기능을 만들지 않음. Explicit일 때 no-op warning |
| `ACOUSTIC COUPLING` | 생략 또는 `ON` | Acoustic/ASI/TIE/coupling 정의가 전혀 없는 structural-only 모델에서만 적용 대상 없음. Explicit일 때 no-op warning |
| `NORMALIZATION` | 생략 또는 `MASS` | Source SIM=YES의 mass default를 적용. FESA 실제 ML로 phi^T ML phi=1; 값 변경 warning 없음 |
`SIM=NO`, `NORMALIZATION=DISPLACEMENT`, `AMS/SUBSPACE/FEAST` source enum,
`ACOUSTIC COUPLING=OFF|PROJECTION`, `DAMPING PROJECTION`, `RESIDUAL MODES`,
`PROPERTY EVALUATION`, `NSET` 및 다른 parameter는 지원하지 않는다.
사용자 backend 요구를 Abaqus 문법의 새 `EIGENSOLVER=FEAST` 지원으로 바꾸지 않는다.
Data는 정확히 한 physical row, comma split 후 **1~7 fields**다. 첫 field N은 mandatory
positive decimal integer이며 2~7은 존재하면 모두 empty여야 한다. 생략된 trailing fields도
unspecified다. 원본 `10, , , , ,`는 여섯 fields로 유효하다. Fields 2/3은 frequency bounds,
4는 shift, 5/6은 Lanczos controls, 7은 acoustic range factor의 source slot이다.
공란은 숫자0이 아니다. 어느 slot의 nonempty `0`도 지원하지 않으며, eighth empty field도
arity 오류다. 추가 row는 residual-mode input으로 해석하지 않고 거부한다.
이 제한은 [공식 FREQUENCY syntax](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의
선택된 부분집합이다. N은 마지막까지 input authority이고 TXT 행수/count scratch/returned m과 다르다.
`N>finite_dimension` 및 빈 finite problem은 equation 구성 뒤 명시적으로 실패한다.
<a id="io-input--i5-result-neutral-allowlist와-warning"></a>
### I5. Result-neutral allowlist와 warning
아래 keyword는 parameter 순서만 자유이며 duplicate/추가 parameter·data row는 거부한다.
동일 조합의 반복 output request는 각 keyword당 warning 한 개를 남기며 결과를 바꾸지 않는다.
| Keyword | 정확한 조합·위치 | Warning code |
| --- | --- | --- |
| `*PREPRINT` | Optional top-level; `ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO` 정확히 네 개, data 없음 | `ignored-input-keyword` |
| `*RESTART` | FREQUENCY/BC 뒤; flag WRITE와 FREQUENCY=0, data 없음 | `ignored-input-keyword` |
| `*OUTPUT` | FREQUENCY/BC 뒤; FIELD 또는 HISTORY flag 하나; optional VARIABLE=PRESELECT; data 없음 | `ignored-input-keyword` |
| `*NODE OUTPUT` | 활성 OUTPUT FIELD 아래; VARIABLE=PRESELECT 하나, data 없음 | `ignored-input-keyword` |
| `*ENERGY OUTPUT` | 활성 OUTPUT HISTORY 아래; VARIABLE=ALL 하나, data 없음 | `ignored-input-keyword` |
새 OUTPUT root는 앞의 output scope를 닫고, RESTART/END STEP도 닫는다. Child scope mismatch는
거부한다. Restart READ/nonzero write frequency, output variables data, element/contact output,
node history request 등 표 밖 조합은 eigen에서는 fail-closed다. 기존 static allowlist를 축소하지 않는다.
Warning message는 raw keyword와 `mandatory-eigen-output-unchanged` 이유를 포함한다.
RESTART frequency0은 write 중단 옵션이고 출력 요청들은 model equations를 바꾸지 않는
output selection이다. FESA는 이 selection을 구현하지 않는다는 차이를 알린다.
FREQUENCY에는 `source-eigensolver-mapped-to-feast` warning을 항상 하나 기록한다.
Explicit SIM에는 `source-sim-option-not-applied`, explicit acoustic ON에는
`acoustic-option-inapplicable-structural-only`를 기록한다.
위 세 code를 포함한 출력 순서는 기존 source tuple의 code 정렬을 따른다. Invalid model은
이 warning을 근거로 acoustic/coupling semantics를 버려서는 안 된다.
<a id="io-input--i6-fail-closed-validation과-diagnostics"></a>
### I6. Fail-closed validation과 diagnostics
표 밖 model/history keyword는 eigen analysis 전에 거부한다. 특히 어떤 위치의
`CLOAD/DLOAD/DSLOAD`, initial condition/stress/temperature, damping, acoustic/ASI elements,
TIE/contact/MPC, transform/orientation/explicit director, surface/beam/solid/mixed model,
concentrated/nonstructural mass, composite/offset/variable thickness, amplitudes, restart read와
다중 step은 지원하지 않는다. Zero-valued load/damping 입력도 지원되는 무하중 모델로 바꾸지 않는다.
진단 record는 기존 `severity,code,file,line,keyword,entity_identity,message`를 사용한다.
file은 lexical normalized path, line은 source 1-based다. Material/section/node/element/step,
DOF 또는 invalid parameter/field ordinal을 가능한 한 entity/message에 포함한다.
Numerical scale·threshold·observed value는 binary64 round-trip 가능한 decimal로 보고한다.
Source location 없는 backend failure도 sole Frequency location과 step을 연결한다.
기존 SortDiagnostics 순서와 same-key discovery order를 유지한다.
| Condition | Stable code | CLI exit |
| --- | --- | --- |
| Lexical/arity/duplicate parameter/name/unresolved source | 기존 `invalid-input-character`, `input-line-too-long`, `invalid-data-arity`, `invalid-keyword-parameter`, `unresolved-reference` 등 해당 기존 code | 3 |
| Density scope/data/dependency/duplicate | `invalid-density-data` / `unsupported-density-option` / `duplicate-density` | 3 |
| Active rho missing / numeric nonfinite 또는 nonpositive | `missing-material-density` / `invalid-material-density` | 4 |
| New rho malformed numeric token | `invalid-density-data` | 3 |
| Frequency parameter/count/data mismatch | `unsupported-frequency-option` / `invalid-frequency-data` | 3 |
| Multiple/preload/unsupported procedure | `unsupported-analysis-procedure` | 3 |
| Nonzero base/prescribed BC | `unsupported-eigen-boundary` | 3 |
| Model-affecting exclusion / unsupported element | `unsupported-keyword` / `unsupported-element-formulation` / `unsupported-mixed-element-model` | 3 |
| Invalid geometry/section/material | 기존 model code; mass27-point invalid는 `invalid-shell-mass-geometry` | 4 |
| Global finite n=0 / N>n | `empty-eigenproblem` / `insufficient-finite-modes` | 4 |
| Analytic/null/positive mass or conditioning 실패 | `invalid-eigen-mass-space` / `eigen-mass-conditioning` | 5 |
| Index/storage/allocation/FEAST/count/budget/negative/validation 실패 | [M2 diagnostic mapping](io.md#io-mapping--m2-backend와-failure-lifecycle) | 5 |
| Candidate/write/close/self-check/replace/log/lock 실패 | 기존 output category와 [M2](io.md#io-mapping--m2-backend와-failure-lifecycle) | 6 |
`NaN/Inf` rho는 nonfinite model value(4)로 분류하고 그 외 malformed token은 syntax(3)다.
같은 실패를 여러 code로 중복 보고하지 않고 첫 발견 원인을 유지한다. Fatal 뒤 solve/commit을
실행하지 않는다. CLI usage2/success0과 stderr format은 기존 공통 계약을 유지한다.
<a id="io-input--공개-근거와-적용-한계"></a>
### 공개 근거와 적용 한계
2026-09-06 공식 Abaqus 2025 문서를 `web.open`으로 확인했다. 사실은 syntax/외부 의미이고,
위 exact subset/default/warning policy는 승인된 FESA 요구에 대한 I/O mapping이다.
| Source | Locator와 사용 |
| --- | --- |
| [DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm) | Data lines 1~2와 optional dependencies; constant rho 및 ML^-3 차원. 온도·distribution 지원은 포함하지 않음 |
| [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm) | Optional parameters와 Lanczos data line 1~7. Source defaults·bounds/shift 공란을 구분; FESA Lanczos 내부 동작의 근거가 아님 |
| [STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm) | NAME/NLGEOM/PERTURBATION. 선행 history 전달은 제외 |
| [RESTART](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-restart.htm) | WRITE/FREQUENCY=0 및 no-data. Restart 지원을 주장하지 않음 |
| [OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-output.htm) | Output selection root |
| [NODE OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-nodeoutput.htm) | FIELD와 VARIABLE=PRESELECT |
| [ENERGY OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-energyoutput.htm) | HISTORY와 VARIABLE=ALL; 새 modal energy output 요청으로 확대하지 않음 |
| [Input Syntax Rules](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-inputsyntax.htm) | Keyword/data/256-byte/continuation convention; FESA bounded 차이와 기존 정책은 I1이 권위 |
질량 정식화·private parser/model·solution algorithm·ODB internals의 동등성을 추론하지 않는다.
<a id="io-schema"></a>
<a id="io-schema--mitc4-eigen-authoritative-hdf5-schema"></a>
## MITC4 eigen authoritative HDF5 schema
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md#io)
- 수학: [E1~E8](formulation.md#formulation-eigen), [V1~V6](formulation.md#formulation-verification)
- Numerical authority: [C1~C6](numerical-review.md#numerical-review-controls)
<a id="io-schema--o1-container-version과-공통-규칙"></a>
### O1. Container, version과 공통 규칙
공식 결과는 input lexical sibling `<stem>_results.h5`다. 기존 linear schema0와 nonlinear
schema1은 각각의 [현행 static 계약](../shell-surface-pressure-load/io.md#71-version-and-filename-decision)을
유지한다. Eigen은 기존 shell model container에 새 procedure를 추가하며 discriminant는
`(schema_version=0, feature_id=mitc4-shell-feast-eigen, analysis_procedure=linear-frequency,
eigen_schema_version=1)`이다. `eigen_schema_version`은 새 procedure 전용 revision이다.
Static reader가 schema_version만 보고 eigen을 static으로 해석해서는 안 된다.
기존 static 파일에 새 eigen mandatory fields를 요구하거나 재작성/migration하지 않는다.
앞으로 unknown additive optional field는 무시할 수 있지만 known field의 type/의미 변경,
unknown procedure 또는 eigen_schema_version은 reader의 명시적 unsupported schema 실패다.
Float는 `H5T_IEEE_F64LE`, unsigned/signed integer는 명시된 `H5T_STD_U{8,64}LE`/
`H5T_STD_I64LE`, string은 variable-length UTF-8이다. Compound field의 byte offset/padding은
private이며 field name/type/array extent가 authoritative다. Shape의 `nn,ne,nmat`는 model
node/element/material 수, `N`은 입력 요청, `c`는 최종 solve의 전체 검증 column 수,
`Lcalls`는 모든 actual FEAST calls 수다. 모든 shape/capacity는 checked integer다.
새 numeric dataset의 required attrs는 `schema_version=0`, `eigen_schema_version=1`,
`component_names`, `component_unit_dimensions`, `coordinate_system`, `location`이다.
Compound에서 component attrs는 수치 quantity fields만 table의 명시 순서로 나열하고
identity/flag/counter는 schema 정의를 따른다. 새 modal result에는 추가로
`step_name=Step-1`, `source_step_name=<raw source>`, `domain=mode`를 기록한다.
Tokenized dimension은 아래 `mass`, `length`, `time`를 사용하며 SI label을 붙이지 않는다.
모든 mandatory physical/검증 real 값은 finite다. Optional backend diagnostic의
unavailable는 O4의 명시적 validity flag만 사용한다. NaN payload를 공개하지 않는다.
<a id="io-schema--o2-metadata-모델과-source-요청"></a>
### O2. Metadata, 모델과 source 요청
`/metadata`의 아래 attributes는 mandatory다.
| Attribute | Type / 값 |
| --- | --- |
| `schema_version`, `eigen_schema_version` | uint64 `0`, `1` |
| `feature_id`, `analysis_procedure` | UTF-8 `mitc4-shell-feast-eigen`, `linear-frequency` |
| `solver_version` | 실제 실행 binary의 기존 version string |
| `source_input_identity` | 기존 `path=<absolute lexical generic path>;content_identity=fnv1a64:<16 lower hex>`; parser가 실제 읽은 원본 bytes 기준 |
| `unit_system_label` | `user-consistent-unspecified` |
| `coordinate_convention` | `global-cartesian; shell-local=initial-reference; positive-thickness=+zeta` |
| `internal_formulation` | `FESA-MITC4` |
| `integration_rule`, `mass_integration_rule` | `2x2x2-gauss; mitc4-edge-midpoint-shear`, `3x3x3-gauss` |
| `stabilization_rule` | `initial-physical-rotary-trace-mean-r2` |
| `step_name`, `source_step_name`, `frame_indexing` | `Step-1`, raw input name(현재 Step-2), `mode-rank-one-based` |
| `mass_variant`, `mass_origin`, `normalization` | `derived-lumped`, `consistent-moment-row-sum`, `mass` |
| `eigensolver_backend`, `eigensolver_routine` | `MKL FEAST`, `dfeast_scsrgv` |
| `backend_problem` | `scaled-whitened-lumped-with-identity-mass` |
| `numerical_contract` | `mitc4-shell-feast-eigen:r2` |
Source identity는 [현재 writer primitive](../../src/fesa/io/hdf5/hdf5_primitives.cpp)의 byte
identity와 동일하다. SHA-256 reference audit와 FNV source identity는 다른 목적이다.
Filename만으로 동일 input이라고 간주하지 않는다. Comparator는 실제 지정 input bytes의
content identity와 lexical input path를 metadata에 대조한다.
| Dataset | Shape/type와 fields | Identity·단위·ordering |
| --- | --- | --- |
| `/model/nodes` | `[nn]` 기존 compound: `internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3]` | Internal ID 0..nn-1, 기존 instance expansion/declaration order; coordinates length, global-cartesian |
| `/model/elements` | `[ne]` 기존 shell compound: `internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64` | Internal ID order; source S4/S4R 구별; formulation FESA-MITC4 |
| `/model/shell/materials` | `[nmat]` 기존 compound: `internal_material_id:u64,name:utf8,E:f64,nu:f64` | Declaration order; E force/length^2, nu1. 기존 field에 rho를 끼워 넣지 않음 |
| `/model/shell/sections` | 기존 compound: `internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64` | Declaration order, thickness length, centered-single-layer |
| `/model/shell/nodal_director`, `/model/shell/nodal_frame` | `[nn,3]`, `[nn,3,3]` f64 | 기존 source node rows; D components, frame axes A/B/D×global X/Y/Z, dimension1 |
| `/model/nodal_constraint_mask` | `[nn,6]` u8 | Existing DOF order UX,UY,UZ,URX,URY,URZ; free0/constrained1 |
| `/model/prescribed_displacement` | `[nn,6]` f64 | 같은 DOF order, 모든 값 exact0; units length×3,radian×3 |
| `/model/shell/densities` | `[density_count]` 새 compound: `material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64` | Material ID ascending, rho mass/length^3, location model-material; declared density별 한 row, 활성 material 모두 존재 |
| `/model/eigen/source_records` | `[record_count]` compound: `ordinal:u64,source_line:u64,keyword:utf8,physical_text:utf8` | 아래 source provenance 대상의 실제 physical line 순서, ordinal0부터 |
| `/diagnostics` | `[diagnostic_count]` 기존 compound: `severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8` | 기존 SortDiagnostics 순서. 성공 파일에는 warning만 존재 |
공통 model dataset의 기존 attrs는 [linear model schema](../linear-static-mitc4-shell/io.md)와
[현재 writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)를 따른다. Eigen-specific attrs는
새 dataset에만 필수이며 기존 static dataset type/attrs를 바꾸지 않는다.
기존 model-only midsurface_locations/section_positions를 공유 writer가 추가 저장해도 허용하나
eigen result/acceptance quantity는 아니며 eigen의 mandatory replay dataset이 아니다.
`source_records` 대상은 STEP, FREQUENCY(그 count data 포함), DENSITY(data 포함), I5
no-op keyword와 그 parameter-continuation physical lines다. Comments는 포함하지 않는다.
`keyword`는 canonical parent keyword이고 `physical_text`는 CR/LF를 제거한 원문이다.
Frequency 선언 유무·blank slot 수·raw values를 여기서 보존한다. 물리 domain의 기준은
validated semantic fields이며 output consumer가 raw text를 다시 실행하지 않는다.
`/steps/Step-1` group attrs는 아래와 같다. Canonical group명과 source name을 구분한다.
| Attribute | Type / 의미 |
| --- | --- |
| `source_step_name`, `source_step_name_canonical` | utf8 raw name / ASCII uppercase key |
| `step_source_line`, `frequency_source_line`, `frequency_data_line` | u64 실제 source1-based line |
| `source_nlgeom`, `source_perturbation_present` | u8 effective NO=0 / explicit flag 유무0 또는1 |
| `source_eigensolver`, `source_sim`, `source_acoustic_coupling`, `source_normalization` | utf8 effective `LANCZOS,YES,ON,MASS`; explicit/omitted는 source_records에서 구분 |
| `requested_mode_count`, `returned_mode_count` | u64 N,N; table row수로 입력 N을 덮어쓰지 않음 |
| `full_dof_count`, `free_dof_count`, `mass_null_dimension`, `finite_dimension` | u64 6nn,nf,nz,n, nf=n+nz |
| `validated_eigenpair_count` | u64 c, N<=c<=n; publicly returned mode 수와 구별 |
<a id="io-schema--o3-고유치와-modal-vectors"></a>
### O3. 고유치와 modal vectors
Path prefix는 `/steps/Step-1/eigen`이다. `modes`만 공개 eigenvalue row authority다.
| Relative dataset | Shape/type/fields | 의미·attrs |
| --- | --- | --- |
| `modes` | `[N]` compound `mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64` | Row k는 mode_id=k+1; quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame |
| `frequencies` | `[Nv]` compound `mode_id:u64,frequency:f64` | 정확히 lambda>=0인 modes의 ID subset, mode ID ascending. quantity=cycle-frequency, component_names=Freq, dimension=time^-1, scalar/modal-frame; mandatory dataset이며 Nv=0도 유효 |
| `vectors` | `[N,nn,6]` f64 | mode axis는 modes와 동일, node axis는 model/nodes, component_names=UX,UY,UZ,URX,URY,URZ; global-cartesian, location=nodal-modal-vector |
`vectors.component_unit_dimensions`는 `mass^-1/2` 세 개와 `mass^-1/2*length^-1` 세 개다.
추가 attrs `normalization=mass`, `amplitude_unit_dimension=mass^1/2*length`,
`mass_variant=derived-lumped`, `interpretation=normalized-mode-not-response-displacement`를 둔다.
각 node의 세 회전 성분은 initial global infinitesimal rotation coordinates다. Constrained
component는 exact0이며 source node label을 internal/equation index로 바꾸지 않는다.
기존 `/nodal/displacement`, reaction, stress, nonlinear accepted_frames를 modal 결과로 생성하지 않는다.
Full matrices/consistent matrix/modal stress를 영속 mandatory output으로 추가하지 않는다.
Raw lambda의 오름차순 stable paired sort와 exact tie의 original FEAST column 순서를 따른다.
Sign은 [C4](numerical-review.md#numerical-review-controls--c4-repeated-subspace와-결정론)대로 largest absolute
scaled global component(translation/ell,rotation)의 양수, tie는 source DOF 순서다.
여기서 source DOF 순서는 model/nodes의 stable row order×정해진 component order다.
Cluster는 전체 c sorted columns에서 C4의 connected rule로 1부터 매기고 첫 N개에 같은 ID를
투영한다. Cluster ID는 진단용이며 값을 평균하거나 결과 multiplicity를 줄이지 않는다.
`operator_scale=s`는 O4에 저장한다. `mu=lambda/s`에서 `mu<-1e-9`는 성공 파일을 만들 수
없는 negative spectrum failure다. `abs(mu)<=1e-9`이면 classification=0(`near-zero`),
그 외는 classification=1(`positive`)이다. Raw lambda와 부호를 그대로 기록하며 ±boundary는
near-zero다. Frequency는 classification이 아닌 raw lambda 부호로 결정한다:
lambda>0이면 sqrt(lambda)/(2pi), lambda==0이면 exact0, lambda<0이면 row가 없다.
따라서 small positive near-zero에도 real frequency가 있고 small negative에는 없다.
Negative row의 부재 이유는 `frequencies@unavailable_rule=negative-raw-eigenvalue`로 명시한다.
Frequency overflow/양수의 underflow-to-zero도 파생 결과 실패로 처리한다. Mandatory lambda
및 mu→lambda conversion은 C3의 finite/underflow 조건을 그대로 따른다.
<a id="io-schema--o4-backend와-검증-evidence"></a>
### O4. Backend와 검증 evidence
Prefix `/steps/Step-1/eigen/verification`의 attrs:
| Attribute | Type / 의미 |
| --- | --- |
| `characteristic_length`, `operator_scale` | positive finite f64 ell[length], s[time^-2] |
| `eta_gram`, `max_eta_orth` | finite f64, 전체 c의 V3 Gram와 pairwise 최대 metric; c=1이면 max_eta_orth=0 |
| `eta_mz`, `eta_kz`, `eta_pz`, `null_checks_applicable` | f64×3 및 u8; nz=0이면 applicable0와 storage값0, N/A이지 수행 통과로 보고하지 않음 |
| `validation_scope`, `numerical_contract` | utf8 `all-computed-c-columns`, `mitc4-shell-feast-eigen:r2` |
| Dataset | Fields / shape | 의미 |
| --- | --- | --- |
| `verification/nodal_reduction` | `[nn]` compound `free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64` | Source node row 대응; E2 analytic counts. Nonempty positive block에 rcond_available1, C2 cutoff 통과; 빈 block은0/0 storage. nf/nz/n과 합 일치 |
| `verification/eigenpair_checks` | `[c]` compound `sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64` | sorted_rank1..c, solver_column은 원 FEAST column0-based unique; 실제 ML의 V3/V4/C3 metrics. 첫 N ranks의 lambda는 modes와 exact equal |
Nodal reduction의 quantity component는 `rcond_inf`, dimension1, coordinates=scalar,
location=nodal-mass-reduction이다. Eigenpair checks의 component_names는 표의 f64 fields
순서이고 dimensions는 eigenvalue와 rayleigh_quotient만 time^-2, 나머지는1이다.
Coordinates=scalar, location=eigenpair-verification이며 mandatory finite 검증량과
optional backend_res의 validity를 구분한다.
`eigenpair_checks`는 내부 count/검증 evidence다. c>N 진단행은 추가 공개 modal frame이
아니며 comparator는 여기서 Value를 추출하지 않는다. c개 vector 전부는 검사 동안 유지하고
accepted state에는 공개 N개 vector와 전체 c의 check evidence를 보존한다. 전체 c Gram의
runtime/독립 검증은 C17/18 evidence로 확인하며 N개 persistent vectors만으로 full-c Gram를
재검산했다고 주장하지 않는다. N개 원 residual/normalization은 model 데이터에서 K/ML를
독립 재구성하여 재현할 수 있다. Consistent/lumped 독립 oracle는 NR cases의 내부 테스트다.
Backend `res`가 0-eigenvalue의 상대분모 때문에 unavailable인 경우만
backend_res_available0, backend_res storage0을 사용하고 dataset attr
`unavailable_reason=zero-eigenvalue-relative-residual`를 둔다. Available 값은 finite이고,
nonzero eigenvalue의 nonfinite backend diagnostic은 failure다. Storage0을 residual evidence0으로
해석하지 않는다. mandatory eta_*는 모든 경우 자체 zero branch와 함께 finite다.
Prefix `/steps/Step-1/eigen/backend` attrs는 `runtime_version:utf8`(실제 MKL query),
`integer_abi:utf8`(`LP64|ILP64` 실제 linked ABI), `thread_count:u64=1`,
`seed:u64=0x4D495443344D4645`, `count_calls:u64`, `solve_calls:u64`,
`final_count:u64=c`, `final_solve_ordinal:u64`, `selected_ranks:utf8=1..N`,
`enclosure_lower:f64`, `enclosure_upper:f64`, `solve_lower:f64`, `solve_upper:f64`다.
Bounds는 모두 dimensionless B-space이며 physical frequency bound가 아니다.
| Relative dataset | Shape / fields | 의미 |
| --- | --- | --- |
| `calls` | `[Lcalls]` compound `ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64` | ordinal0-based 실제 call 순서; kind=count/solve, strict bounds, 실제 allocated capacity. Count의 overwritten m0와 solve의 m을 count로 구분 저장 |
| `fpm` | `[Lcalls,128]` i64 | 각 call 직전 feastinit 이후의 exact parameter snapshot; vendor type을 public core에 노출하지 않음 |
`purpose`는 `total-enclosure`, `upper-prefix`, `lower-prefix`, `endpoint-guard`,
`final-prefix`, `final-interval`, `solve` 중 하나이며 실제 C5 단계에 대응한다.
Calls의 component_names는 `lower,upper,epsout`, dimensions는 `1,1,1`,
coordinates=scalar, location=backend-call이다. Fpm은 component_names=fpm,
dimension1, coordinates=none, location=backend-parameter이며 128개 C-index 순서다.
Calls의 unavailable output은 flag0+storage0이고 원인을 info로 해석한다. Undefined vendor
output을 읽거나 garbage를 저장하지 않는다. `info=0`이면 count_available1; 성공 solve는
loop/epsout도 available1이고 epsout finite. 내부 허용 재시도의 실패 call도 삭제하지 않는다.
최종 성공과 C5 guard/prefix/total count 관계는 chronological calls/bounds로 재구성 가능해야 한다.
Allocated_m0와 input N은 독립이다. Effective fpm와 seed/budget은 C5/C6와 일치해야 한다.
Count-only res/epsout을 fabricated physical result로 사용하지 않는다.
<a id="io-schema--o5-self-check와-compatibility-tests"></a>
### O5. Self-check와 compatibility tests
Writer는 candidate를 flush/close한 뒤 read-only reopen하여 type/field/shape/required attrs,
finite required values, enum/validity domains 및 다음 관계를 확인하고 검사용 handle도 닫는다.
1. Source identity·input semantic snapshot이 writer 입력과 일치한다. Node/element/material IDs,
connectivity/section/material/density links가 unique/in-range이고 모든 활성 material rho>0이다.
2. Source step은 한 개이고 canonical Step-1과 raw name의 관계가 유일하다. Input N,
requested N, returned N, modes/vector row수가 같다. mode IDs는 정확히1..N이다.
3. Modes가 raw 오름차순이며 classification/cluster는 C3/C4 규칙과 맞는다. Frequencies의
ID set은 lambda>=0 set과 exact equal이며 각 값은 candidate 파생값과 같고 finite다.
4. Vectors는 finite, source constraint component exact0, scalar/vector pair는 candidate와
일치한다. Selected vectors의 ML normalization/원 residual은 serializer 전 C3 gate에서
검증되었고 해당 metrics 및 read-back values를 대조한다. Serializer 자기복사를 독립 physics로 부르지 않는다.
5. `nf=n+nz`, node별 counts 합, N<=c<=n, 전체 c check rows와 solver-column uniqueness,
첫 N lambda exact equality, modal_mass>0, 모든 적용 C2/C3 metric 한계가 맞는다.
6. Calls/fpm row수·ordinals·strict endpoints·finite available diagnostics, fpm controls,
counts/budgets(<=512 count, <=3 solve), final solve info0/returned m=c와 selected1..N이 맞는다.
증거 없는 성공 bool 하나로 대체하지 않는다.
7. `/diagnostics`는 기존 compound `severity,code,file,line,keyword,entity_identity,message`를
유지하며 source order warnings를 저장한다. 성공 파일에 fatal error diagnostic은 없다.
이 mandatory inventory는 reader version dispatch, round-trip, 누락/extra mode/duplicate ID,
nonfinite/wrong dimension/type/mass/backend/source, close/reopen/self-check failure tests의 기준이다.
Optional unknown dataset의 존재를 extra-mode로 오인하지 않는다. Static 파일은 기존 schema
inventory로 계속 검증하고, eigen reader는 static 또는 unknown eigen revision을 명시적으로 거부한다.
<a id="io-mapping"></a>
<a id="io-mapping--mitc4-eigen-책임실패비교-대응"></a>
## MITC4 eigen 책임·실패·비교 대응
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md#io)
- 입력 원본: [io-input.md](io.md#io-input); 영속 schema 원본: [io-schema.md](io.md#io-schema)
<a id="io-mapping--m1-input에서-equationresult까지"></a>
### M1. Input에서 equation/result까지
아래는 implementation-neutral 책임 계약이며 정확한 C++ 타입/파일 분해는 Planning 소유다.
현행 [Domain](../../include/fesa/model/domain.h),
[model records](../../include/fesa/model/model_types.h),
[syntax records](../../include/fesa/io/abaqus/input_syntax.h),
[AnalysisModel](../../include/fesa/analysis/analysis_model.h)의 수명·의존성을 따른다.
| 경계 | 소유·전달할 최소 의미 | 금지되는 의미 혼합 |
| --- | --- | --- |
| Input adapter | 원본 path/content identity, keyword/parameter/data raw text와 line; validated density/step/options/count, unresolved targets | TXT row수로 N 생성, source enum으로 actual backend 변경 |
| Domain | Topology/source instance/labels, E/nu, section/t, optional material rho, initial director/frame, 유일 frequency 정의와 resolved homogeneous BC, warnings/provenance | Mutable mode/equation/vendor handle 소유 |
| Frequency definition | Raw/canonical source step, source option presence/effective values, count data N, source locations, procedure=linear-frequency | Static increment/time/frame state를 frequency count에 재사용 |
| AnalysisModel | Domain lifetime 아래 활성 shells/materials/sections/BC/frequency 정의의 const non-owning view | Domain copy 또는 새로운 geometry/material ownership |
| DofManager | Source node×UX/UY/UZ/URX/URY/URZ, full/free/constrained injection과 stable equation indices, scatter/sparse pattern | Element/Node 내부에 equation ID 저장 |
| Element/assembly | M1~M10 consistent/moments snapshot→nodal lumped blocks, r2 K contribution, source ordered reduction. 같은 source scatter와 실제 BC | Global scalar row lumping, artificial drilling mass, source S4R의 별도 kernel |
| Eigen procedure | Candidate workspace/state, [E1~E8](formulation.md#formulation-eigen) 순서, analytic rank/positive/null projection, whitening, actual FEAST, all-c validation, N개 global 복원/결과와 commit | 기존 LinearStaticAnalysis::Run에 eigen lifecycle 누적, pretrained/preloaded state, static reaction/modal stress 복구 |
| Private backend | C5/C6 controls, checked CSR/index conversion, vendor resources/thread guard, actual values/vectors/count/status와 call history | MKL_INT/HDF5/Win32 types 또는 vendor headers를 public solver core에 노출 |
| Result/Output adapter | Validated source/global modal pair와 O1~O5 serialization/self-check/replacement | Near-zero clamp, physical 수치 또는 identity 재계산으로 실패 은폐 |
Density/property lookup은 element마다 확정된 material identity를 사용한다. Consistent 원본을
lumped 저장으로 덮어쓰지 않고 element-wise snapshot+moments로 검사 가능하게 한다.
Full dense global MC나 일반 dense Schur는 필수가 아니다. 실제 global BC를 먼저 적용하고
director null은 [E2](formulation.md#formulation-eigen--e2-nullpositive-basis를-node마다-결정)의 exact intersection으로만
결정한다. Tiny positive mass는 정식화/NR conditioning 실패이며 input 지원에서 제거하지 않는다.
Source `(instance_name, numeric label)`과 raw label spelling은 전체 경로에서 보존한다.
Internal row order는 기존 identity-instance expansion/declaration order이며 DOF order는 고정이다.
Renumbering은 geometry/connectivity/BC를 같이 대응하여 검사한다. 숫자가 우연히 같은
source label/internal ID/equation ID를 비교키로 대체하지 않는다. 새로운 source order의 결과를
행 위치끼리 비교하거나 repeated eigenspace의 특정 vector 방향을 동일하다고 요구하지 않는다.
Accepted eigen state는 input/source step identity, N개의 paired raw scalar/global vector,
source mapping 및 전체 c의 validation/call evidence만 소유한다. Domain·AnalysisModel·DOF
정의와 수명 관계를 복사로 숨기지 않는다. Persistent N vectors로 같은 입력의 K/ML를
재조립해 constraint/normalization/원 residual을 다시 검사할 수 있어 REQ-018을 충족한다.
반복군의 개별 벡터 비유일성과 외부 mode-shape 비교 제외는 유지한다.
<a id="io-mapping--m2-backend와-failure-lifecycle"></a>
### M2. Backend와 failure lifecycle
FEAST fpm/interval/seed/thread/storage와 내부 수치 한계의 유일 원본은
[NR C1~C6](numerical-review.md#numerical-review-controls)다. I/O나 CLI에서 parameter override를 만들지 않는다.
Source N, reduced finite dimension n, prefix count, allocated m0, returned m, validated c,
public N을 각각 유지한다. 전체 c eigenpairs의 full original free residual/ML Gram/energy 및
endpoint/count consistency 뒤 첫 N개만 선택한다. Wrong mass·count·residual을 tolerance나
다른 solver로 우회하지 않는다.
| Failure | Code / exit5 | 보존할 context |
| --- | --- | --- |
| Checked CSR/index/capacity 산술 실패 | `eigen-index-overflow` 또는 `invalid-eigen-csr` | n/nnz/N/m0, 실패한 bound와 stage |
| Allocation 실패 | `eigen-allocation-failed` | allocation 역할·checked requested bytes; N 축소 없음 |
| FEAST non-success / forbidden retry | `eigen-feast-failed` | raw info, count/solve kind, interval/m0, C5 허용 재시도 여부 |
| Count/returned m/monotonicity·endpoint mismatch | `eigen-count-inconsistent` 또는 `eigen-endpoint-separation` | actual count history와 마지막 certified bracket |
| 유한 budget 소진 | `eigen-search-budget-exhausted` | count/solve attempts·마지막 valid bracket; optimization fallback 가능 여부는 C5 그대로 |
| Significant negative spectrum | `negative-eigenvalue-spectrum` | raw lambda/mu/s, mode rank, C3 threshold |
| Nonfinite/underflow conversion 또는 invalid frequency | `invalid-eigenvalue-result` | raw scalar·stage·source step |
| Raw pair/Gram/원 free residual/energy 검증 실패 | `eigenpair-validation-failed` | metric name, observed value, C3 limit, solver column/rank; failed raw values를 accepted result에 넣지 않음 |
위 code는 기존 FailureCategory::kSolver로 전달하며 새로운 exit category를 추가하지 않는다.
Model/preflight 오류는 [I6](io.md#io-input--i6-fail-closed-validation과-diagnostics)를 따른다.
Eigen backend failure의 returned Status는 실패까지의 call history를 message에 round-trip
decimal/ordinal 순으로 포함한다. 한 leading fatal diagnostic에 history를 부속하고 성공 count
call에 fictitious error severity를 붙이지 않는다. CLI는 기존 ordered stderr diagnostic 경로로
반환하며 caller는 Status에서 evidence를 읽을 수 있다. Allocation failure 시 추가 문자열
allocation을 보장할 수 없는 한계는 기존 best-effort stderr 범위를 따른다.
Public CLI는 기존 `fesa.exe <model.inp>`뿐이다. Output override 부재, `.inp` lexical
stem/대소문자/여러 dot/path 규칙, same-derived-pair nonblocking exclusive lock와 usage2는
[공통 lifecycle §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 유지한다.
1. CLI usage validation→lexical output pair→exclusive ownership 뒤 `<stem>_log.txt`를
open/truncate한다. Non-Newton eigen은 log에 Newton iteration/FEAST 행을 만들지 않는다.
정상 log는 기존 계약대로 zero-byte다. Log open/close failure는 output exit6다.
2. Input/model/eigen solve와 all-c validation은 candidate에 수행한다. Existing accepted
state와 final HDF5는 건드리지 않는다. Controlled failure는 기존 state와 final hash를 보존한다.
3. Successful candidate를 준비하고 log close 성공을 확인한다. 같은 directory에 exclusive-create
private HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다.
4. Final replacement가 성공한 뒤 **이미 준비된 state의 no-fail swap**을 수행한다.
Swap에 allocation/validation/fallible callback을 남겨 두지 않는다. 순서는 [E8](formulation.md#formulation-eigen--e8-mode-identity-normalization과-상태)다.
5. Write/flush/close/reopen/self-check/replace 실패는 exit6이며 이전 final/state를 보존한다.
Failed candidate는 authoritative가 아니다. 정리는 best effort이고 다른 run의 파일을 지우지 않는다.
Current log는 rollback하지 않는다. 잠금 실패는 log/final도 변경하지 않는다.
과거 final이 없으면 controlled failure 후 final도 생성하지 않는다. Directory collision,
nonregular destination, lock/replacement refusal는 성공으로 처리하지 않는다. Process crash나
power-loss 전체 원자성을 약속하지 않는다. Reference artifact는 읽기 전용이며 solver의
새 HDF5/log는 별도 generated output이다. Reference 원본을 덮어쓸 output path는 없다.
<a id="io-mapping--m3-원본-txt-grammar와-deterministic-value-projection"></a>
### M3. 원본 TXT grammar와 deterministic Value projection
Case `shellNL-eigen-meshfine`의 input/TXT 경로·hash와 logical quantity/family 원본은
[reference-model](reference-model.md)이다. TMP/CSV 변환·filename alias·추가 provenance 파일을
reference readiness 조건으로 만들지 않는다. TXT에는 source step이 없으므로 **지정 input의
유일한 source frequency step Step-2**를 연결한다. ODB storage frame index는 추정하지 않는다.
각 LF/CRLF logical line에서 공백-only 행만 생략한다. 모든 다른 행은 아래 full-match다.
`ws`는 ASCII space/tab 0개 이상, `ws1`은 1개 이상이며 literal의 대소문자는 정확하다.
```text
number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?
id := [0-9]+ # positive checked decimal integer
row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number
ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws
```
Header/footer, BOM, comment, 잘못된 Value/Freq label·추가 token·malformed number는 schema
failure다. `Value`는 finite binary64로 full conversion하고 overflow/underflow parsing error를
거부한다. NaN/Inf spelling은 grammar부터 실패한다. `Freq`는 숫자 token 구조만 검사하고
수치 변환/물리 일치/오차 비교에 사용하지 않는다. 반올림된 Freq로 Value를 재계산하지 않는다.
같은 숫자의 다른 mode ID는 정상이며 같은 numeric ID의 재등장은 duplicate다.
다음 순서를 tolerance 전에 완료한다.
1. 지정 input/TXT와 O1 eigen HDF5의 존재·source_input_identity·procedure/schema/unit/mass/
actual backend를 검사한다. `mass_variant=derived-lumped`, `mass_origin=consistent-moment-row-sum`,
normalization mass 및 runtime FEAST metadata가 필수다. 다른 mass의 좋은 오차를 선택하지 않는다.
2. Input의 유일 source step/N=10을 직접 확인하고 HDF5 source name/요청수/공개수에 대응한다.
TXT row count에서 N을 추정하거나 HDF5 내부 c를 공개 모드 수로 사용하지 않는다.
3. TXT 모든 nonempty row를 먼저 parse하면서 duplicate를 검사한다. Dictionary overwrite
또는 malformed-row skip은 금지다. Required identity는 양쪽 모두 정확히 mode1..10이다.
4. HDF5 `modes`의 field/type/shape/단위/순서와 모든 eigenvalue의 finiteness를 확인한다.
Wrong quantity/mass/schema·missing/extra/duplicate/nonfinite를 먼저 실패시킨다.
5. 유일 source key로 join한 뒤 mode ID ascending으로 projection한다. TXT 행 재배열은
허용하지만 HDF5 sort contract 위반은 reader가 재정렬하여 숨기지 않는다.
Projection row는
`(case_id,source_step_name,mode_id,component=Value,reference_value,fesa_value)`다.
FESA value는 `/steps/Step-1/eigen/modes.eigenvalue`만 사용한다. Diagnostic all-c table,
frequencies/vectors 또는 static fields를 fallback으로 읽지 않는다. 현재 component는 scalar
eigenvalue=`omega^2`, `time^-2`, coordinates=`scalar`, impact=`blocking`이다.
<a id="io-mapping--m4-판정보고와-기존-static의-역할"></a>
### M4. 판정·보고와 기존 static의 역할
Family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue,dimension=time^-2,
coordinates=scalar,impact=blocking)`다. **10개의 singleton family**에
[common-reference-tolerance](../TOLERANCE.md)를 그대로 적용한다. 각 family의
`S=max|r|`, `B=0.01S`, near-zero inclusive row branch 또는 5% relative row branch와
1% relative RMS를 모두 계산한다. 현재 양수 singleton은 실효 mode별1%다.
S=0이면 exact-zero FESA만 성공이며 불일치는 `zero-reference-scale-nonzero-error`다.
Source modal frame이 다르면 한 table에 저장되어도 family를 합치지 않는다.
Comparator report는 input/reference/result identity와 freshness evidence, prechecks,
family/source key/component/count/S, raw r/f/error, 적용 branch·row verdict, RMS/verdict,
blocking failure와 전체 verdict를 mode order로 남긴다. Undefined zero-scale metric은 named
state로 표현하고 NaN/Inf나 absolute floor를 넣지 않는다. CSV view가 필요하면 이 projection을
HDF5에서 추출한 보조 artifact라고 표시하며 공식 output/원본 reference를 대체하지 않는다.
기존 static의 r2 재검증은 [Requirement portfolio](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity),
[NR C7](numerical-review.md#numerical-review-controls--c7-승인된-정적-회귀-기준), [C26](numerical-review.md#numerical-review-cases)을 따른다.
기존 linear source node/static frame와 nonlinear factor-one accepted-state identity를 유지한다.
U1/U2/U3 length/global blocking, UR1/UR2/UR3 rotation warning-only는 기존 common families다.
Nonlinear RF1/RF2/RF3·physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를
유지하는 review-only다. RM3/stress와 eigen vector는 새 external gate가 아니다.
Internal force/moment equilibrium은 별도의 blocking physical evidence다.
`shellnl-meshfine-02-s4-final`의 별도 post-closure 역할도 유지한다.
과거 cache/static 수치를 새 binary의 fresh solve로 표시해서는 안 된다.
<a id="io-mapping--m5-구현test-obligations와-requirement-연결"></a>
### M5. 구현·test obligations와 requirement 연결
아래 표의 `nn` 등 fixture 수를 제외한 threshold는 [NR cases/controls](numerical-review.md#numerical-review-cases)의
원본을 사용한다. Parser/mapper/schema/comparator의 실제 tests는 Planning/Implementation 소유다.
| Obligation ID | 필수 positive/negative 검증 | NR cases |
| --- | --- | --- |
| IO-T01 | 원본 unchanged input의 729 nodes/676 S4, source Step-2/N10, rho2700/t0.5, source options/no-op warnings와 실제 FEAST 선택. S4R source-only 변경도 같은 semantic physical path | MFE-C23 |
| IO-T02 | 두 material·두께의 element-section-density 연결, missing/duplicate/unresolved/0/negative/NaN/Inf/temperature/dependencies/extra row·field, section/geometry/27-point invalid 거부; static density 부재 허용 | MFE-C06, MFE-C07, MFE-C23, MFE-C26 |
| IO-T03 | N의 blank/0/negative/fraction/overflow, fields2~7에 nonempty0, eighth empty field, duplicate parameter, unsupported enums/procedure/preload/load/damping/acoustic/mixed/非영 BC 거부 | MFE-C07, MFE-C13, MFE-C23 |
| IO-T04 | Source labels/instance/set renumbering·중복/모호함, partial rotations/fullfree/fullclamp/drill-only/fully constrained source mask 복원; tiny nonzero director rank 보존·conditioning 실패, n0/N>n 명시 실패 | MFE-C06, MFE-C13, MFE-C14, MFE-C24 |
| IO-T05 | O1~O5 schema round-trip, input byte identity, N/c/source step/rank/units/actual backend/mass pairing, N vectors의 원 residual·normalization 재현. Near-zero positive/negative/exact0/±threshold 및 lambda conversion 경계 | MFE-C16, MFE-C19, MFE-C24 |
| IO-T06 | Invalid index/CSR/SPD/parameter/capacity/count/endpoint/NaN/Gram/residual/budget; actual FEAST known zero/repeated/cluster cases의 all-c history와 returned-N 분리. Output diagnostic unavailable와 raw λ 보존 | MFE-C17, MFE-C18, MFE-C19, MFE-C21, MFE-C22 |
| IO-T07 | 이전 accepted state/final hash를 준비하고 solve/validation/log/lock/write/flush/close/reopen/self-check/replace 실패를 각각 주입. 처음 실행의 실패에서 final 미생성. 성공 final 후 no-fail state swap | MFE-C24 |
| IO-T08 | TXT reorder/equal Value distinct modes 허용. Missing/extra/duplicate/nonfinite/malformed/wrong field/step/quantity/units/mass/backend/schema 실패를 tolerance 전에 확인. Freq 변화가 Value 판정을 바꾸지 않음 | MFE-C25 |
| IO-T09 | 공통 policy의 inclusive 1% RMS·5% row 경계와 양옆, generic near-zero \|r\|=B 경계·zero-scale 양성/음성. Singleton이므로5% row pass라도1% RMS fail임을 확인 | MFE-C25 |
| IO-T10 | Density 없는 기존 linear/nonlinear input·model/static output reader 불변, r2 scale 영향 portfolio를 fresh binary로 재검증. Mode-shape reference 미요구 | MFE-C26, MFE-C27 |
| IO-T11 | 세 반복의 exact sparse/row/diagnostic order 및 scalar/projector C4 기준. RED→observed failure→GREEN→focused/full MSVC x64 Debug 검증·새 warning 없음·fresh reference identity/hash | MFE-C27 |
Coverage ID 접두사는 모두 `FEM-REQ-MITC4-EIGEN-`다. 아래 표는 requirement 원문을 대체하지
않고 I/O의 기여와 다른 owner evidence를 구분한다.
| Requirement suffix | I/O 연결·verification obligation |
| --- | --- |
| 001 | I2/I4/M1; IO-T01/T03 |
| 002 | I2/O2 source type와 r2 stabilization identity; IO-T01/T10; physical kernel C01/C08/C12는 해당 owner |
| 003 | I3/O2 densities; IO-T02 |
| 004 | I2/I6/M1; IO-T02; geometry oracle C01/C02는 NR 원본 |
| 005 | M1 consistent snapshot 의미, O2 mass_origin; C01~03 구현 evidence |
| 006 | M1/O4 node rank와 restored vector; IO-T04; inertia/null C01/C03/C11 |
| 007 | M1 source/DOF/reduction ordering; IO-T04/T11 |
| 008 | M1/O4 analytic counts/conditioning, M2; IO-T04/T05; C15 spectrum oracle |
| 009 | I4/O2 N·n·c/O3 rank; IO-T03/T04/T06 |
| 010 | O3 stable paired sort/cluster identity, M3 join; IO-T05/T08/T11 |
| 011 | I4/O2/M2 actual mass/backend discriminant; IO-T01/T05/T06 |
| 012 | I6/M2/O4 validity and bounded failure; IO-T06/T07 |
| 013 | O3 vectors/O4 all-c metrics; IO-T05/T06; C11/C16~18 independent evidence |
| 014 | M1 units/source transformation/O3 replay; IO-T04/T05; C01~05/C08/C11/C20 physics |
| 015 | I4/I5/O2 source_records; IO-T01/T03 |
| 016 | I2~I6/M2; IO-T02/T03/T06 |
| 017 | O1~O5/M3 authoritative additive schema; IO-T05/T08 |
| 018 | M1/O3 persistent N vectors/source replay; IO-T04/T05; external shapes 제외 |
| 019 | M2 candidate/commit/log lifecycle; IO-T07 |
| 020 | M3/M4 Value-only + 별도 static policy; IO-T08/T10 |
| 021 | O5/M3 full prechecks; IO-T08 |
| 022 | M4 공통 family/policy/report; IO-T09 |
| 023 | IO-T11; 실행 계획/RED/GREEN/full 증거는 Planning/Implementation 소유 |
| 024 | I3/M4 existing static compatibility/portfolio; IO-T10/T11 |
| 025 | M5 coverage + 동일 r2 handoff; Physics/Release closure 소유권 유지 |
| 026 | M1 consistent→lumped/O2 mass_origin; C01~05 independent mass evidence |
| 027 | O2 stabilization_rule/M4 static 역할; IO-T10; C08~12/C26 물리 검증 |
<a id="io-mapping--정적-감사-evidence"></a>
### 정적 감사 evidence
실제 조사 명령은 `Get-Content`, `rg --files`, scoped `rg -n`, `web.open`이었다.
입력 keyword inventory와 TXT 10개 행을 읽었고 numerical quantity/formulation 계산을
재실행하지 않았다. 한 번의 `rg docs/shell-surface-pressure/io*.md`는 잘못된 directory/glob로
exit1이었고 `rg --files docs`로 실제 `docs/shell-surface-pressure-load/io.md`를 확인해
읽기 전용 대조를 완료했다(exit0). 이 검색 오류는 feature numerical failure가 아니다.
최종 감사 `python -B -` here-script는 exit0으로 owned4 metadata/66개 relative links/
requirement suffix1..27, reference10 rows/full grammar/finite Value/ID1..10 및 두 원본 SHA-256
일치를 확인했다. `git diff --check -- docs/mitc4-shell-feast-eigen/io.md
docs/mitc4-shell-feast-eigen/io-input.md docs/mitc4-shell-feast-eigen/io-schema.md
docs/mitc4-shell-feast-eigen/io-mapping.md`도 exit0이었다. 아직 untracked인 owned 문서는
별도 Python whitespace/Markdown table 검사로 확인하며 diff만으로 내용 검증했다고 하지 않는다.
실제 final audit 결과와 owned hashes는 I/O handoff에 보고한다.
이는 문서·원본 inventory 검증이며 parser/comparator 구현 test 또는 실제 수치 비교가 아니다.
CMake/CTest/Harness/FEAST/외부 solver는 이 문서 단계에서 실행하지 않는다.
@@ -1,160 +0,0 @@
# MSVC 빌드 접근 오류와 Ninja 전환
- 작성 목적: MITC4 질량행렬·FEAST 구현 준비 중 발생한 Windows 빌드 환경 오류와 조치 기록
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `Root` (사용자 요청 설명문서)
- 입력 계약: `r2`, `E8` 실행 결과, `E9` 미실행 검증 계획과 `E10` 로컬 설정 결과
- 작성일: 2026-09-06
- 상태: MSVC 컴파일·링크 및 후속 CTest 통과 확인. 최초 GoogleTest discovery 오류와 wrapper 비정상 종료로 전체 준비 검증 미완료
MSVC 컴파일러와 x64/Debug 조건을 유지하면서 CMake의 빌드 generator를 Visual Studio에서 프로젝트가 이미 지원하는 Ninja로 바꿨다. 기본 `workspace-write` 권한에서 MSVC 컴파일·링크까지 진행했고, 이후 별도 GoogleTest discovery 문제를 확인했다. 최초 manual 빌드가 실패했으므로 전체 준비 검증은 아직 완료되지 않았다.
## 관찰된 오류
Visual Studio generator의 다음 명령이 native `workspace-write` 실행에서 실패했다.
```powershell
cmake --build .harness/build --config Debug
```
오류는 C++ 컴파일 전에 `ZERO_CHECK`의 `GetOutOfDateItems` 작업에서 발생했다.
```text
MSB4018: GetOutOfDateItems
System.TypeInitializationException: Microsoft.Build.Utilities.FileTracker
System.UnauthorizedAccessException: 0x80070005 (E_ACCESSDENIED)
Microsoft.Build.Framework.NativeMethods.GetLongFilePath
Microsoft.Build.Utilities.FileTracker..cctor()
```
같은 실행에서 configure는 성공했지만 manual Debug build는 exit 1이었다. 별도로 등록된 Stop의 build와 CTest는 성공했다. 따라서 자동 검증의 성공으로 native manual build 실패를 통과 처리하지 않았다.
확인된 범위는 MSBuild의 FileTracker 초기화에서 발생하는 접근 오류다. 어떤 Windows 접근 규칙과 정확한 내부 경로가 거부됐는지까지 확정한 것은 아니다.
## 앞선 조치와 구분해야 할 문제
1. 최초 configure의 `FESA_GTEST_SOURCE_DIR` 누락은 사용자 지정 `C:/git/googletest`와 설치된 MKL/TBB/HDF5 경로로 해결했다.
2. 긴 TEMP 경로에서 기존 pressure 테스트의 결과 잠금 파일 생성이 실패했다. 동일 binary의 TEMP 경로만 바꾼 비교에서 긴 경로는 실패하고 짧은 경로는 통과했다. 이후 TEMP/TMP는 새 `.harness/build/t-<8hex>`, pytest basetemp는 새 `.harness/build/p-<8hex>`를 사용하고 각각 80자 이하를 확인한다.
3. 짧은 TEMP/TMP를 build와 같은 native shell에 직접 설정해도 FileTracker 접근 오류가 재발했다. 따라서 TEMP 대입 누락이나 경로 길이 문제만으로 이 빌드 오류를 설명하지 않는다.
## 적용한 Ninja 구성
- 기존 `windows-msvc-ninja-debug` configure/build/test preset을 함께 사용한다.
- `.harness/config.example.json`의 설정을 ignored `.harness/config.json`으로 사용한다. 예상 밖 기존 설정은 덮어쓰지 않는다.
- 새 binary directory는 `.harness/build-ninja-msvc-debug`다. 기존 VS `.harness/build` cache와 실행 기록을 보존한다.
- Harness를 시작하는 부모 shell에서 설치된 `Launch-VsDevShell.ps1`로 MSVC host/target x64 환경을 설정하고 Ninja 및 승인된 dependency 경로를 적용한다. 이번 실행의 자식 tool shell에서는 해당 스크립트 호출이 PowerShell 실행 정책으로 거부됐다. 실행 정책을 우회하지 않고 부모에서 상속된 `VSINSTALLDIR`, `VSCMD_ARG_TGT_ARCH=x64`, `INCLUDE`, `LIB`, `cl.exe`, `ninja.exe`를 확인한 뒤 컴파일·링크를 진행했다.
- 기존 reference helper가 실제 library의 수정 시각을 확인할 수 있도록 `CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG`를 새 build의 `src/fesa/Debug`로 지정한다. Library를 복사하거나 수정 시각을 조작하지 않는다.
- 환경 변수는 해당 process에서만 설정하고 `finally`에서 복원한다. 정확한 설정·복원과 실행 순서는 [구현 환경 문서 E8](implementation-environment.md#e8-attempt3-후의-정상-backend-대안)에 있다.
아래는 `E8`에서 사용한 핵심 검증 명령이다. 후속 재검증은 아직 실행하지 않은 [E9 계획](implementation-environment.md#e9-attempt4-후의-직렬-ninja-검증)의 병렬도 설정과 진입 조건을 함께 따른다.
```powershell
$mfeArchive = (Join-Path (Get-Location).Path '.harness/build-ninja-msvc-debug/src/fesa/Debug').Replace('\', '/')
cmake --preset windows-msvc-ninja-debug "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG=$mfeArchive"
cmake --build --preset windows-msvc-ninja-debug
ctest --preset windows-msvc-ninja-debug --show-only=json-v1
ctest --preset windows-msvc-ninja-debug --output-on-failure
```
실제 실행에서는 각 명령의 종료 코드를 즉시 확인하고 실패 시 다음 검증으로 진행하지 않는다. Registered Stop도 같은 preset과 binary directory를 사용한다. Test selection, assertion, source, 수치 계약, reference 원본과 검증 기준은 이 환경 전환에서 변경하지 않는다.
## 검증 결과
| 확인 항목 | 결과 |
| --- | --- |
| 짧은 TEMP를 직접 적용한 기존 native MSBuild | configure exit 0, build exit 1 (`E_ACCESSDENIED`) |
| 위 실행의 별도 registered Stop/CTest | exit 0, 362/362 통과 |
| Root의 새 Ninja 준비 configure | exit 0, 7.446초; MSVC Hostx64/x64, Debug, Ninja 및 dependency 경로 확인 |
| Root configure 전후 보존 확인 | tracked 변경 0, 기존 VS cache 동일, Git clean |
| 새 Ninja native Debug build | 컴파일 경고 0개; 컴파일·링크 이후 integration GoogleTest discovery의 JSON parsing 오류로 exit 1 |
| 새 Ninja manual CTest/full pytest | 최초 manual build 실패 뒤 미실행 |
| 새 Ninja registered 검증의 CMake/CTest | build exit 0, CTest exit 0, 362/362 통과 |
| 위 registered 검증을 감싼 프로세스 | Python 두 프로세스 exit 0, 외부 PowerShell wrapper exit 1; 전체 Hook 성공으로 합치지 않음 |
| E8.2 Harness invocation | native PowerShell exit 1; manual build 실패를 보존 |
Root의 configure 성공이나 후속 CTest 통과는 최초 manual build 실패를 대체하지 않는다. 이 결과만으로 전체 준비 단계의 통과를 주장하지 않는다. 세부 구현 담당 보고서는 [implementation-prep-evidence.md](implementation-prep-evidence.md)를 참조한다.
## Ninja에서 추가로 발견된 검증 장애
새 Ninja 빌드에서는 기존 FileTracker 접근 오류 대신, 컴파일·링크 후 CMake의 GoogleTest 목록 생성에서 `ParseTestList.cmake:96` JSON parsing 오류가 발생했다. 현재 설치된 모듈 조합을 읽어 다음을 확인했다.
- `GoogleTestAddTests.cmake`는 `TEST_TARGET`의 SHA-256 앞 10자를 JSON 파일명으로 사용한다.
- `GoogleTest.cmake`와 실제 생성된 세 discovery 스크립트에는 `TEST_TARGET` 인수가 없다.
- 세 스크립트가 같은 디렉터리의 `cmake_test_discovery_e3b0c44298.json`을 삭제·생성·읽는 구조다.
- 동일 integration binary의 단독 목록 생성은 34개 테스트를 반환했고, 생성된 discovery 스크립트도 단독 실행에서는 통과했다.
이 관찰은 병렬 POST_BUILD discovery의 공유 파일 경쟁을 뒷받침한다. 정확한 최초 경쟁 순서를 재현한 것은 아니며, 단독 진단의 성공으로 최초 전체 빌드 실패를 통과 처리하지 않았다. 후속 `E9` 계획은 `CMAKE_BUILD_PARALLEL_LEVEL=1`과 한 번의 `--clean-first --verbose` 빌드로 세 discovery의 실제 직렬 실행을 검증한다. 설치된 모듈·생성된 JSON·테스트 소스와 discovery guard는 그대로이며, 이 후속 계획은 아직 미실행이다.
## 자동 검증의 별도 제한 시간 문제와 적용 결과
설치된 Codex CLI `0.153.2`의 `hooks/list`·`config/read`를 모델 실행 없이 조회했다. 현재 worktree의 project config는 읽지만, 실제 enabled/trusted Stop Hook은 원본 checkout의 `C:\git\FESADev\.codex\hooks.json`에서 `1800`초로 선택됐다. 현재 worktree 파일의 `7500`초는 실제 Hook 선택에 반영되지 않았다. 공식 지원 `project_root_markers`를 해당 조회에만 지정해도 결과는 같았다.
이번 native raw에는 Hook 설정 출처 이벤트가 없으므로, 현재 resolver 결과와 당시 외부 PowerShell wrapper가 약 1802초 뒤 exit 1인 관찰을 대조한 진단이다. Python/CTest의 후속 exit 0과 wrapper exit 1은 계속 별도로 보존한다.
사용자가 공유 설정 변경과 신뢰 검토를 설명받은 뒤 작업 계속을 지시한 범위에 따라 다음 한 값을 적용했다.
```text
대상: C:\git\FESADev\.codex\hooks.json
필드: hooks.Stop[0].hooks[0].timeout
변경: 1800 -> 7500 (초)
```
- 변경 전 파일 SHA-256: `0ab23dad4643f45238f4a60402083e32d8801f5c41fd6ba12b68ef6a9fc5fc28`
- 나머지 bytes를 보존하고 한 번 치환한 적용 파일 SHA-256: `c8065e7b60882da5db3f90d57b265da25b3c25980bf669d0b1da863e621871ca`; 원본 checkout의 로컬 커밋 `42a4847`
- 영향: 이 원본 Hook을 선택하는 다른 worktree에도 제한 시간 변경이 적용된다. Hook 명령, 검증 범위, assertion과 sandbox 권한은 그대로다.
- 승인 경계: 현재 feature worktree 밖의 공유 설정에 대한 이번 지시로 처리했다. 기존 단일 `E6` 실행 승인과는 별개이며, 새 sandbox 우회 또는 원격 작업을 허용하지 않는다.
공식 문서는 여러 Hook source를 함께 로드하며 상위 layer가 기존 Hook을 대체하지 않는다고 설명한다. 또한 정의가 바뀌면 새 hash에 대한 신뢰 검토가 필요하다. 따라서 inline Hook 추가나 trust 상태의 임의 수정으로 해결하지 않는다. [공식 Hook 문서](https://learn.chatgpt.com/docs/hooks)
최초 조회 근거는 [기본 설정 해석](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-config-resolution.json), [정상 root marker 지정 조회](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-root-marker-observation.json), [두 파일의 읽기 전용 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-hook-source-audit.json)에 있다.
대화형 CLI는 Windows ConPTY 프로세스 생성 오류로 시작하지 못했다. 공식 app-server `config/value/write`를 사용해 검토한 Stop 정의의 `trusted_hash` 한 필드만 등록했다. `expectedVersion`으로 동시 변경을 검사했고, 설정 전체의 의미를 메모리에서 비교해 다른 필드가 같음을 확인했다. 최초 API 조회에서는 해시의 `sha256:` 접두사를 예상하지 못해 write 전에 중단했으며 그 기록도 보존했다.
후속 `hooks/list`에서 canonical source, `timeoutSec=7500`, `enabled=true`, `trustStatus=trusted` 및 현재 정의 해시 `sha256:a6bfcf3553d81e134065da4e66e8124e245d302c11e90b09ecdf07ff79b034a8`을 확인했다. [공식 API 적용·확인 기록](../../.harness/build/mitc4-eigen-evidence/prep/hook-timeout-activation/trust-review-official-api.json)은 exit 0이다. 이 조회·설정 과정에서는 Hook을 실행하지 않았고, 실제 전체 검증 통과 여부는 후속 prep 실행에서 판정한다.
## 근거 기록
- [동일 native build shell의 TEMP/TMP 설정과 FileTracker 실패](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/root-manual-build-environment-observation.json)
- [새 Ninja 환경 준비 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/result.json), [실제 선택된 compiler·dependency·archive 경로](../../.harness/build/mitc4-eigen-evidence/prep/attempt3/e8-root-setup/configuration-observation.json)
- [최초 Ninja manual build 원시 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/manual-cmake-d2d41bcf6bb242f4b484ea02850d762e/build.log): UTF-16LE, SHA-256 `47484e659a73977626c549fb56783ad5416ff14260e48e559b37b6b93f358f96`
- [설치된 CMake 모듈과 생성된 discovery 경로의 읽기 전용 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-gtest-discovery-path-observation.json): SHA-256 `9d383f04a347df95b742403ceca4732b331ddf4ec96437993f0ceffaa060bf59`
- [실제 프로세스 종료 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-process-observations.json): CMake PID `1916`, CTest `21912`, Python `3492`/`24968`, 외부 wrapper `23560`, Harness 부모 `21996`을 command·parent와 함께 대조했다. 파일의 `role`은 탐색용 분류다. `rg` 소스 조회 shell인 PID `10528`은 Hook 실행에서 제외한다.
이 원시 로그는 해당 workspace의 ignored 검증 artifact다. 장기 workflow 상태와 후속 실행 판정은 [coordination.md](coordination.md)를 기준으로 한다.
## E10: 자동 Stop의 의존성 경로 누락 해결
초기 `E8` 설정은 process 단위였다. 설명문서 커밋 뒤 별도 자동 Stop에서는 부모 환경의 의존성 변수 네 개가 없었고, 공통 preset의 `$env{...}`가 cache를 빈 값으로 덮어써 `FESA_GTEST_SOURCE_DIR` 오류가 재발했다. [당시 cache와 관찰 기록](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-stop-after-decision-docs/observation.json)을 보존했다.
이를 해결하기 위해 workspace 전용 `CMakeUserPresets.json`에 `mfe-workspace-msvc-ninja-debug`를 만들었다.
- 공통 preset을 상속하면서 GoogleTest `C:/git/googletest`와 MKL/TBB/HDF5 설치 경로를 cache 값으로 직접 지정한다.
- 정상 MSVC x64 개발 환경에서 얻은 INCLUDE/LIB 및 cl/rc/mt/Ninja 실행 경로를 담고, build/test가 configure 환경을 상속하도록 한다.
- CMake child의 TEMP/TMP는 설정 수명 동안 전용 70자 경로를 사용하고 빌드 병렬도는 `1`로 지정한다. Python/pytest의 새 basetemp 규칙은 유지한다.
- ignored `.harness/config.json`의 configure/build/test preset을 모두 같은 로컬 이름으로 맞춘다. `/CMakeUserPresets.json` 한 줄을 `.gitignore`에 추가해 `3cfbefb`로 커밋했다.
이제 해당 workspace에서는 부모 환경에 의존성 변수 네 개가 없어도 다음 명령이 설정을 읽는다. 전체 명령 대응과 복원 절차는 [E10 환경 문서](implementation-environment.md#e10-부모-환경과-독립적인-workspace-user-preset)에 있다.
```powershell
cmake --preset mfe-workspace-msvc-ninja-debug
```
| 확인 항목 | 실제 결과 |
| --- | --- |
| 새 preset 목록·local config 해석 | 통과 |
| 최초 E10 configure | exit 1. 의존성은 찾았지만 compiler 경로의 `Hostx64`/`HostX64` 표기 차이로 CMake가 cache를 재초기화했고, 내부 재configure에서 의존성 값이 사라짐 |
| compiler 문자열 일치 확인 뒤 동일 preset의 configure 한 번 | exit 0, 1.656초, stderr 0 bytes; 부모의 의존성 변수 네 개는 미설정 |
| 후속 cache·adapter 대조 | 의존성 네 경로, MSVC 19.51/x64, pointer 8 bytes, Ninja/Debug, Debug archive 경로 및 네 검증 명령의 local preset 일치 확인 |
| E10의 production build/CTest | 미실행; configure 성공을 전체 구현 준비 통과로 대체하지 않음 |
근거는 [최초 실행 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/result.json), [후속 configure 결과](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configure-followup/result.json), [최종 설정·명령 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt4/root-e10-setup/configuration-observation.json)에 있다. 기존 solver library hash, source, phase history와 원본 checkout의 Hook은 보존했다.
로컬 preset·설정·전용 TEMP는 workspace에 유지한다. 설치 경로 변경이나 feature 종료 때 설정 수명을 검토한다. E10 의존성 설정과 위 공유 Hook의 제한 시간·신뢰 수정은 별도로 적용·검증했다.
## E11: 실제 자동 검증 결과
후속 실행의 등록 Stop은 `mfe-workspace-msvc-ninja-debug`와 Ninja `-j 1`을 사용했고, CTest **362개 통과·실패 0개**로 끝났다. CTest PID `8112`, Stop Python `20788`/`25272`, 외부 wrapper `24308`의 실제 exit 0을 관찰했다. Wrapper는 13:04:39Z부터 13:37:13Z까지 약 1,954초 실행돼 이전 1,800초 제한을 넘겨 정상 종료했다. 근거는 [보존된 CTest 로그](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/registered-LastTest.log), [실제 종료 관찰](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-process-observations-resumed.jsonl), [Coordinator terminal 감사](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/coordinator-terminal-audit.json)에 있다.
이때 수동 검증 담당은 이전 VS 명령을 사용해 FileTracker 오류를 다시 만났으므로, 수동 검증과 prep 전체는 통과하지 않았다. Native Executor exit 2와 `blocked` 결과도 보존했다. 다음 조치는 prep/main Step 문서에 현재 preset 명령을 직접 명시하는 계획 정합이며, 자동 검증 성공을 mass/FEAST 구현 완료로 해석하지 않는다. 첫 관찰기는 로그 파일 공유 충돌로 중단돼 재연결했으므로, 그 공백의 build exit는 직접 관찰했다고 주장하지 않는다. PID 재사용 또는 handle 확보 실패 행도 성공 종료 근거에서 제외한다.
기존 Executor가 실제 argv에 `--dangerously-bypass-hook-trust`를 넣는 사실도 확인했다. 이번 수정에서 추가한 옵션은 아니며, 별도 read-only [전체 Hook 조회](../../.harness/build/mitc4-eigen-evidence/prep/attempt5/root-all-hook-trust-observation.json)에서는 적용 대상 10개 모두 `enabled/trusted`였다. 따라서 옵션이 없었다고 보고하지 않으며, 검토한 정의의 정상 신뢰 등록 근거를 별도로 보존한다.
@@ -1,122 +0,0 @@
# MITC4 eigen 필수 verification portfolio
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 수치 기준: [controls C1~C7](numerical-review-controls.md)
아래는 Planning이 RED→observed failure→GREEN→focused/full VERIFY에 연결할 **필수
logical cases**다. C++ test 이름·파일과 final schema는 각 owner가 정한다. 새로운 reference
생성/수정 없이 synthetic test inputs는 tests의 승인 소유 경로에 둔다. Expected value를
production mass/reduction/FEAST 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다.
## P1. Mass·좌표·조립
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C01 | Affine rectangle `4×2`, rho=3, t=1/2, parallel unit director. M10: C0=`(rho t A/36)*[4,2,1,2;...]`, C1=0, C2=t²C0/12, node m=3, h=0, j=1/16. Full24와 physical20·각 translation energy·tangent inertia/drill null을 검사. rho×4, t×2의 C0/C2 scaling도 검사 | C2 모든 관련 scalar/matrix/rank 기준 |
| MFE-C02 | [r1 rational warped/director-varying fixture](numerical-review-evidence.md#독립-mass-oracle)의 X,d,rho,t와 exact coefficient/row/first-moment oracle. Independent coefficient integration 또는 별도 고차 direct integration을 사용. C1을 강제0, 2-point mass, flat C2 비례식 mutation은 실패해야 함. 같은 shape/J production 호출만으로 oracle 구성 금지 | C2-02~10; 기존 geometry predicate를 먼저 적용. Custom-director kernel fixture를 input explicit normals 지원으로 확대하지 않음 |
| MFE-C03 | Consistent/moment snapshot을 유지하고 row-sum→lumped 연결 검사. C1/C2의 controlled symmetric perturbation이 원 mass와 derived block에 모두 반영됨. Independent nodal `integral rho Ni Gi^T Gi` 및 고정 velocities의 pairwise Jensen work와 비교. Uniform translation, drill-only, nonuniform translation, tangent rotation을 각각 검사 | C2-02~10; nonnegative kinetic energy, zero branch 및 총질량·centroid 보존 |
| MFE-C04 | Square `[-1,1]^2`, rho=t=1, uniform m×m grid m=1,2,4, velocity `(x,0,0)`, theta=0. Direct polynomial gives `q^T MC q=4/3`, `q^T(ML-MC)q=8/(3m²)`. Independent constant velocity의 두 energy는 모두 총질량4 | Exact sequence에 C2-03/04/06. 이는 이 smooth field의 lumping error 검산이며 일반 spectrum 수렴 차수 약속 아님 |
| MFE-C05 | C01/C02의 global proper rotation과 origin translation. Q는 rational proper rotation `[[0,-1,0],[3/5,0,-4/5],[4/5,0,3/5]]`, shift=(7,-3,5). Geometry/director/frame/mass를 새로 계산. Scalar full-row lumping이 실패하는 d=(1,1,1)/sqrt3도 사용 | 두 mass congruence와 kinetic work C2-02; moment는 common Xref, drilling null 보존 |
| MFE-C06 | 공유 node·서로 다른 rho/thickness section의 shell patch. Element 순서와 source labels가 다른 입력의 대응 결과, sequential/병렬 contribution 및 stable reduction을 검사. 실제 constraints와 source indices를 독립 expected map으로 대조 | Exact structure/order/identity, C2 matrix equality. Input permutation 자체와 fixed source-order determinism을 구분 |
| MFE-C07 | rho=0/negative/NaN/Inf/missing/duplicate/unresolved/dependent, invalid t/material, inverted/degenerate/기존 미지원 geometry 및 27점 중 invalid evaluation을 각각 거부. Density가 없는 기존 static case는 허용 | Semantic/geometry/model failure, 상태·output 미반영. Mass zero 우회 금지 |
## P2. Stabilization·partial BC·정적 영향
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례)와 Z45° 회전. S1을 새 frame에서 계산. Expected kd=19/4800, Mff=3/50, Kff=10369/7500, lambda=10369/450. 모든 DOF fixed, node1 URZ만 free. Old min rule은 이 case를 실패시켜야 함 | Complete K·두 mass·kd congruence C2, exact eigenvalue C3-07, 원 free residual. Full-free/clamp 대체 금지 |
| MFE-C09 | C08에 admissible moment `m=(5/3)M0 b`, M0=1, b=(-4/5,0,3/5). 각 geometry에서 load도 변환. Expected thetaZ=7500/10369. 원 full `Kq-F`의 모든 reaction 성분을 회전해 비교 | C7 static response/full residual/reaction covariance, physical moment projection<=1e-12 |
| MFE-C10 | Eight diagonal inventory `[0,0,2,4,0,6,0,4]`이면 kref=2,kd=.002. All-zero, 한 negative, NaN/Inf는 failure. DBL_MAX 근방 양성 inventory는 scaled mean이 가능한 경우 finite; subnormal kd underflow는 failure. Independent node별 tangent changes O angles=(0,pi/6,pi/4,pi/3)에서도 trace 동일 | C2-11/12; 분모8 고정, clamp/positive-only mean/min 금지 |
| MFE-C11 | Free affine element와 smooth patch의 세 rigid translation·세 tangent-projected rigid rotation. Pure drill은 별도 4개. Physical K20 rank14, consistent physical mass rank20, complete K24 rank18/nullity6; positive-space dimension20. Full massless reduction 후 six near-zero physical modes가 남음 | C2/C3 analytic rank·rigid K action·mass Gram; drill에 관성을 주거나 physical zero mode 삭제 금지 |
| MFE-C12 | 기존 nonlinear fixture에서 초기 scale=S1, trial/commit/rollback에 exact unchanged. 기존 objective gamma potential의 first/second directional variations, finite rigid motion, linear physical limit, physical recovery 제외와 reaction conversion | [기존 nonlinear 계약](../nonlinear-static-newton-raphson/numerical-review.md) 및 C7. Trial scale 재선정·nonlinear Hessian SPD·linear Td entry equality를 요구하지 않음 |
## P3. 실제 BC·mass whitening·FEAST
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C13 | Nodal M6 h=0,m=j=1의 manufactured block. d=(0,0,1), d=(3/5,0,4/5), d=(1,1,1)/sqrt3에 full free, URX fixed, URZ only free, all rotations fixed, drill-only free, fully constrained 조합. 조합은 Cartesian product가 아니라 지원되는 global component BC로 표현 가능한 경우만 적용하며, drill-only free는 d=(0,0,1)에서 URZ만 free이고 나머지5 DOF constrained인 경우로 한정한다(MPC 없음). Expected null은 constrained director 성분의 exact-zero 교집합. Mixed nodes에는 local finite rank0가 있어도 다른 finite node 보존 | E2 analytic dimension, C2-07~14, recovered source mask. Global n=0 또는 N>n은 failure |
| MFE-C14 | `d=(2p/(1+p²),0,(1-p²)/(1+p²))`, p=1/2000와1e-8. m=j=1,h=0; URX만 fixed, 세 translation과 URY/URZ free. 첫 case positive rank5와 conditioning pass; 두 번째는 여전히 analytic rank5이나 conditioning/Cholesky failure. p=0은 정확한 null1 | C2 rcond cutoff의 양옆 및 exact equality branch. Tiny positive mass를 rank4로 바꾸는 구현은 실패 |
| MFE-C15 | 독립 singular pencil K=[[6,2],[2,4]], M=diag(2,0)에서 finite lambda=5/2,z=-p/2. 단순 삭제의3은 오답. Production shell projection path에 nonzero Kpz 또는 nonpositive Kzz 주입 시 실패. 일반 dense Schur 기능을 구현할 필요 없음 | Original residual oracle와 E3 admissibility rejection, 임의 fallback 금지 |
| MFE-C16 | SPD nodal whitening `M=[[2,1],[1,2]]`, `K=[[6,4],[4,6]]`의 eigenvalues 2,10/3. Dense inverse 없이 congruence·복원·original-M normalization. 같은 eigenvectors에 틀린 lambda·mass variant·null coordinate/constraint를 각각 주입 | C2/C3, injected wrong pairing/mass/full residual이 실패해야 함 |
| MFE-C17 | Actual FEAST diagonal known spectra: n1 λ=2,N1; `[0,0,0,2,5,9]`에 N1/4/6; `[1,2,4,8]` N1/2/4; n4 all-zero N1/4. 요청 N은 별도 input count이고 count output과 분리 | C3/C5, lowest N/multiplicity/zero/N=n, count/guard/solve history; mock만으로 대체 금지 |
| MFE-C18 | Actual FEAST n64 spectrum: 앞40개 λ=1, 나머지 λ=2..25, N1 및N41. n4 tight spectrum `[1,1+2^-28,1+2^-27,8]`, N2. B=Q diag(lambda) Q^T의 dense-pattern test도 추가; Q는 고정 Givens(pi/6,pi/4) 곱 | C3-07/08, repeated group>N에서 c/m0가 N보다 커짐, 전체 c Gram, partial cluster merge 금지 |
| MFE-C19 | Actual backend에 `[ -2,0,3 ]`, `[ -1e-12,0,1 ]`. Backend raw negative 보존; procedure는 첫 spectrum의 유의한 음수 실패, near-zero negative는 classification·frequency-validity/raw 보존. Exact `±tau_zero*s` 및 그 양옆은 arithmetic/injection 경계 test | C3 분류와 실패 보존. 부적합 물리 K를 accepted shell이라고 주장하지 않음 |
| MFE-C20 | Density×4에서 두 M×4, λ/4, normalized vector amplitude 1/2; C08과 simple/repeated known-spectrum fixture 사용. 길이×1024, rho/1024³,E/1024,t×1024의 일관 단위 변환에서도 λ 불변 | C2/C3/C4; baseline s·same physical BC, 단위 mixing/floor 검출 |
| MFE-C21 | Endpoint=eigenvalue collision, prefix0 반환, nonmonotone count, total!=n, m!=c, info1/2/3/4/-1..-5/200..202·invalid fpm, missing/duplicate/nonfinite CSR, B-not-SPD를 각각 주입. QR rank/Gram failure·insufficient capacity·nonfinite pair·wrong residual도 주입 | C5의 정확한 retry 대상·budget/최종 failure. Error를 empty interval 또는 부분 성공으로 바꾸지 않음 |
| MFE-C22 | 실제 operator에 near endpoint/repeated cluster의 C5 history 검증과 adapter-mock count-call512/solve-call3 최대 경계, budget 직전 certified bracket fallback. Index/nnz+1/n²/n*m0 overflow 및 allocation 실패 injection | 정수 exact checks, 유한 종료, controlled failure. 큰 메모리를 실제 할당해 실패시킬 필요 없음 |
MFE-C17/18 actual FEAST case에서 bounds를 expected eigenvalues로 설정하지 않는다.
Production E6/C5 search를 실행하고 independent diagonal spectrum의 prefix count와
postsolve 결과로 history를 검증한다. Synthetic rotated pencil은 sparse CSR에 전 dense
pattern을 저장할 수 있지만 다른 eigensolver로 expected values를 계산하지 않는다.
False count/solve success가 lowest-N를 검증하지 못하는 mock도 포함해 missing low eigenpair를
Gram/residual만으로 성공시키는 경로를 잡는다.
## P4. I/O·reference·운영 closure
| Case ID | 필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C23 | 원본 input의 density/section mapping·S4/S4R common physical path·Step-2/N10·blank bounds·Lanczos/SIM/acoustic-free no-op·mass normalization. Unsupported fields, prior step/preload, nonzero BC, damping/acoustic/mixed elements는 fail-closed | I/O가 fixed syntax allowlist·진단으로 구체화. Source count와 actual FEAST count/backend 구분 |
| MFE-C24 | Source renumbering과 output self-check; logical mode/source identity·lambda dimension·actual mass/backend·candidate를 HDF5에서 복원. 기존 final hash/accepted state를 준비하고 solve/validation/write/close/replace failure 주입 | 정확한 schema는 I/O 소유. 모든 failure에서 계약 범위의 이전 state/final 보존, log는 별도 lifecycle |
| MFE-C25 | [새 eigen reference](reference-model.md) 10개 Value, 10 singleton families, comparator prechecks/1% RMS·5% row·near-zero·zero-scale inclusive 경계. Equal values의 distinct IDs와 reordered TXT는 허용, missing/extra/duplicate/NaN/Inf/wrong quantity/mass/schema는 실패 | 공통 policy 그대로, 모든 Value blocking. Actual FESA fresh binary 결과로 실행 |
| MFE-C26 | 아래 기존 linear/nonlinear static portfolio·configured 전체 regression suite·새 warning 없음. Density 없는 기존 static, source mapping·partial-BC response·Newton objective/tangent·평형·reaction·energy·rollback | C7와 기존 reference identity/policy. Old kd 수치 equality는 대체하되 다른 기준 유지 |
| MFE-C27 | RED가 변경 동작 때문에 실패했는지 확인, GREEN/focused/full MSVC x64 Debug CMake/CTest 실제 exit, actual FEAST/backend identity, fresh reference timestamps/hashes. 세 반복 구조/order/diagnostic 및 scalar 재현성 | C4, 전27개 requirement evidence 및 동일 r2 Physics/Release closure. 누락·실패·stale를 통과 처리 금지 |
기존 정적 포트폴리오의 원본 목록은
[Requirement evidence](requirements-evidence.md#필수-회귀-포트폴리오와-identity)와
[현재 nonlinear reference-model](../nonlinear-static-newton-raphson/reference-model.md)이다.
`shell`/`shellNL`/`shellNL-meshfine`의 해당 `.inp`와 같은 폴더의 원본
`<stem> displacements.csv`, nonlinear의 required review-only reactions를 그대로 사용한다.
Linear `shell-s4`와 `shell-s4-linear-limit`는 같은 input의 서로 다른 검토 역할이며
같은 fresh solve를 재사용할 수 있어도 각 identity/회귀 증거를 생략하지 않는다.
U1/U2/U3는 global length blocking, UR1/UR2/UR3는 fixed-initial global rotation-vector
warning-only이며 같은 step/accepted state·case·dimension·coordinates·impact별 공통 family다.
Nonlinear RF1/RF2/RF3와 physical spatial RM1/RM2는 기존 source-key·finite·inventory 및
error/RMS report를 유지하는 review-only다. RM3/stress는 기존 numerical gate에 넣지 않는다.
Factor-one 내부 force/moment equilibrium은 별도 blocking이고 C7를 따른다.
`shellnl-meshfine-02-s4-final`의 post-closure 역할은 그대로 유지하며 등록 suite의 해당
실행·영향 evidence를 기록한다. 과거 세 case의 closure로 소급 합치지 않는다.
Root가 관찰한 중단 baseline/단독 재현/나머지 pressure tests는 새 binary 전체 suite의
성공 evidence가 아니다. Reference 테스트의 HDF5 cache가 이전 library보다 새롭다는
이유로 옛 solve를 재사용하지 않았는지 확인하고, r2 영향을 받는 final comparison은 새 binary의
fresh solve evidence로 남긴다. Reference input/results를 수정하거나 Hook state를 조작하지 않는다.
## Requirement coverage
아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다.
Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md)가 원본이다.
| Requirement suffix | 필수 cases |
| --- | --- |
| 001 | MFE-C23, MFE-C25 |
| 002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 |
| 003 | MFE-C06, MFE-C07, MFE-C23 |
| 004 | MFE-C01, MFE-C02, MFE-C07 |
| 005 | MFE-C01, MFE-C02, MFE-C03 |
| 006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 |
| 007 | MFE-C06, MFE-C13, MFE-C27 |
| 008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 |
| 009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 |
| 010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 |
| 011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 |
| 012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 |
| 013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 |
| 014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 |
| 015 | MFE-C23, MFE-C25 |
| 016 | MFE-C07, MFE-C21, MFE-C23 |
| 017 | MFE-C24, MFE-C25 |
| 018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 |
| 019 | MFE-C21, MFE-C22, MFE-C24 |
| 020 | MFE-C25, MFE-C26 |
| 021 | MFE-C25 |
| 022 | MFE-C25 |
| 023 | MFE-C27 |
| 024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 |
| 025 | MFE-C27 |
| 026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 |
| 027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 |
@@ -1,232 +0,0 @@
# MITC4 eigen 내부 수치 기준
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증.
[V1~V6](formulation-verification.md), [E1~E8](formulation-eigen.md),
[S1~S8](formulation-stabilization.md)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부
수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통
tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다.
## C1. Scale, 공통 zero branch와 근거
`ell`, `D`, `Khat/Mhat`, `Kf/Mf`, `A`, `s`, `B=A/s`는 E1/E6대로 사용한다.
같은 비교의 두 행렬에는 같은 ell을 적용한다. Matrix norms는 Frobenius,
vector norms는 Euclidean이며 별도 inf 표기만 infinity norm이다. Mixed force/moment 또는
translation/rotation 원값을 직접 더하지 않는다. Scaled sum-of-squares와 stable ordered sum을
쓰고 finite-first로 검사한다. 모든 ratio는 분모가 양수일 때 계산한다.
`numerator=denominator=0`은 metric 0, `denominator=0,numerator!=0`은 named failure다.
Zero eigenvector, nonpositive modal mass 및 invalid scale은 이 zero-pass의 대상이 아니다.
어떤 branch에도 `max(1,physical_scale)`, mass/eigenvalue floor나 clamp를 추가하지 않는다.
공통 기본값은 `tau_alg=1e-12`, `tau_modal=1e-10`이다. 기존
[linear NR-D02](../linear-static-mitc4-shell/numerical-review.md)의 algebraic/rigid 기준을
유지하며 mass polynomial과 trace의 같은 단위 항등식에도 적용한다.
Unit roundoff `u=2^-53`에서 `gamma_k=ku/(1-ku)`이다. 4096개의 단순 연산을 가정한
`gamma_4096≈4.55e-13`에 비해 `1e-12`는 작은 dense block·27점 적분의 정상 산술 오차를
구분할 여유가 있다. 이는 모든 geometry의 forward-error theorem이 아니다.
Rank·conditioning·원 residual·독립 oracle를 따로 요구한다. 현재 rational oracle 및
r2 covariance 오차는 이 기준보다 충분히 작지만 기준을 그 결과에 맞춰 고른 것은 아니다.
`tau_modal`은 `1e-12` 내부 FEAST stopping보다 100배 큰 후검증 한계다.
외부 1% 판정을 내부 residual 허용값으로 쓰지 않는다. 같은 계산의 재실행 구조/row/
diagnostic 순서는 exact이고, eigenvector의 repeated-basis 비유일성은 C4를 따른다.
## C2. Matrix, mass, stabilization와 reduction
| ID | Metric / exact predicate | 한계·zero 처리 |
| --- | --- | --- |
| C2-01 | V1 `eta_sym(Q)`; mass·physical K·linear complete K·whitened A | `<=1e-12`; Q=0이면 C1. 대칭 copy 자체만 독립 evidence로 사용하지 않음 |
| C2-02 | V1 `\|\|R-S\|\|F/(\|\|R\|\|F+\|\|S\|\|F)`; congruence, moment→matrix, 직접 적분, Cholesky reconstruction | `<=1e-12`; 단위·같은 scale 필수 |
| C2-03 | Scalar moment entry oracle: `\|Ck_ij-Ck*_ij\|/[m_e(t/2)^k]` | k=0,1,2 각각 `<=1e-12`; positive `m_e=integral rho dV`. Exact C1=0도 이 차원 일치 scale로 검사 |
| C2-04 | Mass total `\|m-m*\|/(\|m\|+\|m*\|)`; uniform translation energy | `<=1e-12`; 각 방향을 따로 검사, trace(Muu)를 총질량으로 쓰지 않음 |
| C2-05 | Shifted spatial first moment difference divided by `m_e ell` | `<=1e-12`; 한 source node를 공통 Xref로 사용. `hi di` 포함 |
| C2-06 | M9 difference vs independent pairwise integral / `(q^T ML q+q^T MC q)` | absolute mismatch `<=1e-12`; raw Delta/scale `>=-1e-12`. Zero motion/drill-only는 C1. Negative roundoff를 값을 0으로 바꾸는 데 사용하지 않음 |
| C2-07 | V2 mass-null action, MZ, KZ | 각각 `<=1e-12`; nz=0은 N/A. 정확한 analytic null만 대상 |
| C2-08 | `\|\|P^T Z\|\|F`, `\|\|[P Z]^T[P Z]-I\|\|F/sqrt(nf)` | `<=1e-12`; 각 node basis의 해당 norm도 `<=1e-12` |
| C2-09 | `mi>0,ji>0,ji-hi²/mi>0`; consistent physical20 및 모든 nonempty Mp nodal block Cholesky | strict, finite. Zero/negative pivot·variance는 실패. Consistent rank20/lumped rank5는 analytic expected rank로 검증 |
| C2-10 | `\|(ji-hi²/mi)-integral rho Ni(z-hi/mi)²dV\|/(ji+hi²/mi)` | `<=1e-12`; `vi/ell²`, `\|hi\|/sqrt(mi ji)`도 기록하며 별도 rank cutoff로 쓰지 않음 |
| C2-11 | S2 여덟 초기 rotation diagonals | 모두 finite `>=0`, 하나 이상 `>0`; zero 포함 분모8. `kd>0` finite. Negative를 허용오차로 0 처리하지 않음 |
| C2-12 | `\|kd'-kd\|/(\|kd'\|+\|kd\|)` 및 직접 trace oracle | `<=1e-12`; global 회전/독립 tangent 재생성 후 계산. Trial별 frozen kd는 exact unchanged |
| C2-13 | E3 `Kzz=diag(kappa_i)`, `kappa_i=sum incident kd,e` | 각 kappa finite `>0`, expected diagonal relation C2-02; Kpz 검사와 원 free residual을 함께 요구 |
| C2-14 | Scaled constrained component norm V3 | `0` exact; 복원한 source constrained entries도 exact zero |
Positive/null dimension은 **E2의 constrained director component exact-zero 교집합**으로만
정한다. Constrained director의 tiny nonzero 성분을 축정렬이라고 반올림하지 않는다.
각 nonempty dimension≤6 scaled nodal Mp에
`rcond_inf = 1/(||Mp||inf ||Mp^-1||inf) >= 2^-32 = 2.3283064365386963e-10`
을 요구한다. 작은 block의 Cholesky triangular solves로 inverse action norm을 구하며
global inverse는 만들지 않는다. Product overflow를 피하는 동치 ratio로 계산한다.
이 조건은 physical rank 변경이 아니라 binary64 whitening의 numerical admissibility다.
64 연산의 `gamma_64/rcond`를 약 `3.06e-5` 이하로 제한하는 최소 guard이며
모든 eigenvalue의 상대 정확도를 보장하지 않는다. Cholesky reconstruction과 full modal
residual을 통과해야 한다. 한계 미만·unresolvable estimate는 conditioning failure이고
좌표 삭제, 더 큰 mass, 다른 solver로 우회하지 않는다. 빈 nodal block은 skip하지만
global n=0 또는 요청 N>n은 명시적 failure다.
## C3. Eigenpair 및 물리 내부 판정
계산된 c개 **전체** eigenpair를 검사한 뒤 첫 N개만 공개한다. V3/V4의 actual M은 ML다.
| ID | Metric | 한계 |
| --- | --- | --- |
| C3-01 | V1 full original free residual `eta_r`; V3 whitened `eta_w` | 각각 `<=1e-10` |
| C3-02 | 추가 operator-scale residual `rho_B=\|\|Bx-mu x\|\|2/\|\|x\|\|2` | `<=1e-10`; dimensionless. Frobenius norm의 크기로 오류가 희석되는 것을 방지 |
| C3-03 | V3 `eta_norm,i`, pairwise `eta_orth,ij`, `eta_G` | 각각 `<=1e-10`; positive mass를 먼저 확인. Gram full rank는 이 bound와 독립 column 수로 확인 |
| C3-04 | V4 energy/Rayleigh consistency `eta_energy,i` | `<=1e-10`; zero lambda도 C1/V4 분모 사용 |
| C3-05 | V5 rigid K action | 각 6개 field `<=1e-10`; physical rigid mass Gram는 Cholesky 성공, vector 수6. Drill과 혼동하지 않음 |
| C3-06 | `\|c_rho lambda_i'-lambda_i\|/s` 또는 coordinate `\|lambda_i'-lambda_i\|/s` | `<=1e-10`; repeated group 내부 pairing은 C4. 동일 물리 BC·loads 사용 |
| C3-07 | Exact known-spectrum test eigenvalue error / known s | `<=1e-10`이고, 알려진 인접 distinct gap이 있으면 absolute error도 `<=gap/8` |
| C3-08 | Simple/반복군 C4 projector error V5 | `<=1e-6`; 테스트의 해당 군과 나머지 spectrum 사이 known gap은 `>=1e-3 s`로 선택 |
C3-02는 symmetric B에서 computed mu가 실제 spectrum으로부터 residue norm 이내에
있다는 직접 spectral-decomposition bound를 사용한다. 가장 낮은 mode인지, 올바른
multiplicity인지는 증명하지 않으므로 C5 count/endpoint evidence가 별도로 필수다.
FEAST의 `res`는 backend diagnostic이고 C3의 독립 residual을 대신하지 않는다.
Zero eigenvalue에서 backend relative-residual의 분모가 0이면 해당 diagnostic은 unavailable로
기록하고 이유를 남긴다. Raw e/x, 자체 metric 및 최종 scalar 결과는 finite여야 한다.
Undefined backend diagnostic을 physical residual=0으로 바꾸거나 mandatory finite 결과에
NaN을 저장하지 않는다. Trace `epsout`은 strict interval에서 finite여야 한다.
Raw `mu=lambda/s`에서 `tau_zero=1e-9`, `tau_cluster=1e-8`로 고정한다.
`mu<-tau_zero`는 유의한 negative spectrum으로 procedure failure,
`|mu|<=tau_zero`는 near-zero classification, 그 외 양수는 positive다.
Boundary equality는 near-zero에 포함한다. Returned lambda는 부호와 raw 수치를 보존한다.
양수에서만 frequency를 파생하고 exact zero는 f=0, 작은 음수에서는 실수 frequency를
만들지 않는다. C3-02보다 10배 큰 near-zero band와 100배 큰 cluster band는 수치 분류용이다.
양의 작은 mode를 제거하거나 N을 세는 방식에 쓰지 않는다. s/λ의 nonfinite 또는
nonzero mu의 λ 환산 underflow-to-zero는 실패하고 physical scale을 1로 바꾸지 않는다.
## C4. Repeated subspace와 결정론
Raw lambda 오름차순의 stable sort, exact equal tie는 original solver column 순서다.
인접 `|lambda_i-lambda_(i-1)|/s<=1e-8`의 connected group은 diagnostic cluster일 뿐,
distinct 값을 merge/평균하거나 vector를 섞을 권한이 아니다. 알려진 exact repeated 군의
density/rotation tests에서 V5의 mass-whitened projector norm을 사용한다.
Known gap≥1e-3 s와 C3-02이면 first-order invariant-subspace sensitivity는 약1e-7
수준이므로 C3-08의 1e-6은 방향 비유일성을 허용하면서 잘못된 공간을 검출한다.
이 조건 밖 실제 cluster는 raw eigenpair·Gram/residual을 계속 검사하고 특정 개별 vector
방향의 정확도를 새로 약속하지 않는다. Mode shape 외부 comparison은 없다.
Source DOF 순서로 largest absolute scaled global component를 찾고 sign을 양수로
정한다. 동률은 첫 source DOF다. Zero vector는 실패다. 동일 binary/runtime/thread/입력의
세 반복에서는 sparse structure·COO reduction·row/diagnostic identity가 exact 동일해야 한다.
Scalar 재현 오차는 C3-06, repeated vector는 C4를 적용한다. CPU/runtime를 바꾼 bitwise
eigenvalue/vector equality를 요구하지 않는다.
## C5. FEAST controls와 bounded interval 정책
Actual call은 `dfeast_scsrgv`, `(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR다.
각 call은 `feastinit`하고 아래 C-index fpm을 설정한다. 명시하지 않은 값은 해당 설치의
초기값을 유지·기록한다. Private backend를 넘어 vendor type을 노출하지 않는다.
| fpm | 값 | 근거·역할 |
| --- | ---: | --- |
| `[0]` | 0 | Status를 deterministic diagnostic으로 수집 |
| `[1]` | 16 | 공식 허용 contour 값; 기본8보다 적분 resolution에 여유, 모든 attempt 고정 |
| `[2]` | 12 | `1e-12` double stopping; 독립 C3 residual 필수 |
| `[3]` | 20 | 유한 refinement 한계; 미수렴 성공 금지 |
| `[4]` | 1 | 아래 고정 initial subspace 사용 |
| `[5]` | 1 | Endpoint-scaled trace stopping; zero mode에서 C3-02로 독립 검증 |
| `[13]` | 0 | Eigenpairs가 아닌 subspace-only 결과 금지 |
| `[26]`, `[27]` | 1, 1 | CSR validity와 second-matrix SPD check |
| `[49]` | count 1, solve 0 | Total interval count와 실제 eigenpair solve 분리 |
| `[63]` | 0 | 초기 PARDISO 정책 사용; 임의 iparm tuning 금지 |
근거는 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)과
[E7의 API/status 출처](formulation-eigen.md#e7-feast-경계와-deterministic-실행)다.
Count는 documented total이며 stochastic estimate로 부르지 않는다. 공식 count/status의
floating-point 한계가 있으므로 아래 redundant evidence와 실제 known spectra가 필수다.
Gershgorin 각 off-diagonal absolute sum은 매 덧셈 뒤 `nextafter(+infinity)`로 outward
누적한다. `Bii-ri`/`Bii+ri`도 각각 바깥으로 한 ULP 이동한다. Overflow는 실패다.
`beta=||B||inf`를 같은 outward 방식으로 구한다. Nonzero B에서는 beta>0;
정확한 B=0은 E6의 algorithmic enclosure `[-1,1]`에 대응하여 beta=1로 둔다.
이는 physical mass/λ floor가 아니다. `ulp(v)`는 v의 두 finite adjacent spacing 중 큰 값이며
`delta(v)=1e-8 beta + 64 ulp(v)`
로 정의한다. 초기 endpoints는 `a0=nextafter(gL-16delta(gL),-infinity)`,
`b0=nextafter(gU+16delta(gU),+infinity)`다. Finite strict enclosure와 total count=n을
확인한 뒤 E6의 upper-prefix search와 empty-prefix lower 축소를 한다.
Interior endpoint v를 bracket에 반영하려면 `(a0,v-delta(v))`, `(a0,v)`,
`(a0,v+delta(v))`의 count가 모두 `info=0`이고 같아야 한다. 이 guard count는 eigenvalue
근처의 endpoint를 피하는 추가 evidence다. Guard가 enclosure 밖이면 그 부분은 알려진
outside bound를 이용하며 실제 interval이 strict하지 않으면 평가하지 않는다.
Zero count는 성공 count=0일 때만 믿고 `info=1`을 empty proof로 바꾸지 않는다.
이미 알려진 prefix count와 monotonicity가 맞지 않으면 전체 실패다.
| 제어 | 유한 값 / 정확한 처리 |
| --- | --- |
| Total count API calls | 전체 analysis 최대512. 성공·실패·guard·최종확인·retry 모두 포함 |
| Search optimization | Upper/lower 각각 최대32 midpoint 단계; optimization count calls 최대384로 남은128 예약 |
| Endpoint collision | 같은 midpoint에서 offsets `0,+1,-1,+2,-2,+4,-4` times delta, 이 순서 최대7후보. 현재 bracket 내부 후보만 사용 |
| Search 종료 | E6의 count target `N<=c<=min(n,2N+8)` 또는 폭 `<=8delta(mid)`/새 representable midpoint 없음/위 budget. 마지막 certified c>=N bracket 사용 |
| 최종 확인 | Enclosure 안의 a에 prefix0, b에 prefix c>=N, 두 endpoint guard, actual `(a,b)` count=c. 불일치/예약 budget 부족이면 실패 |
| Initial solve capacity | E6 그대로 `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n |
| Actual solve calls | 최초 포함 최대3; 각 call loops≤20, control/seed 동일 |
| 허용 solver retry | info1/2/3, count/returned-m mismatch 또는 endpoint separation failure만. 저장된 더 넓은 certified bracket으로 확대·재count, `m0=min(n,max(new formula,2*previous m0))` |
| Retry bracket 순서 | Upper search에 저장된 현재 b보다 큰 성공 b를 오름차순으로 선택, lower는 이전의 더 작은 certified prefix0 또는 a0; 최종 fallback은 원 enclosure |
| 금지 retry | Nonfinite eigenpair, wrong Gram/residual, negative spectrum, invalid/SPD/index/allocation/inner-solver 오류는 즉시 실패. Seed·mass·solver·threshold 변경 금지 |
새 유효 bracket이 없으면 같은 실패 call을 무조건 반복하지 않는다. Optimization 한계에서는
이미 certified enclosure를 사용할 수 있지만 실제 solve·최종 count가 실패하면 부분 결과를
공개하지 않는다. Returned m=c, interval 내부와 `mu-a>=delta(a)`, `b-mu>=delta(b)`,
모든 c columns C3 통과를 확인한다. N번째가 cluster 내부여도 전체 c를 검사하고 출력은 N개다.
Bounds·prefix/guard/status/count/m0/m/loop/epsout·chosen ranks 및 모든 실패를 보존한다.
후속 tolerance 완화나 reference Value를 bounds 설정에 사용하는 것은 금지한다.
## C6. Initial subspace, thread와 storage
Count scratch는 E7의 conservative n×n, identity initial x다. 실제 solve에서 m0=n도
identity다. m0<n이면 uint64 recurrence를 column-major로 한 entry마다 한 번 실행한다.
Seed `0x4D495443344D4645`, `z <- 6364136223846793005*z+1442695040888963407 mod 2^64`,
`x=2*(double(z>>11)*2^-53)-1`이다. Overflow wrap은 이 generator에만 의도적이며
size/index 산술에는 허용하지 않는다. Seed를 바꾸며 성공을 찾지 않는다.
Column ascending의 nonpivoted Householder QR를 사용한다. Scaled norm, `sign(0)=+1`,
`v1=x1+sign(x1)||x||`로 cancellation을 피하고 최종 R diagonal이 양수인 Q를 선택한다.
Original column norm에 대한 `|Rjj|/||input_col_j||2<=1e-12` 또는 zero는 initial-space
rank failure다. Post-QR `||Q^TQ-I||F/sqrt(m0)<=1e-12`를 요구한다. 이것은 모든
eigenspace overlap의 보장이 아니며 C5 count와 C3 Gram/residual이 계속 필요하다.
Backend call 동안 oneMKL thread-local count=1을 설정하고 모든 exit에서 이전 값을 복원한다.
[공식 mkl_set_num_threads_local](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의
반환 previous setting을 사용한다. 전역 설정을 바꾸거나 vendor workspace를 동시 공유하지
않는다. 설치 runtime/ABI/유효 thread count·seed·controls를 기록한다. Element contribution
병렬 생성은 허용하되 stable reduction 순서는 유지한다.
Mode cap을 임의의 상수로 만들지 않는다. 정량 representation 경계는
`1<=N<=n<=MKL_INT_MAX`, `nnz+1<=MKL_INT_MAX`, 모든 row/column in-range,
`n+1`, `6*nodes`, `n*m0`, `n*n`, 각 `count*sizeof(T)`가 internal index 및
`min(SIZE_MAX,PTRDIFF_MAX)` 안에 있고 해당 container max_size를 넘지 않는 것이다.
곱/합은 overflow 전에 검사하며 double의 정수 근삿값으로 capacity를 계산하지 않는다.
Conservative double n×n scratch는 Win64에서 표현상 n≤`1073741823`이고 실제 사용 가능
메모리 한계는 훨씬 작다. Allocation/factorization 실패는 명시적으로 종료하며 N을 줄이지 않는다.
Reference n=3125의 count x만 `78,125,000` bytes다. 이를 전체 peak memory라고 부르지 않고
CSR, FEAST reduced storage 및 complex shifted sparse fill을 따로 기록한다.
## C7. 승인된 정적 회귀 기준
새 scale을 적용하되 기존 [linear NR](../linear-static-mitc4-shell/numerical-review.md)의
symmetry/frame/energy `1e-12`, rigid/full residual/global equilibrium `1e-10`을 유지한다.
NR-MFE-001 static response는 C2 congruence `1e-12`와 complete full residual `1e-10`이다.
Static moment admissibility는 기존 `|d·m|/||m||<=1e-12`, zero moment는 별도 branch다.
기존 [nonlinear NR §6](../nonlinear-static-newton-raphson/numerical-review.md)는 그대로다:
rotation/frame 및 no-applied-moment tangent symmetry `1e-12`, directional tangent error
`1e-6`(zero analytical direction `1e-10`), finite-rigid objectivity `1e-10`, factor-one
global force/moment balance 각 `1e-8`. 기존 finite-difference schedule
`[1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7]` 및 interior index3 기준을 유지한다.
근거는 [등록된 tangent test](../../tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp)와
기존 승인 numerical contract다. 새 scale의 Dkd=D²kd=0 및 gamma derivative를 검산한다.
Nonlinear Hessian 전체의 SPD 또는 linear Tdrill과의 entry equality를 추가하지 않는다.
NSNR-069/070의 네 채널·typed zero-scale·100 iteration·no cutback/retry 종료 정책도
기존 계약을 보존한다. 새 eigen C1 zero branch로 해당 승인 typed absolute branch를 덮어쓰지 않는다.
@@ -1,386 +0,0 @@
# MITC4 독립 수치 검토 evidence
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 검토일 / web access date: `2026-09-06`
## NR-MFE-001 직접 계산 반례
이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은
아래 [r2 공변성 검산](#r2-독립-공변성-검산)에 있다. 기존 실패를 통과로 소급 변경하지 않는다.
관련 원문은 [requirements](requirements.md)의 `002`(기존 kernel 유지),
`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance
evidence)와 [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)다.
실제 [kernel](../../src/fesa/elements/mitc4_shell.cpp)의
`PhysicalTransformation20`(line 488), `DrillingTransformation4`(505),
`Stiffness`의 minimum tangent diagonal(633~653)을 읽기 전용으로 대조했다.
다음은 production 함수를 재호출한 expected value가 아니라 평판 다항식의 직접 적분이다.
Tangent axes `a=(0,1,0)`, `b=(-4/5,0,3/5)`, normal `d=(3/5,0,4/5)`를 둔다.
Node 순서는 `X1=-2a-b`, `X2=2a-b`, `X3=2a+b`, `X4=-2a+b`다.
`a×b=d`, 면적 8, 두께 1이고 constant director·positive Jacobian의 직사각형이다.
단일 element의 geometry-derived director와도 같다. `E=12, nu=0, rho=1`로 둔다.
모든 DOF를 고정하되 node1의 global `URZ` 하나만 free로 한다.
직사각형 `Lx=4,Ly=2`에서 `integral Nx² dA=1/6`,
`integral Ny² dA=2/3`, `|integral Nx Ny dA|=1/4`이다.
`D=Et³/[12(1-nu²)]=1`, `G=6`이며 MITC tying으로 각 nodal rotary
shear square integral은 `A/12`다. 따라서 각 node의 tangent rotary physical block은
\[
R=\begin{bmatrix}49/12&\pm1/8\\\pm1/8&23/6\end{bmatrix},
\quad j=\rho t^3A/48=1/6,\quad k_d=10^{-3}(23/6).
\]
Off-diagonal 부호는 corner의 `Nx Ny` 부호에 따라 달라지고 두 부호 모두 존재한다.
Global `eZ`의 tangent 성분은 `(0,3/5)`이고 drilling 성분은 `4/5`다.
Free mass는 `j(1-dZ²)=0.06>0`이므로 E2는 이 DOF를 삭제하지 않는다.
이 1차원 constrained pencil의 정확한 유한 eigenvalue는
\[
\lambda=\frac{(9/25)(23/6)+(16/25)k_d}{(9/25)(1/6)}
=23+(32/3)k_d.
\]
이제 전체 geometry를 global Z축으로 45° 회전한다. Free axis `eZ`와 모든 나머지
fixed subspace는 그대로이므로 동일 물리 BC가 계속 지원 component BC로 표현된다.
새 director는 `(3/(5 sqrt2),3/(5 sqrt2),4/5)`다. Least-aligned global-axis 규칙의
새 tangent와 회전 전 tangent 사이의 cosine/sine은 `-5/sqrt41,-4/sqrt41`이다.
모든 corner의 두 tangent diagonal 중 최소는 `937/246`으로 달라진다.
Physical `eZ^T Kphys eZ`와 질량은 불변이지만 `kd'=10^-3(937/246)`다.
| 값 | 회전 전 | 회전 후 |
| --- | ---: | ---: |
| `kd` | `0.0038333333333333336` | `0.003808943089430893` |
| `lambda` | `23.04088888888889` | `23.040628726287263` |
상대 차이는 `1.1291343961675893e-5`다. Tangent tie가 반대 axis를 선택해도
모든 corner/두 tangent diagonal의 minimum은 같다. 좌표변환으로 constraints를 바꾼
오류, input explicit director/MPC 기능, mass cutoff 또는 FEAST 오차를 이용한 반례가 아니다.
크기가 외부 tolerance보다 작다는 사실은 내부 coordinate-invariance 항등식의 근거가 아니다.
실행 명령은 아래 read-only here-script, `python -B -`, exit `0`이었다.
```powershell
@'
from math import sqrt
from fractions import Fraction as F
def dot(a,b): return sum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def rot(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
d=(.6,0,.8); a=(0.,1.,0.); b=cross(d,a)
Raa=F(49,12); Rbb=F(23,6); Rab=F(1,8); j=F(1,6)
k0=.001*min(Raa,Rbb)
dp=rot(d); ap0=(1-dp[0]**2,-dp[0]*dp[1],-dp[0]*dp[2])
ap=tuple(v/sqrt(dot(ap0,ap0)) for v in ap0)
u=dot(ap,rot(a)); v=dot(ap,rot(b))
diags=[float(Raa)*u*u+float(Rbb)*v*v+2*c*u*v for c in [-float(Rab),float(Rab)]]
diags += [float(Raa)*v*v+float(Rbb)*u*u-2*c*u*v for c in [-float(Rab),float(Rab)]]
k1=.001*min(diags)
l0=float(Rbb/j)+k0*.64/(float(j)*.36)
l1=float(Rbb/j)+k1*.64/(float(j)*.36)
print(float(k0),k1,l0,l1,abs(l1-l0)/l0)
assert abs(l1-l0)>1e-6
'@ | python -B -
```
이 계산은 기존 C++ kernel 실행 evidence가 아니다. 기존 승인 수식과 source의 계수
규칙이 갖는 mathematical counterexample이다. Runtime 회귀 test는 이후 Planning 소유다.
## 비충돌 수학 검토
아래 표는 r1의 검토 기록이다. Mass·geometry·unit·BC·whitening·FEAST의 비충돌 항목은
r2 영향 확인 후 재사용한다. E3의 scalar는 r2 S1로 바뀌며 positivity/decoupling의 재검토와
V5의 complete K/partial-BC 해소는 아래 별도로 기록한다.
| 대상 | 독립 검토 결과와 한계 |
| --- | --- |
| M1/M2 | `S=-[d]x`이므로 `S theta=theta×d`; global DOF `[u,theta]`와 20↔24 transformation의 부호가 일치한다. Shear factor는 mass에 들어가지 않는다. |
| M3~M5 | `C0/C1/C2` 차원은 `M/ML/ML²`; symmetric cross block은 transpose 관계다. Trilinear map의 J degree≤(2,2,2), integrand≤(4,4,4)이므로 3×3×3의 degree5 정확성이 충분하다. |
| Consistent positivity | Positive weights/J에서 quadratic form=0이면 모든 27점에서 Hq=0. Hq는 각 자연좌표 degree≤1이므로 다항식 자체가 0이다. z=0에서 bilinear 독립성으로 모든 ui=0, z 계수에서 `Si theta_i=0`. Null은 정확히 네 drilling이며 physical20은 PD다. |
| M6~M8 | Scalar moment row-sum→nodal block은 partition of unity와 일치한다. Thickness points가 서로 달라 strict Cauchy–Schwarz이고 central inertia>0, rank5다. Tiny nonzero director component를 0으로 만드는 근거는 없다. |
| M9/M10 | Jensen 차이의 1/2 double sum과 kinetic-energy의 추가 1/2를 구분한 식이 맞다. Total mass·spatial first moment·allocated thickness moments는 보존하지만 일반 orbital inertia나 consistent spectrum은 보존하지 않는다. |
| Geometry | 기존 `EvaluateGeometry`는 실제 J>0와 finite reciprocal/frame을 검사한다. 추가 27점에도 같은 predicate를 적용하면 그 점의 부적합을 거부한다. Stiffness 8점과 validation을 바꾸지 않는다. 기존 8점만 통과한 input의 mass failure는 감추지 않으며 전역 injectivity/warp 허용 확대를 주장하지 않는다. |
| E1/E2 | Length congruence의 단위는 맞다. 실제 global free space와 director null의 교집합으로 null dimension을 정하는 조건은 정확하다. Partial BC의 full-rank local mass는 허용되며 near-null은 conditioning failure와 구분해야 한다. |
| E3/E4 | 공통 director와 element별 positive nodal scalar kd로 `KZ=Z diag(kappa)`, `Kpz=0`, `Kzz>0`이 성립한다. Partial BC에 남는 kd를 제거하면 원 pencil을 바꾼다. 일반 Schur 예제의 5/2 대 단순 삭제의 3은 옳고 general dense fallback은 필요하지 않다. |
| E5/E8 | `Mp=LL^T`, `A=L^-1 Kp L^-T`, `phi=DCP L^-T x`는 exact congruence다. Identity B의 FEAST도 actual lumped 문제다. Mass normalization 단위, constrained exact zero 및 candidate commit 의미가 맞다. |
| V1~V4 | 원 assembled free `Kf y-lambda Mf y`를 복원 후 검산해야 null 복원 오류를 잡는다. Mixed-unit norm을 직접 섞지 않고 zero denominator branch를 정의한 식은 일관된다. Gram/energy/residual은 lowest-N completeness를 대신하지 않는다. |
| Rigid/density | 기존 tangent-projected rigid field는 continuum interpolation의 rigid motion을 재현한다. Massless drilling과 6 physical rigid modes는 다르다. Density scaling과 repeated-group projector 정의는 일관된다. Eigen coordinate suite의 적용 범위는 NR-MFE-001 해결 전 확정하지 않는다. |
## 독립 mass oracle
`rho=3,t=1/2`에서 아래 kernel-level geometry/director fixture를 사용했다.
이는 현재 input의 explicit normal 기능을 추가하는 제안이 아니다. Unit rational directors와
warped coordinates를 이용한 독립 moment 적분 사례다. 전체 patch input 생성이나 기존
geometry validator 실행을 대신하지 않는다.
```text
X = [(-1,-1,1/10), (1,-1,-1/10), (1,1,1/5), (-1,1,-1/10)]
d = [(0,0,1), (3/5,0,4/5), (2/3,1/3,2/3), (0,3/5,4/5)]
```
`fractions.Fraction`으로 coefficient dictionary `(xi power,eta power,zeta power)`를
만들고 M1의 trilinear map을 미분·determinant 전개했다. Monomial integral은 홀수 차수면
0, 모든 차수가 짝수면 `8/[(p+1)(q+1)(r+1)]`다. Production shape/J/mass 함수를
호출하지 않았다. 이 exact rational 결과를 별도의 3-point 및 2-point Gauss 평가와 대조했다.
실제 read-only here-script `python -B -`, exit `0`, wall time 약 `0.52 s`였다.
| 관찰 | 결과 |
| --- | --- |
| 실제 maximum integrand degree | `(4,4,4)` |
| 27점 J 범위 | `[0.12859919221615254, 0.27013414111718076]` |
| 3-point 최대 scalar entry absolute error | `1.1102230246251565e-16` |
| 2-point 최대 scalar entry absolute error | `0.0006018518518518257` |
| `C0_11, C1_11, C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` |
| `sum mi, sum hi, sum ji` | `7743/1600`, `739/12000`, `517/5120` |
| First moment, two independent rational expressions exactly equal | `(-79747/360000, -685951/2880000, 49651/320000)` |
| Minimum nodal `ji-hi²/mi` | `0.022318161338791092 > 0` |
Independent row-sum oracle는 다음과 같으며 C1의 강제 zero나 flat rotary 비례식을 잡는다.
```text
m = [298/225, 1759/1440, 6211/5760, 2333/1920]
h = [3191/192000, 1061/72000, 337/24000, 9323/576000]
j = [5969/216000, 8807/345600, 155527/6912000, 779/30720]
```
현재 수치값은 정식화의 독립 계산 evidence다. C++ test 통과, reference spectrum 통과 또는
양의 J가 전체 volume에서 보장된다는 실행 결과로 바꾸지 않는다.
## FEAST 독립 source 대조
Intel C 2026.0 URL edition의 [parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)를
2026-09-06 재확인했다. `fpm[49]=1`은 CSR interval의 total count를 `m0`로 반환하고 flag를
reset한다. Stochastic estimate라는 설명은 없다. 다른 standalone FEAST의 옵션 번호나
확률적 count 설명을 이 API에 대입하지 않는다. 값의 conditioning-independent 정확성은
문서가 보장하지 않으므로 이것만으로 implementation completeness를 승인하지 않는다.
[API의 epsout 정의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)는
trace 변화량을 endpoint absolute maximum으로 나눈다. 따라서 strict nonzero-width
finite interval이면 zero eigenvalue만 있다는 이유로 trace 분모가 0이 되지 않는다.
Size1, N=n, B=0 문제는 실제 backend test가 여전히 필요하다.
Count scratch와 solve m0를 분리한 E7은 output overwrite와 용량을 혼동하지 않는다.
[Output status 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html)는
endpoint 근접 count failure와 넓은 구간 내 작은 cluster를 놓칠 수 있는 경우를 명시한다.
E6의 enclosure total n, monotone prefix/empty-prefix, safe bracket, multiplicity capacity,
returned count/Gram/full residual을 결합하는 방향은 이 한계를 숨기지 않는다.
Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정해서는 안 된다.
이 대조는 runtime 통과나 후속 numerical-control 값의 승인이 아니다.
## 재검토 범위
이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을
[controls C1~C7](numerical-review-controls.md)와
[27개 case·requirement matrix](numerical-review-cases.md)로 고정했다.
이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다.
- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/
full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch.
- Positive block reciprocal-condition limit, thickness central-inertia cancellation,
tiny nonzero director의 analytic rank 유지와 명시적 ill-conditioning failure.
- Operator-scale near-zero/negative/cluster classification, raw-value 보존과 endpoint ULP
margin, contour/precision/refinement, finite count/search/endpoint/solve-retry budget.
- Deterministic initial integer generator/seed/QR sign·rank 규칙, thread/runtime boundary,
n*m0/nnz/index overflow 및 count scratch/shifted factorization memory 검사.
- 필수 포트폴리오: affine M10와 위 curved moment, Jensen·rigid·density·source identity,
비축정렬/부분 BC/near-null/null dimension, 일반 Schur의 오삭제 반례,
실제 FEAST의 size1/N=n/zero/negative/repeated group>N/tight cluster/endpoint/
insufficient subspace/count mismatch/Gram rank/overflow/allocation failure.
- 요구사항 정합 후 coordinate-invariance coverage와 NR-MFE-001 사례의 정확한 판정 역할.
기존 K 수정, partial BC exclusion 또는 tolerance 완화로 임의 해결하지 않는다.
## 실행 evidence
다음 read-only 조사 명령은 exit `0`이었다. 원본 reference를 쓰거나 실행하지 않았다.
```powershell
Get-Content .codex/skills/fem-numerical-review/SKILL.md
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness|EvaluateGeometry' src/fesa/elements/mitc4_shell.cpp
rg -n 'CreateShell|nodal_frames|directors' src/fesa/elements/element_factory.cpp src/fesa/model/shell_geometry.cpp
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 90
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
`python -B -` read-only inventory script도 exit `0`: `pathlib`와 keyword별 state로
nodes/elements/Set-2를 세고, 모든 nonempty TXT row에 fullmatch regex
`Frame:\s*Mode\s+(\d+):\s*Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s*\(cycles/time\)`를
적용했다. `1..10` identity, finite positive Value, 104 unique boundary labels,
유일한 source step 및 input frequency data를 검사했다.
결과는 [reference-model](reference-model.md)의 inventory/hash와 같다.
필수 project/feature/skill reference 문서는 `Get-Content`와 scoped `rg`로 읽었다.
Web `open/find`로 위 공식 Intel 3개 page의 parameter/status/epsout을 확인했다.
Configured vault는 이번 자료의 readiness 조건이 아니므로 추가 조회를 요구하지 않았다.
External solver, production implementation, CMake/CTest, Harness, FEAST runtime 및
FESA-vs-reference 수치 비교는 단계 범위 밖이며 미실행이다.
Owner 경계 밖 파일·Hook state·reference artifact를 수정하거나 stage/commit하지 않았다.
Owned 3개 문서를 read-only `python -B -`로 metadata·상대 링크·trailing whitespace·
final newline·display-math delimiter 검사했다. Exit `0`, documents `3`, local links `35`,
issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python으로 재실행했고 exit `0`,
위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의
`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도
검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다.
## r2 독립 공변성 검산
새 [S1~S8](formulation-stabilization.md)는 초기 physical rotary block의 trace를
사용하므로 각 node의 orthogonal tangent 기저 변화와 SO(3) 회전에 불변이다.
Trace 평균은 PSD inventory에 zero가 있어도 같은 여덟 항을 포함하고, 기존 양의 inventory
전제에서 strictly positive다. Positive kd와 공통 director로 E3의 Kzz>0/Kpz=0을 유지한다.
Partial BC의 numerical contribution을 보존하므로 개선된 원 pencil의 reduction이다.
Nonlinear에서는 초기 scalar의 Dkd=D²kd=0이므로 기존 objective gamma의 first/second
variations에 같은 상수를 곱한다. Positive potential가 모든 상태의 Hessian SPD를 뜻하지
않으며 corotation coupling을 linear Td와 동일시하지 않는다. 기존 accepted branch·moment
work·state lifecycle과 [현재 nonlinear NR](../nonlinear-static-newton-raphson/numerical-review.md)을
대조했고 scale 개선 밖 physics 변경을 발견하지 않았다.
NR는 S7의 R block을 입력으로 재사용하지 않고, rectangle의 membrane/curvature/MITC
edge shear work를 직접 적분하여 **global 24×24 physical K를 독립 구성**했다.
기존 반례와 동일한 geometry에서 director 기반 tangent를 새로 생성해 trace scale을 계산하고
complete K/ML를 만들었다. 회전 뒤에도 새 geometry axes로 처음부터 적분했다.
정적 load는 d에 수직인 (5/3)b이고, 모든 full reaction을 Kq-F로 재계산했다.
실제 read-only command는 아래와 같으며 exit `0`, 약 `0.34 s`였다.
Production C++ 함수, vendor solver, reference 수치를 호출하지 않았다.
```powershell
@'
from math import sqrt, fsum
from fractions import Fraction as F
def dot(a,b): return fsum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def norm(v): return sqrt(dot(v,v))
def Rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
def tangent(d):
k=min(range(3),key=lambda k:(abs(d[k]),k))
a=tuple((1. if j==k else 0.)-d[k]*d[j] for j in range(3))
a=tuple(v/norm(a) for v in a)
return a,cross(d,a)
def action(K,v): return [dot(row,v) for row in K]
def rotate_vector(v): return [x for off in range(0,len(v),3) for x in Rz(v[off:off+3])]
def rotate_matrix(K):
cols=[rotate_vector(col) for col in zip(*K)]
left=[list(row) for row in zip(*cols)]
return [rotate_vector(row) for row in left]
def error(a,b): return norm([x-y for x,y in zip(a,b)])/(norm(a)+norm(b))
def matrix_error(A,B): return error(sum(A,[]),sum(B,[]))
def matrices(ex,ey,d):
# Independent planar polynomial work: membrane, curvature and MITC edge shear.
signs=[(-1,-1),(1,-1),(1,1),(-1,1)]
K=[[0.]*24 for _ in range(24)]
for xi in [-1/sqrt(3),1/sqrt(3)]:
for eta in [-1/sqrt(3),1/sqrt(3)]:
fields=[]
for sx,sy in signs:
Nx=sx*(1+sy*eta)/8.; Ny=sy*(1+sx*xi)/4.
tx=(1+sy*eta)/4.; ty=(1+sx*xi)/4.
for c in range(3): fields.append(([Nx*ex[c],Ny*ey[c],Ny*ex[c]+Nx*ey[c]],[0,0,0],[Nx*d[c],Ny*d[c]]))
for c in range(3): fields.append(([0,0,0],[Nx*ey[c],-Ny*ex[c],Ny*ey[c]-Nx*ex[c]],[tx*ey[c],-ty*ex[c]]))
for i,(mi,bi,si) in enumerate(fields):
for j,(mj,bj,sj) in enumerate(fields):
K[i][j]+=2*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj))
ta,tb=tangent(d); diagonals=[]
for i in range(4):
for t in [ta,tb]:
v=[0.]*24;v[6*i+3:6*i+6]=t
diagonals.append(dot(v,action(K,v)))
kd=fsum(diagonals)/8000.
M=[[0.]*24 for _ in range(24)]
for i in range(4):
for a in range(3):
M[6*i+a][6*i+a]=2.
for b in range(3):
K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b]
M[6*i+3+a][6*i+3+b]=((1. if a==b else 0.)-d[a]*d[b])/6.
return K,M,kd,diagonals
ex=(0.,1.,0.);ey=(-.8,0.,.6);d=(.6,0.,.8)
K,M,kd,diags=matrices(ex,ey,d)
Kr,Mr,kdr,diagsr=matrices(Rz(ex),Rz(ey),Rz(d))
load=[0.]*24; load[3:6]=[5*v/3 for v in ey]; loadr=rotate_vector(load)
q=[0.]*24;qr=[0.]*24;q[5]=load[5]/K[5][5];qr[5]=loadr[5]/Kr[5][5]
reaction=[x-y for x,y in zip(action(K,q),load)]; rr=[x-y for x,y in zip(action(Kr,qr),loadr)]
print('independent rotary diagonals=',diags)
print('kd=',kd,kdr,'expected=',float(F(19,4800)))
print('Kff/Mff/lambda/thetaZ=',K[5][5],M[5][5],K[5][5]/M[5][5],q[5])
print('rotated Kff/Mff/lambda/thetaZ=',Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5])
print('complete K/M/response/reaction covariance errors=',matrix_error(Kr,rotate_matrix(K)),matrix_error(Mr,rotate_matrix(M)),error(qr,rotate_vector(q)),error(rr,rotate_vector(reaction)))
print('load drill projection/free residual=',dot(d,load[3:6]),reaction[5],rr[5])
assert abs(K[5][5]/M[5][5]-float(F(10369,450)))<1e-12
assert matrix_error(Kr,rotate_matrix(K))<1e-12
assert matrix_error(Mr,rotate_matrix(M))<1e-12
assert error(rr,rotate_vector(reaction))<1e-12
'@ | python -B -
```
| 관찰 | 결과 |
| --- | --- |
| 독립 physical rotary diagonals | 각 corner 약 49/12,23/6 |
| kd before/after | 0.003958333333333333 / 0.003958333333333332 |
| Kff, Mff | 1.3825333333333332, 0.05999999999999998 |
| lambda before/after | 둘 다 23.04222222222223 |
| thetaZ per unit moment before/after | 둘 다 0.7233098659465717 |
| Complete K covariance ratio | 7.895168813539929e-17 |
| ML covariance ratio | 4.6611822355981756e-17 |
| Static response covariance ratio | 0 |
| Full reaction covariance ratio | 1.1535337419041683e-16 |
| d dot load / both free residuals | 1.1102230246251565e-16 / 0,0 |
따라서 NR-MFE-001은 **r2 수학 계약에서 해소**되었다. C2/C3/C7 기준을 만족하는
독립 계산 evidence이고 실제 C++/FEAST/기존 정적 회귀의 통과 판정은 아니다.
## r2 보존·변경 audit와 근거
`git diff c8876da --`로 r1 checkpoint와 r2 requirements/research/formulation을 대조했다.
M1/M2/M5~M10, E6~E8, V1~V4의 식은 유지되고 변경은 scale·그 적용 대상·coordinate
coverage와 정적 회귀다. r1 rational mass oracle와 API count/trace·reference identity는
수식 영향이 없어 재계산 없이 재사용한다. Reference 두 SHA-256도 현재 원본에서 재확인했다.
AGENTS, agent/documentation 계약, NR skill 및 TOLERANCE의 같은 checkpoint 대비 diff는 없다.
기존 linear/nonlinear numerical-review/reference-model, r2 requirements 27개와
Research R07을 읽었고, 필요한 current nonlinear tangent test의 perturbation schedule을
확인했다. 최초 검색의 존재하지 않는 `numerical-methods.md` 및
`tests/fesa/elements/nonlinear_mitc4_shell_test.cpp`는 경로 오류였다.
`rg --files`로 실제 `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`를
확인하고 scoped `rg`를 exit `0`으로 재실행했다. 이를 test 실행 실패 또는 성공으로
취급하지 않는다. Source/test 파일은 변경하지 않았다.
새로 확인한 vendor 사실은 thread-local 설정/복원뿐이며
[Intel 2026.0 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)를
2026-09-06 `search_query/open/find`로 확인했다. FEAST count/trace/API는 r1의 primary
근거를 재사용했다. 수치 기준의 선택·단위·근거·zero branch는
[controls](numerical-review-controls.md), 요구별 falsifiable coverage는
[cases](numerical-review-cases.md)에 있고 변경한 외부 tolerance는 없다.
## r2 최종 정적 검증
2026-09-06 workspace root에서 PowerShell here-string을 `python -B -`에 전달한
read-only audit의 실제 exit는 `0`이다. `pathlib`의 UTF-8 읽기, Markdown 상대 링크의
`urllib.parse.unquote`, requirement/case ID의 정규식 집합 대조, `hashlib.sha256`,
위 r2 재현 코드의 `subprocess.run([sys.executable,'-B','-'], ...)`를 사용했다.
문서 owner/revision·마지막 newline·trailing whitespace·표 내부 code span의 pipe escape도
함께 검사했다. 실제 stdout은 다음과 같다.
```text
AUDIT documents=5 local_links=64 requirements=27 cases=27 static_artifacts=8 all_pass
```
문서에서 추출한 공변성 재현 코드의 별도 process exit도 `0`이며 위 표의 모든 수치를
재현했다. 지정 input/TXT의 SHA-256은 reference-model의 두 값과 일치했다.
초기 audit의 exit `1`은 Python 기본 cp949 decode와 링크의 `%20`을 실제 경로로
해석하지 않은 audit-script 문제였다. 명시적 UTF-8과 URL decoding으로 수정해 재실행했으며
제품·reference·수치 기준을 변경하지 않았다.
`git diff --check` exit `0`을 확인했다. 소유 변경은 이 evidence와 numerical-review,
reference-model, controls, cases의 Markdown 5개이며 `coordination.md`의 동시 변경은
Coordinator 소유다. 본 단계에서 C++ build/test, FEAST runtime, 외부 solver 실행,
새 reference comparison은 수행하지 않았다. 이 필수 실행은 case matrix에 따라
Implementation이 새 binary와 r2 계약으로 증명해야 한다.
+792 -13
View File
@@ -1,7 +1,13 @@
# MITC4 질량·FEAST 독립 수치 검토
# 이전 MFE 검산·반례·수치 기준
독립 rational 검산·NR-MFE-001 반례와 당시 판정을 보존한다. 과거 수치 기준을 새 baseline에 자동 적용하지 않는다.
<a id="numerical-review"></a>
<a id="numerical-review--mitc4-질량feast-독립-수치-검토"></a>
## MITC4 질량·FEAST 독립 수치 검토
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 요청 outcome: `pass`
- Next owner: `io-definition-agent`
@@ -10,18 +16,19 @@
- 의미: 수학·numerical controls·logical reference readiness의 I/O 인계 요청. Workflow 전이는 Coordinator 소유다.
필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[requirements](requirements.md), [requirements evidence](requirements-evidence.md),
[research](research.md), [research evidence](research-evidence.md),
[formulation](formulation.md)과 연결된 mass/eigen/verification/stabilization 상세 문서다.
[requirements](requirements.md#requirements), [requirements evidence](requirements.md#requirements-evidence),
[research](research.md#research), [research evidence](research.md#research-evidence),
[formulation](formulation.md#formulation)과 연결된 mass/eigen/verification/stabilization 상세 문서다.
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md),
[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md),
[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)를 적용했다.
## Blocking finding
<a id="numerical-review--blocking-finding"></a>
### Blocking finding
현재 unresolved blocking finding은 없다. **NR-MFE-001의 r1 실패는 보존하고 r2 수학 계약에서
해소되었음을 독립 확인했다.** 사용자 승인 MFE-ADR-007에 따라 초기 physical rotary trace
평균을 사용하는 [S1~S8](formulation-stabilization.md)을 검토했다. Positive inventory,
평균을 사용하는 [S1~S8](formulation.md#formulation-stabilization)을 검토했다. Positive inventory,
기저·좌표 공변성, partial-BC numerical contribution, linear massless decoupling 및
nonlinear frozen objective potential의 경계가 일관된다.
@@ -30,12 +37,13 @@ shear work를 직접 적분했다. 동일 물리 URZ-only BC의 Z축 45° 회전
`lambda=23.04222222222223`, 단위 tangent moment의 `thetaZ=0.7233098659465717`로 같다.
Complete K/ML/response/reaction covariance error는 각각
`7.90e-17 / 4.66e-17 / 0 / 1.15e-16`이다.
[원래 실패·r2 독립 재계산과 실제 명령](numerical-review-evidence.md)을 보존한다.
[원래 실패·r2 독립 재계산과 실제 명령](numerical-review.md#numerical-review-evidence)을 보존한다.
Actual C++/FEAST 실행을 대신한 판정은 아니다.
## 고정한 수치·검증 계약
<a id="numerical-review--고정한-수치검증-계약"></a>
### 고정한 수치·검증 계약
- [Controls C1~C7](numerical-review-controls.md)에 V1~V6의 단위·scale·zero branch와
- [Controls C1~C7](numerical-review.md#numerical-review-controls)에 V1~V6의 단위·scale·zero branch와
matrix/mass/null/conditioning/full residual/Gram/energy/rigid/density/coordinate 기준을
고정했다. Physical rank는 analytic BC/director intersection으로만 정하고 tiny positive
mass는 삭제하지 않는다. Frobenius residual 외 operator-scale residual도 필수다.
@@ -43,7 +51,7 @@ Actual C++/FEAST 실행을 대신한 판정은 아니다.
전체 `512` count calls/`3` solve attempts 상한을 같은 상세 문서에 고정했다.
Enclosure/empty-prefix/count/solve-count/Gram/독립 residual을 결합하며 count만으로
무조건 lowest-N completeness를 주장하지 않는다. 요청 N은 항상 `.inp` authority다.
- [필수 cases와 27개 requirement coverage](numerical-review-cases.md)는 독립 mass oracle,
- [필수 cases와 27개 requirement coverage](numerical-review.md#numerical-review-cases)는 독립 mass oracle,
lumping refinement, partial BC/near-null/반례 해소, actual FEAST known spectra,
negative/zero/repeated/cluster/endpoint/capacity/failure, I/O/state 및 기존 static 회귀를
포함한다. 정확한 tests/owned paths/TDD commands는 Planning에 인계한다.
@@ -58,7 +66,8 @@ r2 식의 변경 영향을 확인해 재사용했다. 같은 실험을 새로
Reference 두 SHA-256은 r2에서도 일치한다. 원본·upstream·source/test/build/phase/Hook/Git를
수정하지 않았고 다른 owner 변경을 보존했다.
## Handoff와 잔여 위험
<a id="numerical-review--handoff와-잔여-위험"></a>
### Handoff와 잔여 위험
I/O는 고정된 quantity·source/mode/frame·backend/mass·failure 의미와 numerical controls를
minimum syntax 및 additive persistent schema에 연결한다. Planning/Implementation은
@@ -67,8 +76,778 @@ case matrix의 관찰된 RED, 전체 configured MSVC x64 Debug suite, actual FEA
이후 Physics/Release가 같은 r2 evidence를 독립 평가한다.
이번 단계의 수학 계산과 문서 정적 검증은 실제 `python -B -`/`git diff --check` exit `0`으로
확인했고 상세 결과는 [evidence](numerical-review-evidence.md)에 있다.
확인했고 상세 결과는 [evidence](numerical-review.md#numerical-review-evidence)에 있다.
CMake/CTest·Harness·외부 solver·FEAST runtime·FESA reference comparison은 이 stage에서
미실행이다. Ill-conditioned thin/near-aligned mass의 명시적 실패, sampling 밖 geometry
injectivity, FEAST floating-point count/cluster 한계 및 shifted fill/peak memory는
기록된 적용 한계다. 이 한계를 숨기는 cutoff·fallback·tolerance 완화는 허용하지 않는다.
<a id="numerical-review-evidence"></a>
<a id="numerical-review-evidence--mitc4-독립-수치-검토-evidence"></a>
## MITC4 독립 수치 검토 evidence
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 검토일 / web access date: `2026-09-06`
<a id="numerical-review-evidence--nr-mfe-001-직접-계산-반례"></a>
### NR-MFE-001 직접 계산 반례
이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은
아래 [r2 공변성 검산](numerical-review.md#numerical-review)에 있다. 기존 실패를 통과로 소급 변경하지 않는다.
관련 원문은 [requirements](requirements.md#requirements)의 `002`(기존 kernel 유지),
`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance
evidence)와 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)다.
실제 [kernel](../../src/fesa/elements/mitc4_shell.cpp)의
`PhysicalTransformation20`(line 488), `DrillingTransformation4`(505),
`Stiffness`의 minimum tangent diagonal(633~653)을 읽기 전용으로 대조했다.
다음은 production 함수를 재호출한 expected value가 아니라 평판 다항식의 직접 적분이다.
Tangent axes `a=(0,1,0)`, `b=(-4/5,0,3/5)`, normal `d=(3/5,0,4/5)`를 둔다.
Node 순서는 `X1=-2a-b`, `X2=2a-b`, `X3=2a+b`, `X4=-2a+b`다.
`a×b=d`, 면적 8, 두께 1이고 constant director·positive Jacobian의 직사각형이다.
단일 element의 geometry-derived director와도 같다. `E=12, nu=0, rho=1`로 둔다.
모든 DOF를 고정하되 node1의 global `URZ` 하나만 free로 한다.
직사각형 `Lx=4,Ly=2`에서 `integral Nx² dA=1/6`,
`integral Ny² dA=2/3`, `|integral Nx Ny dA|=1/4`이다.
`D=Et³/[12(1-nu²)]=1`, `G=6`이며 MITC tying으로 각 nodal rotary
shear square integral은 `A/12`다. 따라서 각 node의 tangent rotary physical block은
\[
R=\begin{bmatrix}49/12&\pm1/8\\\pm1/8&23/6\end{bmatrix},
\quad j=\rho t^3A/48=1/6,\quad k_d=10^{-3}(23/6).
\]
Off-diagonal 부호는 corner의 `Nx Ny` 부호에 따라 달라지고 두 부호 모두 존재한다.
Global `eZ`의 tangent 성분은 `(0,3/5)`이고 drilling 성분은 `4/5`다.
Free mass는 `j(1-dZ²)=0.06>0`이므로 E2는 이 DOF를 삭제하지 않는다.
이 1차원 constrained pencil의 정확한 유한 eigenvalue는
\[
\lambda=\frac{(9/25)(23/6)+(16/25)k_d}{(9/25)(1/6)}
=23+(32/3)k_d.
\]
이제 전체 geometry를 global Z축으로 45° 회전한다. Free axis `eZ`와 모든 나머지
fixed subspace는 그대로이므로 동일 물리 BC가 계속 지원 component BC로 표현된다.
새 director는 `(3/(5 sqrt2),3/(5 sqrt2),4/5)`다. Least-aligned global-axis 규칙의
새 tangent와 회전 전 tangent 사이의 cosine/sine은 `-5/sqrt41,-4/sqrt41`이다.
모든 corner의 두 tangent diagonal 중 최소는 `937/246`으로 달라진다.
Physical `eZ^T Kphys eZ`와 질량은 불변이지만 `kd'=10^-3(937/246)`다.
| 값 | 회전 전 | 회전 후 |
| --- | ---: | ---: |
| `kd` | `0.0038333333333333336` | `0.003808943089430893` |
| `lambda` | `23.04088888888889` | `23.040628726287263` |
상대 차이는 `1.1291343961675893e-5`다. Tangent tie가 반대 axis를 선택해도
모든 corner/두 tangent diagonal의 minimum은 같다. 좌표변환으로 constraints를 바꾼
오류, input explicit director/MPC 기능, mass cutoff 또는 FEAST 오차를 이용한 반례가 아니다.
크기가 외부 tolerance보다 작다는 사실은 내부 coordinate-invariance 항등식의 근거가 아니다.
실행 명령은 아래 read-only here-script, `python -B -`, exit `0`이었다.
```powershell
@'
from math import sqrt
from fractions import Fraction as F
def dot(a,b): return sum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def rot(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
d=(.6,0,.8); a=(0.,1.,0.); b=cross(d,a)
Raa=F(49,12); Rbb=F(23,6); Rab=F(1,8); j=F(1,6)
k0=.001*min(Raa,Rbb)
dp=rot(d); ap0=(1-dp[0]**2,-dp[0]*dp[1],-dp[0]*dp[2])
ap=tuple(v/sqrt(dot(ap0,ap0)) for v in ap0)
u=dot(ap,rot(a)); v=dot(ap,rot(b))
diags=[float(Raa)*u*u+float(Rbb)*v*v+2*c*u*v for c in [-float(Rab),float(Rab)]]
diags += [float(Raa)*v*v+float(Rbb)*u*u-2*c*u*v for c in [-float(Rab),float(Rab)]]
k1=.001*min(diags)
l0=float(Rbb/j)+k0*.64/(float(j)*.36)
l1=float(Rbb/j)+k1*.64/(float(j)*.36)
print(float(k0),k1,l0,l1,abs(l1-l0)/l0)
assert abs(l1-l0)>1e-6
'@ | python -B -
```
이 계산은 기존 C++ kernel 실행 evidence가 아니다. 기존 승인 수식과 source의 계수
규칙이 갖는 mathematical counterexample이다. Runtime 회귀 test는 이후 Planning 소유다.
<a id="numerical-review-evidence--비충돌-수학-검토"></a>
### 비충돌 수학 검토
아래 표는 r1의 검토 기록이다. Mass·geometry·unit·BC·whitening·FEAST의 비충돌 항목은
r2 영향 확인 후 재사용한다. E3의 scalar는 r2 S1로 바뀌며 positivity/decoupling의 재검토와
V5의 complete K/partial-BC 해소는 아래 별도로 기록한다.
| 대상 | 독립 검토 결과와 한계 |
| --- | --- |
| M1/M2 | `S=-[d]x`이므로 `S theta=theta×d`; global DOF `[u,theta]`와 20↔24 transformation의 부호가 일치한다. Shear factor는 mass에 들어가지 않는다. |
| M3~M5 | `C0/C1/C2` 차원은 `M/ML/ML²`; symmetric cross block은 transpose 관계다. Trilinear map의 J degree≤(2,2,2), integrand≤(4,4,4)이므로 3×3×3의 degree5 정확성이 충분하다. |
| Consistent positivity | Positive weights/J에서 quadratic form=0이면 모든 27점에서 Hq=0. Hq는 각 자연좌표 degree≤1이므로 다항식 자체가 0이다. z=0에서 bilinear 독립성으로 모든 ui=0, z 계수에서 `Si theta_i=0`. Null은 정확히 네 drilling이며 physical20은 PD다. |
| M6~M8 | Scalar moment row-sum→nodal block은 partition of unity와 일치한다. Thickness points가 서로 달라 strict Cauchy–Schwarz이고 central inertia>0, rank5다. Tiny nonzero director component를 0으로 만드는 근거는 없다. |
| M9/M10 | Jensen 차이의 1/2 double sum과 kinetic-energy의 추가 1/2를 구분한 식이 맞다. Total mass·spatial first moment·allocated thickness moments는 보존하지만 일반 orbital inertia나 consistent spectrum은 보존하지 않는다. |
| Geometry | 기존 `EvaluateGeometry`는 실제 J>0와 finite reciprocal/frame을 검사한다. 추가 27점에도 같은 predicate를 적용하면 그 점의 부적합을 거부한다. Stiffness 8점과 validation을 바꾸지 않는다. 기존 8점만 통과한 input의 mass failure는 감추지 않으며 전역 injectivity/warp 허용 확대를 주장하지 않는다. |
| E1/E2 | Length congruence의 단위는 맞다. 실제 global free space와 director null의 교집합으로 null dimension을 정하는 조건은 정확하다. Partial BC의 full-rank local mass는 허용되며 near-null은 conditioning failure와 구분해야 한다. |
| E3/E4 | 공통 director와 element별 positive nodal scalar kd로 `KZ=Z diag(kappa)`, `Kpz=0`, `Kzz>0`이 성립한다. Partial BC에 남는 kd를 제거하면 원 pencil을 바꾼다. 일반 Schur 예제의 5/2 대 단순 삭제의 3은 옳고 general dense fallback은 필요하지 않다. |
| E5/E8 | `Mp=LL^T`, `A=L^-1 Kp L^-T`, `phi=DCP L^-T x`는 exact congruence다. Identity B의 FEAST도 actual lumped 문제다. Mass normalization 단위, constrained exact zero 및 candidate commit 의미가 맞다. |
| V1~V4 | 원 assembled free `Kf y-lambda Mf y`를 복원 후 검산해야 null 복원 오류를 잡는다. Mixed-unit norm을 직접 섞지 않고 zero denominator branch를 정의한 식은 일관된다. Gram/energy/residual은 lowest-N completeness를 대신하지 않는다. |
| Rigid/density | 기존 tangent-projected rigid field는 continuum interpolation의 rigid motion을 재현한다. Massless drilling과 6 physical rigid modes는 다르다. Density scaling과 repeated-group projector 정의는 일관된다. Eigen coordinate suite의 적용 범위는 NR-MFE-001 해결 전 확정하지 않는다. |
<a id="numerical-review-evidence--독립-mass-oracle"></a>
### 독립 mass oracle
`rho=3,t=1/2`에서 아래 kernel-level geometry/director fixture를 사용했다.
이는 현재 input의 explicit normal 기능을 추가하는 제안이 아니다. Unit rational directors와
warped coordinates를 이용한 독립 moment 적분 사례다. 전체 patch input 생성이나 기존
geometry validator 실행을 대신하지 않는다.
```text
X = [(-1,-1,1/10), (1,-1,-1/10), (1,1,1/5), (-1,1,-1/10)]
d = [(0,0,1), (3/5,0,4/5), (2/3,1/3,2/3), (0,3/5,4/5)]
```
`fractions.Fraction`으로 coefficient dictionary `(xi power,eta power,zeta power)`를
만들고 M1의 trilinear map을 미분·determinant 전개했다. Monomial integral은 홀수 차수면
0, 모든 차수가 짝수면 `8/[(p+1)(q+1)(r+1)]`다. Production shape/J/mass 함수를
호출하지 않았다. 이 exact rational 결과를 별도의 3-point 및 2-point Gauss 평가와 대조했다.
실제 read-only here-script `python -B -`, exit `0`, wall time 약 `0.52 s`였다.
| 관찰 | 결과 |
| --- | --- |
| 실제 maximum integrand degree | `(4,4,4)` |
| 27점 J 범위 | `[0.12859919221615254, 0.27013414111718076]` |
| 3-point 최대 scalar entry absolute error | `1.1102230246251565e-16` |
| 2-point 최대 scalar entry absolute error | `0.0006018518518518257` |
| `C0_11, C1_11, C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` |
| `sum mi, sum hi, sum ji` | `7743/1600`, `739/12000`, `517/5120` |
| First moment, two independent rational expressions exactly equal | `(-79747/360000, -685951/2880000, 49651/320000)` |
| Minimum nodal `ji-hi²/mi` | `0.022318161338791092 > 0` |
Independent row-sum oracle는 다음과 같으며 C1의 강제 zero나 flat rotary 비례식을 잡는다.
```text
m = [298/225, 1759/1440, 6211/5760, 2333/1920]
h = [3191/192000, 1061/72000, 337/24000, 9323/576000]
j = [5969/216000, 8807/345600, 155527/6912000, 779/30720]
```
현재 수치값은 정식화의 독립 계산 evidence다. C++ test 통과, reference spectrum 통과 또는
양의 J가 전체 volume에서 보장된다는 실행 결과로 바꾸지 않는다.
<a id="numerical-review-evidence--feast-독립-source-대조"></a>
### FEAST 독립 source 대조
Intel C 2026.0 URL edition의 [parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)를
2026-09-06 재확인했다. `fpm[49]=1`은 CSR interval의 total count를 `m0`로 반환하고 flag를
reset한다. Stochastic estimate라는 설명은 없다. 다른 standalone FEAST의 옵션 번호나
확률적 count 설명을 이 API에 대입하지 않는다. 값의 conditioning-independent 정확성은
문서가 보장하지 않으므로 이것만으로 implementation completeness를 승인하지 않는다.
[API의 epsout 정의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)는
trace 변화량을 endpoint absolute maximum으로 나눈다. 따라서 strict nonzero-width
finite interval이면 zero eigenvalue만 있다는 이유로 trace 분모가 0이 되지 않는다.
Size1, N=n, B=0 문제는 실제 backend test가 여전히 필요하다.
Count scratch와 solve m0를 분리한 E7은 output overwrite와 용량을 혼동하지 않는다.
[Output status 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html)는
endpoint 근접 count failure와 넓은 구간 내 작은 cluster를 놓칠 수 있는 경우를 명시한다.
E6의 enclosure total n, monotone prefix/empty-prefix, safe bracket, multiplicity capacity,
returned count/Gram/full residual을 결합하는 방향은 이 한계를 숨기지 않는다.
Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정해서는 안 된다.
이 대조는 runtime 통과나 후속 numerical-control 값의 승인이 아니다.
<a id="numerical-review-evidence--재검토-범위"></a>
### 재검토 범위
이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을
[controls C1~C7](numerical-review.md#numerical-review-controls)와
[27개 case·requirement matrix](numerical-review.md#numerical-review-cases)로 고정했다.
이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다.
- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/
full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch.
- Positive block reciprocal-condition limit, thickness central-inertia cancellation,
tiny nonzero director의 analytic rank 유지와 명시적 ill-conditioning failure.
- Operator-scale near-zero/negative/cluster classification, raw-value 보존과 endpoint ULP
margin, contour/precision/refinement, finite count/search/endpoint/solve-retry budget.
- Deterministic initial integer generator/seed/QR sign·rank 규칙, thread/runtime boundary,
n*m0/nnz/index overflow 및 count scratch/shifted factorization memory 검사.
- 필수 포트폴리오: affine M10와 위 curved moment, Jensen·rigid·density·source identity,
비축정렬/부분 BC/near-null/null dimension, 일반 Schur의 오삭제 반례,
실제 FEAST의 size1/N=n/zero/negative/repeated group>N/tight cluster/endpoint/
insufficient subspace/count mismatch/Gram rank/overflow/allocation failure.
- 요구사항 정합 후 coordinate-invariance coverage와 NR-MFE-001 사례의 정확한 판정 역할.
기존 K 수정, partial BC exclusion 또는 tolerance 완화로 임의 해결하지 않는다.
<a id="numerical-review-evidence--실행-evidence"></a>
### 실행 evidence
다음 read-only 조사 명령은 exit `0`이었다. 원본 reference를 쓰거나 실행하지 않았다.
```powershell
Get-Content .codex/skills/fem-numerical-review/SKILL.md
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness|EvaluateGeometry' src/fesa/elements/mitc4_shell.cpp
rg -n 'CreateShell|nodal_frames|directors' src/fesa/elements/element_factory.cpp src/fesa/model/shell_geometry.cpp
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 90
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
`python -B -` read-only inventory script도 exit `0`: `pathlib`와 keyword별 state로
nodes/elements/Set-2를 세고, 모든 nonempty TXT row에 fullmatch regex
`Frame:\s*Mode\s+(\d+):\s*Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s*\(cycles/time\)`를
적용했다. `1..10` identity, finite positive Value, 104 unique boundary labels,
유일한 source step 및 input frequency data를 검사했다.
결과는 [reference-model](reference-model.md)의 inventory/hash와 같다.
필수 project/feature/skill reference 문서는 `Get-Content`와 scoped `rg`로 읽었다.
Web `open/find`로 위 공식 Intel 3개 page의 parameter/status/epsout을 확인했다.
Configured vault는 이번 자료의 readiness 조건이 아니므로 추가 조회를 요구하지 않았다.
External solver, production implementation, CMake/CTest, Harness, FEAST runtime 및
FESA-vs-reference 수치 비교는 단계 범위 밖이며 미실행이다.
Owner 경계 밖 파일·Hook state·reference artifact를 수정하거나 stage/commit하지 않았다.
Owned 3개 문서를 read-only `python -B -`로 metadata·상대 링크·trailing whitespace·
final newline·display-math delimiter 검사했다. Exit `0`, documents `3`, local links `35`,
issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python으로 재실행했고 exit `0`,
위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의
`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도
검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다.
<a id="numerical-review-evidence--r2-독립-공변성-검산"></a>
### r2 독립 공변성 검산
새 [S1~S8](formulation.md#formulation-stabilization)는 초기 physical rotary block의 trace를
사용하므로 각 node의 orthogonal tangent 기저 변화와 SO(3) 회전에 불변이다.
Trace 평균은 PSD inventory에 zero가 있어도 같은 여덟 항을 포함하고, 기존 양의 inventory
전제에서 strictly positive다. Positive kd와 공통 director로 E3의 Kzz>0/Kpz=0을 유지한다.
Partial BC의 numerical contribution을 보존하므로 개선된 원 pencil의 reduction이다.
Nonlinear에서는 초기 scalar의 Dkd=D²kd=0이므로 기존 objective gamma의 first/second
variations에 같은 상수를 곱한다. Positive potential가 모든 상태의 Hessian SPD를 뜻하지
않으며 corotation coupling을 linear Td와 동일시하지 않는다. 기존 accepted branch·moment
work·state lifecycle과 [현재 nonlinear NR](../nonlinear-static-newton-raphson/numerical-review.md)을
대조했고 scale 개선 밖 physics 변경을 발견하지 않았다.
NR는 S7의 R block을 입력으로 재사용하지 않고, rectangle의 membrane/curvature/MITC
edge shear work를 직접 적분하여 **global 24×24 physical K를 독립 구성**했다.
기존 반례와 동일한 geometry에서 director 기반 tangent를 새로 생성해 trace scale을 계산하고
complete K/ML를 만들었다. 회전 뒤에도 새 geometry axes로 처음부터 적분했다.
정적 load는 d에 수직인 (5/3)b이고, 모든 full reaction을 Kq-F로 재계산했다.
실제 read-only command는 아래와 같으며 exit `0`, 약 `0.34 s`였다.
Production C++ 함수, vendor solver, reference 수치를 호출하지 않았다.
```powershell
@'
from math import sqrt, fsum
from fractions import Fraction as F
def dot(a,b): return fsum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def norm(v): return sqrt(dot(v,v))
def Rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
def tangent(d):
k=min(range(3),key=lambda k:(abs(d[k]),k))
a=tuple((1. if j==k else 0.)-d[k]*d[j] for j in range(3))
a=tuple(v/norm(a) for v in a)
return a,cross(d,a)
def action(K,v): return [dot(row,v) for row in K]
def rotate_vector(v): return [x for off in range(0,len(v),3) for x in Rz(v[off:off+3])]
def rotate_matrix(K):
cols=[rotate_vector(col) for col in zip(*K)]
left=[list(row) for row in zip(*cols)]
return [rotate_vector(row) for row in left]
def error(a,b): return norm([x-y for x,y in zip(a,b)])/(norm(a)+norm(b))
def matrix_error(A,B): return error(sum(A,[]),sum(B,[]))
def matrices(ex,ey,d):
# Independent planar polynomial work: membrane, curvature and MITC edge shear.
signs=[(-1,-1),(1,-1),(1,1),(-1,1)]
K=[[0.]*24 for _ in range(24)]
for xi in [-1/sqrt(3),1/sqrt(3)]:
for eta in [-1/sqrt(3),1/sqrt(3)]:
fields=[]
for sx,sy in signs:
Nx=sx*(1+sy*eta)/8.; Ny=sy*(1+sx*xi)/4.
tx=(1+sy*eta)/4.; ty=(1+sx*xi)/4.
for c in range(3): fields.append(([Nx*ex[c],Ny*ey[c],Ny*ex[c]+Nx*ey[c]],[0,0,0],[Nx*d[c],Ny*d[c]]))
for c in range(3): fields.append(([0,0,0],[Nx*ey[c],-Ny*ex[c],Ny*ey[c]-Nx*ex[c]],[tx*ey[c],-ty*ex[c]]))
for i,(mi,bi,si) in enumerate(fields):
for j,(mj,bj,sj) in enumerate(fields):
K[i][j]+=2*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj))
ta,tb=tangent(d); diagonals=[]
for i in range(4):
for t in [ta,tb]:
v=[0.]*24;v[6*i+3:6*i+6]=t
diagonals.append(dot(v,action(K,v)))
kd=fsum(diagonals)/8000.
M=[[0.]*24 for _ in range(24)]
for i in range(4):
for a in range(3):
M[6*i+a][6*i+a]=2.
for b in range(3):
K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b]
M[6*i+3+a][6*i+3+b]=((1. if a==b else 0.)-d[a]*d[b])/6.
return K,M,kd,diagonals
ex=(0.,1.,0.);ey=(-.8,0.,.6);d=(.6,0.,.8)
K,M,kd,diags=matrices(ex,ey,d)
Kr,Mr,kdr,diagsr=matrices(Rz(ex),Rz(ey),Rz(d))
load=[0.]*24; load[3:6]=[5*v/3 for v in ey]; loadr=rotate_vector(load)
q=[0.]*24;qr=[0.]*24;q[5]=load[5]/K[5][5];qr[5]=loadr[5]/Kr[5][5]
reaction=[x-y for x,y in zip(action(K,q),load)]; rr=[x-y for x,y in zip(action(Kr,qr),loadr)]
print('independent rotary diagonals=',diags)
print('kd=',kd,kdr,'expected=',float(F(19,4800)))
print('Kff/Mff/lambda/thetaZ=',K[5][5],M[5][5],K[5][5]/M[5][5],q[5])
print('rotated Kff/Mff/lambda/thetaZ=',Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5])
print('complete K/M/response/reaction covariance errors=',matrix_error(Kr,rotate_matrix(K)),matrix_error(Mr,rotate_matrix(M)),error(qr,rotate_vector(q)),error(rr,rotate_vector(reaction)))
print('load drill projection/free residual=',dot(d,load[3:6]),reaction[5],rr[5])
assert abs(K[5][5]/M[5][5]-float(F(10369,450)))<1e-12
assert matrix_error(Kr,rotate_matrix(K))<1e-12
assert matrix_error(Mr,rotate_matrix(M))<1e-12
assert error(rr,rotate_vector(reaction))<1e-12
'@ | python -B -
```
| 관찰 | 결과 |
| --- | --- |
| 독립 physical rotary diagonals | 각 corner 약 49/12,23/6 |
| kd before/after | 0.003958333333333333 / 0.003958333333333332 |
| Kff, Mff | 1.3825333333333332, 0.05999999999999998 |
| lambda before/after | 둘 다 23.04222222222223 |
| thetaZ per unit moment before/after | 둘 다 0.7233098659465717 |
| Complete K covariance ratio | 7.895168813539929e-17 |
| ML covariance ratio | 4.6611822355981756e-17 |
| Static response covariance ratio | 0 |
| Full reaction covariance ratio | 1.1535337419041683e-16 |
| d dot load / both free residuals | 1.1102230246251565e-16 / 0,0 |
따라서 NR-MFE-001은 **r2 수학 계약에서 해소**되었다. C2/C3/C7 기준을 만족하는
독립 계산 evidence이고 실제 C++/FEAST/기존 정적 회귀의 통과 판정은 아니다.
<a id="numerical-review-evidence--r2-보존변경-audit와-근거"></a>
### r2 보존·변경 audit와 근거
`git diff c8876da --`로 r1 checkpoint와 r2 requirements/research/formulation을 대조했다.
M1/M2/M5~M10, E6~E8, V1~V4의 식은 유지되고 변경은 scale·그 적용 대상·coordinate
coverage와 정적 회귀다. r1 rational mass oracle와 API count/trace·reference identity는
수식 영향이 없어 재계산 없이 재사용한다. Reference 두 SHA-256도 현재 원본에서 재확인했다.
AGENTS, agent/documentation 계약, NR skill 및 TOLERANCE의 같은 checkpoint 대비 diff는 없다.
기존 linear/nonlinear numerical-review/reference-model, r2 requirements 27개와
Research R07을 읽었고, 필요한 current nonlinear tangent test의 perturbation schedule을
확인했다. 최초 검색의 존재하지 않는 `numerical-methods.md` 및
`tests/fesa/elements/nonlinear_mitc4_shell_test.cpp`는 경로 오류였다.
`rg --files`로 실제 `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`를
확인하고 scoped `rg`를 exit `0`으로 재실행했다. 이를 test 실행 실패 또는 성공으로
취급하지 않는다. Source/test 파일은 변경하지 않았다.
새로 확인한 vendor 사실은 thread-local 설정/복원뿐이며
[Intel 2026.0 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)를
2026-09-06 `search_query/open/find`로 확인했다. FEAST count/trace/API는 r1의 primary
근거를 재사용했다. 수치 기준의 선택·단위·근거·zero branch는
[controls](numerical-review.md#numerical-review-controls), 요구별 falsifiable coverage는
[cases](numerical-review.md#numerical-review-cases)에 있고 변경한 외부 tolerance는 없다.
<a id="numerical-review-evidence--r2-최종-정적-검증"></a>
### r2 최종 정적 검증
2026-09-06 workspace root에서 PowerShell here-string을 `python -B -`에 전달한
read-only audit의 실제 exit는 `0`이다. `pathlib`의 UTF-8 읽기, Markdown 상대 링크의
`urllib.parse.unquote`, requirement/case ID의 정규식 집합 대조, `hashlib.sha256`,
위 r2 재현 코드의 `subprocess.run([sys.executable,'-B','-'], ...)`를 사용했다.
문서 owner/revision·마지막 newline·trailing whitespace·표 내부 code span의 pipe escape도
함께 검사했다. 실제 stdout은 다음과 같다.
```text
AUDIT documents=5 local_links=64 requirements=27 cases=27 static_artifacts=8 all_pass
```
문서에서 추출한 공변성 재현 코드의 별도 process exit도 `0`이며 위 표의 모든 수치를
재현했다. 지정 input/TXT의 SHA-256은 reference-model의 두 값과 일치했다.
초기 audit의 exit `1`은 Python 기본 cp949 decode와 링크의 `%20`을 실제 경로로
해석하지 않은 audit-script 문제였다. 명시적 UTF-8과 URL decoding으로 수정해 재실행했으며
제품·reference·수치 기준을 변경하지 않았다.
`git diff --check` exit `0`을 확인했다. 소유 변경은 이 evidence와 numerical-review,
reference-model, controls, cases의 Markdown 5개이며 `coordination.md`의 동시 변경은
Coordinator 소유다. 본 단계에서 C++ build/test, FEAST runtime, 외부 solver 실행,
새 reference comparison은 수행하지 않았다. 이 필수 실행은 case matrix에 따라
Implementation이 새 binary와 r2 계약으로 증명해야 한다.
<a id="numerical-review-controls"></a>
<a id="numerical-review-controls--mitc4-eigen-내부-수치-기준"></a>
## MITC4 eigen 내부 수치 기준
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증.
[V1~V6](formulation.md#formulation-verification), [E1~E8](formulation.md#formulation-eigen),
[S1~S8](formulation.md#formulation-stabilization)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부
수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통
tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다.
<a id="numerical-review-controls--c1-scale-공통-zero-branch와-근거"></a>
### C1. Scale, 공통 zero branch와 근거
`ell`, `D`, `Khat/Mhat`, `Kf/Mf`, `A`, `s`, `B=A/s`는 E1/E6대로 사용한다.
같은 비교의 두 행렬에는 같은 ell을 적용한다. Matrix norms는 Frobenius,
vector norms는 Euclidean이며 별도 inf 표기만 infinity norm이다. Mixed force/moment 또는
translation/rotation 원값을 직접 더하지 않는다. Scaled sum-of-squares와 stable ordered sum을
쓰고 finite-first로 검사한다. 모든 ratio는 분모가 양수일 때 계산한다.
`numerator=denominator=0`은 metric 0, `denominator=0,numerator!=0`은 named failure다.
Zero eigenvector, nonpositive modal mass 및 invalid scale은 이 zero-pass의 대상이 아니다.
어떤 branch에도 `max(1,physical_scale)`, mass/eigenvalue floor나 clamp를 추가하지 않는다.
공통 기본값은 `tau_alg=1e-12`, `tau_modal=1e-10`이다. 기존
[linear NR-D02](../linear-static-mitc4-shell/numerical-review.md)의 algebraic/rigid 기준을
유지하며 mass polynomial과 trace의 같은 단위 항등식에도 적용한다.
Unit roundoff `u=2^-53`에서 `gamma_k=ku/(1-ku)`이다. 4096개의 단순 연산을 가정한
`gamma_4096≈4.55e-13`에 비해 `1e-12`는 작은 dense block·27점 적분의 정상 산술 오차를
구분할 여유가 있다. 이는 모든 geometry의 forward-error theorem이 아니다.
Rank·conditioning·원 residual·독립 oracle를 따로 요구한다. 현재 rational oracle 및
r2 covariance 오차는 이 기준보다 충분히 작지만 기준을 그 결과에 맞춰 고른 것은 아니다.
`tau_modal`은 `1e-12` 내부 FEAST stopping보다 100배 큰 후검증 한계다.
외부 1% 판정을 내부 residual 허용값으로 쓰지 않는다. 같은 계산의 재실행 구조/row/
diagnostic 순서는 exact이고, eigenvector의 repeated-basis 비유일성은 C4를 따른다.
<a id="numerical-review-controls--c2-matrix-mass-stabilization와-reduction"></a>
### C2. Matrix, mass, stabilization와 reduction
| ID | Metric / exact predicate | 한계·zero 처리 |
| --- | --- | --- |
| C2-01 | V1 `eta_sym(Q)`; mass·physical K·linear complete K·whitened A | `<=1e-12`; Q=0이면 C1. 대칭 copy 자체만 독립 evidence로 사용하지 않음 |
| C2-02 | V1 `\|\|R-S\|\|F/(\|\|R\|\|F+\|\|S\|\|F)`; congruence, moment→matrix, 직접 적분, Cholesky reconstruction | `<=1e-12`; 단위·같은 scale 필수 |
| C2-03 | Scalar moment entry oracle: `\|Ck_ij-Ck*_ij\|/[m_e(t/2)^k]` | k=0,1,2 각각 `<=1e-12`; positive `m_e=integral rho dV`. Exact C1=0도 이 차원 일치 scale로 검사 |
| C2-04 | Mass total `\|m-m*\|/(\|m\|+\|m*\|)`; uniform translation energy | `<=1e-12`; 각 방향을 따로 검사, trace(Muu)를 총질량으로 쓰지 않음 |
| C2-05 | Shifted spatial first moment difference divided by `m_e ell` | `<=1e-12`; 한 source node를 공통 Xref로 사용. `hi di` 포함 |
| C2-06 | M9 difference vs independent pairwise integral / `(q^T ML q+q^T MC q)` | absolute mismatch `<=1e-12`; raw Delta/scale `>=-1e-12`. Zero motion/drill-only는 C1. Negative roundoff를 값을 0으로 바꾸는 데 사용하지 않음 |
| C2-07 | V2 mass-null action, MZ, KZ | 각각 `<=1e-12`; nz=0은 N/A. 정확한 analytic null만 대상 |
| C2-08 | `\|\|P^T Z\|\|F`, `\|\|[P Z]^T[P Z]-I\|\|F/sqrt(nf)` | `<=1e-12`; 각 node basis의 해당 norm도 `<=1e-12` |
| C2-09 | `mi>0,ji>0,ji-hi²/mi>0`; consistent physical20 및 모든 nonempty Mp nodal block Cholesky | strict, finite. Zero/negative pivot·variance는 실패. Consistent rank20/lumped rank5는 analytic expected rank로 검증 |
| C2-10 | `\|(ji-hi²/mi)-integral rho Ni(z-hi/mi)²dV\|/(ji+hi²/mi)` | `<=1e-12`; `vi/ell²`, `\|hi\|/sqrt(mi ji)`도 기록하며 별도 rank cutoff로 쓰지 않음 |
| C2-11 | S2 여덟 초기 rotation diagonals | 모두 finite `>=0`, 하나 이상 `>0`; zero 포함 분모8. `kd>0` finite. Negative를 허용오차로 0 처리하지 않음 |
| C2-12 | `\|kd'-kd\|/(\|kd'\|+\|kd\|)` 및 직접 trace oracle | `<=1e-12`; global 회전/독립 tangent 재생성 후 계산. Trial별 frozen kd는 exact unchanged |
| C2-13 | E3 `Kzz=diag(kappa_i)`, `kappa_i=sum incident kd,e` | 각 kappa finite `>0`, expected diagonal relation C2-02; Kpz 검사와 원 free residual을 함께 요구 |
| C2-14 | Scaled constrained component norm V3 | `0` exact; 복원한 source constrained entries도 exact zero |
Positive/null dimension은 **E2의 constrained director component exact-zero 교집합**으로만
정한다. Constrained director의 tiny nonzero 성분을 축정렬이라고 반올림하지 않는다.
각 nonempty dimension≤6 scaled nodal Mp에
`rcond_inf = 1/(||Mp||inf ||Mp^-1||inf) >= 2^-32 = 2.3283064365386963e-10`
을 요구한다. 작은 block의 Cholesky triangular solves로 inverse action norm을 구하며
global inverse는 만들지 않는다. Product overflow를 피하는 동치 ratio로 계산한다.
이 조건은 physical rank 변경이 아니라 binary64 whitening의 numerical admissibility다.
64 연산의 `gamma_64/rcond`를 약 `3.06e-5` 이하로 제한하는 최소 guard이며
모든 eigenvalue의 상대 정확도를 보장하지 않는다. Cholesky reconstruction과 full modal
residual을 통과해야 한다. 한계 미만·unresolvable estimate는 conditioning failure이고
좌표 삭제, 더 큰 mass, 다른 solver로 우회하지 않는다. 빈 nodal block은 skip하지만
global n=0 또는 요청 N>n은 명시적 failure다.
<a id="numerical-review-controls--c3-eigenpair-및-물리-내부-판정"></a>
### C3. Eigenpair 및 물리 내부 판정
계산된 c개 **전체** eigenpair를 검사한 뒤 첫 N개만 공개한다. V3/V4의 actual M은 ML다.
| ID | Metric | 한계 |
| --- | --- | --- |
| C3-01 | V1 full original free residual `eta_r`; V3 whitened `eta_w` | 각각 `<=1e-10` |
| C3-02 | 추가 operator-scale residual `rho_B=\|\|Bx-mu x\|\|2/\|\|x\|\|2` | `<=1e-10`; dimensionless. Frobenius norm의 크기로 오류가 희석되는 것을 방지 |
| C3-03 | V3 `eta_norm,i`, pairwise `eta_orth,ij`, `eta_G` | 각각 `<=1e-10`; positive mass를 먼저 확인. Gram full rank는 이 bound와 독립 column 수로 확인 |
| C3-04 | V4 energy/Rayleigh consistency `eta_energy,i` | `<=1e-10`; zero lambda도 C1/V4 분모 사용 |
| C3-05 | V5 rigid K action | 각 6개 field `<=1e-10`; physical rigid mass Gram는 Cholesky 성공, vector 수6. Drill과 혼동하지 않음 |
| C3-06 | `\|c_rho lambda_i'-lambda_i\|/s` 또는 coordinate `\|lambda_i'-lambda_i\|/s` | `<=1e-10`; repeated group 내부 pairing은 C4. 동일 물리 BC·loads 사용 |
| C3-07 | Exact known-spectrum test eigenvalue error / known s | `<=1e-10`이고, 알려진 인접 distinct gap이 있으면 absolute error도 `<=gap/8` |
| C3-08 | Simple/반복군 C4 projector error V5 | `<=1e-6`; 테스트의 해당 군과 나머지 spectrum 사이 known gap은 `>=1e-3 s`로 선택 |
C3-02는 symmetric B에서 computed mu가 실제 spectrum으로부터 residue norm 이내에
있다는 직접 spectral-decomposition bound를 사용한다. 가장 낮은 mode인지, 올바른
multiplicity인지는 증명하지 않으므로 C5 count/endpoint evidence가 별도로 필수다.
FEAST의 `res`는 backend diagnostic이고 C3의 독립 residual을 대신하지 않는다.
Zero eigenvalue에서 backend relative-residual의 분모가 0이면 해당 diagnostic은 unavailable로
기록하고 이유를 남긴다. Raw e/x, 자체 metric 및 최종 scalar 결과는 finite여야 한다.
Undefined backend diagnostic을 physical residual=0으로 바꾸거나 mandatory finite 결과에
NaN을 저장하지 않는다. Trace `epsout`은 strict interval에서 finite여야 한다.
Raw `mu=lambda/s`에서 `tau_zero=1e-9`, `tau_cluster=1e-8`로 고정한다.
`mu<-tau_zero`는 유의한 negative spectrum으로 procedure failure,
`|mu|<=tau_zero`는 near-zero classification, 그 외 양수는 positive다.
Boundary equality는 near-zero에 포함한다. Returned lambda는 부호와 raw 수치를 보존한다.
양수에서만 frequency를 파생하고 exact zero는 f=0, 작은 음수에서는 실수 frequency를
만들지 않는다. C3-02보다 10배 큰 near-zero band와 100배 큰 cluster band는 수치 분류용이다.
양의 작은 mode를 제거하거나 N을 세는 방식에 쓰지 않는다. s/λ의 nonfinite 또는
nonzero mu의 λ 환산 underflow-to-zero는 실패하고 physical scale을 1로 바꾸지 않는다.
<a id="numerical-review-controls--c4-repeated-subspace와-결정론"></a>
### C4. Repeated subspace와 결정론
Raw lambda 오름차순의 stable sort, exact equal tie는 original solver column 순서다.
인접 `|lambda_i-lambda_(i-1)|/s<=1e-8`의 connected group은 diagnostic cluster일 뿐,
distinct 값을 merge/평균하거나 vector를 섞을 권한이 아니다. 알려진 exact repeated 군의
density/rotation tests에서 V5의 mass-whitened projector norm을 사용한다.
Known gap≥1e-3 s와 C3-02이면 first-order invariant-subspace sensitivity는 약1e-7
수준이므로 C3-08의 1e-6은 방향 비유일성을 허용하면서 잘못된 공간을 검출한다.
이 조건 밖 실제 cluster는 raw eigenpair·Gram/residual을 계속 검사하고 특정 개별 vector
방향의 정확도를 새로 약속하지 않는다. Mode shape 외부 comparison은 없다.
Source DOF 순서로 largest absolute scaled global component를 찾고 sign을 양수로
정한다. 동률은 첫 source DOF다. Zero vector는 실패다. 동일 binary/runtime/thread/입력의
세 반복에서는 sparse structure·COO reduction·row/diagnostic identity가 exact 동일해야 한다.
Scalar 재현 오차는 C3-06, repeated vector는 C4를 적용한다. CPU/runtime를 바꾼 bitwise
eigenvalue/vector equality를 요구하지 않는다.
<a id="numerical-review-controls--c5-feast-controls와-bounded-interval-정책"></a>
### C5. FEAST controls와 bounded interval 정책
Actual call은 `dfeast_scsrgv`, `(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR다.
각 call은 `feastinit`하고 아래 C-index fpm을 설정한다. 명시하지 않은 값은 해당 설치의
초기값을 유지·기록한다. Private backend를 넘어 vendor type을 노출하지 않는다.
| fpm | 값 | 근거·역할 |
| --- | ---: | --- |
| `[0]` | 0 | Status를 deterministic diagnostic으로 수집 |
| `[1]` | 16 | 공식 허용 contour 값; 기본8보다 적분 resolution에 여유, 모든 attempt 고정 |
| `[2]` | 12 | `1e-12` double stopping; 독립 C3 residual 필수 |
| `[3]` | 20 | 유한 refinement 한계; 미수렴 성공 금지 |
| `[4]` | 1 | 아래 고정 initial subspace 사용 |
| `[5]` | 1 | Endpoint-scaled trace stopping; zero mode에서 C3-02로 독립 검증 |
| `[13]` | 0 | Eigenpairs가 아닌 subspace-only 결과 금지 |
| `[26]`, `[27]` | 1, 1 | CSR validity와 second-matrix SPD check |
| `[49]` | count 1, solve 0 | Total interval count와 실제 eigenpair solve 분리 |
| `[63]` | 0 | 초기 PARDISO 정책 사용; 임의 iparm tuning 금지 |
근거는 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)과
[E7의 API/status 출처](formulation.md#formulation-eigen--e7-feast-경계와-deterministic-실행)다.
Count는 documented total이며 stochastic estimate로 부르지 않는다. 공식 count/status의
floating-point 한계가 있으므로 아래 redundant evidence와 실제 known spectra가 필수다.
Gershgorin 각 off-diagonal absolute sum은 매 덧셈 뒤 `nextafter(+infinity)`로 outward
누적한다. `Bii-ri`/`Bii+ri`도 각각 바깥으로 한 ULP 이동한다. Overflow는 실패다.
`beta=||B||inf`를 같은 outward 방식으로 구한다. Nonzero B에서는 beta>0;
정확한 B=0은 E6의 algorithmic enclosure `[-1,1]`에 대응하여 beta=1로 둔다.
이는 physical mass/λ floor가 아니다. `ulp(v)`는 v의 두 finite adjacent spacing 중 큰 값이며
`delta(v)=1e-8 beta + 64 ulp(v)`
로 정의한다. 초기 endpoints는 `a0=nextafter(gL-16delta(gL),-infinity)`,
`b0=nextafter(gU+16delta(gU),+infinity)`다. Finite strict enclosure와 total count=n을
확인한 뒤 E6의 upper-prefix search와 empty-prefix lower 축소를 한다.
Interior endpoint v를 bracket에 반영하려면 `(a0,v-delta(v))`, `(a0,v)`,
`(a0,v+delta(v))`의 count가 모두 `info=0`이고 같아야 한다. 이 guard count는 eigenvalue
근처의 endpoint를 피하는 추가 evidence다. Guard가 enclosure 밖이면 그 부분은 알려진
outside bound를 이용하며 실제 interval이 strict하지 않으면 평가하지 않는다.
Zero count는 성공 count=0일 때만 믿고 `info=1`을 empty proof로 바꾸지 않는다.
이미 알려진 prefix count와 monotonicity가 맞지 않으면 전체 실패다.
| 제어 | 유한 값 / 정확한 처리 |
| --- | --- |
| Total count API calls | 전체 analysis 최대512. 성공·실패·guard·최종확인·retry 모두 포함 |
| Search optimization | Upper/lower 각각 최대32 midpoint 단계; optimization count calls 최대384로 남은128 예약 |
| Endpoint collision | 같은 midpoint에서 offsets `0,+1,-1,+2,-2,+4,-4` times delta, 이 순서 최대7후보. 현재 bracket 내부 후보만 사용 |
| Search 종료 | E6의 count target `N<=c<=min(n,2N+8)` 또는 폭 `<=8delta(mid)`/새 representable midpoint 없음/위 budget. 마지막 certified c>=N bracket 사용 |
| 최종 확인 | Enclosure 안의 a에 prefix0, b에 prefix c>=N, 두 endpoint guard, actual `(a,b)` count=c. 불일치/예약 budget 부족이면 실패 |
| Initial solve capacity | E6 그대로 `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n |
| Actual solve calls | 최초 포함 최대3; 각 call loops≤20, control/seed 동일 |
| 허용 solver retry | info1/2/3, count/returned-m mismatch 또는 endpoint separation failure만. 저장된 더 넓은 certified bracket으로 확대·재count, `m0=min(n,max(new formula,2*previous m0))` |
| Retry bracket 순서 | Upper search에 저장된 현재 b보다 큰 성공 b를 오름차순으로 선택, lower는 이전의 더 작은 certified prefix0 또는 a0; 최종 fallback은 원 enclosure |
| 금지 retry | Nonfinite eigenpair, wrong Gram/residual, negative spectrum, invalid/SPD/index/allocation/inner-solver 오류는 즉시 실패. Seed·mass·solver·threshold 변경 금지 |
새 유효 bracket이 없으면 같은 실패 call을 무조건 반복하지 않는다. Optimization 한계에서는
이미 certified enclosure를 사용할 수 있지만 실제 solve·최종 count가 실패하면 부분 결과를
공개하지 않는다. Returned m=c, interval 내부와 `mu-a>=delta(a)`, `b-mu>=delta(b)`,
모든 c columns C3 통과를 확인한다. N번째가 cluster 내부여도 전체 c를 검사하고 출력은 N개다.
Bounds·prefix/guard/status/count/m0/m/loop/epsout·chosen ranks 및 모든 실패를 보존한다.
후속 tolerance 완화나 reference Value를 bounds 설정에 사용하는 것은 금지한다.
<a id="numerical-review-controls--c6-initial-subspace-thread와-storage"></a>
### C6. Initial subspace, thread와 storage
Count scratch는 E7의 conservative n×n, identity initial x다. 실제 solve에서 m0=n도
identity다. m0<n이면 uint64 recurrence를 column-major로 한 entry마다 한 번 실행한다.
Seed `0x4D495443344D4645`, `z <- 6364136223846793005*z+1442695040888963407 mod 2^64`,
`x=2*(double(z>>11)*2^-53)-1`이다. Overflow wrap은 이 generator에만 의도적이며
size/index 산술에는 허용하지 않는다. Seed를 바꾸며 성공을 찾지 않는다.
Column ascending의 nonpivoted Householder QR를 사용한다. Scaled norm, `sign(0)=+1`,
`v1=x1+sign(x1)||x||`로 cancellation을 피하고 최종 R diagonal이 양수인 Q를 선택한다.
Original column norm에 대한 `|Rjj|/||input_col_j||2<=1e-12` 또는 zero는 initial-space
rank failure다. Post-QR `||Q^TQ-I||F/sqrt(m0)<=1e-12`를 요구한다. 이것은 모든
eigenspace overlap의 보장이 아니며 C5 count와 C3 Gram/residual이 계속 필요하다.
Backend call 동안 oneMKL thread-local count=1을 설정하고 모든 exit에서 이전 값을 복원한다.
[공식 mkl_set_num_threads_local](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의
반환 previous setting을 사용한다. 전역 설정을 바꾸거나 vendor workspace를 동시 공유하지
않는다. 설치 runtime/ABI/유효 thread count·seed·controls를 기록한다. Element contribution
병렬 생성은 허용하되 stable reduction 순서는 유지한다.
Mode cap을 임의의 상수로 만들지 않는다. 정량 representation 경계는
`1<=N<=n<=MKL_INT_MAX`, `nnz+1<=MKL_INT_MAX`, 모든 row/column in-range,
`n+1`, `6*nodes`, `n*m0`, `n*n`, 각 `count*sizeof(T)`가 internal index 및
`min(SIZE_MAX,PTRDIFF_MAX)` 안에 있고 해당 container max_size를 넘지 않는 것이다.
곱/합은 overflow 전에 검사하며 double의 정수 근삿값으로 capacity를 계산하지 않는다.
Conservative double n×n scratch는 Win64에서 표현상 n≤`1073741823`이고 실제 사용 가능
메모리 한계는 훨씬 작다. Allocation/factorization 실패는 명시적으로 종료하며 N을 줄이지 않는다.
Reference n=3125의 count x만 `78,125,000` bytes다. 이를 전체 peak memory라고 부르지 않고
CSR, FEAST reduced storage 및 complex shifted sparse fill을 따로 기록한다.
<a id="numerical-review-controls--c7-승인된-정적-회귀-기준"></a>
### C7. 승인된 정적 회귀 기준
새 scale을 적용하되 기존 [linear NR](../linear-static-mitc4-shell/numerical-review.md)의
symmetry/frame/energy `1e-12`, rigid/full residual/global equilibrium `1e-10`을 유지한다.
NR-MFE-001 static response는 C2 congruence `1e-12`와 complete full residual `1e-10`이다.
Static moment admissibility는 기존 `|d·m|/||m||<=1e-12`, zero moment는 별도 branch다.
기존 [nonlinear NR §6](../nonlinear-static-newton-raphson/numerical-review.md)는 그대로다:
rotation/frame 및 no-applied-moment tangent symmetry `1e-12`, directional tangent error
`1e-6`(zero analytical direction `1e-10`), finite-rigid objectivity `1e-10`, factor-one
global force/moment balance 각 `1e-8`. 기존 finite-difference schedule
`[1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7]` 및 interior index3 기준을 유지한다.
근거는 [등록된 tangent test](../../tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp)와
기존 승인 numerical contract다. 새 scale의 Dkd=D²kd=0 및 gamma derivative를 검산한다.
Nonlinear Hessian 전체의 SPD 또는 linear Tdrill과의 entry equality를 추가하지 않는다.
NSNR-069/070의 네 채널·typed zero-scale·100 iteration·no cutback/retry 종료 정책도
기존 계약을 보존한다. 새 eigen C1 zero branch로 해당 승인 typed absolute branch를 덮어쓰지 않는다.
<a id="numerical-review-cases"></a>
<a id="numerical-review-cases--mitc4-eigen-필수-verification-portfolio"></a>
## MITC4 eigen 필수 verification portfolio
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 수치 기준: [controls C1~C7](numerical-review.md#numerical-review-controls)
아래는 Planning이 RED→observed failure→GREEN→focused/full VERIFY에 연결할 **필수
logical cases**다. C++ test 이름·파일과 final schema는 각 owner가 정한다. 새로운 reference
생성/수정 없이 synthetic test inputs는 tests의 승인 소유 경로에 둔다. Expected value를
production mass/reduction/FEAST 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다.
<a id="numerical-review-cases--p1-mass좌표조립"></a>
### P1. Mass·좌표·조립
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C01 | Affine rectangle `4×2`, rho=3, t=1/2, parallel unit director. M10: C0=`(rho t A/36)*[4,2,1,2;...]`, C1=0, C2=t²C0/12, node m=3, h=0, j=1/16. Full24와 physical20·각 translation energy·tangent inertia/drill null을 검사. rho×4, t×2의 C0/C2 scaling도 검사 | C2 모든 관련 scalar/matrix/rank 기준 |
| MFE-C02 | [r1 rational warped/director-varying fixture](numerical-review.md#numerical-review-evidence--독립-mass-oracle)의 X,d,rho,t와 exact coefficient/row/first-moment oracle. Independent coefficient integration 또는 별도 고차 direct integration을 사용. C1을 강제0, 2-point mass, flat C2 비례식 mutation은 실패해야 함. 같은 shape/J production 호출만으로 oracle 구성 금지 | C2-02~10; 기존 geometry predicate를 먼저 적용. Custom-director kernel fixture를 input explicit normals 지원으로 확대하지 않음 |
| MFE-C03 | Consistent/moment snapshot을 유지하고 row-sum→lumped 연결 검사. C1/C2의 controlled symmetric perturbation이 원 mass와 derived block에 모두 반영됨. Independent nodal `integral rho Ni Gi^T Gi` 및 고정 velocities의 pairwise Jensen work와 비교. Uniform translation, drill-only, nonuniform translation, tangent rotation을 각각 검사 | C2-02~10; nonnegative kinetic energy, zero branch 및 총질량·centroid 보존 |
| MFE-C04 | Square `[-1,1]^2`, rho=t=1, uniform m×m grid m=1,2,4, velocity `(x,0,0)`, theta=0. Direct polynomial gives `q^T MC q=4/3`, `q^T(ML-MC)q=8/(3m²)`. Independent constant velocity의 두 energy는 모두 총질량4 | Exact sequence에 C2-03/04/06. 이는 이 smooth field의 lumping error 검산이며 일반 spectrum 수렴 차수 약속 아님 |
| MFE-C05 | C01/C02의 global proper rotation과 origin translation. Q는 rational proper rotation `[[0,-1,0],[3/5,0,-4/5],[4/5,0,3/5]]`, shift=(7,-3,5). Geometry/director/frame/mass를 새로 계산. Scalar full-row lumping이 실패하는 d=(1,1,1)/sqrt3도 사용 | 두 mass congruence와 kinetic work C2-02; moment는 common Xref, drilling null 보존 |
| MFE-C06 | 공유 node·서로 다른 rho/thickness section의 shell patch. Element 순서와 source labels가 다른 입력의 대응 결과, sequential/병렬 contribution 및 stable reduction을 검사. 실제 constraints와 source indices를 독립 expected map으로 대조 | Exact structure/order/identity, C2 matrix equality. Input permutation 자체와 fixed source-order determinism을 구분 |
| MFE-C07 | rho=0/negative/NaN/Inf/missing/duplicate/unresolved/dependent, invalid t/material, inverted/degenerate/기존 미지원 geometry 및 27점 중 invalid evaluation을 각각 거부. Density가 없는 기존 static case는 허용 | Semantic/geometry/model failure, 상태·output 미반영. Mass zero 우회 금지 |
<a id="numerical-review-cases--p2-stabilizationpartial-bc정적-영향"></a>
### P2. Stabilization·partial BC·정적 영향
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례)와 Z45° 회전. S1을 새 frame에서 계산. Expected kd=19/4800, Mff=3/50, Kff=10369/7500, lambda=10369/450. 모든 DOF fixed, node1 URZ만 free. Old min rule은 이 case를 실패시켜야 함 | Complete K·두 mass·kd congruence C2, exact eigenvalue C3-07, 원 free residual. Full-free/clamp 대체 금지 |
| MFE-C09 | C08에 admissible moment `m=(5/3)M0 b`, M0=1, b=(-4/5,0,3/5). 각 geometry에서 load도 변환. Expected thetaZ=7500/10369. 원 full `Kq-F`의 모든 reaction 성분을 회전해 비교 | C7 static response/full residual/reaction covariance, physical moment projection<=1e-12 |
| MFE-C10 | Eight diagonal inventory `[0,0,2,4,0,6,0,4]`이면 kref=2,kd=.002. All-zero, 한 negative, NaN/Inf는 failure. DBL_MAX 근방 양성 inventory는 scaled mean이 가능한 경우 finite; subnormal kd underflow는 failure. Independent node별 tangent changes O angles=(0,pi/6,pi/4,pi/3)에서도 trace 동일 | C2-11/12; 분모8 고정, clamp/positive-only mean/min 금지 |
| MFE-C11 | Free affine element와 smooth patch의 세 rigid translation·세 tangent-projected rigid rotation. Pure drill은 별도 4개. Physical K20 rank14, consistent physical mass rank20, complete K24 rank18/nullity6; positive-space dimension20. Full massless reduction 후 six near-zero physical modes가 남음 | C2/C3 analytic rank·rigid K action·mass Gram; drill에 관성을 주거나 physical zero mode 삭제 금지 |
| MFE-C12 | 기존 nonlinear fixture에서 초기 scale=S1, trial/commit/rollback에 exact unchanged. 기존 objective gamma potential의 first/second directional variations, finite rigid motion, linear physical limit, physical recovery 제외와 reaction conversion | [기존 nonlinear 계약](../nonlinear-static-newton-raphson/numerical-review.md) 및 C7. Trial scale 재선정·nonlinear Hessian SPD·linear Td entry equality를 요구하지 않음 |
<a id="numerical-review-cases--p3-실제-bcmass-whiteningfeast"></a>
### P3. 실제 BC·mass whitening·FEAST
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C13 | Nodal M6 h=0,m=j=1의 manufactured block. d=(0,0,1), d=(3/5,0,4/5), d=(1,1,1)/sqrt3에 full free, URX fixed, URZ only free, all rotations fixed, drill-only free, fully constrained 조합. 조합은 Cartesian product가 아니라 지원되는 global component BC로 표현 가능한 경우만 적용하며, drill-only free는 d=(0,0,1)에서 URZ만 free이고 나머지5 DOF constrained인 경우로 한정한다(MPC 없음). Expected null은 constrained director 성분의 exact-zero 교집합. Mixed nodes에는 local finite rank0가 있어도 다른 finite node 보존 | E2 analytic dimension, C2-07~14, recovered source mask. Global n=0 또는 N>n은 failure |
| MFE-C14 | `d=(2p/(1+p²),0,(1-p²)/(1+p²))`, p=1/2000와1e-8. m=j=1,h=0; URX만 fixed, 세 translation과 URY/URZ free. 첫 case positive rank5와 conditioning pass; 두 번째는 여전히 analytic rank5이나 conditioning/Cholesky failure. p=0은 정확한 null1 | C2 rcond cutoff의 양옆 및 exact equality branch. Tiny positive mass를 rank4로 바꾸는 구현은 실패 |
| MFE-C15 | 독립 singular pencil K=[[6,2],[2,4]], M=diag(2,0)에서 finite lambda=5/2,z=-p/2. 단순 삭제의3은 오답. Production shell projection path에 nonzero Kpz 또는 nonpositive Kzz 주입 시 실패. 일반 dense Schur 기능을 구현할 필요 없음 | Original residual oracle와 E3 admissibility rejection, 임의 fallback 금지 |
| MFE-C16 | SPD nodal whitening `M=[[2,1],[1,2]]`, `K=[[6,4],[4,6]]`의 eigenvalues 2,10/3. Dense inverse 없이 congruence·복원·original-M normalization. 같은 eigenvectors에 틀린 lambda·mass variant·null coordinate/constraint를 각각 주입 | C2/C3, injected wrong pairing/mass/full residual이 실패해야 함 |
| MFE-C17 | Actual FEAST diagonal known spectra: n1 λ=2,N1; `[0,0,0,2,5,9]`에 N1/4/6; `[1,2,4,8]` N1/2/4; n4 all-zero N1/4. 요청 N은 별도 input count이고 count output과 분리 | C3/C5, lowest N/multiplicity/zero/N=n, count/guard/solve history; mock만으로 대체 금지 |
| MFE-C18 | Actual FEAST n64 spectrum: 앞40개 λ=1, 나머지 λ=2..25, N1 및N41. n4 tight spectrum `[1,1+2^-28,1+2^-27,8]`, N2. B=Q diag(lambda) Q^T의 dense-pattern test도 추가; Q는 고정 Givens(pi/6,pi/4) 곱 | C3-07/08, repeated group>N에서 c/m0가 N보다 커짐, 전체 c Gram, partial cluster merge 금지 |
| MFE-C19 | Actual backend에 `[ -2,0,3 ]`, `[ -1e-12,0,1 ]`. Backend raw negative 보존; procedure는 첫 spectrum의 유의한 음수 실패, near-zero negative는 classification·frequency-validity/raw 보존. Exact `±tau_zero*s` 및 그 양옆은 arithmetic/injection 경계 test | C3 분류와 실패 보존. 부적합 물리 K를 accepted shell이라고 주장하지 않음 |
| MFE-C20 | Density×4에서 두 M×4, λ/4, normalized vector amplitude 1/2; C08과 simple/repeated known-spectrum fixture 사용. 길이×1024, rho/1024³,E/1024,t×1024의 일관 단위 변환에서도 λ 불변 | C2/C3/C4; baseline s·same physical BC, 단위 mixing/floor 검출 |
| MFE-C21 | Endpoint=eigenvalue collision, prefix0 반환, nonmonotone count, total!=n, m!=c, info1/2/3/4/-1..-5/200..202·invalid fpm, missing/duplicate/nonfinite CSR, B-not-SPD를 각각 주입. QR rank/Gram failure·insufficient capacity·nonfinite pair·wrong residual도 주입 | C5의 정확한 retry 대상·budget/최종 failure. Error를 empty interval 또는 부분 성공으로 바꾸지 않음 |
| MFE-C22 | 실제 operator에 near endpoint/repeated cluster의 C5 history 검증과 adapter-mock count-call512/solve-call3 최대 경계, budget 직전 certified bracket fallback. Index/nnz+1/n²/n*m0 overflow 및 allocation 실패 injection | 정수 exact checks, 유한 종료, controlled failure. 큰 메모리를 실제 할당해 실패시킬 필요 없음 |
MFE-C17/18 actual FEAST case에서 bounds를 expected eigenvalues로 설정하지 않는다.
Production E6/C5 search를 실행하고 independent diagonal spectrum의 prefix count와
postsolve 결과로 history를 검증한다. Synthetic rotated pencil은 sparse CSR에 전 dense
pattern을 저장할 수 있지만 다른 eigensolver로 expected values를 계산하지 않는다.
False count/solve success가 lowest-N를 검증하지 못하는 mock도 포함해 missing low eigenpair를
Gram/residual만으로 성공시키는 경로를 잡는다.
<a id="numerical-review-cases--p4-ioreference운영-closure"></a>
### P4. I/O·reference·운영 closure
| Case ID | 필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C23 | 원본 input의 density/section mapping·S4/S4R common physical path·Step-2/N10·blank bounds·Lanczos/SIM/acoustic-free no-op·mass normalization. Unsupported fields, prior step/preload, nonzero BC, damping/acoustic/mixed elements는 fail-closed | I/O가 fixed syntax allowlist·진단으로 구체화. Source count와 actual FEAST count/backend 구분 |
| MFE-C24 | Source renumbering과 output self-check; logical mode/source identity·lambda dimension·actual mass/backend·candidate를 HDF5에서 복원. 기존 final hash/accepted state를 준비하고 solve/validation/write/close/replace failure 주입 | 정확한 schema는 I/O 소유. 모든 failure에서 계약 범위의 이전 state/final 보존, log는 별도 lifecycle |
| MFE-C25 | [새 eigen reference](reference-model.md) 10개 Value, 10 singleton families, comparator prechecks/1% RMS·5% row·near-zero·zero-scale inclusive 경계. Equal values의 distinct IDs와 reordered TXT는 허용, missing/extra/duplicate/NaN/Inf/wrong quantity/mass/schema는 실패 | 공통 policy 그대로, 모든 Value blocking. Actual FESA fresh binary 결과로 실행 |
| MFE-C26 | 아래 기존 linear/nonlinear static portfolio·configured 전체 regression suite·새 warning 없음. Density 없는 기존 static, source mapping·partial-BC response·Newton objective/tangent·평형·reaction·energy·rollback | C7와 기존 reference identity/policy. Old kd 수치 equality는 대체하되 다른 기준 유지 |
| MFE-C27 | RED가 변경 동작 때문에 실패했는지 확인, GREEN/focused/full MSVC x64 Debug CMake/CTest 실제 exit, actual FEAST/backend identity, fresh reference timestamps/hashes. 세 반복 구조/order/diagnostic 및 scalar 재현성 | C4, 전27개 requirement evidence 및 동일 r2 Physics/Release closure. 누락·실패·stale를 통과 처리 금지 |
기존 정적 포트폴리오의 원본 목록은
[Requirement evidence](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity)와
[현재 nonlinear reference-model](../nonlinear-static-newton-raphson/reference-model.md)이다.
`shell`/`shellNL`/`shellNL-meshfine`의 해당 `.inp`와 같은 폴더의 원본
`<stem> displacements.csv`, nonlinear의 required review-only reactions를 그대로 사용한다.
Linear `shell-s4`와 `shell-s4-linear-limit`는 같은 input의 서로 다른 검토 역할이며
같은 fresh solve를 재사용할 수 있어도 각 identity/회귀 증거를 생략하지 않는다.
U1/U2/U3는 global length blocking, UR1/UR2/UR3는 fixed-initial global rotation-vector
warning-only이며 같은 step/accepted state·case·dimension·coordinates·impact별 공통 family다.
Nonlinear RF1/RF2/RF3와 physical spatial RM1/RM2는 기존 source-key·finite·inventory 및
error/RMS report를 유지하는 review-only다. RM3/stress는 기존 numerical gate에 넣지 않는다.
Factor-one 내부 force/moment equilibrium은 별도 blocking이고 C7를 따른다.
`shellnl-meshfine-02-s4-final`의 post-closure 역할은 그대로 유지하며 등록 suite의 해당
실행·영향 evidence를 기록한다. 과거 세 case의 closure로 소급 합치지 않는다.
Root가 관찰한 중단 baseline/단독 재현/나머지 pressure tests는 새 binary 전체 suite의
성공 evidence가 아니다. Reference 테스트의 HDF5 cache가 이전 library보다 새롭다는
이유로 옛 solve를 재사용하지 않았는지 확인하고, r2 영향을 받는 final comparison은 새 binary의
fresh solve evidence로 남긴다. Reference input/results를 수정하거나 Hook state를 조작하지 않는다.
<a id="numerical-review-cases--requirement-coverage"></a>
### Requirement coverage
아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다.
Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md#requirements)가 원본이다.
| Requirement suffix | 필수 cases |
| --- | --- |
| 001 | MFE-C23, MFE-C25 |
| 002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 |
| 003 | MFE-C06, MFE-C07, MFE-C23 |
| 004 | MFE-C01, MFE-C02, MFE-C07 |
| 005 | MFE-C01, MFE-C02, MFE-C03 |
| 006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 |
| 007 | MFE-C06, MFE-C13, MFE-C27 |
| 008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 |
| 009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 |
| 010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 |
| 011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 |
| 012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 |
| 013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 |
| 014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 |
| 015 | MFE-C23, MFE-C25 |
| 016 | MFE-C07, MFE-C21, MFE-C23 |
| 017 | MFE-C24, MFE-C25 |
| 018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 |
| 019 | MFE-C21, MFE-C22, MFE-C24 |
| 020 | MFE-C25, MFE-C26 |
| 021 | MFE-C25 |
| 022 | MFE-C25 |
| 023 | MFE-C27 |
| 024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 |
| 025 | MFE-C27 |
| 026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 |
| 027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 |
@@ -6,10 +6,10 @@
- 검토일: `2026-09-06`
- Artifact·logical comparison readiness: 필요한 입력과 비교값 확인 완료.
- Numerical comparison result: 미실행.
- Stage의 I/O handoff 요청은 [numerical-review](numerical-review.md)의 `pass`를 따른다.
- Stage의 I/O handoff 요청은 [numerical-review](numerical-review.md#numerical-review)의 `pass`를 따른다.
지역 범위는 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md),
`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md#requirements),
공통 판정은 [TOLERANCE](../TOLERANCE.md)의 `common-reference-tolerance`,
effective date `2026-08-18`, ADR-022를 따른다.
@@ -47,7 +47,7 @@ TXT의 `Frame: Mode i`는 mode-domain frame identity를 준다. TXT에 step 이
지정 input에 frequency step이 정확히 하나인 사실로 결정적으로 해소한다. 이 예외를 다중
step이나 step이 모호한 artifact에 일반화하지 않는다. Modal frame id와 임의의 ODB
storage frame index를 같은 정수라고 추정하지 않는다.
공개 의미의 근거는 [연구 S10/S11](research-evidence.md#source-inventory)이다.
공개 의미의 근거는 [연구 S10/S11](research.md#research-evidence--source-inventory)이다.
물리 eigenvalue가 같아도 다른 mode identity는 보존한다. 현재 표시값의 `(2,3)`,
`(7,8)`, `(9,10)` 쌍을 평균·merge하지 않는다. 같은 표시값만으로 exact degeneracy를
@@ -106,7 +106,7 @@ Generic policy 테스트에는 near-zero `|r|=B`와 그 양옆도 포함한다.
실제 read-only `Get-Content`, `Get-FileHash`, `python -B -` inventory/identity script는
exit `0`: `729/676/104/625` nodes/elements/boundary/interior, 단일 `Step-2`, input N=10,
유일 finite positive Values `10`, 위 두 hash 일치를 확인했다.
명령·검토 evidence는 [수치 상세](numerical-review-evidence.md#실행-evidence)에 연결한다.
명령·검토 evidence는 [수치 상세](numerical-review.md#numerical-review-evidence--실행-evidence)에 연결한다.
단일 clamped flat case는 curved/partial-BC/null/zero-mode correctness를 검증하지 않는다.
원본 Abaqus 결과와 내부 정식화의 동등성, 구현의 수치 통과 또는 release를 주장하지 않는다.
@@ -118,9 +118,9 @@ Value=omega² 의미, N의 입력 권위, source step/mode/frame, actual lumped
재사용했고 r2에서 두 원본 SHA-256이 위와 동일함을 확인했다(`Get-FileHash`, exit `0`).
과거 reference readiness를 r2 FESA 수치 비교 성공으로 바꾸지 않는다.
승인된 기존 static 회귀는 [Requirement의 단일 portfolio](requirements-evidence.md#필수-회귀-포트폴리오와-identity),
[C26](numerical-review-cases.md) 및
[C7](numerical-review-controls.md#c7-승인된-정적-회귀-기준)을 따른다.
승인된 기존 static 회귀는 [Requirement의 단일 portfolio](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity),
[C26](numerical-review.md#numerical-review-cases) 및
[C7](numerical-review.md#numerical-review-controls--c7-승인된-정적-회귀-기준)을 따른다.
그 static U blocking/UR warning-only·nonlinear local reaction review-only와 기존
step/accepted-state/source-node/component identity는 유지한다. Eigen의 Value-only와
서로 바꾸지 않는다. Static의 최신 common-policy projection을 적용하고 옛 파일명/schema
@@ -1,268 +0,0 @@
# MITC4 eigen 요구사항의 관찰 evidence와 결정
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `requirement-agent`
- Input contract revision: `r2`
- 기본 보고서: [requirements.md](requirements.md)
- 관찰일: `2026-09-06`
## 원본 reference 관찰
| Artifact | 실제 경로 | SHA-256 |
| --- | --- | --- |
| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` |
| Eigenvalues | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` |
| 관찰 항목 | 파일에서 읽은 사실 |
| --- | --- |
| 모델 | `Part-1`, identity instance `Part-1-1`; 729 nodes, 676 `S4` elements |
| 좌표 | x/y 각각 `[-5,5]`, 모든 z=`0`; 26×26 element mesh의 사각 평판 |
| Section | line 1421 `*Shell Section, elset=Set-1, material=Material-1`; data `0.5, 5`; offset/composite 없음 |
| Material | lines 1455~1459: `Material-1`, `*Density`=`2700.`, `*Elastic`=`2.1e+11, 0.3` |
| Constraint | lines 1464~1470: `Set-2`의 DOF 1~6, 값 생략으로 homogeneous constraint |
| Procedure | lines 1475~1477: 유일한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; `10, , , , ,` |
| 선행 이력 | 이전 Step/Static/Initial Conditions/load 없음; 이름 `shellNL`이나 `Step-2`로 preload를 추론하지 않음 |
| 부수 요청 | `*Restart, write, frequency=0`, field/Node PRESELECT, history/Energy ALL. 모델은 acoustic element/coupling constraint를 포함하지 않음 |
| TXT | 10개 row; 각 row에 `Frame: Mode <id>: Value = <lambda> Freq = <f> (cycles/time)` |
| Identity | mode IDs는 정확히 1~10, 유일하며 누락 없음; 모든 Value/Freq finite·positive |
| 반복값 | modes `(2,3)`, `(7,8)`, `(9,10)`의 표시 Value가 각각 같음; mode identity 중복과 구분 필요 |
관찰 Value 목록은 다음과 같다. 원본 표시 정밀도를 확장·보정하지 않는다.
| Mode | Value |
| --- | ---: |
| 1 | 2.19507E+05 |
| 2 | 8.85523E+05 |
| 3 | 8.85523E+05 |
| 4 | 1.85534E+06 |
| 5 | 2.74023E+06 |
| 6 | 2.77515E+06 |
| 7 | 4.14941E+06 |
| 8 | 4.14941E+06 |
| 9 | 6.73379E+06 |
| 10 | 6.73379E+06 |
관찰값으로 `sqrt(Value)/(2*pi)`와 표시 `Freq`를 계산상 대조한 최대 상대차는
`1.6946487122851045e-05`이다. 이것은 quantity 식별을 돕는 교차 확인이며 FESA comparison이나
새 허용오차 판정이 아니다. `Value`는 `omega²`, `Freq`는 cycles/time이라는 공개 정의와
일관된다. 단위계는 원문에 지정되지 않았고 수치만 보고 SI라고 단정하지 않는다.
TXT에는 step 이름이 별도로 없지만 입력은 정확히 한 개 frequency step이며 mode identity와
Value가 완전하다. 따라서 지정 input의 유일한 `Step-2`에 결합하는 deterministic projection은
가능하다. 최종 readiness와 frame/family mapping은 NR·I/O가 소유한다. CSV가 없다는 이유로
reference를 변환하거나 새 metadata/provenance를 요구할 근거는 없다. 사용자 지정 경로를
우선하는 feature-specific artifact 선택이며 공통 reference 문서나 다른 feature 계약은 바꾸지 않는다.
## 중요한 결정
### MFE-OQ-001 — 두 질량 계산 관계: 해결
사용자는 `2026-09-06` 후속 답변에서 “mass matrix는 consistent mass를 계산하고 이를
이용해서 lumped mass를 계산합니다.”라고 명시했다. Consistent 원본 계산과 derived lumped
계산이 모두 필수이며 이전 둘 중 하나의 계산만 선택하는 초안은 대체되었다.
관련 결정은 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화), 요구사항은
`FEM-REQ-MITC4-EIGEN-005`, `026`이다. Lumping 알고리즘은 사용자 지정이 없으므로
Research/Formulation이 질량 보존·물리 회전 관성·좌표 변환·drilling 경계를 명시하고 NR가 검토한다.
모든 속도장의 kinetic energy나 두 spectrum의 exact equality를 보존 조건으로 추가하지 않는다.
### MFE-OQ-002 — FEAST와 reference baseline의 질량: 해결
- 상태: **사용자 명시 결정으로 해결**.
- 관련 요구사항: `FEM-REQ-MITC4-EIGEN-008`, `011`, `013`, `017`, `020`.
- Owner: user가 사용 질량을 결정; Research/Formulation이 근거와 수식,
NR가 검증; Requirement Agent가 본 r1 baseline에 반영.
사용자는 추가 답변에서 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을
할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”라고 명시했다.
따라서 FEAST와 authoritative reference baseline은 derived lumped mass를 사용하며
동일 lumped mass로 residual·mass normalization·orthogonality를 검증한다.
Consistent는 유도 원본과 내부 mass/energy 검증에 유지한다. Consistent eigen 해석,
두 variant의 외부 비교 및 runtime 질량 선택 API는 현재 요구가 아니다.
이 결정은 수치 tolerance 통과나 정확도 우위의 evidence를 대신하지 않는다.
Drilling은 기존 승인 shell 계약에서 비물리 안정화 좌표이다. 인공 drilling inertia를
추가하거나 두 물리 회전 관성을 생략하는 대안을 새 사용자 옵션으로 발명하지 않는다.
Massless drilling을 그대로 generalized FEAST에 넣을 수 있다는 가정도 하지 않는다.
FEAST의 SPD 조건과 shell 질량 nullspace의 양립은 Research/Formulation이 물리 spectrum과
constraints를 보존하는 방식으로 해결해야 한다. 이 문서는 elimination/projection/condensation
식을 승인하지 않으며, 새로운 물리 근사가 필수라는 evidence가 생기면 해당 owner가 반환한다.
## NR-MFE-001 requirements intent 검토
이 절의 반례와 승인 전 판단은 **r1 이력**이다. 사용자 승인으로 개선 범위를 확정한 현재
r2 계약은 아래 [r2 승인 범위와 정적 재검증](#r2-승인-범위와-정적-재검증)을 따른다.
- Input contract revision: `r1` 유지. 이번 bounded 검토는 기존 `002/008/014`의 정합만 다룬다.
- 발견 근거: [Numerical Review](numerical-review.md#blocking-finding),
[NR 소유 직접 계산 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례),
[Formulation V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식).
- 결과: `needs-user-decision`. Requirement owner가 새 수식을 유도하거나 NR 계산을 재실행하지 않았다.
NR는 유효한 단일 평판의 한 절점 `URZ`만 free인 모델에서 global Z축 45° 회전이
동일 물리 component BC를 유지함을 확인했다. 기존 `kd` 규칙으로 고유치가
`23.04088888888889`에서 `23.040628726287263`으로 달라지고 상대 차이가
`1.1291343961675893e-5`다. 이는 NR의 독립 계산 evidence이며 새로운 mass/reduction의
확인된 결함이나 이번 Requirement Agent의 runtime 검증 결과가 아니다.
`014`의 원래 문구는 coordinate-invariance evidence를 필수로 두고 acceptance에
독립 invariant suite 통과를 요구한다. 유한한 test portfolio를 NR에 위임한 것은 모든
가능한 모델의 exact equality를 증명하라는 뜻은 아니지만, 알려진 지원 모델의 반례를
검증 범위 밖으로 재분류할 권한도 아니다. Full-free/full-clamp 사례로만 범위를 고정한 V5는
이 반례를 해소하지 못하므로 기존 의도의 단순 clarification으로 통과시킬 수 없다.
`002`의 물리 kernel 재사용 문구 하나만 보면 numerical stabilization 수정까지 직접
명시하지 않지만, 문서가 함께 재사용하는 [기존 shell 요구사항](../linear-static-mitc4-shell/requirements.md)의
`FESA-REQ-LSMITC4-034/056`은 고정 `kd` 규칙을 정한다. `008`은 실제 제약을 적용한
원래 pencil의 유한 spectrum 보존을 요구하므로 massless 처리에서 남는 stabilization을
제거해 이 반례를 없애는 해석도 허용하지 않는다. 고정된 tensor의 기저 변환과 geometry를
회전시켜 `kd`를 다시 계산하는 서로 다른 연산을 같은 검증으로 취급해서는 안 된다.
### MFE-OQ-003 — r1에서 검토한 대안과 영향
| 대안 | 정확한 영향과 승인 뒤 필요한 작업 |
| --- | --- |
| 기존 stabilization 유지 및 한계 수용 | Partial rotation BC 지원과 원래 pencil을 유지한다. 해당 BC에서 stabilization이 유한 공간에 남는 경우의 일반 eigen 좌표 불변성을 현재 feature acceptance에서 보장하지 않도록 `014` 적용 범위를 명시적으로 변경한다. 두 질량·physical stiffness의 좌표 검증, 모든 지원 BC의 원래 pencil 보존·modal residual 등은 계속 필수이며 NR 반례를 알려진 한계로 보존한다. 이는 acceptance 변경이고 아직 승인되지 않았다 |
| 좌표 공변적인 stabilization 개선 — 권고 | 동일 물리 모델의 좌표축 선택에 따른 고유치 변화를 해결하는 강성 개선을 작업 범위에 추가한다. 기존 fixed `kd`와 충돌하는 계약의 owner·승인 경계를 정하고 Research/Formulation/NR를 재검토한다. 영향받는 기존 정적 결과와 새 eigen 결과를 재검증한다. 특정 대체 계수나 수식은 이 요구사항 검토에서 선택하지 않는다 |
권고 이유는 좌표 선택만으로 같은 물리 모델의 고유치가 달라지는 알려진 결함을 유지하지
않기 위해서다. 대가는 기존 stiffness 계약의 영향 조사와 정식화·회귀 검증 범위 증가다.
반례의 수치가 작다는 이유로 외부 reference tolerance를 적용하거나 일반 오차 상한으로
사용하지 않는다. 이 한 건 외에 질량 흐름·FEAST 사용 질량·입력 N을 재질문하지 않는다.
두 대안은 같은 반례를 acceptance에서 다르게 처리하며, 기술 evidence만으로 사용자가
어느 변경 범위를 승인했는지 결정할 수 없다. 승인 전 `002/008/014` 원문, 기존 stiffness,
partial BC 지원, NR 판정 영향, 모든 tolerance·reference·schema를 변경하지 않았다.
Coordinator가 결정과 revision을 관리하고 영향받은 owner에게 후속 작업을 할당한다.
이 작업은 implementation correction이 아니며 correction budget을 사용하지 않는다.
## r2 승인 범위와 정적 재검증
사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에
포함해주세요.”로 `MFE-OQ-003`의 개선안이 승인되었다.
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)이
승인·revision 근거이며, 한계 수용/acceptance 축소안은 선택되지 않았다.
변경 intent는 `002` 물리 kernel 보존과 numerical stabilization 개선 분리,
`008` 개선된 constrained pencil의 유한 spectrum 보존,
`014` 지원 partial BC를 포함하는 필수 invariant 통과,
`024` 영향받은 정적 correctness/reference 재검증, 신규 `027` 좌표 공변적인 stabilization이다.
`020`은 eigen Value-only와 기존 static 회귀의 서로 다른 비교량을 명확히 구분한다.
기존 고정 scale과 직접 충돌하는 부분만 대체하며 수식·수치 기준·schema를 이 문서에서 정하지 않는다.
기존 [linear shell 요구사항](../linear-static-mitc4-shell/requirements.md)의
`034` scale 선정과 `056`의 해당 공식 검증을 대체하고, 나머지 physical/nonphysical 경계를
유지한다. [Nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)도
같은 initial physical tangent diagonal minimum을 사용하므로 영향받는 기존 static 경로다.
새 scale과 기존 nonlinear objective potential·일관 tangent·초기 고정 lifecycle의 정합을
Formulation/NR가 확인해야 한다. 이 발견은 nonlinear material/procedure 범위 확대가 아니다.
### 필수 회귀 포트폴리오와 identity
| 구분 | 필수 재검증과 기존 evidence 계약 |
| --- | --- |
| Element 및 linear static correctness | 기존 [build-test](../linear-static-mitc4-shell/build-test.md)와 [physics](../linear-static-mitc4-shell/physics-evaluation.md)의 kernel/patch/rigid-mode/physical recovery·정적 partition/full residual·reaction·energy·source mapping을 재검증한다. 추가로 NR-MFE-001의 동일 물리 partial BC에서 complete K와 대응 정적 response를 좌표 변환해 검증한다. Loads/BC를 함께 물리적으로 변환하고 지원되지 않는 MPC 입력을 만들지 않는다 |
| 기존 linear S4 external regression | [reference-model](../linear-static-mitc4-shell/reference-model.md), [comparison의 common-policy 재검증](../linear-static-mitc4-shell/reference-comparison.md#2026-08-18-common-policy-revalidation), 현행 [nonlinear I/O의 공통 경로·linear control](../nonlinear-static-newton-raphson/io.md)을 적용한다. 원본 `reference/shell/shell.inp` + `reference/shell/shell displacements.csv`; stable source instance/node/component 및 해당 static step/frame. U1/U2/U3 blocking, UR1/UR2/UR3 warning-only를 유지한다 |
| 기존 nonlinear correctness | [FESA-REQ-NSNR-030](../nonlinear-static-newton-raphson/requirements.md), [formulation](../nonlinear-static-newton-raphson/formulation.md), [physics](../nonlinear-static-newton-raphson/physics-evaluation.md)의 선형극한·tangent consistency·objectivity·factor-one 전역 force/moment balance·free residual·commit/rollback을 새 scale로 재검증한다. 기존 Newton/convergence·하중·reaction 의미는 유지한다 |
| 기존 nonlinear external regression | [현행 reference-model](../nonlinear-static-newton-raphson/reference-model.md)과 [기존 comparison](../nonlinear-static-newton-raphson/reference-comparison.md)의 closure case `shellnl-s4-final`, `shellnl-meshfine-s4-final`, `shell-s4-linear-limit`를 재검증한다. 각각 `reference/shellNL/shellNL.inp`, `reference/shellNL-meshfine/shellNL-meshfine.inp`, 위 linear input 및 같은 폴더의 기존 `<stem> displacements.csv`를 사용한다. Nonlinear은 source instance/node/component와 factor-one accepted state, linear은 자기 static state identity를 유지한다 |
| 새 eigen 검증 | 개선된 K와 derived lumped M에서 `008/013/014/027` 내부 검증 및 NR-MFE-001 해소를 필수 확인한다. 기존 지정 eigen input/TXT의 모든 요청 mode Value만 비교하며 static U/UR 데이터를 eigen reference로 사용하지 않는다 |
Nonlinear 외부 회귀도 U blocking/UR warning-only이고, 기존 coarse/fine의
`shellNL reactions.csv`·`shellNL-meshfine reactions.csv`에서 local RF1/RF2/RF3와
physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 유지하는 review-only다.
RM3와 stress를 새 numerical gate로 추가하지 않는다. Internal equilibrium acceptance와
local distribution 검토를 구분한다. 모든 외부 수치 판정은 `docs/TOLERANCE.md`를 그대로 사용한다.
현행 nonlinear reference-model에는 `shellnl-meshfine-02-s4-final`도 별도 post-closure
verification으로 기록되어 있다. 이를 과거 세 case closure의 통과 evidence로 소급하지
않는다. 기존 등록 회귀 suite에서의 실행·영향은 Planning이 기록하고 별도 case의 기존
판정 역할을 유지한다. 과거 HDF5 schema/파일명/고정 absolute tolerance의 이력보다 현행
공통 output 경로와 `TOLERANCE.md`, 각 feature의 최신 identity 계약이 우선한다.
개선 전 숫자와의 bitwise equality는 요구하지 않는다. 위 approved physics·reference
기준과 개선된 formulation을 기대값으로 검증하며 오래된 실패를 baseline으로 재생성하여
정당화하지 않는다. 원본 reference와 과거 보고서는 보존하고 새 r2 실행 evidence를 기록한다.
전체 configured MSVC/x64/Debug suite, 새 warning 없음, TDD와 failure preservation도 필수다.
현재 중요한 미결정은 없으며 연구·정식화·NR·구현의 후속 gate는 아직 통과하지 않았다.
## 질문 없이 정리한 사항
- 무하중 원형상·비감쇠 해석은 실제 단일 `*FREQUENCY`와 선행 이력 부재로 결정한다.
- `.inp`의 Lanczos는 source solver 옵션이다. 사용자가 FESA backend를 FEAST로 명시했으므로
source option을 유지해 읽되 실제 backend를 명시하는 mapping이 가능하다. Abaqus Lanczos
동작과의 동등성을 주장하지 않는다. Exact allowlist와 진단은 I/O 소유이다.
- `SIM`은 source architecture 옵션이고 acoustic-free 모델의 `ACOUSTIC COUPLING=ON`은
실제 acoustic 모델 지원 요청이 아니다. 무해한 조합만 근거와 warning 정책으로 허용한다.
- `NORMALIZATION=MASS`의 내부 modal 의미를 유지한다. 외부 mode shape 비교는 추가하지 않는다.
- TXT의 명시적인 `Value`를 직접 읽고 원본을 보존한다. Matching/family는 tolerance 전에
고정하며 repeated eigenvalue와 duplicate mode ID를 구분한다.
- 기존 HDF5 의미를 보존하는 eigen quantity 추가는 신규 기능에 필요한 I/O 정의이다.
비호환 변경이 없는 한 schema 검토를 별도 사용자 승인 질문으로 만들지 않는다.
## 공개 근거
다음은 `2026-09-06`에 확인한 1차 문서이다. 공식 syntax와 backend admissibility 확인에만
사용하며 Abaqus 내부 정식화의 추정 근거로 쓰지 않는다.
1. [Abaqus 2025 — Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm):
`Eigenvalue Extraction`, `Initial Conditions`, `Loads`, `Output` 절. 무감쇠 eigenproblem의
`omega²`, 원형상/선행 기하비선형 상태의 구분, 각 모드 출력 의미 확인.
2. [Abaqus 2025 — *FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm):
`Optional parameters`와 Lanczos data line 절. 요청수 10, blank bounds, source algorithm,
SIM/acoustic 옵션의 의미와 mass normalization 확인.
3. [Intel oneMKL 2026.0 — Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html):
real symmetric generalized 문제는 `B` SPD를 요구한다. 이 조건 때문에 massless drilling을
아무 처리 없이 FEAST에 전달해서는 안 된다.
4. [Intel oneMKL 2026.0 — ?feast_scsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html):
지정 구간의 eigenpairs, subspace capacity, 결과 count와 status 의미 확인. 구간 선택·확장과
설치된 MKL 버전 검증은 후속 owner가 정의한다.
## 실행 evidence와 미실행
r0 원본 관찰과 hash는 그대로 유지했다. 아래는 당시 실행한 read-only 조사이며 이번 r1에서
reference 재조사나 변환을 수행하지 않았다. 해당 shell 명령은 exit code `0`이었다.
```powershell
Get-Content -Raw '.codex/skills/fem-requirements-baseline/SKILL.md'
Get-Content -Raw 'docs/SOLVER_AGENT_DESIGN.md'
Get-Content -Raw 'docs/FEATURE_DOCUMENTATION.md'
rg -n -i '^\*(?!\*)|density|frequency|static|step|boundary|shell section' --pcre2 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp'
Get-Content -Tail 75 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp'
Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
rg -n 'FEAST|feast|MassMatrix|Density|density|Frequency|Eigenvalue|eigenvalue' include src -g '*.[ch]*'
git status --short
```
추가 read-only `python -B -` here-script는 `pathlib`로 두 파일을 읽고 keyword별 node/element
count, 좌표 범위, regex `Mode\s+(\d+):\s+Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)`로
mode/Value/Freq를 추출하여 finite·identity·주파수 교차 확인과 SHA-256을 계산했다.
Exit code `0`, 729 nodes / 676 elements / 10 modes였고 위 표·hash와 일치했다.
파일을 생성하거나 reference 내용을 쓰지 않았다. Source 검색에서 물리 mass/density/eigen
구현을 발견하지 못했고 nonlinear local energy 변수 `density`만 검색되었다. 이는 scoped 검색
관찰이며 제품 미지원의 최종 코드 감사는 아니다.
공통/feature/기존 MITC4·nonlinear 승인 계약을 read-only로 조사했다. 기존 보고서의 완료
표시는 이번 feature 실행 증거로 재사용하지 않는다. C++ build/test, Harness, 외부 solver와
FESA reference comparison은 요구사항 단계의 범위가 아니므로 미실행이다.
r1에서는 관리문서·owned reports·공통 agent 계약을 `Get-Content`로 읽고 사용자 수정
`AGENTS.md`의 GoogleTest 경로를 `rg -n 'GTEST|git|GoogleTest' 'AGENTS.md'`로 확인했다.
명령은 exit code `0`이었다. 실제 GoogleTest dependency 설정/build 확인은 Root·Planning
소유이며 이 문서 갱신에서 새로 실행하지 않았다. 두 사용자 결정으로 `MFE-OQ-001`과
`MFE-OQ-002`를 해결했으며 기존 25개 requirement ID를 보존하고 derived lumped 요구
`026`을 추가했다. 당시 질량 선택의 미결정은 모두 해소되었다. 이후 NR-MFE-001로 발견된
현재 acceptance 결정은 위 별도 절에서 관리하며 상세 lumping 수식·수치 기준은 후속 owner 소유이다.
NR-MFE-001 bounded 검토에서는 `Get-Content`로 현재 Feature 관리문서·owned 보고서·NR
main/evidence·reference-model·formulation-verification을 읽고, scoped `rg`로
`002/008/014`와 기존 `FESA-REQ-LSMITC4-034/038/051/056`을 대조했다. Exit code `0`.
원본 reference 재조사, NR 반례 재계산, 새로운 외부 조사와 수식 유도는 수행하지 않았다.
r2에서는 현재 관리문서와 위 기존 static reports/requirements/formulation을 `Get-Content`와
scoped `rg`로 읽었다. Exit code `0`. 기존 nonlinear §10.3의 동일 scale 사용과 현행
reference-model의 closure/별도 post-closure case 구분을 확인했다. 실제 reference 파일을
재조회하거나 과거 수치·hash를 새로 계산하지 않았다. NR 반례/positive evidence도 재실행하지
않았다. 변경은 owned 두 문서뿐이고 실제 C++/FEAST/build/test/reference 회귀는 미실행이다.
변경한 경로는 기본 보고서와 이 상세 보고서 두 개뿐이며 관리문서, source, tests, phase,
공통 정책과 reference artifact는 편집하지 않았다. 정적 링크·필수 metadata·ID/matrix 검사를
완료한 명령과 결과는 Requirement Agent 반환 evidence로 함께 보고한다.
+304 -12
View File
@@ -1,7 +1,13 @@
# MITC4 Shell Mass Matrix와 FEAST 고유치해석 요구사항
# 이전 MFE 요구사항과 결정 근거
MFE 요구사항 ID·승인 근거는 이전 baseline의 이력이다. 현재 MFE2 요구와의 대응을 구분한다.
<a id="requirements"></a>
<a id="requirements--mitc4-shell-mass-matrix와-feast-고유치해석-요구사항"></a>
## MITC4 Shell Mass Matrix와 FEAST 고유치해석 요구사항
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `requirement-agent`
- Input contract revision: `r2`
- 검토 상태: 사용자 승인 stabilization 개선·정적/eigen 재검증 범위를 반영한 baseline gate 검토 요청.
- 요청 outcome: `pass`; workflow 전이와 최종 gate 판정은 Coordinator 소유.
@@ -12,9 +18,10 @@
[TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용한다.
Reference 관찰, 원문 경로·hash, 중요한 결정의 대안과 명령 evidence는
[requirements-evidence.md](requirements-evidence.md)에 둔다.
[requirements-evidence.md](requirements.md#requirements-evidence)에 둔다.
## 핵심 결과와 범위
<a id="requirements--핵심-결과와-범위"></a>
### 핵심 결과와 범위
지정된 reference는 이름에 `shellNL`이 있지만 선행 정적 해석 없이 원형상에서 수행하는
단일 무감쇠 선형 고유진동 해석이다. `Step-2`에서 10개 모드를 요청하고 모든 외곽 절점의
@@ -49,7 +56,8 @@ thickness, 기존 미지원 shell geometry, residual modes 및 modal stress/reac
사용자가 지정하지 않은 Lanczos/AMS 대체 backend, reference 생성·수정·복원과 외부 배포도 제외한다.
별도 frequency interval/shift 사용자 기능은 현재 최소 subset에 포함하지 않는다.
## 의미·단위·소유권
<a id="requirements--의미단위소유권"></a>
### 의미·단위·소유권
| 항목 | 요구되는 의미와 경계 |
| --- | --- |
@@ -66,10 +74,11 @@ thickness, 기존 미지원 shell geometry, residual modes 및 modal stress/reac
solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run()`에 eigen 분기를 누적하거나
정적 reaction 의미를 modal 결과로 재사용해서는 안 된다.
## Requirement Verification Matrix
<a id="requirements--requirement-verification-matrix"></a>
### Requirement Verification Matrix
모든 행은 `must`이고 acceptance는 해당 행의 요구와 검증 조건을 모두 만족하는 것이다.
출처 `U`는 [Feature PRD](PRD.md)의 사용자 요구, `R`은 [관찰 evidence](requirements-evidence.md),
출처 `U`는 [Feature PRD](PRD.md)의 사용자 요구, `R`은 [관찰 evidence](requirements.md#requirements-evidence),
`P`는 위 공통 기준, `L`은 [기존 MITC4 요구사항](../linear-static-mitc4-shell/requirements.md)과
[정식화](../linear-static-mitc4-shell/formulation.md), `N`은
[기존 nonlinear I/O](../nonlinear-static-newton-raphson/io.md)의 공통 경로·failure 계약을 뜻한다.
@@ -106,7 +115,8 @@ solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run(
| FEM-REQ-MITC4-EIGEN-026 | 솔버는 계산된 consistent mass에서 lumped mass를 유도하고 승인된 질량·관성 보존 계약을 검증해야 한다. | 유도 관계·독립 lumping oracle·총 병진 질량 보존, 차원/대칭성/물리 kinetic-energy 비음성, 물리 회전 관성과 drilling nullspace 의미 검사. Lumping 수식·좌표 block 처리·정확한 관성 불변식과 threshold는 Formulation/NR가 고정 | U r1, P, L; Research, Formulation, NR |
| FEM-REQ-MITC4-EIGEN-027 | 개선된 numerical drilling stabilization은 같은 물리 모델의 좌표·접평면 기저 선택에 공변적이고 기존 비물리 역할을 유지해야 한다. | 독립 재계산한 stabilization/complete K의 congruence, finite·대칭·양의 numerical stabilization, 물리 rigid modes 보존, physical recovery 제외 및 결정론 검증. Partial BC의 NR-MFE-001과 대응 정적 response를 필수 통과시키며 기존 static의 동일 scale 사용 경로도 정합 검증; 수식·threshold는 Formulation/NR 소유 | U r2, L; Research, Formulation, NR, Planning, Physics |
## r2의 기존 계약 대체 범위
<a id="requirements--r2의-기존-계약-대체-범위"></a>
### r2의 기존 계약 대체 범위
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)의 승인으로
기존 `FESA-REQ-LSMITC4-034`의 basis-dependent `min(R+)` scale 선정과 `056` 중 그
@@ -119,22 +129,23 @@ solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run(
이력으로 보존하며 상세 대체 수식과 검증 trace를 이 feature의 후속 owner가 작성한다.
필수 static 회귀의 기존 case·identity·policy는
[requirements evidence의 r2 재검증 범위](requirements-evidence.md#r2-승인-범위와-정적-재검증)를 따른다.
[requirements evidence의 r2 재검증 범위](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)를 따른다.
새 eigen reference의 Value-only를 기존 정적 reference 요구의 삭제로 해석하거나,
정적 U/UR 회귀를 eigen mode-shape 비교로 확대하지 않는다.
## 결정과 handoff
<a id="requirements--결정과-handoff"></a>
### 결정과 handoff
`MFE-OQ-001`은 사용자 후속 결정으로 해결되었다. Consistent를 계산하고 이로부터 lumped를
계산하므로 두 계산은 모두 필수다. 기존 양자택일 요구는 대체되었다.
`MFE-OQ-002`도 사용자 명시 결정으로 해결되었다. **Consistent→lumped→FEAST** 흐름을
사용하며 external eigenvalue baseline과 내부 residual·normalization·orthogonality는
동일 lumped mass에 대응한다. [사용자 결정 근거](requirements-evidence.md#중요한-결정)를 따른다.
동일 lumped mass에 대응한다. [사용자 결정 근거](requirements.md#requirements-evidence--중요한-결정)를 따른다.
질량·backend·mode count 선택은 해결되었으며 다시 질문하지 않는다.
`MFE-OQ-003`은 사용자 명시 승인으로 해결되었다. 좌표 공변적인 stabilization 개선과
영향받는 기존 정적/eigen 재검증을 r2에 포함하며 partial BC 지원·invariance acceptance를
축소하지 않는다. [기존 반례·판단 이력과 승인 delta](requirements-evidence.md#nr-mfe-001-requirements-intent-검토)를
축소하지 않는다. [기존 반례·판단 이력과 승인 delta](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토)를
보존한다. 현재 요구사항의 중요한 미결정은 없고 NR 반례의 실제 해소·새 수치 통과는 아직 미검증이다.
Research/Formulation은 consistent→lumped 유도 및 각 관성 불변식, lumped 질량과 massless drilling, supported global
@@ -151,3 +162,284 @@ Harness Executor가 기존 계약에 따라 구현·phase 커밋을 소유하며
이번 산출물은 문서 요구사항과 read-only evidence 조사이다. 구현·CMake·CTest·Harness·외부
solver·수치 reference comparison은 수행하지 않았으며 통과로 보고하지 않는다.
<a id="requirements-evidence"></a>
<a id="requirements-evidence--mitc4-eigen-요구사항의-관찰-evidence와-결정"></a>
## MITC4 eigen 요구사항의 관찰 evidence와 결정
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [requirements.md](requirements.md#requirements)
- 관찰일: `2026-09-06`
<a id="requirements-evidence--원본-reference-관찰"></a>
### 원본 reference 관찰
| Artifact | 실제 경로 | SHA-256 |
| --- | --- | --- |
| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` |
| Eigenvalues | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` |
| 관찰 항목 | 파일에서 읽은 사실 |
| --- | --- |
| 모델 | `Part-1`, identity instance `Part-1-1`; 729 nodes, 676 `S4` elements |
| 좌표 | x/y 각각 `[-5,5]`, 모든 z=`0`; 26×26 element mesh의 사각 평판 |
| Section | line 1421 `*Shell Section, elset=Set-1, material=Material-1`; data `0.5, 5`; offset/composite 없음 |
| Material | lines 1455~1459: `Material-1`, `*Density`=`2700.`, `*Elastic`=`2.1e+11, 0.3` |
| Constraint | lines 1464~1470: `Set-2`의 DOF 1~6, 값 생략으로 homogeneous constraint |
| Procedure | lines 1475~1477: 유일한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; `10, , , , ,` |
| 선행 이력 | 이전 Step/Static/Initial Conditions/load 없음; 이름 `shellNL`이나 `Step-2`로 preload를 추론하지 않음 |
| 부수 요청 | `*Restart, write, frequency=0`, field/Node PRESELECT, history/Energy ALL. 모델은 acoustic element/coupling constraint를 포함하지 않음 |
| TXT | 10개 row; 각 row에 `Frame: Mode <id>: Value = <lambda> Freq = <f> (cycles/time)` |
| Identity | mode IDs는 정확히 1~10, 유일하며 누락 없음; 모든 Value/Freq finite·positive |
| 반복값 | modes `(2,3)`, `(7,8)`, `(9,10)`의 표시 Value가 각각 같음; mode identity 중복과 구분 필요 |
관찰 Value 목록은 다음과 같다. 원본 표시 정밀도를 확장·보정하지 않는다.
| Mode | Value |
| --- | ---: |
| 1 | 2.19507E+05 |
| 2 | 8.85523E+05 |
| 3 | 8.85523E+05 |
| 4 | 1.85534E+06 |
| 5 | 2.74023E+06 |
| 6 | 2.77515E+06 |
| 7 | 4.14941E+06 |
| 8 | 4.14941E+06 |
| 9 | 6.73379E+06 |
| 10 | 6.73379E+06 |
관찰값으로 `sqrt(Value)/(2*pi)`와 표시 `Freq`를 계산상 대조한 최대 상대차는
`1.6946487122851045e-05`이다. 이것은 quantity 식별을 돕는 교차 확인이며 FESA comparison이나
새 허용오차 판정이 아니다. `Value`는 `omega²`, `Freq`는 cycles/time이라는 공개 정의와
일관된다. 단위계는 원문에 지정되지 않았고 수치만 보고 SI라고 단정하지 않는다.
TXT에는 step 이름이 별도로 없지만 입력은 정확히 한 개 frequency step이며 mode identity와
Value가 완전하다. 따라서 지정 input의 유일한 `Step-2`에 결합하는 deterministic projection은
가능하다. 최종 readiness와 frame/family mapping은 NR·I/O가 소유한다. CSV가 없다는 이유로
reference를 변환하거나 새 metadata/provenance를 요구할 근거는 없다. 사용자 지정 경로를
우선하는 feature-specific artifact 선택이며 공통 reference 문서나 다른 feature 계약은 바꾸지 않는다.
<a id="requirements-evidence--중요한-결정"></a>
### 중요한 결정
<a id="requirements-evidence--mfe-oq-001--두-질량-계산-관계-해결"></a>
#### MFE-OQ-001 — 두 질량 계산 관계: 해결
사용자는 `2026-09-06` 후속 답변에서 “mass matrix는 consistent mass를 계산하고 이를
이용해서 lumped mass를 계산합니다.”라고 명시했다. Consistent 원본 계산과 derived lumped
계산이 모두 필수이며 이전 둘 중 하나의 계산만 선택하는 초안은 대체되었다.
관련 결정은 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화), 요구사항은
`FEM-REQ-MITC4-EIGEN-005`, `026`이다. Lumping 알고리즘은 사용자 지정이 없으므로
Research/Formulation이 질량 보존·물리 회전 관성·좌표 변환·drilling 경계를 명시하고 NR가 검토한다.
모든 속도장의 kinetic energy나 두 spectrum의 exact equality를 보존 조건으로 추가하지 않는다.
<a id="requirements-evidence--mfe-oq-002--feast와-reference-baseline의-질량-해결"></a>
#### MFE-OQ-002 — FEAST와 reference baseline의 질량: 해결
- 상태: **사용자 명시 결정으로 해결**.
- 관련 요구사항: `FEM-REQ-MITC4-EIGEN-008`, `011`, `013`, `017`, `020`.
NR가 검증; Requirement Agent가 본 r1 baseline에 반영.
사용자는 추가 답변에서 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을
할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”라고 명시했다.
따라서 FEAST와 authoritative reference baseline은 derived lumped mass를 사용하며
동일 lumped mass로 residual·mass normalization·orthogonality를 검증한다.
Consistent는 유도 원본과 내부 mass/energy 검증에 유지한다. Consistent eigen 해석,
두 variant의 외부 비교 및 runtime 질량 선택 API는 현재 요구가 아니다.
이 결정은 수치 tolerance 통과나 정확도 우위의 evidence를 대신하지 않는다.
Drilling은 기존 승인 shell 계약에서 비물리 안정화 좌표이다. 인공 drilling inertia를
추가하거나 두 물리 회전 관성을 생략하는 대안을 새 사용자 옵션으로 발명하지 않는다.
Massless drilling을 그대로 generalized FEAST에 넣을 수 있다는 가정도 하지 않는다.
FEAST의 SPD 조건과 shell 질량 nullspace의 양립은 Research/Formulation이 물리 spectrum과
constraints를 보존하는 방식으로 해결해야 한다. 이 문서는 elimination/projection/condensation
식을 승인하지 않으며, 새로운 물리 근사가 필수라는 evidence가 생기면 해당 owner가 반환한다.
<a id="requirements-evidence--nr-mfe-001-requirements-intent-검토"></a>
### NR-MFE-001 requirements intent 검토
이 절의 반례와 승인 전 판단은 **r1 이력**이다. 사용자 승인으로 개선 범위를 확정한 현재
r2 계약은 아래 [r2 승인 범위와 정적 재검증](requirements.md#requirements)을 따른다.
- Input contract revision: `r1` 유지. 이번 bounded 검토는 기존 `002/008/014`의 정합만 다룬다.
- 발견 근거: [Numerical Review](numerical-review.md#numerical-review--blocking-finding),
[NR 소유 직접 계산 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례),
[Formulation V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식).
- 결과: `needs-user-decision`. Requirement owner가 새 수식을 유도하거나 NR 계산을 재실행하지 않았다.
NR는 유효한 단일 평판의 한 절점 `URZ`만 free인 모델에서 global Z축 45° 회전이
동일 물리 component BC를 유지함을 확인했다. 기존 `kd` 규칙으로 고유치가
`23.04088888888889`에서 `23.040628726287263`으로 달라지고 상대 차이가
`1.1291343961675893e-5`다. 이는 NR의 독립 계산 evidence이며 새로운 mass/reduction의
확인된 결함이나 이번 Requirement Agent의 runtime 검증 결과가 아니다.
`014`의 원래 문구는 coordinate-invariance evidence를 필수로 두고 acceptance에
독립 invariant suite 통과를 요구한다. 유한한 test portfolio를 NR에 위임한 것은 모든
가능한 모델의 exact equality를 증명하라는 뜻은 아니지만, 알려진 지원 모델의 반례를
검증 범위 밖으로 재분류할 권한도 아니다. Full-free/full-clamp 사례로만 범위를 고정한 V5는
이 반례를 해소하지 못하므로 기존 의도의 단순 clarification으로 통과시킬 수 없다.
`002`의 물리 kernel 재사용 문구 하나만 보면 numerical stabilization 수정까지 직접
명시하지 않지만, 문서가 함께 재사용하는 [기존 shell 요구사항](../linear-static-mitc4-shell/requirements.md)의
`FESA-REQ-LSMITC4-034/056`은 고정 `kd` 규칙을 정한다. `008`은 실제 제약을 적용한
원래 pencil의 유한 spectrum 보존을 요구하므로 massless 처리에서 남는 stabilization을
제거해 이 반례를 없애는 해석도 허용하지 않는다. 고정된 tensor의 기저 변환과 geometry를
회전시켜 `kd`를 다시 계산하는 서로 다른 연산을 같은 검증으로 취급해서는 안 된다.
<a id="requirements-evidence--mfe-oq-003--r1에서-검토한-대안과-영향"></a>
#### MFE-OQ-003 — r1에서 검토한 대안과 영향
| 대안 | 정확한 영향과 승인 뒤 필요한 작업 |
| --- | --- |
| 기존 stabilization 유지 및 한계 수용 | Partial rotation BC 지원과 원래 pencil을 유지한다. 해당 BC에서 stabilization이 유한 공간에 남는 경우의 일반 eigen 좌표 불변성을 현재 feature acceptance에서 보장하지 않도록 `014` 적용 범위를 명시적으로 변경한다. 두 질량·physical stiffness의 좌표 검증, 모든 지원 BC의 원래 pencil 보존·modal residual 등은 계속 필수이며 NR 반례를 알려진 한계로 보존한다. 이는 acceptance 변경이고 아직 승인되지 않았다 |
| 좌표 공변적인 stabilization 개선 — 권고 | 동일 물리 모델의 좌표축 선택에 따른 고유치 변화를 해결하는 강성 개선을 작업 범위에 추가한다. 기존 fixed `kd`와 충돌하는 계약의 owner·승인 경계를 정하고 Research/Formulation/NR를 재검토한다. 영향받는 기존 정적 결과와 새 eigen 결과를 재검증한다. 특정 대체 계수나 수식은 이 요구사항 검토에서 선택하지 않는다 |
권고 이유는 좌표 선택만으로 같은 물리 모델의 고유치가 달라지는 알려진 결함을 유지하지
않기 위해서다. 대가는 기존 stiffness 계약의 영향 조사와 정식화·회귀 검증 범위 증가다.
반례의 수치가 작다는 이유로 외부 reference tolerance를 적용하거나 일반 오차 상한으로
사용하지 않는다. 이 한 건 외에 질량 흐름·FEAST 사용 질량·입력 N을 재질문하지 않는다.
두 대안은 같은 반례를 acceptance에서 다르게 처리하며, 기술 evidence만으로 사용자가
어느 변경 범위를 승인했는지 결정할 수 없다. 승인 전 `002/008/014` 원문, 기존 stiffness,
partial BC 지원, NR 판정 영향, 모든 tolerance·reference·schema를 변경하지 않았다.
Coordinator가 결정과 revision을 관리하고 영향받은 owner에게 후속 작업을 할당한다.
이 작업은 implementation correction이 아니며 correction budget을 사용하지 않는다.
<a id="requirements-evidence--r2-승인-범위와-정적-재검증"></a>
### r2 승인 범위와 정적 재검증
사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에
포함해주세요.”로 `MFE-OQ-003`의 개선안이 승인되었다.
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)이
승인·revision 근거이며, 한계 수용/acceptance 축소안은 선택되지 않았다.
변경 intent는 `002` 물리 kernel 보존과 numerical stabilization 개선 분리,
`008` 개선된 constrained pencil의 유한 spectrum 보존,
`014` 지원 partial BC를 포함하는 필수 invariant 통과,
`024` 영향받은 정적 correctness/reference 재검증, 신규 `027` 좌표 공변적인 stabilization이다.
`020`은 eigen Value-only와 기존 static 회귀의 서로 다른 비교량을 명확히 구분한다.
기존 고정 scale과 직접 충돌하는 부분만 대체하며 수식·수치 기준·schema를 이 문서에서 정하지 않는다.
기존 [linear shell 요구사항](../linear-static-mitc4-shell/requirements.md)의
`034` scale 선정과 `056`의 해당 공식 검증을 대체하고, 나머지 physical/nonphysical 경계를
유지한다. [Nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)도
같은 initial physical tangent diagonal minimum을 사용하므로 영향받는 기존 static 경로다.
새 scale과 기존 nonlinear objective potential·일관 tangent·초기 고정 lifecycle의 정합을
Formulation/NR가 확인해야 한다. 이 발견은 nonlinear material/procedure 범위 확대가 아니다.
<a id="requirements-evidence--필수-회귀-포트폴리오와-identity"></a>
#### 필수 회귀 포트폴리오와 identity
| 구분 | 필수 재검증과 기존 evidence 계약 |
| --- | --- |
| Element 및 linear static correctness | 기존 [build-test](../linear-static-mitc4-shell/verification.md#build-test)와 [physics](../linear-static-mitc4-shell/verification.md#physics-evaluation)의 kernel/patch/rigid-mode/physical recovery·정적 partition/full residual·reaction·energy·source mapping을 재검증한다. 추가로 NR-MFE-001의 동일 물리 partial BC에서 complete K와 대응 정적 response를 좌표 변환해 검증한다. Loads/BC를 함께 물리적으로 변환하고 지원되지 않는 MPC 입력을 만들지 않는다 |
| 기존 linear S4 external regression | [reference-model](../linear-static-mitc4-shell/reference-model.md), [comparison의 common-policy 재검증](../linear-static-mitc4-shell/verification.md#reference-comparison--2026-08-18-common-policy-revalidation), 현행 [nonlinear I/O의 공통 경로·linear control](../nonlinear-static-newton-raphson/io.md)을 적용한다. 원본 `reference/shell/shell.inp` + `reference/shell/shell displacements.csv`; stable source instance/node/component 및 해당 static step/frame. U1/U2/U3 blocking, UR1/UR2/UR3 warning-only를 유지한다 |
| 기존 nonlinear correctness | [FESA-REQ-NSNR-030](../nonlinear-static-newton-raphson/requirements.md), [formulation](../nonlinear-static-newton-raphson/formulation.md), [physics](../nonlinear-static-newton-raphson/verification.md#physics-evaluation)의 선형극한·tangent consistency·objectivity·factor-one 전역 force/moment balance·free residual·commit/rollback을 새 scale로 재검증한다. 기존 Newton/convergence·하중·reaction 의미는 유지한다 |
| 기존 nonlinear external regression | [현행 reference-model](../nonlinear-static-newton-raphson/reference-model.md)과 [기존 comparison](../nonlinear-static-newton-raphson/verification.md#reference-comparison)의 closure case `shellnl-s4-final`, `shellnl-meshfine-s4-final`, `shell-s4-linear-limit`를 재검증한다. 각각 `reference/shellNL/shellNL.inp`, `reference/shellNL-meshfine/shellNL-meshfine.inp`, 위 linear input 및 같은 폴더의 기존 `<stem> displacements.csv`를 사용한다. Nonlinear은 source instance/node/component와 factor-one accepted state, linear은 자기 static state identity를 유지한다 |
| 새 eigen 검증 | 개선된 K와 derived lumped M에서 `008/013/014/027` 내부 검증 및 NR-MFE-001 해소를 필수 확인한다. 기존 지정 eigen input/TXT의 모든 요청 mode Value만 비교하며 static U/UR 데이터를 eigen reference로 사용하지 않는다 |
Nonlinear 외부 회귀도 U blocking/UR warning-only이고, 기존 coarse/fine의
`shellNL reactions.csv`·`shellNL-meshfine reactions.csv`에서 local RF1/RF2/RF3와
physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 유지하는 review-only다.
RM3와 stress를 새 numerical gate로 추가하지 않는다. Internal equilibrium acceptance와
local distribution 검토를 구분한다. 모든 외부 수치 판정은 `docs/TOLERANCE.md`를 그대로 사용한다.
현행 nonlinear reference-model에는 `shellnl-meshfine-02-s4-final`도 별도 post-closure
verification으로 기록되어 있다. 이를 과거 세 case closure의 통과 evidence로 소급하지
않는다. 기존 등록 회귀 suite에서의 실행·영향은 Planning이 기록하고 별도 case의 기존
판정 역할을 유지한다. 과거 HDF5 schema/파일명/고정 absolute tolerance의 이력보다 현행
공통 output 경로와 `TOLERANCE.md`, 각 feature의 최신 identity 계약이 우선한다.
개선 전 숫자와의 bitwise equality는 요구하지 않는다. 위 approved physics·reference
기준과 개선된 formulation을 기대값으로 검증하며 오래된 실패를 baseline으로 재생성하여
정당화하지 않는다. 원본 reference와 과거 보고서는 보존하고 새 r2 실행 evidence를 기록한다.
전체 configured MSVC/x64/Debug suite, 새 warning 없음, TDD와 failure preservation도 필수다.
현재 중요한 미결정은 없으며 연구·정식화·NR·구현의 후속 gate는 아직 통과하지 않았다.
<a id="requirements-evidence--질문-없이-정리한-사항"></a>
### 질문 없이 정리한 사항
- 무하중 원형상·비감쇠 해석은 실제 단일 `*FREQUENCY`와 선행 이력 부재로 결정한다.
- `.inp`의 Lanczos는 source solver 옵션이다. 사용자가 FESA backend를 FEAST로 명시했으므로
source option을 유지해 읽되 실제 backend를 명시하는 mapping이 가능하다. Abaqus Lanczos
동작과의 동등성을 주장하지 않는다. Exact allowlist와 진단은 I/O 소유이다.
- `SIM`은 source architecture 옵션이고 acoustic-free 모델의 `ACOUSTIC COUPLING=ON`은
실제 acoustic 모델 지원 요청이 아니다. 무해한 조합만 근거와 warning 정책으로 허용한다.
- `NORMALIZATION=MASS`의 내부 modal 의미를 유지한다. 외부 mode shape 비교는 추가하지 않는다.
- TXT의 명시적인 `Value`를 직접 읽고 원본을 보존한다. Matching/family는 tolerance 전에
고정하며 repeated eigenvalue와 duplicate mode ID를 구분한다.
- 기존 HDF5 의미를 보존하는 eigen quantity 추가는 신규 기능에 필요한 I/O 정의이다.
비호환 변경이 없는 한 schema 검토를 별도 사용자 승인 질문으로 만들지 않는다.
<a id="requirements-evidence--공개-근거"></a>
### 공개 근거
다음은 `2026-09-06`에 확인한 1차 문서이다. 공식 syntax와 backend admissibility 확인에만
사용하며 Abaqus 내부 정식화의 추정 근거로 쓰지 않는다.
1. [Abaqus 2025 — Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm):
`Eigenvalue Extraction`, `Initial Conditions`, `Loads`, `Output` 절. 무감쇠 eigenproblem의
`omega²`, 원형상/선행 기하비선형 상태의 구분, 각 모드 출력 의미 확인.
2. [Abaqus 2025 — *FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm):
`Optional parameters`와 Lanczos data line 절. 요청수 10, blank bounds, source algorithm,
SIM/acoustic 옵션의 의미와 mass normalization 확인.
3. [Intel oneMKL 2026.0 — Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html):
real symmetric generalized 문제는 `B` SPD를 요구한다. 이 조건 때문에 massless drilling을
아무 처리 없이 FEAST에 전달해서는 안 된다.
4. [Intel oneMKL 2026.0 — ?feast_scsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html):
지정 구간의 eigenpairs, subspace capacity, 결과 count와 status 의미 확인. 구간 선택·확장과
설치된 MKL 버전 검증은 후속 owner가 정의한다.
<a id="requirements-evidence--실행-evidence와-미실행"></a>
### 실행 evidence와 미실행
r0 원본 관찰과 hash는 그대로 유지했다. 아래는 당시 실행한 read-only 조사이며 이번 r1에서
reference 재조사나 변환을 수행하지 않았다. 해당 shell 명령은 exit code `0`이었다.
```powershell
Get-Content -Raw '.codex/skills/fem-requirements-baseline/SKILL.md'
Get-Content -Raw 'docs/SOLVER_AGENT_DESIGN.md'
Get-Content -Raw 'docs/FEATURE_DOCUMENTATION.md'
rg -n -i '^\*(?!\*)|density|frequency|static|step|boundary|shell section' --pcre2 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp'
Get-Content -Tail 75 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp'
Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
rg -n 'FEAST|feast|MassMatrix|Density|density|Frequency|Eigenvalue|eigenvalue' include src -g '*.[ch]*'
git status --short
```
추가 read-only `python -B -` here-script는 `pathlib`로 두 파일을 읽고 keyword별 node/element
count, 좌표 범위, regex `Mode\s+(\d+):\s+Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)`로
mode/Value/Freq를 추출하여 finite·identity·주파수 교차 확인과 SHA-256을 계산했다.
Exit code `0`, 729 nodes / 676 elements / 10 modes였고 위 표·hash와 일치했다.
파일을 생성하거나 reference 내용을 쓰지 않았다. Source 검색에서 물리 mass/density/eigen
구현을 발견하지 못했고 nonlinear local energy 변수 `density`만 검색되었다. 이는 scoped 검색
관찰이며 제품 미지원의 최종 코드 감사는 아니다.
공통/feature/기존 MITC4·nonlinear 승인 계약을 read-only로 조사했다. 기존 보고서의 완료
표시는 이번 feature 실행 증거로 재사용하지 않는다. C++ build/test, Harness, 외부 solver와
FESA reference comparison은 요구사항 단계의 범위가 아니므로 미실행이다.
r1에서는 관리문서·owned reports·공통 agent 계약을 `Get-Content`로 읽고 사용자 수정
`AGENTS.md`의 GoogleTest 경로를 `rg -n 'GTEST|git|GoogleTest' 'AGENTS.md'`로 확인했다.
명령은 exit code `0`이었다. 실제 GoogleTest dependency 설정/build 확인은 Root·Planning
소유이며 이 문서 갱신에서 새로 실행하지 않았다. 두 사용자 결정으로 `MFE-OQ-001`과
`MFE-OQ-002`를 해결했으며 기존 25개 requirement ID를 보존하고 derived lumped 요구
`026`을 추가했다. 당시 질량 선택의 미결정은 모두 해소되었다. 이후 NR-MFE-001로 발견된
현재 acceptance 결정은 위 별도 절에서 관리하며 상세 lumping 수식·수치 기준은 후속 owner 소유이다.
NR-MFE-001 bounded 검토에서는 `Get-Content`로 현재 Feature 관리문서·owned 보고서·NR
main/evidence·reference-model·formulation-verification을 읽고, scoped `rg`로
`002/008/014`와 기존 `FESA-REQ-LSMITC4-034/038/051/056`을 대조했다. Exit code `0`.
원본 reference 재조사, NR 반례 재계산, 새로운 외부 조사와 수식 유도는 수행하지 않았다.
r2에서는 현재 관리문서와 위 기존 static reports/requirements/formulation을 `Get-Content`와
scoped `rg`로 읽었다. Exit code `0`. 기존 nonlinear §10.3의 동일 scale 사용과 현행
reference-model의 closure/별도 post-closure case 구분을 확인했다. 실제 reference 파일을
재조회하거나 과거 수치·hash를 새로 계산하지 않았다. NR 반례/positive evidence도 재실행하지
않았다. 변경은 owned 두 문서뿐이고 실제 C++/FEAST/build/test/reference 회귀는 미실행이다.
변경한 경로는 기본 보고서와 이 상세 보고서 두 개뿐이며 관리문서, source, tests, phase,
공통 정책과 reference artifact는 편집하지 않았다. 정적 링크·필수 metadata·ID/matrix 검사를
완료한 명령과 결과는 Requirement Agent 반환 evidence로 함께 보고한다.
@@ -1,437 +0,0 @@
# MITC4 질량·FEAST 근거와 downstream 검증 후보
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `research-agent`
- Input contract revision: `r2`
- 기본 보고서: [research.md](research.md)
- Web access date: `2026-09-06`
`Fact`는 출처에서 확인한 내용, `Derivation/Inference`는 그 근거를 승인된 FESA에 적용한
연구 판단, `Candidate`는 Formulation/NR가 확정할 항목이다. 이 문서는 최종 수식·API·schema·
tolerance나 benchmark acceptance를 승인하지 않는다.
## Source inventory
모든 외부 source는 원 논문 또는 공식 문서다. `P`는 프로젝트 계약이며 독립 검증 근거가 아니다.
공식 Abaqus 자료는 공개 입력·출력 의미만 설명한다.
| ID | Source identity / stable locator | 신뢰도·적용·한계 |
| --- | --- | --- |
| S01 | Dvorkin & Bathe, *A Continuum Mechanics Based Four-Node Shell Element for General Non-linear Analysis*, Engineering Computations 1 (1984), 77–88, DOI `10.1108/eb023562`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eq.(1),(2), Eq.(25) 직후 및 Fig.7/Tables 3–4; [local transcription](../reference-papers/MITC4/AContinuumMechanicsBasedFourNodeShell/AContinuumMechanicsBasedFourNodeShell_001.md) | 1차 운동학·5 DOF·consistent-mass vibration 예제. Local OCR의 도표값은 검증 없이 acceptance 값으로 채택하지 않음. 비선형·가변두께 범위를 새로 허용하지 않음 |
| S02 | Voet, Sande & Buffa, *A mathematical theory for mass lumping and its generalization with applications to isogeometric analysis*, CMAME 410 (2023), 116033, DOI `10.1016/j.cma.2023.116033`; [author preprint v2](https://arxiv.org/html/2212.03614v2), §1, Definition 3.7, Remark 3.8, Lemma 3.19, §3.3 | 원 연구의 row-sum·positivity·Loewner 근거. 일반 scalar algebra를 회전 tensor에 그대로 옮기는 것은 입증되지 않음 |
| S03 | Bathe & Wilson, *Solution methods for eigenvalue problems in structural mechanics*, IJNME 6 (1973), 213–226, DOI `10.1002/nme.1620060207`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13); [publisher record](https://onlinelibrary.wiley.com/doi/pdf/10.1002/nme.1620060207) | 원 연구의 massless elimination과 fill/storage 한계. 임의 massive DOF를 제거하는 근사 Guyan reduction의 정확성을 주장하지 않음 |
| S04 | Intel oneMKL C Developer Reference, 2026.0 URL edition, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), `generalized` 및 sparse interface 설명 | 공식 admissibility·PARDISO 사용. 설치 runtime와 같은 version string이라는 가정 없음 |
| S05 | 같은 edition, [?feast_scsrgv/?feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `Syntax`, `Input/Output Parameters`; [Matrix Storage](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/matrix-storage.html) | 공식 signature·storage·capacity·결과 의미. `emin≤emax` 본문은 S07의 strict validation과 함께 읽음 |
| S06 | 같은 edition, [Extended Eigensolver Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm` 표 | 공식 count/check/iteration 옵션. Standalone FEAST 다른 버전의 fpm 번호를 대입하지 않음 |
| S07 | 같은 edition, [Extended Eigensolver Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), return-code 표와 `info=1` 주의 | 공식 오류·구간 폭·endpoint 위험. Warning은 Feature 성공으로 자동 승격하지 않음 |
| S08 | E. Polizzi, *Density-Matrix-Based Algorithm for Solving Eigenvalue Problems*, Physical Review B 79 (2009), 115112, DOI `10.1103/PhysRevB.79.115112`; [author preprint](https://arxiv.org/pdf/0901.2665), §II.A Eqs.(6)–(9), §II.B | 원 FEAST의 contour/Rayleigh–Ritz와 B-orthonormality. MKL 옵션·상태 정의는 S05–S07 우선 |
| S09 | Abaqus 2025 [*FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), `Optional parameters`, Lanczos data line | 공식 count·bounds·SIM·normalization·acoustic semantics. FESA가 source Lanczos를 구현한다는 근거가 아님 |
| S10 | Abaqus 2025 [Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm), `Eigenvalue Extraction`, `Normalization`, `Initial Conditions`, `Output` | 공식 `omega²`·generalized mass·base state. Abaqus 내부 질량 정식화에 대한 추론 금지 |
| S11 | Abaqus 2025 [OdbFrame object](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKERRefMap/simaker-c-odbframepyc.htm), modal constructor와 members; [Mode Domain Output](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEOUTRefMap/simaout-c-dboutput-frequency.htm), `Controlling Output Frequency in a Mode Domain Analysis` | 공식 mode/frame 의미. TXT에 없는 step을 임의 생성하는 권한이 아님 |
| S12 | LAPACK 3.12.1, [DLAEV2 original source/documentation](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html), source lines 31–39 (`Purpose`), 102–113 (`Further Details`); authors Univ. Tennessee / UC Berkeley / Colorado Denver / NAG | 공식 2×2 대칭 eigendecomposition과 작은 고유값의 determinant cancellation 한계. FESA scale 선정 규칙이나 새 vendor 호출 의무를 제공하지 않음 |
| S13 | Müller & Bischoff, *A Consistent Finite Element Formulation of the Geometrically Non-linear Reissner-Mindlin Shell Model*, ACME 29 (2022), 3387–3434, [updated original article](https://link.springer.com/article/10.1007/s11831-021-09702-7), Abstract, §2, §§6.1–6.2; corrections [April 2022](https://link.springer.com/article/10.1007/s11831-022-09725-8), [November 2022](https://link.springer.com/article/10.1007/s11831-022-09832-6) | 자체 shell 정식화의 potential 선형화·objectivity 근거만 사용. Review로 분류된 논문의 자체 유도 부분이며 문헌 요약을 1차 근거로 대용하지 않음. FESA의 MITC4·drilling 수식과 동일하지 않음 |
| P01 | [기존 MITC4 formulation](../linear-static-mitc4-shell/formulation.md), §§5,8,9,12,17; [실제 kernel](../../src/fesa/elements/mitc4_shell.cpp), `PhysicalTransformation20`, `DrillingTransformation4`, `EvaluateStiffness`, `GeometryAt`; [ARCHITECTURE](../ARCHITECTURE.md) | 현재 FESA 기하·부호·소유권 계약; 옛 scale 공식은 r2 대체 대상. Legacy research의 오래된 tolerance/승인 절차는 이번 계약에 재사용하지 않음 |
| P02 | [requirements r2](requirements.md), [원본 reference evidence·승인 delta](requirements-evidence.md), [공통 TOLERANCE](../TOLERANCE.md), [ADR](ADR.md) | 승인된 사용자 흐름과 acceptance boundary. 수치 통과 자체의 evidence가 아님 |
| P03 | [기존 nonlinear formulation §§10.2–10.4](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [기존 linear requirements 034/056](../linear-static-mitc4-shell/requirements.md), [NR-MFE-001 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례), [r2 static 회귀 계약](requirements-evidence.md#r2-승인-범위와-정적-재검증) | 기존 initial-fixed scale·objective potential·미분 및 r2 대체/회귀 경계. NR 반례를 재실행한 evidence로 주장하지 않음 |
Hinton–Rock–Zienkiewicz (1976), DOI `10.1002/eqe.4290040305`의
[publisher abstract](https://onlinelibrary.wiley.com/doi/10.1002/eqe.4290040305)는 확인했으나
본문을 확보하지 않아 HRZ의 shell-specific 수식을 근거로 채택하지 않았다.
NASA SP-160은 optional plate benchmark 탐색에서 발견했으나 이번 포트폴리오는 S01 및
직접 검산 가능한 oracle로 충분하므로 필수 artifact나 새 acceptance 요구로 추가하지 않았다.
Configured FEM vault는 이번 요청의 지정 evidence source가 아니며, 기존 wiki/연구 요약은
탐색에만 참고하고 핵심 주장을 위 1차 source에 연결했다.
## R01 — Consistent physical mass와 적분
**Fact, S01/P01:** 기존 보간은 `u = sum Ni(ui + z*(theta_i cross d_i))`,
`z=t*zeta/2`이며 director-parallel rotation은 입자 속도에 기여하지 않는다.
원 논문의 elastic example은 surface `2×2`, thickness 2-point Gauss 및 consistent-mass
주파수 분석을 사용한다. 이는 임의 geometry의 mass 적분이 정확하다는 증명은 아니다.
**Derivation:** `T=1/2 integral rho*|u_dot|² dV`에서 `M_C=integral rho*H^T H dV`가
따른다. Geometry는 기존 `X=sum Ni(Xi+z*di)`와 같은 `J=det(dX/dnatural)`를 사용한다.
양의 quadrature weight·density·유효 J에서는 대칭 PSD와 drilling null action이 직접 따른다.
MITC의 assumed shear는 strain 보간이므로 velocity 보간을 바꾸거나 shear factor `5/6`를
물리 질량에 곱하는 이유가 되지 않는다.
**평판 oracle:** 평행 director·centered flat section이면 병진 scalar block은
`rho*t*integral Ni*Nj dA`, rotary block은 `rho*t³/12*integral Ni*Nj dA`와 tangent
변환의 곱이며 translation–rotation coupling은 0이다. 축정렬 직사각형 면적 A에서는
scalar consistent block이 `rho*t*A/36`에 다음 행렬을 곱한 것과 같다.
```text
4 2 1 2
2 4 2 1
1 2 4 2
2 1 2 4
```
Rotary oracle의 scalar 배율은 위 병진 배율의 `t²/12`다. 이는 bilinear 형상함수의 직접
다항식 적분 결과이며 구현 함수를 다시 호출하는 테스트와 구분한다.
**Candidate/한계:** 곡면에서는 J가 zeta에 의존하여 odd thickness moment와
translation–rotation coupling이 남을 수 있다. Centered section만으로 이를 0으로 두지 않는다.
현재 trilinear geometry의 J 및 H 다항식 차수를 확인해 충분한 적분을 선택할 수 있다.
보수적인 tensor-product 3-point 후보는 각 좌표의 degree≤4 mass integrand를 적분하지만,
정확한 차수·기하 검증 위치·채택 quadrature는 Formulation/NR가 증명한다. 기존 stiffness
quadrature나 기존 geometry 허용 범위를 연구 단계에서 변경하지 않는다.
## R02 — Consistent에서 유도하는 좌표 일관적 lumping
**Fact, S02:** Row-sum, nodal quadrature, diagonal scaling은 일반적으로 서로 다른 근사다.
Nonnegative partition of unity는 scalar row-sum의 positivity를 설명한다. 논문의
absolute-row-sum operator는 일반 행렬의 positivity를 확보하지만 물리 total mass나
회전 nullspace를 보존하는 shell-specific theorem은 아니다.
**Derivation — 피해야 할 적용:** global rotary tensor는 `I-di*di^T`와 다른 director
사이의 cross block을 포함한다. Scalar `diag(M*ones)`는 좌표 회전과 commute하지 않는다.
예를 들어 단위 director `d=(1,1,1)/sqrt(3)`의 `P=I-dd^T`는 `P*ones=0`이지만
rank는 2다. Row-sum은 두 물리 관성을 모두 없애며 absolute row-sum은 drilling에
관성을 더한다. 혼합 translation/rotation 행의 무차별 합은 단위도 섞는다.
**Candidate — scalar moment를 통한 node block:** Consistent의 구성 moment
`Ck_ij=integral rho*Ni*Nj*z^k dV`, `k=0,1,2`를 식별하고 해당 물리 scalar moment에서
row-sum한 뒤 각 node의 director tangent tensor로 재구성하는 방법을 검토할 수 있다.
이는 consistent 결과와의 유도 관계를 증명해야 하며, 별도 unrelated diagonal을 생성하는
우회 경로로 쓰지 않는다. Full consistent block에서 moment를 추출하거나 계산 중 동일
moment를 보존하는 구체적 방식은 Formulation 소유다.
`sum Nj=1` 때문에 이 후보는 node별 `integral rho*Ni*Gi(z)^T Gi(z) dV` 형태로
설명된다. 여기서 `Gi(z)`는 그 node의 병진과 director 변화로 particle velocity를 만드는
map이다. 따라서 양의 measure에서 physical block PSD, director nullspace, tensor
congruence와 총 병진 질량 보존을 독립적으로 검산할 수 있다. Flat case에서는
`m_i=sum_j C0_ij`, 두 tangent inertia `m_i*t²/12`, drilling 0으로 단순화된다.
**한계:** 곡면의 nodal rotational frames를 component별로 직접 더하지 않는다.
Node block은 global 좌표에서 diagonal일 필요가 없다. Translation–rotation moment를
보존하면 6×6 block에 coupling이 있을 수 있다. 이 후보의 positivity와 각 inertia/centroid
보존 관계는 Formulation에서 완성하고 NR가 독립 검토해야 한다. Uniform translation
energy는 보존하지만 일반 회전의 orbital inertia 및 모든 속도장의 consistent energy는
보존한다고 가정하지 않는다. 물리 node velocity의 convexity로 설명 가능한 에너지 차이와
refinement 거동을 검증 후보로 삼을 수 있으며, Abaqus 내부 lumping 동일성을 주장하지 않는다.
## R03 — Massless 좌표, 제약과 유한 spectrum
**Fact, S03:** Massless 좌표를 분리하여 mass가 `diag(Mp,0)`, `Mp` SPD이고 대응
강성 `Kzz`가 가역이면 `Kr=Kpp-Kpz*Kzz^-1*Kzp`와 `Mp`의 문제로 축소하며,
massless 성분은 `z=-Kzz^-1*Kzp*p`로 복원한다. 이 경우 정적 제거는 massless row의
정확한 식이다. 축소 stiffness는 일반적으로 dense가 될 수 있다.
**Inference, P01에 적용:** 먼저 원래 global homogeneous BC의 free injection C로
`Kf=C^T K C`, `Mf=C^T M_L C`를 만들고, 그 공간에서 positive/null basis를 정의한다.
Director가 global axis와 기울어져 있으면 `UR3=drill`은 성립하지 않는다. 일부 global
회전을 고정한 node에서는 원래 drill 방향 전체가 free space에 들어가지 않을 수 있으므로
실제 `Mf`가 full rank가 될 수 있다. 이때 물리 질량이 있는 자유도를 제거해서는 안 된다.
P01의 공통 nodal director와 `Kphys=Tphys^T K20 Tphys`,
`Kdrill=Td^T kd I Td` 때문에 massless 방향의 decoupling을 algebraically 증명할
가능성이 있다. 증명된 경우 node별 작은 basis로 projection하여 sparsity를 유지할 수 있다.
단순히 coupling을 작다고 버리는 것은 그 증명이 아니다. Partial global constraints로
finite space에 남는 stabilization contribution도 보존한다. r2의 massless 처리는
**개선된 constrained stabilized K와 선택된 lumped M의 finite spectrum**에 대한 동등성이다.
Unstabilized 다른 shell formulation이나 consistent spectrum과의 동등성이 아니다.
**Candidate 검증:** 비축정렬 director, partially constrained rotation, constraint-free
shell의 6 physical rigid motions, `Kpz!=0`인 작은 manufactured pencil로 축소/복원과
full free residual을 확인한다. Physical rigid rotation의 nodal UR은 기존 계약의 tangent
projection을 사용한다. Null block이 비가역인 경우 generic inverse/pseudoinverse로
우회하지 않는다. 공통 K/M nullspace는 regular finite-spectrum 문제와 구분해 진단한다.
물리 rank 0, request>rank, nullspace가 없는 경우를 각각 정의한다.
일반 dense basis/Schur를 채택하면 `O(n²)` storage와 factorization fill을 평가해야 한다.
Reference의 25×25 interior nodes는 flat full clamp에서 free DOF 3750,
massive physical dimension 3125로 예상되며, 3125² double 한 행렬만 약 78.1 MB다.
이는 topology에 따른 계산 추정이고 실제 rank/runtime 측정이 아니다. FEAST workspace와
complex shifted factorization을 더해야 하므로 한 행렬 크기로 memory feasibility를 주장하지 않는다.
## R04 — oneMKL FEAST API와 completeness 근거
**설치 관찰:** `mkl/2026.1/include/mkl_solvers_ee.h` lines 33,87에 `feastinit`,
`dfeast_scsrgv`가 있다. `mkl_version.h`는 major `2026`, minor `0`, update `1`,
build date `20260612`, `INTEL_MKL_VERSION=20260100`이다. Directory `2026.1`과
header version 표기를 임의로 통일하지 않는다. 실제 linked runtime는 Implementation이 기록한다.
`mkl_types.h`의 `MKL_INT`는 LP64에서 `int`, `MKL_ILP64`에서 64-bit다. N, nnz+1,
row/column index와 N×m0 allocation을 checked conversion해야 하며 vendor type은 adapter 내부다.
**Fact, S04/S05:** Real symmetric generalized `A*x=lambda*B*x`에서 B는 SPD여야 한다.
`dfeast_scsrgv`는 A/B 각각 values·row pointer·column index를 받으며 같은 storage family를
사용한다. `uplo=U/L/F`, `n>0`, `0<m0<=n`, `m0>=interval multiplicity count`다.
`fpm`은 128개 `MKL_INT`; `e/res`는 m0, eigenvectors는 N×m0의 column storage로
준비하고 첫 m columns만 소비한다. Documented CSR은 row pointer terminal `nnz+1`인
1-based convention으로 대응한다. A/B sparsity pattern은 같을 필요가 없다. 내부 0-based
CSR을 인덱스 변환 없이 넘기지 않는다. `epsout`은 trace 변화량이고 개별 residual을 대신하지 않는다.
**Fact, S06 — C index 표:**
| Parameter | 문서 의미 / 연구 적용 |
| --- | --- |
| `feastinit(fpm)` | 호출 전 초기화; 다른 FEAST 배포판의 설정 배열을 복사하지 않음 |
| `fpm[1]` | contour points; 허용된 값만 사용 |
| `fpm[2]`, `[3]` | double precision stopping exponent, refinement loop bound; 값은 NR/계약에서 고정 |
| `fpm[4]` | 0=generated initial subspace, 1=user subspace; 재현성과 projection rank 검증 필요 |
| `fpm[5]` | 0=residual stopping, 1=trace stopping; zero mode는 독립 scale-aware residual 필수 |
| `fpm[13]` | 1은 한 contour의 subspace만 반환; 완료 eigenpairs로 소비하지 않음 |
| `fpm[26]`, `[27]` | CSR validity, B SPD check 옵션 |
| `fpm[49]` | CSR interval eigenvalue count를 m0에 반환하고 flag를 0으로 재설정; count와 solve는 구분 |
| `fpm[63]` 및 `[64..127]` | PARDISO user iparm 적용 여부 및 매핑; 후반부는 output도 되므로 call 간 변경 고려 |
**Fact, S07:** `info=0` successful; `1` empty interval/검색 실패 가능,
`2` nonconvergence, `3` insufficient subspace, `4` subspace-only이다.
`-1/-2` allocation/inner solver, `-3/-4` reduced solver/B-not-SPD,
`-5` count failure(구간 끝이 eigenvalue 또는 근접할 수 있음), `200/201/202`는
interval/subspace/N 오류다. `100+i`는 `fpm[i-1]` 오류다.
S05 본문은 `emin<=emax`로 쓰지만 명시적인 `200` 검증은 `emin>=emax`를 거부하므로
실제 계약은 strict `emin<emax`로 설정할 수 있다. 이것은 사용자 physics 결정이 아니다.
매우 넓은 구간 안의 작은 cluster를 놓칠 수 있다는 공식 주의가 있으므로 빈 반환을 곧
없는 spectrum으로 단정하지 않는다.
**Candidate bounded policy rationale:** SPD reduction/whitening 뒤 차원이 일관된 spectral
bound(예: 대칭 표준 문제의 Gershgorin bound)를 유도하면 전체 spectrum 밖의 유한 하한과
상한을 얻을 수 있다. Reference 값이나 hardcoded frequency로 구간을 정하지 않는다.
Zero를 포함하는 하한을 두고 interval count를 통해 낮은 순서의 requested N을 덮는 상한을
찾되, endpoint collision·overflow·count/solve mismatch와 시도 수를 제한한다. Count가
cluster 전체를 포함하면 m0가 requested N보다 커질 수 있으며 반드시 multiplicity를
수용한다. Sort 후 필요한 첫 N을 출력하더라도 원래 계산 multiplicity와 pairing을 유지한다.
`m0=N`이 충분하다는 가정, 매번 상한만 무한히 늘리는 정책, count 성공을 eigenpair 성공으로
취급하는 정책은 근거가 없다. Final bounds·성장/축소·cluster tie·subspace/seed·실패 정책은
Formulation/NR 소유이고 small N 및 N=physical rank도 FEAST 실제 runtime로 검증한다.
Intel S06은 `fpm[49]` 결과를 total number로 기술하며 stochastic estimate라고 설명하지
않는다. 그렇더라도 이 문서만으로 floating-point inertia/count의 모든 조건에서의 정확성이나
전체 algorithm의 completeness를 증명했다고 주장하지 않는다. S07의 endpoint/count 실패와
작은 독립 spectrum 검증을 유지한다. 다른 standalone FEAST 버전의 stochastic-count
옵션과 혼동하지 않는다. 요청 N의 외부 authority는 사용자 확정대로 `.inp` data이며
내부 count는 interval/subspace를 정하는 evidence다. TXT 행수나 count로 N을 바꾸거나
새 사용자 interval/count API를 만들지 않는다.
**Fact, S08 / 적용:** FEAST의 Rayleigh–Ritz 식은 B-orthonormal reduced vectors에서
`X^T B X=I`를 준다. 내부 벡터는 같은 lumped M으로 검증한다. Repeated eigenspace의
개별 방향과 sign은 유일하지 않으므로 vector component exact equality를 acceptance로
추가하지 않는다. Count/completeness와 residual/Gram은 서로 대체하지 않는다.
## R05 — Reference의 관찰 가능한 의미와 family
**Fact, S09/S10:** `*FREQUENCY`의 첫 값은 requested count다. Lanczos data line의
blank min/max는 별도 bound를 지정하지 않으며, 뒤 shift와 block controls의 공란을 0 입력으로
오인하지 않는다. `SIM`은 source architecture 설정이고 `NORMALIZATION=MASS`는
generalized mass 1이다. Acoustic coupling ON은 acoustic/structural coupled model에
작용한다. 적용 대상 acoustic 요소·ASI·coupling이 없는 현재 input의 옵션은 무해하게
mapping할 근거가 있으며, 실제 acoustic 모델은 승인 subset 밖이다.
**Inference/P02:** 알고리즘 지정의 FESA 해석은 source Lanczos 보존 + actual backend
FEAST이다. SIM을 FESA backend 기능으로 주장하지 않고 명시된 무해한 조합만 I/O가
진단 정책으로 고정한다. 원본의 output/restart 요청을 읽을 때에도 새 modal stress/reaction
지원으로 확대하지 않는다. 실제 prior step, preload, damping, nonzero prescribed state를
삭제하여 현재 subset처럼 실행하는 근거는 없다.
**Fact/관찰:** S10은 `lambda=omega²`와 cycles/time frequency를 구분한다. S11은
modal frame의 mode member와 mode-domain output을 정의한다. 원본 TXT는 `Frame: Mode`
1~10과 Value를 포함하고 input에는 단일 `Step-2`만 있다. 따라서 unique step + source
mode mapping이 가능하며 Freq 반올림으로 Value를 다시 계산하지 않는다.
**NR handoff:** 공통 TOLERANCE는 같은 step/frame만 family로 묶는다. 원본에 각각의 modal
frame이 있는 점을 유지하여 mode별 scalar family를 정의하는 방향을 검토한다. 단일 HDF5
table에 저장했다는 이유로 다른 source mode/frame을 하나의 family로 모으지 않는다.
Singleton family에서는 공통 RMS 규칙도 그대로 적용하며 scalar라는 이유로 생략하지 않는다.
최종 family 이름·identity·blocking 및 exact mapping은 NR/I/O가 고정한다.
Repeated Value는 서로 다른 mode identity로 보존하며 source missing/extra/duplicate/nonfinite
검사 후 공통 정책을 적용한다. Displayed repeated 값으로 실제 exact degeneracy를 단정하거나
mode shape matching으로 외부 acceptance를 넓히지 않는다.
## R06 — 독립 verification portfolio 후보
각 case의 구체적 구성·수치 기준은 NR가 정한다. 새 eigen external reference는 지정 Value
10개뿐이며, r2에 승인된 기존 static 회귀는 R07과 Requirement 024의 기존 계약을 따른다.
| Candidate | 잡아내는 오류 / 독립 기대값 | 한계 |
| --- | --- | --- |
| 직사각형 single-element mass | R01 polynomial oracle, 3 translations total `rho*A*t`, 2 rotary inertia, null drilling | 곡면 적분·semantic 연결은 검증하지 않음 |
| 곡면/왜곡 요소의 independent velocity integration | 직접 particle kinetic energy와 consistent quadratic form, R02 derived relation/양의 node block | 동일 production H/J 코드를 재호출하는 oracle는 독립성이 부족 |
| Rigid/coordinate tests | 기존 tangent rigid motion의 zero stiffness; geometry/director와 개선 scale을 독립 재계산한 complete K·두 질량의 congruence 및 eigenvalue invariant | NR-MFE-001의 같은 물리 partial BC 필수; old kd를 고정한 단순 tensor 변환이나 full-free/full-clamp만으로 대체하지 않음. 일반 MPC는 추가하지 않음 |
| Density scaling | 두 mass가 density 배율 c에 비례, 선택된 eigenvalues가 1/c, mass-normalized vector magnitude가 1/sqrt(c) | 다른 density field의 material mapping은 별도 양성/음성 test |
| 작은 manufactured singular pencil | R03 식을 손으로 계산하여 exact finite eigenvalues·복원 residual, partial global constraint와 rank case | Element/mass 조립 correctness는 별도 검증 |
| 작은 diagonal/rotated SPD pencil | FEAST N=1/2, repeated/clustered/zero/negative case, request=rank, count/m0/interval edge 및 실패 진단 | 직접 hand matrix는 전체 procedure/reference를 대신하지 않음 |
| Modal residual / Gram / energy | Free-space `Kphi-lambda*M_L*phi`, `Phi^T*M_L*Phi=I`, `phi^T*K*phi=lambda`와 constraint 복원 | 작은 residual만으로 최저 모드 completeness를 보장하지 못함 |
| Simply-supported plate analytical limit | S01 Fig.7/Table4의 plate frequency 사례 또는 `lambda=(D/(rho*t))*((m*pi/a)^2+(n*pi/b)^2)^2`의 thin-plate Navier limit | 마지막 식은 직접 thin-plate PDE로 유도·검산할 후보; rotary/shear를 포함한 유한 두께 shell의 exact oracle로 쓰지 않음 |
| 지정 clamped plate reference | 원본 `.inp`와 TXT Value의 순서·multiplicity·family 비교; square-symmetry cluster 진단 | 비교만으로 mass·mode shape·drilling·내부 알고리즘의 correctness를 주장하지 못함 |
Modal physics는 무하중 정적 `Kphi=0`나 정적 reaction balance를 모든 eigenvector에
요구하지 않는다. Inertia와 elastic restoring force의 균형인 free residual을 검사한다.
Dimensional translation/rotation 차이는 Formulation의 congruent scaling으로 처리하고
zero mode의 residual denominator와 rank threshold는 NR가 정한다. 두께 변경에서는
membrane, bending, shear, rotary inertia가 서로 다르게 변하므로 density처럼 모든 mode에
단일 thickness power law를 강제하지 않는다.
## R07 — r2 stabilization 근거와 영향
### 입력 delta와 보존 근거
`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)을 적용한다.
기존 `min(R+)`의 기저 의존성은 P03의 NR 반례로 확인되었다. 그 반례와 r1의 mass oracle를
재계산하지 않는다. 사용자 승인은 개선 범위를 확정하며 특정 새 수식이나 NR 통과를 뜻하지 않는다.
| 기존 근거 | r2 영향 판단 |
| --- | --- |
| S01/S02, R01/R02 mass·moment·quadrature | Numerical K scale과 독립이다. 기존 primary 근거·한계 및 [mass 계약](formulation-mass.md)을 보존한다 |
| S03, R03 및 [eigen E2–E4](formulation-eigen.md) | Schur 원리는 그대로다. Decoupling의 적용 대상은 개선된 K이며 아래 positive/director 구조를 Formulation이 재확인해야 한다 |
| S04–S08, R04 FEAST/정수/count | Backend·lumped M·입력 N 요구가 바뀌지 않아 근거를 보존한다. 설치/runtime를 새로 검증한 것은 아니다 |
| S09–S11, R05 reference 의미 | 새 eigen Value-only·원본 identity·공통 tolerance가 불변이다. 기존 artifact/hash는 r1 관찰 이력으로 보존한다 |
| R06 및 [기존 V5](formulation-verification.md) | Complete K 재계산과 지원 partial BC 반례 통과가 필수다. r1의 제한된 eigen 좌표 검증 설명을 r2 acceptance로 사용하지 않는다 |
| P01/P03 static | 옛 scale 선정식만 대체하며 initial-fixed lifecycle·objective potential·physical recovery 제외와 기존 회귀 계약은 유지한다 |
### 공변적인 secondary scale 후보
**Fact, S12:** 대칭 2×2 행렬은 직교 회전으로 대각화할 수 있다. LAPACK 원 source는
그 변환과 반환 고유값을 명시하고, 작은 고유값 계산에서 determinant 상쇄로 상대 정확도를
잃을 수 있음을 경고한다. 이를 새 shell scale의 최종 선정 근거와 혼동하지 않는다.
**Derivation — 기저 변화:** 초기 physical `K20^0`에서 node i의 두 회전 성분에 해당하는
2×2 principal block을 `R_i`, 해당 성분을 global tangent rotation으로 보내는 orthonormal
map을 `U_i`라 하자. 전역 rigid coordinate rotation `G`와 접평면 기저 변경 `O_i`에서
`U_i'=G U_i O_i`, `R_i'=O_i^T R_i O_i`이면
`U_i' R_i' U_i'^T=G(U_i R_i U_i^T)G^T`다.
따라서 `tr(R_i')=tr(R_i)`와 `det(R_i'-lambda I)=det(R_i-lambda I)`가 직접 따른다.
개별 대각값은 이 항등식의 scalar invariant가 아니다. 서로 다른 node의 기저 변경도
block별로 독립 허용된다. 실제 physical kernel이 이 변환 법칙을 만족하는지는 후속 검증 대상이다.
**Candidate — trace 기반, 우선 검토 권고:** `tau_i=tr(R_i)/2`에서 하나의 positive element
scale을 만들 수 있다. `mean_i(tau_i)=sum_i tr(R_i)/8`은 기존 여덟 physical rotation
성분의 평균이며, physical K가 PSD이고 회전 강성이 적어도 하나 존재하면 양수다.
또 다른 후보는 positive nodal `tau_i`의 최솟값으로 기존 최소값 집계를 유지하는 것이다.
두 후보 모두 좌표/기저 불변이며 force·length 차원을 갖는다. 초기 K의 물리적인 PSD 및
zero/nonfinite inventory 처리는 명시적으로 확인해야 하며 양의 trace만으로 PSD를 판정하지 않는다.
최솟값 후보의 zero-block 처리 또는 전 node positivity가 필요하면 기존 유효 geometry와의
관계를 증명해야 한다. 암묵적인 새 geometry 제외·epsilon floor로 보완하지 않는다.
**Candidate — 최소 spectral 값:** `lambda_min(R_i)`도 기저 불변이고 작은 회전 강성 방향을
반영한다. 그러나 positive 여부·zero block 처리와 작은 eigenvalue의 상쇄/conditioning
문제가 추가된다. 단순 `(trace-sqrt(discriminant))/2` 구현의 안정성을 가정하지 않는다.
Trace 후보에는 이 spectral subtraction이 없으므로 bounded scale 개선의 첫 검토 방향으로
권고한다. 이 비교는 runtime 성능 측정 또는 수식 채택 판정이 아니다.
어느 후보든 기존 차원 없는 `10^-3` 계수와 `K_d=k_d I4`의 numerical 역할을 유지하는
최소 변경을 검토할 수 있다. Reference 오차를 보고 scale/계수를 조정하거나 coefficient sweep,
물리 drilling 관성·strain·새 입력 설정을 추가할 근거는 없다. 정확한 aggregation, finite/positive
검사 및 scale 공식 채택은 Formulation 소유이고 numerical 기준은 NR 소유다.
### Linear null과 nonlinear lifecycle의 다른 적용 조건
**Derivation/조건, P01/P03와 S03:** Linear/eigen에서는 기존 `T_p`, `T_d`와
`K_drill=T_d^T k_d I4 T_d`를 그대로 두고, 모든 element의 새 `k_d`가 finite positive이면
실제로 free space에 남는 director null `Z`에 대해
`K_f Z=Z diag(sum_{e incident i} k_d,e)` 구조를 유지할 수 있다.
Physical K가 director 방향을 소거하고 공통 nodal director를 사용한다는 전제가 필요하다.
이 조건에서 `Kzz>0`, `Kpz=0`이므로 기존 analytic projection의 정확성 근거가 유지된다.
이는 [E3](formulation-eigen.md)의 적용 조건 재확인이지 새 수식/실제 조립의 검증 완료가 아니다.
Null이 없는 partial BC에는 개선 stabilization이 남으며 이를 삭제해서는 안 된다.
새 K와 옛 K 사이의 partial-BC spectrum 동일성은 요구하지 않는다.
**Fact, S13:** 논문의 자체 shell 정식화는 director manifold에 맞는 potential의 일관
선형화와 objective interpolation을 함께 다룬다. 이것은 FESA의 drilling potential를
제공하지 않는다. April correction은 proofing 오류, November correction은 Eq.(5.26)의
LaTeX rendering 오류를 알리며 현재 원문이 교정되었다고 명시한다. 그 식을 이 후보에
복사하거나 FESA의 기존 운동학을 해당 논문의 보간으로 교체하지 않는다.
**Derivation/조건, P03:** 기존 nonlinear `Pi_d=k_d*gamma^T gamma/2`에서 새 scale을
초기 reference physical K로 계산한 뒤 모든 increment/iteration에서 불변으로 유지하면
`Dk_d=D²k_d=0`이다. 따라서 기존 exact residual/Hessian은 동일한 `gamma`, `Dgamma`,
`D²gamma`에 새 scalar를 곱하는 구조를 유지한다. 기저 불변 reference scale과 objective
gamma를 함께 유지하면 같은 물리 상태의 좌표 변경에 따른 potential 불변성도 보존할 조건이 된다.
Trial tangent에서 scale을 다시 선정하면 추가 미분항과 min의 비매끄러움이 생길 수 있어 이
initial-fixed 계약을 대체할 수 없다. Scale이 같다는 이유로 nonlinear의 corotation coupling을
linear의 단순 director projection과 동일하게 만들지 않는다.
**Limit:** 양의 `k_d`는 numerical potential의 비음성과 pure-drill 양의 작용을 뜻한다.
변형된 nonlinear Hessian에는 `sum gamma_i D²gamma_i`가 있어 모든 상태의 SPD를 뜻하지
않는다. Linear E3 decoupling 증명을 nonlinear Hessian이나 prestressed eigenproblem에
일괄 적용하지 않는다. 새 feature의 eigen 상태는 승인된 원형상·무응력 상태다.
### Verification 연결과 남는 owner 작업
NR-MFE-001의 동일 물리 partial BC에서 새 scale과 complete K를 독립 재계산하고,
대응 eigen spectrum 및 정적 response의 좌표 검증을 수행해야 한다. 옛 계수를 외부에서
고정한 tensor 변환만 비교하면 원래 결함을 검출하지 못한다. 동일 물리 BC/loads의 변환과
허용된 입력 범위는 유지한다. 추가 새 reference 모델을 요구하지 않는다.
기존 static 회귀의 원본 경로·quantity·identity·policy는 P03의
[Requirement evidence portfolio](requirements-evidence.md#r2-승인-범위와-정적-재검증)에
한 곳에서 유지한다. Linear `shell` 및 nonlinear `shellNL`/`shellNL-meshfine`와 linear-limit
case, 내부 tangent·선형극한·objectivity·평형·reaction·energy·rollback 검증을 새 scale로
실행해야 한다. 기존 U blocking/UR warning-only와 nonlinear reaction review-only를
eigen Value-only 요구로 삭제하지 않는다. 오래된 통과 보고서는 새 실행 evidence가 아니다.
남는 작업은 Formulation의 단일 후보 채택·positivity/변환 증명·적용 경계, NR의 독립
반례 해소·conditioning·metric·필수 case와 수치 기준, Implementation/Physics의 실제
정적/eigen 재검증이다. R07에서 새 authoritative conflict나 사용자 재결정 필요는 발견하지 않았다.
## 실행 evidence와 미실행
### r1 조사 이력
Read-only `Get-Content`, scoped `rg`, `Get-FileHash`로 필수 공통/Feature/기존 MITC4
문서, 실제 kernel과 원본 두 reference 파일을 읽었다. 해당 읽기·hash 명령은 exit `0`이다.
아래는 핵심 재현 진입점이다.
```powershell
Get-Content -Raw '.codex/skills/fem-research-evidence/SKILL.md'
Get-Content -Raw 'docs/mitc4-shell-feast-eigen/requirements.md'
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness' 'src/fesa/elements/mitc4_shell.cpp'
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 52
Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
SHA-256은 input `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`,
TXT `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`로 P02와 같다.
설치 include에서 `rg`로 위 R04의 declarations/version/type을 확인했다. 별도
`rg -n 'MKL_INTERFACE|MKL_ILP64|lp64' cmake CMakeLists.txt`는 no-match exit `1`이며
linked ABI를 판정한 것이 아니다. Numpy/pypdf/fitz 탐색은 exit `0`, 모두 미설치였고
설치·수치 실험·외부 solver를 수행하지 않았다.
Web `search_query/open/find`로 S01–S11을 조사했다. S03 PDF는 초기 검색·열기에서
`STATIC CONDENSATION`과 Eqs.(9)–(13) 텍스트를 얻었으나 후속 부분 열기는 timeout이
발생했다. S01의 수식은 보존된 원문 transcription과 현재 승인 계약도 대조했다.
S02 author HTML, S04–S07 Intel 본문, S08 author PDF, S09–S11 공식 문서는 접근했다.
NASA PDF/일부 publisher/feastinit 개별 URL 접근 실패를 필수 근거로 사용하지 않았다.
한 차례 tool orchestration의 quote syntax 오류는 도구 실행 전 실패했으며 수정 후 검색을
수행했다. 이런 접근 실패를 구현 또는 reference comparison 성공으로 기록하지 않는다.
Owned 두 문서의 metadata/상대 링크/requirement coverage를 read-only Python here-script
(`python -B -`, `pathlib`, `re`, `urllib.parse.unquote`)로 검사했다. Exit `0`,
documents `2`, local links `21`, requirement coverage `26`, issues `0`이다.
`git diff --check`는 exit `0`이며 다른 owner의 관리문서 LF/CRLF 경고가 출력되었다.
신규 untracked 연구 문서는 별도 Python 정적 검사로 trailing whitespace·final newline·상대
링크를 확인했다. Exit `0`, files `2`, local links `21`, issues `0`이다. `git status --short`에서
연구 두 파일과 Coordinator 관리문서 변경을 구분했으며 관련 없는 파일을 수정하거나 stage하지 않았다.
CMake/CTest, Harness, FEAST runtime와 numerical reference comparison은 이
연구 단계의 범위가 아니므로 미실행이다. Source/tests/build/phase/upstream/tolerance/reference는
편집하지 않았으며 다른 owner의 변경을 되돌리지 않았다.
### r2 bounded 조사와 정적 확인
관리문서·requirements r2·기존 research 및 NR/Formulation/static 계약을 `Get-Content`와
scoped `rg`로 읽었다. 정상 조회는 exit `0`이다. 초기 `rg`의 literal `research*.md` 경로는
Windows 경로 오류였고 `rg ... docs/nonlinear-static-newton-raphson -g 'research*.md'`로
수정하여 exit `0`으로 재조회했다. 최초 patch는 context 불일치로 적용되지 않았으며 실제
문맥을 확인한 뒤 owned 두 파일에만 적용했다. Source·test·build·phase·Hook·reference와
upstream 문서는 수정하지 않았고 Git mutation은 수행하지 않았다.
Web `search_query/open/find`에서 S12 공식 source와 S13 교정된 원문 및 두 correction을
열었다. 새로 인용한 primary 사실은 그 본문에서 확인했으며 검색 요약이나 타 solver의
비공개 동작을 근거로 사용하지 않았다. S01–S11 전체를 재조사하지 않았다.
Read-only `python -B -` here-script로 두 문서의 owner/Feature/r2 metadata, final newline,
trailing whitespace, 상대 링크 실재 및 requirements matrix ID와 coverage 표의 set equality를
검사했다. Exit `0`, documents `2`, local links `32`, required/covered IDs `27`, issues `0`이다.
별도 `python -B -`에서 `subprocess.run(['git','show','HEAD:'+path],check=True)`로 기존
연구 상세를 읽고 정규식으로 R01/R02/R04/R05 절 및 S01–S11 inventory 행을 비교했다.
Exit `0`, 모든 보존 구간이 동일했다. 이는 문서 보존 확인이며 수치 검증이 아니다.
`git diff --check`는 exit `0`; LF/CRLF 정보성 경고만 있었다. `git diff`/`git status --short`로
owned 두 파일과 Coordinator의 coordination 변경을 구분했으며 타 owner 변경을 보존했다.
r2에서 reference 파일·hash 재조사, NR 반례·mass oracle 재계산, CMake/CTest, Harness,
FEAST runtime 및 정적/eigen reference comparison은 수행하지 않았다. 원본/reference 및
기존 보고서의 성공 기록을 r2의 실행 성공으로 재분류하지 않는다. 최종 파일 hash는 반환
envelope에 제공하며 본 문서 안에 자기 hash를 기록하지 않는다.
+472 -8
View File
@@ -1,20 +1,27 @@
# MITC4 질량과 FEAST 고유치해석 연구
# 이전 MFE 연구와 출처
현재 채택 여부는 [eigen2의 연구·정식화](../mitc4-shell-feast-eigen2/README.md)를 따른다.
<a id="research"></a>
<a id="research--mitc4-질량과-feast-고유치해석-연구"></a>
## MITC4 질량과 FEAST 고유치해석 연구
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `research-agent`
- Input contract revision: `r2`
- 조사일 / web access date: `2026-09-06`
- 요청 outcome: `pass`; 다음 owner: `formulation-agent`. 최종 gate와 전이는 Coordinator 소유이다.
입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[requirements r2](requirements.md), [reference 관찰·승인 delta](requirements-evidence.md)이다.
[requirements r2](requirements.md#requirements), [reference 관찰·승인 delta](requirements.md#requirements-evidence)이다.
[프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [공통 ADR](../ADR.md),
[TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용한다.
Source inventory, locator, API evidence, 유도 후보와 검증 한계는
[research-evidence.md](research-evidence.md)에 둔다.
[research-evidence.md](research.md#research-evidence)에 둔다.
## 핵심 결과
<a id="research--핵심-결과"></a>
### 핵심 결과
1. 원 MITC4의 director 운동학에서 kinetic energy를 적분하면 병진 및 두 접평면 회전의
consistent mass를 구성할 수 있다. 원 논문은 consistent mass를 사용한 주파수 예제도
@@ -46,12 +53,13 @@ Source inventory, locator, API evidence, 유도 후보와 검증 한계는
초기 reference에서만 계수를 계산·고정하고 기존 drilling map/potential을 유지하면
nonlinear 미분 구조와 linear massless decoupling을 보존할 조건을 명시할 수 있다.
최종 계수식 채택과 반례 해소 판정은 후속 owner 소유다. 근거: `S12`, `S13`, `P03`,
[r2 delta와 후보](research-evidence.md#r07--r2-stabilization-근거와-영향).
[r2 delta와 후보](research.md#research-evidence--r07--r2-stabilization-근거와-영향).
사용자 후속 확정대로 요청 mode 개수의 authority는 `.inp`의 `*FREQUENCY` data다.
현재 값은 10이며 reference row 수나 FEAST 내부 count로 요청수를 추론하지 않는다.
## Requirement coverage
<a id="research--requirement-coverage"></a>
### Requirement coverage
ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 owner를 명시해 누락과
완료를 구분한다. 아래 표는 requirements matrix를 대체하지 않는다.
@@ -70,7 +78,8 @@ ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 ow
| `023`, `024`, `025` | `P01`~`P03`, `R07`: TDD·MSVC·기존 linear/nonlinear 정적 회귀·closure는 후속 실행 evidence | Planning, Implementation, Physics, Release |
| `027` | `S12`, `S13`, `P03`, `R07`: basis-invariant scalar 후보, 초기 고정 scale·objective potential 및 positive/null 역할 보존 조건 | Formulation, NR |
## Handoff와 제한
<a id="research--handoff와-제한"></a>
### Handoff와 제한
`MFE-OQ-003`의 개선안 승인으로 기존 계약 충돌의 범위 선택은 해결되었다. 새 중요한
사용자 미결정은 발견하지 않았다. 승인된
@@ -92,3 +101,458 @@ ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 ow
새 primary 근거 두 그룹과 기존 static 계약 근거를 추가했다. 명령과 결과는 상세 문서 끝에 있다.
C++ build/test, Harness, 외부 solver와 FESA reference 수치 비교는 stage 범위 밖이므로
미실행이며 통과로 보고하지 않는다.
<a id="research-evidence"></a>
<a id="research-evidence--mitc4-질량feast-근거와-downstream-검증-후보"></a>
## MITC4 질량·FEAST 근거와 downstream 검증 후보
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [research.md](research.md#research)
- Web access date: `2026-09-06`
`Fact`는 출처에서 확인한 내용, `Derivation/Inference`는 그 근거를 승인된 FESA에 적용한
연구 판단, `Candidate`는 Formulation/NR가 확정할 항목이다. 이 문서는 최종 수식·API·schema·
tolerance나 benchmark acceptance를 승인하지 않는다.
<a id="research-evidence--source-inventory"></a>
### Source inventory
모든 외부 source는 원 논문 또는 공식 문서다. `P`는 프로젝트 계약이며 독립 검증 근거가 아니다.
공식 Abaqus 자료는 공개 입력·출력 의미만 설명한다.
| ID | Source identity / stable locator | 신뢰도·적용·한계 |
| --- | --- | --- |
| S01 | Dvorkin & Bathe, *A Continuum Mechanics Based Four-Node Shell Element for General Non-linear Analysis*, Engineering Computations 1 (1984), 77–88, DOI `10.1108/eb023562`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eq.(1),(2), Eq.(25) 직후 및 Fig.7/Tables 3–4; [local transcription](../reference-papers/MITC4/AContinuumMechanicsBasedFourNodeShell/AContinuumMechanicsBasedFourNodeShell_001.md) | 1차 운동학·5 DOF·consistent-mass vibration 예제. Local OCR의 도표값은 검증 없이 acceptance 값으로 채택하지 않음. 비선형·가변두께 범위를 새로 허용하지 않음 |
| S02 | Voet, Sande & Buffa, *A mathematical theory for mass lumping and its generalization with applications to isogeometric analysis*, CMAME 410 (2023), 116033, DOI `10.1016/j.cma.2023.116033`; [author preprint v2](https://arxiv.org/html/2212.03614v2), §1, Definition 3.7, Remark 3.8, Lemma 3.19, §3.3 | 원 연구의 row-sum·positivity·Loewner 근거. 일반 scalar algebra를 회전 tensor에 그대로 옮기는 것은 입증되지 않음 |
| S03 | Bathe & Wilson, *Solution methods for eigenvalue problems in structural mechanics*, IJNME 6 (1973), 213–226, DOI `10.1002/nme.1620060207`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13); [publisher record](https://onlinelibrary.wiley.com/doi/pdf/10.1002/nme.1620060207) | 원 연구의 massless elimination과 fill/storage 한계. 임의 massive DOF를 제거하는 근사 Guyan reduction의 정확성을 주장하지 않음 |
| S04 | Intel oneMKL C Developer Reference, 2026.0 URL edition, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), `generalized` 및 sparse interface 설명 | 공식 admissibility·PARDISO 사용. 설치 runtime와 같은 version string이라는 가정 없음 |
| S05 | 같은 edition, [?feast_scsrgv/?feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `Syntax`, `Input/Output Parameters`; [Matrix Storage](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/matrix-storage.html) | 공식 signature·storage·capacity·결과 의미. `emin≤emax` 본문은 S07의 strict validation과 함께 읽음 |
| S06 | 같은 edition, [Extended Eigensolver Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm` 표 | 공식 count/check/iteration 옵션. Standalone FEAST 다른 버전의 fpm 번호를 대입하지 않음 |
| S07 | 같은 edition, [Extended Eigensolver Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), return-code 표와 `info=1` 주의 | 공식 오류·구간 폭·endpoint 위험. Warning은 Feature 성공으로 자동 승격하지 않음 |
| S08 | E. Polizzi, *Density-Matrix-Based Algorithm for Solving Eigenvalue Problems*, Physical Review B 79 (2009), 115112, DOI `10.1103/PhysRevB.79.115112`; [author preprint](https://arxiv.org/pdf/0901.2665), §II.A Eqs.(6)–(9), §II.B | 원 FEAST의 contour/Rayleigh–Ritz와 B-orthonormality. MKL 옵션·상태 정의는 S05–S07 우선 |
| S09 | Abaqus 2025 [*FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), `Optional parameters`, Lanczos data line | 공식 count·bounds·SIM·normalization·acoustic semantics. FESA가 source Lanczos를 구현한다는 근거가 아님 |
| S10 | Abaqus 2025 [Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm), `Eigenvalue Extraction`, `Normalization`, `Initial Conditions`, `Output` | 공식 `omega²`·generalized mass·base state. Abaqus 내부 질량 정식화에 대한 추론 금지 |
| S11 | Abaqus 2025 [OdbFrame object](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKERRefMap/simaker-c-odbframepyc.htm), modal constructor와 members; [Mode Domain Output](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEOUTRefMap/simaout-c-dboutput-frequency.htm), `Controlling Output Frequency in a Mode Domain Analysis` | 공식 mode/frame 의미. TXT에 없는 step을 임의 생성하는 권한이 아님 |
| S12 | LAPACK 3.12.1, [DLAEV2 original source/documentation](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html), source lines 31–39 (`Purpose`), 102–113 (`Further Details`); authors Univ. Tennessee / UC Berkeley / Colorado Denver / NAG | 공식 2×2 대칭 eigendecomposition과 작은 고유값의 determinant cancellation 한계. FESA scale 선정 규칙이나 새 vendor 호출 의무를 제공하지 않음 |
| S13 | Müller & Bischoff, *A Consistent Finite Element Formulation of the Geometrically Non-linear Reissner-Mindlin Shell Model*, ACME 29 (2022), 3387–3434, [updated original article](https://link.springer.com/article/10.1007/s11831-021-09702-7), Abstract, §2, §§6.1–6.2; corrections [April 2022](https://link.springer.com/article/10.1007/s11831-022-09725-8), [November 2022](https://link.springer.com/article/10.1007/s11831-022-09832-6) | 자체 shell 정식화의 potential 선형화·objectivity 근거만 사용. Review로 분류된 논문의 자체 유도 부분이며 문헌 요약을 1차 근거로 대용하지 않음. FESA의 MITC4·drilling 수식과 동일하지 않음 |
| P01 | [기존 MITC4 formulation](../linear-static-mitc4-shell/formulation.md), §§5,8,9,12,17; [실제 kernel](../../src/fesa/elements/mitc4_shell.cpp), `PhysicalTransformation20`, `DrillingTransformation4`, `EvaluateStiffness`, `GeometryAt`; [ARCHITECTURE](../ARCHITECTURE.md) | 현재 FESA 기하·부호·소유권 계약; 옛 scale 공식은 r2 대체 대상. Legacy research의 오래된 tolerance/승인 절차는 이번 계약에 재사용하지 않음 |
| P02 | [requirements r2](requirements.md#requirements), [원본 reference evidence·승인 delta](requirements.md#requirements-evidence), [공통 TOLERANCE](../TOLERANCE.md), [ADR](ADR.md) | 승인된 사용자 흐름과 acceptance boundary. 수치 통과 자체의 evidence가 아님 |
| P03 | [기존 nonlinear formulation §§10.2–10.4](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [기존 linear requirements 034/056](../linear-static-mitc4-shell/requirements.md), [NR-MFE-001 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례), [r2 static 회귀 계약](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증) | 기존 initial-fixed scale·objective potential·미분 및 r2 대체/회귀 경계. NR 반례를 재실행한 evidence로 주장하지 않음 |
Hinton–Rock–Zienkiewicz (1976), DOI `10.1002/eqe.4290040305`의
[publisher abstract](https://onlinelibrary.wiley.com/doi/10.1002/eqe.4290040305)는 확인했으나
본문을 확보하지 않아 HRZ의 shell-specific 수식을 근거로 채택하지 않았다.
NASA SP-160은 optional plate benchmark 탐색에서 발견했으나 이번 포트폴리오는 S01 및
직접 검산 가능한 oracle로 충분하므로 필수 artifact나 새 acceptance 요구로 추가하지 않았다.
Configured FEM vault는 이번 요청의 지정 evidence source가 아니며, 기존 wiki/연구 요약은
탐색에만 참고하고 핵심 주장을 위 1차 source에 연결했다.
<a id="research-evidence--r01--consistent-physical-mass와-적분"></a>
### R01 — Consistent physical mass와 적분
**Fact, S01/P01:** 기존 보간은 `u = sum Ni(ui + z*(theta_i cross d_i))`,
`z=t*zeta/2`이며 director-parallel rotation은 입자 속도에 기여하지 않는다.
원 논문의 elastic example은 surface `2×2`, thickness 2-point Gauss 및 consistent-mass
주파수 분석을 사용한다. 이는 임의 geometry의 mass 적분이 정확하다는 증명은 아니다.
**Derivation:** `T=1/2 integral rho*|u_dot|² dV`에서 `M_C=integral rho*H^T H dV`가
따른다. Geometry는 기존 `X=sum Ni(Xi+z*di)`와 같은 `J=det(dX/dnatural)`를 사용한다.
양의 quadrature weight·density·유효 J에서는 대칭 PSD와 drilling null action이 직접 따른다.
MITC의 assumed shear는 strain 보간이므로 velocity 보간을 바꾸거나 shear factor `5/6`를
물리 질량에 곱하는 이유가 되지 않는다.
**평판 oracle:** 평행 director·centered flat section이면 병진 scalar block은
`rho*t*integral Ni*Nj dA`, rotary block은 `rho*t³/12*integral Ni*Nj dA`와 tangent
변환의 곱이며 translation–rotation coupling은 0이다. 축정렬 직사각형 면적 A에서는
scalar consistent block이 `rho*t*A/36`에 다음 행렬을 곱한 것과 같다.
```text
4 2 1 2
2 4 2 1
1 2 4 2
2 1 2 4
```
Rotary oracle의 scalar 배율은 위 병진 배율의 `t²/12`다. 이는 bilinear 형상함수의 직접
다항식 적분 결과이며 구현 함수를 다시 호출하는 테스트와 구분한다.
**Candidate/한계:** 곡면에서는 J가 zeta에 의존하여 odd thickness moment와
translation–rotation coupling이 남을 수 있다. Centered section만으로 이를 0으로 두지 않는다.
현재 trilinear geometry의 J 및 H 다항식 차수를 확인해 충분한 적분을 선택할 수 있다.
보수적인 tensor-product 3-point 후보는 각 좌표의 degree≤4 mass integrand를 적분하지만,
정확한 차수·기하 검증 위치·채택 quadrature는 Formulation/NR가 증명한다. 기존 stiffness
quadrature나 기존 geometry 허용 범위를 연구 단계에서 변경하지 않는다.
<a id="research-evidence--r02--consistent에서-유도하는-좌표-일관적-lumping"></a>
### R02 — Consistent에서 유도하는 좌표 일관적 lumping
**Fact, S02:** Row-sum, nodal quadrature, diagonal scaling은 일반적으로 서로 다른 근사다.
Nonnegative partition of unity는 scalar row-sum의 positivity를 설명한다. 논문의
absolute-row-sum operator는 일반 행렬의 positivity를 확보하지만 물리 total mass나
회전 nullspace를 보존하는 shell-specific theorem은 아니다.
**Derivation — 피해야 할 적용:** global rotary tensor는 `I-di*di^T`와 다른 director
사이의 cross block을 포함한다. Scalar `diag(M*ones)`는 좌표 회전과 commute하지 않는다.
예를 들어 단위 director `d=(1,1,1)/sqrt(3)`의 `P=I-dd^T`는 `P*ones=0`이지만
rank는 2다. Row-sum은 두 물리 관성을 모두 없애며 absolute row-sum은 drilling에
관성을 더한다. 혼합 translation/rotation 행의 무차별 합은 단위도 섞는다.
**Candidate — scalar moment를 통한 node block:** Consistent의 구성 moment
`Ck_ij=integral rho*Ni*Nj*z^k dV`, `k=0,1,2`를 식별하고 해당 물리 scalar moment에서
row-sum한 뒤 각 node의 director tangent tensor로 재구성하는 방법을 검토할 수 있다.
이는 consistent 결과와의 유도 관계를 증명해야 하며, 별도 unrelated diagonal을 생성하는
우회 경로로 쓰지 않는다. Full consistent block에서 moment를 추출하거나 계산 중 동일
moment를 보존하는 구체적 방식은 Formulation 소유다.
`sum Nj=1` 때문에 이 후보는 node별 `integral rho*Ni*Gi(z)^T Gi(z) dV` 형태로
설명된다. 여기서 `Gi(z)`는 그 node의 병진과 director 변화로 particle velocity를 만드는
map이다. 따라서 양의 measure에서 physical block PSD, director nullspace, tensor
congruence와 총 병진 질량 보존을 독립적으로 검산할 수 있다. Flat case에서는
`m_i=sum_j C0_ij`, 두 tangent inertia `m_i*t²/12`, drilling 0으로 단순화된다.
**한계:** 곡면의 nodal rotational frames를 component별로 직접 더하지 않는다.
Node block은 global 좌표에서 diagonal일 필요가 없다. Translation–rotation moment를
보존하면 6×6 block에 coupling이 있을 수 있다. 이 후보의 positivity와 각 inertia/centroid
보존 관계는 Formulation에서 완성하고 NR가 독립 검토해야 한다. Uniform translation
energy는 보존하지만 일반 회전의 orbital inertia 및 모든 속도장의 consistent energy는
보존한다고 가정하지 않는다. 물리 node velocity의 convexity로 설명 가능한 에너지 차이와
refinement 거동을 검증 후보로 삼을 수 있으며, Abaqus 내부 lumping 동일성을 주장하지 않는다.
<a id="research-evidence--r03--massless-좌표-제약과-유한-spectrum"></a>
### R03 — Massless 좌표, 제약과 유한 spectrum
**Fact, S03:** Massless 좌표를 분리하여 mass가 `diag(Mp,0)`, `Mp` SPD이고 대응
강성 `Kzz`가 가역이면 `Kr=Kpp-Kpz*Kzz^-1*Kzp`와 `Mp`의 문제로 축소하며,
massless 성분은 `z=-Kzz^-1*Kzp*p`로 복원한다. 이 경우 정적 제거는 massless row의
정확한 식이다. 축소 stiffness는 일반적으로 dense가 될 수 있다.
**Inference, P01에 적용:** 먼저 원래 global homogeneous BC의 free injection C로
`Kf=C^T K C`, `Mf=C^T M_L C`를 만들고, 그 공간에서 positive/null basis를 정의한다.
Director가 global axis와 기울어져 있으면 `UR3=drill`은 성립하지 않는다. 일부 global
회전을 고정한 node에서는 원래 drill 방향 전체가 free space에 들어가지 않을 수 있으므로
실제 `Mf`가 full rank가 될 수 있다. 이때 물리 질량이 있는 자유도를 제거해서는 안 된다.
P01의 공통 nodal director와 `Kphys=Tphys^T K20 Tphys`,
`Kdrill=Td^T kd I Td` 때문에 massless 방향의 decoupling을 algebraically 증명할
가능성이 있다. 증명된 경우 node별 작은 basis로 projection하여 sparsity를 유지할 수 있다.
단순히 coupling을 작다고 버리는 것은 그 증명이 아니다. Partial global constraints로
finite space에 남는 stabilization contribution도 보존한다. r2의 massless 처리는
**개선된 constrained stabilized K와 선택된 lumped M의 finite spectrum**에 대한 동등성이다.
Unstabilized 다른 shell formulation이나 consistent spectrum과의 동등성이 아니다.
**Candidate 검증:** 비축정렬 director, partially constrained rotation, constraint-free
shell의 6 physical rigid motions, `Kpz!=0`인 작은 manufactured pencil로 축소/복원과
full free residual을 확인한다. Physical rigid rotation의 nodal UR은 기존 계약의 tangent
projection을 사용한다. Null block이 비가역인 경우 generic inverse/pseudoinverse로
우회하지 않는다. 공통 K/M nullspace는 regular finite-spectrum 문제와 구분해 진단한다.
물리 rank 0, request>rank, nullspace가 없는 경우를 각각 정의한다.
일반 dense basis/Schur를 채택하면 `O(n²)` storage와 factorization fill을 평가해야 한다.
Reference의 25×25 interior nodes는 flat full clamp에서 free DOF 3750,
massive physical dimension 3125로 예상되며, 3125² double 한 행렬만 약 78.1 MB다.
이는 topology에 따른 계산 추정이고 실제 rank/runtime 측정이 아니다. FEAST workspace와
complex shifted factorization을 더해야 하므로 한 행렬 크기로 memory feasibility를 주장하지 않는다.
<a id="research-evidence--r04--onemkl-feast-api와-completeness-근거"></a>
### R04 — oneMKL FEAST API와 completeness 근거
**설치 관찰:** `mkl/2026.1/include/mkl_solvers_ee.h` lines 33,87에 `feastinit`,
`dfeast_scsrgv`가 있다. `mkl_version.h`는 major `2026`, minor `0`, update `1`,
build date `20260612`, `INTEL_MKL_VERSION=20260100`이다. Directory `2026.1`과
header version 표기를 임의로 통일하지 않는다. 실제 linked runtime는 Implementation이 기록한다.
`mkl_types.h`의 `MKL_INT`는 LP64에서 `int`, `MKL_ILP64`에서 64-bit다. N, nnz+1,
row/column index와 N×m0 allocation을 checked conversion해야 하며 vendor type은 adapter 내부다.
**Fact, S04/S05:** Real symmetric generalized `A*x=lambda*B*x`에서 B는 SPD여야 한다.
`dfeast_scsrgv`는 A/B 각각 values·row pointer·column index를 받으며 같은 storage family를
사용한다. `uplo=U/L/F`, `n>0`, `0<m0<=n`, `m0>=interval multiplicity count`다.
`fpm`은 128개 `MKL_INT`; `e/res`는 m0, eigenvectors는 N×m0의 column storage로
준비하고 첫 m columns만 소비한다. Documented CSR은 row pointer terminal `nnz+1`인
1-based convention으로 대응한다. A/B sparsity pattern은 같을 필요가 없다. 내부 0-based
CSR을 인덱스 변환 없이 넘기지 않는다. `epsout`은 trace 변화량이고 개별 residual을 대신하지 않는다.
**Fact, S06 — C index 표:**
| Parameter | 문서 의미 / 연구 적용 |
| --- | --- |
| `feastinit(fpm)` | 호출 전 초기화; 다른 FEAST 배포판의 설정 배열을 복사하지 않음 |
| `fpm[1]` | contour points; 허용된 값만 사용 |
| `fpm[2]`, `[3]` | double precision stopping exponent, refinement loop bound; 값은 NR/계약에서 고정 |
| `fpm[4]` | 0=generated initial subspace, 1=user subspace; 재현성과 projection rank 검증 필요 |
| `fpm[5]` | 0=residual stopping, 1=trace stopping; zero mode는 독립 scale-aware residual 필수 |
| `fpm[13]` | 1은 한 contour의 subspace만 반환; 완료 eigenpairs로 소비하지 않음 |
| `fpm[26]`, `[27]` | CSR validity, B SPD check 옵션 |
| `fpm[49]` | CSR interval eigenvalue count를 m0에 반환하고 flag를 0으로 재설정; count와 solve는 구분 |
| `fpm[63]` 및 `[64..127]` | PARDISO user iparm 적용 여부 및 매핑; 후반부는 output도 되므로 call 간 변경 고려 |
**Fact, S07:** `info=0` successful; `1` empty interval/검색 실패 가능,
`2` nonconvergence, `3` insufficient subspace, `4` subspace-only이다.
`-1/-2` allocation/inner solver, `-3/-4` reduced solver/B-not-SPD,
`-5` count failure(구간 끝이 eigenvalue 또는 근접할 수 있음), `200/201/202`는
interval/subspace/N 오류다. `100+i`는 `fpm[i-1]` 오류다.
S05 본문은 `emin<=emax`로 쓰지만 명시적인 `200` 검증은 `emin>=emax`를 거부하므로
실제 계약은 strict `emin<emax`로 설정할 수 있다. 이것은 사용자 physics 결정이 아니다.
매우 넓은 구간 안의 작은 cluster를 놓칠 수 있다는 공식 주의가 있으므로 빈 반환을 곧
없는 spectrum으로 단정하지 않는다.
**Candidate bounded policy rationale:** SPD reduction/whitening 뒤 차원이 일관된 spectral
bound(예: 대칭 표준 문제의 Gershgorin bound)를 유도하면 전체 spectrum 밖의 유한 하한과
상한을 얻을 수 있다. Reference 값이나 hardcoded frequency로 구간을 정하지 않는다.
Zero를 포함하는 하한을 두고 interval count를 통해 낮은 순서의 requested N을 덮는 상한을
찾되, endpoint collision·overflow·count/solve mismatch와 시도 수를 제한한다. Count가
cluster 전체를 포함하면 m0가 requested N보다 커질 수 있으며 반드시 multiplicity를
수용한다. Sort 후 필요한 첫 N을 출력하더라도 원래 계산 multiplicity와 pairing을 유지한다.
`m0=N`이 충분하다는 가정, 매번 상한만 무한히 늘리는 정책, count 성공을 eigenpair 성공으로
취급하는 정책은 근거가 없다. Final bounds·성장/축소·cluster tie·subspace/seed·실패 정책은
Formulation/NR 소유이고 small N 및 N=physical rank도 FEAST 실제 runtime로 검증한다.
Intel S06은 `fpm[49]` 결과를 total number로 기술하며 stochastic estimate라고 설명하지
않는다. 그렇더라도 이 문서만으로 floating-point inertia/count의 모든 조건에서의 정확성이나
전체 algorithm의 completeness를 증명했다고 주장하지 않는다. S07의 endpoint/count 실패와
작은 독립 spectrum 검증을 유지한다. 다른 standalone FEAST 버전의 stochastic-count
옵션과 혼동하지 않는다. 요청 N의 외부 authority는 사용자 확정대로 `.inp` data이며
내부 count는 interval/subspace를 정하는 evidence다. TXT 행수나 count로 N을 바꾸거나
새 사용자 interval/count API를 만들지 않는다.
**Fact, S08 / 적용:** FEAST의 Rayleigh–Ritz 식은 B-orthonormal reduced vectors에서
`X^T B X=I`를 준다. 내부 벡터는 같은 lumped M으로 검증한다. Repeated eigenspace의
개별 방향과 sign은 유일하지 않으므로 vector component exact equality를 acceptance로
추가하지 않는다. Count/completeness와 residual/Gram은 서로 대체하지 않는다.
<a id="research-evidence--r05--reference의-관찰-가능한-의미와-family"></a>
### R05 — Reference의 관찰 가능한 의미와 family
**Fact, S09/S10:** `*FREQUENCY`의 첫 값은 requested count다. Lanczos data line의
blank min/max는 별도 bound를 지정하지 않으며, 뒤 shift와 block controls의 공란을 0 입력으로
오인하지 않는다. `SIM`은 source architecture 설정이고 `NORMALIZATION=MASS`는
generalized mass 1이다. Acoustic coupling ON은 acoustic/structural coupled model에
작용한다. 적용 대상 acoustic 요소·ASI·coupling이 없는 현재 input의 옵션은 무해하게
mapping할 근거가 있으며, 실제 acoustic 모델은 승인 subset 밖이다.
**Inference/P02:** 알고리즘 지정의 FESA 해석은 source Lanczos 보존 + actual backend
FEAST이다. SIM을 FESA backend 기능으로 주장하지 않고 명시된 무해한 조합만 I/O가
진단 정책으로 고정한다. 원본의 output/restart 요청을 읽을 때에도 새 modal stress/reaction
지원으로 확대하지 않는다. 실제 prior step, preload, damping, nonzero prescribed state를
삭제하여 현재 subset처럼 실행하는 근거는 없다.
**Fact/관찰:** S10은 `lambda=omega²`와 cycles/time frequency를 구분한다. S11은
modal frame의 mode member와 mode-domain output을 정의한다. 원본 TXT는 `Frame: Mode`
1~10과 Value를 포함하고 input에는 단일 `Step-2`만 있다. 따라서 unique step + source
mode mapping이 가능하며 Freq 반올림으로 Value를 다시 계산하지 않는다.
**NR handoff:** 공통 TOLERANCE는 같은 step/frame만 family로 묶는다. 원본에 각각의 modal
frame이 있는 점을 유지하여 mode별 scalar family를 정의하는 방향을 검토한다. 단일 HDF5
table에 저장했다는 이유로 다른 source mode/frame을 하나의 family로 모으지 않는다.
Singleton family에서는 공통 RMS 규칙도 그대로 적용하며 scalar라는 이유로 생략하지 않는다.
최종 family 이름·identity·blocking 및 exact mapping은 NR/I/O가 고정한다.
Repeated Value는 서로 다른 mode identity로 보존하며 source missing/extra/duplicate/nonfinite
검사 후 공통 정책을 적용한다. Displayed repeated 값으로 실제 exact degeneracy를 단정하거나
mode shape matching으로 외부 acceptance를 넓히지 않는다.
<a id="research-evidence--r06--독립-verification-portfolio-후보"></a>
### R06 — 독립 verification portfolio 후보
각 case의 구체적 구성·수치 기준은 NR가 정한다. 새 eigen external reference는 지정 Value
10개뿐이며, r2에 승인된 기존 static 회귀는 R07과 Requirement 024의 기존 계약을 따른다.
| Candidate | 잡아내는 오류 / 독립 기대값 | 한계 |
| --- | --- | --- |
| 직사각형 single-element mass | R01 polynomial oracle, 3 translations total `rho*A*t`, 2 rotary inertia, null drilling | 곡면 적분·semantic 연결은 검증하지 않음 |
| 곡면/왜곡 요소의 independent velocity integration | 직접 particle kinetic energy와 consistent quadratic form, R02 derived relation/양의 node block | 동일 production H/J 코드를 재호출하는 oracle는 독립성이 부족 |
| Rigid/coordinate tests | 기존 tangent rigid motion의 zero stiffness; geometry/director와 개선 scale을 독립 재계산한 complete K·두 질량의 congruence 및 eigenvalue invariant | NR-MFE-001의 같은 물리 partial BC 필수; old kd를 고정한 단순 tensor 변환이나 full-free/full-clamp만으로 대체하지 않음. 일반 MPC는 추가하지 않음 |
| Density scaling | 두 mass가 density 배율 c에 비례, 선택된 eigenvalues가 1/c, mass-normalized vector magnitude가 1/sqrt(c) | 다른 density field의 material mapping은 별도 양성/음성 test |
| 작은 manufactured singular pencil | R03 식을 손으로 계산하여 exact finite eigenvalues·복원 residual, partial global constraint와 rank case | Element/mass 조립 correctness는 별도 검증 |
| 작은 diagonal/rotated SPD pencil | FEAST N=1/2, repeated/clustered/zero/negative case, request=rank, count/m0/interval edge 및 실패 진단 | 직접 hand matrix는 전체 procedure/reference를 대신하지 않음 |
| Modal residual / Gram / energy | Free-space `Kphi-lambda*M_L*phi`, `Phi^T*M_L*Phi=I`, `phi^T*K*phi=lambda`와 constraint 복원 | 작은 residual만으로 최저 모드 completeness를 보장하지 못함 |
| Simply-supported plate analytical limit | S01 Fig.7/Table4의 plate frequency 사례 또는 `lambda=(D/(rho*t))*((m*pi/a)^2+(n*pi/b)^2)^2`의 thin-plate Navier limit | 마지막 식은 직접 thin-plate PDE로 유도·검산할 후보; rotary/shear를 포함한 유한 두께 shell의 exact oracle로 쓰지 않음 |
| 지정 clamped plate reference | 원본 `.inp`와 TXT Value의 순서·multiplicity·family 비교; square-symmetry cluster 진단 | 비교만으로 mass·mode shape·drilling·내부 알고리즘의 correctness를 주장하지 못함 |
Modal physics는 무하중 정적 `Kphi=0`나 정적 reaction balance를 모든 eigenvector에
요구하지 않는다. Inertia와 elastic restoring force의 균형인 free residual을 검사한다.
Dimensional translation/rotation 차이는 Formulation의 congruent scaling으로 처리하고
zero mode의 residual denominator와 rank threshold는 NR가 정한다. 두께 변경에서는
membrane, bending, shear, rotary inertia가 서로 다르게 변하므로 density처럼 모든 mode에
단일 thickness power law를 강제하지 않는다.
<a id="research-evidence--r07--r2-stabilization-근거와-영향"></a>
### R07 — r2 stabilization 근거와 영향
<a id="research-evidence--입력-delta와-보존-근거"></a>
#### 입력 delta와 보존 근거
`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)을 적용한다.
기존 `min(R+)`의 기저 의존성은 P03의 NR 반례로 확인되었다. 그 반례와 r1의 mass oracle를
재계산하지 않는다. 사용자 승인은 개선 범위를 확정하며 특정 새 수식이나 NR 통과를 뜻하지 않는다.
| 기존 근거 | r2 영향 판단 |
| --- | --- |
| S01/S02, R01/R02 mass·moment·quadrature | Numerical K scale과 독립이다. 기존 primary 근거·한계 및 [mass 계약](formulation.md#formulation-mass)을 보존한다 |
| S03, R03 및 [eigen E2–E4](formulation.md#formulation-eigen) | Schur 원리는 그대로다. Decoupling의 적용 대상은 개선된 K이며 아래 positive/director 구조를 Formulation이 재확인해야 한다 |
| S04–S08, R04 FEAST/정수/count | Backend·lumped M·입력 N 요구가 바뀌지 않아 근거를 보존한다. 설치/runtime를 새로 검증한 것은 아니다 |
| S09–S11, R05 reference 의미 | 새 eigen Value-only·원본 identity·공통 tolerance가 불변이다. 기존 artifact/hash는 r1 관찰 이력으로 보존한다 |
| R06 및 [기존 V5](formulation.md#formulation-verification) | Complete K 재계산과 지원 partial BC 반례 통과가 필수다. r1의 제한된 eigen 좌표 검증 설명을 r2 acceptance로 사용하지 않는다 |
| P01/P03 static | 옛 scale 선정식만 대체하며 initial-fixed lifecycle·objective potential·physical recovery 제외와 기존 회귀 계약은 유지한다 |
<a id="research-evidence--공변적인-secondary-scale-후보"></a>
#### 공변적인 secondary scale 후보
**Fact, S12:** 대칭 2×2 행렬은 직교 회전으로 대각화할 수 있다. LAPACK 원 source는
그 변환과 반환 고유값을 명시하고, 작은 고유값 계산에서 determinant 상쇄로 상대 정확도를
잃을 수 있음을 경고한다. 이를 새 shell scale의 최종 선정 근거와 혼동하지 않는다.
**Derivation — 기저 변화:** 초기 physical `K20^0`에서 node i의 두 회전 성분에 해당하는
2×2 principal block을 `R_i`, 해당 성분을 global tangent rotation으로 보내는 orthonormal
map을 `U_i`라 하자. 전역 rigid coordinate rotation `G`와 접평면 기저 변경 `O_i`에서
`U_i'=G U_i O_i`, `R_i'=O_i^T R_i O_i`이면
`U_i' R_i' U_i'^T=G(U_i R_i U_i^T)G^T`다.
따라서 `tr(R_i')=tr(R_i)`와 `det(R_i'-lambda I)=det(R_i-lambda I)`가 직접 따른다.
개별 대각값은 이 항등식의 scalar invariant가 아니다. 서로 다른 node의 기저 변경도
block별로 독립 허용된다. 실제 physical kernel이 이 변환 법칙을 만족하는지는 후속 검증 대상이다.
**Candidate — trace 기반, 우선 검토 권고:** `tau_i=tr(R_i)/2`에서 하나의 positive element
scale을 만들 수 있다. `mean_i(tau_i)=sum_i tr(R_i)/8`은 기존 여덟 physical rotation
성분의 평균이며, physical K가 PSD이고 회전 강성이 적어도 하나 존재하면 양수다.
또 다른 후보는 positive nodal `tau_i`의 최솟값으로 기존 최소값 집계를 유지하는 것이다.
두 후보 모두 좌표/기저 불변이며 force·length 차원을 갖는다. 초기 K의 물리적인 PSD 및
zero/nonfinite inventory 처리는 명시적으로 확인해야 하며 양의 trace만으로 PSD를 판정하지 않는다.
최솟값 후보의 zero-block 처리 또는 전 node positivity가 필요하면 기존 유효 geometry와의
관계를 증명해야 한다. 암묵적인 새 geometry 제외·epsilon floor로 보완하지 않는다.
**Candidate — 최소 spectral 값:** `lambda_min(R_i)`도 기저 불변이고 작은 회전 강성 방향을
반영한다. 그러나 positive 여부·zero block 처리와 작은 eigenvalue의 상쇄/conditioning
문제가 추가된다. 단순 `(trace-sqrt(discriminant))/2` 구현의 안정성을 가정하지 않는다.
Trace 후보에는 이 spectral subtraction이 없으므로 bounded scale 개선의 첫 검토 방향으로
권고한다. 이 비교는 runtime 성능 측정 또는 수식 채택 판정이 아니다.
어느 후보든 기존 차원 없는 `10^-3` 계수와 `K_d=k_d I4`의 numerical 역할을 유지하는
최소 변경을 검토할 수 있다. Reference 오차를 보고 scale/계수를 조정하거나 coefficient sweep,
물리 drilling 관성·strain·새 입력 설정을 추가할 근거는 없다. 정확한 aggregation, finite/positive
검사 및 scale 공식 채택은 Formulation 소유이고 numerical 기준은 NR 소유다.
<a id="research-evidence--linear-null과-nonlinear-lifecycle의-다른-적용-조건"></a>
#### Linear null과 nonlinear lifecycle의 다른 적용 조건
**Derivation/조건, P01/P03와 S03:** Linear/eigen에서는 기존 `T_p`, `T_d`와
`K_drill=T_d^T k_d I4 T_d`를 그대로 두고, 모든 element의 새 `k_d`가 finite positive이면
실제로 free space에 남는 director null `Z`에 대해
`K_f Z=Z diag(sum_{e incident i} k_d,e)` 구조를 유지할 수 있다.
Physical K가 director 방향을 소거하고 공통 nodal director를 사용한다는 전제가 필요하다.
이 조건에서 `Kzz>0`, `Kpz=0`이므로 기존 analytic projection의 정확성 근거가 유지된다.
이는 [E3](formulation.md#formulation-eigen)의 적용 조건 재확인이지 새 수식/실제 조립의 검증 완료가 아니다.
Null이 없는 partial BC에는 개선 stabilization이 남으며 이를 삭제해서는 안 된다.
새 K와 옛 K 사이의 partial-BC spectrum 동일성은 요구하지 않는다.
**Fact, S13:** 논문의 자체 shell 정식화는 director manifold에 맞는 potential의 일관
선형화와 objective interpolation을 함께 다룬다. 이것은 FESA의 drilling potential를
제공하지 않는다. April correction은 proofing 오류, November correction은 Eq.(5.26)의
LaTeX rendering 오류를 알리며 현재 원문이 교정되었다고 명시한다. 그 식을 이 후보에
복사하거나 FESA의 기존 운동학을 해당 논문의 보간으로 교체하지 않는다.
**Derivation/조건, P03:** 기존 nonlinear `Pi_d=k_d*gamma^T gamma/2`에서 새 scale을
초기 reference physical K로 계산한 뒤 모든 increment/iteration에서 불변으로 유지하면
`Dk_d=D²k_d=0`이다. 따라서 기존 exact residual/Hessian은 동일한 `gamma`, `Dgamma`,
`D²gamma`에 새 scalar를 곱하는 구조를 유지한다. 기저 불변 reference scale과 objective
gamma를 함께 유지하면 같은 물리 상태의 좌표 변경에 따른 potential 불변성도 보존할 조건이 된다.
Trial tangent에서 scale을 다시 선정하면 추가 미분항과 min의 비매끄러움이 생길 수 있어 이
initial-fixed 계약을 대체할 수 없다. Scale이 같다는 이유로 nonlinear의 corotation coupling을
linear의 단순 director projection과 동일하게 만들지 않는다.
**Limit:** 양의 `k_d`는 numerical potential의 비음성과 pure-drill 양의 작용을 뜻한다.
변형된 nonlinear Hessian에는 `sum gamma_i D²gamma_i`가 있어 모든 상태의 SPD를 뜻하지
않는다. Linear E3 decoupling 증명을 nonlinear Hessian이나 prestressed eigenproblem에
일괄 적용하지 않는다. 새 feature의 eigen 상태는 승인된 원형상·무응력 상태다.
<a id="research-evidence--verification-연결과-남는-owner-작업"></a>
#### Verification 연결과 남는 owner 작업
NR-MFE-001의 동일 물리 partial BC에서 새 scale과 complete K를 독립 재계산하고,
대응 eigen spectrum 및 정적 response의 좌표 검증을 수행해야 한다. 옛 계수를 외부에서
고정한 tensor 변환만 비교하면 원래 결함을 검출하지 못한다. 동일 물리 BC/loads의 변환과
허용된 입력 범위는 유지한다. 추가 새 reference 모델을 요구하지 않는다.
기존 static 회귀의 원본 경로·quantity·identity·policy는 P03의
[Requirement evidence portfolio](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)에
한 곳에서 유지한다. Linear `shell` 및 nonlinear `shellNL`/`shellNL-meshfine`와 linear-limit
case, 내부 tangent·선형극한·objectivity·평형·reaction·energy·rollback 검증을 새 scale로
실행해야 한다. 기존 U blocking/UR warning-only와 nonlinear reaction review-only를
eigen Value-only 요구로 삭제하지 않는다. 오래된 통과 보고서는 새 실행 evidence가 아니다.
남는 작업은 Formulation의 단일 후보 채택·positivity/변환 증명·적용 경계, NR의 독립
반례 해소·conditioning·metric·필수 case와 수치 기준, Implementation/Physics의 실제
정적/eigen 재검증이다. R07에서 새 authoritative conflict나 사용자 재결정 필요는 발견하지 않았다.
<a id="research-evidence--실행-evidence와-미실행"></a>
### 실행 evidence와 미실행
<a id="research-evidence--r1-조사-이력"></a>
#### r1 조사 이력
Read-only `Get-Content`, scoped `rg`, `Get-FileHash`로 필수 공통/Feature/기존 MITC4
문서, 실제 kernel과 원본 두 reference 파일을 읽었다. 해당 읽기·hash 명령은 exit `0`이다.
아래는 핵심 재현 진입점이다.
```powershell
Get-Content -Raw '.codex/skills/fem-research-evidence/SKILL.md'
Get-Content -Raw 'docs/mitc4-shell-feast-eigen/requirements.md'
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness' 'src/fesa/elements/mitc4_shell.cpp'
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 52
Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
SHA-256은 input `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`,
TXT `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`로 P02와 같다.
설치 include에서 `rg`로 위 R04의 declarations/version/type을 확인했다. 별도
`rg -n 'MKL_INTERFACE|MKL_ILP64|lp64' cmake CMakeLists.txt`는 no-match exit `1`이며
linked ABI를 판정한 것이 아니다. Numpy/pypdf/fitz 탐색은 exit `0`, 모두 미설치였고
설치·수치 실험·외부 solver를 수행하지 않았다.
Web `search_query/open/find`로 S01–S11을 조사했다. S03 PDF는 초기 검색·열기에서
`STATIC CONDENSATION`과 Eqs.(9)–(13) 텍스트를 얻었으나 후속 부분 열기는 timeout이
발생했다. S01의 수식은 보존된 원문 transcription과 현재 승인 계약도 대조했다.
S02 author HTML, S04–S07 Intel 본문, S08 author PDF, S09–S11 공식 문서는 접근했다.
NASA PDF/일부 publisher/feastinit 개별 URL 접근 실패를 필수 근거로 사용하지 않았다.
한 차례 tool orchestration의 quote syntax 오류는 도구 실행 전 실패했으며 수정 후 검색을
수행했다. 이런 접근 실패를 구현 또는 reference comparison 성공으로 기록하지 않는다.
Owned 두 문서의 metadata/상대 링크/requirement coverage를 read-only Python here-script
(`python -B -`, `pathlib`, `re`, `urllib.parse.unquote`)로 검사했다. Exit `0`,
documents `2`, local links `21`, requirement coverage `26`, issues `0`이다.
`git diff --check`는 exit `0`이며 다른 owner의 관리문서 LF/CRLF 경고가 출력되었다.
신규 untracked 연구 문서는 별도 Python 정적 검사로 trailing whitespace·final newline·상대
링크를 확인했다. Exit `0`, files `2`, local links `21`, issues `0`이다. `git status --short`에서
연구 두 파일과 Coordinator 관리문서 변경을 구분했으며 관련 없는 파일을 수정하거나 stage하지 않았다.
CMake/CTest, Harness, FEAST runtime와 numerical reference comparison은 이
연구 단계의 범위가 아니므로 미실행이다. Source/tests/build/phase/upstream/tolerance/reference는
편집하지 않았으며 다른 owner의 변경을 되돌리지 않았다.
<a id="research-evidence--r2-bounded-조사와-정적-확인"></a>
#### r2 bounded 조사와 정적 확인
관리문서·requirements r2·기존 research 및 NR/Formulation/static 계약을 `Get-Content`와
scoped `rg`로 읽었다. 정상 조회는 exit `0`이다. 초기 `rg`의 literal `research*.md` 경로는
Windows 경로 오류였고 `rg ... docs/nonlinear-static-newton-raphson -g 'research*.md'`로
수정하여 exit `0`으로 재조회했다. 최초 patch는 context 불일치로 적용되지 않았으며 실제
문맥을 확인한 뒤 owned 두 파일에만 적용했다. Source·test·build·phase·Hook·reference와
upstream 문서는 수정하지 않았고 Git mutation은 수행하지 않았다.
Web `search_query/open/find`에서 S12 공식 source와 S13 교정된 원문 및 두 correction을
열었다. 새로 인용한 primary 사실은 그 본문에서 확인했으며 검색 요약이나 타 solver의
비공개 동작을 근거로 사용하지 않았다. S01–S11 전체를 재조사하지 않았다.
Read-only `python -B -` here-script로 두 문서의 owner/Feature/r2 metadata, final newline,
trailing whitespace, 상대 링크 실재 및 requirements matrix ID와 coverage 표의 set equality를
검사했다. Exit `0`, documents `2`, local links `32`, required/covered IDs `27`, issues `0`이다.
별도 `python -B -`에서 `subprocess.run(['git','show','HEAD:'+path],check=True)`로 기존
연구 상세를 읽고 정규식으로 R01/R02/R04/R05 절 및 S01–S11 inventory 행을 비교했다.
Exit `0`, 모든 보존 구간이 동일했다. 이는 문서 보존 확인이며 수치 검증이 아니다.
`git diff --check`는 exit `0`; LF/CRLF 정보성 경고만 있었다. `git diff`/`git status --short`로
owned 두 파일과 Coordinator의 coordination 변경을 구분했으며 타 owner 변경을 보존했다.
r2에서 reference 파일·hash 재조사, NR 반례·mass oracle 재계산, CMake/CTest, Harness,
FEAST runtime 및 정적/eigen reference comparison은 수행하지 않았다. 원본/reference 및
기존 보고서의 성공 기록을 r2의 실행 성공으로 재분류하지 않는다. 최종 파일 hash는 반환
envelope에 제공하며 본 문서 안에 자기 hash를 기록하지 않는다.