백산이엔지
경력근거: 평택·안성 등의 현장과 설계·품질·공무·SHOP 부서를 직접 방문해 반복 수작업, 수기·엑셀 기록 등의 비효율을 찾습니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 이 자리를 '실제 업무가 이루어지는 현업 부서 가까이에서 문제를 찾고 해결하는 개발자' 로 소개하고, 첫 업무로 '평택·안성 등의 현장과 설계·품질·공무·SHOP 부서를 직접 방문해 반복 수작업, 수기·엑셀 기록 등의 비효율을 찾습니다' 를 듭니다. 이어 '업무 데이터를 연결하고 AI가 활용할 수 있도록 백엔드 API와 DB를 설계' 하고 '자체 개발 프로그램과 데이터 수집 도구를 개발·고도화' 한다고 적습니다. 설계가 낸 수치와 SHOP 이 엑셀에 적은 작업 기록은 따로 남고, 공무가 그 둘을 손으로 맞춥니다. 공고가 이름을 든 세 부서 사이의 일이라 이 화면을 쓰는 사람도 외부 고객사가 아니라 SHOP 과 공무 담당자입니다. 공고는 배관이나 벤딩을 말하지 않고, 이 주제는 회사 소개에 나온 반도체 2차 배관 설계·제작에서 골랐습니다. 이 포트폴리오는 수기·엑셀 작업 기록을 읽어 설계 수치와 견주는 사내 도구 구현을 보여줍니다. 배관 설계나 벤딩 가공의 전문성은 주장하지 않습니다.
주요업무 첫 줄이 평택·안성 현장과 설계·품질·공무·SHOP 부서를 직접 방문해 반복 수작업과 수기·엑셀 기록의 비효율을 찾는 일입니다. SHOP 작업일지 엑셀을 설계 수치와 반입 전에 맞추는 일은 SHOP 과 공무 사이에서 생기는 그런 수작업입니다.
업무 데이터를 연결하고 AI 가 쓸 수 있도록 백엔드 API 와 DB 를 설계하고, 자체 개발 프로그램과 데이터 수집 도구를 고도화한다고 적혀 있습니다. 작업일지·설계 수치·반입 계획 세 파일을 배관 번호로 잇는 판정 API 가 그 일에 해당합니다.
자격요건이 Claude Code 숙련과 루프 엔지니어링, AI 결과를 그대로 받아들이지 않고 검토·디버깅하는 태도를 요구합니다. 벤딩 표기 파서를 테스트 목표 루프로 만들고, 모델이 읽은 각도를 원문 숫자로 다시 맞추는 장치가 이 요구에 닿습니다.
백산이엔지에서 튜브를 자르고 굽혀 배관을 만드는 사내 제작 부서(SHOP)의 생산 담당자와, 그 배관을 평택·안성 현장에 들여보내는 공무 담당자가 반입 전에 여는 사내 대조 화면입니다. SHOP 작업일지 엑셀의 배관 번호·도면 Rev·절단 길이·벤딩 각도를 설계팀이 배관 설계 도구 3D Pipe Editor 로 낸 리비전별 수치, 반입 계획에 대어 배관마다 여섯 판정 가운데 하나와 그 근거를 보여줍니다. 병합 셀이라 빈 Rev 칸은 같은 작업지시 안의 위 행 값으로 채우고, 말로 적은 벤딩은 원문 숫자로 다시 맞춘 각도만 씁니다.
평택·안성 현장에 배관을 들여보내기 전, SHOP 에서 튜브를 자르고 굽힌 작업 기록과 설계팀이 3D Pipe Editor 로 낸 최신 벤딩 수치를 맞춰 보는 SHOP 생산 담당자와 현장 공무 담당자. 설계가 바뀌어도 작업 기록은 수기·엑셀로 따로 남아, 어느 배관이 옛 수치로 만들어졌는지 반입 직전에 사람이 한 장씩 대조한다
설계가 바뀌면 3D Pipe Editor 수치표는 새 리비전으로 나오지만, SHOP 작업일지는 작업자가 엑셀에 따로 적어 Rev 칸이 병합돼 있거나 'rev b'·'REV-B' 처럼 제각각입니다. 공무 담당자는 반입 직전에 배관 번호마다 작업일지와 최신 수치표를 한 장씩 넘기며 맞춥니다. 작업일지의 빈 칸을 채우고 번호·리비전 표기를 맞춘 뒤 굽힘 순서별 각도와 절단 길이를 최신 리비전과 견주면, 옛 수치로 만든 배관은 트럭에 실리기 전에 SHOP 으로 돌아갑니다.
공무 담당자가 SHOP 작업일지 엑셀, 3D Pipe Editor 수치표, 반입 계획을 올리면 이번 주 반입 예정 배관과 작업 기록이 여섯 판정으로 나뉘고, 배관을 펼치면 작업 기록과 최신 리비전의 굽힘 순서별 각도·절단 길이가 나옵니다. 걸린 배관은 반입 보류 목록 엑셀로 내려받아 SHOP 에 넘깁니다. 세 파일은 작성자가 만든 더미로 시작합니다.
작성자가 작업 기록과 설계 수치를 손으로 대조한 배관 80본을 정답으로 두고, 정답과 다른 배관마다 원인을 표기 읽기·Rev 채우기·수치 비교 셋 중 하나로 표시한 리포트가 나옵니다. 벤딩 표기 읽기 실패 모음은 Claude Haiku 와 Sonnet 에 같은 입력으로 돌려 어느 모델이 몇 개를 바로 읽는지 비교합니다.
SHOP 담당자가 손으로 쓴 작업일지를 사진으로 올리면 Claude 가 작업일지 엑셀과 같은 열로 읽고, 공무 담당자는 사진에서 읽은 행과 엑셀 행을 같은 판정 화면에서 봅니다. 사진에서 읽은 각도·길이에는 담당자가 확인을 누르기 전까지 '사진 읽음' 표시가 붙습니다.
공무 담당자가 반입 전 대조 화면을 열면 이번 주 반입 예정 배관과 SHOP 작업 기록이 여섯 판정으로 나뉘고, HP-2231 을 펼치면 작업 기록의 'Rev.B' 수치와 3D Pipe Editor 최신 Rev.D(10월 10일 발행)의 절단 길이·벤딩 각도가 나란히 나옵니다.
도면·Rev 칸이 병합돼 빈 칸으로 읽힌 행, 'hp 2240'·'HP2262' 처럼 띄어 쓰거나 하이픈을 뺀 배관 번호, '90도 세 번' 처럼 말로 적은 벤딩, 숫자 순서를 바꿔 적은 HP-2320, 리비전이 바뀐 뒤 다시 만든 HP-2262 를 섞어도 판정이 판정식대로 나오고, 모델이 읽은 각도가 원문 숫자와 다르면 그 읽기는 버립니다.
작업일지 시트가 여러 장이거나 절단 길이 칸이 글자로 저장된 파일 같은 깨진 입력 20종을 넣어도 화면은 열리고, 읽을 수 없던 줄은 엑셀 행 번호와 이유를 표 위에 남깁니다.
작성자가 손으로 대조한 배관 80본으로 화면 판정이 정답과 맞은 본수를 셉니다. 단, 작업일지와 정답을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건에서의 동작입니다.
위 수치는 작성자가 만든 작업일지의 자가채점이며, 판정이 실제로 맞는 비율은 백산이엔지 SHOP 의 실제 작업일지와 3D Pipe Editor 출력, 공무 담당자의 확인이 있어야 잽니다. 이 포트폴리오는 그 측정을 바로 돌릴 수 있는 상태까지 만듭니다.
정답 80본 가운데 몇 본이 맞았든, 그 작업일지에 '90도 세 번' 같은 표기를 적은 사람도 정답을 매긴 사람도 저라서 일치 본수는 제 표기를 제 파서가 읽었다는 뜻에서 멈춥니다. SHOP 작업자가 실제로 벤딩을 어떻게 적는지는 작업일지 원본을 받아야 압니다.
HP-2232 의 Rev 칸은 병합 셀이라 빈 칸으로 읽히고, 같은 작업지시 위 행의 Rev.B 를 채워야 옛 리비전으로 걸립니다 — 채우지 않으면 리비전 없음으로 빠집니다. 같은 HP-2232 는 옛 리비전이지만 절단 860mm·벤딩 90-90 이 최신 Rev.D 와 같아, 걸리되 반입 여부는 공무가 정합니다. HP-2262 의 '90도 세 번' 은 숫자만 뽑으면 굽힘 하나가 되어 개수 차이로 걸리고, 반복을 풀어야 세 개로 맞습니다. HP-2275 의 3번째 굽힘 46° 는 설계 45° 와 꼭 1도, HP-2262 의 절단 길이 차 2mm 는 허용 오차와 꼭 같아 '넘으면' 을 '이상' 으로 쓰면 둘 다 걸립니다. HP-2320 은 HP-2302 의 숫자를 바꿔 적은 번호라 정규화해도 설계에 없고, 같은 도면의 수치가 같은 배관을 메모로만 남깁니다.
Rev 칸을 바로 위 행 값으로 채우는 규칙은 같은 작업지시 번호 안에서만 씁니다. 작업자가 작업지시 번호 칸까지 병합해 두면 채울 범위가 틀어지므로, 그런 파일은 엑셀 행 번호를 표 위 알림에 올려 SHOP 담당자에게 묻습니다.
허용 오차 1도·2mm 는 카드가 정한 기본값이고 튜브 바깥지름과 유체마다 다를 수 있습니다. 실제 도입에서는 설계팀과 품질팀이 정한 값을 받아 바꿉니다. 배관 설계나 벤딩 가공의 전문성은 주장하지 않습니다.
공고는 배관이나 벤딩이라는 말을 쓰지 않습니다. 주제를 회사 소개의 반도체 2차 배관 설계·제작에서 골랐으므로, SHOP 작업일지 양식과 3D Pipe Editor 가 내보내는 파일 형식은 현장 방문에서 먼저 확인하고 맞춥니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
SHOP 이 쓰는 작업일지 엑셀을 pandas 로 읽은 그대로의 표입니다. 도면 번호·Rev·작업일 칸은 같은 작업지시 안에서 병합돼 있어 첫 행 아래는 빈 칸(null)으로 읽히고, 배관 번호와 Rev 는 작업자마다 'hp 2240'·'HP2262'·'rev b'·'REV-B' 처럼 다르게 적혀 있습니다. 벤딩 각도는 '90-90-45'·'90/90/87'·'90도 세 번' 처럼 적힌 글자 그대로입니다. 리비전이 바뀐 뒤 다시 만든 배관의 기록과 숫자 순서를 바꿔 적은 배관 번호도 넣었습니다.
| work_order_no | excel_row | sheet_no | sheet_rev | pipe_id | cut_length_mm | bend_angles | made_at |
|---|---|---|---|---|---|---|---|
| W-1001-02 | 3 | UPW-CMP02 | A | HP-2262 | 1,420 | 90-90-90-90 | 2026-10-01 |
| W-1007-01 | 4 | UPW-ETCH07 | Rev.B | HP-2231 | 1,180 | 90-90-45 | 2026-10-07 |
| W-1007-01 | 5 | — | — | HP-2232 | 860 | 90-90 | — |
| W-1008-03 | 6 | UPW-CMP02 | REV-B | HP2262 | 1,387 | 90도 세 번 | 2026-10-08 |
| W-1009-02 | 7 | N2-CVD03 | C | hp 2240 | 1,534 | 90/90/87 | 2026-10-09 |
아래 JSON Schema 를 그대로 만족하는 SHOP 작업일지 행을 작업지시 10개 분량(작업지시당 1~4행)으로 더 만들어 주세요. {"type":"object","properties":{"work_order_no":{"type":"string","description":"SHOP 작업지시 번호입니다. 작업일지에 줄마다 적습니다"},"excel_row":{"type":"integer","minimum":2,"description":"작업일지 엑셀의 행 번호입니다"},"sheet_no":{"type":["string","null"],"description":"도면 번호입니다. 같은 작업지시 안에서 병합된 칸이라 첫 행 아래는 null 로 읽힙니다"},"sheet_rev":{"type":["string","null"],"description":"작업자가 적은 도면 리비전 표기 그대로입니다(Rev.B·rev b·REV-B·B). 병합된 칸이라 첫 행 아래는 null 로 읽힙니다"},"pipe_id":{"type":"string","description":"작업자가 적은 배관 번호 그대로입니다. 하이픈·공백·대소문자가 섞여 있습니다"},"cut_length_mm":{"type":"number","minimum":1,"description":"자른 튜브 길이(mm)입니다"},"bend_angles":{"type":"string","description":"굽힘 각도를 굽힘 순서대로 적은 글자 그대로입니다(90-90-45·90/90/87·90도 세 번)"},"made_at":{"type":["string","null"],"description":"작업일(YYYY-MM-DD)입니다. 병합된 칸이라 첫 행 아래는 null 로 읽힙니다"}},"required":["work_order_no","excel_row","sheet_no","sheet_rev","pipe_id","cut_length_mm","bend_angles","made_at"]} pipe_id 는 함께 주는 3D Pipe Editor 수치표의 번호를 주로 쓰고, cut_length_mm·bend_angles 는 그 배관의 어느 한 리비전 수치를 쓰되 일부는 1~6mm·2~4도 어긋나게 하세요. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 작업지시의 둘째 행부터 sheet_no·sheet_rev·made_at 이 null 인 병합 칸, (2) 'hp 2240'·'HP2262' 처럼 공백·하이픈·대소문자가 다른 배관 번호와 'rev b'·'REV-B'·'Rev.C' 처럼 다르게 적은 리비전, (3) '90도 세 번'·'90×2 후 45'·'ㄷ자 90 90' 처럼 말로 적은 벤딩, (4) 숫자 두 자리를 바꿔 적어 수치표에 없는 배관 번호, (5) 옛 리비전으로 만든 뒤 최신 리비전으로 다시 만든 배관. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도(cut_length_mm 가 '1,248mm' 같은 문자열, excel_row 가 비어 있는 행)는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"work_order_no":{"type":"string","description":"SHOP 작업지시 번호입니다. 작업일지에 줄마다 적습니다"},"excel_row":{"type":"integer","minimum":2,"description":"작업일지 엑셀의 행 번호입니다"},"sheet_no":{"type":["string","null"],"description":"도면 번호입니다. 같은 작업지시 안에서 병합된 칸이라 첫 행 아래는 null 로 읽힙니다"},"sheet_rev":{"type":["string","null"],"description":"작업자가 적은 도면 리비전 표기 그대로입니다(Rev.B·rev b·REV-B·B). 병합된 칸이라 첫 행 아래는 null 로 읽힙니다"},"pipe_id":{"type":"string","description":"작업자가 적은 배관 번호 그대로입니다. 하이픈·공백·대소문자가 섞여 있습니다"},"cut_length_mm":{"type":"number","minimum":1,"description":"자른 튜브 길이(mm)입니다"},"bend_angles":{"type":"string","description":"굽힘 각도를 굽힘 순서대로 적은 글자 그대로입니다(90-90-45·90/90/87·90도 세 번)"},"made_at":{"type":["string","null"],"description":"작업일(YYYY-MM-DD)입니다. 병합된 칸이라 첫 행 아래는 null 로 읽힙니다"}},"required":["work_order_no","excel_row","sheet_no","sheet_rev","pipe_id","cut_length_mm","bend_angles","made_at"]}설계팀이 3D Pipe Editor 로 낸 도면 리비전별 배관 수치를 내보냈다고 가정한 표입니다. 같은 배관이 리비전마다 한 행씩 있고 issued_at 이 가장 늦은 행이 최신입니다. 리비전이 올라가도 수치가 그대로인 배관(HP-2232)과, 반입은 다음 주인데 아직 만들지 않은 배관(HP-2308)이 있습니다.
| pipe_id | sheet_no | rev | line_service | tube_od | cut_length_mm | bend_angles | issued_at |
|---|---|---|---|---|---|---|---|
| HP-2231 | UPW-ETCH07 | B | UPW | 1/2" | 1,180 | [90,90,45] | 2026-09-22T10:00:00+09:00 |
| HP-2231 | UPW-ETCH07 | C | UPW | 1/2" | 1,195 | [90,90,45] | 2026-10-02T09:40:00+09:00 |
| HP-2231 | UPW-ETCH07 | D | UPW | 1/2" | 1,210 | [90,90,30] | 2026-10-10T16:40:00+09:00 |
| HP-2232 | UPW-ETCH07 | B | UPW | 1/2" | 860 | [90,90] | 2026-09-22T10:00:00+09:00 |
| HP-2232 | UPW-ETCH07 | C | UPW | 1/2" | 860 | [90,90] | 2026-10-02T09:40:00+09:00 |
아래 JSON Schema 를 그대로 만족하는 배관 수치를 도면 5장 분량(도면당 배관 2~4개, 리비전 1~3개)으로 더 만들어 주세요. {"type":"object","properties":{"pipe_id":{"type":"string"},"sheet_no":{"type":"string","description":"배관이 그려진 장비 hook-up 도면 번호입니다"},"rev":{"type":"string","description":"도면 리비전입니다. 같은 도면의 배관은 리비전을 함께 올립니다"},"line_service":{"type":"string","enum":["UPW","N2","CDA"],"description":"배관이 나르는 유체입니다(UPW 초순수, N2 질소, CDA 압축 건조 공기)"},"tube_od":{"type":"string","enum":["1/4\"","3/8\"","1/2\""],"description":"SUS 튜브 바깥지름입니다"},"cut_length_mm":{"type":"number","minimum":1,"description":"그 리비전의 절단 길이(mm)입니다"},"bend_angles":{"type":"array","items":{"type":"number"},"description":"그 리비전의 굽힘 각도(도)를 굽힘 순서대로 담은 배열입니다"},"issued_at":{"type":"string","description":"그 리비전을 낸 시각입니다. ISO 8601, +09:00 입니다"}},"required":["pipe_id","sheet_no","rev","line_service","tube_od","cut_length_mm","bend_angles","issued_at"]} 같은 도면의 배관은 리비전과 issued_at 을 함께 쓰고, cut_length_mm 는 400~2,000mm, bend_angles 는 90·45·30 같은 각도로 1~4개 두세요. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 새 리비전에서 굽힘 하나의 각도만 바뀐 배관, (2) 새 리비전에서 굽힘 개수가 줄어든 배관, (3) 리비전이 올라가도 수치가 그대로인 배관. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도(bend_angles 가 배열이 아닌 문자열)는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"pipe_id":{"type":"string"},"sheet_no":{"type":"string","description":"배관이 그려진 장비 hook-up 도면 번호입니다"},"rev":{"type":"string","description":"도면 리비전입니다. 같은 도면의 배관은 리비전을 함께 올립니다"},"line_service":{"type":"string","enum":["UPW","N2","CDA"],"description":"배관이 나르는 유체입니다(UPW 초순수, N2 질소, CDA 압축 건조 공기)"},"tube_od":{"type":"string","enum":["1/4\"","3/8\"","1/2\""],"description":"SUS 튜브 바깥지름입니다"},"cut_length_mm":{"type":"number","minimum":1,"description":"그 리비전의 절단 길이(mm)입니다"},"bend_angles":{"type":"array","items":{"type":"number"},"description":"그 리비전의 굽힘 각도(도)를 굽힘 순서대로 담은 배열입니다"},"issued_at":{"type":"string","description":"그 리비전을 낸 시각입니다. ISO 8601, +09:00 입니다"}},"required":["pipe_id","sheet_no","rev","line_service","tube_od","cut_length_mm","bend_angles","issued_at"]}공무가 관리하는 현장 반입 계획입니다. 평택·안성 현장별 반입 예정일과 배관을 잇는 장비가 있고, 오늘(2026-10-13)부터 7일 안팎의 날짜를 섞었습니다.
| pipe_id | site | equipment | delivery_date |
|---|---|---|---|
| HP-2231 | 평택 | ETCH-07 | 2026-10-15 |
| HP-2232 | 평택 | ETCH-07 | 2026-10-15 |
| HP-2240 | 평택 | CVD-03 | 2026-10-14 |
| HP-2241 | 평택 | CVD-03 | 2026-10-14 |
| HP-2256 | 안성 | PHO-11 | 2026-10-16 |
아래 JSON Schema 를 그대로 만족하는 반입 계획을 20건 더 만들어 주세요. {"type":"object","properties":{"pipe_id":{"type":"string"},"site":{"type":"string","enum":["평택","안성"]},"equipment":{"type":"string","description":"배관을 잇는 생산장비 번호입니다"},"delivery_date":{"type":"string","description":"현장 반입 예정일(YYYY-MM-DD)입니다"}},"required":["pipe_id","site","equipment","delivery_date"]} pipe_id 는 3D Pipe Editor 수치표의 번호를 쓰고, 같은 도면의 배관은 같은 장비·같은 반입일로 두세요. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 반입일이 오늘인 배관, (2) 반입일이 오늘부터 정확히 7일째와 8일째인 배관, (3) 작업일지에 기록이 없는 배관. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도(delivery_date 가 '10/15' 같은 표기)는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"pipe_id":{"type":"string"},"site":{"type":"string","enum":["평택","안성"]},"equipment":{"type":"string","description":"배관을 잇는 생산장비 번호입니다"},"delivery_date":{"type":"string","description":"현장 반입 예정일(YYYY-MM-DD)입니다"}},"required":["pipe_id","site","equipment","delivery_date"]}| Python | pandas 로 작업일지 엑셀을 읽고 병합 칸 채우기, 번호·Rev 표기 맞추기, 벤딩 규칙 파서, 판정 계산을 씁니다. |
| FastAPI (백엔드 API) | 세 파일을 받아 배관 번호로 잇고 판정을 돌려주는 API 를 만듭니다. |
| PostgreSQL (DB) | 작업 기록, 리비전별 설계 수치, 반입 계획과 판정 결과를 담습니다. 설계 수치는 배관 번호와 rev 를 키로 잡습니다. |
| React | 판정별 표, 굽힘 순서별 비교, 현장·반입일 필터, 반입 보류 목록 내려받기를 만듭니다. |
| LLM API (Claude Haiku) | 규칙 파서가 읽지 못한 벤딩 표기만 각도 배열로 읽습니다. 2주차에 같은 실패 모음으로 Sonnet 과 비교합니다. |
| Claude Code · 루프 엔지니어링 | 벤딩 표기 40종 테스트를 목표로 걸고 Claude Code 가 파서 수정과 테스트 실행을 되풀이하게 해 1주차 파서를 만듭니다. |
| 데이터 수집 도구 | 3주차에 손으로 쓴 작업일지 사진을 작업일지 엑셀과 같은 열로 읽어 올리는 업로드를 더합니다. |
✗ fail → HP-2262 가 굽힘 개수 차이로 걸리면 반복 표시 읽기부터 고칩니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 손으로 대조한 정답 80본으로 어느 단계가 틀리는지 세는 단계로 갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 손으로 쓴 작업일지 사진을 같은 열로 읽어 올리는 단계로 넓힙니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · pipe_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
최신 수치로 제작됨최신 수치옛 리비전 수치로 제작됨옛 리비전벤딩 각도가 설계와 다름벤딩 각도 차이절단 길이가 설계와 다름절단 길이 차이설계에 없는 배관 번호설계에 없는 번호반입 예정인데 제작 기록 없음제작 기록 없음배관 하나에 벤딩 수치 대조 판정 하나와 그 근거(채운 Rev, 최신 리비전, 굽힘 순서별 각도, 절단 길이 차이, 반입까지 남은 날)를 남기는 형식입니다.
{"type":"object","properties":{"pipe_id":{"type":"string","description":"설계 표기로 맞춘 배관 번호입니다. 설계에 없는 번호는 하이픈 자리만 맞춘 작업 기록 번호입니다"},"pipe_id_as_written":{"type":["string","null"],"description":"작업일지에 적힌 번호 그대로입니다. 작업 기록이 없으면 null 입니다"},"excel_row":{"type":["integer","null"],"description":"판정에 쓴 작업 기록의 엑셀 행 번호입니다"},"sheet_no":{"type":["string","null"]},"site":{"type":["string","null"]},"delivery_date":{"type":["string","null"]},"days_to_delivery":{"type":["integer","null"],"description":"정적 계산값입니다. delivery_date 에서 오늘(샘플은 2026-10-13)을 뺀 날수입니다"},"verdict":{"type":"string","enum":["최신 수치로 제작됨","옛 리비전 수치로 제작됨","벤딩 각도가 설계와 다름","절단 길이가 설계와 다름","설계에 없는 배관 번호","반입 예정인데 제작 기록 없음"],"description":"걸린 판정이 여럿이면 설계에 없는 배관 번호, 옛 리비전 수치로 제작됨, 벤딩 각도가 설계와 다름, 절단 길이가 설계와 다름 순으로 앞선 하나입니다. 반입 예정인데 제작 기록 없음은 작업 기록이 없는 배관에만 붙습니다. 하나도 걸리지 않으면 최신 수치로 제작됨입니다"},"also_found":{"type":"array","items":{"type":"string","enum":["벤딩 각도가 설계와 다름","절단 길이가 설계와 다름"]}},"shop_rev_as_written":{"type":["string","null"],"description":"작업일지 Rev 칸 그대로입니다. 병합돼 빈 칸이면 null 입니다"},"shop_rev":{"type":["string","null"],"description":"빈 칸을 채우고 'Rev.'·'REV-' 머리와 공백을 걷어 대문자로 맞춘 리비전입니다"},"rev_filled_from_row":{"type":["integer","null"],"description":"빈 Rev 칸을 채운 위 행의 엑셀 행 번호입니다"},"latest_rev":{"type":["string","null"],"description":"같은 pipe_id 의 pipe_editor_sheets 가운데 issued_at 이 가장 늦은 rev 입니다"},"latest_issued_at":{"type":["string","null"]},"shop_cut_length_mm":{"type":["number","null"]},"sheet_cut_length_mm":{"type":["number","null"],"description":"최신 리비전의 절단 길이입니다"},"cut_length_diff_mm":{"type":["number","null"],"description":"shop_cut_length_mm − sheet_cut_length_mm 입니다. 리비전이 같을 때만 채우고, 다르면 null 입니다"},"shop_bends":{"type":["array","null"],"items":{"type":"number"},"description":"작업일지 bend_angles 원문을 굽힘 순서대로 읽은 각도입니다"},"sheet_bends":{"type":["array","null"],"items":{"type":"number"},"description":"최신 리비전의 굽힘 각도입니다"},"bend_mismatches":{"type":"array","items":{"type":"object","properties":{"order":{"type":"integer","minimum":1},"shop":{"type":"number"},"sheet":{"type":"number"}},"required":["order","shop","sheet"]},"description":"리비전이 같을 때 굽힘 순서별 차이가 허용 오차(1도)를 넘은 자리입니다"},"bend_read_by":{"type":["string","null"],"enum":["규칙","모델",null],"description":"bend_angles 원문을 읽은 쪽입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["shop_logs","pipe_editor_sheets","delivery_plan"]},"row":{"type":["string","null"],"description":"그 표의 키입니다. shop_logs 는 excel_row, pipe_editor_sheets 는 pipe_id/rev, delivery_plan 은 pipe_id 입니다. agg 항목이면 null 입니다"},"field":{"type":"string"},"value":{"type":["string","integer","number","null","array"]},"quote":{"type":"string","description":"작업일지 원문에서 그대로 딴 글자입니다"},"agg":{"type":"string","enum":["count","sum","avg","min","max"]}},"required":["table","row","field"]}},"notes":{"type":"array","items":{"type":"string"},"description":"판정에 들지 않았지만 SHOP·공무 담당자가 볼 사실입니다"},"summary":{"type":"string"}},"required":["pipe_id","pipe_id_as_written","excel_row","sheet_no","site","delivery_date","days_to_delivery","verdict","also_found","shop_rev_as_written","shop_rev","rev_filled_from_row","latest_rev","latest_issued_at","shop_cut_length_mm","sheet_cut_length_mm","cut_length_diff_mm","shop_bends","sheet_bends","bend_mismatches","bend_read_by","evidence","notes","summary"]}[
{
"pipe_id": "HP-2231",
"pipe_id_as_written": "HP-2231",
"excel_row": 4,
"sheet_no": "UPW-ETCH07",
"site": "평택",
"delivery_date": "2026-10-15",
"days_to_delivery": 2,
"verdict": "옛 리비전 수치로 제작됨",
"also_found": [],
"shop_rev_as_written": "Rev.B",
"shop_rev": "B",
"rev_filled_from_row": null,
"latest_rev": "D",
"latest_issued_at": "2026-10-10T16:40:00+09:00",
"shop_cut_length_mm": 1180,
"sheet_cut_length_mm": 1210,
"cut_length_diff_mm": null,
"shop_bends": [
90,
90,
45
],
"sheet_bends": [
90,
90,
30
],
"bend_mismatches": [],
"bend_read_by": "규칙",
"evidence": [
{
"table": "shop_logs",
"row": "4",
"field": "pipe_id",
"value": "HP-2231"
},
{
"table": "shop_logs",
"row": "4",
"field": "sheet_rev",
"value": "Rev.B"
},
{
"table": "shop_logs",
"row": "4",
"field": "made_at",
"value": "2026-10-07"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2231/D",
"field": "rev",
"value": "D"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2231/D",
"field": "issued_at",
"value": "2026-10-10T16:40:00+09:00"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2231/C",
"field": "issued_at",
"value": "2026-10-02T09:40:00+09:00"
},
{
"table": "shop_logs",
"row": "4",
"field": "cut_length_mm",
"value": 1180
},
{
"table": "pipe_editor_sheets",
"row": "HP-2231/D",
"field": "cut_length_mm",
"value": 1210
},
{
"table": "shop_logs",
"row": "4",
"field": "bend_angles",
"value": "90-90-45"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2231/D",
"field": "bend_angles",
"value": [
90,
90,
30
]
},
{
"table": "delivery_plan",
"row": "HP-2231",
"field": "delivery_date",
"value": "2026-10-15"
}
],
"notes": [
"Rev.D 의 이 배관은 절단 1,210mm · 벤딩 90-90-30 이고, 작업 기록은 1,180mm · 90-90-45 입니다.",
"작업일 10월 7일에는 이미 Rev.C(10월 2일 발행)가 나와 있었습니다."
],
"summary": "SHOP 작업 기록은 Rev.B 로 만들었는데 3D Pipe Editor 최신은 10월 10일 발행한 Rev.D 입니다."
},
{
"pipe_id": "HP-2232",
"pipe_id_as_written": "HP-2232",
"excel_row": 5,
"sheet_no": "UPW-ETCH07",
"site": "평택",
"delivery_date": "2026-10-15",
"days_to_delivery": 2,
"verdict": "옛 리비전 수치로 제작됨",
"also_found": [],
"shop_rev_as_written": null,
"shop_rev": "B",
"rev_filled_from_row": 4,
"latest_rev": "D",
"latest_issued_at": "2026-10-10T16:40:00+09:00",
"shop_cut_length_mm": 860,
"sheet_cut_length_mm": 860,
"cut_length_diff_mm": null,
"shop_bends": [
90,
90
],
"sheet_bends": [
90,
90
],
"bend_mismatches": [],
"bend_read_by": "규칙",
"evidence": [
{
"table": "shop_logs",
"row": "5",
"field": "pipe_id",
"value": "HP-2232"
},
{
"table": "shop_logs",
"row": "5",
"field": "sheet_rev",
"value": null
},
{
"table": "shop_logs",
"row": "5",
"field": "work_order_no",
"value": "W-1007-01"
},
{
"table": "shop_logs",
"row": "4",
"field": "work_order_no",
"value": "W-1007-01"
},
{
"table": "shop_logs",
"row": "4",
"field": "sheet_rev",
"value": "Rev.B"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2232/D",
"field": "rev",
"value": "D"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2232/D",
"field": "issued_at",
"value": "2026-10-10T16:40:00+09:00"
},
{
"table": "shop_logs",
"row": "5",
"field": "cut_length_mm",
"value": 860
},
{
"table": "pipe_editor_sheets",
"row": "HP-2232/D",
"field": "cut_length_mm",
"value": 860
},
{
"table": "shop_logs",
"row": "5",
"field": "bend_angles",
"value": "90-90"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2232/B",
"field": "bend_angles",
"value": [
90,
90
]
},
{
"table": "pipe_editor_sheets",
"row": "HP-2232/D",
"field": "bend_angles",
"value": [
90,
90
]
}
],
"notes": [
"Rev 칸이 병합 셀이라 빈 칸으로 읽혀 같은 작업지시 W-1007-01 의 엑셀 4행 값 Rev.B 를 썼습니다.",
"Rev.B 와 Rev.D 에서 이 배관의 절단 길이 860mm 와 벤딩 90-90 은 같습니다. 반입할지는 공무 담당자가 정합니다."
],
"summary": "병합 칸에서 채운 작업 기록 리비전은 Rev.B 이고 최신은 Rev.D 입니다. 이 배관의 수치는 두 리비전에서 같습니다."
},
{
"pipe_id": "HP-2240",
"pipe_id_as_written": "hp 2240",
"excel_row": 7,
"sheet_no": "N2-CVD03",
"site": "평택",
"delivery_date": "2026-10-14",
"days_to_delivery": 1,
"verdict": "벤딩 각도가 설계와 다름",
"also_found": [
"절단 길이가 설계와 다름"
],
"shop_rev_as_written": "C",
"shop_rev": "C",
"rev_filled_from_row": null,
"latest_rev": "C",
"latest_issued_at": "2026-10-01T10:15:00+09:00",
"shop_cut_length_mm": 1534,
"sheet_cut_length_mm": 1530,
"cut_length_diff_mm": 4,
"shop_bends": [
90,
90,
87
],
"sheet_bends": [
90,
90,
90
],
"bend_mismatches": [
{
"order": 3,
"shop": 87,
"sheet": 90
}
],
"bend_read_by": "규칙",
"evidence": [
{
"table": "shop_logs",
"row": "7",
"field": "pipe_id",
"value": "hp 2240"
},
{
"table": "shop_logs",
"row": "7",
"field": "sheet_rev",
"value": "C"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2240/C",
"field": "rev",
"value": "C"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2240/C",
"field": "issued_at",
"value": "2026-10-01T10:15:00+09:00"
},
{
"table": "shop_logs",
"row": "7",
"field": "bend_angles",
"value": "90/90/87"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2240/C",
"field": "bend_angles",
"value": [
90,
90,
90
]
},
{
"table": "shop_logs",
"row": "7",
"field": "cut_length_mm",
"value": 1534
},
{
"table": "pipe_editor_sheets",
"row": "HP-2240/C",
"field": "cut_length_mm",
"value": 1530
}
],
"notes": [
"작업 기록 번호 'hp 2240' 을 HP-2240 으로 맞췄습니다.",
"벤딩과 절단 길이가 함께 걸려 우선순위가 앞선 벤딩 각도를 판정으로 두고 절단 길이는 also_found 에 둡니다."
],
"summary": "3번째 굽힘이 87° 로 설계 90° 와 3° 달라 허용 1° 를 넘고, 절단 길이도 1,534mm 로 설계 1,530mm 보다 4mm 길어 허용 2mm 를 넘습니다."
},
{
"pipe_id": "HP-2256",
"pipe_id_as_written": "HP-2256",
"excel_row": 9,
"sheet_no": "CDA-PHO11",
"site": "안성",
"delivery_date": "2026-10-16",
"days_to_delivery": 3,
"verdict": "절단 길이가 설계와 다름",
"also_found": [],
"shop_rev_as_written": "rev b",
"shop_rev": "B",
"rev_filled_from_row": null,
"latest_rev": "B",
"latest_issued_at": "2026-09-28T09:30:00+09:00",
"shop_cut_length_mm": 1248,
"sheet_cut_length_mm": 1242,
"cut_length_diff_mm": 6,
"shop_bends": [
90,
45
],
"sheet_bends": [
90,
45
],
"bend_mismatches": [],
"bend_read_by": "규칙",
"evidence": [
{
"table": "shop_logs",
"row": "9",
"field": "pipe_id",
"value": "HP-2256"
},
{
"table": "shop_logs",
"row": "9",
"field": "sheet_rev",
"value": "rev b"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2256/B",
"field": "rev",
"value": "B"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2256/B",
"field": "issued_at",
"value": "2026-09-28T09:30:00+09:00"
},
{
"table": "shop_logs",
"row": "9",
"field": "cut_length_mm",
"value": 1248
},
{
"table": "pipe_editor_sheets",
"row": "HP-2256/B",
"field": "cut_length_mm",
"value": 1242
},
{
"table": "shop_logs",
"row": "9",
"field": "bend_angles",
"value": "90 / 45"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2256/B",
"field": "bend_angles",
"value": [
90,
45
]
}
],
"notes": [
"작업 기록의 'rev b' 를 Rev.B 로 맞췄습니다."
],
"summary": "절단 길이 1,248mm 가 설계 1,242mm 보다 6mm 길어 허용 오차 2mm 를 넘습니다."
},
{
"pipe_id": "HP-2320",
"pipe_id_as_written": "HP-2320",
"excel_row": 12,
"sheet_no": "UPW-WET09",
"site": null,
"delivery_date": null,
"days_to_delivery": null,
"verdict": "설계에 없는 배관 번호",
"also_found": [],
"shop_rev_as_written": null,
"shop_rev": "A",
"rev_filled_from_row": 11,
"latest_rev": null,
"latest_issued_at": null,
"shop_cut_length_mm": 1105,
"sheet_cut_length_mm": null,
"cut_length_diff_mm": null,
"shop_bends": [
90,
90
],
"sheet_bends": null,
"bend_mismatches": [],
"bend_read_by": "규칙",
"evidence": [
{
"table": "shop_logs",
"row": "12",
"field": "pipe_id",
"value": "HP-2320"
},
{
"table": "pipe_editor_sheets",
"row": null,
"field": "pipe_id",
"agg": "count",
"value": 0
},
{
"table": "shop_logs",
"row": "12",
"field": "sheet_no",
"value": null
},
{
"table": "shop_logs",
"row": "11",
"field": "sheet_no",
"value": "UPW-WET09"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2302/A",
"field": "sheet_no",
"value": "UPW-WET09"
},
{
"table": "shop_logs",
"row": "12",
"field": "cut_length_mm",
"value": 1105
},
{
"table": "pipe_editor_sheets",
"row": "HP-2302/A",
"field": "cut_length_mm",
"value": 1105
},
{
"table": "shop_logs",
"row": "12",
"field": "bend_angles",
"value": "90-90"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2302/A",
"field": "bend_angles",
"value": [
90,
90
]
}
],
"notes": [
"같은 도면 UPW-WET09 의 HP-2302 가 Rev.A 에서 절단 1,105mm · 벤딩 90-90 으로 이 기록과 같습니다. HP-2302 를 HP-2320 으로 적었을 수 있어 SHOP 에서 배관 태그를 확인합니다."
],
"summary": "작업 기록 번호 HP-2320 은 하이픈·공백·대소문자를 맞춰도 3D Pipe Editor 수치표에 없는 번호입니다."
},
{
"pipe_id": "HP-2302",
"pipe_id_as_written": null,
"excel_row": null,
"sheet_no": "UPW-WET09",
"site": "평택",
"delivery_date": "2026-10-15",
"days_to_delivery": 2,
"verdict": "반입 예정인데 제작 기록 없음",
"also_found": [],
"shop_rev_as_written": null,
"shop_rev": null,
"rev_filled_from_row": null,
"latest_rev": "A",
"latest_issued_at": "2026-10-08T14:00:00+09:00",
"shop_cut_length_mm": null,
"sheet_cut_length_mm": 1105,
"cut_length_diff_mm": null,
"shop_bends": null,
"sheet_bends": [
90,
90
],
"bend_mismatches": [],
"bend_read_by": null,
"evidence": [
{
"table": "delivery_plan",
"row": "HP-2302",
"field": "delivery_date",
"value": "2026-10-15"
},
{
"table": "delivery_plan",
"row": "HP-2302",
"field": "site",
"value": "평택"
},
{
"table": "shop_logs",
"row": null,
"field": "pipe_id",
"agg": "count",
"value": 0
},
{
"table": "pipe_editor_sheets",
"row": "HP-2302/A",
"field": "rev",
"value": "A"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2302/A",
"field": "cut_length_mm",
"value": 1105
}
],
"notes": [
"같은 도면의 작업 기록 HP-2320(엑셀 12행)이 이 배관의 Rev.A 수치와 같습니다."
],
"summary": "10월 15일 평택 반입 예정인데 SHOP 작업 기록에 HP-2302 가 없습니다."
},
{
"pipe_id": "HP-2262",
"pipe_id_as_written": "HP2262",
"excel_row": 6,
"sheet_no": "UPW-CMP02",
"site": "평택",
"delivery_date": "2026-10-17",
"days_to_delivery": 4,
"verdict": "최신 수치로 제작됨",
"also_found": [],
"shop_rev_as_written": "REV-B",
"shop_rev": "B",
"rev_filled_from_row": null,
"latest_rev": "B",
"latest_issued_at": "2026-10-06T11:20:00+09:00",
"shop_cut_length_mm": 1387,
"sheet_cut_length_mm": 1385,
"cut_length_diff_mm": 2,
"shop_bends": [
90,
90,
90
],
"sheet_bends": [
90,
90,
90
],
"bend_mismatches": [],
"bend_read_by": "모델",
"evidence": [
{
"table": "shop_logs",
"row": "6",
"field": "pipe_id",
"value": "HP2262"
},
{
"table": "shop_logs",
"row": "6",
"field": "sheet_rev",
"value": "REV-B"
},
{
"table": "shop_logs",
"row": "6",
"field": "made_at",
"value": "2026-10-08"
},
{
"table": "shop_logs",
"row": "3",
"field": "made_at",
"value": "2026-10-01"
},
{
"table": "shop_logs",
"row": "3",
"field": "sheet_rev",
"value": "A"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2262/B",
"field": "rev",
"value": "B"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2262/B",
"field": "issued_at",
"value": "2026-10-06T11:20:00+09:00"
},
{
"table": "shop_logs",
"row": "6",
"field": "bend_angles",
"quote": "90도 세 번"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2262/B",
"field": "bend_angles",
"value": [
90,
90,
90
]
},
{
"table": "shop_logs",
"row": "6",
"field": "cut_length_mm",
"value": 1387
},
{
"table": "pipe_editor_sheets",
"row": "HP-2262/B",
"field": "cut_length_mm",
"value": 1385
}
],
"notes": [
"엑셀 3행의 10월 1일 Rev.A 기록은 10월 8일에 다시 만든 6행 기록으로 대체했습니다.",
"절단 길이 차이 2mm 는 허용 오차와 같아 판정식의 '넘으면' 에 들지 않습니다.",
"'90도 세 번' 은 규칙 파서가 읽지 못해 Claude Haiku 가 90° 세 개로 읽었고, 원문의 90 과 '세 번' 으로 다시 확인했습니다."
],
"summary": "다시 만든 기록이 최신 Rev.B 이고, 세 굽힘 각도가 설계와 같으며 절단 길이 차이 2mm 는 허용 오차 안입니다."
},
{
"pipe_id": "HP-2275",
"pipe_id_as_written": "HP-2275",
"excel_row": 10,
"sheet_no": "N2-DIF05",
"site": "안성",
"delivery_date": "2026-10-20",
"days_to_delivery": 7,
"verdict": "최신 수치로 제작됨",
"also_found": [],
"shop_rev_as_written": "A",
"shop_rev": "A",
"rev_filled_from_row": null,
"latest_rev": "A",
"latest_issued_at": "2026-09-25T15:10:00+09:00",
"shop_cut_length_mm": 980,
"sheet_cut_length_mm": 980,
"cut_length_diff_mm": 0,
"shop_bends": [
90,
45,
46
],
"sheet_bends": [
90,
45,
45
],
"bend_mismatches": [],
"bend_read_by": "규칙",
"evidence": [
{
"table": "shop_logs",
"row": "10",
"field": "pipe_id",
"value": "HP-2275"
},
{
"table": "shop_logs",
"row": "10",
"field": "sheet_rev",
"value": "A"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2275/A",
"field": "rev",
"value": "A"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2275/A",
"field": "issued_at",
"value": "2026-09-25T15:10:00+09:00"
},
{
"table": "shop_logs",
"row": "10",
"field": "bend_angles",
"value": "90-45-46"
},
{
"table": "pipe_editor_sheets",
"row": "HP-2275/A",
"field": "bend_angles",
"value": [
90,
45,
45
]
},
{
"table": "shop_logs",
"row": "10",
"field": "cut_length_mm",
"value": 980
},
{
"table": "pipe_editor_sheets",
"row": "HP-2275/A",
"field": "cut_length_mm",
"value": 980
},
{
"table": "delivery_plan",
"row": "HP-2275",
"field": "delivery_date",
"value": "2026-10-20"
}
],
"notes": [
"3번째 굽힘 46° 는 설계 45° 와 1° 차이라 허용 오차와 같아 판정식의 '넘으면' 에 들지 않습니다.",
"반입일 10월 20일은 오늘부터 7일째라 반입 7일 창 안입니다."
],
"summary": "최신 Rev.A 로 만들었고 각도·절단 길이 차이가 허용 오차 안입니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 최신 수치로 제작됨·옛 리비전 수치로 제작됨·벤딩 각도가 설계와 다름·절단 길이가 설계와 다름·설계에 없는 배관 번호·반입 예정인데 제작 기록 없음 여섯 값 중 하나인지, also_found 가 벤딩 각도가 설계와 다름·절단 길이가 설계와 다름 두 값 중 하나인지 확인합니다. 2. 필수 필드 pipe_id·pipe_id_as_written·excel_row·sheet_no·site·delivery_date·days_to_delivery·verdict·also_found·shop_rev_as_written·shop_rev·rev_filled_from_row·latest_rev·latest_issued_at·shop_cut_length_mm·sheet_cut_length_mm·cut_length_diff_mm·shop_bends·sheet_bends·bend_mismatches·bend_read_by·evidence·notes·summary 가 모두 존재하는지 확인합니다. 3. sheet_rev 가 빈 칸이면 같은 work_order_no 안에서 excel_row 가 바로 위인 행의 값을 쓰고, rev_filled_from_row 가 그 행 번호인지 다시 계산합니다. sheet_no·made_at 의 빈 칸도 같은 방법으로 채웁니다. HP-2232 는 4행의 Rev.B 를 받고, Rev 칸이 차 있는 HP-2231 은 채우지 않습니다. 4. 옛 리비전 수치로 제작됨: pipe_id 를 하이픈·공백·대소문자를 걷어 맞추고 sheet_rev 를 'Rev.'·'REV-' 머리와 공백을 걷어 대문자로 맞춘 뒤, 같은 pipe_id 의 pipe_editor_sheets 가운데 issued_at 이 가장 늦은 rev 가 latest_rev 인지 다시 계산합니다. shop_rev 가 latest_rev 와 다르면 걸립니다. HP-2231 은 B 와 D 로 걸리고, 'rev b' 로 적은 HP-2256 은 최신 B 와 같아 걸리지 않습니다. 5. 같은 pipe_id 의 작업 기록이 여럿이면 made_at 이 가장 늦은 기록으로 다시 계산합니다. HP-2262 는 10월 1일 Rev.A 기록(3행) 대신 10월 8일 REV-B 기록(6행)을 씁니다. 6. 벤딩 각도가 설계와 다름: 리비전이 같을 때 shop_bends 와 sheet_bends 를 굽힘 순서대로 짝지어 차이를 다시 계산하고, 한 곳이라도 1도를 넘거나 굽힘 개수가 다르면 걸립니다. HP-2240 은 3번째 87° 와 90° 가 3도 달라 걸리고, HP-2275 는 46° 와 45° 가 1도 차이라 걸리지 않습니다. 7. bend_angles 원문에 숫자와 구분자(- / , ° 공백)만 있으면 bend_read_by 는 규칙이고, 그 밖의 글자가 있으면 모델입니다. 모델이 읽은 각도는 값마다 원문에 숫자로 있고, 반복 개수가 원문의 반복 표시(×3·x3·세 번·3회)와 같은지 확인합니다. HP-2262 의 '90도 세 번' 이 모델로 읽은 경우이고, '90-45-46' 으로 적은 HP-2275 는 규칙으로 읽습니다. 8. 절단 길이가 설계와 다름: cut_length_diff_mm 가 shop_cut_length_mm − sheet_cut_length_mm 인지 다시 계산하고, 리비전이 같을 때 그 절댓값이 2 를 넘으면 걸립니다. HP-2256 은 1,248 − 1,242 = 6 으로 걸리고, HP-2262 는 1,387 − 1,385 = 2 라 걸리지 않습니다. 9. 설계에 없는 배관 번호: 하이픈·공백·대소문자를 걷어 맞춘 pipe_id 가 pipe_editor_sheets 의 어느 pipe_id 와도 같지 않으면 걸리는지 다시 계산합니다. HP-2320 이 이 경우입니다. 같은 sheet_no 에 cut_length_mm·bend_angles 가 같은 설계 배관이 있으면 notes 에 그 번호를 후보로 남깁니다. 10. 반입 예정인데 제작 기록 없음: days_to_delivery 가 delivery_date − 2026-10-13 인지 다시 계산하고, 0 이상 7 이하인 pipe_id 가운데 shop_logs 에 같은 번호가 없으면 걸립니다. HP-2302(2일)는 걸리고, 작업 기록이 없는 HP-2308(8일)은 창 밖이라 판정하지 않습니다. 11. 한 배관에 여러 판정이 걸리면 설계에 없는 배관 번호, 옛 리비전 수치로 제작됨, 벤딩 각도가 설계와 다름, 절단 길이가 설계와 다름 순으로 앞선 하나가 verdict 이고 나머지는 also_found 입니다. 벤딩과 절단 길이가 함께 걸린 HP-2240 으로 이 순서를 다시 계산합니다. 12. evidence 의 table·field 가 shop_logs·pipe_editor_sheets·delivery_plan 에 실재하는 컬럼인지 대조합니다. 13. evidence 의 quote 가 그 row 의 원문 substring 인지, agg 가 없는 value 가 그 row 의 그 컬럼 값과 같은지, agg 가 count 인 value 가 맞춘 번호로 센 행 수인지 확인합니다. 14. summary 가 존댓말로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. 작업 기록 리비전은 옛것이지만 이 배관의 수치가 최신 리비전과 같은 경우(HP-2232)는 반입할지 공무 담당자가 정합니다. 2. 설계에 없는 번호와 제작 기록 없는 번호의 짝 후보(HP-2320 과 HP-2302)는 SHOP 담당자가 배관 태그를 보고 확인합니다. 3. 허용 오차 1도·2mm 가 튜브 바깥지름과 유체마다 맞는지는 설계팀·품질팀이 정합니다. 4. 걸린 배관을 다시 만들지 현장에서 고칠지는 SHOP 과 공무가 정합니다. [평가 러너 · 2주차] 1. 작성자가 손으로 대조한 배관 80본에서 verdict 가 정답과 같은 본수를 셉니다. 2. 벤딩 표기 읽기 실패 모음을 Claude Haiku 와 Sonnet 에 같은 입력으로 돌려, 각도 배열이 손으로 단 정답과 같은 개수를 모델별로 셉니다. [판정식에 더한 정의 · 오너 확인 항목] 1. 카드 inputs 에 없던 shop_logs.work_order_no·excel_row·sheet_no 와 pipe_editor_sheets.sheet_no 를 더했습니다. 병합 칸 채우기와 번호 짝 후보 메모에 씁니다. 2. 병합돼 빈 칸으로 읽힌 sheet_no·sheet_rev·made_at 은 같은 작업지시 번호 안의 바로 위 행 값으로 채웁니다. 채울 값이 없으면 판정에서 빼고 표 위 알림에 엑셀 행 번호를 남깁니다. 3. 다시 만든 배관은 made_at 이 가장 늦은 기록 하나로 판정합니다. 4. '오늘부터 7일 이내' 는 반입일까지 0~7일(양 끝 포함)이고, 오늘은 화면을 연 날(샘플은 2026-10-13)입니다. 5. 리비전이 다르면 각도·길이는 견주지 않고, sheet_cut_length_mm·sheet_bends 에는 최신 리비전 값을 보여줍니다. 6. 판정 우선순위는 설계에 없는 번호, 옛 리비전, 벤딩 각도, 절단 길이 순입니다. 7. 벤딩 표기는 규칙 파서가 먼저 읽고, 숫자·구분자 밖의 글자가 있는 표기만 Claude Haiku 가 읽습니다. 모델에는 설계 수치를 주지 않습니다.