fix(b09): 9-13-14·15 육상 발파암 들어내기 — 원문 「(1~2m)와 동일」 자기 참조를 0~1m(9-13-13)로 읽음(브레인 승인 · 고른 값·버린 값 근거 줄에) · 일부만 10% 풀림

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
This commit is contained in:
2026-09-14 13:11:41 +09:00
co-authored by Claude Opus 5
parent 8a31f87412
commit 626f518064
2 changed files with 35 additions and 1 deletions
@@ -17,7 +17,8 @@
⚠ **못 따라가는 참조는 따라간 척하지 않는다.**
· **자기 자신을 가리키는 것** — 9-13-14 가 「육상 발파암(1~2m)와 동일」이라 적었는데
그 절이 곧 육상 발파암(1~2m)이다(원문 오기로 보이나 **고쳐 읽지 않는다**).
그 절이 곧 육상 발파암(1~2m)이다. ⭐ 2026-09-14 브레인 승인으로 **그 두 절만** 고쳐 읽
(`READ_AS` — 고른 값·버린 값을 근거 줄에 나란히). 나머지 자기 참조는 여전히 빈 채로.
· **가리키는 절을 못 찾는 것 · 그 절도 계수가 없는 것.**
이 셋은 사유를 남기고 **빈 채로 둔다.**
"""
@@ -35,6 +36,21 @@ _NAMED = re.compile(r"^(?P<name>.+?)\s*(?:와|과)\s*동일$")
#: 「육상과동일」 — 이름이 아니라 **한 낱말만 바꾸라**는 지시다(용수 → 육상).
_SWAP_WORDS = (("용수", "육상"),)
#: 원문 참조가 풀 수 없게 적힌 자리를 **사람이 판정해** 고쳐 읽음 — 공종 → (읽을 이름, 사유).
#: ⚠ 넓히지 말 것. 판정마다 근거(같은 절 형제들의 표기)를 사유에 적고 브레인·사용자 승인을 받음.
READ_AS: dict[str, tuple[str, str]] = {
"FP-09-13-14": (
"육상 발파암(01m)",
"원문 표기 「육상 발파암(1~2m)와 동일」(고시 2025-82 5189줄)은 자기 참조라 풀 수 없어"
" 0~1m(9-13-13)로 읽음 — 같은 절 암절취(1~2m·2~3m)·용수 발파암이 모두 「(0~1m)와 동일」",
),
"FP-09-13-15": (
"육상 발파암(01m)",
"원문 표기 「육상 발파암(1~2m)와 동일」(고시 2025-82 5201줄)이 가리키는 9-13-14 가 자기"
" 참조라 끝이 없어 0~1m(9-13-13)로 읽음 — 같은 절 형제들이 모두 「(0~1m)와 동일」",
),
}
#: 이 이름들만 계수로 본다. 참조가 가리키는 것도 결국 이 넷이다.
_FACTOR_HEADS = {
"k": "K",
@@ -156,6 +172,9 @@ def reference_factor_values(
if found is None:
return own, [], ""
target_name, raw_text = found
read_as = READ_AS.get(code)
if read_as:
target_name = read_as[0]
matches = [m for m in by_name.get(_normalize_name(target_name), []) if m != code]
if not matches:
return own, [], f"{raw_text}」가 가리키는 절을 못 찾았습니다"
@@ -172,6 +191,8 @@ def reference_factor_values(
if missing:
return own, [], f"{raw_text}」를 따라갔으나 계수가 없습니다 — {', '.join(missing)}"
step = f"{raw_text}」 → {nodes[target].get('name', target)}"
if read_as:
step += f"{read_as[1]}"
return merged, [step, *path], ""
for code, node in nodes.items():
@@ -27,3 +27,16 @@ def test_표면_마무리엔_미장공_표만_있고_가짜_갈래가_없음() -
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")
def test_육상_발파암_1_3m_들어내기는_0_1m_로_읽고_고른_값_버린_값을_사유에() -> None:
"""③ 원문 「육상 발파암(1~2m)와 동일」(고시 5189·5201줄)은 9-13-14 자기 참조 — 같은 절 암절취·
용수 발파암이 모두 「(0~1m)와 동일」 이라 0~1m(9-13-13)로 읽음(2026-09-14 브레인 승인)."""
build = cached_build()
for code in ("FP-09-13-14", "FP-09-13-15"):
assert code not in build.partial_ratio and code not in build.component_gaps, code
# 들어내기 참조 줄은 풀림 — 남는 것은 치즐뿐(기본 조립엔 치즐 단가가 없어 종전대로)
left = [label for label in build.unattached.get(code, []) if "치즐" not in label]
assert not left, left
source = build.factor_sources.get(code, "")
assert "육상 발파암(01m)" in source and "자기 참조" in source, source