docs: record MITC4 numerical review contract finding

This commit is contained in:
KOKO\Mimi
2026-09-06 02:50:40 +09:00
parent 2c3a86aa69
commit c8876da339
7 changed files with 454 additions and 13 deletions
+9
View File
@@ -61,3 +61,12 @@
- 근거: [Formulation 핵심 계약](formulation.md#핵심-계약), [mass M1~M10](formulation-mass.md), [eigen E1~E8](formulation-eigen.md).
- 영향: 곡면 coupling 및 mass/centroid·energy 차이를 명시하고 인공 drilling mass와 일반 dense Schur는 도입하지 않는다. Numerical Review는 수식·conditioning·FEAST controls·reference 준비를 독립 검토한다.
- 남은 검토: [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)의 기존 basis-dependent stabilization 한계와 `FEM-REQ-MITC4-EIGEN-014` coordinate-invariance coverage 관계를 NR가 명시적으로 확인해야 한다. 이 기록으로 acceptance 범위를 조용히 좁히지 않는다.
## MFE-ADR-007 — 기존 stabilization과 좌표 불변성 acceptance 정합
- 상태: 미결정; Requirement owner의 intent 검토 중. 사용자 critical 결정 여부도 아직 판정 전이다.
- 발견 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-직접-계산-반례).
- 발견: 동일 물리 partial rotation BC를 유지한 회전에서 기존 basis-dependent `kd=min(tangent diagonals)` 때문에 고유치가 상대 `1.1291343961675893e-5`만큼 달라진다. 새 mass 또는 analytic reduction의 확인된 결함은 아니다.
- 다음 판단: `FEM-REQ-MITC4-EIGEN-002/008/014`의 보존·검증 의미를 Requirement owner가 함께 검토한다. 기술적으로 해소 가능한 기존 intent와 제품 acceptance 변경이 필요한 선택을 구분하여 반환한다.
- 경계: Coordinator/NR는 기존 stiffness 수정, partial BC 지원 제외, invariant 실패의 diagnostic 강등 또는 tolerance 완화로 해결하지 않는다. 필요하면 실제 critical 대안·영향·권고만 사용자에게 요청한다.
@@ -33,13 +33,16 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실
| [PRD.md](PRD.md) | coordinator-agent | r1 | 사용자 요구 요약 |
| [ADR.md](ADR.md) | coordinator-agent | r1 | 후속 결정 기록 |
| [coordination.md](coordination.md) | coordinator-agent | r1 | workflow 상태 원본 |
| [requirements.md](requirements.md) | requirement-agent | r1 | Coordinator gate pass; 26개 must 요구사항 |
| [requirements.md](requirements.md) | requirement-agent | r1 | 26개 must; NR-MFE-001에 따른 002/008/014 intent 재검토 |
| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r1 | 원본 관찰·결정·정적 evidence audit 완료 |
| [research.md](research.md) | research-agent | r1 | Coordinator gate pass; primary source coverage |
| [research-evidence.md](research-evidence.md) | research-agent | r1 | 수식 후보·API·한계·verification 근거 audit 완료 |
| [formulation.md](formulation.md) | formulation-agent | r1 | Coordinator gate pass; 독립 NR 인계 |
| [research.md](research.md) | research-agent | r1 | primary-source 근거 보존; 014 coverage 영향 부분 stale |
| [research-evidence.md](research-evidence.md) | research-agent | r1 | 수식/API 근거 보존; R06 좌표 검증 coverage 부분 stale |
| [formulation.md](formulation.md) | formulation-agent | r1 | 수학 계약 보존; 014 acceptance coverage 부분 stale |
| [formulation-mass.md](formulation-mass.md) | formulation-agent | r1 | M1~M10·적분·lumping·보존량 수학 계약 |
| [formulation-eigen.md](formulation-eigen.md) | formulation-agent | r1 | E1~E8·제약/null·FEAST·복원 수학 계약 |
| [formulation-verification.md](formulation-verification.md) | formulation-agent | r1 | V1~V7·검증식·NR 수치 기준 인계 |
| [formulation-verification.md](formulation-verification.md) | formulation-agent | r1 | V1~V7 보존; V5 coordinate-invariance coverage stale |
| [numerical-review.md](numerical-review.md) | numerical-review-agent | r1 | return-upstream; NR-MFE-001, gate 미통과 |
| [numerical-review-evidence.md](numerical-review-evidence.md) | numerical-review-agent | r1 | 재현 반례·mass oracle·API 근거 보존 |
| [reference-model.md](reference-model.md) | numerical-review-agent | r1 | artifact/logical readiness 확인; 전체 NR gate 미통과 |
아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다.
+5 -2
View File
@@ -3,7 +3,7 @@
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Input contract revision: `r1`
- 검토 상태: requirements·research·formulation r1 gate pass; 독립 numerical/reference review 진행.
- 검토 상태: NR-MFE-001로 numerical-review gate 미통과; Requirement owner가 기존 stabilization 보존과 coordinate-invariance acceptance 의도를 정합 중.
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md).
지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다.
@@ -42,4 +42,7 @@ Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상
두 질량 계산의 연결에 관한 [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)에 있다. 수치 acceptance 및 reference readiness는 NR 판정 전이다.
구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md)에 있다. 내부 수치 기준은 미확정이다.
[Reference artifact·logical readiness](reference-model.md)는 확인했지만 전체 NR gate는 통과하지 않았다.
NR의 [blocking finding](numerical-review.md#blocking-finding)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계다.
사용자가 확정한 질량 계산 흐름·FEAST 사용 mass·입력 N·외부 Value-only 범위는 유지한다. 이 발견을 근거로 강성이나 acceptance를 이미 변경했다고 해석하지 않는다.
+25 -6
View File
@@ -3,13 +3,15 @@
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Contract revision: `r1` (사용자 최종 질량 요구를 반영한 requirements baseline)
- Stage: `numerical-review`
- Outcome: `pass` (formulation gate; 독립 numerical 판정 전)
- Next owner: `numerical-review-agent`
- Attempt: `0`
- Stage: `requirements`
- Outcome: `return-upstream` (NR-MFE-001)
- Next owner: `requirement-agent`
- Attempt: `1` (numerical-review r1의 해당 failure 관찰 횟수)
- Completion: 미완료
- Failure classification / retry key: `null`
- Escalation class / blocker: `null`
- Failure classification: `upstream-contract`
- Retry key: `mitc4-shell-feast-eigen|numerical-review|upstream-contract|r1`
- Escalation class: `null`
- Blocker: `NR-MFE-001` — 기존 stabilized pencil 보존과 REQ-014 eigen coordinate-invariance acceptance intent 정합 필요.
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md).
@@ -24,6 +26,7 @@
| 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 미통과 |
공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다.
확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다.
@@ -32,6 +35,17 @@ Root의 시작 Git 조사에서 worktree clean을 확인했다. 구현·build/te
## 현재 bounded dispatch
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를 대신하지 않았다.
@@ -39,6 +53,7 @@ NR는 수학 correctness와 reference-model readiness를 모두 검토하고 명
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 이력
@@ -117,6 +132,10 @@ Root는 global environment, Hook state/code를 변경하지 않았다.
추가 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 변경·실행은 하지 않았으며 일반 환경 준비는 기존 사용자 진행 승인 안에서 해당 owner가 수행한다.
현재 `.harness/config.json`은 없고 preset과 `.harness/config.example.json`은 있다.
Planning은 자동 감지 결과와 승인 MSVC preset을 대조하여 실행명령 및 Hook backend를 명시해야 한다.
@@ -0,0 +1,219 @@
# MITC4 독립 수치 검토 evidence
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r1`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 검토일 / web access date: `2026-09-06`
## NR-MFE-001 직접 계산 반례
관련 원문은 [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 소유다.
## 비충돌 수학 검토
| 대상 | 독립 검토 결과와 한계 |
| --- | --- |
| 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 값의 승인이 아니다.
## 재검토 범위
NR-MFE-001 때문에 bounded return을 먼저 수행한다. 아래 항목은 최종 numerical gate 전에
NR가 같은 승인 revision에서 구체적인 수치와 필수 case를 고정해야 하며 미완료로 남긴다.
- 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 변경을 구분했다.
@@ -0,0 +1,77 @@
# MITC4 질량·FEAST 독립 수치 검토
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r1`
- 요청 outcome: `return-upstream`
- Next owner: `requirement-agent`
- Failure classification: `upstream-contract`
- 검토일: `2026-09-06`
필수 입력은 [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 상세 문서다.
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md),
[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md),
[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)를 적용했다.
## Blocking finding
**NR-MFE-001 — 기존 stabilization 보존과 eigen coordinate-invariance acceptance의 미정합.**
`FEM-REQ-MITC4-EIGEN-002`는 기존 kernel을 유지하고, `014`는 두 질량과 선택된 질량의
eigen 해석에 coordinate-invariance evidence를 요구한다. 그러나
[V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)는 eigen
좌표 불변성 검증을 모든 회전이 free 또는 모두 fixed인 node 사례로 한정한다.
허용된 부분 global 회전 BC의 유한 공간에는 기존 drilling stiffness가 남으며,
그 계수는 global-axis 기반 tangent frame에서의 최소 대각값에 의존한다.
유효한 `4×2` 평판, `t=1`, `E=12`, `nu=0`, `rho=1`,
`d=(0.6,0,0.8)`, 한 절점의 `URZ`만 free인 모델의 독립 직접 적분 결과는 다음과 같다.
Global Z축으로 45° 회전하면 **같은 지원 BC가 같은 물리 제약을 유지**하지만,
고유치는 `23.04088888888889`에서 `23.040628726287263`으로 바뀐다.
상대 차이는 `1.1291343961675893e-5`이며 roundoff 설명이 아니다.
수식·geometry·명령·exit code는 [반례 evidence](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례)에 있다.
이는 새 consistent/lumped mass나 E2~E5 reduction의 확인된 결함이 아니다.
V5가 이미 기록한 **기존 stiffness의 실제 한계**와 현재 acceptance intent 사이의 문제다.
NR가 부분 BC를 조용히 제외하거나 invariant 실패를 diagnostic으로 낮추면 안 된다.
외부 reference 1% 기준으로 이 내부 항등식 위반을 통과시킬 수도 없다.
Requirement owner는 `002/008/014`를 함께 검토하여 기존 한계와 `014`의 의도·적용 범위를
명시적으로 정합시켜야 한다. 전체 지원 모델의 좌표 불변성을 유지하려면 기존 stabilization
보존 계약에 영향이 있고, 제한을 수용하면 acceptance 설명에 영향이 있다. 기술 evidence로
기존 의도를 확정할 수 없는 critical 선택만 Coordinator에게 반환한다. NR는 어느 선택도
승인하거나 요구사항·강성을 수정하지 않았다. 같은 질량 선택을 사용자에게 다시 묻지 않는다.
## 완료한 검토와 보존할 evidence
- M1~M10의 부호·단위·quadrature degree, consistent physical rank20, nodal lumped
rank5, odd-thickness coupling, 보존량과 Jensen 차이는 수학적으로 일관된다.
Independent rational-polynomial fixture에서 integrand degree `(4,4,4)`,
3-point 최대 entry 오차 `1.1102230246251565e-16`, 2-point 오차
`6.018518518518257e-4`, 양의 central inertia와 exact centroid identity를 확인했다.
- E1~E5는 실제 global BC 뒤 analytic null intersection을 사용하며 원 constrained
stabilized pencil을 보존한다. Tiny positive mass를 rank cutoff로 삭제하지 않는 계약,
nodal whitening 및 원 free DOF 전체 residual은 유지해야 한다.
- Intel `fpm[49]`의 total count는 stochastic estimate로 기술되지 않는다.
Enclosure·empty prefix·count/solve 일치·Gram·독립 residual을 함께 요구하는 E6는
floating-point 무조건 완전성 theorem을 주장하지 않는다. Trace stopping은 interval
endpoint scale을 사용하므로 영고유치 자체가 분모 0의 근거는 아니다.
출처와 검토 한계는 [수치 상세](numerical-review-evidence.md)에 기록했다.
- [Reference-model](reference-model.md)은 지정 input/TXT 원본, 모든 10개 `Value`,
step/mode/frame identity, singleton family와 공통 tolerance의 논리 계약을 완성했다.
Reference artifact readiness에 결손은 발견하지 않았다. 수치 비교 실행 성공은 미판정이다.
## Handoff와 미완료 범위
이번 gate는 **통과하지 않았다**. Requirement owner의 정합 결과 후 영향받은 formulation
V5와 NR evidence를 같은 revision으로 재검토한다. Reference 계약과 위 비충돌 계산은
revision 영향 검토 후 재사용할 수 있다.
전체 V1~V6 internal threshold, conditioning limit, FEAST parameter·endpoint/count/solve
budget 및 필수 case matrix의 최종 고정은 이 조기 upstream 반환에서 완료하지 않았다.
구현 담당자가 빈 기준을 정하거나 현재 보고서를 I/O/구현 진입 승인으로 사용하면 안 된다.
미완료 항목은 [재검토 범위](numerical-review-evidence.md#재검토-범위)에 명시했다.
외부 solver·CMake/CTest·Harness·FEAST runtime·FESA reference 비교는 미실행이다.
Workflow 전이와 critical decision 전달은 Coordinator 소유다.
@@ -0,0 +1,111 @@
# MITC4 FEAST 고유치 reference-model 계약
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r1`
- 검토일: `2026-09-06`
- Artifact·logical comparison readiness: 필요한 입력과 비교값 확인 완료.
- Numerical comparison result: 미실행.
- Stage outcome은 [numerical-review](numerical-review.md)의 `return-upstream`을 따른다.
지역 범위는 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md),
공통 판정은 [TOLERANCE](../TOLERANCE.md)의 `common-reference-tolerance`,
effective date `2026-08-18`, ADR-022를 따른다.
## Case와 원본 artifact
| Role | 지정 경로 | SHA-256 |
| --- | --- | --- |
| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` |
| 외부 reference | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` |
Case identity는 `shellNL-eigen-meshfine`다. 원형상 `729` nodes, `676` S4 elements,
면적 `100`, `t=0.5`, `rho=2700`, `E=2.1e11`, `nu=0.3`인 평판의 외곽 `104`개
절점이 DOF 1~6 모두 고정된다. Interior nodes `625`, 예상 `nf=3750`, `nz=625`,
finite dimension `3125`다. 이 수는 구현의 실제 rank/count 검증을 대신하지 않는다.
유일한 source step은 `Step-2`, 무응력·무하중·무감쇠이며 preload가 없다.
Requested `N=10`의 권위는 `.inp *FREQUENCY` data다. TXT의 행수에서 N을 얻지 않는다.
목적은 동일 입력을 사용하는 derived lumped-mass FEAST 결과의 첫 10개 고유치를 외부
수치값에 대조하는 것이다. Original TXT를 직접 읽으며 CSV 변환, rename, metadata,
provenance, version file 또는 mode-shape reference를 새 readiness 조건으로 추가하지 않는다.
## Quantity와 deterministic identity
| 항목 | Logical 계약 |
| --- | --- |
| Quantity / component | `eigenvalue` / `Value`, `lambda=omega²` |
| 차원 / 좌표계 | `T^-2` / coordinate-invariant scalar 의미; SI 자동 추론 없음 |
| Source row identity | `(case, source step name, modal frame mode id, component)` |
| 현재 expected identity | `case=shellNL-eigen-meshfine`, `step=Step-2`, `mode=1..10`, `component=Value` |
| FESA 대응 | 같은 source step의 검증된 오름차순 eigenvalue rank `1..N`; source mode identity로 대응 |
| Actual analysis mass | Consistent에서 유도한 lumped; backend `MKL FEAST` |
| 판정 영향 | 모든 10개 mode `blocking`; warning-only quantity 없음 |
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)이다.
물리 eigenvalue가 같아도 다른 mode identity는 보존한다. 현재 표시값의 `(2,3)`,
`(7,8)`, `(9,10)` 쌍을 평균·merge하지 않는다. 같은 표시값만으로 exact degeneracy를
추정하거나 mode vector로 행을 재배치하지 않는다. FESA 값 자체를 재정렬해 가까운 TXT
값에 임의 matching하지 않고, 승인된 solver rank와 source mode를 연결한다.
공식 FESA 결과는 input의 lexical sibling `shellNL-eigen-meshfine_results.h5`다.
실제 dataset path, field type, persistent vector 및 comparison-view layout은 I/O owner가
정한다. 이 문서는 HDF5 schema를 대신 선택하지 않는다.
## Tolerance 전 사전검사
1. 지정 두 artifact와 FESA 공식 결과가 존재하며 같은 input/case/source step이다.
FESA 결과의 quantity·unit dimension·backend·actual mass가 위 계약과 맞아야 한다.
2. TXT의 모든 비어 있지 않은 행이 명시적인 `Frame: Mode <id>: Value = <number>`와
기존 `Freq = <number> (cycles/time)` 표기에 맞아야 한다. Malformed 행을 건너뛰지
않는다. Freq는 구조 식별에만 쓰고 Value를 재계산하거나 tolerance 대상으로 쓰지 않는다.
3. Required row identity set이 양쪽 모두 정확히 `1..10`이다. Missing/extra/duplicate,
잘못된 mode label·step·component·quantity/schema는 실패다. 입력 N과 따로 검사한다.
4. 모든 required `Value`가 finite여야 한다. `NaN/Inf`를 누락처럼 무시하거나 0으로
바꾸지 않는다. Required FESA dataset/component 누락도 먼저 실패한다.
5. 유일 identity로 대응한 뒤 increasing mode 순서로 검사·보고한다. TXT 행 순서 변경은
결과를 바꾸지 않으며 duplicate 검사 전에 dictionary overwrite하지 않는다.
## Comparison family와 고정 판정
Family identity는 `(case=shellNL-eigen-meshfine, step=Step-2,
modal-frame=mode i, quantity=eigenvalue, units=T^-2, coordinates=scalar,
impact=blocking)`이며 `i=1..10`이다. **10개의 singleton family**이고 각 component는
`Value` 하나다. 서로 다른 source modal frame을 저장 table이 같다는 이유로 합치지 않는다.
각 family에 공통 정책을 그대로 적용한다. `S=max|r|`, `B=0.01S`,
`e=|f-r|`; `|r|<=B`이면 `e<=B`, 그 외에는 `e/|r|<=0.05`다.
Family relative RMS도 반드시 계산하여 `sqrt(mean(e²))/S<=0.01`을 함께 요구한다.
모든 경계는 inclusive다. 현재 각 reference가 양수인 singleton이므로 RMS는
`e/|r|`이고 **모든 mode의 실효 상대 한계는 1%**다. 이것은 NR가 새로 고른 tighter
tolerance가 아니라 공통 same-frame family와 RMS 규칙의 직접 결과다.
`S=0`이면 대응 FESA도 정확히 0인 경우만 통과한다. 그렇지 않으면
`zero-reference-scale-nonzero-error`를 기록한다. Arbitrary absolute floor,
`max(1,S)`, frequency로 대체한 오차, engineering zero clamp는 허용하지 않는다.
Freq·mode shape·stress·reaction·다른 mass variant를 별도 외부 판정에 추가하지 않는다.
보고서는 input/reference/result identity, prechecks, 각 family/component/row count/S,
원본 r/f/e, 적용 row branch·판정, RMS·판정, blocking failure 및 전체 verdict를 남긴다.
Internal FEAST count/잔차와 외부 singleton reference 판정은 별도 evidence다.
## 검증 coverage와 제한
Comparator의 필수 음성/경계 사례는 missing/extra/duplicate/nonfinite/malformed row,
wrong step/quantity/mass, 행 순서 변경, 같은 Value의 서로 다른 mode,
정확한 1% RMS 경계·그 초과·5% row 경계, zero-scale 양성·음성이다.
Generic policy 테스트에는 near-zero `|r|=B`와 그 양옆도 포함한다.
이 reference singleton의 양수 데이터에 실제 near-zero row가 있다고 주장하지 않는다.
실제 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)에 연결한다.
단일 clamped flat case는 curved/partial-BC/null/zero-mode correctness를 검증하지 않는다.
원본 Abaqus 결과와 내부 정식화의 동등성, 구현의 수치 통과 또는 release를 주장하지 않는다.