feat(data): 기계·품셈 원천 벌 다시 뽑음 · 「인」 밑수 셋 바로잡음 — 금액 그대로

**① 기계 원천 벌 다시 뽑음**(`_build_mach.py`) — 랩탑 서브가 8장 md 를 크게 고친 뒤
  · 연료 **214 → 274**(새 기계 60) · 손료 611 · 가격 613 — 값 바뀐 줄 가격 122 · 손료 122 · 연료 35
  · 규격 세 줄짜리 표의 셋째 줄(출력 ㎾)이 되살아남 — 9070-0020 도 규격이 빈칸에서 「80ton대선 8ton달기」로
  ·  **금액 안 움직임** — 직접공사비 5,983,724 통과
   남은 구멍 — 손료표 9020~9090 여덟 덩어리에서 코드를 못 읽음(`parse_audit`) · 연료 코드 수 272↔274 ·
    3108-0040 연료 갈래(중유↔경유). 장부에 주인(랩탑 메인)과 함께 적어 둠
**② 품셈 원천 벌도 다시 뽑음**(`_build_pum.py`) — 건설 표 둘 바뀜·둘 새로·둘 빠짐

**③ 「인」 밑수 셋 바로잡음**(안티그래비티 PDF 대조 · 브레인 판정)
  · F0046·F0068 — 비고의 「1인당」을 파서가 밑수로 읽고 있었음. **비워 둠**(사람 판정) ·
    미확보 목록에 「**원문 부재** — 사람 판정: …」 사유를 달아 다음 바퀴에 또 안 세어지게 함
     「인은 밑수가 아니다」 2026-09-09 판정이 **넓게 옳았음** — 「숫자가 붙었을 때만 인정」이라는
      예외(2-2-5 천공기)까지 물러남. 그 시험도 뒤집고 까닭을 적음
  · F0076 — 목적물 1km 는 **정당한 밑수**였음(반쪽 아님). 뜻이 뒤집혀 있던 `productivity` 를
    `requirement` 로 고침(값은 소요인력)
  ⇒ 사용자 판단이 **8 → 5** 로 줄어듦(남은 다섯: 부록 14-2 표 셋 · F0405 증가율표 성격 · 이형철근 범위)

밑수 확보 251 → 249 · 미확보 80 = 원문 부재 70 + 미판독 10 · 지문·이름표·시험 갱신

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsGw1Dz9HmhuAxGisxmDPF
This commit is contained in:
2026-09-18 07:05:07 +09:00
co-authored by Claude Opus 5
parent c5c149b8e9
commit 9f27d61965
17 changed files with 19392 additions and 7102 deletions
@@ -160,6 +160,9 @@ FORM_JUDGMENTS: dict[str, tuple[str, str, str]] = {
"F0429": ("13-10-2", "coefficient", "[주]⑥ 관입률별 계수"),
"F0439": ("13-12-2", "coefficient", "[주]⑦ 높이·기울기 할증(%)"),
"F0446": ("13-15-2", "reference", "작업조건(어려운·쉬운) 구분 기준"),
# 2026-09-18 안티그래비티 PDF 대조 — 목적물 1km 가 정당한 밑수이고 값은 소요인력이다.
# 생산량형(1÷값)으로 서 있어 뜻이 뒤집혀 있었음.
"F0076": ("3-2", "requirement", "작업로 선정 — 목적물 1km 당 소요인력(PDF 대조로 정당 확인)"),
# ── 미판정 14 — 2026-09-17 안티그래비티 원문 대조 규명(브레인 넘김) ─────────────
# `산림품셈_form_미판정_14개_원문대조_규명.json` · 머리 소실 9 · 혼합 3 · 공식 1 · 글값 1.
# ⚠ 여기까지가 산림 미판정 전부다 — 다 채우면 `form_undetermined` 가 0 이 된다.
@@ -295,6 +298,38 @@ BASIS_JUDGMENTS: dict[str, tuple[str, float, str, str]] = {
}
#: 표 번호 → (절 번호, 까닭). **밑수를 비워 두라고 사람이 정한 표.**
#: ⚠ 자동 판정이 **밑수가 아닌 글을 밑수로 읽은** 자리다 — 비고의 「1인당」 따위.
#: 값을 채우는 것이 아니라 **지우는** 판정이라, 미확보 목록에도 이 까닭이 실려
#: 다음 바퀴에 「할 일」로 다시 세어지지 않는다(2026-09-18 브레인 · 안티그래비티 PDF 대조).
BASIS_ABSENT: dict[str, tuple[str, str]] = {
"F0046": (
"2-1-1",
"원문에 밑수 없음 · 비고의 「1인당」은 밑수가 아님 — 기계 한 대에 붙는 인원 말이다"
"(「인은 밑수가 아니다」 2026-09-09 판정이 옳았음 · PDF 대조로 확인)",
),
"F0068": (
"2-2-5",
"위와 같음 · 게다가 손료계수표라 애초에 밑수가 없는 표",
),
}
def judged_absent(table_id: str, number: str | None) -> str | None:
"""사람이 「밑수 없음」으로 정한 표의 까닭. 아니면 `None`. 절 번호가 어긋나면 멈춘다."""
found = BASIS_ABSENT.get(table_id)
if found is None:
return None
section, why = found
if section != number:
raise ValueError(
f"밑수 없음 판정 {table_id} 의 절 {section} 이 원천의 {number} 와 다릅니다 — "
"원천 표 차례가 바뀌었으니 판정을 다시 대조할 것"
)
# ⚠ 「원문 부재」로 시작해야 한다 — 집계가 그 낱말로 「채울 것 아님」을 가른다.
return f"원문 부재 — 사람 판정: {why}"
def judged_basis(table_id: str, number: str | None) -> tuple[float, str, str] | None:
"""사람이 확인한 `(밑수 수, 단위, 까닭)`. 없으면 `None`. 절 번호가 어긋나면 멈춘다."""
found = BASIS_JUDGMENTS.get(table_id)
@@ -10,7 +10,11 @@ from __future__ import annotations
import re
from typing import Any
from B08_Quantity.B08_Quantity_Build_WorkItemMaster_Forms import judged_basis, judged_form
from B08_Quantity.B08_Quantity_Build_WorkItemMaster_Forms import (
judged_absent,
judged_basis,
judged_form,
)
# ── 형태 판정 ────────────────────────────────────────────────────────────
# 헤더·비고 문자열에서 찾는 표지. 앞의 것이 먼저 걸린다(생산량형이 더 좁은 표현이라 우선).
@@ -711,20 +715,27 @@ def table_entry(
# (「10㎡당」 같은 참고 문구)을 그 표의 밑수로 잘못 물어 온다.
# 실제로 13-3-1 이 본문 `(단위: ㎥당)` 인데 표 안 긁기가 `10㎡` 를 물어 왔다.
basis_qty = basis_unit = basis_source = None
# ⚠ **밑수를 비워 두라는 판정이 가장 앞이다** — 자동 판정이 밑수가 아닌 글(비고의 「1인당」)을
# 밑수로 읽은 자리다. 채우는 것이 아니라 **지우는** 판정이다(2026-09-18).
absent = judged_absent(table["table_id"], number)
# 사람이 원문에서 확인한 밑수가 가장 앞이다 — **머리가 소실돼 자동으로는 못 읽는 표**만 해당.
if judged := judged_basis(table["table_id"], number):
if absent:
pass # 비워 두라는 판정 — 아래 어느 길도 타지 않는다
elif judged := judged_basis(table["table_id"], number):
basis_qty, basis_unit, basis_source = judged[0], judged[1], judged[2]
if basis_unit is None and source_lines:
if absent:
basis_qty = basis_unit = basis_source = None
elif basis_unit is None and source_lines:
basis_qty, basis_unit = basis_from_source(source_lines, int(table.get("line") or 0))
elif basis_unit is None:
basis_source = None
if basis_qty is None and basis_unit is None:
if not absent and basis_qty is None and basis_unit is None:
basis_qty, basis_unit = detect_basis(table)
basis_source = "표 안" if basis_unit else None
elif basis_source is None:
basis_source = "본문"
# 본문·표 안에 없을 때만 **절 이름**을 본다(4-2-2 「1,000㎡당」) — 이름 전체가 밑수일 때만.
if basis_unit is None and node_name is not None:
if not absent and basis_unit is None and node_name is not None:
name_qty, name_unit = basis_from_name(node_name)
if name_unit:
basis_qty, basis_unit, basis_source = name_qty, name_unit, "절 이름"
@@ -744,7 +755,8 @@ def table_entry(
"line": table.get("line"),
# ⚠ 「원문 부재」는 **채울 것이 아니다** — 없는 값을 지어내면 안 된다.
# 「미판독」만 진짜 할 일이다(2026-09-18 브레인 · 안티그래비티 3바퀴).
"why": (
"why": absent
or (
"미판독 — 원문이 적었는데 우리가 못 읽음"
if source_declares_basis(source_lines, int(table.get("line") or 0), table)
else "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -4813,7 +4813,7 @@
"name_ko": "기계 연료소모량·운전경비",
"summary": "기계마다 한 시간에 쓰는 연료량과 잡재료비 비율, 운전원 수.",
"shape": "list",
"rows": 214,
"rows": 274,
"columns": [
{
"key": "machine_code",
@@ -6363,7 +6363,7 @@
"name_ko": "밑수 못 찾은 표",
"summary": "기준 수량을 못 읽은 품셈 표. 1 단위당으로 단정하면 곱셈이 틀린다.",
"shape": "list",
"rows": 79,
"rows": 80,
"columns": [
{
"key": "pum_table_id",
@@ -7323,7 +7323,7 @@
"name_ko": "밑수 미확보 표",
"summary": "기준 수량을 못 찾은 표.",
"shape": "list",
"rows": 439,
"rows": 440,
"columns": [
{
"key": "pum_table_id",
@@ -1,7 +1,7 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-18T05:20:39+09:00",
"generated_at": "2026-09-18T06:52:06+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_forest",
@@ -12,8 +12,8 @@
"files": [
{
"file": "work_item_master_2026-01-01.json",
"sha256": "8bf71f9eefcfdf970eec4bf82e0249cf94620188b54ce5f3ae4df15b8f33dab7",
"size_bytes": 1081872
"sha256": "e173f92efa6361bd17d1581d050ab891af22bfd798ca9edd6e16bda26d516be9",
"size_bytes": 1081950
},
{
"file": "form_undetermined_2026-01-01.json",
@@ -22,8 +22,8 @@
},
{
"file": "basis_missing_2026-01-01.json",
"sha256": "364633582954336f298477ea0229e239b0baca9284d43c2da01e35aac83d2cbe",
"size_bytes": 18207
"sha256": "d3bd99f52a68b6c63592c93df16b54928ef768e726b39550f8148cf73878e3a8",
"size_bytes": 18592
}
]
}
@@ -1,29 +1,29 @@
{
"schema_version": "1.0",
"dataset_id": "data_work_item_master_manifest",
"generated_at": "2026-09-18T05:21:44+09:00",
"generated_at": "2026-09-18T06:53:30+09:00",
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
"source": {
"dataset_id": "pum_const",
"effective_date": "2026-01-01",
"sha256": "67285a536e7edd6655fceb6844c08fa237c443fdea720a4454fd53ac6d297d1d",
"sha256": "712583711e6fe531a6175303c07802acb1d470c9e594bd57acd5379b3970d808",
"file": "pum_const_2026.json"
},
"files": [
{
"file": "const_work_item_master_2026-01-01.json",
"sha256": "c8446c68afa521c6f1817346371c359304075d218f79fb38b3507d1e9f07cf42",
"size_bytes": 4508691
"sha256": "a0fec5c0570542e18c916182792a6816f440c87e21f6859a736de5ad208c71b2",
"size_bytes": 4527087
},
{
"file": "const_form_undetermined_2026-01-01.json",
"sha256": "aa75542987d4421fe26e0e6653c5fd7d393a153b5ad9470fcd7b605b5f9c5cb8",
"size_bytes": 493520
"sha256": "2bdad6ab6609d14ec92f7916b2f33d7a86a7f4115e07823a96ff67d0db9d15c3",
"size_bytes": 483542
},
{
"file": "const_basis_missing_2026-01-01.json",
"sha256": "e5f1683980debbb3a3d83eedffc32533f7305313cd668e7ac40ae171287ee3b0",
"size_bytes": 110670
"sha256": "2bad4499e0029f2db9e2f217356b24fd78f22d0d64a219a778fea72fd8672e02",
"size_bytes": 110934
}
]
}
@@ -18,6 +18,13 @@
"line": 1328,
"why": "원문 부재 — 원문에 밑수가 아예 없음(채우면 지어내는 꼴)"
},
{
"pum_table_id": "F0046",
"section": "2-1-1. 휘발유․오일",
"pum_form": "requirement",
"line": 1353,
"why": "원문 부재 — 사람 판정: 원문에 밑수 없음 · 비고의 「1인당」은 밑수가 아님 — 기계 한 대에 붙는 인원 말이다(「인은 밑수가 아니다」 2026-09-09 판정이 옳았음 · PDF 대조로 확인)"
},
{
"pum_table_id": "F0057",
"section": "2-1-7. 소각, 매몰, 훈증, 박피",
File diff suppressed because it is too large Load Diff
@@ -2711,10 +2711,16 @@
],
"first_rows": [
[
"400 450 600",
"120 150 300",
"750 900",
"450 600"
"400",
"120",
"750",
"450"
],
[
"450",
"150",
"900",
"600"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -3402,11 +3408,11 @@
"4.0t 급"
],
[
"400 500 600 800 900 1,000",
"400",
"1.2",
"0.6 1.0 1.4",
"0.6 0.9 1.5",
"0.6 1.2 1.4 1.7"
"0.6",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -3519,13 +3525,13 @@
"16"
],
[
"400 500 600 800 900 1,000",
"40 50 60",
"45 60",
"50 60",
"35 40 50 70 80 90",
"40 50 60 80 90 100",
"50 60 80 100 110 130"
"400",
"40",
"45",
"50",
"35",
"40",
"50"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -5493,17 +5499,17 @@
"계"
],
[
"2101-0010 0015 0020 0025 0030 0035 0040 0050 0070 0080 0100 0150 0220 0280 0300",
"10 (0.29) 15 (0.38) 20 (0.57) 25 (0.76) 30 (1.15) 35 (1.33) 40 (1.53) 50 (1.91) 70 (2.29) 80 (2.68) 100 150 220 280 300",
"11,200 12,800 12,800 12,800 12,800 12,800 14,000 14,000 14,000 14,000 14,000 14,000 14,000 14,000 14,000",
"1,430 1,430 1,430 1,430 1,430 1,430 1,250 1,250 1,250 1,250 1,250 1,250 1,250 1,250 1,250",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.65 0.65 0.65 0.65 0.65 0.65 0.75 0.75 0.75 0.75 0.75 0.75 0.88 0.88 0.88",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"804 703 703 703 703 703 643 643 643 643 643 643 643 643 643",
"580 508 508 508 508 508 536 536 536 536 536 536 629 629 629",
"425 420 420 420 420 420 472 472 472 472 472 472 472 472 472",
"1,809 1,631 1,631 1,631 1,631 1,631 1,651 1,651 1,651 1,651 1,651 1,651 1,744 1,744 1,744"
"2101-0010",
"10 (0.29)",
"11,200",
"1,430",
"0.9",
"0.65",
"0.1",
"804",
"580",
"425",
"1,809"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -5966,17 +5972,17 @@
"계"
],
[
"3108-0040 0060 0080 0100 0120",
"40t (80㎾) 60t (120㎾) 80t (160㎾) 100t (200㎾) 120t (240㎾)",
"9,000 11,000 11,000 11,000 11,000",
"890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9",
"0.75 0.75 0.75 0.75 0.75",
"0.1 0.1 0.1 0.1 0.1",
"1,000 818 818 818 818",
"833 682 682 682 682",
"668 659 659 659 659",
"2,501 2,159 2,159 2,159 2,159"
"3108-0040",
"40t (80㎾)",
"9,000",
"890",
"0.9",
"0.75",
"0.1",
"1,000",
"833",
"668",
"2,501"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6353,17 +6359,17 @@
"계"
],
[
"5111-0040 0050 0060 0076 0091",
"40.64㎝× 15.24㎝ 3.73㎾ 45.72㎝× 15.24㎝ 5.60㎾ 60.96㎝× 15.24㎝ 7.46㎾ 76.20㎝× 15.24㎝ 11.19㎾ 91.44㎝× 15.24㎝ 14.92㎾",
"7,000 7,000 7,000 7,000 7,000",
"890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9",
"0.25 0.25 0.25 0.25 0.25",
"0.1 0.1 0.1 0.1 0.1",
"1,286 1,286 1,286 1,286 1,286",
"357 357 357 357 357",
"682 682 682 682 682",
"2,325 2,325 2,325 2,325 2,325"
"5111-0040",
"40.64㎝× 15.24㎝ 3.73㎾",
"7,000",
"890",
"0.9",
"0.25",
"0.1",
"1,286",
"357",
"682",
"2,325"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6439,17 +6445,17 @@
"계"
],
[
"0002 0003 0004 0005",
"91.44㎝× 243.84㎝ 3.73㎾ 91.44㎝× 365.76㎝ 3.73㎾ 106.68㎝× 304.86㎝ 7.46㎾ 106.68㎝× 426.72㎝ 7.46㎾",
"12,000 12,000 12,000 12,000",
"890 890 890 890",
"0.9 0.9 0.9 0.9",
"0.4 0.4 0.4 0.4",
"0.1 0.1 0.1 0.1",
"750 750 750 750",
"333 333 333 333",
"655 655 655 655",
"1,738 1,738 1,738 1,738"
"0002",
"91.44㎝× 243.84㎝ 3.73㎾",
"12,000",
"890",
"0.9",
"0.4",
"0.1",
"750",
"333",
"655",
"1,738"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6482,17 +6488,17 @@
"계"
],
[
"5113-0001 0002 0003 0004 0005 0006 0007",
"25.4㎝× 40.64㎝ 18.65㎾ 25.4㎝× 50.8㎝ 22.38㎾ 25.4㎝× 60.96㎝ 29.84㎾ 25.4㎝× 91.44㎝ 44.76㎾ 45.72㎝× 60.90㎝ 55.95㎾ 45.72㎝× 91.44㎝ 82.06㎾ 50.8㎝× 91.44㎝ 104.44㎾",
"12,000 12,000 12,000 12,000 12,000 12,000 12,000",
"890 890 890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.85 0.85 0.85 0.85 0.85 0.85 0.85",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"750 750 750 750 750 750 750",
"708 708 708 708 708 708 708",
"655 655 655 655 655 655 655",
"2,113 2,113 2,113 2,113 2,113 2,113 2,113"
"5113-0001",
"25.4㎝× 40.64㎝ 18.65㎾",
"12,000",
"890",
"0.9",
"0.85",
"0.1",
"750",
"708",
"655",
"2,113"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6525,17 +6531,17 @@
"계"
],
[
"0008 0009 0010 0011",
"63.5㎝× 101.6㎝ 111.90㎾ 76.2㎝× 101.6㎝ 141.74㎾ 76.2㎝× 106.68㎝ 141.74㎾ 106.68㎝× 121.92㎝ 231.26㎾",
"12,000 12,000 12,000 12,000",
"890 890 890 890",
"0.9 0.9 0.9 0.9",
"0.85 0.85 0.85 0.85",
"0.1 0.1 0.1 0.1",
"750 750 750 750",
"708 708 708 708",
"655 655 655 655",
"2,113 2,113 2,113 2,113"
"0008",
"63.5㎝× 101.6㎝ 111.90㎾",
"12,000",
"890",
"0.9",
"0.85",
"0.1",
"750",
"708",
"655",
"2,113"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6568,17 +6574,17 @@
"계"
],
[
"5114-0001 0002 0003 0004 0005 0006 0007 0008",
"40.64㎝× 40.64㎝ 44.76㎾ 60.96㎝× 40.64㎝ 55.95㎾ 76.2㎝× 45.72㎝ 111.90㎾ 76.2㎝× 63.5㎝ 130.55㎾ 76.2㎝× 76.2㎝ 223.80㎾ 101.6㎝× 66.04㎝ 149.20㎾ 104.14㎝× 76.2㎝ 223.80㎾ 139.7㎝× 76.2㎝ 242.45㎾",
"12,000 12,000 12,000 12,000 12,000 12,000 12,000 12,000",
"890 890 890 890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.85 0.85 0.85 0.85 0.85 0.85 0.85 0.85",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"750 750 750 750 750 750 750 750",
"708 708 708 708 708 708 708 708",
"655 655 655 655 655 655 655 655",
"2,113 2,113 2,113 2,113 2,113 2,113 2,113 2,113"
"5114-0001",
"40.64㎝× 40.64㎝ 44.76㎾",
"12,000",
"890",
"0.9",
"0.85",
"0.1",
"750",
"708",
"655",
"2,113"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6611,17 +6617,17 @@
"계"
],
[
"5115-0030 0055 0075 0095",
"60.96 (22㎾) 91.44 (40.5㎾) 121.92 (55㎾) 125.94 (70㎾)",
"12,000 12,000 12,000 12,000",
"890 890 890 890",
"0.9 0.9 0.9 0.9",
"0.7 0.7 0.7 0.7",
"0.1 0.1 0.1 0.1",
"750 750 750 750",
"583 583 583 583",
"655 655 655 655",
"1,988 1,988 1,988 1,988"
"5115-0030",
"60.96 (22㎾)",
"12,000",
"890",
"0.9",
"0.7",
"0.1",
"750",
"583",
"655",
"1,988"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6654,17 +6660,17 @@
"계"
],
[
"5116-0001 0002 0003 0004 0005 0006 0007 0008",
"91.44㎝× 243.84㎝ 5.60㎾ 91.44㎝× 304.8㎝ 5.60㎾ 121.91㎝× 243.84㎝ 7.46㎾ 121.91㎝× 304.8㎝ 7.46㎾ 121.91㎝× 356.76㎝ 11.19㎾ 121.91㎝× 426.72㎝ 11.19㎾ 152.4㎝× 365.76㎝ 14.92㎾ 152.4㎝× 426.72㎝ 18.65㎾",
"12,000 12,000 12,000 12,000 12,000 12,000 12,000 12,000",
"890 890 890 890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.55 0.55 0.55 0.55 0.55 0.55 0.55 0.55",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"750 750 750 750 750 750 750 750",
"458 458 458 458 458 458 458 458",
"655 655 655 655 655 655 655 655",
"1,863 1,863 1,863 1,863 1,863 1,863 1,863 1,863"
"5116-0001",
"91.44㎝× 243.84㎝ 5.60㎾",
"12,000",
"890",
"0.9",
"0.55",
"0.1",
"750",
"458",
"655",
"1,863"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6697,17 +6703,17 @@
"계"
],
[
"5117-0001 0002 0003 0004 0005 0006 0007 0008",
"91.44㎝× 243.84㎝ 7.46㎾ 109.73㎝× 304.8㎝ 7.46㎾ 121.91㎝× 304.8㎝ 11.19㎾ 121.91㎝× 356.76㎝ 14.92㎾ 121.91㎝× 426.72㎝ 14.92㎾ 152.4㎝× 365.76㎝ 22.38㎾ 152.4㎝× 426.72㎝ 22.38㎾ 152.4㎝× 487.68㎝ 29.84㎾",
"12,000 12,000 12,000 12,000 12,000 12,000 12,000 12,000",
"890 890 890 890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.55 0.55 0.55 0.55 0.55 0.55 0.55 0.55",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"750 750 750 750 750 750 750 750",
"458 458 458 458 458 458 458 458",
"655 655 655 655 655 655 655 655",
"1,863 1,863 1,863 1,863 1,863 1,863 1,863 1,863"
"5117-0001",
"91.44㎝× 243.84㎝ 7.46㎾",
"12,000",
"890",
"0.9",
"0.55",
"0.1",
"750",
"458",
"655",
"1,863"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6740,17 +6746,17 @@
"계"
],
[
"5118-0001 0002 0003",
"7.65㎥ 7.46㎾ 16.06㎥ 11.19㎾ 19.11㎥ 14.92㎾",
"12,000 12,000 12,000",
"890 890 890",
"0.9 0.9 0.9",
"0.25 0.25 0.25",
"0.1 0.1 0.1",
"750 750 750",
"208 208 208",
"655 655 655",
"1,613 1,613 1,613"
"5118-0001",
"7.65㎥ 7.46㎾",
"12,000",
"890",
"0.9",
"0.25",
"0.1",
"750",
"208",
"655",
"1,613"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -6783,17 +6789,17 @@
"계"
],
[
"0004 0005 0006 0007",
"22.94㎥ 14.92㎾ 26.76㎥ 18.65㎾ 34.41㎥ 22.38㎾ 53.52㎥ 29.84㎾",
"12,000 12,000 12,000 12,000",
"890 890 890 890",
"0.9 0.9 0.9 0.9",
"0.25 0.25 0.25 0.25",
"0.1 0.1 0.1 0.1",
"750 750 750 750",
"208 208 208 208",
"655 655 655 655",
"1,613 1,613 1,613 1,613"
"0004",
"22.94㎥ 14.92㎾",
"12,000",
"890",
"0.9",
"0.25",
"0.1",
"750",
"208",
"655",
"1,613"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -7354,17 +7360,17 @@
"계"
],
[
"6202-0060 0125 0200",
"3060 (3.7) 40125 (7.5) 50200 (11)",
"4,000 4,000 4,000",
"890 890 890",
"0.9 0.9 0.9",
"0.55 0.55 0.55",
"0.1 0.1 0.1",
"2,250 2,250 2,250",
"1,375 1,375 1,375",
"730 730 730",
"4,355 4,355 4,355"
"6202-0060",
"3060 (3.7)",
"4,000",
"890",
"0.9",
"0.55",
"0.1",
"2,250",
"1,375",
"730",
"4,355"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -8646,18 +8652,18 @@
"계"
],
[
"7430-1100 1300 1500",
"수동 싱글 드럼",
"1 (11.19) 3 (22.38) 5 (37.30)",
"8,000 8,000 8,000",
"890 890 890",
"0.9 0.9 0.9",
"1.1 1.1 1.1",
"0.1 0.1 0.1",
"1,125 1,125 1,125",
"1,375 1,375 1,375",
"674 674 674",
"3,174 3,174 3,174"
"7430-1100",
"수동",
"1 (11.19)",
"8,000",
"890",
"0.9",
"1.1",
"0.1",
"1,125",
"1,375",
"674",
"3,174"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -8692,18 +8698,18 @@
"계"
],
[
"7430-1100 1300 1500 2300 2500",
"수동 싱글 드럼 더블 드럼",
"1 (11.19) 3 (22.38) 5 (37.30) 3 (22.38) 5 (37.30)",
"8,000 8,000 8,000 8,000 8,000",
"890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9",
"1.1 1.1 1.1 1.1 1.1",
"0.1 0.1 0.1 0.1 0.1",
"1,125 1,125 1,125 1,125 1,125",
"1,375 1,375 1,375 1,375 1,375",
"674 674 674 674 674",
"3,174 3,174 3,174 3,174 3,174"
"7430-1100",
"수동",
"1 (11.19)",
"8,000",
"890",
"0.9",
"1.1",
"0.1",
"1,125",
"1,375",
"674",
"3,174"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -8738,18 +8744,18 @@
"계"
],
[
"7431-1100 1300 2300 2500",
"자동 싱글 드럼 더블 드럼",
"1 (11.19) 3 (22.38) 3 (22.38) 5 (37.30)",
"8,000 8,000 8,000 8,000",
"890 890 890 890",
"0.9 0.9 0.9 0.9",
"1.1 1.1 1.1 1.1",
"0.1 0.1 0.1 0.1",
"1,125 1,125 1,125 1,125",
"1,375 1,375 1,375 1,375",
"674 674 674 674",
"3,174 3,174 3,174 3,174"
"7431-1100",
"자동 싱글",
"1 (11.19)",
"8,000",
"890",
"0.9",
"1.1",
"0.1",
"1,125",
"1,375",
"674",
"3,174"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -9300,18 +9306,18 @@
"계"
],
[
"7811-0025 0030 0040 0045 0070 0120",
"가솔린 엔진",
"1.87 2.24 2.98 3.36 5.22 8.95",
"8,000 8,000 8,000 8,000 8,000 8,000",
"890 890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9 0.9",
"0.8 0.8 0.8 0.8 0.8 0.8",
"0.1 0.1 0.1 0.1 0.1 0.1",
"1,125 1,125 1,125 1,125 1,125 1,125",
"1,000 1,000 1,000 1,000 1,000 1,000",
"674 674 674 674 674 674",
"2,799 2,799 2,799 2,799 2,799 2,799"
"7811-0025",
"가솔린",
"1.87",
"8,000",
"890",
"0.9",
"0.8",
"0.1",
"1,125",
"1,000",
"674",
"2,799"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -9346,18 +9352,18 @@
"계"
],
[
"7812-0005 0007 0009 0015 0018 0020 0035 0070 0100 0150 0200",
"디젤 엔진",
"3.73 5.22 6.71 11.19 13.43 14.92 26.11 52.22 74.60 111.90 149.20",
"8,000 8,000 8,000 8,000 8,000 8,000 8,000 8,000 8,000 8,000 8,000",
"890 890 890 890 890 890 890 890 890 890 890",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"1,125 1,125 1,125 1,125 1,125 1,125 1,125 1,125 1,125 1,125 1,125",
"1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000",
"674 674 674 674 674 674 674 674 674 674 674",
"2,799 2,799 2,799 2,799 2,799 2,799 2,799 2,799 2,799 2,799 2,799"
"7812-0005",
"디젤",
"3.73",
"8,000",
"890",
"0.9",
"0.8",
"0.1",
"1,125",
"1,000",
"674",
"2,799"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -9911,18 +9917,18 @@
"계"
],
[
"9010-0003 0006 0010 0012 0020 0022 0033 0040 0044 0060 0080 0120 0200",
"9010-0003",
"비항SD",
"224 448 746 895 1,492 1,641 2,462 2,984 3,282 4,476 5,968 8,952 14,920",
"30,000 30,000 30,000 3,0000 30,000 30,000 30,000 30,000 30,000 30,000 30,000 30,000 30,000",
"2,670 2,670 2,670 2,670 2,670 2,670 2,670 2,670 2,670 2,670 2,670 2,670 2,670",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75",
"0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.09",
"300 300 300 300 300 300 300 300 300 300 300 300 300",
"250 250 250 250 250 250 250 250 250 250 250 250 250",
"199 199 199 199 199 199 199 199 199 199 199 199 199",
"749 749 749 749 749 749 749 749 749 749 749 749 749"
"224",
"30,000",
"2,670",
"0.9",
"0.75",
"0.09",
"300",
"250",
"199",
"749"
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -9956,18 +9962,18 @@
"계"
],
[
"9020- 0010 0015 0016",
"비항SD 0.65㎥ 1.00 1.50",
"75 112 119",
"20,000 20,000 20,000",
"1,780 1,780 1,780",
"0.9 0.9 0.9",
"0.75 0.75 0.75",
"0.1 0.1 0.1",
"450 450 450",
"375 375 375",
"331 331 331",
"1,156 1,156 1,156"
"9020-",
"비항SD",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10001,18 +10007,18 @@
"계"
],
[
"9030- 0016 0018 0025 0035 0045 0050 0080 0100 0240",
"SD 10ton 40ton 50ton 65ton 80ton 90ton 120ton 150ton",
"119 134 187 261 336 373 597 746 1,790",
"28,000 28,000 28,000 28,000 28,000 28,000 28,000 28,000 28,000",
"1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"321 321 321 321 321 321 321 321 321",
"286 286 286 286 286 286 286 286 286",
"401 401 401 401 401 401 401 401 401",
"1,008 1,008 1,008 1,008 1,008 1,008 1,008 1,008 1,008"
"9030-",
"SD",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10046,18 +10052,18 @@
"계"
],
[
"9040- 0010 0030 0050 0060 0100 0120 0200 0250 0300 0380 0680",
"9040-",
"SD",
"7.5 22.4 37.3 44.8 74.6 89.5 149.2 186.5 223.8 283.5 507.3",
"28,800 28,800 28,800 28,800 28,800 28,800 28,800 28,800 28,800 28,800 28,800",
"1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"313 313 313 313 313 313 313 313 313 313 313",
"278 278 278 278 278 278 278 278 278 278 278",
"400 400 400 400 400 400 400 400 400 400 400",
"991 991 991 991 991 991 991 991 991 991 991"
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10091,18 +10097,18 @@
"계"
],
[
"9050- 0075 0150 0450 0750 0850",
"SD 15ton 달기 30ton 60ton 120ton 150ton",
"56.0 111.9 335.7 559.5 634.1",
"19,200 19,200 19,200 19,200 19,200",
"1,430 1,430 1,430 1,430 1,430",
"0.9 0.9 0.9 0.9 0.9",
"0.75 0.75 0.75 0.75 0.75",
"0.1 0.1 0.1 0.1 0.1",
"469 469 469 469 469",
"391 391 391 391 391",
"408 408 408 408 408",
"1,268 1,268 1,268 1,268 1,268"
"9050-",
"SD",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10136,18 +10142,18 @@
"계"
],
[
"9060-0060",
"SD, 60㎥",
"9060-",
"SD",
"",
"19,200",
"1,430",
"0.9",
"0.75",
"0.1",
"469",
"391",
"408",
"1,268"
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10181,18 +10187,18 @@
"계"
],
[
"9070- 0015 0020",
"50ton대선 5ton달기 80ton대선 8ton달기",
"11.19 14.92",
"16,000 16,000",
"1,430 1,430",
"0.9 0.9",
"0.7 0.7",
"0.1 0.1",
"563 563",
"438 438",
"413 413",
"1,414 1,414"
"9070-",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10226,18 +10232,18 @@
"계"
],
[
"9080- 0050 0080 0100 0120 0150 0200 0300 0500 0700 1000 1100 1400 1500 1750 2000 3000",
"SD 50ton 80ton 100ton 120ton 150ton 200ton 300ton 500ton 700ton 1,000ton 1,100ton 1,400ton 1,500ton 1,750ton 2,000ton 3,000ton",
"9080-",
"SD",
"",
"19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200 19,200",
"1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430 1,430",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469",
"365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365",
"408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408",
"1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242 1,242"
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -10271,18 +10277,18 @@
"계"
],
[
"9090- 0800 1000 1200 1300 1400 1500 1600",
"9090-",
"",
"597 746 895 970 1,044 1,119 1,194",
"30,000 30,000 30,000 30,000 30,000 30,000 30,000",
"2,670 2,670 2,670 2,670 2,670 2,670 2,670",
"0.9 0.9 0.9 0.9 0.9 0.9 0.9",
"0.85 0.85 0.85 0.85 0.85 0.85 0.85",
"0.1 0.1 0.1 0.1 0.1 0.1 0.1",
"300 300 300 300 300 300 300",
"283 283 283 283 283 283 283",
"221 221 221 221 221 221 221",
"804 804 804 804 804 804 804"
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
@@ -11840,16 +11846,28 @@
],
"first_rows": [
[
"80㎜ 100 150 200 250 300 350 400 450 500 600 700 800 900",
"24.3 32.5 43.1 63.3 83.8 92.7 106.9 141.6 154.3 163.4 192.2 239.4 265.6 297.8",
"32.8 44.5 64.4 85.3 94.1 108.5 144.0 155.7 165.2 193.5 243.4 268.0 300.0",
"50.5 67.2 88.1 97.5 109.4 149.3 157.8 168.0 196.0 246.0 273.0 305.0",
"92.1 101.4 113.0 160.0 170.3 175.0 205.0 250.0 280.0 315.0",
"167.4 190.0 234.0 279.0 295.0 357.0 434.0 477.5",
"205.0 253.0 295.0 320.0 370.0 450.0 490.5",
"366.0 485.0 538.0 645.0 759.0",
"557.6 668.8 779.7",
"577.9 693.4 800.9"
"80㎜",
"24.3",
"",
"",
"",
"",
"",
"",
"",
""
],
[
"100",
"32.5",
"32.8",
"",
"",
"",
"",
"",
"",
""
]
],
"reason": "헤더·첫 행에 단위·밑수·직종 표지 없음"
File diff suppressed because it is too large Load Diff
@@ -4,7 +4,7 @@
"effective_date": "2026-01-01",
"pum_edition": "2026-01-01",
"toc_edition": "산림청고시제2025-82호",
"generated_at": "2026-09-18T05:20:39+09:00",
"generated_at": "2026-09-18T06:52:06+09:00",
"dataset_version": {
"dataset_id": "pum_forest",
"effective_date": "2026-01-01",
@@ -25,9 +25,9 @@
"tables_attached": 453,
"tables_orphan": 22,
"form_undetermined": 0,
"basis_found": 251,
"basis_missing": 79,
"basis_absent_in_source": 69,
"basis_found": 249,
"basis_missing": 80,
"basis_absent_in_source": 70,
"basis_unparsed": 10,
"basis_grouped": 59,
"axis_roles": {
@@ -4549,9 +4549,9 @@
"source_line": 1353,
"pum_form": "requirement",
"form_basis": "직종 표기((인)·인부·공)",
"basis_quantity": 1.0,
"basis_unit": "인",
"basis_source": "표 안",
"basis_quantity": null,
"basis_unit": null,
"basis_source": "본문",
"resource_shares": {},
"partial_ratio": false,
"expression_cells": [],
@@ -6042,9 +6042,9 @@
"source_line": 1661,
"pum_form": "coefficient",
"form_basis": "헤더 '손료계수'",
"basis_quantity": 1.0,
"basis_unit": "인",
"basis_source": "표 안",
"basis_quantity": null,
"basis_unit": null,
"basis_source": "본문",
"resource_shares": {},
"partial_ratio": false,
"expression_cells": [],
@@ -6513,8 +6513,8 @@
"pum_table_id": "F0076",
"section": "3-2. 작업로 선정",
"source_line": 1742,
"pum_form": "productivity",
"form_basis": "헤더 '인/1일'",
"pum_form": "requirement",
"form_basis": "사람 판정 — 작업로 선정 — 목적물 1km 당 소요인력(PDF 대조로 정당 확인)",
"basis_quantity": 1.0,
"basis_unit": "km",
"basis_source": "표 안",
@@ -27,9 +27,15 @@
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 3108-0040 fuel_type": {
"source": "heavy_oil",
"data": "diesel",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"셈 연료 코드 수": {
"source": 201,
"data": 214,
"source": 272,
"data": 274,
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
}
@@ -205,83 +211,6 @@
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0025": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0050": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0100": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0125": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0150": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0200": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0250": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0350": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0450": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0500": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7505-0700": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7993-0020": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
@@ -289,23 +218,6 @@
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7994-0050": {
"what": "원문 표 토막 수가 안 맞음",
"why": "원문 운전경비 표 토막 수가 코드 수와 안 맞음(`동력 15.1㎾`·`73.7+ 휘발유54.5` 등) — 이 줄 자료 값은 못 봄",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 표 3108-0040": {
"codes": [
"3108-0040",
"3901-0300"
],
"why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 표 5801-0045": {
"codes": [
"5801-0045",
@@ -330,32 +242,129 @@
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7101-0450": {
"codes": [
"7101-0450",
"7811-0120"
],
"why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 표 7812-0005": {
"codes": [
"7812-0005",
"7994-0050"
],
"why": "원문 운전경비 표 토막 수가 안 맞음 — 이 표 줄은 못 읽음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"운전사 기종별 판단": {
"what": 121,
"why": "기종→운전사 구분(explicit_mappings)은 사람 판단 — 원문 8-1-3 5호는 기종 이름 글만 있음",
"class": "㉯ 남이 고쳐야 풀림",
"owner": "랩탑 메인",
"owner_ask": "기계 원천 벌(mach_base_2026.json) 재추출 — 그 추출기가 이 저장소에 없어 우리가 못 돌림"
},
"연료 못 읽은 줄 7360-0090": {
"what": "원문 표 토막 수가 안 맞음",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9020-": {
"what": "9020-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9030-": {
"what": "9030-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9040-": {
"what": "9040-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 9050-": {
"what": "9050-",
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"손료 줄 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": "㉯ 남이 고쳐야 풀림"
},
"연료 표 3450-0642": {
"codes": [
"3450-0642",
"3450-0642"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7202-0008": {
"codes": [
"7202-0008",
"7202-0008"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7202-0010": {
"codes": [
"7202-0010",
"7202-0010"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7360-0090": {
"codes": [
"7360-0090",
"7360-0090"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7991-0050": {
"codes": [
"7991-0050",
"7991-0050"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7991-0100": {
"codes": [
"7991-0100",
"7991-0100"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7991-0500": {
"codes": [
"7991-0500",
"7991-0500"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7992-0001": {
"codes": [
"7992-0001",
"7992-0001"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
},
"연료 표 7993-0020": {
"codes": [
"7993-0020",
"7993-0020"
],
"why": "⬜ **기계 자료 재추출 대기** — 코덱스가 8-4 운전경비 92종을 md 에 전사했으나(2026-09-18) `mach_base_2026.json` 은 그 앞 판이다. 그 벌을 만드는 추출기가 이 저장소에 없어 우리가 못 돌린다. ⇒ 고칠 자리는 마스터가 아니라 **기계 원천 벌 재추출**이다.",
"class": "㉯ 남이 고쳐야 풀림"
}
},
"material_blind": {
@@ -45,28 +45,6 @@
}
},
"basis": {
"F0046": {
"section": "2-1-1",
"md": null,
"md_evidence": "",
"master": [
1.0,
"인"
],
"class": "㉰ 사용자 판단 필요",
"class_why": "⚠ 마스터 밑수가 「1인」 — 「인」은 품의 단위지 밑수가 아니라는 2026-09-09 판정과 어긋남"
},
"F0068": {
"section": "2-2-5",
"md": null,
"md_evidence": "",
"master": [
1.0,
"인"
],
"class": "㉰ 사용자 판단 필요",
"class_why": "⚠ 위와 같음 · 게다가 계수표라 밑수가 없어야 함"
},
"F0076": {
"section": "3-2",
"md": null,
@@ -142,6 +120,127 @@
"class_why": "위와 같음",
"owner": "랩탑 메인",
"owner_ask": "대조 시험의 **md 밑수 읽기**를 넓혀 줄 것 — 원문이 절 이름·본문·표머리에 적어 둔 자리를 md 쪽이 못 읽어 「마스터가 더 가짐」으로 뜸(마스터 값이 원문과 같음)"
},
"F0132": {
"section": "5-22-4",
"md": [
1.0,
"일"
],
"md_evidence": "(일당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "「일당」은 품의 단위(하루에 얼마)라 밑수로 안 받음",
"갈래": "거절 자리"
},
"F0145": {
"section": "5-28-2",
"md": [
1.0,
"일"
],
"md_evidence": "(일 당)",
"master": null,
"why": "작업조 표(시공량 열이 밑수) — 마스터가 일부러 비움(c3da333e 와 같은 까닭) · 원문 「(일 당)」 은 코덱스 복원(61f35108)",
"class": "㉮ 영영 할 일 아님",
"class_why": "작업조 표 — 밑수가 시공량 열이라 일부러 비움",
"갈래": "거절 자리"
},
"F0257": {
"section": "9-11-1",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "「일당」 · 계수표",
"갈래": "거절 자리"
},
"F0338": {
"section": "12-6",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "작업조 표(포장공 3인·시공량)",
"갈래": "거절 자리"
},
"F0339": {
"section": "12-7-1",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "작업조 표 — 넣으면 호표가 사라짐(2026-09-17 유로폼에서 실증)",
"갈래": "거절 자리"
},
"F0340": {
"section": "12-7-2",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "위와 같음",
"갈래": "거절 자리"
},
"F0341": {
"section": "12-8",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "위와 같음",
"갈래": "거절 자리"
},
"F0395": {
"section": "12-38-3",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일 당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "위와 같음",
"갈래": "거절 자리"
},
"F0447": {
"section": "13-15-2",
"md": [
1.0,
"조"
],
"md_evidence": "(단위: 인/조)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "「인/조」 — 「조」는 세는 단위가 아님",
"갈래": "거절 자리"
},
"F0449": {
"section": "13-16-2",
"md": [
1.0,
"일"
],
"md_evidence": "(단위: 일 당)",
"master": null,
"class": "㉮ 영영 할 일 아님",
"class_why": "위와 같음",
"갈래": "거절 자리"
}
},
"notes": {
@@ -366,7 +465,65 @@
"owner_ask": "`md_notes` 의 이어짐 규칙(`_NOTE_CONT`)에 **「- 숫자.」 로 시작하는 [주] 안쪽 규칙**을 더해 줄 것 — 지금은 「- ①②」·「- -」·「※*·」만 이어짐으로 봐서 「- 4. 고철공제 : A=…」에서 끊김. ⚠ 새 절 제목과 가르는 것이 일(알맹이 없는 짧은 줄만 제목)"
}
},
"form": {},
"form": {
"F0002": {
"section": "1-2-2",
"master": "reference",
"md_mark": "직공인부",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "그 밖"
},
"F0007": {
"section": "1-2-7",
"master": "reference",
"md_mark": "㎥",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "그 밖"
},
"F0038": {
"section": "1-4-26",
"master": "reference",
"md_mark": "적용시공량",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "그 밖"
},
"F0227": {
"section": "8-6-1",
"master": "reference",
"md_mark": "유효 살포량/1회",
"why": "사람 판정 reference(Forms.py) — 기종별 희석배수별 1회 살포량 계산표",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "그 밖"
},
"F0257": {
"section": "9-11-1",
"master": "coefficient",
"md_mark": "",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "거절 자리"
},
"F0325": {
"section": "11-1",
"master": "reference",
"md_mark": "비계공",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "그 밖"
},
"F0454": {
"section": "14-2",
"master": "reference",
"md_mark": "작업량",
"class": "㉮ 영영 할 일 아님",
"class_why": "사람 판정으로 닫힘 — 시험이 md 표지로 가리는 것과 다를 뿐",
"갈래": "부록 예시"
}
},
"form_blind": {
"F0333": {
"section": "12-1-3",
@@ -383,9 +540,209 @@
"why": "증가율(%) 표(높이별 30·40·60%) — 품이 아니라 할증률 모양 · requirement 가 맞는지 사람 확인",
"class": "㉰ 사용자 판단 필요",
"class_why": "증가율(%) 표 — requirement 가 맞는지 사람 확인"
},
"F0046": {
"section": "2-1-1",
"master": "requirement",
"why": "기계별 연료표(천공기 주연료 3ℓ·잡품 95%) — 품 낱말 없음. 같은 모양 F0044·F0045·F0047 은 사람 판정 reference 인데 이것만 requirement",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "그 밖"
},
"F0062": {
"section": "2-1-12",
"master": "requirement",
"why": "값 칸이 「층적부피에 따라 별도계산」·「〃」 — 숫자 없음",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "원문 부재"
},
"F0140": {
"section": "5-26-1",
"master": "requirement",
"why": "머리 소실 — 토성×깊이 숫자만 남음(사람 판정: 100㎡당 보통인부)",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "그 밖"
},
"F0141": {
"section": "5-26-2",
"master": "requirement",
"why": "머리 소실 — 위와 같음",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "그 밖"
},
"F0142": {
"section": "5-26-3",
"master": "requirement",
"why": "머리 소실 — 위와 같음",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "그 밖"
},
"F0195": {
"section": "7-14",
"master": "productivity",
"why": "칸이 뭉침(「㎥ 0.060.07 4.86.0」) — 원문 md 가 병합 칸을 못 풂",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "그 밖"
},
"F0237": {
"section": "8-11",
"master": "productivity",
"why": "작업량이 식 글(「Q = 3.5 ㎥/hr」)",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "그 밖"
},
"F0342": {
"section": "12-9-1",
"master": "requirement",
"why": "수량 칸이 비어 있음 — 원문에 값 없음(「반중력식 옹벽 참조」)",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "원문 부재"
},
"F0343": {
"section": "12-9-2",
"master": "requirement",
"why": "수량 칸이 비어 있음 — 원문에 값 없음",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "원문 부재"
},
"F0344": {
"section": "12-9-3",
"master": "requirement",
"why": "수량 칸이 비어 있음 — 원문에 값 없음",
"class": "㉮ 영영 할 일 아님",
"class_why": "시험이 못 가리는 자리 — 값 없음·머리 소실 따위로 사람 판정에 둠",
"갈래": "원문 부재"
}
},
"cost_rule": {
"F0369": {
"section": "12-22",
"master": "sub_requirement",
"md_rows": [
[
"재료비"
],
[
"설치비",
"재료비의 5%"
]
],
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
},
"F0379": {
"section": "12-29",
"master": "requirement",
"md_rows": [
[
"재료비",
"",
"필요수량"
],
[
"설치비",
"재료비의 5%"
]
],
"why": "⚠ 같은 꼴 6표는 reference 인데 이것만 requirement — 설치비 = 재료비의 5%",
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
},
"F0382": {
"section": "12-31",
"master": "sub_requirement",
"md_rows": [
[
"재료비"
],
[
"설치비",
"주재료비의 5%"
]
],
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
},
"F0383": {
"section": "12-32",
"master": "sub_requirement",
"md_rows": [
[
"재료비",
"P.V.C ∅54m/m"
],
[
"설치비",
"주재료비의 10%"
]
],
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
},
"F0386": {
"section": "12-34-2",
"master": "sub_requirement",
"md_rows": [
[
"재료비",
"1회 기준 46.1%"
],
[
"노무비",
"1회 기준 47.1%"
]
],
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
},
"F0388": {
"section": "12-34-4",
"master": "sub_requirement",
"md_rows": [
[
"재료비",
"JOINT FILLER"
]
],
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
},
"F0390": {
"section": "12-36",
"master": "sub_requirement",
"md_rows": [
[
"제작비",
"견적처리"
],
[
"운송비",
"견적처리"
],
[
"설치비",
"견적처리"
]
],
"class": "㉮ 영영 할 일 아님",
"class_why": "비목 구성표 — `sub_requirement` 로 판정이 닫힘",
"갈래": "그 밖"
}
},
"cost_rule": {},
"_갈래": {
"잣대": "㉮ 는 집계에서 뺀다 — 영영 할 일이 아닌 것(원문에 없음·거절 자리·판정으로 닫힘). ㉯ 는 남의 몫(코덱스 md 읽기·랩탑 메인 시험). ㉰ 만 사람이 정할 자리다.",
"센 날": "2026-09-18",
@@ -3,8 +3,8 @@
** 품의 단위이지 공종 밑수가 아니다.** 원문 대조로 넷이 오독으로 드러났다
8-6-2 드론방제·8-6-3 지상방제 (단위 : )( **소요인력**) ·
13-2-4 야면석 채집 (단위: )( 안이 **·** ).
넓게 버리면 **2-2-5 천공기 사라진** 천공인부 **1인당** 1 숫자 었다.
**숫자가 었을 때만** 인정한.
2026-09-18 **2-2-5 천공기 뒤집혔** 천공인부 1인당 1 1인당 밑수 아니었다
(PDF 대조 · 손료계수표라 애초에 밑수가 없음). **숫자가 어도** 밑수가 아니.
**칸을 이어 붙여 읽지 않는다.** 칸의 **** 칸의 **단위** 붙어 없는 밑수가 생겼다
13-2-4 0.28 | **0.36** **** | 0.60 0.36(원문에 없는 )
@@ -55,9 +55,14 @@ def test_방제_둘은_밑수가_안_선다() -> None:
assert all(unit != "" for unit, _ in 밑수("FP-08-06-03"))
def test_천공기는_그대로_선() -> None:
"""넓게 버리면 사라지는 자리 — 「천공인부 1인당 1대」는 숫자가 붙었다."""
assert ("", 1.0) in 밑수("FP-02-02-05")
def test_천공기도_인은_밑수가_아니() -> None:
"""2026-09-18 **뒤집음** — 「천공인부 1인당 1대」의 「1인당」도 밑수가 아니었다.
앞서는 숫자가 붙었으니 인정으로 두었으나, 안티그래비티 PDF 대조로 글이
**기계 대에 붙는 인원** 말임이 드러났다(2-2-5 손료계수표라 애초에 밑수가 없다).
인은 밑수가 아니다 2026-09-09 판정이 **넓게 옳았다** 사람 판정으로 비워 둔다.
"""
assert 밑수("FP-02-02-05") == [(None, None)]
def test_칸을_이어_붙여_읽지_않는다() -> None:
@@ -41,7 +41,8 @@ def test_되살린_이름과_규격() -> None:
"0240-0007": ("유압식 진동콤팩터(굴착기 부착용)", "0.7"),
"3611-0142": ("콘크리트 피니셔(중앙분리대용)", "105.9"),
"6802-0100": ("파일천공전용장비", "100"),
"9070-0020": ("이우선(비자항)", ""),
# 2026-09-18 규격이 되살아남 — 앞서 빈칸이던 것이 원문 규격으로 섰다(기계 원천 벌 재추출)
"9070-0020": ("이우선(비자항)", "80ton대선 8ton달기"),
}
for code, (name, spec) in expected.items():
machine = CATALOG.machines[code]
@@ -61,7 +61,7 @@ MASTER = OUT_DIR / "work_item_master_2026-01-01.json"
#: 2026-09-17 랩탑 메인 둘째 — 헛단위 뺌(인용을 제목으로 읽은 13-3 표 셋 · 부록 사례 번호 겹침 일곱)으로 다시 뜸
#: (옛 be88f730…). 바뀐 줄은 13-3·4-1·4-2·2-1·2-2·3-1·3-2·3-3·13-4-1·13-5-2 의 표 귀속뿐 —
#: `test_work_item_master_toc` 가 자리를 잼 · 단가표 대조는 그 파일 머리.
BASELINE_WORK_ITEMS_SHA = "803898a371e82c8a66692807af189a646c9b6fb3f077a4054cf6ef6030d8341b"
BASELINE_WORK_ITEMS_SHA = "6f223c690513d139a77ef51674b90de3207bcb5d26a9383ba9e434e7fbc70eec"
#: 열쇠 작업이 새로 얹은 칸. 지문을 잴 때만 떼어낸다.
ADDED_FIELDS = (
@@ -469,8 +469,8 @@ def test_밑수_미확보를_둘로_가른다(master: dict) -> None:
from pathlib import Path as _Path
stats = master["stats"]
assert stats["basis_missing"] == 79
assert stats["basis_absent_in_source"] == 69
assert stats["basis_missing"] == 80
assert stats["basis_absent_in_source"] == 70
# 2026-09-18 「당」 없이 몫으로만 적힌 자리(「(인/100㎡)」·「(대/ton)」)를 가리게 해 다섯을 더 채움.
# 미판독 12 → 9 → 10(가림이 넓어져 새로 드러난 것 포함) · 확보 243 → 251.
# ⚠ 남은 아홉은 **거절 자리**다 — 「(단위 : 인)」 셋(2026-09-09 오독 판정) ·
@@ -493,6 +493,35 @@ def test_밑수_미확보를_둘로_가른다(master: dict) -> None:
assert by_id["F0191"]["basis_unit"] == ""
def test_밑수가_아닌_글을_밑수로_안_읽는다(master: dict) -> None:
"""⚠ 비고의 「1인당」은 **기계 한 대에 붙는 인원** 말이지 공종 밑수가 아니다.
2026-09-18 안티그래비티 PDF 대조 인은 밑수가 아니다 2026-09-09 판정이 옳았고
**파서가 틀린 **이었다(제근 9-21 때와 반대 그때는 판정이 물러났다).
사람 판정으로 **비워 두고**, 미확보 목록에 원문 부재 사유를 달아 다음 바퀴에 세어지게 한다.
"""
import json as _json
from pathlib import Path as _Path
by_id = {t["pum_table_id"]: t for it in master["work_items"] for t in it["tables"]}
for table_id in ("F0046", "F0068"):
assert by_id[table_id]["basis_quantity"] is None, table_id
assert by_id[table_id]["basis_unit"] is None, table_id
items = {
i["pum_table_id"]: i
for i in _json.loads(
_Path("resources/data_work_item_master/basis_missing_2026-01-01.json").read_text(
encoding="utf-8"
)
)["items"]
}
assert items["F0046"]["why"].startswith("원문 부재") # 집계가 이 낱말로 가른다
assert "F0068" not in items # 계수표라 애초에 목록에 안 든다
# 3-2 작업로 선정은 목적물 1km 가 **정당한 밑수**다 — 값은 소요인력이라 소요량형
assert by_id["F0076"]["pum_form"] == "requirement"
assert by_id["F0076"]["basis_quantity"] == 1.0 and by_id["F0076"]["basis_unit"] == "km"
def test_원문_대조_밑수_판정(master: dict) -> None:
"""원문 md ↔ 마스터 전수 대조(안티그래비티 02544795)에서 나온 밑수를 반영했는가.
@@ -512,8 +541,8 @@ def test_원문_대조_밑수_판정(master: dict) -> None:
# 「인」은 밑수가 아니다 — 보고가 그렇게 적었어도 안 넣는다
for table_id in ("F0228", "F0229", "F0230"):
assert by_id[table_id]["basis_unit"] != "", table_id
# 분모가 둘인 자리도 안 넣는다 — 3-2 작업로 선정은 원문이 「인/1일 1km당」이다
assert by_id["F0076"]["basis_unit"] != "ha"
# ⚠ 3-2 작업로 선정은 2026-09-18 PDF 대조로 **목적물 1km 가 정당**함이 확인됐다(반쪽 아님)
assert by_id["F0076"]["basis_unit"] == "km"
# ⚠ **작업조 표는 밑수를 비워 둔다** — 원문이 「(단위: 일 당)」이라도 넣지 않는다.
# 밑수가 시공량 열이라 「1일」을 박으면 그 길이 막혀 호표가 통째로 사라진다
# (2026-09-17 유로폼 12-38-3 에서 실제로 사라져 드러남).