Commit Graph
98 Commits
Author SHA1 Message Date
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
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 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 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
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 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 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 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
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 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 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 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 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
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 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 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
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
eomsangdon a35215a598 auto: 2026-09-08 20:22 (EOMSANGDON-HOME) 2026-09-08 20:22:26 +09:00
eomsangdonandClaude Opus 5 9ea0572f69 fix(B08): 큰돌쌓기 메/찰 사유가 값을 고른 뒤에도 뜨던 것
`bond` 는 레지스트리에 이미 있는 칸인데 사유를 **조건 없이 붙이고** 있어, 메쌓기·찰쌓기를
고른 구조물에도 「메/찰 구분이 없어 못 고름」이 그대로 떴음.

⚠ 얻는 것은 **노무 품 갈래뿐**이고 재료 원단위는 13-6 [주]⑦ 때문에 여전히 안 섬 —
그래도 고치는 까닭은 **사유가 거짓이면 사유 칸 전체를 못 믿게 되기 때문**임.
재료 미확보 사유는 아직 참이라 그대로 둠.

시험 762 통과(새 1건 포함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 20:09:44 +09:00
eomsangdonandClaude Opus 5 0d577cf463 feat(B08): 돌쌓기 기울기를 품셈 표준경사표로 자동 판정 (사용자 확정 ⑨)
⚠ 확정 ⑨ 가 통째로 미구현이었음 — 레지스트리에 `face_slope_ratio` 칸이 없어 **늘 1:0.3**
으로 돌았고, 찰 H=2.5 와 메 H=2.0 이 같은 기울기로 나왔음. 우리 0.3 은 실은
**「메쌓기·성토·직고 1.5m 이하」 한 칸**이었음.

품셈 13-4-4 [주]⑪ <표준경사>를 데이터로 두고 **직고 · 메/찰 · 성토/절토** 셋으로 고름.
  메 성토 0.30 0.35 0.40 0.45 0.50 · 메 절토 0.25 0.30 0.35 0.40 0.45
  찰 성토 0.25 0.30 0.35 0.40 0.45 · 찰 절토 0.20 0.25 0.30 0.35 0.40

⚠ 경계값은 **앞 칸** — 원문 표기가 `∼1.5 · ∼3` 이라 이하로 읽음(직고 3.0m → `~3` 칸).
   7.0m 은 `~7`, 그보다 커야 마지막 칸. 해석을 데이터·주석·시험에 함께 박음.
⚠ **성토/절토가 저장에 아직 없음** — 레지스트리에 없는 키를 읽지 않고 **성토 열로 잠정**
   적용하며 **근거 문구에 그 사실을 적음**. 값이 생기면 한 줄만 바꾸면 됨.
⚠ 저장 제원에 값이 있으면 **그 값이 이김**(확정 ⑨). 자동으로 고른 값은 **저장에 안 박음** —
   「정한 적 없음」과 「0.3 으로 정함」이 구별돼야 함.
⚠ 큰돌쌓기는 이 표 대상이 아님 — 교본이 「1:0.3 **이상**」으로만 둠. 그대로 둠.

검증 프로젝트 실측 — 돌쌓기(메) H=2.0 면적 **20.881 → 21.190㎡(+1.5%)**, 찰 H=2.5 는
1:0.3 그대로. 옛 시험 셋이 「늘 1:0.3」을 계약으로 못 박고 있어 기울기를 명시하도록 정정.

시험 761 통과(새 7건 포함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:51:33 +09:00
eomsangdonandClaude Opus 5 1eff0931ae fix(B08): 버림 타설의 갈래를 「무근구조물」로 되돌림 — 이름만 가름
⚠ 앞 커밋(`bfd10b57`)이 `variant_value` 까지 「무근,버림」으로 바꿔 **금액이 통째로
빠졌음**(B09 실측 275,584원 · 본체 합계 9,587,677 → 9,312,093). 품셈 12-1-1 의 갈래는
**무근구조물·소형구조물·철근구조물 셋뿐**이라 「무근,버림」은 **없는 갈래**였음.

⇒ 갈래(`variant_value`·`structure_kind`)는 **무근구조물**로 되돌리고, 실무 줄 이름은
**표시 문구(`spec`·`spec_detail`)에만** 둠. 근거 — 봉화 제50호표가 줄 이름은
「레미콘타설(장비) 무근,버림」인데 **단가는 「무근」과 같음**. 실무도 줄만 가르고 품은
무근 것을 씀.

⚠ 받는 쪽이 문자열을 눅여 읽는 방식은 쓰지 않기로 함 — 그러면 다음 갈래가 조용히
잘못 붙음. **보내는 쪽에서 바로잡는 것**이 맞음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:36:27 +09:00
eomsangdonandClaude Opus 5 594f2d5922 fix(B08): 부대시설 개소를 [저장]으로도 넣을 수 있게 (사용자 확정 ⑬ 마무리)
⚠ 어제 넣은 `ancillary_counts` 를 **엔진은 읽는데 저장 요청 모양에는 없었음** — 화면에서
넣을 길이 없어 스크립트로만 넣히던 자리였음(`stone_supply` 가 레지스트리에 없어 저장이
거부되던 것과 같은 계열 — **읽는 자리와 넣는 자리가 안 맞는 것**).

`QuantitySettingsBody` 에 칸을 두고, 「통째로 갈아 끼우는 칸」 목록에 넣음 — 병합이면
개소를 **지울 수가 없음**(0 으로 되돌리려면 통째 교체라야 함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:32:46 +09:00
eomsangdonandClaude Opus 5 bfd10b57f8 fix(B08): 버림 타설 줄을 실무 이름으로 갈라 냄 (「무근,버림」)
실무 내역이 「레미콘타설(장비) **무근,버림**」으로 갈라 적음(봉화 제50호표,
2026-09-09 데스크탑 보조 확인). 같은 공종·같은 단가라 **금액은 안 움직이고 이름만 맞춤** —
받는 쪽이 그 갈래로 일위대가를 그대로 세울 수 있게.

⚠ 버림은 늘 무근이라 구조물 종류(무근/철근)를 따라가지 않음. 그래서 버림 몫만 따로
모아 갈래 이름을 「무근,버림」으로 냄. 나머지 콘크리트는 종전대로 구조물 종류로 갈림.

검증 프로젝트 실측 — 돌쌓기 셋·큰돌쌓기 하나의 버림이 한 줄로 모여 4.700㎥.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:22:02 +09:00
eomsangdonandClaude Opus 5 9d2c70dc8f feat(B08): 채집석 공제 소요량을 냄 — 빼지는 않음 (사용자 확정 ②)
돌은 기본 「캔다」(별표2 「야면석 등은 **가급적 현장에서 채취·사용**하도록 운반거리를
조사한다」 · 실무 견적 다섯 권에 야면석 구입 단가 0건). 구조물마다 「구입」으로 바꿀 수 있음.

⚠⚠ **채집석 공제는 사토에서 한 번만 뺀다.**
B08 은 소요량(`collected_stone_deduction_m3`, ㎥ **양수**)을 내기만 하고 공제하지 않으며,
빼는 자리는 유토곡선의 사토뿐임 — 실어 내는 몫(spoil_m3 − natural_spoil_m3)에서 먼저 빼고
모자라면 자연방토에서 뺌. (랩탑 메인의 통로에도 같은 문장을 박아 둠 — 두 곳이 같은 말이라야
나중에 누가 봐도 안 갈림.)

⚠ **부호를 넘기지 않음.** 실무 시트가 `−274.66` 이라 그대로 넘기면 두 번 뒤집힘.

밑수 — 면석 몸통(면적×뒷길이×몫) + 고임돌 + 막자갈. **이미 우리 식 안에 있는 값들**이라
새 수치를 지어내지 않음. 목적지는 `haul_deduction` 이라 자재총괄(`material` 만 모음)에
안 섞임. 인계 맨 위에 구조물 합산 한 값으로 실림.

시험 754 통과(새 6건 포함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:15:09 +09:00
eomsangdonandClaude Opus 5 1df41c40f4 fix(B08): 층따기 밑수를 원지반 표면 길이로 갈아 끼움 (사용자 확정 ⑦)
⚠ **면이 달랐음.** 층따기는 성토부 **아래 원지반**을 계단으로 깎는 일인데(교본 6장 4절)
우리는 **성토 비탈면 길이**를 밑수로 쓰고 있었음. 값이 나오므로 아무 시험도 안 잡던 자리.

B06 설계가 측점마다 내는 `design.bench_cut_length_m`(원지반 표면의 경사길이, 원지반
횡단기울기 1:4 보다 급한 조각만)를 그대로 밑수로 씀. 면적은 종전대로 **평균단면적법**.
⚠ 값이 없는 측점은 **0** — 성토 사면길이로 대신 채우지 않음(다른 면을 세게 됨).

⚠ 단위는 **㎡ 그대로**(사용자 확정 ⑦). ㎥ 로 바꾸지 않음 — 단의 높이·폭은 설계도서 값이라
지어낼 수 없음. 앞서 「품셈 밑수가 ㎥ 라 못 곱함」으로 막아 둔 자리는 이 확정으로 풀림.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:11:53 +09:00
eomsangdonandClaude Opus 5 42cd2b8fdd feat(B08): 부대시설 다섯 줄을 산출에 추가 (사용자 확정 ⑬)
법이 요구하는데 우리가 안 내던 줄들임 — 국가지점번호판·안내판·차단기·가설창고·수방자재.

⚠ 개소를 **지어내지 않음.** 임도규정 제26조제5항이 「500미터 마다 설치·관리하되
**필요시 거리를 조정**할 수 있으며」라 하고 기점 포함·종점 잔여·갈림길 중복을 원문이
정하지 않음 ⇒ `연장÷500` 을 산식으로 쓰지 않고 설정 `ancillary_counts` 로 **개소를 받음**.

⚠ 사유를 **갈라 적음** — 「품셈에 그 이름의 공종이 없음」과 「개소 미입력」은 다음에 할 일이
다름. 법정 의무인 둘(번호판 제26조5항 · 안내판 제26조6항)은 그 사실을 사유에 적어
화면에서 왜 채워야 하는지 보이게 함. 차단기는 교본에만 있어 「법정」이라 적지 않음.

⚠ 다섯 중 **품셈에 공종이 있는 것은 가설창고(FP-11-01) 하나뿐**(마스터 전수 확인).
나머지 넷은 금액이 못 서지만 **줄은 세움** — 빼면 빠진 줄을 아무도 못 봄.
개소를 안 넣어도 줄이 서고 사유가 함께 감(준비공 표 · 인계 양쪽).

시험 749 통과(새 6건 포함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:07:41 +09:00
eomsangdonandClaude Opus 5 48597351e8 feat(B08): 버림 콘크리트 줄 추가 (사용자 확정 ⑭)
⚠ 빠뜨리고 있던 줄임 — 지식DB `구조물_기초_토공.md` [구현] 이 「구조물 토공 수량 항목:
터파기·**버림콘크리트**·되메우기·뒤채움·잔토처리」로 이미 지목해 두었고, 실무 시트도
같은 공종에서 버림 유무로 0.30 ↔ 0.20 ㎥/㎡ 로 갈렸음.

근거(원문 열어 확인)
  두께 KDS 44 90 00 「구조물 시공이 원활하도록 **100 mm 두께**의 버림콘크리트를 타설」
  폭   KCS 34 50 05 「두께는 설계도서에 따르며, **폭은 잡석다짐의 폭과 동일**하게 한다」

⚠ 잡석다짐 폭이 아직 없어(기초잡석은 품셈에 공종만 있고 치수가 없음) **터파기 폭을
잠정**으로 쓰고 근거 문구에 그 사실을 적음 — 정해지면 상수 한 줄만 바꾸면 됨.

- 기본은 **넣음**, 저장 제원에서 「안 넣음」이면 뺌(확정 ⑭ 「기본 보이게, 뺄 수도 있게」).
  ⚠ 빈 칸을 「빼기」로 읽지 않음 — 정한 적 없는 프로젝트에서 줄이 사라지면 안 됨.
- 돌쌓기·큰돌쌓기 둘 다. 옹벽은 관측 원단위에 이미 0.15㎥/m 로 있었음.
- 타설 줄은 **버림 몫만** 셈 — 채움 콘크리트는 그 공종 품에 들어 있을 수 있어 제외 유지.

시험 743 통과(새 6건 포함).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:03:13 +09:00
eomsangdonandClaude Opus 5 385f5c303d fix(B08): 씨앗뿜어붙이기 밑수 ㎡ 추가 + 시공량 모양을 밑수로 안 받게 막음
⚠ 아홉 중 여덟째 — FP-05-24 는 원문 L2769·L2794 절 머리 아래 「(㎡당)」인데
「단위:」 글자 없이 **괄호만** 있어 마스터가 못 읽던 자리(원문 열어 확인).

⚠ 그리고 매핑 밑수 칸은 **사람이 손으로 적는 자리**라, 품셈에 섞여 있는
「(㎥/1대, 1일)」 같은 **시공량**을 적을 수 있음 — 그것은 밑수의 **역수**라
받으면 그 공종이 조용히 뒤집힌 단위를 가짐. `is_quantity_unit()` 으로 좁게 막음
(나눗셈·쉼표가 있거나 「일당·조·인」이면 안 받음). 애매하면 안 받는 쪽 —
안 받으면 대조가 없을 뿐이고, 잘못 받으면 틀린 단위로 검사를 통과시킴.

시험 741 통과 (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 14:18:06 +09:00
eomsangdonandClaude Opus 5 c81c11e330 refactor(B08): Engine_Handoff 1,279줄을 셋으로 가름 (700줄 제한)
⚠ **계약은 하나도 안 바뀜** — 줄의 모양·칸 이름 그대로이고 파일만 가름.
종전 이름으로 부르던 곳이 그대로 돌도록 `Engine_Handoff` 가 다시 내보냄.

  Engine_Handoff.py          249줄  build_handoff·검사·다시 내보내기
  Engine_Handoff_Mapping.py  413줄  매핑표·WorkItemMapping·갈래표·묶음 전개
  Engine_Handoff_Rows.py     700줄  줄 빌더 여덟(토공·운반·구조물·준비공·배수관·연장·타설)

확인 — 시험 739 통과로 가르기 전과 같음(B05 코리도 1건 기존 깨짐, 무관).
다시 내보내는 이름 22개를 실제로 불러 봄.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 14:16:17 +09:00
eomsangdonandClaude Opus 5 510337557b fix(B08): 자재 이름 「물구멍」 → 「물구멍관」 (카탈로그 규약)
자재 카탈로그가 이름+규격 두 문자열로 줄을 찾고, 그 규약이 「공백 없는 한 낱말」임
(2026-09-08 B09 실측 — 키는 나라장터 물품식별번호라 우리가 맞출 것이 아님).
전개·관측 원단위표·할증표 세 곳을 함께 고침 — 한쪽만 고치면 이름이 갈림.

⚠ 고임돌·야면석 규격에 뒷길이를 넣지 않음 — 뒷길이는 **수량이 갈리는 축**이지
단가가 갈리는 축이 아님(야면석 톤당 단가는 뒷길이와 무관). B09 가 앞 제안을 물림.

곁들여 — 물구멍관 길이 0.5 가 구조물마다 다른 값임을 주석에 적음
(옹벽 0.32 m/m · 돌기슭막이 0.39 m · 돌골막이 0.5 m/개소, 실무 관측).

시험 739 통과 (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 14:13:42 +09:00
eomsangdonandClaude Opus 5 027e059ab8 fix(B08): 층따기를 면적으로 안 내보내도록 막고, 매핑이 적은 밑수까지 대조
⚠ 또 하나의 단위 불일치 — 층따기 9-18 은 [주] 공식 `Q1 = 3600×q×K×f×E/㎝ = ㎥/시간`
이라 단가가 ㎥당인데 우리는 성토 비탈면적 ㎡ 2,645.21 을 보내고 있었음.
그대로 곱혀 4,102,708원이 서 있었음(B09 실측).

- 매핑에 `basis_unit`·`basis_source`·`mismatch_reason` 을 두고, 우리 단위와 뜻이
  다르면 **환산하지 않고** 막음(`input_missing` — 층따기 단 높이·폭은 설계 입력).
  막힌 줄에도 집계값을 `spec_detail` 에 남겨 되짚게 함.
- ⚠ 절 머리에 「(단위: …)」가 없는 공종은 마스터 `basis_unit` 이 빔(477 중 167만 참).
  그래서 밑수 대조가 조용히 통과하고 있었음 — 매핑이 원문에서 읽어 적은 밑수를
  `declared_units()` 로 함께 넘겨 대조가 서게 함.
- 성토면다짐(9-17-1)은 시공량이 ㎡/시간이라 면적이 맞음 — 좁게 막아 형제 공종은 그대로.

시험 736 통과 (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 13:16:30 +09:00
eomsangdon 47943f2990 auto: 2026-09-08 12:48 (EOMSANGDON-HOME) 2026-09-08 12:48:34 +09:00
eomsangdonandClaude Opus 5 81af27f0e8 fix(B08): 돌쌓기 인계를 품셈 밑수(㎡)로 세도록 정정 + 밑수 단위 대조 가드 신설
⚠ 실제로 금액이 틀리던 자리 — 돌쌓기(찰)를 `m · 10.0` 으로 보내는데 품셈
13-4-5 밑수는 ㎡ 라, 받는 쪽이 52,938.9원/㎡ 를 그대로 곱해 529,389원이 섰음.
면적으로 세면 26.101㎡ × 52,938.9 = 1,381,753원 — 2.6배. 양쪽 다 오류 없이 조용했음.

- `billing_component` 를 매핑에 두고 **전개 성분에서** 내역 수량을 가져옴
  (면적 식을 두 벌로 짜지 않음). 돌쌓기·큰돌쌓기 = ㎡ · 비탈면적.
- 성분이 안 서면 **연장으로 대신 세지 않음** — 0 + 품셈 밑수 단위로 두고 사유를 냄.
- 신설 `B08_Quantity_Engine_BasisUnit.py` — 인계 줄 단위를 **공종 마스터 밑수**와
  대조해 `basis_unit_warnings` 로 냄. 표기 차이(㎥/m3·개소/개)만 흡수하고 **환산 안 함**.
- 돌 종류를 둘째 갈래 축(`secondary_axes`)으로 실어 보냄 — 품셈 13-4 [주]② 가
  「깬돌·깬잡석 전용」이고 돌 종류 표는 13-5 에 따로 있음. 공종 판단은 사용자 확정 대기.
- 옛 시험이 「10.0 m」를 계약으로 못 박고 있어 정정(오늘 다섯 번째).

시험 732 통과 (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 12:48:29 +09:00
eomsangdonandClaude Opus 5 48173b8ca4 fix(B08): 뒷길이를 접지 않음 — 일곱 규격을 다 씀
조율 창 지시로 KeyError 를 막으러 갔다가 더 나쁜 것을 찾음.
죽지는 않고 있었고 대신 조용히 접히고 있었음.

  40㎝  → 45㎝ 계수로 돎     999㎝ → 60㎝ 계수로 돎
  25·30 → 35 로, 75 → 60 으로 접힘

⚠ 접을 까닭이 없었음 — 품셈 13-4-3·13-4-4 [주]① 이 25·30·35·45·55·60·75
  일곱 규격을 다 줌. 우리 표가 네 칸만 들고 있었을 뿐임.

- 표를 일곱 규격으로 채움(건설품셈 참고자료 값, 고임돌은 「깬돌」 열)
- 표에 없는 값(40 등)은 접지 않고 「품셈 표에 없어 물량이 서지 않습니다」
- ⚠ 원문 「-」인 칸은 0 줄을 만들지 않음 — 0 은 「없음」과 구별이 안 되고
  받는 쪽이 「값이 0 인 자재」로 읽음
- ⚠ 고른 종류의 빈 칸은 빈 칸으로 덮음 — None 이라고 안 덮었더니
  「야면석 75㎝」처럼 원문에 「-」인 칸에 종전 값(깬돌 0.25)이 섰음(만들다 잡음)

⚠ 옛 시험이 「덮는 위 칸으로 접는다」를 계약으로 못 박고 있었음 — 오늘 네 번째.

시험 넷 — 접지 않음 · 표에 없으면 물량 안 냄 · 고른 종류의 빈 칸은 줄 없음 ·
일곱 규격이 다 섬.
시험: 723 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 12:33:31 +09:00
eomsangdonandClaude Opus 5 e9a25bbf87 feat(B08): 돌 종류 축을 이음 — 계수 셋이 그 축으로 갈림
랩탑이 stone_kind 칸을 만들어 축이 생김. 지금까지 계수 셋이
축 없이 한 벌(깬돌 계열)로만 돌고 있었음.

원문 근거 셋을 데이터 파일로 뺌 (resources/data_masonry/stone_kind_*)
  고임돌      품셈 13-4-3 · 돌 종류 네 줄(야면석/깬잡석/깬돌/견치돌)
  채움콘크리트  품셈 13-4-4 [주]① · 두 줄(야면석 33.3% / 깬돌 계열 45%)
  뒤채움      교본 7-3 · 깬돌·잡석 1/2 · 야면석 1/3

⚠ 안 고르면 종전 값 그대로 — 건설품셈 참고자료 한 벌로 돌되 그 사실을 알림.
  값을 못 낸다고 멈추면 이미 저장된 프로젝트가 통째로 빔.
  (실측: 미지정 고임돌 3.915 · 채움콘 5.220 · 막자갈 15.130 — 고치기 전과 같음)

⚠ 만들다 잡은 것 — 표는 「뒤채움 몫」인데 우리 식은 「빼는 몫」이라 뜻이 반대.
  그대로 넣었더니 미지정 막자갈이 15.130 → 19.045 로 바뀌었음. 1 에서 빼게 고침.
  종전 하드코딩 2/3 이 곧 야면석(1 − 1/3)이었음.

⚠ 지어내지 않는 자리 — 원문 「-」(견치돌 25·30 · 야면석 75)는 null 로 두고
  사유를 냄. 모르는 종류도 조용히 안 넘김.

시험 7건 — 미지정이 종전 그대로 · 야면석이 바뀜 · 깬돌이 종전과 같음 ·
⚠ 뒤채움 몫을 뒤집어 쓰지 않음 · 「-」를 안 지어냄 · 모르는 종류 · 근거 문구

시험: 720 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 12:28:42 +09:00
eomsangdonandClaude Opus 5 dbe761a303 feat(B08): B군 줄에 「어디부터 어디까지」를 실음 — spans 받음
랩탑이 spans 를 넣어 줘서 B군 산출근거가 채워짐.
겹침을 지운 뒤의 구간이라 그 합이 곧 length_m 임.

- station_from/to 에 처음 시작·끝 끝을 싣고
- 비고에 구간을 전부 적음 「구간 10~20m · 50~60m · 90~100m」
  ⚠ 사이가 빈 것을 숨기지 않음 — 처음과 끝만 보면 10~100 을 통으로 오해함
- 겹친 경우는 그 설명이 뒤에 붙음
  「구간 80~140m · 입력 구간 합 80m 에서 겹친 20m 를 뺀 값」

⚠ 측점 표기(NO.4+0.0)는 만들지 않음 — 측점 간격을 아는 화면 몫이고,
  두 벌로 짜면 간격이 바뀔 때 한쪽만 고쳐짐

시험 넷 — 구간이 비고에 적히고 측점이 실림 · 여럿이면 처음·끝을 싣고 전부는 비고에 ·
⚠ 구간 합이 수량과 같음(갈리면 어딘가 틀림) · ⚠ spans 가 없어도 줄은 섬(옛 자료)

시험: 713 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 10:28:35 +09:00
eomsangdonandClaude Opus 5 d3a763d9c9 feat(B08): B군 종단배수를 연장표로 받음 — 겹친 구간을 두 번 안 셈
랩탑 제안(두 창 합의). common_util_structure_lengths 가 이미 규칙 셋을 갖고
있는데 B08 이 structures.json 을 직접 읽어 세면 그것을 두 벌로 짜게 됨.

그 함수가 갖고 있는 것
  ① 겹친 구간 합치기 (같은 시설을 겹쳐 놓으면 단순 합은 두 번 셈)
  ② 측구 제외 (design_owner — 횡단이 이미 ditch_area_m2 로 셈)
  ③ 관 소관 제외 (managed_by)

⚠ B군만 그 함수로 감 — C군(돌쌓기·옹벽)은 그대로 구조물별 줄
  그 함수는 종류별로 뭉쳐 내는데, C군은 측점·규격이 줄마다 다르고 자재가
  줄마다 나옴. 실무 내역도 B군은 「산마루측구 40m」 한 줄, C군은 구조물별 줄

실측: 겹친 산마루측구 둘(80~120 · 100~140) → 80m 이 아니라 60m
      비고 「입력 구간 합 80m 에서 겹친 20m 를 뺀 값」

⚠ 만들다 낸 것 하나 — 겹침 설명을 blocked_reason 에 넣었더니 B09 가
「막힌 줄」로 읽어 금액을 안 붙였음. 비고(spec_class_basis)로 옮김.
막힌 사유는 진짜 막힐 때만(공종 못 이음 · 연장 0).

시험 다섯 — 종류별 한 줄 · 겹침이 합쳐짐 · ⚠ 겹침 설명은 막힘이 아님 ·
⚠ 안 겹치면 원합을 안 실음(반영률로 오해됨) · 공종 못 이으면 사유와 함께 막힘

시험: 709 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 10:22:52 +09:00
eomsangdonandClaude Opus 5 cbf991d5be feat(B08): B군 종단배수를 공종에 이음 — 연장이 금액까지 감 (V-3)
랩탑이 「연장은 나오는데 그 뒤가 안 봤다」고 해서 세 걸음을 한 번에 봤음.
끊긴 자리가 둘이었음.

① 매핑에 B군이 하나도 없었음 — 연장 40.0m 은 인계까지 오는데
   공종코드가 비어 있었음. 품셈에 있는 셋을 이었음
     산마루측구 FP-12-09-02 · 소단측구 FP-12-09-03 · 맹암거 FP-12-10
     셋 다 밑수 1 m — 구조물 연장이 그대로 수량
   도수로·절토사면 배수로는 품셈에 그 공종이 없어 pending_user 로 남김
   (마스터 전수: 「수로」로 찾아도 나오는 것은 위 셋뿐)

② ⚠ 「전개식이 없다」로 단정해 B09 가 금액을 안 붙이고 있었음
   B군은 연장이 곧 수량이라 원단위 전개가 필요 없는데,
   blocked_of 가 「성분이 없으면 formula_missing」으로 봤음
   ⇒ 공종코드가 붙었고 수량이 있으면 막힌 것이 아님

실측(맹암거 40m): 0원 → 1,019,685원. 산마루·소단측구는 B09 일위대가 대기.

⚠ 그 김에 확인된 것 — verify_bill_flags 가 「코드 없이 내역에 서는 줄」을
제대로 잡고 있었음(도수로·절토사면 배수로 둘).

시험 셋 — 연장으로 서는 공종은 안 막힘 · ⚠ 코드 없으면 여전히 막힘 ·
⚠ 연장 0 이면 코드가 있어도 막힘 (둘 다 0원 줄을 막는 짝).
시험: 704 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 10:13:16 +09:00
eomsangdonandClaude Opus 5 1ad40fa2fb fix(B08): 관 줄의 막힌 사유를 둘로 가름 — 「저장하면 풀림」과 「눌러도 안 풀림」
랩탑 [저장] 뒤 실측하니 관 9개 중 6개 값이 서고(59.0m) 3개가 막힘.
그 셋에 「[저장]을 한 번 누르면 섭니다」가 떴는데 눌러도 안 풀리는 자리였음
— cross_sections 에 그 관 자리 측점이 아예 없음(관은 놓였는데 횡단이 안 만들어짐).

- 측점 목록을 함께 받아 「횡단이 있는데 길이만 없음」과
  「관 자리에 횡단이 없음」을 갈라 말함
- ⚠ 관 자리 판정을 아주 좁게(0.05m) — 실측에서 관 439.55 근처에 측점 440.0 만
  있었고, 길이 찾기와 같은 0.5m 로 보면 「횡단이 있다」로 읽혀 거짓 안내가 떴음.
  길이는 B06 이 관이 놓인 측점에만 실으므로 뜻이 다름

실측(5601e828): 값 6줄 59.0m · 막힘 3줄이 정확히 그 셋
  85.05→10.0 · 258.12→11.0 · 534.49→9.0 · 804.30→9.0 · 901.24→10.0 · 984.18→10.0

⚠ npm run build:server-calc 돌려 새 번들로 바꿨음 — 옛 번들은 이웃 측점에도
길이를 실어 같은 관을 두 번 셀 수 있었음(랩탑이 고쳐 push 한 건).

시험 4건 추가(가른 두 문구 · 목록 없으면 종전대로 · ⚠ 옆 측점은 「있음」이 아님).
시험: 701 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 09:40:51 +09:00
eomsangdonandClaude Opus 5 c4460892c0 feat(B08): 배수관 물량 — 정본 셋을 이어 인계에 실음
랩탑 창이 측점 design 에 pipe_length_m 을 넣어 줘서 마지막 조각이 채워짐.
B08 은 잇기만 하고 길이를 짓지 않음.

값이 어디서 오나
  관 자체(있나·어디·관경·관종) → pipe_points.json (레지스트리 managed_by)
  관 연장(m)                  → 측점 design.pipe_length_m
                                (B06 이 서버 Node 로 m 단위 올림까지 끝낸 값)
  관종 → 공종코드              → work_item_mapping 의 pipe.kind_codes
     파형강관 FP-12-11-03 · 흄관 FP-12-11-02 · VR관 FP-12-11-01

⚠ facility 가 pipe 인 점만 배관 — pipe_points.json 은 계곡 통과 시설 전부의
  정본이라 BOX암거·물넘이·세월교가 같은 파일에 있음. 관경 유무로 가르면
  관경 미지정 관을 놓침. 실측: 5601e828 11점 중 관 9 · 세월교 2

⚠ 관종 기본값(파형강관)은 2026-08-17 사용자 확정값이라 근거가 있으나
  조용히 쓰지 않고 「기본값으로 섰습니다」를 알림에 실음

⚠ 안 붙인 것 둘 — 터파기·되메우기(관 부설과 각각 오면 같은 굴착을 두 번 셈,
  B09 ㉡ 가드 자리) · 유출입부 기슭막이(관 옵션이 정본이고 구조물에서 빠졌음)

연장이 없는 관은 0 으로 때우지 않고 blocked_reason 과 함께 감
「횡단설계에서 [저장]을 한 번 누르면 그 측점의 관 길이가 남고 값이 섭니다」

시험 10건 — 세월교 걸러짐 · 관경 없어도 관임 · 연장 없으면 안 섬 ·
관종 셋이 갈림 · 기본값을 알림 · 모르는 관종은 못 고름 ·
⚠ 좁게: 옆 측점 길이를 물어 오지 않음 · 실제 자료 정본 대조

시험: 697 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 09:35:13 +09:00
eomsangdonandClaude Opus 5 19d4009ec4 fix(B08): 옹벽 타설이 두 번 셀 자리 — 묶음 구조물은 타설 줄을 안 만듦
B09 가 「철근이 겹치나」를 물어 확인하다 드러남. 철근은 안 겹치는데
타설이 겹쳤음.

철근 — 안 겹침 (확인)
  자재로 가는 것은 재료(이형철근 D13·D16 kg)
  묶음 조각 FP-12-03 은 품 — 일위대가 실측 재료 0원 · 노무만
  ⇒ 품은 공종 줄, 재료는 자재 쪽. 타설(12-1-1)과 같은 구조

타설 — 겹쳤음 (고침)
  work_item_mapping 의 옹벽 composite 에 FP-12-01-01 조각이 이미 있는데
  _placing_rows 가 그 구조물의 콘크리트를 또 셌음
  ⇒ 묶음으로 서는 구조물은 건너뜀. 그 콘크리트는 묶음 조각이 셈
  ⚠ 묶음이 아직 미확보라 값이 안 걸렸을 뿐, 서는 날 두 번이 됨

시험 둘 — 묶음 구조물은 타설 줄 없음 · ⚠ 묶음 없는 종류는 그대로 섬
(좁게 고치는 짝. 묶음 하나 때문에 정상 줄까지 지우면 더 나쁨)
기존 타설 시험 셋은 표본을 옹벽 → 집수정으로 바꿈(옹벽이 이제 묶음이라).

시험: 685 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 09:24:14 +09:00
eomsangdonandClaude Opus 5 fc867d3220 fix(B08): 규준틀 밑수를 표 아래 [주] 에서 읽음 — 금액이 못 붙던 자리
B09 제보. 규준틀 둘(FP-11-02·FP-11-03)이 in_bill=true 로 서는데
「밑수 미확보」라 금액이 안 붙고 있었음. 개소 수는 이미 닫혔는데
그 표의 밑수 자체가 비어 있던 것.

「원문에 있었음」 아홉 번째 — 이번엔 표 **아래** [주] 였음
  [주]③ 「목재의 손율은 **1개소 사용당** 50%로 한다」
  뜻으로도 개소가 맞음 — [주]② 가 「본 품은 …한 비탈규준틀의 제작·도색·
  가설·철거를 포함한 것」이라 규준틀 하나를 말하고, [주]① 이 「20m마다 설치」

⚠ 아주 좁게 잡음 — 「N개소 **사용** 당」 표기는 품셈 전문에 딱 두 곳뿐이고
  둘 다 규준틀임. 「개소당 평균면적」 같은 흔한 말은 「사용」이 없어 안 걸림
  (넓히면 조림 2장이 통째로 걸림 — 실측 19건).
  다음 표(|)나 다음 절(###)을 만나면 멈춤 — 남의 [주] 를 물어 오면 조용히 틀림.

효과: 밑수 확보 183 → 185, 미확보 137 → 135.

시험 넷 — 규준틀에서 읽는 것 · 흔한 말에 안 걸리는 것 · 다음 절로 안 넘어가는 것 ·
다시 만든 마스터에 실제로 실렸는지 정본 대조.

시험: 685 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 08:35:27 +09:00
eomsangdonandClaude Opus 5 93546b850a feat(B08): 준비공·사방공을 인계에 실음 — 못 내는 줄은 사유와 함께
보조 창 요청에서 출발했는데, 보다 보니 표가 통째로 안 가고 있었음.
표토제거(값 있음·FP-09-15)·규준틀(개소·FP-11-02)이 화면에는 서는데
인계에는 없었음.

⚠ 줄을 빼면 「빠졌다는 사실조차 안 보임」 — 받는 쪽에서 「내역서에 원래
없는 것」과 「우리가 아직 못 내는 것」이 구별되지 않음.

- 값이 서는 줄 → in_bill: True, 공종코드와 수량 그대로
- 못 내는 줄 → in_bill: False + blocked_kind + blocked_reason
  (금액은 안 붙되 「무엇이 채워지면 풀리는지」가 함께 감)
- ⚠ 「다른 표에서 이미 섬」(벌목)은 blocked_kind: None — 막힌 것이 아니라
  여기서 세면 안 되는 줄임. 막힘으로 보내면 「만들어야 할 것」으로 오해됨
- origin: "preparation" 로 갈래를 나눔

시험 넷 — 값 서는 줄 · 못 내는 줄의 사유 · 이중계상 방지 줄은 막힘 아님 ·
⚠ 표를 안 주면 빈 줄을 지어내지 않을 것(좁게 고치는 짝 시험).

시험: 681 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 08:23:03 +09:00
eomsangdonandClaude Opus 5 6e114ac990 feat(dev): 확정 없이 다음으로 — 등록 + 좌측 단추 (2/2)
앞 커밋 618b6cf4 의 신규 파일을 등록하고 화면 단추를 붙임.
두 걸음 규칙대로 파일이 먼저 push 된 뒤 등록 줄이 감.

문은 앞뒤 둘
- 서버(정본): ENVIRONMENT 가 개발이 아니면 세 입구 모두 403.
  라우터는 다른 것과 같은 보호(로그인·회사·프로젝트 접근)를 받고
  그 위에 환경을 한 번 더 봄
- 화면(보조): import.meta.env.DEV 일 때만 단추가 그려짐

눌렀을 때 바뀌는 것 — project_workflow_stages.state 한 칸뿐.
계산은 안 돌고 정본 값도 안 만듦. 실측(b269ea34):
  우회 전 [] → 우회 [3 STALE · 4 NOT_STARTED · 5 NOT_STARTED] → 되돌림 → []
  이미 COMPLETE 인 0·1·2 는 안 건드림 (진짜 확정은 보존)

되돌리기 — 푼 단계의 옛 상태를 message 에 DEV_UNLOCK:<옛상태> 로 적어 두고
[원래대로 되돌리기]가 그대로 복원. 그 표시가 없으면 진짜 확정이라 안 만짐.

드러남 — 우회 중이면 좌측에 「지금 확정을 건너뛴 상태입니다 — 값이 비어
보이는 것은 정상입니다. 건너뛴 단계 (3, 4, 5)」가 뜸.

⚠ 화면에서 잡은 것 — 단추를 패널 아래에 두니 overflow:hidden 에 잘려
  화면 밖(y=772, 패널 740)이라 눌리지 않았음. 맨 위로 옮김(상태 경고이기도 함).

시험: 677 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관) · tsc 오류 0.

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