Commit Graph
316 Commits
Author SHA1 Message Date
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
eomsangdon faf6d26b2c auto: 2026-08-08 10:36 (EOMSANGDON-HOME) 2026-08-08 10:36:45 +09:00
eomsangdonandClaude Fable 5 dc63f2a1e2 chore: 루트 임시 파일(.tmp_*) 추적 제외 및 gitignore 규칙 추가
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:36:45 +09:00
eomsangdon 7d764448bd auto: 2026-08-08 10:36 (EOMSANGDON-HOME) 2026-08-08 10:36:19 +09:00
eomsangdonandClaude Fable 5 ffccb846eb chore: 리팩토링 마감 — 포맷터 적용·내부 라벨 정리·계획서 체크리스트 완료 표시
- prettier 적용(편집 파일 14종), ruff format 무변경 확인
- B03 내부 백그라운드 태스크 라벨 b04-wf1-auto -> b04-preprocess-auto
- docs/raw/PLAN.md R1 체크리스트 Phase 1~7 완료 표시 (검증 대기 상태로 전환)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:35:26 +09:00
eomsangdonandClaude Fable 5 98df22f789 feat(B05,B06): 워크플로우 재정의 — 자동 계산 노란 상태·버튼 개편·초기화
자동 체인 상태 전이 분리:
- confirm_latest_route/confirm_sections에 mark_stage_complete 플래그 추가
- 자동 체인(신규·재확정)은 데이터만 확정하고 stage 2·3을 IN_PROGRESS로 남김
  (스텝바 기존 노란 테두리 = 계산됨·확정 전 상태로 재사용)
- B06 [확정]이 stage 2+3 동시 완료 + 경로 상태 CONFIRMED 보강 후 B07 수량 이동

B05 좌측 패널 개편:
- 포인트 팔레트 + 임도 기준·옵션을 경로 계산 설정 한 컨테이너로 병합,
  [최적 경로 계산] 버튼을 컨테이너 내부로 이동 (가끔 쓰는 무거운 재계산)
- 하단 액션 행 [초기화][임시저장][횡단 이동]으로 교체, 경로 단독 확정 폐지
- [임시저장] = 관로 + 계획선 델타 + 비정규 측점·상단측 저장(mark_stage_complete=false)
- [횡단 이동]/B06 [종단 이동] = 저장 없이 페이지 이동만 (B05·B06 캐시 공유 구조 유지)
- [초기화] = POST /route/reset 신설: 기존 경로 삭제 후 계획노선 CSV 기본값으로
  자동 체인 재실행(파일입력 직후 상태 복원), 분석용 타임아웃 적용

B06 액션 행: [종단 이동][임시저장][확정] 3버튼 구성, locale 키 정비

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:26:45 +09:00
eomsangdonandClaude Fable 5 ec9943417c feat(B07,B09): B07_Quantity 셸 페이지 신설 + B09_Estimation 접두사 정리 + 단계 순서 반영
- B09_wf6_Estimation -> B09_Estimation (폴더·파일·라우트 키/슬러그)
- B07_Quantity_UI_Page.ts 신설: 워크플로우 셸 + 좌측 [확정] 버튼
  (renderPendingWorkflow에 leftPanel 옵션 추가로 공용 셸 재사용)
- B07_Quantity_Router.py 신설: POST /api/projects/{id}/quantity/confirm
  -> complete_stage(4) 전이만 수행(본문 미구현), main.py 등록
- STAGE_KEYS 재정의: FILE_INPUT/PREPROCESS/PROFILE/SECTION/QUANTITY/DESIGN_DETAIL/ESTIMATION
- 스텝바 라벨·아이콘 4↔5 스왑(수량산출이 4차, 상세설계가 5차), A02 소개 문구 스왑
- 라우터 테이블에 b07-quantity 등록(플레이스홀더 제거), locale 키 5종 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:15:07 +09:00
eomsangdonandClaude Fable 5 2a248ff742 refactor(B07,B08): 도면 코드 B08_DesignDetail 이동 + 수량 슬롯 B07_Quantity 확보
- B07_wf4_DesignDetail(8파일+openwebcad) -> B08_DesignDetail로 git mv (이력 보존)
- B08_wf5_Quantity -> B07_Quantity (구 수량 백업 zip 보관 폴더)
- 파생 문자열 일괄 전환: /b07-cad -> /b08-cad 정적 서빙, CAD 레이어 b07-* -> b08-*,
  postMessage aislo:b07:* -> aislo:b08:*, 패키지명 aislo-b08-cad, CSS .b08-*,
  라우트 키/슬러그(B08_DESIGN_DETAIL/b08-design-detail, B07_QUANTITY/b07-quantity)
- 상세설계 워크플로우 stage 4 -> 5 (확정/무효화 전이 3곳), 확정 완료 시 B09로 이동
- WORKFLOW_STEP_ROUTES 순서 재배열: index4=수량(B07), index5=상세설계(B08)
- [임시] B08 이동 테스트 버튼 제거, openwebcad dist 재빌드
- 주석 의미 정렬: 수량 인계 주석 B08->B07, 도면 참조 B07->B08

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:10:10 +09:00
eomsangdonandClaude Fable 5 54954a05e5 refactor(B05,B06): B05_wf2_Route -> B05_Profile, B06_wf3_ProfileCross -> B06_Section 동시 개명
- 한몸으로 동작하는 두 페이지라 한 커밋으로 처리 (상호 참조 다수)
- B05 37파일 + B06 20파일 접두사 개명 (git mv, 이력 보존)
- 참조 치환 91파일: import 경로, 라우트 슬러그(b05-profile/b06-section),
  라우트 키(B05_PROFILE/B06_SECTION), B03 자동 체인, storage 상수, pyproject 제외 경로
- 로직 변경 없음. typecheck·백엔드 import 검증 통과

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:03:11 +09:00
eomsangdonandClaude Fable 5 b59aae3ea3 chore: 임시 파일 .tmp_pdf_page2.png 추적 제외
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:01:58 +09:00
eomsangdonandClaude Fable 5 f7528a4aa4 refactor(B04): B04_wf1_Surface -> B04_PreProcess 전면 개명
- 폴더·내부 파일 51개 접두사 개명 (git mv, 이력 보존)
- 저장소 전체 참조 치환 67파일: import 경로, 라우트 슬러그(b04-preprocess),
  라우트 키(B04_PREPROCESS), storage 경로 상수, locale, SQL 주석
- 로직 변경 없음 (기계적 치환). typecheck·백엔드 import 검증 통과

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 10:01:36 +09:00
eomsangdonandClaude Fable 5 2abca64deb feat(B06): 횡단 카드 확대 대상을 플롯 도형으로 한정 + 표시 반폭 기준값 정정
2026-08-08 사용자 지시 2건.

1) 확대·축소가 축까지 키우던 문제
   attachZoomPan이 SVG viewBox를 조작해 축선·격자·눈금 숫자·축 이름까지 함께
   확대됐다. 확대할수록 도면이 아니라 글자가 커지는 셈이라 도면을 못 읽는다.
   viewBox 조작을 걷어내고 도형 레이어(plotLayer)의 transform
   (translate + scale)만 바꾸도록 교체했다. 배율 1~8배는 그대로 두고, 확대분이
   플롯 영역을 항상 덮도록 이동량을 clamp한다(원배율에서는 이동량 0).
   팬은 도형을 직접 미는 방식이라 부호가 반대가 됐다 — 커서를 따라간다.

   플롯 clip 그룹은 design 유무와 무관하게 항상 만들고 그 안쪽에 plotLayer를
   둔다. clip을 transform 붙은 요소에 직접 걸면 자르는 창까지 같이 확대돼
   도형이 플롯 밖으로 새어 나간다.

   움직이는 것: 지반선·면적 밴드·포장·설계선·암 경계·중심 십자선.
   고정: 축선·격자·눈금 숫자·축 이름.

2) 사이드 패널 "횡단 반폭" 기준값
   진입 시 확정 이력(data.options.cross_half_width_m)이 없으면 보유 샘플의
   최대 offset을 계산해 입력칸을 덮었다. 그래서 옛 기본값(15m)으로 생성된
   노선이 15.0으로 떠 기준값 구실을 못 했다. 계산 폴백을 제거해, 확정 이력이
   있을 때만 그 값을 쓰고 없으면 백엔드 기본값
   (config_system.SECTION_CROSS_HALF_WIDTH_M = 20m)을 그대로 둔다.
   보유 샘플 폭을 넘는 값은 [전체 측점 반영]이 재생성을 태운다(기존 분기 유지).

검증: npm run typecheck 통과, prettier 무변경. docs/raw/PLAN.md에 체크리스트 기록.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 08:26:00 +09:00
eomsangdonandClaude Fable 5 2121a5eef6 fix(ui): B05 구조물 배치 컨테이너 외곽선 누락 — 공통 클래스 미부착
2026-08-08 사용자 보고: B05 좌측 사이드 패널에서 "구조물 배치" 컨테이너만
외곽 라인이 없었다. 원인은 이 섹션이 사이드 컨테이너 공통 외곽선 클래스
(ui-sidebar-section)를 붙이지 않은 것 — 같은 페이지의 다른 섹션 생성부
(B05_wf2_Route_UI_Panel.ts:82)에는 이미 붙어 있었다.

createIrregularStationsSection의 root className에 ui-sidebar-section을 추가해
나머지 컨테이너와 동일한 테두리(두께·색·테마 대응)를 갖게 했다. 형태(라운드·
패딩·배경)는 기존 b05-route__panel-section 그대로 둔다.

검증: prettier 무변경, npm run typecheck 통과.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 08:00:14 +09:00
eomsangdonandClaude Fable 5 377e88cc21 fix(B06): 횡단 카드 암 경계 버튼 그룹 하단 행 가운데 맞춤
방위각 삭제로 space-between 3분할이 깨져 좌측에 붙던 것을 절대 배치로
행 중앙 고정.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 20:05:22 +09:00
eomsangdonandClaude Fable 5 8b359cd49c fix(B06): 계획선 플롯 이탈 clip 처리·전체 반영 시 개별 반폭 초기화
- 횡단 카드 설계선/면적 밴드/포장층/암 경계선을 플롯 영역 clipPath 그룹에
  그려 표시 반폭 밖으로 뚫고 나가지 않게 함
- [전체 측점 반영]이 개별 반폭(세션·저장 display_half_width_m)을 전역값으로
  초기화 — 저장 잔재로 0측점이 전역 반폭을 무시하던 문제 해결
- 오버레이 함수 시그니처 SVGSVGElement→SVGElement

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 20:01:36 +09:00
eomsangdonandClaude Fable 5 d93bd6e28d feat(B06): 횡단 반폭 개편·개별 반폭·재계산 통합 + 측구 방향 확정 동기화
2026-08-06 사용자 지시 일괄 구현:

반폭 체계:
- 초기 샘플 반폭 config 기본 20m(SECTION_CROSS_HALF_WIDTH_M 15→20) —
  표시 반폭이 이 안이면 재계산 없이 표시만 자름(기존 crossPlotMetrics)
- 재계산 버튼 삭제, [전체 측점 반영]이 반폭 적용 담당: 축소=표시만(즉시),
  확대(보유 샘플 폭 초과)=regenerate 후 상세 재로드
- regenerate에 grade_options 재구성 추가 — 계획선(profile_alignment)까지
  함께 재계산·저장. 예전 재계산 버튼이 계획 횡단도선·유토곡선·테이블을
  지우던 근본 원인 해결(B04 파일입력 파이프라인과 같은 엔진 경로 재활용)
- 높이 배율 옵션 폐지(항상 1), 반폭 입력은 표준 횡단면 설정의
  [전체 측점 반영] 위로 이동(Standard_Panel extraControl)

개별 반폭(카드):
- 카드 하단 ◀/▶/↺(±1m·전역 복귀), 암 경계 그룹 우측 정렬. 숫자 표시 없음
- 개별값 > 전역값 우선(StationWidthControl). 세션 보관, 확정·임시저장 시
  cross_patches(design.display_half_width_m)로 영구 저장 → 재접근 복원
- 프리뷰·단건 설계 재계산이 이 필드를 이월해 지우지 않게 보강
- 방위각 표기 삭제

측구 방향 확정 동기화(13측점 보고):
- B05 경로확정 uphill 병합 시 저장 횡단 설계도 새 방향으로 재계산·저장
  (sync_uphill_overrides_into_designs) — 정본만 갱신하면 B06 표시와
  역반영(ditch_side→uphill_side)이 옛 방향으로 순환 덮어쓰던 문제 해결
- 절/성토 역할은 엔진이 지형에서 자동 판정(정상) — 사용자 지정 대상인
  측구 방향(ditch_side)이 정확히 동기화됨을 13측점 실측 확인

실측: 축소/확대/개별 조절/저장 복원/확정 동기화/B05 하단 패널 정상,
tsc·ruff·prettier 통과, 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 19:48:00 +09:00
eomsangdonandClaude Fable 5 4cb1f30f33 fix(ui): B04~B06 사이드 컨테이너 외곽선 일원화 — 로컬 border가 공통 색 덮던 문제
직전 커밋(673487c)의 시인성 개선이 B07에만 보이던 원인(2026-08-06 사용자
보고): B04/B05/B06 페이지 CSS가 border 전체 선언(1px solid --color-border)을
갖고 있어, 로드 순서상 공통 클래스(ui-sidebar-section)의 진한 border-color를
덮었다. B07은 로컬 선언이 없어 공통이 그대로 보였던 것.

세 페이지의 로컬 border 선언을 제거해 테두리를 공통 클래스가 전담하도록
일원화. 라운드·패딩·배경 등 형태는 각 페이지에 그대로 둠.

실측: B04·B05·B06 사이드 컨테이너 외곽선 선명 확인, 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 18:29:59 +09:00
eomsangdonandClaude Fable 5 673487ceaa feat(ui): 3D 측점 라벨 라운드 + 사이드 컨테이너 외곽선 강화·B07 적용
2026-08-06 사용자 지시 2건:
- 3D 측점 라벨 배경을 fillRect → roundRect(반경 10)로 — 둥근 판
- 사이드 컨테이너 외곽선: 어제 45% 혼합이 아직 흐리다는 재보고로 보조색
  비중 75%로 상향. 공통 클래스(ui-sidebar-section)가 테두리 두께·형태까지
  소유하도록 강화 — 자체 테두리 없는 컨테이너도 클래스만 붙이면 동일 외곽선.
  테마 변수 혼합이라 라이트/다크 자동 대응
- B04~B06만 적용돼 있던 것을 B07 설계 도면 그룹에도 적용(+라운드·패딩)

실측: 3D 라벨 라운드, B05·B07 외곽선 라이트/다크 모두 선명, 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 18:22:56 +09:00
eomsangdonandClaude Fable 5 7ab4816edd feat(B05): 공사 시작점 컨테이너를 시작 측점 및 샘플링 설정으로 일원화
- 컨테이너 제목 변경: 측점 및 샘플링 설정 → 시작 측점 및 샘플링 설정
- 시작 측점·시작 누가거리(m) 2열 행을 통합 컨테이너 최상단으로 이동,
  별도 공사 시작점 섹션 제거 (2026-08-06 사용자 지시)
- 동작 로직(표시 오프셋 콜백)은 그대로 — 배치만 이동

실측: 통합 컨테이너 최상단 배치 확인, 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 18:15:33 +09:00
eomsangdonandClaude Fable 5 1b48ab3732 fix(B05): 구조물 목록 배관 중복 — 확정 복원 유령 정밀 제거
경로확정 직후 같은 배관이 2개씩 뜨던 문제(2026-08-06 사용자 보고):
확정 시 종단 정본에 병합된 배관이 페이지 진입 복원(restoreSections)으로
목록에 들어오는데, 복원 항목은 structureType이 없어 isPipeStation 판정을
빠져나가 관 정본 투영(setPipeStations) 때 걷히지 않았다. 정본 연동 항목과
비연동 유령이 공존 — 로드 순서(배수유역 관 vs 종단 복원) 레이스라 서버
재시작 여부에 따라 재현이 갈렸다.

setPipeStations에서 투영되는 관과 같은 자리(±0.5m)의 종류 없는 복원
항목만 제거. 종류를 갖춘 사용자 추가 구조물은 자리가 겹쳐도 보존.

실측: 재진입 후 목록 관 4개 각 1건(중복 소멸), 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 18:11:43 +09:00
eomsangdonandClaude Fable 5 7a4326e339 feat(B05): 3D 마커 개선 — 측구 램프 축소·측점 띠 가시성·회전 조준점
사용자 보고 3건(2026-08-06) 수정:
1. 측구 방향 램프 절반 축소(반지름 1.1→0.55, 띄움 0.6→0.3) — 측점 고를 때
   가리는 문제. 클릭 판정은 투명 히트 구(1.1)로 기존 범위 유지
2. 측점선을 Line → 납작 띠 Mesh(BoxGeometry 길이×0.18×0.5, 띄움 0.45→0.8)
   — WebGL Line은 굵기 지정이 안 먹혀 1px라 지형에 묻혀 안 보이고 클릭도
   어려웠음. 띠는 굵게 보이고 레이캐스트도 몸통 전체. selectStation 색
   갱신을 Mesh 기준으로 전환
3. 회전 중심 불투명 구슬 → 링+십자 조준점 스프라이트(캔버스 텍스처, 항상
   카메라 정면, 반투명). 비율 0.02 — 구슬(0.024)보다 지름 작고 속이 비어
   시각적 무게 대폭 감소. 공용 유틸이라 B04 지형 뷰어들도 함께 적용

실측 확인: 띠 클릭 선택 정상(빨간 핀), 램프 축소 확인, 조준점 지형 위
또렷, 콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 18:02:51 +09:00
eomsangdonandClaude Fable 5 a71727e004 feat(B05): 메인 패널 리사이즈 시 종단·테이블·유토곡선 비례 연동
메인 패널을 끌면 3영역이 드래그 시작 시점 비율대로 같이 늘고 준다
(2026-08-06 사용자 확정). 롤백 기준: 직전 안정판 d8723f4.

- Panel: pointerdown에서 3영역 실측 스냅샷(mainDragRef), 캐스케이드에
  메인 드래그 분기 — 비례 배분 + 최소(100/160/140) 고정 후 남은 영역끼리
  재배분(최대 3회 수렴). 서브패널 상한(75%/80%)은 안전상 유지
- 손 떼면 결과 높이를 서브패널 저장값으로 확정(commitHeight: 리사이저와
  같은 CSS 변수+세션 기록) — 이후 redraw 판정 기준이 되어 멱등성 유지
- MassHaul syncHandle() 신설 — 드래그 중 손잡이가 인라인 높이 위 경계 추종

실측 테스트: 확대 시 3영역 동일 배율(×1.41), 축소 시 최소 걸린 영역부터
정지, 손 뗀 뒤·redraw 후 고정, 서브패널 개별 드래그·밀어올림 보존,
콘솔 에러 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 17:23:21 +09:00
eomsangdonandClaude Fable 5 d8723f4208 fix(B05): 하단 패널 리사이즈 튐·자동 확대 근절 — 캐스케이드 멱등화
원인 4개(2026-08-06 분석) 일괄 수정:
1. applyHeightCascade가 임시 축소 반영된 offsetHeight로 판정해 호출마다
   줄임↔풀림 진동 + 풀린 호출의 deficit가 메인 패널을 멋대로 확대.
   → 판정 기준을 저장 높이(desiredHeight 신설: 리사이저 CSS 변수/기본값)로
   전환해 멱등화. 축소 비율이 budget에 따라 연속 변화해 스냅 없음
2. grow 상한(window 92%)이 리사이저 max(부모 90%)보다 높아 자동 확대 후
   손잡이를 잡는 순간 clamp 급락 → 상한을 같은 식으로 통일
3. 서브패널 드래그가 매 프레임 전체 draw(차트·테이블 재생성)로 덜컹
   → 메인 드래그와 같은 경량 동기화(subPanelChanged 분기), 손 뗀 뒤
   전체 재구성 1회(clearDragFlags 120ms 예약)
4. pointerup 직후 지연 draw가 드래그 보호 해제 상태로 grow 발동
   → mainDragCooldown: 손 뗀 뒤 첫 전체 draw까지 grow 금지

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-06 16:47:57 +09:00
eomsangdonandClaude Fable 5 6273abc1ae fix(B05): 하단 패널 리사이즈 진동·서브패널 드래그 값 복귀 버그
원인 두 가지(2026-08-05 사용자 보고 분석):
1. 캐스케이드의 임시 축소(인라인 height)가 서브패널 자체 리사이저의 변수 값을
   덮어씀 — 드래그 값이 화면에 안 먹다가 인라인이 걷힐 때 한 번에 튐
   ('이전 배치로 복귀' 증상). → 서브패널 드래그 중엔 인라인을 걷고 임시 축소를
   중단, 자리가 모자라면 메인 패널을 즉시 키워 밀어올림
2. 자동 확장(grow)이 메인 패널 드래그 중에도 개입해 포인터가 정한 높이를
   되돌림 — 서로 밀고 당기는 진동('반복적으로 돌아가려는' 증상).
   → 드래그 출처 추적(pointerdown/up 플래그): 메인 드래그 중 grow 금지,
   경량 동기화는 서브패널 드래그일 때만 grow 허용

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:57:06 +09:00
eomsangdonandClaude Fable 5 81825413ef fix(ui): 유토곡선 상단 여유·사이드 컨테이너 외곽선·패널 리사이즈 부드럽게
- 유토곡선 SVG 상단 여백 padTop 옵션 신설(공용 렌더러), B05는 40px —
  범례·기준 버튼 오버레이(top 34px)와 커브 겹침 해소. B06은 기존 10px 유지
- 사이드 패널 컨테이너 공통 클래스(ui-sidebar-section): 외곽선을 본문 보조색
  45% 혼합으로 진하게 — 두 테마 모두 흐려 안 보이던 문제. B04/B05/B06 적용
- 하단 패널 리사이즈 끊김 해소: 끌리는 동안 프레임당 경량 높이 동기화
  (캐스케이드 계산 + 캔버스/차트 높이만), 무거운 차트·테이블 재구성은
  손 뗀 뒤 120ms 디바운스로 1회. 추가 리소스 없음 — 프레임당 비용 감소

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:51:10 +09:00
eomsangdonandClaude Fable 5 69aed9d26c feat(ui): 구조물 폼 빈칸 상태·사이드 액션 고정·하단 패널 높이 캐스케이드
- 구조물 종류 드롭다운에 빈칸 항목 — 초기·리셋 상태는 빈칸이고 하위 옵션 전체
  숨김, 미선택이면 추가 불가(2026-08-05 사용자 지시)
- 사이드 패널 최하단 고정 액션 줄 공용 클래스(ui-sidebar-actions): 계산·확정
  버튼이 스크롤에서 제외되고 불투명 배경이 지나가는 내용을 가림.
  B04(확정·초기화)/B05(계산·확정)/B06(재계산·저장·확정) 적용, B07은 기존
  자체 sticky 유지
- 하단 패널 높이 캐스케이드: 아래로 끌면 종단 먼저 최소(100px)까지 →
  테이블·유토곡선이 같이 비례 축소(각자 최소 140/160px, 인라인 임시 축소라
  다시 키우면 원래 높이 복귀) → 셋 다 최소면 리사이저 동적 하한이 차단.
  공용 리사이저 min을 함수 지원으로 확장. 반대로 서브패널 펼침으로 부족하면
  메인 패널을 키움(기존 로직 유지)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:44:16 +09:00
eomsangdonandClaude Fable 5 0025538b18 feat(B05): 3D 흑백 지형 토글·서브패널 손잡이 규칙·좌측 여백 확대
- 3D 뷰 토글에 '흑백 지형' 추가(측점 라벨 우측, 기본 무지개). 정점색 1회
  바꿔치기(원본 userData 보관)라 로딩·회전 성능 영향 없음
- 유토곡선 접힘 버튼은 항상 바닥 — 순서(종단>테이블>유토곡선)상 테이블 아래에서
  나오므로. 테이블 접힘 버튼만 열린 유토곡선 위 경계에 나란히
- LONG_PAD.left 62->78: 좌측 패널 접기 버튼이 Y축 라벨·행제목을 가리는 문제.
  sticky 마스크·행제목 폭이 같은 값에서 파생돼 가로 스크롤 값 누출 없음

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:30:04 +09:00
eomsangdonandClaude Fable 5 75232b9f73 fix(B05): 3D 선택 유지·구조물 폼 규칙·패널 손잡이 정렬·종단 최소높이 확보
- 3D 빈 공간 클릭(회전 드래그 포함)으로 측점 선택이 풀리지 않게 — 해제는
  그래프·사이드 패널에서만 (3D 영역 한정, 2026-08-05 사용자 지시)
- 구조물 폼: 편집 중 타입 변경 시 신규 추가로 전환(입력값 유지),
  자동 배관(origin=pipe)은 타입 잠금(관종·직경만 변경 가능), 리셋 시 폼 초기화
- 접힌 서브패널 손잡이는 열린 패널의 위 경계 수평선에 일렬 배치
  (테이블 접힘+유토 펼침 시 유토곡선 상단)
- 종단 그래프 최소높이(100px) 부족 시 메인 하단 패널 높이를 자동 확장
  (뷰포트 92% 상한) — 서브패널 펼침으로 종단이 뒤로 넘어가는 역전 방지

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:21:48 +09:00
eomsangdonandClaude Fable 5 2876ca5cbb fix(B05): 계류 유역 세월교 판정 + 하단 패널 밀어올리기 동작
- 세월교 판정: 유효직경이 관 최대 규격(D2000, config) 초과 시 bridge_required
  플래그 — 관이 아니라 세월교·물넘이·교량 대상(임도설치규정 제12조: 계류 횡단
  구간은 물넘이 포장·교량으로 설계). 유역 제원에 '세월교 검토(Ø계산값)' 표기,
  관경 자동 지정 제외. 실측: 41.4ha 계류 유역 D5137 -> 세월교 검토
- 사면 유역 계산식은 유지 — FHWA 유입부 조절식과 교차검증 결과 근접
  (1.1ha D862/D839, 2.9ha D1426/D1255)
- 하단 패널: 서브패널이 종단도를 덮지 않고 밀어올림. 접힘=종단 전체,
  하나 펼침=그만큼 종단 축소(테이블 높이 고정), 둘 펼침=종단-테이블-유토곡선
  순서로 유토곡선 리사이즈 시 종단만 조절

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 19:08:36 +09:00
eomsangdonandClaude Fable 5 3d5e8988c0 feat(B05): 구조물 드롭다운·관경 자동지정·우클릭/마킹·하단 패널 개편 (계획서 Phase 3~5)
- 구조물 배치 폼: 종류 드롭다운(배관/기성막이/대피로/기타) + 관종·직경/폭/이름
  하위 옵션. 목록·기본값은 config_frontend(정본 config_system.py 미러) 관리
- 관경 자동 지정: 기본 D800, 배수 유효직경 초과 시 바로 위 규격.
  수동 변경(userSized)은 재계산에도 유지. 소구경 리스트 유지
- 종단·배수유역도 우클릭 메뉴에 기성막이/대피로/기타 추가 항목
- 유토곡선·테이블 영역 브라우저 기본 우클릭 메뉴 차단
- 측점 선택 시 배수유역도 계획선 위 다이아몬드 마킹(유역 없는 구조물 포함)
- 3D 선택 마킹: 수직 핀(기둥+역원뿔, depthTest off) — 원형 표기 지양
- 테이블을 유토곡선과 같은 바닥 고정 오버레이 서브패널로 개편.
  접힘 손잡이 일렬(좌 테이블/우 유토곡선), 순서 종단도-테이블-유토곡선
- 테이블 행제목 우측 정렬+좌측 여백, 종단·유토곡선 Y축 눈금 10-13px

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 18:41:55 +09:00
eomsangdonandClaude Fable 5 fa6953ce6d feat(B04/B05): 확률강우량 수급·배수 유효직경 합리식 계산 (계획서 Phase 1·2)
- common_util_wamis_rainfall.py 신설: map.wamis.go.kr 등우선도 urllib 수급,
  전역 캐시(resources/wamis_contours), 거리비례 내삽, General형 IDF 적합
- /drainage/rainfall API + primary-region 백그라운드 강우량표 생성 훅
- estimate_pipe_diameter_mm TODO 구현: Kirpich 도달시간(하한5분) + 합리식(C=0.8,
  2.0배) + Manning(경사10도, n=0.024, V<=3.0) + 통수단면 70% -> 배수 유효직경
- basins 응답·B05 유역 제원에 유효면적/유효직경·산출근거(tc/I/Qd) 표기
- config_system: 계산 계수·구조물 옵션(관종/직경/대피로) 기본값 등록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 18:19:48 +09:00
eomsangdonandClaude Opus 5 5378b9d807 fix(B05): sticky Y축을 편집 버튼 층 위로(z3→z5) — 스크롤로 지나가는 버튼이 축 라벨을 덮지 않음
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 20:09:25 +09:00
eomsangdonandClaude Opus 5 679c847072 fix(B05): sticky Y축 앵커를 첫 자식으로 — 스크롤 시 축이 안 보이던 문제 수정
0크기 sticky 앵커를 SVG 뒤에 붙이면 흐름 위치가 차트 아래로 밀려 가로 스크롤 시
축 오버레이가 화면 밖에 놓였다(스크롤 0에서는 SVG 자체 눈금이 보여 드러나지 않던
버그). B06과 같은 규칙(첫 자식 prepend)으로 통일 — 종단 표고축·유토곡선 ㎥축 모두
스크롤 800px 상태에서 좌측 고정·불투명 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 20:06:20 +09:00
eomsangdonandClaude Opus 5 f41b223079 fix(B05): 곡선 셀 회전 표기·손잡이 클릭 가로채기·배수유역 손잡이 z(31~33)
- 31: 곡선 L·R 셀이 이웃 곡선 셀과 겹치면 자리 이동 대신 측점선 위 세로쓰기
  (writing-mode vertical-rl) + 행 높이 맞춤 글자 축소 — 다른 열 값 오해 방지
- 32: 곡선 L·R 수정 불가 원인 = 접힌 유토곡선 손잡이가 테이블 곡선 행 위에서 클릭
  가로챔. 테이블 아래 26px 손잡이 전용 띠(MASSHAUL_HANDLE_GUTTER_PX) 확보.
  검증: 배관 곡선 R 8.0→55.0 편집 정상 반영
- 33: 배수유역 side 손잡이 z 2→6 — 유토곡선 오버레이(z5) 위로, hit-test 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 20:02:37 +09:00
eomsangdonandClaude Opus 5 6bcd6d1209 feat(B05/B06): 하단 간격·접힘 거터·B06 sticky Y축·배관 곡선 상시 표기(27~30)
- 27: 종단 X라벨↔버튼 간격 70%로(bottomInset 19→15)
- 28: 사이드 패널 접힘 시 본문 24px 거터 — 손잡이가 Y축 라벨을 덮지 않음(B04~B07 공용)
- 29: B06 종단·유토곡선 가로 스크롤 고정 Y축 — buildStickyYAxis 재사용, yaxis CSS
  정의처를 MassHaul css로 이동(B05·B06 공용). 앵커를 첫 자식으로 넣고 유토축 inner를
  종단 높이만큼 내려 자기 구간만 덮음. 스크롤 600px 블리드 테스트 통과
- 30: 배관 측점 곡선 L·R 항상 표기(R 필수), 이웃 곡선 셀 근접 시 배관 셀만 우측 비킴,
  선택 오버레이는 한 열 원위치 유지

Playwright: sticky 앵커 2개(x 고정), 거터 24px, gap 7px, 곡선 셀 8, 오류 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:53:42 +09:00
eomsangdonandClaude Opus 5 8c95f8e7f2 fix(ui): 사이드 손잡이를 패널 테두리에 1px 겹쳐 외곽선 관통 이음새 제거
강조색 패널 테두리(24번)가 side 손잡이의 라운드 모서리 틈으로 비쳐 외곽선이
어긋나 보였다(2026-08-04 사용자 보고). 손잡이를 1px 안쪽으로 겹쳐 선을 덮는다.
배수유역(왼쪽 부착) 손잡이는 이상 없음 확인돼 그대로 둔다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:40:42 +09:00
eomsangdonandClaude Opus 5 c8aaafcb54 fix(B05): 유토곡선 리사이저 TDZ 크래시로 페이지 진입 불가 수정 + 표시선 2px
원인: createPanelResizer가 생성 중 세션 저장 높이를 복원하며 onResize →
syncHandlePosition을 부르는데 'open'(let) 선언이 그 아래라 TDZ ReferenceError로
B05 렌더 전체가 죽었다. 저장된 높이가 있는 브라우저에서만 재현돼(새 세션 테스트는
통과) 사용자 환경에서만 접속 불가로 나타났다. 상태 선언을 리사이저 생성 앞으로 이동.

- 리사이저 상시 표시선 1px→2px, hover/드래그 3px→4px(2026-08-04 사용자 지시)

검증: masshaul-open=true + height=320 세션 상태로 진입 — 본문 렌더, 오버레이 320px
복원, 오류 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:37:46 +09:00
eomsangdonandClaude Opus 5 05887b6a7e feat(B05/ui): 유토곡선 스크롤바·구분선·선택 토글·패널 시인성(21~25)
- 21: 유토곡선 높이를 스크롤러 clientHeight 기준으로 — 스크롤바가 Y축 라벨을 덮던
  문제 해소, overflow-x scroll 고정으로 높이 안정화
- 22: 절토·성토 요약 줄을 종단 열 안으로 — 배수유역도 좌측 구분선 25px 끊김 해소
- 23: 선택 토글 해제 — 종단·유토곡선 측점 재클릭/빈 곳 클릭, 사이드바 구조물 재클릭
  시 해제(null 전파로 3D·그래프·목록·유역 강조 동기 해제)
- 24: 좌측 제목 패널(B04~B07 공용) 우측 가장자리 강조색 라인
- 25: 접힌 손잡이 강조색 배경 틴트 — 닫힌 패널이 있음을 상시 표시

Playwright: 재클릭 1→0, 빈곳 클릭 0, 스크롤러 226=곡선 226, 구분선 간극 1px,
접힘 틴트 확인, 콘솔 오류 0. typecheck 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:34:38 +09:00
eomsangdonandClaude Opus 5 344d1fbbb9 fix(B06/ui): 손잡이 폭 글자 맞춤·화살표 크기 고정, 리사이저 표시선 경계 정착
- 이름표 손잡이: 화살표·이름표 flex 압축 제외 — 글자를 줄이지 않고 폭이 내용에 맞춰
  늘어난다(B06 '종단/유토곡선' 104px, 화살표 7px 유지)
- B06 토글 아래 테두리를 좌우와 같은 강조색으로 — 외곽선 색 섞임 해소
- B06 리사이저 상시 표시선: 히트 영역 가운데(경계 4px 위) 대신 패널 아래 경계에 정착

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:15:41 +09:00
eomsangdonandClaude Opus 5 c8eeb15b81 fix(B05): 확정된 구조물 측점의 편집 버튼 이중 생성 제거
확정을 거친 구조물 측점은 종단 정본(alignment.stations)에 이미 병합돼 있는데
사이드바 목록(irregular)에서 또 추가돼 ▲▼가 2개씩 생겼다(같은 자리에 겹쳐 있다가
겹침 회피 캐스케이드가 옆으로 벌리면서 드러남). 같은 chainage(소수 3자리)는 한 번만
버튼을 단다. 검증: 버튼 27→23개(배관 4곳 중복 제거), 근접 측점 비킴은 유지.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:08:15 +09:00
eomsangdonandClaude Opus 5 d4fc73c012 feat(B05/B06/ui): 패널 손잡이·리사이저·편집 버튼 시인성 정리(16·18~20)
- 16: 편집 버튼 전체(▲▼·↺·⬆⬇) 21×17 통일, 겹침 간격 23px, X축 라벨 상향 19px
- 18: 유토곡선 손잡이가 오버레이 위 경계를 따라 이동(펼침 시 테이블 영역 침범 허용)
- 19: 손잡이 테두리 강조색 --panel-handle-border(라이트 파랑 #2563eb / 다크 노랑
  #e0b64a) + 이름표 옵션 — B05 '종단'·'유토곡선'·세로 '배수유역', B06 '종단/유토곡선'
- 20: 공용 리사이저 상시 표시선(1px, 같은 강조색) — hover/드래그 시 3px

Playwright: 버튼 3종 21×17, 라벨·테두리색·세로 writing-mode, 리사이저 1px/0.75,
손잡이 bottom=오버레이 top 일치, 콘솔 오류 0. typecheck 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:06:02 +09:00
eomsangdonandClaude Opus 5 cdd40a00f3 feat(B04/B05): 재확정 재계산 체인(12) + 편집 버튼·유토곡선 UI 정리(13~15)
- 12: run_redesign_chain — B04 재확정 시 사용자 입력(stage 2 params) 유지한 채
  새 지표면 기준 B05 재계산·확정, 옛 측점별 설계·표준단면 설정을 chainage 매칭
  이월 후 B06 확정. 경로 없으면 신규 자동 체인 폴백. B04 confirm에 백그라운드 결선
- 13: 구간 이동 글리프 ⇧⇩ → 속 찬 ⬆︎⬇︎(21×17·굵게), 규칙·비정규 측점 버튼
  최소 간격 20px 캐스케이드 배치로 근접 측점 ▲▼ 겹침 해소
- 14: 유토곡선 손잡이를 표준 삼각형 손잡이(64×24, 바닥 중앙)로 통일, 캡션 제거,
  '유토곡선 펼치기/접기' 툴팁
- 15: 유토곡선 스크롤러 세로 휠 → 가로 이동(종단 그래프와 동기)

Playwright 검증: 버튼 27개 최소 간격 20px, 글리프 ⬆︎ 21×17, 표준 손잡이 64×24,
휠 스크롤 0→400 종단 동기, 콘솔 오류 0. typecheck·ruff 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 18:48:18 +09:00
eomsangdonandClaude Opus 5 7d7fd64d6b feat(B03): WF1 자동 확정을 역할 무관으로 확대 — 관리자도 B06까지 자동 체인
SYSTEM_ADMIN 예외를 제거한다(2026-08-04 사용자 확정 — 관리자도 같은 사용자).
업로드 후 모두 기본값으로 지표면 자동 확정 -> B05 기본 경로 -> B06 기본 횡단
설계까지 체인을 탄다. 관리자가 B04에서 다른 모델로 재확정하는 경로는 그대로이며,
체인은 경로가 이미 있으면 스스로 건너뛴다.

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