Merge: 데스크탑 서브(c0b22442 기계 규격 맞대기)와 한 점 — 자료는 다시 뽑음

- 시험 장부는 양쪽을 다 읽어 합침(서브 줄 25 살림) · 자료는 추출기로 다시 뽑음
- `_fuel` 은 내 판(겸용 연료·전력)을 취함 — 서브의 「㎾ 전용은 기름 값 없음」 뜻도 그 안에 담김
- 칸 토막은 서브 `_cells`(빈 칸 = 없음 · `동력` 뗌) 를 쓰되 **코드가 하나면 칸 통째로**
  (`1.87㎾ 휘발유1.3` 처럼 한 값 안에 공백)
- 8-1-7 손료 가산비율 이름 셋은 원문이 글로 뭉개져 이름 칸에 수가 들어앉음 — 목록에 사유로 둠
- 셈 — 건설 표 2,274 · 형태 미판정 166 · 밑수 확보 713 · 미확보 438 · 기계 손료 611 → 620
  · PDF↔md 구멍은 결손 749 · 허구 547 그대로(md 고치는 창 몫)
- 전체 시험 2,445 통과

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 15:00:39 +09:00
co-authored by Claude Opus 5
18 changed files with 3841 additions and 1651 deletions
@@ -2,11 +2,11 @@
"schema_version": "1.0",
"dataset_id": "mach_base",
"effective_date": "2026-01-01",
"generated_at": "2026-09-18T14:10:46+09:00",
"generated_at": "2026-09-18T14:37:18+09:00",
"sources": [
{
"path": "resources/knowledge/original/원가계산/건설공사_표준품셈/01_공통부문/제8장_건설기계.md",
"sha256": "b820290a56d7ebeed9bcdbb8128ccf6ecbaf5de6cc395b2efd8c75a4e99dbc72",
"sha256": "1226d32d580cb40e8ad458784fa6e1d4b6be0d56bc565ce802ed1262d508f4aa",
"role": "primary"
}
],
@@ -1998,7 +1998,8 @@
{
"machine_code": "5220-0015",
"machine_name": "소형브레이커(전기식)",
"price_thousand_krw": 1375
"price_thousand_krw": 1375,
"specification": "1.5㎾"
},
{
"machine_code": "5330-0074",
@@ -3171,7 +3172,8 @@
{
"machine_code": "7995-0050",
"machine_name": "배관파이프",
"price_thousand_krw": 17
"price_thousand_krw": 17,
"specification": "ø50-2.6m"
},
{
"machine_code": "8201-0100",
@@ -3290,37 +3292,44 @@
{
"machine_code": "9020-0022",
"machine_name": "그래브 준설선",
"price_thousand_krw": 724319
"price_thousand_krw": 724319,
"specification": "3.00"
},
{
"machine_code": "9020-0035",
"machine_name": "그래브 준설선",
"price_thousand_krw": 886911
"price_thousand_krw": 886911,
"specification": "5.00"
},
{
"machine_code": "9020-0050",
"machine_name": "그래브 준설선",
"price_thousand_krw": 1227141
"price_thousand_krw": 1227141,
"specification": "6.00"
},
{
"machine_code": "9020-0072",
"machine_name": "그래브 준설선",
"price_thousand_krw": 1948080
"price_thousand_krw": 1948080,
"specification": "7.50"
},
{
"machine_code": "9020-0160",
"machine_name": "그래브 준설선",
"price_thousand_krw": 3672033
"price_thousand_krw": 3672033,
"specification": "12.50"
},
{
"machine_code": "9020-0180",
"machine_name": "그래브 준설선",
"price_thousand_krw": 4131037
"price_thousand_krw": 4131037,
"specification": "16.00"
},
{
"machine_code": "9020-0200",
"machine_name": "그래브 준설선",
"price_thousand_krw": 4623165
"price_thousand_krw": 4623165,
"specification": "25.00"
},
{
"machine_code": "9030-0016",
@@ -8541,6 +8550,14 @@
"source_coefficient_1e_minus_7": 2500,
"economic_life_hours": 3600
},
{
"machine_code": "5220-0015",
"machine_name": "소형브레이커(전기식)",
"specification": "1.5㎾",
"loss_coefficient_per_hour": 0.00025,
"source_coefficient_1e_minus_7": 2500,
"economic_life_hours": 8000
},
{
"machine_code": "5330-0074",
"machine_name": "드릴웨곤",
@@ -11539,6 +11556,13 @@
"loss_coefficient_per_hour": 0.0005313,
"source_coefficient_1e_minus_7": 5313
},
{
"machine_code": "7995-0050",
"machine_name": "배관파이프",
"specification": "ø50-2.6m",
"loss_coefficient_per_hour": 0.0005,
"source_coefficient_1e_minus_7": 5000
},
{
"machine_code": "8201-0100",
"machine_name": "배관파이프시 간 당(10-7)분류번호규 격7995-0050ø50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용)",
@@ -11842,6 +11866,111 @@
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0022",
"machine_name": "그래브 준설선",
"specification": "3.00",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0035",
"machine_name": "그래브 준설선",
"specification": "5.00",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0050",
"machine_name": "그래브 준설선",
"specification": "6.00",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0072",
"machine_name": "그래브 준설선",
"specification": "7.50",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0160",
"machine_name": "그래브 준설선",
"specification": "12.50",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0180",
"machine_name": "그래브 준설선",
"specification": "16.00",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9020-0200",
"machine_name": "그래브 준설선",
"specification": "25.00",
"loss_coefficient_per_hour": 0.00011559999999999999,
"depreciation_coefficient_1e_minus_7": 450,
"maintenance_coefficient_1e_minus_7": 375,
"management_coefficient_1e_minus_7": 331,
"source_coefficient_1e_minus_7": 1156,
"economic_life_hours": 20000,
"annual_standard_hours": 1780,
"depreciation_ratio": 0.9,
"maintenance_ratio": 0.75,
"annual_management_ratio": 0.1
},
{
"machine_code": "9030-0016",
"machine_name": "예 선",
@@ -15125,7 +15254,7 @@
"source_tables": [
{
"section": "8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완)8-4-1 [00]토공기계",
"line": 3735,
"line": 3826,
"headers": [
"분류번호",
"기계명",
@@ -15387,7 +15516,7 @@
},
{
"section": "8-4 운전경비 산정('08, '09, '10, '11, '12, '13, '14, '15, '16, '17년 보완)8-4-1 [00]토공기계",
"line": 3771,
"line": 3862,
"headers": [
"분류번호",
"기계명",
@@ -15617,7 +15746,7 @@
},
{
"section": "8-4-2 [10]다짐기계",
"line": 3803,
"line": 3894,
"headers": [
"분류번호",
"기계명",
@@ -15887,7 +16016,7 @@
},
{
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"line": 3840,
"line": 3931,
"headers": [
"분류번호",
"기계명",
@@ -16109,7 +16238,7 @@
},
{
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"line": 3871,
"line": 3962,
"headers": [
"분류번호",
"기계명",
@@ -16435,7 +16564,7 @@
},
{
"section": "8-4-4 [30]포장기계",
"line": 3915,
"line": 4006,
"headers": [
"분류번호",
"기계명",
@@ -16665,7 +16794,7 @@
},
{
"section": "8-4-5 [40]콘크리트기계",
"line": 3947,
"line": 4038,
"headers": [
"분류번호",
"기계명",
@@ -16719,7 +16848,7 @@
},
{
"section": "8-4-5 [40]콘크리트기계",
"line": 3957,
"line": 4048,
"headers": [
"분류번호",
"기계명",
@@ -16901,7 +17030,7 @@
},
{
"section": "8-4-6 [50]골재생산기계 등",
"line": 3983,
"line": 4074,
"headers": [
"분류번호",
"기계명",
@@ -17003,7 +17132,7 @@
},
{
"section": "8-4-6 [50]골재생산기계 등",
"line": 3999,
"line": 4090,
"headers": [
"분류번호",
"기계명",
@@ -17089,7 +17218,7 @@
},
{
"section": "8-4-7 [60]기초공사용 기계('21년 보완)",
"line": 4013,
"line": 4104,
"headers": [
"분류번호",
"기계명",
@@ -17271,7 +17400,7 @@
},
{
"section": "8-4-8 [70]기타기계('24년 보완)",
"line": 4039,
"line": 4130,
"headers": [
"분류번호",
"기계명",
@@ -17573,7 +17702,7 @@
},
{
"section": "8-4-8 [70]기타기계('24년 보완)",
"line": 4080,
"line": 4171,
"headers": [
"분류번호",
"기계명",
@@ -17731,7 +17860,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4111,
"line": 4202,
"headers": [
"명 칭",
"단위",
@@ -17899,7 +18028,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4124,
"line": 4215,
"headers": [
"명 칭",
"단위",
@@ -18040,7 +18169,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4137,
"line": 4228,
"headers": [
"명 칭",
"단위",
@@ -18130,7 +18259,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4147,
"line": 4238,
"headers": [
"명 칭",
"단위",
@@ -18206,7 +18335,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4158,
"line": 4249,
"headers": [
"명 칭",
"단위",
@@ -18278,7 +18407,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4168,
"line": 4259,
"headers": [
"명 칭",
"단위",
@@ -18326,7 +18455,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4178,
"line": 4269,
"headers": [
"명 칭",
"단위",
@@ -18500,7 +18629,7 @@
},
{
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"line": 4190,
"line": 4281,
"headers": [
"명 칭",
"단위",
@@ -19142,7 +19271,7 @@
},
"parse_audit": {
"unparsed_price_rows": 0,
"unparsed_loss_rows": 10,
"unparsed_loss_rows": 8,
"unparsed_fuel_rows": 0,
"fuel_not_litre_rows": 28
}
File diff suppressed because it is too large Load Diff
@@ -2114,7 +2114,7 @@
"name_ko": "건설품셈 표",
"summary": "표 하나가 한 줄. 머리와 줄을 원문 그대로 담는다.",
"shape": "list",
"rows": 2273,
"rows": 2274,
"columns": [
{
"key": "table_id",
@@ -4920,7 +4920,7 @@
"name_ko": "기계 시간당 손료계수",
"summary": "취득가에 곱해 한 시간 손료를 내는 계수와 그 속을 이루는 상각·정비·관리 몫.",
"shape": "list",
"rows": 611,
"rows": 620,
"columns": [
{
"key": "machine_code",
@@ -7284,7 +7284,7 @@
"name_ko": "형태 미판정 표",
"summary": "생산량형인지 소요량형인지 못 정한 표.",
"shape": "list",
"rows": 168,
"rows": 166,
"columns": [
{
"key": "pum_table_id",
@@ -7569,7 +7569,7 @@
"name_ko": "갈래 열쇠 장부",
"summary": "공종 열쇠 아래 갈래마다 번호를 매긴 것. 사라진 갈래의 번호는 다시 쓰지 않는다.",
"shape": "map",
"rows": 208,
"rows": 209,
"columns": [
{
"key": "@key",
@@ -1,7 +1,7 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-18T13:50:23+09:00",
"generated_at": "2026-09-18T14:37:31+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_forest",
@@ -12,7 +12,7 @@
"files": [
{
"file": "work_item_master_2026-01-01.json",
"sha256": "2ad038b11e121ae8f211a8cbad97b8da7e75623b5551e443816d00c6a4882072",
"sha256": "eba4d71093f730296ff74de519949e8bfb573fea129b45b9be31b763db20307a",
"size_bytes": 1095122
},
{
@@ -1,28 +1,28 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-18T13:51:14+09:00",
"generated_at": "2026-09-18T14:38:23+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_const",
"effective_date": "2026-01-01",
"sha256": "df4de0d8194bc0f30b4078dbfd4b50d3c59d38ee53225e0d8eb056e7b0da9f55",
"sha256": "a777a5a1ba15eaa3c24e8f03aa18e8f74e3ca3db6b2e80ef3f1e2d56a01a249e",
"file": "pum_const_2026.json"
},
"files": [
{
"file": "const_work_item_master_2026-01-01.json",
"sha256": "e79e3fb7311a13c60e2147a1a63135cc7af91faac385cedad54c957a2b9e8694",
"size_bytes": 4718189
"sha256": "717ed8edf3aa8f0ecf38634f28ae0ed8c7f47bffbe3a4ede8af6a279396d9933",
"size_bytes": 4730739
},
{
"file": "const_form_undetermined_2026-01-01.json",
"sha256": "c26b4dffb66b2a352356ec4e9a90607184297e4927a545a31c141370ba8334fc",
"size_bytes": 100578
"sha256": "efda17341aa6fbf4b51f7ce84a34de803256cb8f02b0facadfdb3e047c06cf69",
"size_bytes": 99099
},
{
"file": "const_basis_missing_2026-01-01.json",
"sha256": "03854c4fa9421f70f0decb6c0d89a58b0f21be34616de81e54720cf049013bcb",
"sha256": "1cc0da818a26917bedeeae714ae9b39ea8d64fd38099c0480df0491372e35ea4",
"size_bytes": 115094
}
]
@@ -456,623 +456,623 @@
"pum_table_id": "C0423",
"section": "8-1-3 운반 및 수송('10, '17년 보완)",
"pum_form": "requirement",
"line": 74,
"line": 78,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0428",
"section": "5-3.2-5.5-타 이 어-----3.1-4.0-5.7",
"pum_form": "requirement",
"line": 192,
"line": 205,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(㎥/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0434",
"section": "5-3.2-5.5-타 이 어-----3.1-4.0-5.7",
"pum_form": "requirement",
"line": 272,
"line": 285,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0447",
"section": "8-2-6 모터 스크레이퍼Q = ⋅q⋅f⋅E cm여기서Q: 시간당 작업량(㎥/hr)q: 적재함용적×적재계수(k)f: 체적환산계수E: 작업효율cm : 1회 싸이클 시간",
"pum_form": "productivity",
"line": 446,
"line": 459,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(㎥/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0449",
"section": "8-2-6 모터 스크레이퍼Q = ⋅q⋅f⋅E cm여기서Q: 시간당 작업량(㎥/hr)q: 적재함용적×적재계수(k)f: 체적환산계수E: 작업효율cm : 1회 싸이클 시간",
"pum_form": "productivity",
"line": 485,
"line": 498,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0450",
"section": "8-2-6 모터 스크레이퍼Q = ⋅q⋅f⋅E cm여기서Q: 시간당 작업량(㎥/hr)q: 적재함용적×적재계수(k)f: 체적환산계수E: 작업효율cm : 1회 싸이클 시간",
"pum_form": "requirement",
"line": 493,
"line": 506,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0452",
"section": "8-2-6 모터 스크레이퍼Q = ⋅q⋅f⋅E cm여기서Q: 시간당 작업량(㎥/hr)q: 적재함용적×적재계수(k)f: 체적환산계수E: 작업효율cm : 1회 싸이클 시간",
"pum_form": "requirement",
"line": 516,
"line": 529,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0472",
"section": "8-2-13 대형브레이커('14, '17, '25년 보완)※ 굴착(깎기, 터파기) 작업에 대형 브레이커를 활용하는 하는 경우 해당항목의 일당시공량을 우선 적용하며, 해당 품의 작업조건과 상이하다고 판단되는 경우 본 항목을 활용하여 작업능력을 계상하여 적용한다.",
"pum_form": "productivity",
"line": 861,
"line": 902,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0475",
"section": "8-2-15 법면다짐기",
"pum_form": "productivity",
"line": 900,
"line": 941,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0484",
"section": "8-2-19 콘크리트 운반",
"pum_form": "productivity",
"line": 1012,
"line": 1053,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0491",
"section": "8-2-19 콘크리트 운반",
"pum_form": "productivity",
"line": 1098,
"line": 1139,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0493",
"section": "8-2-19 콘크리트 운반",
"pum_form": "requirement",
"line": 1113,
"line": 1154,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(인/일)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0494",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1129,
"line": 1170,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0495",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1139,
"line": 1180,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0497",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1170,
"line": 1211,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0499",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1214,
"line": 1255,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(인/일)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0500",
"section": "8-2-23 유압 파일 해머",
"pum_form": "requirement",
"line": 1224,
"line": 1265,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0507",
"section": "8-2-24 진동파일 해머('96, '26년 보완)",
"pum_form": "requirement",
"line": 1290,
"line": 1331,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(인/ 일)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0514",
"section": "8-2-24 진동파일 해머('96, '26년 보완)",
"pum_form": "requirement",
"line": 1366,
"line": 1407,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(인/일)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0518",
"section": "8-2-25 진동파일해머(워터제트 병용 압입공)",
"pum_form": "requirement",
"line": 1414,
"line": 1455,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0521",
"section": "8-2-25 진동파일해머(워터제트 병용 압입공)",
"pum_form": "requirement",
"line": 1451,
"line": 1494,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(인/ 일)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0526",
"section": "8-2-25 진동파일해머’를 따른다.8-2-26 유압식 압입 인발기(유압식 압입 인발공)",
"pum_form": "requirement",
"line": 1503,
"line": 1546,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(인/일)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0533",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1596,
"line": 1639,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(㎥/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0534",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1618,
"line": 1661,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0535",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1625,
"line": 1675,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0536",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1639,
"line": 1689,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0537",
"section": "8-2-29 펌프식 준설선('10, '11년 보완)",
"pum_form": "requirement",
"line": 1663,
"line": 1713,
"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": 1794,
"line": 1883,
"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": 1839,
"line": 1930,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0568",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 1975,
"line": 2070,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0569",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 1990,
"line": 2085,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0570",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2000,
"line": 2095,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0571",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2020,
"line": 2115,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0572",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2027,
"line": 2122,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0574",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2042,
"line": 2137,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0575",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2058,
"line": 2153,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0576",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2075,
"line": 2170,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0577",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2089,
"line": 2184,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0578",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2102,
"line": 2197,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0579",
"section": "8-3 기계손료8-3-1 [00]토공기계('19년 보완)(0101) 불도저(무한궤도)",
"pum_form": "requirement",
"line": 2111,
"line": 2206,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0589",
"section": "8-3-2 [10]다짐기계(1106) 머캐덤 롤러(자주식)",
"pum_form": "requirement",
"line": 2218,
"line": 2313,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0596",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2313,
"line": 2408,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0597",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2322,
"line": 2417,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0598",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2330,
"line": 2425,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0599",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2338,
"line": 2433,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0603",
"section": "8-3-3 [20]운반 및 하역기계(2101) 크레인(무한궤도)",
"pum_form": "requirement",
"line": 2377,
"line": 2472,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0608",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2430,
"line": 2525,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0609",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2438,
"line": 2533,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0610",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2450,
"line": 2545,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0614",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2495,
"line": 2590,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0615",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2502,
"line": 2597,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0616",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2510,
"line": 2605,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0617",
"section": "8-3-4 [30]포장기계(3108) 아스팔트 믹싱플랜트",
"pum_form": "requirement",
"line": 2517,
"line": 2612,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0620",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "requirement",
"line": 2550,
"line": 2645,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0621",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "requirement",
"line": 2564,
"line": 2659,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0623",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "productivity",
"line": 2582,
"line": 2677,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0624",
"section": "8-3-5 [40]콘크리트기계(4108) 콘크리트 배치플랜트",
"pum_form": "productivity",
"line": 2592,
"line": 2687,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0640",
"section": "8-3-6 [50]골재생산기계 등(5105) 크러셔(이동식) ('11년 보완)",
"pum_form": "productivity",
"line": 2768,
"line": 2864,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0651",
"section": "5220-00151.5㎾8,0002,500(5330) 드릴웨곤",
"pum_form": "requirement",
"line": 2895,
"line": 2989,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0652",
"section": "5220-00151.5㎾8,0002,500(5330) 드릴웨곤",
"pum_form": "requirement",
"line": 2903,
"line": 2997,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0653",
"section": "5220-00151.5㎾8,0002,500(5330) 드릴웨곤",
"pum_form": "requirement",
"line": 2910,
"line": 3004,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0656",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 2944,
"line": 3038,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0677",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 3178,
"line": 3272,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0680",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 3210,
"line": 3304,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0682",
"section": "8-3-7 [60]기초공사용 기계(6105) 그라우팅 믹서",
"pum_form": "requirement",
"line": 3232,
"line": 3326,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0715",
"section": "50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용) ('23년 신설)",
"pum_form": "requirement",
"line": 3562,
"line": 3654,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0717",
"section": "50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용) ('23년 신설)",
"pum_form": "requirement",
"line": 3576,
"line": 3668,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0718",
"section": "50-2.6m5,0008-3-9 [80]스마트 건설장비(8201) 3D GNSS 머신 가이던스(굴착기용) ('23년 신설)",
"pum_form": "requirement",
"line": 3583,
"line": 3675,
"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": 3735,
"line": 3826,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"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": 3771,
"line": 3862,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0729",
"section": "8-4-2 [10]다짐기계",
"pum_form": "requirement",
"line": 3803,
"line": 3894,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0730",
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"pum_form": "requirement",
"line": 3840,
"line": 3931,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0731",
"section": "8-4-3 [20]운반 및 하역기계('21년 보완)",
"pum_form": "requirement",
"line": 3871,
"line": 3962,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0732",
"section": "8-4-4 [30]포장기계",
"pum_form": "requirement",
"line": 3915,
"line": 4006,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0733",
"section": "8-4-5 [40]콘크리트기계",
"pum_form": "requirement",
"line": 3947,
"line": 4038,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0734",
"section": "8-4-5 [40]콘크리트기계",
"pum_form": "requirement",
"line": 3957,
"line": 4048,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0735",
"section": "8-4-6 [50]골재생산기계 등",
"pum_form": "requirement",
"line": 3983,
"line": 4074,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0736",
"section": "8-4-6 [50]골재생산기계 등",
"pum_form": "requirement",
"line": 3999,
"line": 4090,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0737",
"section": "8-4-7 [60]기초공사용 기계('21년 보완)",
"pum_form": "requirement",
"line": 4013,
"line": 4104,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0738",
"section": "8-4-8 [70]기타기계('24년 보완)",
"pum_form": "requirement",
"line": 4039,
"line": 4130,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0739",
"section": "8-4-8 [70]기타기계('24년 보완)",
"pum_form": "requirement",
"line": 4080,
"line": 4171,
"why": "원문 부재 — 거절 자리: 원문이 적은 것이 '(ℓ/hr)' 라 밑수로 안 받음"
},
{
"pum_table_id": "C0740",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4111,
"line": 4202,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0741",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4124,
"line": 4215,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0742",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4137,
"line": 4228,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0743",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4147,
"line": 4238,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0744",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4158,
"line": 4249,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0745",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4168,
"line": 4259,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0746",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4178,
"line": 4269,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "C0747",
"section": "8-4-9 [90]해상기계(9010) 펌프준설선 ('10, '11년 보완)",
"pum_form": "requirement",
"line": 4190,
"line": 4281,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
@@ -494,15 +494,26 @@
],
"first_rows": [
[
"포 장 도 로 ( 고속4 차선) 포 장 도 로 ( 고속2 차선) 포 장 도 로 사 리 도 로 ( 양 호 ) 사 리 도 로 ( 불 량 )",
"60 50 40 25 10",
"- - 25 15 10",
"- - 30 15 10",
"- - 25 15 10",
"- - 35 25 10",
"- 50 40 25 10",
"- 50 40 20 10",
"- - 25 15 10"
"포 장 도 로 ( 고속4 차선)",
"60",
"-",
"-",
"-",
"-",
"-",
"-",
"-"
],
[
"포 장 도 로 ( 고속2 차선)",
"50",
"-",
"-",
"-",
"-",
"50",
"50",
"-"
]
],
"reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함"
@@ -1524,10 +1535,10 @@
],
[
"진 동 해 머",
"60 ㎾ 90 ㎾ 120㎾",
"40 50 60",
"50 60 80",
"200KVA (250㎾) 300KVA (350㎾) 400KVA (500㎾)",
"60 ㎾",
"40",
"50",
"200KVA (250㎾)",
"250A"
]
],
@@ -1678,11 +1689,11 @@
],
[
"점 성 토",
"0 2 5 10 15 20 30 40",
"1,600 1,600 1,400 1,200 1,200 1,000 1,000 ―",
"2,000 1,800 1,600 1,400 1,200 1,200 1,000 800",
"2,600 2,600 2,200 2,000 1,600 1,600 1,200 1,000",
"3,400 3,400 2,800 2,600 2,000 1,800 1,600 1,200"
"0",
"1,600",
"2,000",
"2,600",
"3,400"
]
],
"reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음"
@@ -1703,9 +1714,9 @@
],
[
"점 토 질 토 사",
"연 니 ( 軟 泥 ) 연 질 보 통 질 경 질 최 경 질 극 경 질",
"4이하 410 1020 2030 3040 4050",
"1.00 0.95 0.90 0.85 0.85 0.80"
"연 니 ( 軟 泥 )",
"4이하",
"1.00"
]
],
"reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음"
@@ -1729,15 +1740,15 @@
],
[
"점 토 질 토 사",
"연 니 연 질 보 통 질 경 질 최 경 질 극 경 질",
"4이하 410 1020 2030 3040 4050",
"0.90 0.95 0.65 - - -",
"0.90 0.95 0.65 - - -",
"0.90 1.00 0.75 0.35 (0.35) (0.35)",
"0.90 1.00 0.80 0.50 (0.50) (0.50)"
"연 니",
"4이하",
"0.90",
"0.90",
"0.90",
"0.90"
]
],
"reason": "단위·밑수·직종 표지 없음 · 값이 규격·치수뿐 — 원문이 품을 안 적음(할 일 아님)"
"reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음"
},
{
"pum_table_id": "C0549",
@@ -1813,25 +1824,25 @@
"first_rows": [
[
"모 래 질 토 사",
"연질 중질 경질",
"10이하 1020 20이상",
"340 305 270",
"340 305 270",
"340 305 270",
"340 300 265",
"335 295 260",
"330 285 250"
"연질",
"10이하",
"340",
"340",
"340",
"340",
"335",
"330"
],
[
"자 갈 섞 인",
"질",
"30이하",
"180",
"180",
"180",
"165",
"160",
"150"
"",
"질",
"1020",
"305",
"305",
"305",
"300",
"295",
"285"
]
],
"reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함"
@@ -1909,42 +1920,6 @@
],
"reason": "단위·밑수·직종 표지 없음 · 머리 두 단 · 값 있음 — 아래 단을 이어 봐도 표지가 없음"
},
{
"pum_table_id": "C2195",
"section": "8-3-6 [50]골재생산기계 등",
"headers": [
"분류 번호",
"규 격",
"내용 시간",
"연간 표준 가동 시간"
],
"first_rows": [
[
"5220-0015",
"1.5㎾",
"8,000",
"2,500"
]
],
"reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함"
},
{
"pum_table_id": "C2201",
"section": "8-3-8 [70]기타기계",
"headers": [
"분류 번호",
"규 격",
"내용 시간"
],
"first_rows": [
[
"7995-0050",
"ø50-2.6m",
"5,000"
]
],
"reason": "단위·밑수·직종 표지 없음 · 값은 있는데 표지가 없음 — 사람이 봐야 함"
},
{
"pum_table_id": "C0847",
"section": "3-2-1 터널굴착 1발파당 싸이클 시간(Cycle Time)",
File diff suppressed because it is too large Load Diff
@@ -12934,6 +12934,14 @@
"slots": {
"㎾": "01"
}
},
"CW-00326": {
"next_serial": 4,
"slots": {
"노체,축제노상": "01",
"보조기층기층": "02",
"표층": "03"
}
}
}
}
@@ -4,7 +4,7 @@
"effective_date": "2026-01-01",
"pum_edition": "2026-01-01",
"toc_edition": "산림청고시제2025-82호",
"generated_at": "2026-09-18T13:50:23+09:00",
"generated_at": "2026-09-18T14:37:31+09:00",
"dataset_version": {
"dataset_id": "pum_forest",
"effective_date": "2026-01-01",
@@ -19,7 +19,8 @@
],
"why": "원문 복잡 구조물 주철근 「6-7」 범위 중 위 끝 7 을 씀 — 범위를 살릴지 사람 확인",
"class": "㉰ 사용자 판단 필요",
"class_why": "원문이 범위 「6~7」 — 위 끝 7 을 쓸지 사람 확인(범위는 자료에 실어 둠)"
"class_why": "원문이 범위 「6~7」 로 적어 두었는데 자료는 위 끝 7 하나만 씀 — **범위를 담는 잣대가 없음**(범위 자체는 자료에 실어 둠). 위 끝을 쓸지 범위를 살릴지 정해야 닫힘.",
"갈래": "잣대"
}
},
"formwork_reuse": {},
@@ -33,10 +34,9 @@
"_갈래": {
"센 날": "2026-09-18",
"셈": {
"㉮ 영영 할 일 아님": 2,
"㉯ 남이 고쳐야 풀림": 0,
"㉰ 사용자 판단 필요": 4
}
"잣대 / ㉰": 1
},
"잣대": "세 갈래 — **원문 부재** 원문에 없음 · **잣대** 우리 잣대가 못 담음 · **남의 몫** 남이 원문·도구를 고쳐야 풀림. 누가 하나는 class(㉮·㉯·㉰)."
},
"_할일_아님": {
"잣대": "㉮ — **영영 할 일이 아닌 것.** 원문에 없음 · 거절 자리 · 판정으로 닫힘. 바퀴마다 다시 세어지지 않게 갈래에서 **아주 빼** 여기 둔다. ⚠ 지우지는 않는다 — 되짚을 수 있어야 한다.",
@@ -17,17 +17,29 @@
"why": "자료 이름이 빔 — 원문 손료표 머리 `(코드) 이름` 엔 이름 있음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"갈래": "잣대 못 알아봄",
"class_why": "제8장 8-3 (8201) 손료표 머리가 글로 뭉개져 기종 이름이 표 밖 글줄에 섞였음 — PDF 대조로 표 머리를 되살려 줄 것. 되살리면 추출기·시험이 저절로 읽음."
},
"셈 연료 원문에 없는 자료 줄": {
"source": 0,
"data": 1,
"why": "원문이 규격을 연료 칸에 밀어 적은 양수기 7993-0020 — 사람이 맞춘 1.3ℓ(휘발유)를 옛 벌에서 이어받음(원문 값 그대로) · 이 시험 읽기는 그 줄을 못 따라감"
"why": "원문이 규격을 연료 칸에 밀어 적은 양수기 7993-0020 — 사람이 맞춘 1.3ℓ(휘발유)를 옛 벌에서 이어받음(원문 값 그대로) · 이 시험 읽기는 그 줄을 못 따라감",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 서브",
"owner_ask": "위와 같음.",
"갈래": "잣대 못 알아봄",
"class_why": "위와 같음."
},
"셈 연료 코드 수": {
"source": 275,
"data": 276,
"why": "원문이 규격을 연료 칸에 밀어 적은 양수기 7993-0020 — 사람이 맞춘 1.3ℓ(휘발유)를 옛 벌에서 이어받음(원문 값 그대로) · 이 시험 읽기는 그 줄을 못 따라감"
"why": "원문이 규격을 연료 칸에 밀어 적은 양수기 7993-0020 — 사람이 맞춘 1.3ℓ(휘발유)를 옛 벌에서 이어받음(원문 값 그대로) · 이 시험 읽기는 그 줄을 못 따라감",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 서브",
"owner_ask": "위 7993-0020 과 한 자리 — 그 줄이 고쳐지면 셈도 맞음.",
"갈래": "잣대 못 알아봄",
"class_why": "위 7993-0020 과 한 자리 — 그 줄이 고쳐지면 셈도 맞음."
},
"손료 8201-0100 machine_name": {
"source": "3D GNSS 머신 가이던스(굴착기용)",
@@ -35,7 +47,27 @@
"why": "자료 이름 칸에 원문 뭉개진 손료 글이 통째로 들어감 — 자료 이름 틀림",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"갈래": "잣대 못 알아봄",
"class_why": "위와 한 자리 — 뭉개진 글이 자료 이름 칸에 통째로 들어갔음."
},
"손료보정 bulldozer_under_19_ton": {
"source": "불도저(19톤이상제외)",
"data": "2510",
"why": "원문 8-1-7 가산비율 표가 글로 뭉개져 이름 칸에 수(`2510`)가 들어앉음 — 25·10 인지 2·510 인지 못 가름(같은 자리를 「손료보정 수 자리 가름」으로 이미 적어 둠). md 가 풀리면 저절로 맞음",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료보정 crawler_excavator_or_loader": {
"source": "굴착기(무한궤도)및로더(무한궤도)",
"data": "2010",
"why": "원문 8-1-7 가산비율 표가 글로 뭉개져 이름 칸에 수(`2510`)가 들어앉음 — 25·10 인지 2·510 인지 못 가름(같은 자리를 「손료보정 수 자리 가름」으로 이미 적어 둠). md 가 풀리면 저절로 맞음",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료보정 dump_truck": {
"source": "덤프트럭",
"data": "2510",
"why": "원문 8-1-7 가산비율 표가 글로 뭉개져 이름 칸에 수(`2510`)가 들어앉음 — 25·10 인지 2·510 인지 못 가름(같은 자리를 「손료보정 수 자리 가름」으로 이미 적어 둠). md 가 풀리면 저절로 맞음",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 7993-0020": {
"source": null,
@@ -47,264 +79,108 @@
"parse_method": "verified_source_row_alignment",
"specification": "1.49㎾"
},
"why": "원문이 규격을 연료 칸에 밀어 적은 양수기 7993-0020 — 사람이 맞춘 1.3ℓ(휘발유)를 옛 벌에서 이어받음(원문 값 그대로) · 이 시험 읽기는 그 줄을 못 따라감"
"why": "원문이 규격을 연료 칸에 밀어 적은 양수기 7993-0020 — 사람이 맞춘 1.3ℓ(휘발유)를 옛 벌에서 이어받음(원문 값 그대로) · 이 시험 읽기는 그 줄을 못 따라감",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 서브",
"owner_ask": "8-4 양수기 7993-0020 주연료 칸에 규격(1.49㎾)이 밀려 들어갔음 — PDF 대조로 휘발유 1.3ℓ 를 제자리에 적어 줄 것.",
"갈래": "잣대 못 알아봄",
"class_why": "8-4 양수기 7993-0020 주연료 칸에 규격(1.49㎾)이 밀려 들어갔음 — PDF 대조로 휘발유 1.3ℓ 를 제자리에 적어 줄 것."
}
},
"material": {},
"oil": {},
"rate": {},
"labor_blind": {
"건설 pdf": {
"what": "3. 개별직종 노임단가.md",
"why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"건설 별칭 이름": {
"what": [
"labor_1001",
"labor_1002",
"labor_1003",
"labor_1007",
"labor_1008",
"labor_1012",
"labor_1013",
"labor_1015",
"labor_1016",
"labor_1017",
"labor_1018",
"labor_1019",
"labor_op_const",
"labor_op_general",
"labor_op_truck"
],
"why": "별칭 이름은 프로그램이 지은 것 — 가리키는 코드가 원문에 있는지만 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 labor_mfg.unit": {
"what": "원문과 안 맞댐",
"why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 labor_rate.unit": {
"what": "원문과 안 맞댐",
"why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"제조 pdf": {
"what": "2026상반기_중소제조업_직종별_임금조사_중소기업중앙회.md",
"why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
}
},
"labor_blind": {},
"machine_blind": {
"손료 계수 칸 없는 표 5220": {
"what": [
"분류 번호",
"규 격",
"내용 시간",
"연간 표준 가동 시간"
],
"why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음",
"규격 빈칸 7430-1300": {
"what": "싱글",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료 계수 칸 없는 표 7995": {
"what": [
"분류 번호",
"규 격",
"내용 시간"
],
"why": "복원 뒤에도 원문 표에 계수 칸이 없음 — 머리 「시 간 당(10-7)」 은 표 위 글줄로만 · 값은 원문에 없음",
"규격 빈칸 7430-1500": {
"what": "드럼",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료 줄 9020-": {
"what": "9020-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
"규격 빈칸 7430-2500": {
"what": "드럼",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료 줄 9030-": {
"what": "9030-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
"규격 빈칸 7431-1300": {
"what": "드럼",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료 줄 9040-": {
"what": "9040-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
"규격 빈칸 7811-0030": {
"what": "엔진",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료 줄 9050-": {
"what": "9050-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
"규격 빈칸 7812-0007": {
"what": "엔진",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료 줄 9060-": {
"what": "9060-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9070-": {
"what": "9070-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9080-": {
"what": "9080-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9090-": {
"what": "9090-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
"규격 빈칸 9030-0240": {
"what": "150ton",
"why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.",
"갈래": "잣대 못 알아봄",
"owner": "랩탑 서브",
"owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남."
},
"손료보정 수 자리 가름": {
"what": "뭉개진 글의 이어 붙은 수(2510)를 통째로 맞댐",
"why": "8-1-7 가산비율 표가 글로 뭉개져 `2510` 처럼 붙음 — 25·10 인지 2·510 인지 못 가름",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_fuel_rate.parse_method": {
"what": "원문과 안 맞댐",
"why": "사람이 손으로 맞춘 줄이라는 표시 — 원문에 없는 칸(2026-09-18 기준 7993-0020 하나)",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_fuel_rate.source_tables.section": {
"what": "원문과 안 맞댐",
"why": "8-4 원표의 절 제목 — 표 차례로 맞대므로 글자는 안 봄(원표 머리·줄은 맞댐)",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_fuel_rate.specification": {
"what": "원문과 안 맞댐",
"why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_loss_coef.loss_coefficient_per_hour": {
"what": "원문과 안 맞댐",
"why": "계산 칸(계 × 10⁻⁷) — 원문 `계`(source_coefficient_1e_minus_7)만 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_loss_coef.note": {
"what": "원문과 안 맞댐",
"why": "데스크탑 서브가 붙인 설명 글 — 값 아님",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_loss_coef.specification": {
"what": "원문과 안 맞댐",
"why": "규격 칸이 한 칸에 여러 값·여러 열로 뭉쳐 가르기 어려움 — 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_operator_map.rules.alias": {
"what": "원문과 안 맞댐",
"why": "프로그램이 지은 이름·출처 표기",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_operator_map.rules.rule_id": {
"what": "원문과 안 맞댐",
"why": "프로그램이 지은 이름·출처 표기",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_operator_map.rules.source_section": {
"what": "원문과 안 맞댐",
"why": "프로그램이 지은 이름·출처 표기",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_price.specification": {
"what": "원문과 안 맞댐",
"why": "가격표엔 규격 칸이 없음(기종·코드·가격만)",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_rock_adj.rules.exception": {
"what": "원문과 안 맞댐",
"why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mach_rock_adj.rules.exclusion": {
"what": "원문과 안 맞댐",
"why": "[주]① 예외 글을 프로그램 말로 옮긴 칸 — 글자로 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 표 5801-0045": {
"codes": [
"5801-0045",
"5801-0045"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7202-0008": {
"codes": [
"7202-0008",
"7202-0008"
],
"why": "원문 8-4 가 코드·값을 한 칸에 뭉쳐 적어 토막 수가 안 맞음 — 시험 읽기가 건너뜀(랩탑 서브 전사 뒤 새로 생긴 자리)",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7202-0010": {
"codes": [
"7202-0010",
"7202-0010"
],
"why": "원문 8-4 가 코드·값을 한 칸에 뭉쳐 적어 토막 수가 안 맞음 — 시험 읽기가 건너뜀(랩탑 서브 전사 뒤 새로 생긴 자리)",
"class": "㉯ 남이 고쳐야 풀림"
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"갈래": "잣대 못 알아봄",
"class_why": "8-1-7 가산비율 표가 글로 뭉개져 `2510` 처럼 붙었음 — 25·10 인지 2·510 인지 PDF 로 갈라 줄 것."
},
"운전사 기종별 판단": {
"what": 121,
"why": "기종→운전사 구분(explicit_mappings)은 사람 판단 — 원문 8-1-3 5호는 기종 이름 글만 있음",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "원문 8-1-3 5호는 기종 이름 글만 두고 운전사 구분을 안 적음 — 기종→운전사 짝(`explicit_mappings`)은 사람이 정한 것. 원문에 견줄 것이 없음.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
}
},
"material_blind": {
"API 스냅숏": {
"what": "나라장터_시설공통자재_2026-08-14.json",
"why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"같은 때 공시 20696249": {
"what": 2,
"why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "같은 공시 일시에 값 실린 공시가 둘인데 **원천이 어느 것을 정본으로 보는지 안 알려 줌** — 자료는 그중 하나와 같음. 어느 것을 취할지 정해야 닫힘.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
@@ -312,13 +188,8 @@
"what": 2,
"why": "같은 공시 일시에 값 실린 공시가 둘 — 원천이 어느 것이 정본인지 안 알려 줌 · 자료는 그중 하나와 같음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 mat_price.price_adopted_reason": {
"what": "원문과 안 맞댐",
"why": "빌더가 적은 까닭 글 — 원문 칸 아님",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "위와 한 자리.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
@@ -330,84 +201,20 @@
],
"why": "철근·레미콘·아스콘은 종합쇼핑몰 원천이 저장소에 없음 — 값 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "철근·레미콘·아스콘은 종합쇼핑몰 원천이 저장소에 없어 값을 볼 수 없음 — 원천을 들여올지 정해야 닫힘.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
}
},
"oil_blind": {
"API 스냅숏": {
"what": [
"유가_전국평균_2026-08-14.json",
"유가_시도별_2026-09-09.json"
],
"why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"시도 거래일": {
"what": "시도별 원천에 거래일 칸이 없음 — 수집일과만 맞댐",
"why": "시도별 원천 줄에 거래일이 없어 `수집일` 로만 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 oil.scope": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 oil.unit": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 oil_regional.scope": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 oil_regional.source_product_name": {
"what": "원문과 안 맞댐",
"why": "시도별 원천에 상품 이름 칸 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 oil_regional.unit": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
}
},
"oil_blind": {},
"rate_blind": {
"processing_rules": {
"what": [
"note",
"owner_supplied_material",
"performance_guarantee_fee",
"profit",
"rounding",
"safety_management_cost",
"scale_bracket"
],
"why": "끝수·산식 처리 규칙 — 코드 규칙이라 원문 대조 대상 아님(거울 시험 몫)",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 rate_environment.forest_road_selection_status": {
"what": "pending",
"why": "임도 공종 선택 미결 표시 — 사용자 협의 몫",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "임도 공종 선택 미결 표시 — 사용자 협의로 닫을 자리.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
@@ -415,27 +222,8 @@
"what": 100000000,
"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": "설명 글",
"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": "데스크탑 서브가 붙인 설명 글 — 값 아님",
"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": "데스크탑 서브가 붙인 설명 글 — 값 아님",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "xlsx 환경보전비 칸에 1억 기준이 없음(1억은 퇴직공제부금 칸) — 근거 원문이 `sources` 에 없어 볼 수 없음. 근거를 들여올지 정해야 닫힘.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
@@ -443,57 +231,334 @@
"what": "not_applicable",
"why": "임도 적용 판단 — 원문 칸 아님",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 rate_safety_base.amount_bracket": {
"what": "500_million_to_5_billion",
"why": "다른 칸을 가리키는 표시 — 값 아님",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 rate_safety_base.embedded_in": {
"what": "rate_safety_pct.brackets",
"why": "다른 칸을 가리키는 표시 — 값 아님",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 rate_safety_pct.base_rule": {
"what": "min_of_two_formulas",
"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) 해석이라 안 맞댐",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 rate_vat.base": {
"what": "construction_cost_before_vat",
"why": "부가세 — 근거(부가가치세법)가 sources 에 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"안 잰 칸 rate_vat.rate_percent": {
"what": 10.0,
"why": "부가세 — 근거(부가가치세법)가 sources 에 없음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"조달청 요약표": {
"what": "2026.04.13_조달청_토목공사_제비율.xlsx",
"why": "xlsx 는 조달청 요약표 — 각 고시 원문과는 안 맞댐(연금만 법령과 맞댐)",
"class": "㉯ 남이 고쳐야 풀림",
"갈래": "원문 부재",
"class_why": "임도에 적용되는지 판단 — 원문 칸이 아님.",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
}
},
"_할일_아님": {
"갈래별": {
"낳은 값": 1,
"메모": 1,
"살림살이": 1,
"요약 이름": 2,
"원문 부재": 25,
"자리 표시": 2,
"프로그램 이름": 2
},
"셈": {
"labor_blind": 5,
"machine_blind": 9,
"material_blind": 2,
"oil_blind": 7,
"rate_blind": 11
},
"옮긴 날": "2026-09-18",
"잣대": "㉮ — **영영 할 일이 아닌 것.** 원문에 없는 말(프로그램 이름·사람 메모·살림살이) · 이미 다른 자리에서 맞대는 것. 바퀴마다 다시 세어지지 않게 갈래에서 아주 빼 여기 둔다. ⚠ 지우지는 않는다 — 되짚을 수 있어야 한다.",
"줄": {
"machine_blind": {
"안 잰 칸 mach_loss_coef.note": {
"what": "원문과 안 맞댐",
"why": "사람이 적은 메모 — 2026-09-18 5202·5203 칸 밀림을 바로잡은 사유다. 원문에 없는 글이라 맞댈 것이 없다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "사람이 적은 메모 — 2026-09-18 5202·5203 칸 밀림을 바로잡은 사유다. 원문에 없는 글이라 맞댈 것이 없다.",
"갈래": "메모"
},
"안 잰 칸 mach_loss_coef.loss_coefficient_per_hour": {
"what": "원문과 안 맞댐",
"why": "자료가 낳은 값 — 「계」 계수(10-7)를 10,000,000 으로 나눈 것이다. 낳은 밑값인 계수 넷은 이미 줄마다 맞대고 있어 여기서 또 맞대면 같은 것을 두 번 세는 셈이다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "자료가 낳은 값 — 「계」 계수(10-7)를 10,000,000 으로 나눈 것이다. 낳은 밑값인 계수 넷은 이미 줄마다 맞대고 있어 여기서 또 맞대면 같은 것을 두 번 세는 셈이다.",
"갈래": "낳은 값"
},
"안 잰 칸 mach_fuel_rate.parse_method": {
"what": "원문과 안 맞댐",
"why": "추출기 살림살이 — 그 줄을 어떻게 읽었나 적어 둔 표시(`verified_source_row_alignment`)다. 원문에 없는 말이다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "추출기 살림살이 — 그 줄을 어떻게 읽었나 적어 둔 표시(`verified_source_row_alignment`)다. 원문에 없는 말이다.",
"갈래": "살림살이"
},
"안 잰 칸 mach_fuel_rate.source_tables.section": {
"what": "원문과 안 맞댐",
"why": "표를 가리키는 이름표일 뿐 — 8-4 표의 머리와 줄은 이미 **표째 통째로** 맞대고 있다(`운전경비 원표 N번째`).",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "표를 가리키는 이름표일 뿐 — 8-4 표의 머리와 줄은 이미 **표째 통째로** 맞대고 있다(`운전경비 원표 N번째`).",
"갈래": "자리 표시"
},
"안 잰 칸 mach_operator_map.rules.alias": {
"what": "원문과 안 맞댐",
"why": "프로그램 안에서 쓰는 이름(`labor_op_const`) — 원문 낱말이 아니다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "프로그램 안에서 쓰는 이름(`labor_op_const`) — 원문 낱말이 아니다.",
"갈래": "프로그램 이름"
},
"안 잰 칸 mach_operator_map.rules.rule_id": {
"what": "원문과 안 맞댐",
"why": "프로그램 안에서 쓰는 규칙 이름(`construction_machine_operator`) — 원문 낱말이 아니다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "프로그램 안에서 쓰는 규칙 이름(`construction_machine_operator`) — 원문 낱말이 아니다.",
"갈래": "프로그램 이름"
},
"안 잰 칸 mach_operator_map.rules.source_section": {
"what": "원문과 안 맞댐",
"why": "어느 절에서 왔나 적어 둔 자리 표시(`8-1-3/5`) — 값이 아니다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "어느 절에서 왔나 적어 둔 자리 표시(`8-1-3/5`) — 값이 아니다.",
"갈래": "자리 표시"
},
"안 잰 칸 mach_rock_adj.rules.exception": {
"what": "원문과 안 맞댐",
"why": "원문 조건 글을 영어 이름으로 줄여 적은 것(`tire_or_wetland_bulldozer` = 타이어식·습지 불도저) — 글끼리 맞댈 수 없다. 붙는 수(25·20·10·0)는 「손료보정」 으로 이미 맞대고 있다.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "원문 조건 글을 영어 이름으로 줄여 적은 것(`tire_or_wetland_bulldozer` = 타이어식·습지 불도저) — 글끼리 맞댈 수 없다. 붙는 수(25·20·10·0)는 「손료보정」 으로 이미 맞대고 있다.",
"갈래": "요약 이름"
},
"안 잰 칸 mach_rock_adj.rules.exclusion": {
"what": "원문과 안 맞댐",
"why": "위와 같음 — `dedicated_dump_truck_18_ton_or_more` = 18톤 이상 전용 덤프트럭.",
"class": "㉮ 영영 할 일 아님",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림",
"class_why": "위와 같음 — `dedicated_dump_truck_18_ton_or_more` = 18톤 이상 전용 덤프트럭.",
"갈래": "요약 이름"
}
},
"labor_blind": {
"건설 pdf": {
"what": "3. 개별직종 노임단가.md",
"why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "맞댈 PDF 가 저장소에 없음 — md 가 우리 원문임. PDF↔md 옮김 틀림은 사람이 따로 볼 자리."
},
"건설 별칭 이름": {
"what": [
"labor_1001",
"labor_1002",
"labor_1003",
"labor_1007",
"labor_1008",
"labor_1012",
"labor_1013",
"labor_1015",
"labor_1016",
"labor_1017",
"labor_1018",
"labor_1019",
"labor_op_const",
"labor_op_general",
"labor_op_truck"
],
"why": "별칭 이름은 프로그램이 지은 것 — 가리키는 코드가 원문에 있는지만 봄",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "프로그램이 지은 별칭 — 원문에 있을 수 없는 말. 가리키는 코드가 원문에 있는지만 봄."
},
"안 잰 칸 labor_mfg.unit": {
"what": "원문과 안 맞댐",
"why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 맞댈 꼴이 아님."
},
"안 잰 칸 labor_rate.unit": {
"what": "원문과 안 맞댐",
"why": "`KRW/day` 는 프로그램 표기 — 원문 글(원·1일)과 글자로 안 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
},
"제조 pdf": {
"what": "2026상반기_중소제조업_직종별_임금조사_중소기업중앙회.md",
"why": "원문 md 는 PDF 를 옮긴 것 — PDF 자체와의 옮김 틀림은 못 봄",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
}
},
"material_blind": {
"API 스냅숏": {
"what": "나라장터_시설공통자재_2026-08-14.json",
"why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "원문이 API 로 받은 한때의 스냅숏 — 게시처(나라장터·오피넷) 값 자체는 저장소에 없음."
},
"안 잰 칸 mat_price.price_adopted_reason": {
"what": "원문과 안 맞댐",
"why": "빌더가 적은 까닭 글 — 원문 칸 아님",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "빌더가 적은 까닭 글 — 원문 칸이 아님."
}
},
"oil_blind": {
"API 스냅숏": {
"what": [
"유가_전국평균_2026-08-14.json",
"유가_시도별_2026-09-09.json"
],
"why": "원문이 API 로 받은 스냅숏 — 게시처(나라장터·오피넷) 값 자체와는 못 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "원문이 API 스냅숏 — 게시처 값 자체는 저장소에 없음."
},
"시도 거래일": {
"what": "시도별 원천에 거래일 칸이 없음 — 수집일과만 맞댐",
"why": "시도별 원천 줄에 거래일이 없어 `수집일` 로만 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "시도별 원천 줄에 거래일 칸이 아예 없음 — `수집일` 로만 맞댐."
},
"안 잰 칸 oil.scope": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "프로그램 표기(`national_average`) — 원천에 그 칸이 없음."
},
"안 잰 칸 oil.unit": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "프로그램 표기(`KRW/L`) — 원천에 그 칸이 없음."
},
"안 잰 칸 oil_regional.scope": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
},
"안 잰 칸 oil_regional.source_product_name": {
"what": "원문과 안 맞댐",
"why": "시도별 원천에 상품 이름 칸 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "시도별 원천에 상품 이름 칸이 없음."
},
"안 잰 칸 oil_regional.unit": {
"what": "원문과 안 맞댐",
"why": "프로그램 표기(KRW/L · national_average) — 원천에 칸 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
}
},
"rate_blind": {
"processing_rules": {
"what": [
"note",
"owner_supplied_material",
"performance_guarantee_fee",
"profit",
"rounding",
"safety_management_cost",
"scale_bracket"
],
"why": "끝수·산식 처리 규칙 — 코드 규칙이라 원문 대조 대상 아님(거울 시험 몫)",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "끝수·산식 처리 규칙 — 코드 규칙이라 원문에 견줄 글이 없음(거울 시험 몫)."
},
"안 잰 칸 rate_equipment_payment_guarantee.base_note": {
"what": "코드(`B09_Estimation_Statutory.STATUTORY_ITEMS`)가 직접공사비로 계산하고 있는 것과 맞춘 표기.",
"why": "설명 글",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "설명 글 — 값이 아님."
},
"안 잰 칸 rate_overhead.basis": {
"what": "조달청 「2026년 토목·조경·산업환경설비공사 원가계산 간접공사비(제비율) 적용기준」(2026-04-13). ⚠ 구간 라벨의 `billion` 은 **십억 원** — `lt_5_billion` 은 50억 미만이다. 종합(토목·조경·산업설비)은 5억미만~30억~50억 8 · 50~100억·100~300억 6.5 · 300~1000억 5 · 1000억이상 4.5, 전문 등은 5억미만 8 · 5~30억 6.5 · 30~50억·50~100억 5 · 100억이상 4.5.",
"why": "데스크탑 서브가 붙인 설명 글 — 값 아님",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "데스크탑 서브가 붙인 설명 글 — 값이 아님."
},
"안 잰 칸 rate_overhead.specialty_note": {
"what": "⚠ 2026-09-18 **300억 이상 두 구간이 통째로 빠져 있었음** — 마지막이 「100억-300억 미만」으로 닫혀 300억 넘는 전문공사가 어느 구간에도 안 걸렸음. 원본 XLSX(BL35:BR46) 대로 300~1000억 · 1000억 이상을 더함(둘 다 4.5%). 값은 원문 그대로.",
"why": "데스크탑 서브가 붙인 설명 글 — 값 아님",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
},
"안 잰 칸 rate_safety_base.amount_bracket": {
"what": "500_million_to_5_billion",
"why": "다른 칸을 가리키는 표시 — 값 아님",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "다른 칸을 가리키는 표시 — 값이 아님."
},
"안 잰 칸 rate_safety_base.embedded_in": {
"what": "rate_safety_pct.brackets",
"why": "다른 칸을 가리키는 표시 — 값 아님",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
},
"안 잰 칸 rate_safety_pct.base_rule": {
"what": "min_of_two_formulas",
"why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "도급자관급이 든 때 두 식 중 작은 값을 쓰라는 xlsx 글(EB11·EB13)을 프로그램 식으로 옮긴 것 — 글과 식은 꼴이 달라 글자로 맞댈 수 없음."
},
"안 잰 칸 rate_safety_pct.base_with_owner_supplied_material": {
"what": "minimum_of_statutory_two_formulas",
"why": "도급자관급 포함 시 두 식 중 작은 값 — xlsx 글(EB11·EB13) 해석이라 안 맞댐",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 한 자리."
},
"안 잰 칸 rate_vat.base": {
"what": "construction_cost_before_vat",
"why": "부가세 — 근거(부가가치세법)가 sources 에 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "부가세 근거(부가가치세법)가 `sources` 에 없음 — 저장소에 원문이 없어 맞댈 것이 없음."
},
"안 잰 칸 rate_vat.rate_percent": {
"what": 10.0,
"why": "부가세 — 근거(부가가치세법)가 sources 에 없음",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "위와 같음."
},
"조달청 요약표": {
"what": "2026.04.13_조달청_토목공사_제비율.xlsx",
"why": "xlsx 는 조달청 요약표 — 각 고시 원문과는 안 맞댐(연금만 법령과 맞댐)",
"class": "㉮ 영영 할 일 아님",
"갈래": "원문 부재",
"class_why": "xlsx 는 조달청이 고시를 모아 요약한 표 — 각 고시 원문은 저장소에 없음(연금만 법령과 맞댐)."
}
}
}
},
"_갈래": {
"센 날": "2026-09-18",
"셈": {
"원문 부재 / ㉰": 7,
"잣대 못 알아봄 / ㉯": 17
},
"잣대": "두 갈래로 가름 — **원문 부재**: 값이 원문·원천에 없거나 원문 밖 말이라 채울 것이 없음 · **잣대 못 알아봄**: 값은 원문에 있는데 전사·읽기가 못 가름 ⇒ 고치면 풀림. ㉮ 영영 할 일 아님 · ㉯ 남이 고쳐야 풀림 · ㉰ 사용자·브레인 판단.",
"할 일 아님으로 뺀 줄": 34
}
}
@@ -27,21 +27,24 @@
"md": "부록 표",
"master": "공종에 붙음",
"class": "㉰ 사용자 판단 필요",
"class_why": "부록 14-2 가 공종에 붙음 — 떼어 낼지 승인 대기(같은 식구 넷을 앞서 찾음)"
"class_why": "원문 14-2 는 **부록 표**인데 마스터가 공종에 붙음 — 부록을 공종에서 가르는 잣대가 아직 없음. 떼어 낼지 승인 대기(같은 식구 넷).",
"갈래": "잣대"
},
"F0453": {
"section": "14-2",
"md": "부록 표",
"master": "공종에 붙음",
"class": "㉰ 사용자 판단 필요",
"class_why": "위와 같음"
"class_why": "위와 한 자리.",
"갈래": "잣대"
},
"F0454": {
"section": "14-2",
"md": "부록 표",
"master": "공종에 붙음",
"class": "㉰ 사용자 판단 필요",
"class_why": "위와 같음"
"class_why": "위와 한 자리.",
"갈래": "잣대"
}
},
"basis": {
@@ -54,7 +57,8 @@
"km"
],
"class": "㉰ 사용자 판단 필요",
"class_why": "⚠ 마스터 「1km」는 반쪽 — 원문은 「인/1일 1km당」으로 분모가 둘(일·km)"
"class_why": "원문은 「인/1일 1km당」으로 **분모가 둘**(일·km)인데 마스터는 「1km」만 담음 — 분모 둘을 담는 잣대가 없어 반쪽임. 어느 쪽으로 세울지 판정 대기.",
"갈래": "잣대"
},
"F0322": {
"section": "10-13-1",
@@ -67,7 +71,8 @@
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "위와 같음(원문 「묘목 1,000본당」)",
"owner": "랩탑 메인",
"owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)"
"owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)",
"갈래": "남의 몫"
},
"F0323": {
"section": "10-13-2",
@@ -80,7 +85,8 @@
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "위와 같음",
"owner": "랩탑 메인",
"owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)"
"owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)",
"갈래": "남의 몫"
}
},
"notes": {
@@ -91,10 +97,11 @@
"- 3. 박피품은 별도 적용하여야 한다. 다만 작업조건에 따라 1일 작업량은 변동 적용한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0104": {
"section": "5-3-4",
@@ -109,10 +116,11 @@
"- ⑦ 굴착기 규격은 0.4㎥를 기준으로 한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0106": {
"section": "5-3-5",
@@ -128,10 +136,11 @@
"- ⑧ 장비 규격은 다음을 기준으로 한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0189": {
"section": "7-11",
@@ -143,10 +152,11 @@
"- ④ 할인․할증은 경사도(1-4-5), 주행 장애물 상태(1-4-13)를 반영한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0223": {
"section": "8-4",
@@ -156,10 +166,11 @@
"- ④ 할인․할증은 경사도(1-4-5), 방제 대상목 분포(1-4-17)를 반영한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0251": {
"section": "9-8-1",
@@ -171,10 +182,11 @@
"[주] 「건설공사 표준품셈 공통부문, 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": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0281": {
"section": "9-15-1",
@@ -183,10 +195,11 @@
"- ③ 「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」 참조한다. (불도저작업이 어려운 경우)"
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0282": {
"section": "9-15-2",
@@ -195,10 +208,11 @@
"- ③ 「건설공사 표준품셈 공통부문, 8-2-1 불도저(2025)」 참조(표토제거 두께 T=0.2m)"
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0285": {
"section": "9-16-3",
@@ -207,10 +221,11 @@
"- ④ 토목은 동상방지층, 보조기층, 기층 등 층별 조건이나 본선, 길어깨 등에 따라 임도에는 대형장비(5,500ℓ)를 사용한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0286": {
"section": "9-17-2",
@@ -220,10 +235,11 @@
"- ④ 「건설공사 표준품셈 공통부문 8-2-1 불도저(2025)」 참조한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0295": {
"section": "9-22",
@@ -232,10 +248,11 @@
"- ④ 0.2㎥ 또는 0.4㎥ 용량의 굴착기를 사용하는 경우에는「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0319": {
"section": "10-11",
@@ -244,10 +261,11 @@
"- ③ 「건설공사 표준품셈 공통부문. 8-2-1 불도저(2025)」 참조한다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0323": {
"section": "10-13-2",
@@ -256,10 +274,11 @@
"[주] 위 단가산출은 일본 임야청에서 묘목 5,000본의 운반을 가정하여 현장 검증을 통해 산출한 내용이므로, 묘목 이외의 다른 화물을 운반할 시에는 달라질 수 있다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
},
"F0393": {
"section": "12-38-2",
@@ -269,67 +288,58 @@
"- ② 플랫 타이(Flat Tie) 대신 폼 타이(Form Tie) 사용 시 소요 수량은 12-4 합판 거푸집 자재수량을 따른다."
],
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "마스터가 맞고 md 읽기가 덜 읽음 — 코덱스가 md 읽기를 넓히는 중",
"class_why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸 — 읽기가 「- 숫자.」 줄에서 끊기는 탓. 잘라내면 진짜 계수가 나갈 수 있어 **붙여 둔 쪽**을 지킴(2026-09-18 브레인 「애매하면 안 깎는 쪽」).",
"owner": "랩탑 메인",
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)"
}
},
"form": {
"F0406": {
"section": "13-4-1",
"master": "reference",
"md_mark": "개",
"why": "〈돌쌓기의 개수 및 중량의 표준〉 — 개수·중량 기준표라 사람이 참고로 판정함([주] 인력 돌쌓기·돌붙임 기준). md 쪽은 단위 칸 「개」만 보고 품 표로 읽음",
"class": "㉮ 영영 할 일 아님",
"class_why": "기준표 — 품이 아님",
"갈래": "거절 자리"
"owner_ask": "대조 시험의 **[주] 이어짐 읽기**(`_NOTE_CONT`)를 넓혀 줄 것 — 「- 숫자.」 로 시작하는 [주] 안쪽 줄을 이어짐으로 볼 것. 지금은 거기서 끊겨 마스터가 **뒤 표의 [주]**까지 끌어다 붙인 것으로 뜸. ⚠ 새 절 제목과 가르는 것이 일 — 알맹이(콜론·등호) 없는 짧은 줄만 제목.",
"why": "마스터가 **뒤 표의 [주]**까지 끌어다 붙임 — 잘라내면 진짜 계수가 나갈 수 있어 붙여 둔 쪽(2026-09-18 브레인 「애매하면 안 깎는 쪽」)",
"갈래": "남의 몫"
}
},
"form": {},
"form_blind": {
"F0333": {
"section": "12-1-3",
"master": "requirement",
"why": "⚠ 원문 md 의심 — 머리는 한중콘크리트 「온도 품종 | 0℃때 …」인데 몸 줄이 앞 표 F0332(시멘트·모래·자갈 kg)와 똑같음 · PDF 대조 필요",
"class": "㉯ 남이 고쳐야 풀림",
"class_why": "⚠ 원문 md 의심 — 몸 줄이 앞 표와 똑같음 · 코덱스 PDF 대조",
"class_why": "⚠ **원문 md 자체가 의심**머리는 한중콘크리트 「온도 품종 | 0℃때 …」인데 몸 줄이 앞 표 F0332(시멘트·모래·자갈 kg)와 똑같음. PDF 대조로 어느 쪽이 맞는지 짚어야 풀림.",
"owner": "랩탑 서브",
"owner_ask": "PDF ↔ md 대조 — 이 표의 **몸 줄이 앞 표와 똑같음**. PDF 로 어느 쪽이 맞는지 짚어 줄 것"
"owner_ask": "PDF ↔ md 대조 — 이 표의 **몸 줄이 앞 표와 똑같음**. PDF 로 어느 쪽이 맞는지 짚어 줄 것",
"갈래": "남의 몫"
},
"F0405": {
"section": "13-4-1",
"master": "requirement",
"why": "증가율(%) 표(높이별 30·40·60%) — 품이 아니라 할증률 모양 · requirement 가 맞는지 사람 확인",
"class": "㉰ 사용자 판단 필요",
"class_why": "증가율(%) 표 — requirement 가 맞는지 사람 확인"
"class_why": "높이별 증가율(30·40·60%) 표 — **품이 아니라 할증률 모양**인데 우리 잣대엔 그 갈래가 없어 requirement 로 둠. 성격을 정해야 닫힘.",
"갈래": "잣대"
}
},
"cost_rule": {},
"_갈래": {
"㉯ 주인": {
"랩탑 메인": 22,
"랩탑 서브": 1
},
"센 날": "2026-09-18",
"잣대": "세 갈래 — **원문 부재**: 원문에 값·글이 없어 채울 것이 없음 · **잣대**: 원문에 있으나 우리 판정·읽기 잣대가 못 가름(우리가 고칠 자리) · **남의 몫**: 원문 md·남의 도구를 남이 고쳐야 풀림. 누가 하나는 class 로 — ㉮ 영영 할 일 아님 · ㉯ 남이 고쳐야 풀림 · ㉰ 사용자·브레인 판단.",
"셈": {
"㉮ 영영 할 일 아님": 39,
"㉯ 남이 고쳐야 풀림": 23,
"㉰ 사용자 판단 필요": 7
"남의 몫 / ㉯": 17,
"잣대 / ㉰": 5
},
"잣대": "㉮ 는 집계에서 뺀다 — 영영 할 일이 아닌 것(원문에 없음·거절 자리·판정으로 닫힘). ㉯ 는 남의 몫(코덱스 md 읽기·랩탑 메인 시험). ㉰ 만 사람이 정할 자리다."
"곁줄": "이 장부는 **어긋남**만 담음 — 「원문에 밑수가 없는 것」 71 건은 어긋남이 아니라 `basis_missing_2026-01-01.json` 에 사유와 함께 따로 있음. 그래서 여기 「원문 부재」 가 0 이어도 원문 부재 자체가 없다는 뜻은 아님.",
"할 일 아님으로 뺀 줄": 33,
"곁줄2": "⚠ 갈래 낱말이 두 벌임 — **여기(어긋남)**는 「무엇이 막고 있나」(원문 부재·잣대·남의 몫), **`_할일_아님`** 은 「왜 할 일이 아닌가」(거절 자리·그 밖·부록 예시·원문 부재). 섞어 읽지 말 것."
},
"_할일_아님": {
"갈래별": {
"거절 자리": 10,
"거절 자리": 11,
"그 밖": 17,
"부록 예시": 1,
"원문 부재": 4
},
"셈": {
"basis": 10,
"basis": 9,
"cost_rule": 7,
"form": 7,
"form_blind": 10,
"cost_rule": 7
"form_blind": 10
},
"옮긴 날": "2026-09-18",
"잣대": "㉮ — **영영 할 일이 아닌 것.** 원문에 없음 · 거절 자리 · 판정으로 닫힘. 바퀴마다 다시 세어지지 않게 갈래에서 **아주 빼** 여기 둔다. ⚠ 지우지는 않는다 — 되짚을 수 있어야 한다.",
@@ -494,6 +504,15 @@
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "부록 예시"
},
"F0406": {
"section": "13-4-1",
"master": "reference",
"md_mark": "개",
"why": "〈돌쌓기의 개수 및 중량의 표준〉 — 개수·중량 기준표라 사람이 참고로 판정함([주] 인력 돌쌓기·돌붙임 기준). md 쪽은 단위 칸 「개」만 보고 품 표로 읽음",
"class": "㉮ 영영 할 일 아님",
"class_why": "〈돌쌓기의 개수 및 중량의 표준〉 — 품 표가 아니라 개수·중량 기준표. md 읽기가 단위 칸 「개」만 보고 품 표로 읽음. 사람 판정으로 닫힘([주] 인력 돌쌓기·돌붙임 기준).",
"갈래": "거절 자리"
}
},
"form_blind": {
@@ -567,12 +567,22 @@ def test_알려진_어긋남_밖은_없음(src: dict, kind: str) -> None:
if __name__ == "__main__" and "--prune" in sys.argv:
# 고쳐졌거나 모습이 바뀐 줄만 지움 — 새 어긋남은 안 보탬(보태면 빨강이 조용히 묻힘).
# ⚠ 「할 일 아님」 칸(`_할일_아님`)은 **제자리에서** 지운다. `load_known()` 이 합쳐 읽은 것을
# 그대로 되쓰면 2026-09-18 에 가른 칸이 다시 갈래로 섞여 「없는 할 일」이 되살아난다.
current = current_mismatches(load_sources())
data = load_known()
data = json.loads(KNOWN.read_text(encoding="utf-8"))
parked = (data.get("_할일_아님") or {}).get("") or {}
def _keep(kind: str, rows: dict) -> dict:
return {k: v for k, v in rows.items() if current[kind].get(k) == _without_why(v)}
for kind in FILES:
before = len(data[kind])
data[kind] = {
k: v for k, v in data[kind].items() if current[kind].get(k) == _without_why(v)
}
before = len(data.get(kind) or {})
data[kind] = _keep(kind, data.get(kind) or {})
print(f"{kind}: {before}{len(data[kind])}")
if kind in parked:
was = len(parked[kind])
parked[kind] = _keep(kind, parked[kind])
if len(parked[kind]) != was:
print(f" 할 일 아님 {kind}: {was}{len(parked[kind])}")
KNOWN.write_text(json.dumps(data, ensure_ascii=False, indent=1) + "\n", encoding="utf-8")
@@ -214,12 +214,24 @@ def _fuel(tok: str) -> tuple:
return first[0], first[1], second[0], second[1], power
def _cells(cell: str, n: int) -> list[str]:
"""한 칸을 토막 냄 — **빈 칸은 「없음」** 이고 `동력` 낱말은 뗀다.
원문 8-4 없음을 - 로도 쓰고 칸으로도 두며, 전력 기종은 `동력 15.1` 처럼
낱말을 붙인다. 칸을 토막 없음으로 두면 줄을 통째로 읽어 **원문에 있는 값까지
놓친다**(7360-0090 차선 제거기 휘발유 5.53 원문에 적혀 있음).
"""
toks = cell.replace("동력", " ").split()
return toks or ["-"] * n
def read_machine(path: Path) -> dict:
"""제8장 md — 8-3 손료 · 8-4 운전경비 · 8-5 가격. 여러 코드가 한 칸에 뭉친 줄은 토막 수가 맞을 때만 읽음."""
lines = _lines(path)
tables = md_tables(lines)
at = {w: next(i for i, x in enumerate(lines, 1) if w in x) for w in ("8-3 기계손료", "8-4 운전경비", "8-4-9 [90]", "8-5 기계가격")} # fmt: skip
out = {k: {} for k in ("price", "loss", "fuel", "fuel_tables", "skipped", "names")}
out["spec_blank"] = set() # 원문이 규격 칸을 비워 둔 줄 — 자료가 채웠는지는 맞대기에서 봄
out["lines"] = lines
name_at = re.compile(r"\((\d{4})\) ?(.+?)(?=시 간 당\(10-7\)|\((?:'\d\d|\d{4}\))|$)")
for x in lines[
@@ -257,6 +269,10 @@ def read_machine(path: Path) -> dict:
if not r[0]:
continue
codes, prefix = _codes(r[0], prefix)
# `| 9020- | 비항SD | | … |` 꼴 — **앞자리만 알리는 머리줄**이라 값이 애초에 없다.
# 못 읽은 자리가 아니므로 「못 보는 자리」로 세지 않고 앞자리만 이어받고 지난다.
if codes == [] and not any(re.search(r"\d", c) for c in r[1:]):
continue
try:
values = {f: [_num(x) for x in r[i].split()] for f, i in cols.items()}
if not codes or any(len(v) != len(codes) for v in values.values()):
@@ -267,7 +283,27 @@ def read_machine(path: Path) -> dict:
out["loss"].update(
(c, {f: v[k] for f, v in values.items()}) for k, c in enumerate(codes)
)
# 규격 — 원문 손료표의 「규 격」 칸(분류번호 바로 뒤). 자료는 이 값을 가격·연료 벌에도 함께 씀.
# 토막이 코드 수와 안 맞는 줄(`2,200×5,150 ×1,000` 처럼 규격 안에 빈칸이 든 것)은 안 담는다 —
# 맞대기에서 자료 값으로 갈음되므로 지어 채우는 일이 없다.
specs = r[1].split()
if len(codes) == 1 and specs: # 한 코드 줄은 규격 안에 빈칸이 들어도 칸을 통째로 씀
specs = [" ".join(specs)]
if len(specs) == len(codes):
for k, c in enumerate(codes):
out["loss"][c]["specification"] = specs[k]
elif len(codes) == 1 and not specs:
# 원문이 그 칸을 **비워 둔** 줄 — 표에서 「위와 같음」으로 읽히는 자리다.
# 자료가 앞 줄 값을 이어받아 채운 줄만 못 보는 자리로 센다(맞대기에서 판다).
out["spec_blank"].add(codes[0])
for k in range(at["8-3 기계손료"], at["8-4 운전경비"]):
# 머리 없는 **이어 표** — 책장 넘김에 밀린 줄을 빈 줄 뒤에 따로 적어 둔 자리(9020-0022~0200).
# `|---|` 가 없어 표로 잡히지 않아 **추출기도 이 읽기도 못 봄** — 원문에 있는 값이 조용히 빠진다.
cells = [c.strip() for c in lines[k - 1].strip().strip("|").split("|")]
if len(cells) >= 10 and re.fullmatch(r"\d{4}-\d{4}", cells[0] or ""):
# 칸이 열 이상인 것만 — 축약 손료표(5220·7995)는 「계수 칸 없는 표」 로 이미 세고 있다.
if cells[0] not in out["loss"]:
out["skipped"][f"손료 머리 없는 이어 표 {cells[0]}"] = {"what": lines[k - 1][:48]}
if not lines[k - 1].lstrip().startswith("|") and "시 간 당(10-7)" in lines[k - 1]:
heads = re.findall(r"\((\d{4})\) ?(?:[^|()]{0,30}\([^)]*\)){0,2}[^|()]{0,30}?시 간 당\(10-7\)", lines[k - 1]) # fmt: skip
if heads: # 표 위 머리 글줄(`시 간 당(10-7)` 한 줄)은 표로 읽힘 — 뭉개진 글만
@@ -281,8 +317,14 @@ def read_machine(path: Path) -> dict:
continue
for r in t["rows"]:
codes, prefix = _codes(r[0], prefix)
# ⚠ 코드가 하나인 줄은 **칸 통째로** 한 값이다 — `1.87㎾ 휘발유1.3` 처럼 값 안에 공백이 온다.
cols = [[c.strip()] if len(codes) == 1 else c.split() for c in (r[3], r[4], r[5])]
# 서브의 칸 토막내기(빈 칸 = 없음 · `동력` 뗌)를 쓰되, ⚠ **코드가 하나면 칸 통째로** —
# `1.87㎾ 휘발유1.3` 처럼 한 값 안에 공백이 온다(2026-09-18 겸용 연료).
cols = [
[r[i].replace("동력", " ").strip() or "-"]
if len(codes or []) == 1
else _cells(r[i], len(codes or []))
for i in (3, 4, 5)
]
try:
if not codes or any(len(c) != len(codes) for c in cols):
raise ValueError(r[0])
@@ -309,9 +351,9 @@ def check_machine(src: dict, bad: dict, blind: dict) -> dict:
source, v = src["mach"]["source"], src["mach"]["data"]["variables"]
counts = {}
for label, var, rows, fields in (
("가격", "mach_price", source["price"], ("price_thousand_krw",)),
("손료", "mach_loss_coef", source["loss"], (*LOSS_COLS, *LOSS_COEF)),
("연료", "mach_fuel_rate", source["fuel"], FUEL_FIELDS),
("가격", "mach_price", source["price"], ("price_thousand_krw", "specification")),
("손료", "mach_loss_coef", source["loss"], (*LOSS_COLS, *LOSS_COEF, "specification")),
("연료", "mach_fuel_rate", source["fuel"], (*FUEL_FIELDS, "specification")),
):
records = v[var].get("records") or v[var]["parsed_records"]
by_code = {r["machine_code"]: r for r in records}
@@ -337,6 +379,12 @@ def check_machine(src: dict, bad: dict, blind: dict) -> dict:
counts[f"{label} 코드 수"] = (len(rows), len(by_code))
counts[f"{label} 원문에 없는 자료 줄"] = (0, len(set(by_code) - set(rows) - unread))
_unchecked(blind, var, records, {"machine_code", "machine_name", *fields})
# 원문이 규격 칸을 비워 둔 자리에 **자료가 앞 줄 값을 이어받아 채운** 줄 — 원문에 없는 글이라 사람이 볼 자리.
loss_by_code = {r["machine_code"]: r for r in v["mach_loss_coef"]["records"]}
for code in sorted(source.get("spec_blank", ())):
spec = (loss_by_code.get(code) or {}).get("specification")
if spec is not None:
blind[f"규격 빈칸 {code}"] = {"what": spec}
blind.update(source["skipped"])
tables = v["mach_fuel_rate"]["source_tables"]
for n, st in enumerate(
@@ -688,10 +736,22 @@ def test_셈이_맞음(src: dict, kind: str) -> None:
if __name__ == "__main__" and "--prune" in sys.argv:
# 고쳐졌거나 모습이 바뀐 줄만 지움 — 새 어긋남은 안 보탬(보태면 빨강이 조용히 묻힘).
# ⚠ 「할 일 아님」 칸(`_할일_아님`)은 **제자리에서** 지운다. `load_known()` 이 합쳐 읽은 것을
# 그대로 되쓰면 2026-09-18 에 가른 칸이 다시 갈래로 섞여 「없는 할 일」이 되살아난다.
current = current_mismatches(load_sources())
data = load_known()
data = json.loads(KNOWN.read_text(encoding="utf-8"))
parked = (data.get("_할일_아님") or {}).get("") or {}
def _keep(kind: str, rows: dict) -> dict:
return {k: v for k, v in rows.items() if current[kind].get(k) == _without_why(v)}
for kind in KIND_NAMES:
before = len(data[kind])
data[kind] = {k: v for k, v in data[kind].items() if current[kind].get(k) == _without_why(v)} # fmt: skip
before = len(data.get(kind) or {})
data[kind] = _keep(kind, data.get(kind) or {})
print(f"{KIND_NAMES[kind]}: {before}{len(data[kind])}")
if kind in parked:
was = len(parked[kind])
parked[kind] = _keep(kind, parked[kind])
if len(parked[kind]) != was:
print(f" 할 일 아님 {KIND_NAMES[kind]}: {was}{len(parked[kind])}")
KNOWN.write_text(json.dumps(data, ensure_ascii=False, indent=1) + "\n", encoding="utf-8")
@@ -83,7 +83,7 @@ def test_표는_다_붙고_못_붙인_표는_목록(built: tuple) -> None:
# 2026-09-18 2,192 → 2,202 — 코덱스가 제8장 손료표 열(C2193~C2202)을 되살림
# 2026-09-18 합침 2,202 → 2,270 → 2,272 — 랩탑 서브·안티그래비티·코덱스가 원문 md 의
# 뭉친 줄·표를 잇달아 풂(8-2 시공능력 · 8-4-9 해상기계 …)
assert stats["tables_total"] == 2273
assert stats["tables_total"] == 2274
assert stats["tables_attached"] + len(master["orphan_tables"]) == stats["tables_total"]
assert stats["tables_orphan"] == len(master["orphan_tables"]) == 0
@@ -394,8 +394,10 @@ def test_할일_아님_칸이_갈려_있다() -> None:
# 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}
# 2026-09-18 32 → 33. F0406〈돌쌓기의 개수 및 중량의 표준〉이 들어왔다 — 품 표가 아니라 개수·중량
# 기준표라 사람 판정으로 닫힌 **거절 자리**다(거절 자리 10 → 11).
assert total == 33
assert block["갈래별"] == {"거절 자리": 11, "그 밖": 17, "부록 예시": 1, "원문 부재": 4}
for kind, got in rows.items():
for tid, v in got.items():
assert str(v.get("class", "")).startswith(""), f"{kind}/{tid}"
@@ -493,12 +495,22 @@ def test_알려진_어긋남_밖은_없음(src: dict, kind: str) -> None:
if __name__ == "__main__" and "--prune" in sys.argv:
# 고쳐졌거나 모습이 바뀐 줄만 지움 — 새 어긋남은 안 보탬(보태면 빨강이 조용히 묻힘).
# ⚠ 「할 일 아님」 칸(`_할일_아님`)은 **제자리에서** 지운다. `load_known()` 이 합쳐 읽은 것을
# 그대로 되쓰면 2026-09-18 에 가른 칸이 다시 갈래로 섞여 「없는 할 일」이 되살아난다.
current = current_mismatches(load_sources())
data = load_known()
data = json.loads(KNOWN.read_text(encoding="utf-8"))
parked = (data.get("_할일_아님") or {}).get("") or {}
def _keep(kind: str, rows: dict) -> dict:
return {k: v for k, v in rows.items() if current[kind].get(k) == _without_why(v)}
for kind in KIND_NAMES:
before = len(data[kind])
data[kind] = {
k: v for k, v in data[kind].items() if current[kind].get(k) == _without_why(v)
}
before = len(data.get(kind) or {})
data[kind] = _keep(kind, data.get(kind) or {})
print(f"{KIND_NAMES[kind]}: {before}{len(data[kind])}")
if kind in parked:
was = len(parked[kind])
parked[kind] = _keep(kind, parked[kind])
if len(parked[kind]) != was:
print(f" 할 일 아님 {KIND_NAMES[kind]}: {was}{len(parked[kind])}")
KNOWN.write_text(json.dumps(data, ensure_ascii=False, indent=1) + "\n", encoding="utf-8")
+1 -1
View File
@@ -85,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": 1045, "units": 1499} and table["total"] == 1499
assert table["stats"] == {"work_items": 1046, "units": 1502} and table["total"] == 1502
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)