knowledge(축C): 두 축과 일위대가 계약 명세 — 자원축 실측 반영

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0154EMdwPYNPuKc9eZv8SLEX
This commit is contained in:
2026-09-13 14:25:50 +09:00
co-authored by Claude Opus 5
parent 912092710e
commit f9bf0a9c34
@@ -0,0 +1,223 @@
# 축 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` 는 부모이고 잎이 답구간·답외구간임.
**부모 코드에 수량을 붙이지 말 것**
### 자체 확장 코드 — 접두를 갈라 둘 것
품셈에 없는 공종의 자리. **품셈 코드와 한 눈에 갈려야** 함.
```
AX-<갈래>-<번호>
AX-ST-* 구조물 일위대가 (라이브러리가 낳는 것)
AX-GS-* 관급자재
AX-ET-* 품셈에 없는 공종 (첫 사례: 지장목제거)
```
**접두를 정하는 것은 랩탑 메인 몫이나, 정하면 이 문서에 적고 브레인에게 알릴 것.**
두 창이 다른 접두를 쓰면 나중에 통째로 뜯어야 함.
---
## 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 추적 대상)
- **시험 코드는 코드 창이 짜고 판정은 브레인이 함**
⚠ 골든셋은 **계산 엔진**을 재는 것이지 **기준자료**를 재는 것이 아님.
기초단가 원천(자재 57,580 · 노임 460 · 중기 833 · 표준시장단가 4,921건)은 전부 암호화라
영영 못 가져옴 — 그 자리는 **사용자 수동입력 + 빨간 테두리**로 둠.
---
## 9. 아직 안 정한 것
- 자체 확장 코드 **접두** — 랩탑 메인이 정해 이 문서에 적을 것
- 일위대가 **재귀 깊이 한도** — 사용자 답 대기
- **옆도랑파기 갈래 수**(우리 둘 ↔ 실무 셋) · **노면고르기 ↔ 노면다짐** — 사용자 답 대기
- **`undetermined` 75표** 판정 — 사람이 봐야 함. 값을 쓰면 뒤집힌 채 들어감
- **기계·자재 카탈로그 확보** — 못 맞춘 497줄의 주된 사유. 단가보다 먼저 **이름·코드 목록**이 필요함
---
## 10. 고칠 때
이 문서는 **브레인이 관리함.** 코드 창이 계약을 바꿔야 하면 **고치지 말고 브레인에게 알릴 것**
두 창이 각자 고치면 계약이 두 벌이 됨.