diff --git a/resources/data_cost_input_value/coef_2026.json b/resources/data_cost_input_value/coef_2026.json index 51cb6ef4..04b094fe 100644 --- a/resources/data_cost_input_value/coef_2026.json +++ b/resources/data_cost_input_value/coef_2026.json @@ -1,1250 +1,1250 @@ { - "schema_version": "1.0", - "dataset_id": "coef", - "effective_date": "2026-01-01", - "generated_at": "2026-08-15T08:09:28+09:00", - "sources": [ - { - "path": "resources/knowledge/original/행정규칙/임도 품셈 적용기준 (현 산림사업 표준품셈)/첨부/(산림청고시 제2025-82호) 산림사업 표준품셈.md", - "sha256": "c42a5e1dfaf55e67fb37eb03ff6ea471b5811f2ad035c339947d91c0ae726625", - "role": "primary" - }, - { - "path": "resources/knowledge/technical_info/01_임도/03_계산정보/토량계산.md", - "sha256": "a4d320029f0ed8af8513f4cb73b89b509bb65cad8996798f4451d8d80cfc5824", - "role": "soil_coefficients" - } - ], - "variables": { - "surcharge_labor": { - "unit": "percent", - "representation": "full_source_tables", - "application_status": "project_condition_selection_required", - "tables": [ - { - "section": "1-4-1. 작업시기", - "line": 930, - "headers": [ - "작업시기", - "할증률" - ], - "rows": [ - [ - "6월∼9월", - "10%" - ], - [ - "10월∼12월", - "5%" - ], - [ - "1∼5월", - "0%" - ] - ] - }, - { - "section": "1-4-2. 조림 후 경과연수", - "line": 941, - "headers": [ - "조림 후 경과연수", - "할증률" - ], - "rows": [ - [ - "3년차 이상", - "10%" - ], - [ - "2년차", - "5%" - ], - [ - "당해 연도(전년도 추기조림 포함)", - "0%" - ] - ] - }, - { - "section": "1-4-3. 집단화정도", - "line": 951, - "headers": [ - "구 분", - "집단화 정도", - "할증률" - ], - "rows": [ - [ - "집단화 정도", - "개소당 평균면적이 1ha 미만", - "10%" - ], - [ - "개소당 평균면적이 1~3ha 미만", - "5%", - "" - ], - [ - "개소당 평균면적이 3ha 이상", - "0%", - "" - ] - ] - }, - { - "section": "1-4-4. 작업구역", - "line": 966, - "headers": [ - "구 분", - "집단화 정도", - "할인․할증률" - ], - "rows": [ - [ - "작업구역", - "개소 평균 1ha 미만", - "10%" - ], - [ - "개소 평균 1~3ha 미만", - "5%", - "" - ], - [ - "개소 평균 3~5ha 미만", - "0%", - "" - ], - [ - "개소당 평균 5ha 이상", - "-5%", - "" - ], - [ - "벌채구역 크기", - "개벌지 크기가 700㎡(또는 벌채폭 30m) 이하", - "10%" - ], - [ - "개벌지 크기가 3,000㎡(또는 벌채폭 60m) 미만", - "5%", - "" - ], - [ - "개벌지 크기가 3,000㎡ 이상", - "0%", - "" - ] - ] - }, - { - "section": "1-4-5. 경사도", - "line": 981, - "headers": [ - "적용기준", - "경사도", - "할인․할증률" - ], - "rows": [ - [ - "산지경사", - "급 (30° 초과)", - "10%" - ], - [ - "중 (15~30°)", - "5%", - "" - ], - [ - "완 (15° 미만)", - "0%", - "" - ], - [ - "평균경사도", - "평균경사도 50%이상", - "20%" - ], - [ - "평균경사도 20%~50%미만", - "10%", - "" - ], - [ - "평균경사도 10%~20%미만", - "5%", - "" - ], - [ - "평균경사도 10%미만", - "0%", - "" - ] - ] - }, - { - "section": "1-4-6. 작업장까지의 이동거리", - "line": 998, - "headers": [ - "구 분", - "작업장까지 이동거리", - "할증률" - ], - "rows": [ - [ - "도 보", - "2.5㎞ 이상", - "10%" - ], - [ - "1.3㎞∼2.5㎞ 미만", - "5%", - "" - ], - [ - "1.3㎞ 미만", - "0%", - "" - ], - [ - "차 량", - "2.5㎞ 이상", - "10%" - ], - [ - "1.3㎞∼2.5㎞ 미만", - "5%", - "" - ], - [ - "1.3㎞ 미만", - "0%", - "" - ] - ] - }, - { - "section": "1-4-7. 하층식생", - "line": 1011, - "headers": [ - "하층식생", - "할증률" - ], - "rows": [ - [ - "식생을 제거하지 않고는 보행이 곤란하다", - "10%" - ], - [ - "보행하는데 약간의 어려움이 있다", - "5%" - ], - [ - "보행이 용이하다", - "0%" - ] - ] - }, - { - "section": "1-4-8. 장애물의 정도", - "line": 1019, - "headers": [ - "장애물의 정도", - "할증률" - ], - "rows": [ - [ - "가슴높이 이상의 초본․관목", - "10%" - ], - [ - "가슴높이 미만의 초본․관목", - "5%" - ], - [ - "무릎높이 이하의 초본․관목", - "0%" - ] - ] - }, - { - "section": "1-4-9. 제거대상 식생", - "line": 1029, - "headers": [ - "제거대상 식생", - "할증률" - ], - "rows": [ - [ - "어렵다(높이 1.2m 이상이고, 직경이 4~6cm 이상)", - "10%" - ], - [ - "보통이다(높이 1.2m 이상이고, 직경이 4~6cm 미만)", - "5%" - ], - [ - "쉽다(높이 1.2m 미만이고, 낫으로도 제거가 용이)", - "0%" - ] - ] - }, - { - "section": "1-4-10. 토양상태", - "line": 1039, - "headers": [ - "토양조건", - "할증률" - ], - "rows": [ - [ - "돌 등 장애물 함량이 30% 이상이고, 나무뿌리가 밀하게 분포할 경우", - "10%" - ], - [ - "돌 등 장애물 함량이 10~30%이고, 나무뿌리가 보통정도로 분포할 경우", - "5%" - ], - [ - "식혈시 장애물이 거의 없음", - "0%" - ] - ] - }, - { - "section": "1-4-11. 덩굴피복도", - "line": 1049, - "headers": [ - "덩굴 피복도", - "할인․할증률" - ], - "rows": [ - [ - "과밀(80%초과 피복)", - "50%" - ], - [ - "밀(60~80%미만 피복)", - "20%" - ], - [ - "보통(40~60%미만 피복)", - "0%" - ], - [ - "소(20~40%미만 피복)", - "-20%" - ], - [ - "과소(20%미만 피복)", - "-50%" - ] - ] - }, - { - "section": "1-4-12. 제거대상 피복도", - "line": 1061, - "headers": [ - "제거대상 피복도", - "할인․할증률" - ], - "rows": [ - [ - "대 (임지의 71% 이상 분포)", - "20%" - ], - [ - "중 (임지의 41%~70% 분포)", - "0%" - ], - [ - "소 (임지의 40% 이하 분포)", - "-20%" - ] - ] - }, - { - "section": "1-4-13. 주행 장애물 상태", - "line": 1073, - "headers": [ - "주행 장애물 상태", - "할증률" - ], - "rows": [ - [ - "돌, 도랑, 그루터기 등으로 주행이 매우 힘들다", - "10%" - ], - [ - "돌, 도랑, 그루터기 등으로 주행이 다소 힘들다", - "5%" - ], - [ - "주행에 어려움이 없다", - "0%" - ] - ] - }, - { - "section": "1-4-14. 집재방향", - "line": 1081, - "headers": [ - "구분", - "집재방향", - "할증률", - "" - ], - "rows": [ - [ - "가선을 이용한 기계장비의 원목․생산재 집재", - "하향집재", - "10%", - "" - ], - [ - "상향집재", - "0%", - "", - "" - ], - [ - "소나무재선충병 인력에 의한 원목 및 재해산물 수집", - "상향집재", - "급(30°초과)", - "10%" - ], - [ - "중(15~30°)", - "5%", - "", - "" - ], - [ - "완(15° 미만)", - "0%", - "", - "" - ], - [ - "소나무재선충병 방제 훈증더미 제거", - "상향집재", - "10%", - "" - ], - [ - "수평 또는 하향집재", - "0%", - "", - "" - ] - ] - }, - { - "section": "1-4-15. 횡단운반거리", - "line": 1095, - "headers": [ - "횡단운반거리", - "할증률" - ], - "rows": [ - [ - "11~20m", - "10%" - ], - [ - "6~10m", - "5%" - ], - [ - "0~5m", - "0%" - ] - ] - }, - { - "section": "1-4-16. 규격재 생산", - "line": 1105, - "headers": [ - "적용 조건", - "할증률" - ], - "rows": [ - [ - "규격재 생산을 위한 조재", - "20%" - ] - ] - }, - { - "section": "1-4-17. 방제대상목 분포", - "line": 1111, - "headers": [ - "구 분", - "대상목 분포", - "할인․할증률" - ], - "rows": [ - [ - "산림병해충방제 (단목베기, 나무주사)", - "10본/ha 미만", - "30%" - ], - [ - "10~29본/ha", - "20%", - "" - ], - [ - "30~49본/ha", - "10%", - "" - ], - [ - "50본/ha 이상", - "0", - "" - ], - [ - "소나무재선충병방제 (소각, 매몰, 훈증, 박피)", - "15본/ha 이하", - "20%" - ], - [ - "15본~25본/ha", - "10%", - "" - ], - [ - "25본~35본/ha", - "0%", - "" - ], - [ - "35본~45본/ha", - "-10%", - "" - ], - [ - "45본/ha 이상", - "-20%", - "" - ] - ] - }, - { - "section": "1-4-18. 방제대상목 평균 경급", - "line": 1125, - "headers": [ - "구분", - "평균경급", - "할인․할증률" - ], - "rows": [ - [ - "산림병해충방제 (산물수집-기계장비 집재)", - "22~26cm", - "10%" - ], - [ - "16~20cm", - "0%", - "" - ], - [ - "소나무재선충병방제 (그물망 피복)", - "16cm 이하", - "10%" - ], - [ - "18cm", - "0%", - "" - ], - [ - "20cm 이상", - "-10%", - "" - ] - ] - }, - { - "section": "1-4-18. 방제대상목 평균 경급", - "line": 1135, - "headers": [ - "구분", - "내 용", - "할증률" - ], - "rows": [ - [ - "매개충나무주사", - "매개충나무주사 실행", - "30%" - ] - ] - }, - { - "section": "1-4-20. 방제지 사면", - "line": 1143, - "headers": [ - "구 분", - "내 용", - "할인․할증률" - ], - "rows": [ - [ - "사면형", - "종․횡방향 복합사면(가시거리 매우불량, 고소작업차 이동 필요)", - "10%" - ], - [ - "종방향 복합사면(가시거리 불량, 고소작업차 사용 필요)", - "5%", - "" - ], - [ - "횡방향 복합사면(가시거리 보통)", - "0%", - "" - ], - [ - "단순사면(가시거리 양호)", - "-5%", - "" - ] - ] - }, - { - "section": "1-4-21. 방제지 접근성", - "line": 1155, - "headers": [ - "구 분", - "내 용", - "할증률" - ], - "rows": [ - [ - "접근성", - "이착륙장~방재사업지까지의 이동거리 200m 이상 거리까지 차량접근 가능", - "20%" - ], - [ - "이착륙장~방재사업지까지의 이동거리 200m 이내 까지 차량접근 가능", - "10%", - "" - ], - [ - "이착륙장~방재사업지까지의 이동거리 100m 이내 까지 차량접근 가능", - "0%", - "" - ] - ] - }, - { - "section": "1-4-22. 방제 수종", - "line": 1168, - "headers": [ - "구 분", - "내 용", - "할증률" - ], - "rows": [ - [ - "방제 수종", - "잣나무", - "20%" - ], - [ - "소나무, 해송", - "0%", - "" - ] - ] - }, - { - "section": "1-4-23. 방제목 운반거리", - "line": 1175, - "headers": [ - "구 분", - "내 용", - "할증률" - ], - "rows": [ - [ - "그물망 피복 시 임내 운반거리", - "200m 초과", - "20%" - ], - [ - "101~200m", - "10%", - "" - ], - [ - "100m 이하", - "0%", - "" - ], - [ - "수라집재 시 목재 운반거리", - "11~20m", - "10%" - ], - [ - "6~10m", - "5%", - "" - ], - [ - "0~5m", - "0%", - "" - ] - ] - }, - { - "section": "1-4-24. 방제장비 규격", - "line": 1188, - "headers": [ - "구 분", - "내 용", - "할인률" - ], - "rows": [ - [ - "장비의 규격 (굴삭기)", - "0.2㎥", - "0" - ], - [ - "0.4㎥ 이상", - "장비품의 -20%", - "" - ] - ] - }, - { - "section": "1-4-25. 작업시간 제한", - "line": 1197, - "headers": [ - "구 분", - "적용조건", - "할증률" - ], - "rows": [ - [ - "작업 가능 시간", - "2시간 이하", - "50%" - ], - [ - "3시간 이하", - "35%", - "" - ], - [ - "4시간 이하", - "25%", - "" - ], - [ - "5시간 이하", - "20%", - "" - ], - [ - "6시간 이하", - "15%", - "" - ] - ] - }, - { - "section": "1-4-26. 소규모 작업물량 제한", - "line": 1212, - "headers": [ - "구분", - "조 건", - "적용시공량", - "" - ], - "rows": [ - [ - "1", - "A ≦ B/2 일 경우", - "Q = B/2", - "" - ], - [ - "2", - "B/2 < A ≦ B 일 경우", - "Q = B", - "" - ] - ] - } - ] - }, - "surcharge_mat": { - "used_value_at": "resources/data_material_surcharge/material_surcharge_2026-01-01.json → rates_pct — ⚠ 코드가 읽어 쓰는 값은 저기다. 이 표는 원문 보관용이라 읽는 코드가 없다(두 벌이 아니다).", - "unit": "percent", - "representation": "full_source_tables", - "duplicate_application_prohibited": true, - "tables": [ - { - "section": "1-3-1. 재료의 할증", - "line": 857, - "headers": [ - "종 류", - "정 치 식 (%)", - "기 타 (%)" - ], - "rows": [ - [ - "시 멘 트", - "2", - "3" - ], - [ - "잔골재ㆍ채움재", - "10", - "12" - ], - [ - "굵 은 골 재", - "3", - "5" - ], - [ - "아 스 팔 트", - "2", - "3" - ], - [ - "석 분", - "2", - "3" - ], - [ - "혼 화 재", - "2", - "-" - ] - ] - }, - { - "section": "1-3-1. 재료의 할증", - "line": 869, - "headers": [ - "종 류", - "할 증 률 (%)" - ], - "rows": [ - [ - "모 래", - "6" - ], - [ - "부순돌ㆍ자갈ㆍ막자갈", - "4" - ], - [ - "석 분", - "0" - ], - [ - "점 질 토", - "6" - ] - ] - }, - { - "section": "1-3-1. 재료의 할증", - "line": 878, - "headers": [ - "종 류", - "할 증 률 (%)" - ], - "rows": [ - [ - "모 래", - "4" - ] - ] - }, - { - "section": "1-3-1. 재료의 할증", - "line": 884, - "headers": [ - "종 류", - "할 증 률 (%)" - ], - "rows": [ - [ - "원 형 철 근", - "5" - ], - [ - "이 형 철 근", - "3" - ], - [ - "이형철근 (교량·지하철 및 이와 유사한 복잡한 구조물의 주철근)", - "6-7" - ], - [ - "강 판", - "10" - ], - [ - "강관(옥외 수도용 강관 제외)", - "5" - ], - [ - "대형형강 (形 鋼)", - "7" - ], - [ - "소 형 형 강", - "5" - ], - [ - "봉 강 (棒 鋼)", - "5" - ], - [ - "평 강 대 강", - "5" - ], - [ - "경량형 강각(角) 파이프", - "5" - ], - [ - "리 벳 (제 품)", - "5" - ] - ] - }, - { - "section": "1-3-1. 재료의 할증", - "line": 901, - "headers": [ - "재 료 별", - "할 증 률 (%)", - "" - ], - "rows": [ - [ - "목 재", - "각 재", - "5" - ], - [ - "판 재", - "10", - "" - ], - [ - "합 판", - "일반용 합판", - "3" - ], - [ - "수장용 합판", - "5", - "" - ], - [ - "조립식구조물(U형플륨관 등)", - "3", - "" - ], - [ - "레디믹스트콘크리트타설 (현장 플랜트 포함)", - "무근 구조물", - "2" - ], - [ - "철근 구조물", - "1", - "" - ], - [ - "철골 구조물", - "1", - "" - ], - [ - "원 석 (마름돌용)", - "30", - "" - ], - [ - "사방용 수목", - "10", - "" - ], - [ - "떼 및 초화류", - "10", - "" - ], - [ - "현장콘크리트 타설 (인력 및 믹서)", - "무근구조물", - "3" - ], - [ - "철근구조물", - "2", - "" - ], - [ - "소형구조물", - "5", - "" - ], - [ - "아스팔트콘크리트 포설(현장플랜트 포함)", - "2", - "" - ], - [ - "콘크리트포장 포설", - "4", - "" - ], - [ - "원심력철근콘크리트관", - "3", - "" - ] - ] - } - ] - }, - "rate_tool": { - "min_percent": 2.0, - "max_percent": 5.0, - "base": "main_material_cost", - "selection_required": true - }, - "coef_soil_L": { - "key": "soil_type", - "duplicate_note": "품셈 원문(체적의 변화율 표)이 '역이 섞인 점질토'를 값이 다른 2행으로, '암괴나 호박돌이 섞인 점토'를 동일값 2행으로 중복 수록 (원문 오기 가능성 있으나 임의 보정 없이 원문대로 유지 — 2026-08-14 감사). 프로그램 기본 채택행은 사용자 선정 대기: 03_미결_및_확인사항.md 참조", - "records": [ - { - "soil_type": "경암", - "min": 1.7, - "max": 2.0 - }, - { - "soil_type": "보통암", - "min": 1.55, - "max": 1.7 - }, - { - "soil_type": "연암", - "min": 1.3, - "max": 1.5 - }, - { - "soil_type": "풍화암", - "min": 1.3, - "max": 1.35 - }, - { - "soil_type": "폐콘크리트", - "min": 1.4, - "max": 1.6 - }, - { - "soil_type": "호박돌", - "min": 1.1, - "max": 1.15 - }, - { - "soil_type": "역(礫)", - "min": 1.1, - "max": 1.2 - }, - { - "soil_type": "역질토", - "min": 1.15, - "max": 1.2 - }, - { - "soil_type": "고결된 역질토", - "min": 1.25, - "max": 1.45 - }, - { - "soil_type": "모래", - "min": 1.2, - "max": 1.3 - }, - { - "soil_type": "암괴ㆍ호박돌 섞인 모래", - "min": 1.4, - "max": 1.45 - }, - { - "soil_type": "점질토", - "min": 1.25, - "max": 1.35 - }, - { - "soil_type": "역(礫)이 섞인 점질토", - "min": 1.35, - "max": 1.4, - "duplicate_group": "역이 섞인 점질토", - "duplicate_index": 1, - "selection": "pending" - }, - { - "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", - "min": 1.4, - "max": 1.45, - "duplicate_group": "암괴나 호박돌이 섞인 점토", - "duplicate_index": 1, - "duplicate_same_value": true, - "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", - "selection": "pending" - }, - { - "soil_type": "점토", - "min": 1.2, - "max": 1.45 - }, - { - "soil_type": "역이 섞인 점질토", - "min": 1.3, - "max": 1.4, - "duplicate_group": "역이 섞인 점질토", - "duplicate_index": 2, - "selection": "pending" - }, - { - "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", - "min": 1.4, - "max": 1.45, - "duplicate_group": "암괴나 호박돌이 섞인 점토", - "duplicate_index": 2, - "duplicate_same_value": true, - "hidden_duplicate": true, - "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", - "selection": "pending" - } - ] - }, - "coef_soil_C": { - "key": "soil_type", - "duplicate_note": "coef_soil_L 의 duplicate_note 와 동일 — 원문 중복 2행 쌍 유지, 채택행 사용자 선정 대기", - "records": [ - { - "soil_type": "경암", - "min": 1.3, - "max": 1.5 - }, - { - "soil_type": "보통암", - "min": 1.2, - "max": 1.4 - }, - { - "soil_type": "연암", - "min": 1.0, - "max": 1.3 - }, - { - "soil_type": "풍화암", - "min": 1.0, - "max": 1.15 - }, - { - "soil_type": "폐콘크리트", - "rule": "별도 설계" - }, - { - "soil_type": "호박돌", - "min": 0.95, - "max": 1.05 - }, - { - "soil_type": "역(礫)", - "min": 1.05, - "max": 1.1 - }, - { - "soil_type": "역질토", - "min": 0.9, - "max": 1.0 - }, - { - "soil_type": "고결된 역질토", - "min": 1.1, - "max": 1.3 - }, - { - "soil_type": "모래", - "min": 0.85, - "max": 0.9 - }, - { - "soil_type": "암괴ㆍ호박돌 섞인 모래", - "min": 0.9, - "max": 0.95 - }, - { - "soil_type": "점질토", - "min": 0.85, - "max": 0.95 - }, - { - "soil_type": "역(礫)이 섞인 점질토", - "min": 0.9, - "max": 1.0, - "duplicate_group": "역이 섞인 점질토", - "duplicate_index": 1, - "selection": "pending" - }, - { - "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", - "min": 0.9, - "max": 0.95, - "duplicate_group": "암괴나 호박돌이 섞인 점토", - "duplicate_index": 1, - "duplicate_same_value": true, - "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", - "selection": "pending" - }, - { - "soil_type": "점토", - "min": 0.85, - "max": 0.95 - }, - { - "soil_type": "역이 섞인 점질토", - "min": 0.9, - "max": 0.95, - "duplicate_group": "역이 섞인 점질토", - "duplicate_index": 2, - "selection": "pending" - }, - { - "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", - "min": 0.9, - "max": 0.95, - "duplicate_group": "암괴나 호박돌이 섞인 점토", - "duplicate_index": 2, - "duplicate_same_value": true, - "hidden_duplicate": true, - "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", - "selection": "pending" - } - ] - } + "schema_version": "1.0", + "dataset_id": "coef", + "effective_date": "2026-01-01", + "generated_at": "2026-08-15T08:09:28+09:00", + "sources": [ + { + "path": "resources/knowledge/original/행정규칙/임도 품셈 적용기준 (현 산림사업 표준품셈)/첨부/(산림청고시 제2025-82호) 산림사업 표준품셈.md", + "sha256": "c42a5e1dfaf55e67fb37eb03ff6ea471b5811f2ad035c339947d91c0ae726625", + "role": "primary" + }, + { + "path": "resources/knowledge/technical_info/01_임도/03_계산정보/토량계산.md", + "sha256": "a4d320029f0ed8af8513f4cb73b89b509bb65cad8996798f4451d8d80cfc5824", + "role": "soil_coefficients" } + ], + "variables": { + "surcharge_labor": { + "unit": "percent", + "representation": "full_source_tables", + "application_status": "project_condition_selection_required", + "tables": [ + { + "section": "1-4-1. 작업시기", + "line": 930, + "headers": [ + "작업시기", + "할증률" + ], + "rows": [ + [ + "6월∼9월", + "10%" + ], + [ + "10월∼12월", + "5%" + ], + [ + "1∼5월", + "0%" + ] + ] + }, + { + "section": "1-4-2. 조림 후 경과연수", + "line": 941, + "headers": [ + "조림 후 경과연수", + "할증률" + ], + "rows": [ + [ + "3년차 이상", + "10%" + ], + [ + "2년차", + "5%" + ], + [ + "당해 연도(전년도 추기조림 포함)", + "0%" + ] + ] + }, + { + "section": "1-4-3. 집단화정도", + "line": 951, + "headers": [ + "구 분", + "집단화 정도", + "할증률" + ], + "rows": [ + [ + "집단화 정도", + "개소당 평균면적이 1ha 미만", + "10%" + ], + [ + "개소당 평균면적이 1~3ha 미만", + "5%", + "" + ], + [ + "개소당 평균면적이 3ha 이상", + "0%", + "" + ] + ] + }, + { + "section": "1-4-4. 작업구역", + "line": 966, + "headers": [ + "구 분", + "집단화 정도", + "할인․할증률" + ], + "rows": [ + [ + "작업구역", + "개소 평균 1ha 미만", + "10%" + ], + [ + "개소 평균 1~3ha 미만", + "5%", + "" + ], + [ + "개소 평균 3~5ha 미만", + "0%", + "" + ], + [ + "개소당 평균 5ha 이상", + "-5%", + "" + ], + [ + "벌채구역 크기", + "개벌지 크기가 700㎡(또는 벌채폭 30m) 이하", + "10%" + ], + [ + "개벌지 크기가 3,000㎡(또는 벌채폭 60m) 미만", + "5%", + "" + ], + [ + "개벌지 크기가 3,000㎡ 이상", + "0%", + "" + ] + ] + }, + { + "section": "1-4-5. 경사도", + "line": 981, + "headers": [ + "적용기준", + "경사도", + "할인․할증률" + ], + "rows": [ + [ + "산지경사", + "급 (30° 초과)", + "10%" + ], + [ + "중 (15~30°)", + "5%", + "" + ], + [ + "완 (15° 미만)", + "0%", + "" + ], + [ + "평균경사도", + "평균경사도 50%이상", + "20%" + ], + [ + "평균경사도 20%~50%미만", + "10%", + "" + ], + [ + "평균경사도 10%~20%미만", + "5%", + "" + ], + [ + "평균경사도 10%미만", + "0%", + "" + ] + ] + }, + { + "section": "1-4-6. 작업장까지의 이동거리", + "line": 998, + "headers": [ + "구 분", + "작업장까지 이동거리", + "할증률" + ], + "rows": [ + [ + "도 보", + "2.5㎞ 이상", + "10%" + ], + [ + "1.3㎞∼2.5㎞ 미만", + "5%", + "" + ], + [ + "1.3㎞ 미만", + "0%", + "" + ], + [ + "차 량", + "2.5㎞ 이상", + "10%" + ], + [ + "1.3㎞∼2.5㎞ 미만", + "5%", + "" + ], + [ + "1.3㎞ 미만", + "0%", + "" + ] + ] + }, + { + "section": "1-4-7. 하층식생", + "line": 1011, + "headers": [ + "하층식생", + "할증률" + ], + "rows": [ + [ + "식생을 제거하지 않고는 보행이 곤란하다", + "10%" + ], + [ + "보행하는데 약간의 어려움이 있다", + "5%" + ], + [ + "보행이 용이하다", + "0%" + ] + ] + }, + { + "section": "1-4-8. 장애물의 정도", + "line": 1019, + "headers": [ + "장애물의 정도", + "할증률" + ], + "rows": [ + [ + "가슴높이 이상의 초본․관목", + "10%" + ], + [ + "가슴높이 미만의 초본․관목", + "5%" + ], + [ + "무릎높이 이하의 초본․관목", + "0%" + ] + ] + }, + { + "section": "1-4-9. 제거대상 식생", + "line": 1029, + "headers": [ + "제거대상 식생", + "할증률" + ], + "rows": [ + [ + "어렵다(높이 1.2m 이상이고, 직경이 4~6cm 이상)", + "10%" + ], + [ + "보통이다(높이 1.2m 이상이고, 직경이 4~6cm 미만)", + "5%" + ], + [ + "쉽다(높이 1.2m 미만이고, 낫으로도 제거가 용이)", + "0%" + ] + ] + }, + { + "section": "1-4-10. 토양상태", + "line": 1039, + "headers": [ + "토양조건", + "할증률" + ], + "rows": [ + [ + "돌 등 장애물 함량이 30% 이상이고, 나무뿌리가 밀하게 분포할 경우", + "10%" + ], + [ + "돌 등 장애물 함량이 10~30%이고, 나무뿌리가 보통정도로 분포할 경우", + "5%" + ], + [ + "식혈시 장애물이 거의 없음", + "0%" + ] + ] + }, + { + "section": "1-4-11. 덩굴피복도", + "line": 1049, + "headers": [ + "덩굴 피복도", + "할인․할증률" + ], + "rows": [ + [ + "과밀(80%초과 피복)", + "50%" + ], + [ + "밀(60~80%미만 피복)", + "20%" + ], + [ + "보통(40~60%미만 피복)", + "0%" + ], + [ + "소(20~40%미만 피복)", + "-20%" + ], + [ + "과소(20%미만 피복)", + "-50%" + ] + ] + }, + { + "section": "1-4-12. 제거대상 피복도", + "line": 1061, + "headers": [ + "제거대상 피복도", + "할인․할증률" + ], + "rows": [ + [ + "대 (임지의 71% 이상 분포)", + "20%" + ], + [ + "중 (임지의 41%~70% 분포)", + "0%" + ], + [ + "소 (임지의 40% 이하 분포)", + "-20%" + ] + ] + }, + { + "section": "1-4-13. 주행 장애물 상태", + "line": 1073, + "headers": [ + "주행 장애물 상태", + "할증률" + ], + "rows": [ + [ + "돌, 도랑, 그루터기 등으로 주행이 매우 힘들다", + "10%" + ], + [ + "돌, 도랑, 그루터기 등으로 주행이 다소 힘들다", + "5%" + ], + [ + "주행에 어려움이 없다", + "0%" + ] + ] + }, + { + "section": "1-4-14. 집재방향", + "line": 1081, + "headers": [ + "구분", + "집재방향", + "할증률", + "" + ], + "rows": [ + [ + "가선을 이용한 기계장비의 원목․생산재 집재", + "하향집재", + "10%", + "" + ], + [ + "상향집재", + "0%", + "", + "" + ], + [ + "소나무재선충병 인력에 의한 원목 및 재해산물 수집", + "상향집재", + "급(30°초과)", + "10%" + ], + [ + "중(15~30°)", + "5%", + "", + "" + ], + [ + "완(15° 미만)", + "0%", + "", + "" + ], + [ + "소나무재선충병 방제 훈증더미 제거", + "상향집재", + "10%", + "" + ], + [ + "수평 또는 하향집재", + "0%", + "", + "" + ] + ] + }, + { + "section": "1-4-15. 횡단운반거리", + "line": 1095, + "headers": [ + "횡단운반거리", + "할증률" + ], + "rows": [ + [ + "11~20m", + "10%" + ], + [ + "6~10m", + "5%" + ], + [ + "0~5m", + "0%" + ] + ] + }, + { + "section": "1-4-16. 규격재 생산", + "line": 1105, + "headers": [ + "적용 조건", + "할증률" + ], + "rows": [ + [ + "규격재 생산을 위한 조재", + "20%" + ] + ] + }, + { + "section": "1-4-17. 방제대상목 분포", + "line": 1111, + "headers": [ + "구 분", + "대상목 분포", + "할인․할증률" + ], + "rows": [ + [ + "산림병해충방제 (단목베기, 나무주사)", + "10본/ha 미만", + "30%" + ], + [ + "10~29본/ha", + "20%", + "" + ], + [ + "30~49본/ha", + "10%", + "" + ], + [ + "50본/ha 이상", + "0", + "" + ], + [ + "소나무재선충병방제 (소각, 매몰, 훈증, 박피)", + "15본/ha 이하", + "20%" + ], + [ + "15본~25본/ha", + "10%", + "" + ], + [ + "25본~35본/ha", + "0%", + "" + ], + [ + "35본~45본/ha", + "-10%", + "" + ], + [ + "45본/ha 이상", + "-20%", + "" + ] + ] + }, + { + "section": "1-4-18. 방제대상목 평균 경급", + "line": 1125, + "headers": [ + "구분", + "평균경급", + "할인․할증률" + ], + "rows": [ + [ + "산림병해충방제 (산물수집-기계장비 집재)", + "22~26cm", + "10%" + ], + [ + "16~20cm", + "0%", + "" + ], + [ + "소나무재선충병방제 (그물망 피복)", + "16cm 이하", + "10%" + ], + [ + "18cm", + "0%", + "" + ], + [ + "20cm 이상", + "-10%", + "" + ] + ] + }, + { + "section": "1-4-18. 방제대상목 평균 경급", + "line": 1135, + "headers": [ + "구분", + "내 용", + "할증률" + ], + "rows": [ + [ + "매개충나무주사", + "매개충나무주사 실행", + "30%" + ] + ] + }, + { + "section": "1-4-20. 방제지 사면", + "line": 1143, + "headers": [ + "구 분", + "내 용", + "할인․할증률" + ], + "rows": [ + [ + "사면형", + "종․횡방향 복합사면(가시거리 매우불량, 고소작업차 이동 필요)", + "10%" + ], + [ + "종방향 복합사면(가시거리 불량, 고소작업차 사용 필요)", + "5%", + "" + ], + [ + "횡방향 복합사면(가시거리 보통)", + "0%", + "" + ], + [ + "단순사면(가시거리 양호)", + "-5%", + "" + ] + ] + }, + { + "section": "1-4-21. 방제지 접근성", + "line": 1155, + "headers": [ + "구 분", + "내 용", + "할증률" + ], + "rows": [ + [ + "접근성", + "이착륙장~방재사업지까지의 이동거리 200m 이상 거리까지 차량접근 가능", + "20%" + ], + [ + "이착륙장~방재사업지까지의 이동거리 200m 이내 까지 차량접근 가능", + "10%", + "" + ], + [ + "이착륙장~방재사업지까지의 이동거리 100m 이내 까지 차량접근 가능", + "0%", + "" + ] + ] + }, + { + "section": "1-4-22. 방제 수종", + "line": 1168, + "headers": [ + "구 분", + "내 용", + "할증률" + ], + "rows": [ + [ + "방제 수종", + "잣나무", + "20%" + ], + [ + "소나무, 해송", + "0%", + "" + ] + ] + }, + { + "section": "1-4-23. 방제목 운반거리", + "line": 1175, + "headers": [ + "구 분", + "내 용", + "할증률" + ], + "rows": [ + [ + "그물망 피복 시 임내 운반거리", + "200m 초과", + "20%" + ], + [ + "101~200m", + "10%", + "" + ], + [ + "100m 이하", + "0%", + "" + ], + [ + "수라집재 시 목재 운반거리", + "11~20m", + "10%" + ], + [ + "6~10m", + "5%", + "" + ], + [ + "0~5m", + "0%", + "" + ] + ] + }, + { + "section": "1-4-24. 방제장비 규격", + "line": 1188, + "headers": [ + "구 분", + "내 용", + "할인률" + ], + "rows": [ + [ + "장비의 규격 (굴삭기)", + "0.2㎥", + "0" + ], + [ + "0.4㎥ 이상", + "장비품의 -20%", + "" + ] + ] + }, + { + "section": "1-4-25. 작업시간 제한", + "line": 1197, + "headers": [ + "구 분", + "적용조건", + "할증률" + ], + "rows": [ + [ + "작업 가능 시간", + "2시간 이하", + "50%" + ], + [ + "3시간 이하", + "35%", + "" + ], + [ + "4시간 이하", + "25%", + "" + ], + [ + "5시간 이하", + "20%", + "" + ], + [ + "6시간 이하", + "15%", + "" + ] + ] + }, + { + "section": "1-4-26. 소규모 작업물량 제한", + "line": 1212, + "headers": [ + "구분", + "조 건", + "적용시공량", + "" + ], + "rows": [ + [ + "1", + "A ≦ B/2 일 경우", + "Q = B/2", + "" + ], + [ + "2", + "B/2 < A ≦ B 일 경우", + "Q = B", + "" + ] + ] + } + ] + }, + "surcharge_mat": { + "used_value_at": "resources/data_material_surcharge/material_surcharge_2026-01-01.json → rates_pct — ⚠ 코드가 읽어 쓰는 값은 저기다. 이 표는 원문 보관용이라 읽는 코드가 없다(두 벌이 아니다).", + "unit": "percent", + "representation": "full_source_tables", + "duplicate_application_prohibited": true, + "tables": [ + { + "section": "1-3-1. 재료의 할증", + "line": 857, + "headers": [ + "종 류", + "정 치 식 (%)", + "기 타 (%)" + ], + "rows": [ + [ + "시 멘 트", + "2", + "3" + ], + [ + "잔골재ㆍ채움재", + "10", + "12" + ], + [ + "굵 은 골 재", + "3", + "5" + ], + [ + "아 스 팔 트", + "2", + "3" + ], + [ + "석 분", + "2", + "3" + ], + [ + "혼 화 재", + "2", + "-" + ] + ] + }, + { + "section": "1-3-1. 재료의 할증", + "line": 869, + "headers": [ + "종 류", + "할 증 률 (%)" + ], + "rows": [ + [ + "모 래", + "6" + ], + [ + "부순돌ㆍ자갈ㆍ막자갈", + "4" + ], + [ + "석 분", + "0" + ], + [ + "점 질 토", + "6" + ] + ] + }, + { + "section": "1-3-1. 재료의 할증", + "line": 878, + "headers": [ + "종 류", + "할 증 률 (%)" + ], + "rows": [ + [ + "모 래", + "4" + ] + ] + }, + { + "section": "1-3-1. 재료의 할증", + "line": 884, + "headers": [ + "종 류", + "할 증 률 (%)" + ], + "rows": [ + [ + "원 형 철 근", + "5" + ], + [ + "이 형 철 근", + "3" + ], + [ + "이형철근 (교량·지하철 및 이와 유사한 복잡한 구조물의 주철근)", + "6-7" + ], + [ + "강 판", + "10" + ], + [ + "강관(옥외 수도용 강관 제외)", + "5" + ], + [ + "대형형강 (形 鋼)", + "7" + ], + [ + "소 형 형 강", + "5" + ], + [ + "봉 강 (棒 鋼)", + "5" + ], + [ + "평 강 대 강", + "5" + ], + [ + "경량형 강각(角) 파이프", + "5" + ], + [ + "리 벳 (제 품)", + "5" + ] + ] + }, + { + "section": "1-3-1. 재료의 할증", + "line": 901, + "headers": [ + "재 료 별", + "할 증 률 (%)", + "" + ], + "rows": [ + [ + "목 재", + "각 재", + "5" + ], + [ + "판 재", + "10", + "" + ], + [ + "합 판", + "일반용 합판", + "3" + ], + [ + "수장용 합판", + "5", + "" + ], + [ + "조립식구조물(U형플륨관 등)", + "3", + "" + ], + [ + "레디믹스트콘크리트타설 (현장 플랜트 포함)", + "무근 구조물", + "2" + ], + [ + "철근 구조물", + "1", + "" + ], + [ + "철골 구조물", + "1", + "" + ], + [ + "원 석 (마름돌용)", + "30", + "" + ], + [ + "사방용 수목", + "10", + "" + ], + [ + "떼 및 초화류", + "10", + "" + ], + [ + "현장콘크리트 타설 (인력 및 믹서)", + "무근구조물", + "3" + ], + [ + "철근구조물", + "2", + "" + ], + [ + "소형구조물", + "5", + "" + ], + [ + "아스팔트콘크리트 포설(현장플랜트 포함)", + "2", + "" + ], + [ + "콘크리트포장 포설", + "4", + "" + ], + [ + "원심력철근콘크리트관", + "3", + "" + ] + ] + } + ] + }, + "rate_tool": { + "min_percent": 2.0, + "max_percent": 5.0, + "base": "main_material_cost", + "selection_required": true + }, + "coef_soil_L": { + "key": "soil_type", + "duplicate_note": "품셈 원문(체적의 변화율 표)이 '역이 섞인 점질토'를 값이 다른 2행으로, '암괴나 호박돌이 섞인 점토'를 동일값 2행으로 중복 수록 (원문 오기 가능성 있으나 임의 보정 없이 원문대로 유지 — 2026-08-14 감사). 프로그램 기본 채택행은 사용자 선정 대기: 03_미결_및_확인사항.md 참조", + "records": [ + { + "soil_type": "경암", + "min": 1.7, + "max": 2.0 + }, + { + "soil_type": "보통암", + "min": 1.55, + "max": 1.7 + }, + { + "soil_type": "연암", + "min": 1.3, + "max": 1.5 + }, + { + "soil_type": "풍화암", + "min": 1.3, + "max": 1.35 + }, + { + "soil_type": "폐콘크리트", + "min": 1.4, + "max": 1.6 + }, + { + "soil_type": "호박돌", + "min": 1.1, + "max": 1.15 + }, + { + "soil_type": "역(礫)", + "min": 1.1, + "max": 1.2 + }, + { + "soil_type": "역질토", + "min": 1.15, + "max": 1.2 + }, + { + "soil_type": "고결된 역질토", + "min": 1.25, + "max": 1.45 + }, + { + "soil_type": "모래", + "min": 1.2, + "max": 1.3 + }, + { + "soil_type": "암괴나 호박돌이 섞인 모래", + "min": 1.4, + "max": 1.45 + }, + { + "soil_type": "점질토", + "min": 1.25, + "max": 1.35 + }, + { + "soil_type": "역(礫)이 섞인 점질토", + "min": 1.35, + "max": 1.4, + "duplicate_group": "역이 섞인 점질토", + "duplicate_index": 1, + "selection": "pending" + }, + { + "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", + "min": 1.4, + "max": 1.45, + "duplicate_group": "암괴나 호박돌이 섞인 점토", + "duplicate_index": 1, + "duplicate_same_value": true, + "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", + "selection": "pending" + }, + { + "soil_type": "점토", + "min": 1.2, + "max": 1.45 + }, + { + "soil_type": "역이 섞인 점질토", + "min": 1.3, + "max": 1.4, + "duplicate_group": "역이 섞인 점질토", + "duplicate_index": 2, + "selection": "pending" + }, + { + "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", + "min": 1.4, + "max": 1.45, + "duplicate_group": "암괴나 호박돌이 섞인 점토", + "duplicate_index": 2, + "duplicate_same_value": true, + "hidden_duplicate": true, + "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", + "selection": "pending" + } + ] + }, + "coef_soil_C": { + "key": "soil_type", + "duplicate_note": "coef_soil_L 의 duplicate_note 와 동일 — 원문 중복 2행 쌍 유지, 채택행 사용자 선정 대기", + "records": [ + { + "soil_type": "경암", + "min": 1.3, + "max": 1.5 + }, + { + "soil_type": "보통암", + "min": 1.2, + "max": 1.4 + }, + { + "soil_type": "연암", + "min": 1.0, + "max": 1.3 + }, + { + "soil_type": "풍화암", + "min": 1.0, + "max": 1.15 + }, + { + "soil_type": "폐콘크리트", + "rule": "별도 설계" + }, + { + "soil_type": "호박돌", + "min": 0.95, + "max": 1.05 + }, + { + "soil_type": "역(礫)", + "min": 1.05, + "max": 1.1 + }, + { + "soil_type": "역질토", + "min": 0.9, + "max": 1.0 + }, + { + "soil_type": "고결된 역질토", + "min": 1.1, + "max": 1.3 + }, + { + "soil_type": "모래", + "min": 0.85, + "max": 0.9 + }, + { + "soil_type": "암괴나 호박돌이 섞인 모래", + "min": 0.9, + "max": 0.95 + }, + { + "soil_type": "점질토", + "min": 0.85, + "max": 0.95 + }, + { + "soil_type": "역(礫)이 섞인 점질토", + "min": 0.9, + "max": 1.0, + "duplicate_group": "역이 섞인 점질토", + "duplicate_index": 1, + "selection": "pending" + }, + { + "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", + "min": 0.9, + "max": 0.95, + "duplicate_group": "암괴나 호박돌이 섞인 점토", + "duplicate_index": 1, + "duplicate_same_value": true, + "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", + "selection": "pending" + }, + { + "soil_type": "점토", + "min": 0.85, + "max": 0.95 + }, + { + "soil_type": "역이 섞인 점질토", + "min": 0.9, + "max": 0.95, + "duplicate_group": "역이 섞인 점질토", + "duplicate_index": 2, + "selection": "pending" + }, + { + "soil_type": "암괴(岩塊)나 호박돌이 섞인 점토", + "min": 0.9, + "max": 0.95, + "duplicate_group": "암괴나 호박돌이 섞인 점토", + "duplicate_index": 2, + "duplicate_same_value": true, + "hidden_duplicate": true, + "duplicate_reason": "원문 두 줄 · 값 같음 — 화면에는 한 줄로 보임. 원문은 그대로 둠(임의 보정 없음).", + "selection": "pending" + } + ] + } + } } diff --git a/resources/data_rebar/rebar_complexity_2026-01-01.json b/resources/data_rebar/rebar_complexity_2026-01-01.json index 12281192..152a3e53 100644 --- a/resources/data_rebar/rebar_complexity_2026-01-01.json +++ b/resources/data_rebar/rebar_complexity_2026-01-01.json @@ -1,71 +1,101 @@ { - "schema_version": "1.0", - "dataset_id": "rebar_complexity", - "effective_date": "2026-01-01", - "note": "철근 가공·조립 갈래(간단/보통/복잡/매우복잡) — **품셈 12-3 [주]① 원문**이 구조물을 예시로 갈라 둔다. 사람이 고르는 값이 아니라 법으로 정해지는 값이다(거푸집 사용횟수 1-7-1 과 같은 자리).", - "source": { - "doc": "산림사업 표준품셈 12-3 철근 현장가공 및 조립 [주] ①", - "table_id": "F0335", - "quote": "간단한 것이란 측구, 간단한 기초 및 중력식 옹벽 등을 말하며, 보통의 것이란 수문, 반중력식 옹벽 및 교대 등을 말하고, 복잡한 것이란 교량의 슬래브, 암거, 우물통 부벽식 옹벽 등을 말하며, 매우 복잡한 것이란 구주식(기둥형) 교대, 교각, 지하철, 터널" + "schema_version": "1.0", + "dataset_id": "rebar_complexity", + "effective_date": "2026-01-01", + "note": "철근 가공·조립 갈래(간단/보통/복잡/매우복잡) — **품셈 12-3 [주]① 원문**이 구조물을 예시로 갈라 둔다. 사람이 고르는 값이 아니라 법으로 정해지는 값이다(거푸집 사용횟수 1-7-1 과 같은 자리).", + "source": { + "doc": "산림사업 표준품셈 12-3 철근 현장가공 및 조립 [주] ①", + "table_id": "F0335", + "quote": "간단한 것이란 측구, 간단한 기초 및 중력식 옹벽 등을 말하며, 보통의 것이란 수문, 반중력식 옹벽 및 교대 등을 말하고, 복잡한 것이란 교량의 슬래브, 암거, 우물통 부벽식 옹벽 등을 말하며, 매우 복잡한 것이란 구주식(기둥형) 교대, 교각, 지하철, 터널" + }, + "policy": { + "auto_decided": true, + "unlisted_is_flagged": true, + "note": "원문 예시에 걸리는 것만 정한다. 안 걸리면 「갈래 미확보」로 드러내고 임의로 고르지 않는다." + }, + "classes": [ + { + "key": "간단", + "examples": [ + "측구", + "간단한 기초", + "중력식 옹벽" + ] }, - "policy": { - "auto_decided": true, - "unlisted_is_flagged": true, - "note": "원문 예시에 걸리는 것만 정한다. 안 걸리면 「갈래 미확보」로 드러내고 임의로 고르지 않는다." + { + "key": "보통", + "examples": [ + "수문", + "반중력식 옹벽", + "교대" + ] }, - "classes": [ - { "key": "간단", "examples": ["측구", "간단한 기초", "중력식 옹벽"] }, - { "key": "보통", "examples": ["수문", "반중력식 옹벽", "교대"] }, - { "key": "복잡", "examples": ["교량 슬래브", "암거", "우물통", "부벽식 옹벽"] }, - { "key": "매우복잡", "examples": ["구주식(기둥형) 교대", "교각", "지하철", "터널"] } - ], - "form_map": [ - { - "type_id": "retaining_wall", - "form": "중력식", - "class": "간단", - "matched": "중력식 옹벽" - }, - { - "type_id": "retaining_wall", - "form": "반중력식", - "class": "보통", - "matched": "반중력식 옹벽" - }, - { - "type_id": "retaining_wall", - "form": "부벽식", - "class": "복잡", - "matched": "부벽식 옹벽" - }, - { - "type_id": "retaining_wall", - "form": "캔틸레버식", - "class": null, - "why": "원문 [주]① 예시에 캔틸레버식 옹벽이 없음 — 임의로 고르지 않고 미확보로 드러냄" - }, - { - "type_id": "box_culvert", - "class": "복잡", - "matched": "암거" - }, - { - "type_id": "pipe_inlet_basin", - "class": "보통", - "matched": "철근가공조립(보통)", - "basis": "품셈 12-15 집수정 표", - "note": "그 공종 표가 직접 적은 「철근 | 철근가공조립(보통)」 이 정본 — 12-3 [주]① 「간단한 기초」 추정보다 위(2026-09-14 브레인 ㉯ ⑶ · 거푸집 4회와 같은 원칙). 앞서 간단으로 봤음." - } - ], - "price_hint_krw_per_ton": { - "note": "⚠ **표시 전용.** 갈래를 자동으로 정하더라도 화면에 갈래 이름과 차이를 보여야 사람이 검증할 수 있다. B08 의 어떤 계산에도 안 들어간다(금액은 B09 몫).", - "computed_by": "B09", - "computed_on": "2026-09-07", - "values": { - "간단": 919146.7, - "보통": 1032497.4, - "복잡": 1143569.7, - "매우복잡": 1278375.3 - } + { + "key": "복잡", + "examples": [ + "교량의 슬래브", + "암거", + "우물통", + "부벽식 옹벽" + ] + }, + { + "key": "매우복잡", + "examples": [ + "구주식(기둥형) 교대", + "교각", + "지하철", + "터널" + ] } + ], + "form_map": [ + { + "type_id": "retaining_wall", + "form": "중력식", + "class": "간단", + "matched": "중력식 옹벽" + }, + { + "type_id": "retaining_wall", + "form": "반중력식", + "class": "보통", + "matched": "반중력식 옹벽" + }, + { + "type_id": "retaining_wall", + "form": "부벽식", + "class": "복잡", + "matched": "부벽식 옹벽" + }, + { + "type_id": "retaining_wall", + "form": "캔틸레버식", + "class": null, + "why": "원문 [주]① 예시에 캔틸레버식 옹벽이 없음 — 임의로 고르지 않고 미확보로 드러냄" + }, + { + "type_id": "box_culvert", + "class": "복잡", + "matched": "암거" + }, + { + "type_id": "pipe_inlet_basin", + "class": "보통", + "matched": "철근가공조립(보통)", + "basis": "품셈 12-15 집수정 표", + "note": "그 공종 표가 직접 적은 「철근 | 철근가공조립(보통)」 이 정본 — 12-3 [주]① 「간단한 기초」 추정보다 위(2026-09-14 브레인 ㉯ ⑶ · 거푸집 4회와 같은 원칙). 앞서 간단으로 봤음." + } + ], + "price_hint_krw_per_ton": { + "note": "⚠ **표시 전용.** 갈래를 자동으로 정하더라도 화면에 갈래 이름과 차이를 보여야 사람이 검증할 수 있다. B08 의 어떤 계산에도 안 들어간다(금액은 B09 몫).", + "computed_by": "B09", + "computed_on": "2026-09-07", + "values": { + "간단": 919146.7, + "보통": 1032497.4, + "복잡": 1143569.7, + "매우복잡": 1278375.3 + } + } } diff --git a/resources/tester/fixtures/base_data_source_known.json b/resources/tester/fixtures/base_data_source_known.json index c3845563..01ccb157 100644 --- a/resources/tester/fixtures/base_data_source_known.json +++ b/resources/tester/fixtures/base_data_source_known.json @@ -6,42 +6,7 @@ "md=원문에서 읽은 값 · data=자료 값 · why=사람이 적은 까닭(시험은 맞대기에서 뺌).", "못 재는 칸은 시험 파일 NOT_CHECKED 에 까닭과 함께." ], - "coef": { - "coef_soil_C/11": { - "md": [ - "암괴나호박돌이섞인모래", - 0.9, - 0.95, - null - ], - "data": [ - "암괴ㆍ호박돌섞인모래", - 0.9, - 0.95, - null - ], - "why": "위와 같음", - "class": "㉰ 사용자 판단 필요", - "class_why": "토량환산계수 — 원문과 갈려 사람 확인" - }, - "coef_soil_L/11": { - "md": [ - "암괴나호박돌이섞인모래", - 1.4, - 1.45, - null - ], - "data": [ - "암괴ㆍ호박돌섞인모래", - 1.4, - 1.45, - null - ], - "why": "이름을 「암괴ㆍ호박돌 섞인 모래」로 줄여 적음 — 값은 원문과 같음", - "class": "㉰ 사용자 판단 필요", - "class_why": "위와 같음" - } - }, + "coef": {}, "material_surcharge": { "이형철근": { "md": [ @@ -58,40 +23,13 @@ } }, "formwork_reuse": {}, - "rebar_complexity": { - "classes/복잡": { - "md": "12-3 [주]① 에 없는 예시", - "data": [ - "교량 슬래브" - ], - "why": "원문 「교량의 슬래브」를 줄여 적음", - "class": "㉰ 사용자 판단 필요", - "class_why": "복잡 갈래 값 — 사람 확인" - } - }, + "rebar_complexity": {}, "timber_structure_class": {}, "masonry_slope": {}, "masonry_back_length": {}, "stone_kind": {}, "masonry_class": {}, - "machine_productivity": { - "dump_material/발파암/truck_efficiency": { - "md": [], - "data": "0.9", - "why": "10-12-3 운반 식에 E 가 없음 — 토사·암절취의 0.9 를 이어 씀", - "class": "㉮ 영영 할 일 아님", - "class_why": "원문 식에 E 가 없어 토사·암절취 0.9 를 이어 씀 — 사유 적음" - }, - "dump_material/토사/loading_efficiency": { - "md": [ - 0.75 - ], - "data": "0.60", - "why": "본문 E0=0.75 대신 10-12-1 [주]⑤ 표 「임도 0.60(불량)」 을 씀 — 자료 loading_note 에 사유", - "class": "㉮ 영영 할 일 아님", - "class_why": "원문 [주]⑤ 표 비고 「임 도」로 0.60 확정 — 사유 적음" - } - }, + "machine_productivity": {}, "_갈래": { "센 날": "2026-09-18", "셈": { @@ -99,5 +37,37 @@ "㉯ 남이 고쳐야 풀림": 0, "㉰ 사용자 판단 필요": 4 } + }, + "_할일_아님": { + "잣대": "㉮ — **영영 할 일이 아닌 것.** 원문에 없음 · 거절 자리 · 판정으로 닫힘. 바퀴마다 다시 세어지지 않게 갈래에서 **아주 빼** 여기 둔다. ⚠ 지우지는 않는다 — 되짚을 수 있어야 한다.", + "옮긴 날": "2026-09-18", + "셈": { + "machine_productivity": 2 + }, + "줄": { + "machine_productivity": { + "dump_material/발파암/truck_efficiency": { + "md": [], + "data": "0.9", + "why": "10-12-3 운반 식에 E 가 없음 — 토사·암절취의 0.9 를 이어 씀", + "class": "㉮ 영영 할 일 아님", + "class_why": "원문 식에 E 가 없어 토사·암절취 0.9 를 이어 씀 — 사유 적음", + "갈래": "거절 자리" + }, + "dump_material/토사/loading_efficiency": { + "md": [ + 0.75 + ], + "data": "0.60", + "why": "본문 E0=0.75 대신 10-12-1 [주]⑤ 표 「임도 0.60(불량)」 을 씀 — 자료 loading_note 에 사유", + "class": "㉮ 영영 할 일 아님", + "class_why": "원문 [주]⑤ 표 비고 「임 도」로 0.60 확정 — 사유 적음", + "갈래": "거절 자리" + } + } + }, + "갈래별": { + "거절 자리": 2 + } } } diff --git a/resources/tester/fixtures/base_prices_source_known.json b/resources/tester/fixtures/base_prices_source_known.json index 85bb85dd..d21660db 100644 --- a/resources/tester/fixtures/base_prices_source_known.json +++ b/resources/tester/fixtures/base_prices_source_known.json @@ -14,12 +14,18 @@ "가격 8201-0100 machine_name": { "source": "3D GNSS 머신 가이던스(굴착기용)", "data": "", - "why": "자료 이름이 빔 — 원문 손료표 머리 `(코드) 이름` 엔 이름 있음" + "why": "자료 이름이 빔 — 원문 손료표 머리 `(코드) 이름` 엔 이름 있음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "손료 8201-0100 machine_name": { "source": "3D GNSS 머신 가이던스(굴착기용)", "data": "배관파이프시 간 당(10-7)분류번호규 격7995-0050ø50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용)", - "why": "자료 이름 칸에 원문 뭉개진 손료 글이 통째로 들어감 — 자료 이름 틀림" + "why": "자료 이름 칸에 원문 뭉개진 손료 글이 통째로 들어감 — 자료 이름 틀림", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "셈 연료 코드 수": { "source": 201, @@ -34,7 +40,10 @@ "labor_blind": { "건설 pdf": { "what": "3. 개별직종 노임단가.md", - "why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄" + "why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "건설 별칭 이름": { "what": [ @@ -54,19 +63,31 @@ "labor_op_general", "labor_op_truck" ], - "why": "별칭 이름은 프로그램이 지은 것 — 가리키는 코드가 원문에 있는지만 봄" + "why": "별칭 이름은 프로그램이 지은 것 — 가리키는 코드가 원문에 있는지만 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 labor_mfg.unit": { "what": "원문과 안 맞댐", - "why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐" + "why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 labor_rate.unit": { "what": "원문과 안 맞댐", - "why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐" + "why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "제조 pdf": { "what": "2026상반기_중소제조업_직종별_임금조사_중소기업중앙회.md", - "why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄" + "why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" } }, "machine_blind": { @@ -77,7 +98,10 @@ "내용 시간", "연간 표준 가동 시간" ], - "why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음" + "why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "손료 계수 칸 없는 표 7995": { "what": [ @@ -85,118 +109,202 @@ "규 격", "내용 시간" ], - "why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음" + "why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "손료보정 수 자리 가름": { "what": "뭉개진 글의 이어 붙은 수(2510)를 통째로 맞댐", - "why": "8-1-7 가산비율 표가 글로 뭉개져 `2510` 처럼 붙음 — 25·10 인지 2·510 인지 못 가름" + "why": "8-1-7 가산비율 표가 글로 뭉개져 `2510` 처럼 붙음 — 25·10 인지 2·510 인지 못 가름", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_fuel_rate.parse_method": { "what": "원문과 안 맞댐", - "why": "빌더가 남긴 읽기 방법 표시 — 원문 칸 아님" + "why": "빌더가 남긴 읽기 방법 표시 — 원문 칸 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_fuel_rate.source_tables.section": { "what": "원문과 안 맞댐", - "why": "8-4 원표의 절 제목 — 표 차례로 맞대므로 글자는 안 봄(원표 머리·줄은 맞댐)" + "why": "8-4 원표의 절 제목 — 표 차례로 맞대므로 글자는 안 봄(원표 머리·줄은 맞댐)", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_fuel_rate.specification": { "what": "원문과 안 맞댐", - "why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐" + "why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_loss_coef.loss_coefficient_per_hour": { "what": "원문과 안 맞댐", - "why": "계산 칸(계 × 10⁻⁷) — 원문 `계`(source_coefficient_1e_minus_7)만 맞댐" + "why": "계산 칸(계 × 10⁻⁷) — 원문 `계`(source_coefficient_1e_minus_7)만 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_loss_coef.note": { "what": "원문과 안 맞댐", - "why": "데스크탑 서브가 붙인 설명 글 — 값 아님" + "why": "데스크탑 서브가 붙인 설명 글 — 값 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_loss_coef.specification": { "what": "원문과 안 맞댐", - "why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐" + "why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_operator_map.rules.alias": { "what": "원문과 안 맞댐", - "why": "프로그램이 지은 이름·출처 표기" + "why": "프로그램이 지은 이름·출처 표기", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_operator_map.rules.rule_id": { "what": "원문과 안 맞댐", - "why": "프로그램이 지은 이름·출처 표기" + "why": "프로그램이 지은 이름·출처 표기", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_operator_map.rules.source_section": { "what": "원문과 안 맞댐", - "why": "프로그램이 지은 이름·출처 표기" + "why": "프로그램이 지은 이름·출처 표기", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_price.specification": { "what": "원문과 안 맞댐", - "why": "가격표엔 규격 칸이 없음(기종·코드·가격만)" + "why": "가격표엔 규격 칸이 없음(기종·코드·가격만)", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_rock_adj.rules.exception": { "what": "원문과 안 맞댐", - "why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐" + "why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mach_rock_adj.rules.exclusion": { "what": "원문과 안 맞댐", - "why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐" + "why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0025": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0050": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0100": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0125": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0150": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0200": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0250": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0350": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0450": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0500": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7505-0700": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7993-0020": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 못 읽은 줄 7994-0050": { "what": "원문 표 토막 수가 안 맞음", - "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄" + "why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 표 3108-0040": { "codes": [ "3108-0040", "3901-0300" ], - "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음" + "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 표 5801-0045": { "codes": [ @@ -227,36 +335,57 @@ "7101-0450", "7811-0120" ], - "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음" + "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "연료 표 7812-0005": { "codes": [ "7812-0005", "7994-0050" ], - "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음" + "why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "운전사 기종별 판단": { "what": 121, - "why": "기종→운전사 구분(explicit_mappings)은 사람 판단 — 원문 8-1-3 5호는 기종 이름 글만 있음" + "why": "기종→운전사 구분(explicit_mappings)은 사람 판단 — 원문 8-1-3 5호는 기종 이름 글만 있음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" } }, "material_blind": { "API 스냅숏": { "what": "나라장터_시설공통자재_2026-08-14.json", - "why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐" + "why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "같은 때 공시 20696249": { "what": 2, - "why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음" + "why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "같은 때 공시 20696250": { "what": 2, - "why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음" + "why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 mat_price.price_adopted_reason": { "what": "원문과 안 맞댐", - "why": "빌더가 적은 까닭 글 — 원문 칸 아님" + "why": "빌더가 적은 까닭 글 — 원문 칸 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "원천 없는 묶음": { "what": [ @@ -264,7 +393,10 @@ "ready_mixed_concrete", "asphalt_concrete" ], - "why": "철근·레미콘·아스콘은 종합쇼핑몰 원천이 저장소에 없음 — 값 못 봄" + "why": "철근·레미콘·아스콘은 종합쇼핑몰 원천이 저장소에 없음 — 값 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" } }, "oil_blind": { @@ -273,31 +405,52 @@ "유가_전국평균_2026-08-14.json", "유가_시도별_2026-09-09.json" ], - "why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐" + "why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "시도 거래일": { "what": "시도별 원천에 거래일 칸이 없음 — 수집일과만 맞댐", - "why": "시도별 원천 줄에 거래일이 없어 `수집일` 로만 맞댐" + "why": "시도별 원천 줄에 거래일이 없어 `수집일` 로만 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 oil.scope": { "what": "원문과 안 맞댐", - "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" + "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 oil.unit": { "what": "원문과 안 맞댐", - "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" + "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 oil_regional.scope": { "what": "원문과 안 맞댐", - "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" + "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 oil_regional.source_product_name": { "what": "원문과 안 맞댐", - "why": "시도별 원천에 상품 이름 칸 없음" + "why": "시도별 원천에 상품 이름 칸 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 oil_regional.unit": { "what": "원문과 안 맞댐", - "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음" + "why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" } }, "rate_blind": { @@ -311,59 +464,101 @@ "safety_management_cost", "scale_bracket" ], - "why": "끝수·산식 처리 규칙 — 코드 규칙이라 원문 대조 대상 아님(거울 시험 몫)" + "why": "끝수·산식 처리 규칙 — 코드 규칙이라 원문 대조 대상 아님(거울 시험 몫)", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_environment.forest_road_selection_status": { "what": "pending", - "why": "임도 공종 선택 미결 표시 — 사용자 협의 몫" + "why": "임도 공종 선택 미결 표시 — 사용자 협의 몫", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_environment.minimum_estimated_amount_krw": { "what": 100000000, - "why": "xlsx 환경보전비 칸에 1억 기준이 없음(1억은 퇴직공제부금 칸) — 근거 원문이 sources 에 없어 못 봄" + "why": "xlsx 환경보전비 칸에 1억 기준이 없음(1억은 퇴직공제부금 칸) — 근거 원문이 sources 에 없어 못 봄", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_equipment_payment_guarantee.base_note": { "what": "코드(`B09_Estimation_Statutory.STATUTORY_ITEMS`)가 직접공사비로 계산하고 있는 것과 맞춘 표기.", - "why": "설명 글" + "why": "설명 글", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 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": "데스크탑 서브가 붙인 설명 글 — 값 아님" + "why": "데스크탑 서브가 붙인 설명 글 — 값 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_overhead.specialty_note": { "what": "⚠ 2026-09-18 **300억 이상 두 구간이 통째로 빠져 있었음** — 마지막이 「100억-300억 미만」으로 닫혀 300억 넘는 전문공사가 어느 구간에도 안 걸렸음. 원본 XLSX(BL35:BR46) 대로 300~1000억 · 1000억 이상을 더함(둘 다 4.5%). 값은 원문 그대로.", - "why": "데스크탑 서브가 붙인 설명 글 — 값 아님" + "why": "데스크탑 서브가 붙인 설명 글 — 값 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_performance_guarantee_fee.typical_forest_road_applicability": { "what": "not_applicable", - "why": "임도 적용 판단 — 원문 칸 아님" + "why": "임도 적용 판단 — 원문 칸 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_safety_base.amount_bracket": { "what": "500_million_to_5_billion", - "why": "다른 칸을 가리키는 표시 — 값 아님" + "why": "다른 칸을 가리키는 표시 — 값 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_safety_base.embedded_in": { "what": "rate_safety_pct.brackets", - "why": "다른 칸을 가리키는 표시 — 값 아님" + "why": "다른 칸을 가리키는 표시 — 값 아님", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_safety_pct.base_rule": { "what": "min_of_two_formulas", - "why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐" + "why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_safety_pct.base_with_owner_supplied_material": { "what": "minimum_of_statutory_two_formulas", - "why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐" + "why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_vat.base": { "what": "construction_cost_before_vat", - "why": "부가세 — 근거(부가가치세법)가 sources 에 없음" + "why": "부가세 — 근거(부가가치세법)가 sources 에 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "안 잰 칸 rate_vat.rate_percent": { "what": 10.0, - "why": "부가세 — 근거(부가가치세법)가 sources 에 없음" + "why": "부가세 — 근거(부가가치세법)가 sources 에 없음", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" }, "조달청 요약표": { "what": "2026.04.13_조달청_토목공사_제비율.xlsx", - "why": "xlsx 는 조달청 요약표 — 각 고시 원문과는 안 맞댐(연금만 법령과 맞댐)" + "why": "xlsx 는 조달청 요약표 — 각 고시 원문과는 안 맞댐(연금만 법령과 맞댐)", + "class": "㉯ 남이 고쳐야 풀림", + "owner": "랩탑 메인", + "owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림" } } } diff --git a/resources/tester/fixtures/work_item_master_source_known.json b/resources/tester/fixtures/work_item_master_source_known.json index 8cd6b062..8918d837 100644 --- a/resources/tester/fixtures/work_item_master_source_known.json +++ b/resources/tester/fixtures/work_item_master_source_known.json @@ -78,29 +78,6 @@ "class": "㉰ 사용자 판단 필요", "class_why": "⚠ 마스터 「1km」는 반쪽 — 원문은 「인/1일 1km당」으로 분모가 둘(일·km)" }, - "F0132": { - "section": "5-22-4", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(일당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "「일당」은 품의 단위(하루에 얼마)라 밑수로 안 받음" - }, - "F0145": { - "section": "5-28-2", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(일 당)", - "master": null, - "why": "작업조 표(시공량 열이 밑수) — 마스터가 일부러 비움(c3da333e 와 같은 까닭) · 원문 「(일 당)」 은 코덱스 복원(61f35108)", - "class": "㉮ 영영 할 일 아님", - "class_why": "작업조 표 — 밑수가 시공량 열이라 일부러 비움" - }, "F0173": { "section": "7-2", "md": null, @@ -110,7 +87,9 @@ "㎥" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스 md 읽기 넓히기" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스 md 읽기 넓히기", + "owner": "랩탑 메인", + "owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)" }, "F0188": { "section": "7-10", @@ -121,7 +100,9 @@ "㎥" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "위와 같음" + "class_why": "위와 같음", + "owner": "랩탑 메인", + "owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)" }, "F0225": { "section": "8-6-1", @@ -132,18 +113,9 @@ "ha" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "위와 같음(원문 「160ha당」)" - }, - "F0257": { - "section": "9-11-1", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "「일당」 · 계수표" + "class_why": "위와 같음(원문 「160ha당」)", + "owner": "랩탑 메인", + "owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)" }, "F0322": { "section": "10-13-1", @@ -154,7 +126,9 @@ "본" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "위와 같음(원문 「묘목 1,000본당」)" + "class_why": "위와 같음(원문 「묘목 1,000본당」)", + "owner": "랩탑 메인", + "owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)" }, "F0323": { "section": "10-13-2", @@ -165,84 +139,9 @@ "본" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "위와 같음" - }, - "F0338": { - "section": "12-6", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "작업조 표(포장공 3인·시공량)" - }, - "F0339": { - "section": "12-7-1", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "작업조 표 — 넣으면 호표가 사라짐(2026-09-17 유로폼에서 실증)" - }, - "F0340": { - "section": "12-7-2", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "위와 같음" - }, - "F0341": { - "section": "12-8", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "위와 같음" - }, - "F0395": { - "section": "12-38-3", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일 당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "위와 같음" - }, - "F0447": { - "section": "13-15-2", - "md": [ - 1.0, - "조" - ], - "md_evidence": "(단위: 인/조)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "「인/조」 — 「조」는 세는 단위가 아님" - }, - "F0449": { - "section": "13-16-2", - "md": [ - 1.0, - "일" - ], - "md_evidence": "(단위: 일 당)", - "master": null, - "class": "㉮ 영영 할 일 아님", - "class_why": "위와 같음" + "class_why": "위와 같음", + "owner": "랩탑 메인", + "owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)" } }, "notes": { @@ -253,7 +152,9 @@ "- 3. 박피품은 별도 적용하여야 한다. 다만 작업조건에 따라 1일 작업량은 변동 적용한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0104": { "section": "5-3-4", @@ -268,7 +169,9 @@ "- ⑦ 굴착기 규격은 0.4㎥를 기준으로 한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0106": { "section": "5-3-5", @@ -284,7 +187,9 @@ "- ⑧ 장비 규격은 다음을 기준으로 한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0189": { "section": "7-11", @@ -296,7 +201,9 @@ "- ④ 할인․할증은 경사도(1-4-5), 주행 장애물 상태(1-4-13)를 반영한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0223": { "section": "8-4", @@ -306,7 +213,9 @@ "- ④ 할인․할증은 경사도(1-4-5), 방제 대상목 분포(1-4-17)를 반영한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0251": { "section": "9-8-1", @@ -318,7 +227,9 @@ "[주] 「건설공사 표준품셈 공통부문, 8-2-13 대형브레이커(2025)」, 「건설공사 표준품셈 유지관리부문, 3-1-3 철골재 철거(인력)(2025)」, 「건설공사 표준품셈 유지관리부문, 3-1-4 철골재 철거(기계)(2025)」, 「건설공사 표준품셈 공통부문, 1-2-3 토질, 3. 체적환산계수적용(2025)」, 「국토건설 설계실무요령, 수량산출요령(2021)」 참조한다" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0252": { "section": "9-8-2", @@ -333,7 +244,9 @@ "- ② 「건설공사 표준품셈 유지관리부문, 3-1-3 철골재 철거(인력)(2025)」, 「건설공사 표준품셈 유지관리부문., 3-1-4 철골재 철거(기계)(2025)」 참조한다" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0254": { "section": "9-10-1", @@ -344,7 +257,9 @@ "- ② 굴착기작업능력은 무근콘크리트(T=30㎝미만) 값 적용한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0255": { "section": "9-10-2", @@ -356,7 +271,9 @@ "- ③ 「건설공사 표준품셈 공통부문, 8-2-13 대형브레이커(2025)」 참조한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0281": { "section": "9-15-1", @@ -365,7 +282,9 @@ "- ③ 「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」 참조한다. (불도저작업이 어려운 경우)" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0282": { "section": "9-15-2", @@ -374,7 +293,9 @@ "- ③ 「건설공사 표준품셈 공통부문, 8-2-1 불도저(2025)」 참조(표토제거 두께 T=0.2m)" ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0285": { "section": "9-16-3", @@ -383,7 +304,9 @@ "- ④ 토목은 동상방지층, 보조기층, 기층 등 층별 조건이나 본선, 길어깨 등에 따라 임도에는 대형장비(5,500ℓ)를 사용한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0286": { "section": "9-17-2", @@ -393,7 +316,9 @@ "- ④ 「건설공사 표준품셈 공통부문 8-2-1 불도저(2025)」 참조한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0295": { "section": "9-22", @@ -402,7 +327,9 @@ "- ④ 0.2㎥ 또는 0.4㎥ 용량의 굴착기를 사용하는 경우에는「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0319": { "section": "10-11", @@ -411,7 +338,9 @@ "- ③ 「건설공사 표준품셈 공통부문. 8-2-1 불도저(2025)」 참조한다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0323": { "section": "10-13-2", @@ -420,7 +349,9 @@ "[주] 위 단가산출은 일본 임야청에서 묘목 5,000본의 운반을 가정하여 현장 검증을 통해 산출한 내용이므로, 묘목 이외의 다른 화물을 운반할 시에는 달라질 수 있다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" }, "F0393": { "section": "12-38-2", @@ -430,138 +361,21 @@ "- ② 플랫 타이(Flat Tie) 대신 폼 타이(Form Tie) 사용 시 소요 수량은 12-4 합판 거푸집 자재수량을 따른다." ], "class": "㉯ 남이 고쳐야 풀림", - "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중" - } - }, - "form": { - "F0002": { - "section": "1-2-2", - "master": "reference", - "md_mark": "직공인부", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" - }, - "F0007": { - "section": "1-2-7", - "master": "reference", - "md_mark": "㎥", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" - }, - "F0038": { - "section": "1-4-26", - "master": "reference", - "md_mark": "적용시공량", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" - }, - "F0227": { - "section": "8-6-1", - "master": "reference", - "md_mark": "유효 살포량/1회", - "why": "사람 판정 reference(Forms.py) — 기종별 희석배수별 1회 살포량 계산표", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" - }, - "F0257": { - "section": "9-11-1", - "master": "coefficient", - "md_mark": "ℓ", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" - }, - "F0325": { - "section": "11-1", - "master": "reference", - "md_mark": "비계공", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" - }, - "F0454": { - "section": "14-2", - "master": "reference", - "md_mark": "작업량", - "class": "㉮ 영영 할 일 아님", - "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐" + "class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중", + "owner": "랩탑 메인", + "owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)" } }, + "form": {}, "form_blind": { - "F0046": { - "section": "2-1-1", - "master": "requirement", - "why": "기계별 연료표(천공기 주연료 3ℓ·잡품 95%) — 품 낱말 없음. 같은 모양 F0044·F0045·F0047 은 사람 판정 reference 인데 이것만 requirement", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0062": { - "section": "2-1-12", - "master": "requirement", - "why": "값 칸이 「층적부피에 따라 별도계산」·「〃」 — 숫자 없음", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0140": { - "section": "5-26-1", - "master": "requirement", - "why": "머리 소실 — 토성×깊이 숫자만 남음(사람 판정: 100㎡당 보통인부)", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0141": { - "section": "5-26-2", - "master": "requirement", - "why": "머리 소실 — 위와 같음", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0142": { - "section": "5-26-3", - "master": "requirement", - "why": "머리 소실 — 위와 같음", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0195": { - "section": "7-14", - "master": "productivity", - "why": "칸이 뭉침(「㎥ 0.06∼0.07 4.8∼6.0」) — 원문 md 가 병합 칸을 못 풂", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0237": { - "section": "8-11", - "master": "productivity", - "why": "작업량이 식 글(「Q = 3.5 ㎥/hr」)", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, "F0333": { "section": "12-1-3", "master": "requirement", "why": "⚠ 원문 md 의심 — 머리는 한중콘크리트 「온도 품종 | 0℃때 …」인데 몸 줄이 앞 표 F0332(시멘트·모래·자갈 kg)와 똑같음 · PDF 대조 필요", "class": "㉯ 남이 고쳐야 풀림", - "class_why": "⚠ 원문 md 의심 — 몸 줄이 앞 표와 똑같음 · 코덱스 PDF 대조" - }, - "F0342": { - "section": "12-9-1", - "master": "requirement", - "why": "수량 칸이 비어 있음 — 원문에 값 없음(「반중력식 옹벽 참조」)", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0343": { - "section": "12-9-2", - "master": "requirement", - "why": "수량 칸이 비어 있음 — 원문에 값 없음", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" - }, - "F0344": { - "section": "12-9-3", - "master": "requirement", - "why": "수량 칸이 비어 있음 — 원문에 값 없음", - "class": "㉮ 영영 할 일 아님", - "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠" + "class_why": "⚠ 원문 md 의심 — 몸 줄이 앞 표와 똑같음 · 코덱스 PDF 대조", + "owner": "랩탑 서브", + "owner_ask": "PDF ↔ md 대조 — 이 표의 **몸 줄이 앞 표와 똑같음**. PDF 로 어느 쪽이 맞는지 짚어 줄 것" }, "F0405": { "section": "13-4-1", @@ -571,120 +385,7 @@ "class_why": "증가율(%) 표 — requirement 가 맞는지 사람 확인" } }, - "cost_rule": { - "F0369": { - "section": "12-22", - "master": "sub_requirement", - "md_rows": [ - [ - "재료비" - ], - [ - "설치비", - "재료비의 5%" - ] - ], - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - }, - "F0379": { - "section": "12-29", - "master": "requirement", - "md_rows": [ - [ - "재료비", - "", - "필요수량" - ], - [ - "설치비", - "재료비의 5%" - ] - ], - "why": "⚠ 같은 꼴 6표는 reference 인데 이것만 requirement — 설치비 = 재료비의 5%", - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - }, - "F0382": { - "section": "12-31", - "master": "sub_requirement", - "md_rows": [ - [ - "재료비" - ], - [ - "설치비", - "주재료비의 5%" - ] - ], - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - }, - "F0383": { - "section": "12-32", - "master": "sub_requirement", - "md_rows": [ - [ - "재료비", - "P.V.C ∅54m/m" - ], - [ - "설치비", - "주재료비의 10%" - ] - ], - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - }, - "F0386": { - "section": "12-34-2", - "master": "sub_requirement", - "md_rows": [ - [ - "재료비", - "1회 기준 46.1%" - ], - [ - "노무비", - "1회 기준 47.1%" - ] - ], - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - }, - "F0388": { - "section": "12-34-4", - "master": "sub_requirement", - "md_rows": [ - [ - "재료비", - "JOINT FILLER" - ] - ], - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - }, - "F0390": { - "section": "12-36", - "master": "sub_requirement", - "md_rows": [ - [ - "제작비", - "견적처리" - ], - [ - "운송비", - "견적처리" - ], - [ - "설치비", - "견적처리" - ] - ], - "class": "㉮ 영영 할 일 아님", - "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘" - } - }, + "cost_rule": {}, "_갈래": { "잣대": "㉮ 는 집계에서 뺀다 — 영영 할 일이 아닌 것(원문에 없음·거절 자리·판정으로 닫힘). ㉯ 는 남의 몫(코덱스 md 읽기·랩탑 메인 시험). ㉰ 만 사람이 정할 자리다.", "센 날": "2026-09-18", @@ -692,6 +393,413 @@ "㉮ 영영 할 일 아님": 39, "㉯ 남이 고쳐야 풀림": 23, "㉰ 사용자 판단 필요": 7 + }, + "㉯ 주인": { + "랩탑 메인": 22, + "랩탑 서브": 1 + } + }, + "_할일_아님": { + "잣대": "㉮ — **영영 할 일이 아닌 것.** 원문에 없음 · 거절 자리 · 판정으로 닫힘. 바퀴마다 다시 세어지지 않게 갈래에서 **아주 빼** 여기 둔다. ⚠ 지우지는 않는다 — 되짚을 수 있어야 한다.", + "옮긴 날": "2026-09-18", + "셈": { + "basis": 10, + "form": 7, + "form_blind": 10, + "cost_rule": 7 + }, + "줄": { + "basis": { + "F0132": { + "section": "5-22-4", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(일당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "「일당」은 품의 단위(하루에 얼마)라 밑수로 안 받음", + "갈래": "거절 자리" + }, + "F0145": { + "section": "5-28-2", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(일 당)", + "master": null, + "why": "작업조 표(시공량 열이 밑수) — 마스터가 일부러 비움(c3da333e 와 같은 까닭) · 원문 「(일 당)」 은 코덱스 복원(61f35108)", + "class": "㉮ 영영 할 일 아님", + "class_why": "작업조 표 — 밑수가 시공량 열이라 일부러 비움", + "갈래": "거절 자리" + }, + "F0257": { + "section": "9-11-1", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "「일당」 · 계수표", + "갈래": "거절 자리" + }, + "F0338": { + "section": "12-6", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "작업조 표(포장공 3인·시공량)", + "갈래": "거절 자리" + }, + "F0339": { + "section": "12-7-1", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "작업조 표 — 넣으면 호표가 사라짐(2026-09-17 유로폼에서 실증)", + "갈래": "거절 자리" + }, + "F0340": { + "section": "12-7-2", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "위와 같음", + "갈래": "거절 자리" + }, + "F0341": { + "section": "12-8", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "위와 같음", + "갈래": "거절 자리" + }, + "F0395": { + "section": "12-38-3", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일 당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "위와 같음", + "갈래": "거절 자리" + }, + "F0447": { + "section": "13-15-2", + "md": [ + 1.0, + "조" + ], + "md_evidence": "(단위: 인/조)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "「인/조」 — 「조」는 세는 단위가 아님", + "갈래": "거절 자리" + }, + "F0449": { + "section": "13-16-2", + "md": [ + 1.0, + "일" + ], + "md_evidence": "(단위: 일 당)", + "master": null, + "class": "㉮ 영영 할 일 아님", + "class_why": "위와 같음", + "갈래": "거절 자리" + } + }, + "form": { + "F0002": { + "section": "1-2-2", + "master": "reference", + "md_mark": "직공인부", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "그 밖" + }, + "F0007": { + "section": "1-2-7", + "master": "reference", + "md_mark": "㎥", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "그 밖" + }, + "F0038": { + "section": "1-4-26", + "master": "reference", + "md_mark": "적용시공량", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "그 밖" + }, + "F0227": { + "section": "8-6-1", + "master": "reference", + "md_mark": "유효 살포량/1회", + "why": "사람 판정 reference(Forms.py) — 기종별 희석배수별 1회 살포량 계산표", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "그 밖" + }, + "F0257": { + "section": "9-11-1", + "master": "coefficient", + "md_mark": "ℓ", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "거절 자리" + }, + "F0325": { + "section": "11-1", + "master": "reference", + "md_mark": "비계공", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "그 밖" + }, + "F0454": { + "section": "14-2", + "master": "reference", + "md_mark": "작업량", + "class": "㉮ 영영 할 일 아님", + "class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐", + "갈래": "부록 예시" + } + }, + "form_blind": { + "F0046": { + "section": "2-1-1", + "master": "requirement", + "why": "기계별 연료표(천공기 주연료 3ℓ·잡품 95%) — 품 낱말 없음. 같은 모양 F0044·F0045·F0047 은 사람 판정 reference 인데 이것만 requirement", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "그 밖" + }, + "F0062": { + "section": "2-1-12", + "master": "requirement", + "why": "값 칸이 「층적부피에 따라 별도계산」·「〃」 — 숫자 없음", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "원문 부재" + }, + "F0140": { + "section": "5-26-1", + "master": "requirement", + "why": "머리 소실 — 토성×깊이 숫자만 남음(사람 판정: 100㎡당 보통인부)", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "그 밖" + }, + "F0141": { + "section": "5-26-2", + "master": "requirement", + "why": "머리 소실 — 위와 같음", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "그 밖" + }, + "F0142": { + "section": "5-26-3", + "master": "requirement", + "why": "머리 소실 — 위와 같음", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "그 밖" + }, + "F0195": { + "section": "7-14", + "master": "productivity", + "why": "칸이 뭉침(「㎥ 0.06∼0.07 4.8∼6.0」) — 원문 md 가 병합 칸을 못 풂", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "그 밖" + }, + "F0237": { + "section": "8-11", + "master": "productivity", + "why": "작업량이 식 글(「Q = 3.5 ㎥/hr」)", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "그 밖" + }, + "F0342": { + "section": "12-9-1", + "master": "requirement", + "why": "수량 칸이 비어 있음 — 원문에 값 없음(「반중력식 옹벽 참조」)", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "원문 부재" + }, + "F0343": { + "section": "12-9-2", + "master": "requirement", + "why": "수량 칸이 비어 있음 — 원문에 값 없음", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "원문 부재" + }, + "F0344": { + "section": "12-9-3", + "master": "requirement", + "why": "수량 칸이 비어 있음 — 원문에 값 없음", + "class": "㉮ 영영 할 일 아님", + "class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠", + "갈래": "원문 부재" + } + }, + "cost_rule": { + "F0369": { + "section": "12-22", + "master": "sub_requirement", + "md_rows": [ + [ + "재료비" + ], + [ + "설치비", + "재료비의 5%" + ] + ], + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + }, + "F0379": { + "section": "12-29", + "master": "requirement", + "md_rows": [ + [ + "재료비", + "", + "필요수량" + ], + [ + "설치비", + "재료비의 5%" + ] + ], + "why": "⚠ 같은 꼴 6표는 reference 인데 이것만 requirement — 설치비 = 재료비의 5%", + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + }, + "F0382": { + "section": "12-31", + "master": "sub_requirement", + "md_rows": [ + [ + "재료비" + ], + [ + "설치비", + "주재료비의 5%" + ] + ], + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + }, + "F0383": { + "section": "12-32", + "master": "sub_requirement", + "md_rows": [ + [ + "재료비", + "P.V.C ∅54m/m" + ], + [ + "설치비", + "주재료비의 10%" + ] + ], + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + }, + "F0386": { + "section": "12-34-2", + "master": "sub_requirement", + "md_rows": [ + [ + "재료비", + "1회 기준 46.1%" + ], + [ + "노무비", + "1회 기준 47.1%" + ] + ], + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + }, + "F0388": { + "section": "12-34-4", + "master": "sub_requirement", + "md_rows": [ + [ + "재료비", + "JOINT FILLER" + ] + ], + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + }, + "F0390": { + "section": "12-36", + "master": "sub_requirement", + "md_rows": [ + [ + "제작비", + "견적처리" + ], + [ + "운송비", + "견적처리" + ], + [ + "설치비", + "견적처리" + ] + ], + "class": "㉮ 영영 할 일 아님", + "class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘", + "갈래": "그 밖" + } + } + }, + "갈래별": { + "거절 자리": 11, + "그 밖": 18, + "부록 예시": 1, + "원문 부재": 4 } } } diff --git a/resources/tester/test_base_data_source_match.py b/resources/tester/test_base_data_source_match.py index 772c3ab3..d0f8c2ae 100644 --- a/resources/tester/test_base_data_source_match.py +++ b/resources/tester/test_base_data_source_match.py @@ -513,7 +513,16 @@ def current_mismatches(src: dict) -> dict[str, dict]: def load_known() -> dict[str, dict]: - return json.loads(KNOWN.read_text(encoding="utf-8")) + """알려진 어긋남 목록. **「할 일 아님」 칸(`_할일_아님`)도 함께 읽는다.** + + ⚠ 왜 합쳐 읽나 — ㉮(원문에 없음·거절 자리·판정으로 닫힘)는 **바퀴마다 다시 세어지지 않게** + 갈래에서 빼 별도 칸에 둔다(2026-09-18 브레인). 그렇다고 비교에서까지 빠지면 그 줄이 다시 + 「새로 어긋남」으로 빨개진다 — 그래서 **세는 곳에서만 빼고 비교에는 넣는다.** + """ + data = json.loads(KNOWN.read_text(encoding="utf-8")) + for kind, rows in ((data.get("_할일_아님") or {}).get("줄") or {}).items(): + data.setdefault(kind, {}).update(rows) + return data @pytest.fixture(scope="module") diff --git a/resources/tester/test_base_prices_source_match.py b/resources/tester/test_base_prices_source_match.py index cd50179d..e3ab6501 100644 --- a/resources/tester/test_base_prices_source_match.py +++ b/resources/tester/test_base_prices_source_match.py @@ -624,7 +624,16 @@ def current_mismatches(src: dict) -> dict[str, dict]: def load_known() -> dict[str, dict]: - return json.loads(KNOWN.read_text(encoding="utf-8")) + """알려진 어긋남 목록. **「할 일 아님」 칸(`_할일_아님`)도 함께 읽는다.** + + ⚠ 왜 합쳐 읽나 — ㉮(원문에 없음·거절 자리·판정으로 닫힘)는 **바퀴마다 다시 세어지지 않게** + 갈래에서 빼 별도 칸에 둔다(2026-09-18 브레인). 그렇다고 비교에서까지 빠지면 그 줄이 다시 + 「새로 어긋남」으로 빨개진다 — 그래서 **세는 곳에서만 빼고 비교에는 넣는다.** + """ + data = json.loads(KNOWN.read_text(encoding="utf-8")) + for kind, rows in ((data.get("_할일_아님") or {}).get("줄") or {}).items(): + data.setdefault(kind, {}).update(rows) + return data # ── 시험 ──────────────────────────────────────────────────────────────── diff --git a/resources/tester/test_work_item_master_source_match.py b/resources/tester/test_work_item_master_source_match.py index c8992a4c..9acbc363 100644 --- a/resources/tester/test_work_item_master_source_match.py +++ b/resources/tester/test_work_item_master_source_match.py @@ -326,18 +326,52 @@ def current_mismatches(src: dict) -> dict[str, dict]: def load_known() -> dict[str, dict]: - return json.loads(KNOWN.read_text(encoding="utf-8")) + """알려진 어긋남 목록. **「할 일 아님」 칸(`_할일_아님`)도 함께 읽는다.** + + ⚠ 왜 합쳐 읽나 — ㉮(원문에 없음·거절 자리·판정으로 닫힘)는 **바퀴마다 다시 세어지지 않게** + 갈래에서 빼 별도 칸에 둔다(2026-09-18 브레인). 그렇다고 비교에서까지 빠지면 그 줄이 다시 + 「새로 어긋남」으로 빨개진다 — 그래서 **세는 곳에서만 빼고 비교에는 넣는다.** + """ + data = json.loads(KNOWN.read_text(encoding="utf-8")) + for kind, rows in ((data.get("_할일_아님") or {}).get("줄") or {}).items(): + data.setdefault(kind, {}).update(rows) + return data #: 비교에서 뺄 칸 — **사람이 적은 메모**다. 자료가 아니라 설명이라 어긋남 판정에 안 쓴다. #: `class`·`class_why` 는 2026-09-18 에 붙인 갈래(㉮ 영영 아님 · ㉯ 남의 몫 · ㉰ 사용자 판단). -_MEMO_FIELDS = ("why", "class", "class_why", "was") +_MEMO_FIELDS = ("why", "class", "class_why", "was", "owner", "owner_ask", "갈래") def _without_why(entry: dict) -> dict: return {k: v for k, v in entry.items() if k not in _MEMO_FIELDS} +def test_할일_아님_칸이_갈려_있다() -> None: + """㉮ — **영영 할 일이 아닌 것**은 갈래에서 빼 별도 칸에 둔다(2026-09-18 브레인). + + ⚠ 왜 못박나 — 섞여 있으면 바퀴마다 「어긋남」으로 다시 세어져 **없는 할 일이 생긴다.** + ⚠ 지우지는 않는다 — 나중에 「이거 왜 안 했지」 할 때 사유를 보아야 한다. + """ + block = json.loads(KNOWN.read_text(encoding="utf-8")).get("_할일_아님") + assert block, "「할 일 아님」 칸이 없다" + rows = block["줄"] + total = sum(len(v) for v in rows.values()) + assert total == 34 + assert block["갈래별"] == {"거절 자리": 11, "그 밖": 18, "부록 예시": 1, "원문 부재": 4} + for kind, got in rows.items(): + for tid, v in got.items(): + assert str(v.get("class", "")).startswith("㉮"), f"{kind}/{tid}" + assert v.get("class_why"), f"{kind}/{tid} 사유 없음" # 왜 할 일이 아닌지 + assert v.get("갈래") in ("원문 부재", "부록 예시", "거절 자리", "그 밖"), ( + f"{kind}/{tid}" + ) + # 세는 칸에서는 빠지고 비교에는 들어간다 — 그래서 빨개지지 않는다 + merged = load_known() + for kind, got in rows.items(): + assert set(got) <= set(merged[kind]) + + # ── 시험 ──────────────────────────────────────────────────────────────── def test_표_수와_자리(src: dict) -> None: """원문 표가 원본(`pum_forest`)에 같은 차례·같은 줄로 있고, 마스터에 빠짐없이 한 번씩 있음."""