Merge remote-tracking branch 'origin/main_desktop_1' into main_laptop_1

This commit is contained in:
2026-09-13 14:53:03 +09:00
@@ -354,6 +354,74 @@ STmate 코드는 `B00001`·`M00042` 꼴로 **층 글자 + 다섯 자리**이고
---
## 13. ⭐ 식 칸 계약 — 구조물도(3장)와 라이브러리 양식형(4장) 공용
**한 계약임.** 구조물도 한 줄이 들고 가는 모양이 곧 라이브러리 양식형 항목의 모양임.
따로 만들면 라이브러리가 구조물도를 못 낳음.
### 한 줄이 들고 갈 칸
```json
{
"seq": 3,
"name": "고임돌",
"spec": "",
"formula": "AREA * LOOKUP(뒷길이표, L3, '고임돌')",
"formula_text": "돌쌓기면적 × 고임돌 원단위",
"refs": { "AREA": 1 },
"vars": { "L3": 45 },
"amount": "0.18",
"unit": "㎥",
"rounding": { "mode": "floor", "digits": 2 },
"source": "library"
}
```
| 칸 | 무엇 |
| --- | --- |
| `formula` | **기계가 푸는 식.** 여기가 정본 |
| `formula_text` | **사람이 읽는 산출 기초.** 조달청 규격의 `적용산식설명` 자리 |
| `refs` | **앞 줄 결과**를 이름으로 받음 (`AREA` → 1번 줄) |
| `vars` | 제원 칸 (집계표·라이브러리에서 옴) |
| `rounding` | **줄마다 다름** — 아래 |
| `source` | `auto` · `user` · `library` — 줄마다 출처 표시 |
### 식 언어 — 최소로 정함
```
연산 + - * / ^ ( )
함수 SQRT · MIN · MAX · IF · LOOKUP(표이름, 키, 열이름)
참조 refs 의 이름(앞 줄) · vars 의 이름(제원)
```
**LOOKUP 은 반드시 있어야 함** — 실무 표가 뒷길이별 원단위표를 `VLOOKUP` 으로 참조함
(35/45/55/60 → 채움콘크리트·고임돌·돌중량). 표는 양식과 **한 벌로** 저장할 것.
### 지킬 것 넷
1. **상수 폴딩 금지 · 적힌 차례대로 풀 것.** 중간값을 미리 접으면 1원이 틀어짐
(STmate 실증 — `267,360 × 0.20833… = 55,699` ✗ / 좌→우 = `55,700` ✅. 18건 중 14건만 맞았음)
2. **앞 줄만 참조.** `refs` 는 자기보다 작은 `seq` 만 가리킴 ⇒ **순환이 원리적으로 불가**
3. **반올림은 줄마다 칸으로.** 한 가지로 통일하면 실무 값과 원 단위에서 갈림
```
mode : floor(버림) · round(반올림) · ceil(올림) · none
실무 한 표 안에 INT(x*100)/100 · ROUND(,2) · ROUNDUP(,2) · 없음이 섞여 있었음
```
4. **식을 버리지 말 것.** 값만 저장하면 납품 규격(`적용산식`·`적용산식설명`)을 못 맞추고,
라이브러리 양식형도 못 만듦 (12장)
### 양식형 ↔ 고정형
| | 양식형 | 고정형 |
| --- | --- | --- |
| `formula` | **있음** — 제원을 바꾸면 `amount` 가 다시 남 | **없음**(또는 빈칸) |
| `amount` | 식이 낳은 값 | **박힌 값** (STmate 내역서에서 뽑음) |
| `vars` | 제원 칸 | 안 씀 |
**칸은 같고 `formula` 유무로만 갈림.** 표를 두 벌 만들지 말 것.
---
## 10. 고칠 때
이 문서는 **브레인이 관리함.** 코드 창이 계약을 바꿔야 하면 **고치지 말고 브레인에게 알릴 것**