Commit Graph
1658 Commits
Author SHA1 Message Date
eomsangdon 7291a98471 Merge PR #14 - fix(tester): 옮긴 시험이 옛 경로 부르던 것 바로잡음 2026-09-09 18:28:07 +09:00
eomsangdon 9f6082452e Merge remote-tracking branch 'origin/main' into main_laptop_1 2026-09-09 18:23:53 +09:00
eomsangdonandClaude Opus 5 265ba8352e fix(tester): 옮긴 시험이 옛 경로(tmp/tests)를 부르던 것 바로잡음
시험을 `resources/tester` 로 옮긴 뒤 **한 건이 실패**하고 있었음 —
`test_preview_cost` 가 짝 파일을 `tmp.tests.…` 로 불러 못 찾았음(옮긴 폴더에 없음).

- `from resources.tester.test_preview_assets import …` 로 고침
- 실행 안내 문구 셋도 새 경로로(`diag_structures` · `helper_b06_fill_slope_length` ·
  `test_common_util_crs`)
- 정책 시험 설명은 **사실이 바뀌었으므로** 고쳐 적음 — 「git 밖이라」가 아니라
  「옮겨서 함께 건너가되, 까닭은 여전히 값 옆(정본)에 두는 것이 옳다」

`resources/tester/` 1183 통과 / 22 건너뜀 / **실패 0**.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 18:23:46 +09:00
eomsangdon 46795d1f18 chore: 네 창 작업 269건 main 반영 (2026-09-09) (#13) 2026-09-09 18:21:26 +09:00
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록)
- `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록
  — 창끼리 공유하되 저장소에는 안 올리는 장부
- 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠)
- graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 18:19:07 +09:00
eomsangdonandClaude Opus 5 d7cb14f416 test(B08): tmp/tests 중 tester 에 없던 47 개를 resources/tester 로 옮김
tmp/ 가 창끼리 안 건너가는 것이 확정돼(랩탑이 시간 두고 두 번 확인) 시험·예외가
저절로 건너가도록 git 안으로 옮김. 사용자 확정.

- 내용은 하나도 안 고침 — 자리만 옮김. tmp/tests 는 남겨 둠.
- 같은 이름이 이미 있던 64 개는 랩탑 것을 그대로 두고 건너뜀.
- helper_b05_*.js 둘은 랩탑이 .cjs 로 이미 올린 것과 **줄바꿈만 다른 같은 내용**이라
  복사본을 도로 뺌(시험이 .cjs 를 부름).
- resources/tester/ 에서 전체 1176 통과 · 29 건너뜀 · 실패 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 17:15:57 +09:00
eomsangdon a5eb559f3d Merge remote-tracking branch 'origin/sub_laptop_1' into main_desktop_1 2026-09-09 17:13:14 +09:00
eomsangdon 9f4610ff53 Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-09 17:13:12 +09:00
eomsangdonandClaude Opus 5 0ef32b5279 chore(tester): 시험을 resources/tester/ 로 옮김 — 창끼리 건너가게
⚠ **뿌리** — `tmp/` 는 창 사이에 안 건너감(실측 확인: 상대 창이 놓은 `tmp/_sync_probe.txt`
가 시간을 두고 두 번 봐도 안 보임). 그래서 **정본(등록부 스키마)만 건너가고 그것을 읽는
시험은 안 건너가** 오늘 두 번, 같은 시험이 **연 창은 통과·받은 창은 실패**가 됐음.

- `tmp/tests/*` 를 `resources/tester/` 로 **복사**(127 파일). 내용은 **한 줄도 안 고침**
- `tmp/tests` 는 **남겨 둠** — 되돌릴 자리(사용자 지시)
- 실행: `./venv/Scripts/python.exe -m pytest resources/tester/ -q`
  옮기기 전과 **같은 수**: 617 통과 / 22 건너뜀 / 실패 0

⇒ 이제 시험·예외·까닭이 **정본과 함께** 움직임. 오늘 세운 「예외는 정본 스키마에」와 짝임.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 17:12:30 +09:00
eomsangdon 7d1e0c36d4 Merge remote-tracking branch 'origin/sub_desktop_1' into sub_laptop_1 2026-09-09 16:11:47 +09:00
eomsangdon bfae84aa0e Merge remote-tracking branch 'origin/main_laptop_1' into sub_laptop_1 2026-09-09 16:11:46 +09:00
eomsangdon f7dfa57e8f Merge remote-tracking branch 'origin/main_laptop_1' into sub_desktop_1 2026-09-09 15:38:56 +09:00
eomsangdon 186ae4911c Merge remote-tracking branch 'origin/main_desktop_1' into sub_desktop_1 2026-09-09 15:38:54 +09:00
eomsangdon 5e8acb1312 Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-09 15:38:44 +09:00
eomsangdon fe8a30c31f Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-09 15:38:42 +09:00
eomsangdonandClaude Opus 5 799e0b1e79 feat(B09): 확정 5차 — 제근 밑수를 건설품셈에서 빌려 옴 (÷1,000 환산 포함)
사용자 확정 5차 6번 「제근 밑수 — 면적 축. 건설품셈 3-9-2 「1,000㎡당」을 빌려 씀」.

- `WorkItemUnit.BORROWED_UNITS` 신설 — **사용자가 정한 자리만** 담음. 우리가 골라 채우는
  표가 아님. 값과 **근거 문구를 한 자리에** 둠(⚠ 교차 참조 표시 — 임도 전용 품이 있는데
  건설품셈을 쓰는 것이라 화면이 그 사실을 밝혀야 함)
- ⚠⚠ `BORROWED_BASIS_PER` — **「1,000㎡당」이라 ÷1,000 환산**. 단위만 「㎡」로 달고 값을
  그대로 두면 **금액이 천 배**가 됨. 단위와 배수를 한 자리에 두고 시험으로 못 박음
- ⇒ 제근 여섯 갈래에 밑수가 붙어 단가가 섬 — 굴착기 0.7㎥·소림 **55.4원/㎡**

⚠ **자릿수가 견준 값과 어긋남을 사유에 함께 적음** — 실무 영월 「뿌리뽑기」는 475원/㎡ 이고,
빌려 온 3-9-2 는 같은 1,000㎡당에 굴착기(0.2㎥) 3.76hr 로 산림품셈 9-21 의 0.80hr 보다
4.7배 큼. **100㎡당으로 보면 실무와 자릿수가 맞음.** 값은 확정대로 두고 **어긋남을 보임** —
지어내지도, 조용히 넘기지도 않음.

검증: pytest 311 통과(신규 4)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:22:10 +09:00
eomsangdonandClaude Opus 5 5cc5329cac fix(B06): 자동과 같은 측구 선택은 「자동」으로 풀림 — 다시 굳지 않게
화면 토글이 **2단**이라 「자동으로 되돌리기」 단추가 없음. 되돌리려면 원래 값으로 다시
누르는 수밖에 없는데, 그것을 선택으로 굳히면 **방금 고친 병이 그대로 되돌아옴**
(지형이 바뀌어도 안 따라감).

⇒ 선택이 자동값과 같으면 **선택 없음(자동)** 으로 본다. 파이썬·TS 짝 양쪽.
시험 하나 추가 — 「자동과 같은 선택은 자동으로 푼다」. 전체 617 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:18:21 +09:00
eomsangdonandClaude Opus 5 ac8e8f1e59 fix(B08): 물량 0 인 구조물을 내역에서 뺌 — 0 원 줄이 만들어지던 자리
물넘이포장이 면적을 못 받아 「0.0 ㎡」로 내역에 서고 있었음. 코드가 붙어 있어
0 원 줄이 만들어지고 화면에는 값이 있는 줄로 보임 — 0 은 「없음」과 구별이 안 됨.
줄은 그대로 넘기되 in_bill False + 까닭(원단위 사유 그대로) + input_missing 로 둠.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:13:54 +09:00
eomsangdonandClaude Opus 5 01c96e9a11 fix(B06): 측구 「선택」과 「결과」를 가름 — 한 번 저장되면 자동이 안 돌던 자리
⚠⚠ 한 칸(`ditch_enabled`)에 **두 뜻**이 담겨 있었음.
결과(실제 섰나)를 그대로 다시 입력으로 넣어 읽었으므로 **한 번 저장되면 자동 판정이
영영 다시 안 돌았음.** 계획고를 내려 절토가 생겨도 측구가 안 서고 **아무 말도 안 나왔음.**

- **선택** `ditch_choice` (없음 = 자동) · **결과** `ditch_enabled` (실제 섰나)로 가름
- 자동 판정을 **먼저** 하고 선택을 그 위에 얹음. 양성 단면은 선택보다 기하가 먼저
- ⚠ **옛 저장분은 자동값과 다를 때만 선택으로 살림** — 같으면 자동이 그렇게 냈던 것이고
  다르면 사용자가 일부러 바꾼 것임. 설계 의도를 잃지 않으면서 굳은 값을 푼 것
  (오늘 `length_m` 에서 겪은 「저장분이 걸린 자리」를 같은 방식으로 처리)
- 화면 카드는 이제 **선택**을 읽어 상태를 세우고, 표시는 **결과**를 보임
- 파이썬·TS 짝 양쪽 + 호출부 여섯 곳(재계산·저장·확정·사토장·요청 스키마)

시험 다섯 추가 — 「결과를 다시 넣어도 자동이 계속 돎」이 그 잠금. 전체 616 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:10:47 +09:00
eomsangdonandClaude Opus 5 e71147c1b2 fix(B08): 코드 없는 줄에 막힘 표시를 붙임 — 금액이 조용히 빠지던 자리
랩탑 메인이 화면에서 잡음: 「측구터파기 · 굴삭기+브레카」가 work_item_code null
인데 blocked_kind 도 null 이라 아무 말 없이 금액만 빠졌음.

인계본의 bill_flag_warnings·unmatched_work_items 에는 이미 실려 있었음 —
목록은 있는데 줄에 표시가 없었던 것. 줄 단위로 보는 쪽(B09·화면)은 목록을 안 봄.
같은 모양이 여덟 줄이었음(흙깎기·측구터파기·도자운반 둘·덤프운반 둘·지장목제거·큰돌쌓기).

- 토공 줄: 코드가 없으면 시공법 미지정이면 input_missing, 매핑을 못 이었으면
  unit_data_missing 으로 갈라 답. 다음에 할 일이 다름(사용자 입력 vs 매핑 작업).
- 운반 줄: 같은 규칙. 무대(free_haul)는 품에 포함이라 안 세우는 것이지 막힌 게
  아니므로 표시를 안 답.
- 불변식 시험을 세움 — 코드도 막힘 표시도 없이 내역에 서는 줄이 하나라도 있으면 깨짐.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:10:22 +09:00
eomsangdonandClaude Opus 5 072f560a59 fix(B08): 옹벽 묶음 감사 둘 — 구조물 이름 코드값 노출 · 터파기 빠진 줄이 안 보이던 것
- 레지스트리 이름이 없으면 내역 줄 이름에 코드값이 그대로 떴음(`retaining_wall`).
  _Wording.type_label 이 이미 대비표를 들고 있으므로 그것을 씀 — 이제 「옹벽」으로 섬.
- 관측 원단위로 가는 구조물은 표에 터파기 줄이 없으면 그 구조물만 조용히 빠졌음.
  옹벽이 터파기 0 줄인데 사유도 안 났음(돌쌓기는 세 줄이 섬). 값을 지어내지 않고
  「터파기가 안 선 구조물」 줄을 in_bill False · blocked_kind unit_data_missing 로
  세워 빠졌다는 사실이 보이게 함.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:06:06 +09:00
eomsangdonandClaude Opus 5 036da3f9f9 refactor(B08): 인계 줄 파일 700줄 분리 — 준비공·배수관·연장·자재를 _Rows_Prep 로
777줄이던 _Handoff_Rows 를 565 + 255 로 가름. 줄의 모양은 안 바뀜 —
갈라낸 넷을 본체에서 다시 내보내 부르는 쪽 import 도 그대로임.
상태 낱말은 _Preparation_Status 한 벌에서 읽음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:00:21 +09:00
eomsangdonandClaude Opus 5 5b97f280ba fix(B08): 표토 원문 대조 셋 + 준비공 파일 700줄 분리
원문·실무 대조에서 나온 것:
- 품셈 9-15-2(답외구간) 원문에 T(표토두께) 0.2m · L(운반거리) 20m 가 적용값으로
  박혀 있음. 종전 사유 「품셈이 정하는 값이 아닙니다」가 반쪽이라 정정 — 값을
  자동으로 넣지는 않되 원문에 있는 값을 없다고 말하지도 않음.
- 그 품에 20m 압토가 이미 들어 있음. 실무 내역서(영월 2024)도 「표토제거 답외구간
  / M2 · 도자 19Ton · D=20」 한 줄뿐이고 운반 줄이 따로 없음. 우리 운반 줄은
  20m 를 넘는 몫일 때만 새 줄인데 그 가름을 아직 안 함 — 사유로 남김.
- FP-10-12(덤프 운반)은 부모 코드라 품이 없음. 잎은 토사/암절취/발파암이고
  갈래를 안 보내면 B09 가 후보만 보이고 금액이 안 섬. 표토는 토사이므로
  variant_axis=ground_class · variant_value=토사 로 실어 보냄. 준비공 줄이
  갈래를 넘길 통로도 함께 엶(종전에는 늘 None).

파일 분리(700줄 제한):
- 부대시설 다섯 줄을 _Preparation_Ancillary 로, 상태 낱말을 _Preparation_Status 로
  가름. 상태 문자열은 받는 쪽 판정에 쓰이므로 두 벌이 되지 않게 한 벌만 둠.
  710줄 → 622 + 113 + 16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:58:02 +09:00
eomsangdonandClaude Opus 5 f569cb8498 fix(B06): 화면 실측으로 잡은 사토장 흠 둘 — 지운 뒤 남던 값 · 가짜 경고
⚠ **시험만으로는 안 잡히던 자리임.** 실제 프로젝트에 사토장을 놓고 눈으로 본 뒤 잡음.

① **사토장을 지워도 값이 남음** — `enforce_spoil_fills` 가 **얹기만** 해서, 구조물을
   지운 뒤에도 저장분의 `spoil_fill_*` 가 그대로 남아 횡단도에 계속 그려지고 면적표에도
   섰음. ⇒ 사토장이 덮지 않는 측점에 **값이 남아 있으면** 사토장 없이 다시 계산해 지움.
   노선 성토도 그때 원래 값으로 돌아옴(사토장 몫을 빼 두었던 것이 복구됨).
   ⚠ **칸이 있는 것과 값이 있는 것은 다름** — 설계 결과는 사토장이 없어도 `0.0` 을 늘
     실으므로 「값이 남은」 측점만 되돌림(`_has_spoil_value`)
② **말풍선에 늘 뜨던 가짜 경고** — 「⚠ 0.0㎥ 는 못 담음」. 폭을 이분법으로 찾아
   400 − 399.9937 = 0.0063 이 남는 것이라, 표시 자릿수에서 안 보이는 몫은 경고 안 함

실측(프로젝트 fa76c162) — 지운 뒤 사토장 0 · 용량 null · 노선 성토가 정확히
「지우기 전 + 옮겨 갔던 몫」으로 복구됨(100m 1.7563+4.9217=6.678 …).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:57:34 +09:00
eomsangdonandClaude Opus 5 dd25bb0e19 feat(B09): 관부설 사유에 「인력 품만」과 커플링밴드 숨은 값을 적음
배수관 네 줄이 금액으로 섰으나 그 값은 **인력 품만**임 — 파형강관·커플링밴드·
크레인(5ton)·모래부설이 아직 안 붙음. 까닭이 둘로 갈림:
  · 관·모래 — 원문이 「별산」·「설계수량」이라 한 자리
  · 크레인 — 기계 카탈로그에 없음(9-9 목록에 올림)

 원문을 대조하다 **숨은 값** 하나 나옴 — 커플링밴드는 표가 비었으나 [주]① 이
「**1EA/6m**」를 줌. 자재가 서면 m 당 1/6 EA 로 셀 수 있음(「필요시 별도 산정」 조건 하나 더).

ⓘ 원문 특이점도 계획서에 적어 둠 — 배관공이 ∅800 0.25 · ∅1000 **0.22** · ∅1200 0.41 로
**가운데만 작음**. 크레인·보통인부는 관경이 커질수록 늘어남. **원문 그대로라 손대지 않음.**

검증: pytest 307 통과 · ∅800 0.25/8.0 = 0.03125 로 열 순서가 맞음을 원문과 대조

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:54:20 +09:00
eomsangdonandClaude Opus 5 ef5b9536c0 feat(B09): 관경이 표 밖이면 **무엇을 정해야 하는지**까지 가리킴
「품셈 표에 그 관경이 없음」만 적으면 사용자가 **엉뚱한 것을 정하러 감** — 정할 것이
단가가 아니라 **시설 선택**일 수 있음.

- 관부설 품셈 표가 다루는 관경은 ∅800·∅1000·∅1200 뿐임을 사유에 적음
- Ø1,500 이상이면 임도기술교본 3장을 가리킴 — 「BOX암거 적용 — 수리계산상 배수관
  **Ø1,500㎜ 이상** 적용 유역」(`횡단배수관_암거 §5`)
- ⚠ **단정하지 않음** — 그 §5 는 **교본 기준이지 법령·행정규칙이 아님**. 프로젝트 규칙이
  「기본값은 현행 법령·행정규칙, 교본은 과거 참조」라 **가리키기만** 하고 사유에 그 사실을
  함께 적음

검증: pytest 307 통과 · Ø1500 두 줄에 그 문구가 뜸

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:44:27 +09:00
eomsangdon 4f115c5bdf Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-09 12:43:41 +09:00
eomsangdonandClaude Opus 5 f4f7136357 fix(B08): 준비공 축 감사 셋 — 면적 0 막음 · 표토 대상 어긋남 사유 · 규준틀 준용 표시
- 표토제거: 대상 면적 0 ㎡ 에 0 ㎥ 를 「값 있음」으로 내고 있었음. 0 은 「없음」과
  구별이 안 되고 받는 쪽이 「표토가 없는 노선」으로 읽음. 두께 미입력은 이미
  막고 있었는데 면적 0 만 통과하던 자리. 운반 줄은 제거를 밑수로 삼아 함께 막힘.
- 표토 대상 면적이 별표2 문언과 두 방향으로 어긋남 — 법은 「노면·절토대상지」인데
  우리는 절토·성토 사면적을 다 더하고 노면(연장 × 노폭)은 안 셈. 성토대상지는
  별표2 (7) 이 「제거·정리」로만 두어 운반·적치 의무를 안 검. 값은 그대로 두고
  사유로만 드러냄 — 실무 확인 사항이라 임의로 확정하지 않음.
- 비탈 규준틀 재료량이 「수평 값 준용」인 사실이 상수 주석에만 있고 화면 근거에는
  없었음 — 값이 서면 어디서 온 값인지 안 보이던 자리.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:42:46 +09:00
eomsangdonandClaude Opus 5 2972e4ccce refactor(B06): 횡단 설계 기하를 떼어 냄 — 924 → 522줄 (①/② 중 첫 조각)
TS 짝이 2026-09-04 에 이미 이 선으로 갈라 두었음(`common_util_cross_design_geometry.ts`).
**새로 긋는 선이 아니라 TS 에 있던 선을 파이썬에도 그은 것**이라 거울이 안 깨짐.

- `_SectionGeometry` + `_side_role`(TS `sideRole`) → `…_Engine_Design_Geometry.py`
- 안 옮긴 것 — 측구 방향 해석 · 지반 보간 · 사면 폐합 허용오차. **TS 도 본체에 둔 것들**
- 계산은 **한 줄도 안 바꿈**. 옮기기만 함

검증 — 거울 시험(횡단 설계선·단면적 두 쪽 대조) 통과. 전체 610 통과 / 22 건너뜀.
남은 것 — ② 표준값 해석·저장분 읽기 도우미 분리(522줄이라 급하진 않음).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:42:20 +09:00
eomsangdon 670310e3be Merge remote-tracking branch 'origin/sub_desktop_1' into main_laptop_1 2026-09-09 12:39:15 +09:00
eomsangdon d6e844104b Merge remote-tracking branch 'origin/main_desktop_1' into main_laptop_1 2026-09-09 12:39:15 +09:00
eomsangdonandClaude Opus 5 ed65eac74e feat(B08): 뒷채움 폭 근거 구간 밖이면 사유를 냄 — 높은 벽이 품셈 범위 아래로 감
정본 여섯 탭 전수 확인 구간이 H=1.0~3.0 인데 코드가 높이를 막지 않고
표준경사표는 직고 7m 까지 칸을 준다 — 높은 벽이 실제로 설 수 있음.
그 구간에서 막자갈 두께(= 물량 ÷ 비탈면적)가 0.375 ÷ √(1+경사²) 로 거의
붙박이라, 직고와 함께 두꺼워지는 품셈 13-4-4 [주]⑨ 범위보다 얇아짐
(H 3.0 0.359 안 · H 3.5 0.354 아래). 방향이 반대라 값만 보면 안 드러남.

값은 정본 식대로 세우고 막지도 눅이지도 않음 — 근거 구간 밖이라는 사실만
사유로 냄. 큰돌쌓기는 막자갈 줄 자체가 없어 이 갈림이 안 번짐.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:37:56 +09:00
eomsangdonandClaude Opus 5 36f47dcc8d feat(B05): 등록부 칸에 「비워 두는 것이 뜻」·「기본값의 까닭」을 값 옆에 적음
⚠⚠ **깨진 시험의 뿌리는 칸이 아니라 자리였음.** 정책 시험은 `tmp/tests` 라 **git 밖**이라
정본(추적됨)만 다른 창에 가고 예외 목록(추적 안 됨)은 안 따라감 ⇒ **다른 창에서만 깨짐.**
오늘 그 일이 두 번 났음. ⇒ **까닭을 값 옆(정본)에 두어 함께 움직이게 함.**

- 스키마에 칸 둘 신설
  · `empty_means` — **「비워 두는 것이 뜻인 칸」**(세 번째 갈래). 비면 계산 쪽이 기준값으로
    돌고 그 사실이 화면에 뜸. 값을 넣으면 그 값이 이김
  · `default_basis` — 기본값이 **도메인 확정값이 아닐 때** 그 뜻(「다단 없음」·「안 더함」).
    법정·확정 수치면 비워 둠 — 비어 있는 것이 「확정값」이라는 뜻
- 56곳에 까닭을 적음 — 전면 기울기 · 야면석 계수 · 채움 강도 · 비탈 기울기 · 물빼기 둘 ·
  개거 규격 · 뒷길이 · 돌 종류 / 단 수 · 올림 · 이동 · 조달 · 설치 측 · 추가 운반거리
- 정책 시험이 그 칸을 읽게 바꿈 + 까닭이 한 낱말이면 잡는 시험 둘 추가

⇒ 앞으로 등록부에 칸을 열 때 **예외 목록을 고치지 말고 까닭을 값 옆에 적을 것.**

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:37:50 +09:00
eomsangdon 007e016793 Merge remote-tracking branch 'origin/main_desktop_1' into sub_desktop_1 2026-09-09 12:35:33 +09:00
eomsangdonandClaude Opus 5 cc61dddefa fix(B09): 배수관이 금액으로 섬 — 차단 판정과 규격 열 표 둘을 고침
⚠⚠ **차단인지는 `blocked_kind` 가 정한다 — 문구가 아니다.**
배수관 다섯 줄이 `blocked_kind=None · in_bill=True` 인데도 **사유가 있다는 것만으로**
막혀 금액이 안 서고 있었음. 그 사유는 차단이 아니라 **주의 문구**였음 —
「관종을 안 정해 기본값(파형강관)으로 섰습니다」.
⇒ 사유만 온 줄은 **금액을 세우고 그 문구를 곁말(ⓘ)로** 닮. 차단 표시가 붙은 줄은 그대로 막음.
ⓘ 오늘 두 번째 같은 병임 — 아침엔 겹침 설명을 `blocked_reason` 에 넣었더니 막힌 줄로 읽혔음.

⚠ 그리고 막힘이 풀리자 **다음 벽**이 드러남 — 관부설 12-11 표를 한 줄도 못 읽고 있었음.
그 표는 **규격이 열**(∅800·∅1000·∅1200)이고 값이 **나눗셈 식**(「0.62/2.5」 = 관 2.5m
한 개당 0.62시간 ⇒ m 당 환산값)임.
- `match_spec_column_table` 신설 — 첫 줄이 규격 이름만 늘어선 표일 때만 내 표로 봄
- 「0.016/2.5/2」처럼 겹친 나눗셈도 읽음 · 값이 빈 칸(기초콘크리트·거푸집)은 건너뜀
- 관경마다 갈래가 섬. B08 이 「Ø800」으로 보내도 「∅800mm」 갈래에 붙음

결과 — 배수관 네 줄이 처음으로 금액이 섬
  Ø1000 10m × 10,903.7 = 109,037 · Ø800 11m × 10,973.0 = 120,703 ·
  Ø800 9m ×2 = 197,514  ⇒ 합 **427,254원**
  본체 31,118,251 → **31,545,505원**
  ⚠ Ø1500 은 품셈 표에 그 관경이 없어(800·1000·1200) 그대로 막힘 — 후보만 보임

검증: pytest 307 통과(신규 4) · 자원 축 547 → 565 줄

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:33:24 +09:00
eomsangdonandClaude Opus 5 db4acbf1ac fix(B08): 채움콘크리트 근거에 돌 종류 표시 + 골막이 주석 줄바꿈 복구
- 채움콘크리트 계수가 돌 종류로 갈리는데(깬돌 0.2 · 야면석 0.15) 근거 문구에
  종류가 안 적히던 자리 — 값은 바뀌는데 왜 바뀌었는지가 화면에 안 보였음.
  고임돌은 이미 적고 있었으므로 같은 규칙으로 맞춤.
- 병합 해결 과정에서 골막이 두께식 주석 두 줄이 한 줄로 붙은 것 복구.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:32:43 +09:00
eomsangdon 0662a90552 Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-09 12:22:08 +09:00
eomsangdon cc001166b5 Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-09 12:22:07 +09:00
eomsangdon 11d1bf71a2 Merge remote-tracking branch 'origin/sub_laptop_1' into main_desktop_1 2026-09-09 12:21:55 +09:00
eomsangdonandClaude Opus 5 60e7e137bb feat(B07): 횡단도 하단표에 사토장 줄 — 「쌓기」와 갈라 보임
실무 원본 횡단도에는 그 자리가 **아예 없음**(400dpi 실측, 다른 창 확인) —
납품 양식을 늘리는 것이 아니라 **안 쓰던 빈 줄을 쓰는 것**임.

- 우측 그룹의 빈 줄 자리에 「사토장」 신설 (`spoil_fill`)
- 값은 B06 이 낸 `spoil_fill_area_m2` 를 그대로 옮김 — 여기서 더하거나 빼지 않음
  (`fill_area_m2` 에서 이미 빠져 있음 · 확정 ㉠ 같은 흙을 두 번 세지 않기)
- 사토장이 없는 측점은 값이 안 실려 종전처럼 빈칸

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:19:04 +09:00
eomsangdonandClaude Opus 5 8c88356459 feat(B05/B06): 흙막이를 기슭막이와 같은 벌로 — 형상·옵션 동일, 수량은 분리
사용자 확정 4차 원문 — 「흙막이는 횡단도에서 **표현방식들과 옵션들은 동일하게** 반영하면
될거야. **형상은 동일해.** 물론 **데이터는 분리하여 계산**되어야함.」

- 그리기 경로는 **이미 같음** — C군 벽은 `attachWallSpecs` 로 `section.revetment` 에 붙어
  기슭막이와 같은 기하를 탐(따로 그리지 않음). 형태 이름도 「찰/콘크리트」 글자로 갈려
  흙막이 선택지(돌(찰)·돌(메)·떼…)가 그대로 먹힘
- 빠져 있던 것은 **옵션 칸**이라 기슭막이 열두 칸을 **같은 글자 그대로** 옮김 —
  단 수 · 올림 · 이동 · 뒷길이 · 돌 종류 · 조달 · 야면석 계수 · 채움 강도 ·
  전면 기울기 · 기초 · 물빼기 구멍 둘
  ⚠ 흙막이 수량이 안 쓰는 칸도 **숨기지 않음**(사용자가 「동일하게」라 함) — 수량 쪽에서
    조용히 무시되면 됨
- ⚠ 코드에 **「형상 동일 ≠ 수량 동일」**을 못 박음. 원단위·공종코드·성분 줄은 흙막이 자기 것.
  반대 사례가 골막이임(그림도 수량도 다르고 두께식마저 다른 식) — **계열이 다르면 상수를
  나눠 쓸 것**

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:17:03 +09:00
eomsangdonandClaude Opus 5 92fd909212 feat(B08): 새 칸 다섯을 골막이·개거·물구멍에 물림 — 방수로가 정면적을 가름
골막이 (erosion_check)
- spillway 「있음/없음」 — 「없음」이면 파형강관 0.5024㎡ 를 안 뺌. 정면적이 밑수라
  일곱 줄이 +2.1~3.1 % 움직임. 「있음」이 정본과 같은 값(정본은 방수로 치수 0 인
  개소에서도 뺐음). 안 고르면 정본 쪽으로 서고 사유가 뜸.
- stone_kind · back_len_cm 를 읽음. 「칸이 없다」던 사유가 「안 골랐다」로 바뀜.

돌 무게 헬퍼 한 벌 (stone_weight_per_m2)
- 확정 5차 큰 것 7 규칙을 돌쌓기·골막이가 같이 씀. 계산식이 기본, 야면석만 관측표.
  두 벌로 두면 같은 확정이 구조물마다 갈림.

물구멍 헬퍼 한 벌 (weep_hole_spec)
- weep_hole_diameter_mm · weep_hole_area_m2 를 읽고 비우면 Ø50 · 2㎡당.
  지름은 규격(spec)으로 실어 단가가 갈리게 함.
- 정본이 개소당 관 길이를 평균두께(0.83m)로 잡는 것을 주석에 남김 — 우리 상수 0.5m
  와 갈리는 자리이고 미결임.

개거 — ditch_spec 칸이 와서 두 규격을 고를 수 있음.

시험 — 등록부 정책 예외에 새 칸 넷(ditch_spec · weep_hole 둘 · fill_slope_ratio)과
사토장 둘을 넣음. 613 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:16:39 +09:00
eomsangdonandClaude Opus 5 962bbfe971 feat(B08): 임목파쇄 켜는 칸 (확정 5차 5번) — 기본 꺼짐 · 근주이식은 칸 없음
- 「기본 안 셈」이되 「현장에 따라 파쇄가 적용될 필요 있음」이라 **임목파쇄만** 켤 수 있게 둠
- ⚠ 안 켠 프로젝트에는 **줄 자체가 없음** — 빈 칸이 「세야 함」으로 읽히지 않게
  (부대시설은 법정 의무라 늘 서는 것과 다른 자리)
- 켜도 부피는 지어내지 않음 — 넣어야 값이 서고 FP-08-11(이동식 임목 파쇄)이 붙음
- 근주이식(FP-14-02)은 **칸도 안 만듦** — 켤 자리가 없으면 물을 일도 없음
- 설정 `wood_chipping_enabled`·`wood_chipping_volume_m3` + 화면 칸 둘
- tmp/tests/test_b08_wood_chipping.py 신설(5건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:16:09 +09:00
eomsangdonandClaude Opus 5 0e841b35f1 feat(B09): 확정 5차 — 비탈 터파기 노티스를 걷음
사용자 확정 5차 「비탈 터파기, 지금 이대로」 ⇒ 구조물터파기·되메우기·잔토처리 세 줄의
「확정 대기」 문구를 걷음. **값은 안 바뀜** — 11,256,879원이 확정된 값이 됨.

⚠ 표는 지우지 않고 **비워** 둠 — 같은 성격의 자리가 또 생기면 여기 적으면 됨.
적을 때 「왜 대기인지」와 「정해지면 얼마나 움직이는지」를 함께 적으라는 규칙을 주석에 남김.

검증: pytest 303 통과 · 본체 31,118,251원 그대로

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:15:56 +09:00
eomsangdonandClaude Opus 5 857a93f08c feat(B08): 지장목제거를 두 줄로 가름 (확정 5차 2번) + 작업 갈래를 지반 갈래로 안 읽음
- 실무(영월 1.9)가 한 면적에 두 작업을 얹음 — 뿌리뽑기 @475 · 잡관목제거 @882 가
  같은 11,035㎡. ⚠ 이중계상이 아니라 서식이 그러함(사유에 적음)
- 잡관목제거는 품셈에 이름이 없음(실무 D00033 별도 단가) — 공종 보류(확정 5차 3번)라
  코드 없이 서고 사유가 붙음
- ⚠ 곁들여 잡은 것: `item` 칸을 **늘 지반 갈래로 읽고 있었음** — 지장목제거의 작업 갈래에
  「시공법 미지정으로 공종을 못 고름」이라는 틀린 사유가 붙었음. 갈래로 읽는 공종을
  GROUND_SPLIT_GROUPS 로 한정하고 나머지는 규격 칸으로 보냄
- tmp/tests/test_b08_tree_removal_split.py 신설(5건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:12:30 +09:00
eomsangdon b891917e24 Merge remote-tracking branch 'origin/main_desktop_1' into sub_laptop_1
# Conflicts:
#	B08_Quantity/B08_Quantity_Engine_UnitQuantity.py
2026-09-09 12:10:38 +09:00
eomsangdon 1fda41d329 Merge remote-tracking branch 'origin/main_laptop_1' into sub_laptop_1
# Conflicts:
#	B08_Quantity/B08_Quantity_Engine_Pipe.py
2026-09-09 12:10:09 +09:00
eomsangdon 3808c36bfb Merge remote-tracking branch 'origin/sub_desktop_1' into sub_laptop_1 2026-09-09 12:08:55 +09:00
eomsangdonandClaude Opus 5 252e6b5447 feat(B08): 사용자 확정 5차 넷 반영 — 막자갈 실무식 · 석적 · 돌 무게 계산식
막자갈 (작은 것 3)
- 옛 식(입적 − 몸통 − 고임돌)에서 (뒷채움 상 + 하) ÷ 2 × H 로 갈아탐.
- 상·하는 벽 두께가 아니라 뒷채움 폭임. 정본 04.구조도(기슭막이).xls
  여섯 탭(H=1.0~3.0 · 메/찰 · 기초유/버림) 전부 상 0.30 · 하 0.45 로 같음.
  소광리는 같은 식에 0.30/0.60 을 써서 0.900 이 나옴 — 그 사실을 사유로 냄.
- H=2.0 에서 정본 0.75 와 일치(옛 식은 1.66 쪽으로 튀던 자리).

석적 (작은 것 4)
- 정면적 × 뒷길이 × 0.77 로 새 줄. 정본에 없고 소광리에만 있는 줄임을 사유에 적음.
- 「체적」은 이미 「입적」 이름으로 내고 있어 이름만 맞음 — 새로 만들지 않음.

돌 무게 (큰 것 7)
- 뒷길이 × 0.77(채움률) × 2.65(비중) 계산식이 기본. H=2.0 에서 정본 1.92 톤과 일치.
- 야면석만 관측표(35→0.575 · 45→0.880 · 55→1.100) — 공극이 커 계산식이 안 맞음.
- 종류를 안 고르면 정본 줄 이름 그대로 「돌」로 서고 그 사실이 사유로 뜸.
- 잠정임(실무자 협의 후 명확히)을 화면 근거에 적음.

터파기 (큰 것 1) — 기초 + 비탈 그대로. 코드 변경 없음.

채집석 밑수도 새 줄을 따라감 — 석적 + 고임돌 + 막자갈.
거울 시험 신설: 정본 H=2.0 여섯 줄 일치, 일부러 다른 두 줄(입적·물구멍관)의
차이까지 못박음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:08:47 +09:00
eomsangdonandClaude Opus 5 691b356e2a feat(B08): 사용자 확정 5차 반영 — 제근 계열 면적 축 · 터파기 확정 · 뿌리 운반 덤프
1번 비탈 터파기 「지금 이대로」 — `BASIS_WALL` 에서 「확인 후 쓸 것」을 걷고 확정 표시로 바꿈
  (「법정 근거 없음」은 사실이라 그대로 둠)
6번 제근 밑수 **면적 축** — 산림품셈 9-21 에 밑수 표기가 없어 **건설품셈 3-9-2 「1,000㎡당」**
  을 ⚠ **교차 참조**로 빌려 씀. 제근·뿌리 적재가 같은 면적으로 섬(㎡)
  ⚠ 임목축적 등급은 **단가 갈래**이지 물량 밑수가 아님 — 비어도 값은 서고 사유만 남음
4번 뿌리 운반 **덤프**(FP-10-12) — ⚠ 운반 밑수는 부피(㎥)인데 뿌리 부피를 든 곳이 없어
  물량은 안 섬. 사용자 관찰(실무에서 운반품이 안 붙기도 함)도 사유에 적음

곁들여 — 준비공 인계 줄이 **값이 서는 순간 근거를 잃던 자리**를 고침(대분류 이름만 싣고
  있었음). 제근이 확정으로 값이 서자 「교차 참조」 표시가 사라진 것에서 드러남

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:08:23 +09:00