fix(master_data): 표에 없는 조합·지역으로 멈추던 시험 계산 풀기 · 전기용접봉 줄 원문대로

- 시험입력 10개 — 오거비트 혼합층처럼 원문 표에 없는 조합을 피하고(연장 0) 자재지역을 값 있는 시·군으로
- GC000945 전기용접봉 「595㎾h」 → 원문 소모자재 표대로 22.5㎏(595㎾h 는 같은 표의 전력 줄 · 별도 계상)
- GC000002 콘테이너형 가설건축물 단위 「개」 → 자재품목 줄 단위 「동」
- ref/_관리자값_미확보.md 새로 — 관리자가 채울 재료 45 종 · 막힌 로직 56 개 · 남은 다른 까닭 세 줄
- 일괄 시험 계산 통과 1,272 → 1,279 · 멈춤 82 → 75(맞는 줄 0개 5 → 0) · 단위 경고 37 → 14
- 레미콘 규격 14건은 원문이 강도·슬럼프를 안 밝혀 그대로 둠

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-20 23:26:08 +09:00
co-authored by Claude Opus 5
parent f9dfc03114
commit a55d396690
7 changed files with 84 additions and 7 deletions
@@ -0,0 +1,59 @@
# 관리자가 채울 재료 값 (읽기 전용 · 자동 생성)
일괄 시험 계산(`check_master 계산전부`)이 「값 없음 — 관리자가 채울 값」 으로 멈춘 자리 — 재료 45 종 · 로직 56 개.
값을 어디서 가져올지(자재품목 줄 잇기 · 시중물가)는 관리자 몫 — 여기서는 이름만 모음.
| 키 | 이름 | 막힌 로직 수 | 로직 키 |
|---|---|---|---|
| MP000253 | 코크스 | 3 | GC000931 · GC000935 · GC000936 |
| MP000290 | Nozzle | 3 | GC000933 · GC000934 · GC000938 |
| MP000293 | 세유 | 3 | GC000939 · GC000986 · GC000993 |
| MP000048 | JOINT FILLER | 2 | GF000197 · GF000208 |
| MP000094 | 쉬즈관 | 2 | GC000230 · GC000237 |
| MP000216 | 철구(Shot ball) | 2 | GC000375 · GC000822 |
| MP000299 | 탄소봉 | 2 | GC000941 · GC000942 |
| MP000359 | 중유 | 2 | GC000943 · GC000948 |
| MP000023 | VR관(소켓식) | 1 | GF000173 |
| MP000052 | 스페이셔(몰탈 블록) | 1 | GF000200 |
| MP000055 | 스티로폴 | 1 | GF000202 |
| MP000060 | 콘크리트 표면 강화재(하드너) | 1 | GF000209 |
| MP000065 | 틈메우기돌 | 1 | GF000223 |
| MP000066 | 철망태(사각형 돌망태) | 1 | GF000235 |
| MP000070 | 깃발 | 1 | GF000081 |
| MP000076 | 피복제 | 1 | GC000145 |
| MP000082 | 에폭시 | 1 | GC000337 |
| MP000095 | BASECHANNEL | 1 | GC000001 |
| MP000113 | 축중계(이동식) | 1 | GC000003 |
| MP000129 | 보호막 | 1 | GC000061 |
| MP000134 | 모래주머니 | 1 | GC000181 |
| MP000144 | 보조강재 | 1 | GC000559 |
| MP000150 | 질석 | 1 | GC000573 |
| MP000169 | 정배지 | 1 | GC000618 |
| MP000172 | 알루미늄핀 | 1 | GC000623 |
| MP000176 | 표준보강메시 | 1 | GC000628 |
| MP000177 | 고강도메시 | 1 | GC000629 |
| MP000201 | 실리콘 | 1 | GC000752 |
| MP000202 | IV전선 | 1 | GC000409 |
| MP000209 | 버너 | 1 | GC000360 |
| MP000211 | 테르밋용재 | 1 | GC000361 |
| MP000215 | 용접봉 | 1 | GC000374 |
| MP000218 | 철편(Grit) | 1 | GC000376 |
| MP000235 | 슈 | 1 | GC000433 |
| MP000239 | 베인 전용로드 | 1 | GC000435 |
| MP000241 | 표준사 | 1 | GC000436 |
| MP000242 | 단독콘 | 1 | GC000438 |
| MP000250 | Lagging Sheet | 1 | GC000901 |
| MP000269 | 세유 | 1 | GC000932 |
| MP000294 | 전기용접 | 1 | GC000940 |
| MP000310 | Tar Epoxy | 1 | GC000944 |
| MP000314 | drill | 1 | GC000947 |
| MP000319 | Tar Epoxy | 1 | GC000950 |
| MP000357 | 카트리지 | 1 | GC000646 |
| MP000363 | 아스팔트싱글 | 1 | GC000654 |
## 값 말고 다른 까닭으로 남은 멈춤 (손대지 않음)
- 레미콘 규격 미지정 14 — 원문(산림 12장 · 13장 · 건설 7-3-1)이 강도·슬럼프를 밝히지 않고 「무근 · 철근」 만 적음 · 규격은 설계 확정 거리.
- 단위 환산 필요 4 — 가새 「조」 · 스레트실테이프 「㎝」 두 줄 · 철재 거푸집 「본」. `ref/_단위_환산_원문.md` 에 값 없음(또는 범위값)이라 그대로 둠.
- 모래 「울진」 줄 없음 1(GF000183) — 자재품목에 그 지역 모래 줄이 없음.
@@ -240,7 +240,7 @@
"종류": "재료",
"요소": {"구분": "거푸집·가설재", "상세구분": "가설건축물"},
"이름": "콘테이너형 가설건축물 3.0x3.0m",
"단위": "",
"단위": "",
"수량": "만약(규모 == '3.0x3.0m', 손율 / 100, 0)",
"비목": "재료비"
},
@@ -248,7 +248,7 @@
"종류": "재료",
"요소": {"구분": "거푸집·가설재", "상세구분": "가설건축물"},
"이름": "콘테이너형 가설건축물 3.0x6.0m",
"단위": "",
"단위": "",
"수량": "만약(규모 == '3.0x6.0m', 손율 / 100, 0)",
"비목": "재료비"
},
@@ -256,7 +256,7 @@
"종류": "재료",
"요소": {"구분": "거푸집·가설재", "상세구분": "가설건축물"},
"이름": "콘테이너형 가설건축물 3.0x9.0m",
"단위": "",
"단위": "",
"수량": "만약(규모 == '3.0x9.0m', 손율 / 100, 0)",
"비목": "재료비"
}
@@ -1557,6 +1557,7 @@
"출처": "건설품셈 공통 5-1-9",
"소유": "공용",
"비고": "지층별 굴착연장 입력(없는 층 0) · 한 비트로 전 층 · 해석: 개량형·해머비트는 해머비트 압축기(대수 입력) · 오거(케이싱)는 케이싱 쓸 때 · 굴착기 = 굴착기(무한궤도) · 해머비트 손료 · 펌프차 별도 · 부속장비·소모자재 = 인력편성 노무비 × 요율 · 해석: 소모자재 손료 비목 = 재료비 · 해석: 편성 인력 × 작업소요시간 ÷ 1일 8시간 = 인 · 편성 기계 × 작업소요시간 = 시간(건설품셈 공통 1-1) · 「원문에 없는 조합: 비트=오거비트 · 말뚝직경=500∼600 · 말뚝길이=10m미만 / 비트=오거비트 · 말뚝직경=500∼600 · 말뚝길이=10~20m / 비트=오거비트 · 말뚝직경=500∼600 · 말뚝길이=20m~30m / 비트=개량형비트 · 말뚝직경=500이상 · 말뚝길이=10m미만 / 비트=개량형비트 · 말뚝직경=500이상 · 말뚝길이=10~20m 외 10」",
"시험입력": {"혼합층연장": 0, "연암연장": 0, "경암연장": 0},
"입력": [
{
"이름": "비트",
@@ -3534,6 +3535,7 @@
"출처": "건설품셈 공통 5-3-1",
"소유": "공용",
"비고": "직경 400800 · t_3 원문 글(케이싱 미사용 5 · 사용 8분)을 식에 적음 · t_5 는 천공홀 직접 용접 때만 · 해석: 개량형·해머비트는 해머비트 압축기 · 굴착기 = 굴착기(무한궤도) · 말뚝 재료 · 서비스케이싱 · 해머비트 손료 별도 · 해석: 소모자재 손료 비목 = 재료비 · 해석: 편성 인력 × 작업소요시간 ÷ 1일 8시간 = 인 · 편성 기계 × 작업소요시간 = 시간(건설품셈 공통 1-1) · 「원문에 없는 조합: 비트=오거비트 · 말뚝길이=10m미만 · 직경=400 · 기초=도로/철도 교량기초 / 비트=오거비트 · 말뚝길이=10m미만 · 직경=400 · 기초=건축기초 / 비트=오거비트 · 말뚝길이=10m미만 · 직경=450 · 기초=도로/철도 교량기초 / 비트=오거비트 · 말뚝길이=10m미만 · 직경=450 · 기초=건축기초 / 비트=오거비트 · 말뚝길이=10m미만 · 직경=500 · 기초=도로/철도 교량기초 외 67」",
"시험입력": {"혼합층연장": 0, "연암연장": 0, "경암연장": 0},
"입력": [
{
"이름": "직경",
@@ -4078,6 +4080,7 @@
"출처": "건설품셈 공통 5-3-2",
"소유": "공용",
"비고": "항타가 필요하면 5-3-1 t_3 참고 · 해머비트 손료 별도 · 해석: 개량형·해머비트는 해머비트 압축기 · 해석: 편성 인력 × 작업소요시간 ÷ 1일 8시간 = 인 · 편성 기계 × 작업소요시간 = 시간(건설품셈 공통 1-1) · 해석: 소모자재 손료 비목 = 재료비",
"시험입력": {"혼합층연장": 0, "연암연장": 0, "경암연장": 0},
"입력": [
{
"이름": "비트",
@@ -4713,6 +4716,7 @@
"출처": "건설품셈 공통 5-3-5",
"소유": "공용",
"비고": "T 단위 시간(hr) · 공법 R.C.D 는 올케이싱 굴착 뒤 후속 굴착 · 케이싱·비트 손료 별도 · 극경암은 천공시간 증 · 해석: 크레인 = 크레인(타이어) · 해석: 소모자재 손료 비목 = 재료비 · 해석: 편성 인력 × 작업소요시간 ÷ 1일 8시간 = 인 · 편성 기계 × 작업소요시간 = 시간(건설품셈 공통 1-1)",
"시험입력": {"점질토연장": 0, "사질토연장": 0, "자갈연장": 0, "연암연장": 0, "경암연장": 0},
"입력": [
{
"이름": "공법",
@@ -8468,6 +8468,7 @@
"출처": "건설품셈 기계설비 13-6-3",
"소유": "공용",
"비고": "소모자재는 원문 참고표 Tainter 칸 · 공정별 품의 합(ton당) · 검사 · 교정은 기술관리, 도장을 뺀 품의 10%(원문 줄) — 각 직종에 더함 · 해석: 원문 「〃」 · 「수량」 칸 = 앞 직종(플랜트제관공) · 해석: 목공 = 건축목공 · 「건설기계운전조 · Crane운전조」 = 건설기계운전사 · 「윈치운전조」 = 일반기계운전사(조 = 1인) · 건설노임에 없는 직종(기계기사 · 측량사 · 마킹공 등)은 인력_자체(값은 관리자가 채움) · 막힘: 장비 중 기계 목록에 없는 것 — Lathe 365.76㎝×5.60㎾ · Planer 121.92㎝×243.84㎝ · Boring machine Horizontal Type 2.24㎾ · Gouging machine 중형 · Gas cutting machine Auto형 · Gas cutting machine Mannual · Gas heating touch 중형 · Over head crane 30ton · Over head crane 20ton · Hydro Press 300ton · Bending roller 701.04㎝ · Edge bending roller 701.04㎝ · Shearing machine · Drilling machine 2.24㎾ · Drilling machine Radial 3.73㎾ · Portable drill 0.73㎾ — 그 줄 빠짐",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "전력 계약종별",
@@ -8780,6 +8781,7 @@
"출처": "건설품셈 기계설비 13-6-3",
"소유": "공용",
"비고": "소모자재는 원문 참고표 Roller 칸 · 공정별 품의 합(ton당) · 검사 · 교정은 기술관리, 도장을 뺀 품의 10%(원문 줄) — 각 직종에 더함 · 해석: 원문 「〃」 · 「수량」 칸 = 앞 직종(플랜트제관공) · 해석: 목공 = 건축목공 · 「건설기계운전조 · Crane운전조」 = 건설기계운전사 · 「윈치운전조」 = 일반기계운전사(조 = 1인) · 건설노임에 없는 직종(기계기사 · 측량사 · 마킹공 등)은 인력_자체(값은 관리자가 채움) · 막힘: 장비 중 기계 목록에 없는 것 — Lathe 365.76㎝×5.60㎾ · Planer 121.92㎝×243.84㎝ · Boring machine Horizontal Type 2.24㎾ · Gouging machine 중형 · Gas cutting machine Auto 중형 · Gas cutting machine Mannual · Gas heating touch 중형 · over head crane 30 ton · Hydro Press 100 ton · Bending roller 701.04㎝ · Shearing machine · Drilling machine 2.24㎾ · Drilling machine Radial 3.73㎾ · Portable drill 0.373㎾ — 그 줄 빠짐",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "전력 계약종별",
@@ -9989,6 +9991,7 @@
"출처": "건설품셈 기계설비 13-6-6",
"소유": "공용",
"비고": "공정별 품의 합(ton당) · 검사 · 교정은 기술관리, 도장, 전원배선을 뺀 품의 10%(원문 줄) — 각 직종에 더함 · 해석: 원문 「〃」 · 「수량」 칸 = 앞 직종(플랜트제관공) · 해석: 목공 = 건축목공 · 「건설기계운전조 · Crane운전조」 = 건설기계운전사 · 「윈치운전조」 = 일반기계운전사(조 = 1인) · 건설노임에 없는 직종(기계기사 · 측량사 · 마킹공 등)은 인력_자체(값은 관리자가 채움) · 막힘: 장비 중 기계 목록에 없는 것 — Gas Cutting machine 중형 · Portable Drill 1.12㎾ · Portable Grinder 0.37㎾ · Guy Derrick 10 ton · Truck 5 ton · Angle Griner 0.37 ㎾ — 그 줄 빠짐",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "전력 계약종별",
@@ -12129,10 +12132,11 @@
"종류": "재료",
"요소": {"구분": "잡재료", "상세구분": "용접·가스"},
"이름": "전기용접봉",
"단위": "㎾h",
"수량": "595",
"단위": "",
"수량": "22.5",
"비목": "재료비",
"출처": "건설품셈 기계설비 13-6-13"
"출처": "건설품셈 기계설비 13-6-13",
"비고": "원문 소모자재 표 「용접 전기용접봉 22.5㎏」 · 같은 표의 「전력 595㎾h」 는 별도 계상(전력 계약종별 입력 자리 없음)"
}
],
"덧줄": [],
@@ -1887,6 +1887,7 @@
"출처": "산림품셈 12-11-2 1",
"소유": "공용",
"비고": "흄관 별산(원문 비고)이나 수량이 있어 줄로 얹음 · 기초콘크리트·거푸집 설계수량",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "관경",
@@ -2118,6 +2119,7 @@
"출처": "산림품셈 12-11-3",
"소유": "공용",
"비고": "파형강관 별산(원문 비고)이나 수량이 있어 줄로 얹음 · 6m 직관 10% 감액(주②)은 모래 문장에 붙어 있어 대상 불명 — 미반영",
"시험입력": {"자재지역": "포항"},
"입력": [
{
"이름": "관경",
@@ -592,6 +592,7 @@
"출처": "산림품셈 13-5-1",
"소유": "공용",
"비고": "해석: 채움 콘크리트 = 레디믹스트콘크리트 · 해석: 돌 이름을 채움·고임돌 표 종별로 맞춤(조약돌·호박돌 및 야면석 → 야면석 · 채움은 호박돌) · 줄눈 모르타르는 원문대로 메붙임에도 얹음 · 뒷길이 70 은 찾기 실패 — 원문 표에 70 없음 · 「원문에 없는 조합: 뒷길이=25 · 붙임=메붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=메붙임 · 돌=호박돌 및 야면석 / 뒷길이=25 · 붙임=찰붙임 · 돌=깬돌 / 뒷길이=25 · 붙임=찰붙임 · 돌=조약돌 및 야면석 / 뒷길이=30 · 붙임=메붙임 · 돌=호박돌 및 야면석 외 17」",
"시험입력": {"뒷길이": 30, "붙임": "메붙임", "돌": "깬돌"},
"입력": [
{
"이름": "뒷길이",
+8 -1
View File
@@ -913,7 +913,7 @@ def test_로직_일괄_시험계산():
"""로직 전부를 시험 입력으로 돌림 — 멈춤은 데이터 결손(관리자 값·규격 미지정)만."""
files = cm.load()
passed, stuck = cm.calc_all(files, mf.Master(files))
assert passed >= 1272
assert passed >= 1279
남은_까닭 = (
"관리자가 채울 값",
"규격 선택 필요",
@@ -984,3 +984,10 @@ def test_테스트_대상_로직_입력에_설명(whole):
assert specs, key
빈칸 = [s["이름"] for s in specs if not str(s.get("설명") or "").strip()]
assert 빈칸 == [], (key, 빈칸)
def test_표_조건_조합이_없어_멈추지_않음():
"""표에 없는 조합(오거비트 혼합층 등)으로는 시험 계산을 돌리지 않음 — 「맞는 줄 0개」 0건."""
files = cm.load()
_, stuck = cm.calc_all(files, mf.Master(files))
assert [x for x in stuck if "맞는 줄" in x] == []