auto: 2026-09-13 14:48 (ESD_LAPTOP)

This commit is contained in:
2026-09-13 14:48:13 +09:00
parent f20213592c
commit 90ff6d58de
@@ -0,0 +1,316 @@
# 축 C 명세 — 두 축과 그것을 잇는 표
작성 2026-09-13 · **브레인(데스크탑 메인)** · 코드 창 둘이 따를 계약
> **왜 이 문서가 있나** — 랩탑 메인(1장 축)과 랩탑 서브(3장 구조물도)가 **서로 안 만나면서도
> 나중에 맞물리게** 하려면 계약이 먼저 있어야 함. `PLAN.md` 는 「무엇을 할 것인가」이고
> 이 문서는 「그것이 어떤 모양이어야 하는가」임.
---
## 0. 한 줄 요약
**공종 축**(수량이 붙는 자리)과 **자원 축**(돈이 붙는 자리)을 따로 두고,
**일위대가가 둘을 잇는 표**로 선다.
```
공종 축 FP-09-03-01 돌쌓기(찰) ← B08 이 수량을 붙임
└── 일위대가 = 잇는 표 ← 라이브러리가 저장하는 것
├─ 자원 M-야면석 0.88 ton/㎡
├─ 자원 L-조경공 0.21 인
└─ 자원 L-보통인부 0.15 인
← B09 가 돈을 붙임
```
---
## 1. ⚠ 실측 — 지금 무엇이 서 있나 (2026-09-13 브레인 확인)
**「자원 축 뒤 패스를 만든다」는 틀린 말임. 이미 있고 이미 돌았음.**
| 무엇 | 자리 | 상태 |
| --- | --- | --- |
| 공종 축 마스터 | `resources/data_work_item_master/work_item_master_2026-01-01.json` | ✅ 섬 |
| 자원 축 산출물 | `resources/data_cost_resource_axis/resource_axis_2026-01-01.json` | ✅ **418줄** |
| 못 맞춘 목록 | `resources/data_cost_resource_axis/unmatched_2026-01-01.json` | ⚠ **497줄** |
| 뒤 패스 코드 | `B09_Estimation/B09_Estimation_ResourceAxis*.py` (6파일) | ✅ 섬 |
**`stats` 실측**
```
rows 418 · unmatched 497
skipped_forms : coefficient 19 · reference 64 · undetermined 75
policy : axis=resource_only · work_item_axis_owner=B08
material_amounts_are_before_surcharge=true
```
**⇒ 남은 일은 「만들기」가 아니라 「채우기」임.**
못 맞춘 497줄의 주된 사유는 파일 안에 그대로 적혀 있음 —
**「카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)」.**
즉 막힌 것은 **단가가 아니라 이름·코드 목록조차 없는 것**임.
(예: `보통휘발유 (주연료)` · `체인오일 (일반오일)` — 이름은 품셈에 있는데 받을 코드가 없음)
---
## 2. 공종 축
### 코드 모양 — 이미 도는 규약을 그대로 씀
```
FP-<절>-<절>-<절> 예) FP-04-02-02 (벌목, 5m 미만)
```
- 정본은 **품셈 절 번호**. 표의 행은 그 절의 **조건별 변형**(`variant` 칸)임
- **이름은 표시용, 잇기는 코드로.** 이름으로 맞추는 코드가 남아 있으면 그것이 곧 결함임
- 부모·잎이 있음 — `FP-09-15` 는 부모이고 잎이 답구간·답외구간임.
**부모 코드에 수량을 붙이지 말 것**
### ⭐ 코드 체계 — 브레인 확정 (2026-09-13, 사용자 지시)
**새로 만들지 않았음. 이미 도는 규약에 한 칸을 더한 것임.**
#### ① 층 글자 — 이미 코드에 살아 있음. 바꾸지 말 것
```
S-<기계코드> 중기 취득가(천원)
X-<기계코드> 시간당 중기사용료 · X-<코드>#조합 = 기계 조합
B-<공종코드>[#<갈래>] 일위대가 예) B-FP-12-01-01#철근구조물
D-<공종코드> 단가산출 B- 를 D- 로 갈아 끼움
W-<…> 일식·견적
```
#### ② 공종 축 코드 — 층 글자 **뒤**에 오는 자리
```
FP-<절>-<절>-… 품셈 절번호 (정본, 두 자리 zfill) 예) FP-04-02-02
AX-<갈래>-<8자리 16진> 우리가 더한 공종
갈래 ST 구조물 일위대가 — 라이브러리가 낳는 것
갈래 WK 품셈에 없는 공종 — 첫 사례 지장목제거
```
예) `B-AX-ST-3f9a2b17` = 어느 구조물 양식이 낳은 일위대가 한 벌
#### ③ 자원 축 코드
```
<숫자> 카탈로그 코드 (정본) 예) 1037 보통인부
AR-<종류>-<8자리 16진> 카탈로그에 없는 자원
종류 M 자재 · L 노임 · X 중기 ← PriceKind 글자 그대로. 새 낱말 안 만듦
```
지금 못 맞춘 497줄(`보통휘발유(주연료)` 등)이 여기로 들어감.
**단가는 없어도 됨** — 이름·코드만 서면 축은 이어짐.
#### ④ 지킬 것 다섯
1. **관급은 코드가 아님** — 자재 줄의 **칸**임
(`material_supply` = `owner_supplied`·`contractor_supplied`·`unknown`, 관급 줄엔 `install_by` 가 더 붙음).
⇒ 관급용 접두는 **만들지 않음**
2. **번호는 난수 8자리 소문자 16진.** 발급자를 두지 않음 —
3단 라이브러리(프로그램·회사·개인)와 창끼리 공유에서도 안 부딪힘.
만들 때 자기 범위 안 중복만 볼 것
3. **코드는 동등 비교만.** 사전순 정렬·계층 해석 **금지**
`AX`·`AR` 에는 부모·잎이 없음(`FP` 만 있음). 표시 차례는 공종 계층에서 옴
4. **층 글자는 맨 앞에만**`B-AX-ST-3f9a2b17` ⭕ · `AX-B-ST-…`
5. **`#갈래` 는 기존 규약 그대로.** 새 구분자를 만들지 말 것
#### ⑤ 왜 이 모양인가
- `FP``CODE_PREFIX = "FP"` 로 이미 박혀 있고 `B-FP-12-01-01#철근구조물` 이 실제로 돎.
**거기에 `AX` 한 칸만 나란히 세우면 층 글자 로직을 한 줄도 안 고쳐도 됨**
- 난수를 쓰는 까닭 — 회사·개인 라이브러리가 서로 모르는 채 항목을 만들고 **공유까지 함**.
일련번호를 쓰면 공유하는 순간 부딪힘
- 읽기는 **이름 칸**이 맡음. 코드는 식별자일 뿐임
---
## 3. 자원 축
### 한 줄의 모양 — 실물 그대로 (고치지 말 것)
```json
{
"work_item_code": "FP-04-02-02",
"resource_kind": "labor",
"resource_code": "1037",
"resource_name": "벌목부",
"resource_spec": "",
"amount": "2.14",
"amount_unit": "",
"variant": "5m 미만",
"pum_form": "requirement",
"pum_table_id": "F0087",
"raw_row_index": 1
}
```
### 지켜야 할 것 다섯 — 이미 코드 머리에 적혀 있음
1. **`pum_form` 을 먼저 볼 것.** `productivity` = **1 ÷ 값** · `requirement` = **값 ÷ 밑수**.
**뒤집으면 20배 틀림**
2. `coefficient`·`reference`**공종이 아님** — 일위대가 항목으로 세우지 말 것.
`undetermined`**값을 쓰지 말 것**
3. **규격(`resource_spec`)이 없으면 매칭 성공이 아님.** 「굴착기」와 「굴착기 0.7㎥」는 단가가 다름
4. 못 맞춘 것은 **빈칸이 아니라 `unmatched` 목록**으로
5. **자재는 할증 전 값.** 할증은 자재총괄 한 곳뿐
### 자원 종류와 단가 층은 **다른 것**
헷갈리면 값이 두 배가 되거나 사라짐.
| 축 | 값 | 무엇인가 |
| --- | --- | --- |
| **자원 종류** (`resource_kind`) | `labor` · `material` · `machine` | 품셈 줄이 무엇을 부르나 |
| **단가 층** (`PriceKind`) | `M·L·S·X·B·D·W` | 단가가 어느 겹에 사나 |
단가 층 넷의 차례 (STC `COSTN` 186행 실측) —
`S 중기취득가(천원) → X 시간당 중기사용료 → B 일위대가 → D 단가산출`,
`L 노임`·`M 자재`는 카탈로그 층(상세 없이 값이 바로 있음).
---
## 4. 일위대가 — 잇는 표
- **한 줄** = 공종 코드 하나 + 그에 딸린 자원 줄 여럿
- 금액은 **어느 층이든 재료·노무·경비 3분할**이고 `합계 = 재료 + 노무 + 경비`
- **재귀** — 구조물 일위대가(`AX-ST-*`)가 다른 공종의 하위 일위대가로 들어감.
⚠ 순환 참조 막이 필요 · 깊이 한도는 **사용자 답 대기**
---
## 5. 별칭표
**한 파일에만 둘 것.** 지금 `B08_Quantity_Engine_Handoff_Mapping.py` 등 여러 곳에 흩어져 있음.
```
우리 이름 → 코드 ← 남의 이름
리핑암 → FP-… ← 파쇄암 (실재 · 코드에 주석으로 있음)
노면다짐 → FP-… ← 노면고르기 (답 대기)
```
- 방향은 **양쪽 다** — 우리 이름으로도, 실무·품셈 이름으로도 코드를 찾을 수 있어야 함
- **한 이름이 두 코드에 걸리면 오류로 세울 것.** 조용히 첫째를 고르면 안 됨
---
## 6. 이중계상 경계 — 축으로 판정
지금은 **주석 경고뿐**임. 코드가 잡게 세울 것.
| 규칙 | 판정 자리 |
| --- | --- |
| 구조물 터파기·되메우기는 **토공집계로만** | 공종 축 — 같은 물량이 두 공종 코드에 붙으면 오류 |
| 콘크리트 배합 성분(시멘트·모래·자갈)은 **일위대가만 쪼갬** | 자원 축 — 자재총괄에 배합 성분이 뜨면 오류 |
| 자재 할증은 **자재총괄 한 곳** | `material_amounts_are_before_surcharge=true` 정책 이미 있음 |
원문 규칙은 `docs/raw/plans/2026-09-13b_plan_구컨셉_전문_재편전.md` 8-7절.
**세우기 전에 반드시 대조할 것.**
---
## 7. 반올림 — 자리마다 다름 (STmate 실증, 17·18번)
**한 가지로 통일하면 틀림.** 자리마다 다른 것이 실측 결과임.
| 자리 | 규칙 | 근거 |
| --- | --- | --- |
| **호표 안 성분 소계** | **절사** | 중기사용료 398건 100% · 일위대가 345건 94.2% |
| **집계표 행 금액** | `ROUND` | 자원·일위대가·중기 집계표 |
| **내역에 실릴 때** | 정수 절사 | 착공내역서 178건 100% |
| **단가산출 성분단가** | 소수 1자리 절사 | 211건 중 137건 설명 |
| 내부 계산 | 은행가(최근접-짝수) | STmate 내부. ⚠ 뽑은 엑셀은 사사오입이라 20개 경계 중 10개가 갈림 |
**식을 접지 말 것 둘**
- **노임 시간당 환산** — 식 문자열을 **좌→우 순차 평가**.
계수로 미리 곱하면 `267,360 × 0.20833… = 55,699.99…`**55,699** 로 1원 틀림.
좌→우는 모든 단계가 정수라 **55,700**. 18건 중 계수 선계산은 14/18 만 맞음
- **단가산출 Q 식** — `Q = 3600 × q × K × f × E / Cm`.
**Q 를 소수 2자리로 먼저 확정한 뒤 나눌 것**(`55,700/15.708 = 3,545.96``55,700/15.71 = 3,545.5`)
**중기 시간당 사용료 조립** — 손료(경비) · 운전원(노무) · 주연료(재료) · 잡품(재료).
⚠ **잡품은 수량 × 단가가 아니라 연료비 × 비율의 가산 행**임.
---
## 8. 검산 계약 — 무엇이 「끝났다」인가
**STmate 골든셋 재현이 초록이면 끝.**
- 기준점 — 실무 6건 · 내역 1,515행을 **원 단위로 재현한 실증본**
(`…/STmate 분석/20_분석/16_골든셋_회귀_결과.md`)
- 시험 자리 — `resources/tester/` (git 추적 대상)
- **시험 코드는 코드 창이 짜고 판정은 브레인이 함**
**⭐ 어느 창에서든 돎** (2026-09-13 확인) — 골든셋 스크립트는 **로컬 원본
`C:\경영정보(주)` 를 안 씀.** 저장소 안 `resources/knowledge/original/실무문서/` 의 STC·XLSX 만 봄.
절대경로가 박혀 있던 것을 **24개 스크립트 전부 저장소 뿌리 자동탐색(`_repo_root()`)으로 고쳤고**
고친 뒤 6건 초록 유지를 확인했음. ⇒ **랩탑에서 그대로 돌릴 수 있음.**
| 쓸 것 | 무엇을 하나 |
| --- | --- |
| `40_스크립트/golden_regression.py` | **이것 하나면 됨** — 프로젝트 짝짓기부터 직접비·간접비 대조까지 |
| `40_스크립트/golden_bonghwa_full.py` | 봉화 한 건을 총공사비까지 훑음 |
| `40_스크립트/revision_direct_cost.py` | 변경설계 |
⚠ 로컬 원본이 필요한 스크립트 25개는 **설치폴더(PE·폼·JB) 분석용**이라 검산과 무관함.
⚠ 골든셋은 **계산 엔진**을 재는 것이지 **기준자료**를 재는 것이 아님.
기초단가 원천(자재 57,580 · 노임 460 · 중기 833 · 표준시장단가 4,921건)은 전부 암호화라
영영 못 가져옴 — 그 자리는 **사용자 수동입력 + 빨간 테두리**로 둠.
---
## 9. 아직 안 정한 것
- 일위대가 **재귀 깊이 한도** — 사용자 답 대기
- **옆도랑파기 갈래 수**(우리 둘 ↔ 실무 셋) · **노면고르기 ↔ 노면다짐** — 사용자 답 대기
- **`undetermined` 75표** 판정 — 사람이 봐야 함. 값을 쓰면 뒤집힌 채 들어감
- **못 맞춘 497줄 잇기** — ⭐ **재료가 생겼음**(2026-09-13). 아래 §11 참고. 남은 것은
「품셈 이름 ↔ STmate 자재명」 **맞추기**이지 목록 구하기가 아님
---
## 11. ⭐ 이름·코드 목록 — 확보됨 (2026-09-13)
STC 의 `COSTN.DBF`**암호화가 아니라** 코드·명칭·규격·단위가 평문으로 읽힘.
실무 7건을 합쳐 **서로 다른 코드 894개**.
```
resources/knowledge/original/경쟁사 프로그램/STmate 분석/30_원자료/stmate_code_name_list.csv
열 : code , name , size , unit ← size 가 곧 우리 resource_spec
D 단가산출 273 · M 재료 228 · B 일위대가 158 · X 중기 96
S 경비 92 · L 노임 37 · W 일식·견적 10
```
곁들여 **노임 직종 사전 106종**이 평문으로 있음 (`ST_U_Convert.CPM` · 28번 §3.1).
### ⚠ 그대로 우리 코드로 쓰지 말 것
STmate 코드는 `B00001`·`M00042` 꼴로 **층 글자 + 다섯 자리**이고 대시가 없음.
우리 규약(`B-<공종코드>`)과 **모양이 비슷해 헷갈리기 딱 좋음.**
- 우리 자원 코드는 **`AR-<M|L|X>-<8자리 16진>`** 그대로 감
- **STmate 코드는 별칭표(5장)에 한 줄로 실을 것** — 양방향 조회용·교차 확인용
- 까닭 — 894개는 **그 7개 프로젝트가 실제로 쓴 것만**임. 배포 전체 카탈로그
(`JDCODE_M.BSC` 자재 57,580건 등)는 여전히 암호화라 못 읽음.
남의 내부 번호를 정본으로 삼으면 나중에 빈 자리를 못 메움
### 쓰는 법
1. `size` 칸을 **반드시 같이 볼 것** — 3장 ③ 「규격이 없으면 매칭 성공이 아님」이 여기서 걸림
2. 출력 XLSX 목록표 시트 6종에서 **317개가 따로 읽힘** — 교차 확인용
3. 임도에서 실제 쓰는 자재·기계라면 못 맞춘 497줄 중 **상당수가 894개 안에 있을 것**으로 봄.
맞춰 보고 **남는 것만** 새로 `AR-` 코드를 낼 것
---
## 10. 고칠 때
이 문서는 **브레인이 관리함.** 코드 창이 계약을 바꿔야 하면 **고치지 말고 브레인에게 알릴 것**
두 창이 각자 고치면 계약이 두 벌이 됨.