knowledge(계획): PLAN 634~639 이관 — 요구 546~551 끝(아이콘 그룹화 · 노선 그리기 한 벌 · 가이드 추천선 · B05 라이다 · 노선 세트 · 작은 고침) · 메인 시험 374 통과 · PLAN 에는 621 만

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-01 13:24:51 +09:00
co-authored by Claude Opus 5.5
parent 2fd90b7754
commit 294c126a39
+76
View File
@@ -0,0 +1,76 @@
# PLAN 634~639 이관 — 지도 아이콘 그룹화 · 노선 그리기 한 벌 · 가이드 추천선 · B05 라이다 · 노선 세트 · 개발 환경 작은 고침(요구 546~551)
- 메인 확인(11-01): 고친 대상 시험 52 파일 374 통과 · 7 건너뜀 · typecheck 0 · 요구서 `docs/raw/요구_1101/요구서_546_지도아이콘_노선그리기한벌_가이드선_라이다.md`.
## 634 지도 아이콘 셋 그룹화 · 호버 글 (요구 546 · 549 진행)
- 정함(브레인): 요구서 `docs/raw/요구_1101/요구서_546_지도아이콘_노선그리기한벌_가이드선_라이다.md` 3장 아이콘 · 근거 `_분석_546-A_아이콘그룹.md`.
- [x] 634-1 부품 — 여럿 고르기 메뉴(안 닫힘 · 줄 아이콘 · 막힘 · 켠 수 배지) · 한 행 두 영역 · 견본 · 아이콘(`ui_template_context_menu` · `_map_tools` · `_ui_kit_parts` · `_icons`) → 시험 568_1 · 626_1 · 552_4
- 검증완료 — 시험 634_1 · 568_1 · 626_1 · 552_4 통과 · typecheck 0 · 여럿 메뉴 골라도 열림 · Esc · 밀기 · 창 크기 닫힘 · 켠 수 숫자 걷음(요구 551 · 눌림만)
- [x] 634-2 표 두 장(그룹1 22 · 그룹2 17 · 호버제목 · 묶음 · 페이지 사용) · 공용 겹 줄 sync(`map_layer_list` · `map_layer_bar` · `map_toolbar`) → 시험 624_2 · 624_3
- 검증완료 — 호버 = 표 그룹1 22 + 도로300m · 그룹2 17 줄 글자 그대로(화면 실측 두 페이지) · 막힘만 「제목 — 까닭」(등고선 1m · 임도(업로드)) · 시험 634_2 · 624_2 · 624_3 · 622_2 · 553_4 · 581_2 · 584_1 · 584_3 통과
- [x] 634-3 두 페이지 배선 · 호버 덮어쓰기 걷음 · 한 행 자리 CSS · B05 계류 띠 · 스냅 간격 메뉴(예정노선 변경 · 원본 아이콘은 635-3) → ORCA 1920 · 1366 · 1280 한 행 · 밀기 · 메뉴 안 닫힘 · 켬끔 기억
- 검증완료 — 1920 · 1366 · 1280 두 페이지 한 행(두 영역 같은 줄) · B05 도구 영역 1366 845→628 · 1280 →542 px 가로 밀기 · D03 1280 554 꼭 맞음 · 켬끔 기억 새로 열어도 · 계류 띠 B 200(범위 안 0 ha 실제) · D 3.0 ha · 도로 0.8 ha · 띠 둘 따로 켬끔 · 스냅 간격 메뉴 · 밝음 · 어두움 · ORCA 확인
- 이음(634 → 636-2 · 635-3): 부품 `createPickMenu({ multi })` · `values` · `setItem` · `createMapToolRow(왼 · 오)` · `mapToolTip(단추, 까닭)` · 도구 표 `MAP_TOOLBAR` 줄 `title` · `pages` 만 고쳐 보임 · 글을 바꿈(페이지 덮어쓰기 없음)
## 635 노선 그리기 한 벌 — 예정노선 키트 · B05 왼쪽 칸 · 여러 연도 (요구 546 · 549 진행)
- 정함(브레인): 요구서 546 3장 노선 그리기 · 4장 숨김 표 · 근거 `_분석_546-B_노선로직공용.md` · 사용자 확정: 받기 단위 = 세트(요구 547 · 548 · 요구서 8장).
- [x] 635-1 예정노선 키트 · 기능 표 · 지도 입력 한 함수 · `oneLine` · 가짜 값 걷음 → 예정노선 화면 전후 같음 · 시험 625_draw · 626_3
- 검증완료 — 시험 187 통과(625_draw · 626_3 · 553_4 · 560_4 · 475 · 584_3 · 606_1 · 624_4b 외) · typecheck 0 · oneLine 0 · UI_Page 680 → 620 줄 · ORCA 검증_sub2_D 긋기(지점 시작 · Tab · Shift 길이만 · Enter · Esc) · 고르기 · 우클릭 메뉴 넷 · 속성 판 경위도 · Ctrl+Z/Y · 재기 Esc 같음 → 되돌림 dirty 0 · B05 검증_sub2 한 선 막힘 · 노드 지움 → 다시 추적 330 점 → 되돌리기 331 같음([저장] 안 누름)
- 이음(635-1 키트) — `createPlanKit({ page, network · commit · show, heightAt, lonLat?(없으면 경위도 숨김), editable, idle?, onMode, onSelect, onKey?, yearStart?, points?(표 「지점」 켠 페이지만), cards: { site?: { parts, title? } } })` → `{ cards(표가 켠 칸), layers(under, over)(차례 고정), draw · edit · props · menu · marks · pieces, key(event), sync() }` · 지도 입력 = `bindPlanInput({ canvas, at, screen, layers, redraw, capture? })` · 숨김 = `UI_Features.ts` `featureUse(page, key)`(use · view · hide)
- 이음(635-2 꼴): `GET /api/projects/{B}/route/plan/source` → `{expected_source: [[x, y]] 원본 꼭짓점(범위 · 지표면 트림 · 조밀화 없음), spacing_m 3.6}` · `POST /route/follow` 가 추적 전 같은 간격 조밀화 · `GET /api/projects/{B}/plan-context` → `{linked, plan_name, epsg(B), mine 「2027-1」, year, sets: [{key, year, no, mine, parts, branch, length_m, lines: 조각마다 B 좌표 꺾은선}]}`(업체 이름 없음)
- [x] 635-2 서버(638-1 뒤) — 세트 연결 · `GET plan-context`(다른 세트 · 내 몫 · B 좌표) · 받은 원본 꼭짓점 칸 → 원본 꼭짓점 다시 추적 = 체인 초기선 거리 0
- 검증완료 — 시험 163 통과(test_635_2 3 · 626-2 · 626-3 그대로) · typecheck 0 · 검증_sub3 8005 실측: 원본 꼭짓점 64 → follow = 체인 초기선 181 점 최대 거리 0.0 · 옛 331 점 follow = 초기선 같음 · plan-context 연결 없음 = linked False · B 파일 안 바뀜
- [x] 635-3 B05 왼쪽 위치 · 그리기 칸(키트) · 「예정노선 수정」 · 받은 노선 점선 · 길이 비교 · 「받은 노선으로」 · 도구줄 둘 걷음 · 어둡게 0.35 → 626-3 지킴 대조 · ORCA
- 검증완료 — 시험 76 통과(635_3 · 626_3 · 551_2 · 624_3 · 634_2 · 568_1 · b05_routeedit_initial 외) · typecheck 0 · RouteEdit 682 · Render 653 줄 · 검증_sub6 B 5181: 왼쪽 위치 · 그리기 칸(order 1 · 2) · 도구줄 예정노선 아이콘 0 · 고칠 선 원본 꼭짓점 64(조밀 331) · 수정 켬 = 계획선 픽셀 불투명 255 → 89(0.35) · 끌기 64 → 길이 1,097 → 1,137 m · 지움 63 · 다시 긋기 64 · [받은 노선으로] = edit [] · [저장] → 다시 열면 고친 64 · [초기화] → 331(받은 노선) · 지킴 지문 110/110 같음 · 밝음 · 어두움 · 찾기 이동 50 km 28 m · 백업으로 되돌림(지문 · 노드 27 같음)
- 이음(635-3 → 635-4) — `B05_Profile_UI_ExpectedDraw` 키트 「b05」 한 벌(`createPlanKit` 덧칸은 그 부름 한 곳) · 칸 자리 `fillPlanPanel({ site, draw })`(`B05_Profile_UI_Panel_Plan`) · 장면 `overAll = { paint, dim }`(켬 = `--draw-map-dim`) · 받은 꼭짓점 = `expectedProbe.source()`
- [x] 635-4 흐린 다른 연도 · 구역 겹 · 이음점 붙기(검증용 연결 B = 브레인 마련) → ORCA
- 검증완료 — 시험 48 통과(test_635_4 6 · 635_2 · 626_3 · 638_sets · 638_group · 625_draw) · typecheck 0 · 연결 = 검증_sub1_D 세트 3(2027-1 B 몫 1097 m · 2028-1 · 2027-2 각 160 m) · 지정 행 134 → 검증_sub1 B · plan-context mine 2027-1 · 흐린 세트 2 · 꼭짓점 64 · 9 · 9 · ORCA 5174: 흐린 선 · 이름표 보임 · 흐린 선 누름 = 고름 없음 · 내 끝 노드 끌어 냄 = 「2027-2 35.9 m 벗어남」 · 되끌면 이음점 좌표 그대로 붙음 · 안내 사라짐 · 긋기 미리보기 「이음점에 붙음」 · 밝음 · 어두움 · 캐시 되돌림
- [x] 635-5 B05 좌표 변환 서버 길 — 찾기 이동(지금 50 km 28 m · 180 km 1.7 km 어긋남) · 속성 판 경위도 칸 → 어긋남 < 0.1 m · pyproj 대조
- 검증완료 — 시험 15 통과(test_635_5 · 635_3 · 626_3) · typecheck 0 · 검증_sub6 B(Bessel 동부 TOWGS84 WKT) 5181: 찾기 이동 영덕군청 50.4 km · 부산광역시청 181.2 km 가운데 = pyproj 어긋남 0.000 m(ORCA 0.000 m) · 속성 판 경위도 노드 둘 = pyproj 소수 6자리 같음 · 길 `POST /api/projects/{B}/route/coords {to: plan|lonlat, points}` · 보기 기억 · 현재 프로젝트 되돌림 · B 파일 안 씀
- 이음(635-4) — 키트 `snaps?: () => Vertex[]`(긋기 · 노드 끌기 붙기만 · 「이음점에 붙음」) · 기능 표 `others`(d03 hide · b05 view) · 겹 `createPlanContextLayer(projectId, redraw)` → `{load, joints, note(line), paint(ctx, map), probe}` · 셈 `logic/B05_Profile_PlanContext.ts`
## 636 예정노선 가이드 추천선 (요구 546 · 549 진행)
- 정함(브레인): 요구서 546 3장 가이드 추천선 · 근거 `_분석_546-C_추천노선_라이다.md` C1.
- [x] 636-1 셈 `A00_Common/map/logic/map_guide_route.ts`(2 m 격자 A* · 펼침 상한 · 첫 · 끝 걸음 정확) + 지킴 시험(평지 · 지그재그 · 못 닿음 · 지점 셋) → 1 km ≤ 0.3 s
- 검증완료 — 시험 8 통과 · typecheck 0 · 실측 용화 · 검증_sub4_D · 가이드 표 8 줄(구간 10) 모두 닿음 · 최대 기울기 14.0 %(첫 · 끝 걸음 포함) · 급경사 지남 벌점 0 → 3 = 35~71 → 9~42 % · 1 km 54~302 ms · 못 닿음 ≤ 0.41 s(펼침 30 만 · 450 ms 상한)
- 이음 — `guideRoute(지점[], guideTerrainFromGrid(grid), { step, maxGrade, steepPct })` → `segments[{ vertices[x,y,z], reached, length, maxGrade, steepRatio }]` · `ms`
- 이음(636-2 공용 미리보기): `A00_Common/map/map_route_preview.ts` — `createRoutePreviewMenu({ items, onPick })`(아이콘 compass · 호버 「추천노선」 · 「끔」 · `data-act=recommend`) · `paintRoutePreview(context, 점[], toScreen, { dash?, color? })`(노랑 · 검은 테) · 예정노선 = `D03_PlanAnalysis_UI_Guide.ts` `createPlanGuide` → `{ root, layer, state }`
- [x] 636-2 B05 추천 메뉴 · 점선 그리기 공용 · 예정노선 「추천노선」 = 가이드 선 · 지점 고침 때 다시 셈 → ORCA ms · 최대 기울기 ≤ 14 %
- 검증완료 — 시험 21 통과(636_2 4 · 636 · 626_1 · 634_2) · typecheck 0 · 검증_sub3_D 지점 셋 = 두 구간 닿음 3.39 km 최대 13.9 % · 끌기 뒤 다시 셈 · 빈 지형 지점 = 1 구간 점선 + 알림 · 지점 하나 = 막힘 · 1 km 한 구간 헤드리스 185~278 ms · ORCA 214~305 ms · B05 검증_sub3 추천 넷 187 · 197 · 195 · 197 점 · 끔 0 · 밝음 · 어두움 · 캐시 되돌림
## 637 B05 라이다 나중 올리기 (요구 546 · 549 진행)
- 정함(브레인): 요구서 546 3장 B05 라이다 · 근거 `_분석_546-C_추천노선_라이다.md` C2.
- [x] 637-1 예정노선 LAS 올리기 · 짓기 공용 모듈(예정노선 동작 그대로) + 지킴 시험
- 검증완료 — 시험 624_4 · 530_2 · 637 15 통과 · 예정노선 응답 그대로(`common_util_lidar_upload`)
- [x] 637-2 B 창구 `POST /route/lidar` · 뿌리 models 짓기(manifest 실측 먼저) · `las_selection` · 갈음 강제 다시 셈 · 노선 덮임 검사
- 검증완료 — 시험 637 · 626_1 25 통과 · typecheck 0 · 검증_sub5 갈음(지면점 353만) 56.7 s · covered 1.0(솎은 LAS 0.008 = 거짓) · 수치지형도 모델 647 · 파일 남음 · 모델 645 id · 확정 · 노선 연결 살림 · 설계 표 · 파일 그대로 · force 15.5 s 측점 57 지반고 최대 0.30 m · 되돌림 뒤 DB · 파일 처음과 같음 · 덧붙임(las_selection · 칩 열림) = 시험만
- 이음(637-3 이 씀): `POST /api/projects/{id}/route/lidar`(multipart `files` = LAS/LAZ + .prj · 202 꼴 `{status: accepted, running…}` · 저장 중 409) · `GET …/route/lidar` → `{ready · running · percent · message · error · interrupted · covered · covered_ratio · epsg · files · design · sources}` · 끝나면 칩 = `GET /route/terrain-sources` 에 las · 설계 지형 바꿈 = `POST /route/design-terrain {terrain, force}`(force = 같은 지형도 다시 셈 · 설계 라이다 B 의 갈음 뒤)
- [x] 637-3 B05 지형 칩 옆 [LAS 올리기] · 진행 서클 · 확인창 → 설계 지형 바꿈 → 검증 B 복제 ORCA 종단 · 횡단 수치
- 검증완료 — 시험 637 · 624_4b · 626_1 등 44 통과 · typecheck 0 · 검증_sub5 B: 수치지형도 설계에 원본 LAS 올림 184 s → 확인창 「설계 지형을 라이다로 바꿈?」 → 측점 57 지반고 처음 값(최대 차 0.001 m · 수치지형도 때 13.6 m) · 라이다 설계에 다시 올림 → 「다시 셈」 force 19 s · 반쪽 LAS 덮임 48 % = 확인창 없이 알림 · 칩 라이다 막힘 · 갈음 때 csf 파일 9 · 행 1 지움(수치지형도 그대로) · 검증_sub5_D 올리기 30 s 전과 같음 · 1920 · 1506 · 1366 · 1280 한 행 · 잘림 0(좁으면 도구 영역 밀기) · 밝음 · 어두움 · 되돌림 뒤 B · D DB 행 · 파일 처음과 같음
- [x] 637-4 [초기화] 때 설계 지형도 초기값으로(초기값에 지형 고름) → 시험
- 검증완료 — 재현 검증_sub4 B 라이다 → 수치지형도 → [초기화] 횡단 지반선 대 stage 1 지형 평균 3.78 m · 최대 13.67 m(stage 1 수치지형도 · 노선 행 라이다) → 고친 뒤 API · ORCA 칩 길 세 자리 라이다 · 어긋남 0 · 옛 초기값 = 지형 그대로 + 로그 한 줄 · 시험 637_4 · 초기값 · 초기화 73 통과 · typecheck 0 · 검증_sub4 되돌림 · 검증 대기
- [x] 637-5 설계 지형이 라이다인 B 에 노선을 다 못 덮는 LAS 를 올리면 설계 필터 파일을 갈음하지 않음(따로 지어 덮임 검사 → 통과 때만 바꿈 · 못 덮음 = 거절 · 옛 파일 그대로) → 시험 · 실측
- 검증완료 — 시험 637 12 · 624_4 · 637_4 7 통과 · typecheck 0 · 검증_sub5 B(설계 라이다) 반쪽 LAS 81 s 거절 「노선을 50 % 만 덮음 — 설계 지형이 라이다라 바꾸지 않음」 · 파일 424 지문 · DB 4표 그대로 · 시험 자리 지움 · 원본 LAS 152 s 갈음 covered 1.0 · 모델 645 id · 확정 살림 · 행 지문 = 옮긴 파일 · 화면 알림 그대로 보임(headless) · 되돌림 뒤 파일 · DB 처음과 같음(파생 haul 저장본 하나 다시 셈) · 검증 대기
## 638 예정노선 노선 세트(연도-번호) · 끊김 경고 · 잇기 (요구 547 · 548 · 549 진행)
- 정함(브레인): 요구서 546 8장 · 근거 `docs/raw/요구_1101/_분석_547_노선그룹_연도.md` · 사용자 확정: 중복 연도 없음 = 선 한 자리 한 연도 · 같은 해 세트 1 · 2(요구 548).
- 이음(638-1 꼴): 파일 `pieces[].set`(1 부터 · 판 2) · PUT 몸 `pieces[].set`(빈 값 = 그 해 최댓값 + 1) · GET · PUT `network` = 합친 뒤 꼴 · `derived.pieces[].set · set_key` · `derived.sets[] = {key 「2027-1」, year, no, parts, branch, length_m, pieces: 조각 id}` · D04 `summary.pieces[]` = 세트 줄(`piece_id` = 세트 열쇠 · `label` 「2027-1」 · `parts` · `branch` · `pieces`) · 업체 열쇠 = 세트(옛 조각 id 받음 → 세트로 적음)
- [x] 638-1 서버 — 조각 `set` · 같은 세트 합침 · `derived.sets[]`(덩이 · 갈래) · 판 2 · 옛 번호 · 업체 열쇠 세트 · 확정 막음 · 연결 = 세트 한 줄 → 시험 · 옛 파일 · 옛 업체 줄 읽힘
- 검증완료 — 시험 150 통과(test_638_sets 9 · 거울 사례 7 = sub6 같은 답) · 검증_sub3_D 8005 실측: 세트 1-2-1 → 2027-1 parts 2 · 확정 409 · 업체 든 2027-2 합침 409 · 1-1-1 → 조각 하나 마크 0 · 되돌림(판 1 · 연도 줄 0 · 업체 0)
- [x] 638-2 화면 셈 `logic/D03_PlanAnalysis_Group.ts`(세트 지정 · 끝에서 나눔 · 합침 = 서버 짝 · 고를 세트 · [잇기]) → 거울 시험
- 검증완료 — test_638_group 12 · 서버 거울 test_638_sets 통과(같은 사례 7) · D03 logic 시험 13 파일 103 통과 · typecheck 0 · Plan.ts 661 줄 그대로 · 검증_sub6_D 실저장 2 걸음 화면 셈 조각 = 서버 조각(세트 지정 2027-1 덩이 2 → [잇기] 뒤 덩이 1) · 되돌림
- 이음(sub6 ↔ sub3) — 합침 = 선마다 이웃 두 조각 (year, set) 같음 = 하나(앞 조각 id · 사이 마크 걷음) · set 없는 옛 조각 = 선 · from_m 차례로 그 해 최댓값 + 1 · 거울 사례 `resources/tester/fixtures/d03_638_set_cases.json`
- [x] 638-3 화면 — 속성 판 세트 칸(토막 고름 포함) · 연도 밑 세트 줄 · 이름표 「2027-1」 · [잇기] · 저장 뒤 끊김 경고 · D04 세트 줄(635-1 · 638-1 · 638-2 뒤) → ORCA
- 검증완료 — 시험 108 통과(638_group 13 · 638_sets · 625_draw · 599_3 · 598_1 · 585_2 · 563_2 · 531_d04 · 626_3 외) · typecheck 0 · UI_Page 626 줄 · ORCA 검증_sub2_D: 240 m 선 → 가운데 지움 → 두 선 2027-1 → [저장] 「2027-1 이 2 덩이 · 빈틈 79.7 m」 → [잇기] → [저장] 경고 없음 · 덩이 1 · 토막 「2027 새 세트」 → 조각 2027-1 · 2027-2 · 2027-1(세트 줄 둘) → 2027-1 → 조각 하나 · 되돌리기 뒤 길이 글 맞음 · 같은 세트 구간 나눔 = 속 빈 마름모 · D04 「2027-1 · 본선 1 · 2 덩이」 + 막힘 띠 · [확정] 409 글 · 밝음 · 어두움 · 되돌림(network 없음 · 연도 줄 0 · 업체 0)
- 이음(638-3) — 기능 표 `set`(B05 보기만) · `join`(B05 숨김) 줄 · 키트 `sets?`(덩이 수) · `createPlanEdit({ year? })` · 셈 `Group.setWarnings` · `setGapM`
## 639 개발 환경 작은 고침 (요구 546 진행 중 발견)
- 정함(브레인): 창 보고에서 나온 것 · 사용자 화면 동작 영향 없음.
- [x] 639-1 낡은 시험 `test_551_2` 줄 하나(그리기 자리 → `map_route_preview.ts`) · ORCA 탭 약 10 초마다 새로 읽힘 까닭 · 고침(vite 지켜보기) → 2 분 관찰 새로 읽힘 0
- 검증완료 — 시험 551_2 · 624_2(낡은 줄: 추천 묶음 더함) 12 통과 · typecheck 0 · 2 분(24회 서버 로그·tmp 쓰기+자체 로그 루프) 새로 읽힘 전 0 → 후 0(재현 안 됨 — vite 는 원래 `A00_Common` 만 지켜봄) · 방어 `server.watch.ignored`(tmp·storage·docs·venv·logs·시험·*.log) · 코드 고침 HMR 그대로(css update · ts full-reload 전과 같음) · 각 창 vite 다시 켜야 반영