chore(ledger): 요구 813 분석 — STmate 구성표(BDQTY) 복호 결과로 엑셀 · STmate 분석 엔진 개선 몫 정밀 분석

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-11-13 19:51:24 +09:00
co-authored by Claude
parent 134daf0329
commit dbeb5d418e
@@ -0,0 +1,144 @@
# 813 BDQTY 복호 · STmate 분석엔진 · 엑셀 읽기 개선 정밀 분석 (읽기 전용)
세기 스크립트 = `tmp/brain_813/*.py`(load · evid · cmp_* · replay* · blines* · mach* · m131 · make_tsv) · 줄별 표 = `tmp/brain_813/STC_구성표로_풀리는줄.tsv`(240 줄 · 단가 없음). 코드 · 자료 · storage · `tools/` 고치지 않음. 복호는 `tools/stmate-test/bdqty.py` 를 읽기 전용으로 불러 씀. 줄 = 산근(D) 블록 안 자재 줄(지금 census 와 같은 단위 · 소광 3 판 중복 세짐).
## 0. 요약 열 줄
1. 복호 맞음 = 실무 STC 7 건에서 일위대가(B) 216 + 중기(X) 176 = 392 호표 중 391 재계산이 저장 단가와 같음(1 건 = 복호는 정상 · 시험 셈 규칙 구멍 · 아래 1-3). 엑셀과도 따로 맞음 — 일위대가표 B 호표 136/136 · 중기사용료 X 118/118 이 코드 차례 · 수량 100 % 같고 숨은 메타 플래그도 100 % 같음.
2. 읽히는 것 = 부모 · 자식 코드 · 1 차 수량 · 나누기 · 비율 줄 표시 등 약 20 칸. 못 읽는 것 = 이름 · 규격 · 단위(글자 칸) · 2~4 차 수량 · 비목 글자(어긋남) · 중기 코드.
3. 글자 칸에 든 정보는 얕음 — 엑셀로 견주면 줄 이름 · 규격을 덮어쓴 것은 479 줄 중 5 줄(1 %)뿐, 나머지는 자원 표 이름 그대로.
4. 자식 코드는 자원 표에 100 % 이어짐(3,510 자원 줄 중 빠짐 0) — 글자 칸 없이도 이름 · 규격 · 단위 채워짐. 안 이어지는 것은 제어 줄 1,380 개(구분 T · 닫기 C · 율 PR/RR · 빈 머리줄)뿐.
5. STC 만으로 B 일위대가 구성 복원 가능 — 엑셀 일위대가표와 호표 136 개 · 706 줄 다른 줄 0(영덕 · 소광 STC 는 엑셀에 없는 호표 16 개 더 가짐).
6. 재료 이음률: 일위대가 안 자재 줄 196 줄(율 줄 4 빼고)을 STC 에 더하면 분모 127 → 323, 이음 87 → 194, 68.5 % → 60.1 %(분모가 커져 내려감 · 새 줄 이음 54.6 %). 엑셀도 같은 몫(≈ 62 %).
7. 산근 「규격 없음 4 · 후보 여럿 29 · 우리 표에 없음 7」 40 줄은 구성표 단서(구성 줄 · 부모 일위대가 이름)를 넣어도 0 줄 풀림. 별도계상 자리표 ↔ 실제 품목은 BDQTY 에 없고 내역서에만 있음(영월 파형강관 M00865 ↔ M01092).
8. 기계: STC 기계 X 176 행 모두 손료 · 연료 · 조종원 · 잡품 구성이 읽힘(엑셀 중기사용료와 118/118 같음). 지금도 673 줄 100 % 이어짐이라 「같은 파일 구성 대조」 이득은 0 줄(별칭 끄고 재도 0) · 이득 = 내 기계 씨앗 공급처(STC 쪽 `기계구성` 없음).
9. 엑셀 쪽 17 줄(규격 없음 4 · 후보 여럿 13)도 일위대가표 패턴으로 0 줄 풀림 — 같은 줄이고 엑셀은 이미 일위대가표를 단서로 씀. EST 출력 엑셀은 해당 없음.
10. 제품에 넣을 때 = 표 283 자리가 7 건에서 맞춘 값 · 모듈이 `tools/` 에 있음(제품은 `smt_parser.py` 를 거울로 두는 길이 이미 있음) · 깨짐 검사는 「자식 코드가 자원 표에 있는가」 한 줄로 싸게 가능.
## 1. 복호로 읽게 된 것
### 1-1 레코드 · 칸
- 파일 = 7 건 · 레코드 4,890 · 호표(부모) B 216 · X 176 · D 367 · 전 레코드 삭제표시 0x45(`bdqty.py:2`) · 길이 415(봉화 · 영월 · 대흥) / 426(영덕 · 소광 3 판 · 끝에 SPRPT C11) · 읽는 시간 883 줄 0.08 초.
- 영월은 칸 차례가 다름(NAME1 · NAME2 · SIZE1 · SIZE2 · UNIT1 순) — 표가 자리(바이트 위치) 기준이라 같은 표로 읽힘.
- 표 = 283 자리(1~12 · 133~362 · 374~414 · `bdqty.py:14-47`). 표 밖 = 13~132(NAME1 · SIZE1 · UNIT1) · 363~373 · 414 뒤. 칸이 표 밖에 걸치면 조용히 빠짐(오류 없음 · `bdqty.py:94`).
| 칸 | 뜻(추정 · 엑셀 메타 대조) | 믿을 만한가 |
|---|---|---|
| BDCODE · CODE | 부모 호표 · 자식 자원 코드(M 자재 · L 노무 · S 경비 · X 중기 · B 일위 · D 산근 · W 일식) | 예 — 재계산 391/392 |
| QTY1 | 1 차 수량 | 예 |
| QTY2~4 | 2~4 차 수량 | 아니오 — 반복 쓰레기값(PLAN 도 「차수 2~4 수량 일부」 재현 불가로 적음) |
| DEVD1~4 · EXIST1 · PRPT · PRIN · PROUT · KWNGP · BL_AMT | 나누기 · 존재 · 율 밑줄 표시 · 율 밑수 비목 · 대상 비목 · 관급 | 예 — 엑셀 메타 EXI 706/706 · DVD · IPR 666/666 · KWN 140/140 · PRI · PRO 16/16 · BLA 665/666 |
| BIMOK | 비목(중기 3 줄 노 · 재 · 경) | 아니오 — 6 파일 L/K/Q · 영월 L/M/S · 순서 같음(K=M · Q=S 로 어긋남 · 추정) |
| EQCODE | 율 줄 율 코드(엑셀 `EQC|A01`) | 아니오 — 「An1」로 나옴(0 → n) |
| X_QTY1~3 · X_HAL1~3 · S_RATE · X_RATE · SBMOK | 할증 전 수량 · 할증률 · 적용 표시 | 값은 나오나 재계산에 안 쓰임 — 확인 못 함 |
| X_CODE · NAME2 · SIZE2 · UNIT1(영월) | — | 아니오 — 모든 줄이 같은 쓰레기값 |
| NAME1 · SIZE1 · UNIT1 | 줄 이름 · 규격 · 단위 덮어쓰기 | 읽기 불가 |
### 1-2 줄 갈래 분포(7 건 합 · 레코드 수)
| 부모 | 호표 | 줄 | 자식 갈래 |
|---|---|---|---|
| B 일위대가 | 216 | 1,110(호표당 중앙 5 · 최대 17) | D 456 · M 200 · B 142 · L 140 · 빈 머리줄 70 · X 46 · PR 36 · W 15 · C 4 · S 1 |
| X 중기 | 176 | 667(중앙 4 · 최대 5) | M 203(연료 159 + 잡품 % 44) · S 195(손료 · 천원) · L 154(조종원) · PR 115(잡품 %) |
| D 산근 | 367 | 3,113 | X 1,422(중기 한 대에 3 줄 · 비목 노 · 재 · 경) · T 구분 1,037 · L 344 · M 128 · PR 78 · S 55 · C 35 · D 9 · RR 5 |
- D 부모 줄은 `COSTN.SMT` 산근 글과 겹침 — 371 산근 블록 중 371 에서 코드 집합 같음 → D 쪽은 새 정보 없음. 새 정보 = B · X 구성.
- 빈 코드 70 줄 = 일위대가 머리 설명줄(엑셀 「건설품셈 공통 6-3-3」 같은 품셈 근거 글 · 글자 칸에 들었을 것으로 봄).
### 1-3 복호가 맞다는 증거의 범위
| 잣대 | 범위 | 결과 |
|---|---|---|
| 시험 `test_stmate_ilwi_eval.py:50-63`(B · X 재계산 = COSTN 저장 단가 1 원) | 원설계 5 + 영덕 변경 = 6 건 | 통과 |
| 같은 시험 `:66-74`(기초단가만 두고 연쇄 재계산) | 원설계 5 건(영덕 · 소광변경1 은 안 돌림) | 바뀐 단가 0 · 총공사비 같음 |
| 이번 재측정(`evid.py` · 같은 헬퍼) | 7 건 B 216 + X 176 | 391 같음 · 1 불일치(소광변경1 B00038 · 아래 한계) |
| 엑셀 일위대가표 대조(`cmp_ilwi.py`) | 봉화 45 · 영월 23 · 영덕 9 · 소광 25 · 대흥 34(코드 새로 매겨져 이름 짝) | 호표 136/136 코드 차례 · 수량 같음 |
| 엑셀 중기사용료 대조(`cmp_x.py`) | 5 건 X 118 호표 444 줄 | 118/118 같음 |
- 불일치 1 건(B00038) = 복호 탓 아님: 줄이 `C1`(닫기) 다음 `PR 90`(PRIN 4 · PROUT 4 = 전체 비목 90 %)인데 시험 프로그램 셈(`smt_eval.js` `evaluateComposition`)이 PR 줄의 「닫기 뒤 전체 비율」을 안 함 — 저장값 = 닫기 앞 합 × 0.9(6509 · 46685 · 10696 손계산 일치). 7 건 중 이 꼴은 이 1 호표뿐.
- 한계: 변경 차수 호표(NAGCD>0 · 영덕 10 · 소광 12 · 소광변경1 23)는 시험이 해당 칸(2)의 저장 단가와 맞췄고 2~4 차 수량(QTY2~4)은 못 읽음 — 구성 수량이 차수마다 달라지는 파일에서는 재현 불가.
## 2. 자원 표와 엮기 · 별도계상
- 자식 코드 → COSTN(이름 · 규격 · 단위 · 단가): 자원 줄 3,510 중 빠짐 0 = 100 %. 안 이어지는 것 = 제어 줄 1,380(T1~T3 구분 1,037 · 빈 머리줄 70 · PR 229 · RR 5 · C 39) — 이름 없음이 정상.
- 「별도계상」 = BDQTY 칸이 아니라 COSTN 자재 줄 SIZE 글 「별도계상」(엑셀 비고 「별산M…」 · 「별산자재」와 1:1 — 영월 17/17 · 대흥 16/16 · 소광 9/9 · 엑셀 쪽 영월 S 1 줄 예외).
- 구성 안 별도계상 자재 줄 59(레미콘 · 이형철근 · 시멘트 · 모래 · 파형강관 · 깬돌 …) — 자리표 줄이 곧 품목 줄. 규격이 있는 곳:
| 어디 | 줄 | 하나로 정해짐 |
|---|---|---|
| 이름 속(파형강관(800mm) · 이형철근 D13 · 깬돌(L3=45cm)) | 13 | 지름까지만 · 두께 · 관급/일반은 안 정해짐 |
| 부모 이름 머리 「D=800mm」 | 파형강관 8(+이름에 지름 없는 대흥 「68X13,1RS」 1 줄은 머리로 D1200 후보가 앞섬) | 지름까지 |
| 어디에도 없음(레미콘 · 이형철근 · 시멘트 · 모래 · 자갈) | 레미콘 15 · 이형철근 15 · 시멘트 6 · 모래 6 · 자갈 1 | 안 됨 — 단, 시멘트 6 · 레미콘 5 줄은 규격 없이도 지금 엔진이 이어짐 |
- 산근 줄의 자리표(영월 M00865 → 산근 D00071 · D00072 · D01932)와 실제 품목(M01092 · M01112 · M01110): 실제 품목은 어느 BDQTY 부모에도 없음(조회 0) · 내역서 줄에만 있음(같은 수량 224 · 34 · 15 · 지름 같음). 규칙 「자리표 = 같은 이름 · 지름 같은 내역서 줄」로 정해지는 건수 = 파형강관 11(산근 3 + 구성 8)/11 · 이미 엔진이 내역서 단서로 씀 · 남는 갈림 = 관급형/일반형(사람).
- 구성표로 새로 정해지는 자리표 → 품목 건수 = 0(BDQTY 는 자리표 · 품목 연결을 안 담음).
## 3. STmate 원파일 엔진 개선 몫(정량)
### ㉮ STC 만으로 일위대가 구성
- 엑셀 일위대가표와 줄 단위 대조(`cmp_ilwi.py`): 봉화 45/45 · 영월 23/23 · 대흥 34/34(이름 짝) · 영덕 9/9 · 소광 25/25 호표 → 줄 706 줄 일치 · 다른 줄 0. STC 에만 있는 호표 = 영덕 4 · 소광 12(둘 다 내역서에서 부름 — 엑셀 일위대가표에는 안 찍힘 · 판 다름 가능).
- 줄 이름 · 규격 · 단위는 자원 표 이름과 같음(정규화 후 479 줄 중 5 줄만 덮어쓰기) · 금액은 자원 단가 × 수량으로 재계산 가능(위 391/392).
- 지금 STC 읽기는 `M02_San_Stc.read` 가 B 를 「줄 없음 · 구성 못 읽음」으로 둠(`M02_San_Stc.py:30` · 148~).
### ㉯ 일위대가 안에서만 쓰이는 자재
- 자재 M 318 행 중 D · 내역 밖 B 또는 X 안 = 131 종(B 안 109 · X 안만 22) — 811-2 의 131 와 같음.
- 131 종을 `M02_San_Link.m01`(= 재료 찾기 `find`)에 넣은 판정: 이어짐 53 · 우리 표에 없음 35 · 후보 여럿 10 · 규격 없음 8 · 유가 15(중기 연료) · 율 줄 10(잡품 · 공구손료). 자재 106 종 중 이어짐 50.0 %.
- 줄 단위(B 부모 × M 자식 200 줄 · 율 4 줄 빼면 196 · `blines.py`): 이어짐 107 · 우리 표에 없음 40 · 규격 없음 30(전부 별도계상) · 후보 여럿 19.
- STmate 원파일 재료 이음률: 지금 87/127 = 68.5 % → 구성 줄 더하면 194/323 = 60.1 %(분모 +196 · 새 줄만은 54.6 %). 「이어짐」은 늘되 비율은 내려감 — 새 줄이 더 어려운 품목(별도계상 · 규격 없는 구조용강관 · 모래 등)이라서.
- 새 줄에서 못 이은 것의 까닭(40 + 49): 우리 자재표에 없음(구조용강관 5 · PE관 · 깬돌 별산 · 모래 · 자갈 · 떼 · 못 …) · 규격 없음(레미콘 · 이형철근 · 파형강관) · 후보 여럿(면목 9 · 와이어매쉬 4 · 결속선 3) — 엔진 문제 아닌 표 · 규격 문제가 대부분.
### ㉰ 산근 「규격 없음 4 · 후보 여럿 29」 단서
- 구성표 단서 둘을 넣어 `emit` 을 다시 돌림(`replay.py` · `replay2.py` · 기준 재현 87/29/7/4 정확히 같음): ① 같은 코드 구성 줄 + 부모 B 머리 ② 산근 머리에 부모 일위대가 이름 덧붙임.
- 결과 = 바뀐 줄 0/40(규격 없음 4 · 후보 여럿 29 · 우리 표에 없음 7 모두 그대로). 까닭: 종자 · 결속선 · 낙석방지책 형식 · 드릴샹크 · 지주는 구성표 어디에도 규격이 없음(811-2 와 같은 결론) · 부모 일위대가 이름은 산근 머리(이미 씀)와 같은 글. 줄별 표 = TSV 「기존 산근 줄」 40 줄(풀림 칸 전부 「안 풀림」).
### ㉱ 기계
- 현재(census): STC 기계 673 줄 · 86 종 · 모두 이음(이어짐 591 · 별칭 32 · 조합 가름 50).
- BDQTY X 176 행(86 종 이름 · 규격) 모두 손료 줄 있음(1 줄 157 · 2 줄 조합 19) · 연료 159 · 조종원 154 · 잡품 159. 꼴 = 손료(계수 · 가격 천원) · 조종원 1 인 · 연료 ℓ · 잡품 % — EST `makes`(`M02_San_Estx.py:makes`)와 같은 꼴이고 `M02_Machine_Find.peers`(`:332`)가 받는 `{손료 [[계수, 가격]], 주연료, 조종원}` 로 바로 변환됨(`mach.py`).
- 별칭을 끈 단독 `find_all` 기준: 이어짐 159 · 못 이음 17(후보 여럿 4 · 못 찾음 13 · 9 종). 별칭이 푸는 것 = 13 행(7 종).
- 같은 파일 구성 대조(`peers` → `narrow`): 풀림 0 행 · 같은 답 0 · 다른 답 0 — 까닭 = 못 이은 단독 기계와 구성이 같은 다른 단독 기계가 같은 파일에 없음(같은 구성 짝이 있는 X 는 19 행 · 그중 조합 15).
- 손료 줄 이름(S 코드 「굴삭기(무한궤도) 0.7㎥」)을 기계 이름 대신 찾기: 별칭이 푼 13 행 중 같은 답 3 · 다른 답 0 · 답 없음 10 · 별칭 끈 못 이음 17 행 중 +6 행 풀림 · 반대로 3 행 새로 못 찾음(순이득 +3).
- 내 기계 씨앗: 제품 STC 길엔 기계 구성 공급처가 없음(`est_makes` = EST · `xlsx_makes` = 엑셀만 · STC 원파일 `기계구성` 없음 — `M02_Sangeun_FromHopyo.py:133`). BDQTY X → `{이름 · 규격 · 손료 · 주연료 · 조종원 · 잡품 %}` 변환은 엑셀 `_stm_sheet`(`M02_San_MyMachine.py:123`)와 같은 값(118/118). 지금 7 건에서 「못 찾음 → 내 기계」 대상 0 종이라 이득은 새 파일 · 별칭 없는 환경 몫.
## 4. 엑셀 엔진 개선 몫 · 패턴 대응표
| STmate 패턴 | STC(BDQTY) | 엑셀 | 지금 읽기기 |
|---|---|---|---|
| 호표 머리 · 줄 범위 | 부모 BDCODE · 코드 B/X | 일위대가표 「제 N 호표」 + 숨은 N 열 `BDCOD|B00011 POSS|7 POSE|12` · O 열 코드 | `M02_San_MatFind.from_book`(`:63`)이 머리 이름 · 규격만 씀 |
| 자식 줄 코드 · 수량 | CODE · QTY1 | N 열 `COD|M00131` · 수량 칸 · 비고 칸(코드 · 출처 · 별산 · 자재 N — 공사 설정마다 다름) | M 줄 코드 · 이름 · 규격만(수량 · 단가 안 씀) |
| 플래그 | DEVD · EXIST1 · BIMOK · PRPT · KWNGP · BL_AMT | `DVD · EXI · BMK · IPR · KWN · BLA`(BDQTY 와 706 줄 전부 같음) | 안 읽음 |
| 율 줄(공구손료 · 잡재료) | CODE PR/RR + PRIN · PROUT · EQCODE | `COD|PR` `PRI|1 PRO|1 EQC|A01 UNI|%` · 이름 「…의 %」 | 안 읽음(율은 산근 글 쪽 `parse_line`) |
| 닫기 · 일식 | C1 · C2 + W 줄(켜쌓기적용 「전체금액의 %」) | 빈 `COD` · W 코드 줄 | 안 읽음 |
| 별도계상 | 자재 줄 SIZE 「별도계상」(BDQTY 아님) | 단가 0 · 비고 「별산M…」/「별산자재」 | SIZE 글로 판정(`M02_San_Link.apart`) · 비고 표기 안 씀 |
| 차수 | QTY1~4 · EXIST1~4 | O 열 `M00131_1`(차수 번호 꼬리) | 안 읽음 · 금액은 차수 1 칸만 |
| 중기 구성 차례 | 손료 S(천원 계수) → (조합이면 둘째 S) → 조종원 L 1 인 → 연료 M ℓ → 잡품(PR % 또는 M%) | 중기사용료 「제 N 호표」 같은 차례 | `_stm_sheet` 읽음(`M02_San_MyMachine.py:123`) |
| 중기 부름 | D 부모 아래 X 3 줄(노 · 재 · 경) | 단가산출근거 세 줄 | 읽음(세 줄 로직) |
| 코드 머리글자 | L 노임 M 자재 S 경비(손료 천원) X 중기 B 일위 D 산근 W 일식 T 구분 | 숨은 메타 `COD` | `KIND` 표(`M02_San_Stc.py:24`)에 B · D · X · M · L · S 있음 · W · C · T 없음 |
| 총수량 | (BDQTY × 내역 수량 집계 — 시험 F3-24) | 재료비수량금액집계표(별도계상 총수량 영월 360 m = 224+87+34+15) | 버림(`STM_SHEETS` 밖) |
- 쓰는 것 = 자원 목록표 · 단가산출근거 G 열 원문 · 일위대가표(자재 줄 단서만) · 중기사용료(기계 구성).
- 안 쓰는 것 = 일위대가 줄 전체(수량 · 율 줄 · 플래그) · 설계내역서(`내역 = None` · `M02_San_Xlsx_Stmate.py:72`) · 재료비수량금액집계표 · 자재단가대비표.
- 엑셀 쪽 「규격 없음 4 + 후보 여럿 13」 17 줄(종자 · 결속선 · 낙석방지책 · 드릴샹크 · 지주 · 블레이드 · 파형강관 · 이형철근): 위 패턴으로 풀리는 줄 0. 이유 = STC 실험과 같은 줄이며 엑셀은 일위대가표를 이미 단서로 쓰고 있음(`M02_San_Xlsx_Stmate.py:73`).
- 엑셀 쪽 얻을 것 = 일위대가 구성 줄을 「재료 줄」로 세는 것(5 공사 M 줄 140 · 분모 102 → 234 · 이음 78 → 145 ≈ 62 %) · 율 줄 · 별산 표기 · 플래그를 구조로 읽기 — 일위대가 불러오기 쪽(`호표 길`)이 이미 같은 정보를 필요로 하면 재사용.
- EST 출력 엑셀: 해당 없음(BDQTY · 숨은 `COD|` 메타 · 별산 표기 · 코드 머리글자는 STmate 전용 · EST 는 기계경비 · 단가산출 시트 꼴이 따로 읽힘).
## 5. 제품에 넣을 때 걸리는 것(사실)
- 표 = 실무 7 건에서 맞춘 283 자리 값 · 새 판에서 레코드 길이 · 칸 자리가 바뀌면: ① 칸이 표 밖에 걸침 → 그 칸이 `row` 에서 조용히 빠짐 ② 자리는 같으나 문자가 표 밖(예: BIMOK K/Q · EQCODE n) → 쓰레기값이 값처럼 나옴 · 오류 없음. 영월(칸 차례 다름)에서 문제없었음 = 자리 기준이라서.
- 키스트림 판간 동일성: SYSINFO 7 파일 100 % 같음(`STC_난독화_상태.md` §2) · BDQTY 83~100 %(값 열 흔들림 — 키 상이 증거 아님) → 새 STmate 판에서 키가 바뀔 가능성은 이 자료로는 닫혀 있지 않음.
- 스스로 알아채는 검사(싼 것부터): ① 모든 자식 코드가 자원 표에 있거나 제어 코드(PR · RR · T · C · 빈) · 7 건 4,890 줄 전부 통과 ② 부모 코드 머리글자가 B · X · D ③ DEVD1 값 ∈ {F · 빈}(7 건 4,890 줄 전부) ④ B · X 재계산 = 저장 단가(1 원 · 7 건 392 중 391). ④는 `smt_eval.js` `evaluateComposition`(JS) 자리 값 필요 — 제품에 같은 셈은 산근 쪽(`M02_San_Eval`)뿐.
- 자리: `tools/stmate-test/bdqty.py`(98 줄 · 표준 라이브러리만) · 제품 `M02_San_Stc.py` 는 이미 `tools/stmate-test/smt_parser.py` 를 「거울」로 두고 시험 `test_810_1_stc.py` 로 1:1 대조 — 같은 방식(CLAUDE.md 계산 자리 ① 짝 + 거울 시험)이 가능. `dbf_crypt.py`(쓰기)는 불필요.
- 표 없는 자리 · 못 읽는 칸: 글자 칸 없이 코드 · 수량 · 플래그만 → 이름은 자원 표에서(100 %). 줄 이름 덮어쓰기(1 %)는 놓침.
- 읽기 실패 때 물러날 자리: `M02_San_Stc.read` 의 「일위」 줄 없음 + 표지 `UNREAD`(`:30`) 길 — 검사 ①~③ 중 하나라도 실패하면 표지 유지 · 엑셀 길(일위대가표) · 산근만 길 그대로.
- 경쟁사 암호를 제품이 푸는 일이 되는 점은 사용자 판단(지금은 시험 프로그램만 사용자 승인으로 사용).
## 6. 시험 프로그램이 이미 풀어 놓은 것 중 쓸 만한 것(`tools/stmate-test/PLAN.md` 구현)
| 항목 | 내용 | 불러오기와 닿는 곳 |
|---|---|---|
| F2-12 일위대가 B 구성 조립(행 소수 1 버림 · CHBNM 총액우선) | 7 건 1 원 | B 줄 금액 검산 · 「틀린 줄」 판정 |
| F2-08 / F2-03 중기 시간당 사용료(손료 · 운전원 시간 환산 CONLD · RXXNM · 연료 · 잡품) | 7 건 1 원 | 내 기계 씨앗의 조종원 · 환산(제품은 「×16/12 ×25/20 안 가져옴」 처리 — 대조 근거) |
| F2-14 PR/RR 율 줄(PRPT 표시 행 밑수 PRIN → PROUT · C* 뒤 % = 전체) | 구현 | 일위대가 율 줄 · 켜쌓기적용 읽기 |
| F2-13 호표 참조 위상 순서 · 순환(실무 7 건 순환 0) | 구현 | 일위대가 → 산근 → 중기 계산 차례 |
| F2-10 · F3-02~12 산근 식 언어(변수 `;;` · 구간 `(=)(==)(-=)` · 라벨 `:=A01` · `&PA01:M&` · IF) | 282 개 1 원 | 제품은 이미 블록 100 % 대조(`test_810_1_stc`) — 새 이득 작음 · 함수 · 조건 범위 확인용 |
| F3-18 낙찰률 단가(원단가 × 율 버림 · 127 개) | 구현 | 제품 낙찰률 값과 맞대기 |
| F2-60 연쇄 재계산 · F4-09 차수 4 벌(NAGCD > 0 → 2 차 칸) | 원설계 5 건 | 변경설계 파일에서 제품은 1 차 칸만 읽음(`M02_San_Stc.AMT`) — 변경 STC(영덕 · 소광변경1)의 현행 단가 칸 |
| F2-06 자재 후보 5 칸 단가 · 최저가 자동채택 | 7 건 변동 0 | 출처 칸 의미(적용 단가 선택) |
| F3-24 · F3-28 내역 ↔ BDQTY 수량 집계(CON_QTY) | 실무 BOQ 대조 | 자재 총수량(별도계상 총수량 등 엑셀 집계표 값)을 STC 에서 산출 |
| F4-04 · F4-05 DBF 03/E5/06 변형 읽기 · 무손실 왕복 | 7 건 | 제품 `dbf()` 는 삭제표시 `*` 만 건너뜀 — BDQTY 0x45 도 그대로 읽힘(내용은 암호) |
## 개선 후보 목록(권고 차례 · 결정 아님)
| 차례 | 후보 | 좋아지는 것 | 필요한 것 | 위험 |
|---|---|---|---|---|
| 1 | STC 기계 구성 공급(`stc_makes`: BDQTY X → `{손료 · 주연료 · 조종원 · 잡품}`) → 내 기계 씨앗 · 같은 파일 구성 대조 | 지금 7 건 이음 673/673 = 변화 0 · 새 파일에서 못 찾음 기계(별칭 끈 환경 17/176 = 9.7 %)의 내 기계 자동 생성 길이 STC 에도 열림 | `bdqty.py` 짝 복제 + 거울 시험 · `기계구성` 칸 채움 | 표 밖 칸 조용히 빠짐 · 새 판 깨짐 — 자식 코드 자원 표 검사로 막음 |
| 2 | STC 일위대가(B) 구성 줄 읽기 → 재료 줄에 더하기 | 재료 줄 +196 · 이음 +107 · 일위대가 호표가 STC 에서 줄로 보임(706 줄 엑셀과 같음) · 「구성 못 읽음」 표지 소멸 | 위 모듈 + `M02_San_Stc.read` 일위 줄 채움 | 이음률 68.5 → 60.1 % 로 내려 보임(분모 증가) — 지표 설명 필요 · 새 못 이음 89 줄(우리 자재표 없음 40 · 규격 없음 30 · 후보 19) |
| 3 | 엑셀 일위대가표를 줄(재료 · 율 · 별산)로 읽기 | 엑셀 재료 줄 102 → 234 · 이음 78 → 145 ≈ 62 % · STC 와 같은 줄 | `M02_San_Book` 일위대가표 줄 읽기(이미 시트 보관) | 일위대가 불러오기 길과 중복 읽기 — 한 곳에서만 |
| 4 | 우리 자재표 보강(구조용강관 · PE관 · 모래 · 자갈 · 깬돌 별산 · 떼 · 못) | 새 줄 못 이음 「우리 표에 없음」 40 줄 중 상당수 | M01 자재 값 · 별칭(사람 확인) | 값 · 규격은 사용자 협의 |
| 5 | 별도계상 자리표 ↔ 내역서 실제 품목 규칙(이름 core + 지름 수 · 수량 같음) 명문화 | 파형강관 11 줄 지름 · 두께 하나로(지금도 내역서 단서로 후보 순서) · 남는 것은 관급/일반 사람 몫 | 규칙 문서 · 표지 글 | 이름 · 지름 규칙이 파형강관 밖(이형철근 범위 「D13~D32」)에선 안 됨 |
| 6 | 변경설계 STC 차수 2 칸(NAGCD > 0) 읽기 | 변경 파일 현행 단가 일치 | `AMT` 칸 분기 · 영덕 · 소광변경1 시험 | 2~4 차 수량 못 읽음 — 금액 칸만 |
| 7 | BDQTY 글자 칸(NAME1 · SIZE1 · UNIT1) 복호 | 줄 이름 덮어쓰기 5/479(1 %) 정도 | 암호 새로 풀기(이번 범위 밖 — 안 함) | 얻을 것이 적음 · 권고 안 함 |