6.9 KB · 수정 2026-09-09 10:39
목차

인수인계 — GS 원주 단구 한샘 견적서 「복구하시겠습니까」 추적 (26.9.9 · ✅해결·종료)

✅ 결말 (26.9.9 후속 세션)

§1 의 결함 2개(app.xml · C{b})가 진짜 원인이었고, 그걸로 이미 고쳐져 있었다. NAS 에 올라가 있던 깨진 파일은 그 수정(build.py 10:09) 이전 산출물(10:05)이었다.

🔴§3 의 이진탐색 표와 §4 의 「범인 = fill_main/fill_sub」는 전부 무효다. bisect_stage.py 가 finalize()(= calcChain 폐기)를 마지막 단계에서만 불러, 중간 산출물이 전부 낡은 xl/calcChain.xml(1,547항목) 을 달고 나갔다. 행이 밀리고 수식이 지워진 뒤라 계산체인이 옛 좌표를 가리켰고 그게 Excel 복구 트리거였다. _z_copyonly OK / _z_copyfill 깨짐도 calcChain 손상량 차이였을 뿐이다. ⛒모든 단계에 finalize 를 걸어 재측정 → pack→rename→clone→lay1~4→cover→hidden 9단계 전부 OK.

재빌드한 정본: Excel 정상열림(mode 0) · 무수정(수식1553/병합466/도형1 이 정상화본과 동일) · verify 127/127 · _xlcheck 0 · xldiag 0 · 신설 sfcheck.py 0. NAS 교체 완료(승인 후 삭제→재업로드, 왕복 sha256 일치). 8월 원본 무사.

아래 원문은 기록용이다. §3·§4 는 따라가지 마라.


페페 보고: 엑셀이 「복구하시겠습니까」 + 「수식 참조 오류」를 띄운다. 작업 폴더 = C:\dev\_work\gs-wonju-dangu\ · 원본(무사) = …_26년 08월.xlsx

0. 🔴 지금 상태 — 먼저 알아야 할 것

1. ✅ 확정해서 이미 고친 결함 2개

  1. 🔴🔴docProps/app.xml 개수/이름 불일치 = Excel 이 「파일 손상」으로 본다. 시트를 끼우고 TitlesOfParts size 만 +1 했는데 항목은 그대로였다(선언 12 / 실제 11). 게다가 rename_sheet 는 app.xml 을 안 건드려 옛 이름 84A 내역서-주 가 남아 있었다. ⛒build.sync_app_xml(parts) 신설 — workbook.xml 시트 목록으로 다시 쓴다(마지막에 1회). ⚠_xlcheck·xldiag·openpyxl 은 이걸 전부 통과시킨다. 여긴 그들의 사각지대다.
  2. 블록명 셀을 B{b} 에 썼다 — 이 파일 규약은 C{b}(C:N 병합). 그래서 C39·C53 에 복제 원본의 옛 이름 「상부장 부자재」가 남았다. C{b} 로 고쳤고 verify.py 에 「B{b} 는 비어 있어야」 검사를 넣었다(현재 127/127 PASS).

2. 🔬 검증 인프라 — 이번에 만든 것 (이게 핵심 자산이다)

3. 🎯 이진 탐색으로 좁힌 범위

배치 판정(대조군 OK 확인된 것만 유효):

산출물 내용 결과
_probe_base.xlsx 원본 08월 OK(대조군)
_stage_pack 읽고 재압축만 OK
_stage_rename + rename_sheet OK
_stage_clone + clone_sheet(+sync_app_xml) OK
_stage_lay1 + 84A(기본) lay_blocks OK
_y_dv / _y_rows / _y_merge DV 제거만 / 행 재배치만 / 병합 재작성만 전부 OK
_z_copyonly lay_blocks 하되 fill_main·fill_sub 만 no-op OK
_z_copyfill · _w_nocl · _probe_in lay_blocks 전체 깨짐
_x_rttonly 갑지 _retarget_total 치환만 OK (무죄)

⛒결론 = 범인은 build.fill_main / build.fill_sub 안이다. 블록 복제·행 재배치·병합·DV 제거·갑지 참조 치환은 전부 무죄로 실증됐다.

⚠무효 처리한 실험 = _q_str·_q_num·_q_frm·_r_blankonly·_r_noblank. H.set_str 등 엔진 레벨을 no-op 으로 패치해서 lay_blocks 의 A4 평형명·총합 수식까지 꺼졌다 (XML diff 로 확인: OK본은 A4 가 inlineStr, 무효본은 t="s" 그대로). 결과를 믿지 마라.

4. 다음 한 걸음 (그대로 이어서 하면 된다)

fill_main 을 부분 수행하는 변형을 만들어 배치로 잰다. 반드시 B.fill_main 을 통째로 교체하는 방식으로 하고(엔진 H.set_* 는 건드리지 마라), 매 배치에 _probe_base.xlsx 를 넣는다.

  1. 블록명(C{b}) + 합계 SUM 만
    • _blank_block(clear 60칸)
    • 라벨/도어/길이/마감/10MM/등급
    • 단가 LOOKUP 수식(price_formula) ← 1순위 용의자. 내가 손으로 조립한 문자열이라 원본과 미세하게 다를 수 있다. 원본 C9 수식을 그대로 떠서 행만 옮기는 방식(H._repoint)으로 바꿔 보는 것이 가장 빠른 확인이다.
    • 적용가 수식

깨지는 순간이 곧 범인이다. 잡으면 → build.py 수정 → verify.py(127항목) + _xlcheck + xldiag + run_probe 배치까지 4중으로 확인 → NAS 재업로드.

5. NAS 교체 절차

nasget.py put 은 대상이 있으면 거부한다. 깨진 9월 파일을 지워야 하는데 삭제는 위험작업이라 페페 승인 후 smbclient 로 지우고 다시 올린다. 8월 원본은 절대 안 건드린다.

6. 시드 포인터