⚠ 「넘침은 0 인데 못 읽는」 자리였음. 표가 자기 스크롤 안에서 잘려 넘침 수치로는
안 잡히고, 실제로는 좌측 패널(320 고정)과 진행단계 패널(fixed)이 화면을 덮고 있었음.
실측(B08, 본문에 남는 폭)
860px 348 → 388 760px 248 → 288
620px 108 → 175 500px 4 → 194
1400·1000 은 그대로 (넓은 화면 배치 안 건드림)
방법 — 패널을 비율(vw)로 줄이면 좁아질수록 본문도 같이 줄어 결국 못 읽음.
그래서 **본문에 남길 폭**(--wf-min-content-width: 320px)을 정하고 패널이 그만큼
물러나게 함. 좁은 폭 전용 패널 폭(--wf-left-panel-narrow-width: 280px)도 따로 둠.
진행단계 패널은 폭을 줄이고 아래로 내려 본문 윗부분(탭·표 머리)을 안 가리게 함.
확인 — B03·B05·B06·B07·B08·B09 를 1400·760 두 폭에서 훑음. 문서 넘침 전부 0,
넓은 폭 배치 변화 없음(좌측 320 유지).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
업로드 하나가 그 프로젝트의 설계 산출물·초기값 스냅숏을 되돌릴 수 없게 지운다.
창 넷이 한 프로젝트를 볼 수 있어 말없이 지우면 남의 작업이 사라진다.
- `describe_existing_outputs`: 지워질 것을 사람 말로 낸다(전처리·노선·횡단·도면·
수량·원가·초기값). 빈 폴더는 세지 않는다.
- 지울 것이 있는데 확인이 없으면 409 `confirm_required` — 무엇이 지워지는지 함께 준다.
- 세 갈래(직행·청크·보관함 연결) 전부에 `confirm_replace` 를 붙임.
- ⚠ 기본값은 확인 켬(True) — 자동 절차(체인·스크립트)는 물음에 안 걸린다.
사람이 올리는 라우터만 False 로 불러 확인을 받는다.
- 화면: 409 를 받으면 「되돌릴 수 없습니다」와 지워질 목록을 보이고 한 번 묻는다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
실측(창 620) — .b09-main 이 1,190px 밀려 나감. 원인이 세 겹이었음.
- .b09-main · 표를 감싸는 body 칸에 min-width: 0 이 없었음. flex 자식 기본 최소폭이
auto 라 안쪽 표의 최소폭(칸이 nowrap)을 그대로 물었음.
- ⚠ 진짜 원인은 그 아래였음 — .b09-sheet 가 **감싸는 칸(div)에 붙는 자리와 표(table)에
바로 붙는 자리**가 둘 다 있음(내역서·자재대는 표에 직접). 표에는 overflow 가 안 먹어
표 폭만큼 바깥이 밀렸음. table.b09-sheet 를 블록으로 바꿔 제 안에서 가로로 넘어가게 함.
- 주석에 백틱을 쓰면 템플릿 문자열이 끊김 — 그 사실을 주석에 남김(한 번 겪음).
실측: 다섯 탭(공사원가계산서·설계내역서·일위대가·단가산출근거·관급·사급) × 창 1400·620
전부 몸통 가로밀림 없음·넘침 0px, 표만 제 안에서 스크롤.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
무한 로딩으로 보이던 자리가 둘이었음.
1) 미리받기가 클릭 앞을 막음 (진짜 원인)
진입 직후 도면 31 장을 순서대로 미리 받는데, 한 장이 0.3~1.0초라
그 사이 클릭한 도면이 앞의 여러 장 뒤에 줄을 서서 30초 넘게 안 열렸음.
화면은 「불러오는 중」 그대로였음.
- 클릭이 도는 동안 미리받기가 쉬게 함
- 클릭이 이미 받아 둔 장은 건너뜀
2) CAD 가 아무 말도 안 하면 끝이 없었음
끝을 알리는 것이 drawing-loaded · drawing-error 두 통지뿐이라,
iframe 이 안 뜨거나(ready 없음) 도면을 여는 중에 멈추면 영원히 돎.
- 지켜보는 시계 추가 (ready 20초 · 도면 15초)
- iframe 자체가 못 뜨면 기다리지 않고 바로 끊음
- 화면 표시만 끊고 요청은 살려 둠 — 늦게 오면 그대로 받음
곁들여 B07 의 「모든 도면 확정 뒤에 이동」 가드를 개발환경에서만 품
(B09 로 가는 길. 운영에서는 그대로 막음).
확인: 단계 표시줄 B08·B09 가 눌리고 B07 → B08 이동됨. tsc 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
B08 의 「확정 없이 다음으로」 단추가 B08 화면 안에 있어, 상세설계(B07)에서
B08 로 못 넘어가면 그 단추에 닿을 길이 없었음(닫힌 문 안에 열쇠).
- 단계 표시줄이 NOT_STARTED·STALE 을 막던 것을 개발환경에서만 품
- 열어 둔 단계는 「확정 전이라 값이 비어 보일 수 있음」을 툴팁으로 알림
- 잠금을 푸는 것이 아니라 가기만 하는 것 — 실제 우회는 B08 의 그 단추가
서버(common_util_dev_unlock)로 하고, 운영에서는 ENVIRONMENT 로 거절
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
창 넷이 DB·저장소를 함께 써 겹침이 실제로 생기는 자리다. 청크·임시배치 갈래에만
있던 보호막 둘이 직행 `/files` 갈래에는 빠져 있었다.
- `is_analysis_running` 가드: 분석 중 업로드를 409 로 막는다. 없으면 분석 2개가
같은 산출물 경로에서 부딪힌다.
- `supersede_previous_input_files`: 같은 이름 옛 행을 SUPERSEDED 로 내린다.
없으면 같은 파일이 두 줄로 활성이라 어느 것으로 도는지 순서에 달린다.
세 갈래가 같은 보호막을 쓰는지 지키는 시험을 `tmp/tests` 에 남김.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
사용자 지적 — 창을 줄이면 내용이 밖으로 나가고 글자를 못 읽었음.
원인은 세 자리의 **고정 최소폭**과 flex 기본값이었음.
- 계획노선|지형 2열이 `repeat(2, minmax(0,1fr))` 로 **고정**이라, 좁아지면 각 열이
카드 하나도 못 담고 넘쳤음 → `auto-fit` + `min(360px,100%)` 로 바꿔 스스로 1열로 접힘.
- 카드 격자 `minmax(260px,…)` · 고르는 줄 `minmax(200px,…)` 는 그 폭 아래에서 넘침
→ `min(…, 100%)` 로 컨테이너까지만 줄어들게 함.
- 카드 머리줄에 min-width/max-width 를 주어 배지·[선택]·[×] 가 안 밀려 나가게 함.
- 페이지 몸통(flex)에 min-width: 0 — 안 주면 안쪽 격자가 넘칠 때 몸통이 통째로
가로로 밀렸음.
실측(공용 브라우저): 폭 1400·1000·760·620·480 에서 여섯 컨테이너 모두 **넘침 0px**,
페이지 가로 스크롤 없음(scrollWidth = clientWidth). 트랙 폭도 확인 —
1400/1200 은 580·580(남는 트랙 0px), 1000·820 은 2열, 700 이하 1열.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
⚠ 네 창이 **같은 원본에서 같은 방법으로** 떠야 수치를 견줄 수 있는데,
쓰던 스크립트가 `tmp/` 에 있어 다른 창이 못 봤음(2026-09-08 랩탑 두 창이 막힘).
원본은 SELECT 만 함 — 원본 행·파일에 쓰지 않음.
뜨는 것 — DB 열 표(projects·input_files·processed_point_cloud·surface_models·
routes·route_points·route_statistics·longitudinal_sections·cross_sections·
project_workflow_stages)와 저장소 폴더 통째. 자동증가 id 는 새로 받고 참조를 다시 이음.
파일 안에 박힌 옛 UUID 와 초기값 스냅숏의 surface_model_id 도 치환함.
⚠ DB 만 뜨거나 파일만 떠서는 화면이 안 섬 — 수량은 DB(측점·횡단)를 보고
구조물·관 정본은 파일(structures.json·pipe_points.json)이라 둘 다 필요함.
쓰는 법: ./venv/Scripts/python.exe db_management/tools_clone_project.py <원본 UUID> "<새 이름>"
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
⚠ 아홉 중 여덟째 — FP-05-24 는 원문 L2769·L2794 절 머리 아래 「(㎡당)」인데
「단위:」 글자 없이 **괄호만** 있어 마스터가 못 읽던 자리(원문 열어 확인).
⚠ 그리고 매핑 밑수 칸은 **사람이 손으로 적는 자리**라, 품셈에 섞여 있는
「(㎥/1대, 1일)」 같은 **시공량**을 적을 수 있음 — 그것은 밑수의 **역수**라
받으면 그 공종이 조용히 뒤집힌 단위를 가짐. `is_quantity_unit()` 으로 좁게 막음
(나눗셈·쉼표가 있거나 「일당·조·인」이면 안 받음). 애매하면 안 받는 쪽 —
안 받으면 대조가 없을 뿐이고, 잘못 받으면 틀린 단위로 검사를 통과시킴.
시험 741 통과 (B05 코리도 1건 기존 깨짐, 무관).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
⚠ **계약은 하나도 안 바뀜** — 줄의 모양·칸 이름 그대로이고 파일만 가름.
종전 이름으로 부르던 곳이 그대로 돌도록 `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>
- 「(㎡당)」·「(인/100㎡당)」·「(1,000본당)」처럼 「단위:」를 뺀 절이 있음.
씨앗뿜어붙이기 5-24 가 그 모양이라 통째로 미확보였음(메인이 물은 아홉 중 하나).
- 「인/」 앞머리는 품의 단위라 건너뜀 — 「인/㎡당」은 「㎡당 몇 인」이라 공종 단위가 ㎡.
- ⚠ 「㎥/1대, 1일」·「대/ton」은 안 받음 — 그건 시공량이지 소요량이 아니라
공종 단위로 읽으면 뜻이 뒤집힘(역수). 밑수가 둘인 「1ha당, 100본당」도 안 받음.
- 절 단위 128 → 185, 단위 빈 일위대가 61 → 27. 내역 금액 변동 없음.
시험 2건 추가(받을 것·막을 것 짝), 254건 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
자재 카탈로그가 이름+규격 두 문자열로 줄을 찾고, 그 규약이 「공백 없는 한 낱말」임
(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>
- 「A = 77.7 ㎡/시간」처럼 등호와 단위 사이에 수가 끼는 표기를 읽음
(9-17-1 비탈면 다짐이 그래서 통째로 미확보였음).
- 상위 절이 스스로 안 적고 하위만 적는 경우를 채움 — 암절취 9-4 · 발파암 9-5 ·
노체 9-16 · 덤프운반 10-12 가 전부 ㎥.
- ⚠ 좁힘: 말한 하위가 둘 이상이고 값이 하나로 모일 때만. 하나만 말한 것을 상위에
주면 장 전체가 그 단위가 됨 — 「13. 돌공사」가 실제로 ton 으로 나왔음.
- 단위 빈 일위대가 73 → 61.
시험 3건 추가, 252건 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
⚠ 또 하나의 단위 불일치 — 층따기 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>
- 일위대가 211개 중 73개가 단위를 못 달고 있었고, 단위가 없으면 내역서의 단위
불일치 검사가 못 걸림. 층따기가 「㎡ 수량 × ㎥당 단가」로 4,102,708원을 내고
있었음 (돌쌓기 「m × ㎡당」과 같은 병).
- 원문에 적힌 자리 둘에서만 읽음 — 절 머리 아래 「(단위: ㎥당)」 · 공식형 [주]의
「Q= ㎥/시간」. 73개 중 12개를 채웠고 나머지는 미확보로 둠.
- ⚠ 「인 당」·「일 당」은 품의 단위이지 공종 단위가 아니라 받지 않음. 틀린 단위로
검사를 통과시키면 없느니만 못함.
- 자원 줄이 단위를 주면 그 값이 이김 — 원문 조회는 빈 자리만 채움.
- 결과: 층따기 4,102,708원이 「단위가 안 맞습니다」로 바뀜. 본체 합계
7,837,891 → 3,735,183원. ⚠ 줄어든 것이 맞음 — B08 이 ㎥ 로 보내야 풀림.
시험 6건 추가, 249건 통과.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
⚠ 실제로 금액이 틀리던 자리 — 돌쌓기(찰)를 `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>
- 품셈 13-2 채집 계열은 같은 품을 「㎡당 0.17 / ㎥당 0.64」 두 벌로 줌.
행-자원으로 읽어 앞줄만 잡고 뒷줄을 버려, 막돌 채집이 ㎡당 값을 ㎥ 단위로
달고 있었음 (29,251.5원/㎥ ← 실제 ㎥당은 110,123.5원).
- 밑수마다 따로 세우고 갈래 이름에 밑수를 넣음(#㎡당·#㎥당). 갈래의 단위가
그 밑수라 내역서 단위 불일치 검사가 엉뚱한 밑수를 걸러 냄.
- 밑수 표기가 하나뿐인 표는 안 건드림 — 넓게 잡으면 멀쩡한 표가 쪼개짐.
- 열이 갈래인 표는 갈래 × 밑수로 폄(「45㎝·㎥당」).
- 이름을 못 풀면 표째 버림 — 앞줄만 서는 반쪽 단가를 만들지 않음.
⚠ 야면석 채집(13-2-4)은 아직 안 섬 — 직종을 「인 부」로만 적는데 그런 직종이
노임 카탈로그에 없음(품셈 전체에서 이 표 하나뿐). 보통인부로 단정하지 않고
사용자 확정 대기로 둠.
시험 5건 추가, 243건 통과.
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>