Files
FESADev/docs/hex8-structural-analysis/lessons.md
T

275 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 여부가 수용에 쓰인다. 추가 계측에서 선형 진입20→다음23, 비선형72→80은
각각 같은 순수 Newton 구간의 전체1326개 변위·1275개 mask가 정확히 같았으나 correction
숫자4개는 달랐다. 모두 finite/PASS이고 prospective physical FAIL이었으며 기존 판별은
false였다. 선형 진입23→다음30은 실제 ULP 이동을 사이에 두고 변위·mask·correction
숫자까지 같았지만 history 초기화로 판별하지 못해 정상 Newton이 적용되는 경로였다.
독립 검토와 원시 배열 Python 검산 exit0으로 두 조건의 영향을 확인했다. 비선형에서
ULP를 사이에 둔 복귀는 입증하지 않았으며 전체 혼합 알고리즘의 주기 반복도 주장하지 않는다.
수정 `f661864`는 고정 증분 전체의 적격 실패 진입을 유지하고, 실제 변위·mask와 각각의
finite correction PASS로 동등성을 판별한다. Correction 숫자의 차이는 진단으로 유지한다.
관련76개 검사는 native build/CTest0이며 독립 검토를 통과했다. 실제 Hex8 사례의
history 초기화 재삽입은 두 번째 증분100회 실패를 만들었다. 숫자 일치 재삽입은
두 helper 검사의 assertion 실패를 만들었다. 올바른 원본을 복원하고 실제 object를
재컴파일한 뒤 최종 회귀를 수행했다.
이 재현은 질량이 지배적인 작은 문제의 제어흐름 검사이며 원본 conditioning 해결의 증거가
아니다. 원래 gates·100회 제한은 유지한다.
동일 immutable binary의 원본101개 endpoint 검사 두 건은 다시 세 번째 증분100회에서
native exit1로 자연 종료했다. 선형408.202초의 잔차 비율은 `1.7773871030665027e-8`,
비선형416.052초는 `8.7357210799572219e-9`다. 최신 실패 행의 전체 내력 보상 합산 차이는
0이고 관성력 차이는 약 `1e-17`이다. 최종 다섯 반복에서 전체 변위와 mask는 계속 바뀌므로
잔차 점수만으로 정확한 전체 상태 반복을 추론하지 않는다. 새 판별의 내부 검증과 실제 원본
수렴은 구분해야 하며, 원본 conditioning·local 계산 또는 결합 좌표의 표현 가능성을 더
분석해야 한다. 실패한 state를 통합 완료나 reference PASS로 표시하지 않는다.
추가 원시 proof와 검산은 로컬 `.harness/hex8-evidence/t6-independent-semantic/`에,
수정·mutation·최종 회귀 로그는 별도 구현의
`.harness/build-ninja-msvc-debug/hex8-evidence/t6/`에 보존한다. 선형 진단은 닫힌 proof 검토
후 명시적으로 중단했고 비선형 진단은 native exit1로 자연 종료했다. 둘 다 solver PASS가 아니다.
재현 가능한 원시 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 기록에서 이 개발 중 실패와 구분한다.
## 고정한 실패 상태에서 산술 오차와 갱신 소실을 구분한다
`f661864`의 terminal 상태를 관찰하는 별도 실행은 원래 계산식을 그대로 두고 각300개
reference cache·native response와 전체 state/M/Kt를 저장했다. 두 실행은 native exit1로
자연 종료했으며 원래 출력한 수치 trace와 일치했다. 계측은 byte 단위로 복원하고 재빌드했다.
원래 실행은 full terminal 변위를 저장하지 않았으므로 두 실행의 전체 변위 일치를 주장하지
않는다. 수집한 local 변위/scatter·전역 내력·M*a/M*A·r/Si는 모두 정확히 재조립됐고,
독립 Fraction 검산 두 건은 Python exit0이며 다른 검토자가 원시 계수로 재계산했다.
이 검산은 관찰한 binary64 계수를 고정한 정확한 다항식 계산이다. 이상적인 geometry나
원본 solver 동등성, 표현 가능한 해의 존재/부재를 증명하지 않는다. 선형 cached K dot의
실행 오차는 `+5.82e-13`으로 해당 행의 허용 잔차 `1.49e-11`보다 작았다. Cached G로
operator를 다시 구성하면 내력이 `-3.78e-10` 달라지지만 잔차는 여전히 `2.27e-9`다.
비선형의 고정밀 내력은 `+5.52e-11` 달라져 잔차를 `4.11e-10`에서 `4.66e-10`으로
키웠다. H의 high/low collapse 오차는 존재하지만 이 실패를 산술 정밀도만으로 해결할
근거는 없다. Operator 형성 차이와 runtime dot 오차를 혼동해 force만 교체하지 않는다.
저장한 PRE holding mask를 현재 물리 기준으로 reactivate한 뒤, 같은 순서의 rounded
Keff와 old residual을 포함한 weighted RHS를 별도 SuperLU로 풀었다. 정확한 방정식 잔차
비율은 두 건 모두 약 `2e-16`이다. 선형102개 active 보정은 모두 저장된 변위를 바꾸지
못했고, 비선형81개에서는9개 변위가 바뀌고 실패 좌표71개 보정이 소실됐다. 이는 독립
backsolve의 관측이며 production PARDISO의 현재 fresh 방향이나 actual trial PASS가 아니다.
직전 적용 보정량과 이번 fresh 방향을 구분해야 한다.
Weighted R=0의 physical target은 `alpha*r_old/(1+alpha)`다. 비선형 실패 행에서 이 값의
크기 `2.60e-11`은 현재 허용 잔차 `4.70e-12`보다 크다. 현재 최종 조건은 weighted R=0을
요구하지 않으므로 이것만으로 계약 충돌이나 수치적 불가능성을 선언하지 않는다. Old residual을
버리거나 물리 가속도를 다른 정의로 바꾸는 근거도 아니다. 다음 후보는 실제 native
rates·geometry·모든 원래 Si·update·weighted identity로 검증해야 한다.
같은 고정 상태의 native replay는 실제 Hex8 kernel·rates·하중과 저장 CSR을 사용했다.
먼저17자리 십진 문자열로 저장한 값을 Float64로 복원하고, 재계산한 전체 변위·속도·
두 가속도 배열 및 predictor·하중·내력·관성력·r/Si·최대 점수가 저장 값과 정확히
일치하는지 확인했다. 저장 CSR의 재생이며 독립적인 M/Kt 재조립 검증은 아니다.
RF는 저장되지 않았으므로 constrained residual/free0의 파생 identity만 확인했다.
TEMP 검사는 원래 파일과 byte 단위로 복원하고 실제 object를 재컴파일했다.
Native PARDISO의 현재 fresh solve도 선형102개 보정이 모두 변위를 바꾸지 못했다.
비선형은81개 active 좌표에서9개 변위가 바뀌고71개 실패 좌표의 보정이 소실됐으며,
최대 잔차 비율은 `8.73572e-9`에서 `1.27770e-8`로 커졌다. 정확 산술로 예측한 상위8개
단일 ULP 후보를 각각 실제 계산한 최선 비율은 선형 `4.75888e-9`, 비선형 `6.73857e-9`다.
두 fresh Newton 및16개 ULP trial 모두 원래 physical limit `1e-10`에 실패했다.
다른 update·weighted identity·correction·geometry 검사는 통과했다. Native exit0인 두
replay 검사는 관측 재현 검사의 성공이며 원본 수렴이나 accepted history의 성공이 아니다.
단일 이웃의 실패만으로 여러 좌표를 함께 움직이는 해의 부재를 추론하지 않는다.
기존에 실제 평가한 최선 단일 이웃에서 Newton/history 없이 단일 ULP 정제를 이어가는
별도 관찰은 최대100회 추가 이동으로 제한했다. 먼저4회·24회 관찰과 겹치는 전체 trial
배열을 정확히 재현했다.
선형은77회 개선 후 `5.25815e-10`에서 남은 예측 개선3개가 실제로는 모두 같은 최대값을
만들었다. 비선형은38회 개선 후 `9.85274e-10`에서 남은 예측 개선1개가 실제 최대값을
키워 거절됐다. 두 경우 모두 physical FAIL이며 다른 gates는 PASS다. 마지막 cursor에서
각각2547개·2549개 실제 단일 방향은 검사하지 않았으므로 모든 단일 이웃의 정체를
증명하지 않는다.
진단의100회 이동과 production의100회 Newton solve는 다른 수량이다. 이 관찰은
accepted frame·다음 fresh solve·전체101개 endpoint의 검증도 아니다.
최대 비율이 줄어도 실패한 행 수는 늘 수 있다. 마지막 실패 행 수는 선형162개,
비선형132개였다. 최대값의 엄격한 감소만으로 모든 행의 최종 평형을 보장하지 않는다.
두 정체 상태에서 모든 원래 free 좌표의 ±1 ULP를 정수 변수로 둔 별도 minimax 예측은
각20초 후 timeout이었다. 관찰 script의 Python exit0과 최적화 종료 상태를 구분한다.
반환 후보의 정확 산술 잔차 비율은 `2.84e-8`·`5.62e-8`로 현재 상태보다 컸다.
검증된 zero-change 후보가 주는 목적값 상한을 추가한 각각20초의 후속 예측도 timeout이며
정수 후보를 얻지 못했다. 상한은 기존 rounded surrogate 최적해를 보존하지만 solver에
초기 후보를 전달하는 warm start는 아니다. 이 결과를 native 후보 통과나 표현 가능한
해의 부재로 해석하지 않는다. 최적화 도구는 로컬 진단에서만 사용했고 production은
변경하지 않았다.
두 좌표를 함께 ±1 ULP 이동하는 별도 예측은 마지막 단일 정제 상태에서 시작했다.
최대 잔차 행의 M 또는 Kt 구조적 support에 적어도 한 좌표가 연결되는 조합을 검사했다.
선형313236개·비선형210588개의 Float64 affine 예측을 완료했고, 상위8개씩은
고정 계수의 정확 산술로 Ma·내력·새 Si를 다시 계산했다. 이 support 제한은 affine
예측에 대한 것이며 실제 비선형/반올림 계산의 모든 두 좌표 이웃을 포함한다는 뜻은 아니다.
최선 예측은 각각 `5.23348e-10`·`9.75010e-10`으로 현재 최대값보다 작지만 여전히
원래 기준 `1e-10`을 초과했다.
이16개 후보를 각각 같은 변경하지 않은 cursor에서 실제 kernel·rates로 평가했다.
선형8개는 최대값 `5.25815e-10`이 그대로였고, 비선형은 모두 현재 `9.85274e-10`보다
커졌다. 모든 후보의 실제 변위 변경은 서로 다른 원래 free 두 좌표의 한 ULP로
확인됐으며 physical FAIL, 다른 gates PASS였다. 전체 배열·r/Si·원시64개 artifact의
SHA를 별도 검산한 Python exit는0이다. 두 native 관측 검사의 exit0은 평가와 재현의
성공이며 후보 개선이나 원본 동해석 수렴의 성공이 아니다. Cursor는 이동하지 않았고
다음 fresh solve·accepted history는 실행하지 않았다. 예측 개선을 실제 개선으로
대체하거나 이16개 실패로 모든 표현 가능한 해의 부재를 주장하지 않는다.
Increment-local 보상 가산은 물리 상태를 단일 Float64 변위로 유지하면서 덧셈의 소실량만
다음 Newton 갱신에 누적하는 별도 관찰이었다. 같은 최선 cursor에서 plain/carry 각각
12회씩, 선형·비선형 총48회 fresh solve를 수행했다. 두 경로 모두 원래1275개 free
방정식 전체를 풀고 실제 current Kt를 재조립했으며 old residual과 모든 기존 gates를 유지했다.
Production의 principal refinement·history·ULP 탐색은 이 비교에 포함하지 않았다.
첫 Kt/Keff/RHS·fresh 방향·전체 물리 배열은 두 경로에서 정확히 같았다. 이후 carry는
실제로 다른 변위 경로를 만들었지만 모든48개 physical 판정은 FAIL이었다. 최종 비율은
선형 plain/carry `3.14971e-8`/`3.14508e-8`, 비선형 `4.43049e-8`/`1.54565e-7`로,
둘 다 시작 cursor보다 컸다. 다른 gates는 모두 통과했다. Native exit0의 두 관측 검사는
수렴 성공이 아니며, 독립 Python 검산 exit0은 원시201개 SHA·carry 산술·연산/경로·r/Si와
게이트를 검증한 것이다. TEMP source는 실행 전 복원하고 실제 object를 재컴파일했다.
이 결과는 production carry 도입이나 반복 횟수 확대를 뒷받침하지 않는다.
이 진단 종료 시점에는 low를 물리 변위로 사용하는 변경안을 채택하지 않았다.
이후 사용자가 2026-10-09 선택 A로 [내부 정밀도 변경안](precision-proposal.md)을 승인했다.
단순 carry와 구분해 전체 계산 상태를 high+low로 유지하고 Float64는 반올림 observable로
출력한다. 기존 실패 evidence는 새 방식의 통과 증거가 아니며 물리 기준·원본은 유지한다.
원시 capture·정확 산술·backsolve·이웃 예측·native replay의 재현 자료와 독립 raw 검산은
로컬 `.harness/hex8-evidence/t6-independent-frozen/`에 보존한다. 기능 checklist는
그대로 미완료다.
## 승인된 전체 high+low 요소의 첫 검증
2026-10-09 승인 A 후, low를 누락하는 대조 kernel에서 실제 요소 assertion3개가 실패했다.
전체 pair로 H/Green strain/응력/힘/에너지/접선을 계산한 kernel은 native build0/CTest0이다.
원래 요소27개와 새 검사17개의 최종 묶음44/44가 통과했고, quarter-turn 작은 전단의 힘
covariance와 독립 exact-dyadic primitive oracle을 포함한다. Native 산술6/6은 RN/FTZ/DAZ
실행 전제와 normal high에 최소 subnormal FMA error가 붙는 경계까지 확인했다.
동적 선형과 비선형은 같은 상대변위 gradient의 미분을 사용한다. 기존 rounded K0를 새 힘에
혼합하지 않는다. 기준 절점0의 signed 방향 차분은 접선·에너지 gradient와 일치했고,
두 brick의 공유 면 힘, linear/NL zero-state Hessian 및 low만 남은 현재 셀의 ±폭을 검사했다.
중앙 에너지 차분의 StVK cubic 오차는 step²로 감소한다. 이를 exact 미분값으로 간주해
과도한 test bound를 적용했던 실패를 구분하고 분석적 truncation bound를 적용했다.
큰 반복 비용을 줄이기 위해 선형 Hessian은 같은 paired zero-state graph의 결과를
immutable cache로 보관한다. Cache 생성 실패는 기존 Float64 Create 지원을 거부하지 않는다.
변형·실패 trial 후에도 high/low Hessian은 같고 힘·에너지·복구와 비선형 접선은 같은 전체
trial에서 계산한다. 독립 reviewer가 이 캐시와 native44/44의 원시 로그도 확인했다.
독립 numerical reviewer는 실제 shared arithmetic·kernel·geometry의 한정된 범위를 PASS로
판정했다. 재현 로그는 `.harness/hex8-evidence/precision/`에 보존한다. 이 결과는 동적 전체
상태·시간수렴·원본 endpoint·공식 출력의 완료를 뜻하지 않는다. 현재 checklist는 미완료다.
## 전체 상태의 제한적 원본 관측과 연결
전체 high+low T6 `c49cae4`는 원래 시간 간격·INC를 바꾸지 않고 두 원본의 초기 상태와
증분1–3을 accept했다. Test-only typed stop으로 다음 증분 전에 종료해 prefix 상태를
관측했으며 native0·2/2를 전체 원본 완료로 보고하지 않는다. 메인이 전체 pair·full M/Mff,
모든1275 free r/Si·zero branch·HHT update·weighted old-r·실제 solve 보정을 exact Fraction으로
검산했다. 물리 비율 최대값은 선형3.12680e-20, 비선형1.3043731e-16이다.
Root 연결의 related49/49와 두 brick의 LIN/TL 전체 low 직렬/TBB 일치1/1은 native0이다.
최초 broad filter가 긴 전체 원본 smoke를 함께 선택한 실행은 의도적으로 중단했고
CTest exit−1로 보존했다. 완료하지 않은 실행을 수렴 실패로 해석하거나 현재 PASS에 합산하지
않는다. 공식 출력·101 endpoint·원본 비교·전체 회귀는 후속 검증이다.