Files
Aislo/docs/raw/plans/2026-09-04_plan_completed_items.md
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록)
- `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록
  — 창끼리 공유하되 저장소에는 안 올리는 장부
- 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠)
- graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦

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

18 KiB
Raw Permalink Blame History

2026-09-04 완료 항목 이관

개발 담당 AI(Claude)가 구현·자체검증을 마친 항목이며, 위키 관리자의 2차 교차검증은 아직임(검증 대기). docs/raw/PLAN.md 「진행 중」에서 하위 체크가 전부 완료된 항목만 잘라 옮김 — 미결 항목은 계획서에 그대로 둠.

B03 파일 입력 — 업로드 자료 그래픽 미리보기 (2026-09-04 완료, 검증 대기)

사용자 지시 — 「계획노선 자료·지형 자료 컨테이너의 파일이 올라가면 해당 파일 요소에 그래픽으로 결과를 보여 줄 수 있는지 검토. 단, 시간이 너무 오래 걸리면 안 됨」.

착수 전 검토 항목이며, 아래는 현행 코드를 읽고 낸 실행 가능 판단임.

  • 재료는 이미 있음 — 업로드 분석기가 자료마다 bounds 를 냄 (B03_FileInput_Engine_Analyze.py:158 LAS / :270 TIF / :380 노선 CSV, B03_FileInput_Engine_Shapefile.py:241 SHP). metadata 는 그대로 프론트까지 옴 (B03_FileInput_Schema.py:44B03_FileInput_Api_Fetch.ts:11). 즉 bbox 미리보기는 백엔드 변경 0 · 추가 읽기 0 으로 가능.

  • 노선 형상만 한 줄 추가analyze_shapefile_metadata 가 이미 read_shapefile_parts 로 전 정점을 메모리에 들고 있음(:220). 여기서 200점 안팎으로 솎은 좌표열preview_path 로 함께 내보내면 실제 노선 모양이 나옴. 파일 재열람 없음.

  • 비용이 큰 것은 하지 않음 (사용자 제약 「오래 걸리면 안 됨」)

    • LAS 포인트클라우드 렌더 — 수천만 점, 초 단위. bbox 사각형만.
    • GeoTIFF 실제 래스터 디코드 rasterio 오버뷰라도 대용량에서 수 초. bbox 사각형만. (썸네일이 정말 필요해지면 그때 별도 백그라운드 작업으로.)
  • 그리는 자리·모양 — 카드 안 한 줄짜리 SVG(높이 60~80px). 지형 자료는 회색 사각형, 계획노선은 그 위에 겹쳐 그린 선. 한 좌표계로 모아 그려 「노선이 지형 범위 안에 들어오나」가 눈으로 잡히게 함 — 지금 초기 계산 실패의 주된 원인이 범위 불일치임 (「초기 계산 실패 처리 후속」 항목과 같은 증상). 카드마다 따로 그리면 이 이점이 사라지므로 카드에는 자기 도형, 범위 대조는 카드 겹침 표시(안 들어오면 경고색) 로 처리. 좌표계가 서로 다르면 대조는 생략하고 자기 도형만 그림 (재투영은 프론트에서 안 함).

  • 위 방침으로 진행할지 사용자 확인 — 2026-09-04 확정: LAS·TIF 는 bbox 사각형만, 실제 래스터·점구름 렌더 안 함.

  • analyze_shapefile_metadatapreview_path(솎은 좌표열) 추가.

  • 카드 SVG 미리보기 렌더 — 실제 자리는 카드 템플릿(B03_FileInput_UI_Support.ts)과 renderSlot(B03_FileInput_UI_Page.ts)이며, 그리는 로직은 신규 B03_FileInput_UI_Preview.ts. 값이 없으면 미표시. 서버 정본(upload-overview 응답)에 metadata 를 실어 재접속에도 뜬다.

  • 자체검증 — 공용 브라우저 실측: 업로드 후 카드에 도형이 뜨는지, 노선 bbox 가 지형 bbox 안인지 판정이 맞는지, 업로드 완료 시각 대비 추가 지연이 체감 없는지(수치로).

    결과(2026-09-04) — 통과.

    • 도형이 뜬다 — 지형 자료(라이다·GeoTIFF) 카드에 범위 사각형, 계획노선 카드에 선. 새로 올린 shapefile 카드의 선은 정점 121개(points 속성 실측), 미리보기 높이 60px, 좌표가 뷰박스 안(첫 점 4.02,19.36).
    • 범위 대조 세 갈래 모두 실측 ① 안에 있음 — 프로젝트 2f940d8a(노선·지형 모두 EPSG:5187): 노선 [183493, 183732, 489290, 489456] ⊂ 지형 [183434, 183806, 489169, 489570] → 「범위 안에 있습니다」, 경고색 없음. ② 벗어남 — 같은 판정 코드로 경고색·「범위를 벗어납니다」 표시 확인. ③ 좌표계가 다르면 대조 생략 — 프로젝트 8cd2e635(노선 5179 / 지형 5176)에서 「자료 범위」만 표시. shapefile 자체에는 좌표계가 없어(epsg: null 실측) 같은 세트의 .prj 값을 쓰도록 보완.
    • 추가 지연 없음 — 솎기 자체 0.136 ms(shapefile 분석 총 404 ms 중), 응답에 실리는 좌표열 약 5 KB. 파일 재열람 0회(이미 메모리에 있는 정점을 그대로 씀).
    • 단위 테스트 tmp/tests/test_b03_preview_path.py 2건 통과(상한 200점·시작/끝점 보존, 다중 파트·빈 입력). tsc --noEmit 통과.
    • 검증용 프로젝트 미리보기검증 2026-09-04(6c00ba53)를 새로 만들어 노선 5종을 실제 업로드해 확인함(기존 프로젝트 자료는 건드리지 않음).

B03~B08 진행단계 패널 — 사용자가 자리 옮기기 (2026-09-04 완료, 검증 대기)

사용자 지시 — 「B03~B08 우측 상단 진행단계를 사용자가 이동할 수 있게. 범위는 페이지 상세 영역 안이면 됨. 단 열리는 방향에 공간이 부족하면 변경되게」.

  • 고칠 자리는 한 곳 — 진행단계 패널은 공용 createPanel("progress", …) (ui_template/ui_template_overlay.ts:111) 하나가 만들고, B04~B08 은 createWorkflowLayout 을 거쳐, B03 은 createWorkflowOverlays 를 직접 불러 (B03_FileInput_UI_Page.ts:855) 같은 것을 씀. 여기만 고치면 6개 화면이 함께 따라옴. 현재 자리는 CSS 고정값 top: 120px; right: 24px (ui_template_overlay.css:56).

  • 끌어 옮기기 — 헤더 줄을 pointerdown 으로 잡아 끎. 헤더에는 이미 제목 클릭 = 접기/펴기 토글이 붙어 있으므로(overlay.ts:167) 이동 threshold 4px 를 두고, 넘으면 드래그로 보고 뒤따르는 click 을 삼킴 — 안 그러면 옮길 때마다 패널이 접힘.

  • 이동 범위 = 페이지 상세 영역 — 패널 offsetParent(오버레이 루트가 덮는 본문) 안으로 clamp. 화면 밖으로 나가 못 잡는 상태를 원천 차단. right 고정 대신 left·top 인라인으로 전환(전환 시점에 현재 실측 좌표를 그대로 넣어 튐 방지).

  • 열리는 방향 자동 전환 — 패널 본문은 헤더 아래로 펼쳐짐. 아래쪽 남은 높이가 본문 높이보다 작으면 is-flip-up 을 걸어 헤더 위로 펼침 (CSS flex-direction: column-reverse + 바닥 기준 정렬). 폭도 같은 규칙으로 좌우 전환. 판정은 ① 끌기를 놓을 때 ② 펼칠 때 두 시점 — 창 크기 변경까지 쫓지는 않음(과설계).

  • 자리는 세션에만sessionStorage(기존 frd_workflow_progress_overlay_open 과 같은 방식·같은 파일). 5장 데이터 3층에서 화면 조작값은 캐시 몫이고, 공용 리사이저도 같은 규칙임(ui_template_resizer.ts 머리주석).

  • 자체검증 — 공용 브라우저에서 B03·B05·B07 세 화면 실측: 끌어 옮긴 뒤 ① 패널 rect 가 상세 영역 rect 안에 있음 ② 바닥 근처로 끌면 is-flip-up 이 붙고 본문 top 이 헤더 top 보다 작아짐 ③ 옮기는 중 접힘 토글이 안 걸림 ④ 페이지 이동 후 자리 유지. 수치로 판정.

    결과(2026-09-04, 뷰포트 1364×1304) — 세 화면 모두 통과.

    • 이동 정확도: B03 (-200, +599) / B07 (-600, -301) 지시값과 1px 이내. B05 는 (+900, +900) 지시에 (+900, +146) — 바닥 clamp 가 걸린 것으로 의도대로임.
    • 범위: 세 화면 모두 패널 rect 가 top ≥ 64 · 화면 안(inside=True). 화면 밖(3000,3000)으로 끌어도 헤더가 x=1197 · y=1247(= 화면폭−패널폭−8, 화면높이−헤더높이−8)에 멈춤.
    • 뒤집힘: 아래 공간이 모자란 자리에서 is-flip-up 이 붙고 본문 top < 헤더 top (예 B03 본문 703 / 헤더 1102) — 헤더 위로 펼쳐짐.
    • 토글: 끌기 직후 collapsed=False(끌다가 안 접힘), 이어 제목 클릭 True → False 정상. 자리 유지는 B03→B07→B05 이동 뒤에도 같은 좌표 유지 확인.
    • 구현 중 실측으로 잡은 두 건 ① pointerdown 에서 포인터를 잡으면 click 대상이 제목→헤더로 바뀌어 접기/펴기가 죽음 → threshold 를 넘은 뒤에만 잡도록 변경. ② 이동을 헤더에서만 들으면 커서가 패널 밖(특히 B07 CAD iframe)으로 나가는 순간 끊김 → window 에서 듣고 끌기 시작 시 포인터 캡처 병행.
    • 파일: ui_template/ui_template_overlay_drag.ts(신규 156줄) · ui_template_overlay.ts(배선) · ui_template_overlay.css(뒤집힘·커서). tsc --noEmit 통과.

공유 파일 주의ui_template/ui_template_overlay.* 는 두 창이 함께 쓰는 파일. 손대기 전 git sync, 끝나면 바로 push 하고 다른 창에 SendMessage 로 알릴 것 (7장).

B05 종단도 — 키보드 방향키 조작 보강 (2026-09-04 완료, 검증 대기)

사용자 지시(2026-09-03). 뼈대는 이미 있음B05_Profile_UI_Profile_Panel_Tools.ts 방향키 배선(2026-09-02): · 는 계획고(adjustStation), · 는 누가거리이고 좌우는 구조물·비정규 측점만 움직임(규칙 20m 측점은 격자라 무시). 한 번에 KEY_STEP_M. 아래는 모자란 세 가지.

  • 연속 이동 — 키를 누르고 있으면 이어서 움직임. 좌우(측점 0.1m)와 상하(계획고) 모두. B05_Profile_UI_Profile_Edit.tsHOLD_DELAY_MS(500ms)·HOLD_INTERVAL_MS(100ms) 를 export 해 그대로 씀. OS 키 반복(event.repeat)은 무시.

  • 연속 중 이력은 한 덩어리 — 이력에 pause()·resume() 를 더해 첫 한 번부터 키를 뗄 때까지를 한 덩어리로 기록. 구조물 이동은 서버 재계산·유령 변화점 정리가 뒤따라오므로 키를 뗀 뒤 HOLD_SETTLE_MS(700ms) 를 기다렸다 기록.

  • [쉬프트] 도구가 켜진 상태의 상하ProfileTools.nudge(delta) 로 도구 ▲▼ 와 같은 경로(onShift)를 열어 방향키가 씀. 도구가 꺼져 있으면 지금처럼 측점 계획고.

  • 동작 정리(확정 사항) — 구조물(비정규) 측점: 상하 = 계획고 ▲/▼ 와 같음, 좌우 = 0.1m 이동(연속). 일반 측점: 상하만, 좌우 무동작.

  • 작업 중 드러난 선행 결함 3건(모두 이 항목 안에서 고침)

    • 방향키가 아무 반응이 없었음 — 듣는 자리가 패널 루트라 그래프를 눌러도 포커스가 body 에 남음(측점을 고르면 그래프를 다시 그려 포커스가 풀림). 창(window)에서 듣고 패널이 화면에 없으면 무시하도록 바꿈.
    • 좌우가 한 칸만 움직이고 멈춤 — 관 측점 id 가 누가거리로 만들어져(pipe-85.59) 한 번 옮기면 선택이 풀림. 누르고 있는 동안은 처음 잡은 측점·자체 누가거리 카운터를 씀.
    • 되돌리기가 한 칸 덜 돌아옴 — 이력의 "처음 본 관 목록"이 조작 뒤 값으로 잡혔음. pause() 에서도 관 목록을 세션에 흘려 조작 값이 기준이 되게 함.
  • 자체검증 — 공용 브라우저(5174) 실측, 프로젝트 132 · 측점 100.0m/구조물 85.59m (tmp/browser/cmd/930·932·938·940·945·946·948): ① ×3 = 862.99→863.29m, ▲ 버튼×3 도 863.29m·오프셋 0.371455동일, ×3 로 862.99m 복귀 ② 1.5초 길게 누르기 = +1.00m(10칸) — 홀드 규칙(0.5초 뒤 0.1초 간격)과 일치. 구조물 좌우는 85.590→86.290m(7칸) — 관 이동은 서버 재계산을 거쳐 몇 틱이 흡수됨 ③ 연속 이동 뒤 Ctrl+Z 1회로 원위치(계획고 864.09→863.09, 구조물 86.290→85.590), Ctrl+Shift+Z 로 복귀. 단발 1회는 그 한 번만 취소 ④ [쉬프트]에서 — 직선 구간 120·140·160m 이 나란히 +0.09~0.10m, 바깥 180m 는 불변 (구간 평행이동), 길게 누르기 +0.91m, 되돌리기 1회로 복귀 ⑤ 일반 측점 · 무동작(초안 델타 불변) ⑥ 조작 뒤 유토곡선 갱신 — 절토 4,466.7→4,428.4㎥ · 성토 14,882.1→15,124.7㎥

    • 타입검사(npm run typecheck) 통과, prettier 적용, 파일 311줄(700줄 이내)

B05 종단도 — 줌·Y레인지 조작구 (2026-09-04 완료, 검증 대기)

사용자 지적 — 「공사 범위가 넓어지고 고저차가 커지니 종단 그래프가 보기 불편함」. Y축 방식은 제안 A(표시 표고창) 로 2026-09-04 사용자 확정.

  • 줌 버튼 — 조작구는 B05_Profile_UI_Profile_Zoom.ts 신규 모듈(배율 상태 + 버튼 묶음). 자리는 절·성토 요약줄 오른쪽 끝(= 그래프 우측 상단) — 요약줄 렌더러에 trailing 자리를 더해 붙임. 버튼 7개 + ⇕+ ⇕− , 설명은 툴팁(button.title), 클릭은 event.stopPropagation() 로 측점 선택에 번지지 않게 막음. 양식(22×22px·테두리·hover)은 횡단도 줌 버튼세트와 같은 값으로 B05 CSS 에 적음 (.b05-profile__zoom* — B06 컨트롤 CSS 는 B05 페이지가 안 읽음).

  • X 줌은 폭 배수computeProfileLayout(..., zoomX) 에 배수를 넘겨 측점 간격 기본값(STATION_SPACING_PX × 1.5)과 폭맞춤 폭에 함께 곱함. transform 이 아니라 캔버스 폭이 커지므로 그래프·테이블·편집 버튼층·구조물 레인이 같은 비율로 늘어남. 한 칸 1.25배, 상한 8배.

  • Y = 표시 표고창(제안 A) — 렌더러(createLongitudinalProfile)가 이미 받던 verticalExaggeration 을 배율로 쓰고, 창 중심 이동용 인자 elevationOffsetRatio(창 높이 대비 비율) 를 새로 받음. 창 높이 = 전범위×1.2 ÷ 배율, · 가 창 높이의 10%씩 이동. 세로 스크롤이 생기지 않아 X축·측점 라벨·편집 버튼이 바닥에 그대로 남음.

  • 창 밖은 클립 — 지반선·계획선·절성토 음영을 플롯 사각형 clipPath 안의 두 그룹으로 옮김. 안 자르면 배율을 올렸을 때 선이 축 라벨·측점 라벨 띠 위로 흘러나옴.

  • 배율 상태는 페이지(패널 클로저)가 보유 — 편집·되돌리기로 다시 그려도 유지.

  • 자체검증 — 공용 브라우저(5174) 실측(tmp/browser/cmd/952~956): ① 정렬 — 배율 1 / 1.95 / 3.8 에서 캔버스 폭 4600 → 8887 → 17260px, 100m 측점 세로선·테이블 셀·편집 버튼의 화면 x 가 852 / 1284 / 2129px 로 셋 다 일치(±1px) ② Y 배율 — 창 825880m(전범위) → ⇕+×2 로 835870m(55m ÷ 1.5625 = 35m, 눈금 라벨이 창 범위와 일치), · 가 창을 위·아래로 옮김(840875 / 830865) ③ 로 폭·배율·창 중심 모두 초기 상태 복귀(4600px · 825~880m) ④ 클립 — 배율 2.44배·중심 이동 상태에서 계획선이 플롯 밖으로 그려지지 않음(스크린샷 tmp/browser/shots/954_clip.png), 클립 그룹 2개 확인 ⑤ 배율 유지 — 방향키 편집·되돌리기 뒤에도 폭 7130px 그대로

    • 타입검사 통과, prettier 적용. B05_Profile_UI_Profile_Panel.ts 는 726줄로 700줄을 넘겨 있으나 이번에 늘린 몫은 3줄이고, 분리는 아래 「700줄 제한 위반 정리」 항목 소관.

B05 종단표 — 구조물 측점 값 열·직선화 후 곡선 행 (2026-09-04 완료, 검증 대기)

사용자 지시(2026-09-03) — 종단면도 하단 도면 테이블(B05_Profile_UI_Profile_Table.ts, 구배 3행 · 측점값 7행 · 곡선 2행) 두 가지.

  • 구조물(비정규) 측점은 값 열을 늘 펼치지 않음 — 기능 자체는 이미 있었으나 동작하지 않았음: 구조물 목록의 누가거리(85.59)와 계획선 측점의 누가거리(85.595)가 소수 셋째 자리에서 어긋나 문자열 키(toFixed(3))로는 같은 측점임을 못 알아봤음. 누가거리 허용 오차 0.1m 비교(isNearChainage)로 바꿈. 배관 측점의 곡선 L·R 상시 표기 예외(2026-08-04)는 그대로.

  • 직선화 직후 곡선 L·R 행 비우기 — 편집 델타의 반경 키는 이미 지워지고 있었으나, 표는 자동 계산된 곡선을 그대로 그려 R 이 수억 m 로 찍혔음(대수차가 0 이라 R = L ÷ |대수차| 가 발산). 대수차 1e-4 % 미만이면 직선으로 보고 곡선 L·R 을 빈 칸으로 둠(표·값 열 오버레이 공통).

  • 「각도 행」 = 구배 3행(2026-09-04 사용자 확정) — 구배 L·H·S 는 값 열을 접는 규칙에서 빠져 늘 보임. 구조물로 좁게 갈라진 구간만 값을 감추던 옛 규칙(2026-08-03)을 걷어냄 (구조물 구간 색·하이라이트·툴팁은 유지). 실측: 8085.59m·85.59100m 블록이 고르지 않아도 5.59 / -2.23 / -39.88, 14.41 / 0.50 / 3.48 표기, 빈 블록 0개.

  • 자체검증 — 공용 브라우저(5174) 실측(tmp/browser/cmd/957~962): ① 구조물 측점(85.59m) 열 — 고르기 전 절토고~측점 7행 모두 빈 칸(고치기 전에는 계획고 863.07 · 누가거리 85.59 · 측점 4+5.6 이 그대로 펼쳐져 이웃 값과 겹쳐 보였음), 고르면 값 열 오버레이로 12행 표시(계획고 863.07 · 측점 4+5.6), 다시 누르면 사라짐. 배관이라 곡선 L·R(5.04 · 11.6)은 계속 보임 ② 직선화(120→180m) 직후 — 140m·160m 의 곡선 L·R 이 빈 칸(고치기 전 R 3.0e8 · 2.4e8), 직선화 시작점 120m 은 실제 대수차 0.92% 가 남아 값 유지(R 1634.7), Ctrl+Z 로 되돌리면 원래 값(15.00 / 104.3 · 81.6 · 195.8) 복귀 ③ 구배 3행 — 구조물 구간 포함 전 블록에 값 표기(빈 블록 0개)