{ "_설명": [ "원문 ↔ 기초단가 다섯 갈래 — 지금 알고 있는 어긋남과 시험이 못 보는 자리(2026-09-18 랩탑 메인이 시험으로 처음 뜸).", "시험: resources/tester/test_base_prices_source_match.py — 이 목록 밖에서 어긋나면 빨강 · 목록에 있는데 고쳐졌거나 모습이 바뀌어도 빨강.", "고치면 지울 것: python resources/tester/test_base_prices_source_match.py --prune (지우기만 함).", "labor·machine·material·oil·rate: source=원문에서 읽은 값 · data=자료 값 · 한쪽이 null 이면 한쪽에만 있음.", "`셈 …`: (원문 줄 수, 자료 줄 수) — test_셈이_맞음 이 이 목록과 똑같을 때만 통과.", "`… 자료에 없음`: 원문 줄은 읽었는데 자료에 없는 코드를 네 자리 기종별로 묶음.", "*_blind: 시험이 못 보는 자리 — what=무엇 · why=까닭. `안 잰 칸 …` 은 자료에 있는데 원문과 안 맞대는 칸(새 칸이 생기면 빨강).", "why: 사람이 적은 까닭 — 시험은 맞대기에서 뺌." ], "labor": {}, "machine": { "가격 8201-0100 machine_name": { "source": "3D GNSS 머신 가이던스(굴착기용)", "data": "", "why": "자료 이름이 빔 — 원문 손료표 머리 `(코드) 이름` 엔 이름 있음" }, "손료 8201-0100 machine_name": { "source": "3D GNSS 머신 가이던스(굴착기용)", "data": "배관파이프시 간 당(10-7)분류번호규 격7995-0050ø50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용)", "why": "자료 이름 칸에 원문 뭉개진 손료 글이 통째로 들어감 — 자료 이름 틀림" }, "셈 연료 코드 수": { "source": 201, "data": 214, "why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.", "class": "㉯ 남이 고쳐야 풀림" } }, "material": {}, "oil": {}, "rate": {}, "labor_blind": { "건설 pdf": { "what": "3. 개별직종 노임단가.md", "why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄" }, "건설 별칭 이름": { "what": [ "labor_1001", "labor_1002", "labor_1003", "labor_1007", "labor_1008", "labor_1012", "labor_1013", "labor_1015", "labor_1016", "labor_1017", "labor_1018", "labor_1019", "labor_op_const", "labor_op_general", "labor_op_truck" ], "why": "별칭 이름은 프로그램이 지은 것 — 가리키는 코드가 원문에 있는지만 봄" }, "안 잰 칸 labor_mfg.unit": { "what": "원문과 안 맞댐", "why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐" }, "안 잰 칸 labor_rate.unit": { "what": "원문과 안 맞댐", "why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐" }, "제조 pdf": { "what": "2026상반기_중소제조업_직종별_임금조사_중소기업중앙회.md", "why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄" } }, "machine_blind": { "손료 계수 칸 없는 표 5220": { "what": [ "분류 번호", "규 격", "내용 시간", "연간 표준 가동 시간" ], "why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음" }, "손료 계수 칸 없는 표 7995": { "what": [ "분류 번호", "규 격", "내용 시간" ], "why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음" }, "손료보정 수 자리 가름": { "what": "뭉개진 글의 이어 붙은 수(2510)를 통째로 맞댐", "why": "8-1-7 가산비율 표가 글로 뭉개져 `2510` 처럼 붙음 — 25·10 인지 2·510 인지 못 가름" }, "안 잰 칸 mach_fuel_rate.parse_method": { "what": "원문과 안 맞댐", "why": "빌더가 남긴 읽기 방법 표시 — 원문 칸 아님" }, "안 잰 칸 mach_fuel_rate.source_tables.section": { "what": "원문과 안 맞댐", "why": "8-4 원표의 절 제목 — 표 차례로 맞대므로 글자는 안 봄(원표 머리·줄은 맞댐)" }, "안 잰 칸 mach_fuel_rate.specification": { "what": "원문과 안 맞댐", "why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐" }, "안 잰 칸 mach_loss_coef.loss_coefficient_per_hour": { "what": "원문과 안 맞댐", "why": "계산 칸(계 × 10⁻⁷) — 원문 `계`(source_coefficient_1e_minus_7)만 맞댐" }, "안 잰 칸 mach_loss_coef.note": { "what": "원문과 안 맞댐", "why": "데스크탑 서브가 붙인 설명 글 — 값 아님" }, "안 잰 칸 mach_loss_coef.specification": { "what": "원문과 안 맞댐", "why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐" }, "안 잰 칸 mach_operator_map.rules.alias": { "what": "원문과 안 맞댐", "why": "프로그램이 지은 이름·출처 표기" }, "안 잰 칸 mach_operator_map.rules.rule_id": { "what": "원문과 안 맞댐", "why": "프로그램이 지은 이름·출처 표기" }, "안 잰 칸 mach_operator_map.rules.source_section": { "what": "원문과 안 맞댐", "why": "프로그램이 지은 이름·출처 표기" }, "안 잰 칸 mach_price.specification": { "what": "원문과 안 맞댐", "why": "가격표엔 규격 칸이 없음(기종·코드·가격만)" }, "안 잰 칸 mach_rock_adj.rules.exception": { "what": "원문과 안 맞댐", "why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐" }, "안 잰 칸 mach_rock_adj.rules.exclusion": { "what": "원문과 안 맞댐", "why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐" }, "연료 못 읽은 줄 7505-0025": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0050": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0100": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0125": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0150": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0200": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0250": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0350": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0450": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0500": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7505-0700": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7993-0020": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 못 읽은 줄 7994-0050": { "what": "원문 표 토막 수가 안 맞음", "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" }, "연료 표 3108-0040": { "codes": [ "3108-0040", "3901-0300" ], "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음" }, "연료 표 5801-0045": { "codes": [ "5801-0045", "5801-0045" ], "why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.", "class": "㉯ 남이 고쳐야 풀림" }, "연료 표 5805-0002": { "codes": [ "5805-0002", "5805-0002" ], "why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.", "class": "㉯ 남이 고쳐야 풀림" }, "연료 표 5805-0003": { "codes": [ "5805-0003", "5805-0003" ], "why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.", "class": "㉯ 남이 고쳐야 풀림" }, "연료 표 7101-0450": { "codes": [ "7101-0450", "7811-0120" ], "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음" }, "연료 표 7812-0005": { "codes": [ "7812-0005", "7994-0050" ], "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음" }, "운전사 기종별 판단": { "what": 121, "why": "기종→운전사 구분(explicit_mappings)은 사람 판단 — 원문 8-1-3 5호는 기종 이름 글만 있음" } }, "material_blind": { "API 스냅숏": { "what": "나라장터_시설공통자재_2026-08-14.json", "why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐" }, "같은 때 공시 20696249": { "what": 2, "why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음" }, "같은 때 공시 20696250": { "what": 2, "why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음" }, "안 잰 칸 mat_price.price_adopted_reason": { "what": "원문과 안 맞댐", "why": "빌더가 적은 까닭 글 — 원문 칸 아님" }, "원천 없는 묶음": { "what": [ "reinforcing_steel", "ready_mixed_concrete", "asphalt_concrete" ], "why": "철근·레미콘·아스콘은 종합쇼핑몰 원천이 저장소에 없음 — 값 못 봄" } }, "oil_blind": { "API 스냅숏": { "what": [ "유가_전국평균_2026-08-14.json", "유가_시도별_2026-09-09.json" ], "why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐" }, "시도 거래일": { "what": "시도별 원천에 거래일 칸이 없음 — 수집일과만 맞댐", "why": "시도별 원천 줄에 거래일이 없어 `수집일` 로만 맞댐" }, "안 잰 칸 oil.scope": { "what": "원문과 안 맞댐", "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" }, "안 잰 칸 oil.unit": { "what": "원문과 안 맞댐", "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" }, "안 잰 칸 oil_regional.scope": { "what": "원문과 안 맞댐", "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" }, "안 잰 칸 oil_regional.source_product_name": { "what": "원문과 안 맞댐", "why": "시도별 원천에 상품 이름 칸 없음" }, "안 잰 칸 oil_regional.unit": { "what": "원문과 안 맞댐", "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" } }, "rate_blind": { "processing_rules": { "what": [ "note", "owner_supplied_material", "performance_guarantee_fee", "profit", "rounding", "safety_management_cost", "scale_bracket" ], "why": "끝수·산식 처리 규칙 — 코드 규칙이라 원문 대조 대상 아님(거울 시험 몫)" }, "안 잰 칸 rate_environment.forest_road_selection_status": { "what": "pending", "why": "임도 공종 선택 미결 표시 — 사용자 협의 몫" }, "안 잰 칸 rate_environment.minimum_estimated_amount_krw": { "what": 100000000, "why": "xlsx 환경보전비 칸에 1억 기준이 없음(1억은 퇴직공제부금 칸) — 근거 원문이 sources 에 없어 못 봄" }, "안 잰 칸 rate_equipment_payment_guarantee.base_note": { "what": "코드(`B09_Estimation_Statutory.STATUTORY_ITEMS`)가 직접공사비로 계산하고 있는 것과 맞춘 표기.", "why": "설명 글" }, "안 잰 칸 rate_overhead.basis": { "what": "조달청 「2026년 토목·조경·산업환경설비공사 원가계산 간접공사비(제비율) 적용기준」(2026-04-13). ⚠ 구간 라벨의 `billion` 은 **십억 원** — `lt_5_billion` 은 50억 미만이다. 종합(토목·조경·산업설비)은 5억미만~30억~50억 8 · 50~100억·100~300억 6.5 · 300~1000억 5 · 1000억이상 4.5, 전문 등은 5억미만 8 · 5~30억 6.5 · 30~50억·50~100억 5 · 100억이상 4.5.", "why": "데스크탑 서브가 붙인 설명 글 — 값 아님" }, "안 잰 칸 rate_overhead.specialty_note": { "what": "⚠ 2026-09-18 **300억 이상 두 구간이 통째로 빠져 있었음** — 마지막이 「100억-300억 미만」으로 닫혀 300억 넘는 전문공사가 어느 구간에도 안 걸렸음. 원본 XLSX(BL35:BR46) 대로 300~1000억 · 1000억 이상을 더함(둘 다 4.5%). 값은 원문 그대로.", "why": "데스크탑 서브가 붙인 설명 글 — 값 아님" }, "안 잰 칸 rate_performance_guarantee_fee.typical_forest_road_applicability": { "what": "not_applicable", "why": "임도 적용 판단 — 원문 칸 아님" }, "안 잰 칸 rate_safety_base.amount_bracket": { "what": "500_million_to_5_billion", "why": "다른 칸을 가리키는 표시 — 값 아님" }, "안 잰 칸 rate_safety_base.embedded_in": { "what": "rate_safety_pct.brackets", "why": "다른 칸을 가리키는 표시 — 값 아님" }, "안 잰 칸 rate_safety_pct.base_rule": { "what": "min_of_two_formulas", "why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐" }, "안 잰 칸 rate_safety_pct.base_with_owner_supplied_material": { "what": "minimum_of_statutory_two_formulas", "why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐" }, "안 잰 칸 rate_vat.base": { "what": "construction_cost_before_vat", "why": "부가세 — 근거(부가가치세법)가 sources 에 없음" }, "안 잰 칸 rate_vat.rate_percent": { "what": 10.0, "why": "부가세 — 근거(부가가치세법)가 sources 에 없음" }, "조달청 요약표": { "what": "2026.04.13_조달청_토목공사_제비율.xlsx", "why": "xlsx 는 조달청 요약표 — 각 고시 원문과는 안 맞댐(연금만 법령과 맞댐)" } } }