Commit Graph
100 Commits
Author SHA1 Message Date
eomsangdonandClaude Opus 5 0c511fae70 feat(B09): 반영률이 갈래마다 다른 줄에 그 사실을 실음
B08 이 율을 이미 곱해 보내고, 율이 갈리는 줄은 `pct` 를 비운 채 갈래로만 보냄.
받는 쪽은 **곱하지도 100% 로 채우지도 않아** 값은 맞았는데, **왜 그 수량인지**가
화면에 아무 데도 없었음 — 값이 맞아도 그것은 반쪽임.

- `application_ratio_breakdown` 을 읽어 사유로 적음
  「반영률이 갈래마다 다릅니다 — fill 80%, cut 100% (적용 후 수량)」
- ⚠ **「율 없음」이라 쓰지 않음** — 사실이 아님. 오늘 가장 위험하다고 본 오독과 같은 말임
- 율이 안 걸린 줄은 아무 말도 안 함

검증: pytest 303 통과(신규 3) · 율을 어긋나게 넣어 실제로 돌려 봄
  (quantity 1300 · gross 1500 · pct None → 1300 그대로 · gross 안 씀 · 두 번 안 곱함)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 12:05:21 +09:00
eomsangdonandClaude Opus 5 4060f4e3d2 fix(B09): 밑수 「인」을 받는 쪽에서 막음 + 규준틀 사유 갱신
① 마스터가 본문·표에서 밑수를 「인」으로 읽어 온 자리가 여섯 있음(드론방제 둘·지상방제·
   야면석 채집·휘발유·천공기). 「인」은 **사람 수**이지 공종 단위가 아니라, 그대로 두면
   「몇 인짜리 공종」이 되어 **단위 불일치 검사가 엉뚱하게 통과**함.
   ⚠ 원문 쪽 고치기는 마스터 몫(데스크탑 메인) — 여기서는 **받는 쪽에서 막음**.
   같은 규칙이 `WorkItemUnit` 머리말에 이미 있어 짝을 맞춤

② 규준틀 사유 갱신 — 데스크탑 메인이 각재·판재·못을 자재 축에 세워(`e100d311`)
   「인력 품만」의 뜻이 바뀜. 재료가 오되 관급·사급이 안 갈려 아직 금액 0 임을 적음

⚠ 계획서 9장 재판정(미체크 27 → 21 · 크기 딱지)은 `docs/` 가 git 밖이라 커밋에 안 실림 —
  파일에는 반영돼 있음.

검증: pytest 300 통과 · 밑수가 「인」인 자원 줄 0

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 11:40:29 +09:00
eomsangdon 0ce4d79886 Merge remote-tracking branch 'origin/main_laptop_1' into sub_desktop_1 2026-09-09 11:31:33 +09:00
eomsangdon 17a99f1195 Merge remote-tracking branch 'origin/main_desktop_1' into sub_desktop_1 2026-09-09 11:31:32 +09:00
eomsangdonandClaude Opus 5 e100d31147 feat(B08): 규준틀 재료 — 제안값으로 세우고 고칠 수 있게 (품셈 [주]④)
- 「재료량은 설계수량에 따른다」는 값을 안 준다는 뜻이지 안 센다는 뜻이 아님.
  근주이식·임목파쇄(셀지 말지가 설계 판단)와 성격이 다름 — 확정 ⑨·⑩ 과 같은 틀로 감
- 제안값(울진 소광 §8 관측): 각재 50×50 0.0044㎥ · 판재 T12 0.0029㎥ · 못 0.03㎏/개소
- ⚠ 「실무 관측값이지 법정 기준 아님」과 손율 원문값(비탈 50% · 수평 80%)을 줄 사유와
  화면 칸 밑에 함께 적음 — 값만 박으면 「대신 페이지에 남길 것」 지시를 어기는 것
- 개소가 안 서면 재료도 안 섬(밑수가 그 줄) · 자재 축으로 감(할증은 자재총괄에서 한 번)
- 설정 `frame_material` + 화면 칸 셋
- tmp/tests/test_b08_frame_material.py 신설(7건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 11:30:15 +09:00
eomsangdonandClaude Opus 5 446426e997 feat(B09): 원문에는 있는데 단가에 못 실린 몫을 화면이 말하게 함
「반쪽 단가」 표시가 여태 **이름을 카탈로그에서 못 찾은 줄**만 잡고 있었음. 그물 밖에 둘이
더 있었고, 둘 다 **금액이 서 있는 줄**이라 표시가 없으면 완성된 값으로 읽혔음.

- 기초잡석 12-25 — 원문에 「운반 | 덤프트럭(15ton)」 줄이 있는데 우리 단가에 없음.
  ⚠ 사유를 「원문이 값을 안 줌」으로 뭉뚱그리지 않음 — 그 값은 품셈 10-12(덤프운반)가
  **운반거리로** 내는 것이라 **거리가 정해지면 풀림**. 「영영 막힘」과 「곧 풀림」은
  사용자가 보는 뜻이 다름
- 기초잡석 소할 — 원문이 「**브레이커 사용할 때 제외**」라 한 줄인데 지금은 무조건 붙음.
  ⚠ 조건부 열두 줄 중 **이것만 금액이 서 있음**(다른 열한 줄은 붙는 쪽, 이것은 빠지는 쪽)
- 규준틀 11-2·11-3 — 지금 값은 **인력 품만**. 손율은 원문에 있음(비탈 50% · 수평 80%)

⚠ 앞 보고를 정정함 — 규준틀은 「표시가 아무것도 없다」고 했으나 **B08 인계가 이미
「재료량은 [주]④ 설계수량에 따른다라 미확보」를 싣고 있었음.** 화면 문구 뒤쪽이 잘려
안 보였던 것임. 그래서 그 말은 되풀이하지 않고 **B09 쪽에서만 아는 것**만 보탬.
「잘린 자리를 사유가 없는 자리로 읽지 말 것」을 주석에 남김

검증: pytest 300 통과(신규 5)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 11:19:57 +09:00
eomsangdonandClaude Opus 5 e0081cd953 fix(B09): 제근 이중계상 — 표가 「고르라」고 둔 장비 블록을 다 더하고 있었음
품셈 9-21 제근은 장비 규격 두 갈래(0.2㎥·0.7㎥)를 **고르라고** 둔 표인데 둘 다 붙고
보통인부도 두 번 붙어 단가가 **128,039원**으로 서 있었음. 밑수가 원문에 없어 아직
금액이 안 서 있었을 뿐, **밑수가 정해지는 날 조용히 두 배로 설 자리**였음.

- `B09_Estimation_ResourceAxis_ChooseOne` 신설 — 블록마다 갈래 하나, 열마다 갈래 하나.
  장비 2 × 임목밀도 3 = **여섯 갈래**로 세움 (55,625.9 ~ 111,161.4원)
- ⚠ **「고르는 표」를 좁게 가름** — 기계 줄이 둘이라고 다 그런 표가 아님. 9-13 암절취는
  깨기(브레이커)와 들어내기(백호우)가 **함께 듦**. 자국은 **같은 이름에 규격만 다른 것**.
  품셈도 그렇게 말함 — 9-20-1 [주]④ 「0.2㎥ 또는 0.4㎥ … 계수를 달리 적용」
- ⚠ 밑수는 만들지 않음 — 9-21 은 표 머리·제목·[주] 어디에도 밑수 표기가 없음
  (앞 절 9-20-1 「(10주당)」·9-20-2 「(단위: 10주당)」과 대비되는 자리)

⚠ 짓다 잡은 것 — 기종 해석이 **넘겨받은 카탈로그를 무시**하고 기계 카탈로그를 직접 봐서,
노무만 든 카탈로그로 돌릴 때도 기계 줄이 나왔음. 카탈로그에 기계가 없으면 이 표를
안 읽게 막음(시험이 그것을 잡았음).

⚠ 시험 하나가 **버그를 맞는 것으로 적어 두고 있었음** — 「제근은 보통인부 줄이 둘이다」.
그것이 곧 이중계상이었음. 뒤집어 다시 적었음.

검증: pytest 295 통과(신규 4) · 자원 축 539 → 547 줄, 늘어난 8 줄은 전부 제근

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 09:03:49 +09:00
eomsangdonandClaude Opus 5 68ca189220 fix(B08): 운반이 두 축에 실려 내역 줄이 두 벌이던 것 막음
- 토공집계표는 실무 토적집계 모양이라 무대·도자운반·덤프운반을 함께 싣는데, 인계본에는
  운반표(FP-10-11·FP-10-12)가 같은 물량으로 또 실렸음 — 둘 다 in_bill 이었음
  (실측: 도자 17.389·61.130 · 덤프 37.511·122.417 이 두 축에 각각)
- 집계 쪽 운반 줄을 in_bill=False 로 두고 사유를 적음. 값은 남김 — 검산
  (무대+도자+덤프 = 총 운반토량)이 그 값을 씀(무대를 그렇게 둔 것과 같은 규칙)
- 성토 같은 다른 집계 줄은 안 건드림
- tmp/tests/test_b08_haul_double_count.py 신설(5건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:37:44 +09:00
eomsangdonandClaude Opus 5 3a5a13b488 feat(B06): 사토장 용량에서 폭을 정해 측점마다 세움
사용자는 「이 구간에 ○㎥」를 정하는데 단면은 폭을 알아야 그려짐.
그 구간 측점을 한꺼번에 보고 **폭 하나**를 이분법으로 찾음(작업장은 폭이 일정함).

- `enforce_spoil_fills` 신설 — `enforce_ford_surface_drops` 와 같은 자리·같은 방식.
  자동설계 체인·[저장] 뒤 **맨 마지막**에 돎(앞 보정이 다시 계산하면 사토장 칸이 지워짐)
- 「자동」이면 그 측점의 **성토 쪽**에 섬 (`structure_face_role` 재사용)
- 상한(지반 샘플이 있는 데까지)에서 멈추고 못 담은 몫은 `spoil_fill_unplaced_m3` 로 냄
- 구간 안 측점만 씀 — **새 측점을 만들지 않음**(사용자 확정 ③)
- 용량이 없으면 아무것도 안 세움(폭을 정할 근거가 없음)

실측 — 용량 200㎥·800㎥ 를 넣으면 각각 그만큼 담기고(오차 2% 안), 100만㎥ 를 넣으면
상한 폭에서 멈추고 남은 몫이 값으로 남음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:31:23 +09:00
eomsangdonandClaude Opus 5 c892bdc935 feat(B09): 조합 사용 시 본체 잡재료 16% + 터파기 노티스 문구 정정
① 품셈 제8장 [주]⑤ 의 마지막 조각 — 「…조합하여 사용할 때는 …**잡재료비율을 16%로
   계상**하고, 리퍼·브레이커·집게의 손료 및 치즐 소모율을 추가」. 손료·치즐만 넣고
   이 줄을 빠뜨리면 본체 재료비가 22% 로 남아 조금씩 비싸짐.
   - 기계마다 「#조합」 층을 함께 세움(손료·조종원 같음, 잡재료만 16%)
   - 조립 **끝에 한 번** 조합 공종의 본체 줄을 그 층으로 바꿔 닮 — 도중에는 어느 공종이
     조합인지 아직 모름. 바꾼 줄 24
   - 부착 장비는 **이름이 아니라 분류번호**로 잡음(0103 리퍼 · 0230 브레이커 ·
     0240 진동콤팩터 · 7206 집게) — 이름은 원천이 뭉개 놓는 일이 있음(0230 이 그랬음)
   - 결과: 구조물터파기 72,378.3 → 72,333.2 · 돌쌓기(메) 78,864.5 → 78,423.8 ·
     돌쌓기(찰) 61,757.3 → 61,418.0 · 본체 30,892,279 → **30,849,376원**

② 터파기 노티스 문구 정정 — 「실무는 기초만 세고 우리는 벽 전체를 셈(6.6배)」이
   **틀렸음**. 우리 식은 정본(기초 0.45 + 비탈) 그대로이고, 6.6배는 소광리 시트가
   비탈 줄을 안 적어서 난 것임. ⇒ 「비탈 터파기를 셀지 확정 대기 — 안 세면 약 1/7」로
   고침. 값·금액은 그대로

검증: pytest 290 통과(신규 1)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:30:30 +09:00
eomsangdonandClaude Opus 5 a22bf97964 docs(B08): STONE_MASONRY 는 기슭막이 전용임을 머리에 못 박음
- 소광리 숨김탭 「골막이(찰)(치수조서연결)」 C26 이 우리가 확정 ② 로 버린 옛 식과
  글자까지 같음 — 그 식은 틀린 식이 아니라 **골막이 식**이었음. 기슭막이에 쓰던 것이
  어긋남의 정체였음
- 골막이는 두께식 말고도 셋이 더 다름(밑수 = 돌쌓기+돌붙임 · 단위 = 개소당 ·
  정면적 = 사다리꼴) — 상수만 보고 가져다 쓰지 못하게 적음

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:28:00 +09:00
eomsangdonandClaude Opus 5 b3d1fa4a9b fix(B08): 운반 줄에 갈래를 통로로 실음 — spec 문자열만 가고 있었음
- 운반 단가가 지반 갈래로 갈리는데 `variant_value` 가 비어 있어 받는 쪽이 갈래를 못 골랐음
  (「버림」에서 275,584원이 사라졌던 자리와 같은 병)
- `variant_axis: "ground_class"` · `variant_value: 리핑암` 으로 실음. 갈래가 없는 줄은 None
- ⚠ 이름은 우리 갈래 그대로 — 일위대가의 「파쇄암」과는 인계본 `ground_class_aliases` 가 이음
- tmp/tests 2건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:14:23 +09:00
eomsangdonandClaude Opus 5 1d5145eaa5 feat(B09): 미확정 산식 줄에 사유를 실음 + 갈래 이름 다리(리핑암↔파쇄암)
① 수량 산식이 확정 대기인 줄에 그 사실을 함께 실음 (계획서 4-12 3단계)
   구조물터파기가 내역서에서 가장 큰 줄(11,263,899원)이 됐는데 그 밑수가 사용자
   확정을 기다리는 식 위에 서 있음. 값은 그대로 두고 **드러내기만** 함.
     「⚠ 터파기 수량 산식이 확정 대기입니다 — 실무 시트는 기초만(기초폭 × 깊이 0.3)
       세고 우리는 벽 전체를 셉니다(m당 실무 0.35 vs 우리 2.30, 약 6.6배).
       실무 식으로 확정되면 이 줄 금액이 약 1/6.6 로 줄어듭니다.」
   되메우기·잔토처리도 같은 뿌리라 함께 표시. ⚠ 측구터파기는 다른 뿌리라 대상 아님

② `VARIANT_ALIASES` — 축이 달라 다르게 불리는 갈래를 **이름을 갈지 않고** 이음
   우리 「리핑암」은 B05·B06 지반유형(캘 수 있는가), 품셈 「파쇄암」은 운반 상태
   (부서졌는가)라 일반적으로 같은 말이 아님 — 발파암도 캐고 나면 파쇄암 상태임.
    다만 산림품셈 10-11 f 표가 토사·파쇄암·발파암을 따로 두어 그 표의 파쇄암은
   발파를 뺀 나머지이고, 10-12 [주]③ 「토사 1.3, **암절취 1.35**, 발파암 1.625」가
   10-11 의 파쇄암 1/1.35 와 **같은 값**이라 그 표 안에서는 암절취(리핑) = 파쇄암임.
   그 문장을 주석에 그대로 남김

검증: pytest 290 통과 · `find_variant_code("FP-10-11","리핑암")` → `B-FP-10-11#파쇄암`

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:11:49 +09:00
eomsangdonandClaude Opus 5 083766fd19 docs(B08): 사면적에 소단면이 든다는 것을 사유에 적음 — 가르지 않고 보이게
- 갈라 내라는 원문이 없고 실무도 한 덩이로 셈. 별표2 타.(1) 이 「노출되는 면은
  전체면적 녹화」라 소단도 녹화 대상이므로 섞여 있는 것이 틀린 것이 아님
- 가르면 「그 몫으로 무엇을 세나」를 우리가 정하게 되어 근거 없는 줄이 섬 —
  대신 근거 문구에 「소단면 포함」을 적어 가르지 않고 보이게 함

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:07:08 +09:00
eomsangdonandClaude Opus 5 1dceeb5bef feat(B09): 깨기(대형브레이커)가 붙어 구조물터파기가 섬 — 본체 3,089만원
품셈 제8장 [주]⑤ 「불도저 및 굴착기에 리퍼, 브레이커, 부착용집게를 조합하여 사용할
때는 …잡재료비율을 16%로 계상하고, 리퍼, 브레이커, 부착용 집게의 손료 및 치즐
소모율을 추가하는 것이다」 를 따라감.

세 자리를 이었음
1. **뭉개진 카탈로그 줄을 원문으로 되살림** — `mach_base_2026.json` 의 대형 브레이커
   여섯 줄이 이름 칸에 표 전체가 뭉쳐 규격·손료계수가 없었음. 건설품셈 제8장 (0230)
   표에서 읽어 채움. ⚠ **두 번 검증** — 계수 합 3,000+2,833+768=6,601 이 표의 「계」와
   같고, 같은 방식으로 읽은 굴착기 「계 2,085」가 카탈로그 0.0002085 와 정확히 일치
2. **부착용 장비는 손료만으로 층을 세움** — 제 엔진이 없어 운전경비표에 줄이 없음.
   없다고 버리면 깨기 몫이 영영 안 붙음. ⚠ 리퍼·브레이커·집게에만 여는 길
3. **작업량을 직접 준 기계 줄을 읽음** — 「대형브레이커(㎥/hr) 3.5」. 공식이 아니라
   시간당 작업량을 표가 바로 주는 모양. 단위가 붙은 칸만 읽음(짐작 금지)

결과
- 구조물터파기(암절취·육상·2~3m) 155.625㎥ × 72,378.4 = **11,263,899원** — 처음 섬
- 돌쌓기 단가에 **부착용 집게 손료**가 더해짐(메 76,607.9 → 78,864.5) — [주]⑤ 그대로
- 본체 19,444,626 → **30,892,279원**
- 남은 것은 **치즐(자재) 하나** — 기계가 빠지면 막고 자재 소모품이 빠지면 드러내기만
  하는 규칙대로, 금액을 세우고 본표가 「치즐소모량 줄이 아직 안 붙었습니다」를 말함

⚠ 아직 안 한 것 — 같은 [주]⑤ 의 **「잡재료비율 16%」**. 조합 사용 시 굴착기 잡재료가
22% 가 아니라 16% 임. 그 자리는 운전경비 층이라 따로 손봐야 함.

검증: pytest 290 통과(신규 3)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:06:02 +09:00
eomsangdonandClaude Opus 5 b1de2c0d33 feat(B08): 뿌리 적재·운반 두 줄 신설 — 품셈이 네 단계로 둔 자리
- 9-20 가. 「벌개·제근 → 뿌리다듬기 → 적재 → 운반」이 시공 과정 표준이고 [주] 가
  「제근 후 뿌리다듬기와 적재항목에 적용」이라 두 항목을 줌. 별표2 도 「그 뿌리…를 전량
  제거한 후 운반하고 쌓아두어야」로 뒤 단계를 요구 — 우리는 제거 한 줄만 세고 있었음
  (표토와 같은 병: 법·품셈이 두 동작을 묶는데 앞 동작만 셈)
- 적재는 FP-09-20-02(「10주당」) · ⚠ 운반은 그 장에 공종이 없어 코드를 못 붙임 —
  지어내지 않고 사유로 냄
- 둘 다 제근과 같은 밑수(본수)가 서야 값이 남. 대상 면적은 참고값으로 실음
- tmp/tests 3건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:04:17 +09:00
eomsangdonandClaude Opus 5 e4172fd13d fix(B08): 제근 사유가 틀린 말이었음 — 본수가 아니라 임목축적으로 갈림
- 「입목 본수를 들고 있지 않음」이 원문과 달랐음. 품셈 9-21 [주]① 은
  **소림(30~60㎥/㏊)·중림(60~90)·밀림(90 이상)** 으로 가름 — 본수가 아니라 **축적**
- ⚠⚠ 그리고 **9-21 표에 밑수 단위 열이 없음**(9-20 은 「10주당」이라 적혀 있음).
  등급을 넣어도 「무엇당 값」인지 모르면 못 셈 — 원문 확인이 필요한 자리로 사유에 적음
- 임목축적 등급 설정·화면 칸 신설(`stand_volume_class`) + 근거 한 줄
  (산림조사부·영림계획에서 옮겨 적는 값이라 프로그램이 만들 수 없음)
- 대상 면적(벌개제근 연동, 지장목제거와 같은 자리)을 참고값으로 실음

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:58:47 +09:00
eomsangdonandClaude Opus 5 ec94a1fca7 feat(B08): 표토 운반·적치 줄 신설 + 부대시설·표토거리 화면 칸
표토 운반(법이 요구하는데 제거만 세고 있던 자리)
- 시행규칙 별표2 「표토는 전량 제거한 후 … 최고 홍수위보다 높은 장소로 운반하고
  쌓아두어야 한다」 — 제거(9-15)만 세면 운반이 빠짐
- 물량은 제거 물량 그대로(다시 안 셈), 거리는 설계 입력 `topsoil_haul_distance_m`
- 거리가 없으면 막고 사유 · 제거가 안 서면 운반도 안 섬(밑수가 그 줄) · 법 문구를 사유에

화면 칸(사용자 지시 「대신 페이지에 남길 것」)
- 부대시설 개소 다섯(국가지점번호판·안내판·차단기·가설창고·수방자재) — 서버가 받고
  있었는데 넣을 칸이 없던 자리. 산식으로 만들지 않는다는 사유를 칸 밑에 적음
- 표토 운반거리 칸 + 별표2 근거 한 줄

- tmp/tests/test_b08_topsoil_haul.py 신설(5건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:53:02 +09:00
eomsangdonandClaude Opus 5 d9b801aeaa feat(B06): 횡단 설계가 사토장 단면을 냄 — 노선 성토와 갈라서
사토장이 선 측점은 **노면 끝 바깥이 사토장 몫**이라 노선 성토에서 빼야 함.
안 빼면 같은 흙을 두 번 셈(2026-09-09 확정 ㉠).

- `compute_cross_design(spoil_fill=…)` / `computeCrossDesign({spoilFill})` 신설(짝)
- 새 칸: `spoil_fill_area_m2` · `spoil_fill_side` · `spoil_fill_width_m` ·
  `spoil_fill_max_width_m` · `spoil_fill_line` · `spoil_fill_unclosed` ·
  `spoil_fill_replaced_fill_m2`(노선 성토에서 뺀 몫 — 되짚기용)
- **합쳐서 하나로 내지 않음** — 받는 쪽이 갈라 볼 수 있어야 함
- 기울기가 비면 그 측점의 노선 성토 기울기를 그대로 씀(새 값 안 만듦)
- `fillAreaBeyond`/`_fill_area_beyond` — 경계 종거를 보간해 자름(한 칸도 안 흘림)
- 거울 시험에 사토장 사례 둘 추가 + 값이 0 이면 잡히는 가드

⚠ `B06_Section_Engine_Design.py` 가 924줄 — 700줄 제한 초과 상태임(이번 전에도 881줄).
  기능이 다 선 뒤 분리할 자리.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:51:41 +09:00
eomsangdonandClaude Opus 5 de8f0f15f2 fix(B09): 「붙은 몫 0%」만 적히던 사유에 **무엇이 안 붙었는지**를 함께 적음
「단가가 일부만 섰습니다 — 붙은 몫 0%」 만으로는 어디를 손볼지 알 수 없었음.
구조물터파기가 그 자리였는데, 참조는 이미 풀렸고 실제로 막는 것은 깨기(대형브레이커)·
치즐이었음.

- 사유에 `component_gaps`·`unattached` 를 이어 붙임
  「붙은 몫 0% · 깨기, 치즐소모량(본/hr) 줄이 아직 안 붙었습니다 (계수 참조는 풀렸습니다).」

검증: pytest 288 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:50:39 +09:00
eomsangdonandClaude Opus 5 659eba7faa docs(B08): 허용오차 둘을 한 자리에 모으고 왜 다른지 남김 · 축 맞춤 검산 문장 추가
- 관 허용오차 두 값이 우연히 다른 것처럼 보였음. `LENGTH_MATCH_TOLERANCE_M`(0.5m,
  「길이를 어디서 가져오나」)과 `SECTION_MATCH_TOLERANCE_M`(0.05m, 「횡단이 있나」)을
  한 자리에 이름 붙여 모으고 **맞추면 둘 다 나빠지는 까닭**을 적음
  ⚠ 두 값의 차이는 증상이고 병은 「관 자리에 측점이 없는 것」(계획서 3-14, B06 자리)
- 채집석 축 맞춤 검산을 값과 함께 보냄 — 더하는 쪽·빼는 쪽에 같은 계수가 걸려
  사토 총량이 그대로임(61.88 → 61.887)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:47:34 +09:00
eomsangdonandClaude Opus 5 1379b7fd69 fix(B06): 채집석 공제도 축을 맞춰 뺌 — 갈래마다 ×C
채집석은 **벽 입적(제자리 부피)**이라 자연 축이고 유토곡선은 다짐 축임.
축이 다른 값을 그냥 빼고 있었음(리핑암이면 13% 어긋남).

- 갈래별 값(`collected_stone_by_ground_m3`)이 오면 갈래마다 ×C 해서 뺌
- 갈래를 못 가른 몫은 계수가 없어 **환산하지 않고** 그대로 뺌
- 갈래가 아예 안 오면 종전처럼 총량을 그대로 뺌 (안 온 것과 0 은 다름)
- 통로 정리 — `_mass_haul_context` 가 B08 입력 dict 를 통째로 받게 함
  (칸이 늘 때마다 인자를 늘리다 빠뜨리던 자리)

⚠ 벽 입적과 원바닥 암 부피의 관계를 정한 원문이 없음 — 그 가정은 그대로 두고
**축만** 맞춘 것임(세 창 합의, 근거 문구는 B08 이 값과 함께 보냄).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:27:02 +09:00
eomsangdon 652dbcbd12 Merge remote-tracking branch 'origin/main_desktop_1' into main_laptop_1 2026-09-09 07:23:25 +09:00
eomsangdonandClaude Opus 5 e1fec62d35 feat(B06): 사토장 성토 단면 엔진(파이썬·TS 짝) + 등록부 확장
유용토운반작업장(구 사토장) — 노선 옆에 남는 흙을 쌓는 성토 단면.

- `common_util_spoil_fill.{ts,py}` 신설(한 벌, 거울 시험) — 평상(노면 끝 높이) →
  1:n 비탈 → 지반과 만나는 데까지. 단면적은 적분으로 정확히 셈.
  폭 시작점 = **노면 끝**(사용자 확정) ⇒ 그 구간 노견도 이 성토 안에 듦.
  폭 상한 = **지반 샘플이 있는 데까지**. 상한에서도 모자라면 그 폭을 냄(임의로 안 넓힘).
  용량에서 폭을 되풀이로 역산하는 `solveSpoilWidthM` 함께 냄.
- 등록부 `spoil_bank` 를 넓힘 — 새 종류를 만들지 않음(지식DB 상 같은 시설임).
  이름 「유용토운반작업장(구 사토장)」 · 구간형 · 횡단도에 그림 ·
  칸 `side`(자동=성토 쪽) · `fill_slope_ratio`(비면 노선 성토 기울기) · `extra_distance_m`.
- 기울기·적치높이 기본값은 지어내지 않음 — 지식DB §4 가 근거 없음을 못 박음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:23:04 +09:00
eomsangdonandClaude Opus 5 bafa652562 feat(B08): 채집석 공제를 갈래별로 냄 — 받는 쪽이 축을 맞춰 뺄 수 있게
- 축이 다른 값을 그냥 빼면 암에서 15% 어긋남(우리가 만드는 어긋남). 갈래를 실어 보내
  유토곡선이 ×C 로 다짐 축에 맞춰 빼게 함
- 갈래를 못 가른 구조물 몫은 계수가 없어 따로 냄(환산 안 함)
- ⚠ 벽 입적 ↔ 원바닥 암 부피의 관계를 정한 원문이 없음(캐면 부풀고 쌓으면 공극) —
  그 가정은 어느 쪽으로 가도 남으므로 가정은 그대로 두고 축만 맞춤.
  실무 시트가 그냥 뺀다는 사실까지 값과 함께 보냄
- tmp/tests 3건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:20:52 +09:00
eomsangdonandClaude Opus 5 49fb30f61f fix(B08): 사토 운반도 자연상태로 세움
- 되돌린 값(natural_m3_by_ground)이 오면 그 값으로 서고 상태를 사유에 적음
- 안 오면 다짐 그대로 두고 「내역 수량은 자연상태여야 함」을 사유로 냄
- tmp/tests 2건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:16:06 +09:00
eomsangdonandClaude Opus 5 1b4874786e feat(B05): 기슭막이 등록부에 뒷길이·돌 종류 칸 신설
칸이 없어 `_back_length` 가 조용히 45㎝ 기본값으로 돌던 자리임.

- `back_len_cm` 25·30·35·45·55·60·75㎝ / `stone_kind` 야면석·호박돌·깬잡석·깬돌·견치돌
- 기본값 없음 — 값이 없으면 「기본값으로 섰음」이 드러나야 함
- 돌쌓기(찰·메)와 같은 키·같은 글자 (품셈표 `stone_kind` 데이터셋과 대조)
- 기슭막이는 돌이 아닌 형태(콘크리트·돌망태·바자)도 있어 필수로 두지 않음

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:14:29 +09:00
eomsangdonandClaude Opus 5 9b9367a118 fix(B08): 운반 인계 줄을 자연상태로 세움 — 두 자가 섞여 있던 자리
- 유토곡선은 다짐상태로 쌓고(운반거리를 그 기준으로 재야 맞음) 내역서 수량은 자연상태임
  (config_system_design 5-4-3). 인계 줄이 다짐값을 그대로 읽고 있었음
- 되돌린 값(natural_m3)이 오면 그 값으로 서고, 쓴 계수(÷C)를 근거에 적음
- ⚠ 되돌릴 계수가 없으면(갈래 못 붙임) 다짐 그대로 두고 사유를 냄 — 토사 계수로 눅이면
  근거 없이 금액이 움직임
- 거리는 안 바뀜(다짐 기준이 맞음)
- tmp/tests/test_b08_haul_state.py 신설(4건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:13:17 +09:00
eomsangdon dae51cc940 Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1
# Conflicts:
#	B08_Quantity/B08_Quantity_Router_Earthwork.py
2026-09-09 07:11:49 +09:00
eomsangdon 333d0f476c Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-09 07:08:26 +09:00
eomsangdonandClaude Opus 5 e5f540658d fix(B08): 운반 물량 상태 되돌림 — 거리는 다짐, 내역 수량은 자연상태
「운반거리의 산정 시에 모든 수량은 다짐상태로 환산하여 계산하고, 내역서에
적용하는 수량은 자연상태로 한다」(설계실무 요령, config 5-4-3 인용문) 인데
유토곡선이 쌓은 다짐 물량이 그대로 내역 줄로 서 있었음.

- HaulSummary: 줄마다 `natural_m3`(÷C)·`volume_basis`·`conversion_c` 를 함께 냄.
  환산은 이 파일 한 곳에서 한 번만. 거리·검산은 다짐 기준 그대로.
  `L`(1.3·1.35·1.625) 은 안 씀 — 품셈 10-11·10-12 가 `f = 1/L` 을 스스로 곱함.
- 토공집계표: 운반 줄을 자연상태로 실음. 갈래를 모르면 다짐 그대로 두고 사유 표기.
- 사토 줄: `natural_m3_by_ground`·`volume_basis` 신설. 갈래 없는 몫은 환산 안 함.
- 구조물 잔토(자연상태)를 곡선에 담기 전 ×C — 왕복이 맞게 됨. 갈래 모르면 그대로.

실측 변화(내역 4줄): 도자 토사 15.65→17.39 · 리핑암 70.30→61.13 ·
덤프 토사 33.76→37.51 · 리핑암 140.78→122.42 (합 260.49→238.45, −8.5%).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:03:48 +09:00
eomsangdonandClaude Opus 5 22ef07d66e feat(B08): 사토 운반 거리 — 사토장 측점 거리가 오면 그 값이 이김
- 2026-09-09 사용자 확정: 사토장은 **이미 있는 측점 위에만** 놓임 ⇒ 거리는 「발생점 →
  사토장 측점」 누가거리로 저절로 나옴. 가정할 것이 없어짐
- 잔량이 `spoil_haul_distance_m` 을 들고 오면 갈래별 **가중평균**을 내어 그 거리로 줄이 섬
  (실무 내역이 운반수단 × 지반별 평균 하나를 올리는 서식)
- 없는 갈래만 산출 조건의 대체 거리로 서고, 거리 출처를 값 옆에 적음
- 사유·화면 도움말을 「거리가 없음」 → 「사토장을 아직 안 놓았음」으로 고침
  (사토장이 서면 낡을 문구였음)
- tmp/tests 2건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 07:03:32 +09:00
eomsangdonandClaude Opus 5 a155facf68 docs(B08): 낡은 사유·주석 셋 정정 — 지금은 아닌 이야기를 하던 자리
- 잔토 「그 통로가 없다」 → 2026-09-09 에 생김(HaulInputs → 사토 가산 → 사토 운반 줄)
- `face_slope_ratio` 「레지스트리에 없는 키」 → 칸이 생김(돌쌓기 계열 여섯 · 표준도 폼).
  빈 값이 「자동」의 뜻
- 성토/절토 「저장이 아직 안 갖고 있다」 → 측점 단면유형 + 설치 측으로 판정 중.
  못 가르는 자리만 남고 그때도 눅이지 않고 사유를 적음 (masonry_slope 정책 문구도 함께)
- 품셈 9-13 「토질·용수 칸이 없다」 → 셋 다 서면 자식 코드로 내려감

⚠ 사유가 거짓이면 사유 칸 전체를 못 믿게 됨 — 오늘 통로가 여럿 생겨 낡은 자리를 훑음

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:59:45 +09:00
eomsangdonandClaude Opus 5 59e6624d79 fix(B09): 품셈 「…와 동일」 참조를 따라감 + 묶음 배분율이 첫 줄에만 붙던 것
구조물터파기 여덟 갈래가 「단가가 일부만 섰습니다 — 붙은 몫 10%」로 서 있던 자리.
값이 없어서가 아니라 품셈이 「육상토사(0~1m)와 동일」처럼 **다른 절을 가리키는데**
그 참조를 안 따라가서였음.

- `B09_Estimation_MachineProductivity_Reference` 신설 — 참조를 따라가 계수를 이음.
  값을 옮겨 적지 않고 가리키는 절을 그때그때 읽음. 사슬·순환도 처리(순환은 멈춤)
- 열 갈래가 풀림: 09-13-02·03·05·06·08·09·11·12·17·18
- 빌려 온 계수는 **출처를 줄 비고에 적음** — 「계수 출처: 「…와 동일」 → 육상토사(0~1m)」

⚠ 짓다 잡은 것 셋
- 「육상과동일」은 「육상」이라는 절이 아니라 **제 이름에서 용수를 육상으로 바꾸라**는 뜻.
  이름 규칙을 먼저 태우면 없는 절을 찾다가 네 갈래를 놓쳤음
- 한 표에 참조가 둘이고 **가리키는 곳이 다름**. 9-13-11 은 치즐 줄이 「육상과동일」,
  백호우 줄이 「용수 암절취(0~1m)와 동일」임. 아무 줄에서나 주우면 용수 자리에 육상
  계수가 붙어 작업효율이 0.375 대신 0.50 으로 서고 **금액이 조용히 틀림**.
  ⇒ **기계 줄에 붙은 참조만** 보게 함
-  **묶음 배분율이 첫 줄에만 붙고 있었음** — 품셈이 「인력(10%)」 머리를 병합해 적어
  다음 줄엔 딱지가 없음. 그래서 「보통인부 1.0」이 100%로 서 **조용히 열 배**가 됐음
  (구조물터파기 단가가 224,305원/㎥ 이었음). 묶음 머리를 만날 때까지 이어 주게 고침

막힌 채로 두는 것 — 암·발파암 갈래는 **깨기(대형브레이커)·치즐**이 그대로 빠져 있어
금액을 세우지 않음. 다만 **사유를 남은 줄로 고쳐 적음**(백호우 이야기는 이미 풀렸음).
9-13-14 는 자기 자신을 가리키는 원문 오기라 **고쳐 읽지 않고** 사유로 남김.

검증: pytest 288 통과(신규 6) · 토사 갈래 단가가 처음 섬(1~2m 7,218.5원/㎥)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:57:11 +09:00
eomsangdonandClaude Opus 5 1c6f010a67 docs(B08): 상태 사실을 값 옆에 둠 — 되메우기·잔토 줄에 함께 실음
- 코드 주석에만 두면 화면에서 안 보임(오늘 여러 번 나온 자리)
- 「제자리 기하 부피(자연상태) · 되메움에 쓰이는 흙은 다짐부피 ÷ C 라 조금 더 들지만
  실무 정본도 그냥 빼므로 그대로 둠」을 두 줄의 spec_detail 에 실음
- 잔토 사유를 지금 동작으로 고침 — 「통로가 없어 안 실림」 → 「유토곡선이 사토에 얹어
  사토 운반 줄로 섬」(2026-09-09 통로가 생김)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:55:09 +09:00
eomsangdonandClaude Opus 5 89d8981058 docs(B08): 사토 운반 줄에 범위 사유를 실음 — 무엇을 안 세는지 드러냄
- 「사토장 정지」는 실무가 사토 운반 단가 안 조각(1/3)으로 넣으므로 수량 줄을 안 세움
  (세우면 같은 품을 두 번 셈)
- 사토장 사면 보호공은 실무 내역·사방공 집계표에 행이 없어 안 셈. 교본 6장 3절은
  요구하나 프로젝트 규칙상 실무가 안 세면 안 세는 쪽이 기본 — 뒤집히면 이 문장만 지움

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:52:03 +09:00
eomsangdonandClaude Opus 5 45d55de93f feat(B08): 사토 운반 — 상태(자연/다짐)를 값으로 내고, 범위를 사유에 적음
- 유토곡선 잔량이 되돌린 값(natural_m3_by_ground)을 들고 오면 **그것을 씀**.
  없으면 다짐값으로 서되 「품셈 운반 밑수는 자연상태」라는 사실을 근거에 적음
  (조용히 쓰면 상태가 어긋난 물량이 단가에 물림). 우리가 환산하지 않음 — 계수는 저쪽에 있음
- 갈래를 못 붙인 몫은 상태도 못 되돌리므로 그 사실을 함께 적음
- `haul.spoil.volume_basis` 신설 — 받는 쪽이 단가와 맞는지 스스로 보게
- 범위를 줄 사유에 적음: 「사토장 정지」는 실무가 사토 운반 단가 안 조각(1/3)으로 넣으므로
  수량 줄을 따로 안 세움 · 사토장 사면 보호공은 실무 집계표에 행이 없어 안 셈
  (교본 6장 3절은 요구 — 뒤집으면 그때)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:51:01 +09:00
eomsangdonandClaude Opus 5 018f628bf9 feat(B08): 구조물 잔토에 상태(자연상태)를 값으로 실음 — 유토곡선 잔량과 섞이지 않게
- 유토곡선 잔량은 다짐상태인데 이 값은 자연상태(제자리 기하 부피)라 그냥 더하면 섞임
  (2026-09-09 랩탑 메인 지적). `volume_basis: "natural"` 을 총량·측점마다 실음
- ⚠ 엄밀히는 되메움에 쓰이는 흙이 다짐부피 ÷ C 라 조금 더 들지만, 실무 정본 시트도
  그냥 빼므로(터파기 1.55 − 되메우기 0.30 = 잔토 1.25) 값은 그대로 두고 사실만 적음
- tmp/tests 1건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:47:53 +09:00
eomsangdon fd560eb653 Merge remote-tracking branch 'origin/main_desktop_1' into sub_desktop_1 2026-09-09 06:38:13 +09:00
eomsangdonandClaude Opus 5 bb9532ce34 fix(B08): 타설 방식을 안 정한 것과 비빔을 가름 — 할증이 타설 줄과 어긋나던 자리
- 안 정하면 타설 줄은 기본값(레디믹스트)으로 도는데 할증만 미확보로 두어 같은
  프로젝트에서 두 값이 어긋났음(실화면). 안 정함 = 기본값으로 보고 사유를 적음
- 비빔은 그대로 미확보 + 사유(시멘트·골재가 각각 할증되는 자리)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:35:19 +09:00
eomsangdonandClaude Opus 5 f50c55a8e2 fix(B09): 표의 일부만 붙은 단가가 조용히 서던 것 — 본표가 말하게 함
일위대가가 선 141 공종 중 **70 공종**이 「품셈 표에 있는데 못 붙은 줄」을 갖고 있었음.
막지 않는 것은 맞으나(막으면 정상 공종이 무더기로 멈춤) 화면이 말하지 않아
**조용히 싼 단가**가 내역서에 그대로 들 수 있었음.

실례 — 초류종자살포(FP-05-24-01, 수량 17,873.80㎡)
  품셈 5-24-1 은 자재 5(종자·비료·피복제·침식안정제·색소) + 장비 3(종자살포기·트럭·
  물탱크) + 인력 2 인데, 우리 단가는 **인력 둘만**으로 233.4원/㎡ 였음.

- `UnitPriceBuild.unattached` 신설 — 공종별로 못 붙은 줄 이름을 들고 있음
- 본표(`detail_of`)가 `unattached`·`unattached_note` 를 함께 냄
- 일위대가 상세 화면이 그 문구를 굵게 띄움. 다 붙은 단가는 아무 말도 안 함
  (늘 경고가 뜨면 아무도 안 읽음)
- 품셈이 자간을 벌려 적은 이름(「종      자」)은 눌러서 보임

⚠ 지역 이름 충돌 하나 잡음 — `names` 가 공종 이름표라 같은 이름을 쓰니 조립이 통째로
터졌음. 주석으로 못 박음.

검증: pytest 282 통과(신규 3) · tsc 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:34:38 +09:00
eomsangdonandClaude Opus 5 ab51fa38cf feat(B08): 확정 값 넷을 화면 칸으로 세움 — 값과 근거를 보이고 바꿀 수 있게
사용자 지시(2026-09-09): 「값을 코드에 박고 끝내지 말 것 · 대신 페이지에 남길 것」

- 층따기 길이(확정 2차 ①) — 비면 층따기 줄이 막힘. 칸이 없어 값이 안 들어가던 자리
- 기초잡석 두께(확정 3차 ②, 0.2m) — 근거: 폭은 버림 폭과 같음(KCS 34 50 05),
  두께는 품셈 12-25 가 안 정해 사용자 확정값
- 사토장까지 거리(확정 3차 ③ 미정) — 비어 있고, 비면 사토 운반 줄이 막힘
- 구조물터파기 용수(확정 3차 ④) — 기본 「육상」이 **통상값이고 사용자 확정 아님**을
  칸 밑 근거 줄에 적음. 품셈 9-13 의 18구분이 이 값으로 갈림
- 칸마다 근거 한 줄(`b08-quantity__hint`)을 붙임 — 왜 그 값인지 화면에서 보이게

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:28:28 +09:00
eomsangdonandClaude Opus 5 5780eb9359 feat(B09): 흙깎기가 처음으로 금액이 섬 — 범위 계수·장비 규격을 고르는 칸 (확정 ①)
사용자 확정 ① — 작업효율 0.50(두 끝의 평균). 딸림 지시 「값을 코드에 박고 끝내지 말 것 ·
화면에 칸으로 세우고 근거를 보이고 바꿀 수 있게」를 그대로 구현.

막혔던 자리 둘
- 품셈 9-3-2 가 작업효율을 「0.55∼0.45」 범위로 줌 → 확정값이 아니라 계수가 안 섬
- 그 표에 장비가 없음 → [주]① 「무한궤도 굴착기(0.7㎥)」가 마스터에 안 실려 기종을 못 고름
⇒ 두 자리를 채워 흙깎기 단가가 처음으로 섬: 2,515.1원/㎥ × 2,355.84㎥ ≒ 592만원

구현
- `B09_Estimation_FactorChoices` 신설 — 범위 칸을 품셈에서 훑어 모으고(코드 안 박음),
  고를 수 있는 것은 원문 두 끝과 그 평균 셋뿐. 기본은 평균
- 장비 규격도 같은 결로: 흙깎기는 [주] 에만 있는 값을 채우는 칸, 층따기는 원문 0.7㎥ 를
  기본으로 두고 실무(영월 0.2㎥)로 바꿀 수 있는 칸
- 고른 값은 프로젝트 설정 `estimation` 구획에 저장 — 프로젝트마다 갈림
- `cached_build` 를 고른 값별로 캐시 (전역 한 벌이면 한 프로젝트가 남의 금액을 흔듦)
- `GET/PUT /{project_id}/estimation/factors` · 기초자료 탭 맨 위에 칸과 근거 표시

⚠ 짓다 잡은 것 — 「0.45-0.05」를 범위로 잘못 읽고 있었음. 그건 뺄셈(=0.40)이라
품셈이 이미 정한 값인데 「고를 것」으로 둔갑했음. 물결(∼) 일 때만 범위로 봄

검증: pytest 279 통과(신규 7) · tsc 통과 · 평균 2,515.1 / 하한 2,794.6 으로
고른 값이 단가에 실제로 닿는 것 확인
⚠ 화면 확인은 못 함 — 내 창 브라우저 세션이 만료됐고 자격 파일이 이 폴더에 없음

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:27:24 +09:00
eomsangdonandClaude Opus 5 a57e1bbe6d feat(B08): 콘크리트를 자재 축에 세움 + 할증 이름 잇기 (확정 3차 ⑥)
- 타설 줄(품셈 12-1)은 품만 주고 재료를 안 줌(서브 일위대가도 재료 0원) — 콘크리트를
  자재 축에 안 보내면 재료비가 통째로 빠짐. destination 을 material 로 옮김
- 배합 분해 금지(㉢)는 그대로 — 「콘크리트 ㎥」에서 멈춤
- 할증 이름 잇기(값은 그대로, 찾을 때만 다른 이름):
  · 이형철근 D13·D16 → 「이형철근」 (품셈 1-3-1, 규격 안 가림)
  · 콘크리트 셋 → 「레미콘」 **레미콘 타설일 때만**. 비빔은 시멘트·골재가 각각 할증되는
    자리라 붙이지 않고 사유를 냄
- 할증률 미확보 사유를 비고에 적음 — 「표에 이름 없음」과 「이 방식엔 안 붙임」은 할 일이 다름
- tmp/tests/test_b08_material_concrete.py 신설(6건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:24:58 +09:00
eomsangdonandClaude Opus 5 99248440c6 feat(B08): 기초잡석 물량·용수 축 (확정 3차 ②④) — 옹벽 묶음 다섯 조각이 다 참
기초잡석(②)
- 두께 0.2m(사용자 확정). 폭은 버림 폭과 같아(KCS 34 50 05) **버림 × 두께 비**로 나옴
  ⇒ 관측 원단위로 오는 옹벽에도 값이 섬(버림 0.15㎥/m ⇒ 잡석 0.30㎥/m)
- destination `unit_price` — 운반·부설·다짐 품이 붙는 공종이라 자재총괄에 안 섞임
- 인계에 FP-12-25 줄로 섬. 묶음 구조물(옹벽)은 조각이 이미 세므로 건너뜀
- 두께는 설정 `rubble_base_thickness_m` 로 화면에서 바꿀 수 있음

용수 축(④)
- 품셈 9-13 의 18구분을 토질 × 육상/용수 × 심도로 골라 자식 코드로 내려감
- ⚠ 기본 「육상」은 **통상값이고 사용자 확정이 아님** — 그 사실을 줄 사유에 적음
- 3m 초과 칸은 원문에 없어 상위 코드 + 사유

- 설정 신설: rubble_base_thickness_m(0.2) · structure_trench_water(육상)
- tmp/tests 신설 test_b08_rubble_base.py(7건) + 터파기 시험 6건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 06:21:05 +09:00
eomsangdonandClaude Opus 5 2731e3bf63 feat(B08): 사토 운반을 지반 갈래별로 나눠 세움 — 못 붙인 몫은 따로 막음
- 유토곡선 잔량이 갈래별 물량(ea/rr/br)을 들고 오므로 갈래마다 한 줄로 세움
  (덤프 단가가 토사·암으로 갈려 합쳐 세우면 한쪽 단가로 다 물림)
- 갈래를 못 붙인 몫(ground_unknown_m3)은 따로 한 줄로 세우고 막음 — 토사로 눅이면
  임의 단가가 됨
- 갈래가 안 오는 옛 저장분에서는 종전처럼 한 줄
- tmp/tests 3건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:19:06 +09:00
eomsangdon 8eed1f7b4a Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 23:17:25 +09:00
eomsangdonandClaude Opus 5 df6d33c462 feat(B06): 구조물 잔토에 터파기 토질을 이어받아 사토 갈래(ea/rr/br)를 채움
B08 이 구조물터파기에서 이미 판정한 토질(`design.ground_type`, 품셈 9-13 3구분)을
잔토 측점값에 함께 실어 준다. **새 근거를 만드는 것이 아니라 이어받는 것**이라
두 자리가 같은 판정을 쓴다(두 벌로 짜면 갈린다).

- `structure_spoil_points[].ground_type` (soil→ea · ripping_rock→rr · blasting_rock→br).
  옛 이름(`ground`)·라벨(`ground_label`)도 함께 받는다.
- ⚠ **섞여서 못 고른 구조물은 `null`** 로 오고 그 몫은 갈래 없이 담겨
  `ground_unknown_m3` 로 드러난다 — 임의로 토사로 몰지 않는다.
- ⚠ 한계는 그대로 넘어온다: 「터파기 깊이가 암반 경계선보다 깊은지」는 안 본다
  (터파기 토질에 이미 있던 한계이고 새로 생기는 것이 아니다).

시험 8건(갈래별로 담김·못 고른 몫은 「모름」으로 남음 포함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:15:08 +09:00
eomsangdonandClaude Opus 5 f6b5b9f9c1 feat(B08): 구조물 잔토 측점값에 지반 갈래를 함께 실음
- 새 판정이 아니라 구조물터파기가 쓰는 그 값(`design.ground_type` 판정) 그대로 —
  그 터파기에서 나온 흙이 곧 이 잔토라 두 자리가 같은 판정을 씀
- 섞여서 못 고른 구조물은 「모름」(None)으로 보냄 — 터파기에서 다수결로 안 고른 규칙 그대로
- 한계도 그대로 넘어감(터파기 깊이가 암반 경계보다 깊은지는 안 봄) — 사유에 적음
- 받는 쪽(B06)이 사토 잔량 ea/rr/br 에 넣으면 「모르는 몫」이 사라짐
- tmp/tests 2건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:13:06 +09:00
eomsangdonandClaude Opus 5 221eb23e46 feat(B06): 사토 잔량에 「지반 모르는 몫」을 값으로 냄
B08 이 사토 운반을 덤프 단가로 가르려면 토사/암 갈래가 필요하다. 잔량에는 이미
`ea/rr/br` 이 실려 있으나(절토에서 남은 흙이라 구성비를 안다), **구조물 잔토로 생긴
몫만은 근거가 없다**(어느 지반에서 파낸 흙인지 판정하지 않는다).

- `ground_unknown_m3 = volume − (ea+rr+br)` 을 잔량마다 함께 낸다.
- ⚠ 안 내면 받는 쪽이 **0 으로 눅여 토사로 세기 쉽다** — 그래서 값으로 드러낸다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:10:40 +09:00
eomsangdon c70f79cbc3 Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 23:05:26 +09:00
eomsangdonandClaude Opus 5 759343e384 fix(B08): 사토 운반 줄 신설 — 유토곡선이 낸 사토를 아무도 실어 내지 않았음
- 운반 줄이 띠(bands)·이동(transfers)에서만 만들어져 사토는 잔량(residuals)으로 남아
  어디에도 안 실렸음. 그래서 구조물 잔토 126.63㎥ 를 얹어도 덤프가 안 늘었고,
  채집석 공제도 사토를 줄이는 값이라 끝까지 금액에 안 나타났음
- 실무에는 서는 줄(울진 대흥 1공구 토적집계 D32 사토 1,281㎥)
- 운반표에 `spoil`(물량·거리·근거)을 실어 인계가 「사토 운반」 한 줄을 세움
- 물량은 유토곡선 결과 그대로 — 공제·가산이 끝난 값이라 여기서 또 만지지 않음.
  자연방토는 실어 내지 않으므로 뺌
- 거리는 설계 입력 `spoil_site_distance_m` 신설 — 안 정했으면 막고 사유
  (품셈이 정하는 값이 아니라 임의 거리가 그대로 금액이 됨)
- 지반 갈래는 유토곡선이 안분하지 않아 갈래 없이 한 줄, 그 사실을 근거에
- tmp/tests/test_b08_spoil_haul.py 신설(6건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:05:15 +09:00
eomsangdonandClaude Opus 5 12c8d14ee1 fix(B06): 「잔토를 더하고 → 공제를 뺀다」 순서로 못 박음
두 창 저장분에서 **공제가 한 톨도 안 빠졌다**(`deducted 0`). 두 노선 다 원래 사토가 0
(전 구간 토취)이라, 공제가 잔토 가산보다 **먼저** 돌아 뺄 대상이 없었다.

- 유토곡선의 사토는 「현장에 남는 흙 총량」이고 출처를 안 가린다 — 공제는 그 총량에서
  빼는 것이라 **잔토가 담긴 뒤라야** 뺄 대상이 있다.
- ⚠ 모자라면 `collected_stone_deducted_m3` 가 작게 나와 「덜 뺐다」가 값으로 드러난다 —
  그 장치는 그대로 살려 뒀다.
- ⚠ 토취는 계속 안 건드린다. 「채집석을 캐 가면 성토에 쓸 흙이 줄어 토취가 는다」는
  갈래가 있으나 근거가 없다 — 그 여지를 주석에 적어 뒀다.

시험 7건(순서 시험 추가: 잔토 100 더한 뒤 공제 40 이 실제로 빠짐).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 23:03:50 +09:00
eomsangdonandClaude Opus 5 cf2c894c0b fix(B08): 구조물터파기 줄이 근거 문구 탓에 갈리던 것 합침
- 키가 (심도, 토질, 근거문구)라 같은 「암절취 · 심도 2~3m」이 측점 문구가 다르다는
  이유로 두 줄로 갈렸음(실화면 121.75 + 33.875)
- 키를 (심도, 토질)로 좁히고 근거 문구는 모아서 한 줄에 적음
- tmp/tests 1건 추가

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:58:28 +09:00
eomsangdonandClaude Opus 5 7e41c94be7 feat(B06): 담을 사토가 없으면 사토를 새로 세워 구조물 잔토를 담음 (확정 ㉰)
사토가 0 인 노선(전 구간 토취)에서는 잔토를 더할 자리가 없어 **물량이 그냥 사라졌다**.
파낸 흙은 어디로든 가므로 그것이 가장 나쁘다.

- 담을 사토 잔량이 없으면 **그 측점에 사토를 새로 세워** 담는다. 물량이 보존되고
  운반비가 붙는다(금액이 느는 방향 — 안전측).
- ⚠ 토취를 줄이는 길(㉯)은 「그 잔토를 성토재로 쓸 수 있다」는 근거가 있어야 한다.
  구조물 터파기 흙은 암이 섞일 수 있고 우리가 그 판정을 안 하므로, **근거 없이 금액을
  내리지 않는다.** 확정되면 이 함수 한 곳만 바꾸면 된다 — 그 문장을 주석에 남겼다.
- 새로 세운 사토는 자연방토 0 · 지반유형 안분 0 — 실어 내는 흙이고 지반을 모른다.
- 측점별 잔토를 Node 진입점까지 이어 붙임(빠져 있어 총량 갈래로 떨어지고 있었다).

실측(route 184): 사토 0 → **12.88㎥**, 잔량이 **측점 5m 자리에 섬**(전에는 노선 전체 구간).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:50:43 +09:00
eomsangdonandClaude Opus 5 abf586108c fix(B06): 구조물 몫(공제·잔토)이 실제로 흐르게 — 부르는 자리 둘이 인자를 안 넘기고 있었음
통로는 났는데 `_mass_haul_context()` 를 **인자 없이** 불러 값이 늘 `None` 이었다
(`Router_HaulPlan.py:64` · `Server_Calc_Prebuild.py:170`). 오늘 세 번째로 나온
「받는 곳은 있는데 넣는 곳이 없던」 자리다.

- `haul_inputs_for()` 로 B08 의 `project_haul_inputs` 를 받아 두 자리 모두에 넘긴다.
  ⚠ 여기서 다시 세지 않는다 — 두 값 다 B08 전개에서 나온다(CLAUDE.md 5장).
- 측점별 잔토(`structure_spoil_points`)를 받으면 **그 자리 잔량에 얹는다** —
  총량 비례로 흩으면 운반거리가 틀린다. 총량만 오면 종전대로 비례 분배(차선).
- 저장 payload 에 받은 값·실제로 먹은 값 넷을 남긴다 — 「값이 흐르는지」를 저장분에서
  바로 가릴 수 있어야 한다.

실측(route 184): 공제 0(구입이라 채집 없음) · 구조물 잔토 12.875㎥ 가 **실제로 전달됨**.
⚠ 그 노선은 사토가 0(전 구간 토취)이라 더할 잔량이 없어 `added=0` — 아래 물음 참조.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:44:50 +09:00
eomsangdonandClaude Opus 5 428fe7aeed feat(B08): 유토곡선에 넘길 구조물 몫 — 채집석 공제·구조물 잔토를 한 자리에서 냄
- `B08_Quantity_Engine_HaulInputs.haul_inputs(unit_table)` — 둘 다 양수 ㎥,
  빼고 더하는 것은 받는 쪽(B06) 몫
- ⚠ 측점별로도 냄(`structure_spoil_points`) — 총량만 주면 잔량 비례로 흩어져
  운반거리가 틀어짐. 구조물은 구간이라 가운데 측점을 자리로 봄
- ⚠ 「아직 안 옴(None)」과 「없음(0)」을 가름
- 라우터에 `project_haul_inputs(project_id)` + `GET .../quantity/haul-inputs`
  — B06 이 이 함수를 부르면 됨(같은 계산을 두 벌로 짜지 않게)
- tmp/tests/test_b08_haul_inputs.py 신설(5건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:37:22 +09:00
eomsangdon 7225bab2b2 Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-08 22:34:39 +09:00
eomsangdon 3dda55e588 Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 22:34:36 +09:00
eomsangdonandClaude Opus 5 3ac616fb5b feat(B06): 구조물 잔토를 사토에 더하는 통로 신설 — 공제와 짝이 되는 자리
데스크탑 메인이 구조물 터파기·되메우기·잔토를 인계에 실었는데, **잔토 126.625㎥ 가
어디에도 안 실렸다**. 사토로 실어 내는 몫이라 유토곡선이 세야 겹치지 않는다.

    구조물 잔토는 사토에 한 번만 더한다.
    B08 은 소요량(structure_spoil_m3, ㎥ 양수)을 내기만 하고,
    더하는 자리는 유토곡선의 사토뿐이다.

- ⚠ **잔량 하나하나를 늘린다** — 총량만 늘리면 사토는 늘고 운반이 안 는다(공제 때와 같은 자리).
- ⚠ 나누는 법: 지금은 총량 하나만 오므로 **남은 사토 잔량 크기에 비례**해 나눈다.
  한 곳에 몰면 운반거리가 틀린다. 측점별 값이 오면 이 함수만 고치면 된다.
- ⚠ 자연방토·지반유형 안분은 안 건드린다 — 실어 내는 흙이고, 어느 지반에서 나온지 모른다.
- `null`(아직 안 옴) ≠ `0`(없음), 받은 값과 **실제로 더한 값**을 따로 싣는다.

시험 5건(더해짐·잔량 동반 증가·자연방토 불변·토취 불변·공제와 함께 와도 한 번씩).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:33:21 +09:00
eomsangdonandClaude Opus 5 b4ae32d1be feat(B08): 구조물터파기 토질을 측점 설계값에서 끌어옴 — 남은 축은 용수 하나
- 새 저장 칸을 만들지 않음. 측점마다 이미 있는 `design.ground_type`
  (soil·ripping_rock·blasting_rock)이 품셈 9-13 토질 3구분과 그대로 맞물림
- 판정 규칙: 구조물이 **걸친 측점 전부**를 보고 갈래가 하나일 때만 값을 냄.
  섞이면 다수결로 고르지 않고 갈래별 측점 수를 사유에 적음(암 단가가 몇 배라
  임의 선택이 금액으로 굳음). 걸친 측점이 없으면 가장 가까운 측점 + 그 사실을 근거에
- 터파기 줄이 토질·심도로 갈려 서고, 막힌 사유가 「용수 유무」 하나로 좁혀짐
- tmp/tests 2건 추가(측점값 반영·섞임 판정)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:33:17 +09:00
eomsangdonandClaude Opus 5 d7d76e4e15 fix(B08): 성토 매핑을 자식 코드(FP-09-16-01 노체포설)로 내림
- 실무 내역 셋에 「노체포설·노체다짐」으로 가른 줄이 없음 — 영월은 「암성토
  BACK-HOE(0.7㎥)」 한 줄이고 그 단가산출 안에 적사→성토→다짐 3단계가 들어감,
  울진은 「유용성토」·「사토 및 다짐공」, 봉화는 성토사면다짐만 따로
- ⇒ 성토 본체 한 줄(포설) + 성토면다짐(㎡) 따로가 실무 양식. 다짐은 그 단가 안 단계
- 매핑에 적어 둔 「내역 양식이 정해지면 내린다」 조건이 채워진 것

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:27:55 +09:00
eomsangdonandClaude Opus 5 c6328440b2 feat(B08): 갈래 이름 별칭 — 리핑암 ↔ 파쇄암을 인계본에 실음
- 우리 갈래는 「리핑암」인데 일위대가는 「파쇄암」으로 서 있어 도자 운반 금액이
  이름만 못 이어 안 붙던 자리(≒30만원)
- 근거: 품셈 10-11 f 표 「파쇄암 1/1.35」 = 10-12 [주]③ 환산계수 「암절취 1.35」
- ⚠ 갈래 이름 자체는 안 바꿈 — 흙깎기(FP-09-04)가 「리핑암」으로 서 있음
- 매핑에 `ground_aliases` 절 신설, 인계본에 `ground_class_aliases` 로 실음
- tmp/tests/test_b08_ground_alias.py 신설(4건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:25:08 +09:00
eomsangdonandClaude Opus 5 acb0a3dfcf fix(B08): 구조물 터파기·되메우기·잔토를 인계 축으로 올림 — 빠뜨렸던 줄
- 구조물 전개가 destination `earthwork` 로 내던 셋을 아무도 받지 않아 내역서에
  한 줄도 안 나갔음(두께 식·기초 몫을 맞춰도 금액 0원). 실무 토적집계에는 서는 줄
  (울진 대흥 1공구 D12~D14 구조물터파기 토사 1,248/암 30 · 되메우기 739㎥)
- 새 파일 `Engine_Handoff_Trench.py` — 700줄 제한 탓에 Rows 에 안 넣음
- 구조물터파기: 심도(직고 + 기초 깊이)로 갈라 냄. 토질·용수 칸이 없어 품셈 9-13 의
  18구분 중 하나를 못 골라 상위 코드 + `input_missing` 사유로 둠
- 되메우기: FP-09-14-01 로 붙어 금액이 섬
- 잔토처리: 사토로 갈 몫이라 in_bill=False, ⚠ 그 통로가 아직 없다는 사실을 사유에 적음
- 매핑에 구조물터파기 줄 추가(FP-09-13 · 원문 L5022~5241)
- tmp/tests/test_b08_structure_trench_rows.py 신설(6건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:22:54 +09:00
eomsangdonandClaude Opus 5 9c811c4d20 fix(B06): 구조물을 놓아도 횡단도에 안 보이던 것 — 빈 초안이 저장분을 지우고 있었음
「구조물을 놓아도 횡단도에 아무것도 안 보인다」가 창 둘에서 같은 증상이었다.
화면에 표식을 심어 재 보니 **브라우저 쪽 단면에 `revetment` 자체가 없었다**.

- 원인: `withDraftWalls` 가 미저장 초안 목록이 **빈 배열**일 때도 「초안 있음」으로 읽고
  **서버 저장분(`revetment`)을 통째로 지운 뒤** 아무것도 안 얹었다.
  ⇒ `!drafts || !drafts.length` 로 고쳤다 — 빈 목록도 「초안 없음」이다.
- 초안 경로가 `foundation` 을 안 실어 터파기가 안 그려지던 것도 함께 고침
  (`WallSpec.foundation` 추가, 거울 시험도 같이 갱신).
- 겹침 방지 가드를 **좁혔다** — 링크가 있기만 하면 막던 것을, 그 링크의 벽이
  **이 카드에 실제로 설 때만** 막게 했다(`culvertWallsStandAt`). 관이 아홉·열하나인
  노선에서는 링크가 거의 모든 측점을 덮어 독립 벽 경로가 통째로 죽어 있었다.

화면 확인: 벽 터파기 「기초유 · 폭 1.62m · 깊이 0.50m (수직)」, 관 터파기 Φ1000 1.80m ·
Φ800 1.60m, 그려진 선 전부 좌우 변이 수직.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:16:24 +09:00
eomsangdon 62f7e0eccb Merge remote-tracking branch 'origin/sub_laptop_1' into sub_desktop_1 2026-09-08 22:10:03 +09:00
eomsangdon 547ee85116 Merge remote-tracking branch 'origin/main_desktop_1' into sub_desktop_1 2026-09-08 22:10:00 +09:00
eomsangdonandClaude Opus 5 b2ad1952f1 feat(B09): 축이 셋인 품셈 표 읽기 — 가설창고·돌붙임이 처음으로 섬 (확정 ⑬)
값 한 칸에 세로축 값이 공백으로 뭉쳐 든 표를 행-자원으로도 열-자원으로도 못 읽어
두 표가 한 줄도 안 서고 있었음.

- 11-1 콘테이너형 가설건축물 F0325: 0 → 40 줄 (길이 4 × 폭 5 × 직종 2)
  `reference` 로 찍혀 형태 필터에 걸려 버려지고 있었음
- 13-5-1 돌붙임(인력) F0416: 0 → 80 줄 (메·찰 × 돌 3종 × 뒷길이 7 × 직종 2)
  「뭉친 자원 줄의 이름을 못 풀었습니다」로 버려지고 있었음

읽는 법 — 맨 아랫줄이 값, 그 위가 자원 이름, 더 위가 묶음 이름. 칸 수와 숫자 개수가
딱 나뉘지 않으면 한 줄도 세우지 않고 unmatched 로 보냄.

짓다 잡은 함정 넷
- 꼬리의 「비고」 칸(「H=2.6M 기준 …」)을 값으로 세면 표 전체를 못 읽음 — 꼬리만 떼어 냄
- 자원 줄에 줄머리가 있는 표와 없는 표가 섞여 있음 — 무조건 앞칸을 버리면 자원 하나가
  통째로 사라짐(11-1 이 7 대 8 로 어긋났음). 있는 그대로 세고 안 맞으면 앞칸을 떼어 봄
- 묶음 줄은 반대로 앞칸(축 이름)을 먼저 떼야 함 — 안 떼면 「구 분」이 묶음으로 서서
  메·찰이 통째로 사라짐
- 「구 분」·「종 별」은 자간을 벌린 한 낱말임 — 축 둘로 읽으면 갈래가 「구 메 붙 임」이 됨
- 「-」 는 그 규격이 없다는 뜻 — 0 으로 세우면 공짜 공종이 됨(야면석 70㎝ 넷)

가로채기 방지 — 값줄 위가 단위 줄인 4축 표(10-6-3)는 자원 이름이 하나도 안 풀리므로
내 표가 아니라고 보고 손대지 않음. 전체 대조로 늘어난 표가 F0325·F0416 둘뿐이고
줄이 줄어든 표는 없음을 시험으로 못 박음.

검증: 자원 축 419 → 539 줄 · 일위대가 갈래 60개 신설 · pytest 272 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 22:09:46 +09:00
eomsangdonandClaude Opus 5 2b2906466e feat(B07): 표준도 제원 칸 일곱 완성 — 야면석 계수·채움 강도 + 터파기 상수 한 벌로
⑨ `stone_coeff_basis`(품셈 / 실무 관행) · ⑩ `fill_concrete_mpa`(180 / 210) 를 폼에 붙임.
둘 다 **빈 값이 기본**(품셈 열 · 210) — 값을 미리 적어 두면 「안 정함」이 사라짐.
없는 갈래는 막지 않고 알림. ⇒ 칸 일곱: 돌 종류 · 조달 · 뒷길이 · 기초 · 전면 기울기 ·
야면석 계수 · 채움 강도.

⚠ **그림이 또 죽어 있었음** — `STONE_MASONRY["excavation_extra_m"]` 이 사라져 `KeyError`.
터파기 수가 `common_util_excavation` 으로 옮겨 갔음(내가 정본 xls 에서 낸 값들).
그림도 **그 한 벌**을 읽게 바꿈 — 횡단도와 같은 상수라야 두 도면이 같은 터파기를 그림.
```
WALL_TRENCH_CLEARANCE_M 0.2 · WALL_FOUNDATION_WIDTH_M 0.9 · WALL_FOUNDATION_DEPTH_M 0.5
WALL_BLINDING_WIDTH_M 0.7 · WALL_BLINDING_DEPTH_M 0.1
```
그림에 **기초 칸을 그림** — 「기초유」 0.9×0.5 · 「기초버림」 0.7×0.1.
**안 정한 장은 기초를 안 그림**(지어내지 않음).

⚠ 오늘 두 번째임 — 공용 상수 **이름이 바뀌면 그림이 죽음**. 값이 한 벌인 것과 별개로
이름 변경은 서로 알려야 함.

실화면 확인 — 칸 일곱이 다 서고, 야면석 계수 「실무 관행」·채움 강도 「180」 저장 →
「2개소에 반영했습니다」, 정본에 그 장의 두 개소만 들어감.

자체검증 — 새 시험 3건 + 회귀 586 통과 · 0 실패, `tsc --noEmit` 0.
⚠ 병합 여파로 깨진 등록부 규정 시험을 고침 — 「빈 칸이 곧 기본」인 칸 셋
(`face_slope_ratio`·`stone_coeff_basis`·`fill_concrete_mpa`)을 규정에서 뺌.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:58:27 +09:00
eomsangdon 27b59ea93b Merge remote-tracking branch 'origin/sub_laptop_1' into main_desktop_1 2026-09-08 21:50:45 +09:00
eomsangdon 10bcf3a068 Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-08 21:50:43 +09:00
eomsangdon 86b0438c7a Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 21:50:42 +09:00
eomsangdon bfc98bf422 Merge remote-tracking branch 'origin/main_laptop_1' into sub_laptop_1 2026-09-08 21:50:08 +09:00
eomsangdon a4bd5bedca Merge remote-tracking branch 'origin/main_desktop_1' into sub_laptop_1 2026-09-08 21:50:08 +09:00
eomsangdonandClaude Opus 5 a69f8af82d feat(B08): 돌 중량 근거 · 계수 갈래 칸 · 채움콘 강도 칸 (확정 2차 ⑤·⑨·⑩)
⑤ 돌 중량 — 지식DB 전수 확인 결과 품셈·교본에 돌중량표 없음. 값(0.88 계열)은
   그대로 두고 출처(울진 소광 원단위 라이브러리)를 산출근거·source 에 남김
⑨ `stone_coeff_basis` — 빈 값이면 품셈 열(야면석 0.11·0.15)이 기본, 「실무 관행」이면
   건설품셈 참고자료 열(0.15·0.20)로 덮이고 그 사실이 사유로 뜸
⑩ `fill_concrete_mpa` — 빈 값이면 210, 180 을 고르면 그 값이 이김. 아는 값이 아니면
   기본으로 서되 사유에 저장값을 적음
- Component 에 `spec` 칸 추가 — 같은 이름이라도 단가가 갈리는 값을 받는 쪽에 넘김
- 기본값은 등록부가 아니라 계산 쪽이 가짐(등록부 default 는 비어 있음 = 「안 정함」)
- tmp/tests/test_b08_coeff_and_strength.py 신설(6건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:49:52 +09:00
eomsangdonandClaude Opus 5 ae52ba7699 feat(B05·B06): 터파기 축을 관에도 · 독립 벽까지 잇고, 계수·강도 칸 신설
- `pipe.revet_foundation`(기슭막이 기초) 신설 — **유입·유출 한 칸**. 한 공사에서 한쪽만
  기초유로 하는 일이 드물어 폼을 둘로 안 늘렸다. 실무가 갈라 쓰면 그때 나눌 것.
- 독립 기슭막이·돌쌓기 갈래도 이음: 구조물 정본 `foundation` → `RevetmentSpec` →
  `RevetmentLayout.foundation` → 터파기 그림. ⚠ 이름을 저장 칸과 **같은 글자**로 뒀다.
- ⑨ `stone_coeff_basis`(품셈/실무 관행) · ⑩ `fill_concrete_mpa`(180/210) 칸 신설.
  ⚠ **기본값 없음** — 「비어 있음 = 아직 안 정함」이고 기본값(⑨ 품셈 · ⑩ 210)은 계산 쪽이 갖는다.
- 저장 왕복 확인: PUT 200 → 되읽기에서 "실무 관행"·"180"·"기초유" 그대로.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:48:54 +09:00
eomsangdonandClaude Opus 5 fe032bccce feat(B08): 잡석다짐 폭을 하단 길이로 유도 — 버림 폭 잠정 제거 (확정 2차 ⑪)
- 확정 ⑪ 「기준 구조물에서 유도 — 기슭막이면 하단 길이」 ⇒ 벽에서 하단 길이 = 하부 두께
- 버림 콘크리트 폭이 옛 잠정(터파기 폭 = 평균두께 + 0.2)에서 하부 두께로 바뀜
  (H2.5·45 → 1.175 → 1.20㎥ / H1.5·45 → 1.025 → 0.90㎥ / 10m 기준)
- 큰돌쌓기는 직경 위끝을 하단 길이로 준용
- ⚠ 기초잡석(12-25)은 폭이 생겨도 **두께가 원문에 없어** 물량을 안 세우고 사유를 냄
  (실무 관측은 관보호공 날개벽 T=0.2 하나뿐 — 다른 구조물 값을 옮겨 쓰지 않음)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:45:18 +09:00
eomsangdonandClaude Opus 5 e128f651fc feat(B07): 표준도 제원에 「기초」 칸 + 그림을 새 두께 식에 맞춤
**기초 칸**(`foundation` — 기초유 / 기초버림, 정본 xls 탭 제목 그대로)
터파기 기초 몫이 0.5×(0.7+0.2)=0.45 대 0.1×(0.7+0.0)=0.07 ㎥/m 로 갈리고, 횡단도
터파기 선도 같은 칸을 봄. 고를 자리가 어디에도 없어 비어 있던 값임.
정본에 없는 갈래를 넣으면 **막지 않고 알림**(기존 네 칸과 같은 결). 비우면 키를 지움.

**그림을 새 두께 식에 맞춤** — 데스크탑 메인이 `STONE_MASONRY` 를 갈면서
`thickness_base_m`·`thickness_top_coeff`·`thickness_bottom_coeff` 가 사라져
그림이 `KeyError` 로 죽었음(도면이 「읽지 못했습니다」로 뜸). 실화면에서 잡았음.
  상부 = 뒷길이 + 0.30 · 하부 = 상부 + 0.30 × (H − 1.0)
  H=1.0 ℓ45 → 0.75/0.75 · H=1.5 ℓ35 → 0.65/0.80 · H=2.0 ℓ35 → 0.65/0.95 ·
  H=2.0 ℓ45 → 0.75/1.05 · H=3.0 ℓ45 → 0.75/1.35   ← 실무 원본과 전부 일치

⚠ **뒷길이를 안 정한 장은 두께를 못 내므로 그리지 않음** — 0 으로 때우면 거짓 그림이 됨.

⚠ 배운 것 — 「그림이 상수를 직접 읽으니 저절로 따라온다」가 **키 이름이 바뀌면 깨진다**는
   것으로 드러남. 값은 한 벌이 맞으나 **이름이 바뀌는 것은 예고가 필요함.**

실화면 확인 — 「표준도 3장」에서 기초 「기초유」 저장 → 「2개소에 반영했습니다」,
정본 실측 `[기초유, null, 기초유, null, null]`(그 장의 두 개소에만).

자체검증 — 새 시험 3건 + 회귀 583 통과 · 0 실패, `tsc --noEmit` 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:44:28 +09:00
eomsangdonandClaude Opus 5 f6f9392e1b feat(B08): 「입적」 줄 신설 — 정본 계산표 좌측 열 이름 그대로 (확정 ⑦)
- 입적 = 정면적 × 평균두께 · 단위 ㎥ · destination `reference`
- 값을 새로 내는 것이 아니라 이미 쓰던 밑수를 화면에 드러내는 줄
- 자재총괄·토공·일위대가 어디에도 안 섞임
- 「석적」은 정본에 없어(소광리 시트에만) 내지 않음

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:40:27 +09:00
eomsangdonandClaude Opus 5 b9c9490767 feat(B08): 벽 터파기를 공용 단면 함수로 교체 — 기초 유/무 축 반영
- 터파기·되메우기·잔토를 `common_util_excavation.wall_trench_area_m2` 한 벌로
  옮김(화면 B06 과 짝인 TS 가 같은 값을 냄) — 돌쌓기·큰돌쌓기 공용 `_trench_components`
- `options.foundation` 「기초유」 = 기초분 0.45㎥/m · 「기초버림」 = 0.07㎥/m
- 안 고른 프로젝트는 비탈분만 세우고 사유를 냄 — 한쪽으로 찍으면 0.45 가 임의로 굳음
- 되메우기 = (기초깊이 + H) × 0.2 × 연장 · 잔토 = 터파기 − 되메우기
- 터파기 여유폭·되메우기 두께 상수를 엔진에서 지우고 공용 모듈을 가리키게 함
- tmp/tests/test_b08_wall_trench.py 신설(7건)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:37:18 +09:00
eomsangdon 2c48ca6b1c Merge remote-tracking branch 'origin/sub_desktop_1' into sub_laptop_1 2026-09-08 21:37:02 +09:00
eomsangdon c8ff729976 Merge remote-tracking branch 'origin/main_laptop_1' into sub_laptop_1 2026-09-08 21:37:01 +09:00
eomsangdonandClaude Opus 5 bec7e841e0 feat(B06): 횡단도에 터파기 선 — 관은 법정 표값 폭, 벽은 실무 정본 수직
사용자 확정 ④ 「터파기가 횡단도에서 표현이 안 된다 → 교본·실무문서로 구현 →
노티스 → 사용자가 선택」.

- 관: 관 위에서 관 바닥까지 **표값 폭**으로 수직(KCS 44 40 10 그림 3.2-1).
  표에 없는 관경이면 **안 그린다** — 폭을 지어내지 않는다.
- 벽: 벽 바닥선 아래로 **수직**(정본 식에 기울기 항 없음). 폭 = 바닥폭 + 여유 0.2,
  깊이 = 기초유 0.5 / 기초버림 0.1.
- ⚠ `foundation` 이 비어 있으면 **안 그린다** — 고르기 전에는 근거가 없다.
- 말풍선에 **근거의 급을 갈라** 적는다: 관은 「법정 표」, 벽은 「품셈에 규정이 없어
  실무 관행으로 정한 값」.
- 파선(`.b06-chart__excavation`)으로 구조물보다 먼저 그려 벽 밑에 깔린다.

화면 확인: 관 터파기 5개소, Φ1000 → 1.80m · Φ800 → 1.60m (표값 그대로).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:35:24 +09:00
eomsangdonandClaude Opus 5 6d6079341f feat(B09): 조종원 노임에 제수당·상여금·퇴직급여충당금 계수 반영
사용자 확정 2차 ③ — 기술문서 DB 를 먼저 뒤지고, 계수 원문이 없으면 실무 기준 + 노티스.

근거 (원문 확인분)
- 대한건설협회 임금적용요령 4-나 (재경원 회계45101-45, 1995.1.13): 공표 노임은
  **기본급여액**이며 제수당·상여금·퇴직급여충당금은 예정가격작성기준에 따라 별도 계상
- 기재부 「(계약예규) 정부 입찰·계약 집행기준」 제76조의3(노무비의 계상):
  노임 + 제수당 + 상여금(연 400% 한도) + 퇴직급여충당금
- 품셈 8-1-2 5.6호가 운전사 노임을 그 예규로 넘김

미확인 (노티스로 드러냄)
- 예규 원문 자체는 저장소에 없음 — 위 둘은 인용 문서
- 16/12 는 상여 연 400% 와 산술이 일치하나 25/20 은 원문 근거 못 찾음
- 실물 셋이 같은 계수 사용: 실무 두 공사지·임도교본 예제·다산 ESTX 기준계수 0.20833

구현
- `OPERATOR_ALLOWANCE_FACTOR` = 16/12 × 25/20, 근거·한계 주석을 이 한 곳에 모음
- 나눗수 8시간은 그대로 두고 **곱셈으로만** 적용 — 나눗수를 줄이면 작업효율을
  시간당 사용료에 넣은 것이 되어 ㉣ 위반. 검사(`check_operator_hours_basis`)에도
  계수를 넘겨 곱셈 자리를 드러냄
- 일위대가 조종원 줄·A10 인건비·중기 탭 노티스를 같은 문구로 맞춤

검증 (79da822d 기준)
- 굴착기 0.7  86,096.4 → 109,704.5 (+27.4%) · 불도저 19t 124,842.3 → 148,450.4 (+18.9%)
- 조종원 수량 0.20833 = 다산 ESTX 기준계수와 일치
- 실무 시트 재현: 267,360 ÷ 8 × 계수 = 55,700 (시트 값과 일원까지 일치)
- 본체 11,356,910 → 12,141,903 (+784,993, +6.9%)
- pytest 267 통과 · tsc 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:32:26 +09:00
eomsangdon 09a5eee338 Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 21:31:38 +09:00
eomsangdonandClaude Opus 5 8141eb34e4 feat(B08): 돌쌓기 벽 두께를 실무 구조물도 식으로 교체 (확정 2차 ②)
- 상부 = 뒷길이(ℓ3) + 0.30 · 하부 = 상부 + 0.30 × (H − 1.0) · 평균이 두께
- 옛 식(0.45 + 0.10H / 0.45 + 0.40H)에는 뒷길이가 없어 35↔45 를 바꿔도
  돌 부피·막자갈·터파기가 같은 값으로 섰음
- H ≤ 1.0 은 (H−1) 몫을 0 으로 눅여 하부가 상부보다 얇아지지 않게 함
- 산출근거 문구에 식을 남김 — 막자갈·터파기 두 줄
- tmp/tests/test_b08_wall_thickness.py 신설(7건), 옛 두께를 못 박던
  test_b08_stone_kind.py 의 막자갈 밑값 15.130 → 12.630 정정

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:31:23 +09:00
eomsangdonandClaude Opus 5 d175c6e457 feat(공용): 터파기 단면 — 관은 법정 표, 벽은 실무 정본 식 + 「기초유/기초버림」 칸
사용자 확정 ④ 「터파기를 횡단도에서 표현 → 노티스 → 사용자가 선택」의 밑감.
근거의 급이 달라 갈라 둔다.

- 관: `KCS 44 40 10 배수관 §3.2(4) 그림 3.2-1` 표 그대로(Ø800→1.6 · 1000→1.8 ·
  1200→2.1 · 1500→2.5 m). ⚠ 관경+2b 로 계산하지 않는다 — 표가 관 두께·여유를 담고 있다.
  표에 없는 관경은 `None` — 지어내지 않는다.
- 벽: 법정 근거 없음(교본은 「설계도서 지시」까지). 실무 정본 xls 7탭 식 —
  기초 0.5×0.9(기초버림이면 0.1×0.7) + H×(평균두께+0.2). ⚠ **비탈 없음(수직)**.
- 레지스트리에 「기초」 칸(기초유/기초버림) 신설 — 정본 탭 제목 그대로. 그림·물량이 같은 축.
- 파이썬·TS 짝 + 거울 시험. 실무 수치(H=1·2·3 → 1.48·2.51·3.54)와 맞는지도 잠금.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:29:39 +09:00
eomsangdonandClaude Opus 5 b6bc9b9a54 feat(B08): 층따기 길이 칸 — 면적 × 길이로 ㎥ 를 냄 (확정 2차 ①)
 사용자 확정 2차 ① — 「㎡ 유지. 부피는 **사용자가 지정한 길이값을 곱해** 쓴다」.
그러면 품셈 ㎥ 단가를 그대로 쓸 수 있어 **단위 불일치가 풀림**(2,124만원 자리).

- 설정 `quantity.bench_cut_depth_m` 신설. [저장]으로도 넣을 수 있게 요청 모양에 칸을 두고,
  「안 정함」으로 되돌릴 수 있게 nullable 목록에도 넣음.
- 인계 줄: 길이가 있으면 **면적 × 길이 = ㎥** 로 내고, 규격 칸에 「면적 13,696.75㎡ ×
  길이 0.5m」로 **어디서 온 값인지** 남김.
- ⚠ **면적을 없애지 않음** — 횡단도 하단 표가 면적을 씀. ㎥ 를 덧붙이는 것.
- ⚠ **길이 기본값을 임의로 박지 않음** — 없으면 종전처럼 막고 사유를 냄
  (교본 「층따기 높이·폭은 **설계도서에 명시**」라 설계 입력임).
- 매핑 밑수를 ㎥ 로 되돌리고 그 까닭을 적음(공식이 체적 기준).

실측 — 길이 0.5m 를 넣으면 13,696.75㎡ → **6,848.375㎥** 로 서고 in_bill True.
안 넣으면 0 · input_missing · 「길이를 넣으면 면적 × 길이로 물량이 섭니다」.

시험 748 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:23:12 +09:00
eomsangdonandClaude Opus 5 918e7c12da fix(B07): 표준도가 단면유형을 안 넘겨 기울기 판정이 통째로 꺼져 있던 것
표준도가 `build_table` 을 직접 부르면서 `section_modes` 를 안 넘겨, 성절토를 가를 근거가
없다며 **전 구조물이 종전값 1:0.3** 으로 섰음. 값이 없는 게 아니라 **안 넘긴 것**이었음.

`section_modes_from_designs` 한 벌을 그대로 씀(부르는 쪽마다 다시 짜면 B08 과 갈림).
노선은 `get_workflow_route_context` 로 찾고, 못 찾으면 빈 표 — 성토로 눅이지 않음.

⚠ 고치고 나니 **제목·그림이 표와 갈렸음** — 표는 판정된 1:0.35, 제목은 다시 판정하며
근거를 못 받아 1:0.3. 실측으로 잡았음. 그래서 **표를 만든 그 판정을 시트에 실어**
제목·그림이 같은 값을 쓰게 함(`face`·`face_reason`). 자리를 고르는 것도 B08 이 쓰는
`_section_mode_at` 과 판정 한 벌 `structure_face_role` 을 그대로 부름.

실측 (프로젝트 936be972) — 제목과 표가 **같은 값**
```
큰돌쌓기  H=2.5  제목 1:0.3   표 0.3    면적 2.6101
돌쌓기(메) H=2.0  제목 1:0.35  표 0.35   면적 2.1190   ← 메쌓기가 갈림
돌쌓기(찰) H=2.5  제목 1:0.3   표 0.3    면적 2.6101
옹벽      H=2.0  기울기 없음(판정 대상 아님)
```
표 산출근거에 판정 경로가 그대로 뜸 — 「품셈 13-4-4 [주]⑪ 표준경사 · 메쌓기 성토 ·
직고 2m ≤3m → 1:0.35 · right_cut · 자동(성토 쪽) → 성토면」.

앞서 `face_slope_ratio({}, wet=…)` 로 확인한 「근거 없음」은 `face` 를 안 준 호출이라
**정상 동작**이었음 — 함수가 성토로 안 눅이게 짠 결과.

자체검증 — 회귀 580 통과 · 0 실패. 세 라우터 모두 700줄 안(588 · 190 · 692).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 21:01:46 +09:00
eomsangdon 223ff86397 Merge remote-tracking branch 'origin/main_desktop_1' into sub_laptop_1 2026-09-08 20:52:07 +09:00
eomsangdonandClaude Opus 5 c3975f4ec1 refactor(B08): 측점별 단면유형 표를 공용 함수로 냄 (B07 표준도가 같이 쓰게)
기울기 판정이 `section_mode` 를 받아야 도는데, 그 표를 만드는 코드가 B08 라우터 안에만
있었음. B07 표준도는 `build_table` 을 직접 부르면서 그 인자를 못 줘 **늘 「가를 근거 없음」**
으로 떨어졌음(랩탑 보조 실측).

⇒ `section_modes_from_designs(designs)` 를 엔진에 두어 **부르는 쪽마다 다시 짜지 않게** 함.
B07 은 저장된 횡단 설계 목록을 이 함수에 넣어 `build_table(..., section_modes=…)` 로 주면 됨.

⚠ 동작은 그대로 — `section_mode` 가 없는 측점은 담지 않고, 못 가르면 여전히
「가를 근거 없음 + 종전값 1:0.3」으로 섬(성토로 눅이지 않음).

내 프로젝트 실측 유지 — 돌쌓기(메) H=2.0 **1:0.35 · 21.190㎡**,
근거 「… right_cut · 자동(성토 쪽) → 성토면」.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 20:50:22 +09:00
eomsangdon 698df48697 Merge remote-tracking branch 'origin/main_desktop_1' into sub_laptop_1 2026-09-08 20:43:11 +09:00
eomsangdonandClaude Opus 5 ca00ac278d feat(B07): 표준도를 「보여주기」에서 「고치기」로 — 제원 네 칸 입력
`phase: "detail"` 칸(돌 종류·조달·뒷길이·전면 기울기)을 **그리는 화면이 없었음**
(2026-09-09 실측: B06 구조물 폼은 b05 phase 열 칸만 그림. 화면 글자 전수에서 「조달」·
「뒷길이」·「돌 종류」 0건). 그 자리를 표준도가 맡음 — PLAN 4-5b 「표준도는 입력 화면이기도 함」.
B06 은 「어디에·몇 m」(배치), 표준도는 「어떤 제원」.

**장 하나 = 제원 조합 하나**라 한 번 고치면 그 조합의 개소 전부에 걸림.

지킨 것
  · **자동값을 저장에 박지 않음** — 빈 칸이 「정한 적 없음」의 뜻(확정 ⑨). 비우면 그 키를
    지움. 판정된 기울기는 칸이 아니라 **회색 도움말**로만 비춤.
  · **막지 않음** — 실무 도면에 1:0.7·1:0.8 이 실재(구조물도 53장). 품셈 범위(0.20~0.50)
    밖이어도 값은 받고 안내만.
  · **값을 여기서 셈하지 않음** — 정본에 적기만 하고 표·그림은 다음 조회에서 그 정본으로
    다시 섬. 표준도가 두 번째 정본이 되면 안 됨.

⚠ 만들다 잡은 것 셋
  ① `face_slope_ratio` 가 **구조물 등록부에 없어** 저장이 통째로 거절됐음
     (`ValueError: 돌쌓기(찰)에 정의되지 않은 옵션입니다`). 한 칸 때문에 전부 못 저장되는
     것은 나쁨 — 등록부에 없는 칸은 **빼고 이름으로 알림**(조용히 버리면 저장된 줄 앎).
     그 칸 신설은 랩탑 메인 몫.
  ② 저장 뒤 표·그림을 다시 받으면서 **폼이 새로 그려져 안내가 지워졌음.** 밖에서 들고
     있다가 다시 넣음.
  ③ **장 제목에 제원이 들어 있는데 좌측 단추 글자가 안 따라왔음.** 목록을 통째로 다시
     받지 않고 표준도 줄만 갈아 끼움.

실화면 확인 (프로젝트 936be972, 개발 우회로로 열어서)
  「표준도 2장」에서 돌 종류 견치돌·뒷길이 55 로 저장 →
    단추 글자가 「…뒷길이 35㎝ 야면석·호박돌」 → 「…뒷길이 55㎝ 견치돌」로 **즉시 바뀜**
  기울기 0.7 저장 → 안내 셋: 「1개소에 반영했습니다」 · 「1:0.7 는 품셈 표준경사 표
    범위(1:0.2~1:0.5) 밖입니다 — 값은 그대로 씁니다」 · 「「전면 기울기」 칸이 masonry_dry
    등록부에 아직 없어 저장하지 못했습니다」
  조달 「구입」 저장 → 그 장의 **2개소에만** 들어가고 다른 장은 그대로(정본 실측)
  확인 뒤 **지정받은 제원으로 되돌리고 우회로도 닫음**(목록 409 복귀).

700줄 제한으로 표준도 라우터를 `B07_DesignDetail_Router_Standard.py` 로 뗌(579 + 153).

자체검증 — 새 시험 7건 + 회귀 580 통과 · 0 실패, `tsc --noEmit` 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 20:41:43 +09:00
eomsangdonandClaude Opus 5 1b03ad025a feat(B08): 성토/절토를 판정 한 벌로 받아 표준경사 열을 고름 (확정 ⑨ 마무리)
앞서 「성토 열로 잠정」 딱지를 달아 두었던 자리를 채움. 랩탑 메인이 낸 공용 함수
`common_util_structure_face_role(section_mode, side)` 를 **그대로** 부름 —
판정을 두 벌로 짜면 `both_cut` + 「자동」 예외에서 갈리므로 우리 쪽에 다시 안 짬.

- 새 저장 키 없음 — 이미 저장되는 `design.section_mode` 와 구조물 `options.side` 만 씀.
  라우터가 측점별 단면유형을 모아 넘기고, 구조물은 **가장 가까운 측점** 값을 씀.
- ⚠ 못 가르면 `None` 을 **성토로 눅이지 않음** — 종전값 1:0.3 으로 서되 **왜 못 갈랐는지**를
  근거 줄에 적음. 임의값이 금액으로 굳으면 안 됨.
- 근거 줄에 판정 문구가 그대로 실림 — 「… 1:0.35 · right_cut · 자동(성토 쪽) → 성토면」.

곁들여 — 전면 기울기 칸이 레지스트리에 생겨(`ebdf2988`) 「아직 칸이 없음」 문구와
없는-키 목록에서 뺌. ⚠ 표 밖 값(실무 도면의 S0.7·0.8)은 **막지 않고 그대로** 씀 —
접으면 사용자가 넣은 값이 조용히 다른 값이 됨. 시험으로 잠금.

검증 프로젝트 실측 — 62측점 전부 `right_cut`, 돌쌓기 「자동(성토 쪽)」 → 성토면.
잠정으로 쓰던 열과 **결과는 같고 근거가 값에 생김**. 돌쌓기(메) 21.190㎡(1:0.35) 유지.

시험 747 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 20:27:40 +09:00
eomsangdonandClaude Opus 5 d93bfca3e0 feat(B07): 확정 없이 도면을 열 수 있게 — 개발 우회로(서버가 막고 개발에서만 엶)
B07 409 는 워크플로 단계가 아니라 **종단 레코드 상태**(`longitudinal_sections.status`)를
보는 가드라 `dev/unlock` 으로 안 풀렸음. 읽는 쪽만 우회함.

지킨 것 넷
  1. **문은 서버가 막음** — 화면 표시로 여는 것이 아님. 운영에서는 그대로 409
     (`is_dev_environment()` 가 거짓이면 우회가 아예 없음).
  2. **표식이 실제로 있을 때만 엶** — 개발환경이라고 무조건 열지 않음. `dev/unlock` 이
     4단계를 풀어 둔 프로젝트만. 그래야 되돌리기(DELETE)로 다시 닫힘.
  3. **레코드는 안 건드림** — `status` 는 `DRAFT` 그대로. 상태를 올리면 그것이 곧
     「확정 흉내」라 `common_util_dev_unlock` 이 스스로 금지한 자리와 같아짐.
  4. **열렸다는 것이 화면에 뜸** — 좌측 목록 머리 아래 「확정을 건너뛴 상태입니다 —
     개발 전용. 값이 비어 보일 수 있습니다.」 조용히 열면 다음 사람이 헤맴.

실화면 확인 (프로젝트 936be972)
  목록 200 · `dev_bypass: true` · 도면 34장 · 안내 문구 뜸
  표준도 4장 제목에 판정된 기울기 — 「표준도 2장 (돌쌓기(메) H=2 **1:0.35** 뒷길이 35㎝
  야면석·호박돌)」 · 찰은 1:0.3

자체검증 — 회귀 573 통과 · 0 실패, `tsc --noEmit` 0, prettier 는 바꾼 파일만.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 20:25:06 +09:00
eomsangdon 20738bd169 Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 20:22:30 +09:00
eomsangdon a35215a598 auto: 2026-09-08 20:22 (EOMSANGDON-HOME) 2026-09-08 20:22:26 +09:00
eomsangdonandClaude Opus 5 e29f55782e feat(공용): 구조물 자리의 성토/절토 판정 한 벌 + 전면 기울기 범위 안내
품셈 표준경사 표가 높이 × 메/찰 × **성토/절토** 로 갈리는데 성절토만 없었다.
새 입력을 만들지 않고 이미 저장되는 두 값으로 가린다 —
`design.section_mode` + 구조물 `options.side`.

- `common_util_structure_face_role.structure_face_role()` — ("성토"|"절토"|None, 까닭 문구).
  ⚠ 못 가르면 **None**. 성토로 눅이지 않는다 — 받는 쪽이 근거 없음을 알아야 한다.
  예외 하나: `both_cut` + 「자동(성토 쪽)」은 세울 성토면이 없어 근거 없음.
  판정을 두 벌로 짜면 그 예외에서 갈리므로 여기 하나만 둔다(CLAUDE.md 5장).
  파이썬 단독 — 읽는 쪽이 B08 뿐이다. 화면이 쓰게 되면 그때 TS 짝·거울 시험을 붙일 것.
- 전면 기울기 칸: 표 범위(0.20~0.50) 밖이면 **막지 않고 알리기만** 한다.
  실무 도면이 S0.7·S0.8 을 쓴다 — 막으면 실물이 안 들어간다.

시험 14건(네 단면유형 × 좌/우 여덟 · 자동 셋 · 모르는 값 · 옛 영문 표기 · 문구).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 20:21:12 +09:00
eomsangdon e4b8facf88 Merge remote-tracking branch 'origin/sub_desktop_1' into main_desktop_1 2026-09-08 20:19:17 +09:00
eomsangdon 713726977e Merge remote-tracking branch 'origin/main_laptop_1' into main_desktop_1 2026-09-08 20:19:16 +09:00