"""표 읽기 ②(2026-09-14 · PLAN 1장) — 「못 붙은 줄」 로 잘못 서던 자리를 **상태가 움직이는지**로 잼. 9-21 제근 고르기형 표 안내 글이 `unmatched` 에 들어가 못 붙은 줄로 섬 — 밑수는 사용자 확정 (건설품셈 1,000㎡당 빌림)이라 안내는 비고(`known_gap_note`)로 옮김(사유는 안 사라짐) 12-2 표면 마무리 원본이 12-17-1 [주] 문장을 절 제목으로 읽어 표 7장·가짜 갈래 #설치·#철거 가 붙음 """ from __future__ import annotations from B09_Estimation.B09_Estimation_KnownGaps import known_gap_note from B09_Estimation.B09_Estimation_ResourceAxis import load_work_item_master from B09_Estimation.B09_Estimation_UnitPrice import cached_build def test_제근은_못_붙은_줄이_아니고_교차참조_사유는_비고에_남음() -> None: build = cached_build() assert not build.unattached.get("FP-09-21"), build.unattached.get("FP-09-21") assert sum(1 for code in build.book.titles if code.startswith("B-FP-09-21#")) == 6 note = known_gap_note("FP-09-21") assert "교차 참조" in note and "1,000㎡당" in note def test_표면_마무리엔_미장공_표만_있고_가짜_갈래가_없음() -> None: nodes = {n["work_item_code"]: n for n in load_work_item_master()["work_items"]} assert [t["pum_table_id"] for t in nodes["FP-12-02"]["tables"]] == ["F0334"] assert "F0356" in [t["pum_table_id"] for t in nodes["FP-12-17-01"]["tables"]] build = cached_build() assert [c for c in build.book.titles if c.startswith("B-FP-12-02")] == ["B-FP-12-02"] assert not build.unattached.get("FP-12-02")