# 구조해석 실무 프로세스 조사·검증 보고서

작성 2026-10-09 · CEO 지시서(구조해석 실무 프로세스 조사·검증) 수행 결과
검증 대상 = 도진웍스 제관웹 구조해석
 · 화면: `fab.html`(3D 공장동 화면) + `fab_fea.js`(구조해석 패널·결과 색칠 코드)
 · 서버: `fea_server.py`(해석 서버, 포트 8097. 솔버 = CalculiX `ccx`, 사면체 메시 생성기 = `tetgen`)
 · 코드 기준 시점 = 저장소 HEAD `7d6e5a3`
 · **실행 결과 기준 = 지금 브라우저에 떠 있는 실제 화면**(http://127.0.0.1:8090/fab.html, 읽기만 수행)
해석 대상 = 캐나다 E500 PRO-R 궤도식 작업기 하부 프레임 블럭 "500PRO-R 수정안 20260917"

> **코드·설정·git 을 한 줄도 바꾸지 않았습니다**(지시서 7항). 해석을 실행하지도 않았습니다. 읽기·대조·판정만 했습니다.

---

## 0. 이 보고서를 읽는 법 — 근거의 등급을 먼저 본다

본문의 모든 주장에 아래 꼬리표가 붙습니다. 지시서 7항("실제 계산 / 이론 추정 / AI 설명을 구분하라")을 지키기 위한 장치입니다.

| 꼬리표 | 뜻 | 신뢰도 |
|---|---|---|
| **[화면실측]** | **지금 떠 있는 브라우저 화면에서 직접 읽은 값** | 가장 높음 — 현재 상태 |
| **[코드]** | 저장소 HEAD `7d6e5a3`의 코드를 직접 읽은 것 | 가장 높음 — 파일·함수명 병기 |
| **[과거로그]** | 이전 실행 기록. **어느 시점·어느 경로인지 함께 적음** | 높음. 단 현재 상태가 아님 |
| **[이론]** | 역학 공식으로 계산·판단한 것 | 높음. 전제가 틀리면 결론도 틀림 |
| **[AI설명·원문미확인]** | 제가 아는 공학 실무 일반론. **이번 작업에서 표준 원문으로 확인하지 못함** | 참고용. 외부에 근거로 제시 금지 |

### ★ 이번 작업의 한계 (지시서 2항 — 반드시 먼저 읽을 것)

**이번 세션의 웹 원문 조사는 사용량 한도로 중단되어, 외부 표준·공식 기술문서를 확인한 건수는 0건입니다.**

- E절에 **링크를 제시할 수 있는 외부 공식 자료가 없습니다.**
- 표준 이름(ASME V&V 10, EN 1993-1-5 Annex C, EN 13001 등)이 나오는 곳은 전부 **"확인해야 할 후보 목록"**이며 **[확인 불가]**로 표시했습니다. 조항 번호·계수 값은 쓰지 않았습니다.
- 대신 이 보고서의 판정은 **외부 자료보다 더 직접적인 증거**, 즉 **지금 떠 있는 화면의 실제 숫자와 이 저장소의 코드**에 근거를 두었습니다.

### ★ 숫자 출처가 세 갈래라는 점 (중요)

같은 해석의 숫자가 기록마다 다릅니다. 섞어 쓰면 보고서 전체가 무의미해지므로 **구분해서 적었습니다.**

| 출처 | 시점·경로 | 부품 | 절점 | 요소 | 최대응력 | 최대변위 | 시간 |
|---|---|---|---|---|---|---|---|
| **[화면실측] ★현재** | **지금 브라우저** | 133 해석 / 13 제외 | **51,580** | **21,571** | **946.5 MPa (344%)** | **2.109 mm** | 20.3초 (계산 11.35초) |
| [과거로그] HEAD 커밋 기록 | `7d6e5a3` 커밋 메시지 | 133 성공 / 실패 6 + 자동제외 7 | 65,950 | 27,754 | 866.0 MPa (315%) | 2.215 mm | 24.1초 (ccx 14.5초) |
| [과거로그] 오프라인 하네스 | `final4.py`, 2026-10-09 04:40, **HEAD 이전**·몽키패치 | 119 성공 / 6 제외 | 83,053 | 30,914 | 770.5 MPa (280%) | 2.001 mm | 29.5초 (ccx 17.9초) |

**→ 이 표 자체가 하나의 발견입니다.** 같은 기계·같은 3톤 하중인데 **최대 응력이 770 → 866 → 946 MPa 로 세 번 바뀌었습니다(23% 차이).** 변한 것은 구조가 아니라 **모델 구성**입니다 — 해석에 들어간 부품 수, 껍질 대체 수, 용접 짝짓기 코드, 메시 밀도, 제외 부품 목록이 모두 다릅니다. **세 기록은 "같은 모델을 세 밀도로 푼 것"이 아니라 "서로 다른 세 모델"이므로 수렴 경향으로 읽을 수 없고, 말할 수 있는 것은 하나뿐입니다 — 지금의 최대 응력값은 모델 구성이 바뀌면 23% 움직이는 값이며, 아직 구조의 성질이 아닙니다.** (C-2에서 상술)

---

## A. 실제 구조해석팀의 표준 업무 흐름

> 아래 흐름은 **[AI설명·원문미확인]** 입니다. 제가 아는 산업 현장의 통상 절차이며 이번에 표준 원문으로 뒷받침하지 못했습니다. 다만 각 단계가 "왜 필요한가"는 C절의 우리 실측 문제와 하나씩 짝이 맞습니다.

구조해석은 "버튼을 눌러 색을 뽑는 일"이 아니라 **판정 기준을 먼저 정하고 그 기준으로 합·불을 말하는 일**입니다.

### 1단계 — 해석 전 (전체 공수의 절반 이상)
1. **목적과 판정 기준을 먼저 합의한다.** "응력 몇 MPa 이하, 변형 몇 mm 이하면 합격"을 해석 전에 못 박습니다. 이게 없으면 결과를 보고 기준을 만들게 되고, 그건 해석이 아니라 변명입니다.
2. **도면·CAD·재료·설계조건을 모은다.** 판두께, 재질 규격, 용접 지시(각장·전둘레/부분), 체결 방식, 정격 하중과 작용 위치.
3. **하중을 "어디서 와서 어디로 빠지는가"로 그린다.** 하중 경로를 손으로 그려 보고 그 경로의 부재만 남깁니다.
4. **해석 종류를 고른다.** 정적 / 좌굴(얇은 판이 압축으로 주름짐) / 피로(반복으로 균열) / 동적.

### 2단계 — 모델 만들기
5. **형상 단순화.** **중요: 단순화는 "지우는 것"이고 "다른 형상으로 바꿔치는 것"이 아닙니다.**
6. **요소 종류 선택.** 얇은 판재는 **쉘(면 요소)**, 덩어리는 솔리드, 긴 봉은 빔. 판재를 솔리드로 풀려면 **두께 방향으로 요소가 여러 겹** 있어야 굽힘이 맞습니다.
7. **접합 모델링.** 용접은 통상 "완전 결합"으로 1차 근사, 볼트·핀은 따로.
8. **경계조건을 실제 지지 방식에 맞춘다.** 얹혀 있는 것과 볼트로 조여진 것은 전혀 다릅니다. 완전고정은 실제보다 단단해 **응력 과대·변형 과소**를 만듭니다.
9. **메시 생성 + 단위 일관성 확인.**

### 3단계 — 풀고 나서 (믿을지 말지가 여기서 결정됨)
10. **반력 검증.** 지지점 반력의 합 = 가한 하중의 합. **가장 값싸고 가장 강력한 점검입니다.**
11. **강체운동 확인.** 안 묶인 부분이 공중에 떠 터무니없는 변형이 나오는지.
12. **손계산 대조.** 전체를 단순 보로 바꿔 처짐 공식으로 자릿수 확인.
13. **변형 형상을 눈으로.** 숫자보다 먼저, 휘는 방향이 상식에 맞나.
14. **특이점 걸러내기.** 점하중·점구속 자리의 응력은 **메시를 잘게 쪼갤수록 무한히 커지며 절대 수렴하지 않습니다.** 평가에서 제외하는 것이 표준입니다.
15. **메시 수렴성 검토.** 요소를 더 잘게 쪼개 다시 풀어 관심 값의 변화가 작아질 때까지.
16. **실물 검증.** 시험·계측·실패 이력과 대조. **메시가 수렴한 것은 "계산이 안정됐다"는 뜻일 뿐 "실물과 같다"는 뜻이 전혀 아닙니다.**

### 4단계 — 보고와 설계 변경
17. 가정·단순화·근거·메시 정보·수렴성·한계를 **전부 적습니다.** 숫자만 있는 보고서는 재현이 불가능해 공학 문서가 아닙니다.
18. 설계 변경은 응력값 하나로 하지 않습니다. 민감도 → 재해석 → 가능하면 시작품.

### 모든 해석에 다 할 필요는 없다 (지시서 1항 마지막 문장)
| 해석 목적 | 반드시 할 것 | 생략 가능 |
|---|---|---|
| 형상·방향 감 잡기 | 단위·반력·강체운동·변형 형상 | 수렴성, 실물 검증, 피로 |
| 설계 변경 판단 | 위 + 수렴성 + 특이점 제외 + 손계산 | 실물 검증(단 근거 명시) |
| **균열 원인 규명 / 대외 제출** | **위 전부 + 피로·좌굴 + 실물 대조 + 표준 근거** | 없음 |

---

## B. 기존 AI 브리핑 검증표

판정 다섯 등급: **① 일치** / **② 조건부 적절** / **③ 추가 검증 필요** / **④ 부적절·잘못됨** / **⑤ 판단 불가(근거 부족)**

---

### B-1. 부품별 사면체(C3D10) + 맞닿은 면 *EQUATION(MPC)로 용접 결합

| | |
|---|---|
| **기존 브리핑** | 용접 구조물 해석에 적절한 방법이다 |
| **확인** | **[코드]** `write_inp()` — 요소는 `C3D10`(2차 사면체) 단일. 용접은 `*EQUATION` 3줄(x,y,z)로 종속절점 1개를 상대 부재 삼각형의 6절점에 묶음. **[AI설명·원문미확인]** 2차 요소라 굽힘을 표현할 수 있는 것은 맞습니다 |
| **결함 ①** | **[코드]** 용접 루프의 `fixed_set.add(e[0])` — **한 절점은 평생 한 번만 종속**됩니다. 표면 절점이 8개뿐인 작은 브래킷이 이웃 셋과 닿으면 1곳만 묶이고 나머지는 방정식 0개가 됩니다. **[화면실측]** 그 결과가 화면에 그대로 떠 있습니다 — *"부재 8번(G_2110DN_0004_013___2), 23번(G_2110DN_0004_008_5) 가 고정도 안 되고 용접 이음도 거의 없습니다(사실상 공중에 뜬 상태). 결과 변위·응력을 믿지 마세요."* |
| **결함 ②** | **[AI설명·원문미확인]** MPC 완전결합은 용접 비드 형상·각장·노치가 모델에 없고, **맞닿은 면 전체를 묶으므로 실제가 단속(띄엄띄엄) 용접이면 구조를 실제보다 단단하게 만듭니다** |
| **★ 브리핑 정정** | **[화면실측] 용접부 평가 기능이 이미 있습니다.** 화면에 *"부재107(RB702_0290_1)-부재113(G_2110DN_0031_002) 용접 (용접선 1716mm, **목두께 a=4.0mm**), 전달력 11,371N · 모멘트 835.9 N·m, 전단 1.66 + 굽힘 0.4 → 합성 2.9 MPa / 허용 82.5 → 4% **미검증**"* 가 표시됩니다. **[코드]** `weld_interface_force()` 주석 — 접합면 응력 적분을 쓰지 않는 이유를 "용접토(re-entrant corner) 응력 특이점이라 절점평균 응력이 메시에 따라 요동치고 평형을 만족하지 않는다"로 적고, 대신 전달력·정역학으로 구합니다. **이 접근과 "미검증" 라벨은 공학적으로 정직합니다.** 단 목두께 4.0mm는 **가정값**이고, 화면도 "힘 배분이 정역학만으로 안 정해집니다"라고 한계를 밝힙니다 |
| **판정** | **② 조건부 적절 + ③ 추가 검증 필요** |
| **필요한 수정** | (가) 부재 본체 응력용 모델임을 명시 — 용접부 숫자는 별도 경로(간이·미검증)임을 구분. (나) 실제 용접이 전둘레인지 부분인지, 각장이 몇 mm인지 **공정서로 확정**해 목두께 가정값을 대체. (다) 한 절점 1회 종속 규칙 때문에 끊긴 부재는 **역할 뒤집기 재시도**로 복구 가능 — **[코드]** `find_weld_pairs()`가 `dep_nodes_rev`/`near_faces_rev`를 **이미 계산해 들고 있으면서 쓰지 않습니다** |

---

### B-2. 고정점·하중점을 프리셋 추정 / 직접 찍기 / 안 찍으면 자동 외팔보

| | |
|---|---|
| **확인** | **[코드]** `machineSetup()`은 **자동 외팔보로 넘어가지 않습니다.** 못 찾으면 "클릭해 주십시오"로 멈춥니다. 주석의 이유 — "실패를 그럴듯한 결과로 둔갑시키는 대신 멈춘다". **이 판단은 옳습니다** |
| | **[코드]** 서버 `run_fea()`는 고정·하중점이 **둘 다 없을 때만** `auto_cantilever()`로 갑니다. 이 경로는 `selftest()`(이론값 대조)가 쓰므로 **부재 1개에는 타당**합니다. 부재가 여러 개면 경고를 띄웁니다 |
| | **[화면실측]** 프리셋 `붐·마스트 조립 상태`에 경고가 실제로 떠 있습니다 — *"⚠ 붐·마스트 하중값과 마운트 위치 모두 형상에서 추정한 것입니다 — [CEO확인] 필요 / 하중점이 실제 마운트가 아닌 가까운 모서리에 찍힐 수 있습니다(실측 최대 부재 대각의 19%)"* |
| **판정** | **직접 찍기 = ① 일치** / **부재 1개 자동 외팔보 = ② 조건부 적절** / **프리셋 추정으로 설계 판단 = ④ 부적절** |
| **필요한 수정** | 프리셋은 "감 잡기"로만. 설계 판단에는 도면에서 읽은 실제 마운트 좌표를 찍어야 합니다. **화면의 `[CEO확인]` 경고를 지우지 마십시오** |

---

### B-3. 하중 소멸률 5% 이내면 결과 색칠, 넘으면 "믿지 마세요" 덮개

| | |
|---|---|
| **확인** | **[코드]** `drop_sum`은 **"하중점 반경 안에 절점이 하나도 없을 때"** 그 점의 N을 더한 값입니다. 절점이 **하나라도** 있으면 `per = N / len(idx)`로 전부 싣습니다 → **정의상 적용합 = 요청합, 소멸률 0%.** |
| | **[화면실측]** 화면의 `적용 하중 29400 N` 이 그 결과입니다. **이 숫자는 "해석이 맞다"가 아니라 "하중점 세 곳에 절점이 있었다"는 뜻**일 뿐입니다 |
| **구멍 ①** | **허공을 짚었는지만 잡고, 엉뚱한 부재를 짚었는지는 전혀 못 잡습니다.** 마운트에서 200mm 떨어진 다른 판재를 짚어도 0%입니다 |
| **구멍 ② (새로 발견)** | **[코드]** `fix`와 `loads`는 각각 `nodes_near()`로 독립 생성되고 **고정 절점을 하중 집합에서 빼는 코드가 없습니다.** 두 구(球)가 겹치면 그 절점에 `*BOUNDARY n,1,3`과 `*CLOAD`가 **동시에** 붙습니다. CalculiX는 구속을 적용하므로 **그 하중은 반력으로 흡수되어 구조에 실리지 않는데, `applied_N`은 그대로 세고 `drop_sum`은 0을 유지합니다.** → 하중이 사라져도 소멸률은 0%입니다 |
| **진짜 게이트** | **[AI설명·원문미확인]** 실무 1차 점검은 **반력 합 = 하중 합**입니다. **[코드]** 우리 코드는 `write_inp()`에서 `*NODE FILE / U, S, RF`로 **반력을 이미 출력하고 있습니다.** 그런데 `parse_frd()`는 `DISP`·`STRESS`만 읽고 반력(`FORC`)은 건너뜁니다 → **가장 값싼 검증 장치가 출력만 되고 읽히지 않습니다** |
| **판정** | **④ 부적절** — 이름이 실제 기능보다 과대합니다 |
| **필요한 수정** | (가) 이름을 **"하중 누락 감지"**로 축소. (나) `.frd`의 `FORC`를 읽어 **Σ반력 = Σ하중(±1%)** 를 실제 게이트로. (다) 고정 절점을 하중 집합에서 배제하고, 배제된 하중을 `drop_sum`에 더할 것 |

---

### B-4. 고정점·하중점 근처 첨두를 특이점으로 자동 제외(splitPeaks/bcMask), 구조 최대를 따로 표시

| | |
|---|---|
| **방향은 옳고, 실제로 작동하고 있다** | **[화면실측]** 화면에 두 값이 나란히 떠 있습니다 — *"구조 최대 (하중·고정점 제외) **682.9 MPa** (항복 대비 248%) @ 5503,2445,11 / 하중·고정점 부근 최대 **946.5 MPa** @ 5394,3807,159"* 그리고 *"힘을 건 자리라 계산상 응력집중이 섞여 있어 이 값은 그대로 믿으면 안 됩니다"*. **[AI설명·원문미확인]** 이 분리는 표준 실무와 방향이 같습니다. **이 기능은 이 시스템의 가장 좋은 부분 중 하나입니다** |
| **결함 ①** | **[화면실측] 숫자 패널의 안전율은 여전히 전역 최대 기준입니다** — 화면에 *"최대 응력 946.5 MPa / 항복 대비 344% / **안전율 0.29**"*. **[코드]** 확인했습니다: `imax = hots[0]`이고 `hots`는 von Mises를 내림차순 정렬한 `order`에서 고른 상위 3곳이므로 **`imax`는 BC 필터가 걸리지 않은 전역 최대**입니다. `safety_factor = fy / vm[imax]`. **→ 구조 최대(682.9)로 계산하면 안전율 0.40인데, 화면 대표 숫자는 0.29입니다. 같은 결과에 두 기준이 섞여 있습니다** |
| **결함 ②** | **[코드]** 제외 반경이 실제 BC 반경이 아닙니다. `bcMask()`는 `res.bc.radius_mm × 1.5`를 쓰는데, 서버의 `bc_info['radius_mm']`는 **기본 반경 `r_def`만** 담습니다. `machineBC()`의 하중점은 자기 반경 `r:60`을 들고 가므로 **실제 60mm인데 화면은 수백 mm를 제외**합니다 — 구조 본체까지 지워집니다 |
| **결함 ③** | **[코드]** **용접(MPC) 경계와 껍질 대체 부재 경계의 인공 첨두는 전혀 걸러지지 않습니다.** `bcMask()`는 사용자가 찍은 좌표만 봅니다 |
| **판정** | **② 조건부 적절 + ③ 추가 검증 필요** |
| **필요한 수정** | (가) 안전율을 **구조 최대 기준**으로 계산하고 전역 최대는 "특이점 포함"으로 따로. (나) `bc.radius_mm`를 실제 사용 반경 목록으로. (다) 껍질 부재(`hull_parts`)와 MPC 종속절점 주변을 제외 대상에 추가 |

---

### B-5. "변위 먼저, 응력 나중"; 안전율은 15에서 캡

| | |
|---|---|
| **변위 먼저** | **[AI설명·원문미확인]** 타당합니다. 변위는 구조 전체를 적분한 값이라 국부 특이점·메시 크기에 둔감하고, 응력은 미분 성질이라 민감합니다. **[코드]** `selftest()`가 이 원칙으로 설계돼 있습니다 — 처짐은 전체로, 굽힘응력은 **고정단에서 떨어진 단면**에서 비교합니다(주석: "고정단 바로 옆은 구속에 의한 응력집중(수치 특이점)이라 단면 굽힘응력과 비교하면 안 된다"). **정확한 판단입니다** |
| **안전율 15 캡** | **[코드] 현재 코드에 안전율 15 캡은 없습니다.** `fy / vm[imax]`를 그대로 내보내고 화면은 그대로 표시합니다(화면 실측 0.29). 주석에 "안전율 184인 부재"라는 표현이 있어 캡이 없음을 뒷받침합니다. **→ 브리핑과 코드가 불일치합니다** |
| **더 중요한 문제** | **[AI설명·원문미확인]** 안전율을 **항복 ÷ 최대 von Mises** 하나로 내는 것 자체가 설계 판정으로는 불충분합니다. 좌굴·피로·용접부는 그 숫자에 없습니다 |
| **판정** | **변위 먼저 = ① 일치**(출처 미확인) / **안전율 15 캡 = ⑤ 판단 불가 — 현재 코드에 존재하지 않음** |
| **필요한 수정** | 안전율 옆에 **"정적 항복 기준만. 좌굴 미포함"** 고정 문구 |

---

### B-6. ★ 얇은 판재는 쉘로 풀어야 하나 현재는 솔리드 사면체로 풂 — 가장 심각한 항목

| | |
|---|---|
| **브리핑 주장은 맞다** | **[코드]** `C3D10` 단일, 쉘 요소는 코드 어디에도 없습니다 |
| **★ 그 대가가 화면에 숫자로 떠 있다** | **[화면실측]** *"실제 형상 사면체(C3D10) · C3D10 21,571개 / 절점 51,580개 · **벽두께 14.2mm**"* 그리고 *"※ 규모가 커서 메시를 자동으로 성기게 했습니다 (**요소 48.8mm, 벽당 0.3겹**) — 정밀도가 낮아집니다."* |
| **"벽당 0.3겹"이 무슨 뜻인가** | **[코드]** 먼저 용어를 정확히 해야 합니다. `elem_size_mm`은 **측정된 요소 크기가 아니라 tetgen에 넘기는 목표 요소 크기**입니다 — `build_tet_mesh()`: `h_want = 벽두께 / 1.2`, `h_budget =` 절점예산에서 역산한 크기, `h = max(h_want, h_budget)`. 즉 **48.8mm는 "이만큼 큰 요소로 만들어라"는 지시값**이고, 실제 요소는 두 표면 사이에 끼므로 그보다 납작하게 눌립니다. <br>**[이론]** 그래서 정확한 서술은 이것입니다 — **목표 요소 크기 48.8mm가 추정 벽두께 14.2mm의 3.4배**, 즉 **두께 방향으로 요소를 한 겹도 배치하지 않는 설정**으로 메시를 만들었다는 뜻입니다. 실제로는 벽 사이에 끼인 납작한(세장비가 큰) 요소 한 겹이 생기고, **어느 쪽이든 판재의 굽힘(두께 방향에서 인장과 압축이 갈리는 현상)은 제대로 표현되지 않습니다.** <br>※ 14.2mm·48.8mm·0.3겹은 모두 **133부품의 평균값**입니다. 부품마다 더 좋거나 나쁘므로 **전체 경향 지표**로 읽어야 합니다 |
| **★ 얼마나 나쁜가 — 코드 자신의 실측이 답을 갖고 있다** | **[코드]** `build_tet_mesh()` 주석에 측정값이 적혀 있습니다 — *"벽당 요소 수 목표를 3.0 → 1.2로 내린 근거(실측): 각파이프 검증에서 **'벽당 0.97겹' 메시가 처짐 −6.99% / 굽힘응력 +2.15%** 였다. 2차 요소(C3D10)는 두께방향 변형률이 1차식이라 굽힘에 한 겹이면 충분하다."* <br>**→ 이것은 중요한 완화 근거입니다. 벽당 1겹 수준에서는 오차가 처짐 7%·응력 2%로 작습니다.** <br>**그러나 현재는 0.29겹 — 검증된 지점(0.97겹)보다 3.3배 성깁니다.** 0.97겹의 오차가 작다는 것이 0.29겹의 오차도 작다는 보증은 아니며, **0.3겹 구간의 오차는 측정된 적이 없습니다**(F-3이 바로 이것을 재는 작업입니다) |
| **★ 그래서 `selftest()` PASS가 전체해석을 보증하지 않는다** | **[코드]** `selftest()`가 이론값 ±10%를 통과하는 것은 **벽당 약 1겹 밀도에서**입니다. **[화면실측]** 전체해석 실제는 **0.29겹** → **검증이 통과된 조건과 실제로 쓰는 조건이 3.3배 다릅니다.** → **"selftest PASS"는 "부재 1개를 적정 밀도로 풀면 정확하다"는 증명이고, "기계 전체를 그보다 3배 성기게 풀어도 정확하다"는 증명이 아닙니다** |
| **쉘이면 버리지 않을 부품들** | **[화면실측]** 제외 목록에 *"99/100/101/102번 **WINCH_BASE_PLATE_25T_1** — 두께가 0인 면 형상입니다(28 x 30 x 0 mm) — 속을 채울 수 없어 해석 대상이 아닙니다"* 4개. **부품 이름이 25T(두께 25mm)인데 CAD에는 두께 0인 면으로 들어와 있습니다.** 쉘이면 "두께 25mm"를 숫자로 주고 바로 풀 수 있는 부품이 솔리드만 지원하기 때문에 버려졌습니다 |
| **판정** | **① 일치**(브리핑이 문제를 정확히 인식) **+ ④ 현재 메시로 낸 국부 응력은 부적절** |
| **필요한 수정** | (가) **즉시: "국부 응력값은 판정에 쓰지 않는다"를 명문화** — 화면이 이미 "참고용"이라 쓰고 있으니 그 문구를 **판정 금지**로 격상. (나) 하중 경로 부재만 20~30개로 좁혀 벽당 겹수를 올릴 것 — 쉘 없이 정확도를 올리는 **가장 값싼 길**. (다) 중장기적으로 **쉘 요소 지원**(두께 0 면이 오히려 쉘에 자연스러운 입력). (라) `selftest()`에 **"벽당 0.3겹으로 풀면 이론값과 몇 % 틀리는가"** 시험 1개 추가 — 비용 거의 없이 숫자로 답이 나옵니다 |

---

### B-7. ★ 수리 안 되는 부품을 볼록껍질로 대체(라벨 부착) — "외곽상자 둔갑과 다르다"

| | |
|---|---|
| **연결성 회복 수단으로는 유효** | **[과거로그]** FINDINGS F14/F21 — 껍질을 넣으면 최대 연결 덩어리가 61부품(51%) → **133부품(95%)**, 고정점 6개가 그 덩어리에 들어옵니다. 참 접촉쌍 256개 기준 **재현 85 / 누락 6 / 지어낸 쌍 4(1.6%)**. 복셀 재메시는 같은 시험에서 연결을 전혀 못 살렸습니다. **수단 선택 자체는 실측으로 정당화됩니다** |
| **규모** | **[화면실측]** *"**껍질 근사 23개** — 그 주변은 실제보다 단단하게 계산됩니다"* 가 컬러바 아래에 떠 있습니다. **라벨이 실제로 작동하고 있고, 문구도 정확합니다** |
| **결과의 성격은 다르다** | **[과거로그]** 껍질 부피 팽창 실측: **+589%, +429%, +307%, +269%, +97%.** ㄷ형강·앵글 같은 오목 부재가 **속 찬 덩어리**가 됩니다. <br>**[이론]** 속 빈 단면을 속 찬 것으로 바꾸면 단면2차모멘트가 급격히 커져 그 부재가 훨씬 단단해집니다. 단단한 부재는 **힘을 과하게 끌어당깁니다** → **그 부재뿐 아니라 이웃의 하중 분담까지 전부 틀어집니다** |
| **★ 우리 코드가 이미 그 증거를 갖고 있다** | **[코드]** `selftest()`의 비교 시험 — 각파이프를 외곽상자(속 찬 것)로 풀면 **"이 부재를 몇 배 튼튼한 것으로 잘못 봤다"**를 숫자로 출력합니다. **껍질 대체는 그 외곽상자와 정도만 다른 같은 종류의 근사입니다.** "라벨을 붙였으니 다르다"는 것은 **보고의 정직성 차이이고, 결과의 타당성 차이가 아닙니다** |
| **판정** | **연결성 확보용 임시수단 = ② 조건부 적절** / **"외곽상자와 다르다"는 주장 = ④ 부적절(잘못된 자기정당화)** / **응력·안전 판정 용도 = ④ 부적절** |
| **필요한 수정** | (가) **껍질 부재와 그 직접 이웃을 "판정 제외"로 표시** — `meshinfo['hull_parts']`가 이미 내려오고 3D 라벨도 붙으므로, **순위표·안전율 계산에서 빼기만** 하면 됩니다. (나) 근본 해결은 껍질이 아니라 **CAD 원본(SketchUp)에서 닫힌 솔리드로 다시 내보내기** |

---

### B-8. 절점 예산 150,000 / 40부품 초과 시 -q 승격 건너뛰고 -p 전용(성긴 메시)

| | |
|---|---|
| **확인** | **[코드]** `MAX_C3D10_NODES = 150000`, `MANY_PARTS = 40`, `PER_CAP = 4000`, `COARSE_NOTE = '성긴 메시 — 국부 응력값은 참고용'`. 화면도 같은 값을 들고 있어 **두 쪽 숫자가 일치**합니다(과거 12,000 바닥값 불일치는 해소됨) |
| **여유는 충분하다 — 문제는 양이 아니라 분포** | **[화면실측]** 실제 절점 **51,580** = 예산 150,000의 **34%**. 화면의 예상치는 *"담은 부재 146개 · 예상 절점 123,231 / 예산 150,000"* 으로 **실제의 2.4배를 과대 예측**하고 있습니다(예산 게이트가 필요 이상으로 보수적). <br>**[이론]** 21,571요소 ÷ 133부품 = **부품당 약 162요소.** 1,225 × 635mm 판재를 162개 사면체로 덮으면 벽당 0.3겹이 나오는 것이 당연합니다 |
| **빠진 것** | **[코드]** 메시 품질을 신뢰도에 연결하는 장치가 **문구 하나**뿐입니다. 수렴성 검토 0건 → "이 메시 응력이 참값에서 얼마나 떨어져 있나"에 대한 답이 **현재 0건** |
| **★ 세 기록을 수렴 경향으로 읽으면 안 된다** | **[화면실측]** 세 기록의 최대 응력이 **770.5 → 866.0 → 946.5 MPa (23% 변동)**, 절점은 83,053 → 65,950 → 51,580. <br>**[이론]** 그러나 **세 기록은 메시만 다른 것이 아니라 모델 자체가 다릅니다** — 해석에 들어간 부품 수(119/133/133), 껍질 대체 수(21/23), 용접 짝짓기 코드, 제외 부품 목록이 전부 다릅니다. **따라서 수렴 경향으로 읽을 수 없고, 오직 "이 응력값은 모델 구성이 바뀌면 23% 움직인다"만 말할 수 있습니다.** <br>**진짜 수렴성 판단은 F-3(동일 모델에서 메시만 변경)에서만 나옵니다** — 이것이 F-3이 필요한 이유입니다 |
| **판정** | **완주 목적 = ② 조건부 적절** / **국부 응력 평가 = ④ 부적절** |
| **필요한 수정** | `PER_CAP` 2,000 / 4,000 / 8,000 3점 시험으로 최대 변위·구조 최대 응력 변화율을 기록 (F-3) |

---

### B-9. 하중 3톤/5톤을 마스트 마운트 추정 위치에 점하중 / 고정은 zmin ≤ 5mm 부품

| | |
|---|---|
| **실제 확인된 것** | **[코드]** `machineBC()`: <br>· **고정** = 최저점 +5mm 안의 부품들의 **외곽상자 중심 XY, z = 상자최저+3mm**, 반경 `max(30, 0.5 × 상자 짧은변)` 구 → `write_inp()`에서 **`*BOUNDARY n, 1, 3` = x·y·z 완전고정**<br>· **하중** = `zmax` 상위 **3개 부품**의 외곽상자 중심 XY, z = 상자최고−3mm, **반경 60mm**, 방향 **항상 `[0,0,-1]` 수직 하방**, 크기 = 전체 ÷ 3<br>· **[화면실측]** 톤 환산 `3톤 (29,400N) / 5톤 (49,000N) / 기존 30,000N` 이 실제 선택 UI로 있고, 현재 적용값은 29,400N |
| **★ 화면이 드러낸 심각한 비대칭** | **[화면실측]** *"조건 **고정 절점 52개** / **하중 절점 1,990개**"* — 전체 51,580절점 중 **고정이 52개뿐**입니다. **[이론]** 하중은 1,990절점에 퍼지는데 고정은 52절점에 몰려 있으면, **거의 점고정에 가까워 그 주변에 광범위한 인공 응력이 생깁니다.** 실제로 최대 응력 위치 @5394,3807,**159** 와 구조 최대 @5503,2445,**11** 은 **둘 다 z가 바닥 근처** = 받침부 주변입니다. **→ 두 값 모두 고정 조건의 영향권에 있습니다** |
| **문제 ① 위치 근거** | 외곽상자 중심은 **실제 체결 볼트 위치도, 마스트 마운트 위치도 아닙니다.** 오목·L형 부품은 상자 중심이 허공일 수 있습니다. 코드 주석이 **최대 87mm(부재 대각의 18.9%) 밀림**을 실측으로 인정합니다 |
| **문제 ② 방향** | **[이론]** 하중이 항상 수직 하방 1방향이면 **마스트의 전도 모멘트와 수평 작업반력이 모델에 없습니다.** 궤도식 작업기 하부 프레임을 비트는 힘은 대부분 거기서 옵니다 |
| **문제 ③ 자중 누락** | **[코드]** `write_inp()`에 중력(`*DLOAD`/`GRAV`)이 없습니다. 밀도(`rho`)는 정의돼 있지만 솔버 입력에 안 쓰입니다. **[코드]** 프리셋(`self`/`lift`/`boom`)은 JS가 자중을 절점하중으로 넣지만 **전체해석 경로 `machineBC()`에는 `selfWeightN` 항이 없습니다.** **[화면실측]** 적용 하중이 정확히 29,400N인 것이 그 증거 — **강재 프레임 자체 무게가 0으로 계산됐습니다** |
| **문제 ④ 완전고정** | **[이론]** 실제 하부 프레임은 궤도 위에 **얹혀** 있습니다(수직 지지 + 마찰). 구 안의 절점을 세 방향 완전고정하면 그 자리가 모멘트 반력까지 받아 **응력 과대·변형 과소**가 됩니다 |
| **문제 ⑤ 하중계수·조합** | **[AI설명·원문미확인]** 작업기계·크레인 계열은 통상 사용하중에 **동적계수와 하중조합**을 적용합니다. 현재는 정적 1.0배 1케이스뿐 (표준 후보는 E절 — **[확인 불가]**) |
| **판정** | **④ 실무적으로 부적절 — 현 상태 결과로 설계 판단 금지** |
| **필요한 수정** | 하중 크기·작용점·방향·자중·지지 방식 5개를 **도면·공정서로 확정.** CEO 미확인 항목이므로 **임의 수치로 메우지 않았습니다**(지시서 5항·7항). 영향 방향은 C-3 |

---

### B-10. 결과 색 스케일 "항복 기준", 컬러바 99퍼센타일 클립

| | |
|---|---|
| **확인 — 브리핑대로 작동 중** | **[화면실측]** 컬러바 캡션이 *"von Mises 응력 (MPa) / **항복강도 대비 / 기계 전체(상한 99퍼센타일)**"*, 눈금은 0.00 → 8.24 → 16.48 → 24.72 → 32.96 → **41.20**. 토글도 있습니다 — `색 기준: 항복(지금) / 피로(반복)`, `색 범위: 이 부재 최대 / 항복 기준` |
| **★ 그런데 숫자를 보면 심각한 오독 위험** | **[화면실측]** **컬러바 상한이 41.20 MPa인데 최대 응력은 946.5 MPa — 23배 차이**입니다. 즉 **절점의 99%가 41.2 MPa(항복 275의 **15%**) 이하**입니다. <br>**[이론]** 두 가지가 동시에 나옵니다: <br>① **화면에서 빨갛게 보이는 부위 대부분은 항복의 15% 수준**(안전율 6.7)입니다. 빨강을 "위험"으로 읽으면 전부 오독입니다. <br>② 거꾸로, **응력이 극소수 절점에만 몰려 있다**는 직접 증거입니다 — 99퍼센타일 대비 최대가 23배. **[AI설명·원문미확인]** 이것은 응력 특이점의 전형적 지문입니다 (C-2의 핵심 근거) |
| **코드가 이미 경고하고 있다** | **[화면실측]** 범례에 *"색은 이 부재 안에서의 상대 비교입니다 (**빨강이 곧 위험은 아님**) — 판정은 위 배너의 글을 보세요"* 가 떠 있습니다. **[코드]** 주석도 "안전율 184인 부재의 빨간 점이 바이어 앞에서 '여기 터진다'로 읽힌다"고 스스로 경고합니다 |
| **판정** | **② 조건부 적절** |
| **필요한 수정** | (가) 대외 제시 화면은 **컬러바 상한 옆에 "이 색의 상한은 항복의 ○%"를 숫자로** 띄울 것(지금은 41.20이라는 절대값만 보임). (나) 상대 비교 경고 문구를 **지우지 마십시오** |

---

### B-11. 변위 2.0mm(4m 프레임, 3톤)는 "물리적으로 타당한 자릿수"

| | |
|---|---|
| **현재 값** | **[화면실측]** 최대 변위 **2.109 mm** (과거 기록 2.001 / 2.215) |
| **문제** | **비교 대상이 제시되지 않은 주장입니다.** 어떤 이론값·손계산과 대조했는지가 어디에도 없습니다. 세 기록이 2.001 → 2.215 → 2.109로 흔들리는 것은 "자릿수가 안정적"이라는 뜻일 수는 있어도 "참값에 가깝다"는 증거는 아닙니다 |
| **오차의 방향 — 단정할 수 없다** | **[이론]** 변위를 **작게** 만드는 편향: ① 껍질 23개로 오목 부재가 속 찬 덩어리 ② 세 방향 완전고정 ③ 자중 0 ④ 접합면 전체 결합 ⑤ 벽당 0.3겹의 성긴 메시(두꺼운 요소가 얇은 벽을 덮어 과강성). <br>변위를 **크게** 만드는 편향: ⑥ 부품 13개 제외(그중 자동제외 7개는 **힘이 지나가는 교량**이었으므로 강성 손실이 작지 않습니다) ⑦ 부재 2개가 사실상 공중에 뜬 상태. <br>**→ 양쪽이 다 크므로 "하한"이라고도, "안전 쪽"이라고도 말할 수 없습니다. 방향 자체가 미정입니다** |
| **판정** | **⑤ 판단 불가(근거 제시 없음)** — **"타당하다"는 표현은 철회해야 합니다** |
| **필요한 수정** | 프레임을 등가 단순보/외팔보로 보고 처짐 공식으로 **자릿수 대조** 1회. **[코드]** `selftest()`에 식(`P·L³/3EI`, `σ = Mc/I`)이 이미 구현돼 있어 새로 만들 필요가 없습니다 |

---

### B-12. 메시 수렴성 검토·반력 검증·실물 대조는 아직 안 함

| | |
|---|---|
| **확인** | **[코드]** 사실과 일치합니다. 수렴성 0건, 반력은 출력만 되고 읽히지 않음, 실물 대조 0건. **브리핑이 숨기지 않은 것은 옳습니다** |
| **정정 1** | **[코드]** "검증이 전무"한 것은 아닙니다. `selftest()`가 판재 외팔보와 **각파이프 약축 굽힘**을 이론식과 대조하고 ±10%를 넘으면 FAIL을 냅니다. 오케스트레이터 보고로 현재 HEAD에서 **PASS**입니다(본 에이전트 미실행). **단 B-6에서 확인한 대로 그 PASS는 벽당 1.2겹 조건의 PASS이고, 전체해석의 0.3겹 조건을 보증하지 않습니다** |
| **빠진 것의 정확한 범위** | ① **조립체 수준** 검증(MPC·껍질이 들어간 모델의 정확도) 0건 ② **메시 수렴성** 0건 ③ **반력 점검** 0건(출력은 됨) ④ **실물 대조** 0건 |
| **판정** | **① 일치(정직한 보고)** + 범위 정정 필요 |
| **중요한 개념** | **[AI설명·원문미확인]** **수렴은 실물 일치가 아닙니다.** 메시를 무한히 잘게 쪼개 값이 안정되어도 하중·구속·형상이 틀렸으면 **틀린 값으로 정확하게 수렴**합니다. 현재는 하중·구속·형상 셋이 모두 미확인이므로 **수렴성 검토는 두 번째 과제이고 첫 번째는 입력 확정**입니다 |

---

### B-13. 기존 브리핑에 **없었던** 것 — 추가 발견 (지시서 3항 후반)

#### ★ 브리핑이 누락했지만 **이미 구현되어 있는** 기능 2개 (칭찬할 부분)

| 기능 | 화면 실측 내용 | 평가 |
|---|---|---|
| **간이 피로 평가** | **[화면실측]** *"피로 위험 순위 (반복하중) / 기준: 용접부 상세등급 **FAT 80** (200만 회, 응력범위 80MPa) / 1위 854%(683MPa) … 5위 180%(144MPa)"* + 경고 *"⚠ 간이 평가 — 정밀 피로해석은 전문기관 값 기준. 정적 해석 응력이 0↔최대로 반복된다고 본 순위이며 **피로수명(횟수) 산출이 아닙니다**. SM490 항복강도 대신 FAT 등급을 쓴 이유: **용접부 피로는 모재 강도가 아니라 이음 형상이 지배**합니다(SM490이라고 피로에 강하지 않음). 순위 자체는 응력 상위와 같은 순서 — FAT80이 더해 주는 것은 순위가 아니라 **합격/불합격 기준선**입니다"* | **[AI설명·원문미확인] 개념이 올바릅니다.** 용접부 피로를 모재 항복이 아니라 **이음 상세등급(FAT)**으로 보는 것은 실무의 핵심 사고방식입니다. 한계도 화면이 스스로 정확히 밝히고 있습니다. **다만 ① 응력범위를 0↔최대로 가정한 것은 실제 하중 이력이 아니며 ② 입력 응력이 B-6의 0.3겹 메시에서 나온 값이고 ③ FAT 80 등급 선택의 근거(이음 상세 분류)가 확정되지 않았습니다** → **② 조건부 적절**. 균열 원인 규명의 출발점으로는 **의미 있는 자산** |
| **"먼저 항복하는 순서"** | **[화면실측]** *"1 8,542N 에서 항복(947MPa, 344%) / 2 11,840N 에서 항복(683MPa) / 3 15,062N 에서 항복(537MPa)"* | **[이론]** 선형해석의 비례성으로 "몇 N에서 항복하나"를 역산한 것. **발상이 좋습니다**(절대 응력보다 현장에 전달력이 큼). 단 **선형 가정이므로 항복 후 응력 재분배는 반영되지 않습니다** — 실제 구조는 한 점이 항복해도 바로 무너지지 않습니다. 이 한계 문구를 추가해야 합니다 |

#### 여전히 빠져 있는 중요 절차

| 빠진 절차 | 왜 중요한가 | 현재 상태 |
|---|---|---|
| **좌굴(buckling) 검토** | **[이론]** 얇은 판재가 압축을 받으면 항복 전에 주름져 무너집니다. 선형정적 해석은 이것을 **원리적으로 못 봅니다.** 판재 위주 구조라 반드시 필요 | 미수행·미지원 |
| **하중조합·동적계수** | 급정지·선회·지면 요철은 정격의 몇 배로 작용 | 1케이스(정적 1.0배) |
| **판두께 실측 입력** | **[코드]** 현재 두께는 OBJ 기하에서 **추정**합니다(`_thickness_ok`). 도면 두께가 아닙니다. **[화면실측]** 추정 벽두께 14.2mm | 도면 대조 0건 |
| **재질 두께별 항복 저감** | **[AI설명·원문미확인]** 구조용 강재는 통상 두꺼워지면 항복을 낮춰 봅니다. 현재 SS275는 두께 무관 275MPa 고정 | **[확인 불가]** KS 원문 미확인 |
| **단위계 일관성** | **[코드]** 확인 — mm / N / MPa / ton·mm⁻³ **일관**(`rho 7.85e-9`, `E 205000`) | **양호** |
| **중복 모델 제거** | **[과거로그]** 블럭 293부품은 기계 **2대**(146+136, Y로 4,990mm). 두 대를 한 번에 풀면 한쪽이 공중에 떠 가짜 결과. **[화면실측]** *"담은 부재 146개"* — **해결됨** | **양호** |
| **판정 기준 사전 합의** | 해석 전에 "몇 MPa / 몇 mm 이하면 합격"을 못 박아야 함 | 미합의 |

---

## C. 현재 프로젝트의 문제점

### ★ 가장 심각한 3개

#### C-1. 메시가 검증된 밀도의 1/3(벽당 0.29겹) — 국부 응력값을 판정에 쓸 수 없다
**[화면실측]** *요소 48.8mm, 벽당 0.3겹, 벽두께 14.2mm, C3D10 21,571개 / 절점 51,580개, 부품당 약 162요소.*

**[코드]** 48.8mm는 측정된 요소 크기가 아니라 **tetgen에 넘기는 목표 크기**입니다(`h = max(벽두께/1.2, 예산에서 역산한 크기)`). 정확히 말하면 **목표 요소 크기가 추정 벽두께의 3.4배 — 두께 방향으로 요소를 한 겹도 배치하지 않는 설정**입니다. 실제로는 벽 사이에 끼인 납작한 요소 한 겹이 생기고, 어느 쪽이든 **판재의 굽힘(두께 방향에서 인장과 압축이 갈리는 현상)은 제대로 표현되지 않습니다.** (세 숫자 모두 133부품의 평균 = 전체 경향 지표)

**[코드] 다만 얼마나 나쁜지는 코드 자신이 부분적으로 답을 갖고 있습니다** — `build_tet_mesh()` 주석의 실측: *"벽당 0.97겹 메시가 처짐 −6.99% / 굽힘응력 +2.15%"*. **벽당 1겹 수준이면 오차가 작습니다.** 문제는 **현재가 0.29겹, 즉 검증된 지점보다 3.3배 성기다는 것**이고, **그 구간의 오차는 측정된 적이 없습니다.** `selftest()`가 ±10%를 통과하는 것도 약 1겹 밀도에서입니다. **→ "selftest PASS"를 전체해석 결과의 보증으로 쓸 수 없습니다.**

**지금 화면의 946.5 MPa, 682.9 MPa, 피로 순위의 683 MPa — 이 숫자들은 모두 0.29겹 메시에서 나왔습니다.**

> **→ 변위(2.1mm)와 "어디가 상대적으로 약한가"의 순서는 참고할 수 있습니다. 절대 응력값과 안전율은 아직 숫자로 인용할 단계가 아닙니다.**

#### C-2. 대표 숫자(안전율 0.29 / 응력 946.5MPa)가 특이점에 지배되고, 화면 안에서 기준이 엇갈린다
**[화면실측]** 같은 화면에 세 숫자가 동시에 떠 있습니다.

| 표시 | 값 | 기준 |
|---|---|---|
| 숫자 패널 "최대 응력 / 안전율" | **946.5 MPa / 0.29** | **전역 최대**(특이점 포함) |
| 결과 배너 "구조 최대(하중·고정점 제외)" | **682.9 MPa** (= 안전율 0.40) | BC 제외 |
| 컬러바 상한(99퍼센타일) | **41.20 MPa** (= 항복의 15%) | 절점 99%가 이 아래 |

**[코드]** 원인을 확정했습니다 — `imax = hots[0]`이고 `hots`는 von Mises 내림차순에서 고른 상위 3곳이므로 **BC 필터가 걸리지 않습니다.** `safety_factor = fy / vm[imax]`. 즉 **색칠·배너는 BC를 제외한 값을 쓰는데 대표 숫자는 특이점 최대를 씁니다.**

**[이론]** 그리고 **99퍼센타일 41.2 MPa 대 최대 946.5 MPa = 23배**는 응력이 극소수 절점에만 몰려 있다는 직접 증거입니다. **[화면실측]** 두 최대값의 위치(z=159, z=11)가 모두 바닥 근처이고, **고정 절점이 52개뿐**(하중 절점 1,990개의 1/38)인 것과 합치면 — **두 값 모두 거의 점고정에 가까운 구속 조건이 만든 응력일 가능성이 높습니다.**

> **→ "항복의 344%"를 그대로 읽으면 "이 프레임은 이미 깨졌다"가 됩니다. 실물은 가동 중이므로 이 숫자에는 모델 인공물이 섞여 있습니다. 숫자가 틀린 게 아니라 판정 절차가 없는 것이 문제입니다.**

#### C-3. 입력(하중·구속)이 전부 추정인데, 가장 값싼 검증 장치(반력)가 비어 있다
**[코드]** 하중 = 외곽상자 상위 3부품 중심에 수직 하방 점하중(r=60mm), 고정 = 바닥 닿는 부품 상자 중심 완전고정, 자중 0, 수평력 0, 모멘트 0, 하중계수 1.0.
**[코드]** 반력은 `write_inp()`가 이미 출력(`U, S, RF`)하는데 `parse_frd()`가 읽지 않습니다.
**[코드]** 게다가 고정 절점을 하중 집합에서 빼지 않아, 두 구가 겹치면 하중이 반력으로 흡수되는데도 `applied_N`은 그대로 셉니다.

미확인 입력이 결과에 미치는 영향(**[이론]**, 임의 수치로 메우지 않음):

| 미확인 입력 | 지금 값 | 결과가 틀어지는 방향 |
|---|---|---|
| 실제 하중 크기 | 3톤 가정 | 5톤이면 선형이므로 **응력·변위 1.67배** |
| 실제 작용점 | 상자 중심 추정(최대 87mm 오차) | 모멘트 팔이 바뀌어 **응력 분포 전체 이동** |
| 하중 방향 | 수직 하방만 | 수평·모멘트 누락 → **비틀림 과소평가** |
| 자중 | **0** | 강재 프레임 무게만큼 **과소평가** |
| 바닥 지지 방식 | 세 방향 완전고정(52절점) | **응력 과대·변위 과소** |
| 판두께 | 기하 추정 14.2mm | 실제가 얇으면 **응력 과소평가** |
| 하중 종류 | 정적 1회 | 반복이면 **정적 해석으로 균열 설명 불가** |

> **→ 과대·과소가 엇갈리므로 "안전 쪽으로 틀렸다"고 말할 수 없습니다. 이것이 지금 가장 위험한 상태입니다.**

---

### 그 외 문제점

#### C-4. 해석에 들어간 형상 중 1/4이 원형상이 아니다
**[화면실측]** 화면이 숫자를 직접 말해 줍니다 — *"부품 **133개 해석 / 13개 제외**(회색)"*, *"**껍질 근사 23개**"*.

```
146부품 (기계 1대)
 → 13개 제외   (형상실패 6 + 고정·용접 미연결 자동제외 7)   → 133개 해석
 → 그 133개 중 껍질 근사 23개 = 속 찬 덩어리로 대체
 → 원형상 그대로 들어간 부품 = 133 − 23 = 110개 / 146 = 75%
```
**[과거로그]** 그리고 자동제외된 부품들은 무작위가 아니라 **"힘이 지나가는 교량"**이었습니다(FINDINGS F7: 그 부재들을 빼면 연결 덩어리가 18조각으로 쪼개짐). **힘의 경로에 있던 부재를 빼고 계산한 하중 분담은 실제와 다릅니다.**

#### C-5. 결과를 "믿지 말라"는 경고가 결과와 함께 떠 있다
**[화면실측]** *"⚠ 부재 8번, 23번이 고정도 안 되고 용접 이음도 거의 없습니다(사실상 공중에 뜬 상태). 결과 변위·응력을 믿지 마세요."* — 경고를 띄우는 것은 옳지만, **그 상태로 나온 숫자가 같은 화면에서 안전율 0.29로 제시**됩니다. 경고와 숫자가 같은 비중으로 보이면 숫자만 읽힙니다.

#### C-6. 특이점 제외 반경이 실제 BC 반경과 다르다
**[코드]** `bc_info['radius_mm']`에 기본 반경만 담김 → `bcMask()`가 ×1.5로 제외. 실제 하중점 반경은 60mm. **구조 본체가 과하게 지워져 "구조 최대"가 실제보다 작게 보일 수 있습니다.**

#### C-7. 자동 판정이 "추정"인데 결과는 "계산값"으로 보인다
**[코드]** `machineBC()`가 결정하는 것 = 고정 부품 목록·좌표·반경, 하중 부품 3개·좌표·반경 60mm·방향 수직 하방·크기 ÷3. 입력은 **부품 외곽상자 좌표뿐**입니다. **해석 결과가 아니라 기하학적 추정입니다.** 화면이 `[CEO확인] 필요`와 "가정값"을 띄우는 것은 옳게 설계된 부분입니다.

#### C-8. 절점 예상치가 실제의 2.4배 — 예산 게이트가 과보수
**[화면실측]** 화면 예상 123,231 vs 실제 51,580. 풀 수 있는 조합인데 "너무 많습니다"로 막힐 수 있습니다(반대로 메시를 더 곱게 쓸 여유가 **3배** 있다는 뜻이기도 합니다 → C-1 완화의 재원).

---

### ★ 확인 불가 (분리 기록 — 지시서 4항·7항)

| 항목 | 상태 |
|---|---|
| **외부 표준·공식 기술문서 원문 전부** | 웹 조사가 사용량 한도로 중단. **확인 건수 0건** |
| **946.5 MPa의 정체(진짜 집중 vs MPC·껍질·고정 경계 인공첨두)** | 화면이 "하중·고정점 부근"으로 분류했고 좌표(z=159)가 바닥 근처여서 **고정 조건 영향권으로 추정**되지만, **확정하려면 F-3(수렴성)과 F-2(제외 범위 수정)가 필요** |
| **`selftest()` PASS** | 오케스트레이터 보고 기준. 본 에이전트 미실행(해석 실행 금지 준수) |
| ~~현재 화면 결과가 `machineBC` 경로인지 프리셋 경로인지~~ | **→ 확정했습니다(확인 불가에서 제외).** **[코드]** `boom` 프리셋의 `build()`는 `lp.concat(spreadLoad(g, selfWeightN(g), 8, 0.5))`를 반환하므로, 프리셋으로 돌렸다면 **하중 + 자중**이 실려 `applied_N`이 설정값을 넘습니다. **[화면실측]** 화면은 **정확히 29,400N** = `MACHINE_LOADS[0].N`에 자중 항이 전혀 더해지지 않은 값입니다. 자중을 더하지 않는 경로는 `machineBC()` 하나뿐입니다 → **전체해석 경로로 확정.** 이것이 B-9 문제③(자중 0)의 근거이기도 합니다 |
| **과거 UI 검증 캡처 4장**(`_fea_컨투어_검증_20261008_*.png`) | 파일 존재만 확인, **내용 미확인** |

---

## D. 수정된 구조해석 작업 절차

### 0단계 — 목적을 하나로 정한다 (가장 먼저, CEO 결정)
| 목적 | 필요한 것 | 현재 가능? |
|---|---|---|
| (가) **설계 비교** — 수정안이 원안보다 덜 처지나 | 선형정적, **변위 중심** | **거의 가능** (변위는 메시에 둔감) |
| (나) **안전 판정** — 3톤을 견디나 | 정적 + 좌굴 + 하중조합 + 수렴성 + 입력 확정 | **불가** |
| (다) **균열 원인 규명** (104호기) | 피로 + 용접부 등급 + 실하중 이력 + 고운 메시 | **출발점만 있음**(FAT80 간이 평가) |
| (라) **영업 데모** | 지금 화면 + 정직한 라벨 | **가능** |

**→ (가)·(라)는 지금 바로. (다)는 FAT80 순위를 "조사 단서"로만. (나)는 입력 확정 후.** 이 구분을 문서에 박아 두는 것이 가장 중요한 안전장치입니다.

### 1단계 — 입력 확정 (해석보다 먼저. CEO·도면 작업)
1. 마스트·붐 **실제 중량**과 **마운트 좌표** 확정 (발주도면 확인) → 숫자와 출처 기록
2. 바닥 **지지/체결 방식** 확정 (얹힘 / 볼트, 위치, 개수)
3. 주요 부재 **판두께**를 도면에서 읽어 입력 (현재 기하 추정 14.2mm)
4. **하중 종류** 확정 (정적 / 반복 / 충격) — (다) 목적의 갈림길
5. 적용할 **설계 표준** 결정 → 동적계수·하중조합·허용응력이 여기서 나옴 (**[확인 불가]** 후보는 E절)
6. **판정 기준 사전 합의** ("최대 변위 ○mm 이하, 구조 응력 ○MPa 이하")

### 2단계 — 모델 정리
7. 기계 **1대 단위**로만 (293 → 146. **이미 적용 중**)
8. ★ **하중 경로 부재만 20~30개로 좁히기** — 146개를 한 번에 푸는 것보다 센터프레임 + 마스트 마운트 + 받침판으로 좁히면 부품당 요소 수가 올라가 **벽당 겹수가 0.3 → 1겹 이상으로** 올라갑니다. **[이론]** 쉘 지원 없이 응력 정확도를 올리는 **가장 값싼 길**이며, 절점 예산에 3배 여유가 있습니다(C-8)
9. 그 범위에 껍질 대체 부재가 있으면 **CAD를 고쳐서** 넣기(껍질로 때우지 말기)
10. 두께 0 판재(`WINCH_BASE_PLATE_25T` 4개 등)는 CAD에서 솔리드로 다시 내보내기

### 3단계 — 풀기
11. 하중을 **실제 마운트 면 크기**에 맞춘 반경으로 분산 (현재 r=60mm의 근거 없음)
12. **고정 절점 52개는 너무 적습니다** — 실제 받침면 전체에 걸쳐 분산하고, 가능하면 수직 지지 위주로
13. **자중 포함** (현재 전체해석 경로는 0)
14. 하중 케이스 **최소 2개**: ① 수직만 ② 수직 + 수평(작업반력)

### 4단계 — 검증 (순서가 중요. 위에서 실패하면 아래로 내려가지 않는다)
15. **강체운동 없음** — 공중에 뜬 부재 0개. **[화면실측]** 현재 2개 있음(부재 8·23번) → **이 상태 결과는 판정에 쓰면 안 됩니다**
16. **Σ반력 = Σ하중 (±1%)** — 가장 먼저 추가할 검증 (F-1)
17. **변위 손계산 대조** — 등가 보 공식으로 자릿수 확인
18. **변형 형상을 눈으로** — 휘는 방향이 상식에 맞나 (화면에 "변형 재생" 있음)
19. **특이점 분리** — BC·MPC·껍질 경계 제외한 구조 최대로 판정. 전역 최대는 "특이점 포함" 별도 표기 (F-2)
20. **메시 수렴성** — `PER_CAP` 3점 시험. 변위 변화율이 작으면 "변위 신뢰", 응력 변화율이 크면 "응력 참고용"을 **숫자로** 선언 (F-3)
21. **실물 대조** — **104호기 균열 위치가 해석의 고응력 위치·FAT80 순위와 맞는지.** **[이론]** 우리에게 가장 값싼 실물 검증입니다 — 실패 이력이 이미 있으니까요

### 5단계 — 보고
22. 가정·단순화·미확인 입력·껍질 부재 23개·제외 부품 13개를 **전부 목록으로** 첨부
23. 설계 변경은 **두 안의 차이**로 말하기 (절대값보다 신뢰도가 높습니다)

---

## E. 출처 및 검증 기록

### E-1. 이번 작업에서 **실제로 확인한** 1차 자료

| 자료 | 경로 / 확인 방법 | 확인한 내용 | 등급 |
|---|---|---|---|
| **실행 중인 화면** | `http://127.0.0.1:8090/fab.html` — Chrome으로 **읽기만**(페이지 텍스트 + 콘솔 81건). 서버 응답 확인: 8090 → HTTP 200, 8097 → JSON 응답(가동 중) | 결과 전체(946.5MPa·2.109mm·안전율 0.29·구조 최대 682.9·컬러바 41.20·절점 51,580·요소 21,571·**벽당 0.3겹**·부품 133/13제외·**껍질 23개**·고정 52절점/하중 1,990절점·20.3초), 제외 부품 6개 목록, 공중에 뜬 부재 2개 경고, **FAT80 피로 순위**, **용접부 검토(목두께 4.0mm·미검증)**, 프리셋·하중 선택 UI, 범례 경고 문구 | **1차(현재 상태)** |
| 콘솔 로그 | 같은 탭 | `[FAB] 블럭 로드: 500PRO-R 수정안 20260917 최상위 119 부품 293 실패 0` 반복. **JS 오류·예외 0건** | **1차** |
| 해석 서버 코드 | `E:\도진팩토리\3D스캔및티칭시스템\fea_server.py` (2,087줄) | 재질표, `MAX_C3D10_NODES=150000`·`MANY_PARTS=40`·`PER_CAP=4000`, `write_inp()`(C3D10·`*EQUATION`·`*BOUNDARY n,1,3`·`*CLOAD`·`U,S,RF`·중력 없음), `parse_frd()`(DISP/STRESS만), `find_weld_pairs()`(양방향 slave·`_rev` 미사용), `run_fea()`(BC·`drop_sum`·떠 있는 부품 자동 제외·`imax=hots[0]`·`safety_factor=fy/vm[imax]`·고정·하중 절점 중복 미배제), `weld_interface_force()`, `auto_cantilever()`, `selftest()`(이론식 ±10%) | **1차(코드)** |
| 화면 코드 | `E:\도진팩토리\3D스캔및티칭시스템\fab_fea.js` (3,126줄) | `MACHINE_LOADS`, `PRESETS`(+`[CEO확인]`), `machineBC()`(zmin+5 고정·zmax 상위3·r=60·수직 하방·**자중 항 없음**), `machineSetup()`, `bcMask()`/`splitPeaks()`, 99퍼센타일 클립, `selfWeightN()` | **1차(코드)** |
| 근본원인 분석 | `...\scratchpad\FINDINGS.txt` (F1~F22) | 293=2대, 절점폭발 원인, 껍질 교량 평가(재현 85/누락 6/지어낸 4), 복셀 유해, 양방향 용접(111→243쌍), 껍질 부피 팽창 +589% | **1차(실측·과거)** |
| HEAD 커밋 기록 | `git show 7d6e5a3` | 24.1초·절점 65,950·요소 27,754·메시 133·실패 6·자동제외 7·**껍질 21**·866.0MPa·2.215mm | **1차(과거)** |
| 오프라인 하네스 | `...\scratchpad\final4_log.txt`, `final4.py` | 83,053절점·30,914요소·119성공·770.5MPa·2.001mm·29.5초. **HEAD 이전, 몽키패치 경로** | **1차(과거·경로 다름)** |
| 적용계획 문서 | `E:\도진팩토리\3D스캔및티칭시스템\_구조해석_적용계획.md` | 검증 대상 계획서 | **참고(AI 작성물)** |

### E-2. 확인하지 **못한** 외부 자료 — 전부 **[확인 불가]**

> **원문을 한 건도 열지 못했습니다**(사용량 한도). 문서명 외에 조항 번호·계수 값은 **의도적으로 적지 않았습니다**(지시서 2항). 발행기관·적용범위도 제 기억에 의한 것이므로 **확인 전에는 인용하지 마십시오.**

| 후보 문서 | 왜 봐야 하나 | 상태 |
|---|---|---|
| ASME V&V 10 계열 | "수렴 ≠ 실물 일치"의 공식 근거, verification/validation 정의 | **원문 미확인** |
| ASME BPVC Section VIII Div.2 Part 5 | 응력 분류(막·굽힘·첨두)와 **특이점·첨두응력 취급** | **원문 미확인** |
| **EN 1993-1-5 Annex C** (강판 구조 FE 해석) | **이번 사안에 가장 가까움** — FE 모델·경계조건·메시·결과 판정 요구사항 | **원문 미확인** |
| **EN 1993-1-9 / IIW 용접부 피로 권고** | **FAT 80 등급 선택의 근거**와 핫스팟 평가 메시 규칙. 화면이 이미 FAT80을 쓰고 있으므로 **확인 우선순위 최상위** | **원문 미확인** |
| EN 13001 계열 (크레인 하중) | **동적계수·하중조합**의 근거 | **원문 미확인** |
| EN 12999 / EN 280·EN 1495 / EN 474·ISO 10567 | 이 장비 계열의 정격·시험하중·안정성 | **원문 미확인. 적용 계열도 미확정** |
| AWS D1.1 / ISO 5817 | 용접 품질 등급·각장 ↔ 해석 입력(목두께 4.0mm 가정) 연결 | **원문 미확인** |
| KS D 3503 (SS275) | 항복 275MPa 근거, **두께별 저감 여부** | **원문 미확인** |
| ANSYS/Abaqus/Siemens/Altair 공식문서 | **쉘 전환 두께 기준**, 두께 방향 최소 요소 겹수, TET10 사용 조건, 특이점 처방, 수렴성 절차, tie/bonded 한계, **"껍질 대체"가 인정되는 기법인지** | **원문 미확인** |
| NAFEMS 품질보증·V&V 공개자료 | 해석 보고서 필수 항목 | **원문 미확인** |

**→ 특히 "껍질 대체가 공인된 기법인가"(B-7)와 "두께 방향 최소 요소 겹수"(B-6·C-1)는 제 판정의 핵심인데 외부 근거가 0건입니다. 현재 판정은 [이론]과 우리 `selftest()`·화면 실측에만 근거합니다.**

### E-3. 근거가 충돌하는 지점 (지시서 7항 — 양쪽 제시)

| 쟁점 | 한쪽 | 다른 쪽 | 제 판단 |
|---|---|---|---|
| **볼록껍질 대체** | 연결성 회복에 **유일하게 효과적**(51%→95%). 복셀은 무용 | 오목 부재를 속 찬 덩어리로 → **강성 과대·하중 분담 왜곡**(부피 +589%) | **수단 채택, 결과 불채택.** 해당 부재와 이웃을 판정에서 제외하면 둘 다 만족 |
| **접촉절점 1개로 완화** | 작은 브래킷이 떨어져 나가는 것을 막아 연결 복구 | 절점 1개 접촉을 용접으로 보는 것은 점용접 수준 | 코드가 `'spot': True` 라벨을 이미 붙임 → **신뢰도에 반영**하면 해결 |
| **성긴 메시 + 피로 순위** | 상대 순위는 메시에 덜 민감해 "조사 단서"로 쓸 수 있음 | 입력 응력(683MPa)이 0.3겹 메시 값이라 **백분율(854%)은 무의미** | **순위는 쓰고 백분율은 쓰지 말 것** |
| **상대 색 스케일** | 항복 기준으로는 전체가 파래서 약한 곳이 안 보임 | 안전율 6.7인 부위도 빨갛게 보여 오독 위험 | **용도 분리**: 내부 진단=상대, 대외=항복 기준 + 상한의 항복 대비 % 표기 |

---

## F. 즉시 실행 작업 목록

### ■ 바로 가능 (코드 안에 재료가 이미 있음)

| # | 작업 | 근거 | 효과 |
|---|---|---|---|
| **F-1** | **반력(RF) 검증을 켠다.** `.frd`의 `FORC` 블록을 읽어 **Σ반력 = Σ하중(±1%)** 를 화면에 표시하고, 안 맞으면 결과를 덮개로 가린다. 함께: **고정 절점을 하중 집합에서 배제**하고 배제된 하중을 `drop_sum`에 더한다 | **[코드]** `write_inp()`가 이미 `U, S, RF`를 출력 중. `parse_frd()`는 블록 이름으로 분기하므로 `FORC` 추가가 기존 파싱을 깨지 않음(FINDINGS F17) | **가장 값싼 1차 검증**이 생긴다. 지금의 "소멸 0%"보다 비교할 수 없이 강한 게이트 |
| **F-2** | **대표 숫자의 기준을 통일.** ① 안전율·최대응력을 **구조 최대(682.9MPa → 0.40)** 기준으로 ② 전역 최대는 "특이점 포함"으로 따로 ③ `bc.radius_mm`를 실제 사용 반경으로 ④ 껍질 23개(`hull_parts`)와 MPC 종속절점 주변을 제외 대상에 추가 ⑤ 컬러바 상한에 "항복의 15%" 병기 | **[코드]** `splitPeaks()`가 이미 두 값을 계산. `hull_parts`도 이미 화면으로 내려옴. **값을 연결만** 하면 됨 | **C-2 해소.** "344%·안전율 0.29"가 특이점 때문인지가 화면에서 바로 보인다 |
| **F-3** | **메시 수렴성 3점 시험.** 같은 조건으로 `PER_CAP` 2,000 / 4,000 / 8,000 (또는 부재 20~30개로 좁혀 벽당 1겹 이상) 세 번 실행 → **최대 변위·구조 최대 응력·벽당 겹수**를 표로 기록 | **[화면실측]** 절점 51,580은 예산의 34%라 **3배 여유**. 계산 11.35초라 3회가 1분 이내 | **"변위는 믿어도 되고 응력은 참고용"을 숫자로 선언**할 수 있게 된다. 지금은 선언 근거 0건. **C-1의 직접 해소** |
| (보너스) **F-4** | **공중에 뜬 부재 2개가 있는 결과는 "판정 불가" 덮개로 가린다** + 껍질 23개를 순위표·안전율 계산에서 제외 | **[화면실측]** 경고가 이미 표시되지만 숫자도 같이 보임 | C-5 해소. 정직성 확보 |
| (보너스) **F-5** | **용접 역할 뒤집기 재시도**로 자동제외 7개 복구 시도 | **[코드]** `find_weld_pairs()`가 `dep_nodes_rev`/`near_faces_rev`를 **이미 계산해서 들고 있으면서 쓰지 않음** | 제외 13개 → 감소. C-4 완화 |
| (보너스) **F-6** | **"먼저 항복하는 순서"에 선형 가정 한계 문구 추가** / **피로 순위에서 백분율(854%)은 숨기고 순위만 표시** | 선형해석은 항복 후 재분배를 반영 못 함. 입력 응력이 0.3겹 메시 값 | 오독 방지 |

> **주의:** F-3은 해석을 실행하는 작업입니다. 지시서 7항("조사·검증 먼저, 설정 변경 금지")에 따라 **이번 작업에서는 실행하지 않았습니다.** CEO 승인 후 별도 작업으로 진행하십시오.

### ■ 자료 확보 필요 (CEO·도면)

| # | 확보할 것 | 어디서 | 없으면 |
|---|---|---|---|
| F-7 | 마스트·붐 **실제 중량**과 **마운트 좌표** | 발주도면 확인 + 공정서 | 하중 크기·위치가 추정으로 남음 |
| F-8 | **바닥 지지/체결 방식**(얹힘/볼트, 위치, 개수) | 발주도면 확인 | 완전고정 52절점이 응력 과대를 만듦 |
| F-9 | 주요 부재 **판두께** | 도면 | 추정 14.2mm 오차가 응력에 직접 비례 |
| F-10 | **하중 종류**(정적/반복/충격)와 작업 사이클 | CEO 구술 + 현장 | 반복이면 정적 해석으로 균열 설명 불가 |
| F-11 | **적용 설계 표준** 결정 | 발주처 요구사항 확인 | 동적계수·하중조합이 공백 |
| F-12 | ★ **104호기 균열 위치 사진·기록** | 사내 | **가장 값싼 실물 검증 자료.** FAT80 순위·고응력 위치와 대조 가능 |
| F-13 | **용접 지시(각장·전둘레/부분)** | 공정서 | 목두께 4.0mm 가정을 대체할 수 없음 |
| F-14 | E-2 표의 **표준 원문**(최소 EN 1993-1-5 Annex C, IIW/EN 1993-1-9, 장비 계열, SS275) | 표준 구매 또는 공개 요약 | 이 보고서의 [AI설명·원문미확인] 판정이 미확정으로 남음 |

### ■ 전문가 검토 필요

| # | 항목 | 왜 |
|---|---|---|
| F-15 | **하중조합·동적계수 설정** | 설계 책임이 따르는 판단 |
| F-16 | **FAT 등급 선택과 용접부 피로 평가** | 화면이 이미 FAT80을 쓰고 있으나 **등급 선택 근거가 미확정.** 균열 규명의 본편 |
| F-17 | **좌굴 검토** | 판재 압축 부재에 필수. 선형정적으로 원리적 불가 |
| F-18 | **볼록껍질 근사의 허용 범위 / 두께 방향 최소 요소 겹수** | B-6·B-7 판정의 핵심. 외부 근거 0건 |
| F-19 | **최종 안전 판정과 대외 제출** | 해석 결과에 서명하는 일. 사내 AI 시스템의 역할 범위 밖 |

---

## 마무리 — CEO께 드리는 네 줄

1. **지금까지 만든 것은 "공학적으로 틀린 것"이 아니라 "아직 판정에 쓸 수 없는 것"입니다.** 133부품을 20초에 푸는 것, 공중에 뜬 부재를 미리 잡아 경고하는 것, 특이점을 분리해 "구조 최대 682.9 / 하중점 부근 946.5"를 나란히 보여주는 것, 외곽상자 둔갑을 스스로 금지한 것, 용접부 피로를 모재 강도가 아니라 FAT 등급으로 본 것 — **이 다섯 가지는 전문가의 사고방식입니다. 버리지 마십시오.**
2. **가장 급한 기술 문제는 "벽당 0.3겹"입니다.** 목표 요소 크기가 판재 두께의 3.4배 — **두께 방향으로 요소를 한 겹도 배치하지 않는 설정**으로 돌렸습니다. 코드 자신의 실측에 따르면 **벽당 1겹이면 오차가 처짐 7%·응력 2%로 작은데, 지금은 그보다 3.3배 성기고 그 구간의 오차는 측정된 적이 없습니다.** 해결책은 쉘 요소 개발이 아니라 **부재를 20~30개로 좁혀 다시 푸는 것**이고, 절점 예산에 3배 여유가 있습니다. **오늘 할 수 있습니다.**
3. **"항복의 344%, 안전율 0.29"는 아직 설계 신호가 아닙니다.** 실물이 가동 중이고, 절점의 99%가 항복의 15% 이하이며, 최대값 두 곳이 모두 고정점 근처입니다. **F-1·F-2·F-3 세 가지를 하면 그 숫자가 진짜인지 화면에서 바로 보입니다. 그 전에는 사내·외부 어디에도 인용하지 마십시오.**
4. **가장 값싼 실물 검증은 104호기 균열 사진입니다.** 해석이 짚은 고응력 위치·피로 순위와 실제 균열 위치가 맞는지 대조하는 것 — 이것 하나가 외부 표준 열 개보다 설득력이 큽니다.

---
*작성: deep-reasoner (Opus) · 코드·git·해석 설정 무변경 · 해석 미실행 · 화면은 읽기만 · 실측 근거는 파일·함수명·화면 문구 병기 · 미확인 자료는 전부 [확인 불가] 표기*
