무슨 일이 있었나 랩탑 줄의 병합 `20ba886c`(Merge origin/main_desktop_1·main_laptop_1·sub_desktop_1 into sub_laptop_1)가 우리 파일 22개를 떨구고 35개 파일의 내용을 옛것으로 되돌림. 손으로 지운 커밋은 없고 **병합 자체가 떨군 것**임. 그것이 `origin/dev`·`main_laptop_1`·`sub_laptop_1`· `CODEX` 까지 퍼졌고(데스크탑 둘만 무사), 이 창의 병합 `d92c1f2b` 로 들어옴. 잃었던 것 - 공용 — `common_util_provenance.py` · `ui_template_provenance.ts` - B08 — 근거 사전 · 좌측 패널 상자 모듈 · 토량환산계수 칸 - B09 — 근거 사전 셋 - B05 — 계획노선 편집 모듈 아홉 · 지형 라우터 · B04 지도 모듈 - 시험 셋과, 35개 파일 안의 최근 작업(환산계수 고르기 · 근거 호버 배선 등) 어떻게 되살렸나 `611a2b40`(병합 직전, 전부 온전)에서 `git show <커밋>:<경로>` 로 내용만 꺼내 되돌림. 이력은 안 건드림. ⚠ HEAD 에만 있던 「추가 816줄」은 랩탑의 새 작업이 아니라 **되살아난 옛 코드**였음(B05 편집은 모듈로 쪼개기 전 덩어리 · B08 라우터는 환산계수 고르기 전 옛 상수판). 되돌릴 시점 이후의 **진짜 새 커밋은 둘뿐**이라 그 둘만 패치로 다시 얹음 — `9f827bf6`(리로드 빌드 고리 끊기, 데스크탑 보조) · `b9bca6b3`(B06 조정창 1px, 랩탑). 위키 여덟은 코덱스 몫이라 손대지 않음. 자체검증 — 양쪽 작업이 다 살아 있음을 짚어 확인: `main.py` 의 「개발 서버는 살려 둔다」 · `B05_Profile_Engine_Grade.py` 의 `plan_curve_length_limit_m` · `B08_..._EarthworkGrid.ts` 의 `attachProvenance`. `tsc --noEmit` 통과 · `pytest -q` **1317 passed, 28 skipped** (되살리기 전에는 시험 둘이 수집 단계에서 깨져 있었음). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RANEBHns1S4tkmsYwewtk
54 lines
2.2 KiB
Python
54 lines
2.2 KiB
Python
"""B09 근거 사전이 **여러 장에서 같이 쓰는 조각** (PLAN 8-36 ④).
|
|
|
|
왜 따로 두나
|
|
사전이 두 파일로 갈리면서(값을 낳는 장 / 바깥에서 오거나 모으는 장) 두 쪽이 같은
|
|
이름표 열과 같은 「비고」 설명을 쓴다. 한쪽에 두고 다른 쪽이 가져가면 **고리가 생겨**
|
|
(`Provenance` → `Provenance_Sources` → `Provenance`) 불러들이지 못한다.
|
|
그래서 두 쪽이 함께 바라보는 자리를 따로 뒀다.
|
|
|
|
⚠ 여기에는 **여러 장이 실제로 같이 쓰는 것만** 둔다. 한 장만 쓰는 문장을 여기로 올리면
|
|
사전을 읽을 때 그 장에서 눈이 떠나 버린다.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from common_util.common_util_provenance import (
|
|
TIER_STANDARD,
|
|
TIER_UNCLASSIFIED,
|
|
ColumnProvenance,
|
|
)
|
|
|
|
#: 이름표 열(코드·명칭·규격·단위)이 공통으로 쓰는 문장.
|
|
CATALOG_SOURCE = "단가판·품셈 표의 이름을 그대로 옮긴 자리 — 여기서 짓지 않음"
|
|
|
|
#: 「비고」가 왜 미분류인지 — 표마다 같은 말을 쓴다.
|
|
NOTE_RULE = (
|
|
"이 칸은 등급을 붙일 열이 아니라 **다른 열의 사유를 담는 그릇**이다. "
|
|
"안에 든 조각마다 닿는 열이 다르므로(갈래 근거는 규격, 반영률은 수량, "
|
|
"막힘 사유는 단가) 호버는 조각을 그 열의 칸에만 띄운다"
|
|
)
|
|
|
|
|
|
def _label(key: str, label: str, extra: str = "") -> ColumnProvenance:
|
|
"""이름표 열 — 값을 낳은 것이 아니라 옮겨 적은 자리."""
|
|
return ColumnProvenance(
|
|
key=key,
|
|
label=label,
|
|
tier=TIER_STANDARD,
|
|
formula="옮겨 적은 값 (여기서 계산하지 않음)",
|
|
source=CATALOG_SOURCE + (f" · {extra}" if extra else ""),
|
|
)
|
|
|
|
|
|
def _note_column(code: str) -> ColumnProvenance:
|
|
"""「비고」 열 — 여덟 어디에도 안 맞아 `unclassified` 로 둔다(PLAN 8-36 ㉮)."""
|
|
return ColumnProvenance(
|
|
key="note",
|
|
label="비고",
|
|
tier=TIER_UNCLASSIFIED,
|
|
formula="줄에 달린 사유 조각을 차례로 이어 붙인 글",
|
|
source="조각마다 원천이 다름 — 조각별 원천은 그 조각이 닿는 열의 카드에 뜸",
|
|
rule=NOTE_RULE,
|
|
code=code,
|
|
)
|