⚠ 실제로 금액이 틀리던 자리 — 돌쌓기(찰)를 `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>
조율 창 지시로 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>
수량 자릿수 (품셈 1-2-2의 1)
- 화면이 모든 수량을 2자리로 찍고 있었음. 품셈은 종목별로 자리를 따로 정함 —
체적합계·시멘트·철근 정수 / 돌쌓기·옹벽·떼 1자리 / 철강재 3자리.
- 수량은 반올림([주]①), 금액은 버림 — 반대라 모듈을 갈라 둠.
- 항목이 표를 이김([주]②) → override 받음. 표에 없는 종목은 안 건드림.
- 서버가 줄마다 quantity_digits 를 실어 보내고 화면은 그 자리로 찍기만 함.
금액 자리 보강 (품셈 1-2-2의 2)
- 설계서 총액 1,000원 미만 버림 · 일위대가 계금 1원 미만 버림 추가.
금액란(0.1원)·소계(1원)와 자리가 넷 다 다름.
⚠ 단위 불일치 가드
- 돌쌓기(찰)이 연장 10m 로 오는데 일위대가는 ㎡당이라 52,938.9×10 = 529,389원이
조용히 서 있었음. 면적으로 세면 1,381,753원 — 2.6배 적은 금액이었음.
- 단위가 다르면 곱하지 않고 사유를 남김. 표기 차이(㎥/m3·개소/개)는 흡수하되
환산은 안 함. 내역 합계 6,252,172 → 5,048,775 (틀린 두 줄이 빠짐).
제잡비 밑수
- 닫힌 물음임을 원문 인용으로 못 박음 — 산림품셈 [주]③ 여섯 자리가 「노무비의
합계액」이고, 일위대가 안에는 간접노무비가 없으므로 그 표의 노무비 합 =
직접노무비. 하루에 두 번 뒤집힌 값이라 세 번째가 없게 근거를 남김.
시험 10건 추가, 238건 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
랩탑이 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>
md 가 ../pic/*.png 를 네 곳 참조하는데 그 폴더가 저장소에 없었음.
원본 PDF 는 있어서 그대로 뽑음(지어낸 것 없음).
p35_1 686×673
p39_1 690×673
p64_1 368×229 ← [참고자료] 돌쌓기 표준도
p98_1 592×168
⚠ p64 가 B07 표준도 일감의 근거임 — 우리가 그리려던 그림이
품셈 참고자료로 이미 있었음. 같은 자리의 「돌쌓기 규격별 소요량」 표가
우리 계수(고임돌 0.15 · 채움콘크리트 0.20 · 모르터 0.009)의 원천이라
그림과 표가 한 벌로 표준도 한 장이 그대로 나옴.
그림에 적힌 것: 뒷길이 · 뒷채움 · 채움재(콘크리트 또는 잡석) · 기초
— 우리 전개식 성분과 그대로 맞물림.
⚠ 2026 개정안이 그 참고자료를 「삭제 검토」로 두었음. 없어지면
우리 계수의 근거가 사라지므로 어느 판을 정본으로 쓸지 정해야 함.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- masonry_wet·masonry_dry 에 `stone_kind` 옵션 추가 (야면석·호박돌 / 깬잡석 /
깬돌 / 견치돌). 기본값 없음·required·phase detail — 품셈 13-4-3(고임돌)·
13-4-4(채움 콘크리트) 가 돌 종류로 갈리므로 B08 이 계수 축을 하나로 고를 수 있게 함.
- 값 선정은 설계 판단이라 기본값을 두지 않음 — 미지정이면 B08 이 드러냄.
- 지식DB 미결 22 등재: 옆도랑 저폭 0.3m 근거 공백(별표2 는 너비·깊이만) +
현행 45° 단면이 통수단면 경제 단면 60° 와 어긋남.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 8-2-1 속도표를 단(1·2·3단)까지 전부 담음. 무한궤도 13톤·타이어의 없는 후진 3단은
담지 않음 — 없는 속도로 싸이클이 서면 값이 조용히 틀림.
- 「(0.55-0.1)」 같은 보정식을 읽음 (8-2-1 [주]④ 정지작업 −0.1). 범위 표기와 갈라
다룸 — 범위는 여전히 확정값 아님.
- 갈래 없는 표(「f | 1/1.3」)도 읽음.
- 결과: FP-09-17-02 비다짐(정지) 1,410.1 원/㎥ 섬 (3단 75/98, E=0.45, 19톤).
- 시험 4건 추가, 228건 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- B09_Estimation_MachineProductivity_Dozer.py 신설 (8-2-1 전용).
굴착기(8-1-4)와 한 파일에 두면 700줄을 넘고, 두 식이 섞여 읽힘.
- 굴착기 쪽 장비 붙이기를 attach_machine_share 로 올려 불도저 쪽
attach_dozer_share 와 같은 모양으로 맞춤 — 자리를 나눠 쓰는 것이 눈에 보이게.
- 줄수: UnitPrice 652 · MachineProductivity 360 · Dozer 398.
- 224건 통과 (동작 변화 없음).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- FP-10-11 불도저 운반이 굴착기 식(8-1-4)으로 읽혀 「K·Cm 없음」으로 잘못
진단되던 것을 8-2-1 식으로 읽게 함. 갈래 셋(토사·파쇄암·발파암) 각각 섬
(1,439.7 / 3,289.3 / 3,959.4 원/㎥).
- 표가 기종 이름을 안 적어 삽날 용량 q゚ 3.2㎥ + 속도 55/70(2단)으로
불도저(무한궤도) 19톤을 되짚음. 하나로 안 좁혀지면 안 고름.
- 공식표에만 나오는 기종을 시간당 사용료 층에 넣음 — 안 넣으면 공식이 다 서고도
붙을 사용료가 없어 빈 일위대가가 남았음.
- 아무것도 안 붙은 제목은 걷어 냄 (화면에서 「조립 불가」로 터지던 자리).
- 시험 6건 추가, 224건 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
「미판정 77건」을 훑다 나온 것 — 그중 일부는 **미판정이 아니라 시공능력 공식표**였음
```
F0287 9-18 층따기 굴착기 0.7㎥ · K 0.9 · f 1/1.3 · E 0.7 · Cm 22
F0328 11-4 쇄석·혼합석 부설 같은 모양
```
- ⚠ **자원 줄이 하나도 없으면 조립 반복문이 그 공종을 아예 안 보고 있었음** —
표에 인력 줄이 없는 기계 전용 공종이 그 자리. 공식이 온전하면 세우게 고침
- 층따기 **1,550.9원/㎡** · 쇄석 부설 **3,549.5원/㎡** 로 섬 (일위대가 203 → 206)
- 내역서(2f940d8a) 합계 **2,149,464 → 6,252,172원** —
층따기 2,645.21㎡ × 1,550.9 = 4,102,708 이 실제로 붙음
- ⚠ 짝 시험 — 자원도 공식도 없으면 **여전히 안 섬**(0 원 일위대가 금지).
그 문이 넓으면 빈 제목이 무더기로 서고 화면이 「단가가 있다」고 거짓말함
검증: pytest 215 통과(신규 2)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
메인 창이 물음 — 종단배수 셋이 같은 모양(밑수 1 m)인데 맹암거만 금액이 서고
산마루측구·소단측구는 안 서는 까닭
**표 성격이 달랐음** — 맹암거(F0345)는 수량이 실제로 적힌 소요량표라 자원 4줄이
붙어 25,492.1원/m 로 섬. 나머지 둘은 **수량 칸이 비어 있고 참조로만** 적힘
```
FP-12-09-02 철근가공조립 | ton | (빈칸) | 「철근가공조립(간단)의 30%」
FP-12-09-03 거 푸 집 | 회 | (빈칸)
```
⇒ 값을 지어낼 수 없어 **금액을 안 만드는 것이 맞음**(지금 방침 그대로)
- 다만 화면 사유가 **「일위대가 없음」으로 뭉뚱그려지고** 있었음 — 「아직 안 만든 것」과
「성분이 빠져 못 세운 것」은 **할 일이 다름**. 사유를 갈라 적음:
「성분이 빠져 단가를 못 세웠습니다 — 철근가공조립 줄을 못 풀었습니다」
- `UnitPriceBuild.component_gaps` 로 자원 축의 사유를 화면까지 나름
- 짝 시험 — 성분 빠진 쪽은 금액 없음 + 사유 표시, **맹암거는 그대로 금액이 섬**
검증: pytest 213 통과(신규 1). 맹암거 40m × 25,492.1 = 1,019,685원 —
메인 값과 일치
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
랩탑이 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>
B08 창 요청(2026-09-08) — 연장(m)만 내면 산출근거에 **「어디부터 어디까지」**를 못 적음.
실무 내역은 「산마루측구 40m」 한 줄이라 없어도 서지만, 있으면 검산이 쉬워짐.
`_merge` 가 길이 대신 **합친 구간 목록**을 돌려주게 하고, 행에 `spans`
(`[{start_m, end_m}, …]`)를 실음. **길이는 그 목록의 합**이라 둘이 갈릴 수 없음.
⚠ 겹침은 **합쳐서** 냄 — 데스크탑 실측: 산마루측구 둘(80~120 · 100~140)이 **60.0m**
로 합쳐져 내역서에 감(단순 합 80.0m). 구조물별로 셌으면 **20m 를 더 셀** 자리였음.
그 규칙이 이 함수 한 벌에만 있어야 하는 까닭이기도 함(측구 제외·관 소관 제외도 같음).
시험 5건 — 안 겹치면 그대로 · 겹치면 합침(그 실측 그대로) · 맞닿은 두 구간은 하나 ·
품은 구간은 사라짐 · **행의 길이가 구간 합과 같은지**. 전체 513 passed · 17 skipped.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
랩탑 제안(두 창 합의). 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>
랩탑이 「연장은 나오는데 그 뒤가 안 봤다」고 해서 세 걸음을 한 번에 봤음.
끊긴 자리가 둘이었음.
① 매핑에 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>
랩탑 [저장] 뒤 실측하니 관 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>
`pipe_length_m` 을 넣고 실화면 [저장]으로 확인하다 드러남 — **관 9개인데 값이 10곳**에 실렸음.
까닭은 `attach_culvert_sets` 가 세트를 **폭의 절반까지 옆 측점에도** 붙이기 때문임(3D·카드가
이어 그리려고). 그 자리에 길이를 실으면 수량이 **같은 관을 두 번** 셈.
- 스펙에 **놓인 누가거리(`chainage_m`)** 를 함께 얹음 — 파이썬 `attach_culvert_sets` ·
TS `attachCulvertSets` **둘 다**(한쪽만 얹으면 세트 거울 시험이 깨짐. 실제로 깨져서 알았음).
- 길이는 그 값과 측점이 같을 때만 실음.
- 옛 값 정리 — 이미 실려 있던 이웃 측점 4곳(260.0·800.0·900.0·980.0)에서 지웠음.
**파생값이라 병합만으로는 안 지워짐**(merge 는 키를 얹기만 함).
⚠ **따로 드러난 것 — 관 3개(439.55·620.43·720.37)는 측점 행 자체가 없음.** 그 관들은 횡단
설계도 수량도 통째로 빠져 있음. 별건으로 조사할 것(계획서에 적음).
실측 결과 — 관 길이가 실린 측점 **6곳**(85.05→10.0 · 258.12→11.0 · 534.49→9.0 · 804.30→9.0 ·
901.24→10.0 · 984.18→10.0m). 나머지 셋이 위 별건임.
시험 7건(소유 측점 판정 한 건 추가) · 전체 507 passed · 17 skipped.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
랩탑 창이 측점 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>
B09 가 「옹벽 묶음이 기초잡석 물량 없음으로 막혔다」고 알려 와 원문을 전수로
확인했음. 우리 표가 빠뜨린 것이 아니라 원문에 없었음.
울진 라이브러리 §7 「반중력식옹벽 H=2.0」 원문은
콘크리트 1.35㎥(기초 0.75+벽체 0.60) + 버림 0.15㎥ · 유로폼 3.20㎡ ·
기초 거푸집 0.6㎡ · 물빼기 파이프 Ø50 0.32m · 철근 D13 13.45㎏ + D16 30.42㎏
이 전부이고 기초잡석·터파기·되메우기·잔토가 다 없음.
기초잡석이 있는 시트는 §1 관보호공 날개벽뿐(T=0.2 · Ø800 A-TYPE 1.15㎥/개소).
다른 구조물 값을 옮겨 쓰지 않음.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
메인이 옹벽 묶음에 타설 조각이 이미 있는데 `_placing_rows` 가 그 콘크리트를
또 세던 것을 고침(`19d4009e`). 받아서 실물로 확인
- 인계에 **타설 줄이 없어짐** — 그 콘크리트는 묶음 조각이 셈
- 내역서 합계 3,136,861 → **2,149,464원** (메인 예고 약 2,149,464 와 일치).
**결함이 아니라 겹친 것을 뺀 것**
- ⚠ 묶음이 미확보라 값이 안 걸렸을 뿐, **묶음이 서는 날 두 번이 됐을 자리**였음
철근 「철근공·보통인부가 두 번 들어 있다」는 메인 관찰 — **정상임을 검산**
- 품셈 12-3 표가 `구조별 | 가공 | 조립 | 계` 이고 진짜 자원 머리는 둘째 줄.
가공·조립 두 몫을 각각 세는 것이 맞음
- 검산: 철근공 1.24 + 1.84 = **3.08** = 품셈 「계」 열 · 보통인부 0.45 + 0.75 =
**1.20** = 「계」 열. **「계」 열은 안 더함**(더하면 두 배)
검증: pytest 212 통과. 스냅숏 전후 대조
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
B08 창 보고(2026-09-08): 관 11개가 `pipe_points.json` 에 있고 품셈 공종도 있는데 **연장(m)이
없어** 배수관 물량이 막혀 있었음. 관 길이는 횡단 기하가 **m 단위 올림까지** 끝낸 값
(`CulvertLayout.pipe.lengthM`)인데 **정본(`design`)에 안 실렸음**.
**옮기거나 새로 짜지 않았음** — 그 계산은 **이미 서버가 Node 로 그대로 실행**하고 있었음
(`B06_Section_Server_Calc_Node` ← `Server_Calc_Prebuild.recompute_server_side`, [저장]·[확정]).
구조물 폐회로 면적이 실리는 **그 다리에 값 한 줄만** 더 실었음 — 계산을 두 벌로 짜지 않음
(CLAUDE.md 5장). B08 창이 낸 갈래 둘(서버로 이관 / 저장 때 남기기)은 둘 다 불필요했음.
- `STRUCTURE_AREA_KEYS` → **`STRUCTURE_ROW_KEYS`** 로 이름을 고치고 `pipe_length_m` 추가.
이름이 「면적」이라 길이를 담으면 거짓말이 됨.
- **면적을 못 내는 측점에서도 길이는 냄** — 설계선이 모자라 폐회로가 안 닫히는 자리에도
관은 서 있고 수량은 그 길이가 필요함(`return pipeRow`).
- ⚠ **서버에 화이트리스트가 하나 더 있었음** — `_AREA_KEYS`(「Node 가 다른 키를 내도 안 흘림」).
거기 안 넣으면 Node 가 값을 내도 **조용히 버려짐**. 넣고, **두 목록을 대조하는 시험**을 둠.
- 키 이름은 `pipe_length_m` 으로 **B08 창과 미리 못 박음** — 오늘 `back_len_cm` 이 엔진에서
`stone_back_length_cm` 로 읽혀 저장값이 영영 안 닿던 사고가 있었음.
⚠ 값이 정본에 실리려면 그 프로젝트에서 **[저장] 한 번**이 필요하고, **번들 재빌드**
(`npm run build:server-calc`)도 필요함 — 번들은 git 밖이라 창마다 각자 돌려야 함.
시험 6건 — 패치로 받는지 · 음수 거부 · 면적과 **같은 목록**으로 실리는지 · 면적 실패 시에도
길이는 나오는지 · 이름을 두 번 적지 않는지 · **서버 화이트리스트와 TS 목록이 짝인지**.
전체 507 passed · 17 skipped.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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>
메인이 원문 **표 아래 [주]③**(「목재의 손율은 1개소 사용당 50 %」)에서 밑수를
찾아 `FP-11-02`·`FP-11-03` 을 「1 개소」로 채움(`fc867d32`)
- 자원 축 다시 냄. 지문이 `3752af1e…` 로 따라 바뀜(낡음 감지 장치 동작)
- 기준 미상 68 → 66
- **비탈 규준틀 68,512.2원/개소 · 수평 규준틀 90,997.7원/개소** 로 섬
- 내역서(2f940d8a) 합계 **11,494 → 946,067원** — 규준틀 7개소·5개소가 실제로 실림
· 3-1 비탈 규준틀 7 × 68,512.2 = 479,585
· 3-2 수평 규준틀 5 × 90,997.7 = 454,988
⚠ 원문이 **표 위 본문이 아니라 표 아래 [주]** 에 있던 첫 사례 —
앞서 여덟 번은 다 표 위였음. 다음에 밑수를 찾을 땐 양쪽을 볼 것
검증: pytest 212 통과. 스냅숏 전후 대조로 준비공 6줄 신규 확인
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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>
B08 이 준비공 여섯 줄을 인계에 실으면서(`93546b85`) 세 갈래가 섞여 옴
- ⚠ `blocked_kind` 가 **없는데 `in_bill=false`** 면 **막힌 줄이 아님** —
「다른 표에서 이미 섬」(벌목·지장목제거)·「이 노선엔 없음」(사방 시설).
그것을 「우리가 만들어야 하는 것」에 얹으면 사용자가 세우려 들고
**그것이 곧 이중계상**(㉠~㉦ 규칙에 걸림)
- 화면 목록을 **셋으로** 가름 — 입력하면 풀리는 것(2) · 우리가 만들 것(10) ·
**여기서 세지 않는 줄(2)**
- 검산 줄 비고에 B08 사유 문구를 그대로 실음
- 짝 시험 — 같은 `in_bill=false` 라도 사유가 다르면 갈래가 달라야 함
실측(5174, 2f940d8a): 세 무리가 각각 뜨고 검산줄 5개가 수량만 보임
검증: pytest 212 통과(신규 1), tsc 0건
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
8-29 ㉮7(자재 원단위의 밑수 — 비탈면적인가 정면적인가)이 계획서에만
있고 화면에는 안 보였음. pending_choices 에 넣으니 구조물 원단위 탭에
바로 뜸 — 「무엇을 정해야 하나」와 「정하면 얼마나 달라지나(−4.4 %)」를 함께.
곁들여 확인 — 그 탭에 미확정 넷이 다 뜸:
자재 원단위 밑수 · 흡출방지재·차수시트 · 목재틀흙막이 원단위 ·
내역서 수량 표시 자릿수
계획서 8-25 가 뒤 둘을 「화면 ❌」로 적어 두었는데 실제로는 보임.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
보조 창 요청에서 출발했는데, 보다 보니 표가 통째로 안 가고 있었음.
표토제거(값 있음·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>
앞 커밋 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>
공용 파일 두 걸음 규칙 — 이 커밋은 신규 파일뿐이고 main.py 등록은 다음 커밋.
먼저 push 해야 다른 창이 등록 줄만 받고 파일이 없어 죽는 일이 없음.
까닭 — 단계마다 [확정]을 해야 다음 페이지가 열려서, 상세 설계를 확정하기
전에는 B08·B09 를 볼 수 없음. 오늘 화면 검증이 그 자리에서 두 번 막혔음.
⚠ 계산을 대신 돌리지 않음 — 잠금만 품
- 바꾸는 것은 project_workflow_stages.state 한 칸뿐
- 확정은 전 측점을 다시 계산해 정본에 쓰는 것이라, 흉내 내면
「확정 안 했는데 확정된 값」이 생겨 막힌 것보다 나쁨
- 값이 없으면 B08 이 「미확보」로 뜨는 것이 정상
⚠ 문은 서버가 정본 — ENVIRONMENT 가 개발이 아니면 세 입구 모두 403
(화면에서 단추를 숨겨도 API 가 열려 있으면 소용없음)
되돌리기 — 푼 단계의 이전 상태를 message 에 DEV_UNLOCK:<옛상태> 로 적어 두고
DELETE 가 그대로 복원. 그 표시가 없는 단계(진짜 확정)는 안 건드림.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
조율 창 제어 종료에 따른 마무리
- 9-7 에 「여기서 멈춤」 — B09 완료 상태(표 다섯·화면 전수·가드 8·시험 211·
tsc 0·700줄 0)와 **이어받을 사람이 볼 미처리 둘**
· 값이 채워진 첫 인계 받기(볼 것 여섯은 바로 아래 표)
· 타설 줄이 실린 자료로 65,826.4원/㎥ 이 금액에 걸리는지 확인
- 확정 답이 오면 손댈 자리 셋을 짚어 둠 — 제잡비 밑수 · 수량 자릿수 · 석재 할증
- `OWNERS.md` desktop-sub 줄을 「대기」로
브라우저 화면은 원래 탭(공사원가계산서)으로 되돌려 놓음.
워킹트리 깨끗 · 폴더 `D:\aislo-wt\sub` 확인
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
대기 중 둘 처리
- `tmp/snapshot_b09.py before|after|diff` — 인계 응답과 **코드 시각**을 함께 뜸.
`/api/health` 의 `code_mtime`·`stale` 을 같이 적어, 값이 움직였을 때
「자료가 바뀐 것」과 「코드 버전이 바뀐 것」을 가름
(성토 −16.81 % 가 그 자리였고 **절반이 코드 버전**이었음, 장부 규칙 7·8)
⚠ diff 는 **어느 줄이 얼마나** 바뀌었는지로 냄 — 합계 한 줄로 말하지 않음
- 9-7 에 「값이 채워진 첫 인계에서 볼 것」 여섯을 표로 적어 둠 —
암 갈래별 단가 · 타설 줄(65,826.4원/㎥) · 반영률 곱한 수량 · 공급 구분 ·
돌 규격/쌓기 방식 · 개소 구조물 단위(메인 `de31cd9c`)
내 검증 프로젝트는 `2f940d8a` (배정). 첫 스냅숏 떠 둠 — 공종 10 · 자재 0
검증: pytest 211 통과. 서버 `stale` 이던 것 재시작해 코드 시각 맞춤
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
㉕ 타설 줄 실증 중에 드러남. 관측 원단위가 「개소당」인 종류(집수정 셋)를
인계 줄이 늘 「m · 연장」으로 내보내고 있었음.
- 연장 2m 짜리 집수정이 「2.000 m」로 나가 값이 두 배로 실림
- 성분은 개소 기준으로 맞게 서는데 줄의 축만 어긋나 아무 시험도 안 잡았음
- billing_of() 로 관측표가 정한 단위·개수를 꺼내 전개 결과에 실음
- 인계 줄이 그 단위를 따름. 비어 있으면 종전대로 「m · 연장」
시험 셋 — 개소로 서는 것 · 연장이 길어도 한 개소 · ⚠ 정상 「m」 줄은
그대로일 것(좁게 고치는 짝 시험).
곁들여 타설 줄 실증: 옹벽 H=2.0(20m) + 집수정 Ø800 으로 돌리면
FP-12-01-01#철근구조물 32.840㎥ 가 인계에 섬(옹벽 27+3 · 집수정 2.84).
시험: 677 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
메인 창 지적(「안내를 더하는 것이 곧 다른 안내를 묻는 것」)을 내 화면에도 대어 봄
- 잘리는 줄은 없었음(본문 높이 = 스크롤 높이, 6줄 다 보임)
- 다만 **같은 수가 두 번** 떴음 — 「금액을 못 세운 줄 (16)」 뒤에 갈래별 머리글이
또 붙어 「… (16)」이 이어짐. 머리글을 **한 번만** 달게 함 (6줄 → 5줄)
- 갈래가 하나뿐일 때만 「금액을 못 세운 줄」을 앞에 붙여 뜻이 온전하게 함
- 문구도 줄임 — 「0 으로 채우지 않고 그대로 보입니다」 → 「0 으로 안 채웁니다」 등
실측(5174): 안내 5줄, 잘림 없음. 바꾼 화면 상태는 원래 탭으로 되돌림
검증: pytest 211 통과, tsc 0건
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 화면 전수 표 다섯 탭 결과와 「화면에서만 잡힌 것」(자재 0건인데 빈 표 셋)
- 공용 브라우저 로그인 절차 — 사용자가 유지하는 자격 파일 + 페이지 오리진에서
로그인 요청, 확인은 세션 200. ⚠ 파일이 내 폴더에 없으면 **그 자리에서 읽어 쓰고
복사·기록하지 말 것**(자격을 옮기면 지우는 사람도 늘어남)
- 「튕기면 서버가 아니라 브라우저 쿠키를 의심할 것」
마감 상태: 표 다섯 화면으로 섬 · 가드 7 + 열 방향 검사 · pytest 211 ·
tsc 0건 · 700줄 초과 0
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 계약 시험이 **제 일을 했음** — 「인계가 보내는데 안 읽는 칸: spec_class,
spec_class_basis」로 깨짐. 둘 다 읽고, 갈래 판정 근거(`spec_class_basis`)는
**B08 문구 그대로** 줄 비고에 이음
- 예시 서식 거르기를 뺌 — B08 이 **마스터 원천에서** 거름(8건).
두 곳에서 같은 것을 거르면 나중에 한쪽만 고쳐짐
- 짝 시험은 남기되 모양을 바꿈 — 인공 표 대신 **실물 마스터에서 그 8공종이
자원으로 서지 않는지**. 원천이 바뀌면 이 시험이 알려 줌
검증: pytest 211 통과. 못 맞춘 자원 497(원천 필터 뒤 값과 일치)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>