knowledge(축C): 1장 첫 일감 — 공종 이름 잇기 전수 조사 (B05~B09)

- ① 이름 잇기 74자리 · ② 지반 갈래 어휘 8벌·별칭 사전 11곳 · ③ 코드 없는 공종 37
- 명세와 어긋나는 실측 다섯 — 자원 축 파일은 안 쓰는 옛것(지금 575줄·못 맞춤 508) ·
  부모 코드에 수량(FP-09-04·10-12·09-15 금액 안 섬) · 별칭은 표 범위에서만 참 ·
  #갈래 제목 202건이 한글 키 · 콘크리트 축 두 벌
- 코드 무변경. 곁 발견(자재총괄 누락·B07 확정 재계산 덮어쓰기)은 기록만

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BW6Jdsh18WPtYUR6THZJqn
This commit is contained in:
2026-09-13 14:52:43 +09:00
co-authored by Claude Opus 5
parent 34a36ff1b6
commit ea9dc220f8
@@ -0,0 +1,412 @@
# 축 C 1장 첫 일감 — 공종을 이름으로 잇는 자리 전수 조사
작성 2026-09-13 · **랩탑 메인** · 읽기 전용 조사(코드 무변경) · 계약 문서는 `2026-09-13_축C_명세.md`(브레인 관리)
> **무엇을 훑었나** — B05·B06·B07·B08·B09 의 `.py`·`.ts` 전부(openwebcad 제외) + `resources/data_*` 매핑·원단위·갈래표.
> **물음 셋** — ① 공종을 **문자열로 잇는 자리** ② 흩어진 **별칭** ③ 품셈에 **코드가 없는 공종**.
> **읽는 법** — 줄 번호는 조사 시점(`main_laptop_1`, dev 병합 직후) 기준. ✔ 표시는 랩탑 메인이 소스·실행으로 직접 대조한 것.
**파일 줄임말** — 앞머리 `B08_Quantity_` · `B09_Estimation_` · `B07_DesignDetail_` 는 뗌.
| 줄임 | 파일 | 줄임 | 파일 |
| --- | --- | --- | --- |
| `MAP` | `resources/data_work_item_mapping/work_item_mapping_2026-01-01.json` | `MST` | `resources/data_work_item_master/work_item_master_2026-01-01.json` |
| `Mapping` | `Engine_Handoff_Mapping.py` | `Rows` | `Engine_Handoff_Rows.py` |
| `Prep` | `Engine_Preparation.py` | `Trench`·`Spoil` | `Engine_Handoff_Trench.py`·`_Spoil.py` |
| `ESum` | `Engine_EarthworkSummary.py` | `UQ`·`REV` | `Engine_UnitQuantity.py`·`_UnitQuantity_Revetment.py` |
| `MAT`·`RM` | `Engine_MaterialSummary.py`·`Router_Material.py` | `HSUM`·`HIN` | `Engine_HaulSummary.py`·`Engine_HaulInputs.py` |
| `UP`·`BoQ` | B09 `UnitPrice.py`·`BillOfQuantities.py` | `BoQR` | B09 `BillOfQuantities_Rows.py` |
| `RAX` | B09 `ResourceAxis.py` | `STJ` | `B05_Profile/B05_Profile_Structure_Types.json`(레지스트리) |
---
## 0. 한눈에
| 물음 | 결과 |
| --- | --- |
| ① 이름으로 잇는 자리 | **공종 찾기 12 · 성분 이름 24 · 갈래 이름 22 · 사유·상태 문구 5 · 자원 이름 11** (자리 단위, 4장 표) |
| ② 같은 것의 다른 이름 | **지반 갈래 어휘 8벌** · 공종 이름 별칭 **19묶음** · 별칭 사전 **11곳** · 정규화 규칙 사본 **4계열** |
| ③ 코드 없는 공종 | **품셈 밖 공종 11** · **구조물 일위대가 후보 17** · 코드는 있는데 줄에 안 붙는 것 **9** |
| 생산 쪽 코드 흐름 | **B05·B06·B07 에서 코드가 한 번도 안 흐름**(`FP-` 0건). 코드는 **B08 매핑표에서 처음 붙음** |
**가장 무거운 것 셋**
1. **부모 코드에 수량이 붙어 금액이 안 서는 공종이 실재함** ✔ — 흙깎기(리핑암) `FP-09-04` · 덤프·사토·표토 운반 `FP-10-12` ·
표토제거 `FP-09-15` 는 일위대가 제목이 **아예 없음**(2장 1-2)
2. **자원 축 파일 418/497 은 옛것·안 쓰는 것** ✔ — 지금 코드로 돌리면 **575줄 · 못 맞춤 508**(2장 1-1)
3. **이름이 한 글자만 어긋나도 값이 조용히 0·누락되는 자리 9곳** — 그중 **자재총괄에서 유로폼·면목·철근·떼가 빠지는 자리** ✔(7장)
---
## 1. ⚠ 명세와 어긋나는 실측 — 브레인 판정 필요
> 명세는 **고치지 않았음.** 판정 거리만 적음.
### 1-1. 자원 축 「418줄 · 못 맞춘 497줄」은 낡은 파일임 ✔ (명세 §1·§2③·§9·§11)
- `write_resource_axis()`(`RAX:665`)를 **부르는 곳이 없음** — 파일은 옛날에 한 번 쓰이고 멈춤
- 파일의 `source_master_file.sha256` = `3752af1e…` ≠ 지금 마스터 `34628999…` (마스터가 09-09 에 다시 생성됨)
- B09 는 파일을 안 읽고 **일위대가를 만들 때마다 메모리에서 새로 돌림**(`UP:594``build_resource_axis`)
- **지금 코드 · 지금 마스터로 돌린 값** (2026-09-13, 쓰기 없이 메모리 실행)
```
자원 줄 575 (노임 532 · 기계 43 · 자재 0) 공종 139 개에 붙음
못 맞춤 508 (공종 166 개)
건너뛴 표 참조 63 · 미판정 73 · 계수 19 ← 명세의 64·75·19 와 다름
```
| 못 맞춘 사유 | 줄 | STmate 목록(§11)으로 풀리나 |
| --- | --- | --- |
| 카탈로그에 없는 이름 | **271** | ✅ 풀릴 후보 |
| 뭉친 자원 줄의 이름을 못 풂 | **167** | ❌ **표 읽기 문제** — 목록이 와도 안 풀림 |
| 자원은 알았으나 값을 못 읽음 | 20 | ❌ 표 읽기 |
| 숫자 칸 수가 자원 열과 안 맞음(여러 모양) | 25 | ❌ 표 읽기 |
| 규격이 없어 같은 이름 중 못 고름 | 7 | △ `size` 칸이 있으면 |
| 작업조 표 · 같은 갈래 두 번 · 한 칸 밀림 등 | 18 | ❌ 표 읽기 |
**자재 줄이 0** — 관급 자재 카탈로그 6,999건을 싣고 도는데 품셈 자재 이름이 하나도 안 맞음.
### 1-2. 「부모 코드에 수량을 붙이지 말 것」(명세 §2) — 현행이 어기는 자리 ✔
부모에는 **두 모양**이 있어 규칙 한 줄로 못 닫음.
| 공종(우리 이름) | 붙은 코드 | 잎 | 모양 | 일위대가 제목 실측 |
| --- | --- | --- | --- | --- |
| 흙깎기(리핑암) | `FP-09-04` 암절취 | 01 암파쇄 · 02 집토 | **단계 합산형** | **없음** |
| 흙깎기(발파암) | `FP-09-05` 발파암 | 01 절취(발파 10%) · 02 깍기(90%) · 03 집토 | **단계 합산형** | `-01` 하나뿐 |
| 유로폼(옹벽 묶음 조각) | `FP-12-38` | 01 사용횟수 · 02 사용수량 · 03 설치·해체 | **단계 합산형** | `-03#간단/보통/복잡` 만 |
| 덤프 운반 · 사토 운반 · 표토 운반 · 뿌리 운반 | `FP-10-12` | 01 토사 · 02 암절취 · 03 발파암 | 갈래 고르기형 | **없음** (`find_variant_code("FP-10-12","토사")``None`) |
| 표토제거 | `FP-09-15` | 01 답구간 · 02 답외구간 | 갈래 고르기형 | **없음** |
| 초류종자살포 | `FP-05-24` | 01 기계/일반 · 02 기계/마사토 | 갈래 고르기형 | 잎 둘 있음, 부모는 없음 |
| 구조물터파기(용수 미입력 때) | `FP-09-13` | 18구분 | 갈래 고르기형 | 잎만 있음 |
- **갈래 고르기형** — 잎 하나를 고르면 됨. `Prep:441-447``FP-10-12` + `variant_value "토사"` 를 보내는데
B09 는 `#갈래` 제목만 찾음(`UP:499-503`) → 잎 `FP-10-12-01` 로 못 내려감 → 「후보」에 머묾(`BoQR:214-233`)
- **단계 합산형** — **내역 한 줄이 곧 부모**이고 단가는 잎의 합. 잎에 수량을 붙이면 오히려 틀림
**판정 물음**: 합산형 부모를 「부모에 수량 허용 + 일위대가가 잎을 합침」으로 둘지, `AX-ST` 묶음으로 세울지
### 1-3. 별칭은 **표 안에서만** 참임 (명세 §5 「양방향 · 한 이름이 두 코드에 걸리면 오류」) ✔
- `UP:464-477` 원문 주석 — 「리핑암 = 파쇄암」은 **일반적으로 거짓**. 발파암도 캐고 나면 파쇄암 상태임.
**산림품셈 10-11 f 표 안에서만** 성립(10-12 [주]③ 암절취 1.35 = 10-11 f 파쇄암 1/1.35)
- ⇒ 전역 양방향 사전으로 두면 「파쇄암 → 리핑암」이 발파암 운반에도 걸릴 수 있음.
**별칭표 줄에 「어느 코드 범위에서」 칸이 필요함** (예: `리핑암 ↔ 파쇄암 @ FP-10-11`)
- 지금 별칭이 **세 벌이고 서로 다름**
- `MAP` `ground_aliases` — 리핑암 → [파쇄암, **암절취**]
- `UP:478-480` `VARIANT_ALIASES` — 리핑암 → 파쇄암 (**암절취 없음**)
- B08 인계본 `ground_class_aliases`(`Handoff.py:170`) — **B09 가 안 읽음**(시험만 읽음)
### 1-4. `#갈래` 규약 자체가 「이름으로 잇기」임 (명세 §2 ④-5 ↔ §2 「이름으로 맞추면 결함」) ✔
- 일위대가 제목 **446개 중 202개**가 `B-<코드>#<한글 갈래 이름>` 꼴(`#파쇄암` · `#철근구조물` · `#굴착기(무한궤도) 0.2 · 소`)
- B08 이 보낸 원본값을 **공백 제거 + 물결표 통일** 뒤 글자 동등으로 맞춤(`UP:458-503`), 안 맞으면 수의 짝 · 「이하」 구간으로 내려감(`UP:506-537`)
- 마스터 표마다 **`variant_key` 칸이 이미 있음(456표)** — B09 는 안 읽고 원문에서 다시 뽑음
-**판정 물음**: `#갈래` 를 표시 이름 그대로 둘지, 갈래 번호(표 행 차례·`variant_key`)로 옮길지
### 1-5. 콘크리트가 어느 축인지 두 벌 (명세 §6)
- 전개식 `UQ:387-393` — 콘크리트·채움·버림콘크리트 → `material`(사용자 확정 3차 ⑥)
- 관측 원단위 `resources/data_structure_unit/structure_unit_observed_2026-01-01.json` — 같은 이름 → `unit_price`
- 배합 성분 막이 `verify_no_mix_components`(`UQ:1363-1374`)는 **알리기만** 하고 막지 않음
---
## 2. 공종이 태어나 흘러가는 길
```
B05 레지스트리(STJ) type_id · 한글 옵션값(흄관·찰쌓기·기초유…) 코드 없음
B06 횡단 설계 soil/ripping_rock/blasting_rock · 영문 면적 키 코드 없음
B07 횡단도 표 깍기·측구·쌓기·편책·노면다짐… (자기 이름) 코드 없음 · B08 이 안 읽음
B08 토공집계(ESum) 「흙깎기」+「토사/연암…」 · 「성토면다짐」… ← 공종이 **이름으로 태어남**
B08 구조물 전개(UQ) 성분 이름 「터파기」「기초잡석」「콘크리트」…
▼ Mapping.for_earthwork(이름, 갈래이름) · for_structure(type_id) · kind_codes[한글]
MAP 이름 → FP 코드 ← **코드가 처음 붙는 곳**
▼ 인계 줄 = work_item_code + name + variant_value(한글) + ground_class(한글)
B09 내역(BoQ) 코드로 찾음 + `B-코드#한글갈래` 로 단가 제목 맞춤 + 이름 부분문자열 검사
```
---
## 3. ① 이름으로 잇는 자리
표 끝 칸 — **곁에 코드**: 그 자리에서 코드가 이미 있는데 이름을 쓰나. **어긋나면**: 이름이 틀렸을 때 일어나는 일.
### 3-1. 공종 찾기 — 이름 → 코드 (12)
| 자리 | 문자열 | 무엇과 무엇을 잇나 | 곁에 코드 | 어긋나면 |
| --- | --- | --- | --- | --- |
| ✔ `Mapping:224-235` `for_earthwork` | (구분, 갈래) 한글 짝 | 집계 줄 → `MAP.earthwork[]` | ❌ | 코드 None → unmatched |
| ✔ `ESum:29, 108-221` | 흙깎기·측구터파기·보정량계·성토·성토면다짐·초류종자살포·지장목제거·층따기 | 공종 **이름이 태어나는 곳** | ❌ | — |
| ✔ `ESum:96` | 비율 없으면 갈래 이름 「암」 한 줄 | `MAP` 에 「암」 없음 | ❌ | 조용히 unmatched |
| ✔ `Trench:42-45, 176, 246, 292` | 구조물터파기·기초잡석·되메우기 | **성분 이름 = 구분 이름**으로 `for_earthwork` | ❌ | 코드 None |
| ✔ `Rows:111-118` | `GROUND_SPLIT_GROUPS` · `SLOPE_GROUPS` · `SUBTOTAL_GROUPS` · `HAUL_SUMMARY_GROUPS` | 구분 이름으로 줄 성격 판정 | ❌ | 합계 줄이 내역에 섬 |
| ✔ `Rows:88` | `AREA_TIMES_DEPTH_GROUPS {"층따기"}` | 면적×길이 환산 대상 | `FP-09-18` 있음 | 환산 안 됨 |
| ✔ `Rows:351-358` + `MAP:198-202` | 메쌓기·찰쌓기 | `bond` 옵션값 → `FP-13-06-01/02` | ❌ | 공종 미정 |
| `Engine_Pipe.py:122, 141-143` + `MAP:376-380` | 파형강관·흄관·VR관 | `pipe_kind` 옵션값 → `FP-12-11-0x` | ❌ | 막힘 사유 |
| `MAP:226-228``Preparation_Ancillary.py:56-60` | 가설창고(컨테이너) | 매핑은 이름 키 · 파이썬은 코드 직접 | 두 벌 | 밑수 대조 누락 |
| `MAP:235-267` `pending_user` | 지장목제거 · 흙깎기/측구터파기 암 | 이름 키로 후보 목록 | — | — |
| `B09 MachineProductivity_Reference.py:130-133, 159` | 「…와 동일」 원문 → 마스터 **이름** → 코드 | 원문 참조 따라가기 | 원문에 코드 없음 | 이름 겹치면 실패(`:162`) |
| `B09 FactorChoices.py:200, 211, 223` | 흙깎기(기계)·노체포설·층따기 | 표시 이름 박힘(코드 키) | ✅ | 표시만 |
### 3-2. 성분 이름 — 원단위 성분 → 축·공종·자재 (24)
| 자리 | 문자열 | 무엇과 무엇을 잇나 | 곁에 코드 | 어긋나면 |
| --- | --- | --- | --- | --- |
| ✔ `UQ:377-416` `DESTINATION` | 성분 23개 | 성분 이름 → 축(토공·자재·일위대가·참조) | ❌ `Component` 에 코드 칸 없음 | KeyError 또는 기본값 |
| ✔ `REV:361, 481, 511, 584` | `DESTINATION.get(name, "quantity")` | 유로폼·면목·이형철근 D13·떼 → **없는 축** | ❌ | **자재총괄에서 빠짐**(7장) |
| `UQ:1004` | `DESTINATION.get(stone_name, "material")` | 돌 종류 → 축 | ❌ | 기본값이 `REV` 와 반대 |
| ✔ `UQ:1488` | `== "버림콘크리트"` | 버림 줄 → 기초잡석 줄 산출 | `FP-12-25` | **기초잡석 줄 사라짐** |
| `UQ:1601` · `HIN:43-44, 104, 106` | 채집석 · 잔토처리 | → 사토 공제 · 유토곡선 입력 | ❌ | **0 으로 감** |
| ✔ `Trench:165, 218-233` | 터파기·되메우기·잔토처리·기초잡석 | `destination=="earthwork"` + 이름 | 매핑엔 있음 | 줄 안 섬 |
| `REV:455-457` | 원문 「바닥파기」를 「터파기」로 개명 | 토공 축에 닿으려고 이름을 맞춤 | ❌ | 주석에만 있는 의존 |
| ✔ `Rows:320-330` + `MAP:160, 174, 195` + `UQ:751, 934` | 돌쌓기·큰돌쌓기 | `billing_component` 이름 → ㎡ 수량 | 코드 있음 | **㎡ 수량 잃음** |
| ✔ `Rows:476, 529` | 콘크리트·버림콘크리트·레미콘 | 타설 대상 성분 | ❌ | 타설 줄 누락 |
| ✔ `Mapping:128, 369-379` + `MAP:349` | 이형철근·원형철근·철근(앞머리) | 성분 이름 → 철근/무근구조물 | ❌ | **무근으로 조용히** |
| ✔ `MAP:279-322` + `Mapping:305-319` | 콘크리트·버림콘크리트·합판거푸집·유로폼·이형철근 D13/D16·기초잡석 | 묶음 조각 ← 성분 이름 | 조각은 코드 | 조각 물량 0(`MAP:327` 자인) |
| `UQ:1372` · `:421-423` | 시멘트·모래·자갈… 정확 이름 | 배합 성분 막이 | ❌ | 표기 변형이면 통과 |
| ✔ `MAT:115, 137, 234-237` | 이형철근 D13/D16→이형철근 · 콘크리트류→레미콘 | 성분 → 할증표 이름 | ❌ | 「할증률 미확보」 |
| ✔ `MAT:325` | `rate_for(lookup)` 조건 없이 부름 | 레미콘 무근/철근 · 철근 복잡 | — | **늘 기본 율**(7장) |
| `MAT:271-273` | 키 `(name, unit)` | 규격(채움콘크리트 180/210 · 관경) 버림 | ❌ | 다른 규격이 합쳐짐 |
| `MAT:316` · `MatGrid.ts:335-357` | 자재 이름 키 | 관급/사급 선택 저장 | ❌ | 이름 바뀌면 선택 고아 |
| ✔ `RM:265` | `.endswith("규준틀")` | 준비공 줄 → 규준틀 자재 | `FP-11-02/03` 곁에 있음 | **규준틀 자재 전부 빠짐** |
| `Prep:459-463, 468, 485, 509``B08_Quantity_UI_Page.ts:131-141` | 각재 50×50 · 판재 T12 · 못 · 비탈 규준틀 | 재료 이름·손율·준용 주석 | `FP-11-02` | 사용자 값 무시 |
| `Engine_Formwork.py:30, 97` | 합판거푸집·유로폼·문양거푸집·거푸집 | 성분 → 전용 횟수 | 매핑엔 있음 | 횟수 없음 |
| `Engine_ObservedUnit.py:53-64, 117-131` | 반중력식·A-TYPE·「800」 · 단위 m/㎡ | 옵션값 ↔ 관측표 규격 · 단위 → 배율 | ❌ | 800.0≠"800" · **모르는 단위 ×1** |
| `UQ:1230, 1239` | 「A-TYPE+집수정」 | 날개벽 옵션 → 이중계상 경고 | ❌ | 경고 사라짐 |
| B09 `MaterialCatalog.py:80-95` | 이름·규격 정확 일치 | B08 자재 → 관급 품목 코드 | ❌ 인계 자재에 코드 없음 | 못 찾음 |
| B09 `Guards.py:230, 255-259, 272, 283, 293-297` | 물빼기파이프·물구멍·고임돌·채움콘크리트 · 「큰돌쌓기」 in source | 자재 이름 · 공종 이름 부분문자열 | 공종 쪽은 `FP-13-06` | 가드 빗나감 |
| B07 `Engine_Standard_Sheet.py:79-86, 102-120` · `Router_Standard.py:114` | `sheet_key` = json(type_id·높이·옵션) · 성분 이름 | 표준도 장 ↔ 편집 저장 | ❌ | 편집 고아 |
### 3-3. 갈래 이름 — 지반·관종·구조물 종류 (22)
| 자리 | 문자열 | 무엇과 무엇을 잇나 | 곁에 코드 | 어긋나면 |
| --- | --- | --- | --- | --- |
| ✔ `Rows:49-61` + `Mapping:122` | 연암… + ripping/blasting → 리핑암·발파암 | 사용자 갈래 → 매핑 갈래 이름 | ❌ | 「시공법 미지정」 |
| ✔ `Rows:55` · `Handoff.py:178` | `== "토사"` | 토사 판정 | ❌ | 안내 목록 틀림 |
| ✔ `Rows:260-261` | `variant_value = "리핑암"` | 운반 갈래 → B09 `#파쇄암` | 부모 코드만 | 별칭 없으면 단가 없음 |
| ✔ `Spoil:57, 168-169` | ea/rr/br → 토사·리핑암·발파암 · **`variant_axis None`** | 사토 운반 갈래 | ❌ | 운반 줄과 모양이 다름 |
| ✔ `Prep:441-447` | `FP-10-12` + 「토사」 | 표토 운반 갈래 | 부모만 | **금액 안 섬**(1-2) |
| ✔ `Trench:58-60, 68-79` | soil/ripping_rock/blasting_rock · 육상/용수 · 0~1m | 세 축 **자리 셈**으로 잎 코드 조립 | 부모 | 품셈 차례 바뀌면 조용히 틀림 |
| `Trench:106-111` · `UQ:820-821` · B06 `UI_Cross_Excavation.ts:30-35` · B07 `Engine_Cad_StandardFigure.py:193-195` | 기초유·기초버림 | 옵션값 → 기초 깊이 | ❌ | 비탈분만 셈 |
| ✔ `UP:483-537` `find_variant_code` | 정규화 갈래 이름 · 수의 짝 · 「이하」 | 원본값 → `B-코드#갈래` | 부모까지만 | 후보에 머묾 |
| `B09 MachineProductivity_Dozer.py:343-355, 410-418` | `"암" in label` · `.get("토사")` | f 표 파쇄암/발파암 ↔ E 표 암석 | ❌ | 계수 빠짐 |
| ✔ `BoQ:507-510` | `"깎기" in name or "절취" in name` | 줄 이름 → 총 절토량(운반 ≤ 절토 검산) | ✅ 코드 곁에 있음 | 검산 틀림 |
| ✔ `BoQR:31-36` | `row.name == item.name` | 운반 줄 이름(`"dozer 운반"`) → 첫 줄 단가 | ✅ | **토사·리핑암 줄 이름이 같아 엉뚱한 단가** |
| B09 `QuantityDigits.py:30-63, 76-85` | 공사연장·떼·돌쌓기·옹벽·콘크리트·철근 부분문자열 | 줄 이름 → 소수 자리 | ✅ | 자리수 틀림 |
| `HSUM:41-43, 192-198` | 토사·리핑암·발파암 차례 목록 | 운반 줄 갈래·정렬 | ❌ | 끝으로 밀림 |
| `Engine_EarthworkTable.py:59, 181` | `factors.get(kind) or factors["soil"]` | 저장 암 종류 → 환산계수 C | ❌ | **토사 계수로 조용히** |
| B06 `UI_Cross_Design.ts:80-84` · `Router_Design.py:189` | 「암」이면 모두 ripping_rock · 기본값 ripping_rock | 지반유형 저장 | ❌ | `FP-09-03-02``FP-09-04` 갈림 |
| `B08_Quantity_UI_Page.ts:408-431` · `Router_Earthwork.py:141-142` | 「암」·「토사」 · 암 갈래 이름 키 | 입력 칸 · `rock_ratios_pct` 키 | ❌ | 세트 바꾸면 고아 |
| ✔ `Mapping:243-257` · `MAP.structure[]` | `type_id` | 구조물 → 공종(영문 id 가 공종 대리) | ❌ | unmatched |
| `REV:29-32, 63-85, 160, 263` | 돌쌓기(찰)·돌붙임(메)·「돌」·`spillway == "없음"` | 옵션값 → 계수·차감 | ❌ | 「없음」 외 글자면 **차감됨** |
| `UQ:97, 134, 221, 479, 519, 695` | 야면석·호박돌 · 성토/절토 · 찰/메 · 「40~60」 | 옵션값 → 표 키 | ❌ | 기본값 · 물결표 불일치 |
| B06 `Engine_Structures_Wall.py:33-39``common_util_structure_walls.ts:56-62` | type_id → 돌쌓기(찰)/(메) · TS `includes("찰")` | 벽 높이 한계 | ❌ | 큰돌쌓기가 bond 무관하게 「메」 |
| B05 `STJ` `pipe_kind`·`bond`·`foundation`·`inlet_type`·`wing_wall_type` | 한글 옵션값 | B08 로 가서 코드·갈래가 됨 | ❌ | 위 각 줄 |
| B05 `Structures_Schema.py:120-122` · `Engine_Sections.py:198-207` · `Structures_Migration.py:53, 64-78` | 측점 이름표 `"{관종} D{관경}"` · 한글 이름 집합 | 측점 식별 | ❌ | 이관 누락 |
### 3-4. 공종 밖 문자열 — 사유·상태 문구가 판정 키 (5)
| 자리 | 문자열 | 무엇을 가르나 |
| --- | --- | --- |
| ✔ `Rows:295-304` `blocked_of` | 「입력되지 않았습니다」·「자료에 없습니다」·「산출식이 아직 없습니다」 | 사람 말 문구 조각 → 막힘 갈래 |
| `Prep:629-630` · `Engine_Preparation_Status.py:3-13` | `status == "값 있음"` | 한글 표시 문구가 상태값 |
| B09 `UI_Page.ts:318-319` | `note === L("…Adopted")`(채택) | 서버 문구 → CSS (곁에 `key` 있음) |
| B05 `STJ:490` · `RM:73-76` · `common_util_structure_lengths.py:73` | `design_owner == "횡단 설계"` | 한글 문구가 건너뛰기 깃발 |
| B07 `Engine_Cad_Table.py:24-58` → manifest `quantity_table(s)` | 깍기·편책·노면다짐… | **읽는 곳 없음**(막다른 길) |
### 3-5. 자원 이름 — B09 자원 축 (11)
품셈 칸에는 코드가 없어 **이름 잇기가 불가피한 자리**가 대부분임. 「곁에 코드」가 ✅ 인 줄만 고칠 거리.
| 자리 | 무엇 | 곁에 코드 |
| --- | --- | --- |
| `RAX:124-143, 321-350` | 품셈 칸 → 공백 지운 이름 색인 → 카탈로그 코드(규격은 동률 깨기) | 불가피 |
| `B09 MachineProductivity.py:158-185` | 기계 별칭 → 이름 포함 → 궤도 낱말 → 용량 | 불가피 |
| `B09 ResourceAxis_Transposed.py:278-302` | 뭉친 칸 `startswith` | 불가피 |
| `B09 MachineProductivity_Reference.py:233-255` | 「대형브레이커(㎥/hr)」 부분문자열 | 불가피 |
| `B09 MachineProductivity_Dozer.py:205-211` | `"습지 불도저"`·`f"불도저({궤도})"` 조립 후 `==` | △ 코드표로 대체 가능 |
| `B09 ResourceAxis_ChooseOne.py:148-151` | 같은 이름 다른 규격 감지 | △ 코드 앞머리 |
| `UP:157, 290-293` | 브레이커·리퍼·집게 낱말 → 부착장비 | ✅ 코드 앞머리가 `:205` 에 이미 있음 |
| `UP:647-661` | 카탈로그 기계 이름 ⊂ 줄 이름 | 불가피 |
| `B09 MachineOperating.py:46, 157-169` | 덤프트럭·트럭·트레일러 → 운전 직종 | ✅ 기계 코드 앞머리 |
| `B09 Lists_Sources.py:159-164` | 건설기계운전사… 이름 → A10 표 | ✅ 노임 1048/1049/1050 |
| `RAX` `ResourceCatalog.aliases` | **읽어 오고 안 씀** | — |
---
## 4. ② 흩어진 별칭
### 4-1. 지반 갈래 어휘 — **8벌**
| # | 어휘 | 쓰는 자리 |
| --- | --- | --- |
| 1 | `soil` · `ripping_rock` · `blasting_rock` | B06 `Section_Schema.py:44` · `config_system_design.py:335-339` · `Trench:58` |
| 2 | 토사 · 리핑암 · 발파암 | `MAP.earthwork` · `ESum` · `HSUM:41` · `Spoil:57` · `B08_Quantity_UI_ConversionFactors.ts:39-43` |
| 3 | `ea` · `rr` · `br` (`_m3`) · EA/RR/BR | `HSUM:41` · `Spoil:57` · `Router_Earthwork.py:189` · `common_util_mass_haul_balance.ts:414-423` · locale |
| 4 | 암절취 · 발파암 (품셈 절 이름) | `MST` 9-12·10-12·9-13 잎 · **`UQ:1399-1403`·`HIN:130` 은 ripping_rock → 「암절취」** (1·2벌과 충돌) |
| 5 | 파쇄암 (품셈 10-11 f 표) | `UP:478-480` · `MAP.ground_aliases` · `Dozer` |
| 6 | 풍화암 · 연암 · 보통암 · 경암 · 「암」 | `config_system_design.py:389-392` · `common_util_project_settings.py:57-61` · `ESum:96` |
| 7 | `ripping` · `blasting` (시공법) | `Mapping:122` |
| 8 | 암석 (품셈 E 표) | `Dozer:343-355` |
**기본값도 갈림** — B06 `Router_Design.py:189` ripping_rock · `B06 Engine_SpoilFill.py:195` soil · B07 `Router_Support.py:352` soil · `Engine_EarthworkTable.py:42` ripping_rock.
### 4-2. 공종 이름 별칭 — 19묶음
| 같은 것 | 이름들 (자리) |
| --- | --- |
| 흙깎기 | 흙깎기(`ESum`) · **깍기**(B07 `Engine_Cad_Table.py:32`, 오기) · 절토(locale) · 토사깍기(`MST` 9-3) |
| 측구터파기 | 측구터파기 · 측구(B07) · 측구(옆도랑) · 옆도랑 · `ditch_side`**갈래 수 답 대기** |
| 성토 | 성토 · 쌓기(B07) · 노체포설(`MST` 9-16-1) · `embankment`·`fill_area_m2` |
| 노면다짐 | 노면다짐(B07) · 노면고르기(실무) · 노체다짐(9-16-2) — **B08 줄 없음 · 답 대기** |
| 초류종자살포 | 초류종자살포(성토면/절토면) · 성토파종/절토살포(B07) · 법면보호공(종자파종) · 「초류종자 살포」 · 씨앗뿜어붙이기(`MST` 5-24) · `seed_spray_*`·`slope_protection` |
| 지장목제거 | 지장목제거 · `tree_removal` · `obstacle_removal` · 뿌리뽑기+잡관목제거(실무 두 줄) |
| 층따기 | 층따기 · `benching` · `bench_cut` |
| 면고르기 | 면고르기 · `grading_*` · `face_dressing` |
| 제근 | 제근 · `grubbing` · 제근·뿌리다듬기 |
| 운반 | 무대(종방향유용토)/도자운반/덤프운반(`ESum:238`) · `free_haul`/`dozer`/`dump_truck` · 종무대/**도쟈**/덤프(locale 오기) · 불도저 운반/덤프 운반(`MST`) · **「dozer 운반」**(인계 줄 이름 `Rows:237`) |
| 사토장 | 사토장 · 유용토운반작업장(구 사토장) · `spoil_bank`/`spoil_fill` · 사토 |
| 레미콘 | 콘크리트 · 레미콘 · 레디믹스트 · `ready_mixed` |
| 집수정 | 집수정(`MAP:185`) · 유입부 집수정(`UQ:1223`) · 배수관 유입부 집수정(`Wording.py:29`) |
| 가설창고 | 가설창고(컨테이너)(`MAP`·`Ancillary`) · 가설창고(개소)(locale) |
| 기슭막이·대피로 | 기성막이(옛) ↔ 기슭막이 · 대피로 ↔ 대피소 — py·ts 두 벌(`Structures_Migration.py:44` · `B05_Profile_UI_Page.ts:96`) |
| 배수관 | 배수관 · 배관 · 배수시설 · `"{관종} D{관경}"` · 관종 흄관/VR관/파형강관 ↔ config 이중벽관/삼중벽관/파형강관(`Section_Common.ts:69` 는 config 이름만 앎) |
| 돌쌓기 | 돌쌓기(찰/메) · 돌(찰/메) · 돌붙임(찰/메) · 찰/메쌓기 — `includes` 로만 붙음 |
| 규준틀 재료 | 각재 50×50 ↔ 각재 · 판재 T12 ↔ 판재 (할증표 이름과 안 맞음) |
| 철근 | 철근 현장가공 및 **조립**(`MAP`) ↔ **조림**(`MST` FP-12-03, 원문 오기) · 이형철근 D13/D16 ↔ 이형철근 |
### 4-3. 별칭 사전·이름표 자리 — 11곳
| # | 자리 | 무엇 | 비고 |
| --- | --- | --- | --- |
| 1 | `MAP.ground_aliases` | 리핑암 → 파쇄암·암절취 | 공식 |
| 2 | `UP:478-480` `VARIANT_ALIASES` | 리핑암 → 파쇄암 | 1과 다름 |
| 3 | `Handoff.py:170` `ground_class_aliases` | 1을 인계본에 실음 | **B09 안 읽음** |
| 4 | `B09 MachineProductivity.py:53-59` | 유압식백호우·백호·굴삭기 → 굴착기 | BACK-HOE·B/H 없음 |
| 5 | `B09 ResourceAxis_UnitBasis.py:50, 111` | (FP-13-02-04, 인부) → 보통인부 | 코드 범위 있음 ⭕ |
| 6 | `B09 MachineProductivity_Reference.py:36, 92-93` | 용수 → 육상 | 이름 고쳐 쓰기 |
| 7 | `MAT:234-237` | 이형철근 D13/D16 · 콘크리트류 → 할증표 이름 | D 규격 둘뿐 |
| 8 | 운반 이름표 — `ESum:238` · `SummaryGrid.ts:85-89` · locale · B07 `Engine_Cad_MassHaul.py:100-104` | 4벌 | |
| 9 | 지반 이름표 — `HSUM:41-43` · `Router_Earthwork.py:189` · `ConversionFactors.ts:39-43` · `UQ:1399-1403` · `HIN:130` | 5벌, **값이 서로 다름** | |
| 10 | 구조물 이름표 — `STJ name` · `Wording.py:22-38` · `B05 Page_Helpers.ts:239-245` · `B07 Engine_Cad_Plan.py:74-78` · `Box_Panel.ts` · `Ford_Panel.ts` · locale | 6벌 이상 | |
| 11 | 관급·타설 이름표 — `MAT:70-83``MatGrid.ts:216-226` · `UI_Page.ts:223-227` ↔ locale `:727-729` · `masonry_class` JSON ↔ `MAP` bond_codes | py·ts 두 벌씩 | |
### 4-4. 정규화 규칙 사본 — 4계열
| 계열 | 사본 | 어긋남 |
| --- | --- | --- |
| 물결표·붙임표 | `RAX:152`(단일 정본이라 선언) · `B09 FactorChoices.py:43` · `B09 MachineProductivity_Reference.py:56` · `ThreeAxis.py:52` · `MachineOperating.py:138` | `FactorChoices``` 빠짐 · `Reference```·`` 빠짐 · 붙임표를 범위로 보는 곳과 뺄셈으로 보는 곳이 갈림 |
| 공백 제거 | 약 15곳 | `split()`(모든 공백) ↔ `replace(" ", "")`(ASCII 공백만) 두 방식 |
| 단위 표기 | `Engine_BasisUnit.py:27-37` · `BoQR:452-470` · `ResourceAxis_UnitBasis.py:44` · `MachineProductivity.py:191` · `ResourceAxis_Sources.py:160, 179` | 5벌. `MAT`·`ObservedUnit` 은 BasisUnit 안 씀. kg/㎏ 둘 다 쓰임 |
| 계수 기호 k·f·E·Cm | `Reference.py:39-47` = `FactorChoices.py:46-54` · `MachineProductivity.py:45-48` | 3벌 |
### 4-5. 매핑표 밖에 박힌 공종 코드 — 두 번째 코드 장부
| 자리 | 코드 |
| --- | --- |
| `Prep:174, 189, 199, 291, 314, 317, 368, 388, 441, 443, 533, 553` | FP-09-15 · 09-21 · 08-11 · 14-02 · 09-20-02 · 10-12 · 11-02 · 11-03 |
| `Preparation_Ancillary.py:59` | FP-11-01 (`MAP` 과 두 벌) |
| `resources/data_masonry/masonry_class_2026-01-01.json:46-53` | FP-13-06-01/02 (`MAP` 과 두 벌) |
| B09 `Transport.py:41-60` · `BasisSheet.py:146` | FP-10-04 (+ 지어낸 갈래 `#트레일러20ton`) · 146 은 상수 대신 글자 |
| B09 `KnownGaps.py` · `FactorChoices.py:198-234` · `Compaction.py:48-71` · `WorkItemUnit.py:147-164` | 원문 [주] 를 코드 키로 옮겨 적은 곁표 |
---
## 5. ③ 품셈에 코드가 없는 공종
갈래 칸은 **후보 제안**임(명세 §2 ② `AX-ST`·`AX-WK` 기준). 확정은 브레인·사용자.
### 5-1. 품셈 밖 공종 — `AX-WK` 후보 (11)
| 공종 | 지금 식별 | 자리 |
| --- | --- | --- |
| 지장목제거 — 뿌리뽑기 · 잡관목제거 | 이름 · 코드 None · `pending_user`(FP-04-01/02/03 후보) | `ESum:181-215` · `Prep:121-142` · `MAP:239-246` |
| 도수로·산비탈수로 (`chute`) | type_id · `pending_user` | `STJ:608` · `MAP:256` |
| 절토사면 배수로 (`slope_drain`) | type_id · `pending_user` | `STJ:640` · `MAP:262` |
| 노출형 횡단수로 (`cross_drain_exposed`) | type_id · 매핑 없음 | `STJ:451` |
| 콘크리트 포장 (`pavement_concrete`) | type_id · 매핑 없음 | `STJ:2347` |
| 편책 | B07 표 칸만 · 「별도 일위대가 필요」 | B07 `Engine_Cad_Table.py:48` · `Cross_Quantity.py:28` |
| 노면다짐 | B07 표 칸만 · B08 줄 없음 · 답 대기 | B07 `Engine_Cad_Table.py:57` |
| 국가지점번호판 · 임도 안내판 · 차단기 · 수방대책 자재 | `key` + 이름 · `code None` | `Preparation_Ancillary.py:24-73` |
### 5-2. 구조물 — `AX-ST` 후보 (17)
| 구조물 | 지금 식별 | 자리 |
| --- | --- | --- |
| 옹벽 | `composite` 묶음(조각은 FP) | `MAP:273-328` |
| BOX암거 · 세월교 · 소형사방댐 · 소단 | type_id · 매핑 없음 | `STJ:205, 339, 1803, 1481` |
| 기슭막이 · 골막이 · 흙막이 · 개거 · 바닥막이 | type_id · **원단위는 서는데 코드 없음** · 사유 문구 낡음(「원단위 없음」) | `UQ:1149-1168` · `Prep:586-597` |
| 관보호공 날개벽 | type_id · 매핑 없음 | `UQ:1146, 1224` |
| 대피소 · 작업장 · 회차로 · 가드레일 | type_id · 「quantity」 보기만 있음 | `STJ:2042, 2071, 2098, 2140` |
| 사토장 · 토취장 | type_id · 매핑 없음 | `STJ:2198, 2258` |
### 5-3. 코드는 있는데 줄에 안 붙거나 금액이 안 서는 것 (9)
| 공종 | 까닭 | 자리 |
| --- | --- | --- |
| 흙깎기·측구터파기 암(풍화암·연암·보통암·경암) | 시공법(리핑/발파) 미지정이면 코드 None | `Rows:49-61` · `MAP:248-254` |
| 흙깎기(리핑암) · 덤프 운반 · 표토제거 | 부모 코드 → 일위대가 제목 없음 | 1-2 |
| 뿌리 운반 | `FP-10-12` 부모 + **갈래 없음** | `Prep:376-389` |
| 표토 운반·적치 | 대기 상태일 때 코드 None, 값 서면 FP-10-12 — **코드가 상태에 따라 바뀜** | `Prep:406-441` |
| 뿌리 적재 | `FP-09-20-02` 인데 단위 ㎡ ↔ 원문 10주당 | `Prep:357-369` |
| 구조물터파기 | 용수 미입력이면 부모 `FP-09-13` | `Trench:246-264` |
| 물넘이포장 | `FP-12-06` 밑수가 「일당」(작업조형) · `thickness_cm` 옵션이 레지스트리에 없음 | `MAP:188-191` · `UQ:1141` |
| 노체다짐 `FP-09-16-02` | 줄로 안 셈 — 답 대기(PLAN 5장) | `MAP:65` |
| 돌붙임(골막이·바닥막이 안) | `FP-13-05-01/02` 가 마스터에 있으나 **매핑 없음** · 성분 이름으로만 감 | `REV:287-288, 552` |
### 5-4. 공종이 아닌 것 — 설계상 코드 없음 (참고)
- **내역에 안 서는 줄**: 무대(`MAP:147-151` null) · 보정량계 · 잔토처리(`Trench:307-317`) · 입적·석적(`UQ:942-981` reference) · 사방 시설 「해당 없음」 줄(`Prep:574-585`)
- **자원·자재 축**: 채집석(haul_deduction) · 모르터(unit_price, 코드 없음) · 고임돌·막자갈·깬돌·물구멍관 · 자재총괄 전 줄
- **B09 금액 줄**: 법정경비 14종·안전관리비·관급자재대·폐기물처리비 — 영문 `key`(`B09 Statutory.py:59-105` · `Engine_Cost.py:314-521`)
- **B09 지어낸 코드**: `M-FUEL-경유`(`UP:72`) · `X-<코드>#조합`(`UP:354-376`) — 명세 §2 ①에 `#조합` 은 있음, `M-FUEL-*` 은 없음
---
## 6. B07 — 조사 결과 요약
- **횡단도 아래 표**(`Engine_Cad_Table.py:24-58`)는 **B07 만의 이름**(깍기·측구·쌓기·편책·노면다짐·사토장)이고 코드 없음
- 층따기·면고르기·지장목제거·성토파종은 측점별 **사면 길이**를 읽음 — B08 집계(측점 사이 면적·반영률)와 **다른 값**
- 표토제거·편책·제근·노면다짐 칸은 `source["quantities"]` 를 읽는데 **그 키가 없어 늘 빈칸**(`Router_Support.py:288, 298-299`)
- **표준도**(3장 이관 대상)는 B08 `build_unit_table` 을 그대로 부름 — **계산 중복 없음**. 제목은 레지스트리 `name`, 줄 이름은 B08 성분 이름
- **CAD 편집값**은 확정 때 manifest 에 저장되나 **읽는 곳 없음**(`Router.py:430-449` · `Router_Support.py:645-649`)
---
## 7. 곁에서 드러난 것 — 이름 때문에 값이 조용히 빠지는 자리
조사 범위(이름 잇기)에서 드러난 **결함 후보**. 고치지 않았음.
| # | 자리 | 무엇이 빠지나 | 확인 |
| --- | --- | --- | --- |
| 1 | `REV:361, 481, 511, 584` | 개거·흙막이의 유로폼·면목·이형철근 D13·떼가 `DESTINATION` 에 없어 축 「quantity」 → **자재총괄에서 빠짐**, 건너뛴 수는 화면에 안 뜸 | ✔ 소스 |
| 2 | `RM:265` | 준비공 줄 이름이 「…규준틀」로 안 끝나면 **규준틀 자재 전부 빠짐** | ✔ 소스 |
| 3 | `UQ:1488` | 「버림콘크리트」 이름이 다르면 **기초잡석 줄 사라짐** | ✔ 소스 |
| 4 | `MAT:325` | 할증 조건을 안 넘김 → 레미콘 늘 무근 율 · 철근 복잡 율 안 붙음 | ✔ 소스 |
| 5 | `BoQR:31-36` | 운반 단가를 **줄 이름**으로 찾음 — 토사·리핑암 줄 이름이 같아(「dozer 운반」) 첫 줄 단가로 무대 검산 | ✔ 소스 |
| 6 | `Prep:441-447``UP:499-503` | 표토·덤프·사토 운반 **금액 없음**(`FP-10-12` 제목 0) | ✔ 실행 |
| 7 | `Engine_EarthworkTable.py:59, 181` | 모르는 암 종류면 **토사 환산계수**로 조용히 | 도우미 조사 |
| 8 | `REV:263` | `spillway` 가 「없음」 외 글자면 관 단면을 **차감** | 도우미 조사 |
| 9 | `Engine_ObservedUnit.py:117-131` | 관측표 단위가 m·㎡ 가 아니면 **×1 개소**로 | 도우미 조사 |
**범위 밖이나 무거운 것 하나** ✔ 소스
B07 도면 확정(`Router.py:455-495``Router_Support.py:666-692`)이 B06 `compute_cross_design`
**지반유형·단면유형·측구위치·곡선확폭만 넣고 다시 돌려** `cross_sections` 설계에 **덮어씀**.
암반 경계(`rock_boundary_offset_m`)·표준값·사토 성토·소단·측구 형식·포장·절토 경사가 빠짐 →
**B08 이 읽는 토사/암 나눔·측구 나눔·사토 공제가 확정 순간 바뀔 수 있음**. 수치 재현은 안 함.
---
## 8. 1장 다음 일감에 넘기는 것
| 1장 일감 | 이 조사에서 넘길 것 |
| --- | --- |
| 별칭표를 한 파일로 | 4-3 의 11곳 · 4-1 의 8벌 · **「코드 범위」 칸**(1-3) |
| B08 ↔ B09 문자열 → 코드 | 3-1 의 12자리 · 3-3 의 `BoQ:507-510`·`BoQR:31-36`·`QuantityDigits` · **부모 코드 판정**(1-2) |
| 못 맞춘 줄 줄이기 | 기준 수치는 **508**(1-1) · 271 만 목록으로 풀림 · 167 은 표 읽기 |
| 이중계상 경계를 축으로 | 1-5 콘크리트 두 벌 · `UQ:1363-1374` 알리기뿐 · 3-2 성분 이름 막이 |
| `undetermined` 판정 | 지금 코드 기준 **73표**(명세 75) |