Files
Aislo/B08_Quantity/B08_Quantity_Build_WorkItemMaster_Forms.py
T
eomsangdonandClaude Opus 5 88a9df01a5 feat(b08): 원천 벌 다시 뽑힌 뒤 마스터 다시 지음 — 밑수 238→242 · 건설 새 표 열 · 5-26 밑수 992㎡
랩탑 메인의 추출기(줄 번호를 안 쓰고 글자로 맞대는 쪽)가 서서 원천 벌이 다시 뽑혔음.
막혀 있던 「다시 짓기」를 그 위에서 돌림.

- 산림 밑수 확보 **238 → 242** · 미확보 92 → 88 (5-19-1 · 5-27 · 5-28-1 · 9-21 되살아남)
- 건설 표 **2,192 → 2,202** — 코덱스가 되살린 제8장 손료표 열(C2193~C2202) · 표 귀속 2,202/2,202
- 건설 [주] 실린 표 1,106 → 1,110 · 형태 미판정 881 → 891(새 표 열이 미판정으로 들어옴)

⚠ **5-26-1·2·3 밑수를 사람 판정 100㎡ → 원문 992㎡ 로 물림**(브레인 판정)
  원문 L2878·L2892·L2905 가 「(인/992㎡당)」. 앞서 100㎡ 는 **머리가 소실돼 원문을 못 읽던 때**
  흔한 밑수로 메운 값이었음 — 이 고리의 잣대가 「원문이 정본」이라 사람 판정이 물러남.
  ⚠ 100 과 992 는 열 배 가까이 달라 **금액이 크게 갈리는 자리** — 사유를 코드와 시험에 남김
  (992㎡ 는 「0.1정(1반)」에 해당하는 옛 면적 단위)

시험·이름표 손질 — 지문 갱신 · 건설 표 수 2,192 → 2,202 · 이름표 줄 수(원천 2,202 · 미확보 88 ·
건설 미판정 891) · 「사람 판정은 원문이 나오면 물러난다」를 시험으로 못박음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsGw1Dz9HmhuAxGisxmDPF
2026-09-18 02:30:49 +09:00

305 lines
20 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""공종 마스터 — **사람이 가른 표 형태** (2026-09-13 축 C 1장 · 미판정 표 판정).
자동 판정(`detect_form`)이 못 가르거나(undetermined 76표) 잘못 가른 표만 싣는다.
표마다 **왜 그렇게 갈랐는지 한 줄** — 원문 `(산림청고시 제2025-82호) 산림사업 표준품셈.md`.
⚠⚠ 뒤집히면 20배 틀림 — `productivity`(1÷값) / `requirement`(값÷밑수)는 **표 머리와 표 바로 위
본문의 단위 표현**으로만 가른다. 행 이름·비고의 직종 이름에 끌려 읽지 않는다.
⚠ **못 가른 표는 싣지 않는다** — undetermined 로 남는다.
2026-09-17 안티그래비티 원문 대조로 **마지막 14표를 가름** — 산림 미판정이 0 이 됐다.
⚠ `coefficient`·`reference` 로 가른 표는 일위대가 줄로 안 읽힌다(자원 축이 건너뜀) — 시공능력
공식 계수는 형태와 상관없이 공식 읽기가 표를 직접 본다.
⚠ 표 번호는 원천 차례로 매긴 것이라 **절 번호를 함께 대조**한다 — 어긋나면 빌드를 멈춘다.
"""
from __future__ import annotations
#: 표 번호 → (절 번호, 형태, 까닭).
FORM_JUDGMENTS: dict[str, tuple[str, str, str]] = {
# ── 제2장 재료 기준 ─────────────────────────────────────────────
"F0044": (
"2-1-1",
"reference",
"기계별 주연료(ℓ/일·대)·잡품(%) — 행이 자원이 아니라 기계, 재료비 산출 기준",
),
"F0045": ("2-1-1", "reference", "위와 같은 모양(2드럼 케이블윈치)"),
"F0047": (
"2-1-2",
"reference",
"기계별 경유(ℓ/일·대)·잡품(%) — [주]③ 「1일당 소요량」, 행이 기계",
),
"F0048": ("2-1-3", "reference", "머리 「소요비용(원)」 — 품이 아니라 교체 1회당 금액"),
"F0054": ("2-1-5", "requirement", "본문 「(본당)」 + 행 「소금처리량(g)」 — 본당 재료 소요량"),
"F0063": (
"2-1-13",
"reference",
"「소모율 0.00125개/hr」 — 기계 시간당 소모품, 공종 밑수가 아님",
),
# ── 제5장 조림·녹화 ─────────────────────────────────────────────
"F0100": ("5-3-1", "reference", "수종별 묘목 규격(소·중·대묘) 표"),
"F0101": ("5-3-1", "reference", "간장·근원경 규격 기준 표"),
"F0105": ("5-3-4", "coefficient", "지주목 미설치 감률 「인력품의 10%·20%」"),
"F0107": ("5-3-5", "coefficient", "위와 같은 감률(흉고직경 표)"),
"F0137": ("5-24-2", "reference", "머리 「종자배합비율(%)」 조견표"),
"F0138": ("5-24-2", "reference", "위와 같은 조견표(기타 적용지역)"),
"F0146": ("5-29", "coefficient", "행이 K(버킷계수)·f·E·Cm — 굴착기 작업량 공식 계수"),
# ── 제7장 수확·운재 ─────────────────────────────────────────────
"F0187": ("7-9-2", "coefficient", "본문 「(단위 : %)」 — 집재재적·거리별 수집량 증가율"),
"F0189": ("7-11", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 대당 일 작업량"),
"F0190": ("7-11", "productivity", "위와 같음(최대집재거리 80m 이하)"),
"F0194": ("7-13", "reference", "검척 산출 예시(말구직경×개수) 표"),
"F0196": (
"7-15-1",
"productivity",
"표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량, 「회수」 줄은 참고",
),
"F0197": (
"7-15-2",
"productivity",
"표 바로 위 「(㎥/1대, 1일)」 — 「운재량」 줄이 작업량, [주]① 1대 1일",
),
"F0198": ("7-16", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량"),
"F0199": ("7-17", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량"),
"F0200": ("7-18", "productivity", "표 바로 위 「(㎥/1대, 1일)」 — 「운반량」 줄이 작업량"),
# ── 제8장 방제 ──────────────────────────────────────────────────
"F0205": ("8-2-1", "reference", "약제 이름·제형 목록"),
"F0208": ("8-2-2", "reference", "선정약제 목록 + 원액 주입량(㎖/㎝) 기준 — 품 표는 따로 있음"),
"F0212": ("8-2-3", "reference", "위와 같은 선정약제 목록"),
"F0216": ("8-2-4", "reference", "위와 같은 선정약제 목록"),
"F0218": ("8-2-5", "reference", "위와 같은 선정약제 목록"),
"F0453": (
# 2026-09-14 절 8-2-3 → 14-2 — 원본이 [주] 「…8-2-3 굴착기(2025)」…」 를 절로 읽던 것을
# 앞 절 이어받기로 고치자 부록 앞 마지막 절(14-2)로 옮겨 감. 부록엔 절 번호가 없어 여전히
# 제자리가 아님 — 참고표라 값에 안 닿음.
"14-2",
"reference",
"〔부록 2〕 산림사업별 적용 가능 공종 목록 — 절 경계가 밀려 붙음",
),
"F0220": (
"8-3",
"productivity",
"머리 「벌목조재 (㎥/인)·무더기 훈증 (RM/인)·그루터기 박피 (본/인)」 — 인당 작업량",
),
"F0221": ("8-3", "coefficient", "본문 「(단위: %)」 — 수종·직경별 지조율"),
"F0222": ("8-3", "coefficient", "머리 「비율(수간재적의 %)」 — 근주재적 산정율"),
"F0227": ("8-6-1", "reference", "기종별 희석배수별 약제량(L, 1회) — 살포 계산표"),
"F0231": ("8-6-3", "reference", "희석배수별 약제소요량(㎖) — 물의 양 대비 계산표"),
# ── 제9장 토공 — 시공능력 공식 계수 ────────────────────────────
"F0281": ("9-15-1", "coefficient", "행이 K·f·E·Cm — [주]② Q1=3600×q×K×f×E/Cm"),
"F0282": ("9-15-2", "coefficient", "행이 T·L·E·q — 불도저 작업량 공식 계수"),
"F0284": ("9-16-2", "coefficient", "행이 V·W·E·D — [주]② Q=1000×V×W×E×D×f/N"),
"F0285": ("9-16-3", "coefficient", "흡입준비·운반·흡입·대기 시간 — 살수차 사이클 시간"),
"F0287": ("9-18", "coefficient", "행이 K·f·E·Cm — [주]① Q1=3600×q×K×f×E/Cm"),
"F0295": ("9-22", "coefficient", "행이 K·f·E·Cm — [주]③ Q1=3600×q×K×f×E/Cm"),
# ── 제10장 운반 ─────────────────────────────────────────────────
"F0300": ("10-3-3", "reference", "「운반비·하차비」 적용 항목 — 값이 없는 구성 안내"),
"F0301": ("10-4", "coefficient", "t1·t2·t3·t4 — 트레일러 운반 사이클 시간"),
"F0308": ("10-7-4", "coefficient", "1사이클당 운반량 q — 모노레일 공식 계수"),
"F0309": ("10-7-4", "coefficient", "본문 「(단위: 분/1회당)」 — 적재·짐부리기 시간"),
"F0316": ("10-9-1", "reference", "규격별 1회당 표준 운반량(kg·개·㎡) — 적재 기준"),
"F0319": ("10-11", "coefficient", "행이 L·E·q0 — [주]② q=3.2×e, Cm 공식 계수"),
"F0320": ("10-12-1", "coefficient", "행이 K·E0·Cm — 굴착기 적재 공식 계수"),
"F0321": ("10-12-1", "coefficient", "적재·t2·적하 시간 — 덤프트럭 사이클 공식 계수"),
"F0324": (
"10-13-2",
"reference",
"드론운반 단가산출 항목(준비시간·왕복비행시간 식) — [주] 일본 산출 예",
),
# ── 제11·12장 ───────────────────────────────────────────────────
"F0328": ("11-4", "coefficient", "행이 q·k·f·E — [주]① Q=3600×q×k×f×E/Cm"),
# 2026-09-14 절 12-2 → 12-17-1 — 원본이 펌프카 타설 [주] 「…12-2 표면 마무리를 따른다.」 를
# 절 제목으로 읽어 12-2 에 붙어 있던 표(빌더가 앞 절 이어받기로 고침). 형태 판정은 그대로.
"F0358": ("12-17-1", "reference", "시설유형 Type-~Ⅳ 적용 기준 설명"),
"F0360": ("12-17-1", "reference", "현장조건 Type-~Ⅲ 적용 기준 설명"),
"F0385": (
"12-34-1",
"requirement",
"인력(인)·기계(대, Q=5.4㎥/hr) 소요량 표 — 「별도계상」 은 레미콘 자재 줄 비고일 뿐",
),
"F0388": (
"12-34-4",
"sub_requirement",
"신축이음 채움재 — 필요수량·고철대 감 3% 가 적힌 실값 표",
),
"F0390": (
"12-36",
"sub_requirement",
"P.C BOX 설치 — 미장공 0.14인·보통인부 0.05인 실값 표",
),
"F0392": ("12-38-1", "coefficient", "사용횟수별 잔존율(12회 25%·25회 10%)"),
"F0394": ("12-38-2", "coefficient", "부자재 요율 「주자재비의 24%·52%·79%」"),
"F0396": ("12-38-3", "reference", "설치 유형(복잡·보통·간단) 적용 시설 설명"),
# ── 제13장 구조물 ───────────────────────────────────────────────
"F0400": ("13-2-3", "reference", "큰돌 직경별 뒷길이 기준(㎝)"),
"F0406": (
"13-4-1", # 2026-09-17 절 바로잡음 — [주]④ 인용을 13-3 제목으로 읽었던 것(표는 13-4-1 메쌓기 아래)
"reference",
"〈돌쌓기의 개수 및 중량의 표준〉 — [주] 인력 돌쌓기·돌붙임 기준",
),
"F0408": (
"13-4-3",
"sub_requirement",
"고임돌 소요량(㎥/㎡) — 석재 투입 체적 실값(B08 고임돌표가 이미 읽음)",
),
"F0410": (
"13-4-4",
"sub_requirement",
"찰쌓기 뒷채움 콘크리트(㎥/㎡) — 레미콘 실값(B08 채움표가 이미 읽음)",
),
"F0411": ("13-4-4", "reference", "[주]⑨ 성토 뒤채움 조약돌 두께(㎝) 기준"),
"F0412": (
"13-4-4",
"reference",
"[주]⑩ 뒷길이 표준(㎝) — 자동 판정이 「(m)」에 걸려 소요량형으로 오판",
),
"F0413": (
"13-4-4",
"reference",
"[주]⑪ 표준경사(1:n) — 자동 판정이 소요량형으로 오판, 찰쌓기(인력)를 막음",
),
"F0429": ("13-10-2", "coefficient", "[주]⑥ 관입률별 계수"),
"F0439": ("13-12-2", "coefficient", "[주]⑦ 높이·기울기 할증(%)"),
"F0446": ("13-15-2", "reference", "작업조건(어려운·쉬운) 구분 기준"),
# ── 미판정 14 — 2026-09-17 안티그래비티 원문 대조 규명(브레인 넘김) ─────────────
# `산림품셈_form_미판정_14개_원문대조_규명.json` · 머리 소실 9 · 혼합 3 · 공식 1 · 글값 1.
# ⚠ 여기까지가 산림 미판정 전부다 — 다 채우면 `form_undetermined` 가 0 이 된다.
"F0140": (
"5-26-1",
"requirement",
"머리 소실 — 윗 2줄 막갈이깊이(cm)를 열 머리로 되살림, 토성×깊이별 보통인부(992㎡당)",
),
"F0141": ("5-26-2", "requirement", "위와 같은 모양(흙부수기) — 토성×깊이별 보통인부(992㎡당)"),
"F0142": (
"5-26-3",
"requirement",
"위와 같은 모양(돌자갈치우기) — 토성×깊이별 보통인부(992㎡당)",
),
"F0195": (
"7-14",
"productivity",
"머리 소실 — 값이 「1인 1일 공정량」이라 생산량형(품 = 1 ÷ 값)",
),
"F0248": ("9-7-1", "coefficient", "머리 소실 — 값이 품이 아니라 계산식 파라미터"),
"F0322": ("10-13-1", "requirement", "머리 소실 — 묘목 1,000본당 소요량"),
"F0323": ("10-13-2", "requirement", "위와 같음(묘목 1,000본당)"),
"F0333": ("12-1-3", "requirement", "머리 소실 — ㎥당 소요량"),
"F0346": ("12-11-1", "requirement", "머리 소실 — m당 소요량"),
"F0169": ("7-1-1", "productivity", "혼합 — 값이 「㎥/인·일」이라 생산량형"),
"F0304": ("10-6-3", "requirement", "혼합 — 소요량형(밑수는 표 밖이라 미확보로 남김)"),
"F0356": ("12-17-1", "productivity", "혼합 — 값이 「㎥/일」이라 생산량형"),
# ⚠ 안티그래비티는 이 표를 `formula` 로 적었으나 **낱말을 새로 만들지 않는다** —
# 받는 쪽이 모르는 형태를 만나면 조용히 건너뛴다. 뜻이 같은 `coefficient`(계산식 파라미터)로 둔다.
"F0257": (
"9-11-1",
"coefficient",
"공식 명세 — 시공능력 공식 파라미터(안티그래비티 판정 `formula`)",
),
"F0349": (
"12-11-3",
"requirement",
"글값 — 값이 글로 적힌 소요량형(밑수는 표 밖이라 미확보로 남김)",
),
# ── 실값인데 「참고」로 빠져 있던 표 — 2026-09-18 2바퀴 대조(안티그래비티 권고) ─────
# ⚠ **`requirement` 로 올리지 않는다.** 이 표들은 홀로 발주되지 않고 **상위 공종에 딸린**
# 자재·노무 산출표라, 품으로 세우면 위 공종이 이미 세는 몫을 **두 번 센다**
# (F0393 은 `B09_Estimation_Euroform` 이, F0408·F0410 은 B08 표가 이미 직접 읽는다).
# 그렇다고 `reference` 로 두면 **금액이 0원으로 증발한다** — 그래서 낱말을 하나 둔다.
# `sub_requirement` = 「값은 실값, 자리는 상위 공종 종속」. 오늘 읽는 쪽은 건너뛰고,
# 자원 축이 붙는 날 이 딱지만 보면 된다(로직은 나중에 · 브레인).
"F0369": ("12-22", "sub_requirement", "P.V.C 파이프 설치 — 아스팔트 4kg·방수공 0.034인 실값"),
"F0380": ("12-30-1", "sub_requirement", "다웰바 신축이음부 — 재료비의 5%·특별인부 0.1인 실값"),
"F0381": ("12-30-2", "sub_requirement", "다웰바 접속스라브부 — 위와 같음"),
"F0382": ("12-31", "sub_requirement", "물끊기 홈 — 특별인부 0.1인·보통인부 0.001인 실값"),
"F0383": ("12-32", "sub_requirement", "전선관 설치 — 설치비(주재료비의 5%) 실값"),
"F0386": ("12-34-2", "sub_requirement", "합판거푸집(3회) — 보통인부 0.29인·진동기 2대 실값"),
"F0391": (
"12-37",
"sub_requirement",
"무근콘크리트 타설 — 콘크리트공 0.15인·보통인부 0.27인 실값",
),
"F0393": ("12-38-2", "sub_requirement", "유로폼 사용수량 — 부자재 주재료비의 24~79% 실값"),
# 보고서가 셈에서 빠뜨린 자리 하나 — 27 중 19만 가려 놓았는데, 남은 여덟을 훑어 찾음.
"F0338": (
"12-6",
"sub_requirement",
"콘크리트 포장(인력) — 포장공 3인·시공량 100/150㎥ 작업조 실값",
),
}
#: 표 번호 → (절 번호, 밑수 수, 밑수 단위, 까닭).
#: **머리가 소실돼 자동으로는 못 읽는 표**의 밑수만 싣는다 — 원문 대조로 확인한 것만.
#: ⚠ 자동으로 읽히는 표는 여기 넣지 않는다. 두 곳에서 값을 매기면 어느 쪽이 정본인지 흐려진다.
#: 근거 — `resources/knowledge/technical_info/01_임도/05_원가정보/
#: 산림품셈_form_미판정_14개_원문대조_규명.json` (2026-09-17 안티그래비티 원문 대조).
BASIS_JUDGMENTS: dict[str, tuple[str, float, str, str]] = {
# ⚠ 2026-09-18 **사람 판정을 물림** — 원문이 「(인/992㎡당)」이다(코덱스가 PDF 에서 되살린 줄 ·
# 원문 L2878·L2892·L2905). 앞서 100㎡ 로 적어 둔 것은 **머리가 소실돼 원문을 못 읽던 때**
# 흔한 밑수로 메운 값이었다. 이 고리의 잣대는 「원문이 정본」이므로 사람 판정이 물러난다.
# ⚠ 992㎡ 는 「0.1정(1반) ≒ 992㎡」 로, 옛 면적 단위를 그대로 쓴 자리다 — 100 과 열 배 가까이
# 달라 **금액이 크게 갈린다.** 그래서 사유를 남긴다.
"F0140": (
"5-26-1",
992.0,
"㎡",
"막갈이 — 원문 「(인/992㎡당)」(앞서 100㎡ 로 메워 둔 것을 물림)",
),
"F0141": ("5-26-2", 992.0, "㎡", "흙부수기 — 원문 「(인/992㎡당)」"),
"F0142": ("5-26-3", 992.0, "㎡", "돌자갈치우기 — 원문 「(인/992㎡당)」"),
"F0322": ("10-13-1", 1000.0, "본", "묘목 운반 — 원문 「묘목 1,000본당」"),
"F0323": ("10-13-2", 1000.0, "본", "위와 같음"),
"F0333": ("12-1-3", 1.0, "㎥", "원문 「㎥당」"),
"F0346": ("12-11-1", 1.0, "m", "원문 「m당」"),
# ── 원문 md ↔ 마스터 전수 대조 60건 중 **원문 괄호가 분명하고 분모가 하나인 것만** ────
# 안티그래비티 보고(02544795) · 원문 줄을 직접 열어 괄호 글을 확인한 것만 싣는다.
# ⚠ 보고가 적은 단위를 그대로 믿지 않는다 — 「인」을 밑수로 적은 자리가 셋 있었고
# 그 자리(8-6-2 드론방제·8-6-3 지상방제)는 **2026-09-09 에 오독으로 판정된 바로 그 표**다.
"F0082": ("3-8", 1.0, "ha", "드론 영상 촬영 — 원문 「(단위 : 인/ha)」"),
"F0256": ("9-11-1", 1.0, "일", "원문 「(단위: 일당)」"),
"F0310": ("10-7-4", 1.0, "일", "원문 「(단위: 인/1일당)」"),
"F0311": ("10-7-4", 1.0, "기", "원문 「(단위: 1기당)」"),
"F0312": ("10-7-4", 1.0, "일", "원문 「(단위: 1일당)」"),
"F0313": ("10-8-1", 1.0, "일", "원문 「(단위: 인/1일당)」"),
"F0314": ("10-8-2", 1.0, "기", "원문 「(단위: 1기당)」"),
"F0315": ("10-8-3", 1.0, "일", "원문 「(단위: 1일당)」"),
"F0356": ("12-17-1", 1.0, "일", "원문 「(단위: ㎥/일 당)」"),
"F0424": ("13-8", 1.0, "㎡", "원문 「(단위: 인/㎡)」"),
"F0444": ("13-14", 1.0, "개", "원문 「(단위: 인/개)」"),
# ⚠ **작업조 표는 넣지 않는다**(2026-09-17 유로폼 호표가 사라져 드러남).
# 12-7-1·12-7-2·12-8 콘크리트 타설 · 12-38-3 유로폼 설치·해체 · 13-16-2 — 원문이 「(단위: 일 당)」
# 이라 넣고 싶어지지만, 이 표들은 **밑수가 시공량 열**이다(1단위당 = 인원 ÷ 시공량 ·
# B09 CrewOutput). 「1일」을 밑수로 박으면 그 길이 막혀 **호표가 통째로 사라진다**
# (2026-09-14 301 판정이 그래서 작업조 표를 미확보 목록에서도 뺐다).
# ⚠ **왜곡 고침 하나** — 값이 아니라 **밑수 단위**가 틀려 있던 자리.
# 원문 L7489 가 「(단위: 1일당)」인데 마스터가 「개」로 서 있었다(13-10-2 윈치말뚝 박기).
"F0430": ("13-10-2", 1.0, "일", "왜곡 고침 — 원문 「(단위: 1일당)」인데 「개」로 서 있었음"),
}
def judged_basis(table_id: str, number: str | None) -> tuple[float, str, str] | None:
"""사람이 확인한 `(밑수 수, 단위, 까닭)`. 없으면 `None`. 절 번호가 어긋나면 멈춘다."""
found = BASIS_JUDGMENTS.get(table_id)
if found is None:
return None
section, quantity, unit, why = found
if section != number:
raise ValueError(
f"밑수 판정 {table_id} 의 절 {section} 이 원천의 {number} 와 다릅니다 — "
"원천 표 차례가 바뀌었으니 판정을 다시 대조할 것"
)
return quantity, unit, f"사람 판정 — {why}"
def judged_form(table_id: str, number: str | None) -> tuple[str, str] | None:
"""사람이 가른 `(형태, 까닭)`. 없으면 `None`. 절 번호가 어긋나면 멈춘다."""
found = FORM_JUDGMENTS.get(table_id)
if found is None:
return None
section, form, why = found
if section != number:
raise ValueError(
f"표 형태 판정 {table_id} 의 절 {section} 이 원천의 {number} 와 다릅니다 — "
"원천 표 차례가 바뀌었으니 판정을 다시 대조할 것"
)
return form, f"사람 판정 — {why}"