refactor(aliases): 별칭표를 한 벌로 — 범위(scope)·판을 붙여 B08·B09 가 같은 파일만 읽음

- 정본 resources/data_aliases/aliases_2026-01-01.json · 로더 common_util/common_util_aliases.py
  (칸 빠짐·모르는 축·겹친 범위의 두 대상은 읽을 때 오류 · 판이 다르면 안 씀 · 양방향 조회)
- 흩어진 세 벌을 옮김: 매핑표 ground_aliases(리핑암→파쇄암·암절취) 삭제 ·
  B09 UnitPrice 전역 VARIANT_ALIASES 삭제 · B08 인계본 ground_class_aliases 는 별칭표에서 만든 보기
- 범위: 리핑암→파쇄암 @FP-10-11 · 리핑암→암절취 @FP-10-12 · 화약공→1016 @FP-09-05 (근거 문구 줄마다)
- 자원 축 별칭 검사도 같은 로더로 합침(자원 목록 폴더에서 별칭 파일을 옮김)
- 시험 test_common_aliases.py 6건 · 전체 1509 통과

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-13 17:22:17 +09:00
co-authored by Claude Opus 5
parent 2ebcf89f04
commit a08938ea1a
8 changed files with 258 additions and 84 deletions
+14 -18
View File
@@ -461,23 +461,16 @@ def normalize_variant_key(text: str) -> str:
return "".join("~" if ch in _TILDE_CHARS else ch for ch in tight)
#: 갈래 이름이 **축이 달라 다르게 불리는** 자리 — 이름을 갈지 않고 여기서 잇는다.
#:
#: ⚠ **우리 축과 품셈 축이 다르다.** 우리 「리핑암」은 B05·B06 의 **지반유형**(캘 수 있는가)이
#: 낳은 이름이고, 품셈 운반표의 「파쇄암」은 **운반할 때의 상태**(부서졌는가)를 가리킨다.
#: 그래서 일반적으로는 「리핑암 = 파쇄암」이 아니다 — **발파암도 캐고 나면 파쇄암 상태**다
#: (건설품셈 8장 「발파 또는 리퍼작업 등에 의하여 얻어진 암과 파쇄암…」).
#:
#: ⭐ **다만 이 표 안에서는 성립한다.** 산림품셈 10-11 f 표가 **토사·파쇄암·발파암을 따로**
#: 두었으므로 그 표의 「파쇄암」은 **발파를 뺀 나머지 = 리퍼로 얻은 것**이다. 결정적 증거는
#: 10-12 [주]③ 이다 — 「적재 재료의 토량환산계수(L)는 토사 1.3, **암절취 1.35**, 발파암
#: 1.625 적용한다」. 10-11 f 표의 **파쇄암이 1/1.35** 라 **암절취(리핑)과 같은 값**이다.
#:
#: ⚠ **어느 쪽 이름도 갈지 않는다** — 우리 이름을 갈면 B05·B06 이 깨지고, 품셈 이름을 갈면
#: 원문과 어긋난다. 잇는 자리는 여기 한 곳뿐이다.
VARIANT_ALIASES: dict[str, str] = {
"리핑암": "파쇄암",
}
#: 갈래 이름이 **축이 달라 다르게 불리는** 자리(우리 「리핑암」 ↔ 품셈 10-11 f 「파쇄암」)는
#: **별칭표 한 벌**(`common_util_aliases`, axis `variant`)에서 **범위째** 읽는다(2026-09-13 이관).
#: ⚠ 「리핑암 = 파쇄암」은 10-11 f 표 안에서만 참이다 — 발파암도 캐고 나면 파쇄암 상태라 전역으로
#: 잇으면 틀린다(근거 문구는 별칭표 줄의 `basis` 에 옮겨 둠). 어느 쪽 이름도 갈지 않는다.
@lru_cache(maxsize=1)
def _master_edition() -> str:
"""별칭 범위가 묶인 품셈 판 — 지금 공종 마스터의 판(명세 17장)."""
return str(load_work_item_master().get("effective_date", ""))
def find_variant_code(
@@ -494,7 +487,10 @@ def find_variant_code(
wanted = normalize_variant_key(variant_value)
if not wanted:
return None
wanted = VARIANT_ALIASES.get(wanted, wanted)
from common_util.common_util_aliases import alias_target, load_aliases
alias = alias_target(load_aliases("variant"), wanted, work_item_code, _master_edition())
wanted = normalize_variant_key(alias) if alias else wanted
prefix = f"B-{work_item_code}#"
candidates = [code for code in prices.book.titles if code.startswith(prefix)]