diff --git a/docs/raw/조사/2026-10-16_351_요구235_분석.md b/docs/raw/조사/2026-10-16_351_요구235_분석.md
new file mode 100644
index 000000000..7beed526e
--- /dev/null
+++ b/docs/raw/조사/2026-10-16_351_요구235_분석.md
@@ -0,0 +1,117 @@
+# 요구 235 · 236 분석 (2026-10-16 · 브레인 · Explore 일곱 갈래 · 읽기만)
+
+- 원문 = docs/raw/요구_1010_2/사용자요구_1010_2.md 235 · 236 · 계획 = PLAN.md 351~360.
+- 8장(236 데스크탑 옛 판 대조)은 따로 붙임.
+
+## 1장 노선 추천 (235-1 · 235-3 추천 쪽)
+
+- #1 대부분 있음(PLAN 327 · f127c0179 · c4a09c1ca · 1fcdf5aa4): 결과 = 입력 지문 키 B05_Profile/route_recommend/<키>.json · 업로드 체인 끝에서 기본 알약 5개 미리 셈(Service_Chain.py:343-353 → Router_RouteInitial.precompute_defaults :175-189) · 모달 누름 = 저장본 0.0~0.2 s.
+- 남은 틈: ① B04 재확정 체인(B04_PreProcess_Router.py:263-268 → Service_Chain.py:442-679)이 미리 셈 예약 안 함 → 지형 바뀐 뒤 첫 누름 40~80 s(성공 끝 :665 뒤 예약 3줄) ② 343-2 「종류마다 최근 2벌」 정리가 기본값 결과를 안 지킴(Store.py:37,137-151 · 지금은 지형 None/las/sheet 로 우연히 갈림) → 기본값 건너뛰는 한 줄 ③ 저장된 제약(initial_choice.json)이 있으면 모달이 그 값으로 열려 키가 미리 셈과 다름 → initial_choice 제약으로도 미리 셈(선택).
+- 덤: B01 노선 사용 범위 고쳐도 expected_route.csv 를 다시 안 써 추천 시점·종점 옛 그대로(별도 흠 후보 · Service_Chain.py:231-235 · B01_Dashboard_Router.py:355-381).
+- 다섯 갈래: 예상노선 추적 = build_planned_polyline(0.4 s) · 영선/토공/기울기 = 후보 묶음 Pool.py:152-231 + pick · 비중 = 가중합 Pool.py:270-287 · 큰 R widen Radius.py:75-110(이탈 4 m) · 균형 종단 DP Profile.py:238 · 첫 셈 39~82 s · 다른 갈래 6 s.
+- 키 = _pool_key(지형 서명 + 예상노선 + 제약) + 갈래 · 비중 · 종단 반영 · 설계속도 · ALGO_VERSION=2(Store.py:34).
+- 제한값 칸 Recommend.ts:83-111,267-290 · 비우면 프로젝트 기본(Router_Replan.py:133-195) · 사용자 칸만 initial_choice.json(노선 저장 때).
+- #3 없음: 326 측점 스냅 = 호 안 측점 하나를 MC 로 옮김(반대 방향 · No.N+d). MC 를 일반측점에 두는 로직 · R 개수 ≤ 측점 수 제한 없음. 1153 m 노선 곡선 50개 중 39개 호 안 측점 없음.
+- #3 위험: R 만 바꿔선 MC 거의 못 옮김(dMC/dR = Δ/2 − tan(Δ/2)) → 교각점(IP) 옮김 필요 · 앞 곡선이 뒤 누가거리 바꿈 → 시점부터 차례 · MC 사이 20 m 미만이면 곡선 합침/끔 · 「꺾이면 늘 곡선」(common_util_route_polyline.py:51-57) · 법정 최소 R 과 부딪힘.
+- 「측점 스냅 풀고 특정 지점 옮기면 뒤 측점 미세 이동」 해석: (가) 뒤 측점 번호 다시 매김 = 라벨=누가거리÷20 규약 깨짐(B05~B08 · 구조물 3+18 입력 · 횡단 파일 이름) / (나) 노드 옮기면 뒤 측점이 따라감 = 지금도 그러함(MC 는 측점에서 벗어남).
+- #3 권장: 서버 _trace(Pool.py:103-132) widen 뒤 「곡선 MC → 20 m 측점」 단계 · 차례 · 남는 측점 없으면 곡선 합침/끔 · 이탈 4 m 안 IP 밀기 + R 다시 맞춤 · 실패면 원래 선 · build_planned_polyline(simplify=False) 로 다시 짜 TS 짝 안 고침 · ALGO_VERSION 3 · 확인: 모든 곡선 MC 누가거리 % 20 ≈ 0 · 곡선 수 ≤ 내부 일반측점 수. 모달 미리 보기에 원호 없음(Recommend.ts:333 · planned 그리면 한 줄).
+- 시험: test_route_initial · test_224_3_recommend_store · test_224_4_recommend_radius · test_343_2_persist_keys · test_63_4_route_profile · test_77 · test_78 · test_345_4 · test_b05_routeedit_initial(_roundtrip) · test_342_2_chain_once · test_224_2_station_snap · test_b05_routeedit_frame_mirror · test_route_polyline_* · test_272_1_station_list · test_343_4_derived.
+
+## 2장 B05 배치 · ☰ · 분석 지형 · 되돌리기 (235-2 · 10 · 13 · 14)
+
+- 감쌈: design_page.ts:113-121 → design_view_profile.ts:468-471 .b05-route__main → :522-530 mountRouteEditor → B05_Profile_UI_RouteEdit_Chrome.ts:57-135 .b05-routeedit 하나.
+- 「컨테이너」 = .b05-routeedit__box(Chrome.ts:60 · Style_RouteEdit.css:15-26 테두리 · 둥근 모서리 · 바탕) · 바깥 .b05-routeedit padding 8 · gap 8(:4-11). 「띠」 = .b05-routeedit__head(Chrome.ts:61-93 · css:29-52 ·
계획노선
+ 도구 묶음 한 줄 · 아래 테두리 · flex-wrap 이라 [저장 전으로] 둘째 줄).
+- 캔버스 = canvas-wrap(css:54-67 · ResizeObserver RE:307-309 · fitCanvas RE:300) · 처음 그림/[맞춤] 85%(logic/B05_Profile_RouteEdit_Fit.ts). 글판: [?] 좌상(Chrome.ts:96-105) · 회전 단추 우상(:106-111 — 지도 안 ↶↷ 모양은 회전) · 상태 · 범례 좌하 · 잰 값 우하.
+- 오른쪽 aside.b05-routeedit__side-wrap(Chrome.ts:129-133 · css:216-239 · 452 px · 지도를 밂) = 지금 횡단(지금 · 이전 두 판 · B05_Profile_UI_RouteEdit_Cross.ts:161-218 · 서버 POST /route/cross-preview) · 「횡단」 단추 = 이 칸 접고 폄(Chrome.ts:137-145 · 처음 1500 px 이상만 펼침). 아래 종단 판 = 이미 덮는 판(B05_Profile_UI_Style.css:41-57 · z 3).
+- 3D 오버레이 양식: B05_Profile_UI_Panel_View.ts:30-107(.b05-route__view-controls > __view-group · 유리 단추 · __view-separator) · css Style.css:182-246(absolute · top/left 16 · z 2 · 34 px · ☰ 비킴 --wf-burger-pad :195-197 · 휴대폰 :621-629) · 유리 단추 ui_template_elements_styles.ts:71-83.
+- #2 게으른 안: Chrome 의 head · h3 지움 · 도구 묶음을 canvas-wrap 안 b05-route__view-controls 로(☰ 비킴 · 크기 따라옴) · ghost → glass · divider → view-separator · .b05-routeedit padding/gap 0 · box 테두리/바탕 걷음 · [?] 는 도구줄 아래 · 횡단 = side-wrap 을 absolute top/right/bottom · z ≤ 2(아래 종단 판 z 3 이 덮음 · 234 규칙) · 겹침 손봄(회전 단추 우상 · 잰 값 우하 · R 라벨 판 밑 · CurveBar.ts:143-148). 큰 안(B06 카드 한 장 · createCrossSectionCard) = L · 값 다를 수 있음 → 지금 부품 그대로 추천.
+- #10: ☰ = app_shell.ts:150-173(header · Esc 듣기 :175) · 프로젝트 쪽 css :506-526(위 줄 0 · ☰ 화면 고정 (8,8) 36×36 · z 1 · 서랍 위 남음) · 변수 --app-burger-inset 52(device_context.css:89-98) · --wf-burger-pad(workflow_layout.css:140-155). 좌측 패널 제목 줄 ui_template_overlay.ts:180-196([h2 제목][프로젝트 이름]) · css overlay.css:107-114 · :557-565(☰ 자리 52 px 비움). 즉 지금도 ☰ 는 제목 왼쪽에 떠 있는 단추. DOM 으로 넣으면: 패널 접으면 ☰ 도 사라짐 · 열린 서랍이 패널 안 ☰ 를 덮음 · test_device_drawer.py:59,73-75,112 · test_device_audit.py:128 깨짐 · Esc. 로고: 프로젝트 쪽은 위 줄 로고 숨김(:512-514) · 서랍 첫 줄만(:188-190 · css :534-538 왼쪽) → 「우측맞춤」 = align-self:flex-end.
+- #13 원인: 열 때 기본값을 영구 pref 에 씀(RouteEdit.ts:639-642 · pref 「routeedit-terrain」 = localStorage + 계정 · b_page_state.ts:76-77) → 기본값이 고른 값처럼 굳음 · 저장 체인 실패 때 서버만 되돌림(Replan.py:452-456) · 계정 동기화 값 안 맞춤 → 고르기 「수치지형도」 · 종단·횡단·3D · 상태줄은 라이다. ② 바꿈 처리(RE:672-685)가 계산 묶음에 안 알림(PP:566) ③ 어긋난 채면 changed() 참 → 다음 [저장]이 말없이 설계 지형을 수치지형도로. 라이다 유무 = 서버 Router_Terrain.py:261-282 sources 에 "las"(surface_confirmation.py:110-116 · 업로드 las_free). 고침: 사용자가 바꿀 때만 씀 · 통을 draft(세션)로 · 열 때 쓰기 지움 · 고른 값 없으면 null(서버 None = 설계 지형) · 바꿀 때 묶음에 알림 · 곁 흠: 설계 지형 수치지형도인데 라이다 고르면 확정 모델 등고선 + 「LAS 등고선」 글(RE:646-649).
+- #14: 단추 Chrome.ts:86-91(data-act 배선 · History.ts:155-190) → 글 ↶/↷ + aria-label(선례 Profile_Tools.ts:173-175 · 단축키 표기 평면 Ctrl+Y / 종단 Ctrl+Shift+Z) · [저장 전으로] = RE:287-293 history.reset(History.ts:48,118-126 · Draft.ts:102-106) → 지우면 reset 죽은 코드 · 함께 지움.
+- 시험: #14 test_b05_routeedit_chrome_modal.py:37,41,70 · test_346_4_one_undo.py:57-59 + helper:155-158 / #2 test_345_5_plan_full_overlay.py:26-48 · chrome_modal:46-57 · test_b05_routeedit_initial.py:211-215 · test_345_5c · 345_5b:128-140 · test_349_0h · test_b05_routeedit_view / #13 test_133_1:158-174 · test_133_2:290-297 / #10 test_device_drawer · test_device_audit.
+- 위험: RouteEdit.ts 693줄(새 코드는 Chrome/CSS 쪽) · 띠 지우면 도구줄이 패널 접힘 때 ☰ 와 겹침 → --wf-burger-pad 필수(3D 클래스 재사용이면 저절로).
+
+## 3장 평면 R · 절/성토선 · 등고선 고정 · 3D 등고선 (235-3 · 4 · 5 · 6)
+
+- #3 곡선: IP 마다 원호 하나(logic/B05_Profile_UI_RouteEdit_Curve.ts:226-327 ↔ common_util_route_polyline.py:579-745 · 거울 test_route_polyline_browser_mirror). 초안 칸 curveOn · curveRadius · curveLock(radius|arc) · curveArc(applyArcLocks → R) · stationSnap(design_pipeline_types.ts:64-78 · Edits.ts:31 · :72-87). 측점 = BP 부터 20 m 격자(Frame.ts:97-110 ↔ Sections_Core.py:95-101) · 관·구조물 소수 측점(Sections_Stations.ts:293-308 ↔ Sections_Core.py:383-402).
+- 지금 스냅 = 측점이 곡선으로(MC 로 옮김 · Frame.ts:160-176 ↔ Sections_Core.py:291-313 · test_224_2) — 요구는 반대(곡선이 측점으로 · 326 때 「수십 곳 동시 불가」로 버린 안 · docs/raw/조사/2026-10-15_326_측점스냅.md:10).
+- ∂MC/∂R = Δ/2 − tan(Δ/2): 60° 에서 0.054 m/m · 30° 0.006 → R 만으론 못 옮김 · IP 를 들어오는 접선 따라 ±10 m 밀기 + R 맞춤 + 측점 안 남는 곡선 합치기 · 앞→뒤 차례.
+- 자리: 추천 = 서버 단독(Pool.py:103-132 _trace · 예상노선은 RouteInitial.py:318-322 follow_line · 본보기 Radius.py widen · 화면은 flattenServerPlan 그대로 → TS 짝 불필요 · ALGO_VERSION 올림). 직접 편집(스냅 켬일 때 맞춤까지) = logic/ 새 TS + 파이썬 짝 + 거울 · apexLock · curveLock 존중.
+- 「발자국(…) 뒤 측점 미세 이동」 해석 (A) 스냅 끔 + 점 옮김 = 측점이 새 노선 따라 흐름(지금도) / (B) 옮긴 측점 뒤 격자 다시 매김(20k 정의와 부딪힘).
+- #4 이름: 단추 하나 B05_Profile_UI_RouteEdit_Chrome.ts:83-84(글 + title) · 시험은 data-act="footprint". 셈: 측점 횡단 → 한 줄(logic/B05_Profile_PlanFootprint.ts:171-198) → 측점 + 2 m 이음(:226-279) → lineTo(Footprint.ts:84-90).
+- 각짐 · 꼬임 원인: ① 측점 사이 오프셋 직선 보간(PlanFootprint.ts:108-118) ② 측점 자리 ±1 m 평균 법선 vs 사이 점 선분 법선(routeFrame :96-106) → 톱니 · 곡선 지운 자리 끊김/겹침 ③ 5° 편 원호 위 2 m 간격(:248) ④ 안쪽 비탈 끝 오프셋 > R 이면 중심 넘어 접힘(거름 없음) ⑤ 깎기↔쌓기 바뀜 자리 직선 이음.
+- 권함: 오프셋 보간 단조 3차(PCHIP · 측점 값 그대로 지남 · test_b07_plan_kinds:109) · 사이 점도 ±1 m 법선 · 진행 거스르는 점 버림(접힘 제거) · 곡선 구간 촘촘히 · 짝 B07_DesignDetail_Engine_Cad_PlanSlope.py:29-196(B07 계획평면도 · route_frame 은 라벨 · 대피소에도 → 새 함수) · 3D · B06 안 씀 · B07 저장본은 [업데이트] 때 바뀜.
+- #5: 클릭 = 가닥 고름 · 빈 곳 = 풂(Pointer.ts:220-236 · 6 px) · 같은 높이 보라 2.6 px(Render.ts:211-221) · 이름표 :463-484 · 호버 없음 · 1 m 선 안 집힘 · 상태 RouteEdit.ts:191 · :523-525 · 지형 바꾸면 -1(:652-655). 권함: 잠금 = 높이값 · 페이지 동안만 · 잠긴 동안 다른 가닥 · 빈 곳 클릭 무시(Pointer.ts:231) · 호버 = hitPreparedLayer(B04_PreProcess_UI_MapRender.ts:220-265) · 자물쇠 = 캔버스 위 DOM 단추(aria-pressed · Label.ts:127-151 띄우기) · 새 파일(RouteEdit.ts 693줄).
+- #6: Viewer.ts:320-359 두 덩어리 · 주곡선 = level % (interval*5)(:342 · 간격 따라감) · 색 0xf59e0b/0xd97706 비슷 · 불투명 0.75 같음. 평면 = 5 m 고정(Contour.ts:36 · :76) · 5 m = --map-contour-major #818cf8 0.8 px · 1 m = minor 반투명 0.45 0.5 px · 실선. 바꿈: 주곡선 level % 5 고정 · 1 m 옅게 + 낮은 불투명 또는 LineDashedMaterial · 굵기 차이는 Line2 필요(안 씀). B04 3D 같은 코드(B04_PreProcess_UI_TerrainViewer_Contours.ts:96 · :160-172) 함께 여부.
+- 파일 크기: common_util_route_polyline.py 745(이미 초과 → 새 파일) · RouteEdit.ts 693 · Render.ts 631.
+- 정할 것: 예상노선 갈래에도 맞춤? (초기값 「같은 입력 → 같은 선」 약속) · 옛 측점 스냅 걷을지 · 지식DB 는 BC·MC·EC 를 보조측점(노선측량.md:144) — 사용자 규칙과 다름 기록 · 등고선 잠금 여러 높이? · 3D 색 남보라로?
+- 시험: #3 test_224_2 · route_polyline mirror · test_344_3_pipeline_stations_mirror · test_224_3 · test_224_4 · test_route_initial · test_74 · test_b05_routeedit_initial* / #4 test_346_2_plan_footprint_mirror · _footprint_stage · _footprint_draw(:101) · test_b07_plan_kinds(:109 · :207) · test_119_b07_plan_scale(:178) / #5 ui_checks/48-3 · test_b05_routeedit_pick · test_b05_routeedit_initial(:214) / #6 test_176_2_view_defaults(:24-27) · test_345_2_3d_modal.
+
+## 4장 종단 판 · 유토곡선 · 종단 상하 (235-7 · 8 · 9 · 15)
+
+- 종단도 = B05 · B06 같은 노드 하나(design_shared.ts:152-186 sharedProfile → design_profile.ts createDesignProfile · B06 Section_View_Profile 연결만) → 공용 한 곳 고치면 둘 다.
+- 배치: content(가로) = 종단 열 bodyWrap + 오른쪽 배수유역 판(design_profile.ts:179-196 · 자기 접기 손잡이 Drainage_Panel.ts:553-564) · bodyWrap = 도구줄 + 가로 스크롤러 body(그래프 + 구조물 레인 Render.ts:163-165,397-400) + 겹침 판 둘(design_profile_overlays.ts:57-63).
+- 유토곡선 = 스크롤러 · SVG 따로 · absolute 겹침 판(MassHaul.ts:211-252 · css Style_MassHaul.css:54-66,92-98) · X 같은 매핑(Render.ts:417-450) · scrollLeft 양방향 동기화(MassHaul.ts:294-310) · 높이 나눔이 그래프를 줄임(Heights.ts:66-180 · Drag.ts:137-198) · 표 판은 유토 판 위(Heights.ts:157 · TableOverlay.ts:105-110) · [창 분할] 있음(design_profile_popout.ts:135-162 · 단추가 유토 판 안 → 접으면 안 보임).
+- #7 「분리」 해석: A(추천) 배수유역도처럼 자기 판 · 겹침 없앰 · 종단 열 아래 칸 · 손잡이 · 높이 · 접기 따로 · 높이 나눔 · 표 쌓기에서 빠짐 · X 동기화 · 창 분할 유지 / B 종단 패널 밖 별도 패널(종단 접어도 남음). 고칠 곳 overlays.ts:48-59 · design_profile.ts:148-164,197-204,395-405 · MassHaul.ts:203-282 · slots.ts:42-47 · Heights.ts:70-157 · Drag.ts:137,148,174,196 · css MassHaul.css:47-66,145-163 · design_page.css:65-85 · popout.ts:155-160 · 방향키 판정 Cross_Panel_Base.ts:94. 위험: 판을 종단 루트 바로 아래 두면 종단 [창 분할] 때 숨음(design_page.css:49-51) · 시험 test_224_1b_masshaul_docked.py:55-68 · test_224_1c_subpanel_popout.py:73,106 · test_230_2_popout_frames.py:70 · test_233_4_empty_click.py:70.
+- #8: computeMassHaulSeries(mass_haul.ts:441-461 · 기본 두 기준) · 그리기 MassHaul.ts:406-411 · 범례 단추 계열마다(mass_haul_view.ts:772-774) · 배지 · 상단줄 이미 횡단(MassHaul.ts:336-343 · 349-361). 최소: :406-411 에 ["cross"] · 저장된 범례가 longitudinal 이면 빈 곡선 → readVisible(:170-182)에서 cross 로 맞춤 또는 b_page_state.ts:89-94 version 5→6 · 묶음(MassHaul_Stage.ts:44)은 두 기준 그대로 무해.
+- #9 원인(읽기만 · 브라우저 확인 필요): body 스크롤(design_profile_viewport.ts:38-49) → Render.ts:339-351 → 스크롤마다 massHaulUpdater(Render.ts:349,456-461) → MassHaul.ts:364 유토곡선 통째 다시 그림 · 한 틀에 1~2번 = 두 기준 다시 셈 + JSON.stringify(points)(Api_HaulPlan.ts:37-41,159-163) + 노선 전체 폭 SVG 측점마다 새로(mass_haul_view.ts:552-582) + 범례 새로(495-500) + replaceChildren + scrollLeft 강제 레이아웃(489-493) + 세로 창 미끄럼으로 다음 틀 또(503-509 · view.ts:88-101). 토량 분배 켜면 fitAll(445-462 · 보이는 칸만 · 측점선 없음 · 동기화 끊김) → 가벼움(사용자 관찰과 맞음). 동기화 메아리: MassHaul.ts:294-303 · TableOverlay.ts:129-136 syncing 동기 플래그인데 scroll 은 다음 틀 → 한 틀 전 값을 body 에 되씀 → 뒤로 튐 → Wheel.ts:63 휠 감속 멈춤 → 끊김(표 열려도 같은 길). 유토 접혀도 스크롤마다 횡단 적분 + stringify(374-377 · 349-361 헛일).
+ - 고침: ① massHaulUpdater = 유토 열림 · 분배 맞춤 아닐 때만 · 한 틀 한 번 · 다시 셈 없이 축만 ② 동기화 = 내가 써 넣은 값으로 온 scroll 무시하는 공용 도우미(Wheel.ts) · 유토 · 표 같이 ③ #8 로 한 기준만. 확인: 휠 굴리며 runs.at(-1).work["유토곡선"] · 매 틀 body.scrollLeft 기록 · 4경우(표 켬/끔 × 분배 켬/끔) · 메아리 시험 = helper_230_1_popout_wheel.cjs 가짜 스크롤러에 다음 틀 scroll.
+- #15 모델: 기본 계획선 = 모든 측점이 변화점(Engine_Grade_Profile.py:173-197) · 꺾이는 곳마다 기본 L 15 m 종단곡선(config_system_design.py:620,628 · TS Alignment.ts:290-352) · 편집 = station_offsets(기준선 대비 표고차 · resolvePvi 261-282) + curve_radii. 지금 ▲ = adjustStation(Alignment.ts:556-584) 그 측점 하나 → 직선화된 구간(Straighten.ts:161-181)이 P±1 에서 꺾임.
+ - 해석: P 가 R 있는 점(꺾임 · pvi[i].curve_r_m ≠ null)이면 좌우 같은 기울기 마디를 건너뛴 다음 R 점(없으면 시점 · 종점)을 축 · 사이 측점을 새 직선(L→P′ · P′→R) 위로 · 사이 R 키 지움 · P 가 직선 안쪽이면 지금 그대로 · 처음 계획선은 마디마다 R → 축 = P±1 → 지금과 같음(직선화 뒤만 달라짐).
+ - 재료: detectStraightRun(Straighten.ts:80-115) · withOffsets · place(141-153 · 219-224) · controlElevationAt(Alignment.ts:593-596) · 0.1 m 맞춤 되먹임 그대로 · 부르는 곳 셋(▲▼ Render.ts:388-391 · 표 값 입력 :198-199 · 방향키 Panel_Tools.ts:230) → adjustStation 자체를 고치면 셋 다 · 파이썬 짝 없음(서버는 편집 델타만 · Engine_Grade_Profile.py:467-497).
+ - 정할 것: 「R 있는 점」 = 기하 꺾임(추천) vs 명시 curve_radii 키(지금 설정에선 같음) · 긴 직선 통째 돌면 최소 흙덮기 · 기울기 상한 막기(design_profile.ts:328-345) 더 걸림 · 구간 안 관 측점도 돎. 시험 새 helper(helper_215_1_free_profile.cjs 방식) 세 경우 · 영향 test_193_1_line_axis.py:83 · helper_219_1_arrow_owner.cjs:36 · test_b05_min_cover_guard · test_215_1_free_profile · test_213_1/2.
+
+## 5장 B06 맹암거 · 중심점 · 키 강조 (235-16 · 17 · 18)
+
+- #16 지금: 맹암거 모양 = 그림 전용 TS(B06_Section_UI_Cross_Underdrain.ts · 파이썬 짝 없음 · 수량은 m 길이 · common_util_structure_lengths.py:3). underdrainOutline(:86-104) → sidePath(:45-83): 노면 끝 밖 설계선이 높으면 절토 → 사면 아래로 늘여 옵셋선과 만남(:59-65) · 낮으면 성토 → 설계선 따라 옵셋선(노면 − 높이)에서 멈춤(:66-82) · 원래 규칙 요구 183-3(사용자요구_1010_2.md:214). 노면 기울기 방향 = 노면 끝 원지반 높이 비교(common_util_cross_design_geometry.ts:178-181 ↔ B06_Section_Engine_Design_Geometry.py:102-104 · 「전체 횡단」 아님). 낮은 쪽 노면 끝이 절토면 노면을 같은 기울기로 늘여 원지반과 만나는 점 tilt_reach(G:267-296 ↔ Py:199-204 · 출력 common_util_cross_design.ts:597-608 ↔ Engine_Design.py:548-556).
+- 흠: 양측절토 + tilt_reach → 낮은 쪽이 「성토」 갈래 → 늘인 노면은 옵셋선과 평행 · 안 만남 → reach 너머 원지반을 따라 내려가 굴착 밖 자연지반 아래 돌 무늬. reach 없으면 양쪽 절토 연장 → 출구 없는 사다리꼴.
+- 「성토선」 뜻: (A 권장) 낮은 쪽으로 늘인 노면선(reach 너머 늘이면 성토가 되는 선 · 원지반과 만나는 점 = tilt_reach · 요구 188 에서도 「성토부 방향」 :219) → 「높은측」을 출구에서 위 선(노면 연장)으로 읽든 「낮은측」 오기로 읽든 같음 / (B 글자 그대로) 상류(높은) 쪽 — 양측절토엔 성토선 없음 → 정의 불가.
+- 구현(A): Underdrain.ts:96 line 에서 reach 너머 점만 거름(2~3줄 · 꼬리 처리 :81 이 수직으로 닫음) · 짝 선례 fordEdges(B06_Section_UI_Cross_Ford_Pavement.ts:138-145). 흐름 방향까지 「전체 횡단」으로 바꾸려면 G:179 / Py:103 을 표본 양끝 비교(groundSpan)로 · 짝 · 물넘이포장도 바뀜 → 지금 규칙 유지 권함.
+- 시험 test_288_underdrain_cross.py:119-131 · helper_288_underdrain.cjs:55-67 에 양측절토 + reach 더함 · test_306_underdrain_pick · (방향 바꾸면) test_b06_cross_design_mirror.py:253-281 · test_294_3_ford_extend_chute · B07 Cross_Overlay.ts:493 같은 그림 함수 → build:b07-extent 다시 지음.
+- #17 지금: 카드 중심 십자 g.b06-chart__center(B06_Section_UI_Cross_View_Frame.ts:42-59) 누름 처리 없음 → 카드 클릭(View.ts:187)으로 · 이미 고른 카드면 선택 풀림(Section_View.ts:301-309 · 작은 흠). 노면 고르면 높이 축(Design_Pick.ts:110-115) · ▲▼ = 종단 계획고(:541-553) · ◀▶ 막힘(:506-517). ▲▼ 는 종단도 창 키 듣개(B05_Profile_UI_Profile_Panel_Tools.ts:315-355 · 계획고 :221-232 · test_219_1_arrow_owner.py:77 고정) · ◀▶ 는 종단도 누른 뒤만(:234). 두 축 끌기 부품 snapAxisDrag/bindDragHandle(Panel_Base.ts:142-241).
+- 좌우 = 평면 노선 이동: RouteDraft 노드(design_pipeline_types.ts:64-78) 주인 = B05 편집기(applyEdit RE:455-463 · 노드 끼움 :546-555 · spliceNode Edits.ts:286) → Draft.ts:60-89(되돌리기 :88) → bridge.edited → pipe.update("route")(PP:558-580) · 바뀐 범위 = 첫 바뀐 점 ~ 끝(Pipeline_Grade.ts:44-50) = 「뒷번호 변경」 · 조용한 갱신은 이미 됨(B06 카드 다시 그림 Station_Swap.ts:24-71 · 측점 id 누가거리 기반 → 고름 · 줌 유지) · 평면 자리 stationFrameAt(Frame.ts:60-81 · +offset = 좌).
+- 제안 모델: ① 카드 중심 판정 원(8 px) · 페이지 한 칸 고름(setPickedLine 꼴 · 노면 판정보다 위) ② ▲▼ 지금 길 ③ ◀▶ · 가로 끌기 → routeShiftAt(측점, Δ)(편집기가 host 등록 · setBermPickHost 꼴 DP:332-342) · P' = 중심 + Δ·좌측벡터 · 0.5 m 안 노드면 옮김(고정 노드면 안 옮김) · 곡선 구간 안이면 그 교각점 · 둘 다 아니면 노드 끼움 ④ 끄는 동안 그림만 · 놓을 때 한 번 커밋(이력 한 덩어리). 복잡도 중~상.
+- 위험: B06 바로 열면 편집기 · 묶음 없음(PP:184-186 · ensureView("profile") 로 숨긴 채 세움 · 3D 포함 첫 누름 느림) · 좌우만 옮겨도 그 측점 계획고가 바뀔 수 있음(바뀐 구간 첫 계획선 새 지반 맞춤 Pipeline_Grade.ts:114-149) → 높이 보정 고정할지 · 측점마다 노드 늘고 곡선 켜짐(235-3 R 규칙과 부딪힘) · 구조물 20 m 넘게 멀면 토스트(「조용히」와 어긋남) · 놓을 때 커밋 권함 · #15 가 계획고 조정 함수를 바꾸면 중심점 ▲▼ 도 따라 바뀜.
+- 시험 test_137_design_pick · test_193_1_line_axis · test_219_1_arrow_owner · test_b05_routeedit_frame_mirror + 새 helper.
+- #18 원인: 카드 tabIndex = 0 + Enter/Space 선택(View.ts:186-190) → 마우스 누름 뒤 아무 키 → :focus-visible → 전역 outline 2px --color-focus-ring(ui_template_theme.css:520-523 · 자수정/라벤더) → 고른 카드 빨강(Style_Cross.css:256-259)과 다른 색. 카드 키 동작 = Enter/Space 선택 토글뿐(옮김 없음) · ▲▼ 계획고는 창 듣개. 고침(권장): View.ts:186 · 188-190 지움(초점 없앰) · 대안 .b06-cross-card:focus-visible{outline:none}. 영향: Tab 고르기 사라짐 · test_device_audit.py:62 셀렉터 수.
+- 정할 것(권장): #16 (A) reach 에서 끊음 · 방향 규칙 유지 / #17 노드 끼움·옮김 · 놓을 때 커밋 · 좌우 뒤 높이 보정 고정 / #18 카드만 고른 상태 ▲▼ = 계획고 유지(219-1).
+
+## 6장 설정 · 단축키 · 버튼 이름 (235-11 · 12 · 27)
+
+- #11 서랍 [설정] A00_Common/app_shell.ts:209-215 → 창 A00_Common/app_settings.ts:92-159 · 틀 ui_template_modal.ts:27-62(actions = [닫기] 왼쪽). 크기 다른 까닭: 저장 = filled size sm(.ui-btn--sm · ui_template_elements_styles.ts:37-41) · 닫기 = ghost md(:17-32). 저장 = 입력 설정 input-prefs {wheelZoom, cadAliases}(:52-55 · 132) · 별칭 틀리면 CAD 탭 · false. 고침 두 줄: size:"sm" 지움 · onClick: () => save() && modal.close()(실패면 창 남음). 시험 test_app_settings.py 144-152 · 169-177 고쳐 씀(저장 뒤 창 0 · 다시 엶).
+- #12 지금: MOUSE_RULES ul/li 글(app_settings.ts:33-38 · 76) · KEY_ROWS table 한 칸에 「 · 」로 여럿(41-49 · 81-89) · 글 ui_template_locale_common.ts:117-179. 「단추」 = :120 제목 「마우스 단추」 · :121 · :122 · :124 · :147(오른쪽 0.4초 누름 → 오른쪽 버튼). 설명 수준 = 마우스 넷(121-130) · 단축키 일곱 줄(146-179 · CAD :167 한 칸 약 17개). 제안: 로케일 값을 「입력 = 동작」 한 줄씩 \n · 대체 키는 줄 나눔 · 칩(부품 없음 · 기본 kbd) · li grid(12em 1fr · nowrap) · 다른 곳 탭 = 자리마다 h4 + 줄 목록 · en 줄 수 맞춤 · 시험 영향 없음.
+- #27 버튼 라벨 323곳 · 서술형 의심 116곳(A00 7 · A01~A08 8 · B01 13 · B03 3 · B04 1 · B05 10 · B06 3 · B07 6 · B08 2 · B09 7 · B11 4 · M01 8 · M02 35 · ui_template 9) · 확실한 서술형 44종 약 50곳(표는 아래). 2순위 -기 꼴 약 65곳(지우기→삭제 · 찾기→검색 · 고르기→선택 · 만들기→생성 · 내려받기→다운로드 · 엑셀에서 보기→엑셀 보기) · 닫기 그대로.
+ - 표(현재 → 제안): 버리고 넘어감 → 폐기 · 저장 후 넘어감 → 저장(ui_template_leave_dialog.ts:33·38 · locale_m2:158·159) · 고친 것 버림 → 변경 취소 · 로직 더함 → 로직 추가 · 내 층으로 고쳐 씀 → 내 층 복사(M02_MasterTemplete_Hopyo_Ledger.ts:143·202·245) · 확인하고 사전조합 만들기 → 사전조합 생성(Hopyo_Check.ts:570) · 고른 N개 확인하고 만들기 · 이대로 N개 만들기 → 생성(N)(Hopyo_Sheet.ts:133·161·359) · 확인 창 열기 → 검토(:339) · 고른 N개 함께 → 일괄 적용(N)(Hopyo_Choose.ts:135·137) · 회사 등록하러 가기 → 회사 등록(Layer.ts:190) · 개인용으로 복사 → 개인용 복사(Layer.ts:207 · item_picker.ts:172) · 관리 화면에서 고치기 → 관리 화면 편집(item_picker.ts:173) · 새로 · 본떠 만들기 → 신규 · 복제(UI_Side.ts:113·114) · 다시 열기 → 새로고침(UI_Main.ts:140·593) · 통째 지우기 · 목록으로 → 전체 삭제 · 목록(Practice.ts:114·167) · 버리고 다시 읽기 → 새로고침(M01_MasterData_UI_Page.ts:183) · 못 이은 줄만 보기 · 후보 조건으로 연결 → 미연결만 · 조건 연결(M01 Rows.ts:191 · Pick.ts:55) · 저장 전으로 → 저장본 복원(RouteEdit_Chrome.ts:91 · #14 로 지움) · 곡선 지우기 · 곡선 넣기 → 곡선 삭제 · 곡선 추가(RouteEdit_Label.ts:330) · 다시 셈 → 재계산(Recommend.ts:194) · 유역 다시 나누기 · 선택한 관 삭제 → 유역 재분할 · 관 삭제(locale_b2:35·40) · 교체하고 계속 · 새 파일로 시작 → 교체 · 새 파일(B03 Upload.ts:61 · Page_Flow.ts:92) · 파일 입력 화면으로 · 그래도 화면으로 이동 → 파일 입력 · 계속(B11 Loading.ts:109·127) · 대시보드로 → 대시보드(B11:114·138 · b_page_scaffold.ts:85) · 탭으로 · B09 로 돌아가기 → 탭 이동 · B09 복귀(B09 Popup.ts:147 · Draft_Print_Page.ts:208) · 파일 올리고 이 프로젝트에 쓰기 · 기본으로 → 파일 업로드 · 기본값 복원(B01 AssetPicker.ts:315 · :73) · 이미 있는 회사인지 찾기 · 가입 안내 메일 보내기 → 회사 검색 · 초대 메일 발송(B01 Modals.ts:464 · :635) · 기본 도각으로 · 다시 불러오기 → 기본 도각 복원 · 새로고침(cad_host_frame_edit.ts:96 · ui_template_loading.ts:64) · 지움 · 색 지움 → 삭제 · 색 삭제(spreadsheet condfmt:252 · names:193 · validation:186 · sheet_extra:79) · 인증하고 로그인 · 이메일/비밀번호 다시 입력 → 인증 · 재입력(A06 Auth_Page.ts:140 · :91) · 이미 계정이 있으신가요? 로그인 → 로그인(A07 :199 · Page.ts:132).
+ - 하드코딩 라벨(Hopyo_* · RouteEdit_* · AssetPicker)은 로케일 규칙 밖 — 로케일로 옮길지(양 늘어남) 정할 것 · en 값 함께 · 물음 창 키 M02_Tree* 는 설정 창 · design_leave · M02 공용(값 하나 = 세 곳).
+- 「단추」 화면 글 18곳: 로케일 5(common:120·121·122·124 · m2:104) · 하드코딩 5(openwebcad commands.view.ts:46 · B09_Estimation_UI_Tabs_Bill_Level.ts:31 · M02 DF_Diagram_Parts.ts:63 · CardHelp.ts:68 · Labor_Diagram.ts:26) · 도움말 8(resources/help/B02~B09/00_설명서.md:7 「## 단추」).
+- 깨지는 시험: test_app_settings.py(#11) · test_b05_routeedit_chrome_modal.py:37 · test_m02_hopyo_screen.py:284·288·289·339 · test_303_b09_row_popup.py:252 · ui_checks 52-10:118 · 52-5:71 · 43-1:127 · 44-6:90 · 안전 = test_m02_leave_dialog.py:97(키만).
+
+## 7장 M02 일위대가 실무자료 (235-19~26)
+
+- 파일: TS M02_MasterTemplete_Hopyo_{Side,View,Sheet,Check,Choose,Ledger,Api}.ts · PY M02_Hopyo_{Excel,Stmate,Line,Match,Fit,Verdict,Build,Ledger,Store}.py · M02_Labor_Doc.py · M02_Labor_Router.py. 「실무문서」(Practice.ts · 옛 마스터 조합)는 다른 컨테이너.
+- #19 버튼 Side.ts:45-52 「엑셀 올리기」 filled sm(숨은 file :41-44) · 본뜰 = 구조물 조합 층 버튼 「마스터」 TreePanel_Roots.ts:60-82(size 없음 md · m02-layers__btn :78 · 줄 .m02-layers__row TreePanel.css:26-38 · 선례 ItemPick.ts:6,96) · 바꿈: 「파일 업로드」 · sm 지움 · m02-layers__btn · title · 주석. 「상세도 있음」 = 코드상 올리기 버튼은 이 한 곳 → 뜻 확인 거리(상세 창에도 업로드를 두라는 뜻일 수 있음).
+- #20 갈래 규칙: 엑셀꼴 Excel.py:145-164 「단산N참조」 검사가 재료비 검사보다 먼저 → 재료비만 있는 줄도 단가산출 · 비고 빈 줄은 같은 이름 블록에 이어짐(:225-238) · STmate Stmate.py:168-174 D 코드면 단가산출. 자재 · 별도계상 줄 = Line.py:218-219 → _material(:174-189) → Match._exact(Match.py:280-291 · 이름 + 규격 같거나 같은 이름 하나일 때만 맞음 · 아니면 후보 :294-323) · 단계 필터 안 탐(338 설계 :192). 실측(북부청 HP-000002): 자재·별도계상 고유 30줄 = 맞음 2 · 후보 16 · 없음 12 · 레미콘(25-21-120) 「별도계상」 = 서울/인천/부산 사급 동점 2.65(지역 못 가림) · 면목 0.03×0.03×0.0424 = 규격 여럿 정확 0 · 큰돌 · 조약돌 = 없음. 화면 「안 됨」 = 대상 없으면 체크 꺼짐(Check.ts:101-106 · 356) · 「가까운 것 없음」(Choose.ts:225). 섞인 설치 줄(P.V.C파이프설치 재료비 95% · 와이어메시바닥깔기 79% 등 5줄) = 갈래 단가산출 → 후보 로직뿐(Verdict.py:183-213) · 자재 찾기는 갈래 자재·별도계상일 때만(Choose.ts:25 · 212-216).
+- 우리 별도계상: 자재 세 칸(Labor_Doc.py:51-56) 자재구분(관급/사급) · 별도계상(별도계상/직접계산 · 기본 별도계상 :56) · 운반비(포함/미포함) · 셈에서 빠짐 :229-255 · 화면 Labor_MatMarks.ts:19-55 · 사용자 자재 = 줄에 세 칸 · 로직 자재 = 자재표시{호표 차례:{세 칸}}. 가져오기 지금 Build.py:205-213 = 갈래 별도계상 → 「별도계상」 · 그 밖 「직접계산」만(관급 · 운반비 · 로직 자재 고름 · 자재표시 안 넣음).
+- 필터 강화 자리: 갈래 판정(「별도계상」 글 표시로 떼기 · 재료비 비율로 자재 가림) · Match._exact/candidates(지역 · 관급/사급 꼬리 · 규격 숫자 · 단위) · 고르기 창(단가산출 줄에서도 자재 고름).
+- #21: 파일 줄 누름 Side.ts:99 → show()(:106-121) → 본 칸 호표 표(View.ts:76-164) · 올린 직후는 표 + 엑셀 보기 둘 다(Side.ts:80-83). 바꿈: 줄 누름에서 openHopyoSheet(:82-83 꼴). 표가 맡던 것 새 자리: [지우기](View.ts:166-182) · 검산 어긋남 글(:140-160) · 셈 중 표시(:115-139) · 본 칸 확인 창(:185-196) · 고름 표시(Side.ts:145-150).
+- #22 단계 필터: 있고 연결됨(단산 · 기계 · 직접 호표 줄만) — Verdict.block(Verdict.py:98-157): 이름 · 근거 차례 b_order(Match.py:373-412) → 지문 순위(Fit.py:190-232) → 합침 + 같음 1위(Fit.py:255-264) → 조합(:125) → 옵션 거꾸로(:126) → 딱 맞음 먼저(:133-137) → 판정(:160-180) · 경로 올리기(Labor_Router.py:207-208) · 보기(Line.py:50) → ensure → 뒤 셈(Fit.py:362-384) → 캐시 tmp/m02_hopyo/맞춤__<판>_2.json. 증거: 북부청 50/50 맞음 24 · 다른 점 15 · 후보 11 · 338-1 실측 사람 정답 126줄 1순위 93.7%.
+ - 그래도 안 된 것처럼 보이는 까닭(체크 제안 113/415 = 27%): ① 자재 78 + 별도계상 64줄(34%) 필터 밖 ② 장부 짝이 숫자 판정보다 먼저(Line.py:211-217) · storage/1/3/templates/실무자료/맞춤.json 에 오늘 19:59 옛 324 꼴 3줄(GF000166 · GF000160 · GF000218) → 숫자 판정 「맞음」과 달라 42줄 「별칭」 · 체크 안 함(:262-267) · 지금 코드엔 그 꼴 쓰는 길 없음(어느 서버가 썼는지 확인 거리) ③ storage/1/10 층 파일 2개 판 2 캐시 없음 → 처음 열면 셈 중 ④ 목록 숫자(_brief Line.py:247-249) 와 확인 창 숫자(_numeric :147-148) 규칙 달라 68개 중 15개 다름 ⑤ 단산 맞음인데 환산 없음/추정 12줄.
+- #23 확인 창 머리(Check.ts:633-645): 체크 · 갈래 · 품명 · 규격 · 수량 · 단위 · 상태 · 우리 로직·배 · 옵션 · 품 비교 · 버튼. 드롭다운(:362-378 · OUT :54) 「넣음」 · 「뺌 — 우리에 없음」 · 「뺌 — 안 씀」 → 「추가 · 로직없음 · 사용안함」(서버 값 같은 낱말 Labor_Router.py:343 · Build.py:172,255 · Ledger.py:29 · Ledger.ts:27 · Api.ts:190,233 → 화면 글만 바꾸면 저장 값 그대로). 품비교 = 엑셀 품 → 우리 품(compareText Check.ts:145-164 · 서버 _qty Line.py:96-115). 본뜰 표 = 일위대가 상세 logicTable(Labor_Rows.ts:332 · 머리 :522-531) · matTable(:553-640 · 머리 :626-636 · 세 칸 · 가격 5) · 금액 = LaborCalc(초안 셈 길 따로 필요) · Check.ts 691줄 → 쪼갬.
+- #24 지금: [고른 n개 확인하고 만들기](Sheet.ts:133,160-163) → review()(:302-373) 펼침 표 → [확인 창 열기](:338-352) · [이대로 n개 만들기](:358-365) → makeAll(:376-422). 수정 버튼 자리 = 목록 줄(:183-216)의 제N호표(:205) 뒤 → openHopyoCheck(Check.ts:673-691) · stopPropagation(:194 꼴). 「저장」 = 고른 호표마다 readHopyoOne(:306-314) 뒤 바로 makeAll. 만들기 = POST /hopyo-build(Api.ts:311-320 · Labor_Router.py:363-377 · Build.py:300-314) · 사전조합 SC-###### · 구분 「실무자료」 · 덮어씀 · 별칭 장부도 · 하위 호표부터. 「체크된 항목」 두 겹: 호표 체크 + 줄 체크(확인 창 캐시 m02-hopyo-check:… 없으면 서버 제안) · 체크 줄 없는 호표 건너뜀 · 하위 확인 전이면 409.
+ - 위험: 펼침 표 = 338 원칙 「확인 없이 들어가는 줄 0」의 확인 단계 → 없애면 확인 창 안 연 호표도 제안대로 만들어짐 → 확인 물음 하나 또는 「확인 창 연 호표만」 규칙.
+- #25 숫자 Sheet.ts:207 = [체크 제안 수 / 줄 수](Api.ts:37-38 · Line.py:297-301) · 녹색 = 같을 때 클래스 + var(--color-success)(Hopyo.css:115-119). 「다 연결」 뜻 정할 것: % 줄 · 노임 줄은 늘 0 → 영영 녹색 안 됨 · 0/0 자동 녹색 · 목록 ≠ 확인 창 숫자(#22-④).
+- #26 별칭 장부 = 「엑셀 품명 → 우리 단가산출 로직(또는 자재)」 짝 기억 수첩 · 확인 창에서 짝 고르고 [만들기] 누르면 그 층(개인 · 회사 · 마스터) 장부에 한 줄 · 다음에 품명 · 규격 · 단위 같은 줄이 나오면 그 짝 먼저 제안(상태 「별칭」) · 내 층이 위 층보다 우선 · 좌측 [별칭 장부] = 보고 고치는 화면(Side.ts:53-62 · Ledger.ts:314-352 · {층}/실무자료/맞춤.json) · 헷갈림 = 일위대가 상세 「별칭」 칸(로직 줄 옆 이름표 = 엑셀 품명 40자 · Build.py:258)과 같은 낱말 · 장부 [로직 더함]은 로직만(자재 짝 못 더함 · Ledger.ts:199-210).
+- 시험: test_m02_hopyo_screen.py(글 :287-289 · :281-282 · 금지 글 :273-280 · Side :308-312 · Labor_Detail 693 고정 :317 · 700 :324 · CSS 토큰 :326 · lazy :335-337) · helper_m02_hopyo_{check,seam,pick}.cjs · test_m02_hopyo_{seam,flow,build,ledger,match(:153 면목 · :192-196),excel(:60-80 · :77 레미콘),stmate,golden(:44-48 · 로직 줄만 · 자재 정답 표 새로)}.
+- 위험: #21 본 칸 표 제거 → [지우기] · 검산 · 셈 중 · 확인 창 · 고름 표시 새 자리 · #23 초안 금액 셈 길 · Check.ts 691 쪼갬 · #20 로직 자재와 같은 품목을 사용자 자재로 또 담으면 400(Labor_Doc.py:20-21) · 레미콘 지역 = 로직 입력(자재지역) 몫 · storage 공유 · 서버 여러 판(확인 포트 · 판 맞춤) · 옛 꼴 장부 3줄 정리 여부.
+
+## 8장 데스크탑 옛 판 대 지금 후보 대조 (236)
+
+- 결론: 사용자 말 반은 맞음 — 새 판은 정답을 1위에 훨씬 잘 올림(북부청 임도 정답 있는 49줄: 1순위 14 → 48 · 다섯 안 26 → 48) · 그러나 2~5위에 이름 · 뜻이 다른 로직이 많이 섞임(보이는 후보 중 뜻 낱말 안 겹침 0/196 → 102/247 = 41% · 이름 닮음 평균 0.45 → 0.29 · 사방도 89/210 = 42%) → 「유사 로직 찾기」로는 옛 판이 낫게 느껴짐. 옛 판 재현이 336 「330 앞」 수치(28.6 / 53.1 / 89.8%)와 같아 믿을 만함.
+- 예: N009 구조물되메우기 — 옛 = 되메우기 · 되메우기(노상재) · 되메우기 및 다짐(소형/대형) · 지하수 폐공 되메우기 / 새 = 되메우기(정답) · 야면석 채집 · 방제 소각 · 표토펴기 · 용수 암절취 · 훈증더미 제거. N017 다웰바 · N051 표지판 같은 꼴. 반대로 N047 흙깍기 · N039 비탈면보호공 → 잔디붙임은 새 판만 맞힘 → 뜻 낱말 겹침은 정답 신호 아님(숨김 · 1위 다시 고르기에 쓰면 안 됨).
+- 까닭: 옛 = 이름 같음/씨앗 → 이름 후보 다섯(9edaec82e:M02_Hopyo_Match.py:391-411) · 뜻 낱말 거름 모든 후보(:307) · (이름, 단위) 접힘(:318) / 새 = 숫자 지문 순위(Fit.py:227-232 · 1,438 로직) + 이름 · 근거 덤 최대 1점(:255-264) → Verdict.py:111-120,152 · 이름 무게 0.6 / 전체 약 9.5(Fit.py:35-44) → 이름 식구가 2~5위에서 밀림 · 거름은 이름 후보에만(Match.py:305 · 숫자 · 판정 후보엔 없음 Verdict.py:183-213 · 근거 후보는 직종만 겹쳐도 통과 Basis.py:241-243) · 로직 안 접음(Match.py:316 · 책(산림/건설) 화면에 안 보여 겹친 것처럼 · Choose.ts:165) · 「같음」 상태 없어짐 · 후보 6개(덧 「근거 안 닿음」 Verdict.py:153-156) · [다른 로직 찾기] 찾기 칸에 조항 번호 미리 넣음(Choose.ts:99-103,218-220 · 모든 낱말 맞아야 걸림 ui_template_logic_find.ts:44-47 → 0건 위험) · 셈 중 ↔ 끝 뒤 목록 바뀜(Line.py:222-224).
+- 엑셀 단가산출(출처 · 옵션): 옛 판은 단가산출 시트를 안 읽음(9edaec82e:M02_Hopyo_Excel.py:71). 새 판 읽기 = Basis.read:101-150(블록마다 출처 · 직종 · 글 · 금액 · 출처 sources:71-84 「…품셈」 뒤 조항 · 오타 고침) · Excel.read_book:292-297,309-315(줄에 근거 · 단산) · Finger._text:158-235(직종 품 · 장비 시간 · 자재 · 율 · 계수 · 조건 · 옛 판 여부). 쓰임 = 출처: 근거 후보 · 같음 검사 · 조항 점수 1.5 · 다른 점 판정 · 별칭 근거 다름 / 옵션: 조건 점수 0.6 · 위 다섯 로직 옵션 거꾸로 찾기 · 입력값 출처 「블록」.
+- 「출처 → 옵션 → 이름 → 규격 → 단위」 차례 거름망은 제안된 적 없음 — 거름망은 재서 안 맞다고 판정(단위 거름 −7.9%p · 점수 문턱 숨김 · 방법 칸 깎기 −2.4%p · 「엉뚱한 후보 몰래 숨김」 금지) · 출처 고친 줄 약 25% · 출처 없음 11 · 옛 판 5 → 출처로 거르면 놓침 → 지금은 점수 채널로만.
+- 권장(되돌리지 말고 합침 · 아무것도 숨기지 않고 근거를 차례로 보임): ① 이음(블록 없으면 2·3 건너뜀) ② 출처: 같은 책 · 조항/윗마디(Basis.candidates · 옛 판 글/출처 없음이면 건너뜀) ③ 옵션: 지금 판정 그대로(1위 · 맞음/다른 점) ④ 이름: 옛 324 후보 다섯(hm.candidates(line,"로직",got,5) 재사용) + 같은 이름이면 책 표시 ⑤ 규격 → 입력값 · 단위 → 환산 = 꼬리표만. 화면 = 1위 + 판정 / 「출처 같음」 / 「이름 닮은 로직」(옛 데스크탑 목록) / 「숫자만 닮음」(접고 꼬리표) · 새 무게 없음 · 묶음은 표시로만(조항 ≥ 0.9 · 판정 · 뜻 낱말 겹침).
+- 가장 작은 고침: Line._numeric · _names_only 에 이름후보 · 후보마다 뜻겹침 표시(보기 때 셈 · 캐시 판 안 올림) · Hopyo_Api.ts 두 칸 · Choose.ts 「이름 닮은 로직」 묶음 · 뜻겹침 없는 「후보」 판정은 회색 뒤로 · 같은 이름 책 표시 · 찾기 칸 미리 채움 = 조항 대신 이름 낱말.
+- 시험: test_m02_hopyo_match(이름후보 = 옛 데스크탑과 같음 · 되메우기 다섯 · 다웰바 변형 · 「뜻 낱말 안 겹치면 후보 아님」 그대로) · test_m02_hopyo_golden(후보 뜻 겹침 비율 기준 지금 59% · 옛 다섯 ⊂ 후보 ∪ 이름후보 · 1순위 ≥ 116 · 다섯 안 ≥ 122 그대로) · test_m02_hopyo_basis(출처 같은 후보는 숫자 달라도 다섯 안) · test_m02_hopyo_screen + helper_m02_hopyo_check(묶음 · 꼬리표 · 책) · test_m02_hopyo_seam(이름후보 칸).
+- 덧: 데스크탑에 HEAD 를 올려도 거기서 옛 판으로 올린 HP 파일은 「숫자 판정 없음」(338 8-2-10) → 다시 올려야 함.