feat(b08): 표 아래 [주] 를 마스터에 실음 — 금액에 닿는 조건이 통째로 빠져 있었음
브레인 일감 ②. `[주]` 에 **단가에 바로 닿는 조건**이 적혀 있는데 마스터가 그 글을 안 싣고 있었음 — 받는 쪽이 볼 길이 없었음(안티그래비티 전수 대조 ④). - 표마다 `notes` 칸 — 표 바로 아래 `[주]` 덩어리를 그대로 담음. 다음 표·다음 절을 만나면 멈춤 - 아홉 건이 다 들어옴 — 발파 가산 20%(F0245) · 고철 공제 50kg/㎥(F0251) · 공구손료 3%·고소 감속 9%(F0395) · 덤프 환산(F0068) · 물탱크 5,500ℓ(F0285) … - 아홉만이 아니라 **모든 표**에 담음 — 산림 320/453 · 건설 1,761/2,192 - ⚠ **읽기만 싣는다 — 여기서 셈하지 않음.** 쓰는 일은 로직 몫(브레인: 로직은 나중에) - **순수 더하기** — 원문 셀 453/453 · 밑수 453/453 · 형태 453/453 그대로(건설도 2,192 전부) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsGw1Dz9HmhuAxGisxmDPF
This commit is contained in:
@@ -292,6 +292,43 @@ def basis_from_source(lines: list[str], line_no: int) -> tuple[float | None, str
|
||||
return None, None
|
||||
|
||||
|
||||
#: 표 아래 `[주]` 덩어리를 어디까지 볼 것인가. 다음 표·다음 절을 만나면 멈춘다.
|
||||
NOTES_LOOKAHEAD = 40
|
||||
_NOTE_START = ("[주]", "[ 주 ]", "[주")
|
||||
_NOTE_CONT = ("-", "·", "※")
|
||||
|
||||
|
||||
def notes_from_source(lines: list[str], line_no: int) -> list[str]:
|
||||
"""표 바로 아래 `[주]` 글줄 목록. 없으면 빈 목록.
|
||||
|
||||
왜 싣나 — `[주]` 에 **금액에 바로 닿는 조건**이 적혀 있다(발파 가산 20% · 고철 공제 50kg/㎥ ·
|
||||
공구손료 3% · 고소 감속 9% …). 마스터가 그 글을 안 싣고 있어 받는 쪽이 볼 길이 없었다
|
||||
(2026-09-17 안티그래비티 전수 대조 ④). **읽기만 싣는다 — 여기서 셈하지 않는다.**
|
||||
|
||||
⚠ 다음 표(`|`)나 다음 절(`#`)을 만나면 멈춘다. 남의 [주]를 물어 오면 조용히 틀린다.
|
||||
"""
|
||||
out: list[str] = []
|
||||
started = False
|
||||
for index in range(line_no, min(len(lines), line_no + NOTES_LOOKAHEAD)):
|
||||
text = lines[index].strip()
|
||||
if text.startswith("#"):
|
||||
break
|
||||
if text.startswith("|"):
|
||||
if started:
|
||||
break # [주] 뒤에 새 표가 왔다 — 여기까지가 이 표의 [주]다
|
||||
continue # 아직 표 본문 안이다
|
||||
if not text:
|
||||
continue
|
||||
if text.startswith(_NOTE_START):
|
||||
started = True
|
||||
out.append(text)
|
||||
elif started and text.startswith(_NOTE_CONT):
|
||||
out.append(text)
|
||||
elif started:
|
||||
break # [주] 덩어리가 끝났다
|
||||
return out
|
||||
|
||||
|
||||
#: ⚠ **밑수가 절 이름에만 있는 표** — 「4-2-2. 1,000㎡당」·「4-2-1. 100본당」(2026-09-13 판정).
|
||||
#: 본문·표 안 어디에도 「(단위: …)」가 없어 밑수가 비어 있었다(B09 가 막아 금액은 안 섰음).
|
||||
#: ⚠ **이름 전체가 「수 + 단위 + 당」일 때만** 뽑는다 — 「나무주사(100본당)」처럼 섞인 것은
|
||||
@@ -643,6 +680,7 @@ def table_entry(
|
||||
"capacity_formula_here": capacity_formula_pending(table),
|
||||
# 갈래 키 — 부모 모양을 단 뒤 표 읽기가 가른 대로 채움(`_Variants`). 못 가르면 빈칸.
|
||||
"variant_key": [],
|
||||
"notes": notes_from_source(source_lines, int(table.get("line") or 0)),
|
||||
"condition_note": [norm(h) for h in table.get("headers", []) if norm(h)],
|
||||
"raw_row": table.get("rows", []), # 원문 셀 — B09 자원 축이 읽는다.
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"dataset_id": "data_work_item_master_manifest",
|
||||
"generated_at": "2026-09-17T22:38:16+09:00",
|
||||
"generated_at": "2026-09-17T22:46:30+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": "094c56c75dfa76e2acf2904cea7e6959a1998ceccaa46bf9f83bcdf9c9f3fdd4",
|
||||
"size_bytes": 926610
|
||||
"sha256": "2914c8cb5ad12e2579963013c1807b57e45e18c9fa731e30672293ab9fa60a0d",
|
||||
"size_bytes": 1079701
|
||||
},
|
||||
{
|
||||
"file": "form_undetermined_2026-01-01.json",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"dataset_id": "data_work_item_master_manifest",
|
||||
"generated_at": "2026-09-17T22:39:08+09:00",
|
||||
"generated_at": "2026-09-17T22:47:18+09:00",
|
||||
"built_by": "B08_Quantity/B08_Quantity_Build_WorkItemMaster.py",
|
||||
"source": {
|
||||
"dataset_id": "pum_const",
|
||||
@@ -12,8 +12,8 @@
|
||||
"files": [
|
||||
{
|
||||
"file": "const_work_item_master_2026-01-01.json",
|
||||
"sha256": "4e1d7fe8080913d17730395da18d4c039c432bca7b92e38a62d765a0b098314e",
|
||||
"size_bytes": 3839594
|
||||
"sha256": "9f5608bd16e17dd43cb8de636c8161c5a0c8dbf23147e86e5d1d5f97cf4981e6",
|
||||
"size_bytes": 4863086
|
||||
},
|
||||
{
|
||||
"file": "const_form_undetermined_2026-01-01.json",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -47,6 +47,7 @@ MASTER = OUT_DIR / "work_item_master_2026-01-01.json"
|
||||
#: ② 형태 미판정 14표를 사람 판정으로 가름(안티그래비티 원문 대조) · 그중 5표는 밑수도 확인
|
||||
#: ③ 원문 전수 대조 60건 중 **원문 괄호가 분명한 16표**의 밑수를 채움
|
||||
#: ⚠ 그 가운데 **하나(F0430)만 값이 바뀜** — 원문이 「1일당」인데 「개」로 서 있던 왜곡을 고침
|
||||
#: ④ 표 아래 `[주]` 글을 `notes` 칸으로 실음(순수 더하기 — 원문 셀·밑수·형태 다 그대로)
|
||||
#: ⇒ 곱하면 안 되던 줄이 곱할 수 있게 된 것이지, 있던 값이 바뀐 것이 아니다.
|
||||
#: 2026-09-17 랩탑 메인 — 목차 오기 둘을 본문 번호로 바로잡아(브레인 지시) **네 줄만** 바뀌어 새로 뜸
|
||||
#: (옛 f8b8fba1…). 네 줄 모습은 `test_목차_오기는_본문_번호로_바로잡고_열쇠는_그대로` 가 잼 ·
|
||||
@@ -54,7 +55,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 = "4c97958865d1779eacff4696ea77d35534044b8f81b2ef3033935ead2aadb6bc"
|
||||
BASELINE_WORK_ITEMS_SHA = "70d41568bc2f5784b5870276da06e822bc08fe83fe83c1682155124233fae974"
|
||||
|
||||
#: 열쇠 작업이 새로 얹은 칸. 지문을 잴 때만 떼어낸다.
|
||||
ADDED_FIELDS = (
|
||||
@@ -364,6 +365,23 @@ def test_산림_형태_미판정이_없다(master: dict) -> None:
|
||||
assert judged_form("F0140", "5-26-1")[0] == "requirement"
|
||||
|
||||
|
||||
def test_표_아래_주석이_실린다(master: dict) -> None:
|
||||
"""`[주]` 에 **금액에 바로 닿는 조건**이 적혀 있는데 마스터가 그 글을 안 싣고 있었다.
|
||||
|
||||
발파 가산 20% · 고철 공제 50kg/㎥ · 공구손료 3% · 고소 감속 9% — 받는 쪽이 볼 길이 없었다
|
||||
(2026-09-17 안티그래비티 전수 대조 ④). ⚠ **읽기만 싣는다 — 여기서 셈하지 않는다.**
|
||||
"""
|
||||
by_id = {t["pum_table_id"]: t for it in master["work_items"] for t in it["tables"]}
|
||||
쓰인것 = [t for t in by_id.values() if t.get("notes")]
|
||||
assert len(쓰인것) == 320
|
||||
발파 = " ".join(by_id["F0245"]["notes"])
|
||||
assert "인건비의 20%를 가산" in 발파
|
||||
유로폼 = " ".join(by_id["F0395"]["notes"])
|
||||
assert "인력품의 3%" in 유로폼
|
||||
# 남의 [주]를 물어 오지 않는다 — 다음 절을 만나면 멈춘다
|
||||
assert all(not n.startswith("#") for t in 쓰인것 for n in t["notes"])
|
||||
|
||||
|
||||
def test_원문_대조_밑수_판정(master: dict) -> None:
|
||||
"""원문 md ↔ 마스터 전수 대조(안티그래비티 02544795)에서 나온 밑수를 반영했는가.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user