From 1b327b3613e2a76dcf0b931586a531c2beb52f84 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 17 Oct 2026 17:03:29 +0900 Subject: [PATCH] =?UTF-8?q?chore(=EC=9A=94=EA=B5=AC):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=20242=20=EB=B6=84=EC=84=9D=20=E2=80=94=20=ED=95=9C=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=8B=A4=ED=96=89=20=C2=B7=20=EB=B3=B4?= =?UTF-8?q?=EC=95=88=20=C2=B7=20=E2=98=B0=20=C2=B7=20=ED=8F=89=EB=A9=B4=20?= =?UTF-8?q?=EB=8F=84=EA=B5=AC=EC=A4=84=20=C2=B7=20=ED=8F=89=EB=A9=B4=20?= =?UTF-8?q?=EA=B7=B8=EB=A6=BC=20=C2=B7=20=ED=95=98=EB=8B=A8=20=ED=8C=90=20?= =?UTF-8?q?=C2=B7=20=ED=9A=A1=EB=8B=A8=20=ED=8C=90=20=C2=B7=20R=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=C2=B7=20=EC=98=9B=20=EC=8B=9C=ED=97=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01C6BNBFXFndbqYxu6sZuknK --- docs/raw/조사/2026-10-17_386_요구242_분석.md | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 docs/raw/조사/2026-10-17_386_요구242_분석.md diff --git a/docs/raw/조사/2026-10-17_386_요구242_분석.md b/docs/raw/조사/2026-10-17_386_요구242_분석.md new file mode 100644 index 000000000..6d1760737 --- /dev/null +++ b/docs/raw/조사/2026-10-17_386_요구242_분석.md @@ -0,0 +1,58 @@ +# 요구 242 분석 (10-17 · 브레인 + 조사 여섯) + +원문 `docs/raw/요구_1017/사용자요구_1017.md` 요구 242. 계획 PLAN 386~396. + +## 1장 한 페이지 실행 · 보안 (241-17 답) + +6장 줄 번호 거의 맞음(6장 = 365 뒤에 씀) · 바뀐 인용 RC:76-88→RC:99-117 · CV:512-520→CV:509-513 · CR 사토 키 지움(380-1). +365 로 된 것: 0단계 반(switchMs DP:251-254 · test_365 14) · 3단계 반(묶음 주인 = 페이지 DSh:207 · 남은 baseMoved PP:311,678) · 4단계 반(창구 한 벌 DSh:223-230 · 남은 부르는 곳 셋 DSh:226 · Profile_Preview:118 · Design_Sync:177 · 면적 얹는 곳 일곱) · 원칙 5 거의(346-4). +차례: 0 → 1 · S · 2 → 3 · 4 → 6 · 7 · 5(선택 · 맨 뒤). 문 닫는 조건 = 단계마다 test_365_page_pipeline 14 + 바퀴(열 때 1 · 같은 입력 0 · 상한 3). +단계: +0 기준 잼(코드 X · 전환당 /api 수 · switchMs + 마지막 /api 끝 ms · 열 때 바퀴 B05 먼저/B06 먼저/새로고침 · section-detail · 세션 글자 수) — A +1 세션 직접 접근 → 등록부: PT:44,94,100 b05:pipes → 가게 pipes 초안 · PE:119-126 · RC:105-117 → routeStateKeys · LS:84,99,128,143 · FC:139,154,340,357 · PH:31,58-71(옛 접두 지움 · 사진 = 지금 프로젝트만) · 새 test_384_1_session_keys(design · UI_* 직접 sessionStorage 0) · test_290_1 · test_346_4 둘 — B +S 보안 S1 · S3 · S5 · S6: app_shell.ts · A06_Login_Api_Fetch.ts · b_page_state.ts · design_store.ts:81-88 · B06_Section_Router_Confirm.py · Persist.ts:489-505 · 새 test_384_s_logout_wipe · test_384_s_area_keys · test_b05_b06_save_roundtrip — C +2 페이지 자료 줄 새 design_page_data.ts(≤200) · 저장분(구조물 · 관 · 종류 전부) 한 번 · 노선 id 한 칸 · [저장] 뒤 한 번 · onShow fetch 지움 · 도크 「계산 중」 점 · PP:614-617 · DSv:168-183 · VP:441-445 · VC:563-571 · PS:283-284 · SP:383-385 · SD:80-91 · 전환당 /api 0 · 열 때 fetchStructures 1 · 새 test_384_2_page_data · test_design_page_single — A +3 묶음 입력 = 가게만 VPS:85,91 · SVP:188,295 · PS:286 · SP:387 · PP:311,678 · baseMoved 0 — A +4 횡단 다시 셈 창구 하나 · 면적 얹기 한 곳: CR · CV:513 · Design_Sync:177 · Profile_Preview:118 · VC:234,637 · Persist:492 · refreshCrossDesigns 부르는 곳 1 · 화면 applyStructureArea* 0 · B05만 연 면적 = B06 ±0.01 — B +6 저장 한 줄 보기 무관: DSh:341-395 · PA:81-84 지움 · PER:521-541 · B05만 연 [저장] 본문 = B06 다녀온 본문 — A +7 결과 층 section-detail = 저장 정본만 · Section_Store:105-114 · PC:45-49 · JSON.parse 1 · 세션 글자 줆 — B +5 (선택) 보기 = 그리는 쪽 DSh:146-165 · VP:232 · VC:111 — 미룸. +1차 병행 A(0→2) · B(1) · C(S) · 파일 겹침 0 · b_page_state = C 만(B 는 C 에 부탁). 2차 A(3→6) · B(4→7) · Persist 는 C 489-505 먼저. +700줄: DPr 700 · RE 697 손대지 않음 · PP 698 · VC 688 · CV 682 줄이는 수정만 · 새 줄 필요하면 먼저 쪼갬. +편의성: 전환마다 /api 2~5건(VP:441-445 · VC:563-571) → 0 · 되돌리기 사진이 다른 프로젝트 초안 찍음(PH:58-71) · B05만 연 [저장] 본문 다름(PA:81-84) · 로그아웃이 떠남 확인보다 먼저 · 묶음 바퀴 124~451 ms 표시 없음. +보안: S1 로그아웃(app_shell.ts:52-60 서버 로그아웃 먼저 → 떠남 물음 끊긴 세션 · 초안 · frd · IndexedDB · 모듈 메모리 남음 → 같은 탭 다음 계정이 앞 사람 초안 [저장]) 고침 = takeLeaveGuard 먼저 → logout → draft · result · entered-project · CURRENT_PROJECT_ID_KEY 지움 · purgeOtherProjects → reload · 계정 바뀜 A06_Login_Api_Fetch.ts:66 aislo:owner ≠ user.id 면 같은 지움. S2 b05:pipes 프로젝트 없는 열쇠(1단계). S3 Persist.ts:489-505 브라우저 면적 · 관 길이 9칸 보냄 → Schema.py:237-255 → Router_Confirm.py:142-160 정본에 적음 → :307 재계산 덮음 · 재계산 실패 삼킴(Router_Confirm:177-186 · Server_Calc_Prebuild.py:261-263,329) → 브라우저 값 정본 남음 · 고침 = _AREA_KEYS(Prebuild:64-74) 걷음 · Persist 보냄 지움 · 실패 recomputed:false + 화면 경고. S4 권한 — 읽기 전용 역할 없음 · B03~B09 쓰기 = 회사 대조만(common_util_auth.py:187-217 · main.py:626-651) · 대시보드는 참여자 검사(B01_Dashboard_Router.py:81-89) → 사용자 결정. S5 세션 한도 넘침 삼킴(b_page_state.ts:436-446) · 고침 = 결과 칸 지우고 한 번 다시 · 또 실패 토스트. S6 design_store.ts:81-88 프로젝트 모르면 localStorage 읽음(PP:235 · PE:95) → design_page.ts:111 연 id 고정. S7 공유 PC = S1 로. +위험: 2 바퀴 0 · 3 은 2 뒤 · 4 세월교 곁 면적 ±0.01 · 6 저장 시간 늘어남 · S3 실패 시 빈칸 경고 · 2·7 Api_Structures · Section_Store B07 · B08 · B09 시험 같이. + +## 2장 ☰ · 서랍 · 좌측 카드 (242-1 · 2 · 3) + +1: 마우스 ☰ = top 8 · 36 → 중심 26 / 좌측 패널 제목 줄 min-height 48 · 중심 24 → ☰ 2 px 아래(손가락은 60 규칙으로 0). 파일 app_shell.ts:525-536 · device_context.css:89-98 · ui_template_overlay.css:107-114 · :558-566. 고침 overlay.css:558 규칙에 min-height calc(8*2 + --app-burger-w) = 52 → 중심 26. ☰ top 바꾸면 test_device_drawer [8,8,36,36] 깨짐. 영향 B03~B09 좌측 패널 몸통 4 px 내려감. +2: 서랍 app_shell.ts SHELL_CSS :459-508 · :553-557 — 높이 32/40/44 섞임 · 안 간격 4/8/12 · 묶음 사이 33(16+1+16) · 글 왼쪽 0/17/49/오른쪽 · 로고 중심 ☰ 보다 6 px 아래. 제안 8/12 체계: 묶음 안 8 · 묶음 사이 12+선+12 · 줄 높이 마우스 40 · 손가락 44 · 글 왼쪽 16 · 로고 줄 = ☰ 높이 가운데. 진행 단계는 .app-drawer__steps 범위로 덮어씀(원본 workflow_layout.css 안 만짐). 시험 test_device_drawer(:173 align-self flex-end 글) · test_225_drawer_shortcuts · test_app_settings · test_device_audit. +3: 기억 없음(패널 통째 열림만 frd_workflow_title_overlay_open). 고칠 자리: ui_template_collapsible.ts:15 createPanelCard 기본 true(B08 네 · B09 인쇄 둘) · design_panel.ts:78 createSectionFrame true(노선 추천) · B05_Profile_UI_Structures_Form.ts:79 is-collapsed(우클릭 추가 펴기 Structures_Panel:652 그대로) · B07_DesignDetail_UI_Panels.ts:72 folded.get(kind) ?? true(토적도 · 구조물 도면) · UI_Development.ts:24(전개도) · M02_UI_Side.ts:142 구조물 집계 양식(판단) · B06 Standard_Panel:400 · Standard_Diagram:38 details open(접힌 카드 안 — 그대로). 시험 test_311_panel_folded + helper(:45 · :66-68 · :111) · test_116_right_click_add · test_design_view_parity · test_203_1 · test_212_3. + +## 3장 평면 도구줄 · 판 기본값 · 하단 판 (242-4 · 7 · 9 · 10 · 11 · 16 · 17) + +4: RouteEdit_Chrome.ts:110-119 [측점 스냅] 뒤 분석 지형 label · 구분선 (86·91·93·109 · CSS Style.css:225) · 112~113 사이 한 줄 · 분석 지형 hidden(RouteEdit.ts:640) 때 구분선도 숨김 · 시험 test_b05_routeedit_initial.py:215-239(구분선 수 ==4 · 차례). +11: 끌기 연속(Pointer.ts:301-330) · 스냅 켬 = 뗄 때 commit(RouteEdit.ts:540) → fitCurveStations(:452-455) → logic/B05_Profile_RouteEdit_StationFit.ts:136-171 IP 접선 밀기 ±간격/2(:109) · MC = near*interval(:151) · 간격 stationIntervalM(RouteEdit.ts:131 기본 20) · MC_TOL 0.05(:30) · 방향키 logic/KeyNudge.ts:13 0.1 · 측점 표기 Frame.ts:173 floor(MC+0.5) 1 m(파이썬 짝 Engine_Sections_Core.py:291). 드롭다운 양식 = label.b05-routeedit__terrain + select.ui-select--sm(Style_RouteEdit.css:305-322) · 값 pref Api_Replan.ts:38-50 readState/writeState("routeedit-terrain") · 등록 b_page_state.ts:77. 고칠: select + 새 키 · RouteEdit.ts:453 intervalM · offStationCount(:419) 같은 간격. 주의 0.1 = 밀 범위 0.05 = 허용 오차(거의 안 밂) · 서버 저장 경로(Apply.ts:46-85 · Route_Save.py:99 · Router_Replan.py:277 · Schema.py:383 · Engine_Sections.py:88). 시험 test_366_3_station_fit(+helper) · test_224_2_station_snap · test_b05_routeedit_frame_mirror · test_383_2_route_keys. +16: 휠 RouteEdit_Input.ts:49-78 늘 preventDefault · Ctrl+휠 = 확대 · 회전 RouteEdit_Rotate.ts ROTATE_STEP_DEG 15(:13) · set()(:78) 뒤 onChange · 배선 RouteEdit.ts:255-262 · 568-578 · 핀치 빼기 isPinchWheel(touch_bridge.ts:29) · isTrackpadPinch(input_prefs.ts:59) · Recommend_Map.ts 도 같은 휠 함수(인자 넘긴 쪽만) · 도움말 Chrome.ts:126 · 시험 test_input_prefs.py:100 · test_b05_routeedit_view(+helper). +17: RouteEdit_Marks.ts:14 slopes:true → false · :7 주석 · 시험 test_381_2_routeedit_marks.py:19. +7: Chrome.ts:160-168 prefKey b05-routeedit-cross · defaultOpen innerWidth>=1500 ? cross : null · 기억 localStorage aislo:pref:b05-routeedit-cross {open,width}(side_panels.ts:69,78-85) · 측점 눈금 누르면 자동 열고 기억(RouteEdit_Cross.ts:289-290) → 키 올림(-v2) 또는 자동 열림 기억 안 함 · 시험 test_b05_routeedit_chrome_modal.py:52 · 67. +9: Drainage_Panel.ts:550-561 setCollapsed(readStateRaw("drainage-collapsed")==="true") · 처음 열 때 "false" 씀 → b_page_state.ts:54-58 drainage-collapsed version 2(masshaul-visible version 6 선례) · 전역 키 = B06 도 같이 닫힘 · 시험 helper_282_1_profile_toolbar.cjs:166. +10: 기준 9edaec82e(10-14 22:46). 바뀐 커밋 2d239f780(325-2) · d33cf220f(325-3 유토·배수 [창 분할]) · d985c24f5 · cebed851b(345) · 5417cde43(354-3) · bf3aaaa41(354-1 유토 자기 판 = 핵심) · f79a33ef3 · eb4f8ba55(367-1) · ddc6fe231(367-2 접음 높이 0 · 창 분할 펼친 때만) · c3dd05c5c(367-5 transition 지움 = 흠 고침 유지) · 3c5a779f6(367-6). 차이: 10-14 유토 = 종단 칸 바닥 덮는 판(absolute z5) · 종단·유토·표 세 영역 비례 끌기 + 놓을 때 commitHeight / 지금 유토 고정 높이 · 하한에 유토 높이 → 판 못 내리고 종단 눌림(가장 유력) · 유토 끌기 상한 80% · 손잡이 10-14 = 판 위 경계 밖 표 손잡이와 ±44 px 나란히 / 지금 판 안 top 0 · 접기 10-14 hidden / 지금 height 0 · 표 판 10-14 열린 유토 위 쌓임(setBottomOffset). 되살림 = bf3aaaa41 · f79a33ef3 · ddc6fe231 · 3c5a779f6 되돌림(367-1 충돌 손 맞춤) · 남김 325-2 · 325-3 · 354-3 · 367-5. 파일 B05_Profile_UI_Profile_Drag.ts:138-192 · _Heights.ts · _MassHaul.ts · _TableOverlay.ts · Style_MassHaul.css · design_profile_overlays.ts · design_profile.ts · design_profile_popout.ts · design_page.css. 시험 test_354_1 · test_224_1b(+helper) · test_224_1c(+helper) · test_367_5 · test_367_6 · test_354_3 · test_345_5 · test_230_2. + +## 4장 평면 그림 (242-5 · 6 · 12 · 13 · 15) + +5·6: 맴돔 = RouteEdit_Hover.ts:43-64 drawPickHover else 갈래 (#0ea5e9 · 좌우 12 px · :52-53) / 고름 = RouteEdit_Render.ts:403-459 drawCrossWidth (길이 RouteEdit_Cross.ts:352-369 watched() 발자국 비탈 끝 · 색 tone() :431-435 절성토). 방향 logic/RouteEdit_Frame.ts:60 stationFrameAt. m→px scene.toScreen(RouteEdit.ts:322) · pxPerMeter. 20 m = config_system_design.py:258 SECTION_CROSS_HALF_WIDTH_M (TS 상수 없음). 고침: 맴돔 · 고름 한 함수 · 좌우 20 m 고정 · #0ea5e9 · 12 px 선 지움 · 구조물 마름모(Render:417-429) 그대로. 시험 test_381_3_routeedit_node_pick · test_b05_routeedit_cross_width(+helper) · test_b05_routeedit_pick. +12: 고른 IP = 노드 r 6→8(Render:274) · BC·EC 손잡이 주황 채움(:296-315 · 노선과 같은 색 = 안 보임) · MC 평면에 없음 · 호 · 접선 강조 없음 · 호 누름 = node 고름(Pointer:240-250). 고침: picked 곡선 = curveArcVertices(logic/Curve.ts:178) 호 굵게 + BC·MC·EC 3점 + 접선 · 새 색 · Render 664줄 → 새 파일. +13: 판정 logic/RouteEdit_Edits.ts:40 CURVE_OPTIONAL_INNER_ANGLE_DEG=155 · :43-47 curveOptionalAt = 내각 ≥155°(교각 ≤25°) · 서버 RouteInitial_Station.py:385-393 flags False. 그리기 Render:263-291 원 r6 · curveOn false = 속 빈 원(:278-290) · 손 지움도 같음. 고침 :273-275 · :286-288 arc → 삼각형 · 판정 = !curveOn (전체) 또는 + curveOptionalAt. 집기 거리 판정(Input.ts:153) 영향 없음. 시험 test_b05_curve_radius_floor · test_b05_routeedit_view. +15: 잠금 RouteEdit_Lock.ts apexLock[] · straightLocked :79 · arcLocked :83 · 그리기 Render:248-249 → :595-622 strokeLockedRoute --map-route-locked 굵기 3(:41) · 노선 2.4 · IP 하나 잠금 = 점만. 색 #db2777/#f472b6 = 절토 붉은 계열과 겹침. 색 표: 노선 #f97316 · 절토 #e11d48/#ff6b6b · 성토 #0d9488/#2dd4bf · 등고 #818cf8 · 고름 등고 #7c3aed · 하천 #2563eb · 도로끝 #475569/#cbd5e1 · 법선 #0ea5e9 · 재기 #22c55e · 기울기 #0f766e · 구조물 #ff9800 · 위반 #c0392b/#e8695a. 후보 = 황금 #ca8a04/#facc15 + 굵기 4 + halo. 테마 ui_template_theme.css :235 · :336 · :377. 시험 test_b05_routeedit_lock · test_349_routeedit_theme_redraw · test_346_2_footprint_draw. + +## 5장 횡단 판 · R 통합 (242-8 · 14) + +8: B05 좌측 패널엔 횡단 칸 없음(구조물 배치 · 페이지 설정 · 노선 추천) · 「횡단」 판 = 평면도 접는 판 RouteEdit_Chrome.ts:151-171(지도 오른쪽 · 손잡이 판 왼쪽 가장자리 → 「좌측」으로 부른 것) · 칸 둘 「횡단」 · 「이전 횡단」(_Cross.ts:220-222) · 2순위 종단 임시 횡단 창 Profile_CrossModal.ts(같은 그림 함수). 지금 값 = 묶음 pipelineCrossAt(_Cross.ts:193-217) → stationSection(…, {}, …)(logic/B05_Profile_Pipeline_Detail.ts:177-212) · 계획고 · 횡단 설계 입력 반영됨 · 그림 = 원지반 · 설계선 · 요약 한 줄(_Cross_Draw.ts:111-228) · 구조물 없음(제원 {} · _Cross.ts:204) · 포장 · 면적 · 축 없음. 막힘: 저장 노선이면 노선 번호 모름(_Cross.ts:102-103) · station_id 겹침(카드 id cross-${id} :183 · clipPath :389 · cardZoomStates Zoom.ts:36 · setPickedLine :326-327 = B06 고름 풀림) · applyStructureAreas 원본 덮음(:513 · Cross_View_Frame.ts:101-121) · 구조물 자리 제어기 export 안 됨(B06_Section_Structure_Layouts.ts:46-72) · 크기 px 고정 → ResizeObserver(_Cross.ts:159-166). 권장: createPane.draw 에서 createCrossSectionCard(B06_Section_UI_Cross_View.ts:136-173) 읽기 전용(콜백 없음) · 단면 사본 {…s, station_id:"b05-"+id, design:{…s.design}} · design_pipeline_page.ts 접근자 shown ?? savedSource().detail · Structure_Layouts 제어기 셋 export(+culvertLinkFor) · _Cross_Draw.ts 남김(임시 횡단 창). 시험 test_b05_routeedit_cross_width(helper 갱신) · test_365_page_pipeline · test_368_3_cross_modal · test_368_4_probe_station · test_342_1_station_line. +14: 까닭 = 탐색 꺾임점 = 노드(4 m 격자 16방향 TURN_COST 1.0 · Search.py:32-34) · _trace(Pool.py:120-148) 노드마다 곡선 · 꺾이면 늘 곡선(9-07 지시 polyline.py:50-57) · 측점 맞춤 갈래(Station.py:370-396) 곡선 수 줄이는 목표 없음 · MC 간격 ≥20 m(:333). 검증_sub1 실측 earthwork 1167 m 곡선 38(31 m/곡선 · MC 간격 20 m 26/37 · 같은 방향 이웃 17 · 교각 ≤25° 20 · 곡선 길이 <20 m 35) · weighted 1090/35 · gentle 1151/33 · gradeline 1171/30 · follow 1080/25. 지식DB: 내각 155° 이상 곡선 생략 가능(별표2 :154 · 평면선형.md:26·29) · BC·MC·EC 보조측점(노선측량.md:143-144) · 곡선 최소 길이 · 곡선 사이 직선 = 임도 근거 없음(KDS 44 20 10 :95-101 참고만) · 복심곡선 정의(용어해설.md:87). 후보 A 같은 방향 이웃 곡선 합치기(직선 <20 m · 이탈 ≤6 m ROUTE_STATION_SNAP_MAX_GAP_M · 기울기 안 나빠짐 · S자 안 합침 · 상한 38→21 · 35→19 · 33→19 · 30→15) / B 교각 ≤25° 생략(9-07 사용자 반대) / C 곡선 최소 길이 30 m(근거 없음 · 너무 많이 걸림). 권장 A: snap_curves_to_stations(Station.py:505-531) 앞 합치기 한 바퀴 → 기존 측점 맞춤 · 실패면 합치기 전 선 · ALGO_VERSION 5→6(Store.py:36) · 새 시험(fixtures/b05_364_5_unsnapped_req239.json) · 손 편집 스냅엔 안 넣음. + +## 6장 옛 시험 실패 셋 (241 답) + +302_1(+302_4 같은 까닭): ReferenceError window is not defined — A00_Common/device_context.ts:54 · :123 init() 즉시 window (9423bd420 기기 대응) · 시험 node 묶음만 · 고침 = window 없으면 건너뜀(2~3줄) → 302_1 · 302_4 함께 풀림. +254_1: assert "data.bases.length > 0" in B08_Quantity_UI_Milestone.ts — 5e25f418c(302-3)가 B08_Quantity_Milestone_Table.ts:56 로 옮김 · 동작 같음 · 시험 :208 찾는 파일 고침. +52_6: 맹암거 암거 높이 기본값 3 (마스터 구조물정의.json 688 · 697 = 사용자 4baf49ba4 요구 223) vs 시험 None · 시험 비교에서 default 뺌(마스터 실제 값 기대 금지) · 마스터 설명 글 「기본값 근거 없음」 어긋남 = 사용자 M02 몫(알림).