# D800 소형 부재 — 해결 완료 기록 (2단 탐색)

> **[해결됨 2026-08-17]** 2단 탐색 도입으로 6건 중 **5건 추출 완료**.
> 무회귀: 기존 94개 재현 동일 94 / 달라짐 0 / 사라짐 0. 커밋 dc98816.
> 잔여 1건 = RJ202-0012 (아래 마지막 절 참조).
> 아래는 원인 규명 과정 기록으로 남긴다.

작성 근거: 승인받은 `at_all` 전 라벨자리 진단 실행 결과(2026-08-17).
추론이 아니라 실측이다. 진단 스크립트: `scratchpad\d800\diag_atall.py`.

## 결론: "도면에 단품도 없음"이 아니다. 도면에 있는데 pass6가 후보로 안 본다.

처음 세운 가설(`pass6`가 첫 라벨자리 `at`만 봐서 못 찾는다)은 **틀렸다**.
전 라벨자리 90곳을 전부 훑어도 게이트 통과 후보가 0개였다. 그래서 한 단계 더 파봤다.

`pass6_multi.py` 의 후보 크기 필터를 낮춰(`80 < max(w,h)` -> `10 <`) 다시 재보니,
6건 전부 **VLM이 읽은 치수와 맞는 덩어리가 라벨 바로 곁에 실재**했다:

| 도번 | 두께 | VLM 판독 치수 | 실제 덩어리 | 라벨과의 거리 |
|---|---|---|---|---|
| RJ102-0027 | 16T | 36, 16 | **36 x 16** | 366mm |
| RJ102-0733 | 6T | 30, 26 | **30 x 26** | 125mm |
| RJ102-0150 | 6T | (70), (70) | 70 x 40 | 0mm |
| RJ202-0011 | 32T | 70, 25 | 32 x 70 | 190mm |
| RJ102-0026 | 6T | 30, 6 | 28 x 14 | 84mm |
| RJ202-0012 | 32T | 101, 70 | 101 x 93 | 143mm |

## 진짜 원인 (물리적 근거)

`pass6_multi.py` 의 후보 크기 하한이 `80 < max(w,h)` 이고 `min(w,h) >= 20` 이다.
6건 중 5건은 가장 긴 변이 80mm 미만인 **소형 부재**라 후보 목록에 아예 들어오지 못한다.
크기 필터는 표 칸·글자 상자를 걸러내려고 둔 것이지 작은 부재를 버리려던 게 아니다.

이 하한은 이미 두 번 내려온 이력이 있다(코드 주석):
- `min` 30 -> 20 (0004-017 = 130x30 쐐기 브래킷이 통째로 빠져서)
- `max` 100 -> 80 (0031-012 = 90x90 삼각 거셋이 빠져서)
둘 다 "도면에 실재하는 부재라서" 내렸다. 이번 6건도 같은 성격이다.

## 왜 이번 턴에 안 고쳤나

하한을 10mm 대로 내리면 후보 덩어리가 **20,297개 -> 55,821개 (2.75배)** 로 불어난다.
표 칸·글자 상자·치수보조선 조각이 대량으로 후보에 들어오므로, 검증완료 94개에 대한
무회귀 재검증(전량 재압출 비교)을 다시 받아야 한다. 임계값을 감으로 만지는 일이라
CEO 승인 없이 진행하지 않는다(철칙 제4조·제6조).

## 시도했고 실패했다 — 단순 하한 인하는 안 된다 (2026-08-17 실측, 롤백 완료)

CEO 승인으로 크기 하한을 제품별 플래그로 분리해 D800만 `긴변>24 / 짧은변>=12` 로
낮추고(실측 최소 부재 28x14 기준) 전량 재압출했다.
**무회귀 검증에서 대량 실패해 즉시 롤백**했다(철칙 제2조). 산출물 94개는 무손상.

| 항목 | 기준 | 하한 인하 후 |
|---|---|---|
| 후보 덩어리 | 20,297 | **38,187개** |
| 채택 | 94 | **81개** |
| 기존 94개 재현 | — | 동일 62 / **달라짐 2 / 사라짐 30** |

무너진 예:
- `RJ102-0602`, `RJ102-0604`: **1381x150 -> 27x28** (작은 조각이 부재 자리를 가로챔)
- `RJ302-0097`(62x630), `RJ302-0154`(935x600), `RJ302-0215`(950x400) 등 **30건이 통째로 사라짐**

원인(로그로 확인, 추정 아님): 하한을 낮추면 치수보조선 조각·글자 상자 같은 작은 덩어리가
후보에 대량 유입된다. 이들이 콜아웃에 더 가까워 **소유권 게이트를 먼저 차지**하고
`used` 예약까지 가져가, 진짜 큰 부재가 자기 덩어리를 못 쓰게 된다.
즉 문제는 '하한 값'이 아니라 **'작은 후보와 큰 후보를 같은 줄에 세워 거리순으로 고르는 구조'** 다.
하한 숫자를 24 대신 30, 40 으로 바꿔 보는 식의 재시도는 같은 이유로 실패한다(두더지잡기 금지).

## 다음에 시도한다면 (미승인 — 아이디어 단계)

하한을 평평하게 내리지 말고 **2단 탐색**으로 가야 한다:
기존 하한(80/20)으로 먼저 고르고, **그 도번이 아무것도 못 찾았을 때만** 낮은 하한 후보를
추가로 본다. 이러면 이미 성공한 94개의 탐색 경로가 원리적으로 바뀌지 않는다.
단, 이것도 반드시 전량 재압출 무회귀 검증을 거쳐야 한다.

## 딸린 미결

6T 3건(RJ102-0150 / RJ102-0026 / RJ102-0733)에 붙이기로 한 note **"절곡 전개형"**
(평판 압출은 전개 근사라는 단서)은 부재가 만들어지지 않아 **아직 어디에도 기록되지 않았다.**
추출 시 반드시 함께 넣어야 한다. 판독 원문은 `scratchpad\d800\vlm_readings.json` 에 있다.


## 최종 결과 (2026-08-17)

2단 탐색(1단은 기존 하한 그대로, 1단에서 아무것도 못 찾은 도번만 소형 덩어리 추가 탐색)으로 해결했다.

| 도번 | 두께 | 결과 |
|---|---|---|
| RJ102-0027 | 16T | 36 x 70 x 16 채택 (모따기 4-C5, 홀 2) |
| RJ202-0011 | 32T | 71 x 70 x 32 채택 (모따기, 홀 2) |
| RJ102-0150 | 6T | 70 x 40 x 6 채택 — note "절곡 전개형" |
| RJ102-0026 | 6T | 36 x 56 x 6 채택 — note "절곡 전개형" |
| RJ102-0733 | 6T | 30 x 26 x 6 채택 — note "절곡 전개형" |
| RJ202-0012 | 32T | **미추출** |

### 잔여 1건 RJ202-0012 [CEO확인]
2단까지 가도 후보가 전부 치수 게이트에서 탈락한다(393x281 / 120x93 / 65x19 / 32x82 —
어느 것도 곁에 자기 치수가 없다). 진단에서 확인된 101x93 덩어리는 이 도번 라벨에서
143mm 거리에 있으나 후보 상위 8개(CAND_N) 안에 들지 못한다.
즉 원인은 크기가 아니라 **후보 개수 제한 또는 라벨 위치**다. 추가 진단이 필요하며
이번 턴에서는 임계값을 건드리지 않았다.
