fix(M02 통합 점검 · 704-4 × 706-1): 회사에 올리기 승인 · 회사로 복사 때 규격 열 수량이 버려지던 흠

- 흠: 개인 층 하위 호표(사전조합)를 담은 구조물 조합을 회사로 올리면 참조가 회사 새 키로 바뀌는데
  규격 열 수량 열쇠(`참조|personal|…`)는 그대로 → 그 줄 열 값이 버려져 기본 수량으로 셈
  (실측: 거창 제5 · 6호표 묶음 2.5x2.0 열 1,270,715.6 → 회사 사본 1,259,136.2 · 차 11,579.4)
- 고침: 참조 따라 복사(carry)할 때 규격 수량 열쇠도 새 참조로 바꿈 · 따라 복사되는 하위 문서도 같게
- 고친 파일: M02_MasterTemplete/M02_Labor_Ref.py · resources/tester/test_m02_labor_ref.py
- 확인: 시험 test_m02_labor_ref · test_706_1 27 · test_704_4_spec 10 통과 · 브레인검증회사 다시 요청 · 승인 → 회사 사본 2.5 열 1,270,715.6 = 원본

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-31 17:39:41 +09:00
co-authored by Claude Opus 5.5
parent ebd33de9c9
commit b3f3aed0a5
2 changed files with 34 additions and 3 deletions
+13 -3
View File
@@ -350,12 +350,22 @@ def carry(doc: dict[str, Any], source: Here) -> dict[str, Any]:
got = read_ref(ref)
if got is None:
raise _bad(f"없는 참조 「{ref['키']}」")
body = origin_mark({**got, "담은로직": _moved(got.get("담은로직"), move, depth + 1)}, ref)
made = create(kind_of(ref["키"]), body)
body = {**got, "담은로직": _moved(got.get("담은로직"), move, depth + 1)}
made = create(kind_of(ref["키"]), origin_mark(_spec_moved(body, done), ref))
done[ref_id(ref)] = {"층": target[0], "주인": target[1], "키": made["이름"]}
return done[ref_id(ref)]
return {**doc, "담은로직": _moved(doc.get("담은로직"), move, 1)}
return _spec_moved({**doc, "담은로직": _moved(doc.get("담은로직"), move, 1)}, done)
def _spec_moved(doc: dict[str, Any], done: dict[str, Ref]) -> dict[str, Any]:
"""규격 열 수량(704-4 · 줄 id = `ref_id`) 열쇠도 새 참조로 — 안 바꾸면 그 줄 열 값이 버려짐."""
spec = doc.get("규격")
qty = spec.get("수량") if isinstance(spec, dict) else None
if not isinstance(qty, dict) or not done:
return doc
moved = {old: ref_id(new) for old, new in done.items()}
return {**doc, "규격": {**spec, "수량": {moved.get(k, k): v for k, v in qty.items()}}}
def _moved(lines: Any, move: Callable[[Ref, int], Ref], depth: int) -> list[Any]:
+21
View File
@@ -326,6 +326,27 @@ def test_복사는_못_읽는_참조를_같이_복사_본뜬(world):
assert e.value.status == 400
def test_복사_새_키_규격_열_수량도_따라감(world):
"""통합 점검 — 회사에 올리기 승인 · 회사로 복사: 개인 참조가 회사 새 키로 바뀌면 규격 열 수량 열쇠도."""
inner = _combo(world["personal"], [{"로직": TEN}], "안")
old = f"참조|personal|7/42|{inner}"
spec = {
"이름": "H",
"열": ["1.5", "2.0"],
"기본": "1.5",
"수량": {old: {"1.5": 1, "2.0": 1.3}, "고정|돌|가|㎡": {"1.5": 2, "2.0": 2.6}},
}
doc = {"담은로직": [{"참조": {**MINE, "키": inner}}], "규격": spec}
with store.at(world["company"]):
got = refs.carry(doc, ("personal", "7/42"))
new = f"참조|company|7|{got['담은로직'][0]['참조']['키']}"
assert got["규격"]["수량"] == {
new: {"1.5": 1, "2.0": 1.3},
"고정|돌|가|㎡": {"1.5": 2, "2.0": 2.6},
}
assert doc["규격"]["수량"][old] == {"1.5": 1, "2.0": 1.3} # 원본 그대로
def test_길_새로_복사_권한(world):
from fastapi import FastAPI
from fastapi.testclient import TestClient