# Hex8 계산 정밀도와 검증에서 확인한 점 현재 완료 여부는 [PRD](PRD.md)의 checklist가 소유한다. 아래 기록은 [정식화](formulation.md)와 [수치 기준](numeric-controls.md)을 바꾸지 않고 계산 정밀도를 개선한 근거다. 내부 검사 통과와 원본 동적 모델의 수렴은 구분한다. ## 작은 변형률에서 단위행렬을 빼지 않는다 `E=(F^T F-I)/2`를 그대로 계산하면 작은 변형률에서 유효 숫자를 잃는다. `H=grad(u)`로부터 `E=sym(H)+H^T H/2`를 계산하면 같은 Green 변형률을 단위행렬 차감 없이 구한다. StVK 재료식, 에너지, Cauchy 응력과 접선은 유지한다. 탄성계수 `2.1e11`, Poisson 비 `0.3`인 직육면체의 signed affine stretch `±1e-10`, `±1e-8`에서 독립 응력·에너지·면 traction 적분으로 기존 오류를 재현했다. 수정 `7d191036`은 요소 검사 27개와 독립 수치 검토를 통과했다. 비선형 동적 원본의 첫 증분 잔차 비율은 약 `1.42e-5`에서 `6.02e-10`으로 줄었지만, 승인된 `1e-10` 기준은 여전히 충족하지 못했다. ## 곱셈, 합산, 변위 차감의 오차를 각각 보존한다 강체 병진을 제거한 상대변위로 내력을 계산해도 큰 항들이 상쇄되는 행에서는 계산 순서의 영향이 남는다. 원본 선형 동적 사례의 두 요소 행에서 local 곱의 절댓값 합은 각각 약 `3.63e6`이었고, FMA 곱셈 잔여와 보상 합산으로 복구한 내력 차이의 합은 `8.20e-10`이었다. 당시 전체 잔차 `9.06e-10`과 같은 크기였다. 수정 `c50e68e`는 캐시된 K0를 그대로 두고 상대변위와의 곱셈·합산을 보상한다. 수정 `8153796`은 절점 변위 기울기 및 비선형 `sum(w*P*G)`에도 같은 보상을 적용한다. 각각 관련 검사 60개와 독립 수치 검토를 통과했으나 동적 원본은 실패했다. 기울기·내력·에너지·접선은 같은 trial의 물리식을 사용한다. 작은 절점 변위의 갱신은 입력 double에서 표현 가능해도, 더 큰 기준 절점 변위를 뺀 상대변위에서는 소실될 수 있다. 수정 `8ccd1b2`는 TwoDiff로 차감의 잔여를 보존하고, 상대변위의 두 부분을 내력·기울기·선형 에너지 계산에 함께 사용한다. 독립 정확 유리수 검산의 유한 차이 125,039쌍에서 불일치가 없었고, 관련 native 검사 60개와 독립 수치 검토도 통과했다. 이 검산은 native solver 검증을 대체하지 않으며, 입력 자체의 반올림으로 잃은 값을 복원한다는 의미도 아니다. ## 수렴 정체와 허용치 변경을 구분한다 위 수정 후 선형 동적 원본은 첫 증분을 5회 solve, 잔차 비율 `9.54e-11`로 수용했다. 두 번째 증분은 100회에서 `1.01993e-10`으로 실패했다. 실패 좌표의 직전 적용 보정량은 약 `-0.496 ULP`여서 저장된 변위를 바꾸지 못했다. 100회 종료 지점에서는 다음 solve를 하지 않으므로 이 값으로 다음 Newton 갱신을 추론하지 않는다. 비선형 원본도 첫 증분에서 약 `1.35e-10`으로 실패했다. 이는 전체 원본 검증 완료의 근거가 아니다. 물리 잔차의 component별 원래 Si, correction, update 및 max100 기준을 유지하면서 표현 가능한 변위에서 추가 정제가 가능한지 확인해야 한다. 예측 잔차는 trial 선택에만 사용할 수 있고, 수용은 실제 rates·형상·내력·복구·모든 free 성분의 원래 판정으로 수행해야 한다. 원본·허용치를 보정하거나 실패한 candidate를 accepted history에 넣지 않는다. ## 잔차 점수만으로 Newton 갱신의 정체를 판단하지 않는다 각 trial의 `abs(r_i)/Si`는 최종 수렴 판정에 사용하지만, 그 최대값이 증가했다고 갱신이 정체된 것은 아니다. 작은 강체 운동 사례에서 한 성분의 잔차는 약 `9.88e-24`에서 `3.17e-25`로 줄었으나 Si가 더 빠르게 줄어 비율은 증가했다. 이 갱신을 한 좌표의 ULP 정제로 대체한 구현은 기존 축·하중 크기 회귀에서 실패했다. 현재 failing 성분의 Si를 고정한 별도 점수도 다른 축의 유효한 갱신을 가로막았다. 완전한 변위가 반복되더라도 다음 반복의 정제 대상 자유도가 바뀌면 계산은 더 진행될 수 있다. 따라서 정체의 근거에는 실제 변위와 정제 대상의 변화가 모두 필요하며, 잔차 점수의 왕복만으로 전체 상태의 반복을 추론하지 않는다. 최종 수용에서는 여전히 실제 모든 free 성분의 원래 Si와 수렴 기준을 검사한다. 변위와 직전 solve mask만 비교한 수정 `1063abc`는 관련74개 검사를 통과했지만 두 동적 원본은 세 번째 증분100회에서 실패했다. 선형 잔차 비율은 `2.10874e-8`, 비선형은 `9.99819e-8`이었다. 이 실패 행의 전체 내력 보상 합산 차이는0이고, 관성력 보상 차이는 약 `1e-17`이므로 해당 실패를 합산 오차만으로 설명하지 못한다. 동일 구현에 동작을 바꾸지 않는 계측을 추가하고 실제 반복 상태를 저장했다. 선형은 다음 반복14의 상태가 진입11과, 비선형은20이18과 정확히 같았다. 전체 변위1326개·진입 시 holding mask1275개·incoming correction metric4개의 유한 값이 모두 일치했고 그 구간의 실제 ULP 이동은0건이었다. 기존 두 상태 판별은 false였으며 prospective physical gate도 FAIL이었다. 독립 검토가 계측과 원시 배열을 대조했고, 독립 Python 검산은 exit0이었다. 진단 실행 두 건은 각각 native exit1로 자연 종료했으며 원본 solver PASS의 증거가 아니다. 고정 증분에서 이전 accepted state·M·하중·predictor가 고정되고 fresh solve와 탄성 local recovery가 결정적일 때, 재현되는 반복 상태는 전체 변위·reactivation 전 holding mask·incoming correction4개다. 다음 상태는 실제 fresh Newton 변위·freeze 후 mask·fresh correction4개로 비교해야 한다. History는 증분 시작과 실제 ULP 적용 후 초기화하고, physical FAIL 및 finite correction PASS 진입만 보관한다. Prospective physical PASS는 정상 Newton 경로를 유지한다. 이 한정된 판별 수정 `b394ae7`은 관련75개 검사와 독립 코드 검토를 통과했다. 7개 판별 조건을 각각 제거한 behavior mutation도 native build0/CTest8로 실패를 검출했다. 기존 수렴 기준·100회 제한·최종 수용은 유지한다. 동일 immutable binary의 두 원본 실행은 여전히 세 번째 증분100회에서 native exit1로 실패했다. 선형은419.360초, 잔차 비율 `7.21125e-9`, 비선형은431.045초, `1.27770e-8`이었다. 선형95번째 반복의 ULP 이동은 실제 점수를 `7.21125e-9`에서 `4.66385e-9`로 낮췄으나 뒤의 정상 Newton 갱신에서 다시 증가했다. 이는 각 정제의 국소 감소가 전체 갱신 과정의 진전을 보장하지 않는다는 증거이며, 전체 변위가 같은 상태로 복귀했다는 증거는 아니다. 비선형의 잔차 점수 왕복도 전체 상태 반복의 증거가 아니다. Incoming correction4개의 실제 수치는 정상 Newton의 rates·tangent·rhs에 사용하지 않으며, 유한 값과 PASS 여부가 수용에 쓰인다. 숫자까지 같은 조건은 더 보수적이지만 이것이 이번 원본 실패의 원인이라고 확정하지 않는다. 동일 순수 Newton 구간의 실제 전체 변위· mask 일치와 correction 숫자 차이, 또는 ULP를 포함한 전체 상태의 재현을 별도 계측으로 확인해야 한다. 새로운 점수 heuristic이나 허용치 변경으로 이 증거를 대신하지 않는다. 재현 가능한 원시 tuple 검산과 SHA256은 로컬 evidence `.harness/hex8-evidence/t6-independent-tuple/check-v3.py` 및 `v3-check-result.json`에 보존했다. 원시 진단과 native 실패 로그는 별도 구현의 `.harness/build-ninja-msvc-debug/hex8-evidence/t6/tuple-trace3/`에 있다. 명령·native exit·실패 로그는 해당 source와 함께 보존한다. 최종 통합 및 외부 비교 결과는 이후 verification 기록에서 이 개발 중 실패와 구분한다.