Commit Graph
373 Commits
Author SHA1 Message Date
eomsangdon 80dce3d1d4 fix(knowledge): 그림 3차 정리 — 건협 p6 텍스트조각 삭제·KBIZ p45 입력화면 크롭
- 건협 p6_merged = 본문 텍스트 조각(md에 텍스트로 이미 존재) — 삭제, md 참조 2건 정리
- KBIZ p45_merged = 하단 여백·로고 포함 렌더 — 입력화면 영역만 크롭 재렌더 (1326x738)
- 잔여 28건
2026-08-14 17:48:12 +09:00
eomsangdon 0e18afd81a fix(knowledge): 그림 2차 정리 — 사이드탭·로고·통계마크 17건 삭제
- 품셈 p813~817 사이드탭 인덱스 8건(사용자 발견) + 표지 로고 2건
- 노임 보고서 기관 로고·국가통계 승인마크·점 이미지 7건
- md 8건 참조 정리. 잔여 29건 = 전부 내용 그림 (품셈 삽도·복원 그래프·조사화면)
2026-08-14 17:45:56 +09:00
eomsangdon d6fd215359 fix(knowledge): 조각난 그림 3건 PDF 페이지 렌더 캡처로 복원
- p.260 항타 그래프 등이 가로 조각 8개로 분할 추출된 문제(사용자 발견)
- 조각 삭제 후 원본 PDF 그림 영역을 2.5배 렌더 캡처로 교체 (품셈 p260·건협 p6·중기중앙회 p45)
- md 참조를 병합본 1건으로 치환, 챕터 하위폴더의 ../pic 상대경로 깊이 오류 10건 수정
2026-08-14 17:41:15 +09:00
eomsangdon fc48043639 docs(knowledge): 원가계산 그림 정리 — 장식·로고·배경 211건 삭제
- 해시 중복(5회 이상) 그룹 시각 확인 후 삭제: 페이지 배경 띠(90)·헤더 바(34)·
  KBIZ 로고(18)·간지 배너 조각(54)·말풍선/빈 이미지(15)
- md 48건에서 해당 이미지 참조 라인 제거 (깨진 링크 방지)
- 유지 59건 = 실제 내용 그림 (조사 입력화면·품셈 삽도 등)
2026-08-14 17:31:38 +09:00
eomsangdon 6d9863d658 docs(knowledge): 원가계산 PDF 3종 마크다운화·챕터 분할 (미결 18 신설 포함)
- 미결 No.18 신설: 사급 잡자재 단가 원천 결정(유료지) — 사용자 결정 대기
- 건협 노임: pdf2md + 4챕터 분할. 개별직종 노임단가 표는 pdf2md 실패로
  PDF 스트림 정밀 파싱 재구성 — 132직종 전수·4개 공표일 병기
- 중기중앙회 노임: pdf2md(표 정상) + 4챕터 분할 (129직종 표 포함)
- 건설공사 표준품셈(982p): pdf2md + 부문 5폴더/45장 전체 분할
  (공통8·토목9·건축11·기계설비13·유지관리4 — 목차 대조 전수 일치)
- 재사용 도구 _pipeline/split_cost_docs.py (cak|kbiz|pumsem 모드)
- 각 폴더 _meta.md에 변환 방법·한계(어절 공백·장 경계 ±1p) 기록
2026-08-14 17:29:25 +09:00
eomsangdon 2a661e1041 auto: 2026-08-14 17:03 (EOMSANGDON-HOME) 2026-08-14 17:03:19 +09:00
eomsangdon d0409c8ace docs(knowledge): 종합쇼핑몰 API 실데이터 검증 완료 — 레미콘·시멘트·아스팔트콘크리트 계약단가 확보 2026-08-14 17:03:16 +09:00
eomsangdon 41959bc774 docs(knowledge): 종합쇼핑몰 계약단가 경로 확정 반영 (OpenAPI 15129471·쇼핑몰 검색·납품요구 CSV) 2026-08-14 16:57:46 +09:00
eomsangdon c998afd3b6 docs(knowledge): 값형 원본 스냅샷 저장·실무 자재 실측 반영
- 계획 변경(사용자): 값형도 original/원가계산/에 원본 스냅샷 보존
  - 자재단가/ 나라장터 27,485행 CSV+JSON, 환율_한국은행ECOS/ 연초~일별 760행,
    유가_오피넷/ 전국평균+7일 JSON — collect_cost_sources.py values 모드 신설
- 실무 실측(울진 간선임도 46종·영월 58종): 관급 별도계상 16·조달가 15·물가지/견적 ~15
  - 실무 대비표 슬롯 = 조달가격/물가정보/물가자료/적산정보/견적단가 관측
  - 원가_기초데이터_원천.md §5 신설 — 유료지 실수요 = 공사당 사급 잡자재 15종 내외
- 노임 PDF 값 추출 가능 확인(직종코드 앵커), 품셈 기계경비 장(8장) 존재 확인
2026-08-14 16:54:02 +09:00
eomsangdon a98b9af3a0 auto: 2026-08-14 16:35 (EOMSANGDON-HOME) 2026-08-14 16:35:11 +09:00
eomsangdon a3f5b98032 docs(knowledge): 원가계산 원문 수집 실행 — 폴더 재편·원문 3종 확보·수집 경로 확정
- original/원가계산/ 신설, 다산소프트 폴더 이동 (링크 전건 수정)
- 원문 확보: 건설업 노임(건협)·제조업 노임(중기중앙회)·건설공사 표준품셈 PDF
- 폴더별 _meta.md (출처 URL·갱신주기·수집 방법)
- 표준시장단가 수집 제외 (사용자 결정 — 100억 미만 미적용·품셈과 별도 트랙)
- 자재단가 = 값형, original 미보관 (_meta 안내만) — 값층 관리 예정
- _pipeline/collect_cost_sources.py 수집 스크립트 배치
- 원가_기초데이터_원천.md §4 Aislo 수집 경로 확정표 추가 (API 3종 검증 결과 반영)
2026-08-14 16:35:05 +09:00
eomsangdon 79852854f5 docs(knowledge): ESTX 분석 검증 완료·원가 기초데이터 원천 기술문서 신설
- 타 AI 작성 ESTX 정밀분석 11건을 원본 파일 대상 독립 재검증
  (해시·CRC·테이블 20/20·조인 3계열·금액식 9.1만건·가격슬롯) — 반례 없음
- technical_info/01_임도/05_원가정보/원가_기초데이터_원천.md 신설:
  원천·갱신주기 표, 검증 산식, 내역 조립 계층(LinkIndex), 반기 스냅샷 운영
- 미결 No.17 갱신: 게시판 원천표 검증됨, 상태 = 원천 확인·입수경로 조사 대기
- _index.md·원가계산_체계.md 링크 반영
2026-08-14 14:48:20 +09:00
eomsangdonandClaude Fable 5 52e58b1819 docs(knowledge): 다산소프트 ESTX 정밀분석 문서 11건 추가·계획서 갱신
- ESTX_값사전 및 견적내역·물량도면·옵션메타·인쇄옵션·자재노무기계 등 값사전 세부 5건
- ESTX_검증근거, 데이터관계, 분석, 테이블사전, 파일구조 신규
- PLAN_2026-07-main_ESTX_정밀분석.md 갱신 (타 AI 작업분 커밋)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 19:36:36 +09:00
eomsangdon 5fbc663a82 auto: 2026-08-13 19:08 (EOMSANGDON-HOME) 2026-08-13 19:08:42 +09:00
eomsangdon 870c3f4477 auto: 2026-08-13 18:56 (EOMSANGDON-HOME) 2026-08-13 18:56:40 +09:00
eomsangdonandClaude Fable 5 226d452b48 fix(drainage): 등우선 커버리지 여유 30km→10km 축소 (사용자 지시)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 18:56:39 +09:00
eomsangdon e4273d27ef auto: 2026-08-13 18:51 (EOMSANGDON-HOME) 2026-08-13 18:51:28 +09:00
eomsangdonandClaude Fable 5 69df533350 feat(drainage): 확률강우량 본토 오류 개선 — WAMIS 관측소 방식 도입, 제주는 등우선 유지
- common_util_wamis_station.py 신규: 관측소 목록/확률강우량 xlsx 수급(프로젝트별 영구저장),
  최근접+반경 10km 후보 중 100년/24hr 최대 지점 선정(Aislo 자체 로직), 후보표 기록(성과품용)
- 강우강도 이원화: Mononobe형(기본, 실무 방식 rt=(R24/24)(24/T)^0.557) + General형 적합 옵션
  — Mononobe는 b=0 General형과 동일해 하류 idf_intensity/size_pipe 무수정
- _build_rainfall_sync: 계획노선 좌표로 제주/본토 분기, 본토 실패 시 예외 전파(제주 폴백 금지)
- value_at: 등우선 커버리지(제주+30km) 밖 좌표 차단 — 조용히 틀린 값 재발 방지
- config: WAMIS_STATION_RADIUS_M/DRAINAGE_RAINFALL_STATION_DIRNAME/DRAINAGE_RAINFALL_IDF_METHOD
- 검증: 제주 등우선 96값 정상, 본토 차단, 울진 관측소 R24=305.83, Mononobe 검산 실무 일치

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 18:51:25 +09:00
eomsangdonandClaude Fable 5 e6a010314c docs(knowledge): 미결 No.17 보조표 등록 — 상용 내역프로그램 기초단가 원천 목록
- 다산소프트 게시판 출처: 중기 기초단가(환율·유가), 분야별 노임 조사기관 6종, 자재단가 간행물 5종, 2026 개정품셈(돌쌓기·돌붙임 포함), 표준시장단가 발표처
- 미검증 표기 — No.17 원천 조사 시 대조 예정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 18:27:13 +09:00
eomsangdonandClaude Fable 5 d760a73541 docs(knowledge): 미결 No.10 삭제 — 노무 할증 관측 완료, No.17에 편입
- 품셈_적용기준.md §2: 실무 할증 적용 실태 표 신설 (거창·울진 내역 실측 — 품셈 [주] 조건·중기·자재 할증만 적용, 산림품셈 26계열 노무 할증 흔적 없음, 노임 = 시중노임 무할증)
- 03_미결: No.10 행 삭제, No.17에 노무 원천 실물 확인(시중노임 직종·단가 그대로) 편입 — 잔여 3행(14·15·17)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 18:22:55 +09:00
eomsangdonandClaude Fable 5 040327562b docs(knowledge): 미결 8·9·11 사용자 결정 반영 삭제 + 14번 설계심사 체크리스트 완성
- No.8: 안정계산 = 경고성 메시지만, 계산 미수행 확정 — 구조물_안정계산.md [구현] 갱신, 행 삭제
- No.9: 표준도·구조도는 개발 말단부 직접 설계 예정(사용자 지시 대기) — 행 삭제, 라이브러리 문서 참조 정리
- No.11: 기재부 예산안 편성지침 = 관리 대상 제외 — 행 삭제, 04_참조 목록 16행 삭제, 설계·감리대가.md 정리
- No.14: 사방 고시 별표2 전 24항 체크리스트 표화(타당성평가 §4) + 임도 제12조의2·별지18 9항 신설(설계제원_총괄 §10) — 잔여 = 실무 심의 사례 대조
- 미결 잔여 4행 (10·14·15·17)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 18:08:34 +09:00
eomsangdon 1891013ab7 auto: 2026-08-13 17:47 (EOMSANGDON-HOME) 2026-08-13 17:47:27 +09:00
eomsangdonandClaude Fable 5 9b3123015e docs(knowledge): 확률강우량 WAMIS 원천 확보 + Aislo 지점선정 로직 확정 — 미결 No.7 해소
- 설계유량.md §3-1: WAMIS 데이터 원천(관측소 621·티센·확률강우량 xlsx 2017 지역빈도해석) 경로·검증(울진 전곡리 100yr/24hr=320.0mm) 기록
- §3-2: Aislo 자체 지점선정 로직(최근접+반경 10km 내 최대값, 영구저장, B04~B06 파이프라인 편입, 제주=기존 등우선 전용, 성과품 실무 유사 표현) — 사용자 확정 2026-08-13
- §3-3: 실무 방식 라이브러리(주요지점 내장표 수동선정/최대시우량 직접입력) — 방식 선정 옵션으로 보존 예정
- 03_미결 No.7 행 삭제 (원천 확보로 잔여 소멸)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 17:47:26 +09:00
eomsangdonandClaude Fable 5 1f77de9f59 docs(knowledge): KDS 44 40 00 조도계수 표 hwp 원본 판독 — 흙수로·파형강관 공백 확정
- 통수단면.md §3: md 사본 2종 표 깨짐 → hwp(23.01판) BodyText 직접 판독으로 표 2.7-1 전체 복원
- 흙수로·토사·파형강관은 원본 전문 검색 무출현 — 소실 아닌 KDS 공백 영역으로 확정
- 03_미결 No.7: 잔여 = 최신 확률강우량도 확보만 남음

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 17:10:16 +09:00
eomsangdonandClaude Fable 5 fc4cc13d71 docs(knowledge): 미결 No.7 n값표 대조 완료 — 통수단면 §3 실무 대조표 신설
- 통수단면.md §3: 실무 관측 n값(콘크리트 0.013/0.017 KDS 일치, 거창 0.012·파형강관 0.025 근거 미확인) 대조표 추가
- 03_미결 No.7: 잔여를 원문 확보 2건(KDS n값표 깨끗한 판본, 최신 확률강우량도)으로 재정의 — 자료 대기 전환

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 17:03:49 +09:00
eomsangdon 0cb9f34663 auto: 2026-08-13 16:54 (EOMSANGDON-HOME) 2026-08-13 16:54:22 +09:00
eomsangdonandClaude Fable 5 1c6cdab55d docs(knowledge): 미결 정리 — 소광 원단위 전수추출·지식DB 가이드 원칙 명문화
- 신규: original/실무문서/_원단위라이브러리_울진소광.md (구조도 숨김탭 26탭 전수 추출 — 날개벽·집수정·골막이·기슭막이·돌붙임·수로·옹벽·부대구조물 개소당/m당 수량)
- 00_운영지침: ★★ 지식DB 역할 원칙(가이드, 값 확정 아님)·교본 사업 매칭 원칙 명문화 (2026-08-13 사용자 확정)
- 03_미결: No.2·3·4·6·13 해소 삭제(값 선정형 이관 정책), No.7·9·10·15 갱신, §2 회색지대 = 개발 단계 선정으로 전환
- 골막이.md §4 실무 관측 신설(치수조서 6개소 — 높이 2.5~3.0m 교본 초과 관측), 사방교본 교차참조 명시
- 독트린 감사 교정: 절토_비탈면·노면_쇄석포설·흙막이·00_구조물_선정기준 (기본값 단정 서술 제거)
- 사방 01_수량산출.md §3 실무 산출 골격 반영(구 No.13), 숨김탭분석 L형수로 콘크리트 0.115→0.151 정정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 16:50:04 +09:00
eomsangdonandClaude Fable 5 00ca9da23f docs(knowledge): 미결항목 전수 재검증 — 6행 갱신·낡은 참조 정리
- No.2: 소광 숨김탭 임도 골막이 치수조서 소스 확보 반영
- No.4: 종합비교 03으로 대조 완료 — 수량표에 기울기 없음, 현행 별표2 범위 우선, dwg 확보 시 재검증
- No.7: 7공사지 교차 완료(종합비교 02) — 배수계수 4계보·C값 0.6/0.85 KDS 분류 밖·Kerby+Mononobe 후보, 잔여=사용자 확정
- No.10: 자재 할증 5종 실무 확보, 잔여=품셈 대조·노무 할증
- No.11: 조달청 표로 건보·장기요양 사실상 해소 — 실질 잔여 ③기재부 설계비 요율만
- No.13: 종합비교 05 완료 — 기술문서 반영 잔여로 갱신
- 구 파일명 99_미결사항 → 03_미결_및_확인사항 라벨 11파일 일괄 수정
- 삭제된 행(No.1·5·12) 참조 4곳 확정 내용으로 치환 (선정기준·콘크리트포장·암거·사방원가)
- 제비율.md 미수집 표: 안전관리비 별표5 행 해소 처리

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 20:00:27 +09:00
eomsangdonandClaude Fable 5 10ecbf8317 docs(knowledge): 미결 No.12 완료 삭제 — 임도 산재 업종 = 건설업 확정
- 근거 3중: 조달청 제비율표(모든 건설공사 3.56%) + 안전관리비 별표5(임도=토목) + 울진대흥 실무 실증
- 제비율.md §1 비고·§2 산재 절·미수집 표에 확정 반영

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 19:50:20 +09:00
eomsangdonandClaude Fable 5 afafcdbd56 docs(knowledge): 미결 No.1 완료 삭제 (사방계 구조물 5종 용어 확정)
- 교본 정의 확정 + 실무 1건 실증, 00_구조물_선정기준 §4 반영 완료 — 사용자 완료 판정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 19:47:21 +09:00
eomsangdonandClaude Fable 5 855bac1029 docs(knowledge): STmate STC/XLSX 웹앱 적용성 검증보고서 이관
- docs/raw에서 resources/knowledge 루트로 이동 (docs/raw는 git 미추적이라 추가로만 기록)
- 2026-07-25자 PARTIAL PASS 보고서: STC 구조, 금액 대조, P0 누락정보, 웹앱 관리 방향

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 19:45:00 +09:00
eomsangdonandClaude Fable 5 0f9eef62a8 docs(knowledge): 미결 No.17 원가 기초데이터 원천 확보성 등록, 해소항목(5·16) 삭제 정책 전환
- No.17 신설: 일위대가·단가산출근거·환율및기초자료·중기사용료·재료비노무비경비·자재단가대비표·집계표의 현행 원천 데이터 입수 경로 조사 (STC는 결과물일 뿐 원천 미표기)
- 해소 항목은 행 삭제로 정책 변경 (이력 유지 안 함, 번호 재부여 없음)
- No.5(콘크리트 강도 210)·No.16(통수단면 2.0배 확정) 삭제

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 19:36:19 +09:00
eomsangdonandClaude Fable 5 81cd7e23c3 feat(knowledge): 도메인 지식저장소 메인 통합 + resources 그룹 체계 재편
knowledge (구 Aislo-law 독립 저장소 → resources/knowledge 이관, 저장소 폐지):
- 법령·행정규칙·표준시방서·교본 원문 + 기술문서 55건 + 실무 분석·종합비교
- 루트 지침 체계: README(지도)·00_운영지침·01_수집지침·02_분석지침·
  03_미결_및_확인사항(교본 충돌 리스트 포함)·04_참조_법령기준_목록
- 기술문서 55건 원문 전수 검증 완료 (사방 설계홍수량 법정 기준 등 반영)
- 정리: CAD·오피스 잔재 142건, 중복 zip 7건(413MB), 빈 폴더 30개 제거

resources 그룹 재편 (이름순 그룹핑):
- app_branding(구 prog_icon.jpg)·app_policies(구 legal)·
  data_global_contours(구 grobal_contours)·data_rainfall_idf_cache(구 wamis_contours)·
  template_2dDrawing(구 dwg_analysis/templete — 오타 교정, 상수·경로 동기화)
- dwg_analysis(분석 완료 1.8GB)·templates(빈 폴더)·templete_calc_cost.xlsx 삭제
- 참조 코드 5파일 경로 수정 + 프론트 재빌드 (구 경로 잔존 0)
- .gitignore: resources 추적 전환, national_contours.gpkg(22GB) 영구 제외
- .env: knowledge 수집용 API 정보 주석 통합 (KCSC·법령센터·조달청 제비율)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 19:14:32 +09:00
eomsangdon 1085a1b96d auto: 2026-08-09 11:11 (ESD_LAPTOP) 2026-08-09 11:11:13 +09:00
eomsangdonandClaude Opus 5 a9694356cf feat(B01): 대시보드 목록 컨테이너를 4행까지만 보이고 나머지는 안쪽 스크롤
프로젝트·임시 보관함·사용자 관리·가입 요청·회사 관리·시스템 로그 컨테이너는 자료가
쌓일수록 세로로 계속 길어져 페이지가 늘어난다. 4행 높이에서 자르고 나머지는 컨테이너
안에서 스크롤하게 했다.

행 높이를 상수로 박지 않았다. 프로젝트 표는 셀 안에 단계 막대가 들어가고 보관함 묶음은
접힘 상태에 따라 높이가 제각각이라 4 x 고정값으로는 어긋난다. limitVisibleRows()가
4번째 항목의 실제 아래쪽 좌표를 재서 max-height를 넣는다 — 표든 묶음이든 같은 코드로
맞는다. 항목이 4개 이하면 max-height를 지워 스크롤바를 만들지 않는다.

스크롤 중 어느 열인지 알아야 하므로 표 머리행은 sticky로 붙였다. 배경이 투명하면 아래
행이 비쳐 보여 불투명 배경도 함께 준다.

임시 보관함은 표가 아니라 묶음이 한 행이다. 묶음 안 파일 표는 접혀 있어 제외했다.
묶음을 펼치면 높이가 달라지므로 토글 핸들러에서 다시 잰다. 목록을 다시 그릴 때마다
resize 청취자가 쌓이던 문제는 WeakMap으로 이전 것을 걷어내고 다시 등록해 막았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 22:16:55 +09:00
eomsangdon c69aab9590 auto: 2026-08-08 21:56 (ESD_LAPTOP) 2026-08-08 21:56:23 +09:00
eomsangdonandClaude Opus 5 fbab749ec4 feat(B01): 프로젝트 삭제에 개발용 하드 삭제 스위치 추가
대시보드 삭제 버튼은 지금까지 projects.deleted_at만 찍는 소프트 삭제였다. 배포에서는
그게 맞다 — 사용자가 올린 라이다 원본은 다른 프로젝트에 재활용할 자산이다. 그러나 개발
중에는 프로젝트를 반복 생성·삭제하는데 정리 잡이 없어 수십 GB 원본이 계속 쌓인다.

config_system.py 맨 위에 PROJECT_DELETE_HARD_ENABLED를 두고 갈랐다. 기본값 False라
환경변수를 빠뜨린 배포 환경은 자동으로 안전한 쪽에 선다. True면 projects 행을 실제로
DELETE 하고(자식 테이블은 FK CASCADE로 함께 사라진다) storage/{회사}/{사용자}/{프로젝트ID}/
폴더를 통째로 지운다.

자식 테이블 목록은 코드에 나열하지 않았다. projects.id 참조가 전부 ON DELETE CASCADE라
행 하나면 충분하고, 목록을 복사해 두면 스키마가 바뀔 때 조용히 어긋난다.

순서는 DB 먼저 커밋, rmtree 나중이다. 파일을 먼저 지우면 DB 실패 시 실체 없는 프로젝트가
목록에 남아 화면이 깨진다. 반대면 rmtree가 실패해도 고아 폴더만 남고 정합성은 유지된다.

resolve_stored_project_path()는 끝에서 makedirs를 하므로 삭제에 쓸 수 없다 — 지우기 직전에
폴더를 되살린다. 검증만 하는 resolve_project_root_for_delete()를 따로 뒀고, 저장소 루트 안 ·
세그먼트 정확히 4개 · 마지막 세그먼트가 요청 project_id와 일치를 모두 요구한다. DB의
storage_path가 오염돼도 상위 폴더나 남의 폴더를 지우지 못한다.

하드 삭제 모드에서는 확인 모달 문구를 바꿔 원본까지 사라진다고 알린다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 21:56:17 +09:00
eomsangdonandClaude Opus 5 d935013ffa feat(B03): 같은 파일 재업로드는 전송 생략, 다른 내용이면 덮어쓰기 (E2E 결함 2)
사용자 결정(2026-08-08): 복수 파일을 허용하고 중복 기준은 파일명으로 둔다. 같은 이름으로
같은 내용이 다시 들어오면 덮어쓰지 말고 건너뛰고, 내용이 다르면 덮어쓴다.

파일 지문(부분 샘플링)
- B03_FileInput_Fingerprint.ts: 파일 크기 + 앞·중간·끝 8MB를 이어 SHA-256. 24MB만 읽어
  1~2초면 끝난다. 전체 읽기(1.7GB, 10~30초)와 견줘 실용적이고, 자리를 앞·중간·끝으로
  흩어 놓아 머리말만 같은 파일도 갈린다. 한계는 주석에 적었다.
- 화면이 업로드 세션 생성 요청에 지문을 실어 보내고, 서버가 같은 이름의 최신 입력 파일
  메타데이터에 적힌 지문과 견준다. 같으면 already_uploaded=true로 답해 **전송 자체를**
  건너뛴다(1.7GB면 3~5분 절약). 지문이 없거나 다르면 그냥 올린다 — 애매하면 올리는 쪽.
- 완료 요청에도 지문을 실어 input_files.metadata에 남긴다. upload_sessions에 컬럼을
  더하지 않으려는 선택이라 DB 스키마 변경이 없다.

옛 행 정리
- supersede_previous_input_files(): 같은 이름의 이전 행을 SUPERSEDED로 내린다. 조회는
  UPLOADED/PROCESSED만 보므로 목록·분석에서 자동으로 빠지고, 행은 이력으로 남는다.
- 직접 업로드 완료와 보관함 연결 양쪽에 적용.

검증(실서버 f45243b3)
- 같은 파일 재요청 → already_uploaded=true, 세션 미발급.
- 지문이 다르면 → 세션 발급(정상 업로드 경로).
- 옛 행이 SUPERSEDED로 내려가는 것 DB에서 확인.
- 화면 코드(B03_FileInput_Fingerprint.ts)를 그대로 실행해 만든 지문과 서버측 검증
  스크립트의 지문이 20MB 표본에서 완전히 일치(f281fd08…93e4).
typecheck·ruff·prettier 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 20:11:23 +09:00
eomsangdonandClaude Opus 5 b3d8371882 feat(B01,B03): 프로젝트에 연결된 보관함을 목록에서 제외 (E2E 결함 5)
연결된 묶음은 파일이 프로젝트로 옮겨져 내용이 비어 있는데도 목록에 남아, 파일 0건·용량
0·만료 없음·버튼 없음인 빈 껍데기가 영구히 쌓였다(2026-08-08 사용자 지시로 제외).

- list_temp_batches: status <> 'linked' 만 조회. 행 자체는 이력용으로 DB에 남긴다 —
  어느 자료가 어느 프로젝트로 갔는지 추적할 근거다.
- 대시보드 UI: 목록에 연결된 묶음이 오지 않으므로 "연결됨" 배지·삭제 버튼 숨김·파일 행
  비활성 분기를 걷어냈다(죽은 코드).

검증: 서버 재시작 후 목록 응답 0건, DB 보관 행 3건 유지.
typecheck·prettier·ruff 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 20:00:12 +09:00
eomsangdonandClaude Opus 5 431791c257 feat(B03,B05,B06): 초기 계산 끝까지 업로드 잠금 + 자료 없으면 대시보드로 (결함 3·6 화면측)
업로드 잠금(결함 3)
- 종전에는 전처리(B04)만 끝나면 버튼이 풀려, 노선·횡단이 도는 동안 자료를 또 올릴 수
  있었다. isInitialPipelineRunning()/pollInitialPipeline()을 두어 **횡단 단계가 열릴
  때까지**(3단계가 NOT_STARTED를 벗어날 때까지) 잠근다.
- relockWhileInitialPipelineRuns(): 새로고침·재진입해도 계산이 도는 중이면 다시 잠그고
  스피너를 붙인다. 잠금이 화면 상태로만 있으면 새로고침 한 번에 풀렸다.
- 보관함 연결 경로도 같은 대기 흐름을 탄다.

자료 없으면 대시보드(결함 6)
- b_missing_data_guard 신설 — 근거 자료가 없으면 한 줄 안내 후 B01로 보낸다. 새 자료가
  올라오면 서버가 옛 산출물을 지우므로, 열어 둔 뒷단계 화면은 빈 화면이 아니라
  대시보드로 나가야 한다(2026-08-08 사용자 지시).
- B05: 확정 지표면이 없으면 이동. B06: 노선 또는 종단면이 없으면 이동.

검증: 자료가 없는 신규 프로젝트로 B05 진입 → 안내 후 #/b01-account 로 이동함을
헤드리스 크롬으로 확인. typecheck·prettier 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 19:50:27 +09:00
eomsangdonandClaude Opus 5 37b4d41e0b feat(B03): 자료 교체 시 옛 산출물 정리 + 분석 중 업로드 차단 (E2E 결함 3·6 서버측)
사용자 결정(2026-08-08): 새 자료를 올리면 재계산해 덮어쓰고, 화면은 불러올 자료가 없으면
대시보드로 보낸다. 그러려면 자료가 갈리는 순간 옛 계산 결과가 남아 있으면 안 된다.

- common_util_project_reset 신설: 단계별 산출물 폴더(B04~B09)와 산출물 DB 레코드
  (surface_models·routes·route_points·route_statistics·longitudinal_sections·
  cross_sections·structures·quantity_items·outputs·processed_point_cloud)를 함께 지운다.
  **B03_FileInput(업로드 원본)은 지우지 않는다** — 같은 파일인지 가리는 중복 검사가 쓴다.
- 직접 업로드 완료·보관함 연결 양쪽에서 정리를 호출하고, 진행 단계도 1단계 이후를
  NOT_STARTED로 되돌린다(reset_stages_after_input_change).
- is_analysis_running(): 전처리가 도는 중이면 업로드 세션 생성과 보관함 연결을 409로
  막는다. 화면 버튼 잠금은 새로고침·다른 탭으로 우회되므로 서버에도 문을 단다.
- fail_stage 아래 있던 리비전(번호표) 안은 폐기 — 사용자가 "산출물이 없으면 대시보드"
  방식으로 정리했다.

곁들여: os.replace 공유 위반 재시도(replace_with_retry)
  진행률 파일은 서버가 쓰는 동안 화면이 계속 읽어 WinError 5가 났고, 전처리
  structured.npz 교체에서는 같은 이유로 분석이 통째로 죽었다(결함 3의 사망 원인).
  짧게 여러 번 다시 시도하도록 바꿨다.

검증(실서버 f45243b3, 계획노선 CSV 재업로드로 자료 교체):
  전처리 결과 112개 -> 재분석분만, 노선 2->0, 횡단 20->0,
  DB 지표면 15->0 / 노선 1->0 / 횡단 19->0, 업로드 원본 6개는 그대로.
  진행 단계가 초기로 돌아가고 재분석이 자동 시작됨.
  교체 재시도는 읽는 쪽이 파일을 잡고 있는 상황을 만들어 성공 확인.
ruff format·check 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 19:41:51 +09:00
eomsangdonandClaude Opus 5 1f119f9845 fix(B03): 직접 업로드 마지막 파일 404 + 실패 기록이 실패하던 문제 (E2E 결함 1·4)
결함 1 — 업로드 세션이 인증 세션을 가리고 있었다
- finalize_project_upload가 Depends(verify_session)로 받은 session을 같은 이름으로
  덮어써, str(session["role"])이 업로드 세션 행에서 role을 찾다 KeyError를 냈다.
  KeyError는 LookupError 하위라 404 {"message": "'role'"}로 나가고 로그도 안 남았다.
- 업로드 세션 변수를 upload_session으로 분리(청크 업로드·finalize·상태 조회 3곳).
- B03_FileInput_Router_Errors.lookup_error_response() 신설: 조회 실패만 404,
  KeyError·IndexError는 500 + 예외 로그. 두 라우터의 LookupError 처리 13곳에 적용.
  batch 단위 엔드포인트에는 batch_id를, 프로젝트 단위에는 project_id를 로그 필드로 준다.

결함 4 — fail_stage가 예외 문자열을 그대로 넣어 UPDATE가 죽었다
- project_workflow_stages.message는 varchar(255)인데 PermissionError 메시지는 300자를
  넘겨 DataError로 실패했고, 단계가 FAILED로 못 가 화면이 영영 "분석 중"이었다.
- 200자로 자르고 말줄임표를 붙인다. 원문은 호출부 로그에 남는다.

검증(실서버, 신규 프로젝트 f45243b3에 표본 5개 직접 청크 업로드):
  finalize 성공 11건 / "'role'" 오류 0건, 마지막 파일 complete_upload=true도 성공.
  이어서 WF1 자동 분석이 시작됨(stage 0 COMPLETE, stage 1 IN_PROGRESS) — 종전에는
  예외가 스케줄링 앞에서 터져 자동 분석이 아예 걸리지 않았다.
ruff format·check 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 19:18:42 +09:00
eomsangdonandClaude Opus 5 1e905c257f fix(B04,B05): 탑뷰를 극점에서 2° 띄워 첫 드래그 화면 뒤집힘 제거
앞선 두 커밋(c3f643b, 7d50ded)으로도 증상이 남아 헤드리스 크롬으로 실제 앱에 로그인해
B05 3D를 끌어 보며 측정했다. 원인은 회전 계산이 아니라 **탑뷰 카메라 자리**였다.

카메라를 정확히 수직으로 세우면(기존 top = [0, distance, 0.001], 극각 1e-6도) lookAt이
화면의 가로·세로 방향을 정하지 못한다. 그 자리에서 벗어나는 순간 화면 축이 180° 돌아간다.

실측(2px 드래그 6걸음):
  before  극각 0.00° -> 0.86°, 1걸음째 화면축 반전, 이후 같은 방향 드래그 먹통
  after   극각 2.00° -> 1.15°, 반전 0회, 반대 방향 20걸음도 반전 0회(1.15° -> 130°)

- TOP_VIEW_TILT(2°) 신설 — 화면상 위에서 내려다보는 그림과 구분되지 않으면서 여유각
  (POLAR_EPSILON, 약 1.15°)보다 바깥이라 첫 드래그부터 회전이 이어진다.
- B05 노선 뷰어, B04 지형·포인트클라우드 뷰어의 탑뷰 세 곳에 모두 적용.

typecheck·prettier 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 18:45:42 +09:00
eomsangdonandClaude Opus 5 7d50ded7b7 fix(B04,B05): 탑뷰에서 살짝만 끌어도 화면이 뒤집히던 문제
기본 탑뷰는 시선이 up과 거의 나란하다(극각 1.9e-6 rad). 이때 회전축으로 쓰던
시선×up이 0에 수렴해 축 방향이 잡음으로 정해졌고, 살짝만 끌어도 엉뚱한 축으로 돌아
화면이 뒤집혔다. 앞 커밋의 극점 클램프도 각도를 여유각(0.02 rad) 경계까지 끌어올려,
작은 드래그가 여유각만큼 튀게 만들었다.

- 시선×up이 시선 길이 대비 무시할 만큼 짧으면 카메라 자신의 가로축으로 대체한다.
  두 축은 모든 각도에서 방향이 같아(내적 1.000000) 전환 순간에도 조작감이 안 바뀐다.
- 클램프 경계를 현재 극각과 여유각 중 극점에서 먼 쪽으로 잡는다. 이미 여유각 안쪽인
  탑뷰에서는 경계로 끌어올리지 않고, 극점에서 멀어지는 쪽만 열어 준다.

검증(탑뷰 재현): 0.005 요청 -> 0.005 적용, 0.05 -> 0.05, 극점 쪽 -0.005 -> 0(정지).
typecheck·prettier 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 18:31:47 +09:00
eomsangdonandClaude Opus 5 c3f643b8b0 fix(B04,B05): 3D 상하 드래그 시 화면이 튀던 문제 — 극점 처리와 드래그 이탈
세로로 많이 끌면 화면이 멈췄다가 한 번에 움직이는 증상. 원인 두 가지였다.

1) 극점을 넘길 회전을 통째로 버렸다. 끄는 동안 화면이 굳어 있다가 각도가 다시 범위
   안으로 들어오는 순간 밀린 만큼 한꺼번에 움직였다. 이제 극점 직전까지만 잘라서
   적용한다 — right축이 up과 직교하므로 돌린 각이 곧 극각 변화량이고, 부호만 실제로
   재서 클램프한다. 극점에 닿으면 더 안 가고 멈출 뿐, 반대로는 자유롭게 빠져나온다.
2) 드래그가 캔버스 밖(브라우저 위·아래 끝)으로 나가면 pointerleave로 회전이 끊겼다.
   다시 누를 때 커서 아래로 회전축을 새로 집어 시점이 튀었다. 포인터를 캡처해 밖으로
   나가도 회전을 이어 가고, 놓을 때만 끝낸다.

B04 지형·포인트클라우드 뷰어와 B05 노선 뷰어가 같은 모듈을 쓰므로 양쪽 모두 적용된다.
typecheck·prettier 통과, 정적 번들 재빌드.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 18:26:26 +09:00
eomsangdonandClaude Opus 5 d9f6fbdff1 fix(B05): 유령 마커가 계속 뜨던 이유 — 화면이 표고 null을 0으로 눕히고 있었다
앞 커밋(53ab941)에서 "표고 없는 점은 안 그린다"를 넣었는데도 그대로 보였다.
restorePoints -> placed()가 마커에 넘기기 전에 z: point.z ?? 0으로 바꿔, 마커 쪽에서는
표고를 아는 점(0m)으로 보였기 때문이다. 판정이 걸릴 자리가 없었다.

- PlacedRoutePoint.z를 number | null로 바꿔 "모름"을 모름 그대로 들고 다닌다.
- placed()는 z ?? null, 서버로 보낼 때(routePoint)만 null -> undefined로 바꾼다.
- modelToScene은 표고가 정해진 점만 받는다(z: number) — 호출부에서 이미 해결한 값을 준다.

typecheck·prettier 통과. 백엔드가 정적으로 서빙하는 번들(config/node_modules/.build)도
다시 빌드했다 — :8000으로 보면 서버 기동 때 만든 옛 번들이 떠서 수정이 반영되지 않는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 18:21:22 +09:00
eomsangdonandClaude Opus 5 53ab941aef fix(B05): 3D에 노선 모양 유령 커브 — 표고 없는 제어점이 지형 아래 평면에 깔리던 문제
계획노선 CSV로 만든 제어점에는 표고가 없다(z: null). modelToScene이 point.z - cz를
계산하는데 JS에서 null - 548.5 = -548.5이라, BP·EP·경유점 135개가 전부 지형 중심보다
548m 아래 수평면에 깔렸다. 화면에서는 노선 모양이 평면에 투영된 주황 구슬 커브로
보였고(경유점 색 0xf59e0b), 원근 때문에 지형 밖으로 밀려 나갔다.

- markerElevation() 신설: 표고가 있으면 그 값, 없으면 시·종점만 지형 표면을 찾아 얹는다.
  표고 없는 경유점은 그리지 않는다 — 그 자리는 경로선으로 이미 보이고, CSV 정점
  전부(여기선 133개)에 마커를 세우면 노선이 구슬에 덮인다.
- 뷰어에 terrainElevation() 추가: 지형 위에서 수직으로 광선을 쏴 표면 높이를 읽는다.
- renderRoute도 같은 함정을 막는다: z ?? 0 대신 지형 표고 → 직전 점 높이 순으로 채운다.
  경고 구간이 인덱스로 점 배열을 다시 자르므로 점 개수는 그대로 둔다.

typecheck·prettier 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 18:17:27 +09:00
eomsangdonandClaude Opus 5 91f86c5629 feat(B05): 종단곡선 기준을 모든 변화점에서 길이 L로 통일
2026-08-03(d21b0ec)에 곡선 기준을 R에서 L로 바꿨지만 배관 정착 계획선 산출부
한 곳에만 들어갔다. 공용 곡선 계산기와 정책값은 R 기준(측점간격 20m ×
curve_radius_ratio 0.40 = 8m)으로 남아, 사용자가 변화점을 새로 추가하면 그 자리만
R=8m가 적용됐다(대수차 3%면 L=0.24m — 도면에서 곡선이 사라진다). 화면 요약도
"기본 R 8.0 m"를 그대로 보여줘 오해를 키웠다.

- config: pipe_anchor_curve_length_m -> default_curve_length_m(15.0)로 승격.
  배관 정착뿐 아니라 모든 변화점의 1차 기준값이다.
- AlignmentPolicy에 default_curve_length_m 추가, 정책 스냅샷에도 실어 보낸다.
  옛 R 기준 값(default_curve_radius_m)은 옛 저장분 호환용으로 남긴다.
- build_curves(백엔드)와 buildCurves(프론트) 규칙 일원화:
  사용자 지정 R > 기본 L > (옛 저장분) 기본 R × 대수차.
- 인접 직선이 짧아 목표 L을 못 넣으면 **넣을 수 있는 최대 L**까지만 줄이고 경고를
  남긴다(2026-08-08 사용자 지시). 경고 문구도 길이 우선으로 고쳤다.
- 옛 저장분(정책에 L 없음)은 양쪽 모두 R 기준을 유지한다 — 서버만 L로 올리면
  화면과 다른 곡선이 나온다. 새 기준은 계획선을 다시 산출할 때 적용된다.
- 패널 요약 라벨: "기본 R" -> "기본 곡선길이 L"(옛 저장분은 "기본 R(옛 저장분)").

검증(측점간격 20m, 대수차 3%): 기본 L=15.00m/R=500m, 사용자 R=300 지정 시
L=9.00m/R=300m, 인접 직선 10m면 L=9.00m로 잘리고 경고 1건, 옛 스냅샷은 종전대로
L=0.24m/R=8m. typecheck·ruff format·check 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 17:50:36 +09:00
eomsangdonandClaude Opus 5 7a265e5db4 fix(B07): 수량 확정이 항상 500 — get_db_pool()에 잘못 붙은 await 제거
get_db_pool()은 동기 함수인데 B07만 await로 불렀다. 그 결과 풀 대신
_PoolConnectionContextManager가 잡혀 acquire()에서 터졌다.

  AttributeError: '_PoolConnectionContextManager' object has no attribute 'acquire'

좌측 패널 [확정]을 누를 때마다 stage 4가 전이되지 않고 500이 났다(서버 로그 확인).
프로젝트 안에서 await를 붙인 호출부는 여기 한 곳뿐이다.

ruff format·check 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 16:54:29 +09:00
eomsangdonandClaude Opus 5 4b1f922ce3 fix(B05): 경유점 번호가 비면 경로 탐색이 터지던 문제
화면에서 막 찍은 경유점은 order가 아직 없어 None으로 온다. 정렬 키가
x.get("order", 0)이라 키가 있고 값만 None인 경우를 걸러내지 못해
TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'로
경로 탐색 전체가 실패했다(서버 로그 확인, project_id=fc86f247).

None을 0으로 눕힌다 — 파이썬 정렬이 안정적이라 번호가 없는 점들은 받은 순서를
유지한다. 같은 패턴을 쓰던 능선/계곡 탐색기(RidgeValley)도 함께 고쳤다.

ruff format·check 통과.

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