Commit Graph
358 Commits
Author SHA1 Message Date
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
eomsangdonandClaude Opus 5 960dca8360 fix(B03): 진행단계 오버레이에 대시보드 버튼 누락 — homeButton 옵션 미전달
B04~B06은 createWorkflowLayout이 createStepBar에 homeButton: true를 넘겨
오버레이 최상단에 대시보드 탈출구를 단다. B03은 일반 레이아웃을 쓰느라
오버레이를 직접 조립하면서 이 옵션만 빠져 혼자 버튼이 없었다.

템플릿(createStepBar/createWorkflowOverlays)은 그대로 쓰고 옵션만 맞춘다.

typecheck·prettier 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 16:05:21 +09:00
eomsangdonandClaude Opus 5 2e8cf0d1c7 fix(chain): 자동 설계 체인에 배수유역 분석·관 지점 확정 단계 추가
계획선 1차 로직(design_pipe_anchored_profile)은 저장된 관 지점을 변화점으로
쓰는데, 자동 설계 체인이 그 파일을 만들어 주지 않았다. 그래서 초기 계획선이
2차 폴백(지반 추종 직선 분할)으로 산출돼 관 자리 틸팅·R이 통째로 빠지고,
B05/B06에 들어와도 배수유역도가 비어 있었다.

- _prepare_drainage_pipes_and_reprofile() 신설: 배수유역 분석 → 기본 관 지점
  확정 저장 → 배관 정착 계획선으로 종횡단 재생성. 실패해도 체인을 멈추지 않는다.
- run_auto_design_chain: B05 경로 확정 다음, B06 확정 전에 호출.
- run_redesign_chain: 노선이 바뀌었으므로 refresh=True로 호출 — 저장된 배수유역
  분석 응답은 노선 변경을 스스로 알지 못한다.

검증(테스트 프로젝트 fc86f247, 노선 350m): 관 4개(계류 1 + 간격 보충 3) 확정 후
종횡단 재생성 → PVI 6개(BP + 관 4자리 + EP)가 관 측점과 일치하고 각 자리에
R(1108.57/180.79/450.0/580.97m)이 붙는 것을 확인. 반영 전에는 관과 무관한
지반 추종 변화점이었다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 15:56:29 +09:00
eomsangdon c5d4b3f046 fix(B03): 파일 수 초과 오탐 - 고른 파일 수 대신 최종 점유 슬롯 수로 판정 2026-08-08 14:17:48 +09:00
eomsangdonandClaude Fable 5 2ff37a6e41 feat(B03): 입력 자료 컨테이너 통합·3열 배치 + 업로드 중 화면 잠금
지형 래스터(tif)만 선택 항목이고 나머지는 모두 필수라, 계획노선과 지형 자료를
따로 묶을 이유가 없다.

- 그룹 2개(원청 계획노선/지형 분석자료)를 "입력 자료" 한 그룹으로 통합
- 계획노선 카드에만 걸려 있던 전용 서식(1열 폭·보라 배경·테두리) 제거 —
  다른 카드와 같은 템플릿으로 통일
- 카드 배치 2열 -> 3열 (1280px 이하 2열, 720px 이하 1열)
- 선택 항목(tif)은 확장자 옆에 "선택" 표시
- [파일 업로드]를 누르면 버튼을 잠그고 안에 회전 원을 넣어 진행 중임을 보이며,
  업로드·분석이 끝날 때까지 화면 조작을 막는다(중복 업로드·단계 이동 방지)

파일 분리: 업로드 실행부(청크 업로드/분석 대기/결과 표시/교체 확인 모달)를
B03_FileInput_UI_Upload.ts로 이관해 페이지 파일을 700줄 제한 안으로 되돌림(830 -> 622).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 14:14:46 +09:00
eomsangdonandClaude Fable 5 6c1a8023ca fix(B03): 보관 자료 선택 모달 텍스트를 테마 서식으로 정정
목록 항목이 <button>이라 본문 글꼴을 물려받지 못해 시스템 기본 글꼴로 나왔고,
글자색으로 --color-primary-text(주 액션 배경 위 색)를 써서 밝은 배경에서 흐리게 보였다.

- 항목: font-family/--text-caption/--color-text-body 지정, 이름은 --text-body-sm
- 선택 안내·빈 목록 문구: 하드코딩 px를 --text-caption/--text-body-sm으로 교체
- 모달 제목: 브라우저 기본 h3 서식 대신 --font-display/--text-body 적용

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 14:00:23 +09:00
eomsangdonandClaude Fable 5 22ecf3ad73 fix(nav): 지표면이 필요 없는 화면은 준비 화면을 거치지 않도록
파일을 아직 올리지 않은 새 프로젝트에서 대시보드 -> 파일 입력으로 이동하면
준비 화면(B11)이 확정 지표면을 찾다 실패해 "담당자에게 연락" 장애 안내를 띄웠다.
파일 입력 화면은 3D 지표면을 쓰지 않으므로 준비 자체가 필요 없다.

- goToWorkflowStage: 담아 둔 지표면을 실제로 쓰는 B04/B05로 갈 때만 준비 화면 경유,
  나머지(B03/B06~B09)는 바로 이동
- 확정 지표면이 없을 때는 장애가 아니라 순서 문제이므로 전용 표식(PRELOAD_NO_SURFACE)을
  던지고, 준비 화면은 안내 문구 + [파일 입력 화면으로] 버튼을 보여 준다

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 13:49:37 +09:00
eomsangdon 9b4f603405 style(B01): 임시 보관함 캐럿·요약 텍스트를 테마 토큰으로 정정 2026-08-08 13:44:36 +09:00
eomsangdonandClaude Fable 5 ff3d819019 feat(B01): 임시 보관함 그룹 접기/펼치기 + 제목 행 한 줄 정리
- 그룹은 기본 접힘, 제목 행 전체가 토글 트리거(액션 버튼 클릭은 전파 차단)
- 목록을 다시 그려도 펼친 그룹은 유지, 업로드 시작 시 해당 그룹 자동 펼침
- 파일 수·용량·보관 만료를 상태 배지 오른쪽으로 옮겨 제목과 한 줄로 배치
- 파일 표 상하 여백 축소(셀·버튼 padding 2px, 글자 크기 유지)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 13:42:55 +09:00
eomsangdonandClaude Fable 5 8d51f6d334 fix(B01): 임시 보관함 안내 문단 제거, 보관 기간은 제목 옆 태그로
- 섹션 제목 오른쪽에 "30일 보관" 태그 표시(서버 retention_days 반영)
- 빈 상태를 공용 표 블록에 위임해 프로젝트 컨테이너와 같은 문구·서식 사용
- 쓰지 않게 된 locale 키 2종 정리

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 13:32:43 +09:00
eomsangdonandClaude Fable 5 f60ecc255f feat(B01): 임시 보관함 UI를 그룹+파일 리스트 컨테이너로 개편
프로젝트/사용자 관리 컨테이너와 같은 형태로 통일한다. 등록 폼을 화면에 상시
노출하지 않고, 우측 상단 [+] 모달로 받아 그룹(임시 프로젝트명) 아래 파일 표를
그린다.

프론트엔드
- B01_Dashboard_UI_TempModal.ts 신설: 등록/추가 모달(임시 프로젝트명 + 파일 선택,
  고른 파일을 모달 안 표로 표시, 하단 [취소][확인] — 기존 대시보드 모달과 동일 규격)
- B01_Dashboard_UI_TempUpload.ts: 섹션 전체(제목·[+]·목록)를 반환하도록 변경.
  그룹 카드 + 파일 표(종류/파일명/크기/상태/작업), 그룹별 [파일 추가],
  파일별 [삭제], 진행률은 해당 파일 행 안에서 표시
- 청크마다 목록을 다시 조회하지 않고 막대 DOM만 갱신하도록 정리
- 대시보드 배치: 프로젝트 컨테이너 바로 아래(역할 3분기 모두)

백엔드
- DELETE /api/temp-uploads/{batch_id}/files/{file_type}: DB 행과 임시 저장소
  실제 파일을 함께 삭제. 필수 파일이 빠지면 상태를 uploading으로 되돌리고
  만료일은 최초 완료 시점 기준을 유지

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 13:23:58 +09:00
eomsangdonandClaude Fable 5 17834d8189 feat(B01,B03): 프로젝트 생성 전 임시 보관함 (temp upload)
라이다 원본은 업로드에 오래 걸려 프로젝트 정보 확정 전에 미리 올릴 수 있어야 한다.
계정에 묶인 임시 보관함을 만들고, 나중에 만든 프로젝트로 자료를 옮겨 쓴다.

저장·DB
- storage/tmp/{user_id}/{batch_id}/ 아래에 프로젝트 저장소와 동일한 구조를 써서
  청크 저장·병합 엔진(resolve_upload_destination/merge_upload_chunks)을 그대로 재사용
- 010_temp_upload.sql: temp_upload_batches / temp_upload_files 신설,
  upload_sessions.project_id NULL 허용 + temp_batch_id 추가(FK명 조회 후 재생성)
- config: TEMP_UPLOAD_DIR_NAME / TEMP_UPLOAD_RETENTION_DAYS(30) /
  TEMP_UPLOAD_CLEANUP_INTERVAL_HOURS(6)

백엔드
- B03_FileInput_Router_Temp.py: 묶음 생성·목록·삭제, 일반/청크 업로드, finalize,
  이어올리기 상태 조회, 프로젝트 연결(attach)
- attach: 파일 이동 후 input_files 등록, stage 0 완료, WF1·자동 설계 체인 트리거
- common_util_temp_cleanup.py: 완료 시각 기준 만료분 주기 삭제(서버 시작 시 1회 포함)

프론트엔드
- B01 대시보드 임시 보관함 섹션: 프로젝트 등록과 같은 폼 + 보관 목록.
  진행률은 모달이 아니라 리스트 행에 표시, 새로고침 후 이어올리기 지원
- B03 업로드 컨테이너 내부 불러오기 버튼과 선택 모달.
  완료된 묶음만 노출하고, 선택 후 업로드를 누르면 이동과 분석으로 이어짐

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 12:55:14 +09:00
eomsangdonandClaude Fable 5 336335c611 change(B03): 업로드/분석 알림 메일을 초기 설계 완료 시점 한 통으로 통합
같은 업로드 한 번에 업로드 완료 메일과 지표면 분석 완료 메일이 두 통 도착했다.
사용자가 실제로 화면을 볼 수 있는 시점은 초기 설계(B04 전처리 + B05 종단 + B06 횡단)까지
끝난 때 하나뿐이므로 그 시점에 통합 메일 한 통만 보낸다.

- send_initial_analysis_complete_email 신설: 지표면 요약 + 노선 연장/측점 수 +
  종단설계 화면 링크. 자동 체인 미실행/실패 시 전처리 요약만 싣고 안내 문구 전환
- run_auto_design_chain이 요약(route_id/length_m/cross_section_count) 반환
- WF1 서비스: 체인 실행 -> 통합 메일 순으로 재배치
- 업로드 직후 메일 발송 호출 제거(일반·청크 두 경로). 발송 함수는 프로젝트 생성 전
  임시 보관함 안내용으로 남겨 두고 주석으로 용도 명시

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 11:30:41 +09:00
eomsangdonandClaude Fable 5 6e0a6bcba3 change(B03): 업로드 완료 후 이동 대상을 역할 무관 B05 종단설계로 통일
전처리(B04)는 자동 확정까지 끝난 관리자 전용 점검 화면이라 일반 진행 경로가 아니다.
시스템 관리자만 B04로 보내던 분기를 없애고 모두 B05로 보낸다.
분기 제거로 fetchDashboardMe 호출도 함께 제거(B03 진입 시 불필요한 왕복·실패 지점 감소).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 11:21:23 +09:00
eomsangdonandClaude Fable 5 4d0d627f57 fix(B03): WF1 백그라운드 작업 유실 방지 + 파일 교체 시 개수 초과 오탐 수정
증상 1 — 업로드는 성공하고 stage 0은 COMPLETE인데 stage 1(PREPROCESS)이
NOT_STARTED로 남아 분석이 시작되지 않고 다음 페이지로 넘어가지 않음.
원인: asyncio.create_task 결과를 아무도 붙잡지 않아 이벤트 루프가 약한 참조만
보유 -> GC가 대기 중인 작업을 회수하면 WF1 트리거가 조용히 사라짐.
조치: _BACKGROUND_TASKS 집합에 강한 참조를 보관하고 완료 시 해제,
취소 경로 로깅 및 작업 시작 로그 추가.

증상 2 — 5개 슬롯을 모두 고른 뒤 한 슬롯만 교체하면 개수 초과 오류.
원인: 교체 대상 슬롯을 기존 선택 개수에서 빼지 않고 더해 6개로 계산.
조치: 대상 슬롯을 제외하고 계산, 통과 시 이전 오류 문구 제거.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 11:13:34 +09:00
eomsangdonandClaude Fable 5 15674a291c fix(repo): .gitignore 오염 복구 — CLAUDE.md 추적 제외 원상복구
.gitignore 마지막 줄에 개행 없이 .tmp_* 패턴이 이어 붙어 /CLAUDE.md 규칙이
/CLAUDE.md.tmp_* 로 오염, 직전 auto 커밋이 CLAUDE.md와 임시 png를 추적에 추가했음.
규칙을 /CLAUDE.md 와 .tmp_* 두 줄로 분리하고 두 파일을 추적에서 제거(디스크 유지).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:37:59 +09:00