chore(plan): 완료 계획(1~7장) docs/raw/plans 로 이관

PLAN.md 1~7장 체크 끝 — 남은 절만 남기고 지난 계획 통째 이관
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
This commit is contained in:
2026-09-22 17:45:43 +09:00
parent 228e523d28
commit a72caa667a
@@ -0,0 +1,329 @@
# 상시 계획서
**남은 작업만 두는 유일한 계획서.** 목록이 비면 프로젝트 최종 완료.
---
## 1. 마스터 요소 그룹화 · 단가산출 로직 사용성
### 1-0. 사용자 확정
- 마스터 = 프로젝트에 쓸 데이터를 모으는 곳(값을 고르지 않음). 값·대응은 출처 원문을 지식DB 에 확보·확인한 뒤에만 · 상용 자료·실무 문서는 단서일 뿐(자재품목 물가지 값만 예외 — 배포 때 판권 구매).
- 품셈재료 테이블은 원문이 부르는 이름을 모은 것일 뿐 — 로직에 직접 넣지 않음. 로직의 재료 줄은 자재품목의 **구분 · 상세구분**으로 묶인 범위를 가리키고 사용자가 고름.
- 기계 · 소요량 · 계수에도 구분 · 상세구분을 두고, 소요량 · 계수에는 **어디에 쓰는지(용도)**를 적어 로직에서 고를 때 미리 안내.
- 로직 화면은 교육 없이 쓸 수 있어야 함 — 세 방식을 테스트 컨테이너에 만들어 사용자가 써 보고 고름. 바로 적용하지 않음.
### 1-1. 요소 그룹화 (데이터)
- [x] 자재품목 구분 · 상세구분 — 구분 = 큰 묶음(레미콘 · 철근·강재 · 시멘트·골재 · 석재 · 관·수로 · 거푸집·가설재 · 목재 · 식생·종자 · 매트·토목섬유 · 안전시설 · 잡재료 …) · 상세구분 = 품명 묶음(흄관 · 파형강관 · PE관 …). 품명 글자로 자동 분류 → 다른 창 표본 검증 → 못 가린 것은 「미분류」. 조달청에서 온 줄은 조달청 분류명을 따름. 묶음 목록은 `_틀.md` 에. 검증완료 — 자재품목 30,592줄 가운데 미분류 25줄만 남음. 검증 대기.
- [x] 기계 구분 · 상세구분 — 구분 = 원문 분류(건설품셈 8-3 의 [00]토공기계 · [10]다짐기계 … · 산림품셈 2-2 임업기계) · 상세구분 = 기종(불도저 · 굴착기 …). 지금 「세부분류」(건설품셈/산림품셈)는 「원문」 칸으로. 검증완료 — 기계 654줄 모두 구분·상세구분 있음 · 「세부분류」 칸 없어짐. 검증 대기.
- [x] 소요량 · 계수 「용도」 — 표마다 어디에 쓰는지: 공종(원문 절 이름) · 대상(인력 · 기계 · 재료 · 할증 · 환산 · 작업량 조건) · 이 표를 쓰는 로직 키 목록(로직에서 거꾸로 뽑아 자동으로 채움). 구분(원문+부문) · 상세구분(장)은 그대로. 검증완료 — 소요량·계수 3,029표 모두 「용도」 있음. 검증 대기.
- [x] 로직 재료 줄 = **고르기 조건** `재료 고르기{구분, 상세구분[, 규격 조건]}` — 원문이 규격을 밝힌 것은 조건을 좁힘 · 시험 계산은 조건 안 첫 줄 또는 관리자가 정한 대표 줄(자재지역 울진). 품셈재료 = 「원문 이름 → 구분·상세구분」 대응표로만 쓰다가 로직이 다 바뀌면 삭제.
- **끝(09-22)** — 품셈재료를 `old/` 로 옮기고 `MP` 참조 0 · 금액 달라짐 0
- 진행 — 엔진·후보 API·단위 거름 끝 · 품셈재료 고르기 채움 127줄(전수 검증 반영) · **삭제 조건 정리 `ref/_품셈재료_삭제조건.md`**
- {변수} 참조 22줄 가운데 **20줄을 고르기 조건으로 옮김** · 교차 검증완료(옛 판과 같은 자재·같은 금액 · 48 조합 + 입력 141벌 · 입력이 비면 멈추고 엉뚱한 줄 안 집음 · `ref/_검증_변수참조.md`)
- 남은 것 — 자재품목에 짝 없음 139(**값 없어도 넘어감으로 닫힘**) · 지역·계약종별 17(**전국/지역 나눔으로 닫힘**) · {변수} 2 — VR관 「본」↔「m」(7-4b 에서 확인) · **커플링밴드는 고르기 조건에 「이름」 칸을 더해 가름(사용자 확정 09-22 · 원자료는 안 건드림)****셋 다 사용자 확정 뒤라야 품셈재료를 지움** · 옛 방식 재료 줄 307 → 178(129줄을 조건+대표로 바꿈 · 금액 바뀐 로직 0 · 통과 1,291 그대로 · 단위 경고 14 그대로) · 남은 178줄의 까닭별 수·보기 `ref/_남은_옛재료줄.md` — 자재품목 짝 없음 139 · 지역·계약종별 연결 17(모래·자갈·전력) · `{변수}` 이름 참조 22 · 품셈재료 삭제는 그 뒤
- 커플링밴드 검증완료(09-22) — 고르기 조건에 이름 칸을 더해 관경 800·1000·1200 전수에서 **1줄로 정확히 좁혀짐**(접속티 0건 섞임) · 일괄 시험 계산 1,291 통과 · 멈춤 63 · **금액 달라진 로직 0** · 시험 109 통과
- 지역·계약종별 17줄 정리 끝(sub1) — 지역 자리 = 로직 입력 `자재지역`·`전력 계약종별`(17줄 모두 있음 · 대표로 굳히지 않음) · 지역 갈림 품목표·울진 값 유무 `ref/_지역_갈림_재료.md`(울진은 레미콘·아스콘만 값 있음 · 모래·자갈 없음) · 전력 두 줄 한전 요금표와 맞음. 검증완료. 검증 대기.
- [x] 엔진 · 검사 도구 · M01 서버 · `_틀.md` · 시험 · 로직 일괄 시험 계산 전후 비교. 검증완료 — `check_master.py` 틀 0 · 로직 0 · 단위 경고 14 · 일괄 시험 계산 통과 1,279 · 멈춤 75(관리자 값 미확보 등 데이터 대기 · `ref/_관리자값_미확보.md`) · 시험 `test_masterdata_check.py` 65 통과. 검증 대기.
### 1-2. 로직 사용성 — 테스트 컨테이너
- [x] 단가산출 로직 컨테이너 아래 **「테스트」** 컨테이너 — 읽기 + 시험 계산만(저장 없음 · 정본 로직은 건드리지 않음) · 세 방식이 같은 데이터·같은 엔진을 씀(결과 금액이 셋 다 같아야 함). 틀 `M01_MasterData_UI_Test.ts` · 접속 `render(host, logicKey)` · 방식 B·C 는 준비 중 표시(파일이 오면 틀의 METHODS 에 한 줄씩 이음). 검증완료 — 시험 `test_m01_test_container.py` 4 통과 · ORCA 로 컨테이너 열림·탭 A/B/C 확인. 검증 대기.
- [x] 대상 = 산림품셈에서 복잡한 로직 10개(고른 결과 = 틀 파일 `TEST_KEYS` · 재는 스크립트 `resources/master_data/scripts/로직_복잡도_재기.py` · 검증완료 · 검증 대기) — 원안 후보(복잡도 = 입력 수 · 표 찾기 수 · 로직 부르기 · 덧줄 · 재료 가짓수로 재서 고름 — 후보: 13-4-1 메쌓기 · 13-4-2 찰쌓기 · 9-16 노체 · 9-3 기계 터파기 · 10-4 트럭 운반 · 10-11 불도저 운반 · 12장 펌프카 타설 · 12-38 유로폼 · 5-24 씨앗뿜어붙이기 · 7장 집재).
- [x] 방식 A — 질문-답 마법사(공종 → 조건 → 재료·기계 고르기 → 결과 호표 · 식은 안 보임). `M01_MasterData_UI_Test_A.ts`. 검증완료 — 메쌓기 60,984.36 · 노체 4,522.9569 · 트럭 운반 102,183.8685 가 기존 로직 화면 시험 계산과 같음. 검증 대기.
- [x] 방식 B — 호표 + 옆 설명 카드(줄을 누르면 「이 수량은 어디서 왔나」: 원문 표 미리보기 · 적용된 할증 · 쉬운 말 풀이 · 식 고치기는 「고급」 뒤).
- 검증완료 — 10개 로직 ORCA 확인 · 세 방식 금액 일치 · 하위 로직 줄·합계 줄 고침 · 검증 대기
- [x] 방식 C — 흐름 그림(설계 값 → 표 찾기 → 수량 → × 단가 → 할증 → 합계 · 상자를 누르면 값과 출처 · 로직이 로직을 부르는 관계).
- 검증완료 — 10개 로직 ORCA 확인 · 세 방식 금액 일치 · 검증 대기
- [x] 세 방식 모두: 소요량·계수·재료·기계를 고를 때 구분 · 상세구분 · 용도로 미리 걸러 후보를 보여 줌 · 기본 사용자는 설계자(로직을 골라 값을 넣어 쓰는 쪽) · 로직 만들기·고치기는 「고급」. 검증완료 — 부품 `M01_MasterData_UI_Test_Pick.ts` 하나를 A·B·C 가 같이 씀 · ORCA 로 7-11 재료 하나 바꿔 세 방식 줄 금액 59,322,318.1258 같음(A·C 합계 77,138,079.2698) · 시험 4 통과. 남은 것: 재료 줄이 고르기 조건 형태인 로직 · 기계 구분 칸 API. 검증 대기.
- [x] 사용자가 써 보고 방식 확정(방식 C 기본 + 만들기 모달 방식 A — 2장에서 구현 · 검증완료) → 그 방식으로 실제 로직 화면 교체(그때 계획).
### 1-3. 남은 구멍 (우선순위 뒤)
- [x] 관급 자재 짝짓기 — **확정(09-22): 남은 29줄도 그냥 넘어감**(값이 없어도 정상 · 값은 프로젝트에서) · 355 → 채운 212 · 조달청에 없음(정상) 83 · 못 이음 29 · 조사 기록은 `ref/_확정거리_관급.md` · `ref/_검증_관급_가까운줄.md`
- [x] 조달청에 없는 재료 · 값 없는 줄 — **확정(09-22): 마스터는 값을 모으는 곳이고 다섯 칸이 다 비어도 그냥 넘어감** · 값은 프로젝트에서 사용자가 넣음(B09 만들 때 정함) · 로직·기초값에서는 구멍으로 세지 않음
- [x] 마스터 갱신 절차 문서화(테이블마다 출처 · 받는 법 · 빌더 명령 — `_틀.md`)
- 검증완료 — `_갱신절차.md` · 새 빌더 환율·요율·시설자재가격(--check 일치) · 남은 구멍: 소요량·계수 빌더 · 검증 대기
- [ ] `old/` · `ref/` 삭제 때 옛 Z01 · B08 · B09 코드 같이 걷기
- 진행 — 부르는 곳 없는 것은 걷었고 남은 31줄은 `ref/_걷을_옛코드.md` 에 필요조건까지 적음 · 옛 원가 사슬은 아직 쓰이고 있어 사슬째 걷기는 「안 됨」
- **사용자 확정 거리(넷)** — ① 공종 마스터(코드·이름·소속 장·열쇠대장·연결·자원줄)를 새 마스터로 만들지 ② `old/` 통째를 대신할 새 마스터 세트를 만들지 ③ 사방기술교본 치수 · 구조물 원단위 · 돌 종류 · 재료 할증 넷을 새 마스터로 만들지 `ref/` 원자료로 둘지 ④ `UnitPrice.py` 같은 공용 로더는 낱개 확인 필요
- 준비 — 걷을 목록 `ref/_걷을_옛코드.md`
### 1-4. 사용자 확정 거리
- [x] 테스트 컨테이너 세 방식 가운데 고르기 — 확정: 방식 C 기본 + 만들기 모달 방식 A(2장)
- [x] 모래 단위중량 — 확정: 상태별 최대값을 기본 · 고칠 수 있음(2-0)
- [x] 조달청 시설자재가격 — 확정: 넣지 않음(가격조사 자료라 쇼핑몰과 안 이어짐) · 앞 글: 목록 확보는 동의 · 종합쇼핑몰에서 조회가 안 되는 까닭 확인 중 · 종자 고시 값(사람이 열어 봐야 함)
- [x] 임업기계 상세구분 11갈래 이름 — 유지
- [x] 국민연금 2033년 이후 요율 — 확정: 그 해에 갱신 · 앞날 줄을 두지 않음(2-0) · — 국민연금법 제88조③ 본칙 1천분의 65(근거 있음 · 앞 보고 정정) · 지금은 줄을 걷은 상태 · 되살릴지
- [x] 레미콘 규격 14건 — 확정: 설계 입력(선택지) · 관행 기본값 없음(2-0)
- [x] 「단가산출 로직」 이름 정리 — 확정: 옛 이름 "일위대가 로직" → **단가산출 로직**(재료·기계·표를 찾아 수량 내고 단가 매겨 값 하나를 뽑는 계산식 하나). "일위대가"라는 말은 다음 단계 **일위대가 조합**(여러 단가산출 로직을 묶은 상위 개념)에만 씀. 화면 문구(컨테이너 이름 등)는 아직 옛 이름 그대로 — 이름 맞추기는 작은 일감으로 나중.
- [x] 일위대가 조합 구조 — 확정: 단가산출 로직마다 하는 일이 달라 수량은 로직마다 따로 대입 · 마스터에는 **조합 이름 + 참조하는 단가산출 로직 목록만** 둠(수량·비율·계산은 안 둠) · 실제 계산(로직마다 수량 대입해 단가산출 값 하나씩 뽑고, 조합이 그 값들을 노무비·재료비·경비로 갈라 합계)은 프로젝트(B08 수량산출 · B09 견적) 몫 — B08·B09 반영은 마스터 데이터 확보 끝난 뒤 나중 진행.
- [x] 관리자 값 미확보 재료 · 없는 재료 — **확정: 값이 없어도 그냥 넘어감**(위와 같음) · 조사·목록은 `ref/_관리자값_미확보.md` · `ref/_없는_재료.md` · `ref/_분석_값없는줄.md` 에 남겨 둠
---
## 2. 단가산출 로직 화면 — 방식 C 기본 + 만들기 모달(방식 A)
설계 글 = `resources/master_data/ref/_설계_로직_만들기.md`(이 장에 맞춰 sub1 이 고쳐 씀).
### 2-0. 사용자 확정
- 로직 화면은 **방식 C(흐름 그림)를 기본으로 채택**하고 거기서 고치고 더함. **새로 만들 때는 모달 창에서 방식 A(질문-답)** 로 입력. 품셈을 모르는 사람도 로직을 만들 수 있어야 함.
- 선택이 필요한 값(레미콘 강도 등)은 값 입력이나 선택지로. **실무·관행 값은 시험(테스트) 입력으로만 허용 — 원천 로직이나 확정 변수로 쓰지 않음.**
- 모래·자갈 단위중량 = 상태를 고르면 그 범위의 최대값이 기본 · 고칠 수 있음.
- 요율(국민연금 등)은 해마다 바뀔 수 있음 — **그 해에 갱신** · 앞날 값을 미리 넣지 않음.
- 관급자재 의무 사용은 마스터에 두지 않음 — 뒤에 프로젝트 안 경고 메시지로(제약 아님). 조달청 시설자재가격은 넣지 않음.
- 임업기계 상세구분 11갈래 이름 유지.
### 2-1. 먼저 메울 것 (엔진·서버 — sub1)
- [x] 끝수 칸을 엔진 계산에 붙임 — 검증완료: 묶음 `{대상, 자리, 방법}` 을 계산 끝에 붙임(비목 합마다 끊고 계 = 그 합) · 옛 글자 끝수 37줄은 설명 그대로 두어 이중 끊기 없음 · 일괄 시험 계산 1,291 그대로 · 검증 대기
- [x] 서버 — 절 목록 API · 표를 절로 거르기(13-4 가 13-40 에 걸리지 않게) · 표 조건 값 목록만 가볍게 · 로직 목록 소유 거름 — 검증완료: `GET /sections`(산림 13장 50절 · 절마다 표·로직 수) · `/tables?section=` · `GET /table/options` · `/logics?owner=` · 시험 `test_m01_make.py` 8건 통과 · 검증 대기
- [x] 저장 — 자체 로직 파일 · 키 `GX` 서버 발급 · 소유(현장/공용) · 정본 로직과 가름 · 복제(본떠 만들기) · 응답 모양은 `_화면_계약.md` — 검증완료: `POST /logic/new|copy|edit|delete` · 자리는 `로직_자체.json` 한 파일(틀이 「자체」 에 장 이름을 안 둠) · 정본 403 · 낡은 판본 409 · 저장 전 초안 계산(`key` "") · 검증 대기
### 2-2. 보기·고치기 = 방식 C (sub4)
- [x] 방식 C 를 테스트 컨테이너에서 꺼내 단가산출 로직 컨테이너의 기본 보기로 · 기존 호표 화면은 「고급」 으로 남김 — 검증완료: 파일은 `UI_Logic_Flow`·`_Model`·`_Style` · 보기 전환은 바 단추(캐시 `m01.logic.view`) · 견본 셋(메쌓기 79,279.668 · 노체포설 4,522.9569 · 트레일러운반 83,943.9872)이 고급 시험 계산과 같음 · 검증 대기
- [x] 상자를 누르면 값·출처·원문 표 미리보기·쉬운 말 풀이(방식 B 설명 카드의 내용을 여기로) · 부르는 로직 펼치기 — 검증완료: 설명 카드는 `UI_Logic_Note`(방식 B 도 같이 씀) · 메쌓기 석공 줄에서 QF000421 44줄 미리보기와 걸린 줄(25·깬잡석·골쌓기 0.15) 강조 · 검증 대기
- [x] 상자에서 고치기·줄 더하기·지우기(자체 로직만 · 정본은 복제 뒤) · 고르기 부품(구분 → 상세구분 · 값 다섯 · 용도 안내) 재사용 — 검증완료: 정본은 「본떠 만들기」(`POST /logic/copy`)로 자체 로직을 만든 뒤 [고치기] 가 열림 · 네 칸(설계 값·표 찾기·호표·덧줄) 줄 더하기·지우기 · 고르기 부품은 `UI_Logic_Pick` 으로 합침 · 시험으로 만든 GX 두 줄은 지우고 `_키대장` 되돌림 · 검증 대기
### 2-3. 만들기 = 모달 + 방식 A (sub3)
- [x] 「새로 만들기」 모달: 이름·결과 단위 → 원문 절 고르기(그 절의 소요량·계수 표를 용도로 자동 제시) → 호표 줄 넣기(인력·재료·기계 = 구분 → 상세구분 · 수량 = 직접 값 / 표에서 찾기 / 다른 로직 부르기) → 설계 입력(표의 조건 칸에서 자동 제안 · 선택지/값 입력 · 설명) → 할증·덧줄·끝수 → 시험 계산 → 저장 → 방식 C 로 열림
- [x] 식은 선택지·블록으로 — 글자 식은 「고급」 에서만
- 검증완료: 메쌓기를 빈 모달에서 만들어 GF000219 와 같은 금액(132,132.78) · 저장은 자체 로직 파일이 서버에 생긴 뒤 열림(그 전에는 저장 단추 막힘) · 걸음 = 이름 → 절 → 중간 값 → 호표 줄 → 설계 입력 → 할증·끝수 → 시험 계산 → 저장(중간 값 걸음은 호표 줄 앞) · 모달 진입 = 로직 화면 바의 「로직 새로 만들기」 단추 · 저장·본떠 저장 뒤 그 자체 로직이 방식 C 기본 보기로 바로 열림
- [x] 테스트 컨테이너와 방식 B 화면 · 방식 A 의 읽기 전용 화면은 걷음(모달로 옮긴 뒤) — 검증완료: `UI_Test*` 다섯 파일 삭제 · 왼쪽 「테스트」 줄 없어짐 · 견본 10개 키는 시험 `test_m01_test_container.py` 로 옮김 · 모달의 까닭 글은 `UI_Logic_Text` 것을 씀 · typecheck 통과 · 시험 11 통과 · 검증 대기
### 2-4. 검증
- [x] 산림 13-4-1 메쌓기를 빈 화면에서 새로 만들어 기존 GF000219 와 같은 금액이 나오는지 ORCA 로 확인 · 견본 10개를 방식 C 기본 보기로 열어 기존 화면 시험 계산과 금액 일치 — 검증완료: 메쌓기 빈 모달 132,132.78(GF000219 와 같음) · 「본떠 저장」→방식 C 로 열림→ 증가율 식 한 칸 고쳐 저장→ 시험 계산이 예상 비율(1.10)로 바뀜→ 지움 · 견본 10개 중 계산이 서는 여섯(합판거푸집 125,617.408 · 펌프카 13,455.7136 · 동력상하차기 18,238.2804 · 메쌓기 132,132.78 · 노체 4,522.9569 · 트레일러 102,183.8685)은 방식 C 합계 = 서버 계산 · 메쌓기는 고급 시험 계산도 같음 · 나머지 넷(맨홀 · 날개벽 · 흄관 · VR관)은 레미콘·관 단가가 자료에 비어 방식 C 와 서버가 같은 까닭으로 멈춤 · 시험 흔적 지움 · 검증 대기
---
## 3. 단가산출 로직 화면 개선 (기존 화면을 복사한 테스트 컨테이너에서)
### 3-0. 사용자 확정
- **기본 로직(정본)은 품셈 원문 그대로 — 바뀔 일이 없음.** 우리 프로그램의 기본값은 원문을 따름. 그래서 기본 로직은 화면에서 고치지 못함(비고만 고침).
- 개선은 **기존 단가산출 로직 화면을 복사**해 새 테스트 컨테이너에서 함. 정본 화면·데이터는 손대지 않음.
- 왼쪽 패널의 「로직 쉽게 보기·만들기」 · 「로직 흐름 보기」 두 컨테이너와 그 계산 코드는 **삭제**(이어진 곳이 많아 조심).
### 3-1. 걷기 · 새 테스트 컨테이너
- [x] 두 컨테이너 삭제 — `UI_Logic_Flow*` · `UI_Logic_Wizard*` · `UI_Logic_CView*` · 왼쪽 패널 등록 · 그 시험·문구. 정본 화면(`UI_Logic_Page` 등)과 서버·엔진은 그대로(자체 로직 저장 API 는 3-4 에서 씀)
- [x] 기존 로직 화면을 복사해 새 컨테이너 「로직 개선 시험」 — 여기서만 3-2~3-4 를 함 — 검증완료: 정본·새 컨테이너 13-4-1 호표 표 · 시험 계산 203,281.2 같음 · typecheck · 시험 35 통과
### 3-2. 상세 화면 = 컨테이너 넷
- [x] ① 기본정보 — 정본은 읽기 전용(비고만 고침) · ② 일위대가 호표 · ③ 텍스트 수식 · ④ 시험 계산(입력값 + 결과값) — 검증완료: 컨테이너 넷(텍스트 수식은 자리) · 비고만 고침
- [x] 호표를 **인력 · 자재 · 경비** 세 묶음으로 나눠 보임 · 묶음마다 소계 · **[줄 더하기] 단추 삭제** — 검증완료: 13-4-1 노무비 203,281.2 = 계 · 12-4 인력 93,520.254 + 자재 36,163.252 = 계 129,683.506
- [x] 호표 줄을 누르면 모달로 그 줄이 쓰는 자료를 보임 — 소요량·계수·요율·기계처럼 표인 것은 표 그대로(걸린 줄 강조) · 단일 값은 값과 출처 — 검증완료: 13-4-1·12-4 모달에 표 + 걸린 줄 강조
- [x] 텍스트 수식 — 비목 묶음별로 `이름 : 단가 * 수량식 = 금액` 줄을 쌓고 소계(견본 그림 모양) · 중간 값 · 덧줄 · 끝수는 따로 보이지 않고 이 줄들에 녹여 적음
- 서버 몫 끝(sub1) — `POST /text` 가 묶음별 줄·소계·계를 글로 돌려줌(`scripts/master_text.py` · 계약 `_화면_계약.md` 3장) · 13-4-1 「268,908 \* 0.15 \* (1 + 30 %) = 52,437.06」 · 12-17-1 덧줄 「8,777.9014 \* 5 % = 438.8951」 · 계가 `/calc` 와 같음 · 시험 `test_m01_text.py` 6 통과 · 화면(sub3)이 이 글을 그대로 찍으면 됨
- [x] 시험 계산은 그대로 둠(입력 칸 + 결과)
- 검증완료 — 1,291 로직 전수 대조(소계 합 + 끝수 = 계 어긋남 0 · 함수 글자 샌 것 0 · 자릿수 0) · `ref/_검증_텍스트_수식.md`
### 3-3. 새 로직 만들기 = 식으로 (브레인 의견 붙임 · 사용자 확인 뒤 착수)
- [x] 사용자가 식을 줄로 적음(`A * B - C = D` / 다음 줄 `D * E = F`) → [분석] → 변수를 뽑아 줌 — 검증완료: 「로직 개선 시험」 [식으로 새로 만들기] 식 칸 · [분석] → 변수 8개 표 · 식 줄은 `이름 = 식` 꼴(서버 해석기 기준)
- [x] 변수마다 **무엇인지 정함** — 마스터 요소(인력·자재·기계·소요량·계수에서 고름) / 설계 입력(설계자가 넣는 값) / 고정값 · 그다음 단위 · 마지막에 비목(노무비·재료비·경비) — 검증완료: 보통인부 = 마스터 요소(종류 → 구분 → 상세구분 → 이름 고르기 · LB000002) · 길이·폭 = 설계 입력 · 품 = 고정값 · 석공 = 표 찾기(표·값 칸 → 조건 칸 식 모달) · 잡재료비 = 덧줄 비목
- [x] 단위 검사 — 곱셈은 단위를 곱하고 덧셈은 단위가 같아야 함 · 어긋나면 그 자리를 알려 줌 — 검증완료: 「길이 + 넓이」 (m + ㎡) 가 2번 줄 「+」 자리를 짚어 막힘
- [x] 결과 변수(마지막 줄 왼쪽)가 그 로직의 결과 · 같은 변수를 두 번 정의하거나 서로 물고 도는 식은 막음 — 검증완료: 「가 = 나 + 1 / 나 = 가 * 2」 물고 돎 · 「가」 두 번 정의 · 자리를 짚고 저장 단추 막힘
- [x] 다 정해지면 지금 로직 틀(입력 · 중간 · 호표 · 덧줄)로 옮겨 저장 — 자체 로직(키 `GX`) — 검증완료: 시험 계산 길이 2 · 폭 3 → 계 162,604.26 · 저장 → 자체 로직 GX 가 「로직 개선 시험」 목록에 뜨고(1,355 줄) 상세 화면이 열림 · 지우기까지 · 시험 흔적 지움 · 검증 대기
### 3-4. 복사해서 만들기
- 밑그림(데스크탑 메인) — 별칭 규칙 · 전수 수치 · 갈래 판정: `resources/master_data/ref/_설계_식_복사.md`
- [x] 정본 로직을 복사하면 식도 그대로 와서 줄을 더하거나 고침 · 원본은 그대로 — 엔진·서버 `GET /logic/formula` · `POST /logic/formula/save`(엔진 `scripts/master_copy.py` · 계약 `_화면_계약.md` 7장) · 화면 「로직 개선 시험」 [본떠 만들기] → `M01_MasterData_UI_LogicLab_Copy.ts` · 별칭이 이름과 같으면 저장을 막는 안전장치 `master_copy.gather` 검사 더함(교차 검증 흠 수정) — 검증완료: ORCA 로 13-4-1 을 본떠 안 고치고 저장 → 계 60,984.36 = 원본 60,984.36 · 석공 줄 한 곳 고쳐 저장 → 계 101,320.56 로 바뀜 · 원본 GF000219 는 그대로 60,984.36 · 시험 흔적(GX·키 대장) 되돌림 · 시험 `test_m01_copy.py` 11 통과 · typecheck 통과 · 검증 대기
- [x] 표를 찾는 자리(`찾기(QF000421, …)`)는 식에서 이름 하나(예: `메쌓기인력`)로 보이고, 바꿀 때만 모달로 표를 고름 — 사용자가 함수 글자를 만지지 않음 — 검증완료: 부르는 표·로직 목록의 [표 바꾸기] 눌러 표 찾기 모달(소요량·계수 함께 검색) 열림 확인 · 검증 대기
- [x] 다른 로직을 부르는 줄은 그 로직을 그대로 부를지 같이 복사할지 고르게 함 — 「그대로 부르기(기본)」·「같이 복사하기」 토글 — 검증완료: 호표 요소의 `로직(…)` 도 별칭으로 보이고 기본은 참조 그대로 저장됨(갈래 A) · 갈래 B(같이 복사)는 화면에서 고를 수 있음 · 검증 대기
### 3-6. 마감 검증 (검증완료)
- [x] 로직 1,354 전수(도는 1,291 · 멈춤 63) — `/text`·`/calc` 계 · 소계 합 · 이름 식과 값 식 짝 번호 · 이름 식에 열쇠 샘: 어긋남 0
- [x] 별칭 복사 — 별칭 있는 로직 1,267 가운데 30개를 펴서 되돌려 저장 → 식 · 계 · 시험입력 모두 같음
- [x] `check_master` 틀 0 · 로직 0 · 일괄 시험 계산 통과 1,291 · 멈춤 63(앞 기록과 같음)
- [x] 남은 것 2건 = 글 줄이 고른 자재의 전체 이름을 써서 줄 이름 글자만 다름(`GC000723` · `GC000724` · 금액은 맞음 · 흠 아님) · `ref/_검증_3장_마감.md`
### 3-5. 보조 고침
- [x] 여러 컨테이너에서 [전체] 단추와 구분·상세구분을 바꿔도 목록 내용이 안 바뀜 — 고침
- 검증완료 — 넓은 화면·390px 둘 다에서 컨테이너마다 줄 수로 잼(계수 495→76→34→495 등) · 재료 컨테이너의 닫았다 열기 어긋남 고침 · 좁은 화면에서는 거름을 고르면 패널이 접혀 목록이 보이게 함 · 사용자가 본 증상은 재현 못 함
- [x] 13-4-1 메쌓기 첫 조합이 「맞는 줄 0개」 로 멈추던 것 — 「돌」 고르기 차례만 바꿔 첫 값 = 깬잡석(13-5-1 돌붙임도 같이) · 같은 흠 일괄 조사 53 → 51(남은 51 은 설계자가 넣을 수가 비어 1 이 들어간 탓 · 목록 `ref/_첫조합_없는로직.md`) — 검증완료: 틀 0 · 로직 0 · 계산전부 통과 1,291 그대로 · 시험 73 통과 · 검증 대기
---
## 4. 이름 맞추기 · 일위대가 조합 (안 — 사용자 승인 대기)
### 4-0. 사용자 확정
- **단가산출 로직** = 지금 마스터의 계산식 하나(원문을 그대로 옮긴 것 · 수량을 대입하면 값 하나가 나옴). 옛 이름 「일위대가 로직」 을 이것으로 바꿈.
- **일위대가 조합** = 관리자가 이름을 붙이고 **단가산출 로직을 하나씩 골라 담은 묶음**. 로직마다 하는 일이 달라 수량은 로직마다 따로 들어감.
- 마스터에는 **조합 이름 + 담은 단가산출 로직 목록만** 둠. 수량 · 비율 · 계산은 두지 않음.
- 실제 계산은 프로젝트 몫 — 로직마다 수량을 대입해 값을 하나씩 뽑고, 조합이 그 값들을 노무비 · 재료비 · 경비로 갈라 합계. **B08 · B09 반영은 마스터 확보가 끝난 뒤**.
- 조합에 담을 로직은 **사용자가 하나씩 고름**(자동 추천 없음).
### 4-1. 이름 맞추기 (작은 일감 · 먼저)
- [x] 화면 문구와 컨테이너 이름의 「일위대가 로직」 → 「단가산출 로직」(`M01_MasterData_UI_Side` · `UI_Page` · `UI_Logic_*` · `UI_LogicLab*` · 문구 파일)
- [x] `_틀.md` · `_화면_계약.md` 의 같은 말도 바꿈 · 키(`GF`·`GC`·`GX`)와 파일 이름(`로직_*.json`)은 그대로 — 데이터는 안 건드림
- [x] 「일위대가」 라는 말은 조합에만 씀 — 바꾼 뒤 남은 자리를 찾아 확인
- 검증완료 — M01 화면·문구·`_틀.md`·`_화면_계약.md` 에 0건 · 다른 화면(B08·B09·B02~B04)의 21파일 58곳과 데이터 JSON 은 그대로(옛 원가 사슬이라 나중)
### 4-2. 조합 마스터 (데이터 · 엔진)
- [x] 새 파일 `일위대가조합.json` · 테이블ID **`UA`**(사용자 확정 · 키 = `UA` + 6자리 · `_키대장.json` 에 등록) · 요소 그룹에는 끼우지 않음(`/groups` 그대로 여덟 · 조합은 제 길로만) — 틀 `_틀.md` 10장 · 정본 파일은 빈 채로 둠(줄은 사용자가 화면에서 만듦 · 견본은 시험에서만) · 원문이 없어 머리에 `원문` 을 두지 않고 줄에 `원문번호` 도 두지 않음(`mk.NO_NUMBER``UA`)
- [x] 줄 모양 — 키 · 이름 · 구분 · 상세구분 · 단위 · 담은 로직 목록(순서 있는 단가산출 로직 키 목록 · 줄마다 메모) · 출처 · 소유(공용/현장) · 비고 — `담은로직` 줄 = `{로직, 메모}` 뿐 · **수량·비율·계산 칸은 두지 않음**(4-0 확정)
- [x] 검사 — 없는 로직 키 · 같은 로직을 두 번 담음 · 빈 조합 · 조합이 조합을 담지 않음(1단) · `check_master.py` 에 더함 — 엔진 `scripts/master_combo.py` · `check_master.py 조합` · 저장 전 검사(`check_saved`)에도 얹어 422 로 막음
- [x] 「이 로직을 쓰는 조합」 을 로직 쪽에서 거꾸로 볼 수 있게(소요량 「용도」 와 같은 결) — `GET /logic/combos?key=` · 로직 줄에 칸으로 박지 않고 물을 때 훑음(조합은 관리자가 그때그때 만들어 박아 두면 낡음)
- [x] 서버 길 — `GET /combos`·`/combo` · `POST /combo/new`·`/edit`·`/delete` · `POST /combo/preview`(담은 로직마다 그 자리 입력값으로 값을 뽑아 노무비·재료비·경비로 갈라 합계 · **저장 없음**) · 계약 `_화면_계약.md` 9장 · 자리는 `M01_MasterData_Store_Combo.py`
- 검증완료 — 견본 조합(13-4-1 · 13-4-2 · 13-2-1) 미리 보기 합계가 그 로직 셋의 시험 계산을 비목별로 더한 값과 같음 · 못 도는 줄은 그 줄만 멈추고 나머지 합계는 그대로 · 저장 전 조합 줄로도 미리 보기 되고 아무것도 안 생김 · 검사 넷 다 422 로 막힘 · 낡은 판본 409 · 정본 로직·조합 파일 안 바뀜 · 시험 `test_m01_combo.py` 16 통과 · `check_master 틀`·`조합` 0건 · 검증 대기
- 짚을 것 — sub_laptop_1 이 만든 조합 화면(`ca5c2649`)의 `Combo_Api.ts` 는 서버가 없어 길 이름을 가정해 둠(`/combo/save` 하나로 새로·고치기 · `delete` 에 판본 없음 · 담은 로직 줄에 `입력` 을 넣어 둠). 그 파일 머리대로 계약이 오면 맞추면 됨 — 다만 **담은 로직 줄의 `입력`(수량)은 마스터에 두지 않음**(4-0 확정)이라 미리 보기 때만 `POST /combo/preview``inputs` 로 보내야 함
### 4-3. 조합 화면 (왼쪽 패널에 컨테이너 하나 더)
- [x] 컨테이너 「일위대가 조합」 — 목록(구분 · 상세구분 거름) · [새 조합] · [지우기] · 저장
- [x] 조합 상세 = 이름·단위·비고 + **담은 로직 표**(차례 · 로직 키 · 이름 · 결과 단위 · 메모) · 줄 올리기/내리기 · [로직 더하기] 모달(구분 → 상세구분 → 찾기로 고름 · 사용자가 하나씩)
- [x] 로직 줄을 누르면 그 단가산출 로직 상세로 감
- [x] 미리 보기 — **담은 로직 저마다의 입력값**을 그 로직 자리에서 넣어 값을 뽑고 노무비·재료비·경비로 갈라 합계(사용자 확정 · **보기만** · 마스터에 저장하지 않음)
### 4-4. 검증
- [x] 견본 조합 하나를 만들어(사용자가 고른 로직 서넛) 저장 → 다시 열기 → 로직 하나 빼고 더하기 → 지우기까지 ORCA 로
- 검증완료 — 저장된 파일에 담은 로직 목록만(수량 없음) · 390px 넘침 고침 · 어색한 자리 넷(첫 펼침 늦음 · 늦은 답 덮음 · 돌아오면 목록 · 저장 안 한 고침 안 물음) 고침 · `ref/_검증_조합_화면.md`
- [x] 미리 보기 합계가 담은 로직들의 시험 계산 값과 비목별로 맞는지 수치로
- 검증완료 — 서버 길 기준: 로직 셋(GF000219 · GC000996 · GC000994) 합계 계 729,595.598 이 각 시험 계산 비목별 합과 같음(`ref/_검증_조합.md` ③) · 화면 조작 확인은 4-3 · 4-4 첫 줄에 남음
---
## 5. 단가산출 상세 화면 다듬기 (안 — 사용자 승인 대기 · 「로직 개선 시험」 컨테이너에서만)
### 5-0. 사용자 확정
- 텍스트 수식을 컨테이너 **둘**로 나눔 — 왼쪽은 **변수 이름으로 된 식**, 오른쪽은 **값이 들어간 뒤의 식**.
- 「일위대가 호표」 이름을 **「단가산출 상세」** 로 바꿈.
- 단가산출 상세에서 줄을 누르면 뜨는 모달을 **세분함** — 표와 이어진 것은 **알약 단추**로 놓고, 누르면 그 표 값이 보이게. 계산에 들어가는 표를 한꺼번에 늘어놓지 않음.
- 컨테이너들의 사이 간격·양식을 맞춤.
### 5-1. 텍스트 수식 두 칸
- [x] 왼쪽 = 변수 이름 식(보기 `석공 : 석공노임 * 석공소요량 * (1 + 증가율) = 석공비`) · 오른쪽 = 값이 들어간 식(지금 것 · `268,908 * 0.15 * (1 + 30 %) = 52,437.06`) — 검증완료: 12-4 · 12-17-1 · 13-4-1 왼쪽 「석공노임 * 메쌓기인력.석공 * (1 + 증가율 %) = 석공비」 ↔ 오른쪽 「268,908 * 0.27 * …」
- 서버 몫 끝(sub1) — `POST /text` 가 줄마다 `이름글`(이름 꼴)과 `글`(값 꼴)을 같이 줌 · 13-4-1 「석공노임 \* 메쌓기인력.석공 \* (1 + 증가율 %) = 석공비」 · 계약 `_화면_계약.md` 3장 · 화면(sub3)이 두 칸으로 찍으면 됨
- [x] 두 칸의 줄이 서로 같은 차례로 놓이고(줄 맞춤) 한쪽을 누르면 다른 쪽 같은 줄이 밝아짐 — 검증완료: 두 칸 줄 수 12-4 8 · 12-17-1 7 · 13-4-1 2 로 같고 줄마다 위·높이 같음 · 올리거나 누르면 그 줄 양쪽 밝아짐(다른 줄은 안 밝음) · 비목 제목·소계는 양쪽 걸침
- 서버 몫 끝 — 두 꼴이 한 줄 안에 나란히 오고 `짝` 번호(1 부터)가 붙음 · 로직 1,291개 전수 점검에서 짝 어긋남 0 · 밝히기는 화면 몫
- [x] 왼쪽 식의 변수 이름은 엔진이 줌 — 표 찾기·로직 부르기는 별칭 이름(3-4 규칙 재사용) · 좁은 화면(390px)에서는 위아래로 쌓임 — 검증완료: 왼쪽 이름은 서버 `이름글` 그대로(별칭 이름) · 390px 에서 위아래로 쌓임(폭 안 · 가로 스크롤 없음)
- 서버 몫 끝 — 별칭은 `master_copy` 규칙 그대로(답에 `별칭` 목록도 같이) · 단가 자리는 「석공노임」·「굴착기손료」·「합판단가」 꼴 · 시험 `test_m01_text.py` 8 통과
### 5-2. 이름과 간격
- [x] 「일위대가 호표」 → 「단가산출 상세」(화면 문구 · 계약 문서 · 시험)
- [x] 컨테이너 넷의 바깥 여백 · 제목 크기 · 칸 사이 간격을 한 양식으로 맞춤
- 검증완료 — 컨테이너 사이 12px · 안쪽 칸 8px · 제목 16px 굵게 · 넓은 화면과 340px 에서 바깥 여백 12px · 가로 넘침 0(390px 실화면은 아직)
### 5-3. 모달 세분 (알약 단추)
- [x] 줄 모달의 첫 화면 = 그 줄의 **한 줄 풀이**(무엇을 어디서 가져와 어떻게 셈했나) + 쓰인 자료를 **알약 단추**로 늘어놓음(보기: `표 QF000421` · `표 QF000422` · `인력 석공` · `계수 할증`) — 검증완료: 13-4-1 석공 줄 「한 줄 풀이」 + 알약 셋(인력 석공 · 표 QF000421 · 표 QF000422) · 첫 화면 표 0개 · 12-4 합판 줄 알약 셋 · 12-17-1 펌프차 줄 알약 넷(로직 GC000268 + 표 셋) · 덧줄은 알약 없음(자료 없음 글) · 390px 모달 12~370 · 알약 안 넘침
- [x] 알약을 누르면 그 자료만 펼쳐 보임(표는 표 그대로 · 걸린 줄 강조 · 단일 값은 값과 출처) · 다시 누르면 접힘 · 한 번에 하나만 펼침 — 검증완료: 알약을 누르면 그 자료만(표는 걸린 줄 강조 hit 1 · 단가는 값과 출처) · 다시 누르면 접힘 · 둘째를 누르면 첫째는 접혀 열린 것 하나
- [x] 표가 여럿인 줄도 첫 화면은 알약만 — 표를 한꺼번에 늘어놓지 않음 — 검증완료: 표 둘·셋인 줄도 첫 화면 표 0개
- [x] 알약에서 그 요소·표의 마스터 화면으로 갈 수 있게 — 검증완료: 13-4-1 「인력 석공」→ 인력 화면 그 줄(LB000033) 1줄 · 「표 QF000421」→ 소요량 표 상세가 열림 · [← 로직 개선 시험으로 돌아가기] 로 상세 그대로 복귀 · 재료 알약은 단가 없으면 이유 한 마디(12-4 「MT:{합판} — 고르기 조건에 맞는 마스터 줄이 없음」)
### 5-4. 검증
- [x] 13-4-1(표 둘) · 12-17-1(덧줄) · 12-4(재료 여섯) 로 ORCA — 두 식 칸의 줄 맞춤 · 알약 수와 펼침 · 간격 · 390px — 검증완료: 13-4-1 · 12-4 알약 이동·복귀 · 390px 실화면 컨테이너 사이 12px · 안쪽 12px · 제목 16px 굵게 · 가로 넘침 0(맞춤 불필요)
---
## 6. 아침에 사용자가 정할 것
- 화면 말 하나 — 「단가산출 상세」 와 「호표」 를 한 말로 볼지(`ref/_검증_화면글.md`)
- 견본 조합 `UA000001` 「견본 조합(지우셔도 됨)」 — 그대로 둘지 지울지
- 관급 확정거리 `ref/_확정거리_관급.md` — ① 소형고압블록 49줄: 지역가 대 나대영 전지역가 · U102·U104 = 적색인지 · 청원 11,110 = 경기 전체인지(정하면 최대 11줄 · 그대로 인정하면 5줄 채움 · 이미 채운 회색 14줄 재정리) ② KP 접합부속 17줄: 압륜 한 벌인지 고무링 세트인지 ③ 레미콘 부산 25-3-150: 25-33-150 오기인지(1줄) · 중온 아스콘 28줄 · 그 밖 13줄은 자료 없음(정할 것 없음 · 문구 정정만)
- 재료 시중 조사 — 관리자 값 미확보 45종 · 없는 재료 111줄(`ref/_관리자값_미확보.md` · `ref/_없는_재료.md`)과 조달청에 없는 재료(합판 · 각재 · 유로폼 · 강관동바리 · 비계 · 철선 · 못 · 폼타이 · 유공관 · 종자 · 방부목 · 잡석): 공공 출처에 값 없음 — 시중 조사를 맡길지 정하면 채울 길이 열림 · 후보만 고르면 되는 8건(VR관 · 철망태 · 용접봉 · 색소 · 에폭시 · 버너 · 퓨즈 · 땜납)은 화면에서 규격·지역만 고름
- 옛 코드 걷기 넷(`ref/_걷을_옛코드.md`) — ① 공종 마스터를 새 마스터로 만들지 ② `old/` 통째를 대신할 새 세트를 만들지 ③ 사방기술교본 치수 · 구조물 원단위 · 돌 종류 · 재료 할증 넷을 새 마스터로 둘지 `ref/` 원자료로 둘지 ④ `UnitPrice.py` 같은 공용 로더 낱개 확인: 정하면 `old/` · `ref/` 삭제와 옛 원가 사슬 걷기가 풀림
- 품셈재료 삭제 조건 셋(`ref/_품셈재료_삭제조건.md`) — 자재품목 짝 없음 139줄 · 지역·계약종별 17줄 · `{변수}` 22줄: 셋 다 정하면 품셈재료 테이블을 지우고 1-1 재료 고르기 항목이 닫힘
- [x] 모래·전력 — **확정: 전국 값과 지역 값으로 나눠 둠**(7-4b) · 울진에 줄이 없으면 전국 값 · 전력은 `재료_유가전력.json` 에 따로 둠
- 그 밖 — ① 조합 마스터 두 흠(`메모` 칸 모양 · `이름` 글자 검사) 고칠지(`ref/_검증_조합.md`) ② 조합 화면(4-3) 조작 확인은 화면 창 몫 · 끝나면 4-3 · 4-4 체크
---
## 7. 정리 단계 — 옛것을 `old/` 로 몰고 끊기 (사용자 확정 · 진행)
### 7-0. 사용자 확정 (09-22 낮)
- **옛것은 지우지 않고 `old/` 로 옮김.** 옮긴 뒤 문제없음이 확인되면 **삭제는 사용자가** 함.
- 옮기면 부르던 곳이 깨짐 — 깨진 자리마다 **옮긴 코드에서 꼭 필요한 함수만 새 파일로 옮겨 적어** 잇음(`M01_MasterData/` 아래 새 파일). 이것을 되풀이해 `old/` 와의 줄을 끊음.
- 옮길 것 넷 — ① `Z01_MasterData/` 폴더째 ② `B08_*` · `B09_*`(지금 방향이 완전히 틀림) ③ 옛 단가산출 로직 컨테이너 ④ 새 M01 화면이 안 쓰는 마스터 자료.
- 새 단가산출 로직 화면 = 지금 「로직 개선 시험」 컨테이너(이름만 바꿔 씀).
### 7-1. 로직 컨테이너 하나로
- [x] 이음 먼저 — 소요량·계수 「쓰는 로직」 · 조합 화면의 로직 이름 · 패널 제목이 모두 옛 컨테이너(`Page.ts` `openLogicTab`)로 감 · 새 컨테이너로 키를 넘기는 길을 냄
- [x] 「로직 개선 시험」 → **「단가산출 로직」** 이름 바꿈 · 옛 컨테이너 파일·문구·시험을 `old/`
- [x] 옛 컨테이너에만 있던 기능 둘(정본 `GC`·`GF` 를 화면에서 바로 고쳐 저장 · 정본 파일에 빈 줄 더하기)은 **버림**(확정: 정본은 원문 그대로) · 분석 `ref/_분석_로직컨테이너_통합.md`
- [x] 걸음마다 typecheck · ORCA
- 검증완료 — typecheck · M01 시험 107 통과 · ORCA 로 세 자리(소요량 표 · 조합 화면 · 패널 제목)가 모두 새 컨테이너로 감 · 옛 `UI_Logic_Page.ts``old_code/M01_MasterData/`
### 7-2. `Z01_MasterData/` 폴더째 `old/` 로
- [x] 폴더째 `old_code/Z01_MasterData/` 로 옮김(새로 만든 자리 · sub3 의 7-1 `old_code/` 가 아직 없어 새로 만듦) · 시험 여섯도 `old_code/resources/tester/` 로 같이 옮김 · 검증완료
- [x] 끊을 자리 — `A00_Common/router.ts`(라우트 핸들러) · `A00_Common/main.ts`(FOOTERLESS_ROUTES) · `config/config_frontend.ts`(ROUTES 키 · PROTECTED_ROUTES) · `main.py`(import · include_router) · 문구 `ui_template_locale_b3.ts`(Z01_MasterData_\* 키 84개) — 모두 끊음 · 검증완료
- [x] Z01 이 읽던 옛 자료 — `resources/data_master_labels/`·`resources/data_master_sources/`·`resources/data_master_override/` 는 디스크에 이미 없음(먼저 없어짐) · 실제로 읽는 `resources/master_data/old/` 는 B08·B09·common_util·B06 도 같이 읽어 **남김**(옮기지 않음) · 검증완료
- 검증 — `npm run typecheck` 통과 · `test_m01_*` 107개 통과 · ORCA: `#/m01-master-data` 그대로 뜸(네 컨테이너 정상) · `#/z01-master-data` 는 「준비 중인 페이지입니다」로 깨끗이 떨어짐 · 대시보드 마스터 데이터 단추 하나(M01)만 있음
- 남은 것 — `test_master_labels_base_prices.py`(이미 꺼진 `test_master_*.py` 글롭에 걸림)가 옮긴 `Z01_MasterData` 를 여전히 import — 시험 여섯에 안 들어 그대로 둠(수집 안 되니 안 깨짐)
### 7-3. `B08_*` · `B09_*` 를 `old/` 로
- [x] 지금 코드를 `old_code/` 로 옮기고 라우터·화면·시험에서 끊음 — 분석 `ref/_분석_B08B09_초기화.md`(마스터로 갈음 28% · 나머지는 자리 없음)
- [x] **옮기기 전 준비** — 부르는 모든 자리(파이썬 2 · `main.py` 13 · 화면 라우트 5 · `common_util` 문자열 3 · 시험 25) · B07 이식 난이도(`SlopeLength`·`SlopeArea` 쉬움 · `StructureFigure` 어려움) · 파일·줄 표 · 빈 화면 남길 최소한 · 옮기는 차례를 PLAN 확정 차례(먼저 옮기고 깨지는 대로 봄)에 맞춰 정리 — 분석 `ref/_분석_B08B09_옮기기.md`(sub4 · dev c5535867) · **코드는 아직 안 옮김**
- [x] 같이 깨지는 곳을 먼저 적음 — 실제로 깨진 자리는 셋뿐(B07 둘 · B06 하나) + 시험 25 · 검증완료
- [x] 깨진 자리마다 **옮긴 코드에서 필요한 함수만 새 파일로 옮겨 적음** — B07 비탈 길이·면적을 `B07_DesignDetail_Engine_SlopeGeometry.py`(275줄)로 옮겨 적음(면적 적분·노면 면적·측점 묶음은 안 옮김) · 검증완료
- [x] 남길 것(다시 짤 때 씀) — `test_b08_*` 91 · `test_b09_*` 69 는 `resources/tester/` 에 그대로(모으기에서 빠져 있음) · 인계 계약 글·서식 차례·끝수 표·판정 까닭 머리글은 `old_code/` 안에 그대로 남음 · 실무 xlsx 는 지식DB
- [x] **계산 로직도 통째로 `old/` 로**`old_code/B08_Quantity/` 86 · `old_code/B09_Estimation/` 111 파일 · 되살린 계산 0 · 검증완료
- [ ] 다시 짜기는 이 장 뒤 · **마스터에서 가져다 쓰는 얼개로 처음부터** — 먼저 「수량 줄 → 로직」 대응표(**첫 막힘돌**) · 옛 코드는 참고만 하고 옮겨 적지 않음
- 검증완료(09-22) — `B08_Quantity` 86파일 · `B09_Estimation` 111파일 · `Z01_MasterData` 13파일을 `old_code/` 로 · 남은 파일 각 1(빈 화면) · **부르는 자리 0** · typecheck · `test_b06_*`·`test_b07_*` 180 통과 · 서버 라우트에 quantity·estimation 0
- B07 구조물도 조립은 이미 도면 목록에서 빠져 부르는 곳이 0 이라 `StructureFigure` 를 옮겨 적지 않고 같이 `old_code/B07_DesignDetail/`
- [x] **끝 모습 = B08 · B09 가 빈 화면** — 새 얇은 파일 둘(`B08_Quantity_UI_Page.ts` 39줄 · `B09_Estimation_UI_Shell.ts` 39줄) · 제목·단계 막대만 · 문구 키 둘 새로 둠 · ORCA 확인(표 0개) · 검증완료
- [x] **흐름을 바로잡음** — B07 이 B08 을 부르던 자리 0 · 이제 B07 은 자기 파일만 부름 · 검증완료
- [x] 차례 = 먼저 통째로 옮기고 오류 난 자리를 하나씩 봄 — 그대로 함 · 검증완료
- [x] 같은 식으로 B06 이 부르던 자리도 처리 — 구조물 몫(`haul_inputs_for`)은 **빈 값**으로 두어 화면이 그대로 섬(지어내지 않음) · B05·`common_util` 은 실제로 안 깨짐(문자열 참조라 소스 이동과 무관) · 검증완료
- [x] `test_b08_*` · `test_b09_*` 는 이미 모으기에서 빠져 있음(`resources/tester/conftest.py`) — 그대로 둠
- [x] 그 밖에 B08·B09 를 부르던 시험 25 개(이름이 `test_b05_`·`test_b06_`·`test_b07_`·`test_work_item_*` 라 모으기에 걸림)는 `old_code/resources/tester/` 로 같이 옮김 · 검증완료
- 임의 결정 — B07 구조물도 조립(`B07_DesignDetail_Engine_Cad_StandardSheet.py`)은 2026-09-13 에 이미 도면 목록에서 빠져 **부르는 곳이 0** 이라 `StructureFigure` 를 옮겨 적지 않고 `old_code/B07_DesignDetail/` 로 같이 보냄(구조물도는 되살리지 않는다는 이 절의 확정과 같은 방향)
- 검증 — `npm run typecheck` 통과 · `test_b06_*`·`test_b07_*` 180 통과(새 시험 `test_b07_slope_geometry.py` 포함) · 서버 라우트 159(quantity 0 · estimation 0 · master 5) · ORCA: `#/b08-quantity`·`#/b09-estimation` 제목만 뜨고 표 0 · `#/b06-section`·`#/b07-design-detail` 그대로 뜸
- 환경 메모 — 8006 을 쥔 옛 서버(9/20 기동)가 `dev_up.py` 재시작을 계속 건너뛰어 옛 라우트를 내보냈음. 워커 pid 를 직접 끊고 다시 띄워야 새 코드가 섬
### 7-4b. 품셈재료 걷기 (사용자 확정 09-22)
- 품셈재료는 **과거의 잔재로 봄**`old/` 로 옮겨 보고 **문제가 생기면 그때 정함**
- 옮기기 전에 옛것만 있고 자재품목에 없는 재료는 **값을 빈 채로 자재품목에 줄만 만들어 옮김**(사용자가 나중에 값을 찾음) · 구분·상세구분·단위·이름·출처(원문)는 채움
- 모래 · 자갈 — 전국 값과 지역 값으로 나눠 둠(한 줄로 굳히지 않음)
- 전력 — 이미 `재료_유가전력.json` 에 따로 있음 · 자재품목으로 옮기지 않음
- VR관 — 한 본이 몇 m 인지 인터넷에서 확인해 환산 계수를 넣음(출처를 비고에)
- [x] 위 넷을 한 뒤 품셈재료를 `old/` 로 · 로직이 품셈재료를 가리키던 자리는 자재품목 고르기 조건으로
- [x] 옮긴 뒤 일괄 시험 계산 통과·멈춤 수를 앞뒤로 견줌
- 검증완료(09-22) — **남는 `MP` 참조 0** · 재료_품셈재료.json 을 `old/` 로 옮김 · 로직 1,354 전수 대조에서 **금액 달라짐 0 · 새 멈춤 0**(새로 풀린 것 2건) · typecheck · 시험 107 통과
- 숨은 참조 16곳 — 덧줄·수량 식 **안에 글자로 박혀 있어** 요소 칸만 훑던 그동안 안 보였음 · 첫 옮김이 깨져 되돌린 뒤 다 찾아 자재품목 키로 바꿈
- 버너·퓨즈는 맞는 후보가 없어 자재품목에 새 줄을 만들어 이음 · 색소·에폭시·땜납은 가장 맞는 줄로
### 7-4. 안 쓰는 마스터 자료를 `old/` 로
- [x] 새 M01 화면이 실제로 읽는 파일 목록을 뽑음 — 최상위 `*.json` 145개 전부(글롭이라 예외 없음) · `_키대장.json` · 엔진 스크립트 8개 · `scripts/` 37개는 모두 살아 있는 도구라 옮길 후보 없음
- [x] 옮길 후보 7개(강한 것 3 · 약한 것 4) 를 `old/` 로 마저 옮김 — 검증완료(09-22) `ref/_분석_안쓰는마스터.md` 「고친 뒤」
- **앞서 「옮기면 안 됨」 6개는 다시 보니 4개는 착오** — B05·B06 이 실제로 읽는 건 돌쌓기경사·사방기슭막이치수 둘뿐(이미 `resources/data_masonry/` 로 되돌림) · 공종 마스터 2·산림건설 연결은 old_code(끊긴 B08·B09)만 읽어 옮겨도 됨 — `ref/_분석_B05B06_옛자료.md`
- [x] 공종 마스터는 **B08·B09 를 다시 짤 때 쓰는 축**이라 `old/` 안에 두되 버리지 않음(분석 `ref/_분석_공종이란.md`) — 그대로 유지
### 7-5. 끊기 되풀이 · 마무리
- [x] 한 걸음 = 옮김 → 깨진 자리 찾기(typecheck · 시험 · 서버 뜸) → 필요한 함수만 새 파일로 → 다시 확인 — 검증완료(09-22)
- [x] `old/`·`ref/` 를 읽는 **살아 있는 로직 코드는 0** — 남은 것은 검사·빌더 도구 5(전부터 사람이 손으로만 돌림) · 이관 대조 시험 2(재료_품셈재료 old/new 값 대조가 시험 목적 자체라 못 끊음) 뿐 · 목록 `ref/_분석_안쓰는마스터.md` 「고친 뒤」 — 삭제는 사용자 몫
- [x] `UnitPrice.py` 의 10배·100배 검사 — 브레인 판정대로 새 최상위 마스터 `기준수량없음_산림품셈_2026-01-01.json` 로 옮김 · 79건 견본 대조 통과 · 검증완료(09-22) `ref/_분석_UnitPrice.md`·`ref/_분석_검사코드_어디에.md` 「고친 뒤」
### 7-6. 분석 문서 (끝 · 근거)
- [x] 로직 컨테이너 통합 범위 — `ref/_분석_로직컨테이너_통합.md`
- [x] 공종이 무엇인지 · 기술교본이 마스터에 들어왔는지 — `ref/_분석_공종과_기술교본.md`
- [x] B08 · B09 초기화 — `ref/_분석_B08B09_초기화.md`
- [x] `UnitPrice.py``ref/_분석_UnitPrice.md`