버너(MP000209)·퓨즈(MP000214)는 어제 「후보가 있어도 물건이 달라 못 고름」으로
남겨 뒀으나, 재료_품셈재료.json 을 old/ 로 옮기려면 로직의 MP 직접참조가 다
없어야 함 — 자재품목에 값 없는 새 줄 둘(MT030710 버너·MT030711 퓨즈)을 만들어
그리로 이음(PLAN 7-4b ① 106종과 같은 자리 — 이름·규격·단위·출처 채움 · 값 다섯
칸 빔 · 비고에 왜 기존 후보를 못 썼는지). _키대장.json 갱신 · build_로직_재료_고르기.py
다시 돌려 로직 2줄 반영 — 로직의 「MP……」 직접참조 0(옛 22줄 + 오늘 1줄 = 모두 끝).
typecheck 통과 · 관련 시험 108 통과 · 로직 1354개 전수 대조 금액 달라짐 0·새 멈춤 0.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
master_material.py — PICK_KEYS 에 「지역」·「계약종별」 더함. `_region`·`_tariff`
두 함수를 품셈재료 행이 아니라 조건 묶음 자체를 받게 고쳐 옛길(품셈재료 「연결」
간접)과 새길(호표 「요소」 에 조건을 바로 박음) 이 같은 코드를 씀(sub3 가 분석해
둔 방식 그대로 — 이름 뿌리 endswith·단위 같음·지역 이름 포함 매칭). check_pick —
지역·계약종별 조건은 구분 없이 이름만 확인 · 값이 "입력" 아닌 채 섞이면 틀로 잡음.
build_로직_재료_고르기.py — 품셈재료 연결이 {이름·지역:입력} 이나 {이름·계약종별:입력}
인 줄(모래 MP000004·자갈 MP000006·전력 MP000358)도 그 조건 묶음을 그대로 호표에
박도록 넓힘 — 다시 돌려 로직 4개 파일 17줄 반영(모래 8·자갈 1·전력 8). 전력은
지시대로 재료_유가전력.json(MO 테이블)을 그대로 가리킴 — 자재품목은 안 거침.
test_masterdata_check.py — PICK_KEYS 늘어난 만큼 cond_text 글자 열쇠 시험 고침 ·
지역 값이 "입력" 아닌 조건은 틀로 잡히는 것 확인.
test_m01_api.py — 전력 계약종별 시험을 mf.element 직접 호출로 바꿈(화면 단가
미리보기 `_pick_brief`(M01_MasterData_Store.py, 담당 밖)는 구분·상세구분 자리로만
찾아 지역·계약종별 조건은 아직 못 다뤄 None — 아는 구멍으로 남김 · 계산 자체는
정상 확인).
typecheck 통과 · 관련 시험 108 통과 · 로직 1354개 전수 대조 금액 달라짐 0·새 멈춤 0.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
사용자 확정(값이 없어도 그냥 넘어감)에 따라 규격·지역이 애매해도 가장 맞는
자재품목 줄로 이음:
· 색소(MP000078) → 착색제(M-Green, MT006740) — 후보 1줄뿐이라 그대로
· 에폭시(MP000082) → 주입용 에폭시 습식(MT007705) — 후보 4줄(주입용 습식·건식·
씰링용) 가운데 낙석방지망 앵커 주입에 흔한 습식형
· 땜납(MP000285) → 봉땜납 Sn30%(MT001252) — 후보 둘(Sn10%·Sn30%) 가운데 원문
50:50 에 더 가까운 쪽(정확히는 안 맞음 — 비고에 적음)
버너(MP000209)·퓨즈(MP000214)는 후보가 있어도 물건 자체가 다름 — 버너 후보(개장로용
가스버너, 6~9구용, 915만원)는 산업용 화덕이지 압접가열용 소형버너가 아니고, 퓨즈
후보 다섯(전선퓨즈·통형퓨즈·고리퓨즈)은 모두 전기용이지 테르밋 용접 점화용이 아님 —
못 골라 그대로 둠(비고 그대로).
build_로직_재료_고르기.py 다시 돌려 로직 3개 파일에 고르기 조건 3줄 반영.
test_자재품목_분류.py — 기대표에 셋 더함(품명과 자재품목 이름이 달라 뿌리-이름
우선 검사에서 스페이셔와 같은 이유로 뺌).
typecheck 통과 · 관련 시험 108 통과.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
재료_품셈재료.json — 어제 만든 자재품목 새 줄 106개로 「연결」을 이음(값이 비어도
정상) · 그 뒤 build_로직_재료_고르기.py 를 다시 돌려 로직 16개 파일의 옛 방식
「요소": "MP……"」 134줄을 고르기 조건(구분·상세구분·대표)으로 바꿈.
GF000173 VR관(산림 12-11-1) — 자재품목 VR관 줄 단위 「본」과 호표 단위 「m」이
갈려 예전부터 멈춰 있던 자리. 1본=2.5m(고려콘크리트산업 규격표, 어제 확인)로
단위를 「본」으로 바꾸고 수량 식에 ÷2.5 를 넣어 풂 — 고르기 조건은 구분·상세구분·
규격만 두어(대표 안 박음) 「VR관」·「VR관(관급)」 둘 다 후보 — 지금은 파일 차례로
관급 줄(MT009698)이 먼저 걸림(고무링 요소와 같은 방식 · 사용자 확정 필요하면 나중에).
GF000176 커플링밴드는 sub2 가 이름 칸을 고르기 스키마에 더하는 중이라 안 건드림
(자재품목·접속티 안 갈리는 문제, ref/_분석_커플링밴드.md).
남는 MP 직접참조 22줄 — 모래 8·자갈 1·전력 8(지역·계약종별 입력으로 계산 때
풀리는 방식, 어제 분석에서 사용자 확정 보류) · 자재품목 후보는 있으나 규격·지역이
애매해 어제 일부러 뺀 5종(색소·에폭시·버너·퓨즈·땜납). 커플링밴드 1줄까지 23줄.
test_자재품목_분류.py — 새 106종의 품명별 기대 구분표 추가(스페이셔(몰탈 블록)는
뿌리 이름이 같은 다른 물건(철근 스페이셔)과 안 섞이게 그 검사만 뺌 · 실제 연결은
정확한 대표 키로 콕 집어 안전).
test_masterdata_check.py — 「MT:{변수}」 남은 참조 검사를 VR관 반영해 커플링밴드
1줄만 남게 고침.
typecheck 통과(TS 변경 없음) · test_masterdata_check.py·test_자재품목_분류.py
80 통과 · test_m01_api.py 27 통과.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
- 코드·파일 안 옮김 · 읽기 전용 · `ref/_분석_안쓰는마스터.md` 한 파일
- M01 이 읽는 목록 — 최상위 json 145개 전부(load() 가 통째로 읽음) · _키대장.json ·
엔진·검사 스크립트 8개(check_master·master_combo·copy·keys·text·formula·material·draft)
- scripts/ 나머지 37개는 전부 빌더·검사 도구(옮기면 그 도구가 깨짐) — 옮길 후보 없음
- old/ 재확인 — PLAN 가정과 달리 4개(공종 마스터 2·공종 산림건설 연결·돌쌓기경사)를
B05·B06 화면이 지금도 읽음(절대 옮기면 안 됨) · 12개는 끊긴 old_code 만 읽음 · 21개(54,244줄)는
이미 old/ 안인데 아무도 안 읽음(지울 후보 — 7-5 몫)
- ref/ 재확인 — md 58개는 범위 밖(코드가 안 읽음) · json·csv 9개 가운데 2개는 화면·시험이 지금도 읽음
(절대 못 옮김) · 4개는 끊긴 old_code 만 · 2개는 진짜 아무도 안 읽음
- 옮길 후보 = 강한 것 3개(531줄: _원문목록.json·_열목록_화면표.csv·수량_돌쌓기찰라이브러리_소광리) +
old_code 정리 뒤에나 되는 약한 것 4개(1,688줄) — PLAN 기대보다 훨씬 작음
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
고르기 조건(PICK_KEYS)에 이름 칸을 더함 — candidates()가 구분·상세구분·규격에 더해
이름 낱말도 봄(자재품목 원자료는 안 건드림). GF000176(파형강관 부설) 커플링밴드 호표를
옛 방식(품셈재료 손 연결)에서 고르기 조건으로 바꿔 같은 규격(관경)의 접속티와 안 섞이게 함.
재료_품셈재료.json MP000027·32·37 도 같은 조건으로 갱신. _틀.md 7장·시험 갱신.
검증: 이름 없이는 관경마다 커플링밴드·접속티 6줄이 섞임 → 이름을 더하면 1줄로 좁혀짐(전수
확인). 일괄 시험 계산 통과 1291·멈춤 63·금액 달라진 로직 0(앞뒤 동일) · check_master 틀·
본문·로직·조합 0 유지.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8
서버를 새로 띄우고 라우트 수로 새 코드가 실린 것부터 확인(quantity·estimation·z01 0).
마스터 데이터 컨테이너 아홉 모두 뜸 · 13-4-1 텍스트 수식 두 칸 정상(석공 60,984.36) ·
견본 조합 미리보기 합계 187,957.7202원 숫자로 뜸 · B08·B09 빈 화면 · Z01 은
준비 중인 페이지로 떨어짐 · B05·B06·B07 그대로 뜸.
알약 모달 한 항목만 지시문 해석이 갈릴 여지가 있어 사실만 적고 코드는 안 고침.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
품셈재료 가운데 자재품목에 짝 없어 로직이 부르는 재료 106종(원 분류의 139줄 대응)을
자재품목에 새 줄로 만듦 — 이름·규격·단위·구분·상세구분·출처(품셈재료 키·요구절)만
채우고 값 다섯 칸(물가자료·유통물가·물가정보·거래가격·관급)은 모두 빔 · 비고에
「품셈재료에서 옮김 · 값 미확보」 · 키는 MT030600부터(_키대장.json 갱신).
이름이 옛 분류 규칙에 안 걸리는 93종(건설품셈 13장 플랜트설비 소모품 위주)은
build_자재품목_분류.py 에 정확한-이름 대응표를 새로 두어 채움(정규식 우선순위는
안 건드림 · 기존 30592줄 분류 결과 그대로 · 미분류 25줄 불변).
모래·자갈(중량 kg, 자재품목엔 ㎥ 지역줄만 있음)은 한 줄로 안 굳히고 전국 대표 자리 ·
지역별 자리 두 줄씩(4줄) 나눠 둠. 전력은 재료_유가전력.json 에 이미 있어 그대로 둠(안 옮김).
VR관(GF000173 막힘 원인)은 고려콘크리트산업 규격표로 1본=2.5m(D300~D1200 공통) 확인 —
그 22줄 비고에 환산 계수·출처 적음(D1500 은 표에 없어 그대로 둠).
품셈재료 자체는 이번엔 안 옮김(다음 일감) · 로직·조합 파일은 안 건드림.
typecheck 통과 · test_자재품목_분류.py·test_masterdata_check.py 80 통과(미분류 0 신규).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
B08_Quantity 86 · B09_Estimation 111 파일을 old_code/ 로 옮김(지우지 않음).
화면은 메뉴·주소·단계 막대만 남은 빈 틀 둘 — main.py 라우터 13 개는 끊음.
B07 이 빌려 쓰던 비탈 길이·면적은 필요한 함수만 B07_DesignDetail_Engine_SlopeGeometry
로 옮겨 적음(면적 적분·노면 면적·측점 묶음은 안 옮김) · 시험 하나를 새로 둠.
B07 구조물도 조립(Cad_StandardSheet)은 2026-09-13 에 이미 도면 목록에서 빠져
부르는 곳이 없어 old_code 로 같이 보냄 — 구조물 그림은 되살리지 않음.
B06 구조물 몫 조회는 빈 값으로 두어 화면이 그대로 서게 함.
B08·B09 를 부르던 시험 25 개도 old_code/resources/tester 로 옮김.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
- `scripts/check_값없는줄.py` 신설 — 로직 1,354 줄을 훑어 호표 직접 지정·고르기 조건 후보·
대표 줄·품셈재료 연결(문자열 키·지역 조건)까지 실제 참조를 셈, 값은 안 채움
- 재료_자재품목.json 다섯 칸(물가자료·유통물가·물가정보·거래가격·관급) 모두 빈 줄 345 가운데
로직이 실제로 가리키는 진짜 구멍은 31 줄 — `ref/_분석_값없는줄.md` 신설
- `ref/_관리자값_미확보.md` 재검증 — 45종 가운데 6종은 고르기 조건으로 바뀌었거나 로직이
재료 자체를 뺀 것이라 로직이 안 씀으로 옮김, 남은 39종·로직 49개는 그대로 관리자 몫
- `ref/_없는_재료.md` 재검증 — 111줄 모두 지금도 로직이 부름, 뺄 줄 없음
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
B08_*·B09_* 를 부르는 밖의 자리를 모두 훑음(파이썬 2·main.py 13·화면 라우트 5·
common_util 문자열 3·시험 25).
B07 이 부르는 SlopeLength·SlopeArea·StructureFigure 의 이식 난이도를 가름
(앞 둘 쉬움 · StructureFigure 는 Pipe·StructureSheet·UnitQuantity 가 딸려 어려움).
B08·B09 파일·줄 수 표 · 옮긴 뒤 빈 화면에 남길 최소한 · 옮기는 차례를
PLAN 7-3 확정 차례(먼저 옮기고 깨지는 대로 봄)에 맞춰 정리.
코드는 하나도 안 고침.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
소요량·계수의 쓰는 로직 · 조합 화면 로직 이름 · 패널 제목 세 자리를 모두
새 컨테이너(UI_LogicLab)로 돌림 · 옛 컨테이너(UI_Logic_Page)는 old_code/M01_MasterData/
로 옮김(지우지 않음 · import 경로만 고침 · 통째 복사 아님) · 정본 GC·GF 를 화면에서
바로 고쳐 저장 · 정본 파일에 빈 줄 더하기 두 길은 사용자 확정으로 버림.
분석 = resources/master_data/ref/_분석_로직컨테이너_통합.md.
typecheck 통과 · M01 시험 107 통과 · ORCA — 패널에 「단가산출 로직」 하나만
· 소요량 표 쓰는 로직 키(GF000002 · GF000051) 클릭 각각 그 로직이 새 컨테이너에서 열림
· 조합 화면 로직 이름도 같은 컨테이너로 이어짐.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
공종 마스터 줄 하나를 예로 칸 뜻(코드·이름·열쇠·갈래·딸린 표) 풀고 열쇠대장·연결·자원줄 파일 역할 따로 설명.
Z01 기초단가·B08 수량산출·B09 견적 화면에서 그 값이 뜨는 자리를 코드 근거로 짚고, 로직·소요량·계수와 다른 축임을 한 문단으로, 구조 변경 이력을 날짜별로 정리.
사용자 물음(load_basis_missing 옮길 곳)에 답함. 지금 있는 검사 넷(마스터 틀 검사 check_master.py ·
M01 저장 검사 · B09 이중계상 가드 Guards.py · resources/tester 시험)을 언제 도는지로 가르고,
load_basis_missing 의 10배·100배 검사와 같은 결의 검사는 없음을 확인. 옮길 자리 두 갈래
(새 마스터 JSON vs KnownGaps.py 같은 코드 상수)를 장단점만 적고 고르지 않음.
2_공종_*(old/) 는 지금도 API·B08→B09 인계 열쇠·Z01 기초단가 화면이 쓰는 정본 — 로직·소요량·계수(자원 축)와 겹치지 않는 별도 축(공종 축)이라 대신 안 됨.
임도기술교본·사방기술교본은 사업별로 나뉜 서로 다른 원문 둘(2026-08-13 사용자 확정 이미 있음) — 마스터 표엔 품셈 원문 인용 각주와 ref/ 근거자료로만 있고 확정값으로 안 섞임.
_걷을_옛코드.md 58행 실체 확인: B09_Estimation_UnitPrice.py는 부르는 곳 60여 곳(B08·B09·시험)의
살아있는 핵심 조립 엔진 — 이 파일 자체가 old/를 직접 읽는 자리는 load_basis_missing() 하나뿐이고
그마저 기본 파일명(산림 밑수없음) 한 벌만 실제로 쓰임(건설 벌은 死文). 조용한 실패 위험(old/ 지우면
예외 없이 빈 딕셔너리로 넘어가 밑수 검사가 사라짐) 하나를 찾아 걷는 차례와 함께 적음.
- 코드·데이터 안 고침 · 읽기 조사만 · `ref/_분석_B08B09_초기화.md` 한 파일
- 크기 — B08 26,451줄(85 파일) · B09 28,507줄(111 파일) · 서버 길 56 · 시험 191 파일 26,943줄
- 마스터로 갈아끼울 수 있는 자리 약 15,400줄(B09 품셈·단가 11,872 · B08 공종 마스터 만들기·단가 붙이기 3,554)
- 못 하는 자리 — 수량 산출 규칙 7,805 · 구조물도 2,643 · 공종 축(로직 키와 잇는 대응표 없음) ·
원가계산서 서식 4형식 · 내역서 조판 · 목록표 16종 · 끝수·소수자리 · 제비율 적용 절차 · 단계 넷
- B08·B09 가 서로 부르는 고리(구조물도 미리보기가 B09 단가를 부름) — 한쪽만 들어내면 멈춤
- 다시 짜는 차례 제안 — 공종 축 연결표 먼저 · 단가 길만 마스터로 · 수량은 남김 ·
서식은 데이터로 · 걷기는 `ref/_걷을_옛코드.md` 5 단계 그대로 맨 끝
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
일감 29(읽기 전용). 켠 뒤 첫 목록만 그대로(캐시가 비어 1,354줄을 한 번은 훑음) ·
그다음부터는 /api/m01/logics 175ms 로 뚝 떨어져 단가산출 로직·로직 개선 시험 다
1초 안쪽. 조합 목록도 1.6초→0.1초. 자재품목·소요량·계수는 원래도 빠르고 그대로.
같은 시간에 들어오던 캐시 고침의 흠(check_logics 인자 개수 안 맞음)으로 저장 길이
전부 500 이라 조합 상세·로직 저장·인력 저장은 못 잼 — 브레인에 알림용으로 적어 둠.
- 인력 한 줄 저장 7.0초 → 0.9초 · 자재품목 7.2초 → 2.0초 · 소요량 표 1.7초 ·
자재품목 저장 뒤 목록 2.5초 → 0.45초 · 켠 뒤 첫 목록 3.4초 → 1.6초
- 로직 줄을 셀 때 `Master.get` 을 덧옷(`_Watch`)으로 감싸 그 줄이 본 자리를 모음 —
키 · 「ID:원문번호」 · 없는 키를 물은 것까지 · 재료 고르기 줄은 자재품목 묶음 통째
- 저장은 그 지도로 흔들리는 줄만 검사(고친 키 · 고치기 전후 원문번호 · 지운 줄) ·
요소를 고친 저장은 연결·준용 검사를 그대로 돌림
- 저장 뒤 목록은 흔들린 자리를 알려 받아(`stale(names, marks)`) 그 줄만 다시 셈 ·
다른 창이 고친 파일이면 예전처럼 통째로 다시 셈
- 자재품목을 「구분」 으로 미리 갈라 둠(`master_material.by_class`) — 고르기 후보를
3만 줄에서 훑지 않음 · 가른 차례는 파일 차례 그대로라 고르는 줄은 안 바뀜
- 전수 확인 — 요소·표 파일 90 개마다 줄을 통째로 비우고 로직 1,354 줄을 다시 검사,
달라진 줄이 모두 지도 안(지도 밖 0)
- 시험 `test_m01_cache.py` 에 셋 더함(열둘) — 쓰이는 요소를 지우면 저장이 막힘 ·
요소를 고쳐 저장한 뒤 막힘 표시가 줄마다 검사한 것과 같음 · 인력 줄을 비운 전수 대조
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
- 저장(`POST /save`) 6.8초 → 0.8초 — 고친 줄과 그 줄을 부르던 줄만 검사
(안 보는 줄이 부르는 키는 목록이 미리 세어 둔 것을 씀 · 돌고 도는 길은 전체 그림으로)
- 로직 줄만 고쳤으면 품셈재료 연결 · 인력 준용 검사(`check_links`)도 건너뜀
- 로직 밖 파일(요소 · 표)이 섞인 저장은 예전처럼 전부 검사 — 전체 검사는 `check_master` 몫
- 켠 뒤 첫 목록 3.4초 → 0.03초 — M01 라우터가 뜰 때 뒤에서 한 번 읽어 둠(`cache.warm`)
- 저장 전 검사(`check_saved`)를 M01 쪽(`_Store_Cache`)으로 옮김 — 좁히는 값이 있는 자리 ·
`check_master` 가 700줄에 닿음
- 시험 `test_m01_cache.py` 에 넷 더함 — 없는 로직 키 · 없는 요소 키 · 돌고 도는 참조 ·
다른 파일에서 그 줄을 부르던 줄이 깨짐(모두 422) · 미리 읽은 뒤 첫 목록
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
- `_Store_Cache` 신설 — 자국(시각·크기)이 바뀐 파일만 다시 읽음 · 목록은 검사를 돌리지 않고 세어 둔 막힘을 씀
- 요소·표가 바뀌면 모든 로직을, 로직 파일이 바뀌면 그 파일과 그 로직을 부르던 줄만 다시 셈
- 저장 뒤에는 고친 파일을 바로 다시 읽게 알려 줌 — 저장 직후 목록 2.5초 → 0.06초
- `/logics` 둘째 번부터 2.5초 → 0.02초 · `/combos` 0.3초 → 0.01초 · 켠 뒤 첫 번만 3.4초
- 시험 `test_m01_cache.py` 다섯 — 세어 둔 막힘이 줄마다 검사한 값과 같음 · 거름 그대로 · 저장 직후 비침
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj