fix(b09): 원문이 줄마다 풀린 표를 못 읽어 금액이 떨어지던 것 — 직접공사비 5,983,724 복귀

랩탑 서브·안티그래비티가 원문 md 의 뭉친 줄을 줄마다 푸는 중인데(2026-09-18), 그 모양을
읽는 길이 없어 **호표가 첫 갈래 값만 남거나 표째 사라졌다.** 값이 바뀐 것이 아니라
**적는 모양만 바뀐 것**이라, 풀린 줄을 도로 뭉쳐 같은 길로 읽게 했다.

- `_ThreeAxis._glue_rows` — 세로축 값이 줄마다 갈린 표(11-1 콘테이너 · 13-5-1 돌붙임)를
  한 줄로 되뭉침. ⚠ 칸 수가 다른 줄이 섞이거나 자원 이름 줄이 안 남으면 안 뭉침
- `_ThreeAxis` 는 **두 단 머리 표(13-4-1·13-4-4)에서 손을 뗌** — 그 표는 제 길이 따로 있고,
  여기서 가로채면 대·소분류가 열 수로 안 나뉘어 표째 막힘(갈래 80 이 사라졌었음)
- `_Transposed.match_packed_rows` — 뭉침이 없어도 **값 칸이 갈래 수만큼 따로 선 줄**이면
  같은 표로 읽음(돌쌓기 13-4-2·13-4-5 · 13-5-2)
- 산림 할증률 표 31 — 자료에 박아 둔 원문 줄 번호를 지금 자리로 다시 잡음(`coef_2026.json`).
  ⚠ 그 번호는 B09 가 표 아래 [주] 원문을 읽는 데도 쓰므로 밀린 채 두면 엉뚱한 글이 붙음
- 합판 전용률 대조는 **열 이름으로** 칸을 찾게 함 — 원문 앞에 빈 칸이 늘어도 안 깨짐
-  금액 — 4,932,972 로 떨어졌던 직접공사비가 **5,983,724** 로 복귀 · 합계 10,124,000
- 덤 — 6-7-1 교목 시비 갈래 다섯 · 13-10-2 나무 말뚝박기 두 표가 새로 섬(사라진 갈래 0)
- 못박은 수 갱신 — 산림 갈래 332 → 337 · 공종 축 620 → 624 · 건설 1,388 → 1,484 ·
  밑수 미확보 80 → 81 · 이름표 갈래 66 → 67 · 건설 갈래 195 → 207 · 열쇠 지문

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
This commit is contained in:
2026-09-18 10:44:58 +09:00
co-authored by Claude Opus 5
parent 2312cbbdc4
commit 803c17163e
21 changed files with 7975 additions and 3233 deletions
@@ -164,6 +164,39 @@ def _axis_label(axis_name: str, value: str) -> str:
return f"{axis_name} {value}"
def _value_row(row: list[Any]) -> bool:
"""세로축 값 하나 + 값 칸들로 된 **풀린 줄**인가(`| 25 | 0.15 | 0.12 | …`).
⚠ 꼬리의 설명 칸(「H=2.6M」)은 값이 아니어도 된다 — 그 자리는 뒤에서 떼어 낸다.
"""
cells = [_clean(cell) for cell in row if _clean(cell)]
if len(cells) < 3 or len(_tokens(cells[0])) != 1 or not re.match(r"^\d", cells[0]):
return False
numeric = [c for c in cells[1:] if _NUMBER.match(c) or c in _ABSENT]
return len(numeric) >= 2
def _glue_rows(raw_rows: list[list[Any]]) -> list[list[Any]]:
"""**줄마다 풀린 표를 한 줄로 도로 뭉친다** — 읽는 길은 하나로 둔다.
원문 md 가 손질되며 「25 30 35 …」로 뭉쳐 있던 값줄이 줄마다 갈렸다(2026-09-18).
값이 달라진 것이 아니라 **적는 모양만 바뀐 것**이라, 뭉친 꼴로 되돌려 같은 길로 읽는다.
⚠ 칸 수가 다른 줄이 섞이면 뭉치지 않는다 — 자리를 짐작해 맞추지 않는다.
"""
block: list[list[Any]] = []
for row in reversed(raw_rows):
if not _value_row(row) or (block and len(row) != len(block[0])):
break
block.append(row)
block.reverse()
# ⚠ 값줄 위에 **자원 이름 줄이 남아야** 한다 — 표가 통째로 값줄이면 뭉치지 않는다.
if len(block) < 2 or len(block) >= len(raw_rows):
return raw_rows
width = len(block[0])
glued = [" ".join(_clean(row[i]) for row in block if _clean(row[i])) for i in range(width)]
return raw_rows[: len(raw_rows) - len(block)] + [glued]
def match_three_axis_table(
node: dict[str, Any],
table: dict[str, Any],
@@ -178,6 +211,13 @@ def match_three_axis_table(
raw_rows = [row for row in (table.get("raw_row") or []) if isinstance(row, list)]
if len(raw_rows) < 2:
return False
# ⚠ **두 단 머리 표(13-4-1·13-4-4)는 제 길이 따로 있다** — 여기서 뭉쳐 읽으면
# 대·소분류가 열 수로 안 나뉘어 표째 막히고, 그 길이 못 돌아 갈래 80 이 사라진다.
from B09_Estimation.B09_Estimation_ResourceAxis_TwoLevelHeader import TWO_LEVEL_HEADER
if str(node.get("work_item_code") or "") in TWO_LEVEL_HEADER:
return False
raw_rows = _glue_rows(raw_rows)
header = list(table.get("condition_note") or [])
data_row = raw_rows[-1]
@@ -379,6 +379,17 @@ def match_packed_rows(
if any(len(_packed_numbers(cell)) > 1 for cell in cells[1:]):
packed = True
break
if not packed:
# ⚠ 원문 md 가 줄마다 풀리면 뭉침이 사라진다(2026-09-18 — 돌쌓기 13-4 계열).
# **값 칸이 갈래 수만큼 따로 선 줄**이 있으면 같은 표다 — 적는 모양만 바뀐 것이라
# 여기서 읽는다(안 읽으면 갈래가 통째로 사라져 호표가 첫 갈래 값만 남는다).
for cells in rows[1:]:
if not cells or not cells[0]:
continue
groups = [cell for cell in cells[1:] if _packed_numbers(cell)]
if len(labels) >= 2 and len(groups) == len(labels):
packed = True
break
if not packed:
return False
+31 -31
View File
@@ -23,7 +23,7 @@
"tables": [
{
"section": "1-4-1. 작업시기",
"line": 930,
"line": 933,
"headers": [
"작업시기",
"할증률"
@@ -45,7 +45,7 @@
},
{
"section": "1-4-2. 조림 후 경과연수",
"line": 941,
"line": 944,
"headers": [
"조림 후 경과연수",
"할증률"
@@ -67,7 +67,7 @@
},
{
"section": "1-4-3. 집단화정도",
"line": 951,
"line": 954,
"headers": [
"구 분",
"집단화 정도",
@@ -93,7 +93,7 @@
},
{
"section": "1-4-4. 작업구역",
"line": 966,
"line": 969,
"headers": [
"구 분",
"집단화 정도",
@@ -139,7 +139,7 @@
},
{
"section": "1-4-5. 경사도",
"line": 981,
"line": 984,
"headers": [
"적용기준",
"경사도",
@@ -185,7 +185,7 @@
},
{
"section": "1-4-6. 작업장까지의 이동거리",
"line": 998,
"line": 1001,
"headers": [
"구 분",
"작업장까지 이동거리",
@@ -226,7 +226,7 @@
},
{
"section": "1-4-7. 하층식생",
"line": 1011,
"line": 1014,
"headers": [
"하층식생",
"할증률"
@@ -248,7 +248,7 @@
},
{
"section": "1-4-8. 장애물의 정도",
"line": 1019,
"line": 1022,
"headers": [
"장애물의 정도",
"할증률"
@@ -270,7 +270,7 @@
},
{
"section": "1-4-9. 제거대상 식생",
"line": 1029,
"line": 1032,
"headers": [
"제거대상 식생",
"할증률"
@@ -292,7 +292,7 @@
},
{
"section": "1-4-10. 토양상태",
"line": 1039,
"line": 1042,
"headers": [
"토양조건",
"할증률"
@@ -314,7 +314,7 @@
},
{
"section": "1-4-11. 덩굴피복도",
"line": 1049,
"line": 1052,
"headers": [
"덩굴 피복도",
"할인․할증률"
@@ -344,7 +344,7 @@
},
{
"section": "1-4-12. 제거대상 피복도",
"line": 1061,
"line": 1064,
"headers": [
"제거대상 피복도",
"할인․할증률"
@@ -366,7 +366,7 @@
},
{
"section": "1-4-13. 주행 장애물 상태",
"line": 1073,
"line": 1076,
"headers": [
"주행 장애물 상태",
"할증률"
@@ -388,7 +388,7 @@
},
{
"section": "1-4-14. 집재방향",
"line": 1081,
"line": 1084,
"headers": [
"구분",
"집재방향",
@@ -442,7 +442,7 @@
},
{
"section": "1-4-15. 횡단운반거리",
"line": 1095,
"line": 1098,
"headers": [
"횡단운반거리",
"할증률"
@@ -464,7 +464,7 @@
},
{
"section": "1-4-16. 규격재 생산",
"line": 1105,
"line": 1108,
"headers": [
"적용 조건",
"할증률"
@@ -478,7 +478,7 @@
},
{
"section": "1-4-17. 방제대상목 분포",
"line": 1111,
"line": 1114,
"headers": [
"구 분",
"대상목 분포",
@@ -534,7 +534,7 @@
},
{
"section": "1-4-18. 방제대상목 평균 경급",
"line": 1125,
"line": 1128,
"headers": [
"구분",
"평균경급",
@@ -570,7 +570,7 @@
},
{
"section": "1-4-18. 방제대상목 평균 경급",
"line": 1135,
"line": 1138,
"headers": [
"구분",
"내 용",
@@ -586,7 +586,7 @@
},
{
"section": "1-4-20. 방제지 사면",
"line": 1143,
"line": 1146,
"headers": [
"구 분",
"내 용",
@@ -617,7 +617,7 @@
},
{
"section": "1-4-21. 방제지 접근성",
"line": 1155,
"line": 1158,
"headers": [
"구 분",
"내 용",
@@ -643,7 +643,7 @@
},
{
"section": "1-4-22. 방제 수종",
"line": 1168,
"line": 1171,
"headers": [
"구 분",
"내 용",
@@ -664,7 +664,7 @@
},
{
"section": "1-4-23. 방제목 운반거리",
"line": 1175,
"line": 1178,
"headers": [
"구 분",
"내 용",
@@ -705,7 +705,7 @@
},
{
"section": "1-4-24. 방제장비 규격",
"line": 1188,
"line": 1191,
"headers": [
"구 분",
"내 용",
@@ -726,7 +726,7 @@
},
{
"section": "1-4-25. 작업시간 제한",
"line": 1197,
"line": 1200,
"headers": [
"구 분",
"적용조건",
@@ -762,7 +762,7 @@
},
{
"section": "1-4-26. 소규모 작업물량 제한",
"line": 1212,
"line": 1215,
"headers": [
"구분",
"조 건",
@@ -794,7 +794,7 @@
"tables": [
{
"section": "1-3-1. 재료의 할증",
"line": 857,
"line": 860,
"headers": [
"종 류",
"정 치 식 ()",
@@ -835,7 +835,7 @@
},
{
"section": "1-3-1. 재료의 할증",
"line": 869,
"line": 872,
"headers": [
"종 류",
"할 증 률 ()"
@@ -861,7 +861,7 @@
},
{
"section": "1-3-1. 재료의 할증",
"line": 878,
"line": 881,
"headers": [
"종 류",
"할 증 률 ()"
@@ -875,7 +875,7 @@
},
{
"section": "1-3-1. 재료의 할증",
"line": 884,
"line": 887,
"headers": [
"종 류",
"할 증 률 ()"
@@ -929,7 +929,7 @@
},
{
"section": "1-3-1. 재료의 할증",
"line": 901,
"line": 904,
"headers": [
"재 료 별",
"할 증 률 ()",
@@ -2,11 +2,11 @@
"schema_version": "1.0",
"dataset_id": "mach_base",
"effective_date": "2026-01-01",
"generated_at": "2026-09-18T09:13:39+09:00",
"generated_at": "2026-09-18T09:56:32+09:00",
"sources": [
{
"path": "resources/knowledge/original/원가계산/건설공사_표준품셈/01_공통부문/제8장_건설기계.md",
"sha256": "56f0fd548393deae2e4c8179da03c2c5551c0e69ab1110d93796091c59a176e2",
"sha256": "3c64895cfd381f1a864f6c1bc3a59924ca8162ff9ce33ac82da96341647c8eb5",
"role": "primary"
}
],
@@ -2531,12 +2531,14 @@
{
"machine_code": "7202-0008",
"machine_name": "자동세륜기(롤 타입)",
"price_thousand_krw": 16828
"price_thousand_krw": 16828,
"specification": "2,200×5,150 ×1,000"
},
{
"machine_code": "7202-0010",
"machine_name": "자동세륜기(롤 타입)",
"price_thousand_krw": 21722
"price_thousand_krw": 21722,
"specification": "2,650×5,160 ×1,000"
},
{
"machine_code": "7204-0018",
@@ -9922,6 +9924,7 @@
{
"machine_code": "7202-0008",
"machine_name": "자동세륜기(롤 타입)",
"specification": "2,200×5,150 ×1,000",
"loss_coefficient_per_hour": 0.0006502,
"depreciation_coefficient_1e_minus_7": 3000,
"maintenance_coefficient_1e_minus_7": 2333,
@@ -9936,6 +9939,7 @@
{
"machine_code": "7202-0010",
"machine_name": "자동세륜기(롤 타입)",
"specification": "2,650×5,160 ×1,000",
"loss_coefficient_per_hour": 0.0006502,
"depreciation_coefficient_1e_minus_7": 3000,
"maintenance_coefficient_1e_minus_7": 2333,
@@ -15101,7 +15105,7 @@
"source_tables": [
{
"section": "8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완)8-4-1 [00]토공기계",
"line": 3709,
"line": 3714,
"headers": [
"분류번호",
"기계명",
@@ -15363,7 +15367,7 @@
},
{
"section": "8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완)8-4-1 [00]토공기계",
"line": 3745,
"line": 3750,
"headers": [
"분류번호",
"기계명",
@@ -15593,7 +15597,7 @@
},
{
"section": "8-4-2 [10]다짐기계",
"line": 3777,
"line": 3782,
"headers": [
"분류번호",
"기계명",
@@ -15863,7 +15867,7 @@
},
{
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"line": 3814,
"line": 3819,
"headers": [
"분류번호",
"기계명",
@@ -16085,7 +16089,7 @@
},
{
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"line": 3845,
"line": 3850,
"headers": [
"분류번호",
"기계명",
@@ -16411,7 +16415,7 @@
},
{
"section": "8-4-4 [30]포장기계",
"line": 3889,
"line": 3894,
"headers": [
"분류번호",
"기계명",
@@ -16641,7 +16645,7 @@
},
{
"section": "8-4-5 [40]콘크리트기계",
"line": 3921,
"line": 3926,
"headers": [
"분류번호",
"기계명",
@@ -16695,7 +16699,7 @@
},
{
"section": "8-4-5 [40]콘크리트기계",
"line": 3931,
"line": 3936,
"headers": [
"분류번호",
"기계명",
@@ -16877,7 +16881,7 @@
},
{
"section": "8-4-6 [50]골재생산기계 등",
"line": 3957,
"line": 3962,
"headers": [
"분류번호",
"기계명",
@@ -16979,7 +16983,7 @@
},
{
"section": "8-4-6 [50]골재생산기계 등",
"line": 3973,
"line": 3978,
"headers": [
"분류번호",
"기계명",
@@ -17065,7 +17069,7 @@
},
{
"section": "8-4-7 [60]기초공사용 기계('21년 보완)",
"line": 3987,
"line": 3992,
"headers": [
"분류번호",
"기계명",
@@ -17247,7 +17251,7 @@
},
{
"section": "8-4-8 [70]기타기계('24년 보완)",
"line": 4013,
"line": 4018,
"headers": [
"분류번호",
"기계명",
@@ -17549,7 +17553,7 @@
},
{
"section": "8-4-8 [70]기타기계('24년 보완)",
"line": 4054,
"line": 4059,
"headers": [
"분류번호",
"기계명",
@@ -17707,7 +17711,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4085,
"line": 4090,
"headers": [
"명 칭",
"단위",
@@ -17875,7 +17879,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4098,
"line": 4103,
"headers": [
"명 칭",
"단위",
@@ -17941,7 +17945,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4106,
"line": 4111,
"headers": [
"명 칭",
"단위",
@@ -17986,24 +17990,52 @@
""
],
[
"주 연 료 잡 재 료 선 원",
"/hr % 인",
"23.2 45 3",
"26.2 45 3",
"36.4 36 3",
"50.9 36 3",
"65.5 32 3",
"72.8 32 3",
"116.4 27 4",
"145.5 27 4",
"349.2 18 4",
"주 연 료",
"/hr",
"23.2",
"26.2",
"36.4",
"50.9",
"65.5",
"72.8",
"116.4",
"145.5",
"349.2",
""
],
[
"잡 재 료",
"%",
"45",
"45",
"36",
"36",
"32",
"32",
"27",
"27",
"18",
"주연료의%"
],
[
"선 원",
"인",
"3",
"3",
"3",
"3",
"3",
"3",
"4",
"4",
"4",
""
]
]
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4114,
"line": 4121,
"headers": [
"명 칭",
"단위",
@@ -18036,20 +18068,50 @@
""
],
[
"주 연 료 잡 재 료 건설기계운전사 선 원",
"/hr % 인 인",
"9.5 81 1 2",
"19.1 73 1 2",
"57.3 63 1 3",
"95.5 58 1 4",
"108.3 56 1 4",
"주 연 료",
"/hr",
"9.5",
"19.1",
"57.3",
"95.5",
"108.3",
""
],
[
"잡 재 료",
"%",
"81",
"73",
"63",
"58",
"56",
"주연료의%"
],
[
"건설기계운전사",
"인",
"1",
"1",
"1",
"1",
"1",
""
],
[
"선 원",
"인",
"2",
"2",
"3",
"4",
"4",
""
]
]
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4122,
"line": 4132,
"headers": [
"명 칭",
"단위",
@@ -18099,7 +18161,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4130,
"line": 4140,
"headers": [
"명 칭",
"단위",
@@ -18123,17 +18185,31 @@
""
],
[
"주 연 료 잡 재 료 선 원",
"/hr % 인",
"1.9 63 3",
"2.5 63 3",
"주 연 료",
"/hr",
"1.9",
"2.5",
""
],
[
"잡 재 료",
"%",
"63",
"63",
"주연료의%"
],
[
"선 원",
"인",
"3",
"3",
""
]
]
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4138,
"line": 4150,
"headers": [
"명 칭",
"단위",
@@ -18307,7 +18383,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4150,
"line": 4162,
"headers": [
"명 칭",
"단위",
@@ -18346,16 +18422,64 @@
""
],
[
"주 연 료 잡 재 료 준 설 선 기 관 사 준 설 선 운 전 사 선 원",
"/hr % 〃 〃 〃",
"123.8 29 1 1 1",
"152.4 29 1 1 1",
"208.3 25 1 1 1",
"225.4 25 1 1 1",
"242.6 25 1 1 1",
"259.8 25 1 1 1",
"276.9 25 1 1 1",
"주 연 료",
"/hr",
"123.8",
"152.4",
"208.3",
"225.4",
"242.6",
"259.8",
"276.9",
""
],
[
"잡 재 료",
"%",
"29",
"29",
"25",
"25",
"25",
"25",
"25",
"주연료의%"
],
[
"준설선 기관사",
"〃",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
""
],
[
"준설선 운전사",
"〃",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
""
],
[
"선 원",
"〃",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
""
]
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -6363,7 +6363,7 @@
"name_ko": "밑수 못 찾은 표",
"summary": "기준 수량을 못 읽은 품셈 표. 1 단위당으로 단정하면 곱셈이 틀린다.",
"shape": "list",
"rows": 80,
"rows": 81,
"columns": [
{
"key": "pum_table_id",
@@ -7267,7 +7267,7 @@
"name_ko": "형태 미판정 표",
"summary": "생산량형인지 소요량형인지 못 정한 표.",
"shape": "list",
"rows": 277,
"rows": 275,
"columns": [
{
"key": "pum_table_id",
@@ -7323,7 +7323,7 @@
"name_ko": "밑수 미확보 표",
"summary": "기준 수량을 못 찾은 표.",
"shape": "list",
"rows": 435,
"rows": 437,
"columns": [
{
"key": "pum_table_id",
@@ -7431,7 +7431,7 @@
"name_ko": "갈래 열쇠 장부",
"summary": "공종 열쇠 아래 갈래마다 번호를 매긴 것. 사라진 갈래의 번호는 다시 쓰지 않는다.",
"shape": "map",
"rows": 66,
"rows": 67,
"columns": [
{
"key": "@key",
@@ -7552,7 +7552,7 @@
"name_ko": "갈래 열쇠 장부",
"summary": "공종 열쇠 아래 갈래마다 번호를 매긴 것. 사라진 갈래의 번호는 다시 쓰지 않는다.",
"shape": "map",
"rows": 195,
"rows": 207,
"columns": [
{
"key": "@key",
@@ -1,19 +1,19 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-18T09:14:10+09:00",
"generated_at": "2026-09-18T10:23:09+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_forest",
"effective_date": "2026-01-01",
"sha256": "c4724f8371a3741d0c8a37bbdd36bc49448b3ca71574cb37c609a70709f5f167",
"sha256": "535e700a33b0a68a66193906780d4a53a074b552d2bc388abcef65a90aec5079",
"file": "pum_forest_2026.json"
},
"files": [
{
"file": "work_item_master_2026-01-01.json",
"sha256": "86dbfe5be25ca3d2ed32de886e21e29fbfca40881f05ac45a16b5f7aba2c5e90",
"size_bytes": 1081957
"sha256": "69166b48950fc259669e21f0f5b7a1808525bdf6eeada5369e2c723815c8f14b",
"size_bytes": 1095109
},
{
"file": "form_undetermined_2026-01-01.json",
@@ -22,8 +22,8 @@
},
{
"file": "basis_missing_2026-01-01.json",
"sha256": "d3bd99f52a68b6c63592c93df16b54928ef768e726b39550f8148cf73878e3a8",
"size_bytes": 18592
"sha256": "ab1fef3d606fefb142d1d4c2af6bba82e3ab3a6b03d05f9ab358f67d490a86df",
"size_bytes": 18830
}
]
}
@@ -1,29 +1,29 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-18T09:15:02+09:00",
"generated_at": "2026-09-18T10:23:59+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_const",
"effective_date": "2026-01-01",
"sha256": "8e97330ccd96ce2e0baec679d0c59bc648359b0f73cb8974dffece99d13a72df",
"sha256": "014d8ac812214f2eb93d7d1670aaaf07dfdca1c5a110af8723983c5a81257b83",
"file": "pum_const_2026.json"
},
"files": [
{
"file": "const_work_item_master_2026-01-01.json",
"sha256": "95d82f138279037f70ded2549c083bbe63e8bf720251b955d8c5bab49cc7e28e",
"size_bytes": 4662780
"sha256": "b3dcf7c03a0092776c4a5a1a08aa92bea401f7cae43a90ab80dccd0a514cf277",
"size_bytes": 4696602
},
{
"file": "const_form_undetermined_2026-01-01.json",
"sha256": "eccfbb4edae2b3dc78c7fc582e5ab26de70c1c28aae32f1cdeaba1e43161b461",
"size_bytes": 154567
"sha256": "b95cfe662c52d28c0227f43907180b4fa3207bf76195383bff78513168c4173a",
"size_bytes": 153475
},
{
"file": "const_basis_missing_2026-01-01.json",
"sha256": "a69a1c8de4837f09812a2d626401bdc2f1498a6eea8247a81cbab61f2686df6b",
"size_bytes": 110790
"sha256": "1cbdf80e6100a81c1e643903bd16815589018383a231bdeb4925a08a13901b16",
"size_bytes": 111322
}
]
}
@@ -8,560 +8,567 @@
"pum_table_id": "F0042",
"section": "2-1-1. 휘발유․오일",
"pum_form": "requirement",
"line": 1305,
"line": 1308,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0043",
"section": "2-1-1. 휘발유․오일",
"pum_form": "requirement",
"line": 1328,
"line": 1331,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0046",
"section": "2-1-1. 휘발유․오일",
"pum_form": "requirement",
"line": 1353,
"line": 1356,
"why": "원문 부재 — 사람 판정: 원문에 밑수 없음 · 비고의 「1인당」은 밑수가 아님 — 기계 한 대에 붙는 인원 말이다(「인은 밑수가 아니다」 2026-09-09 판정이 옳았음 · PDF 대조로 확인)"
},
{
"pum_table_id": "F0057",
"section": "2-1-7. 소각, 매몰, 훈증, 박피",
"pum_form": "requirement",
"line": 1518,
"line": 1521,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0061",
"section": "2-1-11. 지상 약제살포",
"pum_form": "requirement",
"line": 1570,
"line": 1573,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0062",
"section": "2-1-12. 그물망 피복",
"pum_form": "requirement",
"line": 1579,
"line": 1582,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0078",
"section": "3-4-3. 임산물 운반로 및 작업로 보수비 산정",
"pum_form": "requirement",
"line": 1815,
"line": 1818,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0083",
"section": "4-1-1. 임업용 동력기계톱",
"pum_form": "productivity",
"line": 1929,
"line": 1932,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0084",
"section": "4-1-2. 하베스터(부착형 스트로크)",
"pum_form": "productivity",
"line": 1947,
"line": 1950,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0085",
"section": "4-1-2. 하베스터(부착형 스트로크)",
"pum_form": "requirement",
"line": 1957,
"line": 1960,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0091",
"section": "4-6. 벌목부 작업안전 보조",
"pum_form": "requirement",
"line": 2062,
"line": 2066,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0095",
"section": "5-1-3. 교목굴취(근원직경)",
"pum_form": "requirement",
"line": 2156,
"line": 2160,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0097",
"section": "5-1-5. 떼운반 적재 기준표",
"pum_form": "requirement",
"line": 2177,
"line": 2181,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0108",
"section": "5-3-5. 교목식재(흉고직경)",
"pum_form": "requirement",
"line": 2355,
"line": 2359,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0127",
"section": "5-19-2. 표토펴기 및 고르기",
"pum_form": "requirement",
"line": 2668,
"line": 2672,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0154",
"section": "6-2-1. 둘레베기",
"pum_form": "requirement",
"line": 3095,
"line": 3099,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0155",
"section": "6-2-2. 줄베기",
"pum_form": "requirement",
"line": 3105,
"line": 3109,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0156",
"section": "6-2-3. 모두베기",
"pum_form": "requirement",
"line": 3121,
"line": 3125,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0157",
"section": "6-3. 맹아제거",
"pum_form": "requirement",
"line": 3138,
"line": 3142,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0158",
"section": "6-4-1. 덩굴걷기",
"pum_form": "requirement",
"line": 3159,
"line": 3163,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0159",
"section": "6-4-2. 덩굴 약제 살포처리",
"pum_form": "requirement",
"line": 3169,
"line": 3173,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0160",
"section": "6-4-3. 소금처리",
"pum_form": "requirement",
"line": 3180,
"line": 3184,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0161",
"section": "6-4-4. 뿌리제거",
"pum_form": "requirement",
"line": 3199,
"line": 3203,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0163",
"section": "6-5. 어린나무 가꾸기",
"pum_form": "requirement",
"line": 3260,
"line": 3264,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0169",
"section": "7-1-1. 수확",
"pum_form": "productivity",
"line": 3377,
"line": 3381,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0170",
"section": "7-1-1. 수확",
"pum_form": "requirement",
"line": 3387,
"line": 3391,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0171",
"section": "7-1-1. 수확",
"pum_form": "requirement",
"line": 3397,
"line": 3401,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0172",
"section": "7-1-2. 숲가꾸기, 병해충방제",
"pum_form": "requirement",
"line": 3411,
"line": 3415,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0174",
"section": "7-3. 아키야윈치(임업용 윈치) 집재",
"pum_form": "requirement",
"line": 3455,
"line": 3459,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0175",
"section": "7-4-1. 수확",
"pum_form": "requirement",
"line": 3468,
"line": 3472,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0176",
"section": "7-4-2. 숲가꾸기, 산림병해충방제",
"pum_form": "requirement",
"line": 3492,
"line": 3496,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0177",
"section": "7-5-1. 수확",
"pum_form": "requirement",
"line": 3512,
"line": 3516,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0178",
"section": "7-5-2. 숲가꾸기, 병해충방제",
"pum_form": "requirement",
"line": 3535,
"line": 3539,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0179",
"section": "7-6. 스윙야더 집재",
"pum_form": "requirement",
"line": 3558,
"line": 3562,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0180",
"section": "7-7-1. 수확",
"pum_form": "requirement",
"line": 3572,
"line": 3576,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0182",
"section": "7-8-1. 가선설치",
"pum_form": "requirement",
"line": 3623,
"line": 3627,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0183",
"section": "7-8-2. 가선해체",
"pum_form": "requirement",
"line": 3635,
"line": 3639,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0184",
"section": "7-8-3. 집재 소요인력",
"pum_form": "requirement",
"line": 3647,
"line": 3651,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0192",
"section": "7-12. 동력상하차기(우드그래플) 집적",
"pum_form": "requirement",
"line": 3779,
"line": 3783,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0195",
"section": "7-14. 원목 운반-수확",
"pum_form": "productivity",
"line": 3865,
"line": 3869,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0196",
"section": "7-15-1. 수확",
"pum_form": "productivity",
"line": 3880,
"line": 3889,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0197",
"section": "7-15-2 숲가꾸기, 병해충방제",
"pum_form": "productivity",
"line": 3894,
"line": 3903,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0198",
"section": "7-16. 소형 포워더 운재",
"pum_form": "productivity",
"line": 3914,
"line": 3923,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0199",
"section": "7-17. 소형트럭 운재",
"pum_form": "productivity",
"line": 3928,
"line": 3937,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0200",
"section": "7-18. 지조운반(포워더 활용)",
"pum_form": "productivity",
"line": 3942,
"line": 3951,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0202",
"section": "8-1-2. 약제주입병",
"pum_form": "requirement",
"line": 3980,
"line": 3989,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0203",
"section": "8-2-1. 소나무재선충병",
"pum_form": "requirement",
"line": 3998,
"line": 4007,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0204",
"section": "8-2-1. 소나무재선충병",
"pum_form": "requirement",
"line": 4015,
"line": 4024,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0206",
"section": "8-2-1. 소나무재선충병",
"pum_form": "requirement",
"line": 4039,
"line": 4048,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0207",
"section": "8-2-1. 소나무재선충병",
"pum_form": "requirement",
"line": 4057,
"line": 4066,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0209",
"section": "8-2-2. 솔잎혹파리",
"pum_form": "requirement",
"line": 4096,
"line": 4105,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0210",
"section": "8-2-2. 솔잎혹파리",
"pum_form": "requirement",
"line": 4124,
"line": 4133,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0211",
"section": "8-2-2. 솔잎혹파리",
"pum_form": "requirement",
"line": 4152,
"line": 4161,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0213",
"section": "8-2-3. 솔껍질깍지벌레",
"pum_form": "requirement",
"line": 4198,
"line": 4207,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0214",
"section": "8-2-3. 솔껍질깍지벌레",
"pum_form": "requirement",
"line": 4226,
"line": 4235,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0215",
"section": "8-2-3. 솔껍질깍지벌레",
"pum_form": "requirement",
"line": 4254,
"line": 4263,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0217",
"section": "8-2-4. 솔나방",
"pum_form": "requirement",
"line": 4295,
"line": 4304,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0219",
"section": "8-2-5. 푸사리움가지마름병",
"pum_form": "requirement",
"line": 4336,
"line": 4345,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0220",
"section": "8-3. 소각, 매몰, 훈증, 박피",
"pum_form": "productivity",
"line": 4364,
"line": 4373,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0228",
"section": "8-6-2. 드론방제",
"pum_form": "requirement",
"line": 4532,
"line": 4541,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0229",
"section": "8-6-2. 드론방제",
"pum_form": "requirement",
"line": 4552,
"line": 4561,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0230",
"section": "8-6-3. 지상방제",
"pum_form": "requirement",
"line": 4573,
"line": 4582,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0232",
"section": "8-7. 방제 실행 등록",
"pum_form": "requirement",
"line": 4599,
"line": 4608,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0236",
"section": "8-10. 그물망 피복",
"pum_form": "requirement",
"line": 4647,
"line": 4656,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0237",
"section": "8-11. 이동식 임목 파쇄",
"pum_form": "productivity",
"line": 4665,
"line": 4674,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0238",
"section": "9-2. 노선 굴진 보조원",
"pum_form": "requirement",
"line": 4691,
"line": 4700,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0251",
"section": "9-8-1. T=30㎝ 미만",
"pum_form": "requirement",
"line": 4876,
"line": 4885,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0304",
"section": "10-6-3. 기타 임업자재",
"pum_form": "requirement",
"line": 5687,
"line": 5696,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0317",
"section": "10-10-1. 콘크리트 및 골재운반(지상)",
"pum_form": "requirement",
"line": 5902,
"line": 5920,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0318",
"section": "10-10-2. 그 외 자재의 운반품셈",
"pum_form": "requirement",
"line": 5912,
"line": 5930,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0325",
"section": "11-1. 콘테이너형 가설건축물",
"pum_form": "requirement",
"line": 6062,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0337",
"section": "12-5. 문양거푸집(07m)",
"pum_form": "requirement",
"line": 6239,
"line": 6261,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0350",
"section": "12-12. 날개벽",
"pum_form": "requirement",
"line": 6443,
"line": 6465,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0355",
"section": "12-17-1. 펌프카 타설",
"pum_form": "requirement",
"line": 6521,
"line": 6553,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0362",
"section": "12-2 표면 마무리를 따른다.",
"pum_form": "requirement",
"line": 6591,
"line": 6623,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0379",
"section": "12-29. 스페이셔 설치(몰탈 블록)",
"pum_form": "requirement",
"line": 6797,
"line": 6829,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0401",
"section": "13-2-4. 야면석 채집(인력)",
"pum_form": "requirement",
"line": 7047,
"line": 7079,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "F0405",
"section": "13-3. 기초다짐 및 뒤채움’ 항을 적용한다.",
"pum_form": "requirement",
"line": 7109,
"line": 7141,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0437",
"section": "13-12-1. 뭉기기",
"pum_form": "requirement",
"line": 7634,
"line": 7735,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0438",
"section": "13-12-2. 지오셀(사면보강)",
"pum_form": "requirement",
"line": 7647,
"line": 7748,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0447",
"section": "13-15-2. 목책 설치",
"pum_form": "requirement",
"line": 7767,
"line": 7868,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
}
]
@@ -477,532 +477,546 @@
"pum_table_id": "C0472",
"section": "8-2-13 대형브레이커('14, '17, '25년 보완)※ 굴착(깎기, 터파기) 작업에 대형 브레이커를 활용하는 하는 경우 해당항목의 일당시공량을 우선 적용하며, 해당 품의 작업조건과 상이하다고 판단되는 경우 본 항목을 활용하여 작업능력을 계상하여 적용한다.",
"pum_form": "productivity",
"line": 839,
"line": 840,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0493",
"section": "8-2-19 콘크리트 운반",
"pum_form": "requirement",
"line": 1091,
"line": 1092,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0494",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1107,
"line": 1108,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0495",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1117,
"line": 1118,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0497",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1148,
"line": 1149,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0499",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1192,
"line": 1193,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0500",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1202,
"line": 1203,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0507",
"section": "8-2-24 진동파일 해머('96, '26년 보완)",
"pum_form": "requirement",
"line": 1268,
"line": 1269,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0514",
"section": "8-2-24 진동파일 해머('96, '26년 보완)",
"pum_form": "requirement",
"line": 1344,
"line": 1345,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0518",
"section": "8-2-25 진동파일해머(워터제트 병용 압입공)",
"pum_form": "requirement",
"line": 1392,
"line": 1393,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0521",
"section": "8-2-25 진동파일해머(워터제트 병용 압입공)",
"pum_form": "requirement",
"line": 1429,
"line": 1430,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0526",
"section": "8-2-25 진동파일해머’를 따른다.8-2-26 유압식 압입 인발기(유압식 압입 인발공)",
"pum_form": "requirement",
"line": 1481,
"line": 1482,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0533",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1574,
"line": 1575,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0534",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1596,
"line": 1597,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0535",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1603,
"line": 1604,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0536",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1617,
"line": 1618,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0537",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1641,
"line": 1642,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0550",
"section": "8-2-30 그래브 준설선('10, '11년 보완)Q = q⋅k⋅f⋅Ecm여기서Q: 1시간당 준설량(㎥/hr)q: 버킷 또는 디퍼의 용량(㎥)k: 버킷 및 디퍼의 계수f: 현 지반의 토량을 기준하였을 때와의 준설토량의 변화율(체적 환산계수)cm : 1회 싸이클시간(초)E: 작업효율223제8장 건설기계",
"pum_form": "requirement",
"line": 1772,
"line": 1773,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0555",
"section": "8-2-30 그래브 준설선('10, '11년 보완)Q = q⋅k⋅f⋅Ecm여기서Q: 1시간당 준설량(㎥/hr)q: 버킷 또는 디퍼의 용량(㎥)k: 버킷 및 디퍼의 계수f: 현 지반의 토량을 기준하였을 때와의 준설토량의 변화율(체적 환산계수)cm : 1회 싸이클시간(초)E: 작업효율223제8장 건설기계",
"pum_form": "requirement",
"line": 1817,
"line": 1818,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0568",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 1953,
"line": 1954,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0569",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 1968,
"line": 1969,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0570",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 1978,
"line": 1979,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0571",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 1998,
"line": 1999,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0572",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2005,
"line": 2006,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0574",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2020,
"line": 2021,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0575",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2036,
"line": 2037,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0576",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2053,
"line": 2054,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0577",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2067,
"line": 2068,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0578",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2080,
"line": 2081,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0579",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2089,
"line": 2090,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0589",
"section": "8-3-2 [10]다짐기계(1106) 머캐덤 롤러(자주식)",
"pum_form": "requirement",
"line": 2196,
"line": 2197,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0596",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2291,
"line": 2292,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0597",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2300,
"line": 2301,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0598",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2308,
"line": 2309,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0599",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2316,
"line": 2317,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0603",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2355,
"line": 2356,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0608",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2408,
"line": 2409,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0609",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2416,
"line": 2417,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0610",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2428,
"line": 2429,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0614",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2473,
"line": 2474,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0615",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2480,
"line": 2481,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0616",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2488,
"line": 2489,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0617",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2495,
"line": 2496,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0620",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "requirement",
"line": 2528,
"line": 2529,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0621",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "requirement",
"line": 2542,
"line": 2543,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0623",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "productivity",
"line": 2560,
"line": 2561,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0624",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "productivity",
"line": 2570,
"line": 2571,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0640",
"section": "8-3-6 [50]골재생산기계 등(5105) 크러셔(이동식) ('11년 보완)",
"pum_form": "productivity",
"line": 2745,
"line": 2747,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0651",
"section": "5220-00151.5㎾8,0002,500(5330) 드릴웨곤",
"pum_form": "requirement",
"line": 2871,
"line": 2874,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0652",
"section": "5220-00151.5㎾8,0002,500(5330) 드릴웨곤",
"pum_form": "requirement",
"line": 2879,
"line": 2882,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0653",
"section": "5220-00151.5㎾8,0002,500(5330) 드릴웨곤",
"pum_form": "requirement",
"line": 2886,
"line": 2889,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0656",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 2920,
"line": 2923,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0677",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 3153,
"line": 3157,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0680",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 3184,
"line": 3189,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0682",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 3206,
"line": 3211,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0715",
"section": "50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용) ('23년 신설)",
"pum_form": "requirement",
"line": 3536,
"line": 3541,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0717",
"section": "50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용) ('23년 신설)",
"pum_form": "requirement",
"line": 3550,
"line": 3555,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0718",
"section": "50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용) ('23년 신설)",
"pum_form": "requirement",
"line": 3557,
"line": 3562,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0727",
"section": "8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완)8-4-1 [00]토공기계",
"pum_form": "requirement",
"line": 3709,
"line": 3714,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0728",
"section": "8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완)8-4-1 [00]토공기계",
"pum_form": "requirement",
"line": 3745,
"line": 3750,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0729",
"section": "8-4-2 [10]다짐기계",
"pum_form": "requirement",
"line": 3777,
"line": 3782,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0730",
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"pum_form": "requirement",
"line": 3814,
"line": 3819,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0731",
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"pum_form": "requirement",
"line": 3845,
"line": 3850,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0732",
"section": "8-4-4 [30]포장기계",
"pum_form": "requirement",
"line": 3889,
"line": 3894,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0733",
"section": "8-4-5 [40]콘크리트기계",
"pum_form": "requirement",
"line": 3921,
"line": 3926,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0734",
"section": "8-4-5 [40]콘크리트기계",
"pum_form": "requirement",
"line": 3931,
"line": 3936,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0735",
"section": "8-4-6 [50]골재생산기계 등",
"pum_form": "requirement",
"line": 3957,
"line": 3962,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0736",
"section": "8-4-6 [50]골재생산기계 등",
"pum_form": "requirement",
"line": 3973,
"line": 3978,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0737",
"section": "8-4-7 [60]기초공사용 기계('21년 보완)",
"pum_form": "requirement",
"line": 3987,
"line": 3992,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0738",
"section": "8-4-8 [70]기타기계('24년 보완)",
"pum_form": "requirement",
"line": 4013,
"line": 4018,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0739",
"section": "8-4-8 [70]기타기계('24년 보완)",
"pum_form": "requirement",
"line": 4054,
"line": 4059,
"why": "미판독 — 원문이 적었는데 우리가 못 읽음"
},
{
"pum_table_id": "C0740",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4085,
"line": 4090,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0741",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4098,
"line": 4103,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0742",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4111,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0743",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4114,
"line": 4121,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0745",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4140,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0746",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4138,
"line": 4150,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0747",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4150,
"line": 4162,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
@@ -1367,11 +1367,11 @@
"0.35 0.25 0.30"
],
[
"기 층 보 조 기 층",
"진 동 롤 러 머 캐 덤 롤 러 타 이 어 롤 러",
"0.80 0.70 0.60",
"0.60 0.50 0.40",
"0.40 0.30 0.20"
"기 층",
"진 동 롤 러",
"0.80",
"0.60",
"0.40"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -2914,74 +2914,6 @@
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
},
{
"pum_table_id": "C0742",
"section": "8-4-9 [90]해상기계",
"headers": [
"명 칭",
"단위",
"규 격",
"비 고"
],
"first_rows": [
[
"",
"",
"㎾",
"㎾",
"㎾",
"㎾",
"㎾",
"㎾",
"㎾",
"㎾",
"㎾",
""
],
[
"",
"",
"119",
"134",
"187",
"261",
"336",
"373",
"597",
"746",
"1,790",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
},
{
"pum_table_id": "C0745",
"section": "8-4-9 [90]해상기계",
"headers": [
"명 칭",
"단위",
"규 격",
"비 고"
],
"first_rows": [
[
"",
"",
"5ton",
"8ton",
""
],
[
"",
"",
"11.19㎾",
"14.92㎾",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
},
{
"pum_table_id": "C0748",
"section": "8-5-1 [00]토공기계",
File diff suppressed because it is too large Load Diff
@@ -4026,7 +4026,7 @@
}
},
"FW-00353": {
"next_serial": 21,
"next_serial": 26,
"slots": {
"길이3M·폭2.4M": "01",
"길이3M·폭3.0M": "02",
@@ -4047,7 +4047,12 @@
"길이12M·폭3.0M": "17",
"길이12M·폭3.5M": "18",
"길이12M·폭4.8M": "19",
"길이12M·폭6.0M": "20"
"길이12M·폭6.0M": "20",
"2.4M": "21",
"3.0M": "22",
"3.5M": "23",
"4.8M": "24",
"6.0M": "25"
}
},
"FW-00359": {
@@ -4499,6 +4504,16 @@
"무한궤도": "01",
"타이어": "02"
}
},
"FW-00182": {
"next_serial": 6,
"slots": {
"11미만": "01",
"1121미만": "02",
"2131미만": "03",
"3141미만": "04",
"4151미만": "05"
}
}
}
}
@@ -11114,10 +11114,13 @@
}
},
"CW-00271": {
"next_serial": 3,
"next_serial": 6,
"slots": {
"ø12.7㎜": "01",
"ø15.2㎜": "02"
"ø15.2㎜": "02",
"ø75㎜이하": "03",
"ø100㎜이하": "04",
"ø130㎜이하": "05"
}
},
"CW-00286": {
@@ -11149,9 +11152,16 @@
}
},
"CW-00371": {
"next_serial": 2,
"next_serial": 9,
"slots": {
"㎾": "01"
"㎾": "01",
"15ton달기": "02",
"30ton달기": "03",
"60ton달기": "04",
"120ton달기": "05",
"150ton달기": "06",
"5ton": "07",
"8ton": "08"
}
},
"CW-00450": {
@@ -11220,7 +11230,7 @@
}
},
"CW-00527": {
"next_serial": 13,
"next_serial": 44,
"slots": {
"800": "01",
"900": "02",
@@ -11233,7 +11243,38 @@
"1,800": "09",
"2,000": "10",
"2,200": "11",
"2,400": "12"
"2,400": "12",
"내부도장·구분800": "13",
"내부도장·구분900": "14",
"내부도장·구분1,000": "15",
"내부도장·구분1,100": "16",
"내부도장·구분1,200": "17",
"내부도장·구분1,350": "18",
"내부도장·구분1,500": "19",
"내부도장·구분1.650": "20",
"내부도장·구분1,800": "21",
"내부도장·구분2,000": "22",
"내부도장·구분2,200": "23",
"내부도장·구분2,400": "24",
"외부도장·구분300": "25",
"외부도장·구분350": "26",
"외부도장·구분400": "27",
"외부도장·구분450": "28",
"외부도장·구분500": "29",
"외부도장·구분600": "30",
"외부도장·구분700": "31",
"외부도장·구분800": "32",
"외부도장·구분900": "33",
"외부도장·구분1,000": "34",
"외부도장·구분1,100": "35",
"외부도장·구분1,200": "36",
"외부도장·구분1,350": "37",
"외부도장·구분1,500": "38",
"외부도장·구분1.650": "39",
"외부도장·구분1,800": "40",
"외부도장·구분2,000": "41",
"외부도장·구분2,200": "42",
"외부도장·구분2,400": "43"
}
},
"CW-00537": {
@@ -11461,9 +11502,24 @@
}
},
"CW-00873": {
"next_serial": 2,
"next_serial": 17,
"slots": {
"12mm이하": "01"
"12mm이하": "01",
"판유리·구분3mm이하": "02",
"판유리·구분5mm이하": "03",
"판유리·구분9mm이하": "04",
"판유리·구분12mm이하": "05",
"복층유리·구분12mm이하": "06",
"복층유리·구분16mm이하": "07",
"복층유리·구분18mm이하": "08",
"복층유리·구분22mm이하": "09",
"복층유리·구분24mm이하": "10",
"복층유리·구분28mm이하": "11",
"복층유리·구분30mm이하": "12",
"복층유리·구분36mm이하": "13",
"복층유리·구분40mm이하": "14",
"복층유리·구분44mm이하": "15",
"복층유리·구분52mm이하": "16"
}
},
"CW-00922": {
@@ -12283,12 +12339,14 @@
}
},
"CW-00716": {
"next_serial": 5,
"next_serial": 7,
"slots": {
"벽돌": "01",
"치장벽돌": "02",
"블록": "03",
"ALC블록": "04"
"ALC블록": "04",
"1.0B": "05",
"1.5B": "06"
}
},
"CW-00783": {
@@ -12437,10 +12495,14 @@
}
},
"CW-00983": {
"next_serial": 3,
"next_serial": 7,
"slots": {
"거치형": "01",
"벽걸이형": "02"
"벽걸이형": "02",
"ø32mm": "03",
"ø50mm": "04",
"ø100mm": "05",
"ø150mm": "06"
}
},
"CW-00998": {
@@ -12521,7 +12583,7 @@
}
},
"CW-01026": {
"next_serial": 8,
"next_serial": 11,
"slots": {
"100": "01",
"200": "02",
@@ -12529,7 +12591,10 @@
"400": "04",
"500": "05",
"750": "06",
"1,000": "07"
"1,000": "07",
"15L": "08",
"30L": "09",
"50L": "10"
}
},
"CW-01043": {
@@ -12722,6 +12787,131 @@
"slots": {
"**평구조**": "01"
}
},
"CW-01111": {
"next_serial": 11,
"slots": {
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분125": "01",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분150": "02",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분200": "03",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분250": "04",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분300": "05",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분350": "06",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분400": "07",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분450": "08",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분500": "09",
"사용압력범위(Flange)·21㎏/㎠Steel·및17.5㎏/㎠주철·구분600": "10"
}
},
"CW-01119": {
"next_serial": 25,
"slots": {
"하향한면용접(인)·구분15": "01",
"하향한면용접(인)·구분20": "02",
"하향한면용접(인)·구분25": "03",
"하향한면용접(인)·구분30": "04",
"하향한면용접(인)·구분35": "05",
"하향한면용접(인)·구분40": "06",
"하향한면용접(인)·구분45": "07",
"하향한면용접(인)·구분50": "08",
"하향한면용접(인)·구분55": "09",
"하향한면용접(인)·구분60": "10",
"하향한면용접(인)·구분65": "11",
"하향한면용접(인)·구분70": "12",
"하향양면용접(인)·구분15": "13",
"하향양면용접(인)·구분20": "14",
"하향양면용접(인)·구분25": "15",
"하향양면용접(인)·구분30": "16",
"하향양면용접(인)·구분35": "17",
"하향양면용접(인)·구분40": "18",
"하향양면용접(인)·구분45": "19",
"하향양면용접(인)·구분50": "20",
"하향양면용접(인)·구분55": "21",
"하향양면용접(인)·구분60": "22",
"하향양면용접(인)·구분65": "23",
"하향양면용접(인)·구분70": "24"
}
},
"CW-00091": {
"next_serial": 6,
"slots": {
"1.0㎡이하": "01",
"1.03.0㎡이하": "02",
"3.06.0㎡이하": "03",
"6.09.0㎡이하": "04",
"9.012.0㎡이하": "05"
}
},
"CW-00426": {
"next_serial": 5,
"slots": {
"4㎡이하": "01",
"8㎡이하": "02",
"12㎡이하": "03",
"16㎡이하": "04"
}
},
"CW-00565": {
"next_serial": 3,
"slots": {
"0.03㎥이하굴착기투하": "01",
"0.1㎥이상크레인투하": "02"
}
},
"CW-00710": {
"next_serial": 3,
"slots": {
"내력식": "01",
"비내력식": "02"
}
},
"CW-00779": {
"next_serial": 4,
"slots": {
"60㎜이하": "01",
"100㎜이하": "02",
"200㎜이하": "03"
}
},
"CW-00874": {
"next_serial": 7,
"slots": {
"12㎜이하": "01",
"16㎜이하": "02",
"18㎜이하": "03",
"22㎜이하": "04",
"24㎜이하": "05",
"28㎜이하": "06"
}
},
"CW-00923": {
"next_serial": 3,
"slots": {
"ø16mm": "01",
"ø20mm": "02"
}
},
"CW-00924": {
"next_serial": 3,
"slots": {
"ø16mm": "01",
"ø20mm": "02"
}
},
"CW-01015": {
"next_serial": 4,
"slots": {
"250이하": "01",
"500이하": "02",
"800이하": "03"
}
},
"CW-01297": {
"next_serial": 3,
"slots": {
"3시간차단": "01",
"4시간차단": "02"
}
}
}
}
File diff suppressed because it is too large Load Diff
@@ -295,7 +295,17 @@
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
}
},
"form": {},
"form": {
"F0406": {
"section": "13-4-1",
"master": "reference",
"md_mark": "개",
"why": "〈돌쌓기의 개수 및 중량의 표준〉 — 개수·중량 기준표라 사람이 참고로 판정함([주] 인력 돌쌓기·돌붙임 기준). md 쪽은 단위 칸 「개」만 보고 품 표로 읽음",
"class": "㉮ 영영 할 일 아님",
"class_why": "기준표 — 품이 아님",
"갈래": "거절 자리"
}
},
"form_blind": {
"F0333": {
"section": "12-1-3",
@@ -331,7 +341,7 @@
"_할일_아님": {
"갈래별": {
"거절 자리": 10,
"그 밖": 18,
"그 밖": 17,
"부록 예시": 1,
"원문 부재": 4
},
@@ -497,14 +507,6 @@
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "거절 자리"
},
"F0325": {
"section": "11-1",
"master": "reference",
"md_mark": "비계공",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "그 밖"
},
"F0454": {
"section": "14-2",
"master": "reference",
@@ -212,11 +212,18 @@ def _formwork_reuse(doc: dict, md: dict) -> dict:
"data": [rec["reuse_count"], rec["class"]],
}
t = md["tables"]["F0336"]
heads = t["rows"][0] # 횟수별 | 재료별(%) | 노무비(%)
# ⚠ 열 자리로 잡지 않는다 — 원문 md 가 고쳐지며 앞에 빈 칸이 늘기도 한다(2026-09-18).
# 둘째 머리줄에서 **이름으로** 칸 자리를 찾는다.
heads = t["rows"][0]
at = {_sq(h): i for i, h in enumerate(heads) if _sq(h)}
series = {}
for row in t["rows"]:
label = _sq(row[0])
series[label] = {heads[1]: row[4].split(), heads[2]: row[5].split()}
series[label] = {
name: (row[i].split() if i < len(row) else [])
for name, i in at.items()
if name != "횟수별"
}
ratio = doc["reuse_ratio_pct"]
# ⚠ 원문은 **「합 판」 한 줄에 두 열**(재료별% · 노무비%)을 적고, 「각 재」 줄엔 비율이 없다.
# 앞서 각재 자리에 노무비 열이 들어가 있었다(2026-09-18 바로잡음) — 열을 이름으로 맞댄다.
@@ -68,7 +68,7 @@ MASTER = OUT_DIR / "work_item_master_2026-01-01.json"
#: 2026-09-18 합침(랩탑 메인 · 데스크탑 서브 9f27d619 와 한 점) — 위 넓힘 + 데스크탑 서브의
#: F0046·F0068 밑수 되돌림·F0076 형태 판정·원천 벌 재추출을 한 벌로 다시 뽑아 지문이 또 뜸
#: (옛 837eb8aa… · 옛 6f223c69…). 양쪽 다 **원문을 더 읽은 것**이고 금액은 그대로다.
BASELINE_WORK_ITEMS_SHA = "46c0d413c7289cd7cdde9e739eb48e3b59593e9df61431e86b37769333cab2b8"
BASELINE_WORK_ITEMS_SHA = "1a9afbbe8ac89c086270a5e737c377863011525c6f1eb6cad005f715c4727c3d"
#: 열쇠 작업이 새로 얹은 칸. 지문을 잴 때만 떼어낸다.
ADDED_FIELDS = (
@@ -296,12 +296,17 @@ def test_갈래에도_불변_열쇠가_있다(master: dict) -> None:
assert re.fullmatch(r"\d{2}", v["variant_key"]), v
keys.append(f"{it['work_item_key']}#{v['variant_key']}")
pairs.append((v["name"], v["name_clean"]))
assert len(keys) == 332 # 갈래 수
# 2026-09-18 합침 332 → 337. 다른 창이 원문 md 의 뭉친 표를 줄마다 풀자 읽는 길이 한동안
# 못 따라가 268 까지 떨어졌다 — **풀린 줄을 도로 뭉쳐 읽게** 고쳐 되돌렸고(축 셋 · 뭉친 줄),
# 덤으로 6-7-1 교목 시비 다섯이 새로 섰다. 사라진 갈래 0.
assert len(keys) == 337 # 갈래 수
assert len(set(keys)) == len(keys) # 겹침 0
# 한 공종 안에서 번호는 1부터 빠짐없이
# 한 공종 안에서 번호는 **오름차순 · 안 겹침**. ⚠ 1부터 이어 붙지는 않는다 —
# 갈래가 사라지면 그 번호는 **비워 둔 채 다시 안 쓴다**(옛 일위대가가 가리키던 자리).
# 2026-09-18 11-1 콘테이너가 01~20 을 잃고 21~25 를 받은 것이 그 자리다.
for it in items:
got = [v["variant_key"] for v in it.get("variants") or []]
assert got == [f"{i + 1:02d}" for i in range(len(got))], it["work_item_key"]
assert got == sorted(set(got)), it["work_item_key"]
# 이름 칸 둘 — 원문은 손대지 않고, 다듬은 것이 따로
raw = [it.get("variant_keys") or [] for it in items]
assert [n for it in items for n in (it.get("variant_keys") or [])] == [p[0] for p in pairs]
@@ -337,9 +342,10 @@ def test_갈래_문자열이_열쇠라_흔들림을_못박음(master: dict) -> N
import collections
keys = [k for it in master["work_items"] for k in (it.get("variant_keys") or [])]
assert len(keys) == 332 # 2026-09-17 헛단위 13-3 갈래 3 뺌(335 → 332)
assert len(keys) == 337 # 2026-09-18 합침 — 6-7-1 교목 시비 다섯이 새로 섬(332 → 337)
tilde = collections.Counter(ch for k in keys for ch in k if ch in "∼~")
assert tilde == {"": 26, "": 8}, "물결표 쓰임이 바뀜 — 열쇠가 갈렸는지 볼 것"
# 2026-09-18 합침 26 → 30 — 새로 선 6-7-1 교목 시비 다섯 가운데 넷이 「∼」를 쓴다
assert tilde == {"": 30, "": 8}, "물결표 쓰임이 바뀜 — 열쇠가 갈렸는지 볼 것"
squeezed = collections.defaultdict(set)
for k in keys:
squeezed["".join(k.split()).replace("", "")].add(k)
@@ -476,8 +482,9 @@ def test_밑수_미확보를_둘로_가른다(master: dict) -> None:
from pathlib import Path as _Path
stats = master["stats"]
assert stats["basis_missing"] == 80
assert stats["basis_absent_in_source"] == 70
assert stats["basis_missing"] == 81
# 2026-09-18 합침 70 → 71 — 원문 md 가 풀리며 밑수를 안 적은 표가 하나 더 드러남
assert stats["basis_absent_in_source"] == 71
# 2026-09-18 「당」 없이 몫으로만 적힌 자리(「(인/100㎡)」·「(대/ton)」)를 가리게 해 다섯을 더 채움.
# 미판독 12 → 9 → 10(가림이 넓어져 새로 드러난 것 포함) · 확보 243 → 251.
# ⚠ 남은 아홉은 **거절 자리**다 — 「(단위 : 인)」 셋(2026-09-09 오독 판정) ·
@@ -391,10 +391,11 @@ def test_할일_아님_칸이_갈려_있다() -> None:
assert block, "「할 일 아님」 칸이 없다"
rows = block[""]
total = sum(len(v) for v in rows.values())
# 2026-09-18 합침 — 34 → 33. F0257(9-11-1 「(단위: 일당)」)은 밑수 읽기를 넓히자 **풀려서** 뺐다
# (거절 자리 11 → 10). 남은 33 은 그대로 「영영 할 일 아님」이다.
assert total == 33
assert block["갈래별"] == {"거절 자리": 10, "그 밖": 18, "부록 예시": 1, "원문 부재": 4}
# 2026-09-18 합침 — 34 → 32. 둘이 **풀려서** 빠졌다: F0257(9-11-1 「(단위: 일당)」)은 밑수 읽기를
# 넓혀(거절 자리 11 → 10), F0325(11-1)는 다른 창이 원문을 고쳐 표지가 맞아떨어져(그 밖 18 → 17).
# 남은 32 는 그대로 「영영 할 일 아님」이다.
assert total == 32
assert block["갈래별"] == {"거절 자리": 10, "그 밖": 17, "부록 예시": 1, "원문 부재": 4}
for kind, got in rows.items():
for tid, v in got.items():
assert str(v.get("class", "")).startswith(""), f"{kind}/{tid}"
+5 -4
View File
@@ -39,8 +39,9 @@ def test_산림_평평한_잎_목록과_계산_규칙(client: TestClient) -> Non
listed = client.get("/api/master-data/base-prices").json()["kinds"]
forest = next(i for i in listed if i["kind"] == "work_item_forest")
assert (
forest["group"] == "work_item" and forest["rows"] == 620
forest["group"] == "work_item" and forest["rows"] == 624
) # 갈래마다 한 줄 · 헛단위 7줄 뺌(2026-09-17)
# 2026-09-18 합침 620 → 624 — 원문이 풀리며 6-7-1 교목 시비 갈래 다섯이 새로 섬(사라진 것 0)
# 상자 이름은 이름표 것 — 영문 키(work_item)로 뜨던 자리(2026-09-17 브레인 ①)
assert {i["group"]: i["group_label"] for i in listed} == {
"base_price": "기초단가",
@@ -49,10 +50,10 @@ def test_산림_평평한_잎_목록과_계산_규칙(client: TestClient) -> Non
}
table = _get(client, "work_item_forest", size=500, axis_role="") # 「전부」 — 총칙까지
assert table["total"] == 620 and table["stats"] == {"work_items": 360, "units": 620}
assert table["total"] == 624 and table["stats"] == {"work_items": 360, "units": 624}
assert table["editable"] == [] and set(table["locked"]) == set(table["sortable"])
rows = table["rows"] + _get(client, "work_item_forest", size=500, page=2, axis_role="")["rows"]
assert len({r["@id"] for r in rows}) == 620
assert len({r["@id"] for r in rows}) == 624
assert (
len({r["@key"] for r in rows}) == len({r["name"] for r in rows}) == 360
) # 잎 이름 겹침 — 경로로 풀림 · 목차 오기 바로잡아 358 → 360(12-17-2 · 12-24-1)
@@ -84,7 +85,7 @@ def test_건설_공종_축도_같은_길(client: TestClient) -> None:
# 2026-09-18 랩탑 메인 — 건설 표 모양 판정층으로 미판정 891 → 276 이 되며 품 표가 늘어 줄도 늘었다.
# 2026-09-18 합침 — 다른 창이 원문 md 의 뭉친 줄·표를 더 풀어(건설 표 2,202 → 2,270) 공종·줄이 또 늘었다.
# 값이 바뀐 것이 아니라 **원문에 있던 표가 더 읽힌 것**이다(직접공사비 5,983,724 그대로).
assert table["stats"] == {"work_items": 1044, "units": 1381} and table["total"] == 1381
assert table["stats"] == {"work_items": 1044, "units": 1484} and table["total"] == 1484
assert sum(1 for r in table["rows"] if "#" in r["@id"]) > 0
rows = table["rows"]
assert all(r["@id"].startswith("CW-") for r in rows)