From c0b22442b03e347b0be6bf6f413f9603d26d0646 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 18 Sep 2026 14:24:02 +0900 Subject: [PATCH] =?UTF-8?q?feat(tester):=20=EA=B7=9C=EA=B2=A9=20=EB=A7=9E?= =?UTF-8?q?=EB=8C=80=EA=B8=B0=EB=A5=BC=20559=20=EC=A4=84=EB=A1=9C=20?= =?UTF-8?q?=EB=84=93=ED=98=80=20=E3=80=8C=EB=8B=A4=EB=A5=B8=20=EC=A4=84=20?= =?UTF-8?q?0=E3=80=8D=20=ED=99=95=EC=9D=B8=20=C2=B7=20=EA=B3=B5=EC=A2=85?= =?UTF-8?q?=20=EB=A7=88=EC=8A=A4=ED=84=B0=20=EC=96=B4=EA=B8=8B=EB=82=A8=20?= =?UTF-8?q?23=20=EB=8F=84=20=EC=84=B8=20=EA=B0=88=EB=9E=98=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=80=EB=A6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **① 규격 맞대기 넓힘 — 437 → 559 줄** (손료 줄 608 중) · 한 코드 줄은 규격 안에 빈칸이 들어도 칸을 통째로 씀(`2,200×5,150 ×1,000` 따위) · **원문과 다른 줄 0** — 559 줄이 원문과 글자까지 같음 · ⭐ **남은 일곱은 자료가 원문 빈칸을 채운 자리** — 원문 손료표가 한 칸에 든 기종 이름을 여러 줄로 쪼개 적어(「수동 싱글드럼」 → 수동·싱글·드럼) 뒷줄이 비었고, 자료는 앞 줄에서 이어받아 「싱글」·「드럼」·「엔진」 **조각**을 규격에 담고 있음. 수·계수는 원문과 같음. ⇒ 랩탑 서브에 PDF 대조 남김(7430·7431 윈치 · 7811·7812 엔진 · 9030 예선) **② 공종 마스터 어긋남 23 → 22 · 세 갈래로 가름** · **남의 몫 17** — [주] 이어짐 읽기 14 + md 밑수 읽기 2(랩탑 메인) + F0333 PDF 대조 1(랩탑 서브) · **잣대 5** — 부록 14-2 표 셋(부록을 공종에서 가르는 잣대 없음) · F0076(분모 둘) · F0405(할증률 갈래 없음) — 다 ㉰ · **원문 부재 0** — ⚠ 이 장부는 어긋남만 담음. 「원문에 밑수가 없는 것」 71 건은 `basis_missing` 에 따로 있음 · F0406〈돌쌓기의 개수 및 중량의 표준〉은 거절 자리로 닫아 할 일 아님 칸으로(32 → 33) · 기초데이터 한 줄(이형철근 6~7 범위)도 「잣대」로 가름 ⚠ 갈래 낱말이 두 벌임 — **어긋남 칸**은 「무엇이 막고 있나」(원문 부재·잣대·남의 몫) · **할 일 아님 칸**은 「왜 할 일이 아닌가」(거절 자리·그 밖·부록 예시·원문 부재). 장부에 곁줄로 적어 둠. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01QsGw1Dz9HmhuAxGisxmDPF --- .../fixtures/base_data_source_known.json | 10 +- .../fixtures/base_prices_source_known.json | 63 +++++++ .../work_item_master_source_known.json | 167 ++++++++++-------- .../tester/test_base_prices_source_match.py | 13 ++ .../test_work_item_master_source_match.py | 6 +- 5 files changed, 178 insertions(+), 81 deletions(-) diff --git a/resources/tester/fixtures/base_data_source_known.json b/resources/tester/fixtures/base_data_source_known.json index 01ccb157..3c97ff3b 100644 --- a/resources/tester/fixtures/base_data_source_known.json +++ b/resources/tester/fixtures/base_data_source_known.json @@ -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(㉮·㉯·㉰)." }, "_할일_아님": { "잣대": "㉮ — **영영 할 일이 아닌 것.** 원문에 없음 · 거절 자리 · 판정으로 닫힘. 바퀴마다 다시 세어지지 않게 갈래에서 **아주 빼** 여기 둔다. ⚠ 지우지는 않는다 — 되짚을 수 있어야 한다.", diff --git a/resources/tester/fixtures/base_prices_source_known.json b/resources/tester/fixtures/base_prices_source_known.json index 636c3288..dc5e252a 100644 --- a/resources/tester/fixtures/base_prices_source_known.json +++ b/resources/tester/fixtures/base_prices_source_known.json @@ -203,6 +203,69 @@ "owner_ask": "제8장 8-3 (9020) 그래브 준설선 — `9020-0022`~`0200` 일곱 줄을 앞 표에 이어 붙일 것(`제8장_건설기계.md` 3617줄 자리).", "갈래": "잣대 못 알아봄", "class_why": "값은 md 에 있으나 `|---|` 머리가 없어 표로 잡히지 않음 — 앞 표에 이어 붙이면 추출기·시험이 저절로 읽음." + }, + "규격 빈칸 7430-1300": { + "what": "싱글", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." + }, + "규격 빈칸 7430-1500": { + "what": "드럼", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." + }, + "규격 빈칸 7430-2500": { + "what": "드럼", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." + }, + "규격 빈칸 7431-1300": { + "what": "드럼", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." + }, + "규격 빈칸 7811-0030": { + "what": "엔진", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." + }, + "규격 빈칸 7812-0007": { + "what": "엔진", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." + }, + "규격 빈칸 9030-0240": { + "what": "150ton", + "why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "class": "㉯ 남이 고쳐야 풀림", + "class_why": "원문 손료표가 **한 칸에 든 기종 이름을 여러 줄로 쪼개 적은** 자리 — `(7430) 윈치` 는 「수동 싱글드럼」 이 수동·싱글·드럼 세 줄로 갈렸고 뒷줄은 칸이 비었음. 자료는 그 빈칸을 **앞 줄에서 이어받아** 채워 「싱글」·「드럼」·「엔진」 같은 **조각**이 규격으로 들어가 있음. 값(수·계수)은 원문과 같고 **이름 조각만** 어긋남.", + "갈래": "잣대 못 알아봄", + "owner": "랩탑 서브", + "owner_ask": "제8장 8-3 (7430)·(7431) 윈치 · (7811)·(7812) 엔진 · (9030) 예선 표 — PDF 에서 「기종」 칸이 한 칸에 어떻게 적혀 있는지 짚어 줄 것(「수동 싱글드럼」 처럼 한 칸인지, 줄마다 다른 이름인지). 그것이 갈리면 자료의 이어받기가 맞는지 곧 판가름남." } }, "material_blind": { diff --git a/resources/tester/fixtures/work_item_master_source_known.json b/resources/tester/fixtures/work_item_master_source_known.json index 94edaf2a..3cccba0d 100644 --- a/resources/tester/fixtures/work_item_master_source_known.json +++ b/resources/tester/fixtures/work_item_master_source_known.json @@ -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": { diff --git a/resources/tester/test_base_prices_source_match.py b/resources/tester/test_base_prices_source_match.py index 8e64d3df..a48a2d1a 100644 --- a/resources/tester/test_base_prices_source_match.py +++ b/resources/tester/test_base_prices_source_match.py @@ -219,6 +219,7 @@ def read_machine(path: Path) -> dict: 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[ @@ -274,9 +275,15 @@ def read_machine(path: Path) -> dict: # 토막이 코드 수와 안 맞는 줄(`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). # `|---|` 가 없어 표로 잡히지 않아 **추출기도 이 읽기도 못 봄** — 원문에 있는 값이 조용히 빠진다. @@ -349,6 +356,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( diff --git a/resources/tester/test_work_item_master_source_match.py b/resources/tester/test_work_item_master_source_match.py index 6d2654cd..3647598a 100644 --- a/resources/tester/test_work_item_master_source_match.py +++ b/resources/tester/test_work_item_master_source_match.py @@ -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}"