Files
Aislo/docs/raw/plans/2026-10-24_plan_335-518.md
T
eomsangdonandClaude Opus 5.5 a147cd62b2 chore(계획): 요구 336 — PLAN 끝난 절 138 통째 · 섞인 절 13 끝난 줄 이관
- 472-2 · 4 · 5 · 6 = 아래 줄 모두 끝 · 체크
- 477-3 = 사용자 확정(docs 는 raw 만 · 문서 사이트 · 위키 안 씀) · 체크
- PLAN.md(git 밖) 1525 → 145 줄 · 남은 미체크 19 그대로 · CODEX 절 안 만짐

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 09:49:41 +09:00

1559 lines
356 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 계획서 완료 이관 (10-24 · 요구 336)
절 이름만 = 끝난 절 통째 · 「(일부)」 = 끝난 줄만 · 남은 줄은 PLAN.md.
## 335. CAD 입력 보강 — 상세 검토 (요구 225-3 · 브레인 · 코드 X) — (일부 · 남은 줄은 PLAN.md)
- [x] 335-1 검토 — 오토캐드 71 가지 대 우리(있음 2 · 일부 28 · 없음 41) · 흠 12(급한 셋 = Ctrl 조합이 명령 글자로 쌓임 · 보기 전용이 그립 · Delete · 특성으로 고쳐짐 · 그립 누름만으로 점 밀림) · 묶음 일곱 · 정할 것 14 — 근거 docs/raw/조사/2026-10-15_335_CAD입력보강_검토.md(부록1 오토캐드 · 부록2 우리 현황).
- [x] 335-3 재조사 — 새 입력 방법 53 줄(쓸모 상 20 · 우리 없음 38) · 새 흠 H13 치수 글 = 종이 길이 · H14 B07 횡단 좌우 = B06 거울(둘 다 코드 확인) · 묶음 ⑧ 실제 값 입력 · ⑨ 기기 무관 입력 · ⑩ 임도 표기 도구 · 새 차례 · 정할 것 15~23 — `docs/raw/조사/2026-10-15_335_재조사_CAD입력.md` · 부록3 원문.
- [x] 335-4 다시 조사(335-3 범위 어긋남) — 오토캐드 마우스 · 키보드 조작 146(명령 31) 대 우리 있음 26 · 일부 69 · 없음 51(보강 쓸모 상 40) · 흠 30(H1~H12 남음 + N1~N18 · 급한 일곱) · 묶음 일곱(⓪ 흠 → ② 명령 중 키 → ⑤ 명령 옵션 → ① 숫자 → ③ 마우스 → ④ 단축키 → ⑥ 켬끔 · 어림 28 일) · 정할 것 24 — `docs/raw/조사/2026-10-15_335_다시조사_오토캐드마우스키보드.md` · 부록4.
## 336. M02 외부 일위대가 — 이름 맞춤 개선 상세 검토 (요구 225-4 · 브레인 · 코드 X) — (일부 · 남은 줄은 PLAN.md)
- [x] 336-1 검토 — 실측 세 파일 126 줄: 1순위 41% → 지금 71% · 다섯 안 60% → 87% · 이름 다듬기 · 손 사전은 효과 0 또는 해로움 · 묶음 넷(① 근거 쪽 서버 고침 = 1순위 86% · 다섯 안 94% ② 고르기 창 손질 ③ 회사별 맞춤 기억 넓히기 ④ STmate 꼴 읽기 = 실무 내역 9 중 6 이 올리기부터 막힘) · 정할 것 11 — 근거 docs/raw/조사/2026-10-15_336_외부일위대가_이름맞춤_검토.md(부록1 실측 · 부록2 바깥 방법).
- [x] 336-3 재검토 — 원본 로직 안 고침 · 맞춤 쪽 묶음 쌓기로 1순위 71.4 → 92.9% · 다섯 안 86.5 → 96.8% · 호표 조합 맞음 9.6 → 75.9% · 편의대로 바꾼 꼴 확인(이름 116 · 묶음 40 · 품 바꿈 32 / 126) · 묶음 ① 근거 고침 ② 로직 지문 ③ 조합 풀이 ④ 조건부 기억 ⑤ 읽기 넓힘 ⑥ 고르기 창 · 정할 것 풀림 4 · 새 4 — `docs/raw/조사/2026-10-15_336_재검토_로직조합맞춤.md` · 부록3 원문.
- [x] 336-4 목적 다시 고민 — 목적 = 실무 엑셀 일위대가를 우리 사전조합(로직 + 옵션 + 수량)으로 옮김 · 고른 짝은 별칭 장부 · 확인한 줄만 들어감 · 228 확인(옵션만으로 엑셀 품 그대로 58% · 덧셈 20% · 원문 대조 14 = 우리가 원문과 같음) · 묶음 A 확인 규칙 + 확인 창 → B 인용 조항 맞대기 → C 별칭 장부 → D 지문 + 옵션 찾기 → E 한 줄 여러 로직 → F STmate · 거창 · 기본안 다섯 — `docs/raw/조사/2026-10-15_336_목적다시_외부일위대가.md` · 부록4.
## 365. 평면 > 종단 <> 횡단 한 방향 · 캐시 · 고리 (요구 240-4 · 8 · sub7 · Opus high)
- 정함(브레인): 계산 길 하나 = 평면(노선) → 종단 → 횡단 · 종단 ↔ 횡단은 지금처럼 서로 실시간 · 횡단은 평면을 안 움직임(예외 356-3 중심점 ◀▶ = 평면 입력 · 같은 입구 한 바퀴) · 묶음 주인 = 페이지(B05 · B06 어느 쪽으로 들어와도 · 새로고침도 초안 기준) · B05 오른쪽 횡단 판 = 묶음 횡단 · 고리 = 입력 지문 대 파생 지문 · 다르면 한 바퀴 · 최대 3 · 넘으면 알림 · 끄는 동안 선만 · 놓을 때 한 바퀴 · 근거 `docs/raw/조사/2026-10-17_365_요구240_분석.md` 1장.
- [x] 365-1 묶음을 페이지가 세움(B06 바로 열기 · 새로고침 = 초안 셈) · 초안 동안 저장 노선 횡단 캐시 안 덮음 — 확인: B06 바로 열기 + 노선 초안 → B06 카드 = 초안 측점 · 계획고 시험 · 새로고침 뒤 같음.
- [x] 365-2 횡단 고침 → 묶음 cross 입력(초안 동안 B06 고침 보임) · 들어올 때 · 바뀐 뒤 지문 고리 — 확인: 바퀴 수 시험(같은 입력 = 0 바퀴 · 넘으면 알림).
- [x] 365-3 B05 오른쪽 횡단 판 = 묶음 횡단(서버 cross-preview 지움 · 노선 · 계획고 바뀔 때마다) — 확인: 판 계획고 = B06 카드 계획고.
- [x] 365-4 한 바퀴 정리 — 계획고 한 번 = 횡단 계산 한 벌 · B06 다시 그림 한 틀 한 번 · 중심점 좌우 = 묶음 한 바퀴 — 확인: 바퀴 · 그림 횟수 · 끌기 · ▲▼ 시간 전후.
— 검증완료 — test_365 12 · 관련 555 통과 · typecheck 0 · ORCA 검증_sub7 · 끌기 놓음 1바퀴 124~156 ms · 저장 ▲ 1바퀴 125 ms(cross 5.4) · 초안 ▲ 94 ms · B06 고침 1바퀴 116 ms · 들어올 때 0바퀴 · B06 새로고침 = 측점 · 계획고 같음(세월교 곁 면적은 먼저 연 보기 따라 다름 · 남음) · 판 20+0 = 카드 · 세션 상세 = 저장 노선.
- [x] 365-5 들어온 화면 무관 같은 면적 · 초안 소단 고침 — 확인: B05 먼저 · B06 먼저 · 새로고침 면적 같음.
— 검증완료 — test_365 14 · 관련 574 통과(남 3 = 323-9 · 369-2 · 367-3 몫) · typecheck 0 · ORCA 검증_sub7 B05 끌기 · B06 먼저 · B05 먼저 새로고침 = 67 측점 계획고 · 절토 · 성토 같음(±0.01) · 열 때 1바퀴 414~451 ms · 초안 소단 = 구조물 구간 · 쪽 깊이 고침 1바퀴(Node 시험) · 세션 비우고 탭 닫음.
## 366. B05 평면 — 등고선 자물쇠 · 도구줄 · R 일반측점 (요구 240-1 · 3 · 11 · sub1 · Opus high)
- 정함(브레인): 자물쇠 = 가닥을 고른 때만 클릭 자리 옆(잠긴 높이 가닥을 다시 고르면 풀기 자물쇠 · 다음 클릭 · 휠 · 떠남에 숨김) · 도구줄 = [?] | ↶ ↷ | 3D | ⟲ ⟳ · 1m 등고선 · 절/성토선 · 거리 재기 | 측점 스냅(분석 지형은 있을 때 맨 오른쪽) · [맞춤] 지움(처음 열 때 맞춤은 그대로) · 측점 스냅 켬 = 곡선 가운데(MC)를 가까운 일반측점에(놓을 때 · 고친 IP 부터 끝까지 IP 를 들어오는 접선 따라 ±간격/2 · 고정 IP 안 움직임 · 못 놓는 곡선은 그대로 + 상태줄 「측점 밖 곡선 N개」) · 끔 = 자유 · 추천 [적용] 땐 안 맞춤 · 근거 2장.
- [x] 366-1 등고선 자물쇠 고른 때만 — 확인: test_353_2 고쳐 씀 · 지나기만 = 안 뜸.
- 검증완료 — 지나기 안 뜸 · 고른 가닥 클릭 옆 · 잠금 뒤 빈 곳 · 다른 높이 = 숨김 · 고름 유지 · 같은 높이 = 풀기 · 휠 · 떠남 0.7 s 숨김.
- [x] 366-2 평면 도구줄 순서 · 구분선 · [맞춤] 지움 · [?] 도구줄로 — 확인: 순서 · 구분선 4 시험 + 화면.
- 검증완료 — 화면 차례 그대로 · [?] 펼침 · 회전 동작 · 밝음/어두움.
- [x] 366-3 측점 스냅 = R 일반측점(새 logic 파일 · 상태줄) — 확인: MC % 간격 ≈ 0 · 고정 IP 그대로 · 곡선 수 ≤ 측점 수 Node 시험 + 화면 IP 끌기.
- 검증완료 — 켬 = 측점 밖 곡선 26 → 3(앞 30 m 에 몰린 셋) · 맞춘 23곡선 MC 잔차 ≤ 0.009 m · 시종점 그대로 · IP 밂 ≤ 8.8 m · IP 끌기 = 앞 IP 그대로 · 끔 = 끈 IP 하나만 · 되돌려 원래 1078.0 m.
## 367. 종단 판 — 유토곡선 · 창 분할 · 자유지정 되돌리기 · 녹색 (요구 240-2 · 23 · 18 · 19 · sub2 · Opus high)
- 정함(브레인): 유토곡선 = 늘 전체 맞춤 보기(측점 연계 보기 · 스크롤 동기 · 측점선 지움) · 기본 = 횡단 기준 + 토량 분배 켬(저장 범례 판 올려 새 기본) · [토량 분배] = 분배 그림(평형선 · 띠 · 장비 도형) 보임/숨김 · [도형 위치 초기화] = [횡단 기준] 왼쪽 · [창 분할] = 펼친 때만(접으면 손잡이만) · 자유지정 동안 ↶ ↷ · Ctrl+Z · Ctrl+Shift+Z = 자유지정 안에서만(범위 · 시작 · 점 한 걸음씩 · 끝 = 큰 이력 한 걸음 · 막히면 열린 채) · 자유지정 선 · 점 · 미리보기 = 녹색(--color-success) · 범위 띠 보라 · 기울기 넘음 빨강 그대로 · 근거 3장.
- [x] 367-1 유토곡선 보기 · 기본값 · 버튼 자리 — 확인: test_354_1 · 354_3 고쳐 씀 + 화면.
- [x] 367-2 [창 분할] 펼친 때만 — 확인: 접음 = 단추 없음 · 높이 0 시험.
- [x] 367-3 자유지정 되돌리기 · 다시하기 — 확인: helper_215_1 ⑥(점 둘 → ↶ → ↷ → 새 클릭이 ↷ 지움 · 큰 이력 안 건드림).
- [x] 367-4 자유지정 녹색 — 확인: 밝음 · 어두움 색 시험.
- [x] 367-5 종단 판 접은 뒤 횡단 카드 누름 — 확인: 접은 뒤 카드 자리 elementFromPoint = 카드
- 검증완료 — 까닭 = 종단 판 높이 transition(07-28 · 294151f862 부터 · 367-2 무관)이 그려지지 않는 탭에서 시작을 못 해 접어도 820px 그대로 → column 이 누름 받음 · transition 지움 · 시험 옛 CSS 실패 · 새 CSS 통과 · 화면(검증_sub2 · 5177) 펼침 820 · 접음 1 즉시 · 카드 네 자리 = 카드 · 진짜 누름 카드 고름 · 유토 판 열린 채 · 어두움 · B05 평면 같음.
- [x] 367-6 유토 손잡이 · 범례 안 겹침 — 확인: 범례 단추 셋 elementFromPoint = 단추
- 검증완료 — 범례 자리 = 손잡이 오른쪽부터 · 좁으면 줄 바꿈 · 시험(360 · 434 · 700 · 1162px) 단추 셋 + 손잡이 = 자기 · 1162 한 줄 · 옛 CSS 360 에서 [횡단 기준] 실패 · 화면(검증_sub2 · 5177) B06 · B05 좁은 칸 434 = 셋 줄 · 넓은 칸 1162 = 지금 한 줄 · 진짜 누름 [토량 분배] 끔 · 켬 · [횡단 기준] 누름 닿음 · 어두움 같음.
- 검증완료(367): 시험 · typecheck 통과 · 화면(검증_sub2 · 5177) 유토 폭 1162 = 칸 폭 · 측점선 0 · 범례 [도형 위치 초기화][횡단 기준][토량 분배] 기본 켬 · 접음 높이 0 · [창 분할] 숨김 · 자유지정 ↶↷ · Ctrl+Z · Ctrl+Shift+Z · Backspace · 새 클릭 ↷ 지움 · 비어도 큰 이력 안 감 · Enter = 큰 이력 한 걸음 · 선 · 점 밝음 #1f8a4c · 어두움 #3fbb6f · 띠 보라 · 넘음 빨강.
## 368. 종단 R 넣기 · 원지반 점 횡단 · 추가 측점 (요구 240-20 · 21 · sub6 · Opus high)
- 정함(브레인): 직선 안 측점 ▲▼ = 그 점에 R(기본 L) · 좌우 다음 R 점(없으면 시점 · 종점)이 축 · 사이 점 새 직선 위(355 「직선 안쪽 = 그대로」 뒤집음 · 꼭짓점 아닌 자리도 같은 규칙) · 원지반선 아무 점 클릭(도구 꺼진 때 · 정수 m) → 종단 칸 안 작은 창 = 그 자리 임시 횡단(지금 계획선 · 브라우저 같은 계산 · 격자 없으면 서버 미리보기) + [측점 추가] · [삭제] · [닫기] · 추가 측점 = 일반측점(카드 이름 빈칸 · 이름 「12+7」) · 종단 세로선 = 일반측점 색 점선 · B06 횡단 목록에 섬 · 노선 바뀌면 관 · 구조물처럼 좌표로 따라감 · 같은 m 이면 막음 · 끌기 없음 · 삭제 = 작은 창 + 우클릭 · [저장] 한 번 · 근거 4장.
- [x] 368-1 ▲▼ 직선 안 = 그 점 R · 이웃 R 축(Pivot) — 확인: helper_355_1 ③ 바꿈 · ④ 더함.
- 검증완료 — test_355_1 5 통과(직선 안 80 · 꼭짓점 아닌 70: +0.1 · 축 40 · 100 그대로 · 사이 점 새 직선 위 오차 < 1e-6) · 193_1 · 234_1 · 344_2 · 349_0v 통과.
- [x] 368-2 추가 측점 자료 · 심기(측점 한 벌 짝 TS ↔ 서버) · [저장] · 좌표 따라감 — 확인: 거울 시험 test_272_1 · 322_3 · 344_3 에 추가 측점 경우.
- 검증완료 — 거울 272_1 · 322_3 · 344_3(추가 측점 경우 · 같은 m 관 이김) · test_368_2(정수 m · 좌표 · 노선 +10 m 따라감) · 저장 차례 · 묶음 넷 다시 지음 통과 · 322_0_golden 1 실패 = 표 고르기 목록(borrow_pit) — 이 일과 무관.
- [x] 368-3 원지반 점 작은 창 · 임시 횡단 · [측점 추가] · 점선 · 우클릭 삭제 — 확인: 시험 + 화면(추가 → B06 카드 → 삭제 → 되돌리기).
- 검증완료 — 검증_sub6 화면: 원지반 27 m 누름 = 작은 창 「1+7」 · [측점 추가] = 점선(일반측점 색 rgb 184,134,11 · 5 3) · ▲ = 27 키 하나 · B06 카드 1+7 이름 빈칸 · [저장] 뒤 새 탭 그대로 · 우클릭 「측점 삭제」 · 되돌리기 · 다시하기 · 2+0 자리 [측점 추가] 막힘 · 어두움 · 작은 창 그림 = 저장 계획선 기준(지금 계획선 브라우저 셈은 안 함) · 값 되돌림(추가 측점 · 27 계획고 · 옮겨진 기타 구조물 지움 · 관 초안 정수 m 맞춤은 저장됨).
- [x] 368-4 작은 창 = 지금 계획선 — 확인: ▲ 뒤 창 계획고 = 카드 계획고
- 검증완료 — test_368_4(측점 틀 · 반경 · 확폭 = 추가 측점 묶음 측점) · 322_0 golden 다시 뜸 통과 · 검증_sub6 화면: 27 m 창 계획고 869.728(= 묶음) → 1+0 ▲(저장 안 함) 뒤 869.968 바로 바뀜 · [측점 추가] 뒤 B06 카드 869.9677(차 < 0.001 · 사면 11.72 · 절토 2.76 · 성토 13.07 같음) · 저장 안 함(서버 그대로).
- [x] 368-5 test_323_9_save_redraw 깨짐 = 가짜 저장 단계에 plusStations 빠짐(진짜 GET → 오류 알림) — 확인: helper 에 가짜 단계 · 코드 안 고침.
- 검증완료 — test_323_9 세 파일 · test_368_2 · test_design_store_save 22 통과(기대 차례 그대로).
## 369. 배수 구조물 자리 — 기본 = 세류선 교차만 · [자동 제안] 두 방식 (요구 240-7 · sub5 · Opus high)
- 정함(브레인): 자동설계 · 노선 [저장] · 추천 [적용] · 스냅샷 없는 [초기화] · [배관 배치 초기화] = 세류선 교차 자리만(100 m 보충 · 오목 보충 끔) · 배수유역 머리 [자동 제안] → ① 전체 자동(세류선 + 100 m 규칙으로 다시 · 같은 자리 관 속성 · id 유지) ② 지정 포함 추가(지금 관 그대로 + 빈 구간 보충) · 결과 = 초안(캐시) · [저장] 때 정본 · 되돌리기 한 걸음 · 제안 목록 [적용] = 관경 · 시설만(관 자리는 [자동 제안]) · 새 관 = 등록부 기본값 · 간격 100 m(env) · 이미 저장된 관 · 초기값 그대로 · 근거 7장(지식DB 배수시설_배치.md:55,60 교차점 필수 · 간격 보충).
- [x] 369-1 서버 auto 칸(없음 = 세류선만 · all · add) · 노선 저장 오목 보충 끔 · 새 관 기본값 — 확인: 세 모드 시험 · test_346_3 고쳐 씀.
- 검증완료 — test_369_drainage_auto 6 · test_346_3 두 벌 25 · 배수유역 시험 12 벌 81 통과 · typecheck 통과.
- [x] 369-2 배수유역 [자동 제안] 두 방식 · 제안 [적용] = 관경 · 시설만 — 확인: 화면(① · ② · 되돌리기 · [저장] 뒤 정본).
- 검증완료 — 검증_sub5 화면: 초기화 관 1 → ② 관 11(새 관 Ø1000) · ① 관 11(세월교 352 m · 같은 자리 관경 유지) · 되돌리기 · 다시하기 한 걸음씩(세월교 되살아남) · [적용] = 시설만 · 어두운 화면 · 시험 349 · 347 · 369 통과.
- [x] 369-3 [업데이트] 진짜 누름 — 확인: 관 표지 위 단추 누름 = 계산 시작
- 검증완료 — 검증_sub5 화면: 관 표지 7 을 [업데이트] 한가운데 아래로 옮기고 진짜 누름 → pointerdown · pointerup · click 모두 옴 · drainage/live 1회 · 세부유역 11 · [자동 제안] 켜짐 · test_369_3 2(옛 코드 = 실패 재현) · 347_2 · 349 흐름 15 통과 · typecheck 통과.
- [x] 369-4 배수유역 판 홀로 서기 — 369-2 가 `B05_Profile_UI_Drainage_Live.ts` 에서 종단 `_Profile_History` 를 직접 가져옴(test_b05_drainage_side 실패) → `_Panel_Types` 약속(콜백 · 창구)으로. 확인: test_b05_drainage_side 통과 · 되돌리기 화면 그대로.
- 검증완료: test_b05_drainage_side 4 · test_369_drainage_auto · test_346_4 · test_349 · 판 · SideTool 시험 160 통과 · typecheck 0 · Panel `pageReplaying` 도 약속(isReplaying)으로 · 화면 = 브레인 마무리(검증 대기).
## 370. B06 사면 이동 · 멈춤 · 선 고름 공용 칸 (요구 240-13 · 14 · 22 · sub4 · Opus high)
- 정함(브레인): 사면 이동 = 옮긴 노견에서 절/성 판정(짝 두 벌) → 넘어가면 그 쪽 사면 기울기로 원지반까지 · 측구 = 자동 판정 따름(사용자가 켠 측구 유지) · ◀▶ 가 절도 성도 아닌 점(노견 끝 = 원지반)을 지나면 그 점에 한 번 섬 · 쪽마다 설계선 ∩ 원지반 교차점 손잡이(늘 보임 · 고르면 ◀▶) · 절 ↔ 성 넘어가도 고름 유지 · 암 경계선 = 고름 · 방향키 ▲▼ · 세로 끌기(놓을 때 한 번) · 아래 띠 왼쪽 칸 = 공용 칸(안 고르면 암 ▲▼ · 고르면 그 선 제목 · 버튼 · 값 한 줄) · 우측 위 라벨 · 떠 있는 선 조정창 걷음(구조물 조정창 그대로) · 근거 5 · 6장.
- [x] 370-1 절 ↔ 성 넘어감 판정 차례(TS ↔ 파이썬 짝) — 확인: 거울 사례 「마루 너머 = 성토 1:n」.
- [x] 370-2 멈춤 · 교차점 손잡이 · 고름 이어받기 — 확인: Node 시험 + 화면.
- [x] 370-3 암 경계선 고름 · 키 · 끌기 · 공용 칸 — 확인: test_137 · 179_1 · 318 고쳐 씀 + 화면(밝음 · 어두움).
- 검증완료 — 시험 98 · typecheck 통과 · 검증_sub4 화면: 34+0(계획고 +1.0 임시) ◀▶ 1.3 → 1.356 멈춤 → 양측 성토 · 우 성토 1:n · 교차점 고름 유지 · 암 ▲▼ −0.5 → −0.3(계획고 그대로) · 끌기 −2.1 한 번 · 어두움 · 바꾼 값은 탭 캐시째 버림(저장 안 함) · 검증 대기.
- [x] 370-4 멈춤 자리에서 못 넘어감 — 브레인 화면: 검증_브레인232 54+0 좌 ◀ = 0.9 → 0.936 멈춤 뒤 ◀ 계속 눌러도 0.936(넘어가지 않음). 까닭: `extendStop` 멈춤값 0.001 m 반올림이 교차 앞에 떨어지면 남은 틈 > 1e-4 → 다음 걸음이 같은 교차를 다시 찾아 now 그대로. 고침: 멈춤 자리 판정을 379-1 「절·성토 없음」(±5 mm)과 같게 — 지금 자리가 그 안이면 next 그대로. 확인: helper_370_2 에 「반올림이 교차 앞」 사례(54+0 같은 꼴 · 0.936 다음 걸음 = 1.036) + 화면.
- 검증완료(370-4) — 잣대 상수 ON_GROUND_M 하나(extendStop · edgeOnGround) · helper 2.736 → 2.836(옛 잣대면 ≈ 2.737) · test_370_2 · 370_3 · 318 · 173 36 통과 · typecheck · 화면은 브레인 합친 뒤(검증_sub4 교차 측점 없음) · 검증 대기.
- [x] 370-5 넘어간 사면이 원지반과 못 만나면 고름이 풀림 — 브레인 화면: 검증_브레인232 54+0 좌 ◀ 0.94 멈춤 → 1.00 넘어감(370-4 통과) · 성토 사면 「사면 미교차」(20 m 안 못 만남 · 교차점 손잡이 없음) → 고름 풀려 공용 칸이 「암 경계」로 바뀜 · 같은 자리 단추를 계속 누르면 암 경계가 움직임(브레인이 실제로 −0.5 → −0.8 움직임 · ↺ 되돌림). 고침: 교차점 손잡이가 없으면 같은 쪽 사면 선(성토 키)으로 고름 이어받기 · 그것도 없으면 고름 유지한 채 ◀▶ 남김(암 경계로 넘기지 않음). 확인: 시험(손잡이 없는 넘어감) + 화면.
- 검증완료(370-5) — pickedLineAt 이어받기 = 같은 키 → 같은 쪽 손잡이 → 같은 쪽 첫 절·성토 사면 선(손잡이 키 고름도) · 시험 370_2 등 154 통과 · typecheck · ORCA 5179 검증_sub4 0+0 좌 손잡이 고름 ◀ +7.5 m = 「⚠ 사면 미교차」 · 손잡이 사라짐 → 공용 칸 「사면 이동 (좌)」 ◀↺▶ 유지(암 경계 아님) · ◀ 한 번 더 +7.6 · ↺ = 2.30 m 손잡이 고름 되돌아옴 · 캐시 지움 · 「둘 다 없음 = 고름만 유지」 갈래는 안 만듦(넘어간 성토 사면은 설계선 끝까지 그려져 늘 있음) · 검증 대기.
## 371. B06 벽 성토 이음 · 관 기울기 글 · 맹암거 하단 (요구 240-15 · 16 · 24 · sub8 · Opus high)
- 정함(브레인): 같은 벽 형상(관보호공 · 흙막이 · 옹벽 · BOX · 세월교 흙막이 · 다단 · 돌쌓기) 성토 위 이음 = 윗면 사면 쪽 끝에서 0.1 m · 바닥 추가 성토 시작 = 전면 경사 ∩ 하단 수평선(벽 발끝) · 기본 벽 자리 = 새 이음 기준(노폭 연장 0 유지) · 세월교 · 박스 수평공간 그대로 · 관 글 = 「… L=8 m (7.6), S=2.5%」(소수 한 자리 · 툴팁 매설 경사 지움 · B07 도면 안 넣음) · 맹암거 = 노면 표준(낮은 쪽 한 경사 · 측구 없음) · 암거 경사 = 맹암거 영역 하단 경계(높은 쪽 노면 끝 − 높이에서 경사로) · 3D · B07 같은 함수 따라감 · 근거 5 · 6장.
- [x] 371-1 벽 성토 이음 0.1 m · 바닥 시작 · 기본 자리 — 확인: test_b06_wall_shape_unified · helper_79/80/186_1 + 서버 묶음 다시 지음.
- 정함(브레인 답): 다단 사이 시작 = 늘 윗단 발끝(원지반 무관) · 마지막 벽 → 끝 구간 · 관 유출 벽 = 발끝이 지반 위에 뜬 벽만 발끝 · 선 · 묻힌 벽은 옛 시작(기준선 ∩ 전면).
- 검증완료 — 벽 · 관 · 다단 시험 137 통과(test_322_0_golden 1 실패는 고치기 전 코드도 같음 · 371 무관) · 관 길이 7.9 → 7.5 · 5.8 → 5.4 m · 화면(검증_sub8 4+5) 윗면 끝 ↔ 성토 이음 0.100 m · 윗면 폭 0.675 m.
- [x] 371-2 관 글 S= — 확인: 글 시험(세월교 · 박스 없음).
- 검증완료 — test_371_2_pipe_slope_text 4 통과(「…, L=8 m (7.5), S=0.9%」 · 역경사 S=0.0% · 관 숨김 글 없음) · test_225_1 통과 · 화면 4+5 「L=8 m (7.9), S=0.9%」 · 툴팁 매설 경사 없음 · 세월교 글 S 없음 · 어두움 읽힘.
- [x] 371-3 맹암거 노면 표준 · 하단 = 암거 경사 — 확인: test_288 · 349_0n 고쳐 씀 + B07 묶음.
- 검증완료 — test_288 · 349_0n · 314 · 286_1 27 통과(노면 5 % · 암거 3 % · 높이 1 m 하단 = 99.15 에서 3 % · 성토 교점 −4.39 m) · 묶음 셋 다시 지음 · test_52_6 1 실패는 M02 기본 3 % 탓(371 무관) · 화면 2+0 맹암거(저장 안 함 · 지움) 노면 3 % · 암거 8 % 하단 8.01 % · 높은 쪽 깊이 1.000 m · 경사 비면 하단 3.0 %(노면 평행).
- [x] 371-4 흠 아님(가린 B군 옛 종류 · 사람은 못 고름 — underdrain = 표 형상 none · 목록 hidden(223-2) · 드롭다운 option.hidden · 스크립트 select --value 가 고른 길 · 그리는 맹암거 = A군 cross_underdrain) · B06 폼으로 넣은 맹암거가 카드에 안 나옴 — 브레인 화면: 검증_브레인232 B06 구조물 배치 B · 맹암거 · 시작 6+0 · 종료 7+0 [추가] = 목록 「6+0~7+0 맹암거」 · 초안 type_id underdrain · options {} · 6+0 · 7+0 카드 · 상세 맹암거 그림 0 · 측구 그대로(새로고침 뒤도). 371-3 화면(2+0 · 저장 안 함)은 나왔음 — 길 차이 가림(높이 · 경사 빈 값 · 폼 길 · 다시 그림 차례) · 흠이면 고침. 확인: 화면(폼 길 · 높이 · 경사 빈 값/있음).
## 372. 이름 · M02 실무자료 · CAD 글 (요구 240-10 · 5 · 6 · 9 · sub3 · Sonnet high)
- 정함(브레인): 페이지 이름 「종단설계」 → 「노선설계」(좌측 패널 제목 · ☰ 단계 · 진행 표시 · 안내 · 메일 · 도움말 제목 · 영문 Route Design) · 하단 「종단 보기」 → 「노선 보기」(Route view) · 종단 그래프 · 종단면 · 단축키 「B05 종단」은 그대로 · M02 실무자료 [저장] 사전조합 = 로그인한 사람 개인 층(화면 층 무관 · [삭제]는 화면 층 쓰기 권한 때만) · 회사 · 마스터는 가져오기 길 · 그 복사에서 실무자료 표시 · 전국자재 지킴 · 단가산출 지정 영역 = B~F 열 · CAD 글 = 조합 없으면 종류 이름만(측점 맨 위 한 번 · 같은 측점 같은 종류 한 줄 · 저장된 칸 그대로) · 근거 2 · 6 · 8장.
- [x] 372-1 이름 바꿈 — 확인: 글 시험 짝(design_view_parity) + 화면. 검증완료 — 시험 통과 · 화면(B05 「노선설계」 · B06 「노선 보기」 · 진행 표시 「노선설계」).
- [x] 372-2 M02 개인 전용 · B~F · 복사 때 본뜬 지킴 — 확인: test_m02_hopyo_screen · seam 고쳐 씀 · 다른 층 화면에서 [저장] = 개인 층에 생김. 검증완료 — 시험 통과 · 화면은 개인 층 엑셀 보기 창만(회사 · 마스터 층에 실무자료 파일 없음 · 올리기 금지라 다른 층 [저장]은 시험으로만).
- [x] 372-3 CAD 글 종류 이름 — 확인: test_265 · 166_1 짝(TS ↔ 파이썬). 검증완료 — 시험 통과 · 8+13 세월교 상세 CAD 글 = 「세월교」.
## 373. B08 거리이정표 — 연결 없이 주소 · 경로 저장 · 녹색 점 (요구 240-12 · sub3 다음 · Sonnet high)
- 정함(브레인): 경로 탭 지도 = 연결 없어도 소재지 넣기(지도 누름 · [소재지] = 등록 창 재사용) · 연결 = 거리 · 경로 좌표(소수 5자리 · 점 줄임) 캐시 → [저장] 때 정본 · 다시 이으면 옛 거리 · 선 지우고 새 값(실패 = 빈칸 + 까닭) · 안 이은 기준점에 이으면 「시점 미연결」 · 녹색 연결 점 크게(r 6 → 9 · 진하게) · 근거 8장.
- [x] 373-1 주소 · 경로 저장 · 다시 이음 표시 — 확인: 시험 + 화면(운반 자동 상자 주소 넣기). 검증완료 — 시험 통과(test_373 · 244_9 · 244_13) · 화면: 운반 자동 상자 지도 누름 = 주소 · 연결 = 4.9 km + 선 118점 저장 · 새로 고침 뒤 선 그대로(길찾기 0회) · 실패 = 빈칸 + 까닭 · 다시 이음 = 옛 거리 · 선 지움 · 시점 미연결 안내.
- [x] 373-2 녹색 점 크기 — 확인: test_254_2 고쳐 씀. 검증완료 — 시험 통과 · 화면 밝음 · 어두움.
## 374. 돋보기 — 지금 보이는 화면 그대로 (요구 240-17 · sub2 다음 · Opus high)
- 정함(브레인): 복제 원본 = 화면 전체(body · 모달 포함) · 움직이는 동안 다시 뜨지 않음(멈춘 뒤 한 번) · 이동 = 합성층 · 모달 입력칸에선 Z 키 안 켬(우클릭 길게 누르기 그대로) · WebGL · CAD 칸은 빈칸(한계) · 근거 8장.
- [x] 374-1 돋보기 원본 · 끊김 — 확인: helper_218_1 고쳐 씀 + 화면(모달 · 빠른 움직임).
- 검증완료(374): 시험 63 통과 · 화면 설명서 모달 안 확대 · 원 = html 아래(자기 복제 0) · 뜨기 66 ms 한 번 · 빠른 움직임 40걸음 최대 틀 25 ms · 50 ms 넘음 0 · 움직이는 동안 다시 뜸 0 · WebGL · CAD 칸 빈칸 = 한계.
## 375. 요구 240 마무리 — 합치기 · 브레인 화면 검증 · 아티팩트 (브레인)
- 정함(브레인): 요구 241 과 함께 끝에 한 번 — 검증 · 아티팩트 하나(385).
- [x] 375-1 합치기 · 서버 묶음 · 고친 대상 시험 · typecheck — 확인: 묶음 다시 지음 · 시험 통과.
- [x] 375-2 브레인 사용자처럼 브라우저 검증(요구 1~24 · 수치 · 사진) — 흠은 창에 고침 → 다시 잼.
- [x] 375-3 아티팩트 보고(요구별 결과 · 수치 · 사진 · 정함 목록 · 남은 것).
- 검증완료(375 · 385와 함께) — 아래 385 줄.
## 376. B07 구조물 도면 컨테이너 (요구 241-1 · sub3 · Opus high)
- 정함(브레인): 좌측 패널 「구조물 도면」 카드(늘 카드) = B05 · B06 배치에 연결된 구조물 조합 도면을 조합 키로 중복 없이 한 장씩 단추(더한장은 장마다) · 열면 CAD 에 프로젝트 사본 도면 + 도각(도번 · 도면명) · 확정 가능 · 고치기는 M02/B08 · 09-13 「구조물도 B08 이관」 결정은 이 요구로 B07 에 다시 들임(B08 모달 그대로) · 근거 `docs/raw/조사/2026-10-17_376_요구241_분석.md` 1장.
- [x] 376-1 서버 목록 · 단건(linked_snapshots · structure_frame · _drawing_list 맨 뒤 · _read_drawing 분기 · 확정본 kind) — 확인: 시험(조합 둘 · 같은 조합 두 배치 = 단추 하나 · 도면번호 안 밀림).
- 검증완료: test_376 7개 · 관련 시험 44 통과 · 8005 API 목록 맨 뒤 17번 · 단건 616 개체 + 가이드 · B09 인쇄 목록 중복 막음 한 줄.
- [x] 376-2 좌측 카드 · 단추 · CAD 열기 — 확인: 화면(검증 프로젝트 조합 도면 열림 · 밝음 · 어두움).
- 검증완료: 검증_sub3 빈 카드 글 → B05 기슭막이 + 조합 SP3-000015 [저장] → 단추 1 · CAD 도면 + 도각(도면명 · SD-000006) · 밝음 · 어두움 · [확정] → 다른 도면 갔다 와도 확정본 · 되돌림(지움 · [저장] · 장부 흔적 지움) · B05 [저장]이 관 측점을 정수로 맞춰 횡단 5장 → 4장(B05 고유 동작 · 그대로 둠).
## 377. B07 전개도 (요구 241-2 · 3 · sub8 · Opus high)
- 정함(브레인): 서버 파이썬 생성기(DXF 에도 남게 무늬 = 기본 도형) · 묶음 = (구조물 종류 · 형태)마다 한 장(관보호공 = 배관 유입 · 유출 + 추가 흙막이 · BOX · 세월교 흙막이 = 각 그룹 · 흙막이 · 옹벽(wall_form) · 노면보호공 콘크리트 · 쇄석 포설) · 박스 = 종단 길이(거리 = 종점 − 시점) × 벽 높이 H(포장은 폭 B) · 양 끝 측점 「No.04+08」 · 「H=2.0」 · 아래 「L=6.0m」 · 우하단 표(측점 · 거리 · 높이/폭 · 면적 · 계) · 도각 · 길이 없는 것 빼고 「길이 미입력 N곳」 · 높이 빈칸 = 박스 + 「H=미입력」 · 추가 단 = 별도 박스 · 축척 자동 · 근거 1장 · 그림 docs/raw/요구_1017/그림_241_*.png.
- [x] 377-1 전개도 자료 · 묶음 · 그림 생성기(새 파일) — 확인: 시험(측점 표기 · 묶음 · 거리 · 면적 · 계 = 그림 예 85 m × 3.5 = 297.5).
- [x] 377-2 좌측 「전개도」 카드(하위 묶음) · CAD 열기 · 내보내기 — 확인: 화면 + DXF 내보내기 무늬 · 표 남음.
- 검증완료(377): test_241 13 통과 · typecheck · 검증_sub8 흙막이 · 옹벽 · 돌쌓기(메) · 포장 넣어 [저장] → 카드 5장 진짜 클릭 · 밝음/어두움 · 포장 No.22+00~No.26+05 85.0 m · DXF 무늬 선 9,709 · 표 글 남음 · 넣은 것 지우고 [저장] 되돌림(관 정수 측점 맞춤으로 횡단 장 5 → 4 = B05 저장 동작).
- [x] 377-3 test_b07_cross_overlay_extent 기대값 어긋남 까닭 가림 — 371-1(벽 0.5 m 내려가 다단 없음 · 끝 선 짧아짐) 의도 바뀜 → 기대값 갱신(x_max 13.8216 → 10.4804 · y 범위 17.7502 → 15.8101).
- 검증완료(377-3): 371-1 TS 만 옛 판이면 옛 기대값 3 통과(까닭 확정) · build:b07-extent 다시 지음 · overlay_extent 3 · wall_shape_unified · 79 · 80 · 186_1 합 28 통과.
## 378. ☰ 서랍 — 폭 · 구분 · 홈페이지 메뉴 접기 (요구 241-4 · sub2 · Sonnet high)
- 정함(브레인): 폭 240 px · 바탕 --color-surface(패널과 다름) · 프로젝트 화면 오른쪽 가장자리 2 px 강조색 · 프로그램 · 회사소개 · 소식 · 교육 · 기술지원 = 접는 묶음(details · 기본 접힘 · 기억 안 함) · 근거 2장.
- [x] 378-1 서랍 폭 · 바탕 · 가장자리 · 메뉴 접기 — 확인: test_device_drawer 고쳐 씀(묶음 순서 · 접힘 · 펼쳐도 서랍 열린 채 · 폭 < 패널 · 바탕 ≠ 패널) + 화면(밝음 · 어두움). 검증 대기 — 검증완료: 시험 2 통과(실제 브라우저 포함 · 폭 240 < 패널 · 바탕 ≠ 패널 · 접힘 기본 · summary 누름 = 펼침 + 서랍 유지) · typecheck 통과 · 커밋 1a96aa196 · 화면 확인(밝음 · 어두움 · 좁은 폭)은 ORCA 탭 차례 못 받아 사용자 몫.
## 379. B06 — 교차점 = 사면처럼 · 좌상 표 지움 · 표고 상자 둘 (요구 241-5 · 6 · 7 · sub4 · Opus high)
- 정함(브레인): 절성토 없는 자리 교차점 = 마우스 올리면 사면과 같은 강조 · 누르면 사면과 같은 고름(제목 「사면 이동 좌/우」 · 「절·성토 없음 · 」 · ◀↺▶ · 방향키 · 원 8 px) — 올리기만으로 고르지는 않음 · 카드 좌상 면적표 지움(모달 표 그대로) · Y축 상자 둘 = 원지반고(녹색 = 원지반선 색) + 계획 중심고(보라 = 설계선 색 · 십자선 값) · 겹치면 원지반 상자만 비킴 · 값 그대로 · 근거 3장.
- [x] 379-1 교차점 hover · 제목 · 정확히 0 자리 시험 — 확인: helper_370_2 section(stop) 경우 + 화면. 「절·성토 없음」 판정 = 노견 끝 = 원지반 ±5 mm(브레인 A).
- [x] 379-2 카드 좌상 면적표 지움 — 확인: test_173 고쳐 씀 · 모달 표 그대로.
- [x] 379-3 표고 상자 둘 · 겹침 비킴 — 확인: test_318 고쳐 씀(겹침 경우 원지반 y 만) + 화면.
- 검증완료 — 시험 28 통과 · typecheck · ORCA 5179 검증_sub4(올림 강조 · 누름 ◀↺▶ · 방향키 · 표 0 · 상자 색 = 선 색 밝음/어두움 · 겹침 ±16 px · 상세 창 · 되돌림) · 검증 대기.
- [x] 379-4 합침 시험 셋 맞춤 — 까닭 = 시험이 옛 모양(helper_150 가짜 선택자가 370-3 `:not(.b06-chart__rock-hit)` 못 읽음 · test_294_1 은 307 에서 `splitPipePick` 로 옮긴 길) · 화면 흠 아님 · 시험만 고쳐 씀.
- 검증완료 — test_150 · 294_1 · 173 · 318 · 370_2 · 370_3 47 통과 · 검증 대기.
## 380. 사토장 · 토취장 — 횡단 그림 · 조절 없음 · 기존 측점만 · CAD 글 (요구 241-8 · sub5 · Opus high)
- 정함(브레인): 부품 처음값 사토장 형상 · 3D = 없음(횡단 그림 · 사토 단면 셈 · 3D 면 끔) · 자리 = 가까운 기존 측점(일반 · 구조물 · 추가) 맞춤(폼 · 끌기 · 우클릭 · 방향키) · 새 측점 안 심음 · 상세 모달 CAD 글에만 「사토장 · 부피」 줄(저장된 칸은 그대로) · 사토 단면 셈 코드 = B08 수량 · 유토 배분이 안 쓰면 지움(쓰면 남기고 보고) · 토취장은 사용자가 M02 에서 켬 · 근거 3장.
- [x] 380-1 처음값 · 남은 사토 값 정리 · 죽은 길 — 확인: test_322_1 · 349_0n · spoil 시험 고쳐 씀 · B08 수량 시험.
- [x] 380-2 기존 측점 맞춤 · CAD 글 — 확인: 시험(아무 m 입력 = 가까운 측점) + 화면(카드 그림 없음 · 모달 CAD 글).
- 검증완료(380 · 검증 대기): 시험 · typecheck 통과 · 화면 폼 47 m → 40 · 끌기 → 60 · 우클릭 33 m → 40 · 카드 사토 그림 0 · 모달 CAD 「사토장 부피 150㎥」 · 빈 부피 = 이름만 · 방향키 = 관만 옮겨 사토장 몫 없음.
- [x] 380-3 노선 따라간 site(사토장 · 토취장) = 새 노선 일반 측점 맞춤(파이썬 · TS 짝) · test_322_2 마스터 판 독립 — 확인: test_380_3 거울 + 화면(노드 끌기 뒤 사토장 측점 = 기존 측점).
- 검증완료(380-3 · 검증 대기): 시험 · typecheck 통과 · 화면 노드 끌기 노선 1078 → 1099.3 m · 관 +21 m · 사토장 240 → 260(일반 측점 · 정수 따라감이면 261) · 저장 안 함 · 탭 닫음.
- [x] 380-4 글만 있는 상세 CAD 맞춤 — 브레인 화면: 검증_브레인232 5+0 사토장(부피 빈 값) 상세 「표 위 CAD」 = 「NO.5」 · 「유용토운반작업장(사토장)」 두 줄이 크게 확대돼 둘째 줄 아래 잘림(4+16 배관 = 원 마크와 함께 보통 크기). 고침: 글만 있어도 다른 측점과 같은 글 크기 · 잘림 없음. 확인: 화면(사토장 · 부피 있음/없음 · 배관 측점 그대로).
- 검증완료(380-4 · 검증 대기): CAD 맞춤 최소 높이 16(B06 상세만) · 시험 cad fit-min-height 3 · note_cad 41 통과 · 화면 글 높이 2+0 사토장(빈 값) 20 px · 3+0(150㎥) 20 px · 4+5 배관 16 px(원 마크 · 긴 옵션 줄) · 모든 줄 칸 안(잘림 0) · 어두움 같음 · 저장 안 함 · 복구본 지움 · 탭 닫음.
## 381. B05 평면 — 되돌리기 아이콘 · 절성토선 색 · [측점] [기울기] · 교각점 (요구 241-9 · 10 · 11 · 14 · sub6 · Opus high)
- 정함(브레인): 되돌리기 · 다시하기 = 곧은 꼬리 갈고리(↩ ↪) 그림(평면 · 종단 도구줄 같이) · 절토 = 붉음(밝음 #e11d48 · 어두움 #ff6b6b) · 성토 = 청록(밝음 #0d9488 · 어두움 #2dd4bf) · 굵기 도로 끝 1.8 · 비탈 끝 2.6 · [측점] [기울기] = 절/성토선 왼쪽 켬끔(기본 켬 · 페이지 동안 · 측점 끄면 눈금 집기도 끔 · 시점 · 종점 이름표 남김 · 기울기 끄면 높이 요청 멈춤) · 교각점 반지름 6 · 집기 12 px · 맨 위에 그림 · 마우스 근처 = 고리 강조 · 겹치면 노드 중심 6 px 안 = 노드 · 밖 = 가까운 쪽(횡단 눈금과 한 함수) · 근거 4장.
- [x] 381-1 아이콘 · 색 · 굵기 — 확인: chrome_modal · 346_2 시험 고쳐 씀.
- [x] 381-2 [측점] [기울기] 켬끔 — 확인: 시험(끄면 눈금 집기 없음) + 화면.
- [x] 381-3 교각점 크기 · 차례 · 맴돔 강조 · 집기 우선 — 확인: test_b05_routeedit_pick 통과 + 겹침 경우 시험.
- 검증완료(381 · sub6): 시험 102 통과 · typecheck · ORCA 5181 검증_sub6 — 맴돔 노드 grab · 눈금 pointer · 겹침 경계 노드/눈금 갈림 · 눈금 누름 = 12+0 횡단 · 노드 누름 = 고름(편집 없음) · [측점] 끔 = 눈금 사라짐 · 집기 없음 · [기울기] 끔 = 라벨 사라짐 · 어두움 절토 #ff6b6b · 성토 #2dd4bf · 바꾼 값 되돌림(계획노선 1078.0 m).
## 382. B05 우측 횡단 판 양식 · 평면 고름 연동 · 파란 법선 (요구 241-12 · 15 · sub7 · Opus high)
- 정함(브레인): 우측 판 = 패널 양식(ui_template_side_panels — 손잡이 · 머리 · 폭 끌기 · 열림 기억) · 자리는 지도 위 덮개 그대로(235-2) · 평면 = 공용 고름 한 칸 구독(일반측점 고르면 그 측점 횡단 판 · 눈금 강조 · 구조물 고르면 그 자리 마름모) · 평면 눈금 클릭 = 공용 고름에 적음 · 파란 법선 = 측점 열쇠로 들고 묶음 차례마다 다시 짚음 · 폭 = 그 측점 발자국 기록 비탈 끝 좌우 · 절성토 색 · 일반측점만 · 근거 4장.
- [x] 382-1 우측 판 양식 — 확인: chrome_modal 시험 고쳐 씀 + 화면(덮개 · 폭 끌기 · 열림 기억).
- [x] 382-2 고름 연동 · 법선 갱신 — 확인: 시험(노선 고친 뒤 법선 = 새 발자국 · 다른 보기 고름 = 평면 판) + 화면.
- 검증완료(382 · sub7): 시험 84 통과 · typecheck · ORCA 5182 검증_sub7 — 손잡이 폄 = 판 460 px 지도 위 덮개(지도 폭 그대로) · 끌기 611 px 기억 · 횡단 보기 다녀와도 열림 · 폭 그대로 · 접힘 = 손잡이만 · 눈금 클릭 = 고름 at 200 · 종단 10+0 강조 · 법선 grid:10 좌 19.8 성토 · 우 3.99 절토 = 발자국 선 끝 · 노드 끌기 뒤 좌 9.55 · 우 5.49 새 선 끝 · 이전 횡단 남음 · 종단 11+0 고름 = 평면 11+0 · 세월교 고름 = 8+15 마름모 · Esc = 법선 · 판 비움 · 밝음 색 확인 · 바꾼 값 되돌림(되돌리기 · 취향 키 지움).
## 383. R = 일반측점 기본 제약 · 노선 추천 · 방향키 · [재계산] (요구 241-13 · 16 · 18 · sub1 · Opus high)
- 정함(브레인): 「MC = 서로 다른 일반측점」 = 사용자 규칙(지식DB 근거 없음 · 곡선 간격 ≥ 20 m) · 새 초기 노선 = 서버가 맞춤 + 측점 스냅 켬 · 추천 = 후보마다 맞춘 선으로 고르기 · 쓸기(ALGO 5 · 측점 밖 0 후보 앞세움 · 남은 곳 「못 지킨 구간」) · 추천 [적용] = 스냅 켬 저장 · 옛 저장 프로젝트 깃발 그대로(말없이 측점 안 바뀜) · 손 편집 못 맞춘 곡선 = 그대로 + 개수 · 교각점 방향키 0.1 m(화면 축 · Shift ×10 · 누르는 동안 옮김 · 뗄 때 한 걸음 · 스냅이면 그때 맞춤 + 상태줄 「실제 이동 · 함께 밀린 IP」) · 평면을 누른 뒤 ▲▼ 는 종단으로 안 감 · [재계산] = 측점 맞춤 오른쪽 같은 줄 · 늘 보임(바꾼 것 있을 때만 켜짐) · 근거 5장.
- [x] 383-1 초기 노선 맞춤 · 추천 후보 맞춤(ALGO 5) · [적용] 깃발 — 확인: 시험(새 사본 측점 밖 ≈ 0 · 옛 사본 깃발 · 측점 그대로).
- 검증완료 — 시험 153 통과 · 검증_sub1 새 초기 노선 곡선 25 · 측점 밖 0 · 추천 측점 밖 곡선 = 「못 지킨 구간」(station) · 첫 셈 74.6 s → 42.6 s · 검증 대기.
- [x] 383-2 교각점 방향키 — 확인: 시험(0.1 m · 스냅 때 뗄 때 맞춤 · 종단 ▲▼ 안 샘) + 화면.
- 검증완료 — 시험 35 통과 · 화면(검증_sub1 · 5174) ▲ = 북 0.100 m · Shift+→ = 동 1.000 m · 스냅 켬 「실제 이동 0.4 m · 함께 밀린 IP 6곳」 · 「같은 측점」 안내 · 평면 누른 뒤 ▲▼ 종단 안 바뀜(종단 누른 뒤엔 바뀜) · 값 되돌림 · 검증 대기.
- [x] 383-3 [재계산] 자리 — 확인: 화면(측점 맞춤 오른쪽).
- 검증완료 — 화면 측점 맞춤 오른쪽 8 px 같은 줄 · 늘 보임 · 칸 바꾸면 켜짐 → 재계산 뒤 꺼짐 · 밝음/어두움 · 비중 계산 「No.12+12.4 측점 밖 7.6m」 표기 · 검증 대기.
## 384. B05 · B06 한 페이지 · 캐시 공유 — 방법 제시 (요구 241-17 · 브레인 · 코드 X)
- 근거: 분석 6장(같은 자료 여러 벌 · 두 페이지처럼 도는 자리 열한 곳 · 목표 원칙 일곱 · 옮기는 차례 0~7).
- [x] 384-1 사용자 답(요구 242) = 제안대로 반영 뒤 판단 · 편의성 · 보안 고려 → 386 · 387 · 388.
## 385. 요구 240 · 241 마무리 — 합치기 · 브레인 화면 검증 · 아티팩트 (브레인)
- [x] 385-1 합치기 · 서버 묶음 · 고친 대상 시험 · typecheck.
- [x] 385-2 브레인 사용자처럼 브라우저 검증(240 V21~V31 남은 것 + 241 목록) — 흠은 창에 고침 → 다시 잼.
- [x] 385-3 아티팩트 보고 하나(240 · 241 요구별 결과 · 수치 · 사진 · 정함 목록 · 384 방법 제시 · 남은 것).
- 검증완료(385) — 합침 · 묶음 다섯 · CAD 앱 다시 지음 · typecheck 0 · 고친 대상 시험 통과(남은 실패 = 옛 302_1 · 254_1 · 52_6) · 브레인 화면 V1~V47 · 흠 넷(369-3 · 370-4 · 370-5 · 380-4) 고친 뒤 다시 잼 · 371-4 흠 아님 · 아티팩트 https://claude.ai/artifact/XAtt2TrSurCzPAygQhrCa5 · 검증 대기.
## 386. 한 페이지 ① — 기준 · 페이지 자료 줄 · 묶음 입력 · 저장 한 줄 (요구 242 · 384 실행 · sub7 · Opus high)
- 정함(브레인): 384 방법 그대로 · 차례 0 → 2 → 3 → 6 · 5단계(보기 = 그리는 쪽)는 미룸(화면 효과 없음 · 0 다시 잰 뒤) · 단계마다 test_365_page_pipeline + 바퀴(열 때 1 · 같은 입력 0) 통과가 문 · 근거 `docs/raw/조사/2026-10-17_386_요구242_분석.md` 1장.
- [x] 386-0 기준 잼(코드 X) — 전환당 /api 수 · 전환 끝 ms · 열 때 바퀴(B05 먼저 · B06 먼저 · 새로고침) · 세션 글자 수 → 이 줄 아래 한 줄.
- 기준(5182 검증_sub7 · 두 번) — 열 때 /api B05 22~23 · B06 15(구조물 받기 둘 다 2) · 끝 B05 7.5~7.8 s · B06 2.1~4.1 s · 열 때 바퀴 B05 먼저 1~2 · B06 먼저 1 · 새로고침 B05 2 · B06 1 · 처음 다른 보기 = 바퀴 2 · /api 6(B05→B06) · 13(B06→B05) · 그 뒤 전환 /api 2~3(구조물 · 정의 판 · 관 또는 haul-plan) · 바퀴 0 · switchMs 54~477 · 끝 0.5~1.0 s · 세션 1 876 116 자(section-detail 1 511 817).
- [x] 386-2 페이지 자료 줄(새 design_page_data.ts · 저장분 한 번 · 노선 id 한 칸 · onShow 받기 지움 · 「계산 중」 점) — 확인: 전환당 /api 0 · 열 때 구조물 받기 1 · 새 test_384_2.
- 검증완료 — 시험 73 파일 통과(test_384_2 · test_365 포함) · typecheck · 묶음 둘 다시 지음 · 5182 검증_sub7 전환 /api 0(진짜 단추 · 저장 안 한 관 초안 그대로) · 열 때 구조물 받기 1 · 처음 다른 보기 /api 3(B05→B06) · 11(B06→B05) · 「계산 중」 점 열 때 0.3 s 켬 · 밝음/어두움 · 값 되돌림 · 노선 id 한 칸은 미룸(읽는 곳 = RC sub4 줄 · DPr 700 · VC 688) · 검증 대기.
- [x] 386-3 묶음 입력 = 가게만(보기 측점 심기 · baseMoved 지움) — 확인: baseMoved 0 · 바퀴 그대로.
- 검증완료 — 묶음 planline 기준 = 입력이 심는 측점(design_pipeline_base · 보기 심기는 그림만) · test_384_3 · test_365 통과 · 5182 열 때 바퀴 B05 먼저 1 · B06 먼저 1 · 새로고침 1 · 처음 다른 보기 0(전 2) · 같은 입력 0 · 검증 대기.
- [x] 386-6 [저장] 본문 보기 무관(B05 만 연 길 지움) — 확인: B05 만 연 [저장] 본문 = B06 다녀온 본문.
- 검증완료 — test_384_6 · 저장 시험 7 파일 통과 · 5182 검증_sub7 새 탭 B05 만 연 [저장] = 횡단 보기 숨긴 채 섬 → sections/304/save 본문 8 868 자 · 패치 67 = B06 다녀온 [저장] 본문 그대로(차이 칸 0) · 값 안 바꿈(같은 본문 두 번 · 구조물 판 도장 한 번) · 검증 대기.
- [x] 386-2b 노선 id 한 칸(386-2 에서 뗌 · 읽는 곳 RC:99-117 · design_profile(700) · design_view_cross(688)) — 387 합친 뒤 sub7 · design_profile 먼저 쪼갬. 확인: 노선 id 출처 1 · test_365.
- 검증완료 — 칸 = design_page_route(채움 = 자료 줄 pageSectionContext 하나) · 읽는 곳 PA · VC · design_profile render · RC · 3D · 측점 그림 · design_profile 678줄(쪼갬 = design_profile_context) · test_384_2b · test_365 · min_cover_guard 포함 78 파일 통과 · typecheck · 묶음 넷 다시 지음 · 5182 검증_sub7 칸 304 = context 304 · 전환 /api 0 · 바퀴 그대로 · [저장](진짜 단추) sections/304/save 200 · 저장 뒤 첫 전환만 한 번 다시 받고 0 · 노선 초안(새 노선) 화면 조작은 못 함(시험 test_365 초안 시나리오로 갈음) · 값 안 바꿈 · 커밋 c77e44ab0 · 검증 대기.
## 387. 한 페이지 ② — 세션 열쇠 · 횡단 다시 셈 창구 · 결과 층 (요구 242 · 384 실행 · sub4 · Opus high)
- 정함(브레인): 세션 직접 접근 0(등록부만 · 프로젝트 없는 `b05:pipes` 걷음) · 되돌리기 사진 = 지금 프로젝트만 · 면적 얹기 한 곳(묶음 출력 · 화면이 공유 자료 안 고침) · 세션 section-detail = 저장 정본만 · 근거 1장.
- [x] 387-1 세션 직접 접근 → 등록부 — 확인: 새 test_384_1(design · UI_* 직접 sessionStorage 0) · test_290_1 · test_346_4.
- 검증완료 — 시험 81 통과 · typecheck 0 · 화면(검증_sub4) B05↔B06 관 10개 · 월류 폭 10.1 유지 · 되돌리기 셋 = 월류 폭 · 관 85 m 복귀 · 다른 프로젝트 칸 그대로 · 프로젝트 없는 열쇠 0 (002d0e85a · 검증 대기).
- [x] 387-4 횡단 다시 셈 창구 하나 · 면적 한 곳 — 확인: 부르는 곳 1 · B05 만 연 면적 = B06 연 면적 ±0.01.
- 부르는 곳 1 · 화면 면적 쓰기 0 · ▲ 한 번 = 차례 1 · cross 1 · 되돌리기 원래 면적 · B05↔B06 오가도 같은 값(검증_sub4) — 6a3f9647f.
- 덧(sub5 4+5 · 브레인 10+0): 셈 어긋남 아님 — 검증_sub4 노선 234 저장 상세로 브라우저 다시 셈 = 서버 [저장] 다시 셈 차례(설계 다시 냄 + 지표면 넓힘 + Node 면적 · 쓰기 없이) 66 측점 최대 차 0.0001 ㎡ · 저장분과 다른 16곳(구조물 · 연동 이웃)은 옛 코드로 낸 저장분 낡음.
- 남음 ⬜ 브레인 답 필요: B05 만 연 면적(절토 합 452.72) ≠ B06 연 뒤(434.58) — 관 옵션(벽 높이 · 형태 · 세월교 · BOX 폼) → 횡단 조정값 옮김(`B06_Section_UI_Page_Pipe_Options` · `bindPipeOptions`)이 B06 보기를 열 때만 돎 · 구조물 측점만 다름 · 제안 = 그 옮김을 상세 가게 얹기(`B06_Section_Section_Adjusts`)로 내림.
- [x] 387-7 결과 층 정리 — 확인: 열 때 상세 JSON.parse 1 · 세션 글자 수 386-0 보다 줆.
- 검증완료 — 세션 상세 풂 1(test_384_7) · 세션 상세 = 받을 때 정본만(갈아끼움 · 되돌림 안 씀) · 세션 글자 수 화면 재기는 못 함(01a4a54bd · 검증 대기).
- [x] 387-4b 관 옵션 → 횡단 조정값 옮김(B06_Section_UI_Page_Pipe_Options · bindPipeOptions = B06 보기 열 때만 돎)을 상세 가게 얹기(새 B06_Section_Section_Adjusts)로 — 확인: B05 만 연 면적 = B06 연 뒤 면적(검증_sub4 절토 합 452.72 vs 434.58 → 같음) · 387-4 체크.
- 검증완료 — 시험 870여 통과(새 test_387_4b) · typecheck 0 · 화면(검증_sub4) B05 만 연 절토 · 성토 합 = B06 연 뒤 442.3726 · 824.768 · 관 옵션 2 → 2.1 뒤 둘 다 443.2174 · 되돌림 442.3726 · 어두움 정상(111dd6a1d · 9d3e6b242 · 검증 대기).
- 덧 갈림 둘도 같이 고침: 갈아끼운 상세를 그 차례 cross 가 못 봄(묶음 다 돈 뒤 한 번 더) · B06 폼 되보내기가 관 제원에 옵션 값을 그대로 씀(다시 셈 앞 형상 규칙으로 다시 얹음 · 집수정 높이 1.5 ↔ 2).
- 남음(별건): 관 초안 둔 채 다시 열기 = 서버 미리보기 측점 11곳이 섞여 다른 값(377.51 · B05 = B06 은 같음 · 종단 판 접힘이면 그리기 판정이 안 돎).
- [x] 387-8 관 초안 둔 채 다시 열면 서버 미리보기 측점 11곳 섞여 다른 값(절토 합 377.51 · B05 = B06 은 같음) · 종단 판 접혀 있으면 그리기 낡음 판정 안 돎(sub4 보고) — 원칙 4(보기가 숨어도 계산 · 판정은 돎 · 그림만 멈춤). 확인: 시험(접힌 종단 판 + 관 초안 다시 열기 = 펼친 때와 같은 값) + 화면.
- 검증완료 — 낡음 판정 = 상세 가게 몫(읽은 뒤 묶음 차례가 끝나면 화면 선 대비 낡음이면 cross 한 번 더 · 같은 낡음 한 번만) · 새 test_387_8 포함 시험 322 통과 · typecheck 0 · 묶음 다시 지음 · 화면(검증_sub4 · 같은 관 초안) 종단 판 접힘 · 펼침 둘 다 B05 = B06 = 368.6348 · 1012.4423 · 낡은 측점 0(미리보기 11곳) · 초안 원래대로 되돌림(89728f83f · 검증 대기).
## 388. 한 페이지 ③ — 보안 (요구 242 · sub5 · Opus high)
- 정함(브레인): 로그아웃 = 떠남 확인 먼저 → 서버 로그아웃 → 초안 · 결과 · 현재 프로젝트 · 지형 보관 지움 → 새로고침 · 계정 바뀜(같은 탭 다른 계정)도 같은 지움 · [확정] 면적 · 관 길이 = 서버 셈만(브라우저 값 안 받음 · 셈 실패 = 화면 경고) · 세션 넘침 = 결과 칸 비우고 다시 · 그래도 넘치면 안내 · 탭이 연 프로젝트 고정 · 근거 1장.
- [x] 388-1 로그아웃 · 계정 바뀜 지움 — 확인: 새 test_384_s_logout_wipe + 화면(초안 있는 채 로그아웃 → 확인창 → 지워짐).
- 검증완료: 시험 6 · 5180 검증_sub5 확인창 [취소] 머묾 · [폐기] 세션 0 · 프로젝트 없음 · 401 · 지형 0 · 계정 바뀜 한 번 새로고침 · 밝음/어두움(검증 대기).
- [x] 388-2 서버 정본 셈만 — 확인: 새 test_384_s_area_keys(면적 보내도 정본 = 서버 값) · test_b05_b06_save_roundtrip.
- 검증완료: 시험 7 · 5180 4+5 면적 999 보냄 → 정본 13.6928 · 0.6962 · 7.9(서버) · recomputed:true · 왕복 시험은 배정 프로젝트 없음으로 건너뜀(검증 대기).
- [x] 388-3 세션 넘침 · 탭 프로젝트 고정 — 확인: 시험.
- 검증완료: test_384_s_logout_wipe 넘침 · 안내 · 고정 3건(검증 대기).
- [x] 388-4 쓰기 권한 — 사용자 확정(251-1): 회사 프로젝트는 소속 사용자 전체 권한 · 지금 그대로 · 코드 고침 없음.
## 389. ☰ 정렬 · 서랍 간격 · 좌측 카드 기본 닫힘 (요구 242-1 · 2 · 3 · sub2 · Sonnet high)
- 정함(브레인): ☰ 중심 = 좌측 패널 제목 줄 중심(제목 줄 마우스 높이 48 → 52 · ☰ 자리 그대로) · 서랍 간격 = 8/12 체계(묶음 안 8 · 묶음 사이 12 + 선 + 12 · 줄 높이 마우스 40 · 손가락 44 · 글 왼쪽 16 · 로고 줄 = ☰ 높이 가운데) · 좌측 카드 = 모든 페이지 기본 닫힘(B05 · B06 구조물 배치 · 노선 추천 · B07 토적도 · 구조물 도면 · 전개도 · B08 넷 · B09 인쇄 둘 · M02 구조물 집계 양식 · 우클릭 추가 때 펴기는 그대로 · 접힌 카드 안 상세 펼침은 그대로) · 근거 2장.
- [x] 389-1 ☰ 세로 정렬 — 확인: 화면 ☰ 중심 = 제목 줄 중심(마우스 · 손가락) · test_device_drawer. 검증완료(마우스 26=26 · 손가락 30=30 · 검증 대기)
- [x] 389-2 서랍 간격 — 확인: 화면 간격 수치 · test_device_drawer · test_225_drawer_shortcuts. 검증완료(묶음 안 8 · 사이 12+선+12 · 줄 40/44 · 글 16 · 로고 줄 ☰ 가운데 · 검증 대기)
- [x] 389-3 좌측 카드 기본 닫힘 — 확인: test_311_panel_folded 고쳐 씀 + 화면(페이지마다 첫 열기 닫힘). 검증완료(B05 · B06 · B07 · B08 · B09 인쇄 · M02 첫 열기 전부 닫힘 · 검증 대기)
## 390. B05 평면 도구줄 — 구분선 · 스냅 간격 · Ctrl+휠 회전 · 기울기 끔 (요구 242-4 · 11 · 16 · 17 · sub1 · Opus high)
- 정함(브레인): [측점 스냅] | 분석 지형 사이 구분선(분석 지형 숨으면 같이 숨김) · [측점 스냅] 오른쪽 「스냅 간격」 고르기(분석 지형 양식 · 0.1 m · 1 m · 10 m · 측점 No. · 기본 측점 No. · 프로젝트별 화면 기억 · 스냅 끄면 흐림) = 곡선 MC 를 그 간격 배수에 맞춤(허용 오차도 간격 따라 · 측점 값 정수 m 규칙 그대로 · 서버 초기 노선 · 추천 = 측점 No. 그대로) · Ctrl+휠 = 한 칸 5° 회전(단추 15° 그대로 · 손가락 · 트랙패드 벌림 빼고) · [기울기] 기본 꺼짐 · 근거 3장.
- [x] 390-1 구분선 · [기울기] 기본 꺼짐 — 확인: test_b05_routeedit_initial · test_381_2 고쳐 씀.
- 검증완료 — 시험 90 통과 · 화면 구분선 5개(분석 지형 숨기면 앞 구분선 none) · [기울기] aria-pressed false · 밝음 · 어두움.
- [x] 390-2 스냅 간격 고르기 — 확인: 시험(간격마다 MC 배수 · 측점 밖 개수 같은 간격) + 화면(1 m · 10 m 끌기 뒤 MC).
- 검증완료 — 검증_sub1 끌기 뒤 1 m 최대 어긋남 0.046 · 0.1 m 0.003 · 측점 밖 0 · 10 m · 측점 No. 못 맞춘 3곳 = 상태줄 3 · 스냅 끔 흐림 0.5 · 「0.1 m」 = 방향키 한 걸음(KEY_STEP_M) 상태줄 「실제 이동 0.1 m」.
- [x] 390-3 Ctrl+휠 회전 — 확인: 시험(벌림 = 확대 그대로) + 화면 · 도움말 한 줄.
- 검증완료 — 화면 Ctrl+휠 한 칸 5° · 단추 15° · 트랙패드 벌림 · 맨 휠 = 확대(회전 0) · 도움말 「Ctrl+휠 = 돌리기(한 칸 5°)」 · 검증 대기.
- [x] 390-4 스냅 상태줄 글 = 고른 간격 따라(브레인 화면: 간격 1 m 인데 「곡선 가운데(MC)를 일반측점에 맞췄습니다」 · RouteEdit.ts:266 · :538 고정 글) — 측점 No. = 지금 글 · 0.1 · 1 · 10 m = 「… m 배수에 맞췄습니다」. 확인: 시험 + 화면 글.
- 검증완료 — 간격별 글 시험(test_390_4) · test_366_3 · routeedit_initial · 224_2 56개 통과 · typecheck 통과 · 화면 글은 브레인 마무리 때.
- [x] 390-5 스냅 간격 = 조작 단위(요구 243) — 정함(브레인): 스냅 켬이면 ① 방향키 한 번 = 고른 간격만큼(0.1 · 1 · 10 m · 측점 No. = 측점 간격 · Shift 안 씀) 옮기고 MC 를 그 간격 배수에 맞춤 ② 끌기 = 끄는 동안 맞춘 자리로 바로 보임(놓을 때만 아님) ③ MC 측점 값 = 고른 간격 정밀도(0.1 = 소수 한 자리 · 1 이상 = 정수 · 다른 측점은 정수 그대로 · 간격을 저장 노선에 같이 저장해 서버 측점 셈도 같은 값 · 파이썬 짝). 확인: 시험(간격별 방향키 걸음 · 끌기 미리보기 · MC 값 · 서버 짝 거울) + 화면(0.1 · 1 · 10 · 측점 No.).
- 검증완료 — 시험 435개 통과(test_390_5 33 · 383_2 · 366_3 · 224_2 · frame_mirror 등) · typecheck · 서버 묶음 다시 지음 · 화면(검증_sub1 · 5174): 방향키 두 번 = 0.1 m → MC 380.0 · 380.1 · 380.2 · 1 m → 380 · 381 · 382 · 10 m → 380 · 390 · 400 · 측점 No. → 120 · 100 · 끄는 동안 MC 눈금 19+0 · 놓은 뒤 같은 값 · 평면 눈금 19+0.2(0.1 때만 소수) · 밝음 · 어두움 · 저장 안 하고 되돌림.
## 391. B05 평면 그림 — 20 m 법선 · 곡선 3점 · 곡선 없는 교각점 삼각형 · 잠금 색 (요구 242-5 · 6 · 12 · 13 · 15 · sub6 · Opus high)
- 정함(브레인): 측점 맴돔 선 = 고른 선 = 중심선 좌우 20 m 고정 법선(하늘 #0ea5e9 · 짧은 12 px 선 지움 · 절성토 색은 발자국 선이 보여 줌) · 고른 곡선(교각점 · 호) = 호 굵게 + 교각점→BC · EC 접선 + BC · MC · EC 세 점(고름 하늘색) · 곡선 없는 교각점(155° 생략 · 손 지움 모두) = 같은 크기 삼각형(모양만) · 잠긴 노선 · 점 = 황금(밝음 #ca8a04 · 어두움 #facc15 · 굵기 4 + 흰 테) · 근거 4장.
- [x] 391-1 맴돔 = 고름 20 m 법선 — 확인: test_381_3 · cross_width 고쳐 씀 + 화면.
- [x] 391-2 곡선 3점 강조 · 삼각형 — 확인: 시험 + 화면(밝음 · 어두움).
- [x] 391-3 잠금 색 — 확인: 시험(토큰 값) + 화면 대비.
- 검증완료(sub6) — 시험 66 통과 · typecheck · 화면(검증_sub6 · 맴돔 = 고름 좌우 20 m 각 212 px = 측점 20 m 간격 · 곡선 3점 · 삼각형 · 황금 잠금 · 밝음 · 어두움 · 바꾼 값 되돌림) · a0a29fd00 · 검증 대기.
## 392. B05 하단 판 — 배수유역 기본 닫힘 · 높이 제어 10-14 방식 (요구 242-9 · 10 · sub8 · Opus high)
- 정함(브레인): 배수유역 판 기본 닫힘(옛 기억 한 번 버림 · B06 도 같이) · 높이 제어 = 10-14 판(9edaec82e) 되살림 — 유토곡선 = 종단 칸 바닥 덮는 판 · 판 끌기 = 종단 · 유토 · 표 세 영역 같은 비율 · 유토 손잡이 = 판 위 경계 밖 표 손잡이와 나란히 · 접기 = 숨김 · 남김 = 유토 [창 분할](펼친 때만 · 235-7 「분리」 = 창 분리로 읽음) · 367-1 늘 전체 맞춤 · 367-5 · 354-3 · 325-2 · 근거 3장.
- [x] 392-1 배수유역 기본 닫힘 — 확인: 시험(기억 없음 = 닫힘) + 화면.
- 검증완료 — 옛 열쇠 "false" 버리고 닫힘 · 펼친 기억 B05 · B06 새로고침 유지 · ed3f454c6
- [x] 392-2 하단 판 높이 제어 10-14 방식 — 확인: 시험(세 영역 비례 · 손잡이 자리) + 화면(판 끌기 · 유토 끌기 · 접기 · 창 분할 · 밝음 · 어두움).
- 검증완료 — 판 끌기 유토 160→211 · 표 140→184(×1.32) · B06 ×1.36 · 줄이기 하한 종단 100 · 손잡이 바닥 = 판 위 · 표 손잡이와 88 px 나란히 · 유토 끌기 +80 · 접기 숨김 · 창 분할 오감 · 축 띠 가림 z6 고침 · 8b72720d0 · 50c40d564
## 393. B05 우측 횡단 판 — 기본 접힘 · B06 횡단도 그대로 (요구 242-7 · 8 · sub3 · Opus high)
- 정함(브레인): 우측 「횡단」 판(사용자 말 「좌측 패널 횡단」 = 손잡이가 왼쪽에 있는 이 판) 기본 접힘(옛 기억 한 번 버림 · 측점 눈금 누르면 열리되 기억 안 함) · 「횡단」 · 「이전 횡단」 칸 = B06 횡단도 카드를 읽기 전용으로(구조물 · 포장 · 면적 · 축 · 종단 계획고 · 횡단 설계 반영 · 단면 사본 · B06 고름 안 건드림) · 종단 임시 횡단 창은 지금 그림 그대로 · 근거 5장.
- [x] 393-1 기본 접힘 — 확인: test_b05_routeedit_chrome_modal 고쳐 씀 + 화면.
- [x] 393-2 B06 횡단도 읽기 전용 — 확인: 시험 + 화면(구조물 있는 측점 = B06 카드와 같은 그림 · 평면 노선 고친 뒤 갱신 · B06 고름 그대로).
- 검증완료(sub3) — 시험 46 통과 · typecheck · 묶음 셋 다시 지음 · 화면(검증_sub3 · 옛 열림 기억 있어도 접힘 · 눈금 열림 기억 없음 · 손잡이만 기억 · 14+0 배수관 카드 요소 36 = B06 카드 같음(암 경계 포함) · 노드 끌기 뒤 위 성토 33.31㎡ · 아래 이전 40.08㎡ · B06 보라 선 고름 유지 · 밝음 · 어두움 · 바꾼 값 되돌림) · 저장 상세 = Section_Store 접근자(파이프라인 파일 700줄) · dec208f11 · a3dd0a1cf · 5f0e81345 · 검증 대기.
- [x] 393-3 우측 판 횡단 · 이전 횡단 칸 = 그래프만 칸 전체(요구 244) — 정함(브레인): 칸 제목 줄(「횡단 10+0」 · 「이전 횡단 10+0」)만 남기고 카드 머리(측점 · 거리 · 편측 성토 알약 · 성토사면) · 확대 단추 · 암 경계 줄 · 요약 줄 · 카드 테두리 걷음 · 그래프(축 · 표고 상자 · 노폭 글 포함)가 칸 폭 · 높이를 다 씀 · 판 폭 끌기 · 창 크기 따라 다시 그림. 확인: 시험 + 화면(밝음 · 어두움 · 판 폭 바꿈).
- 검증완료(sub3) — 시험 33 통과 · typecheck · 화면(검증_sub3 · 18+0 일반 · 14+0 배수관 집수정 · 그래프 409×407 = 칸 409×407 · 머리 · 발 · 줌 · 요약 없음 · 노선 고친 뒤 횡단 · 이전 횡단 둘 다 · 판 폭 끌어 559 로 다시 그림 · 밝음/어두움 · 되돌림) · f601bc301(검증 대기)
- [x] 393-4 우측 판 제목 행 걷고 그림 영역으로 · 보기 폭 = B06 횡단 반폭 공유(요구 246) — 정함(브레인): 판 머리 「횡단」 행 · 칸 제목 행(「횡단 10+0」 · 「이전 횡단 10+0」) 모두 걷음 → 측점은 그래프 왼쪽 위 작은 글(「10+0」 · 「이전 10+0」)로 겹쳐 씀 · 손잡이 · 폭 끌기 그대로 · 그래프 가로 범위 기본 = B06 좌측 「횡단 반폭」 보기값(같은 값 한 벌 · B06 에서 바꾸면 B05 판도 따라감). 확인: 시험 + 화면(B06 반폭 바꾼 뒤 B05 판 범위 · 밝음 · 어두움).
- 검증완료(sub3) — 시험 39 통과 · typecheck · 화면(검증_sub3 · 판 머리 · 칸 제목 행 없음 · 측점 글 그림 칸 왼쪽 위 · 그래프 409×458 = 칸 409×459 · 기본 ±10 m = B06 입력칸 10 · B06 15 적용 뒤 다음 그림 ±15(px/m 16.55 → 11.03) · 33+0 일반 · 14+0 배관 · 밝음/어두움 · 반폭 되돌림(되돌리기 한 걸음 = B06 적용뿐 · 섞인 편집 없음)) · bd78a41c9 · d4c8fecb8(검증 대기)
- [x] 393-5 우측 판 접힘 손잡이 = 지도 오른쪽 끝에 딱 붙임(요구 247 · 손잡이 오른쪽 빈 틈 0) — 확인: 화면 손잡이 오른쪽 끝 = 지도 오른쪽 끝(px) · 펼침 · 폭 끌기 그대로.
- 검증완료(sub3) — 시험 · 화면(접힘 손잡이 오른쪽 끝 = 지도 오른쪽 끝 · 틈 0 px(전 12) · 펼침 틈 12 그대로 · 폭 끌기 460 → 560 → 460 · 기억 되돌림) · 5c426ce4f(검증 대기)
## 394. 옛 시험 실패 셋 (241 답 · sub3 · Opus high)
- 정함(브레인): 302_1 · 302_4 = 기기 알아채기가 window 없는 곳에서 건너뛰게(제품 한 곳) · 254_1 = 옮긴 파일에서 찾게 · 52_6 = 마스터 실제 기본값에 안 기대게(마스터 값 = 사용자 편집 4baf49ba4) · 근거 6장.
- [x] 394-1 셋 고침 — 확인: test_302_1 · 302_4 · 254_1 · 52_6 통과.
- 검증완료: 넷 31 통과 · typecheck 통과 · 0fef92545(검증 대기).
- [x] 394-2 test_b05_min_cover_guard — 367-3(84876b747)이 applyEdits 가드를 `return false;` 로 바꿈(막히면 자유지정 열린 채) · 시험 글은 옛 `return;` → 시험 기대 고침(부르는 곳 한 곳 판정 그대로). 확인: 시험 통과. 검증완료(10 통과 · 검증 대기)
- [x] 394-3 test_152_3_chute_cut::test_성토만인_측점은_그대로 — pipeBase bands3d 2 → 1(메인 · 371 벽 성토 이음 무렵 추정) · 까닭 가림: 의도된 바뀜이면 시험 기대 고침(까닭 한 줄) · 흠이면 제품 고침. 확인: 시험 통과 + 까닭 한 줄.
- 까닭: 6ba26ee61(371-1 다단 사이 시작 = 윗단 발끝) — 배관 85.052 아랫단 0.5 m 내려가 끝 구간 묻힘 → 성토 + 3도 절토(의도된 바뀜 · 377-3 같은 갈래) · 시험 기대만 고침(제품 고침 없음).
- 검증완료: 그 앞 커밋 트리 helper = fill · fill 2 · 2 / 371-1 트리부터 fill · cut 2 · 1(까닭 확정) · 152_3 · 371_2 · wall_shape_unified · 139_4 · 띠 시험 합 42 통과 · typecheck 통과 · d1c863c05(검증 대기).
## 396. 요구 242 마무리 — 합치기 · 브레인 화면 검증 · 보고 (브레인)
- [x] 396-1 합치기 · 서버 묶음 · 고친 대상 시험 · typecheck.
- [x] 396-2 브레인 사용자처럼 브라우저 검증(242-1~17 · 한 페이지 전환 · 보안) — 흠은 창에 고침 → 다시 잼.
- [x] 396-3 보고(요구별 결과 · 수치 · 정함 목록 · 388-4 · 395 결정 거리).
- 검증완료(396) — 합침 · 서버 묶음 다섯 · typecheck 0 · 고친 대상 시험 95 파일 585 통과(옛 실패 302_1 · 302_4 · 254_1 · 52_6 · min_cover · drainage_side · 152_3 모두 통과) · 브레인 화면 V1~V19 + 덧 요구 243~247 통과 · 흠 하나(390-4 스냅 글) 고친 뒤 다시 잼 · 로그아웃 보안 확인 · 남은 결정 = 388-4 · 395-1 · 검증 대기.
## 397. B06 횡단 그래프 Ctrl+휠 확대 · 축소 (요구 245 · sub6 · Opus high)
- 정함(브레인): B06 횡단 카드(· 같은 카드를 쓰는 상세 모달) 그래프 위 Ctrl+휠 = 마우스 자리 중심 확대 · 축소(지금 + − ⤢ 단추와 같은 줌 상태 · 같은 한도) · Ctrl 없는 휠 = 페이지 스크롤 그대로 · 트랙패드 · 손가락 벌림도 같은 확대 · 브라우저 확대 막음(그래프 위만) · B05 우측 판(읽기 전용 · 393-3)은 빼도 됨.
- [x] 397-1 Ctrl+휠 줌 — 확인: 시험(줌 상태 · 마우스 중심 · Ctrl 없는 휠 = 스크롤) + 화면(밝음 · 어두움 · 단추와 섞어 씀 · ⤢ 맞춤 복귀).
- 검증완료(sub6) — 시험 63 통과(397 · 공용 줌 쓰는 B06 상세 · B08 · 입력 방향) · typecheck · 화면(검증_sub6 · Ctrl+휠 = 마우스 자리 고정 1.15배 · 브라우저 확대 막음 · 맨 휠 = 안 막음 · 줌 그대로 · 핀치 · + 단추와 이어짐 · ⤢ 원배율 · 상세 모달 Ctrl+휠 · 밝음 · 어두움 · 되돌림) · 15092ee2b · 검증 대기.
## 398. B05 평면 — 교점 옮기면 좌측 패널 열림 · 반지름 · 곡선 길이 바꿔도 그대로 (요구 248 · 249)
- 정함(브레인): 좌측 패널 저절로 펴기(09-04 「바깥에서 고르면 좌측 패널도」)는 사용자가 직접 고를 때만 · 노선 · 묶음이 다시 돌며 고름을 다시 칠할 때는 안 폄. 반지름 · 곡선 길이 = 꺾임점 창에서 넣으면 그 값으로 곡선이 바뀜(측점 스냅 켬이면 맞춤 뒤 값 · 못 지키면 상태줄 까닭).
- [x] 398-1 교점 끌기 · 방향키 · 노선 고침 뒤 좌측 패널 안 열림(고른 관 · 구조물 있어도) — sub7 · 확인: 시험 + 화면(접힌 좌측 패널 · 관 고른 채 교점 끌기).
- 뿌리 = 노선 고침 뒤 다시 칠하기(관 따라가기 · 배수유역 다시 나눔 응답 · 고름 되살림)가 폼을 다시 실으며 펴기를 부름 · 고침 = 「사용자 고름」 한 칸(`design_user_pick` · 진짜 누름 안 + 묶음 차례 없음)을 펴기 한 곳(`design_shared` onReveal)이 봄.
- 검증완료(sub7) — 시험 274 통과(새 test_398_1 · test_365 · 384_2 · 382-2 · 구조물 패널 · 233 · 116 등) · typecheck · 화면(검증_sub7 · 좌측 패널 접고 관 고른 채 교점 끌기 · 관 256→257 m 따라감 · 방향키 · 곡선 삭제 · 되돌리기 · Ctrl+Z · 보기 전환(초안 저장 안 함) = 펴짐 0 · 종단 알약 · 3D 측점 · 횡단 보기 알약 · 우클릭 추가 = 펴짐 1 · 밝음 · 어두움 · 세션 되돌림 차이 0) · 평면 눈금 · 마름모는 원래 좌측 폼을 안 엶(그대로) · 017080108 — 검증 대기.
- [x] 398-2 반지름 · 곡선 길이 입력이 곡선에 반영 — sub1 · 확인: 까닭 + 시험 + 화면(스냅 끔 · 켬 · 「고정」 켬 · 끔).
- 검증완료(sub1) — 까닭 = 접선은 앞뒤 직선 짧은 쪽 절반까지(서버 짝 같은 규칙)라 큰 R 이 조용히 눌림 + 창 칸은 넣은 값 그대로 보임 · 고침 = 칸은 그린 값 · 눌리면 상태줄 「반지름 60m → 23.2m(앞뒤 직선이 짧아 접선 자리 모자람)」 · 시험 12 통과(새 test_398_2) · typecheck · 화면(검증_sub1 · 진짜 마우스 · 18번째 꺾임점 스냅 끔 R 40 · 60 · L 18 · 25 그대로 · 스냅 켬 R 40 · 60 그대로 · L 17.85 · 25.07 · MC 600 · 16번째 꺾임점 40 · 60 → 23.2 · 빈 값 = 자동 12 · 길이 고정 켬 = 이웃 IP 3 m 옮겨도 L 25.07 · 끔 = 22.89 · 밝음 · 어두움 · 보기 · 접힘 되돌림 · 저장 노선 그대로) · 054f716f0 · 156ee5e79 — 검증 대기.
- [x] 398-3 어두움 테마 꺾임점 창 [곡선 삭제] · [✕] 단추 흐림(sub1 보고 · 옛 테마) — sub2 · 확인: 대비 4.5 이상 · 밝음 그대로. 검증완료(sub2 · 코드 변경 없음 — 어두움에서 새로 열면 글 · 테두리 b99aff / 바탕 251f38 = 대비 6.85 · 밝음 16.65 · 공용 토큰 그대로 · 흐림 원인 = 화면에서 테마를 바꾼 직후 단추 색 전환(0.12초)이 멈춘 상태에서만 옛 색(대비 1.06) · 새로 열면 정상 · 단추 둘 다 누를 수 있는 상태 · 되돌림 · 검증 대기)
- [x] 398-4 안 함 — 사용자 251-2: 곡선 합치기는 추천 초기노선에서만 → 모든 노선에 걸리는 접선 규칙은 그대로(406 = 접선 규칙 없이).
- 검증완료(398) — 398-1(sub7 017080108 · 접은 좌측 패널 교점 끌기 · 방향키 · 곡선 삭제 · 되돌리기 · 전환 = 펴짐 0 · 알약 · 3D · 우클릭 = 1) · 398-2(sub1 054f716f0 · 156ee5e79 · 넉넉한 자리 넣은 값 그대로 · 좁은 자리 그린 값 + 까닭) · 398-3 흠 아님(대비 6.85 · ORCA 색 전환 멈춤) · 메인 합침 · typecheck · 묶음 · 시험 150 통과 · 남은 결정 398-4 · 검증 대기.
## 399. B05 평면 구조물 측점 마커 · 1 m 옮김 · 정보 창 · 법선 (요구 250-2 · sub3 · Opus high)
- 정함(브레인): 구조물(관 · 구조물 · 사토장 등 측점 가진 것) 측점 = 평면 노선 위 마커(일반 측점 눈금과 다른 모양 · 스냅과 무관) · 노선 바뀌면 지금 규칙대로 좌표(x · y) 따라가고 누가거리 = 정수 m 로 다시 매김(사용자 말 「측점번호 유지 · 소수점 때문에 미세 이동」) · 마커 끌기 · 방향키 = 노선 따라 1 m 씩(정수 m) · 마커 고름 = 종단 아래 알약 정보 창과 같은 창 + 그 측점 횡단 법선(좌우 20 m · 391 과 같은 선) · 옮긴 값 = 초안(캐시) · [저장] 에서 정본.
- [x] 399-1 마커 그리기 · 고름 · 정보 창 · 법선 — 확인: 시험 + 화면(관 · 구조물 · 밝음/어두움).
- [x] 399-2 끌기 · 방향키 1 m 옮김 · 종단 · 횡단 따라감 — 확인: 시험(정수 m · 노선 밖 안 감) + 화면(옮긴 뒤 종단 알약 · B06 카드 측점).
- 검증완료(sub3) — 시험 test_399 11 · 관련 60 통과 · typecheck 0 · 화면(검증_sub3 · 마커 12 = 알약 12 · 색 차례 같음 · 세월교 1 · 배관 1 고름 = 정보 창(알약 벌룬 같은 줄) · 좌우 20 m 법선 · 좌측 목록 · 종단 알약 강조 · 알약 고름 → 평면 마커 · 끌기 +3 m(4+9 → 4+12 · 10+19 → 11+2) · 방향키 연달아 2 = +2 m · 종단 알약 4+14 · 오른쪽 횡단 4+14 · B06 카드 4+14(94.0 m) · 되돌리기 = 관 옮김 되돌림 · 어두움 · 저장 안 함 · 처음 자리 12 곳 · 노선 초안 없음) · 이 프로젝트는 관 · 세월교만(손 구조물 없음 · 구조물 길 = 시험) · 교각점 12 px 안 마커는 교각점이 먼저 집힘(정한 차례) · c3efa6dd7 · 9d72d15cf — 검증 대기.
## 400. 평면 고친 뒤 종단 편집 이어받기 (요구 250-2둘째 · sub6 · Opus high)
- 정함(브레인): 평면 고침 = 바뀐 구간만 종단 다시 · 안 바뀐 구간은 사용자 종단(직선화 · 자유지정 · 쉬프트 · ▲▼ 결과 = 계획고 VIP 와 그 편집)을 새 누가거리로 옮김(옛 노선 · 새 노선을 x · y 로 맞대어 같은 선 구간 찾기 · 옛 VIP 를 새 선에 투영) · 바뀐 구간 = 자동 설계로 다시 · 양 끝은 이어받은 VIP 에 맞물림(기울기 · 종단 곡선 규칙) · 평면 되돌리면 종단도 되돌림 · 서버 [저장] 도 같은 이월(파이썬 · TS 짝 또는 ② 서버 Node).
- [x] 400-1 지금 흐름 · 이월 설계 — 확인: 분석 한 장(tmp) + 시험 설계.
- 검증완료(sub6) — 끊김 셋 = 측점 스냅이 뒤 교점을 밀어 1 mm 정점 비교로 뒤쪽 전부 「바뀐 구간」 · 민 키가 측점 밖이라 [저장] 이 버림 · 걸음마다 옮겨 걸음 수 따라 다름 · 같은 자리 = 옆 1.0 m(브레인 정함 10-17) · tmp/분석_400.md.
- [x] 400-2 이월 구현 — 확인: 시험(먼 곳 교점 하나 옮김 = 바뀐 구간 밖 VIP 그대로 · 바뀐 구간만 다시) + 화면(종단 직선화 · 자유지정 뒤 교점 옮김).
- 검증완료(sub6) — 시험 test_400 19 · 344_2 · 349_0v · 346_3 · 365 · 346 · 349_0 · 356 · 367 · 368 통과(346_3 화면 도우미 6 오류 = 390-5 Apply 변경 뒤 도우미 미갱신 · 400 무관) · 스냅 켠 노선 옛 규칙 = 전 구간 다시 · 새 = 55 측점 중 39 이어받음 · typecheck · 묶음 · 화면(검증_sub6 · 진짜 마우스 · ▲ · 직선화 20~120 m · 자유지정 160~220 m · 500~540 m ▲ 뒤 18+0 교점 끌기 = 앞 0~14+0 계획고 그대로 · 뒤 460~580 m 같은 자리 계획고 차 0.04 m 안(길이 −2.6 m) · Ctrl+Z = 종단까지 되돌림 · 저장 안 하고 버림 = 저장 종단 그대로) · a1097653e — 검증 대기.
- 정함(브레인 · sub6 물음): 스냅 켠 노선은 교점 하나 고쳐도 뒤 교점이 MC 맞춤으로 옆으로 밀림 → 같은 자리 판정 = 옆 어긋남 1.0 m 까지(높이 = 옛 계획고 · 지반 = 새 것) · 상수 한 칸(바꿀 수 있음).
## 401. 평면 가운데 단추 팬 튐 (요구 250-3 · sub1 · Opus high)
- [x] 401-1 까닭 · 고침 — 확인: 시험 + 화면(가운데 단추 끌기 여러 번 · 끄는 중 바깥 나갔다 옴 · 휠 · Ctrl+휠 섞음 = 튐 0).
- 까닭: 팬이 누를 때 쥔 offset 에 「처음부터 민 만큼」을 덮어씀 — 끄는 중 휠(buttons 4 로 들어옴) · Ctrl+휠 회전 · 둘째 손가락이 바꾼 화면을 옛 값이 덮어 튐. 고침 = `_RouteEdit_Input` 걸음마다 지금 화면에 더함 · 시작 포인터만 · buttons 놓침 · 캡처 잃음에 팬 끝.
- 검증완료: 시험 6(옛 코드 휠 27px · 둘째 손가락 224px · 캡처 잃음 90px → 0) · typecheck · 5174 검증_sub1 진짜 가운데 단추 끌기 4걸음 · 휠 섞음 · 회전 15° · 끄는 중 Ctrl+휠 = 그림 어긋남 ≤1.4px(화소 칸) · 왼 패널에서 놓고 들어옴 = 그림 그대로 · 보던 화면 기억 지움(노선 맞춤 · 0°)(검증 대기).
- [x] 401-2 test_346_3_route_save_screen 6 오류(390-5 Apply 바뀐 뒤 시험 도우미 미갱신 · sub6 보고) — sub1 · 확인: 시험 통과.
- 검증완료: 까닭 = 도우미가 옛 `stationSnap()` 을 넘김(제품은 `snap()` 켬끔 · 간격 한 벌 — 맞음) · 도우미 맞춤 + 초안 stationSnapStep 칸 확인 · test_346_3 · test_390_4 · test_390_5 47 통과 · typecheck(검증 대기).
- [x] 401-3 평면 곡선 R 글이 도구줄 [되돌리기] 단추를 덮어 누름이 안 감(sub6 보고 · Ctrl+Z 는 됨) — sub8 · 확인: 화면 단추 누름 · 글은 도구줄 아래로 · 누름 안 가로챔.
- 까닭: R 창(`.b05-routeedit__label`) · 등고선 자물쇠 층 3 > 도구줄 · 횡단 판 층 2. 고침 = 둘 다 층 1(지도 위 표지 층).
- 검증완료 — 시험 16 통과 · 5183 검증_sub8 곡선 지움 → R 창을 [되돌리기] 위로 끎(겹침) · 그 자리 맨 위 = 단추 · 진짜 누름 = 「되돌렸습니다 · 곡선 26곳」 · 저장 안 함 · 종단 판 접힘 되돌림(검증 대기).
## 402. 프로젝트 다시 만들기 — 하나 파일 입력 · 전처리 시험 → 나머지 복제(같은 이름) (요구 250-4 · sub5 · Opus high)
- 정함(브레인): 지우기 전 백업(DB 프로젝트 행 · 자식 표 · storage 폴더 통째 · 되살리는 길 시험) · 원본 입력 파일 = 지금 프로젝트의 B03 원본 · 새 프로젝트 하나 = 화면 길(B02 등록 → B03 파일 입력 → B04 전처리 · 완료 메일 = 사용자 요청이라 감수) · 문제 없으면 나머지 = 복제 도구(db_management/tools_clone_project.py · storage 복사)로 지금 이름 · 주인 · 참여자 그대로 · 옛/새 id 표(OWNERS.md 검증_subN 갱신 거리 = 사용자에게 알림) · 지우기는 다른 창 화면 확인이 끝난 뒤 브레인 신호로.
- [x] 402-1 목록 · 백업 · 되살리기 시험 · 복제 도구 시험(지우기 없음) — 확인: 표 + 백업 크기 · 시험 복제 하나 열림.
- 검증완료(402-1 · sub5): 16 개 · 모두 캐미팩토리 · B03 원본 한 벌(용화.las 외 8) · 백업 C:/Aislo_backup/1017_projects(50 GB · storage 16 + db_projects.json 21 표) · 되살리기 왕복 시험 · 시험 복제 둘 열림 뒤 지움 · 도구 tools_project_backup.py 새로 · 복제 도구 참여자 · 지형층 · --owner · --members.
- 정함(브레인 · ⚠ 데스크탑 임시 배포 같은 DB · storage PC 마다 따로 · 데스크탑 D: 에도 같은 16 폴더): 데스크탑 옛 폴더는 지우지 않음(검증 사용자 작업 보존 = 백업) · 새 프로젝트 storage 는 랩탑에서 만든 바탕 폴더 하나를 Tailscale 파일 보내기(Taildrop)로 데스크탑에 보내 데스크탑에서 storage 만 복제(새 id 15 + 바탕) · 지우기는 다른 창(sub3 · sub6 · sub4) 끝난 뒤.
- [x] 402-1b storage 만 복제 길(복제 도구 --storage-only · 데스크탑에서 돌릴 차례) · Taildrop 작은 파일 시험(랩탑 → 데스크탑) · 데스크탑 D: 남은 자리 — 확인: 작은 파일 받음 · 시험 폴더 복제 열림.
- 검증완료(402-1b · sub5): --storage-only(283 파일 md5 = 통째 복제) · Taildrop 100 MB 12.8 초(3 GB ≈ 7 분 · tar 하나 · 데스크탑 Downloads 로 받음) · 데스크탑 D: 1615 GB 남음 · sub_desktop_1 storage = 임시 배포 storage 정션 · 데스크탑 돌리기 = 깃 싱크 뒤.
- 검증완료 — --storage-only 다시 만든 폴더 283 파일 md5 통째 복제와 같음 · B05 API 열림 · Taildrop 100 MB 12.8 초 MD5 같음(데스크탑 Downloads 에 저절로) · D: 1615 GB 남음 · tmp/402_데스크탑.md
- 검증완료 — 백업 C:/Aislo_backup/1017_projects 50 GB · 되살리기 왕복 B05 응답 같음 · 시험 복제 B05 열림 뒤 지움 · tmp/402_목록.md · tmp/402_계획.md
- [x] 402-2 (브레인 신호 뒤) 지움 → 새 프로젝트 파일 입력 · 전처리 → 확인 — 확인: 전처리 단계 모두 끝 · B05 열림.
- 검증완료 — 옛 16 지움(DB 연쇄 + storage · 직전 덤프 db_projects_final.json · storage 백업 /MIR 같음) · 새 검증_랩탑메인 화면 길(B02 → B03 9 파일 업로드 46 s → 전처리 4 min → 자동 체인 B05·B06 1 min) · 단계 0·1 COMPLETE · 2·3 IN_PROGRESS(체인 설계상 「사용자 검토 대기」 · 옛 16 중 15 와 같음) · B05 노선 1080.2 m · 구조물 1(17+11 배관 = 세류선 교차 하나) · B06 횡단 57 · 오류 로그 없음 · tmp/402_new_b05.png · tmp/402_new_b06.png
- [x] 402-3 복제로 나머지 같은 이름 — 확인: 목록 이름 · 주인 같음 · 각 B05 열림 · 옛/새 id 표.
- 검증완료 — 15 복제 · 이름 · 주인 · 참여자 옛과 같음 · 랩탑 8007 · 데스크탑 8000 B05 API 각 64/64 · storage 는 Synology Drive 로 랩탑 ↔ 데스크탑 동기화(데스크탑 16 폴더 296 파일 · 바이트 합 같음 · 옛 데스크탑 폴더도 동기화로 지워짐 = 랩탑 백업 + Synology 휴지통) · tmp/402_id표.md
## 403. 평면 곡선 없는 교각점(삼각) 각도 표기 (요구 250-5 · sub8 · Opus high)
- [x] 403-1 삼각 자리에도 내각 · 교각 글(곡선 있는 자리와 같은 꼴) — 확인: 시험 + 화면.
- 검증완료 — 시험 12 통과 · typecheck · 화면(검증_sub8 21번째 꺾임점 곡선 삭제 → 「내각 128° · 곡선 없음」 한 줄 · 곡선 있을 때 128° 같음 · 밝음/어두움) · 저장 안 함 · 검증 대기.
## 404. R 곡선 합치기 — 의도 분석 · 제안 (요구 250-6 · sub4 · Opus high · 코드 X)
- 사용자 의도: 크게 하나의 곡선으로 표현할 수 있는 곳은 하나로 · 곡선 사이 직선 사라짐 · 최적 경로를 찾되 가능하면 노선 단순화.
- [x] 404-1 제안(갈래 · 수치 · 전후 그림 · 지식DB 근거 · 398-4 접선 규칙과 관계) — 확인: 제안 글(tmp) · 브레인이 docs 로.
- 검증완료(404) — sub4 `C:\Aislo_wt\sub_laptop_4\tmp\제안_404.md` · 그림 `tmp/제안_404_<갈래>.png` 다섯 · 권장 ①b(같은 쪽 이웃 합치기 + 398-4 접선 규칙) = 곡선 평균 32 → 21 · 같은 쪽 짧은 직선 15~17 → 3~7 · 기울기 · 토공 그대로 · ②단순화 · ③꺾임 벌점 탈락(기울기 망가짐 · 변화 없음) · 남은 결정 = 398-4 허락 · 측점 못 놓을 때 합치기 풀기 · 이탈 4 m · S자 직선 남김 · 검증 대기.
## 405. 요구 250 마무리 — 전역 싱크 · 합치기 · 브레인 화면 검증(새 프로젝트) · 아티팩트 (브레인)
- [x] 405-1 전역 깃 싱크(작업 전).
- [x] 405-2 합치기 · 묶음 · 시험 · typecheck.
- [x] 405-3 브레인 화면 검증(399 · 400 · 401 · 403 · 새 프로젝트 전처리 · 복제) · 아티팩트 보고(242~250 · 결정 거리).
- 검증완료(405) — 전역 싱크(열세 폴더 614f12bb8) · 합침 · 묶음 다섯 · typecheck 0 · 시험 108 파일 694 통과 · 브레인 화면(옛 검증_브레인232 V1~V19 · 243~247 · 새 검증_브레인232 B05 · 마커 · 곡선 창) · 프로젝트 16 다시 만듦(랩탑 · 데스크탑 B05 16/16) · 아티팩트 https://claude.ai/artifact/G355tzL2xESFmk2z928ecz · 남은 결정 = 388-4 · 398-4 · 404(①b 결정 넷) · OWNERS.md id 갱신(사용자) · 검증 대기.
## 406. R 곡선 합치기 — 추천 초기노선 (요구 251-2 · 404 ① · sub4 · Opus high) — (일부 · 남은 줄은 PLAN.md)
- [x] 406-1 합치기 단계(Pool `_trace` 뒤 · 측점 맞춤 앞 · 새 파일 `B05_Profile_Engine_RouteInitial_Merge.py`) — 확인: 새 시험(같은 쪽 쌍 합침 · S자 안 합침 · 기울기 · 복도 · 계류 막힘).
- [x] 406-2 거리 한도 걷기(Radius `ROUTE_RECOMMEND_MAX_GAP_M` · Station `ROUTE_STATION_SNAP_MAX_GAP_M` → 직접 잼) · MC = 일반측점 늘 놓임 · `ALGO_VERSION` 6 — 확인: test_224_4 등 고침 + 다섯 갈래 지금 대비 표(곡선 · 측점 밖 0 · 최대 기울기 · 토공).
- [x] 406-3 화면(검증_sub4 추천 → [적용] → B05 곡선 · MC 측점 · 종단 열림) — 확인: ORCA 수치.
- 검증완료(406) — sub4 · 시험 12 파일 109 통과 · 12 건너뜀(새 test_406_1 7 · 옛 test_224_4 · 351_2 · 364_5 · route_initial 등 고침 없이 통과 — 이탈 한도 판은 추적 · 새 초기 노선에 그대로) · typecheck 0 · 검증_sub4 v5 → v6: gradeline · earthwork · gentle 측점 밖 0 · 기울기 위반 5/4/4 → 1 · 같은 쪽 짧은 직선 15/17/14 → 8 · 최대 기울기 19.3/19.7/17.5 → 17.6 · 절성토 ±1 % · 곡선 30/38/33 → 33 · weighted 곡선 35 → 26 · 측점 밖 1 → 5 · ORCA 5179 기울기 최소 [적용] = 계획노선 1167.4 m · 곡선 33 · MC 33 곳 모두 서로 다른 일반측점 · 최소 R 12.35 · 종단 0+0~58+7 열림 · 오류 없음 → 적용 전으로 되돌림(DB 6표 · 파일 대조 같음) · 남은 물음 = weighted 측점 밖 5 · 세 갈래 같은 선(후보 하나) · 모달 「6m 안에서 밀고」 설명 · 검증 대기.
- [x] 406-4 v6 남은 것(sub4 보고 · 표 sub4 `tmp/406_수치.md`) — 정함(브레인): ① 합칠 때 그 곡선 MC 를 기울기 지키며 측점에 놓을 수 있어야 합침(합친 뒤 풀기 아님 · weighted 측점 밖 ≤ v5) ② gradeline · earthwork · gentle 세 갈래가 같은 선(후보 하나만 남음) — v5 와 다른 까닭 찾아 v6 탓이면 갈래마다 다른 선 되살림 ③ 곡선 수가 덜 줄어든 까닭(합치기를 막은 검사별 개수 · 삼각 교점이 곡선으로 바뀐 수) 보고 ④ 추천 창 설명 「교각점을 6m 안에서 밀고」 고침 · 셈 30 → 66 s 는 기록만(기능 먼저) — sub4 · 확인: 시험 + 다섯 갈래 표 다시.
- 검증완료(406-4) — sub4 · 커밋 28e4b0eaf · ALGO_VERSION 7 · ① 합칠 때 측점 놓기 잼(합친 곡선은 IP 밀어 놓은 꼴까지 잼 통과 · 놓을 수 없는 쌍 54 은 처음부터 안 합침) + 측점 맞춤이 합친 꼴 먼저 판에 측점 밖 생기면 옛 차례 판과 견줘 적은 쪽 → 다섯 갈래 측점 밖 ≤ v5(weighted 5 → 1) ② 세 갈래 같은 선 = 거름 규칙(기준 길보다 못 지킨 곳 많으면 뺌) · v6 은 기준 길이 5 → 1 로 좋아져 나머지(기울기 위반 2~7) 탈락 — 규칙 그대로 둠 · 기준 4 로 풀면 다른 선이나 위반 1 → 4(표) · 제약 지키는 지형(언덕 시험)은 세 갈래 다른 선 ③ 합치기 막힘(gentle 묶음 같은 쪽 쌍) 통과 20 · 토공 124 · 기울기 83 · 측점 54 · 전체 잣대 7 · 이격 6 · 복도 5 · 계류 · 최소 R 0 · 삼각 → 곡선 gradeline · earthwork 7 · gentle 3(꺾이는 곳 37 → 33) · 토공 폭 20 % 면 gentle 곡선 33 → 27 · 위반 1 → 3 — 폭 그대로 ④ 설명 글 고침 · 시험 12 파일 111 통과 · typecheck 0 · ORCA 5179 설명 새 문구 · 비중 계산 [적용] = 곡선 32 · 31 곳 측점 위 · 측점 밖 1(= v5) · 종단 0+0~54+10 열림 · 오류 없음 → 적용 전으로 되돌림(DB 6표 · 파일 대조 같음) · 셈 30 → 85 s 기록 · 검증 대기.
## 407. 곡선 측점 — MC 에 측점 없으면 더함 (요구 252-2 · sub6 · Opus high)
- 정함(브레인): 224-2(스냅 켬 · 호 안 일반측점 → MC 로 옮김) 그대로 · 그 밖에 MC 에 측점이 없으면(스냅 끔 · 짧은 호) MC 자리에 곡선 측점(새 종류 `curve` · 열쇠 `curve:<누가거리>` · 이름 「No.5+7 (MC)」) · 값 = 스냅 간격 자릿수(390-5) · 일반측점 값과 같으면 안 더함 · BC · EC 안 더함 · 근거 `docs/raw/조사/2026-10-18_407_요구252_분석.md` 2장.
- [x] 407-1 측점 목록 짝(Core.py `generate_sections` ↔ `logic/B05_Profile_Sections_Stations.ts` `buildStations` · station_key 짝 · StationKind) · B06 종류 갈래 · 평면 눈금 — 확인: 거울 시험(344_3 둘) · 224_2 · 390_5 + 새 시험(스냅 끔 · 짧은 호 · 일반측점 위 MC = 안 더함).
- [x] 407-2 화면(검증_sub6 · 스냅 끔 / 켬 짧은 호 → 평면 눈금 · 종단 · B06 카드 · 오른쪽 횡단에 곡선 측점) — 확인: ORCA 수치.
- 검증완료(sub6) — 시험 381 통과 · typecheck · 화면(검증_sub6 · 저장 노선 = MC 모두 20 m 배수 → 곡선 측점 0 · R 12→17 스냅 끔 = 곡선 측점 17(19+17 (MC) 397.0m 카드 · 확폭 2.00) · 스냅 켬 0.1 · R 25 = 짧은 호 셋 398.4 · 438.4 · 478.4 · 평면 「21+18.4 (MC)」 · 오른쪽 횡단 438.4 · 밝음/어두움 · 되돌림) · fe893cfb8 · 서버 묶음 다시 지음 필요(검증 대기)
- [x] 407-3 구조물을 MC 위에 놓았다 빼면 노선 다시 저장 전까지 서버 종단에서 그 곡선 측점 빠짐(sub6 보고) — 정함(브레인): 구조물 저장 · 지움 때도 서버 측점 목록이 곡선 측점을 다시 셈(노선 저장 기다리지 않음) · sub6 · 확인: 시험(놓음 → 뺌 → 서버 종단 곡선 측점 있음).
- [x] 407-4 가까운 측점(1.6 m)과 종단 측점 이름 겹침 — 정함(브레인): 겹치면 비켜 그림(지우지 않음) · sub6 · 확인: 화면(겹친 두 이름 다 읽힘) + 시험.
- 검증완료(sub6) — 시험 334 통과(새 407_3 · 407_4) · typecheck · 407-3 = [저장] 횡단 차례 측점 맞춤이 곡선 측점 어긋남도 셈 → 놓음 = 107 구조물 측점 하나 · 뺌 = 107 곡선 측점 되살아남 · 407-4 = 화면(검증_sub6 · 스냅 0.1 · R 25 → 「19+16 (MC)」 제자리 · 「20+0」 한 단 위(13 px) 등 일곱 쌍 · 밝음/어두움 둘 다 읽힘 · 되돌림) · 5269859ee · e8f2ae02d · 98755730e · 서버 묶음 다시 지음 필요(검증 대기)
- [x] 407-5 B05 종단 아래 표(계획고 · 지반고 · 측점 행)도 가까운 측점끼리 글 겹침(sub6 보고) — 정함(브레인): 겹치는 칸만 비켜 쓰거나 세로로(지우지 않음 · 407-4 와 같은 함수 쓰면 좋음) · sub6 · 확인: 시험 + 화면(1.6 m 쌍 둘 다 읽힘).
- 검증완료(sub6) — 시험 55 통과(test_407_4 표 칸 세우기 더함) · typecheck · 화면(검증_sub6 · 스냅 0.1 · R 25 → 지반고 행 세운 칸 12 = 겹친 여섯 쌍만 · 글 겹침 0 · 확대 두 단 · 되돌림 같음 · 밝음/어두움 둘 다 읽힘 · 되돌림) · B06 같은 표 없음 · 501d9ca90 · dfb3cba24(검증 대기)
## 408. R 바꿈 뒤 뒤쪽 측점 맞춤 — 있음 · 보고 · 시험 (요구 252-3 · sub1 · Opus high)
- 정함(브레인): 반지름 · 곡선 길이 입력 = 교점 끌기와 같은 `fitCurveStations(k-1 …)` 로 뒤쪽 곡선까지 이미 맞춤(분석 3장) → 고칠 것 = 상태줄 「함께 밀린 교점 N곳 · 못 맞춘 곡선 No.…」(KeyNudge 재사용) · 뒤쪽 MC 시험 · 접선 규칙 그대로(251).
- [x] 408-1 R · 곡선 길이 입력 뒤 상태줄 보고 + 시험(R 키운 뒤 뒤쪽 MC 측점 위 · 측점 밖 개수 안 늘어남) — 확인: test_398_2 · 366_3 · 새 시험 + 화면(스냅 켬 · R 바꿈 → 뒤 곡선 MC 눈금).
- 검증완료 — 시험 72 통과 · typecheck · 검증_sub1 R 12→30 = 「함께 밀린 교점 7곳」 · 곡선 25 MC 모두 측점 위(최대 0.009 m) · 곡선 길이 = 「못 맞춘 곡선 No.38+19」 · 스냅 끔 = 보고 없음 · 뒤 MC 740.6~1001.2 어긋남 · 빈 값 · 되돌리기 · 어두움 · 저장 안 함 · 검증 대기.
- [x] 408-2 창 나눔(종단 판 열림) 때 평면 상태줄이 종단 표 밑에 깔림(sub1 보고 · 옛 배치 흠) — 정함(브레인): 고침 = 평면 상태줄이 늘 보이게 · sub1 · 확인: 화면(창 나눔 · 종단 판 열고 R 바꿈 → 상태줄 보임) + 시험.
- 검증완료 — 시험 112 통과(새 test_408_2 · 345_5c 고쳐 씀) · typecheck · 검증_sub1 판 열림 = 상태 글판 아래 418 < 판 위 430 · 접힘 = 제자리(1065 < 1077) · 창 분할 = 제자리 · 되돌아옴 = 다시 위 · R 12→30 「함께 밀린 교점 8곳」 보임 · 어두움 · 저장 안 함 · 검증 대기.
- [x] 408-3 잰 값 창(평면 오른쪽 아래)도 종단 판에 가려짐(sub1 보고) — 정함(브레인): 408-2 와 같은 올림 · sub1 · 확인: 시험 + 화면(판 열고 재기 → 창 보임).
- 검증완료 — 같이 올림 = 잰 값 창 · 오른쪽 횡단 판(손잡이 530→206 · 아래 반) · 시험 115 통과 · 검증_sub1 판 열림 = 잰 값 창 368~418 · 횡단 판 58~418 < 판 위 430 · 접힘 · 창 분할 = 제자리 · 결합 = 다시 위 · 어두움 · 되돌림 · 저장 안 함 · 검증 대기.
- [x] 408-4 오른쪽 횡단 판이 넓게 열리면 상태 글판 · 잰 값 창이 옆으로 겹침(sub1 보고 · 옛 흠) — 정함(브레인): 글판 · 창이 횡단 판 왼쪽 안에서 끝남(겹치지 않음) · sub1 · 확인: 시험 + 화면(판 넓힘 · 좁힘 · 접힘).
- 검증완료 — 빈 폭 반씩 · 반 200 px 아래 = 잰 값 창을 상태 글판 위로 쌓음 · 시험 119 통과 · 검증_sub1 횡단 판 460 = 글판 332~654 · 창 666~988 · 판 1020~ · 891 넓힘 = 창 315~365 위 · 글판 373~418 · 둘 다 ~589 < 판 621 · 312 좁힘 · 판 접힘 · 종단 접힘 · 창 분할 = 겹침 0 · 어두움 · 판 폭 460 · 닫힘 되돌림 · 저장 안 함 · 검증 대기.
## 409. 구조물 마커 맨 위 · 다른 곳 누르면 고름 풀림 (요구 252-4 · sub3 · Opus high)
- 정함(브레인): 마커 = 평면 그림 맨 마지막 · 누름 · 올림 · 커서 마커 먼저(측정 · Shift 다음) · 마커 누르면 교점 고름 풂 · 마커 아닌 곳 누름 · Esc = 마커 고름 풂 · 오른쪽 판은 마지막 측점 그대로 · 분석 4장.
- [x] 409-1 그리기 · 누름 차례 · 고름 풀기 — 확인: test_399 차례 고쳐 씀 + 새 시험 + 화면(교점 겹친 마커 누름 · 빈 곳 · 교점 · 눈금 누름 = 풀림 · Esc).
- 검증완료(sub3) — 시험 24 + 이웃 108 통과 · typecheck · 화면(검증_sub3 · 교점 13 고른 채 11 px 겹친 19+2 마커 누름 = 마커 고름 · 곡선 판 닫힘 · 빈 곳 · 교점 · 16+0 눈금 · Esc = 풀림 · 오른쪽 판 그대로 · 밝음/어두움 · 보기 · 관 자리 되돌림 · 저장 안 함) · 24fe93ba6(검증 대기).
- [x] 409-2 마커 고름 풀면 좌측 구조물 목록 줄 강조 · 그 구조물 폼도 풂(sub3 물음) — 정함(브레인): 고름은 하나 → 목록 강조 · 폼 함께 풂 · 좌측 패널 접힘 · 펼침 상태는 그대로 · sub3 · 확인: 시험 + 화면(마커 고름 → 빈 곳 · Esc → 목록 강조 · 폼 없음 · 패널 접힘 그대로).
- 검증완료(sub3) — 시험 97 통과(409 · 399 · 411-A · 398-1 · 233-1~4 · 270-1 · 이웃) · typecheck · 화면(검증_sub3 · 구조물 배치 접은 채 · 편 채 둘 · 17+16 · 19+2 마커 고름 = 줄 is-selected · 폼 A/배관 → 빈 곳 · Esc = 줄 강조 0 · 폼 「선택」 · 접힘 · 펼침 그대로 · 오른쪽 판 그대로 · 밝음/어두움 · 되돌림 · 저장 안 함) · f91c59a2f(검증 대기).
## 410. 구조물 · 관 자리 = 등고선 좌표 지킴 (요구 252-5 · sub7 · Opus high)
- 정함(브레인): 자리 기준 = 놓은(마커로 옮긴) x · y · 노선 바뀌면 새 노선에 투영해 누가거리 다시 매김(정수 m) · 마커 옮김 = 새 x · y 적음 · 배수 편집기는 따라간 값 받아 씀 · 관 초안에 x · y · 사토장 · 토취장 지금처럼 · 서버 저장 같은 규칙(짝 · 거울) · 분석 5장.
- [x] 410-1 마커 옮김 x · y · 배수 편집기 따라감 받음 · 저장 짝 — 확인: 시험(교점 옮김 · R 바꿈 뒤 관 · 구조물 x · y 그대로 · 누가거리 다시 매김 · 옮긴 구조물 안 튐) + 화면.
- 검증완료 — 좌표 낡음 판정(좌표가 누가거리를 안 낳으면 노선 위로 · TS placeOnLine ↔ 파이썬 fill 짝) · 배수 편집기 id 짝 따라감 · 초안 둔 채 열기 자리 · test_410 7 · 이웃 시험 55 통과 · typecheck · 검증_sub7 교점 끌기 = 관 351→354 · 구조물 159→167 · 260→266 x · y 그대로 · 마커로 167→246 옮긴 뒤 교점 끌기 = 250 · 새 x · y(옛 자리로 안 튐) · 다시 열기 = 205 · 354 그대로 · 되돌리기 · 초안 버림 = 351 · 저장 안 함 · 세션 되돌림 · 묶음 다시 지음 필요 · 74ae3ac26(검증 대기).
## 411. 마커 옮기면 새 측점 · 오른쪽 횡단 빔 (요구 252-6 · A sub3 · B~D sub7 · Opus high)
- 정함(브레인): 오른쪽 판 = 구조물 · 관 골라도 그 측점 횡단 그림 · 관 · 구조물 짝 = id(정렬 차례 짝 걷음) · B06 열쇠 = 파이프라인과 같은 규칙(서버 관 id 도 `pipe:`) · 분석 6장.
- [x] 411-A 오른쪽 판 구조물 · 관 고름 횡단(Cross.ts `watching.structure` 걷음 · 옮긴 뒤 다시 고름) — sub3 · 확인: 시험 + 화면.
- 검증완료(sub3) — test_411_a 7 통과 · 화면(관 19+2 · 17+16 마커 고름 = 그 측점 횡단(집수정) · 17+16 → 17+13 끌기 = 판 17+13 · 되돌려 17+16) · 옮긴 뒤 = 측점 열쇠로 따라감(다시 고름 안 씀) · 24fe93ba6(검증 대기).
- [x] 411-B 관 id 짝 차례 → id(`shownPipes` · `movePipeId` · `followedMarks` · `followPipeReports`) · 411-D B06 열쇠 — sub7 · 확인: 시험(앞 관 지나 옮김 = 알약 · 측점 수 그대로 · id 그대로) + 화면(노선 고친 초안 · 안 고친 상태 둘 · B06 카드 계획고 0 아님).
- 검증완료 — 관 알림에 고정 id · 세션 id = 관 고정 id 표로 새 자리(placePipeIds · 헛 id 뺌) · followedMarks 같은 자리 먼저 · B06 useStationOwners 서버 관 id = pipe: · test_411_b 8 통과 · 검증_sub7 안 고친 상태 200→100(앞 관 120 지남) = 알약 5 · 측점 56 · id 그대로 · 노선 고친 초안 354→110 · 205→110 · 300→89 = 알약 5 · id 그대로 · B06 카드 4+9 계획고 863.6(0 아님) · 저장 안 함 · 세션 되돌림 · 74ae3ac26(검증 대기).
- 남은 것 — B06 `Station_Keys.ts` 관 같은 옛 측점 열쇠(`pipeIdAt` 지음 · sub6 줄)가 옛 자리에 헛 세션 id 를 지음(화면 맞춤이 빼서 지금은 무해).
- [x] 411-E B06 `Station_Keys.ts` 관 옛 측점 열쇠가 옛 자리에 헛 세션 id 를 지음(sub7 보고 · 지금 무해) — 정함(브레인): 걷음(옛 자리 id 안 지음) · sub7 · 확인: 시험(관 옮김 뒤 세션 id 표에 헛 id 0) + B06 카드 그대로.
- 검증완료 — 관 계획을 아는 동안(초안) 계획에 없는 관 측점 = pipeIdNear(안 지음) · 초안 없음 = 옛 갈래 · 화면 맞춤 때 지금 관 자리 밖 기록 정리 · test_411_b 10 · test_407 · 344_3 · 이웃 시험 136 통과 · typecheck · 검증_sub7 교점 끌기 · 208→110(앞 관 120 지남) · B06 열기 = 세션 id 표 3(관 3 · 헛 id 0) · B06 카드 5+10 계획고 861.7 · 되돌리기 두 번 = 120 · 200 · 351 · id 그대로 · 쌓인 헛 id = 열 때 정리 · 저장 안 함 · 세션 되돌림 · 274a0f892(검증 대기).
## 412. 요구 253 검토 — 추천 기울기 · 재계산 · 십자선 둘 · 한 페이지 끊김 · R 개수 · 교차 원 · 초기화 · 탄젠시 점 (브레인 · 클로드 에이전트 넷 · 코드 X) — (일부 · 남은 줄은 PLAN.md)
- [x] 412-1 분석(1~8장) — 확인: 에이전트 넷 file:line · 시제품 수치(저장본 재현 뒤) · 브레인 판단.
## 413. B06 십자선 = 형상과 한 높이 + 원지반 십자선 (요구 253-2 · sub6 · Opus high)
- 정함(브레인): 보라 십자선 높이 = 그 측점 설계 높이(`section.design.design_elevation_m` · 형상과 같은 값 · 없을 때만 종단 표본) · 평면 초안 때 종단 표본(`design_profiles`)도 초안 종단으로 · 원지반 십자선 = `section.center_z`(없으면 가까운 표본) · 원지반 색 `--color-chart-1` · 보라보다 먼저 그려 겹치면 보라 위 · 다른 무리 class · 상세 창 확대 보정 둘 다 · B05 오른쪽 판 같은 규칙 · 근거 분석 412 5장.
- [x] 413-1 십자선 한 출처 · 원지반 십자선 — 확인: 시험(초안 때 십자선 y = 형상 높이 · 원지반 십자선 보라 앞 · 318 · 150 · 164 고쳐 씀) + 화면(평면 교점 끌기 → B06 카드 · 오른쪽 판 십자선 = 도로 형상 · ▲▼ 같이 움직임 · 원지반 십자선 · 겹침 보라 위 · 밝음 · 어두움).
- 검증완료 — 시험 318 · 150 · 164 · 346_2 · 349_0f · 349_0j · 365 통과 · typecheck · 화면(검증_sub6 · 5181): 평면 초안(중심점 ▶ 2 m) B06 카드 17 · B05 오른쪽 판 2 = 보라 십자 ↔ 도로 형상 0 px · ▲▼ +0.3 m = 둘이 4.25 px 같이 · 원지반 십자 먼저 · [상세] 확대 보정 둘 다 · 원지반고 칸 = 원지반 십자 · 밝음 · 어두움 · 세션 되돌림 · 검증 대기.
## 414. B06 교차 원 = 절토 · 성토 바뀜 자리만 · 마우스 가까이만 + 평면 BC · EC 네모 노선 뒤 (요구 253-5 · 253-7 · sub3 · Opus high)
- 정함(브레인): 교차 원 = 그 쪽 도로 끝 높이 = 원지반 ±5 mm(`edgeOnGround` · `bare`)일 때만 · 평소 투명 · 마우스 가까이 · 고름 때 보임 · 누르면 지금처럼 고름 → ◀▶ 로 절토 ↔ 성토 · 평면 = 모든 곡선 BC · EC 네모를 예상노선 뒤 · 노선 앞으로(고른 곡선 BC · MC · EC 는 위 그대로 · 잡기 14 px 그대로) · 근거 분석 412 6장 · 8장.
- [x] 414-1 교차 원 — 확인: 시험(`test_370_2` 세 건 바뀜 단면으로 고쳐 씀 · 보통 단면 원 0) + 화면(양쪽 절토 측점 ◀ 로 밀어 바뀜 자리 → 가까이 원 보임 · 눌러 성토로 · 멀면 안 보임).
- 검증완료 — 시험 7 통과 · 화면 4+0 원 0 → ◀ 한 번에 바뀜 자리 원 1 · 평소 투명 · 올림 보임 · 19 px 밖 안 보임 · ◀ 성토 · ▶ 양측 절토 · ↺ 되돌림.
- [x] 414-2 BC · EC 네모 노선 뒤 — 확인: 시험(`test_381_3:26` 고쳐 씀 · 391 · 399 · 346_2 통과) + 화면(네모 위로 노선 지나감 · 손잡이 끌기 그대로).
- 검증완료 — 시험 56 통과(7 건너뜀 = 검증_sub7 없음) · 화면 노선이 네모 위로 지나감 · 네모 눌러 32번 곡선 고름.
## 415. 한 페이지 끊김 ① — 시설 옮김이 횡단 편집 지움 · [저장] 중 옛 목록 · 두 길 측점 (분석 412 3장 H1 · H2 · M4 · sub7 · Opus high)
- 정함(브레인): H1 = 노선 입력이 바뀐 때만 「노선 바뀜」 이월 규칙 · 관 · 구조물만 옮기면 측점 열쇠째 편집 옮김(사면 쉬프트 · 소단 깊이 · 단면 유형 · 측구 쪽 · 포장 그대로) · H2 = [저장] 중 계산 줄 먹이기 멈춤 · 끝나면 저장 목록 다시 읽음 · M4 = 새 시설 측점 서버 미리보기(`Section_Drafts.ts:84-96`) 걷음(브라우저 계산 줄 하나) · 고치기 전 화면 재현 먼저(재현 안 되면 까닭 보고).
- [x] 415-1 H1 · H2 · M4 — 확인: 시험(관 옮김 뒤 세션 shoulderext · crossdesign 그대로 · 저장 중 runs 에 pipe/structure 없음 · 미리보기 요청 0) + 화면(B06 사면 쉬프트 · 단면 유형 → B05 관 5 m 옮김 → 편집 그대로 · 관 10 m + 지반 바꿈 → [저장] → 저장 본문 값).
- 검증완료 — test_415 7 · 관련 51 파일 294 통과 · 화면 = 관 351→356→361 편집 그대로(관 측점 고침 포함) · 저장 중 관 측점 361 유지 · 저장 본문 340 쉬프트 0.7 · 360 · 361 right_cut · 380 blasting_rock · 미리보기 0 · 되돌림 완료.
- [x] 415-2 관 옮긴 뒤 [되돌리기] = 목록은 원래인데 공용 캐시 측점은 옮긴 자리(sub5 보고) — 415 와 같은 자리 · sub7 · 확인: 시험 + 화면(옮김 → 되돌리기 → 측점 · 캐시 원래).
- 검증완료 — test_415 되돌리기 · 화면 = 356 옮김 → 되돌리기 351(입력 · 측점 · 캐시 · 관 측점 고침) → 다시하기 356.
- [x] 415-3 저장 노선 → 첫 초안 갈아끼움 때 관 측점 열쇠 갈림(B06 세션 pipe-s1 ↔ 계산 줄 pipe:p35100 · 누가거리 조절 초안 카드로 안 따라감 · sub8 알림) — H2 와 같은 자리 · sub7.
- 검증완료 — 열쇠 갈림 = 415-1 로 풀림(B06 연 길 · 초안 카드 358 옹벽 조절 그대로) · B05 만 연 길(조정창 맵 없음)은 안 따라감 → 갈아끼움 뒤 세션 칸 바로 옮김(옹벽 · 세월 · BOX · 집수 · 연동) · test_415 8 · 관련 50 파일 302 통과(323-9 둘 실패 = 합친 HEAD 에서도 · 이번 고침 무관) · 초안 버리면 351 되돌림.
## 416. 한 페이지 끊김 ② — 저장 뒤 새 자료 · 관 길이 출처 · 오른쪽 판 노선 id (분석 412 3장 M1 · M5 · L2 · sub5 · Opus high)
- 정함(브레인): M1 = [저장](노선 안 바뀜) 끝에 늘 자료 다시 읽고 종단 · 오른쪽 판 다시 그림 · M5 = 관 길이는 공용 캐시(페이지 노선)에서 · L2 = 오른쪽 판 = 페이지 노선 id · 암선 기본값 = config.
- [x] 416-1 M1 · M5 · L2 — 확인: 시험 + 화면(B05 [저장] 뒤 평면 측점 누름 → 오른쪽 판 횡단 그림 · 면적 = B06 · 관 옮긴 뒤 좌측 관 길이 = B06 카드).
- 검증완료 — test_416 · 관련 391 통과 · 화면 B05 [저장] 뒤 10+0 판 = B06 카드 · 면적 3.5177/2.0208 = B06 · 관 17+11→17+5 좌측 7 m (6.6) = B06 카드 L=7 m (6.6) · 어두움 판 정상 · 조작 값 되돌림(9feba3de1 · 1db2f8f44).
- [x] 416-2 `test_323_9_save_redraw` 둘 실패(메인 69823d830 · 저장 뒤 B06 카드 = 옛 자리 4+5 · 새 자리 4+8 · 47+0 아님 · 저장 중 다시 그림 차례 다름 · sub7 알림) — 416 M1(저장 끝 캐시) · 415 H2(저장 중 먹이기 멈춤) 중 어느 고침 탓인지 찾아 코드 고침(시험이 옛 규칙이면 까닭 보고 뒤 고쳐 씀) · sub5 · 확인: 323_9 · 416 · 415 · 323 묶음 통과 + 화면(B06 [저장] 뒤 카드 새 자리).
- 까닭 = 416 M1(9feba3de1) 이 캐시 비우기를 횡단 보기 done → 한 벌(design_shared) done 으로 옮김 · 헬퍼가 횡단 보기 done 만 불러 비우기 빠짐(앱 흠 아님) → 헬퍼 done = 한 벌 차례.
- 검증완료 — 323 · 415~417 · 관련 421 통과 · 화면 B06 관 17+11→17+8 [저장] 뒤 카드 17+8(L=8 m (7.7)) · B05 [저장] 뒤 오른쪽 판 카드 · DB · 파일 백업대로 되돌림(beec356af · ce8c9c1f2).
## 417. 한 페이지 끊김 ③ — 평면 바꾼 저장 때 B06 조절 · 평면 초안 중 B06 단추 · 소단 깊이 (분석 412 3장 M2 · M3 · L4 · sub8 · Opus high)
- 정함(브레인): M2 = 노선 바꾼 [저장] 때 B06 거리 열쇠 조절(옹벽 · 세월 · BOX · 집수 · 덧 옹벽 · 경간 · 잇기 · 측점 폭 · 메모 · 상세 표) · 사면 쉬프트 · 소단 깊이를 새 노선 측점으로 옮겨 실음(측점 옮김 목록 · 서버 이월 열쇠 짝 · 거울 시험) · M3 · L4 = 평면 초안 횡단 입력에 사면 쉬프트 · 조절 · 소단 깊이 넣음(초안 중에도 B06 단추 먹음 · 저장 뒤 안 사라짐).
- [x] 417-1 M2 · M3 · L4 — 확인: 시험(노선 바꾼 저장 뒤 옹벽 조절 · 사면 쉬프트 남음 · 초안 중 ◀▶ 반영) + 화면(B06 옹벽 조절 → 교점 끌기 → [저장] → 조절 그대로 · 초안 중 사면 ◀▶).
- 검증완료 — test_417 8 · 관련 101 통과 · typecheck 0 · 화면(검증_sub8) 관 351 m 옹벽 d 0.9 + 400 m 사면 0.5 → 교점 끌기 → [저장] → 새 노선 관 334 m d 0.9 · 400 m 0.5(DB · 카드) · 초안 중 사면 ◀ 0.50 → 0.70(성토사면 0.65 → 0.78 m) · 초안 중 옹벽 ▶ 반영 · 프로젝트 되돌림.
## 418. 초기화 정리 (요구 254-3 · 253-6 · sub1 · Opus high)
- 사용자 확정(254-3): 「노선 추천」 칸 [초기화] 지움 · 아래 [초기화] 기준 = 노선 추천으로 사용자가 [적용]한 노선(다른 추천으로 바꾸면 그것) — 지금 스냅샷 규칙 그대로.
- 정함(브레인): 노선 추천 [초기화]만 쓰던 길(편집기 handler · 「follow」 initial_choice 쓰기 · 전처리 초기 노선 읽기가 이것만 쓰면 함께) 걷음 · 아래 [초기화]는 저장 안 한 B08 · B09 초안 안 지움(B05 · B06 범위만) · 확인창 글 그대로.
- [x] 418-1 — 확인: 시험(단추 없음 · 아래 [초기화] 뒤 b08-* · b09-estimation 초안 남음 · 추천 [적용] → 고침 → 아래 [초기화] = [적용] 노선) + 화면.
- 검증완료 — `test_418_reset_cleanup` 등 77 통과 · typecheck 0 · 5174 화면 노선 추천 칸 단추 [노선 추천] 하나 · 아래 [초기화](서버 응답 가짜) 뒤 b08 넷 · b09-estimation 남음 · route-draft 지움 (af5c91e27).
## 419. 노선 추천 엔진 — 원지반 기울기 참고만 · 삼각 없음 · 측점 필수 · 합치기 = 횡단 토공 (요구 253-1 · 253-4 · 254 · sub4 · Opus high)
- 사용자 확정(254): 곡선 수 줄이기 = 추천 안 기능(옵션 아님) · 측점 맞춤 필수 · 토공 = 측점별 횡단.
- 정함(브레인): `docs/raw/조사/2026-10-18_419_요구254_추천엔진.md` 4장 — 후보 거름 · `_trace` 판 · 큰 R · 합치기 · 측점 맞춤의 원지반 기울기 막기 걷음(탐색 링크 상한 남김 · 시종점 상한 넘음 알림) · 합치기 멈춤 = 노선 횡단 토공 +10 %(엔진 상수) · 판정 = 바뀐 측점 횡단 차이(420 `cross_earthwork_delta`) · 후보 줄 세움 = 상한 누른 계획선 횡단 → 위 3 균형 종단 → 고른 하나 정밀 · 삼각 없음(155° 이상도 곡선 · 못 두면 교점 지움) · MC = 일반측점 필수 · raw · unsnapped 걷음 · 시간 = 첫 갈래 지금 + 20 s 안.
- [x] 419-1 엔진 고침 — 확인: 시험(위반 수 = R · 계류 · 측점 · 삼각 0 · 측점 밖 0 · 갈래마다 다른 선 · 합치기 판정 횡단 차이) + 다섯 갈래 v7 대비 표(곡선 · 삼각 · 측점 밖 · 원지반 최대 기울기(참고) · 횡단 절 · 성 · 시간) + 화면(검증_sub4 추천 → [적용] → 곡선 · MC 측점 · 종단).
- 검증완료 — 시험 145 통과(test_419_1 새 · 406_1 · route_initial · 351_2 · 383_1 · 224_4 고침) · 검증_sub4 곡선 33 → 16~18 · 삼각 0 · 측점 밖 0 · 세 갈래 10~14 m 다른 선 · earthwork 횡단 21,577 → 20,194 ㎥ · 첫 갈래 123 → 50 s · 화면 [적용] 곡선 17 · MC 측점 위 17/17 · 위 3 → 5(표 `tmp/419_수치.md`).
- [x] 419-2 후보 고르기 순서 의존(sub2 찾음 · 정밀 · 빠른 판 종단 섞어 견줌 → 캐시 따라 선 바뀜 · 420 전에도) — 같은 잣대끼리 줄 세우고 정밀은 고른 하나만 · `test_weight_ends_match_branches` xfail 풀기 · sub4.
- 검증완료 — 정밀 종단은 낼 사본에만(캐시 후보 = 빠른 판끼리) · xfail 풂 · 시험 test_419_1(캐시 후보에 정밀 없음 · 다른 갈래 먼저 돌려도 같은 선 · 고침 빼면 실패) · 대상 시험 199 통과.
- [x] 419-3 [적용] 뒤 종단 최대 14.47 % > 상한 14 %(추천 셈 2 m 지형 14.0 % · [적용] 1 m 지형 · sub4 보고) — 정함(브레인): [적용] 종단도 상한 지킴(1 m 지형으로 다시 맞춘 뒤 넘으면 그 구간 다시 맞춤 · 종단곡선 넣은 뒤 다시 잼) · 위 5 개 균형 종단(설계 3 → 5) 승인 · sub4 · 확인: 시험 + 검증_sub4 [적용] 뒤 최대 ≤ 상한.
- 검증완료 — 원인 = 종단곡선 넣으려 꼭짓점 미는 맞춤(`pass_through`)이 직선을 가파르게 함 · 꼭짓점 맞춤에 직선 기울기 상한(균형 종단 상한 · 반올림 여유 0.1 mm) · 검증_sub4 토공 최소 [적용] 뒤 최대 14.47 → 14.0 %(넘음 표시 없음) · 되돌림(파일 차이 0 · DB 행 같음).
- [x] 421-2 추천 창 「제약 못 지킨 구간 N곳」 = R · 계류 · 측점만 셈 · 원지반 기울기는 「원지반 기울기(참고)」 줄로 따로 · `ends_over_limit` 이면 「시종점 높이 차가 상한을 넘음 — 종단으로 못 맞춤」 알림(sub4 보고) · sub1 · 확인: 시험 + 화면.
- 검증완료 — `test_421_2_violation_lines` 등 35 통과 · typecheck 0 · 5174 검증_sub1 다섯 갈래 = 기준 초과 0 · 못 지킨 구간 없음 · 원지반 참고 최대 35.8 / 25.5 / 23.4 / 21.8 / 30.7 % · 넘는 곳 14 / 10 / 8 / 10 / 11 · 시종점 알림은 응답 고쳐 밝음 · 어두움 확인 (8229a5449).
- [x] 421-3 추천 창 「지형상 14% 로 못 이어져 상한을 29.1% 로 풂」 글 = 「탐색 링크 한도 14 → 29.1 % 로 풂(지형상 14 % 로 못 이음 · 4 m 마디 원지반)」 꼴로(엔진 맞음 · 잣대가 원지반 참고 20 m 와 다름 · sub4 보고) · sub1 · 확인: 시험 + 화면.
- 검증완료 — `test_b05_routeedit_initial` 등 30 통과 · typecheck 0 · 5174 검증_sub1 토공 최소 = 「탐색 링크 한도 14.0 → 29.1% 로 풂(지형상 14.0% 로 못 이음 · 4 m 마디)」 · 원지반 참고 최대 23.4 % 줄과 함께 밝음 · 어두움 확인 · 도움말 「탐색 링크 한도를 풂」 (0456c2d3d).
## 420. 추천 횡단 토공 · 저장본 판 · [재계산] 서버 (요구 254 · sub2 · Opus high)
- 정함(브레인): 새 `B05_Profile/B05_Profile_Engine_RouteInitial_CrossEarth.py` = `cross_earthwork(line, chainages, design_z | None, terrain, standard)` · `cross_earthwork_delta(before, after, changed_chainages, …)`(공식 `compute_cross_design` · 평균단면법 · 종단 끔 = 계획고 지반고) · 균형 종단 표준단면 = 프로젝트 저장 패널값 · 결과 절 · 성 = 횡단 · `ALGO_VERSION` 8 + 엔진 소스 지문 열쇠 · 옛 판 저장본 미리 셈 때 지움 · 요청 `recompute` = 묶음 잠금 안에서 지금 입력 묶음 저장본 지우고 `_POOLS` 버림 → 새로 셈 · `initial_choice.json` with_profile · 미리 셈 = 종단 켬 다섯 갈래.
- [x] 420-1 — 확인: 시험(횡단 토공 = 저장 정본 ±6 % · 재계산 = 파일 새로 · 셈 수 1 → 2 · 옛 판 지움 · with_profile 되살림 · 224_3 · 351_1 · 343_2 · 364_4 고쳐 씀).
- 검증완료 — 시험 420_1 12 · 224_3 · 351_1 · 343_2 · 364_4 · route_initial 통과 · 검증_sub2 횡단 토공 = 저장 정본 절 +2.3 % · 성 +4.0 %(2 m) / +0.8 % · +1.2 %(1 m) · 0.18 s · 8004 실제 요청: 옛 판 10 지움 → v8 다섯 · [재계산] 저장본 5 지움 → 새 파일 · 뒤 요청 저장본 (eee1da09f) · 검증 대기.
- [x] 420-2 sub2 물음 답 — 정함(브레인): ① 다른 엔진 지문 저장본 자동 지우기 걷음(두 PC · 워크트리가 서로 지움) — 지문 다른 파일은 안 읽고 둠 · 30일 지난 것만 지움 · [재계산]은 지금 입력 것만 지움 ② `test_each_branch_best_at_own_goal` 파일째 돌릴 때 실패(앞 시험 묶음 캐시) = 시험끼리 캐시 비우기 · sub2 · 확인: 시험(지문 다른 파일 남음 · 30일 지난 것 지움 · 파일째 통과).
- 검증완료 — route_initial 파일째 · 420_1 · 224_3 · 351_1 · 343_2 · 364_4 = 80 통과 · 1 xfail(`test_weight_ends_match_branches` — 캐시 비우면 420 전 코드에서도 실패 · 엔진 pick 정밀 · 빠른 판 섞어 견줌 · 419 에서 풂 · 브레인 지시) · 다른 지문 29일 남음 · 31 · 40일 지움 · 재계산 · 두 벌 정리에서 다른 지문 안 건드림 (dfe17b5ee) · 검증 대기.
## 421. 추천 창 — 측점 맞춤 → 종단 반영 · [재계산] 늘 켜짐 (요구 254-2 · sub1 · 418 뒤 · Opus high)
- 정함(브레인): 「측점 맞춤」 단추 지움 → 그 자리 「종단 반영」(기본 켬 · 다섯 갈래 · 누르면 바로) · [적용] 균형 종단 = 단추 값 · [재계산] 늘 켜짐(입력 오류 · 셈 중 빼고) · `recompute` 보냄 · 도움말 글 · unsnapped 화면 걷음.
- [x] 421-1 — 확인: 시험(383_3 · 383_1 · 351_2 · 345_4 고쳐 씀) + 화면(종단 반영 끔 · 켬 · [재계산] = 진행 줄 · 새 결과 · [적용] 뒤 종단).
- 검증완료 — `test_421_recommend_profile` 등 58 통과 · typecheck 0 · 5174 검증_sub1 추천 창 = [종단 반영] 켬 기본 · 끔 → with_profile false 바로 셈 · 균형 종단 줄 사라짐 · [재계산] 진행 줄 + recompute true · [적용](저장 가짜) 몸통 balanced_profile · initial.with_profile = 단추 값 (67de77c48) · 남음 = 「새 결과」 · 「[적용] 뒤 종단」 실제 값은 420 서버 합친 뒤.
## 422. 요구 253 · 254 마무리 — 합치기 · 시험 · 다음 장 후보 (브레인)
- [x] 422-1 합치기 · 묶음 다섯 · typecheck · 장 시험.
- 검증완료(422) — 413~421 · 415-2 · 415-3 · 416-2 · 419-2 · 419-3 · 420-2 · 421-2 · 421-3 메인 합침(ce8c9c1f2) · 서버 묶음 다섯 · typecheck 0 · 장 시험 58 파일 421 통과(실패 둘 = 323_9 헬퍼 옛 차례 → 416-2 고쳐 3 통과) · 창마다 화면 확인(브레인 화면 검증 · 아티팩트는 요청 없음) · 쉬는 창 여덟 /clear · 탭 0 · 검증 대기.
- [x] 422-2 다음 장 후보 → 424~432 로 넘김(요구 255~261) — (요구 255 확인 · 에이전트 재현 = 서버 코드 · 1 m 지형 · 저장값과 소수 넷째 자리 같음 · 사용자 지시 뒤) — ① 관 옮긴 초안의 관 길이 7.2 대 저장 뒤 7.7 m — 257 재확인: 집수정 높이는 안 잃음(관 옵션에 저장 · 옮겨도 따라감 · 1.2 는 빈 칸 기본값 · 255 설명 틀림) · 더 맞는 까닭(추정) = 초안 그림의 노면 끝(노견 · 확폭 포함) 자리가 저장 뒤보다 0.35~0.4 m 좁았음 → 형상 차 → 길이 차 · 판정 = 348 m 초안 카드 S(약 0.6 % = 높이 · 0.0~0.1 % = 노면 끝) 또는 초안 `design.road_edges` 한 번 보기 ② 관을 옮겼다 되돌려 저장하면 그 자리 **종단 계획선**의 꺾임점(VIP)이 사라져 안 돌아옴(351 m 원지반 지나던 꺾임점 → 1.26 m 깎인 모양 · `_follow_moved_stations` · `followMovedNodes` 가 지우기만 · 새 측점에 안 세움 · 「최소고 강제」(관 위 흙 0.5 m 하한 · 기본 꺼짐)와 무관) ③ [초기화] 빈틈 — 스냅샷 없는 폴백이 덧 측점 안 지움 · 스냅샷에 배수 폴더 없으면 관 편집 안 돌아감 · M02 구조물 복사본 · 하위 단계 STALE 안 맞춤(정상 길은 구조물 · 관 목록 · 위치 다 돌아감).
## 423. 평면도 교각점 녹색 계열 · 테마 (요구 256 · sub3 · Sonnet high)
- 정함(브레인): 교각점(IP 원 · 곡선 없는 교각점 삼각) 색 = 녹색 계열 · 밝음 · 어두움 따로 토큰(지도 바탕 · 노선 · 등고선 · 세류선과 대비 · 어두움에서도 읽힘) · 고른 교각점 · 올림 표시는 지금처럼 구별되게 · 다른 표지(BC · EC 네모 · 곡선 3점 · 구조물 마커) 색 그대로.
- [x] 423-1 — 확인: 시험(색 토큰 읽기 · test_349 등 통과) + 화면 한 장씩(밝음 · 어두움 · 고른 교각점).
- 검증완료 — 새 토큰 `--map-route-node`(밝음 #15803d · 어두움 #4ade80 · 테마 css 세 자리) · 교각점 원 · 삼각 채움만 녹색(기준 미달 붉음 · 고정 황금 · 올림 고리 · BC · EC 네모 · 구조물 마커 그대로) · test_349 · 391 · 381_3 통과 + 새 토큰 시험 1 · typecheck 0 · 화면(검증_sub3) 밝음 · 어두움 · 고른 교각점 모두 녹색 구별됨 · 사진 tmp/423_light.png · 423_dark.png · 423_pick_dark.png · 423_pick_light.png (검증 대기).
## 424. 횡단 설계중심 좌우 끔 — 좌우는 평면으로만 (요구 260 · sub1 · Opus high)
- 사용자 확정(260): 횡단도 설계중심 ◀▶ · 좌우 끌기 작동 안 함 · ▲▼ 는 그대로.
- [x] 424-1 B06 `B06_Section_UI_Cross_Design_Pick.ts:400, 541-569` 가로축 · `B06_Section_UI_Cross_Center.ts` 노선 이동 · `A00_Common/design/design_page.ts:155` · `B05_Profile_UI_RouteEdit.ts:625` · `B05_Profile_UI_RouteEdit_Shift.ts` · `logic/B05_Profile_RouteShift.ts` 걷음 — 확인: 시험(356 · 356_4 고쳐 씀) + 화면(◀▶ 없음 · ▲▼ 됨).
- 검증완료 — 중심점 칸 = 버튼 0 · 「▲▼ = 종단 계획고 · 좌우 이동은 평면에서」 · 시험 356(가짜 DOM · ◀▶ 키 막음 · 끌기 듣개 0) · 이웃 시험 280 통과(356_4 넷은 검증_sub7 storage 없어 건너뜀) · typecheck 0 · 화면(검증_sub1 · 5174) ◀▶ = 세션 변화 0 · ▲ = 계획고 초안 생김 · 세션 되돌림 (검증 대기).
## 425. B06 위 평면도 겹침 패널 (요구 258 · sub2 · Opus high)
- 정함(브레인): 분석 424 5장 — 기존 평면 편집기 노드를 횡단 보기 위 겹침 패널로 옮김(열 때 · 횡단 숨김 때 제자리) · 여는 손잡이 · 패널 모두 겹침(z 4 · 높이 45 % 안) · 단추 줄 · 상태줄 · 범례 · 잰 값 · 오른쪽 횡단 판 · 등고선 자물쇠 숨김 · 보기 · 팬 · 휠 확대만(편집 막음) · 평면 방향키 범위 좁힘 · 새 `A00_Common/design/design_plan_peek.ts` · `RouteEdit.ts` · `Style_Cross.css` 안 건드림.
- [x] 425-1 — 확인: 시험(test_258 새 · design_view_parity · design_page_single · 349_0h · 345_5 · 356 · 207_1) + 화면(B06 바로 열기 → 손잡이 → 평면 · 카드 고름 → 법선 · ▲▼ 뒤 평면 다시 그림 · 밝음 · 어두움).
- 검증완료 — 시험 49 통과 · 4 건너뜀(356-4) · typecheck 0 · 화면 높이 0.450 · z 4 · 왼 · 오른 누름 · 두 번 클릭 막힘 · 가운데 · 휠 통과 · 카드 고름 · 계획고 바꿈 뒤 평면 다시 그림 · B05 로 가면 제자리 · 어두움 · 값 되돌림.
## 426. 종단 직선 판정 하나 · 끝점 꼭짓점 · 편집 측점 수 (요구 259 · sub3 · Opus high)
- 정함(브레인): 분석 424 6장 · 10장 — 직선 판정 = 높이 기준(1e-5 m) 한 함수(TS `Alignment.ts` buildCurves ↔ 파이썬 `Grade_Alignment.py:306` 짝 · Straighten 직선 찾기 · Pivot 이웃끼리 · 표는 안전망) · 직선화 · 자유지정 끝점이 꼭짓점 아니면 지금 높이로 꼭짓점 세움 · 고른 직선 기울이기 = 지금 경첩 높이 + 걸음 · 직선이 된 꼭짓점 기억 R 지움 · 「편집 측점 N개」 = 꺾인 편집 꼭짓점 수 · 0 오프셋 지움.
- [x] 426-1 — 확인: 새 시험(붙은 측점 100/100.4 · 120/120.25 · 직선화 뒤 R 없음 · 40~140 한 직선 · ▲ 톱니 없음 · 누름 쌓임 · 끝점 꼭짓점 아님 · 파이썬 거울) · 355_1 · 215_1 · 344_2 · 400 + 화면(구조물 측점 끼인 구간 직선화 · 자유지정 → 표 R · ▲▼).
- 검증완료 — 직선 판정 = 꼭짓점 높이 1e-5 m 한 함수(TS `logic/B05_Profile_Profile_Straight.ts` ↔ 파이썬 `is_straight_bend`) · 곡선 넣기 · ▲▼ 축(이웃끼리) · 직선 찾기 · 적용 한 곳 `tidyEdits`(직선 위 R · 0 오프셋 지움) · 끝점 꼭짓점 아니면 지금 높이로 세움(직선화 · 자유지정) · 고른 직선 기울이기 = 지금 경첩 높이 + 걸음 · 편집 측점 수 = 꺾인 편집 꼭짓점 · 새 test_426 10 + 손댄 파일 시험 26개 218 통과 · typecheck 0 · 화면(검증_sub3 · 저장 안 함) 18+0~21+0 직선화(19+8 · 19+9 붙은 구조물 측점) 뒤 R 빈칸 · 편집 측점 표시 없음(옛 4개) · 19+0 ▲ 두 번 = 그 점만 R · 톱니 없음 · 자유지정 21+0~24+0 = 22+0 R 151.9 · 23+0 빈칸 · 고른 직선 ▲▲▼▼ = 경첩 +0.1 · +0.2 · +0.1 · 0 · 끝에 R 빈칸 · 사진 tmp/426_straight_up.png · 426_tilt_back.png · 묶음 다시 지음 필요(Alignment · Pivot) (검증 대기).
## 427. 관 · 구조물 옮김 때 종단 꼭짓점 따라감 (요구 255-2 · sub4 · Opus high)
- 정함(브레인): 분석 424 2장 · 10장 — 옮긴 새 측점에 자동 계획선 규칙(원지반 지남)으로 꼭짓점 세움 · 사용자가 높이 고친 꼭짓점은 높이째 옮김 · 파이썬 `_follow_moved_stations` ↔ TS `followMovedNodes` 짝 · 거울 시험.
- [x] 427-1 — 확인: 시험(351 → 348 → 351 왕복 저장 뒤 340~360 m 계획고 · DB 행 처음과 같음) + 화면.
- 검증완료 — 짝 못 찾은 옛 측점 ↔ 새 측점 같은 수면 차례대로 짝 · 높이 고친 꼭짓점은 높이째 · 편집째 옮김 · 나머지 새 측점은 원지반 지나는 꼭짓점 세움(파이썬 `_seat_born_nodes` ↔ TS `followMovedNodes` · 다른 꼭짓점 그대로) · 새 test_427_1 8개(왕복 340 · 351 · 360 차 0.000007 m 이하 · 편집 0.4 왕복 같음 · 화면 짝 3경우 1e-6) + 192_1 · 213_1 · 238_1 · 272_1 · 272_2 · 407_3 · 342_1 44 통과 · typecheck 0 · 화면(검증_sub4 · 8006 · 5179) 관 351 → 348 [저장] = 348 계획고 834.094 = 지반고 · 351 꼭짓점 지움 → 351 [저장] = 351 계획고 834.867008(처음 834.866994) · 저장 전 화면도 348 꼭짓점 · DB 6표 · storage 되돌림 확인 · 묶음 다시 지음 필요(common_util_structure_station) (검증 대기).
- [x] 427-2 `test_410_follow_xy` 오류 3 — 427 이 `common_util_structure_station.ts` 에 `B05_Profile_UI_Profile_Alignment` import 를 더해 410 시험 도우미(`helper_410_follow_xy.cjs` stub 목록)가 모름 · 메인 f9cd31d7c 에서 재현 · sub4 · 확인: 410 · 427_1 · 272_1 · 428 통과(공용 파일이 B05 화면 모듈을 끄는 게 맞는지도 한 줄 — 서버 Node 묶음 크기).
- 검증완료 — stub 대신 공용 파일에서 B05 import 뺌(공용을 엄격 stub 로 읽는 도우미 20개 · 묶음 의존 그대로) · `followMovedNodes` = 옮김 · 지움 · 세울 측점만 · 꼭짓점 높이 셈은 새 `B05_Profile/logic/B05_Profile_Grade_Seat.ts` `seatBornNodes`(파이썬 `_seat_born_nodes` 짝) · `design_profile_base` 가 차례로 부름 · 410 · 427_1 · 272_1 · 428 · 415 33 통과 + 공용 파일 읽는 도우미 시험 23파일 194 통과 · typecheck 0 · 묶음 다시 지음 필요(common_util_structure_station · Grade_Seat) (검증 대기).
## 428. 평면 · 관 옮김 뒤 횡단 형상 · 측점 한 값 (요구 255-1 · 257-1 · 261 · sub5 · Opus high)
- 정함(브레인): 분석 424 1장 · 7장 — ① 측점 갈아끼울 때 상단측 새로 · 0.5 m 넘게 옮긴 시설 측점은 기본 설계 + 사용자가 만진 칸만 ② 노선 초안 중 관 길이 출처 = 계산 줄 상세 ③ 저장 노선 다시 셈 창구에 미교차 넓힘(서버와 같게) ④ 관 PUT 끝 서버가 측점 다시 세움 ⑤ `rebasePipeDraft` 따라가기만 한 관 = 서버 누가거리 · GET 이 x · y 줌 ⑥ 「측점이 없는 구조물」 알림 [저장] 뒤 다시 봄.
- [x] 428-1 — 확인: 새 거울 시험(옮긴 관 관 길이 브라우저 대 서버) · 346_2 넓힘 · 349_0j · 410 · 415 · 417 + 화면(관 옮김 초안 길이 = 저장 뒤 · 평면 이동 [저장] 뒤 알림 없음 · 옛 자리 카드 없음).
- 검증완료 — test_428 6 · 관련 시험 77 통과(옛 코드 = 4 실패) · 화면 검증_sub5: 관 17+11 → 17+17 관 길이 7.9 = 저장 뒤 7.9 · 평면 IP 이동 [저장] 뒤 관 352 서버 = 화면 · 알림 0 · 17+11 카드 없음 · 되돌리기 351 복귀 · 백업 대조 같음.
## 429. [저장] 길 정합 (분석 424 9장 ④⑤⑧⑨ · sub6 · Opus high)
- 정함(브레인): ④ 노선 [저장] 뒤 계획선 차례가 끝나면 횡단 저장 한 번 늘 ⑤ 상단측 차례가 소단 · 깎기 경사 · 조절 값 남김 ⑧ 유토 한 벌(쓰지 않는 단계 걷음) ⑨ 덧 측점 바뀜 = 계산 줄 입력 · [저장] 차례 실패 = 다음 차례 멈추고 알림.
- [x] 429-1 — 확인: 시험(초안 계획고 → [저장] 뒤 횡단 설계 높이 = 저장 종단 · 상단측 뒤 값 유지 · 덧 측점 묶음) + 화면. ④⑤⑨ 만 · ⑧ 은 433 으로 넘김.
- 검증완료 — test_429_save_path 5 · test_design_store_save 10 · 이웃 시험 54 통과 · typecheck 0 · 화면(검증_sub6): 노선 초안 + 60 m ▲0.5 + 덧 측점 → [저장] 뒤 58 측점 횡단 높이 = 저장 종단(차 0) · 되돌림(DB 행 · 파일 차 0).
## 430. 평면 형상 제어 규칙 한 곳 (분석 424 8장 · sub7 · Opus high)
- 정함(브레인): 하한 검사 = 모든 평면 조작이 `applyEdit` 한 곳에서(새로 깨면 되돌림 · 까닭 상태줄) · 곡선 삭제 155° 미만 경고 · 끌기 놓을 때도 「함께 밀린 교점 · 못 맞춘 곡선」 보고 · 스냅 끔 · 간격 바꿈 즉시 계산 줄 · R · 길이 고정 · 넣은 R 곡선표 저장(짝) · 0.5 m 겹친 노드 · 못 그린 곡선 표시.
- [x] 430-1 — 확인: 시험 + 화면(끼우기 · 손잡이 · 곡선 삭제 하한 · 저장 뒤 고정 · R 되살림).
- 검증완료 — test_430 13 · 손닿은 시험 331 통과 · typecheck · 화면(검증_sub7 · 8009 · 5182): 노드 곁 끼우기 되돌림(IP24 · IP25 까닭) · 손잡이 하한 걸음 막힘 · 놓을 때 「함께 밀린 교점 2곳 · 못 맞춘 곡선 No.47+1」 · 148.4° 곡선 삭제 경고 · 156° 경고 없음 · 겹친 노드 IP24 표시 · 스냅 끔 · 간격 1 m 초안 즉시 · [저장] 뒤 R 고정 · 넣은 R 500(그린 94.4) 되살림 · 백업으로 되돌림. 묶음 다시 지음 필요(server-calc — `_Edits` · `_Curve` 를 끎 · 셈 그대로). 검증 대기.
- [x] 430-2 장 시험 실패 둘(앱 흠 아님 · 시험 늦음) — ① `test_408_radius_downstream` 오류 11 = 430 이 `B05_Profile_UI_RouteEdit_CurveBar.ts` 에 `@ui/ui_template_elements`(showToast) import 를 더해 `helper_408_radius_downstream.cjs` 가 못 읽음 → 도우미 stub ② `test_383_2_route_keys::test_이음_끌기_걸기_한_줄_창_가로채기` = 425 가 방향키 범위를 `.b05-route__main .b05-routeedit` 로 좁힘 → 단언 새 글로 · sub7 · 확인: 408 · 383_2 · 430 · 258 통과.
- 검증완료 — 408 · 383_2 · 430 · 398_2 · 258(둘) 48 통과 · 도우미 stub · 단언 새 글만(앱 코드 그대로). 검증 대기.
## 431. [초기화] 빈틈 (분석 424 3장 · sub8 · Opus high)
- 정함(브레인): 폴백이 덧 측점도 지움 · 스냅샷에 배수 폴더 없으면 관 편집도 비움(문서대로) · [초기화] 뒤 M02 구조물 사본 맞춤 · B07 · B08 단계 STALE.
- [x] 431-1 — 확인: 시험(폴백 덧 측점 · 배수 없는 스냅샷 · 사본 · 단계) + 화면 한 번.
- 검증완료(sub8 · 검증 대기): `test_431_reset_gaps` 4 + 스냅샷 · 418 시험 16 통과 · 화면 [초기화] = 노선 380 → 404 · 단계 4 COMPLETE → STALE(스텝바 상세설계 state-stale) · 남은 사본 폴더 지움 · 백업으로 되돌림.
## 432. 종단곡선 기본 L 20 m · 법정 경고 · 초기값 큰 R = 직선 · 작은 것 (요구 262 · 분석 424 8장 · 9장 ⑥⑦ · 432-1 sub3(426 뒤) · 432-3 sub8(431 뒤) · Opus high)
- 사용자 확정(262): 종단곡선 기본 L 15 → 20 m · 막지 않음(못 넣는 곳 있음) · 법정 경고는 둠 · 초기값(자동설계 체인 · 추천 [적용]으로 처음 만드는 종단)에서만 L 20 기준 R > 500 m(대수차 4 % 안쪽) 꼭짓점은 곡선 없이 직선으로 · 그 뒤 고침은 사용자 몫(손 편집에 이 규칙 안 걺).
- 정함(브레인): 「직선」 = 그 꼭짓점에 종단곡선을 두지 않음(R 없음 · 표에 R 안 보임) · 꼭짓점 높이는 그대로(초기 계획선 원지반 지남 유지) · 기본 L 은 config 한 곳 + TS 상수 짝 · 법정 경고 = 설계속도별 R · L 최소 미달 표시(20 km/h R 100 · L 20 · 비포장 대수차 5 % 이하 제외 · 지식DB 별표2 마.) · 45 % 규칙으로 줄어든 곳도 경고 글 그대로.
- [x] 432-1 기본 L 20 · 법정 경고 · 초기값 R > 500 직선(파이썬 첫 계획선 · 균형 종단 ↔ TS 짝 · 거울 시험) — 확인: 시험(초기값 꼭짓점 대수차 < 4 % = 곡선 없음 · 손 편집은 기본 곡선 · 경고 · 짝) + 화면(새 초기값 종단 표 R · 경고).
- 검증완료 — config 기본 L 20 · 초기값 직선 문턱 500 m(TS `logic/B05_Profile_Profile_CurveLaw.ts` 상수 짝) · 초기값(1차 지반 종단 · 추천 [적용] `_set_base_pvi`)에서 기본 L 기준 R > 500 m 꼭짓점 열쇠를 정책 `no_curve_keys` 로 얼림(곡선 없음 · 꼭짓점 높이 그대로) · 그 꼭짓점 손 편집 · R 넣으면 기본 곡선 · 이웃 편집엔 얼린 채 · 법정 종단곡선 R · L 미달 = 경고 글(파이썬 · TS 같은 글) + 종단 요약줄 「종단곡선 미달 N 곳」(툴팁 내역 · 생략 가능 제외 · 45 % 줄인 곳 포함) · 노선 [저장]은 옛 정책(L · 열쇠) 이어받고 바뀐 자리 새 꼭짓점만 새 지반 열쇠(브레인 B · `carry_policy` ↔ TS planline `carryNoCurveKeys` · Route_Save 한 줄) · 옛 저장분 그대로 · 새 test_432_1 10 + 손댄 모듈 시험 54개 384 · 125 통과 · typecheck 0 · 화면(검증_sub3 · 저장 안 함) 옛 종단 L 15 · 열쇠 없음 그대로 · 평면 교점 옮긴 초안 = L 15 유지 · 안 바뀐 구간 R 243.0 · 270.2 · 2705.1 그대로 · 바뀐 구간만 새 열쇠 10 · 사진 tmp/432_draft_carry.png · 미검: 새 초기값 화면(경고 칩)은 체인 다시 돌림 = DB · storage 씀이라 안 함(단위 시험만) · 묶음 다시 지음 필요(Alignment · Ground · Pipeline_Grade · Carry) (검증 대기).
- [x] 432-2 사용자 결정 — 기본 L 20 m · 막지 않음 · 경고 둠(262).
- [x] 432-3 작은 것 — 노선 초안 지반 = 설계 지형 · 노선 [저장] 알림에 새 교차 관 개수 · MC 곡선 측점 열쇠로 B06 편집 버려지는지 확인 · 고침 — 확인: 시험 + 화면 한 장.
- 검증완료(sub8 · 검증 대기): 초안 지형 = 확인 · 고칠 것 없음(Replan.py:359 `switch_design_terrain` — 초안 지형이 [저장] 때 설계 지형) · 새 교차 관 개수 = 이미 알림에 있음(`routeSaveSummary` · 시험 346-3) · MC 열쇠 = 버려짐 확인 → 가까운 새 곡선 측점(10 m 안 · 하나씩)으로 넘김(`curve_moves` ↔ `curveMoves` 짝) · `test_432_3_curve_key` 5 + 관련 47 통과 · typecheck · B06 화면 로드 한 장(tmp/432_3_b06.png).
## 433. 다음 장 후보 (요구 255~262 장에서 창이 찾은 것 · 장 끝에 한 번에) — (일부 · 남은 줄은 PLAN.md)
- [x] 433-1 test_365 ⑧ 「중심점 좌우」 걸음 이름만 남음(424 뒤 · sub1). → 고쳐짐 확인(요구 334 · 453).
- [x] 433-2 옛 검증 프로젝트 id(예 검증_sub7 6d3b2812)에 기대는 시험이 건너뜀(356_4 등) — 새 id(OWNERS.md) 로 자료 다시 세울지(sub1). → 고쳐짐 확인(요구 334 · 507-4).
- [x] 433-3 유토 계산 단계 두 벌 하나로(쓰지 않는 masshaul · haul 단계 걷음 · 시험 7개 탐침 고침 · 429 ⑧ 에서 넘김 · sub6). → 고쳐짐 확인(요구 334 · 454).
- [x] 433-4 화면 확인 — 곡선 있는 노선에서 MC 곡선 측점 카드 고친 뒤 그 곡선 R 바꿈 → B06 고침이 새 곡선 측점으로 남는지(432-3 은 묶음 시험으로만 판정 · sub8). → 고쳐짐 확인(요구 334 · 시험만).
- [x] 433-5 관 옮긴 뒤 이웃 꼭짓점(340 · 360)은 높이 그대로라 이웃 측점 계획고가 지반에서 0.1 m 안팎 뜸(옛 판도 같음 · sub4). → 고쳐짐 확인(요구 334 · 455).
- [x] 433-6 검증_sub4 에 처음부터 358 m 관 측점이 종단에 없었음 — 다시 만든 프로젝트 자료 점검(sub4). → 고쳐짐 확인(요구 334 · 자료 있음).
- [x] 433-7 ⚠ B05 [저장]이 세션 관 초안보다 화면 메모리 관 목록을 보냄(새로고침 전 초안이 덮임 · 자료 잃음 가능 — 먼저 재현 · sub4). → 안 생김 확인(요구 334 · 33201b14e).
- [x] 433-8 B06 평면 겹침 — 평면이 숨은 채 처음 크기를 겹침 패널(작은 높이)에서 받으면 그 배율이 B05 평면에도 남음 · 종단 판 펼친 B06 에선 겹침 평면 높이 100 px 안팎(높이 규칙 다시 · sub2). → 고쳐짐 확인(요구 334 · 436).
- [x] 433-9 관 옮김 [저장] 뒤 그 측점 계획고가 초안과 다름(835.29 → 834.63) — 427(종단 꼭짓점 짝) 합친 뒤 다시 잼(sub5). → 고쳐짐 확인(요구 334 · 455).
- [x] 433-10 관 PUT 뒤 옛 자리 횡단 파일(cross_00351m)이 횡단 저장 때까지 남음 · 「측점 없는 구조물」 알림 다시 봄이 저장 끝 신호 없이 0.3 s 기다림(sub5). → 고쳐짐 확인(요구 334 · ① 452 · ② 일부러 둔 지름길).
- [x] 433-11 ⚠ 덧 측점 넣기 · 빼기 뒤 B05 누가토량이 서버 −17,570.7 → 브라우저 −9,722 로 크게 뜀(저장 직후 −16,248 → −9,150 · 다시 읽거나 [저장] 하면 서버 값 · 저장분 안 바뀜) — 저장 노선 횡단 입력 두 벌(분석 424 9장 뿌리) · 먼저 고칠 것(sub6). → 안 생김 확인(요구 334 · e51dd2a80).
- [x] 433-12 노선 저장 뒤 다른 [저장] 차례가 실패하면 노선 초안 칸(0) 계획고가 다음 [저장]에서 안 나감(옛 흠 · 드묾 · sub6). → 고쳐짐 확인(요구 334 · 449).
- [x] 433-14 노드 끌기가 하한에 막힌 채 놓아도 스냅 미리보기 맞춤이 한 걸음으로 남음 · 스냅만 바꾼 뒤 노선을 처음으로 되돌리면 초안 null · 낮은 확대에서 R 12 곡선 손잡이가 노드 집기 안이라 못 잡음(sub7). → 고쳐짐 확인(요구 334 · 453).
## 434. 요구 255~262 마무리 (브레인)
- [x] 434-1 합치기 · 묶음 다섯 · typecheck · 장 시험.
- 검증완료(434) — 424~432 · 427-2 · 430-2 메인 합침(0176ae4e1) · 충돌 둘 브레인이 풂(351_2 · 383_1 단언 = 419 · design_page import = 424 + 428) · 서버 묶음 다섯 · typecheck 0 · 장 시험 64 파일 502 통과 · 창마다 화면 확인 · 쉬는 창 여덟 /clear · 다음 장 후보 = 433(14) · 검증 대기.
## 435. B06 바뀜 원 작게 (요구 263-1 · sub3 · Sonnet high)
- 사용자 확정(263-1): 절토 · 성토 바뀜 자리 원(414)은 잘 됨 · 원이 너무 큼 · 확대 · 축소에 맞춰 크기 정하는 것 그대로 · 조금 작게.
- 정함(브레인): 지금 반지름(8 px · `B06_Section_UI_Cross_Center.ts:17` 근처)의 약 60 %(5 px 안팎) · 잡는 범위(마우스 가까이 보임 · 누름)는 지금 그대로 두어 잡기 쉬움 유지 · 상세 창 확대 보정 같이.
- [x] 435-1 — 확인: 시험(370_2 · 414 통과) + 화면 한 장(바뀜 자리 원 · 확대 · 축소 · 밝음 · 어두움).
- 바뀜 자리 점 반지름 8 → 5 px · 잡는 범위 8.75 px 그대로(굵은 투명 테두리) · 검증완료(370_2 시험 7 통과 · typecheck · prettier) · 화면 검증완료(ORCA 5178 · 검증_sub3 · 4+0 측점 바뀜 원): 화면 반지름 4.98 px(가로 개수 2 · 3 · 5 = 카드 550 · 361 · 209 px 에서 4.98 · 4.98 · 4.96) · 마우스 중심 0 · 6 · 8 px = 보임 · 11 · 16 · 30 px = 안 보임 · 밝음 · 어두움 모두 같음 · 바꾼 값(가로 개수 · 종단 패널 · 테마 · 프로젝트 키) 되돌림.
## 436. B06 평면 패널 — 높이 조절 · B05 조작 그대로 · 맞춤 없음 (요구 263-2 · sub2 · Opus high)
- 사용자 확정(263-2): 패널 높이 조절 · 내용 맞춤(fit) 필요 없음 · B05 평면에서 단추 묶음 · 안내 글 · 오른쪽 횡단 판만 감춘 꼴 · 로직 · 캐시 공용(B06 전용 로직 만들지 않음) · 감춘 메뉴의 키보드 · 마우스 조작은 됨 · 옵션 값은 B05 항목 값 공유 · 처음 높이 = 지금(45 %)의 70 % 안팎.
- 정함(브레인): 425 의 편집 누름 막기 걷음(끌기 · 끼우기 · 지우기 · 방향키 · 휠 · 팬 모두 B05 와 같음 · 같은 편집기 · 같은 되돌리기) · 감추는 것 = 단추 줄 · 안내 · 상태줄 · 범례 · 잰 값 창 · 오른쪽 횡단 판 · 등고선 자물쇠 단추(보기 켬끔 · 스냅 간격 등은 B05 값 그대로 따름) · 높이 = 패널 아래 끝 끌어 조절(위아래 한도 · 높이는 화면 기억 pref) · 처음 높이 약 32 % · 열 때 · 크기 바뀔 때 내용 맞춤 안 함(B05 보던 자리 · 배율 그대로 — 433-8 같이 풂) · 키 범위(425) 그대로.
- [x] 436-1 — 확인: 시험(258 고쳐 씀 · design_view_parity · 349_0h · 345_5 · 383_2) + 화면(B06 평면 패널 높이 끌기 · 교점 끌기 → B06 카드 · 종단 바뀜 · 방향키 · Ctrl+Z · 열고 닫아도 배율 그대로 · 밝음 · 어두움 · 되돌림).
- 검증완료 — 시험 28 통과 · typecheck 0 · 화면(검증_sub2): 처음 160 px(칸 225 px · 32 % 바닥 160 px) · 끌기 120~177 px · 기억 · 두 번 누름 되돌림 · 열고 닫고 B05 가도 1 m 당 1.5825 px 그대로 · 교점 끌기 누가토량 −17,570.7 → −16,407.1 · 방향키 먹음 · 카드 누른 뒤 안 먹음 · Ctrl+Z 둘 = 원래 · 끼우기 27→28 · 지우기 28→27 · 어두움 · 값 되돌림. 436-2 — 345_5b 단언 새 호출(home · 뜻 그대로 = 처음 열기 맞춤 · 맞춤 단추 없음) · 345_5b · 345_5 · 258 · 349_0h 16 통과.
## 437. ☰ 서랍 안 항목 폭 맞춤 (요구 264 · sub1 · Sonnet high)
- 사용자 확정(264): 서랍 폭 그대로 · 안 항목(진행 단계 단추 · 홈페이지 · 언어 · 설정 · 사용자 · 터치 모드 줄)이 오른쪽에서 잘림 → 서랍 폭에 맞게.
- 정함(브레인): 항목 폭 = 서랍 안쪽 폭(테두리 · 둥근 모서리 다 보임 · 좌우 여백 같게 · 가로 스크롤 없음) · 글이 길면 줄임표 · 밝음 · 어두움 · 펼침 · 접힘 · 대시보드 · 시스템 설정 쪽 서랍도 같은 규칙.
- [x] 437-1 — 확인: 시험(서랍 CSS 시험 있으면 통과) + 화면 한 장씩(밝음 · 어두움 · 항목 오른쪽 테두리 보임).
- 검증완료 — 까닭 = 진행 단계 단추 폭 100 % 가 서랍 폭 auto 를 이김 · 선택자 보강 · 긴 글 줄임표. 시험 test_device_drawer · 225_drawer_shortcuts 8 통과 · typecheck · 화면(B07 · B01 · B05 · M02): 단추 좌우 여백 8 · 8 · 서랍 가로 넘침 0(scrollWidth 238 = clientWidth) · 밝음 · 어두움 · 긴 글 줄임표 · 검증 대기.
## 438. 초기 종단 — R 500 넘는 구간 직선화 (요구 262 · 265 · sub3 · Opus high)
- 사용자 확정(265): 처음 종단 = 최적 계획선을 찾은 뒤 R 이 500 을 넘는 꺾이는 점들(L 20 기준 기울기 차 4 % 미만)을 앞뒤 R 을 보고 직선화 · 초기값(자동설계 체인 · 추천 [적용] · 노선 저장 때 새로 생긴 구간)에만 · 그 뒤는 사용자 몫 · 기본 L 20 · 경고는 둠.
- 정함(브레인): 432-1 「곡선 없음 · 높이 그대로」(no_curve_keys)와 열쇠 고르는 순서 버그 걷음(모서리 원인 · 분석 = 에이전트 재현 15 · 8 개 최대 10 %) · 직선화 = 연속한 R > 500 꼭짓점 묶음의 앞뒤 경계(R ≤ 500 진짜 꺾임 · 시종점)를 잇는 직선 위로 안쪽 꼭짓점 높이를 옮김(종단 직선화 단추와 같은 규칙 · 426 직선 판정이면 곡선 없음) · 경계가 새로 R > 500 이 되면 다시(묶음이 안 바뀔 때까지 · 한도) · 파이썬 첫 계획선 · 균형 종단 ↔ TS 짝 · 거울 시험 · 관 옮김(427) 새 꼭짓점은 지반 종단이 아니면 지금 계획선 높이에 세움.
- [x] 438-1 — 확인: 시험(초기값 모서리 0 · R > 500 꼭짓점 0 · 직선 구간 안쪽 R 없음 · 손 편집엔 안 걺 · 노선 저장 이어받은 구간 그대로 · 짝) + 재현 수치(에이전트 프로젝트 넷 · 계획고 지반 차 · 절성토 전후) + 화면(새 초기값은 쓰기라 단위 시험 · 기존 프로젝트 종단 화면 모서리 없음).
- 검증완료 — 시험 167 통과 · 재현(에이전트 프로젝트 셋 12953f5a · dad81824 · 7c34ad71) 모서리 15 · 8 · 23 → 0 · R > 500 꼭짓점 13 · 8 · 27 → 0 · 계획고 목표 차 최대 0.50 · 0.38 · 1.24 m(평균 0.05 · 0.03 · 0.18) · 절토 +1 · +1 · +4 % · 성토 +0 · +3 · +9 % · 저장분 7c34ad71 모서리 30 → 0 · 화면(검증_sub3) 곡선 55 · 모서리 0.
## 439. B06 카드 머리 줄 단추 반영 안 됨 (요구 266 · sub6 · Opus high)
- 원인(에이전트 재현 · 진짜 모듈 node): 387-4(6a3f9647f · 10-17) 뒤 카드 단추 → 계산 줄 횡단 차례 `savedCross`(`A00_Common/design/design_shared.ts:234-241`)가 저장 측점 목록 ≠ 계산 줄 측점(1 mm)이면 `detailCross` null 로 바로 돌아가 B06 카드 자료를 안 고침 · 오류 없음 · 오늘 관 옮김 · 측점 변경(428 · 415 · 407-1)으로 흔해짐 · 엔진 · 같은 측점 길은 정상.
- 정함(브레인): `savedCross` = 늘 `refreshCrossDesigns` 로 카드 자료 다시 셈 · 측점 대조는 돌려줄 값만(다르면 null → 계산 줄 엔진 길 그대로) · `refreshCrossDesigns(` 부르는 자리 하나 유지 · 덤 = 대체 길 `refreshFromServer`(`B06_Section_Cross_Refresh.ts:487-518`)에도 카드 선택(지반 · 측구 · 복합경사) 실음.
- [x] 439-1 — 확인: 새 `test_266_card_toggle_mismatch.py`(측점 같음 · 다름 둘 · 복합경사 · 측구 · 지반 바꿈 → 카드 선 · 면적 바뀜 · `savedCross` 내보내 진짜 코드로) · 365 · 384_4 · masshaul_single_source · 346_2 · b06_two_stage_slope_kept + 화면(검증_sub4 측점 어긋난 상태 · 카드 단추 줄 전부 · 되돌림).
- 검증완료(480e62c67) — 시험 63 통과 · 7 건너뜀 · typecheck 0 · 화면 검증_sub6(5181) 3+060 측점 같음 · 2 mm 어긋남 둘 다 단추마다 절토 4.212 → 4.504 → 2.697 → 토사 5.282 · 되돌림 4.212 · B05 다녀와도 유지 · 서버 저장 없음 · 세션 원래대로.
- [x] 433-15 사용자 결정(269-2) = 높이 한도 없음 · 초기 종단은 R 줄이고 기준만 잡음 · 판단은 사용자 몫. 옛 물음: — 초기 종단 직선화(438)로 추천 균형 종단은 작은 꺾임이 길게 펴져 계획고가 균형 종단에서 최대 1.24 m 벗어남(절토 +4 % · 성토 +9 %) · 직선화로 옮기는 높이에 한도(예 0.1 m)를 두고 넘으면 그 꼭짓점은 꺾임(곡선)으로 남길지(sub3).
## 440. 구조물 횡단 · 내부 구조물 하이라이트 (요구 267 · sub7 · Opus high)
- 원인(에이전트 · node 재현): ① `ec28d9d45`(10-16 · 346-2 덧 3) 뒤 노선 초안 동안 B06 카드는 초안 상세(`shownDetail` · 옮긴 m 새 카드 번호 `B05_Profile_Pipeline_Detail.ts:178`)로 그리는데 클릭 · 목록 → 카드 · 넘김 · 풀기는 저장 상세에서 찾음(`design_view_cross.ts:118-124 · 381-387 · 471 · 490`) → 옮긴 구조물 측점 카드만 못 찾고 고름 통째 풂 ② B06 위 평면 패널 빈 곳 누름이 B06 고름까지 풂(`RouteEdit_Pointer.ts:220` → `StructureMarks.ts:335-340` → `Pick_Sync.ts:84`) ③ B06 좌측 목록이 보이는 동안 관 · 구조물 자리 바뀜을 안 따라감(`design_view_cross.ts:567` 카드만 · `Structures_Panel.ts:372` load 때만) ④(추정) 암 경계선 누름 범위(10 px)가 구조물 아랫부분 위에 놓임(`Design_Pick.ts:514-527` · `Pick_Order.ts:72-74`).
- 정함(브레인): ① 「지금 그린 상세」 한 칸 → 찾기 넷 모두 그것으로 · 초안 카드도 같은 측점 열쇠면 저장 카드 번호 이어 씀 ② 평면 패널 빈 곳 누름은 평면 마커가 고른 것만 풂(B06 에서 고른 것 그대로) ③ 바뀜 신호에서 B06 목록도 다시 실음 ④ 재현되면 구조물 누름 우선 · 고름은 구조물 id 우선 · 강조는 구독 하나에서 다시 칠함 · 덤 = `test_191_1` 도우미 stub(`./B06_Section_UI_Cross_Design_Pick`).
- [x] 440-1 — 확인: 새 끝에서 끝 시험(노선 초안 중 구조물 카드 누름 → 카드 · 폼 · 목록 줄 · 알약 · 평면 마커 · 구조물 그림 누름 같은 목록 · 초안 버린 뒤 같음 · 모든 카드 번호가 찾기 상세에 있음) · 399 · 409 · 411_a · 233 · 270 · 150 · 191_1 + 화면(검증_sub7 · 교점 끌기 초안 → B06 구조물 카드 · 벽 · 관 그림 누름 · 평면 패널 빈 곳 누름 · 밝음 · 어두움 · 되돌림).
- 검증완료 — test_440 새 7 · 고친 대상 시험 458 통과(384_3 은 고치기 전부터 실패) · typecheck · 화면: 초안 관 카드 번호 = 저장 번호(351000 · 361 m) · 카드 누름 = 카드 · 목록 줄 · 알약 · 고름 364 m · 다시 누름 풂 · 벽 누름 = 조정창 · 평면 빈 곳 누름 B06 고름 그대로 · 암 경계 판정이 구조물 덮은 자리 40 % → 0 · 밝음 · 어두움 · 되돌림 초안 버림. 평면 마커 누름만 예외(440-3).
- [x] 440-3 ⬜ 노선 초안 중 B06 위 평면 마커 누름 = 옛 자리(351 m) 고름 — 숨은 종단 보기 마커 목록 · 관 id 장부(`pipe-s1@351`)가 초안 자리를 안 따라감(`design_view_profile` onPipesChanged · followFacilities 숨김 때 건너뜀) · B06 은 따로 `pipe-s2@361` 지음. 고치기 전부터. → 고쳐짐 확인(요구 334 · 451 · 462).
- [x] 440-4 ⬜ 노선 초안을 되돌리거나 둔 채 새로고침하면 횡단 캐시가 초안 측점(361)에 남고 관 제원이 옆 일반 측점(360) 카드로 붙음 · 새로고침 때는 구 구조물 이관(`design_view_profile_sections` migrateLegacyStations)이 초안 관 측점(364)을 「기타 구조물」로 서버 `structures.json` 에 씀([저장] 없이). 고치기 전부터 · 검증_sub7 은 파일 지워 되돌림. → 고쳐짐 확인(요구 334 · 451 · 452).
- [x] 440-2 사용자 결정(269-3) = 보류(지금 그대로). 옛 물음: — 카드 고름은 형상을 안 켜고 범위 테두리도 끔(137-4) · 벽을 눌러도 범위 테두리 안 켜짐(10-09~) — 예전 요구 41-3(형상 누르면 범위 카드 전부)과 다를 수 있음.
- [x] 433-16 새 탭 첫 화면 B06 3+060 이 서버 값(단경사 · 측구)과 다른 세션 캐시 값으로 열린 적 있음(캐시 출처 모름 · 지우니 서버 값 · 268-3 저장 누락 조사와 같이 봄 · sub6). → 고쳐짐 확인(요구 334 · 451).
## 441. 스냅 끌기 측점 밖 · 유토 · 사면 이동 확인 (요구 268-1 · 2 · 4 · sub1 · Opus high)
- 원인(에이전트 · 진짜 모듈 node 재현): ① 스냅 맞춤의 교점 이동 한도가 간격의 절반(`logic/B05_Profile_RouteEdit_StationFit.ts:116` reach = intervalM/2 · 20 m 면 ±10 m) → MC 가 두 측점 한가운데쯤(18+9 ~ 19+1)이면 못 맞추고 그 자리 받아들임(430 전에도 같음 · 1,080 회 끌기 89 회) ② 유토곡선 · ④ 사면 이동 = 439 와 같은 뿌리(`savedCross` 측점 어긋나면 카드 · 유토 안 고침 · 439 로 풀림 · 480e62c67) · 덤 = 초안 없는 저장 노선에서 계산 줄 측점 단계가 저장 스냅 설정을 무시(`design_pipeline_stations.ts:61-62` · `design_pipeline_page.ts:304-305` `route?.stationSnap ?? false`) → 스냅 켠 노선이면 측점 목록이 늘 어긋남.
- 정함(브레인): ① reach = intervalM(목표는 가장 가까운 측점 하나 그대로) · 끌기 미리보기에서 측점 밖 곡선 수가 끌기 전보다 늘면 그 걸음 되돌림(하한 막힘과 같게 · 못 맞추는 자리로 못 끎) · 433-14 `dragMoved` 를 막힘 검사 뒤로 ② 초안 없을 때 계산 줄 측점 단계가 저장된 station_snap · station_snap_step 따름 ③ 시험 단언 = 측점 어긋난 상태에서 단추 · 사면 한 걸음 → refreshCrossDesigns · 유토 다시 그림 한 번.
- [x] 441-1 — 확인: 시험(390_5 끌기 훑기 = 놓은 뒤 측점 밖 0(고정 R) · 366_3 · 430 · 408 · 383_2 · 266 유토 · 사면 단언 · 384_4 · masshaul_single_source · 354_2 · 346_2 · 370_2 · 417 · 139_6) + 화면(측점 No. 끌기 19+0 → 놓은 뒤 MC 측점 배수 · B06 사면 이동 · 유토 바로 바뀜 · 되돌림).
- 검증완료 — 시험 117 통과(7 건너뜀 = 검증_sub7 없음) · 390_5 훑기 216 회 놓은 뒤 측점 밖 0 · 화면 교점 끌기 64 회 측점 밖 0 · 되돌림 64 회 원래 길이 · 방향키 20 m 걸음 못 맞추는 자리 막힘 · 사면 이동 걸음마다 유토 0.3 초 안 바뀜(97b5a7869 · 검증 대기).
## 442. [저장] · [확정] 누락 — 분석 (요구 268-3 · 브레인 · 에이전트)
- [x] 442-1 분석 — `docs/raw/조사/2026-10-18_442_요구268_저장누락.md`(H1~H6 · M1~M7 · 묶음 443~446 · M4 사용자 결정).
- [x] 442-2 사용자 결정(269-1) = [저장] 때 영구저장(설계속도 · 지형 구분 = 종단 표 경고값 · 시종점 계획고 조정 = 결과에 씀) — 절 448 에서 고침. 옛 물음: B05 페이지 설정(설계속도 · 지형 구분 · 기준값 · 시종점 계획고 조정 · 시작 측점)을 [저장] 대상으로 할지 · 읽기 전용(프로젝트 설정에서만)으로 할지.
## 443. 저장 누락 ① 구조물 실패 · 상단측 재전송 · 확정 하위 실패 (H6 · M3 · M6 · sub4 · Opus high)
- [x] 443-1 — 확인: 왕복 시험 + 화면(구조물 409 실패 → 멈춤 · 초안 남음 · 상단측 저장 뒤 세션 빔 · 확정 하위 실패 알림) · 백업 · 되돌림.
- 검증완료 — test_443 9건 · 관련 시험 82건 · typecheck 통과 · 5179 화면 [저장] · [확정] 구조물 409 = 구조물 차례 멈춤 · 초안 남음 · 상단측 성공 뒤 세션 빔 · 두 번째 [저장] 안 보냄(B05 · B06 길) · failed_parts = 상단측 차례 멈춤 · 행 7표 · json 228개 해시 되돌림 같음.
- [x] 443-2 노선 바꾼 [저장] 때 기본 창구가 옛 누가거리 상단측(uphill)을 새 노선에 보냄(sub4 찾음 · 엉뚱한 측점에 얹힘) — 노선 바뀐 저장이면 상단측을 측점 열쇠로 옮겨 싣거나(옮김 목록) 못 맞추면 빼고 알림 · 비정규 측점 횡단 실패로 [저장] 멈춤 = 그대로(브레인 확인) · sub4 · 확인: 시험 + 화면.
- 검증완료 — test_443_2 4건 · 관련 시험 100건 · typecheck 통과 · 5179 화면 교점 끌기 → [저장] = 상단측이 노선 저장 뒤 · 횡단 저장 앞에 새 측점으로(관 351 → 350 m · 40 · 1080 그대로) · 못 맞춘 2곳 알림 · 새 종단 350 m 좌(user) · 행 11표 · 파일 242개 해시 되돌림 같음.
## 444. 저장 누락 ② 관 구간값 (H4a · H4b · sub5 · Opus high)
- [x] 444-1 — 확인: 왕복 시험(구간값 → 관 5 m 옮김 · 교점 끌기 → [저장] → 새 탭 같은 값 · 두 번째 [저장] 뒤 같은 값) + 화면 · 백업 · 되돌림.
- 고침(B 승인) — 세월교 · BOX 폼 값을 culvertopt 에 안 쌓음(관 초안 한 벌) · 옛 예약은 측점 옮김 목록에 · 못 맞춘 값 버림 · 기슭막이 구간값은 이미 폼 → 관 초안(H4b 재현 안 됨).
- 검증완료 — test_444 4건 · 관련 시험 103건 · typecheck 통과 · 5180 화면 관 길이 15 · 관 5 m 옮김 → [저장] → 새 세션 356 m · 15 · 두 번째 [저장] 15 · 세월교 월류 폭 10.5 · 5 m 옮김 · 교점 끌기(364 m 따라감) · 두 번째 [저장] · [확정] 모두 10.5 · culvertopt 안 생김 · 행 7표 · 파일 314개 해시 되돌림 같음.
## 445. 저장 누락 ③ 횡단 patch 바탕 · 노선 바꾼 저장 · 집수정 범위 · 버린 수 (H2 · H3 · M2 · H5 · M1 · M5 · M7 · sub6 · Opus high)
- [x] 445-1 — 확인: 왕복 시험(벽 둘 저장 뒤 하나만 고쳐도 다른 벽 남음 · ↺ · 추가 벽 0 저장 · 관 옮긴 측점 메모 · 조절 · 지반 남음 · 노선 바꾼 저장 뒤 지반 · 암선 · 표준 횡단면 남음 · 집수정 2.1 막힘 · 버린 수 알림) + 화면 · 백업 · 되돌림.
- 검증완료 — test_445 9건 · 관련 시험 424건 · typecheck 통과 · DB 저장 행 1450개 새 patch 꼴 스키마 통과 · 5181 화면: 새 탭 유출만 ▶ [저장] → 유입 x 1.0 · 단 수 · 메모 · 폭 남음 · ↺ · 추가 벽 − · 빈 전체 폭 → 저장 전 새로고침 → [저장] → 유출 지움 · 단 0 · 폭 0 · 관 351 → 356 [저장] → 흙 · 메모 · 벽 셋 그대로(B06 관 폼 id 빠짐 함께 고침) · 교점 끌기 [저장] → 새 노선 노견 0.6 · 풍선 · 암선 −0.4 · 암 경사 0.6 · 지반 흙 · 관 메모 · [확정] 같은 값 · 버린 수 API 777.77 응답 · 2.1 → 422(화면 2.0 자름) · 행 7표 · 파일 313개 해시 되돌림 같음.
- [x] 445-2 ⚠ 교점 끈 뒤 [저장] · [확정]마다 노선 저장 체인이 다시 돎(노선 번호 378 → 414 → 416 → 417 · [확정]이 횡단 확정까지 못 감 = 확정 막힘 · sub6 찾음) — 노선 저장 성공 뒤 노선 초안을 저장본으로 맞춰(또는 비워) 다음 [저장] · [확정]이 노선 차례를 건너뜀 · 노선 바뀐 [확정]은 한 번 더 누르면 끝까지 · sub6 · 확인: 시험(교점 끌기 → [저장] → [저장] = 노선 저장 한 번 · [확정] 두 번째에 단계 완료) + 화면 · 백업 · 되돌림.
- 검증완료 — 까닭 = 노선 저장 뒤 페이지가 다시 서며 평면 판이 접혀 편집기가 떠나도 노선 저장 등록부에 옛 편집기(「고친 것 있음」)가 남음 → 떠날 때 풂 · 고정만 바꾼 걸음은 노선 그대로 · test_445_2 4건 · 관련 시험 227건 · typecheck 통과 · 5181 화면: 교점 끌기 [저장] → 노선 저장 한 번 → 두 번째 [저장] 노선 저장 없음 → [확정] 한 번에 횡단 단계 완료 · 끈 뒤 바로 [확정] = 노선 저장 + 안내 → 두 번째 [확정] 단계 완료 · 고정만 = 노선 저장 없음 · 스냅 켬 간격 바꿈 = 곡선 MC 자리 바뀜이라 노선 저장(되돌리면 없음) · 행 7표 · 파일 313개 해시 되돌림 같음 · 종단 판 접힘 취향 되돌림.
## 446. 저장 누락 ④ 카드 폭 넘김 다시 만들기 (H1 · sub8 · Opus high)
- [x] 446-1 — 확인: 시험(다시 만들기 뒤 측점 설계 · 옵션 · 표준 횡단면 · 유토 풍선 · 계획고 편집 그대로 · 확인창) + 화면(카드 폭 ▶ 21 m → 확인 → 새 탭 같은 값) · 백업 · 되돌림.
- 검증완료 — test_446 5 · 173_6 · 342_2 · 346_3 통과 · typecheck · 검증_sub8 카드 폭 71 m(표본 70 m) 확인창 취소 = 그대로 · 다시 만들기 9 s → 새 탭 · 두 번째 [저장] · [확정] 뒤 57 측점 사용자 칸 차이 0 · 표준 횡단면 · 곡선 편집 · 계획고 57 같음 · 행 · 파일 해시 되돌림 같음.
- [x] 433-17 ⚠ 440-4 — 새로고침 때 옛 구조물 이관이 「기타 구조물」을 서버 structures.json 에 씀(저절로 쓰기 · 자료 오염) · 초안 되돌림 · 새로고침 뒤 캐시가 초안 측점에 남아 관 제원이 다른 카드로 · 440-3 초안 중 평면 마커 누름 = 옛 자리(숨은 종단 보기 관 id 장부) · 384_3 시험은 440 전부터 실패(sub7) — 다음 장 맨 앞. → 안 생김 확인(요구 334 · 5478eb1f8).
- [x] 433-18 측점 열쇠 목록(계산 묶음 · 새 상세)에 종점(EP) 측점이 없어 종점 고침이 노선 저장 때 옮김 칸(at:)으로 빠짐(알림은 뜸 · sub4). → 고쳐짐 확인(요구 334 · 452).
- [x] 433-19 ⚠ B06 폼 편집 뒤 관 초안에서 관 id 빠짐(draft [null, 351]) — 노선 바뀜 때 관 id 짝(411-B)에 영향 가능 · 먼저 재현 · Span_Control.update(기준벽 구간 → culvertopt)는 화면에서 안 불림(다단만 · 죽은 길 · sub5). → 안 생김 확인(요구 334 · 48a376f21).
- [x] 433-20 B06 집수정 내공 줄이 화면에서 늘 숨김(54-40 · 사용자 길로 내공 못 고침) · CAD 칸 2000 엔티티 넘으면 422(추정) · 같은 탭 새로고침 뒤 ORCA 누름 안 닿음(시험 도구 · sub6). → 고쳐짐 확인(요구 334 · ② 450 · ① 450 정함대로 · ③ 도구 흠).
- [x] 433-21 곡선 손잡이(BC · EC) 끌기는 스냅 미리보기 · 측점 밖 막힘 없음(놓은 뒤 측점 밖 1 남은 적) · 방향키 측점 No. 20 m 걸음이 못 맞춤 막힘에 자주 걸림 · 구조물 마커가 겹친 교점은 마커가 먼저 집혀 교점 못 끎(409 차례 · sub1). → 고쳐짐 확인(요구 334 · 453 · 454).
## 447. 요구 263~268 마무리 (브레인)
- [x] 447-1 합치기 · 묶음 다섯 · typecheck · 장 시험.
- 검증완료(447) — 435~446 · 443-2 · 445-2 · 436-2 메인 합침(030409f16) · 깃 싱크(전역 아님 · 열세 폴더 22eff5b85 · 장 시작) · 서버 묶음 다섯 · typecheck 0 · 장 시험 86 파일 666 통과 · 창마다 화면 확인 · 쉬는 창 여덟 /clear · 탭 0 · 남은 결정 = 442-2(B05 페이지 설정 저장 여부) · 433-15(직선화 높이 한도) · 440-2(구조물 범위 테두리 규칙) · 다음 장 후보 433 · 검증 대기.
## 448. B05 페이지 설정 [저장] · [확정] 영구저장 (요구 269-1 · 442-2 · sub6 · Opus high)
- 근거 = `docs/raw/조사/2026-10-18_448_요구269_후보재검토.md` 2장.
- 정함(브레인): 세션 캐시 `pagesettings` · 저장 차례 `settings`(route 뒤 · alignment 앞 · 기본 창구 · B05 · B06 모두) · 서버 `PUT /api/projects/{id}/route/page-settings` = stage 2 params 병합 + 종단 정책 · criteria 갱신 뒤 다시 셈(종횡단 다시 만들기 없음 · DB 열 추가 없음) · 시종점 계획고 조정 = 첫 · 끝 측점 계획고 편집 · 시작 측점 = 저장 · B05 표시 전용(열쇠 · 다른 페이지 라벨에 안 섞음) · [초기화] = 스냅샷에 stage 2 params 뜨고 되돌림 · 샘플 간격 두 칸 = 읽기 전용 · 횡단배수 최소고 강제 = 저장 · E1(재설계 요청이 설계속도 · 최소고 강제 넘김) · E2(B06 재생성 지형 = 저장값 우선) · 추천 저장본 열쇠에 설계속도 · 지형.
- [x] 448-1 — 확인: 새 `test_442_2_page_settings.py`(병합 · 정책 갱신 · 기하 그대로 · E1 · 스냅샷 왕복 · 저장 차례) · 거울 `test_442_2_grade_limit_mirror.py`(TS 기준표 ↔ 파이썬 전수) · `test_b05_design_speed` · `test_346_3_route_save` + 화면(설계속도 30 · 지형 · 시종점 조정 · 시작 측점 바꿈 → [저장] → 새 탭 같은 값 · 종단 표 경고 바뀜 · [확정] · [초기화] 되돌림 · 노선 바꾼 [저장] 뒤도) · 백업 · 되돌림.
- 검증완료(448) — 시험 19 + 거울 3 + 관련 저장 · 계획선 시험 통과 · typecheck 0 · 검증_sub6 화면: 30 · 일반 → 경고 34 → 43(14 → 8 %) · 표 라벨 12+0(평면 0+0 그대로) · 새로고침 · 새 탭 같은 값 · [저장] = params 병합(단계 그대로) · 기준 8 % · R 250 · 시점 +0.5 · 특수 → 12 % · 평면 R 20 · [확정] 40 → 10 % · R 450 · [초기화] = 설정 칸 걷힘 · 14 % · 편집 없음 · 노선 바꾼 [저장] 두 번(새 노선 424 · 425) 설정 유지 · 빈 칸 = null · 밝음 · 어두움 · 행 7표 · 파일 해시 되돌림 · 덧 고침 = `AlignmentPolicy.from_dict` 평면 R 읽기(계획고 저장마다 0 되던 흠 · sub3 알림) · `_road_settings` 가 params.options 읽음 · 검증 대기.
## 449. B05 [저장] 관 목록 · 노선 저장 뒤 실패 (433-7 · 433-12 · 433-6 · sub4 · Opus high)
- 정함(브레인): 관 정본 PUT = 세션 관 초안 한 번만(배수판 메모리 다시 PUT 걷음) · 빈 목록 PUT 은 사용자가 관을 다 지운 때만(판 안 섬 · 실패 = 보내지 않음) · 노선 저장 성공 뒤 다른 차례가 실패하면 0 칸 계획고 → 새 노선 칸 · carryStationDrafts 뒤 rebuild · 관 PUT 측점 맞춤 실패는 응답에 실어 알림 · 시작 전 검증_sub4 missing-stations 로 [측점 만들기](433-6).
- [x] 449-1 — 확인: 시험(B06 관 고침 직후 [저장] = 세션 초안 값 · 판 안 선 [저장] 관 수 그대로 · 노선 저장 뒤 횡단 차례 실패 → 다음 [저장] 0 칸 계획고 나감) + 화면 · 백업 · 되돌림.
- 검증완료 — `test_449_save_pipes` 8 · 이웃 저장 시험 128 통과 · typecheck 0 · 5179 검증_sub4 [측점 만들기] 뒤 빠진 측점 0 · 초안 고친 직후 [저장] = PUT 1번 · 관경 800 저장 · 초안 없는 [저장] = PUT 0 · 관 2개 그대로 · 초안 두고 B05 로 옮겨 [저장] = 600 저장 · 알림 밝음 · 어두움 보임 · DB 7표 · storage 해시 되돌림 같음 · 노선 저장 뒤 실패는 시험만(화면 노선 저장은 안 함) (33201b14e).
## 450. B06 측점 갈아끼움 · 죽은 길 · CAD 한도 (433-4 · 433-11 · 433-19 · 433-20 · sub5 · Opus high)
- 정함(브레인): 상세 갈아끼움이 curveMoves 거꾸로 맵을 대체 열쇠로(MC 곡선 측점 R 바꿔도 설계 · 칸 따라감) · 자리 같은 앞 단면은 prior 지반 표본 · 상단측 · 중심고 유지(덧 측점 뒤 누가토량 = 서버 값) · `Span_Control.update` 죽은 길 지움 · CAD 2000 넘음 = 화면에서 막고 알림(내공 줄 숨김은 그대로).
- [x] 450-1 — 확인: 새 `test_433_4_mc_swap.py`(MC 설계 남음 · moves 짝) · 새 `test_433_11_plus_station_masshaul.py`(덧 측점 넣기 · 빼기 뒤 누가토량 브라우저 = 서버 · 0.1 ㎥ 안) · 444 · 445 · 266 · masshaul_single_source + 화면 · 되돌림.
- 검증완료 — 새 시험 11(433_4 · 433_11 · 433_19_20 · 옛 코드에선 5 실패) · 이웃 시험 120 통과(24 건너뜀 = 검증_sub7 없음) · typecheck 0 · 346_2 단언 바꿈(자리 같은 단면 = 앞 표본) · 화면(검증_sub5 B05): EP −17,570.7 → 관 6+10 넣음 −17,621.4 → 뺌 −17,570.6(서버 −17,570.7 · 절 · 성토 0.1 · 0.2 ㎥ = 다시 셈 엔진 몫) · 저장 안 함 · 초안 지움 · 433-4 화면은 이 노선에 MC 측점 없어 node 시험만 · 433-20 화면 알림은 2000 요소 손 입력 불가로 글 시험만.
## 451. B06 세션 캐시 판 · 새로고침 hold · 숨은 관 id 장부 (433-16 · 440-4 · 440-3 · 384_3 · sub7 · Opus high)
- 정함(브레인): 세션 section-detail 에 서버 판(지문) 붙임 · 다르면 캐시 사용자 칸만 얹고 나머지 서버 값 · 새로고침 hold 는 초안 열쇠로 옮겨진 칸을 처음 값으로 안 뜸 · 숨은 종단 보기도 관 id 장부 돌림 · test_384_3 단언 = 427 의도(pvi 6).
- [x] 451-1 — 확인: 시험(낡은 캐시 + 다른 탭 저장 → 새 탭 서버 값 · 사용자 칸만 · 초안 둔 채 새로고침 → 관 제원 제 카드 · 초안 중 평면 마커 누름 = 새 자리) · 440 · 445 · 384_3 + 화면 · 되돌림.
- 검증완료 — 새 test_451_session_canon 5 · test_451_refresh_hold 5 · 관련 303 통과(56 건너뜀 = 옛 검증 프로젝트 없음 · 433-2) · typecheck 0 · ORCA 검증_sub7: 세션에 낡은 메모 심고 새로고침 → 캐시 · 세션 · [저장] 바탕 = 서버 값 · B06 에서 초안 옮김 → 관 id 장부 pipe-s1 365 따라감 · 초안(관 351 → 360) 둔 채 새로고침 → 버림 = 관 초안 비움 · 351 관 카드 · 351 선택(암 · 좌절토) 그대로 · 기록 saved · 정본 파일 해시 그대로 · 심은 세션 값 지움 · 탭 닫음.
- [x] B06 화면에서 노선 초안 버림이 뒤 cross 입력에 밀려(dropped) 초안 전 상세로 안 돌아옴(원래 코드도 같음) — 밀리면 마지막 차례 끝에서 되돌림 · 밀어낸 차례도 조용히.
- 검증완료 — 새 test_451_drop_cross 3(옛 코드 = 실패 재현) · 관련 310 통과(56 건너뜀) · typecheck 0 · ORCA 검증_sub7 B06 같은 탭 · 새로고침 뒤 버림 = 기록 dropped → saved · 351 관 카드 · 선택 그대로 · 관 초안 비움 · 정본 해시 그대로.
- ⬜ 잔여: 새로고침 뒤 B05 를 한 번도 안 연 채 B06 에서 버리면 관 id 장부에 초안 자리 헛 기록(pipe-s1@360 · s2@369)이 남음 · B05 를 열면 걷힘.
## 452. 서버 — 구 구조물 이관 · 옛 횡단 파일 · 시종점 열쇠 (433-17 · 433-10 · 433-18 · sub8 · Opus high)
- 정함(브레인): 이관은 [저장] 없이 쓰지 않음 · 서버가 본문 버리고 저장 종단 파일 직접 읽음 · 관 PUT 끝에 옛 횡단 파일 정리 · 시종점 열쇠 우선순위 한 규칙(화면 · 서버 같게) · EP 행을 irregular 로 갈음 안 함 · 거울 344_3.
- [x] 452-1 — 확인: 시험(초안 둔 채 새로고침 → structures.json 안 바뀜 · 관 옮김 PUT 뒤 옛 cross 파일 없음 · EP 고침 → 노선 저장 뒤 EP 에 남음) · 344_3 + 화면 · 백업 · 되돌림.
- 검증완료: test_452 7 · 관련 36 파일 206 통과 · typecheck 0 · 검증_sub8 화면(초안 꼴 본문 이관 0 · structures.json 없음 · 관 351→364 PUT 뒤 cross_00351 지워짐) · 행 7표 · 파일 254 해시 되돌림 같음 · EP 행 종류 갈음은 그대로 둠(열쇠는 자리 규칙으로 end:EP · 종류 바꾸면 TS 소비처 24곳 흔들림) · 검증 대기.
## 453. 평면 집기 · 손잡이 끌기 · 스냅만 바꾼 초안 (433-14 · 433-21 ① ③ · 433-1 · sub1 · Opus high)
- 정함(브레인): 노드 가운데 6 px 만 노드 우선 · 그 밖은 가까운 것(손잡이 · 마커) · 맴돔 커서 같은 판정 · 손잡이 끌기 = 노드 갈래와 같게(미리보기 맞춤 · 측점 밖 늘면 되돌림) · 맞춤 안 된 기준에서 막힌 걸음 미리보기 endDrag 되돌림 · 스냅만 바꾼 뒤 되돌려도 초안 dirty 판정 · test_365 ⑧ 이름.
- [x] 453-1 — 확인: 390_5 훑기에 손잡이 끌기 · 381_3 · 409 · 399 · 441 · 365 · 스냅 바꿈 → 되돌림 → 초안 있음 + 화면(낮은 확대 R 12 손잡이 · 마커 겹친 교점 끌기) · 되돌림.
- 검증완료 — 손잡이 끌기 훑기 216 번 놓은 뒤 측점 밖 0(되돌림 없으면 20) · 맞추지 않은 기준 막힌 걸음 놓음 13/13 → 0 · 화면(검증_sub1 · 낮은 확대) 노드에서 9 · 11 px = 손잡이(옛 = 노드) · 0 · 5 · 7 px = 노드 · 마커 9.8 px 겹친 교점 6 px 누름 = 교점 · 끌기 「옮기는 중」 · 손잡이 90 걸음 끌기 측점 밖 0 · 스냅 간격만 바꾸고 끌기 → 되돌리기 = 초안 있음(안 바꾸면 null) · 어두움 같은 판정 · 세션 · 로컬 저장 되돌림 같음(DB 안 씀) · 시험 test_453 5 + 관련 38 파일 289 통과 · typecheck 0 · 346_1 「편집기 다리」 가짜 사진첩 고침 · 384_3 1 실패 = 이 작업 밖.
## 454. 방향키 측점 걸음 맞춤 · 안 쓰는 유토 단계 걷음 (433-21 ② · 433-3 · sub2 · Opus high)
- 정함(브레인): 맞춤 = 곡선마다 내림 · 올림 두 후보 + 뒤 곡선 앞보기(366_3 · 390_5 · 441 단언 유지) · 계산 줄 masshaul · haul 단계 걷음(쓰는 벌 · createHaulPlanPrefetch · earthwork() cross 다시 먹이기 · postHaulPlan 남김) · 탐침 시험 7 고쳐 씀.
- [x] 454-1 — 확인: 무작위 노선 20 m 걸음 막힘 수 줄어듦(전후 수치) · 366_3 · 390_5 · 441 · 344_3 · 344_4 · 346_1 · 346_2 · 365 · 유토 곡선 그대로 + 화면(방향키 20 m · 유토 즉시) · 되돌림.
- 검증완료 — 무작위 노선 30 개 20 m 걸음 측점 밖 막힘 141 → 25 · 놓은 뒤 측점 밖 43 → 0 · 화면(검증_sub2 · 같은 출발 64 누름) 측점 밖 막힘 옛 6 → 새 1 · 노선 4 걸음 흙 배분 POST 0 · 유토곡선 판 새 누가토량 · 되돌리기 원상 · 시험 186 통과 · 346_1 「편집기 다리」 1 실패 = 445-2 `watch` 판정 변경 뒤 남은 것(이 작업 밖).
## 455. 종단 — 관 옮김 이웃 · ▲▼ 자동 R · 폴백 첫 종단 · 옛 정책 경고 (433-5 · 433-13 ① ② ③ · 433-9 · sub3 · Opus high)
- 정함(브레인): 관 옮김 = 바로 앞뒤 이웃(사용자가 높이 고친 꼭짓점 뺌)도 맞춤 · 목표 = 옮기기 전 그 측점 계획고(TS ↔ 파이썬 짝) · ▲▼ = 자동 R(사용자가 안 넣은 값)이면 지워 기본 L · 사용자 R 은 둠 · 관 정착 · 직선 분할 폴백 첫 종단도 직선화(관 꼭짓점 hold) · 옛 정책 빈 법정 최소 R · L = 설계속도 법정값 · 433-9 화면 다시 잼.
- [x] 455-1 — 확인: test_427_1(이웃 계획고 차 < 0.01 m) · 438 · 432 · 426 · 거울 + 화면(관 옮김 이웃 · ▲▼ · 옛 종단 초안 경고) · 되돌림.
- 검증완료 — 관 351 → 356 이웃 뜸 0.25 m → 0.000 m(지반 · 균형 종단 · 이웃이 1 mm 넘게 뜨는 만큼 번져 맞춤) · 관 정착 폴백 R 723 · 540 → 500 이하(여유로 들린 관 꼭짓점은 경계로 그대로 · 브레인 답 A) · 화면(검증_sub3 관 389 → 394) 이웃 380 · 400 차 0.0000 m · [저장] 뒤 서버 계획고 = 초안(394 852.5114 · 433-9 고쳐짐) · 옛 정책(최소 R · L 0) 초안 「종단곡선 미달」 21 건 = criteria 100 · 20 · 되돌리기 원상 · 시험 61 + 연관 81 통과 · DB 행 · storage 해시 되돌림 같음 · 384_3 1 실패 = 451 몫(이 작업 밖).
## 456. 요구 269 마무리 (브레인) — (일부 · 남은 줄은 PLAN.md)
- [x] 456-1 합치기 · 묶음 다섯 · typecheck · 장 시험 · 433 남은 것(433-2 픽스처 · 433-13④ 화면 확인) 다음 장.
- 검증완료(456) — 448~455 · 451 덧(finishDrop) 메인 합침 · 충돌 없음 · 서버 묶음 다섯 · typecheck 0 · 장 시험 65 파일 461 통과 · 14 건너뜀 · 창마다 화면 확인 · 메인 서버 다시 켬 · 검증 대기.
## 457. 노선 바뀜 — 초안 카드 그림 · 횡단 맥락 다시 얹기 · 가게 갈림 · 차례 짝 (요구 270 · sub7 · Opus high)
- 근거 = `docs/raw/조사/2026-10-18_457_요구270_구조물따라감.md`(원인 1 · 2 · 3 · 4 · 규칙 3장).
- 정함(브레인): 초안 상세도 캐시와 같은 `attachShapes` 를 follow 뒤 가게 값으로 부름 · `atChainage` 지움 · `specs` = 카드 번호만 · 이름 = `planStations` 제목 · 횡단 맥락(포장 · 기울임 · 하강) = 다시 얹은 그림에서 · carried = 사용자 칸만 · 짝 = 등록 열쇠(`registeredKeys`) · 차례 짝 지움 · `writeFacilities` = 지금 가게 값과 견줌(되돌리기 뒤 같은 조작도 씀).
- [x] 457-1 — 확인: node 끝에서 끝(재현 A · E · F · G · H · 되돌리기 뒤 같은 방향키 · 모든 측점 카드 그림 = 캐시 그림 = 주인 · 시설마다 제 측점 하나 · 엇갈림 0) · 410 · 411_b · 440 · 445 · 451 + 화면(분석 5장 1~11 · 14).
- 검증완료(457-1) — `test_457_draft_card` 12(옛 코드 12 실패) · 묶음 · 따라감 · 갈아끼움 시험 41 파일 258 통과 · typecheck 0 · 화면(검증_sub7 · 교점 끌기 +19.9 m) 배관 17+11 → 18+9 · 카드 그림 · 이름 = 다시 얹음 차이 0 · 캐시 차이 0 · 번호 겹침 0 · 되돌리기 뒤 같은 끌기 · 다시하기 · 초안 둔 채 새로고침 B06 같음 · 세션 되돌림 · 서버 Node 묶음 안 닿음 · 검증 대기.
- [x] 457-2 — sub4(459) 추가 측점 따라감 부름 — follow 구독 한 줄 · 초안 버림 자리 한 줄(sub4 파일 올라온 뒤).
- 검증완료(457-2) — sub1 · sub4 · sub5 받은 뒤 typecheck 0 · 묶음 시험 41 파일 258 통과 · 458 · 459 시험 11 통과 · 검증 대기.
## 458. 노선 바뀜 — B06 캐시 갈아끼움 · 주인 측점 거리 상한 (요구 270 · sub5 · Opus high)
- 정함(브레인): 갈아끼움에서 격자 아닌 자리면 `grid` 지움 · 이름 = 계획 제목 · 노선 초안 동안 그림 늘 다시 얹음(가게 초안 없어도) · 주인 측점 거리 상한 0.51 m(TS ↔ 파이썬 짝 · 넘으면 안 얹고 경고) · 시종점 밖으로 밀린 시설 = 시종점 측점에 안 얹음 · 「노선 밖」 경고 · B08 수량 대조(같은 값).
- [x] 458-1 — 확인: 거울 `test_323_4_attach_mirror` 확장(상한 · 연동 폭) · node(재현 A · D) · 450 · 433_4 · 266 + 화면(분석 5장 2 · 3 · 5 · 7) · 457 합친 뒤 457 시험 다시.
- 검증완료 — test_458 6 · 323_4 거울 moved(상한 · 시종점 밖 · 연동 폭) · 299 같은 키 견본 주인 0.51 m 안으로 · 457 · 459 합친 뒤 관련 시험 392 통과(260 · 265 · 322_0 = 고치기 전부터 실패) · typecheck · 덧(sub7 쪽지): 떠난 측점 옛 자리에 새 측점이 서면 새 카드 번호 · 갈아끼움이 preview 표시 안 들고 감 · B08 대조 = storage 16 프로젝트 저장분 얹기 15 같음 · 1(검증_sub4) = 관 388 · 394 측점 없는 진행 중 자료(옛 규칙은 394 관을 400 측점에 붙임) · 화면(검증_sub5 · 노선 초안) 관 351 → 360 격자 G · 370 G 지움 · 제 측점만 그림 · 시점 밖 관 = 시점 카드 그림 · 이름 없음 + 알림 「노선 밖 1 곳」 · 물넘이포장 폭 24 주인 210 · 연동 200 · 213 · 220 · 초안 버림 뒤 세션 원상 · 저장 안 함 · 「묶음 다시 지음 필요」(common_util_culvert_sets · structure_attach).
## 459. 노선 바뀜 — [저장] 구조물 맞춤 · 추가 측점 따라감 · 관 꼭짓점 세움 (요구 270 · sub4 · Opus high)
- 정함(브레인): `rebaseStructureDraft`(관 `rebasePipeDraft` 짝 · 따라가기만 한 것 = 서버 값 · 사용자가 옮긴 것만 초안 값) · 추가 측점 초안 없으면 PUT 안 보냄 · 추가 측점도 초안 동안 follow · 좌표 없는 옛 관은 옛 노선으로 좌표 먼저 채움 · 따라감 실패 알림 · 관 따라감 선 = 구조물과 같은 계통(추정 먼저 확인) · 노선 바뀜 때 옮긴 시설 측점에 427 관 꼭짓점 세움(초안 · [저장] 짝 · 요구 270 「종단 데이터 다시 생성」).
- [x] 459-1 — 확인: 거울 `test_410_follow_xy` · `test_344_2_route_pairs` 확장 · 서버 임시 storage(따라감 · _place_pipes · station_keys · carry_cross_inputs · attach_shapes · 옮긴 시설 측점 = 새 지형 표본 + 사용자 칸 · 그림은 제 측점만) · 427 · 455 · 449 + 화면(분석 5장 12 · 13 · 종단 관 꼭짓점) · 백업 · 되돌림.
- 검증완료(sub4) — 관 따라감 선 추정 맞음(B04 `_prepare` = 범위 안 자름 · 정본 388 · 394 대 종단 351 · 358) → `points` 로 · 옛 관 열쇠도 옛 노선 누가거리(관 측점 메모 351 → 350 넘어감 · 고치기 전 관 열쇠 0) · 초안 중 마커로 옮긴 관 427 = 서버 차례 짝(화면 검증_sub4 353 m 초안 대 [저장] 차 1.4 m → 0.048 m · 나머지 측점 ≤ 0.013 m = 초안 첫 계획선 ↔ 서버 옛 차이) · 노선 밖 시설(덧 · 측점 계획 · 알약에서 뺌 · 알림) · 되돌리기 원상 · 시험 test_459 10 + 연관 453 통과 · typecheck 0 · DB 7표 · storage 해시 되돌림 같음 · 한계 = 노선 초안 전에 옮기고 저장 안 한 시설은 「따라간 자리」로 봄 · 묶음 다시 지음 필요(route_follow · structure_station · Pipeline_Grade).
## 460. 요구 270 마무리 (브레인) — (일부 · 남은 줄은 PLAN.md)
- [x] 460-2 합치기 · 묶음 다섯 · typecheck · 장 시험.
- 검증완료(460) — 457 · 458(+ 덧 둘) · 459 · 461 · 462 메인 합침 · 서버 묶음 다섯 · typecheck 0 · 장 시험 82 파일 629 통과 · 브레인 화면(검증_랩탑메인 · 저장 없음): 교점 ↓ 한 번 노선 1080.2 → 1100.2 m · 관 351 → 372 m(18+12) · 종단 알약 · 평면 마커 · B06 「18+12」 카드만 관 그림 · 옛 · 이웃 카드 없음 · ↶ 복귀 · 일반측점 위(360 m = 18+0 카드 하나) · 떠남(361) 통과 · 초안 버림 · 프로젝트 되돌림 · 검증 대기.
## 461. 종단 직선화 붉은 강조 · 끝 R 기본 L · 직선화 · 자유지정 영역 실시간 띠 (요구 271-1~3 · sub1 · Opus high)
- 근거 = `docs/raw/조사/2026-10-18_461_요구271_직선화영역.md`.
- 정함(브레인): 분석 문서 3장 그대로(직선화 클릭 = 늘 측점 고름 · 측점에 붙음 · 끝 자동 R 지움 → 기본 L 20 · 이미 직선 범위 = 부분 구간 고름 + ▲▼ 로 양 끝 L 20 · 법정 판정 오차 1e-3 짝 · 실시간 띠 도우미 하나 · Esc = 시작만 취소).
- [x] 461-1 — 확인: 새 `test_271_straighten_pick.py`(측점 고름 · 붙음 · Esc · 끝 L 20 · 자동 R 지움 · 사용자 R 둠 · BP · EP · 부분 구간 ▲ · 파이썬 build_alignment 거울) · 새 range band 시험 · 215_1 · 426 · 355_1 · 219_1 · 432_1 + 화면(분석 문서 5장 1~17).
- 검증완료(461) — 시험 6 파일 61 통과 · typecheck 0 · 화면(검증_sub1 · 5174 · 밝음 · 어두움) 1~5 · 7~15 · 17 수치 맞음 · 6(저장 자동 R)은 저장분 없는 프로젝트라 단위 · 거울 시험만 · 16(팝아웃)은 탭 둘 한도로 안 띄움 · 덤 = 쉬프트 붉은 강조가 다른 도구로 넘어가도 남던 것 뗌 · 쉬프트 고름 직후 강조가 다음 다시 그림 때 뜨는 것은 옛 그대로 · 캐시 되돌림 · 검증 대기.
## 462. B05 · B06 한 페이지 ① 시설 줄 페이지 한 벌 · 메모리 전달 정리 (요구 271-5 · sub2 · Opus high)
- 근거 = `docs/raw/조사/2026-10-18_462_요구271_한페이지.md` 3장 원인 1 · 5 · 4장 (A) · (E).
- [x] 462-1 — 확인: 새 `test_271_facility_lane.py`(B06 먼저 → B05 읽음 = B05 먼저 듣는 중 · 알약 · 측점 · 평면 마커 · 관 id 장부 같음 · 헛 id 0 · 451 잔여 재현 뒤집기) · 399 · 409 · 410 · 411_b · 440 · 451 + 화면(분석 6장 P1 · P2 · P3 · 시설 · 관 · 평면 패널 조작).
- 검증완료 — 관련 시험 507 통과(실패 2 = 받기 전부터 · test_b06_save_recompute · test_307) · ORCA P1 · P2 · P3(옹벽 넣음 · 지움 · 관 351→360 · 장부 헛 id 0 · 계획고 편집 한 번만 옮김 · 관 옵션 새로고침 뒤 B06 Φ800).
## 463. B05 · B06 한 페이지 ② 페이지 설정 한 칸 · 상세 알림 · [저장] 같은 본문 (요구 271-5 · sub6 · Opus high · 458 · 459 합친 뒤)
- 근거 = 같은 문서 원인 2 · 3 · 4 · 4장 (B) · (C) · (D).
- [x] 463-1 — 확인: 새 `test_271_detail_notify.py`(강제 받기 · [측점 만들기] 뒤 듣는 쪽 한 번) · `test_271_save_same.py`(B05 있을 때 · 없을 때 [저장] 요청 줄 같음) · `test_271_profile_settings.py` · 442_2 · 449 · 446 + 화면(B06 새로고침 → 라벨 오프셋 · 기울기 빨강 · 넓힘 · [측점 만들기] · [저장] · [확정] · [초기화] · 반대 방향).
- 검증완료 — R1 · R2 옛 코드 실패(듣는 쪽 0 번 · 옛 캐시) 뒤 고침 · 관련 시험 369 통과 · typecheck 0 · ORCA(검증_sub6 · 5181) B06 새로고침 = B05 와 같음(라벨 5+0 · 빨강 28 · 상한 20 % · 강제 켜짐) · 반대 방향 같음 · 넓힘 55 m = 듣는 쪽 1 번 새 상세 · [저장] 두 길 · [확정] 확정 요청 줄 같음 · [초기화] 뒤 저장 설정(0+0 · 14 %) · [측점 만들기]는 빠진 측점이 안 생겨(관 저장 때 서버가 세움) 시험만 · DB 7표 · storage 해시 되돌림 같음 · 옛 시험 5개 단언 · 가짜 창구를 flushRouteParts 로 맞춤.
## 464. 요구 270 · 271 마무리 (브레인) — (일부 · 남은 줄은 PLAN.md)
- [x] 464-1 합치기 · 묶음 다섯 · typecheck · 장 시험.
- 검증완료(464) — 457~459 · 461 · 462 · 463(+ 덧 surface_params) 메인 합침 · 서버 묶음 다섯 · typecheck 0 · 장 시험 87 파일 646 통과 · 14 건너뜀 · 창마다 화면 확인 · 브레인 화면 확인(460) · 메인 서버 다시 켬 · 검증 대기.
## 465. 요구 272 — 지정 · 산출 값이 저절로 바뀜 분석 (브레인 · 에이전트)
- 근거 = `docs/raw/조사/2026-10-19_465_요구272_값안변함.md`(재현 · 원인 · 정함 · 절마다 영향 범위 · 시험 · 화면 목록).
- 정함(브레인): 분석 4장 그대로 — 파생값 = 입력(저장 정본 + 세션 초안)만의 함수 · 들어온 길 · 보기 차례 · 접힘 · 메모리 · 새로고침으로 갈리지 않음 · 측점 스냅 = 의도(판정 밖) · 단면 모양 기본값 짝(7번)은 기록만.
- 참값 = 서버 정본 누가토량 −17,570.7 ㎥(검증_랩탑메인).
- [x] 465-1 분석 · 계획.
## 466. 값 안 변함 ① 상세 가게 메모리 = 페이지 수명 · 버린 초안 차례 가게 측점 (요구 272 · 분석 4장 (A) · (A2) · sub7 · Opus high)
- 먼저 `design_pipeline_page.ts`(700줄) 가게 구독 `:383-403` 을 새 `design_pipeline_page_publish.ts` 로 뗌.
- [x] 466-1 — 확인: 새 `test_272_detail_memory.py` · `test_272_drop_store_stations.py` · 분석 5장 (A) · (A2) 기존 시험 + 화면(분석 7장 466-A · 예외).
- 덧 고침 — 새로고침 · 다시 열기에 관 초안 측점이 빠지던 흠(열 때 초안 있으면 측점 냄) · 다시 열 때 시설 줄이 측점을 늦게 내 그 사이 차례가 옛 화면 선으로 셈한 측점(화면 선만 바뀜 = 낡으면 cross 한 번 더).
- 남은 흠(467 몫) — 관 초안을 일반 측점 자리(340)에서 지움 = 측점 자리가 같아 갈아끼움 안 함 → 메모리 −17,601.4 · 새로고침 −17,541.5.
- 검증완료 — 시험 318 통과(새 9 · 옛 판에서 새 9 실패 · 옛 검증_sub7 경로 시험 62 건너뜀) · 화면 R1 [폐기] → B05 −17,570.7 · 351 · B07 351 · 노선 초안 ↶ 가게 · 세션 측점 57 · 새로고침 관 361 초안 57 측점 −17,534.4 = 메모리 길 · 접힘 · 팝아웃 · 밝음 같음.
- [x] 466-2 덧(470 4.2 N1 · N2) — [확정] 성공 길도 상세 비움(`invalidateSectionDetail`) · B06 폼 관 옮김 + 옵션 = 옮긴 자리로 찾음(옵션 · 캐시 얹기 · 집계 항목).
- N2 화면 = 옵션 칸이 제 변경 때 먼저 반영돼 보통 조작으론 그 길을 안 탐(코드 길만 · 시험이 덮음) · 옮긴 새 자리 카드 옵션 유지 확인.
- 검증완료 — 시험 336 통과(새 `test_466_pipe_move_options` 2 · 확정 항목 1 · 옛 판에서 실패) · 화면 [확정] → B07 상세 = 새 객체 · 세션 = 서버 정본(옛 사본 아님) · DB 7표 61행 · storage 파일 되돌림(백업과 같음).
## 467. 값 안 변함 ② 갈아끼움 정본 표본 유지 · 소단 원천 한 벌 (요구 272 · 분석 4장 (B1) · (B2) · sub5 · Opus high)
- [x] 467-1 — 확인: 새 `test_272_swap_keeps_canon.py` · `test_272_berm_source.py`(TS ↔ 파이썬 거울) · 분석 5장 (B1) · (B2) 기존 시험 + 화면(분석 7장 466-B · 소단 있는 자기 검증 프로젝트).
- [x] 467-2 덧 — (B1) 같은 열쇠 → 같은 자리(격자에 구조물 놓고 뺌도 정본 표본) · 고름 ↶ = 정본(다시 셈 물러섬 = 저장 정본 `savedDesigns` · `handleDesignChange` 메모리 덮기 뺌 · 새 `test_272_choice_undo.py`).
- [x] 467-3 덧 — ① 짝 없는 새 측점(구조물 · 추가 측점 · 새 관) = 계획선 꼭짓점 안 세움(파이썬 `_follow_moved_stations` · TS `followMovedNodes` · 짝 있는 옮긴 관 = 427 그대로) ② 제자리로 온 측점 = 저장 정본 표본(CanonRow 자리 · 표본) ③ 일반 측점 자리 관 지움 = 갈아끼움(`sameStationList`) ④ 시설 줄 종류 표 전 측점 안 칠함.
- 검증완료(467-3) — 시험 19 파일 150 통과 · 새 단언 옛 코드 실패 · typecheck 0 · 화면(5180 · 검증_sub5 · 백엔드 다시 켬): 소단 22+0 [저장] 전 −17,595.6204 → 뒤 −17,595.6044(435 · 445 계획고 같음 · 새 측점 지반 표본 mm 차만) / 관 18+11 → ↶ = GET 와 측점 모두 같음 / 관 17+0(일반 측점 340) → 지움 = −17,541.5871 = 새로고침 값 · 340 일반 측점 / DB 7 표 · storage 해시 되돌림 같음 · 검증 대기.
- 검증완료(467) — 시험 37 파일 268 통과 · 새 시험 셋 옛 코드 실패 확인 · typecheck 0 · 화면(5180 · 검증_sub5): 관 17+11 → 18+11 → ↶ = −17,570.7 · GET 대비 관 측점만 다름 / 새 탭 B05 만 소단 놓음 = B06 연 뒤 = −17,595.6301 · 소단 빼면 정본 표본 / [측구] · [토사] · [단경사] · 노견 ◀ · 소단 깊이 ▼ 각각 ↶ = 고르기 전 값 · ↷ = 고른 값 / 새 탭 · 새로고침 · 어두움 −17,570.7065 · DB 7 표 · storage 해시 되돌림 같음 · 검증 대기.
## 468. 값 안 변함 ③ 되돌리기 빈 칸 · 접힘 파생 · 배지 자릿수 (요구 272 · 분석 4장 (C1) · (C2) · (C3) · sub1 · Opus high)
- [x] 468-1 — 확인: 새 `test_272_history_empty_cells.py` · `test_272_hidden_summary.py` · 분석 5장 (C1)~(C3) 기존 시험 + 화면(분석 7장 466-C · 팝아웃).
- 검증완료 — 새 시험 10(옛 코드 7 실패) · 기존 173 통과(139-2 묶음 로더 흠 = 옛 코드도 같음) · typecheck · 화면 검증_sub1: 교점 ↓ → ↶ → B06 → B05 = ↶ 꺼짐 · ↷ 켜짐 · 빈 칸 0 · 접은 채 교점 ↓ = 배지 −19,899.5(펼침 같음 · 측점 56) · 떼어 낸 유토 판 곡선 갱신 · 밝음 · 어두움 · 「[]」(관 모두 지움)은 걸음 그대로 둠.
- 덧(sub1 찾음 · 옛 코드도 같음) — ① 교점 ↓ → ↶ → 같은 탭 새로고침 = 누가토량 −17,385.4(새 탭 −17,570.7) → 466 덧(sub7) ② B06 카드 [측구] → ↶ = 카드 · 누가토량 −17,572.4 안 돌아옴(Design_Sync 가 메모리 상세 design 을 덮음) → 467 덧(sub5).
## 469. 요구 272 마무리 (브레인) — (일부 · 남은 줄은 PLAN.md)
- [x] 469-1 합치기 · 묶음 다섯 · typecheck · 장 시험 · 브레인 화면(검증_랩탑메인 · 저장 없음 · 새 탭 B05 · B06 · 새로고침 · 팝아웃 · 접힘 누가토량 같음).
- 검증완료(469) — 466(+ 덧 둘) · 467(+ 덧 넷) · 468 메인 합침 · dev 받음 · 서버 묶음 다섯 · typecheck 0 · 장 시험 40 파일 185 통과 · 31 건너뜀 · 메인 서버 다시 켬 · 브레인 화면(검증_랩탑메인 · 저장 없음) 새 탭 · B06 왕복 · 새로고침 · 접힘 = −17,570.7 · 57 측점 · 교점 ↓ → ↶ = 정본 · ↶ 꺼짐 ↷ 켜짐(B06 다녀와도) · 접은 채 ↓ = 2 초 안 새 값 · 관 옮김 [폐기] = 351 그대로 · [측구] ↶ = 정본 · ↶ 뒤 새로고침 = −17,570.7 · 검증 대기.
## 471. B05 · B06 데이터 흐름 참고 문서 (사용자 지시 · 브레인 · 에이전트 · 467 · 466 덧 합친 뒤)
- 자리 = `docs/guide/B05_B06/`(위키 규칙 · 파일마다 100줄 · 표 형식) — 한 장 그림 · 조작별 표(어디 놓임 · 브라우저 셈 · 서버 셈 · [저장]) · 값별 표(주인 · 사본 · 셈 자리 · 짝) · 지킬 규칙.
- 근거 = `docs/raw/조사/2026-10-19_470_B05B06_데이터흐름.md` + 466~468 합친 코드.
- 코더 업무 지시 공통 블록에 「B05 · B06 고치기 전 읽음 · 흐름을 바꾸면 같은 커밋에 문서도 고침」 한 줄.
- [x] 471-1 문서 · index 갱신 · 공통 블록 줄.
- 검증완료(471) — `docs/guide/B05_B06/` 8 파일(각 100줄 안) · 경로 170 git 목록과 맞음 · 466~468 바뀐 줄 다시 읽음 · BRAIN 3장 지시 글 한 줄 · 검증 대기.
## 472. B05 · B06 코드 구조 다시 세움 (요구 273 · 단계 진행 · 단계마다 기준값 그대로) — (일부 · 남은 줄은 PLAN.md)
- [x] 472-0 목록(에이전트).
- [x] 472-1 기준값 시험(sub2 · 목록 4.2) — 고정 자료 `resources/tester/fixtures/golden_472/`(검증_랩탑메인 읽기만) · 브라우저 길(vite ssr 진짜 단계 함수) · 서버 길(pytest · DB 없이 [저장] 엔진 차례 + server-calc) · 길마다 0 차 · 두 길 사이 「알려진 차」 목록만 허용 · 값 파일은 466 · 467 덧 합친 뒤 다시 뜸.
- 길 넷 = 정본(GET) · [저장] 재계산 · 노선 저장 체인 · 브라우저 묶음 · 알려진 차 = R7 · W0(정본 경고 옛 코드) · X2(입력 선 0.1 mm ↔ 1 mm · 끝값 0.69 ㎥) · W1(경고 글 두 벌) · X1 · X3 은 이 고정 자료가 안 거침.
- 검증완료 — `test_472_1_golden.py` 9 통과 · 1 건너뜀(API 왕복) · 정본 = [저장] 재계산 = 노선 저장 체인 −17,570.70 · 브라우저 −17,570.01 · 측점 57 · 화면(B05) 배지 −17,570.7 ㎥ · 57 측점 · 고정 자료 2.98 MB.
- [x] 472-2 걷어내기(목록 4.3 · 2-A B05 sub3 · 2-B B06 sub4(+ 상세 파일 이름 차례 흠 · cross_01080.16m 이 1080 앞) · 2-C 공용 sub6 · 「확실」 줄만 · 추정 줄은 사용자 답 뒤). → 2-B(a6a1b9213) · 2-C(9afa4e303 · c856a0849) 메인에 있음 · 추정 줄 = 472-7.
- [x] 2-A B05 — Ford 파일 통째 · `/route/replan/reset`(파이썬 · TS) · TS solveRoute(+ 딸린 RouteSolve 타입 둘) · export 열(몸통째 · 파일 안 부름도 0) · 딸려 죽은 INLET_KINDS · 위키 한 줄 · corridor 다시 지음.
- 검증완료 — 고친 대상 시험 720 통과 · 83 건너뜀 · golden 9 통과 · typecheck 0 · 화면(B05 · B06 · 새로고침 · 접힘 · 어두움 · 3D) 누가토량 −204.2 ㎥ · 측점 59 · 알약 1 같음 · 처음 새로고침 한 번 −211.6 ㎥(6 번 중 1 · 지운 코드 부름 0 → 기존 경합 추정).
- [x] 473 새로고침 누가토량 흔들림(요구 272) — 원인 = 시설 줄이 관 알림 전 「모름」을 빈 목록으로 심음(`design_facility_lane.ts` refresh · paint) → 종단도 선이 저장 관 측점 389 꼭짓점을 뺌 → 첫 cross 가 380 · 389 · 400 을 그 선으로 다시 셈(389 계획고 852.79 대 852.837) → 배지 −211.6 ㎥ 1 초 남짓 → 관 도착 뒤 cross 한 번 더 −204.2. 고침 = 시설 줄 known(종류 표 · 구조물 · 관 알림 다 옴) 뒤만 심음 · 종단도 planted 전 = 저장 기준 · 서버 측점 그대로(`design_profile` · `design_profile_base` listedBase null · Render deriveProfile · `design_view_profile_sections` stationsReady) · 위키 rules 한 줄.
- 검증완료 — 옛 코드 흔들림 새로고침 2/20 · 새 탭 1/20 · B06 바로 0/20(바쁠 때 6/11) → 고친 뒤 60/60 숨김 → −204.2 만 · test_473_lane_ready 4 통과(옛 코드 빨강 = 관 전 [] 심음 · null 못 받음) · 관련 66 파일 391 통과(test_346_2 가짜 다리에 stationsReady 더함) · golden 통과 · typecheck 0 · 화면(검증_sub3 · B05 · 새로고침 셋 · B06 · 접힘 · 어두움 · ▲ 0.1 m → −252.2 → ↶ → −204.2 · 초안 없음) 측점 59 · 19+9 · 알약 1 같음.
- [x] 시험 정리 둘(소스 그대로) — test_b05_structures_registry_policy 빨강 4 = 사용자 구조물정의 판 23(켬 · 끔 명시 · 맹암거 3 m · 3 %)과 옛 단언(수 28 · 끈 목록 · 바닥막이 켬) → 시험이 마스터 파일을 읽어 판정(수 · 이름 안 박음) · 맹암거 기본값 = 사용자 지시(요구 223 · 4baf49ba4) 근거로 인정 / test_prefs_persist_across_tabs 빨강 = 388-3 세션 넘침 때 결과 칸을 비우는 `setOrMakeRoom` 글을 「저장소 가름」으로 오판 → 판정을 저장소 고르는 `storageFor` 안으로 좁힘.
- 검증완료 — 두 파일 24 통과(registry 20 · prefs 4) · ruff 깨끗(옛 줄 길이 하나 그대로).
- [x] 2-B B06 — `POST …/cross-design`(파이썬 · TS · 응답 스키마 · TS 요청 타입 · 파이썬 요청 스키마는 test_316 이 써서 둠) · export 열 셋 지움 · PIPE_DISPLAY_NAME → `common_util_structure_catalog` · Api_Fetch 세션 · 사진첩 창구 → 새 `B06_Section_Api_Context.ts` · 덧 흠 = 횡단 파일 측점 차례(`cross_files_in_order` 한 벌 · B06 상세 GET · B07 측점 파일 · B07 장 나눔 이름 sorted 걷음) · 472-3 알려진 끌림 셋 걷음 · sc · co · ex 다시 지음.
- 검증완료 — 고친 대상 시험 1111 통과(빨강 1 = 지운 엔드포인트 이름 단언 → 고침 · 오류 2 = test_139_2 옛 코드에서도 같음) · golden 9 · 472-3 등록부 · 새 시험 test_472_2_cross_order(옛 코드 빨강 3) · typecheck 0 · 화면(검증_sub4 · B06 · B05 · 새로고침 · 새 탭 · 판 접힘 · 어두움) 누가토량 −17,561.8 ㎥ · 측점 58 같음 · 상세 GET 1080.0 → 1080.16 오름차순 · 카드 차례 같음.
- [x] 2-B 덧 세션 끌림 — 신원표 `common_util_pick_tag`(관 id = 화면이 usePipeIds 때 세션 장부 꽂음) · Wire 토스트 = 알림 창구(Cross_View 가 꽂음) · design-calc · sc · co 세션 · 화면 끌림 0 · 472-3 알려진 끌림 다섯 더 걷음(남은 Api_Fetch · config · ui_template = 헬퍼 정규식 헛잡음 · sub2) · ex 는 B07 덧그림이 B06 상세 창 화면을 끌어 그대로.
- 검증완료 — 고친 대상 시험 906 통과(오류 = test_139_2 옛 그대로 · 286_1 헬퍼 흉내 → 진짜로 고침 10 통과) · golden · 472-3 통과 · typecheck 0 · 화면 B06 누가토량 −17,561.8 · 58 측점 · 카드 신원표 pipe-s1 · s2(세션 장부) 같음.
- [x] 2-C 공용 — `common_util_mass_haul_view` 866 줄 나눔(그래프 601 · `_callout` 말풍선 · 값 표기 · `_legend` 이름 · 범례 · 동작 같음) · DESIGN_VIEW_ROUTES · ALIGNMENT_DRAFT_KEY_PREFIX · structureStatus · bermSpec · MASS_HAUL_HEIGHT · createMassHaulSummary(몸통째) · 세션 열쇠 culvertmove · std-cross 낡은 주석 · 공용 머리 시험 경로 `tmp/tests` → `resources/tester`(B06 파일 머리 여섯은 2-B 몫이라 남김) · 위키 세션 열쇠 한 줄 · sc · co · ex 다시 지음.
- 검증완료 — 고친 대상 시험 413 통과 · 1 건너뜀 · 빨강 1 = `test_prefs_persist_across_tabs` 설계값 세션(388 커밋 뒤 늘 · 고침과 무관) · golden 통과 · typecheck 0 · 화면(검증_sub6 · B05 · B06 · 새로고침 · 유토 팝아웃 · 판 접힘/펼침 · 범례 켬/끔 · 말풍선 · 어두움) 누가토량 −17,570.7 ㎥ · 측점 57 같음 · 같은 탭 새로고침 6 번에 1 번 −17,385.4(옛 코드로 되돌려도 8 번에 1 번 · 472 덧 경합과 같은 갈래).
- [x] 472 덧 — [저장] 측점 맞춤(_stand_patch_stations)이 구조물 측점 사용자 칸(uphill_side_source=user · pavement_*)을 지움 · X6 넘기는 칸 목록 두 벌(sub8).
- 원인 = [저장] 상단측 차례(`POST /route/confirm` → `_append_irregular_cross_sections` · 매 [저장])와 측점 맞춤이 `_merge_irregular_into_longitudinal` 로 구조물 측점 줄 통째 갈음 · 측점 줄 쓰는 곳은 이것 · 상단측 병합 둘뿐 · 고침 = 같은 자리 옛 줄에서 `STATION_CARRY_KEYS`(상단측 출처 · `user` 면 값도 · 포장 표기) · 새 자리 포장 표기 = 지금 계획선 · X6 = 거울 시험(두 목록 같음 · 한 벌은 472-4).
- 검증완료 — test_472_station_user_fields 4(옛 코드 빨강 3) · golden 통과 · 고친 대상 시험 212 통과 · 화면(검증_sub8) 351 상단측 left 세션 지정 → [저장] = left · user · 포장 19.76 % 그대로 · 실제 단추 길(새 탭 B06 [저장] → 새 탭 [저장] · 두 번 다 서버 재계산 나감) = 351 right · user · 포장 19.76 % 그대로(옛 코드 = 출처 · 포장 지움) · 칩 포장 권장 29 · 성토 5m↑ 40 같음 · DB · storage 되돌림(차 0 · 누가토량 −17,570.7) · B06 카드엔 상단측 · 포장 단추 없음(손 지정 = [확정]이 카드 측구 방향을 되씀 E-7 · 3D 램프 누름 코드 없음).
- 남은 것 — 노선 저장(측점 통째 새로)은 상단측 손 지정을 안 넘김(「측구 방향은 새 지형이 정함」 기존 규칙 · 사용자 협의) · 옮긴 구조물 새 자리 = 지형 자동 · 세션을 직접 넣은 시험이라 횡단 설계 행은 right_cut 그대로(실제 3D 램프 누름 길은 못 돌림).
- [x] 472 덧 — B05 첫 새로고침 6 번에 1 번 누가토량 −211.6(옳은 값 −204.2 · 검증_sub3 · 경합 · sub3).
- 검증완료(473) — 시설 줄이 종류 표 · 구조물 · 관 알림 다 온 뒤만 심음 · 옛 코드 새로고침 2/20 · 새 탭 1/20 · B06 6/11 → 고친 뒤 60/60 −204.2 · test_473_lane_ready · golden 통과 · 검증 대기.
- [x] 472 덧 — [저장] · [확정] 재계산이 종단 경고를 다시 안 씀(정본 5 줄 · 지금 셈 51 줄 · sub2 기준값 시험이 찾음 · sub8).
- 서버 재계산 맨 앞 `refresh_alignment` = 경고만 지금 코드 값(기하 저장값 그대로 — 통째 다시 쓰면 6 자리 반올림 끝자리로 면적 1e-4 ㎡ 흔들림) · 파이썬 경고 글 = TS 꼴(접두 · 총괄 줄 뺌 · 브레인 A) · 기준값 경고 칸만 다시 뜸(server_save 5→50 · server_route 51→50 · W1 지움).
- 검증완료 — test_472_save_warnings 6(옛 코드 빨강 5) · golden 15 통과 · 고친 대상 시험 445 통과 · 화면(검증_sub8 · B05 [저장]) 정본 경고 5→50 · 칩 위반 34 · 미달 46 · 누가토량 −17,570.7 ㎥ · 측점 57 같음 · B06 같음 · DB · storage 되돌림(차 0).
- 덧 흠(내 고침 밖) — [저장] 측점 맞춤이 구조물 측점 351 의 `uphill_side_source: user` · `pavement_*` 칸을 지움(값 `uphill_side` 는 같음) · 재계산 「종단 경고 다시 셈」 0.8 s 더 듦(측정만).
- [x] 472-3 계산 등록부(목록 4.4 · 3-A 등록부 · Node 입구 · 시험 sub2 → 3-B 파이썬 실행기 sub2).
- [x] 3-A — `design_calc_registry.ts`(43 id · 순수 자료) · `design_calc_node.ts`(node 다섯 = 구조물 면적 · 관 길이 · 누가토량 · 유토 배분 · 터파기 · 3D) · `build:design-calc` · 나머지 실행기 = 파이썬 이름(472-4 동안) · Node 입구 도달 = logic · common_util + 「알려진 끌림」 49(세션 23 · 2-B 정리 / 기하 26 · 472-4 logic 으로).
- 검증완료 — `test_472_3_calc_registry.py` 9 통과(STAGE_DEPS 같음 · 서버 쪽 코드 브라우저 밖 · server-calc · corridor 값 같음 · 끝값 −17,570.7) · `test_472_1_golden.py` 9 통과 1 건너뜀 · typecheck 0.
- [x] 3-B 파이썬 실행기(`common_util_calc_runner.py` · `run_bundle_json` 한 길) — `run_calc(ids, inputs)` · Node 실행기 아닌 id 는 ValueError · 서버 기존 부름 자리 그대로(472-4 몫).
- 검증완료 — `test_472_3_calc_runner.py` 3 통과(NODE_IDS = 등록부 = 입구 · 값 = server-calc · 끝값 −17,570.7) · 472-3 등록부 9 · 472-1 기준값 9 통과 1 건너뜀.
- [x] 472-4 짝 모으기(목록 4.5 · ① 측점 열쇠 · 따라감 sub8 + ② 횡단 설계선 · 면적 · 소단 sub2 동시 → ③ 측점 · 지반 · 종단 · 관 세트는 남김). → ① ② 끝 · ③ = 472 덧.
- [x] ② sub2 — `Router_Design` 699 → 609줄(`_Router_Design_Ranges` 나눔) · [저장] · [확정] 다시 셈(enforce 셋 · 넓힘 뒤 설계) = Node `cross.design` 측점 묶음(`B06_Section_Engine_Design_Node.py` · 파이썬은 입력 조립) · C1 · C2 · C5 한 셈 · X3 풀림 · C4 소단 구간 = `common_util_berm_spans.ts`(서버 `cross.berm_spans`) · C3 구간 판정 · C6 얹기는 파이썬 짝 남음(C6 거울 새로 · 알려진 차 = 옛 underdrain 걷음 TS 만) · 파이썬 `compute_cross_design` 남음(B07 · 추천 · Route_Save · B05 확정 · 넓힘 찾기 · Node 못 부를 때).
- 검증완료 — 기준값 시험 10 통과 1 건너뜀(0 차 · 설계선 점 13 곳 1e-4 판정 더함) · 472-3 · C6 거울 · 영향 시험 95 파일 723 통과(빨강 4 = `test_b05_structures_registry_policy` · 구조물 표 자료 · 이번 고침과 무관) · 검증_sub2 실제 다시 셈 = 횡단 행 설계선 점 13 곳 1e-4 m 만 · 면적 · 누가토량 같음 · 행 · 파일 되돌림 해시 같음.
- [x] ① sub8 — 서버도 같은 TS(Node 입구 따라감 몫 `design_calc_node_follow.ts`) · P6 꼭짓점 세움 `profile.seat`(`Router_Confirm._seat_born_nodes` = 겉) · F2 추가 측점 `facility.plus_follow`(TS `followPlusRows` · `Plus_Stations` = 겉) · F1 구조물 따라감 `facility.follow`(`route_follow.follow_structures` = 겉) · X6 넘기는 칸 정본 = TS `ROW_CARRY_KEYS` 하나(파이썬이 그 글을 읽음 · JSON 은 헬퍼 로더가 못 풀어 안 씀) · 요구 274 규칙 시험(노선 바뀌면 손 상단측 안 들고 감).
- 남김 — F1 저장 때 좌표 맞춤 `fill_structure_coordinates`(옛 좌표 지킴 · 0.1 mm 반올림 — TS `placeOnLine` 과 규칙 달라 옮기면 저장 좌표 바뀜) · R7 서버 열쇠(주인 = 파이썬 `plan_stations` F3 · 부르는 곳 = 노선 저장 이월 ③ — ③ · F3 와 같이) · 「R7 알려진 차」(기준값 KNOWN)는 노선 저장 표본 다시 뜸 몫이라 ① 과 무관.
- 검증완료 — test_472_4_follow_node 4(옛 코드 빨강) · test_472_station_user_fields 6 · 따라감 · 꼭짓점 거울(344_2 · 380_3 · 410 · 427_1 · 459 · 368_2) · 472-3 · golden 통과 · Router_Design · Station_Swap 관련 298 통과 · typecheck 0 · 화면(검증_sub8 · 옹벽 590–610 · 추가 측점 500 놓고 B05 교점 끌기 → [저장]) 관 351 → 354 · 꼭짓점 354 세움 · 옹벽 · 추가 측점 같은 자리 · 누가토량 −18,080.2 · 측점 59 → 새로고침 · B06 같음 · DB(노선 행 통째) · storage 되돌림 차 0 · 묶음 다시 지음 필요(design-calc · route_follow 끄는 묶음).
- [x] 472-5 값 주인 하나(목록 4.6 · 5-A 관 · 구조물 sub2 · 5-B 횡단 상세 · 측점 sub4 · 5-C 종단 편집 · 페이지 설정 sub4 · 5-D B06 조정 맵 sub6 · 2-C 뒤). → 5-A~5-D · 남음 끝.
- [x] 5-A 관 · 구조물 sub2 — 판 셋 나눔(B06 구조물 판 700 → 624 · B05 구조물 판 693 → 665 · 배수 판 691 → 657 · 동작 같음) · 주인 = 가게 `pipes` · `structures` 칸 · 화면 사본은 가게 알림으로 맞춤(종단 보기 = 배수 편집기 `adoptPipes` 숨어도 · 목록 `takeStructures` 보일 때 · 횡단 판 = 마지막으로 읽거나 쓴 값과 다르면 다시 실음 · 옵션만도) · ↶ ↷ 뒤 `announceDesignStore`(관 · 구조물 · 추가 측점) · 종단 고름 · 알약 관 = 시설 줄(노선 따라감 뒤 옛 자리 안 봄) · 모듈 사본 변수는 화면 사본으로 남김(글 단언 시험 많음 · 주인은 아님).
- 검증완료 — `test_472_5_shop_owner` 3 통과(옛 코드 실패 확인) · 영향 시험 76 파일 554 통과 · 기준값 그대로 · typecheck 0 · 화면(검증_sub2 · B05 구조물 넣음 → ↶ 목록 0 → ↷ 1 → ↶ 뒤 새로 넣어도 옛 값 안 살아남 · B06 ↶ ↷ 목록 따라감 · 새로고침 그대로) · 초안 지운 뒤 행 · 파일 해시 같음.
- [x] 5-A 덧 — 겹침 정리(관 · 구조물 = 가게 알림 한 번 · 추가 측점 = 자기 훅 · 계산 묶음 = 출처마다 한 번 · 옛: 추가 측점 되돌리기에 묶음 두 번) · 열린 관 폼이 밖 값(↶ ↷ · 횡단 보기)으로 다시 엶(화면에서 찾은 흠 — ↶ 뒤 폼 옛 관경이 다른 칸 고칠 때 되쓰임).
- 검증완료 — `test_472_5_shop_owner` 4 통과(알림 수 · 옛 코드 실패) · `test_429_save_path` 5 · 영향 시험 425 · 화면(B06 동물이동형 무 → 종단 폼 무 · 종단 관경 800 고쳐도 무 유지 · ↶ 폼 1000 → 다른 칸 고쳐도 1000 · 횡단 관경 1500 → 종단 폼 · 관 표기 Φ1500 · ↶ ↷ 따라감 · 새로고침 초안 그대로) · 초안 지운 뒤 해시 같음.
- [x] 5-C 종단 편집 · 페이지 설정 — design_profile.ts 판 뼈대 나눔(691 → 659) · EditState 걷음(지금 값 = 가게 alignmentDraft ?? 새 칸 alignmentSaved · ↶ ↷ = 다시 읽기만) · 페이지 설정 = 가게 pageSettings 칸 · ↶ ↷ 훅이 가게로 알림 → 폼 · 기울기 한도 · 시작 측점 다시 얹음(N6) · 최소고 강제 사본 칸 profile-enforce-min-cover 지움 · 편집 가드가 페이지 설정 바로 읽음(N7) · [저장] 뒤 ↶ 가 저장 전 서버 값으로 돌던 흠도 같이.
- 검증완료 — test_472_5_value_owner 4(옛 코드 빨강 3) · 고친 대상 시험 1346 통과(빨강 = test_prefs_persist 옛 그대로 · 472-3 server_calc = HEAD 시험 NODE_IDS 에 cross.design 빠짐 · dev 에 고침 있음) · golden 통과 · typecheck 0 · 화면(검증_sub4 B05) ▲ · 종단 L · 최대 기울기 12 · 최소고 강제 각각 ↶ ↷ 정확 · B06 · B05 · 새로고침 같음(−17,589.6 · 872.03) · 끝에 처음 값(−17,561.8 · 초안 없음) · 팝아웃 창은 ORCA 에서 못 봄.
- 덧 화면 — 직선화(−18,330.8) · 쉬프트(−18,421.6) · 자유지정(−27,306.3) 각각 ↶ ↷ · B06 · B05 · 새로고침 같음 · 띠 · 고름 = 도구 화면 메모리(5-C 밖) · 끝 처음 값.
- [x] 5-B 횡단 상세 · 측점 — design_pipeline_page.ts 저장 기준 나눔(694 → 646 · `_saved.ts`) · 상세 가게 칸 셋(Section_Canon.ts: 저장 정본 상세 · 초안 전 hold 상세(판 바뀌면 새 판) · 노선 초안 상세 = pipelineDetail) · 페이지 canon.detail · held.detail · shown 사본 걷음(지문만) · savedStations 남김(sub2 관 · 구조물 줄로 셈).
- 검증완료 — test_472_5b_detail_owner 3(옛 코드 빨강 3) · 고친 대상 시험 578 통과(헬퍼 넷 가게 칸 채움) · golden · typecheck 0 · 화면(검증_sub4) 노선 끌기 −19,100.7 → B06 같음 → ↶ 처음 값(−17,561.8 · hold 비움) → ↷ → 초안 둔 채 새로고침 −19,100.8(옛 코드도 같음 · 기존 0.1 ㎥ 차) → 떠남 [폐기] 초안 칸 비움 → B07 열림(도면 16) · [확정]은 DB 되돌릴 도구 없어 안 누름(시험이 덮음).
- [x] 5-D B06 조정 맵 sub6 — Station_Controls 나눔(687 → 646 · 저장 묶음 접기 → Link_Session · 동작 같음) · 메모리 맵 걷음(반폭 · 흙막이 4축 · 유입 형식 · 집수정 · 단 수 · 단별 구간 · 연동 · 세월교 · BOX = 세션 칸이 주인 · 창구 `B06_Section_Session_Cells` = b_page_state 열쇠 · 브레인 B) · 캐시 설계 칸 얹기 = 고치기 전 칸 + 지금 칸(`noteAdjustBase` · `withDraftAdjusts`) · ↶ ↷ 가 조정 칸을 바꾼 걸음만 폼 · 상세 얹기 · 카드 · 면적 다시(`onRestore`) · moveSessionMaps · markMovedStates · setStationAdjustReload 걷음(측점 이동 = Station_Keys 세션 칸 바로).
- 검증완료 — test_472_5d_adjust_owner 5(옛 코드 빨강 4) · 옛 단언 고침(318 다시 읽기 창구 · 272 H4 맵 이동 · 346_2 맵 열쇠 · 445 헬퍼) · 영향 시험 96 파일 604 통과 · golden · 472-5 넷 · 472-3 그대로 · typecheck 0 · 화면(검증_sub6) 반폭 ↶ ↷ 카드 눈금 · 흙막이 ◀◀ ↶↶ 뒤 ▲ = x 0(옛 0.2 안 살아남) · −17,575.6 → −17,573.1 → −17,570.7 · B05 에서 ↶ → B06 같음 · [경사] ↶ ↷ 폼 · 카드 단추 · 세월교(종류 바꿈 초안) ▼▶ ↶↶ 뒤 ▼ = 좌우 0 · 새로고침 길(세션 칸 둔 새 탭) −17,573.1 · 떠남 [폐기] · 판 접힘/펼침 −17,570.7 · 카드 57 · 저장 안 함 · 묶음 다시 지음 필요(design-calc — Section_Adjusts).
- 남은 것 — 암선 · 암 경사 메모리 맵(`_UI_Page_Persist` rockb · cutslope)도 같은 N5 꼴 · B05 상단측 맵(5-D 파일 밖).
- [x] 472 덧 — 노선 초안(교점 끌기 · 관은 follow) ↶ ↷ 값 하나(sub4) — 앞서 「관 끌기」는 실은 관 옆 노선 교점 끌기 · ↶ 가 버림 차례 + 관 먹이기 차례로 갈리고 버림 사이 초안 · 저장 상세 · 종단이 섞여 그려짐 · 되돌린 뒤 시설 줄이 늦어 낡음 다시 셈이 옛 관 자리 계획선으로 셈 → 훅은 버림 동안 관 안 먹임 · 버림 동안 그리기 멈춤 · 되돌림 바로 뒤 저장 기준 · 버림 동안 낡음 다시 셈 미룸 · 저장 노선 셈 편집 = 그 노선 것 · 되돌림 · 갈아끼움 얹기 꼬리 한 벌.
- 검증완료 — test_472_5c_drop_once 4(옛 코드 빨강) · 고친 대상 시험 836 통과 · golden 그대로 · typecheck 0 · 화면(검증_sub4 · DOM 바뀜 관찰) 판 펼침 · 접힘 각 ↶ ↷ 여섯 걸음 = 값 하나씩(−17,561.8 ↔ −16,542.4) · 사이 틀린 값 0 · ↶ 0.2~0.5 s · ↷ 0.15~0.5 s(ORCA 배경 탭은 그리기 틀이 멈춰 「20~100 s 늦음」은 잰 쪽 착시였음).
- [x] 472 덧 — 관 지움(종단 우클릭 「배관 삭제」) ↶ = −17,598.1 ≠ 처음 −17,561.8(값으로 남음 · ↷ −17,582.7 맞음) · 옛 코드도 같음 · 실마리: ↶ 뒤 17+11(351) 측점에 관 세트(culvert)가 붙어 면적 4.28 · 3.442 · 처음(새로고침) 상세엔 351 관 세트 없음 · 면적 9.163 · 4.827 — 읽기 길(withDraftShapes)과 갈아끼움 길(reshape)이 351 관 세트를 다르게 붙임 · 어느 쪽이 정본인지 판단 필요 · 폼 옮김은 화면 폼이 안 열려(ORCA 누름) 못 돎.
- 판정 = 서버 흠 — 검증_sub4 관 파일이 옛 노선 누가거리(394)로 남음(지문 어긋남) · 측점 계획(`_load_pipe_points`) · 관 지점 GET · 화면은 좌표로 351 에 얹는데 서버 상세 읽기(`attach_saved_shapes`)만 파일 누가거리로 찾아 351 관 세트 빠짐(D1000 배관 = 관 세트 · golden 고정 자료도 351 관 세트) → 서버 읽기도 지금 노선에 얹은 관(`saved_pipes`) · 덧: 관 지움 ↶ 로 다시 선 351 측점 = 정본 설계(빈 기본 설계면 포장 권장 · 잠정 칸 빠짐) · 폼 옮김 ↶ ↷ = 열린 폼이 옮겨진 관을 따라감(옛 17+15 칸 남고 고름 풀리던 흠) · 폼 안 열린 까닭 = 알약이 화면 밖(x 1866 > 폭 1494) · 종단을 그 자리로 옮기면 ref 누름으로 열림.
- 검증완료 — test_472_d_pipe_route_attach · test_272_swap_keeps_canon 관 지움 되돌림(둘 다 옛 코드 빨강) · 관련 시험 95 + 308 통과 · golden 그대로 · typecheck 0 · [저장] 재계산 길(쓰기 없이) −17,598.07 · 351 면적 4.2799 / 3.4423 = 화면 · 화면(검증_sub4 새 탭 B05 · B06 · 유토 판 접힘/펼침 = −17,598.1 · 측점 58) 배관 삭제 −17,592.4 → ↶ → ↷ → ↶ · 폼 옮김(351 → 355 −17,547.9) ↶ ↷ ↶ · 배수유역도 관 끌기(351 → 348 −17,568.7) ↶ ↷ ↶ = 처음과 칸마다 같음 · 남은 차 = EP 누가거리 0.58 mm(첫 갈아끼움에서 묶음 측점 1080.159674 ↔ 서버 1080.159094 · 이번 고침과 무관 · 측점 셈 짝) · 저장 안 함 · 검증_sub4 기준값 = −17,598.1(옛 −17,561.8 = 관 세트 빠진 값).
- [x] 472 덧 — 관 파일 누가거리를 그대로 읽던 남은 서버 자리(sub1) — 세월교 노면 하강 · 물넘이포장 구간(`load_culvert_sets` → ford_surface_drops · ford_pavement_ranges · tilt_ranges · [저장] · [확정] · 측구 방향 다시 셈) · 카드 이름(relabel_pipe_stations) · B07 관 글 재료(load_note_sources) · 옛 비정규 측점 이관 심는 자리 → 관 읽기 한 벌 `route_pipe_points`(B05_Profile_Engine_Sections · 지금 노선에 얹음 · 노선 경로 안 줌 = 노선 파일 하나 `ROUTE_DATA_FILE`) · saved_pipes 걷음 · B06_Section_Engine_Culvert(700) → 읽기 · 얹기 `_Culvert_Sets.py` 로 나눔(동작 같음) · 영향 범위 확인 = 관 파일 읽는 서버 자리 grep 전부(B05 · B06 · B07 · Node 입력 조립 = 관 안 넘김 · DesignSave 관 옵션 = GET 열쇠 · RouteInitial = 좌표만 · B07 전개도 = M02 표와 같은 파일 열쇠).
- 검증완료 — test_472_d_route_pipe_readers 3(옛 코드 빨강 2) · test_472_d_pipe_route_attach 「노선 모름 = 파일 누가거리」 단언 = 옛 동작이라 고침 · 영향 시험 125 파일 817 통과(빨강 1 = test_472_6 상태 대조 · 따로 돌리면 6 통과) · golden · 472-3 통과 · typecheck 0 · 화면(검증_sub1) 세월교 30+0 · 물넘이포장 40+0 놓고 [저장] → 관 파일 지문 어긋냄(누가거리 +43) → 새로고침 · [저장] = 상세 57 측점 차 0 · 누가토량 −17,456.4 같음 · 교점 끌기 [저장] −17,349.2 → 새 탭 B06 같음 · 30+0 계획고 837.9(하강 0.14) · 순토량 51.5 · 다시 지문 어긋냄(−37) = 차 0 · DB 행 · storage 되돌림 차 0.
- [x] 472-6 [저장] 한 본문 · 한 트랜잭션 · 서버 전부 아니면 없음(목록 4.7 · sub8 · 세 즉시 쓰기는 답 전 그대로 · 정함(브레인) = 떠 두고 되돌림 · 프로젝트 잠금 · 6-A 노선 안 바뀐 저장 먼저 → 6-B 노선 바뀐 저장 다시 얹기 서버 Node) · 넓힘 · [측점 만들기] · 추천 [적용] 저장 시점(사용자 협의). → 6-A · 6-B 끝.
- [x] 6-A 노선 안 바뀐 [저장] · [확정] — 서버 `POST /design/save`(`B06_Section_Router_DesignSave.py` · 옛 창구 함수를 같은 차례로 안쪽 부름 · 측점 맞춤 · 재계산 · 하위 차례 실패도 실패) · `common_util_save_guard.py`(DB 행 · storage 떠 둠 → 실패면 바뀐 표 · 바뀐 파일만 되돌림 · 되돌림 실패 = 500 「복구 확인 필요」 · 프로젝트 잠금 · waited) · 브라우저 `design_save.ts` saveOneBody(차례 조각 = 본문 + 저장 뒤 정리 · 서버가 다 저장한 뒤에만 정리) · 보기 몫 steps · cross → parts · crossPart · 옛 flush 함수 = 노선 바뀐 저장 길 · 시험 갈래 환경 변수 `AISLO_DESIGN_SAVE_FAIL_AFTER`.
- 검증완료 — test_472_6_design_save 6(storage 되돌림 · 중간 실패 행 · 해시 그대로 · 정상 = 옛 차례와 행 · 파일 같음 · 복구 실패 알림 · 잠금 · 시험 갈래) · 옛 9 차례 단언 시험 10 개 한 본문 꼴로 · 관련 1075 통과 · golden 통과 · typecheck 0 · 화면(검증_sub8 B06) 암 절토 경사 0.5 [저장] → DB 0.5 · 새로고침 유지 · 시험 갈래(상단측 뒤 실패) [저장] → 「상단측 차례에서 실패 — 아무것도 저장하지 않았습니다」 · DB 행 · storage 해시 그대로 · 세션 고침 남음 · 평소 서버 [저장] 0.6 → [확정] → B07 · DB · storage 되돌림 차 0 · 묶음 다시 지음 필요(b07-extent · b07-note — Api_Structures).
- [x] 6-B 노선 바뀐 저장 — 서버가 노선 저장 뒤 관 · 구조물 · 계획고 · 횡단 초안 다시 얹기(Node) → 한 본문. `POST /design/save` 칸 `route` · `carry`(옛 노선 세션 칸) · 서버 = 노선 저장 → Node `facility.rebase`(F10) → 6-A 차례(새 노선 · 계획고 초안 새 노선 번호) → Node `stations.carry`(R9 · `B06_Section_Route_Carry_Patch.routeCarryPatches` · 넘김 규칙 `logic/B06_Section_Route_Carry`) → 횡단 저장 · 되돌림 범위 + 배수 폴더 · 지표면 확정 · 손 상단측 안 넘김(요구 274) · 노선 바뀐 [확정] = [저장] · 옛 차례 길 · 부름 0 flush 여섯 · saveCachedCrossPatches 걷음 · 등록부 690줄 나눔(`_facility`) · 저장 뒤 묶음이 초안 전 관 · 구조물을 되쓰던 흠 고침(`commitRouteFacilities` · 화면에서 찾음).
- 검증완료 — test_472_6_route_save 9(옛 브라우저 길 = 서버 Node patch · 버린 수 · 다시 얹기 같음 · 노선 차례 뒤 실패 · 넘김 실패 = 행 · 파일 그대로 · 정상 한 본문 = 옛 차례와 행 · 파일 같음(계산 시각 · 3D 파일 번호만 다름) · 옛 코드 실패) · 영향 시험 1082 + 317 통과 · golden · 472-3 통과 · typecheck 0 · 화면(검증_sub8 · 옹벽 600 · 추가 측점 510 · 0+0 · 1+0 암 경사 0.8 · 0.7 넣고 교점 끌기 → [저장]) DB 측점 61 · 옹벽 604–614 · 510 · 경사 0.8 · 0.7 · 관 351 벽 높이 · 새로고침 · B06 같음(−18,094.9) · 시험 갈래(노선 뒤 실패) 「노선 차례에서 실패 — 아무것도 저장하지 않았습니다」 행 · 파일 차 0 · 노선 바뀐 [확정] = 노선만 저장 → 다시 [확정] → B07 · DB · storage 되돌림 차 0 · 묶음 다시 지음 필요(design-calc · b07-extent · b07-note — design_selection).
- [x] 472-5 남음 — 암선 · 암 경사 맵(B06_Section_UI_Page_Persist) · B05 상단측 맵 N5 꼴 · 노선 저장 뒤 옛 노선 세션 칸 · 초안 = 저장 재확인(sub4).
- 암 경계 · 암 경사 저장소 = 세션 칸이 주인(읽을 때마다 측점 열쇠 칸 · 고칠 때 그 측점만 · 메모리 맵 · load · 갈아끼움 다시 읽기 걷음) · ↶ ↷ 가 rockb · cutslope 를 바꾸면 조정창 onRestore 로 카드 · 면적 다시 · B05 상단측 맵 = 읽는 곳 없던 사본 걷음(값 주인 = 세션 `uphill` · 상단측 차례 = 기본 조각) · 노선 바뀐 [저장] 성공 뒤 옛 노선 번호 노선 범위 초안(`clearRouteDrafts`) · `route-draft-hold` 비움(같은 번호면 노선 칸 안 지움 · 실패면 그대로).
- 검증완료 — test_472_5r_rock_owner 7(옛 코드 빨강 5) · 옛 단언 고침 4(176_3 · 271 · 443 · 344_3) · 영향 시험 134 파일 862 통과(빨강 1 = test_472_6_design_save · 검증_sub8 노선 번호 380 을 박아 둔 시험 · 「노선이 바뀌었습니다」 · 내 고침 무관) · golden · 475-3 · 472-5 넷 통과 · typecheck 0 · 화면(검증_sub4 B06) 1+0 ▼ · 2+0 ▲ · 3+0 경사 0.7 → −17,572.3 → ↶ 셋 = 걸음마다 값 · 끝 −17,598.1 칸 비움 → 4+0 ▼ = 칸에 4+0 만(옛 값 안 살아남) · ▲ 는 −0.5 에서 −0.4 · B05 에서 ↶ ↷ → B06 같음(−17,555.7) · 세션 칸 둔 새 탭 −17,554.3 · 교점 끌기 초안 −19,049.5 → [저장] 뒤 −19,049.5 · B06 · 새 탭 같음(화면 0.1 ㎥ 자리 차 0) · 세션 옛 노선 376 칸 6 · hold · 노선 0 칸 = 0(초안 칸 5,794 → 962 B) · DB 행 · storage 되돌림 SAME · ORCA 탭은 requestIdleCallback 이 안 돌아 화면 밖 카드(4+0 줄)가 ↶ 뒤 옛 글로 남음(캐시 설계 · 세션 = 맞음 · ORCA 몫).
- 검증완료(472-6) — 6-A · 6-B 노선 안 바뀐 · 바뀐 [저장] · [확정] 한 본문 POST /design/save · 떠 두고 되돌림 · 프로젝트 잠금 · 옛 9 차례 걷음 · 시험 test_472_6_design_save · route_save · 브레인 합칠 때 design_pipeline_page 충돌 풂(둘 다 살림) · 문 시험 41 통과 · 검증 대기.
- [x] 472 마무리 흠 둘(sub5) — ① design_profile 708 → 683 줄(계획고 [저장] 조각 → 새 `design_profile_save` · 높이 캐스케이드 설명 → `_Profile_Heights` 머리 · 동작 같음 · 팝아웃 시험 목록에 새 파일) ② test_472_6_design_save 노선 380 박음 → 검증_sub8 최신 노선 · 추가 측점 자리(가운데 두 측점 사이)를 그때 읽음 · 옛 차례 대 한 본문 비교에서 새 추가 측점 행 자동 번호만 뺌(브레인 승인 = 고정 자료 대신 살아 있는 프로젝트 · 노선 바뀌어도 됨) · 같은 꼴 = route_save 는 이미 최신 노선 읽음.
- 검증완료 — 새 test_472_6_profile_save 1(조각 없음 셋 · 본문 · 알림 → 넘김 · [확정] 저장 한 번) · test_230_2 · design_profile 읽는 시험 28 파일 161 통과 · test_472_6_design_save 6 통과 · 472 · 475 시험 117 통과(golden 그대로) · typecheck 0 · 화면(검증_sub5 · 5180 B05) 종단 판 측점 칸 171 · 구간 56 · 누가토량 −17,570.7 · 알약 1 = 접힘 → 펼침 · 팝아웃 창 · 결합 뒤 같음 · 검증 대기.
- [x] 475-3 노선 바뀜 암 경계 · 2단 경사 안 넘김(sub3 · 정함(브레인) = 자리 · 지형 바뀐 측점만 버림 · 그대로인 측점 유지 · 손 상단측도 같은 판정) — 자리 칸 `SEAT_KEYS`(two_stage_slope · rock_boundary_offset_m · cut_slope_ratio_user · section_mode · ditch_side · 세션 rockb · cutslope · crossdesign 같은 칸) · 판정 `sameSeat` ↔ `same_seat`(중심 0.01 m · 축 1e-3) · 끌기 세션 넘김 · Node stations.carry · 미리보기(`crossAtSeat`) · B06 갈아끼움(`unseated`) · 서버 노선 저장(`carry_cross_inputs`) 한 규칙 · 세션 값은 쓴 때 자리(`@seat`) · 지반 · 측구 종류 · 소단 · 사면 쉬프트는 그대로 넘김 · 묶음 다시 지음 필요(design-calc).
- 검증완료 — test_475_3_seat_carry 8 · 고친 대상 92 파일 557 통과(빨강 2 = test_472_6 검증_sub8 DB 교착 · 「경로 없음」 · 다른 창 동시 작업) · golden 통과 · typecheck 0 · 화면(검증_sub3) 5+0 · 30+0 암선 −0.7 · 암 절토 0.6 · 2단 경사 → 노선 안 바꾼 [저장] · 새로고침 유지 → 교점 끌기 = 5+0 유지 · 30+0 기본값 · ↶ 손 값 · ↷ 기본값 → [저장] DB 100 유지 · 600 기본값 · 초안 ↔ 저장 GET 59 측점 자리 칸 같음(성토 3 측점 ≤ 0.17 ㎡ 선 반올림 몫) · 누가토량 −15,338.0 → −15,340.5 · 새로고침 · B05 같음 · DB · storage 되돌림 차 0.
- [x] 475-1 · 4 분석(에이전트 · docs/raw/조사/2026-10-19_475_요구275_저장차_초기종단.md) — ① 브라우저 ↔ 서버 차 0.7~0.85 ㎥ = 노선 선 반올림(서버 geojson 3자리) 몫 · 121.6 ㎥ 는 넘김 두 길 갈림(추정) ④ 검증_랩탑메인 = 438 전(10-17) 초기값 · [초기화] · 노선 저장 안 바뀐 구간 · 추천 [적용] 같은 노선은 옛 꼭짓점 이어받음.
- [x] 475-1 노선 선 소수점 4자리 한 벌(sub2) — 서버 노선 geojson x · y 3 → 4자리(= 계획노선 csv) · 브라우저 초안 그린 선 · 곡선표 같은 자리(`draftLine` · 파이썬 round 짝) · 472-1 헬퍼 옮김 인자 · 페이지 배선 · 단면 모양 = 따라간 구조물(덤) · 옛 시험 둘(346_1) 저장 자리 단언으로 · 3자리에 기대는 곳 없음(관 지문 = 0.05 m 허용오차 · 측점 표시 0.01 m 칸 · B04 · B07 · 3D · 추천은 csv 또는 같은 파일 실수 읽기).
- 검증완료 — test_475_1_route_digits 5(교점 9 동 +5 m 브라우저 −15,499.51 = 서버 −15,499.51 · 옹벽 + 추가 측점 −16,281.74 = −16,281.74 · 옛 3자리 차 0.81 · 0.88 ㎥ · 그린 선 = csv 선) · golden 기준값 그대로 · 영향 시험 110 통과 · typecheck 0 · 화면(검증_sub2 교점 끌기) 초안 배지 −17,981.0 = [저장] 뒤 −17,981.0 · ↶ = −17,570.7 · B06 같음 · DB 행 · storage 되돌림 차 0 · 검증 대기.
- [x] 472 덧 — B05 보기 배관 삭제 ↶ · 배수유역도(sub4) — 원인 = ↶ 가 관 초안 없는 걸음(저장분)으로 가면 종단 사진첩이 「처음 본 관 목록」(`B05_Profile_UI_Profile_Panel_Tools.ts` initialPipes · 판이 저장분을 읽기 전 잡혀 빈 목록)을 판에 줌 → 관 하나 프로젝트는 지운 뒤 판 목록(빈 목록)과 같아 판이 「같은 목록」으로 멈춤(`B05_Profile_UI_Drainage_Panel.ts` setPipeChainages) · 가게 구독은 빈 초안(null)을 안 받음(`design_view_profile.ts` subscribe pipes) → 배수판 · 시설 줄 · 알약 · 목록 관 없음 · 묶음은 저장분 관(측점 57) · B06 보기 ↶ 도 같은 길(배수유역도 관 · 세부유역 빠짐) · 종단 ↶ 단추는 다시 그릴 때만 켜짐 맞춤(`B05_Profile_UI_Profile_Tools.ts` render). 고침 = 초안 없는 걸음 = null(저장분) → 판이 마지막 저장분 답 뒤 요청 몸통과 견줘 다르면 조용히 다시 읽음 · initialPipes 걷음 · 사진첩 쌓임 · 되돌림 알림(change)에 ↶ ↷ 켜짐 맞춤 · 위키 operations_common · _b05 · rules 줄.
- 검증완료 — test_472_d_b05_pipe_undo 4(옛 코드 빨강 2 — ↶ 가 빈 목록 줌 · 단추 맞춤 0) · 영향 시험 63 파일 418 통과(옛 단언 고침 = 215_1 `inner.undo` → `history.undo` 이름만 · 219_1 헬퍼 흉내에 onPageHistory) · golden · 472-5 그대로 · typecheck 0 · 화면(검증_sub4 · 저장 안 함) B05 보기 배관 삭제 −17,592.4 · 측점 57 · ↶ 단추 1 s 안 켜짐 → ↶ −17,598.1 · 측점 58 · 관 2 · 세부유역 2 · 제안 12 → ↷ −17,592.4 → ↶ 같음 · 관 0 되는 걸음(구조물 전체 삭제 = 옛 흠 조건) ↶ = 같음 · B06 보기 같은 차례 · 전체 삭제 ↶ 같음 · 새로고침 · 유토 판 접힘/펼침 · 저장 안 하고 떠났다 옴(초안 남음 → ↶ = 저장분) 같음 · 영향 범위 확인(setPipeChainages · restorePipes · pipes 구독 · feedFacilities 훅 · 시험 헬퍼 stub) · 어두움은 이 페이지에 단추 없음 · 검증 대기.
- [x] 472 덧 — B06 헛 초안 · 지반 종류 어긋남(sub6) — 표준 횡단 = 열 때 패널이 config 를 · 설정값 받기가 저장분을 세션 `std-cross` 에 베낌 → 안 씀 · 계산은 세션 → 저장분(`section-context`) → config · 같은 값이면 칸 지움 · 카드 단추 = 일곱 칸 통째 → 바꾼 칸만(앞서 바꾼 칸에 얹음 · [저장] patch · 노선 넘김도 빈 칸 안 실음) · 소단 사본 `berm` = 떠남 확인 밖(소단 있는 프로젝트 열기만 해도 물음) · 지반 = 정본 상세 ripping_rock · 카드 「토사」 단추 꺼짐(이름은 늘 「토사」 · 켜짐/꺼짐이 값 · 사용자 확정 그대로) · 열기만 남는 칸 = `berm`(구조물 파생 · 빈 `[]`) · `pipe-ids`(관 id 장부) — 둘 다 떠남 · 되돌리기 고침 밖.
- 검증완료 — test_472_open_no_draft 13(옛 코드 빨강 9) · 영향 시험 577 + 6 통과(옛 씨앗 단언 셋 고침 · golden · 472-5 그대로) · typecheck 0 · 화면(검증_sub6 새 탭 B06) 초안 칸 std-cross 0 · 떠날 때 확인창 없음 · 카드 1+0 「토사」 꺼짐 = ripping_rock · [측구] → 초안 `{ditch_choice:false}` 하나 · ↶ → 칸 0 · 표준 노폭 3.5 → 칸 생김 · 3 → 칸 지움 · 누가토량 −17,570.7 · 측점 57(B06 · B05 · 새로고침 같음) · 검증 대기.
## 476. 노선 추천 때 초기 종단 미리 셈 · [적용] 늘 새 규칙 (요구 276 · 분석 에이전트 → 코더)
- 사용자 확정: 추천 후보마다 초기 종단(전 측점 R · R > 500 직선화 · 438 · L 20)을 미리 셈해 둠 · [적용] = 그것을 작업본 · 초기값에 씀 · 같은 노선도 옛 꼭짓점 이어받지 않음 · 기존 프로젝트 = 추천 [적용] 다시 누르면 새 초기 종단.
- 근거 = `docs/raw/조사/2026-10-19_475_요구275_저장차_초기종단.md` ④.
- [x] 476-0 분석(에이전트 · docs/raw/조사/2026-10-19_476_요구276_추천초기종단.md).
- 사용자 확정(요구 277) — 추천 [적용] = 평면 → 종단 → 횡단이 새로 따라옴 · 그 노선 기준 초기화 · 이전 수작업(종단 편집 · 횡단 손 입력 전부) 버림 · 초기값 = 깨끗한 셈 값.
- [x] 476-1 구현 · 시험 · 화면(sub7 서버 · sub1 화면) — 측정: 후보당 끔 +0.9~1.4 s · 켬 +3.6~5.0 s · 저장본 꺼냄 0.35 s · 정함(브레인) = 뒤에서 미리 셈 그대로(기능 먼저 · 속도 따로).
- ① [적용] = 옛 계획고 · 편집 · L 안 옮김(끔 · 균형 셈 실패 = 1차 계획선 438) · 요구 277 = 횡단 손 입력도 안 넘김(`carries_cross_inputs`) ② `build_sections` · 따라감 · `seat_base_pvi` 셈 몫 뗌(동작 같음 · 횡단 이름 규칙 → `_Engine_Sections_Names`) ③ 새 `B05_Profile_Engine_InitialProfile`(후보 노드 → 화면 펴기 짝 `draft_nodes` ↔ TS flattenServerPlan → 노선 짜기 → 관(새 세류선 교차 포함) · 구조물 · 추가 측점 따라감 → 438 → 켬 = 1 m 균형 얹기) · `_Router_RouteInitial_Initial`(지문 · 저장본 `route_recommend/initial`) · 응답 `initial_profile` ④ [적용] = [저장]과 같은 프로젝트 잠금 · 떠 두고 실패면 되돌림(응답 waited) · 부름 없던 `_write_working_route` 지움(700줄).
- 검증완료 — test_476_1_apply_initial 10 · test_476_1_recommend_initial 14(미리 셈 ↔ 체인 파일 길 꼭짓점 차 0 mm · 끔 · 노선 바뀜 + 옹벽 + 추가 측점 · 켬) · 영향 시험 170 + 추천 125 + 시설 416 통과 · golden 그대로 · typecheck 0 · 영향 범위 확인(run_section_generation · resolve_extra_stations · 따라감 · _carry_profile · replan_route 부르는 곳 grep) · 화면(검증_sub7 · 5182) 끔 · 켬 [적용] 정본 = 미리 셈 계획고 차 0 · 꼭짓점 · 직선화 같음 · L 20 · R > 500 0 · 손 종단 편집 [저장] 뒤 같은 노선 [적용](모달) = 편집 빔 · 차 0 · ▲ 편집 뒤 [초기화] = 적용한 종단 · B05 표 = B06 = 새로고침(누가토량 −7,211.2) · 같은 노선 L형 측구 [저장] → [적용] = 기본 측구 · 겹친 [적용] 뒤 요청 waited · DB 행 · storage 되돌림 차 0 · 검증 대기.
- [x] 476-2 화면(sub1) — 추천 모달 종단 그림에 「적용될 초기 종단」 선(주황 점선 · 끔 = 지반선 + 초기 종단) · 범례 · 한 줄(꼭짓점 · 종단곡선 · 직선화 · 최대 종단경사(L) · 알림 N건 · 알림 글은 마우스 올림) · 실패면 이유 한 줄 · `initial_profile` 세션에 안 적음 · [적용] = 확인 창(「종단 · 횡단 손 입력이 모두 지워지고 이 노선 기준으로 새로 시작」 · 요구 277).
- 검증완료 — test_476_2 4 · 추천 영향 시험 72 통과(golden · 476-1 포함 · 빨강 1 = test_modal_top_and_add_word M02_SO_Text 「종류 더하기」 · 내 고침 밖) · typecheck 0 · 화면(검증_sub1 · 5174 · sub7 merge) 다섯 알약 선 · 한 줄 · 끔/켬 선 바뀜 · 끔 [적용] 뒤 B05 종단 = 모달 선 측점 57/57 계획고 차 0.046 mm · 켬 0.048 mm · 꼭짓점 57 = 57 · 편집 빔 · L 20 · R > 500 0 · 페이지 캐시 같음 · 옛 노선 초안 칸 없음 · 밝음 · 어두움 주황 선 · DB 행 · storage 되돌림 차 0 · 검증 대기.
## 477. 요구 272~277 장 마무리 (브레인) — (일부 · 남은 줄은 PLAN.md)
- [x] 477-1 합치기 · 묶음 여섯 · typecheck · 장 시험 · 메인 서버 다시 켬 · 브레인 화면.
- 검증완료(477) — 472(0~6) · 473 · 475-1 · 475-3 · 476 메인 합침 · 묶음 여섯 · typecheck 0 · 장 시험 83 파일 606 통과 · 브레인 화면(검증_랩탑메인 · 저장 · [적용] 없음) 새 탭 · B06 · 새로고침 −17,570.7 · 57 · B05 · B06 보기 배관 삭제 ↶ ↷ ↶ 정본 · 배수유역도 복귀 · B06 열기만 = 떠남 확인 없음 · 추천 알약 다섯 초기 종단 선 · 한 줄 · 「셈하는 중」 글 · [적용] 확인 글 · 검증 대기.
- [x] 477-3 문서 운영 — docs 폴더 정리 · 가이드 · 자동 레퍼런스(사용자와 대화 중 · 외부 도구 조사 중). → 사용자 확정 = docs 는 raw 만 · guide 는 요청 때만 · 문서 사이트 · 위키 안 씀.
## 478. 프로그램 문서 사이트 — 자동 추출 → 로직 묶음 → 페이지 (요구 278 · 시범 B05 · B06)
- 사용자 확정: 함수 · 변수는 문법대로 자동 추출 · 로직 묶음 · 페이지 문서도 추출 결과를 따라 바뀜 · 세 층을 사이트에서 위에서부터 눌러 내려가며 봄 · graphify · 짐작 위키 안 씀.
- 정함(브레인): MkDocs(Material) 사이트 · TS = ts-morph · 파이썬 = ast · 서버 주소 = FastAPI app.openapi() · 손글 = 묶음 「무엇을 하나」 한두 줄 + 페이지 규칙 · 사용자 결정만 · 추출이 바뀐 묶음 = 「설명 확인 필요」 표시.
- 폴더: `docs/mkdocs.yml` · `docs/tools/`(스크립트 · 자기 package.json · requirements) · `docs/guide/B05_B06/page.md` · `groups/*.md`(손글) · `docs/_data/`(추출 JSON · git 밖) · `docs/_build/`(원고 · 사이트 · git 밖) · 시험 `resources/tester/test_478_*`.
- 추출 꼴(`docs/_data/`): functions.json [{id: "ts:<파일>#<이름>" | "py:<파일>#<이름>", lang, file, line, name, exported, doc, params, returns, calls[], called_by[]}] · session_keys.json [{key, reads[], writes[]}] · api.json [{method, path, handler, callers[]}] · registry.json(계산 등록부 id · 실행 자리 · TS 함수 · 파이썬 짝).
- 정함(브레인 · 사용자 걱정 「직접 만든 생성기는 누락」) — 함수 화면 = 기성 도구(파이썬 mkdocstrings · TS TypeDoc) · 직접 만드는 것 = 묶음 · 페이지 · 흐름 · 세션 칸 · 서버 주소 짝만 · 누락 검사 = 기성 도구 목록 ↔ 우리 추출 목록 맞대기 · 모든 함수가 묶음 또는 「묶음 없음」에 나옴 · mkdocs build --strict.
- [x] 478-1 추출 스크립트 셋 + JSON(sub2).
- 검증완료(sub2) — 시험 6 통과 · ruff · prettier · 한 명령 14.3 s(ts 7.8 · py 1.7 · api 4.4) · 함수 5746(TS 4674 · 파이썬 1072) · 세션 칸 45 · 서버 주소 41(짝 없는 TS 글자 0 · 부르는 TS 없는 주소 1 = POST route/solve) · 등록부 45 · 세는 규칙 = docs/tools/README.md · 등록부 파이썬 짝 범위 밖 2(B04 ford_height_m · B07 route_frame) · 검증 대기.
- [x] 478-2 묶음 규칙 · 사이트 생성 · 손글 옮김 · 검사 시험(sub3 · 478-1 꼴로 동시).
- 검증완료(478-2) — test_478_docs 9 통과(가짜 3 · 진짜 6) · 함수 5,746 · 묶음 18 · 묶음 없음 0 · 세션 칸 45 · 서버 주소 41 · 손글 함수 빠짐 0 · TypeDoc ↔ ts-morph · griffe ↔ ast 차 0 · mkdocs --strict 경고 0 · 설명 없는 export 381(경고) · 원고 40 s + 사이트 50 s · 화면 3,021 쪽 · 함수 화면 = TypeDoc HTML · mkdocstrings · 검증 대기.
- 사용자 결정(10-19) — 문서 사이트 운영 안 함(사용자 · AI 둘 다 도움 적음 · 토큰만 듦) · docs/tools · mkdocs.yml · 시험 478 둘 · 문서 도구 지움 · docs = guide · raw 만.
- [취소] 478-4 개발 중 누락 막기 — 검사 빨강 조건(묶음 없음 > 0 · 설명 확인 필요 남음 · 짝 없는 세션 칸 · 서버 주소 · 범위 밖 새 페이지 폴더) · 자동 push 스크립트에 빠른 문서 검사(추출 시간 재서 가능하면) · 브레인 합침 문 시험에 넣음(빨강이면 안 합침).
- [x] 478-3 브레인 확인 — 추출 21 s · 원고 + 사이트 137 s · 함수 5,746 · 묶음 18 · 묶음 없음 0 · 설명 없는 export 381 · 페이지 화면(묶음 카드) · 묶음 화면(설명 · 흐름 · 함수 목록) 잘 섬 · 흠 = 페이지 「묶음 사이 흐름」이 호출 수 전부를 그려 읽을 수 없음 · 묶음 안 흐름도 빽빽함.
- [취소] 478-5 흐름 그림 손봄 — 페이지 = 데이터 흐름 차례(노선 → 측점 → 지반 → 종단 → 횡단 → 토량 → 저장) 왼→오 · 공용 도구 · 페이지 틀 · 가게 같은 바탕 묶음은 그림에서 뺌 · 약한 선(호출 적음) 숨김 · 묶음 안 = 입구 함수 · 주요 단계만(나머지는 목록).
## 479. B06 횡단 왼쪽 아래 정보 칸 — 처음 빈 칸 · 고른 것만 (요구 280-1 · sub3 · Opus high)
- 정함(브레인): 고른 것 없음 = 빈 칸 · 선 · 암경계 고를 때만 그 정보 · 오른쪽 「암 절토」 칸 그대로 · 벽 · 본체 · 면적 고름 = 빈 칸 · 근거 `docs/raw/조사/2026-10-19_요구280_A_B06정보칸_드롭다운.md` 1~2장.
- [x] 479-1 — `B06_Section_UI_Cross_Design_Pick.ts:632` 기본 암 갈래 → 암 고른 때만 · `_Cross_Card_Chrome.ts:177-182` 갈래 · 죽은 함수 걷음 · 확인: `test_370_3_rock_cell` · `test_318_cross_card` 고쳐 씀 + 화면(새 탭 · 새로고침 = 빈 칸 · 선 · 암 고름 = 정보 · 풂 = 빈 칸 · B05 우측 판 그대로).
- 검증완료(sub3) — 시험 9 파일 62 통과 · typecheck 0 · 화면 검증_sub3 카드 59 = 처음 · 새로고침 정보 칸 0 · 암 점선 고름 = 「암 경계 -0.5m」 1 · ▲ = -0.4 · ↺ = -0.5 · 사면 고름 「사면 이동 (우)」 · 다시 누름 = 0 · 어두움 같음 · B05 우측 판 발 줄 0 · 검증 대기.
## 480. 전역 드롭다운 — 마우스로 고르면 초점 뺌 (요구 280-6 · sub5 · Opus high)
- 정함(브레인): 마우스로 고른 때만 한 박자 뒤 blur(키보드 훑기 그대로) · 드롭다운만(숫자 칸 뺌) · B08 이정 상자 = 고르면 저장 · 닫힘 그대로 · 근거 분석 A 3~5장.
- [x] 480-1 — `ui_template_native_menu.ts` 함수 하나 + 부름 셋(`A00_Common/main.ts` · `ui_template/cad_host/cad_host.ts` · `design_profile_popout.ts`) · CAD 앱 빌드 없음 · 확인: 고치기 전 휠 · ↓ 재현 → 새 시험(마우스 고름 뒤 초점 빠짐 · 키보드 고름 초점 남음) + 화면(B05 · B06 · B07 리본 · B08 · M02 각 하나 · 고른 뒤 휠 · ↓ = 값 그대로).
- 검증완료(9a8ff3ee8) — 시험 test_280_6 4 · 이웃 원본 시험 통과 · typecheck 0 · 고치기 전 B05 간격 고른 뒤 ↓ = 10 m → 측점 No. 바뀜(초점 SELECT) · 휠은 orca 가 select 위 휠을 못 쏨(재현 못 함) · 뒤 B05 · B06 구조물군 · B07 리본 선종류(iframe) · B08 수리 재현기간 · B09 쉬는 날 · M02 별칭 장부 갈래 = 고른 뒤 초점 BODY · ↓ 값 그대로 · 키보드 고름 = 초점 SELECT 남고 값 바뀜 · 어두움 같음 · 값 되돌림.
## 481. B05~B09 왼쪽 패널 아래 [?] [<] [>] 페이지 이동 (요구 280-2 · 481-1 sub2 · 481-2 sub5 · 481-3 sub6 · Opus high)
- 정함(브레인): 줄 = [?] [<] [>] + 그 페이지 단추 · [<] [>] = 이웃 진행 단계 단추 누름(`onStepClick` 한 길 · ☰ · 단계 판도 같은 저장 후 이동) · B05 ↔ B06 = 저장 없이 화면만 · B05 [<](B04) · B06 [>](B07) = 지금 떠남 물음 그대로 · B07 · B08 · B09 = 보이는 화면 저장 성공 뒤 이동 · 실패면 머묾 · B09 [>] 흐림 · [?] 는 이미 다 있음(설명 `resources/help/B0N/00_설명서.md` = 사용자) · 근거 분석 B.
- [x] 481-1 공용 + B05 · B06 — `ui_template_help.ts` · `ui_template_workflow_layout.ts` · `design_dock.ts` · `design_shared.ts`([노선 보기] · [횡단 보기] 지움) · 확인: `test_design_view_parity` + 새 시험(차례 · 다섯 주소만 · B09 흐림) + 화면.
- 검증완료 — 시험 81 통과(`test_280_2_step_nav` 새 · `test_design_view_parity` 외) · typecheck 0 · 화면(검증_sub2): B05~B09 줄 [?] [<] [>] 32×32 · 넘침 0 · B05 ↔ B06 = 페이지 안 다시 실음(표시 남음 · 저장 요청 0) · B09 [>] 흐림 · 밝음 · 어두움 · 검증 대기.
- [x] 481-2 B08 · B09 저장 후 이동(480 뒤) — 저장 함수 다섯 성공 여부 돌려줌 · B08 = 왼쪽 옵션 + 지금 탭 · 떠난 탭 `host.isConnected` · 확인: 새 시험 + 화면(고침 → [>] → [<] = 값 남음 · 저장 실패 = 머묾).
- 검증완료(197f5b589) — 시험 test_481_2 6 · B08 · B09 이웃 원본 시험 303 통과 · typecheck 0 · 화면(검증_sub5 · ☰): B08 연암 90 → 85 + 수리 재현기간 100 → 50 → B09 = options · hydro PUT 뒤 이동 · 캐시 빔 → B08 = 85 · 50 남음 · 1본 빈칸 → 머묾 · 요청 0 · 알림 · B09 쉬는 날 → B08 = estimation PUT 1 → B09 = 값 남음 · storage 새 파일 넷 지워 처음과 같음.
- [x] 481-3 B07 저장 후 이동 — 484-2 와 한 커밋 · 자동 B08 이동(`all_confirmed`) 끔.
- 검증완료(sub6) — 고친 장만 confirm 1 + complete 1 → B08 · confirm 실패 = 머묾(● 남음) · B08 → B07 = 고친 장 60 개체 그대로 · 잠금 없음 · 단계 4 COMPLETE · 검증_sub6 되돌림.
## 482. 노선 바뀜 뒤 구조물 측점이 옛 자리에 남음 (요구 280-3 · sub4 · Opus high)
- 사용자 확정(요구 281): 사용자는 노선 고칠 때 ↶ 안 씀 → 원인 1 은 고치되 사용자 길(끌기 · R · 교점 더함 · 지움 · B06 평면 패널 · [저장] · 새로고침 · [초기화] · 추천 [적용])을 화면에서 먼저 찾음.
- 정함(브레인): 원인 1 = 노선 초안 중 ↶ · ↷ 가 계획고만 되돌리고 관 · 구조물 · 추가 측점은 안 넣음(재현 유령 7 · 빠짐 7) → 그 걸음 세션 값을 같이 넣음 · 원인 2 = 옛 비정규 측점 이관이 「기타 구조물」을 만듦 → 막이(이름 빈 측점 · 낡은 종단 건너뜀 · 저장 잠금) · 이미 생긴 것 = 목록 알림만 · 원인 3(옛 틀 · 새 틀 누가거리 견줌) 같이 · 근거 `docs/raw/조사/2026-10-19_요구280_C_노선바뀜_구조물측점.md`.
- [x] 482-1 브라우저 — `design_pipeline_page.ts:290`(691줄 · 넘으면 `Pipeline_Grade.ts`) · `B06_Section_Section_Drafts.ts` · 확인: 고치기 전 화면 재현 먼저(끌기만 · ↶ 포함 둘) → 새 `test_280_3_route_undo_facilities` + 분석 5장 기존 시험 + 화면(네 벌 측점 같음 · 유령 0 · 빠짐 0).
- 검증완료(검증 대기) — 고치기 전 화면: 끌기 · 방향키 · R · 교점 더함 · 지움 · 손 옮김 뒤 끌기 · 스냅 끔 · B06 평면 끌기 · B05↔B06 · 새로고침 · [저장] · [초기화] · 추천 [적용] = 유령 0 · ↶ 만 유령 6 · 빠짐 6 → 고친 뒤 ↶ · ↷ · 관 손 옮김 뒤 ↶ = 네 벌 같음 · [저장] 뒤 GET 같음 · 새 시험 11 통과(옛 코드 ↶ 넷 실패) · typecheck 0 · 원인 3 = 상세 틀(옛 · 새)을 넘겨 견줌.
- [x] 482-2 서버 — `B05_Profile_Structures_Migration.py` · `_Structures_Router.py` · `B06_Section_Router_Stations.py` · 확인: 새 `test_280_3_migrate_guard`(임시 storage) + `test_452_server_keys_prune_migrate` · `test_272_2_station_sync`.
- 검증완료(검증 대기) — 새 시험 6 통과(옛 코드 다섯 실패) · 452 · 272-2 · 322-0 · 449 · 407-3 · 428 · 445 · 472-6 함께 통과 · 화면: 검증_sub4 이관 응답 `legacy_etc` [] · 파일 쓰기 0 · 「기타 구조물」 = B05 경고 알림만(안 지움) · 맞춤 실패 = `StationsUnsynced` → 응답 `stations_synced` 거짓.
## 483. B05 스냅 — 20 m 일반측점 그대로 · MC 특별측점 더함 · 1 m · 0.1 m 지움 (요구 280-4 · sub1 · Opus high)
- 정함(브레인): 스냅이 일반측점을 MC 로 옮기지 않음 → 20 m 그대로 + MC 가 측점 위 아니면 「No.N+10 (MC)」(407 꼴) · 측점 No. 간격에서 못 맞춘 곡선도 같은 규칙 · 「유지」 = 그 곡선 MC 에 묶음(저장 칸 없음 · 손 안 댄 곡선은 다시 맞출 때 N+0 · N+10 그대로) · N+0 으로 옮기면 특별측점 없어짐 · 옛 간격 0.1 · 1 m = 측점 No. · 근거 `docs/raw/조사/2026-10-19_요구280_D_스냅_특별측점.md` · 지식DB 노선측량.md:143-144.
- [x] 483-1 옮김 지움 — 서버 `Core.py:397-398` ↔ TS `Sections_Stations.ts:292-299` · `SnapStep.ts:83-90` · 확인: `test_224_2` 고쳐 씀 · 새 `test_280_4_stations`(거울 다섯 경우).
- [x] 483-2 1 m · 0.1 m 지움 — 고르기 목록 · `STEPS` · `load_station_snap_step` · 상태줄 글 · 확인: `test_390_4` · `test_390_5` 고쳐 씀.
- [x] 483-3 유지 — `StationFit.ts` + `UI_RouteEdit.ts`(695줄 · 셈은 StationFit) · 확인: 새 `test_280_4_fit` · `test_366_3` · `test_383_2` · `test_408` + 화면(10 m · MC N+10 = 20 m 목록 + N+10 (MC) · 앞 교점 옮김 뒤 남음 · N+0 = 없어짐) · 검증_sub8 옮긴 측점 11 곳 = 다음 [저장] 때 바뀜.
- 검증완료(sub1) — 시험 관련 21 파일 182 통과 · typecheck 0 · 서버 Node 묶음 셋 다시 지어 바뀐 셈 0 건 · 화면(검증_sub1): 고르기 = 10 m · 측점 No. 둘 · 10 m 로 11번 밈 = 410 (MC) + 20 m 빠짐 0 · 측점 No. 로 바꿈 · 앞 9번 20 m 옮김 뒤 410 남음 · [저장] 뒤 서버 측점 58 = 화면 58 · 11번 N+0 = 곡선 측점 0 · 고정 곡선 못 맞춤 = 「측점 밖 곡선 1개」 + 423 (MC) · 20 m 그대로 · 저장본 · DB 행 되돌림.
## 484. B07 좌측 패널 ⚙ 설정 · 모달 · [현재 도면 확정] 지움 (요구 280-5 · 280-6 · sub6 · Opus high)
- 정함(브레인): 공용 `createPanelCard` 에 ⚙(캐럿 왼쪽 · 누름이 접힘 안 일으킴) · 컨테이너 없는 항목 = 단추 안 오른쪽 · 표지 없음 · 모달 = 공용 `openModal` · 평면도 ⚙ = [평면도 관리] 모달(단추 지움) · 횡단도 ⚙ = 배치 행열 ~ 안내선 숨기기 그대로 옮김 · 구조물 ⚙ = 「M02 그림 — 축척 없음」 · 근거 `docs/raw/조사/2026-10-19_요구280_E_B07설정_화면정리.md` 3 · 4.5장.
- 사용자 확정(요구 281): 확정 = 잠금 없음 — [현재 도면 확정] · [수정] 지움 · [>] · 페이지 이동 = 고친 탭(●) + 지금 탭 저장 → 단계 4 완료 → 이동 · 원본 되돌림 = ⚙ [원본에서 다시 그리기].
- [x] 484-1 ⚙ · 모달 — 새 `B07_DesignDetail_UI_Settings.ts` · `ui_template_collapsible.ts` · `_UI_Panels.ts` · `_UI_PlanKinds.ts` · `_UI_Development.ts` · 확인: 시험 + 화면(⚙ 자리 · 접힘 안 됨 · 모달 칸 = 옛 칸 값).
- 검증완료(sub6) — 카드 ⚙ 5 + 토적 단추 ⚙ 1 · 표지 0 · 제목 높이 14 px 전후 같음 · 누름 = 접힘 · 탭 그대로 · 횡단 모달 4 · 4 · 1 = 서버 값 · 평면도 ⚙ = 평면도 관리 · 밝음 · 어두움.
- [x] 484-2 확정 단추 지움 + 481-3 + 탭 줄 겹판 페이지 쪽(486 과 `--cad-tab-slot-left/right` 약속) — `_UI_Page.ts`(633줄 → 저장 · 확정 묶음 새 파일) · 서버 단계 4 완료 길 · 확인: 시험 + 화면.
- 검증완료(sub6) — `test_280_5_b07_settings` 9 + 기존 9 파일 57 통과 · typecheck 0 · 「현재 도면 확정」 글 0 · [원본에서 다시 그리기] 60 → 204 개체 · 저장본 풀림 · 탭 줄 겹판 흉내(left 300 · right 120) = 높이 26 · 위 0 · 값 지우면 제자리.
## 485. B07 도면 X · Y 축척 (요구 280-5 · sub8 · Opus high)
- 정함(브레인): 종단 · 횡단 · 토적 · 전개도 X · Y 분모 숫자 칸(정수 · 범위 검사 · 기본 = 지금 `config_system` 상수 · 토적 · 전개도 「자동」 남김) · 횡단 X ≠ Y 허용(기본 1/100 · 1/100) · 표준 횡단 뺌 · 프로젝트마다 `drawing_scales.json` · 바꾸면 그 종류 저장본 n 장 묻고 다시 그림 · 근거 분석 E 3.4 · 지식DB `설계제원_총괄.md` 8장.
- [x] 485-1 서버 — 새 `B07_DesignDetail_Router_Support_Scale.py`(GET/PUT) · `Engine_Template.py` `drawing_scale(kind)` · 엔진 상수 → 함수 · 횡단 덧그림 `mm_per_m` 둘로(TS · Node 묶음 둘 다시 지음) · 확인: 분석 E 3.4-3 시험 여섯 + 새 시험.
- 검증완료 — 시험 83 통과(여섯 + B09 인쇄 · 전개도 · 새 `test_280_5_b07_drawing_scales` 10) · typecheck 0 · 검증_sub8 API(종단 X 1/500 = 장 2→3 · 첫 점 x 1.0→2.0 mm · 도각 「500(H) · 200(V)」 · 횡단 mm/m 10·20 · 도각 「100(H) · 50(V)」 · 범위 밖 400 · 파일 지움 뒤 원래 값) · 검증 대기.
- [x] 485-2 ⚙ 모달 축척 칸(484-1 합친 뒤) — `_UI_Settings.ts` · `_Api_Fetch.ts` · 확인: 화면(종단 X 1/500 → 장 수 바뀜 · 되돌림).
- 검증완료 — 새 `_UI_Settings_Scale.ts` · `logic/_Scale_Check.ts` · `test_280_5_b07_settings` 12 통과 · typecheck 0 · 검증_sub8 화면(종단 X 1/500 = 장 2→3 · 도각 「500(H) · 200(V)」 · 횡단 X 100 · Y 50 = 「100(H) · 50(V)」 · 1/50 · 500.5 = 칸 붉음 + 저장 꺼짐 · 전개도 「자동」 둘 · 풀면 빈 칸 붉음 · 저장본 1장 물음 [취소] = 그대로 · 새로고침 뒤 200 · 50 남음 · 밝음 · 어두움 · [기본값] 저장 = 장 3→2 · 파일 지움) · 검증 대기.
## 486. B07 CAD 화면 정리 — 머리 줄 · 겹친 단추 지움 (요구 280-6 · sub7 · Opus high)
- 정함(브레인): 제목줄(「Aislo CAD / B07 상세 설계」) · 램프 · 「현재 도면」 글 지움 · 저장 · JSON 내보내기 = 숨김(DOM 둠) · ↶ ↷ = 홈 탭 줄 오른쪽(줄 높이 26 px 그대로) · 페이지 탭 줄 = 출력 탭과 같은 줄(부모 탭 줄을 iframe 위에 겹침) · 우측 손가락 단추 = 자판 없는 기기만(`(hover:none) and (pointer:coarse)`) · 하단 도면 이름 · ‹ › · 확정 칸 지움 · 근거 분석 E 4장.
- [x] 486-1 — `QuickAccessBar.tsx` · `Toolbar.tsx` · `Ribbon.tsx` · `ribbon.config.ts`(QUICK_ACCESS 몫) · `App.tsx` · `QuantityPanel.tsx`(지움) · `input-touch.*` · `host-burger.*` · `App.css`(제목줄 · `.cad-tool` 몫) · 확인: `test_cad_touch` · `test_cad_host_tabs` 고쳐 씀 · `npm run build` · 화면(CAD 높이 ≈ +74 px · 홈 탭 줄 높이 전후 같음 · M02 · 미리보기 CAD 그대로).
- 검증완료 — 캔버스 높이 846 → 888 px(CAD 몫 +42 · 부모 탭 줄 겹침 +32 = sub6) · 리본 탭 줄 26 = 26 · ↶ ↷ 24×20 탭 줄 안 · 💾 ⭳ 숨김 · 손가락 단추 none(터치 노트북 any-pointer coarse) · 하단 칸 0 · 자리 변수 255 · 91 px · M02 구조물 CAD · 평면도 미리보기 그대로 · `test_cad_touch` · `test_cad_host_tabs` · `test_m02_drawing_card` 통과.
## 487. CAD 글자 테두리 = 입력 칸 · 리본 아이콘 하나만 켜짐 (요구 280-6 · sub7 486 뒤 · Opus high)
- 정함(브레인): 스침 테두리 = 더블클릭 입력 칸과 같은 셈(새 `helpers/text-frame.ts` 한 벌) · 잡는 범위 = 테두리 안 · 여러 줄 = 묶음 전체 · 도각 칸 글 = 칸 크기 · 스침 모양 = 바탕색만(켜짐과 다르게) · 초점 테두리 남음은 화면 재현 뒤 · `getBoundingBox` 안 고침 · 근거 `docs/raw/조사/2026-10-19_요구280_F_CAD동작_DWG.md` 1~2장.
- [x] 487-1 — `TextEntity.ts` · `text-inplace-edit.ts` · `screenCanvas.drawController.ts`(691줄) · `input-controller.ts` · `Ribbon.tsx` · `QuickAccessBar.tsx` · 확인: 새 `text-frame.test.ts` · `text-inplace-edit.test.ts` + 화면(왼 · 가운데 · 오른 · 돈 글 네 귀 차 ≤ 1 px · 켜짐 1개).
- 검증완료 — 스침 테두리 네 귀 대 입력 칸 차: 가운데 0.018 · 왼(돈 글) 0.023 · 오른 0.017 px · 끝 글자 스침 = 그 글 · 「선」 → Esc 뒤 켜짐 1개(선택) · 스친 단추 테두리 없음(바탕만) · 초점 테두리 0(블러 전 재현: 클릭 + Esc = 1) · 밝음 · 어두움 · 스침 1.75 ms/번(813 개체) · `text-frame.test.ts` 12 · `text-inplace-edit.test.ts` 7 · typecheck 0.
## 488. CAD 이름 · 선 속성 · 안내 글 · DWG 불러오기 (요구 280-6 · sub3 479 뒤 · Opus high)
- 정함(브레인): 「선가중치」→「선 두께」 · 「도면층」→「레이어」(CAD 안 글 · 툴팁 · 명령 목록 · 토씨 손봄 · 저장 열쇠 그대로) · 색 · 두께 · 선종류 = 고른 것의 값(다르면 빈 칸 · 색 = 점선 빈 견본) · 고른 것 있으면 고른 것만 바꿈 · 없으면 그리기 기본값 · 특성 판 같은 규칙 · 되돌리기 한 번(같은 흠 명령 8개 같이) · 폴리선 자식까지 · 안내 글 = 한 줄 「DWG · DXF 파일을 끌어다 놓거나 [삽입 → DWG 불러오기]」 · [DWG 불러오기] = M02 와 같은 서버 변환 · 원좌표 · 골라진 채 · 화면 맞춤 · ByLayer = 레이어 색(M02 불러오기도 같이) · 근거 분석 F 3~6장.
- [x] 488-1 이름 · 안내 글 — 확인: `command-catalog.test.ts` + 「도면층 · 선가중치 없음」 한 줄 + 화면 innerText 0.
- [x] 488-2 선 속성 = 고른 것 — 새 `helpers/selection-style.ts` · `RibbonWidgets.tsx` · `PropertiesEditor.tsx` · 확인: 새 `selection-style.test.ts` + 화면(다른 선 둘 = 빈 칸 · 고름 = 둘 다 · Ctrl+Z 한 번).
- [x] 488-3 DWG 불러오기 — `commands.insert.ts` · `ribbon.config.ts`(삽입 탭 몫) · `dxf-clip-paste.ts` · `Engine_Frame_Import.py` · 확인: `dxf-clip.test.ts` · `test_b07_dxf_clip.py` + 화면(DWG 붙음 · Ctrl+Z 한 번) · 겹침 486 · 487 = `App.css` · `ribbon.config.ts` · `DropHint.tsx` · `Ribbon.tsx` 몫 나눔.
- 검증완료(sub3) — 시험 command-catalog 5 · selection-style 6(옛 제자리 고침이면 Ctrl+Z 빨강) · dxf-clip · test_b07_dxf_clip 7 · 이웃 frame_import 15 통과 · check-types 0 · 화면 B07 검증_sub3 innerText 도면층 · 선가중치 0(홈 · 삽입 · 주석 · 뷰 · 출력 · 레이어 관리자 · 왼쪽 특성 판 · ▾) · 다른 선 둘 = 두께 · 선종류 빈 칸 · 색 점선 빈 견본(밝음 · 어두움) · 두께 3 = 둘 다 · 그리기 기본값 1 그대로 · Ctrl+Z 한 번 = 옛 값 · 색 끌기 셋 → Ctrl+Z 한 번 = 옛 색 · 안내 글 높이 20 px · 넘침 0 · DWG(REpyo) 도형 21 붙음 · 골라진 21 · 새 레이어 0 · 화면 안 · Ctrl+Z 한 번 = 101 → 101 · M02 [파일 업로드] ByLayer = #ff7f7f(옛 #f5f7fa) · 저장 안 함(새로고침 = 185 그대로) · 검증 대기.
## 490. B05 종단 그래프 — 누르면 임시 횡단이 열리는 자리에 마우스 표시 (요구 282 · sub2 481-1 뒤 · Opus high)
- 정함(브레인): 표시 자리 = 누름이 임시 횡단을 여는 자리와 같은 판정(`B05_Profile_UI_Profile_Render.ts:329-346` · `groundPickAt` 허용 거리 · 추가 측점 선) · 근처면 그 선 위 작은 원 + 세로 점선 + 측점 글(예 「No.12+5 · 눌러 임시 횡단」) · 손가락 커서 · 멀어지면 사라짐 · 측점선 · 단추 위에선 안 보임(그 몫) · 밝음 · 어두움 색 · 끌기 · 스크롤 중엔 안 그림.
- [x] 490-1 — `B05_Profile_UI_Profile_Render.ts`(524줄) · 판정 셈은 `logic/` 한 함수로 누름과 같이 씀 · 확인: 새 시험(판정 함수 = 누름 판정 같은 값 · 허용 밖 null) + 화면(검증_sub2 · 원지반선 근처 = 원 · 측점 글 · 누름 = 같은 측점 임시 횡단 · 멀리 = 없음 · 추가 측점 선 · 팝아웃 종단 · 밝음 · 어두움).
- 검증완료 — 시험 4 통과(판정 = 옛 누름 9 경우 같은 값 · 허용 밖 null) · typecheck 0 · 화면(검증_sub2 · 실제 마우스) 원지반선 ±7 px = 원 · 측점 글 · 손가락 / ±9 px = 없음 · 표시 측점 = 누름 임시 횡단 측점 4 곳 같음(6+8 · 6+10 · 6+17 · 9+14) · 추가 측점 선 6+17 표시 · 누름 같음 · ▲ 단추 · 끌기 · 스크롤 · [직선화] 중 = 없음 · 팝아웃 종단 7+1 표시 = 누름 · 밝음 · 어두움 색 바뀜 · 검증 대기
## 491. 다음 장 후보 (요구 280 장에서 창이 찾은 것 · 장 끝에 한 번에)
- [x] 491-1 B05 · B06 — B06 [>] 고침 있을 때 떠남 물음 화면 미확인(481-1) · 🏠 · 뒤로 가기는 저장 안 함(481-2 · 분석 그대로) · 서버 종단 이름 「STA.0+410.000 (MC)」 ↔ 화면 「20+10 (MC)」 꼴 다름(483) · 옛 세션 초안 간격 0.1 · 1 m 브라우저만 소수 MC(483) · [저장] 이 route_recommend 캐시 10 개 새로 씀(483) · 고른(빨강) 추가 측점 선은 --plus 클래스 빠져 누름 · 표시 안 먹음(490). → 505~507 로 옮김(요구 309 조사 · 끝난 조각 걷음)
- [x] 491-2 B07 · CAD — `UI_Page.ts` navigateDrawing · `cad_host` onNavigate 죽은 길 · `state.ts` cad-host-save 클래스 남음 · 리본 탭 단추 클릭 + Esc 초점 테두리(487) · 그립 · cloneKeepingLook vitest 빨강(전부터 · flatten) · M02 카드 미리보기엔 [삽입 → DWG 불러오기] 안 닿음 · 특성 판 색 끌기 되돌리기 칸 연발 · LAYMRG 제자리 고침 · 확정 도면 DWG 막힘 화면 미확인(488) · 페이지 navigateDrawing 걷음(484). → 505~507 로 옮김(요구 309 조사 · 끝난 조각 걷음)
- [x] 491-3 서버 · 기타 — 축척 주소 `/api/projects/{id}/drawing-scales`(cross-layout 꼴) · 커밋 제목 앞 BOM 한 글자(Out-File) · `main.py` 805줄(700 넘음) · orca 가 select 위 휠을 못 쏴 휠 재현 못 잼(480) · 검증_sub8 B05 노선을 누가 다시 확정(13:48 UTC · sub8 아님) · 개발 잠금풀기 중 축척 저장 = 우회 표식 지워져 잠김(개발 전용) · 축척 칸 붉은 글이 X 칸만 밀어 Y 칸과 높이 어긋남(485-2) · 검증_sub7 storage 없어 356-4 · 349-0 시험 늘 건너뜀 · 옛 시험 헬퍼 가짜 모듈 낡음(482) · dxf-clip.test.ts 픽스처 상대 경로라 openwebcad 에서 돌면 빨강(전부터). → 505~507 로 옮김(요구 309 조사 · 끝난 조각 걷음)
- [x] 491-5 횡단 구조물 형상(494) — 노출형 횡단수로 = 횡단 그림 부품 없음(측점도 안 섬 · 모양은 사용자 협의로 정해야 만듦) · B05 종단 원지반 누름 임시 횡단 = 간이 그림이라 구조물 구간이어도 형상 안 얹음 · B05 「횡단」 판은 카드 머리를 걷어 「⚠ 배관 관경 빈칸」 칩이 안 보임(`B05_Profile_UI_RouteEdit_Cross_Card.ts:150`) · B05 에서 고른 측점으로 B06 넘어가면 고름은 이어지나 카드 목록이 0+0 에 머묾(스크롤 안 됨). → 505~507 로 옮김(요구 309 조사 · 끝난 조각 걷음)
- [x] 491-4 노선(492 · 493) — 노선 [저장] 직후 페이지 통째 새로 고침(전부터) · test_472_6_route_save 묶어 돌리면 가끔 실패 · 추천 [적용] 첫 HTTP keep-alive 끊김(미리 셈 동기 계산이 루프 막는지) · 분석 지형 = 수치지형도인데 sheet 지표면 모델 없으면 손 고침 [저장] 실패(switch_design_terrain · 검증_sub1) · test_b06_draft_pipe_replay 482-1 뒤 옛 문구(전부터 빨강). → 505~507 로 옮김(요구 309 조사 · 끝난 조각 걷음)
## 489. 요구 280 마무리 (브레인)
- [x] 489-1 합치기 · CAD 빌드 · 서버 묶음 · typecheck · 장 시험 · 메인 서버 다시 켬 · 다음 장 후보.
- 검증완료(489) — 479 · 480 · 481-1~3 · 482 · 483 · 484 · 485-1~2 · 486 · 487 · 488 · 490 메인 합침 · 장 시험 68 파일 401 통과 · 49 건너뜀 · CAD vitest 30 통과 · typecheck 0 · CAD 빌드 · 묶음 둘(b07-extent · print_drawings) · 메인 서버 다시 켬 · 482 사용자 길 = ↶ 말고 재현 0(후보 = 옛 이관 「기타 구조물」 · [초기화] 되살림 · 초안 둔 채 새로고침 — 막이 · 알림 들어감) · 검증 대기.
## 492. 노선 모양 바뀐 [저장] = 초기화 + 초기값 다시 세움 (요구 283 · 284 · 285 · 492-1 sub4 · 492-2 sub1 · Opus high) — (일부 · 남은 줄은 PLAN.md)
- [x] 492-1 서버(sub4) — `_save_route` 초기화 갈래(추천 [적용] 길과 한 벌) · `/design/save` 초기화면 브라우저 시설 · 넘김 칸 무시 · 초기값 사본 되돌림 범위 · 공유 storage 시험 셋 임시 사본 · 확인: 새 `test_283_route_change_reset`(옛 코드 ① ② ④ ⑤ 실패) + 따라감 기대 시험 아홉 고쳐 씀.
- 검증완료(492-1 · 7a857d626) — 판정 = 저장 · 새 계획 폴리라인 1 mm(`route_shape_changed` · TS 짝 `routeShapeChanged` = 492-2) · test_283 9 통과(옛 코드 8 실패 · 검증_sub8 자료 관 [388, 394] → [388]) · 관련 시험 117 + 실DB 472-6 둘 16 통과(storage 임시 사본) · typecheck 0 · 검증_sub4 API(storage 사본 · DB 되돌림): 스냅만 = reset false · 시설 그대로 / 교점 20 m = reset true · dropped 구조물 1 · 관 2 · 추가 측점 1 · 관 = 교차 하나(옆 0.00 m · 옵션 없음) · 종단 편집 0 · 보낸 추가 측점 무시 · 초기값 관 = 작업본 · 검증 대기.
- [x] 492-2 브라우저(sub1) — 판정 함수(logic/) · 초안 띠 · [저장] 확인 창(버릴 수) · [취소] = 요청 0 · 저장 뒤 알림(dropped) · 확인: 새 `test_283_route_reset_confirm` + 화면(분석 7장 목록).
- 검증완료(492-2 · d2bf68b59 · 6dfadcbd4) — test_283_route_reset_confirm 28 통과(거울 = 파이썬 `route_shape_changed` 같은 값) · 저장 헬퍼 시험 셋 · 관련 시험 111 통과 · typecheck 0 · 화면(검증_sub1): 교점 22.4 m 끌기 = 띠 · [저장] 창 「구조물 1 · 관 1 · 추가 측점 1 · 종단 편집 1」 · [취소] = 요청 0 · 저장 뒤 관 = 교차 하나(351 · 옆 0.000 m · 옵션 없음) · 구조물 · 추가 측점 0 · 종단 편집 0 · 측점 = 격자 54 + 곡선 17 + 교차 관 1 · R 바꿈 · 교점 더함 · 지움 · B06 평면 패널 끌기 = 띠 · 창 · 알림 「지움: 구조물 0 · 관 1 · 추가 측점 0 · 새 교차 관 1」 · 추천 [적용] 같은 글 · 수 · [초기화] = 같은 자료 · 스냅 끔 · 지형만 = 창 없음 · 밝음 · 어두움 · storage · DB 행 백업으로 되돌림 · 검증 대기.
## 493. B05 [저장] = 보이는 화면 그대로 · 초기화 기준 = 노선 추천 [적용] (요구 288 · 289 · 290 · 492 손 고침 초기화 걷음 · 493-1 sub4 · 493-2 sub1 · 493-3 sub2 · Opus high)
- 사용자 확정(요구 289 · 290): B05 손 고침 [저장] = 보이는 화면 그대로(지움 없음) · 노선 고침 때 구조물 = 평면 자리 근접 · 일반 · 곡선 측점 = 거리 지킴 · 추천 [적용] = 초기화 기준(그 노선 초기값으로 새로 시작 · 사용자 구조물 지움) · [초기화] = [적용] 기준으로 되돌림.
- 정함(브레인): 자동 관도 구조물 규칙(평면 자리 근접) · 새 세류선 교차는 492 이전처럼 더함 · 길에서 멀어진 시설 = 화면 그대로(사용자 점검 · 경고 안 둠) · 손 고침 [저장]엔 띠 · 확인 창 · 초기화 알림 없음 · 추천 [적용] 확인 창(지워질 수)은 둠 · 492 판정 함수는 안 쓰게 되면 걷음.
- [x] 493-1 서버(sub4) — 손 고침 [저장](`_save_route` · `/design/save`) 초기화 갈래 걷고 492 이전 따라감 되살림 · 추천 [적용] 초기화 그대로 · [적용] 첫 시도 500(초기값 사본 뜨기 FileNotFoundError) 고침 · 확인: test_283_route_change_reset 고쳐 씀(손 고침 = 시설 따라감 · [적용] = 초기화) + 검증_sub4 API.
- 검증완료(493-1) — 손 고침 판정(`route_shape_changed`) · 한 본문 초기화 갈래 걷음 · `route_reset` = 추천 [적용] 응답만 · 500 원인 = [적용] 떠 두기 중 뒤 추천 미리 셈이 `_derived` 파일 지움 → 떠 두기가 사라진 파일 건너뜀 · test_283 10 · 관련 시험 382 + 실DB 472-6 둘 16 통과(storage 임시 사본) · typecheck 0 · 검증_sub4 API(떠 둠 · 되돌림): 교점 20 m · 교점 지움 [저장] = 구조물 1 · 관 2(id 그대로) · 추가 측점 1 · 초기값 그대로 · route_reset 없음 / [적용] 세 번 = 200 · 첫 번 지움 구조물 1 · 관 2 · 추가 측점 1 · 관 = 교차 하나 · 500 없음 · B05 화면 목록 배관 2 · 옹벽 그대로 · 검증 대기.
- [x] 493-2 브라우저(sub1) — 손 고침 띠 · [저장] 확인 창 · 저장 뒤 초기화 알림 걷음 · 추천 [적용] 확인 창 수 = 서버 지울 수(창 구조물 1 ↔ 알림 0 어긋남) · 확인: test_283_route_reset_confirm 고쳐 씀 + 화면(검증_sub1).
- 검증완료(493-2) — 띠 · [저장] 확인 창 · 저장 뒤 초기화 알림 · 초안 통째 비움 걷음 · [적용] 창 수 = 서버 저장분(구조물 · 관 저장 파일 · 추가 측점) · test_283_route_reset_confirm 7 · 관련 시험 371 통과(1 실패 = test_b06_draft_pipe_replay · 482-1 뒤 옛 문구 · 안 고친 파일) · typecheck 0 · 검증_sub1 ORCA(떠 둠 · 되돌림): 교점 끌기 → 띠 0 · 창 0 → [저장] = 구조물 1(620 m) · 관 1(351 m) · 추가 측점 1(450 m) 수 · 좌표 = 끌기 때 화면 그대로 · 노선 최대 1.58 m 바뀜 / [적용] 창 「구조물 1 · 관 1 · 추가 측점 1」 = 적용 뒤 알림 「지움: 구조물 1 · 관 1 · 추가 측점 1」 · [취소] = 저장 요청 0 · B06 평면 패널 띠 0 · 밝음 · 어두움 · 검증 대기.
- [x] 493-3 화면 ↔ 저장 자리(sub2) — 교점 끌기 중 화면 시설 · 측점 자리 = [저장] 뒤 서버 자리(굽은 곳 관 2~7 m 어긋남) · 브라우저 · 서버 따라감 짝 거울 시험 · 확인: 거울 시험 + 검증_sub2 교점 끌기 → [저장] 전후 관 · 구조물 · 측점 좌표 차 0.01 m 안.
- 검증완료 — 원인 = 추가 측점이 끌기 걸음마다 정수 m 자리에서 다시 따라감(서버 = 정본 좌표 한 번 · 2~4 m) · 관 · 구조물 재현 0 → 추가 측점도 좌표 들고 감(`followPlusGround` · GET `stations`) · test_493_3_follow_screen_save 7(고치기 전 대조 빨강) · 관련 42 파일 313 통과 · typecheck 0 · 검증_sub2 앞 · 곡선 교점 끌기 → [저장] → 새로고침 = 측점 61곳 좌표 차 0 m(관 1 · 구조물 3 · 추가 측점 4 · 초기화 없음) · 저장 안 하고 B06 다녀옴 · 새로고침 = 초안 그대로 · storage · DB 되돌림 차 0 · 2b7b12956(검증 대기).
- 정함(브레인 · 합친 판 확인 뒤): 관 = 모두 구조물처럼 땅 위 자리 고수 + 근접(요구 290) · 자동 세류선 관을 새 교차점에 다시 붙임 = 안 함(다음 장 후보 · 브라우저 세류선 + 짝 교차 셈 필요).
- [x] 493-4 관 저장 자리(sub2) — 합친 판 검증_sub1 손 고침 [저장] 뒤 관만 1.27 m 움직임(화면 208597.117 · 367731.865 ↔ 저장 208597.886 · 367732.872 · 구조물 · 추가 측점 0 m) · 원인 먼저 · 화면 = 저장 · 확인: 거울 시험 관 x · y + 검증_sub2 두 번 이어 고쳐도 0.01 m 안.
- 검증완료(493-4) — 원인 = 관 PUT 이 세부유역 계산을 거치며 속성만 되붙여 x · y 를 버림(`carry_facility_attributes`) → 저장이 노선 위 측점 자리로 채움 + GET 관 x · y = 노선 위 자리라 [저장] 다시 얹기가 베낌(검증_sub2 재현 0.62 m) · 되붙임에 x · y · 저장 = 좌표가 그 누가거리를 낳으면 땅 위 자리 그대로(누가거리만 옮긴 낡은 좌표 = 노선 위 · 구조물 규칙) · GET x · y = 정본 · 세류선 교차 다시 붙임은 안 함(브레인) · test_493_3_follow_screen_save 16(관 x · y 거울 · 두 번 저장 · 고치기 전 대조) · 관련 23 파일 158 통과 · typecheck 0 · 합친 판(4aeaa9442 포함) 검증_sub2 ORCA(떠 둠 · 되돌림 차 0): 세류선 관 · 사용자 관 · 구조물 · 추가 측점 → 교점 끌기 [저장] → 새로고침 = 화면 그대로(관 374 · 620 · 구조물 720 · 추가 측점 470 · x · y 차 0 m) · 한 번 더 고쳐 [저장] = 관 x · y 그대로(626 · 723 · 482) · 추천 [적용] 창 「구조물 1 · 관 2 · 추가 측점 1」 = 알림 같음 · 새로고침 없이 화면 = 서버(관 351 하나) · ORCA 는 [저장] 끝난 탭과 응답 끊김(화면 CPU 놂 · 새 탭은 정상) · 검증 대기.
- [x] 493-5 [적용] 뒤 화면 초안(sub1) — [적용] 직후 지운 추가 측점이 화면 목록 · 초안에 남고 그대로 [저장]하면 되살아남(실제 봄) · [적용] 뒤 세션 초안 = 새 초기값 · 확인: 시험 + 검증_sub1 추가 측점 둘 · 구조물 하나 → [적용] → 새로고침 없이 [저장] → 서버 0 그대로.
- 검증완료 — 원인 = 493-2 는 [적용] 길 초안 비움(`clearDrafts`)을 안 걷음 · 추가 측점 저장분 기억(모듈 캐시 · 따라감 기억)이 페이지 다시 세움에도 남아 옛 [127 · 163] 을 읽음 → [적용] 뒤 저장분 다시 받음(`reloadSavedPlusStations`) · test_283_route_reset_confirm 9(고치기 전 대조 = 옛 저장분 남음) · 관련 29 파일 211 통과 · typecheck 0 · 검증_sub1 ORCA(떠 둠 · 되돌림 차 0): 옹벽 1 · 추가 측점 127 · 163 [저장] → [적용] 창 「구조물 1 · 관 1 · 추가 측점 2」 → 새로고침 없이 화면 추가 측점 0 · 초안 없음 · 옹벽 카드 없음 → [저장] → 서버 추가 측점 0 · 구조물 0 → B06(120 · 140 · 160 m · 127 · 163 카드 없음) → B05 같음 · 검증 대기.
## 494. B05 · B06 구조물 측점 횡단도에 구조물 형상 안 보임 (요구 292 · 494-1 sub1 · Opus high)
- 사용자 확정(요구 292): B05 · B06 에서 구조물 측점을 고르면 나오는 횡단도에 구조물 형상이 보여야 함 — 지금 안 보임.
- 정함(브레인): 원인 먼저(언제부터 · 어느 커밋 · 자료 없음인지 그리기 끊김인지) · 횡단도 구조물 형상 연결 = B05 · B06 자체 기능(M02 구조물 조합과 별개 · 사용자 정정).
- 사용자 확정(요구 295): 이미 빈 채 저장된 관 = 코드로 안 채움 · 그 프로젝트는 노선 추천 [적용](다른 항목)으로 새로 시작해 기본값을 받음.
- [x] 494-1 원인 · 고침(sub1) — B05 임시 횡단 · B06 횡단 둘 다 · 확인: 시험(형상이 그려지는 길) + 검증_sub1 관 · 옹벽 · 횡단수로 측점 고름 → 횡단도 형상 보임(사진) · 밝음 · 어두움.
- 검증완료(sub1) — 원인: B06 화면 밖 카드 다시 그리기가 쉬는 틈(시간 제한 없음)만 기다려 새 구조물 측점 카드가 빈 설계로 남음 · B05 「횡단」 판이 들어올 때 이미 고른 구조물을 안 그림 · 고침: 쉬는 틈 한도 200 ms · 판 만들 때 지금 고름 따라감 · 시험 test_494_1(고치기 전 빨강) · typecheck 0 · ORCA 검증_sub1 옹벽 7+5 · 7+10 · 7+15 설계선 + 옹벽 · 관 17+11 · 맹암거 12+10 밝음 · 어두움 · 되돌림(구조물 0 · rev 0) · 남음: 노출형 횡단수로 = 그림 부품 없음 · B05 원지반 누름 임시 횡단 = 구조물 형상 안 얹음
- [x] 494-2 새 교차 관 기본값(sub4) — 검증_브레인232 확인(요구 294): 노선 바뀜 길(손 고침 [저장] · 추천 [적용] · 추천 초기 종단)이 새 세류선 교차 관을 옵션 없이 만듦(`B05_Profile_Route_Save_Parts.py:92`) → 관경 빈칸 → 횡단도 관 형상 없음 · 기본값 채우기(`_apply_new_defaults`)는 B04 유역 길에만 · 확인: 시험(새 교차 관 = B04 기본과 같음) + 검증_sub4 B06 관 형상 사진 · 이미 저장된 빈 관은 안 바꿈.
- 검증완료(sub4) — 고침: 세 길이 지나는 `followed_pipes` 에서 새로 더한 관(짝 -1)만 B04 `_apply_new_defaults` · 시험 test_494_2(손 고침 · 추천 [적용] 체인 · 초기 종단 · 옛 코드 빨강 3) · test_283 새 교차 관 기대 = 기본값 · 관련 64 통과 · typecheck 0 · ORCA 검증_sub4 추천 [적용] → p38800 관경 1000 · 집수정 L · 초기값도 · B05 「횡단」 · B06 19+8 관 형상(tmp/494_2_b05_cross.jpg · tmp/494_2_b06_cross.jpg) · 상세 자료 culvert Φ1.0 · 빈칸 경고 0/59 · 되돌림(storage · DB 7 표 · p38800 빈 옵션 그대로)
## 495. CAD 고침 — 손가락 단추 지움 · 리본 초점 · 축척 칸 · 탭 구분선 · M02 DWG (요구 298-1 · 495-1 sub3 · 495-2 sub1 · Opus high)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-20_요구298_A_CAD.md` · 데스크탑 CAD 빌드 = 10-20 끝(전역 싱크가 빼먹음) · B05 평면 상단 고르기 = 네이티브 select · 480 훅 닿음(같은 값 다시 고름 초점 틈만 화면 확인) · 표지 = 원본 개념 없음 → 491-2 그 조각 지움 · M02 [수정] 상세 = 같은 openwebcad(리본 [삽입] 안 [DWG 불러오기]).
- 사용자 확정(요구 300): A1 = M02 [파일 업로드] 지움 · CAD [DWG 불러오기] 한 길.
- [x] 495-1 CAD · B07 — 손가락 단추 지움(`input-touch.ts` · `input-touch.css` · `test_cad_touch` 고쳐 씀) · 리본 `<nav>`(`Ribbon.tsx:208`) 마우스 누름 blur 한 곳(키보드 초점 남김 · 487 단추별 blur 셋 걷음) · 축척 칸 = 칸 밑 오류 글 숨김 + 줄 아래 알림 한 줄(`_UI_Settings_Scale.ts:119-156` · `_UI_Style.css:508-529`) · 메뉴 탭 · 내용 탭 구분선(`App.css:108` `--color-smoke` · 줄 높이 26 그대로 · 겹판 `_UI_Style.css:483` 26→25 · `test_280_5:166`) · `npm run build` · 확인: `test_cad_touch` · `test_280_5` · CAD vitest + 화면(B07 · M02 [수정] 상세 [DWG 불러오기] · 밝음 · 어두움).
- 검증완료 — test_cad_touch · test_280_5 13건 통과 · CAD vitest 134건 통과 · typecheck error 0 · 화면(B07): 손가락 단추 DOM 0 · 리본 탭 · 묶음 · 접기 누름 + Esc 뒤 :focus-visible 0 · Tab 초점 :focus-visible 1 남음 · 축척 X 10 · Y 9999 = 입력 칸 높이 둘 다 30 · 알림 한 줄(높이 18) · 저장 꺼짐 · 구분선 rgb(193,199,207) 밝음 · rgb(74,65,96) 어두움 · 탭 줄 높이 26 · 겹판 25(스크롤 0) · M02 [수정] 상세 [삽입 → DWG 불러오기] 보임 · 495-1 의 B05 평면 상단 고르기 = 같은 값 다시 고름은 change 없음 → 초점 남는 틈(코드 근거 · ORCA 로 팝업 구동 불가 · 고치지 않음).
- [x] 495-2 M02 [파일 업로드] — 결정 A1 뒤 · 범위 = 구조물 상세 + 도면 양식(B07 [도각 편집]은 다음).
- 검증완료 — test_m02_card_shell 12 · test_m02_router_drawing 통과 · typecheck 0 · 화면 5174: [파일 업로드] 0(카드 · 구조물 상세 · 도면 양식 · 밝음 · 어두움) · [삽입 → DWG 불러오기] REpyo.dwg = 도형 51→72(+21 = 옛 길 21 같음) · 골라짐 21 · Ctrl+Z 한 번 51 · [저장] · 새로고침 뒤 72 · 구조물 상세 47→68→Ctrl+Z 47(저장 안 함) · 떠날 때 물음 창 뜸 · /api/m02/drawing-import 부르는 곳 0(남김).
- [x] 495-3 싱크 스크립트(브레인 · `.claude/git-sync-all.ps1:129-132`) — `$cad` · `$cfg` 를 폴더마다(CAD 폴더 트리 해시 + 빌드 표지) · Node 묶음은 안 넣음(서버가 낡으면 스스로 지음 `common_util_node_bundle.py:58-110`).
- 검증완료 — 폴더마다 표지(CAD = openwebcad git 트리 · config = package-lock 해시 ↔ dist/.aislo_build · node_modules/.aislo_install) · 랩탑 Build-Folder · 데스크탑 창 같은 규칙 · -Check 는 「빌드 필요」만 · config 표지 처음 = npm ls 맞으면 표지만 · 구문 검사 0 · -Check 모의(메인 · sub8 = CAD 빌드 필요 · config 조용) · 첫 싱크 때 CAD 한 번씩 다시 지음.
## 496. B05 · B06 단추 줄 — [확정] 지움 · B06 [>] = 확정 후 이동 · [초기화] 테두리 · 맨 오른쪽 (요구 298-2 · 496-1 sub5 · 496-2 sub6 · Opus high)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-20_요구298_B_버튼셋_B05B06.md` · 차례 [?] [<] [>] [저장] [초기화] · 새 모양 `danger-ghost`(테두리 · 글 = 지금 빨강 · 채움 없음 · 올리면 채움 · 지금 `danger` 20 곳 그대로) · B05 [<] 흐림(B05 ↔ B06 은 다시 안 세움 → 주소 바뀔 때마다 다시 맞춤) · B05 [>] · B06 [<] = 지금대로(저장 없이) · B06 [>] = 확정 일 전부(미지정 측점 기본값 · 노선 CONFIRMED · 단계 2 · 3 닫음 · 측구 방향 역반영 · 배수 다시 셈) 뒤 B07 · 실패면 머묾 · [저장] = 이미 두 보기 한 본문(보는 화면 기준).
- 사용자 확정(요구 300): B1 = [>] 성공 = 그 단계 완료 · 앞 단계 [저장] = 그 단계 진행 중 + 뒤 단계 STALE · B2 = 노선 모양 바뀐 채 B06 [>] = 저장 뒤 모달 「노선이 바뀜」 · [머묾] / [B07 로] 사용자 고름(넘어가면 새 노선으로 확정 뒤 이동).
- 흠(조사 B): 운영 모드에서 B05 · B06 화면의 B07 단계 단추 꺼짐 → B06 [>] 가 「미시작」 알림만(개발 모드 5173 은 우회돼 안 보임) → `currentStage` 목록 · B05 · B06 화면 2 · 3 · 4 켬.
- [x] 496-1 브라우저 공용 + B05 · B06 — `design_dock.ts` · `design_shared.ts` · `design_page.ts`(onStepClick 4 이상 = 확정 후 이동) · `ui_template_help.ts` · `ui_template_workflow_layout.ts` · `ui_template_elements.ts`(새 모양) · 로케일 · 확인: `test_280_2_step_nav` · `test_design_view_parity` · `test_b06_save_channels:96` · `test_272_detail_memory` · `test_416_page_cache` 고쳐 씀 + 화면(차례 · 흐림 · 올림 채움 · B06 [>] = 단계 2 · 3 COMPLETE → B07 · 실패 머묾 · 밝음 · 어두움).
- 검증완료 — 시험 9+10+15+38 통과 · TS 0 · 5180 화면: 차례 [?][<][>][저장][초기화] · B05 [<] 흐림 ↔ B06 켬 · [초기화] 투명 → 올림 빨강 채움(밝음 · 어두움) · B06 [>] 확정 1회 31 s → B07 · 단계 2 · 3 COMPLETE · 실패 = 머묾 · 노선 바꾼 [>] = 물음 [B07 로] 새 노선 확정 이동 / [머묾] 2 · 3 IN_PROGRESS 머묾 · [저장] 뒤 단계 다시 읽음 1회 · 운영 흉내 = 헬퍼 시험 · DB · storage 되돌림
- [x] 496-2 서버 단계 상태 — 결정 B1 뒤 · `B06_Section_Router_DesignSave.py` 한 곳 · B07~B09 [>] 단계 4 · 5 · 6 닫음 몫 포함.
- 검증완료 — 새 시험 19 · 이웃 263 통과 · 검증_sub6 실측 처음 CCIINNN → B06 [저장] 그대로 → B06 [>] CCCCINN → B07 [>] CCCCCIN → B08 [>] CCCCCCI → B09 [>] CCCCCCC → B08 [저장] CCCCCIS → B06 [저장] CCIISSS · 되돌림 같음 · 새 창구 `POST /api/projects/{id}/quantity/complete` · `POST /api/projects/{id}/estimation/complete`(본문 없음) · 검증 대기.
## 497. B07 · B08 · B09 [초기화] · [저장] · [>] (요구 298-2 · 497-1 sub8 · 497-2 sub2 · Opus high · 495-1 · 496-1 뒤)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-20_요구298_C_초기화_B07B09.md` · 셋 다 초기값 층 없음(GET 마다 앞 단계 저장본으로 셈 + 그 페이지 사용자 값 덮음) → 기준 = 사용자 값 없이 지금 앞 단계로 셈(떠 두지 않음 · 앞 단계 저장 = 저절로 새 기준) · [초기화] = 그 페이지 사용자 값만 지움 · 공용 확인 창 · 오버레이만 같이 씀(`design_reset.ts` 는 B05 · B06 전용) · 단추 꼴 · 차례 = 496-1 약속 · B08 은 B07 도면 · 수량표를 안 읽음(B08 기준 앞 단계 = B05 · B06).
- 사용자 확정(요구 300): C1 = 기준 = 앞 단계 바뀐 내용이 반영된 셈 값 · C2 = 지침(CLAUDE.md) 안 고침 · C3 = [초기화] 때 그 페이지 설정값도 모두 초기화(M02 마스터 층 자체는 안 건드림) · C4 = 올린 파일(B08 이정 그림 · B09 견적서) 남김 · C5 = B09 [내역 초기화] → 이름 [초기화] 하나 · C6 = B07 [저장] 둠 · B09 단추 줄 = [?] [<] [>] [초기화](요구 301 · [저장] 없음).
- 정함(브레인): B08 이정 [초기화] = milestone.json 기본으로 · 사용자 그림 붙은 거래처 경로 줄만 남김(그림 고아 · 다음 [저장] 지움 막음).
- [x] 497-0 서버 reset 셋(sub1 · 브라우저보다 먼저) — B07 · B08 · B09 [초기화] 서버 창구 · 그 페이지 사용자 값 · 설정 모두 지움(C3) · 올린 파일 남김(C4) · 단계 = 그 단계 진행 중 + 뒤 STALE · 확인: 새 시험(임시 storage) + 검증_sub1 API 실측 · 되돌림.
- 검증완료 — 새 시험 5 · 이웃 110 통과 · 검증_sub1 실측 B07 확정 2 장 → 0(번호 남음) · 측점 18 확정 → 잠정 · 축척 · 배치 기본 / B08 연암 85 · 모래 20 → 90 · 12 · 수리 지움 · 그림 붙은 경로 1 줄 남음 · 그림 200 · 다음 [저장] 뒤 200 · 1본 8 남음 / B09 공기 77 · 단가 책 → 빈 값 · 책 없음 · 견적서 남음 · 두 번 같음 · 단계 = save · 되돌림 같음 · 창구 `POST /api/projects/{id}/design-drawings/reset` · `…/quantity/reset` · `…/estimation/reset`(본문 없음) · 검증 대기.
- [x] 497-1 B07 — 서버 reset(저장본 `confirmed=False` · 도면번호 남김) · [저장](지금 · ● 탭) · [초기화] · `B07_DesignDetail_Router.py` · `_Api_Fetch.ts` · `_UI_Save.ts` · `_UI_Page.ts` · 새 `test_298_2_b07_reset.py` · 확인: 화면(고침 → [초기화] = 셈 값 · 남길 설정 그대로 · [저장] 뒤 새로고침 남음).
- 검증완료 — 새 시험 4 · 이웃 56 통과 · TS 0 · 5183 Playwright 검증_sub8: 줄 [?][<][>][저장][초기화] · [도각 편집] 윗줄 · 넘침 0 · [초기화] 투명 → 올림 빨강 채움(밝음 · 어두움) · [저장] 고친 것 없음 = 요청 0 · 장 하나 고침 [저장] = PUT 1 · 머묾 · ● 지움 · 개체 152 → 205 · 새로고침 남음 / 종단 축척 1:500 → [취소] 그대로 → [초기화] = 저장본 0 · 개체 152 · 축척 1:1000 · 자동백업 칸 지움 / [>] 고친 것 없음 = 저장 요청 0 → B08 · 고치고 [>] = 저장 → B08 · DB · storage 되돌림 같음 · 검증 대기.
- [x] 497-2 B08 · B09 — B08 reset(지움 = 연암 · 할증 · 재료 칸 · `hydro_inputs.json` · 초안 넷 · 남김 = 1본 길이 · 조합 연결) · B09 PUT `{user:{}}` · B09 [>] = 저장 후 인쇄 미리보기(초안 등록부 `DRAFT.next` · `test_302_1` 지킴) · `test_184_3` 고쳐 씀 · 확인: 화면.
- 검증완료 — 새 시험 10 · 이웃 53 통과 · TS 0 · 5177 검증_sub2(머리 없는 Edge): 줄 B08 [?][<][>][저장][초기화] · B09 [?][<][>][초기화] · B08 연암 85 저장 + 80 초안 → [취소] 그대로 → [초기화] 90 · 초안 0 · 이정 그림 200 · 경로 r497 남음 → [>] 단계 5 C → B09 / B09 간접재료비 1234 → [>] PUT 1 · 완료 → b09-print · 단계 6 C → [취소] 요청 0 → [초기화] 값 빈 · 견적서 남음 → 고침 없는 [>] PUT 0 → 인쇄 · [초기화] 투명 → 올림 채움(밝음 · 어두움) · storage · DB 되돌림 같음 · 검증 대기.
## 498. 노선 [저장] 뒤 토스트 · out of memory (요구 298-3 · sub4 · Opus high) — (일부 · 남은 줄은 PLAN.md)
- [x] 498-1 메모리 — 고치기 전 재현 먼저(저장 다섯 번 · 메모리 · 옛 페이지 풀림 · 듣개 수 · WebGL 문맥 수 · DB · storage 백업) → 전역 듣개 넷 페이지 수명에 묶음(`design_leave.ts:101-107` · `ui_template_overlay_drag.ts:168-208` · `B05_Profile_UI_Panel_Settings.ts:140-146` · `ui_template_side_panels.ts:194-228`) · 코리도 캐시 지금 노선만(`B05_Profile_UI_Corridor.ts:45`) · 확인: 저장 다섯 번 메모리 평탄 · 옛 페이지 풀림 · `design_save.ts` 는 498-3 몫.
- 검증완료 — finishDrop 같은 기록 되받기 고리 그침(test_298_3_finishdrop_loop · 고치기 전 51 번 → 1 번) · 머리 없는 Edge 손 고침 [저장] 다섯 번 매번 60 s 평탄 · 화면 돌아옴 · 누름 됨 · DB · storage 되돌림 · 남은 것: 저장마다 약 80 MB 계단 = `RouteEdit_StructureMarks` · `RouteEdit_Keys` 창 키 듣개가 다음 키 누름 때만 떨어짐(키 한 번 = 513 → 189 MB) · 덧: 두 키 듣개 캔버스 수명에 묶음(listenWhileAlive · test_298_3_page_dispose 두 칸 고치기 전 빨강 → 통과 · 둘레 85 통과 · TS 0) · 머리 없는 Edge 끌기 손 고침 [저장] 다섯 번 키 누름 없이 GC 뒤 힙 39 → 123 → 205 → 205 → 206 → 206 MB(둘째 저장부터 평탄) · 매번 화면 다시 섬 · DB · storage 되돌림 · 남은 것: 옛 페이지 한 벌 = `design_structure_pipe_calc.ts:28` extraCountSource 모듈 칸이 앞 페이지 횡단 보기 닫개를 쥠(늘지 않음) · 한 벌 더 = DevTools 콘솔 손잡이(재는 도구 몫) · 검증 대기
- [x] 498-3 저장 모양(D1) · 토스트 — 496-1 뒤 · `design_save.ts`(헛 다시 읽기 :227 걷음 포함) · `RouteEdit_Apply.ts:146-157` 요약 토스트 지움(「새 교차 관」 한 줄 · 따라감 실패 · 저장 실패만 남김) · 확인: 손 고침 [저장] · 저장 중 [저장] · 저장 중 고침 + [>] · 고친 것 없는 [>] 화면.
- 검증완료 — 새 시험 test_298_3_save_shape 8 · 둘레 272 통과(test_b06_draft_pipe_replay 1 = 고치기 전부터 · 안 건드린 Section_Store 글) · TS 0 · 머리 없는 Edge 5179 검증_sub4: 손 고침 [저장] 잠금 0 · 5.5 s 뒤 「저장했습니다」 · 저장 중 [저장] = 막힘 알림 · 서버 저장 1 번 · 저장 중 횡단 고침 + B06 [>] = 잠금 → 앞 저장 끝 → 확정 저장 → B07 · 단계 CCCCINN · 다시 읽은 값 = 마지막 화면 값(0.70) · 고친 것 없는 [>] = 저장 요청 0 · 2.3 s 에 B07 · 교점 끈 [저장] = 잠금 18 s · 다시 섬 · 알림 「저장했습니다」 한 장(새 교차 관 0) · 밝음 · 어두움 토스트 · DB · storage 되돌림 · 정함(브레인 A): 고친 것 없음 + 단계 2 · 3 COMPLETE 일 때만 바로 이동 · 남김: 상단측 손 고침 알림(`RouteEdit_Apply.ts` routeCarryPart) 그대로 · 검증 대기
## 499. 좌측 패널 하이라이트 = 닫혀 있으면 안 엶 · B06 평면 창 자리 (요구 298-4 · 298-6 · sub5 496-1 뒤 · Opus high)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-20_요구298_E_패널하이라이트_B06오버레이.md` · 패널 여는 곳 = 한 곳(`design_shared.ts:316` onReveal → `design_page.ts:153` revealLeft) · 열네 길 모두 지남 · 쌓임은 이미 평면(4) 위 종단(3) · 실제 = 자리 다툼(평면 높이 기준이 가운데 위 칸 · 손잡이 겹침).
- 사용자 확정(요구 300): E2 = 손잡이 그대로(덮이면 사용자가 창 조절) · E3 = 패널 열림 여부와 상관없이 카드 펼침 + 하이라이트 · 닫힌 패널은 안 엶 · 열면 바로 보임 · E1(요구 302 · 304) = 구조물 조합은 연결만 · 예외 없이 패널 안 엶 · 토스트 없음 · 우클릭 [추가] 때 빈 필수 칸 = 기본값 넣고 바로 추가(`B05_Profile_UI_Structures_Panel.ts:641-665`).
- [x] 499-1 — onReveal · revealLeft 지움 · 열 때 고른 줄로 한 번 스크롤(`ui_template_workflow_layout` 열림 알림 + `design_page`) · `design_page.css` 횡단 보기 가운데 칸 `position: static` 한 줄 · z 199 미만 유지 · 확인: `test_398_1` 뒤집음 · `test_116` · `test_409` + 화면(닫힌 패널 = 안 열림 · 열면 고른 줄 · 종단 판 90 % · 평면 열기 = 넘침 0 · 손잡이 둘 누름).
- 검증완료 — 시험 42 통과(398_1 뒤집음 · 116 · 126 포장 바로 · 409) · TS 0 · 검증_sub5(Playwright 진짜 누름 · ORCA 탭 누름 안 닿음) 닫힌 패널 = B05 · B06 종단 알약 · B06 경고 칩 · 우클릭 [추가](옹벽 · 콘크리트 포장) 모두 패널 닫힘 유지 · 카드 펼침 · 목록 강조 · 토스트 · 확인창 0 · 우클릭 = 바로 추가(마커 1 → 2) · 열면 고른 줄 화면 안 · B06 종단 판 최대(75 %) + 평면 열기 = 기준 main · 넘침 0 px · z 4 · 밝음 · 어두움 · 평면이 종단 손잡이 덮음(E2 그대로)
## 500. B05 곡선 누름 = 측점 고름 유지 · 임시 횡단 잡는 띠 · 창 단추 (요구 299 · sub7 · Opus high)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-20_요구299_G_고름유지_임시횡단.md` · 원인 = 평면 누름이 곡선 판정 앞에서 늘 `marks.deselect()`(`B05_Profile_UI_RouteEdit_Pointer.ts:246`) · 오른쪽 판은 따로 `watching` 을 쥐어 어긋남(`B05_Profile_UI_RouteEdit_Cross.ts:355`) · 표시 · 누름 = 한 함수 한 값(`logic/B05_Profile_Profile_CrossPick.ts:10` `GROUND_SLACK_PX = 8`) · 임시 횡단 창 = 자체 겹침 창(`B05_Profile_UI_Profile_CrossModal.ts:144-155`).
- 사용자 확정(요구 299 · 300): 고름 풀림이면 오른쪽 횡단도도 비움 · 띠 ±12 px · 임시 횡단 창 끌어 옮김(끝 측점 가림 = 사용자가 치움).
- 사용자 확정(요구 304): 측점 세로선 자리에서 임시 횡단 띠가 다른 곳보다 좁음 → 계획선 띠 ±12 px 안에서는 측점선보다 임시 횡단이 먼저(측점선은 띠 밖 길이에서 그대로 · ▲▼ 단추 몫 그대로).
- [x] 500-2 측점선 자리 띠(sub7 · Sonnet high) — `B05_Profile_UI_Profile_Render.ts` 누름 · 스침 차례 · `logic/B05_Profile_Profile_CrossPick.ts` · 확인: `test_490_1` · `test_500_1` + 화면(측점선 위 계획선 ±12 px = 표시 · 누름 = 임시 횡단 · 띠 밖 측점선 누름 = 측점 고름 · 팝아웃 같음).
- 검증완료 — 시험 10 통과(490_1 측점선 띠 안 10·10 · 띠 밖 null · 500_1 · 368_3) · TS 0 · 검증_sub7 측점선 20 m 위 원지반선 ±12 px = 24 px 구간 표시 · 누름 = 임시 횡단 0+19 · 측점 고름 안 함 · 띠 밖 530 누름 = 측점 20 고름 · ▲ 단추 위 표시 없음 · 밝음 · 어두움 점·선 색 · 팝아웃 = 같은 renderProfile 조각
- [x] 500-1 — 교각점 · 손잡이 · 호 누름 = 고름 유지 · 빈 곳 · Esc 풀림 = 오른쪽 판도 비움 · 띠 8 → 12 px · [측점 추가] · [삭제] · [닫기] = 제목 줄 오른쪽(`margin-left:auto`) · 창 제목 줄 끌어 옮김 · 확인: `test_490_1_cross_pick` 고쳐 씀 + 화면(구조물 횡단선 → R = 파란 법선 · 종단 세로선 · 오른쪽 판 셋 남음 · 빈 곳 = 셋 다 풀림 · 띠 ±12 px · 팝아웃 종단 같음 · 밝음 · 어두움).
- 검증완료 — 시험 48 통과(500_1 새 · 490_1 · 409 · 411_a 뒤집음 · 399 · 368_3 · 440 · 494_1) · TS 0 · 검증_sub7 17+11 배관 마커 고름 → 교각점 · 손잡이 · 호 = 고름 351 · 종단 강조 1 · 오른쪽 판 17+11 유지 · 빈 곳 · Esc = 고름 없음 · 강조 0 · 빈 판 · 띠 24 px 줄(옛 16) · 측점선 · ▲ = 표시 없음 · 창 단추 제목 줄 오른쪽 끝 같음 · 끌기 = 종단 칸 끝에 가둠 · 높이 285 그대로 · 밝음 · 어두움 · 팝아웃 = 같은 함수(화면 미확인).
## 501. 보안 대 속도 — 계산 자리 고름 (요구 298-5 · 브레인 · 결정 뒤)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-20_요구298_F_보안_속도.md` · 지금 = TS 한 벌을 브라우저(즉시) · 서버(정본) 두 곳 · 등록부 45 = 브라우저 즉시 34 · 서버 정본 1 · 서버만 4 · 브라우저만 6 · [저장] 때 서버 다시 셈 = 위조 대부분 막힘 · 빈틈 = S1 임시 배포가 vite 개발 서버(원본 · 파일이 로그인 없이 나갈 수 있음 · 추정) · S2 로그인만으로 M01 로직 · 일위대가 · 호표 읽음 · S3 단가 계산 오라클 · S4 표제란 길 회사 검사 없음 · 추천 갈래 d(B05 · B06 기하 그대로 · B08 · B09 · M02 계산 서버 단독 · 운영 묶음 배포 · 마스터 권한 조임 · 인쇄물 서버 정본).
- 보류(요구 300): F 그룹 전부 · 오늘 저녁이나 내일 다시 대화.
- [x] 501-0 S1 실측 — 브레인 확인을 권한 장치가 막음 → 사용자 허락 뒤. → 완료 처리(요구 332 · 지금 유지 · 사용자가 시험하며 요청).
- [x] 501-1 결정 F1~F9 뒤 계획 · 측정(조작 아홉 × 실행 자리 셋 × 회선 셋 · 목표 0.1 / 0.3 / 1 s). → 완료 처리(요구 332 · 지금 유지 · 사용자가 시험하며 요청).
- [x] 501-2 분석 H(요구 304 · 브레인 에이전트 · 코드 고침 없음) — 시간 먼저 잼 → 보안 같이 · 계산마다 실행 자리 스위치(등록부 한 곳) 설계 · 「[저장] 정본 한 곳」 규칙 · 계획고 덮어쓰기(498-2) 길 · 보고 `docs/raw/조사/2026-10-20_요구304_H_계산자리_시간_보안.md`.
- 검증완료 — 보고 커밋 · 문서 「보안 · 편의성 계산 자리 분석」(https://claude.ai/code/artifact/d453e6d5-1f10-4e37-9e40-ead63b4f4cee) 4 · 6절 채움 · 결정 F1~F9 · H1~H3 = 사용자 (검증 대기).
## 502. 요구 309 — 로그인 느림 · 연산 자리 체크박스 · 다음 장 후보 (브레인 · 조사 뒤 일감)
- 정함(브레인): 조사 = 클로드 에이전트 다섯(보고 `docs/raw/조사/2026-10-21_요구309_A · B · C1 · C2 · C3_*.md`) · 코드 고침 없음 · 일감은 보고 뒤 503~.
- [x] 502-1 로그인 느림 원인 — 보고 A · 확인: 단계별 시간 수치. · 조사 끝(보고 커밋 · 일감 503~507)
- [x] 502-2 연산 자리 체크박스(시스템 관리자 대시보드) 검토 — 보고 B · 501 결정(F · H)과 같이 사용자 결정. · 조사 끝(보고 커밋 · 일감 503~507)
- [x] 502-3 다음 장 후보 조사 — C1 B05 · B06 · C2 B07~B09 · CAD · C3 서버 · 시험 · 기반 → 남은 것만 503~ 일감. · 조사 끝(보고 커밋 · 일감 503~507)
## 503. 로그인 느림 (요구 309-1 · 분석 A · 착수 = 사용자 지시 뒤)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-21_요구309_A_로그인느림.md` · 차례 = 되튕김 → 로그인 DB 쓰기 묶음 · bcrypt 스레드 → 빌드본 배포(결정 뒤).
- 사용자 확정(요구 310): NAS 일시 문제로 봄 · 흠(503-1 · 503-2)만 고침 · 503-3 결정 보류.
- [x] 503-1 되튕김 — 「로그인 안 됨」 5 s 기억을 로그인 성공이 비움 · 확인: 화면 뜬 뒤 0.5 · 2 s 누름 = 대시보드.
- 검증완료(sub1 · 0b8c34a2c): Playwright 0.5 · 2 · 6 s 누름 = 모두 대시보드(고치기 전 0.5 · 2 s 되튕김) · test_309_1_login 7 통과 · 검증 대기
- [x] 503-2 로그인 서버 시간 — DB 쓰기 다섯 → 한 번 · bcrypt 스레드로(서버 안 멈춤) · 확인: 요청 시간 전후(약 1.0 s → 0.5 s 추정).
- 검증완료(sub1 · 0b8c34a2c): 8001 httpx 10 번 중앙 1.25 s → 0.67 s · 동시 5 명 한 사람 2.0~2.8 s → 0.6~1.2 s · 틀린 비번 = 잠금 423 · login_logs 그대로 · 검증 대기
- [x] 503-4 잠금 횟수 흠(503-2 때 찾음 · 브레인 판정 고침) — record_failed_login 이 UPDATE 왼→오 대입으로 4 번째 틀림에 잠김 · 경고 메일(5 번) 안 나감 → 5 번 틀림 뒤 잠금 + 메일 · 덧 = 쿠키 재로그인 신뢰 기기 UPDATE 같은 트랜잭션 · 확인: 4 번 = 안 잠김 · 5 번 = 잠김 + 메일 길.
- 검증완료(sub1): 잠금 = 별도 UPDATE(failures >= 5) · has_trusted_device 읽기만(last_used_at 은 마무리 트랜잭션 _trust_device 가 갱신) · test_309_1_login 12 통과 · 8001 일반 계정 1~4 번 401 안 잠김 · 5 번 401 잠김 + 경고 메일 발송 · 6 번 423 · users 행 되돌림 · 쿠키 재로그인 중앙 0.68 s → 0.49 s · Edge 화면 로그인 3 번 대시보드 · typecheck 0 · 검증 대기
- [x] 503-3 결정(사용자) — 임시 배포 빌드본 · NAS DB 커밋 설정 · 배포 DB 분리 · bcrypt 비용. → 요구 311 = 배포도 지금 NAS DB 그대로(분리 · 설정 바꿈 없음) · 빌드본 · bcrypt 지금대로.
## 504. 연산 자리 체크박스 (요구 309-2 · 분석 B · 결정 뒤)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-21_요구309_B_연산자리_체크박스.md` · 화면 체크 = 시간 재기 · 비교 · 편의(보안 이득 없음) · 보안 = 501(F · H)과 같이 · [저장] · [확정] 서버 정본 그대로.
- 사용자 확정(요구 310): 스위치 구현 · 기본값 = 지금 등록부 자리 그대로(넣어도 바뀌는 것 0) · 바꿈은 사용자가 체크로 · 나머지 = 추천(묶음 8 · 전체 · git 설정 파일 · 다음 열기부터 · 시스템 설정 카드 · 시스템 로그 · 1단계 먼저).
- [x] 504-1 결정 아홉(사용자 · 괄호 = 추천) — 목적(시간 · 비교 · 편의) · 단위(묶음 8) · 범위(전체) · 설정 자리(git 파일) · 열린 페이지(다음부터) · 지침 5장(시험용 예외) · 화면(시스템 설정 카드) · 기록(시스템 로그) · 차례(1단계 먼저). → 요구 310 = 추천대로.
- [x] 504-2 1단계 최소 판 — 설정 파일 · 시스템 관리자 창구 · 체크 창 · 지금 바꿀 수 있는 둘(지반 높이 · 3D 길) · 504-1 뒤.
- 검증완료(282b481f8 · sub2) — 시험 test_309_2 · 카드 · 바로가기 21 통과 · typecheck 0 · 5177 화면 = 시스템 관리자만 카드 · ADMIN · USER 403 · G1 끔 → B05 지반 서버 요청 0 → 4 · 판 기본값으로 되돌림 · 밝음 · 어두움 창 확인.
- [x] 504-3 계산 자리 창 45줄(요구 312) — 묶음 8 머리 아래 계산 45개 한 줄씩 · 잠긴 줄 까닭 글 · 판 꼴 그대로 · sub2(507-4 뒤) · 확인: 창 45줄 · G1 · D3 만 켜짐.
- 검증완료 — 5177 Playwright: 머리 8 + 계산 45 줄 · 이름 = 등록부 label · 켤 수 있는 줄 G1 · D3 만 · 머리 체크 끄면 줄도 꺼짐 · 서버 정본 칸 늘 잠금 · 밝음 · 어두움 한 장씩(tmp/shots_504_2) · 판 기본값 그대로 · test_309_2 두 파일 10 통과 두 번 · typecheck 0.
## 505. 다음 장 — B05 · B06 작은 흠 (분석 C1 · 결정 없음 또는 정함)
- 정함(브레인 · 바꿀 수 있음): 근거 `docs/raw/조사/2026-10-21_요구309_C1_다음장_B05B06.md` · 저장 중 [초기화] = 막음(D1 [저장]과 같게) + 서버 초기화 프로젝트 잠금 · 「계산 중」 누름도 카드 폄(E3) · 되살린 고름 · 🏠 · 뒤로 · 지형 · 스냅만 바뀐 [저장] = 지금대로 · 모델 없는 sheet = 고르기 숨김 + 409 사유 · 임시 횡단 창 = B06 카드 그림 · 빈칸 칩 = 그래프 오른쪽 위.
- 사용자 확정(요구 310): 추천 노선 계산 = 파일 입력 직후 전처리에서만 · 프로젝트 접근(B05 열기 · 노선 [저장] · [적용] 뒤 다시 세움) = 영구 저장본 읽기만 · 정함(브레인) = 저장본 없으면 계산 안 함 · 「전처리 다시」 안내 · 나머지 = 브레인 제안대로.
- 정함(브레인 · 505-1 물음): 추천 모달 기본 다섯 + 저장 제약 다섯 = 저장본만(없으면 409 안내) · 사용자가 제약 · 비중 바꾼 요청 · [재계산] = 그 자리 셈 · 체인 쪽 미리 셈(업로드 · B04 재확정 · B01 사용 범위 · 스냅샷 없는 [초기화]) 둠.
- 정함(브레인 · 505-1 보고 물음): 프로젝트 접근 = 저장본이 있으면 엔진 코드 판(지문)이 달라도 그대로 읽음 · 지문 견줌은 전처리 체인에서만(엔진 고칠 때마다 「전처리 다시」 안내가 쏟아지지 않게) · 505-1 덧 = sub3 · 5d 도 sub3(Replan.py 같은 파일).
- [x] 505-1 추천 노선 = 전처리에서만 — 페이지 GET · 노선 [저장] · [적용] 뒤 미리 셈 걷음(읽기만) · _prepare · followed_pipes 스레드(C1 2c · 5c) · 확인: B05 열기 · 노선 [저장] 뒤 미리 셈 0 · 전처리 체인에서만 생김 · [적용] 첫 요청 안 끊김. 검증완료 — test_309_3 아홉 · 추천 · 노선 · 493 · 494 둘레 261 통과(건너뜀 14) · typecheck 0 · 8005 검증_sub3(되돌림): B05 열기 · [적용] 뒤 「추천 미리 셈」 로그 0 · 저장본 없는 알약 0.5 s 「전처리를 다시 하면 생깁니다」 · 체인 한 줄(run_precompute) 60 s 뒤 같은 알약 0.6 s 저장본 · [적용] replan 200 · 화면 분석 지형이 설계 지형과 같으면 기본 갈래로 봄 · 초기 종단 지문 노선 파일 걷음. 검증 대기.
- [x] 505-1 덧 접근 = 지문 달라도 읽음 — 추천 저장본: 같은 판 · 같은 입력이면 그 파일 지문으로 키 다시 내 찾음(`read_stored_any`) · 초기 종단: 코드 지문 빼고 입력만 견줌(파일에 지문 칸 · 옛 파일은 그대로 읽음) · 체인 · 사용자 셈은 그대로. 검증완료 — test_309_3 열하나 · 둘레 20 파일 통과 · typecheck 0 · 8005 검증_sub3(지금 코드 지문 d270 ≠ 저장본 c878 · 되돌림 · 바뀐 것 0): B05 열기 · 추천 다섯 알약 모두 「저장된 결과」 0.2~0.5 s · 안내 0 · 초기 종단 오류 0. 검증 대기.
- [x] 505-2 저장 · 고름 — 저장 중 [초기화] · 확정 중 키 고침 틈 · 계산 중 누름 카드 · B06 목록 0+0 · --plus 선 · snapOptions 0.1 · extraCountSource · sheet 숨김(C1 1 · 2b · 3 · 4d · 5d · 7 · 8 · 9 · 5d = sub3 몫). 검증완료 — test_505_2 여덟 + 둘레(346_4 · 398_1 · 298_3 · 493 · 368_3 · 490_1 · 390_5 · 431 · 224_2) 137 통과 · typecheck 0 · 5174 검증_sub1(DB · storage 되돌림 · 같음 확인): 확정 가림막 중 ↑ = 키 안 막음 · 「저장 중 고친 값은 아직 저장 안 됨」 알림 + 떠남 물음(고침 남음) · 저장 중 [초기화] = 「이전 수정을 저장 중」 알림 · 확인 창 0 · 끝난 뒤 = 확인 창 · B05 20+0 고름 → B06 목록 scrollTop 3296(고침 빼면 0 = 0+0) · 「계산 중」 점 켠 채 목록 누름 = 구조물 배치 폄 · 고른 추가 측점 선 위쪽 누름 = 임시 횡단(삭제 단추) · 밝음 · 어두움 한 장씩. 검증 대기.
- [x] 5d sheet 숨김 — 고르기 목록이 DB 완료 모델도 봄(없으면 숨김) · 바꿈 모델 없음 = 409 사유 한 줄 · 노선 되돌림. 검증완료 — test_505_2_terrain_sheet 셋 · 133_1 맞춤 · 8005 검증_sub3(모델 641 잠시 FAILED · 되돌림): 목록 [las, sheet] → [las] · replan(sheet) 409 「고른 분석 지형의 지표면 모델이 없습니다 — 전처리에서 만든 뒤 다시 하세요.」 · storage · DB 행 바뀐 것 0. 검증 대기.
- [x] 505-3 그림 · 글 — 임시 횡단 창 B06 카드 + 빈칸 칩 · 곡선 판 가림 · 누름 틈 · WF_State_Stale 글 · ui-button(C1 4b · 4c · 10 · 11 · C2 5-2). 검증완료 — 시험 test_505_3 둘(글 7 · 화면 3) + 둘레 9 파일 46 통과 · typecheck 0 · 5179 검증_sub4 19+8: 측점선 · 지반선 겹친 자리 누름 = 측점선이 받음 → 창 B06 카드 + 「⚠ 배관 관경 빈칸」 · 「횡단」 판도 칩 · 관경 800(세션만) → 관 · 집수정 형상 · Ctrl+휠 1.15 배 창 칸 안 · 곡선 판 위 58 = 도구줄 + 8 · 판 열면 오른쪽 = 판 왼쪽 − 8 · 밝음 · 어두움 한 장씩. 남음(밖) — 구조물 고른 채 새로 고침 = 평면 편집기 안 뜸(`B05_Profile_UI_RouteEdit.ts` `closed` 선언 전 씀 · 전부터). 검증 대기.
- [x] 505-4 B05 작은 흠 둘(505-3 때 찾음) — 구조물 고른 채 새로 고침 = 평면 편집기 안 뜸(`B05_Profile_UI_RouteEdit.ts` 횡단 뜸 콜백이 만드는 도중 불려 `closed` · `view` 선언 전 씀 → 한 박자 뒤에 그림) · 빈 관경이 1000 으로 보임 → 빈 선택지(`design_structure_form.ts` 관경 칸만 빈 보기 · 안 채움 · 새 관은 기본 1000 그대로). 검증완료 — 시험 test_505_4 셋(글 2 · 화면 1) + 둘레 16 파일 103 통과 · typecheck 0 · 5179 검증_sub4: 19+8 고른 채 새로 고침 = 「before initialization」 0 · 캔버스 그려짐 · 관경 칸 값 빈칸 · 첫 보기 빈 값 · 열기만 해서 구조물 목록 응답 그대로 · 새 배관 관경 1000. 남음(밖) — test_505_3 화면 첫 시험(곡선 판 · 꺾임점 픽셀 1199,296)이 내 고침 없이도 빨강(보이는 지도 자리 달라짐 · 505-3 때는 통과). 검증 대기.
## 506. 다음 장 — B07 · CAD · 시험 · 서버 기반 (분석 C2 · C3 · 결정 없음 또는 정함)
- 정함(브레인 · 바꿀 수 있음): 근거 `docs/raw/조사/2026-10-21_요구309_C2_다음장_B07B09_CAD.md` · `docs/raw/조사/2026-10-21_요구309_C3_다음장_서버시험기반.md` · 프로젝트 도각 = [초기화] 밖(확인 창 글로 안내) · B09 [인쇄 미리보기] = 저장 뒤 이동 · M02 카드 DWG = 도움말 한 줄 · 축척 주소 그대로 · live 시험 = 켤 때만 도는 표식.
- [x] 506-1 서버 다시 읽기 — uvicorn 제외 목록 절대 경로(`main.py`) · 확인: 시험 · tmp .py 바꿔도 Reloading 없음 · 메인 서버는 쉬는 때 다시 켬.
- 검증완료 — `reload_excludes`(절대 경로 17) · test_506_1 3 통과 · 8001 실측: tmp · resources/tester .py Reloading 없음 · 모듈 폴더 .py Reloading 있음 · 로그인 · 대시보드 200. 메인 서버는 쉬는 때 다시 켬.
- [x] 506-2 시험 정비 — 빨강 둘(test_b06_draft_pipe_replay · test_269_panel_form) · vitest 실행 설정(dxf-clip 등) · test_472_6 live 표식(C3 1-1~1-4 · C2 6-d · 6-i). 검증완료 — pytest 4 파일 17 통과 · 9 건너뜀(live 는 `AISLO_LIVE_DB=1` 일 때만) · openwebcad vitest 23 파일 265 통과(node 꼴 넷 + ctrl-shortcut-sheet 는 제외 · 각자 node/ui 설정으로 통과) · typecheck 0. 검증 대기.
- [x] 506-3 B07 · CAD — 저장 길(30 s 끊김 화면 · 자동백업 열쇠 프로젝트 · 옛 단계 규칙 · 개발 잠금풀기) · 죽은 길 · CAD 되돌리기 · LAYMRG · B09 [인쇄 미리보기] · M02 도움말(C2 가 · 나 · 다 · 4-1 · 6-e). 검증완료 — pytest 506-3 둘 16 · 둘레 B07 · B09 · M02 247 통과 · vitest undo-506-3 · selection-style · state 17 통과(옛 LAYMRG 는 빨강) · typecheck 0 · CAD 빌드 · 5177 화면(검증_sub2 · 되돌림): 색 다섯 번 끌기 → 되돌리기 한 번 = 처음 색 · 자동백업 열쇠 `b07:{프로젝트}:cover` · 미리받기 13 장째 [저장] = 「저장했습니다」 · 저장 중 새 GET 0 · [초기화] 물음 = 도각 안내 · B09 [인쇄 미리보기] = PUT 뒤 #/b09-print · complete 없음 · 7-3 실DB 표식 남김(되돌린 트랜잭션). 검증 대기.
- [x] 506-4 main.py 나눔 — 807 → 약 530(개발 전용 두 덩이 · C3-3).
- 검증완료 — main.py 807 → 541 · `config/config_dev_server.py` 신설(동작 그대로) · test_73_16 · 302_1 · 298_2 통과.
## 507. 다음 장 — 사용자 결정 뒤 큰 일 (분석 C1 · C2 · C3)
- 사용자 확정(요구 311): ① 노출형 횡단수로 · 개거 = 횡단면에 표시(마킹)만 · 형상 없음 ② 자동 세류선 관 = 로직 안 라벨(옮겨도 남음) · 노선 바꾼 [저장]에 복수 생성 없음 · 사용자가 지운 것은 다시 안 생김 ③ B05 MC = 사용자가 고칠 자리 → (MC) 붙임 · 글자 크게 · 굵게 · 색 · B07~B09 에도 (MC) ④ 개발 돕는 검증 스크립트 = 브레인 재량.
- [x] 507-1 노출형 횡단수로 · 개거 = 횡단면 표시만(형상 없음) — 지금 측점 · 표시가 없으면 세움 · M02 표(사용자 마스터)는 안 고침 · 확인: 그 측점 횡단 카드에 이름 표시 · 형상 0 · sub4.
- 검증완료 — 부품 상자 형상 「표시만」(mark) 더함 · 두 종류 처음값 = 측점 세움 + 표시만 · B05 「횡단」 판 · 임시 횡단 창에 이름 칩 · 시험 129 통과(505-3 test_0 곡선 판 픽셀 누름만 실패 · 무관) · 화면 7+7 노출형 = 판 · 창 · B06 카드 이름 · 형상 0 · 세션 지움(저장 안 함).
- [x] 507-2 자동 세류선 관 라벨 — 자동 관에 세류선 라벨(옮기고 고쳐도 남음) · 노선 바꾼 [저장] 때 라벨 짝이 있으면 안 더함 · 지운 자동 관 = 다시 안 생김(지움 표지) · [적용] · [초기화] = 초기값 · 확인: 앞 측점 노선 바꿈 [저장] 두 번 = 관 수 그대로 · sub3.
- 검증완료 — test_507_2 11 통과 · 둘레(493 · 494_2 · 449 · 283 · 346_3 · 312 · 428 · 476 · 347 · 459) 통과 · typecheck 0 · Playwright 검증_sub3: 교점 끌기 [저장] 세 번 관 2→2→2→2(새 관 0 · 옛 관 라벨 붙음) · 관 지우고 [저장] → 노선 바꿈 [저장] 관 0 그대로(교차 9.3 m 옮음 · 옛 규칙이면 더함) · 되돌림 같음.
- [x] 507-3 MC 강조 — B05 · B06 MC 측점 글 = (MC) · 크게 · 굵게 · 색(밝음 · 어두움) · B07 CAD · B08 수량표 · B09 출력에 (MC) · 확인: 화면 · 도면 · 표 글 · sub1.
- 검증완료 — 경고색 토큰 · 평면 눈금 굵은 13px · 종단 12px 굵게 · 횡단 판 14px · B06 카드 16px(밝음 #b8860b · 어두움 #e0b64a) · B07 종단 표 · 횡단 제목 「No.29+19.0 (MC)」 · B08 토적표 · B09 인쇄 토적표 MC 4 곳 · 갈아끼움 이름 「STA… (MC)」 · 시험 test_507_3 6 + 둘레 260 통과 · typecheck 0 · 검증_sub1 storage · DB 그대로. 검증 대기.
- 덧 검증완료 — B07 계획평면도(노선배치도 · 지형) MC 4 곳 글 「NO.29+19.0 (MC)」 = 5 배수 아니어도 큰 글(4.5) + 원 · B05 종단 아래 표 측점 행 MC 4 칸 「29+19 (MC)」 굵게 · 경고색(밝음 #b8860b · 어두움 #e0b64a · 이웃 1 m 칸은 세운 6px 글 · 고른 측점 값 열 14px 굵게) · B07 횡단 장 단추 「3장 (No.29+19.0 (MC))」 한 줄 전체 · 시험 test_507_3 10 + 둘레 73 통과 · typecheck 0 · 검증_sub1 읽기만(저장 0). 검증 대기.
- [x] 507-4 검증 스크립트 정비(브레인 재량) — 실제 마스터 파일을 쓰는 시험 = 임시 사본으로 · 화면 시험 실패해도 되돌림 · 픽셀 자리 의존 걷음 · 검증_sub7 시험 자리 · 시험 헬퍼 공용 불러오기 첫 걸음 · sub2.
- 검증완료 — 계산 자리 판 시험(단위 = 이미 임시 사본 · 화면 = 5177 이 8004 로 갈 때만 돌고 실패해도 판 되돌림) · 505-3 첫 시험 = 캔버스 교각점 색으로 찾음 · 검증_sub7 12 파일 = `helper_verify_project` 로 지금 있는 검증_subN · 공용 불러오기 `helper_ts_stub_loader` 본보기 3 헬퍼 + 새 시험 · 두 번 같은 결과(44 통과 · 4 건너뜀 · xfail 9~11 = 프로젝트와 무관한 낡은 기대 — 브레인 가림 전).
## 508. 다음 장 후보 (요구 309~313 장에서 창이 찾은 것 · 장 끝에 한 번에)
- 사용자 확정(요구 314): 시험 16(349 계열 11 · 233_4 다섯) 가림 · 도우미 정리 진행 · B07 횡단이 도각 · 칸 밖으로 나가는 것 = 사용자가 조절(코드 안 고침) · 계산 자리 창 목적 = 앞 · 뒤 한 벌 동작 · 시험하며 편의로 고름.
- [x] 508-1 시험 — 508-1a 16 시험 가림(낡은 기대면 고침 · 제품 흠이면 보고) + 309-2 화면 시험 로그 행 = sub2 · 508-1b 옛 헬퍼 195 공용 로더 옮김(16 시험 헬퍼 빼고) = sub5. → 508-1a · 1b · 1c · 1d 끝(199 파일 1480 통과 · 빨강 0).
- [x] 508-1a 시험 가림(sub2) — 233_4 다섯 = 낡음(500-2 누름 잡는 단계 · 짝 본문 찾기 고침) · 349 계열: 0d 둘 = 낡음(410 좌표 낡음 판정 · 가짜 구조물 정수 측점) · 0l · 0s · 0q · 0o 되돌리기 = 시험 기다림 모자람(472-5 덧 그리기 멈춤 · `pipelineHolding` 기다림) · pipeline_once = 낡음(77be773c0 상세 가게 칸 채움) · 0u = 프로젝트 바뀜(저장 반지름 초안 · 끈 꼭짓점 기준) · xpass 둘 걷음 · 309-2 화면 = 표식 브라우저 문자열 로그 행 지움 · 포트 = OWNERS.md 이 폴더 줄(다른 폴더 사본이 8004 판을 고치던 흠). 남은 xfail 둘 = 제품 흠(0o 노선 끌기 · 횡단 보기 진입에 cross 군더더기 차례 · a02367e61) → 물음. 검증완료 — 고친 시험 두 번 같음(34 통과 · xfail 2 · 309-2 셋 통과 · 시험 로그 행 0 · 마스터 판 그대로). 검증 대기.
- [x] 508-1c cross 군더더기 · 시험 포트(sub2) — 맞춤(reconcile) cross 견줌 = 지금 측점 자리로 가른 뒤(`crossAtSeat` · `design_pipeline_cross.ts` `staleInputs` · page 699 → 697 줄) · 끌기 · 횡단 보기 진입 cross 셈 2 → 0 · 값 그대로 · 버림 쪽 따로 고침 없음(묶음 cross 입력이 초안 전 값 그대로 남음) · 0o xfail 둘 걷음 · 포트 박은 브라우저 시험 아홉 + 309-2 = 공용 `own_ports`(OWNERS.md 이 폴더 줄) · 349_0j 넓힌 표본 수 = 낡은 기대(못 넓힌 미교차도 표본 실음 · 서버와 같음) 고침. 남은 빨강: test_app_settings CAD 명령 수 153 → 154(포트 무관 · 낡은 기대 추정). 검증완료 — 349 · 298_3 · 346_4 · 472_5 계열 두 번 같음(148 통과 · 0j 고친 뒤 10 통과 두 번) · 고친 화면 시험 5177 로 돎(16 통과) · typecheck 0. 검증 대기.
- [x] 508-1d 남은 빨강 가림 · 못 옮긴 헬퍼(sub5) — 빨강 26 = 모두 낡은 가짜 모듈(헬퍼 넷) · 제품 흠 0: 54_9 = 구조물 표 불러오기(322-1) 못 찾음 · 398_2 · 408 = 곡선 판 가둠(505-3) `ResizeObserver` · 판 찾기 가짜 더함 · 323_9 = 라우터 draft 길 `import.meta.glob`(302-1) 가짜 + 기대 낡음(498-3 D1 노선 그대로 [저장] = 가림막 없음) → 넷 다 공용 불러오기로 · test_app_settings CAD 명령 153 → 154(488-3 IMPORT) · 모양 다른 일곱(280_2 · 298_3 · 322_0 · 345_4 · 347 · 427_1 · 459)도 옮김(공용 옵션 둘 더함 `target` · `rewrite`) · 제품 코드 안 고침. 검증완료 — 시험 199 파일 전 1450 통과 · 13 건너뜀 · 26 빨강 → 후 1480 · 13 · 0(두 번 같음 · 어긋남 = 빨강 26 → 통과만) · 일곱 헬퍼 출력 전 · 후 같음 · `npm run typecheck` 0. 검증 대기.
- [x] 508-1b 옛 헬퍼 공용 불러오기 옮김(sub5) — 헬퍼 172 곳이 `loadTs` 베낌을 걷고 `makeLoader` 호출로(7 묶음 커밋) · 공용 불러오기에 옵션 넷(`requireFor` 풀이 함수 직접 · `interop` · `cache:false` · `fileStub`) · 풀이 함수 본문은 옮겨 담음(동작 그대로) · 제품 코드 안 고침 · 검증완료: 시험 197 파일 전 1450 통과 · 13 건너뜀 · 26 빨강 → 후 1450 · 13 · 26(시험별 junit 대조 어긋남 0 · 빨강 26 은 전에도 빨강) · 공용 불러오기 쓰는 349 · 507-4 시험 9 통과 · 5 xfail 전 · 후 같음 · `npm run typecheck` 0. 못 옮김 목록: ① 전에도 빨강(낡은 가짜 모듈 — 옮기지 않음) `helper_323_9_save_redraw`(`import.meta` 못 읽음) · `helper_398_2_curve_input` · `helper_408_radius_downstream`(`ResizeObserver` 가짜 없음) · `helper_54_9_etc_pill`(`common_util_structure_catalog.js.ts` 못 찾음) ② 모양이 달라 공용 옵션에 안 맞음(손으로 따로) `helper_280_2_step_nav`(`import.meta.env.DEV` 글 바꿈) · `helper_298_3_page_dispose`(ES2022 · 파일 키 캐시) · `helper_322_0_golden`(파일 경로 가짜 맵) · `helper_345_4_corridor_worker`(`import.meta.url` 바꿈) · `helper_347_pipe_id_reconcile`(호출마다 진짜 모듈 목록) · `helper_427_1_follow_seat` · `helper_459_route_seat`(뿌리 기준 상대 경로 재귀) ③ 겹침 막음으로 뺌 `helper_346_2_pipeline_cross_page`(349 헬퍼가 씀) · 349 계열 · `helper_233_4_empty_click`(508-1a 몫).
- [x] 508-2 B05 · B06 — (B04 [자동 제안] 정리 = 510 으로) · 지움 표지 되살리기 단추 · 계산 자리 「서버」 3D 낡은 저장본 = 빈 화면 · 추천 창 [재계산]을 안내 줄에 붙이기 · 편집 중 여유 밖으로 끈 노선 등고선 즉시 다시 받기 · (자동 관 표시 · [추천 다시 셈] = 요구 315 안 함).
- 검증완료(sub4 · 요구 323 · 324 · 배정 = 남은 셋 · 지움 표지 단추는 배정 밖) — ① D3 = 서버: 낡은 저장본 = 옛 모형 세움 + 늦음 표시 · [3D 업데이트]만 서버 창구(/calc corridor.mesh · 라이브 계획선 샘플)가 지어 바꿔 끼움 · 같은 입력 다시 안 지음 · 실패 = 옛 모형 · 창 열 때 자동 안 지음 · both 그대로 ② [재계산] = 저장본 없음(409) 안내 줄 옆 · 칸 바꿈 뒤 종단 반영 옆 · 그 밖 숨김 ③ 놓은 뒤(잠잠 0.4 s) 범위 밖이면 편집 노선 bbox 로 잘린 도엽 다시 받음(서버 bbox · 열쇠 = 사본 지문 + 범위 · 여는 때도 통째 사본 안 받음 · 배수유역 범위 그대로) · 시험 test_508_2 넷 13 + 둘레(511 · 509 · 504 = 309_2 · 505_1 = 309_3 · 224_3 · 364_4 · 345_4 · 317 · 383_3 · 421) 통과 · 낡은 기대 셋(383_3 · 309_2 · 345_4) 고침 · typecheck 0 · Playwright 검증_sub4 셋 두 번 통과(옛 모형 22 조각 → 「서버에서 짓는 중…」 → 새 모형 · /calc 1 · 다시 0 / 다섯 갈래 숨김 · 수치지형도 409 안내 줄 옆 · 칸 바꿈 줄 / 끌어 놓기 → bbox 둘 0.13 + 3.8 MB · 끄는 동안 0) · 검증_sub4 등고선 = 라이다라 다시 받은 도엽은 하천중심선만 보임 · 판 · 3D 저장본 바이트 되돌림 · 파생 사본 storage/1/3/c725…/_derived/sheet_route 남김. 검증 대기.
- [x] 508-3 B07 · CAD (요구 325) — 사용자 확정: 레이어 합치기 진행 · 미리받기 유지(무거운 것 뒤 · 조용히 · 페이지 옮겨도 유지 · 돌아오면 바뀐 도면만 · 아직 못 받은 도면 = 받는 중 알림 · 그 도면에 머물면 받은 뒤 보여 줌 · 도면마다 상태값 · 횡단은 측점마다) · 평면도 · 유역 서버 저장본(도면 크기 · 표기 영역에 맞춰 최적화).
- [x] 508-3a LAYMRG Ctrl+Z 한 번에 도형 + 레이어 목록 — sub3. LAYDEL 도 같은 길 · Ctrl+Y 짝 · 검증 대기. 검증완료: vitest(layer-tools · state) 11 통과 · typecheck 0 · Playwright 8005/5178 CAD(/b07-cad)에서 LAYMRG · LAYDEL → Ctrl+Z → 층 목록 · 도형 층 처음대로 → Ctrl+Y 다시 합쳐짐 · 저장 안 함.
- [x] 508-3b · c 도면 상태값(지문) · 미리받기 · 평면도 · 유역 저장본 — sub2. 서버 `_Router_Support_Fingerprint.py`(지문 · 목록 API `fingerprint` · `stations` · 평면도 저장본 응답 글 그대로 · 지문 못 세면 목록 · 도면은 그대로) · 화면 `_Prefetch.ts`(페이지 밖) · 고른 도면 받는 동안 다른 탭 · 페이지로 옮김 · 받는 중 CAD 시계 없음(`beginLoading(false)`) · 받는 중 CAD 고침은 고른 탭에 안 묻힘 · 평면도 등고선 · 계류 0.1 mm 솎음 + 배경 좌표 1 µm(지형 6.7 → 4.9 MB · 유역 27.7 → 23.2 MB) · 값 꼴(4.0 = 4) · 종단 경고 글은 지문에서 뺌. 옛 판 자료는 첫 B06 [저장]이 모든 측점 설계에 새 칸을 붙여 한 번은 모든 장이 다시 받아짐(실제 자료 바뀜). 남은 빨강 `test_cad_host_tabs` 머리줄 = 508-1f `host-burger.css` 고침 뒤 낡은 기대(이번 고침 밖). 검증완료 — test_508_3_b07_fingerprint 11 · B07 둘레 · 506-3 · cad_host 254 통과 · typecheck 0 · Playwright 검증_sub2(되돌림): 미리받기 차례 = 가벼운 것 10 → 평면도 6 · B06 첫 측점 깎기 비탈 [저장] → B07 돌아옴 = 지문 바뀐 6 장만 다시 받음(횡단 = 그 장 · 측점 0 하나 · 전개도 · 사면 담은 평면도 넷) · 평면도 지형 첫 열기 1.3 ~ 4.4 s → 저장본 0.2 ~ 0.4 s · GET 이 지운 파일 0 · 안 받은 유역도 열기 = 「받는 중」 → 4.4 s 뒤 보임 · 못 받은 장 = 「다시 받기」(밝음 · 어두움) → 누르면 받음 · 506-3 [저장] 중 새 GET 0. 검증 대기.
- 계약: 지문 = sha1 앞 16자 · 파일 도장 = 8 MB 이하 내용 해시(경로 · 시각 · 크기로 기억) · 넘으면 시각:크기 · 공통 = 판 번호 · B07 엔진 코드 도장 · 도각(프로젝트 · 시스템) · 표제란 값 · B07 설정 파일(manifest 뺌 · plan_kinds) · 그 도면 manifest 칸 + 확정 저장본 도장 · 종단 = + 종단 내용 · 토적 = + 종단 + DB 유토 · 표준 횡단 = + DB 표준 설정 · 구조물 · 전개도 = + 종단 + 측점 상세 전부 + 시설 파일 · 횡단 장 = + 장(번호 · 측점 · 칸) + 측점 계획고 모음 · 측점 간격 + 측점 지문 모음(측점 = 장 입력 조각 · 종횡단 상세 그 측점 · 덧그림 범위) · 평면도 = + 종류 정의 · 장 번호 · 축척 + 노선 세계(노선 서명 · 좌표계 · 지표면 확정 값 · B03 입력 · B04 processed · models 도장 · 상세 유역 · 관 지점 · 곡선표 · 구조물 정본 · 종단 내용) + 사면 조각 고른 종류 = 그 장 측점(앞뒤 하나) 상세. 목록 API 항목마다 `fingerprint` · 횡단 장 `stations{측점: 지문}`. 저장본 = 평면도(plan_*) 응답 통째 `_derived/b07_plan_<도면 id>/<지문>.json` · 최근 2벌 · 같으면 읽기만 · 확정 저장본이면 안 씀 · 범위 = 지금 도곽 그대로 · 해상도 = 종이 0.1 mm 솎음(유역도 값을 계획평면도 등고선 · 계류에도). 화면 = 페이지 밖 모듈 `B07_DesignDetail_Prefetch.ts`(프로젝트 하나 · 담는 장 상한 40 · 차례 = 목록 차례 가벼운 것 → 평면도 끝 · 연 도면 맨 앞 · B07 저장 중 쉼 · 실패 = 한 번 다시 → 목록 단추 「다시 받기」 표시 · 목록 다시 받으면 지문 다른 것만 버리고 다시 차례).
- [x] 508-4 계산 자리 2단계 — 서버 계산 창구(/calc → run_calc) · 토량 · 구조물 셈 · 이월 6 묶음 열기(504 보고 7.2). → 완료 처리(요구 332 · 지금 유지 · 사용자가 시험하며 요청).
## 509. B05 분석 지형 수치지형도 = 화면 느림 (요구 316 · 분석 · 착수 = 사용자 지시 뒤)
- 정함(브레인): 근거 `docs/raw/조사/2026-10-21_요구316_수치지형도_느림.md` · 주범 = 도엽 등고선 통째(4,200 가닥 · 꼭짓점 145만 · 한 프레임 6.5~6.8만 · 87~93 % 화면 밖) · 둘째 = 고칠 때마다 지반고 서버 묻기(1~3 ms → 60~170 ms).
- 사용자 확정(요구 317): 도엽 등고선 두 번 받음 = 맞음(평면도 · 배수유역 범위 다름) · 배수유역도는 따로 범위를 줄임 · 509-2 동의 · 흠 고침 · 분석 지형(라이다 · 수치지형도) 고르기 = 추천 노선 창 안으로 · 지형마다 추천(예상노선 추적 · 영선 · 토공 최소 · 기울기 최소 · 비중) 전처리에 미리 셈 · [적용] = 그 지형 · 노선 · 초기화 기준.
- 정함(브레인 · 바꿀 수 있음): 배수유역도 범위 = 노선 교차 관으로 모이는 유역 바깥 + 여유(일꾼이 수치로 제안) · 수치지형도 고르기는 DB 모델 있을 때만(505-2 5d) · 그 지형 미리 셈 없으면 안내 + [재계산](사용자 셈) · 적용 뒤 B05 평면엔 지형 이름만(고르기 없음) · 수치지형도 격자는 적용 지형 = 수치지형도일 때만 받음.
- [x] 509-1 도엽 등고선을 노선 띠(300 m)로 잘라 둠 — 작음 · 확인: 프레임 꼭짓점 · 느린 PC 흉내 p90 · sub4.
- 검증완료(sub4) — 범위 = 저장 노선 bbox + 띠 300 + 여유 300 m · 서버 `_derived/sheet_route` · 초안 띠가 범위 밖 = 통째 사본 · 등고선 36.8 → 2.0 MB · 수치지형도 프레임 lineTo 맞춤 2.9만 → 1.1만 · 확대 8칸 9.8만 → 1.8만 · CPU 4 배 p90 37.5 → 16.6 ms · 띠 안 높이 글이 더 보임(잘린 가닥의 글 자리) · 시험 8 · 3bc710a63 · 검증 대기.
- [x] 509-2 수치지형도 격자(7.8 MB) 브라우저로 — 적용 지형 = 수치지형도일 때만 받음 · 509-5 와 같이 · sub3.
- 검증완료 — 분석 지형 = 설계 지형 하나 · [적용] 뒤 받아 둔 격자 버림 · 검증_sub3 수치지형도 적용 뒤 모델 641 격자 받음 · 노드 끌기 지반 POST 0 · 지반 단계 3.2 ms · 측점 지반 = 서버 수치지형도 값.
- [x] 509-3 공용 선 그리기 화면 밖 구간 건너뛰기(B04 지도 · 배수유역도도 빨라짐) — 중간 · sub4.
- 검증완료(sub4) — 같은 쪽 화면 밖 구간 끊음 · 돌린 화면 = 반 대각선 넓힘 · 무작위 500 가닥 보이는 구간 빠짐 0 · B04 지도 전 · 후 화면 차 5 · 1 픽셀(밝음 · 어두움) · 시험 7 · 3bc710a63 · 검증 대기.
- [x] 509-4 흠 — 수치지형도에서 Ctrl+Z 가 노드 끌기 안 되돌림 · 횡단 비탈 넓힘이 적용 지형과 상관없이 라이다 격자 · 509-5 와 같이 · sub3.
- 검증완료 — 분석 ≠ 설계 지형 상태가 없어져 둘 다 사라짐(넓힘 = ground 와 같은 설계 지형 격자) · 수치지형도 적용 뒤 끌기 → Ctrl+Z = 초안 없음 · 지반 처음 그대로.
- [x] 509-5 분석 지형 고르기 = 추천 노선 창 안 — 지형마다 추천 다섯 전처리 미리 셈 · 창 안 지형 바꿈 = 그 지형 저장본 · [적용] = 지형 · 노선 · 초기값 · B05 평면 지형 고르기 걷음 · 확인: 두 지형 추천이 다름 · 적용 지형대로 평면 · 종단 · 횡단 · sub3.
- 계약 — 저장본 자리 = 추천 저장본 폴더 그대로(키 지문에 지형 · request.terrain) · POST /route/initial terrain = 창 지형 · 기본 갈래는 지형 상관없이 저장본만(없으면 409 안내 + [재계산]) · [적용] = /route/replan as_initial + draft.terrain = 창 지형(서버는 as_initial 일 때만 지형 바꿈) · 손 [저장] 초안 terrain = null.
- 검증완료 — 미리 셈 151 s(라이다 · 수치지형도 다섯씩) · 창 열 갈래 모두 저장본 · 다섯 갈래 두 지형 값 다름 · 수치지형도 토공 최소 [적용] 32.8 s → 평면 「지형 수치지형도」 · stage1 sheet · 모델 641 확정 · 초기값 다시 섬 · 되돌림(storage 차이 0 · DB 행 같음).
- [x] 509-6 배수유역도 범위 따로 줄임 — 노선 교차 관 유역 바깥 + 여유 · 평면도 등고선 범위와 따로 · 확인: 받는 양 · 그리기 시간 전 · 후 · 배수유역 값 그대로 · sub4.
- 검증완료(sub4) — 범위 = 세부 유역 ∪ 줌아웃 한계(노선 2 배) + 여유 300 m · `_derived/sheet_drainage` · 등고선 36.8 → 2.0 MB · 프레임 lineTo 3.5만 → 0.8만 · CPU 4 배 p90 16.7 → 8.3 ms · 배수유역 · 관 파일 전 · 후 같음 · 좁고 긴 판은 맞춤 화면 위아래에 범위 끝이 보임 · 시험 5 · 3bc710a63 · 검증 대기.
## 510. 자동 관 제안 = B05 배수유역 영역 단추 (요구 320-2 · sub3 · Opus high)
- 사용자 확정(요구 320): 배수유역 범위 지금 유지 · 자동 관 지정 = B05 배수유역 기준 · 세류선 교차 지점 고르는 로직은 가져가되 구조물 만들기 · 노선 바뀜 따라감은 지금 방식(507-2 라벨 포함) · 자동 추가 단추 = B05 배수유역 영역 · 제안 뒤 사용자가 골라 넣음.
- 정함(브레인 · 바꿀 수 있음): 먼저 지금 로직 확인(B04 [자동 제안] · 관 자리 제안 D2 · B05 배수유역 판 · B05 · B06 관 넣기 길) · B04 [자동 제안] 단추는 B05 로 옮김(B04 전처리 첫 자동 관은 그대로).
- [x] 510-1 로직 확인 + 단추 — B05 배수유역 영역 [자동 제안] → 후보 표시 → 고른 것만 지금 관 넣기 길로 · 확인: 후보 = 세류선 교차 · 넣은 관 라벨 · 노선 바꿈 [저장] 따라감 · 지운 관 다시 안 생김.
- 로직 확인 — B04 화면엔 [자동 제안] 없음(관 지도 = 재계산 · 우클릭만) · 옛 [자동 제안] = B05 배수유역 칸(369 · 전체 자동 · 지정 포함 추가 = 관 목록 통째 바꿈 · 라벨 없음) · D2 관 자리 제안 = 간격 보충(흐름 세기 + 오목) · B04 첫 자동 관 = 세류선 교차 5 m 솎기(그대로) · 관 넣기 길 = 배수유역 패널 addPipe · 라벨은 화면이 모르고 저장 때 id 로 되붙던 것.
- 검증완료 — 서버 POST drainage/pipe-proposals(세류선 교차 + 분석이 지금 노선이면 간격 보충 · 상태 있는 관 · 지운 관 · 새) · 배수유역 칸 목록 + 점선 원 · 고른 것만 addPipe(교차 = 라벨) · 옛 두 방식 창 · 옛 제안 목록 관 자리 줄 걷음 · 시험 test_510 6 + 둘레(507_2 · 494_2 · 449 · 369 · 347 · 349 · 126 · 291_1 등) 통과(b05_structures_router 이관 5 = 옛 가짜 함수 모양 · 무관) · typecheck 0 · Playwright 검증_sub3: 관 지움 [저장] = 지움 표지 → [자동 제안] 11건(지운 교차 385 · 간격 보충 10) → 둘 고름 → 관 2(385 라벨 = 표지 그대로 · 지움 표지 걷힘) → 노선 끌기 [저장] 두 번 관 2→2→2(385→387→399 · 480→478→498 · 교차 13 m 옮음 · 새 관 0) · 다시 물으면 교차 = 있는 관 · 되돌림(storage 차이 0 · DB 행 같음 · 백업 지움). 검증 대기.
- [x] 510-2 서버 자동 관 옛 길 걷음(auto all · add) + 낡은 시험 다섯 맞춤 — 작음 · sub3.
- 검증완료 — 부르는 곳 0 확인(화면 · 서버 · B03 체인 · 시험) 뒤 걷음: `AUTO_MODES` · `build_detail`/`_build`/`_build_cached`/`_detail_key`/`_retag` 의 auto · `detail-basins` · `drainage/live` auto 칸 · `computeDetailBasins` 셋째 인자 · 전처리 첫 자동 관(세류선 교차) 그대로 · test_369 의 all/add 시험 걷고 기본·목록·낡음 셋 남김 · test_b05_structures_router 이관 5 = 가짜 함수가 (legacy, standing) 쌍 대신 목록만 줌(제품 코드 흠 아님 → 가짜를 쌍으로) · 둘레(510 · 507_2 · 494_2 · 449 · B04 배수 · 312 · 342_3 · 347 · 349 · 369 · b05_structures_router 등 22 파일) 두 번 138 통과 · typecheck 0. 검증 대기.
## 511. 계산 자리 끝까지 (요구 320-4 · 단계 A → B → C)
- 사용자 확정(요구 320): 지금 사용자가 고를 수 없음(45 중 2) → 단계적으로 끝까지 진행.
- 정함(브레인): A = 서버 계산 창구(늘 떠 있는 Node · 같은 TS) + ③ 토량 · 구조물 셈 · ④ 이월 · ⑧ 고정 브라우저(시험용) 열기(+12) · B = 472-4 ③ 짝 모으기(측점 · 지반 · 종단 · 관 세트 · 구조물 짝) 단계마다 열기(+26 · 계획 = 분석 에이전트) · C = 유토 배분 E2 TS 옮김(+1) · 배수유역 · 관 자리 제안 · 노선 추천 · 넓힘(DB 씀) 넷 = 서버만(브라우저에서 못 돎 · 까닭 글).
- 정함(브레인 · 511-A 물음): 「서버」 = 진짜 서버 값을 화면에 씀 · P7 · D4 = 서버 단계 · R2 · R4 · R8 · C7 = 끌기 중 브라우저 미리보기 · 놓을 때 서버 값 + 차이 · 시간 기록(크면 대조만) · E1 · R9 = 잠잠 400 ms 뒤 · F8 · F10 = 판만.
- [x] 511-A 서버 계산 창구 + 12 열기 — sub2 · 확인: 바꾼 묶음 = 서버 결과 = 브라우저 결과(거울) · 왕복 시간 표.
- 계약 — `POST /api/projects/{id}/calc` `{run, inputs}`(프로젝트 권한 · 본문 상한 · 호출량 = 미들웨어) → 늘 떠 있는 Node 하나(`design_calc_node.ts --serve` · 죽음 · 묶음 바뀜 = 다시 띄움) · 시험용 id = 등록부 `node:` 밖 따로(`TRIAL_IDS`).
- 「서버」 길 — 비동기 자리 = 서버 값만(F7 저장 노선 cross · C4 소단 사본 · P7 직선화 · D4 발자국 단계) · 동기 그리기 자리 = 잠잠 400 ms 뒤 서버 값으로 다시 그림(E1 유토곡선 · R9 열쇠 넘김 · F7 초안 면적) · 끌기 도구(R2 · R4 · R8 · C7) = 브라우저 값 + 놓은 뒤 서버 대조 · F8 · F10 = 브라우저 부름 0(판만).
- 기록 = `window.__aisloCalcServer.calls`(id · 브라우저 ms · 왕복 ms · Node ms · 같음) · 왕복 흉내 = `__aisloCalcServer.delayMs`.
- 시간 표(랩탑 5177 검증_sub2 · 중앙값 · 브라우저 ms → 왕복 ms 흉내 0 / 30 / 80 · 보낸 양) — F7 면적 1 → 155 / 246 / 140(830 KB) · E1 유토 0.1 → 105 / 212 / 203(843 KB) · C4 소단 0 → 19 / 83 / 113 · R9 넘김 0.2 → 63 / 52 / 137(12 KB) · D4 발자국 50 → 179 / 232 / 230(443 KB · Node 59~77) · R4 맞춤 0.7 → 42 / 50 / 105 · R8 갈아끼움 2 → 501 / 512 / 413(2.2 MB) · 늘 떠 있는 Node 1.4 MB 33 ms · 새 Node 110~170 ms · 서버 = 모든 묶음에서 느림(잠잠 400 ms 더함).
- 검증완료 — 시험 511-A 넷(창구 권한 403 · 413 · 400 · 떠 있는 Node = 파일 길 · 죽어도 다시 · 거울 ③ ④ ⑧ · 판 따라 길) + 둘레 1 001 통과(345_5b 1 실패 = CurveBar 글 · 이 작업 밖) · 화면 = 기본값 /calc 0 · 묶음 셋 server → 계획고 ▲ · 교각점 끌기 → 그 묶음 id 만 /calc · 답 전부 = 그 페이지 TS 값 · 판 바이트 · 감사 행 되돌림 · storage = 파생 haul 캐시 한 벌 바뀜만 · 화면 밖 = R2 손잡이 · P7 직선화 · C7 반폭(거울 시험만) · 검증 대기.
- [x] 511-B 짝 모으기 단계마다 열기 — 계획 = `docs/raw/조사/2026-10-22_요구320_계산자리_B단계.md` · 정함(브레인) = DTM 아닌 지표면 = 파이썬 길 남기고 그 줄 잠금 · F9 = 폼 기본값 도구로 재분류 · P1 폴백 파이썬 남김 · `/cross-design/preview` 걷음 · 기준값 다시 뜸 = B-2 끝에 차이 보고 판정.
- [x] /calc 파일 경로 막기(sub3) — 단계 격자 = `{model_id, smooth, design}` → 서버가 그 프로젝트 storage 안 DTM 격자 경로로 갈음(`dtm_grid_npz` · `read_surface_grid` 와 한 벌) · 경로 칸(`stages.grid.path` · `stations.grid`) = 400 · 창구 묶음 안 파일 읽기 = `gridAt` 하나(다른 id 경로 칸 없음 · `stations.sections` 는 이미 막음).
- 검증완료 — test_511_b_calc_path_guard 3(경로 칸 · 문자열 · ../ · 절대 경로 · 다른 프로젝트 모델 = 400 · Node 안 부름 · 모델 id = 서버 경로) + 511_a · 344_1 · 133_1 · 505_2 · 509_5 통과. 검증 대기.
- [x] B-1 단계 Node 입구 · 판 다섯 줄(511-A 뒤 · 창 1).
- 검증완료 — Node 단계 입구 `stage.route · follow · stations · profile · cross`(`design_calc_node_stages.ts` · 등록부 밖 `STAGE_IDS` · 창구가 받음 · 한 요청 = 묶음 한 바퀴 · DTM 격자 경로 기억 · 관 세션 장부 사본) · 페이지 follow 자리 맞춤 · cross 맥락 = `logic/design_pipeline_stage_inputs.ts`(페이지 693 → 659 · 빼기만) · 판 = 단계 다섯 줄 잠금(까닭 「짝 모으는 중 · B-n」) · F9 = 폼 기본값 · 기본값 바뀜 0(판 파일 그대로) · 화면(검증_sub2 · Playwright) = 노선 초안 둔 채 다시 열기 다섯 단계 0 차 · 저장 노선 넷 0 차(횡단은 페이지가 다시 셈 창구 = 파이썬 저장 설계 · 관 측점 면적 최대 5.07 ㎡ 차 · B-4 몫) · 단계 입구 끌림 11 파일(`plantedBase` 종단도 측점 표 · B-3 이 logic 으로) = 472-3 알려진 끌림에 올림 · 시험 test_511_b1 6 + 둘레(511_a · 309_2 · 349 · 472_3 · 346_1 · 365 · 384 · 415 · 451 · 457 · 472_5 · 472_6 · 505_2 · 509 등) 277 통과 · typecheck 0. 검증 대기.
- [x] B-2 측점 R5 R6 R7 F3 G4(창 A) · B-3 종단 P1~P5 P8(창 B · Alignment.ts 먼저 나눔) · B-4 횡단 G2 C1 C2 C3 C5 C6 F4 F5 F6(창 C) — 셋 동시.
- [x] B-2 측점(sub3) — 서버 측점 생성(`build_sections` · 모든 체인) = DTM 이면 늘 떠 있는 Node `stations.sections`(`B05_Profile_Sections_Generate.ts` = `buildStations` + `sectionsGround` · 측점 `key` 더함 · 파이썬은 머리만 · `B05_Profile_Engine_Sections_Node.py`) · 비DTM · Node 못 돌림 = 파이썬 `generate_sections` · 이월 열쇠 = 측점 `key`(없으면 파이썬 `station_keys`) · `stations.list` = 측점 목록 · 창구는 `stations.sections` 막음 · 등록부 R5 R6 R7 = node:stations.list · G4 = node:stations.sections · round6 = 십진 반올림 · 추천 저장본 지문에 TS · stations 줄 엶(기본 both · 「서버」 = 잠잠 뒤 서버 측점 · 정의는 창구가 붙임).
- 검증완료 — 고정 자료 Node 길 = 파이썬 길 0 차(다섯 갈래 · 측점 57) · 검증_sub3 사본 종단 · 횡단 파일 59 개 0 차 · 「종횡단 한 번」 중앙 파이썬 0.60 s → Node 0.65 s · 화면(검증_sub3 · Playwright) 측점 59 · 초안 61 = 서버 판 0 차(왕복 32~106 ms · Node 2~4 ms) · golden 넷 기준값 그대로(다시 뜸 없음) · KNOWN 그대로 = R7(성 1e-4 ㎡ 1 · 누가 0.01 ㎥ 4 · 10-17 정본 표본) · X2(336 곳 = 고정 자료 노선 3자리 · 4자리 노선이면 14 곳 ≤ 1e-4 ㎡ · 0.01 ㎥ = B-3 · B-4 몫) · W0 · typecheck 0. 검증 대기.
- [x] B-3 종단(sub4) — 종단 다시 셈(`rebuild_alignment_profile` · 일곱 곳 이름 그대로) · 1순위 첫 계획선 · 계획고 옮김 = 늘 떠 있는 Node `profile.base · profile.alignment · profile.carry`(`design_calc_node_profile.ts`) · 파이썬 = 입력 + 정본 꼴(`Engine_Grade_Node.alignment_record`) · 노선 [저장] 계획고 옮김 = 편집 옮김 + 꼭짓점 세움 Node 한 부름 · P1 2~4 순위 · 추천 엔진 짝 파이썬 남김 · TS 표본 격자 0.000001 m · Alignment.ts 700 → 630 + `_Edit` 100 · 기준표 logic(`Grade_Criteria` · X5) · plantedBase logic = Node 입구 끌림 11 걷힘 · 판 profile 줄 엶(기본값 both) · 「서버」 = 화면 묶음 planline · profile 이 창구 → Node(both = 단계 동기 그대로).
- 검증완료 — 정본 글 = 옛 파이썬 길과 같음(test_511_b3 9 · storage 종단 16 파일 첫 계획선 16/16 · 다시 셈 16/16) · 화면(검증_sub4 · Playwright) 판 both ↔ server 종단 값 같음 · 서버 부름 왕복 96~98 ms(Node 26~33 ms) · both 부름 0 · 노선 바뀐 [저장] 뒤 종단 정본 해시 = 옛 파이썬 = Node · 초안 대 저장 계획고 77 측점 최대 0.0000005 m · 「계획고 옮김」 같은 조건 전 1.0~1.2 s(중앙 1.05) → 후 0.5~0.9 s(중앙 0.85) · 셈 몫 0.14 → 0.03 s · 남은 몫 = DB 종단 행 grade_summary 갱신 대기 0.47~1.53 s(0.7 s 목표 미달 · 셈 밖) · 둘레 시험 502 + 판 화면 7 통과 · typecheck 0 · DB · storage 되돌림 같음. 검증 대기.
- [x] B-4 횡단(sub2) — 정함(브레인 · 물음 답) = DTM 이면 [저장] 횡단 한 바퀴 = Node 한 부름 · 비DTM = 파이썬 길 · 기본 설계 셋 = cross.design · GET 형상 = facility.attach · 늘 떠 있는 Node · preview 걷음 · 페이지 cross 서버 길(구조물 층까지 페이지와 같게) · 끝에 cross 줄 엶.
- 5.07 ㎡ 까닭 — 견준 층 차이(저장 설계 = 엔진 + 구조물 폐회로 층 · Node 단계 = 엔진만 · 층 얹으면 관 351 절 4.6024 · 성 3.307 같음 · 정본 = 저장 값) · 나머지 0.001~0.067 ㎡ = 지반 표본 출처(TS 격자 대 파이썬 표본 · G1 몫).
- [x] run_calc = 늘 떠 있는 Node.
- [x] 기본 설계 셋(체인 · 노선 저장 이월 · [측점 만들기] · GET 빈 측점 · B05 확정 역반영) = Node cross.design 묶음 + 시설 구간 TS.
- [x] /cross-design/preview 걷음(창구 · 스키마 · recompute_designs_for_alignment · 화면 폴백).
- [x] GET · 재생성 형상 얹기 = Node facility.attach.
- [x] [저장] 횡단 한 바퀴 = Node cross.enforce(DTM) · 비DTM = 파이썬 그대로.
- [x] 페이지 cross 서버 길 + cross 줄 엶.
- [x] 시험 · 시간 전후 · Playwright 검증_sub2 [저장] · [확정].
- 검증완료 — 거울 test_511_b4_cross_save_mirror 4(가짜 지형 · 넓힘 · 지표면 끝 · 포장 · 기울임 · 세월교 · 소단 · 정본 못 읽음 = 파이썬 길 대 Node 길 0 차) · 화면 test_511_b4_cross_server_browser 2(검증_sub2 · 판 both 대 server cross 출력 · 상세 설계 0 차 · 저장 노선 cross.refresh 535 ms · 초안 stage.cross 462 ms · Node 61~93 ms · 잠잠 400 포함) · 검증_sub2 [저장] 다시 셈 중앙 0.7 → 0.5 s(보정 몫 0.3 → 0.1) · [확정] 2.2 → 2.1 s · 화면 [저장] · [확정](→ B07) 0.9~1.0 s · 2.7 s · 계산 값 차 0(판 both · server 같음) · GET 형상 얹기 +5.6 ms · 둘레 시험 600 여 통과(글 읽는 시험 10 · 등록부 · 판 시험 기대 맞춤) · typecheck 0 · DB · storage 되돌림 차 0. 검증 대기.
- [x] B-5 노선 R1 R3 · F1 좌표 맞춤 · F3 남은 부름(창 A · Router_Replan.py 먼저 나눔).
- [x] 노선(sub3) — `Router_Replan.py` 688 → 612(폴리라인 파일 쓰기 = `B05_Profile_Route_Polyline_Write.py`) · 노선 저장 폴리라인(편집 갈래) = 늘 떠 있는 Node `route.polyline`(`buildEditedPolyline` + `nodeEdits` · 파이썬은 csv · 곡선표 반올림만 · 단순화 갈래 · Node 못 돌림 = 파이썬 짝) · 위반 글 = 파이썬 꼴(`fixed1`) · 저장 좌표 맞춤(F1) = Node `facility.follow` + fill(`fillStructureCoordinates` · 옛 좌표 지킴 · 0.1 mm · `pointAtChainage` 와 한 벌) · F3 남은 부름 = Node `stations.plan` · 등록부 R1 R3 F3 node: · 알려진 차 = 교각 딱 5° 배수 원호 점 ±1(브레인 승인).
- [x] 줄 엶 — route(「서버」 = 잠잠 뒤 `route.polyline`) · follow(끌기 도구 꼴 · 잠잠 뒤 창구가 저장 정본 맥락을 프로젝트 id 로 모아 Node route · follow 두 단계 · 곁 자료 다시 붙임 · 계획고 옮김 = 끌기 중 화면 입력 그대로) · sub4(B-3) 합침.
- 검증완료 — test_511_b5_route_node 22(노선 파일 Node = 파이썬 바이트 · 좌표 맞춤 · 측점 계획 · 맥락 · 두 단계 = 묶음 첫 바퀴 · 화면 셋) · 저장 노선 편집표 있는 6 벌 0 차 · 노선 저장 체인(검증_sub3 · 같은 노선 7 번씩) 중앙 파이썬 10.6 s · Node 11.2 s(쌍 차 중앙 −0.8 s · 다른 창 부하로 8.9~16.5 s) · 저장 뒤 정본 해시 0 차(측점 파일 차 = 정수 · 실수 꼴과 key 칸 = B-2 몫 · 수치 0) · 폴리라인 쓰기 +0.9 ms · 화면(검증_sub3 · Playwright · 저장 안 함) = route 초안 190 점 · 측점 61 0 차(27 ms) · follow 끌기 네 걸음 뒤 0 차(231 ms) · 둘레 540 통과 · typecheck 0. 실데이터 구조물 0 개(storage 전체) → 좌표 맞춤은 합성 열 갈래로만. 검증 대기.
- [x] B-6 정리 — 알려진 차 빈 목록 · 쓰는 곳 없는 파이썬 짝 걷음.
- 검증완료(sub2) — 걷음 = 옛 server-calc 묶음(`B06_Section_Server_Calc_Node.ts` 135 줄 · `build:server-calc` · Prebuild BUNDLE · 따로 한 커밋 210ff06de) · `common_util_excavation.py` 통째 · `carry_edits` · `seat_route_moved`(시험 헬퍼로) · `attach_underdrains` · `attach_wall_structures` · `load_wall_structures` · `tangent_elevation` · `dedupe_station_keys` · `loose_chainage` · 남는 짝 17 파일 머리 「남는 까닭」(DTM 아닌 지표면 · Node 못 부를 때 · 2~4 순위 폴백 · 추천 · B04 B07 B08) · 등록부 until 걷음 · C6 · F8 pair 맞춤 · golden KNOWN 셋(R7 표본 출처 · W0 · X2 입력 선 자릿수)은 짝 밖이라 남김(까닭 고침) · 계산 자리 창 45 줄 = 41 · 서버만 넷 · 옛 「짝 모으는 중」 글 걷음 · test_322_3_flow 빨강 고침 · 시험 97 파일 562 통과 · typecheck 0. 남은 것 = 472-3 KNOWN_PULLS(화면 기하 끌림 · 계산 짝 아님) · `common_util_route_polyline.py` 745 줄(전부터). 검증 대기.
- [x] 511-C 유토 배분 TS 옮김 · 남은 넷 = 서버만 까닭 글.
- 정함(사용자 · 요구 321) — 09-06 「배분 산식 브라우저 번들 밖」 풂 · 판 haul 줄 엶 · 기본값 server(지금 /haul-plan · 판 파일 바뀜 0) · both = 배분 모듈 dynamic import 해 브라우저 셈.
- 지금 정본은 파이썬이 아니었음 — /haul-plan · [저장] 정본 모두 같은 TS 를 server-calc 묶음 새 프로세스로 셈 → 둘 다 늘 떠 있는 Node 로(`haul.view` · `structure.layouts` · `masshaul.cumulative` · `haul.plan`) · 옛 묶음 = 시험 대조만(B-6 걷음 몫) · 서버만 G3 D1 D2 N1 = 줄마다 까닭 글.
- 검증완료 — 거울 test_511_c_haul_node 4(저장 유토곡선 프로젝트 일곱 × 문맥 넷 × 그림 · 수량 + 끝 경우 여섯 = 새 길 · 옛 묶음 · 브라우저 함수 0 차 · [저장] 정본 golden 문맥 셋 0 차) · 화면 test_511_c_haul_browser 2(검증_sub4 B05 계획고 ▲ · server = /haul-plan 1 · 배분 모듈 안 받음 · both = /haul-plan 0 · 모듈 받음 · 유토곡선 그림 같음 · 창 E2 열림 기본 꺼짐 · 서버만 넷 까닭 다름) · 시간 중앙 /haul-plan 셈 70 → 2 ms · [저장] 면적 · 유토곡선 셈 193 → 91 ms · 둘레 208 중 206 통과(309_2_browser R1 「B-5」 기대 = B-5 가 route 엶 뒤 안 맞춘 옛 기대 · 이 작업 밖) · typecheck 0 · 판 파일 바이트 · 감사 행 되돌림 · storage = 검증_sub4 파생 haul 캐시 한 벌 바뀜만. 검증 대기.
## 512. 배수유역도 [업데이트] · B07 유역도 등고선 · 700 줄 나눔 (요구 326)
- 사용자 확정: B07 유역도 등고선 기본 5 m · 그 도면 옵션 창에서 10 m 로만(1 m = B05 · B06 전용) · 배수유역도 점선 원 · [배관 배치 초기화] · [배관 삭제] · [유역 재분할] 지움 → [업데이트] 하나(누르면 늘 다시 셈 · 노선 바뀌어도 옛 그림 그대로 · 노선 바뀐 뒤 = 처음부터 셈) · 낡은 채 B06 → B07 = 확인 창 → 자동 업데이트 → 이동 · 700 줄 = 묶음으로 나눔.
- [x] 512-1 B07 유역도 등고선 5 m 기본 · 옵션 창 10 m(sub2) · 시험 test_cad_host_tabs 머리줄 낡음 고침 — 확인 = 유역도 크기 전후 · 옵션 바꿔 다시 받음.
- 검증완료 — 원인 = 1 m 아님(도엽 N3L 주곡선 5 m · 계곡선 25 m 그대로 · 등고선 층이 응답의 97 %) · 유역도 종류 `contour_interval_m` 5 기본 · 10(평면도 관리 모달 · 유역도일 때만 보임) · 지문 = 그 도면만(종류 목록 지문에서 간격 뺌 · 기본 종류 조각 차례 맞춤 → 파일로 내려도 지문 그대로) · 검증_sub2 유역도 23.17 → 11.91 MB · 5 → 10 → 5 = 받은 도면 plan_watershed 만 · 다른 15 장 지문 그대로 · 5 로 돌아오면 첫 지문 · 저장본 재사용(만든 시각 그대로) · 안 누르고 닫기 = 그대로 · 새로고침 · 어두움 확인 · test_512_1 3 · B07 평면 둘레 · test_cad_host_tabs(508-1f ☰ 자리 = 탭 줄 + 도구 줄 묶음으로 단언 고침) 75 통과 · typecheck 0 · 되돌림(plan_kinds 폴더 · 10 m 저장본 지움 · 백업 tmp/backup_512_1). 검증 대기.
- [x] 512-2 B05 배수유역 영역 [업데이트](sub3) — 확인 = 노선 바꿈 → 옛 그림 · [업데이트] → 노선 곁 빈 곳 없음 · 낡은 채 B06 [>] 확인 창. 뒤에 `ui_template_locale_b2.ts` 1031 줄 나눔.
- 검증완료 — 빈 곳 까닭 = 초안 노선으로 셈한 유역 위에 저장 노선선을 그림 → 답에 셈한 노선(`route_xy`)을 실어 그 선을 그림 · 시험 test_512_2 5 · test_349 9 · 둘레 330 여 통과 · typecheck 0 · 화면(5178 검증_sub3): 노선 초안 = 요청 0 · 단추 낡음 점 → [업데이트] 6.8 s 뒤 그림 바뀜(덮개 없음) · 노선 17 m 옮김 = 옛 길 노선 71.8 m 유역 밖 → 0 m · 유역 면적 합 441,332 ㎡ · 전체 유역 441,398 ㎡(빈 칸 38 ㎡ = 다각형 단순화) · 평면 그대로 [업데이트] 4.8 s 다시 셈 · 낡은 채 B06 [>] = 확인 창 → 업데이트 4.7 s → 확정 요청(검증 중 막음) · 낡지 않으면 확인 창 없음 · 취소 = 요청 0 · 밝음 · 어두움 점 보임 · 흐름 방향 저장본 두 벌 되돌림 · 사전 b2 1031 → 586 + b5 449(키 585 그대로) · Node 묶음 셋 다시 지음. 검증 대기.
- [x] 512-3 700 줄 나눔 파이썬(sub1) — `master_formula.py` 880 · `gen_md.py` 791 · `pum_md_tool.py` 766 · `common_util_route_polyline.py` 745. 검증완료 — 네 파일 모두 700 줄 아래(686·517·164·455) · 시험 통과(마스터 검사 · 품셈 md · 노선 폴리라인 묶음) · gen_md 색인·pum_md_tool 도움말·status·check 출력 전후 같음 · 시험 2건(test_m01_draft 둘 · test_430 편집기_배선)은 나누기 전부터 실패.
- [x] 512-4 700 줄 나눔 CSS(sub5) — CAD `App.css` 910 · `B01_Dashboard_UI_Style.css` 812 · `B06_Section_UI_Style_Cross.css` 743 · `B03_FileInput_UI_Style.css` 714.
- 검증 대기 · 검증완료 — 넷 모두 둘로 나눔(`App_Layers.css` · `_Style_Company.css` · `_Cross_Chart.css` · `_Style_Card.css`) · 원본 = 앞 파일 + 줄바꿈 하나 + 뒤 파일(prettier 가 파일 끝 빈 줄을 못 둠) · 부르는 곳 차례 그대로 · 규칙 목록(CSSOM) B01·B03·B06 동일 · CAD 빌드 규칙 160 개 차례·내용 동일 · 시험 13 개 중 3 개는 이 일과 무관한 옛 실패(`test_368_3` PLUS_OWNER_PREFIX · `test_cad_host_tabs` host-burger · `test_modal_top_and_add_word` M02_SO_Text).
- [x] 512-5 700 줄 나눔 TS(sub6) — `common_util_mass_haul_balance.ts` 842 → 467(+`_types` 157 · `_apply` 257) · `B05_Profile_UI_Profile_Table.ts` 702 → 548(+`_Table_Selected` 173). 검증완료: typecheck 통과 · 시험 40 통과(511_c_haul_node · 472_3 · unpruned · stone_deduction · 507_3) · 종단 표 전후 DOM 해시 같음 · 줄 대조 = `export` 만 늘음. 검증 대기.
- 정함(브레인): 배수유역 자동 모드(⚙) 걷음 그대로(요구 326-6 「[업데이트] 로만」) · 새로 연 페이지도 옛 그림 = 저장된 옛 유역 파일로 그림.
- [x] 512-6 노선 [저장] 뒤 새로 연 B05 = 저장된 옛 유역 그림 + 낡음 점 · B06 [>] 확인 창 → 업데이트 → 확정 → B07 끝까지(DB 행 백업 · 되돌림 · sub3).
- 검증완료 — 낡은 분석 GET = 마지막 [저장] 세부 유역 저장본(`04_detail_cache.pkl`)의 옛 유역 · 옛 노선선 + 관만 지금 노선 위(저장본 없음 · 깨짐 = 관 자리만) · 화면 코드 그대로 · test_512_6 3 · 둘레 23 통과 · typecheck 0 · 화면(5178 검증_sub3): 노선 안 바뀜 = 낡음 점 없음 · 평면 꼭짓점 끌기 → [저장] → 새로고침 = 옛 유역 1 개 44.22 ha · 옛 노선선(지금 노선과 9.5 m 차 · 노선 유역 밖 0 m) · [업데이트] 낡음 점 · 자동 제안 꺼짐 → [업데이트] = 지금 노선 0 m 차 · 노선 유역 밖 0 m · 노선 곁 30 m 빈 곳 32 ㎡(단순화) · 낡음 점 꺼짐 · B05 [>] = 확인 창 없이 B06 · B06 [>] = 확인 창 → [업데이트 뒤 이동] → live 5.0 s → 확정 22.7 s → B07 열림 · 분석 지문 = 지금 노선 · 다시 연 B05 낡음 점 없음 · 되돌림 DB 행 · storage 223 파일 해시 전후 같음(백업 tmp/sub3_5126). 검증 대기.
- [x] 512-7 장 끝 빨강 시험 가림(sub5) — 393_1 횡단 판(513-2 뒤 낡음) · 368_3 PLUS_OWNER_PREFIX · modal_top_and_add_word M02 「종류 더하기」 · m01_draft 둘 · 399 · 390_5 — 낡은 기대 = 시험 고침 · 제품 흠 = 보고 · 확인 = 그 시험들 통과.
- 검증완료 — 393_1 (판 안 열림 뜻으로 고침) · 368_3 (상수 위치 `common_util` 로) · M02 「종류 더하기」→「종류 추가」(제품 글자 하나) · m01_draft (진짜 폴더 `로직_자체.json` 안 복사) · 399 · 390_5 는 지금 통과 · 시험 71 통과 · typecheck 통과. 검증 대기.
## 513. 평면도 우클릭 구조물 메뉴 · B05 우측 패널 상태 유지 (요구 327)
- 사용자 확정: 평면도 우클릭 = 종단도와 같은 구조물 메뉴(추가 · 삭제 · 공용 로직) · 측점 고름이 패널을 열지 않음 — 안 보여도 내용은 갱신 · 열림 · 닫힘은 그대로(B05 ~ B06 좌측 구조물 칸도 같은 규칙).
- [x] 513-1 평면도 우클릭 구조물 메뉴(sub4) — 확인 = 평면에서 추가 · 삭제 → 종단 · 횡단 · [저장] 뒤 같음.
- 검증완료 — 검증_sub4 평면 우클릭 = 종단과 같은 항목(군 5 · 배관 위 「배관 삭제」) · 509 m 기타 · 배관 추가 → 종단 알약 · 좌측 B05 · B06 칸 25+9 · [저장] 뒤 새로고침 같음 · 평면 「배관 삭제」 → 저장 뒤 관 388 만 · 노선 밖 · 노드 위 메뉴 없음 · 어두움 OK · test_513_1 4 통과.
- [x] 513-2 B05 우측 패널 · B05 ~ B06 좌측 구조물 칸 열림 상태 유지(sub7) — 확인 = 닫힌 채 측점 고름 → 안 열림 · 열면 고른 측점 내용.
- 검증완료 — 횡단 판 닫힌 채 100 m 고름 = 닫힘 · 내용 860.0 · 열면 같은 내용 · 열린 채 120 m = 열림 · 859.3 · 「구조물 배치」 카드 · 좌측 패널 닫힌 채 우클릭 추가 · 고름 = 닫힘(B05 · B06) · 시험 67 통과 · typecheck 통과.
- [x] 513-3 관 아닌 구조물도 우클릭 삭제(종단 · 평면 공용 · sub4) — 지금 `onStructureRemove` 가 관만 · 확인 = 옹벽 · 측구 등 우클릭 삭제 → 종단 · 평면 · 횡단 · 좌측 칸 · [저장] 뒤 같음.
- 검증완료 — 검증_sub4 종단 우클릭 옹벽 시작 측점 · 평면 우클릭 맹암거 · B06 종단 흙막이 끝 측점 「구조물 삭제」 → 초안 · 측점선 · 알약 · 평면 마커 · 좌측 칸 · B06 카드(2+11 · 5+8 ~ 5+18 · 4+2 ~ 4+12 빠짐) 같음 · 저장 안 하고 B06 옮김 같음 · [저장] 뒤 새로고침 같음 · 관 「배관 삭제」 그대로 · 노드 19 그대로 · DB 행 · 파일 되돌림 · test_513_3 2 · 둘레 309 통과 · typecheck 0 · 덧: RouteEdit.ts 699 → 691 줄(상태줄 글 짓기 `_Render` · `_Contour` 로) · test_430 · test_399 통과.
## 514. 우클릭 삭제 일원화 · 낡은 유량 가림 · B07 유역도 가볍게 (요구 328)
- 사용자 확정: 알약만 있는 구조물(대피로 · 노출형 횡단수로 등)도 우클릭 삭제 · 우클릭 글 = 관 · 세월교 · BOX 모두 「구조물 삭제」 하나 · 유역도 낡은 동안 관 카드 유량 = 「낡음」 가림 · 유역도 가볍게 = B07 만(B05 · B06 결과 그대로).
- [x] 514-1 알약 구조물 우클릭 삭제 + 삭제 글 「구조물 삭제」 일원화(종단 · 평면 · B06 · sub4) — 확인 = 알약 구조물 우클릭 삭제 → 종단 · 평면 · 좌측 칸 · [저장] 뒤 같음 · 글 하나.
- 검증완료 — 검증_sub4 알약만 구조물 대피로 · 노출형 횡단수로 · 반사경 + 세월교 · BOX 넣고 [저장] → 종단 알약 우클릭 대피로 · 평면 마커 우클릭 노출형 횡단수로 · B06 알약 우클릭 반사경 · 세월교(관 길) 「구조물 삭제」 → 알약 · 평면 마커 · 좌측 칸 · 초안 · B06 카드(세월교 286 m 빠짐) 같음 · 저장 안 하고 B06 옮김 같음 · [저장] 뒤 새로고침 = 알약 BOX · 배관 · structures 0 · 관 383 · 388 · 횡단 117 · 우클릭 글 = 관 · 세월교 · BOX 측점선 · 알약 모두 「구조물 삭제」 · 어두움 메뉴 OK · DB 7표 · 파일 해시 되돌림(백업 tmp/sub4_5141) · test_514_1 3 · 513_1 4 · 513_3 2 · 둘레 83 · 472_3 통과 · typecheck 0 · test_440 3 빨강 = 옛 stub 빠짐(안 고친 파일 · 이 일 무관). 검증 대기.
- [x] 514-2 유역도 낡은 동안 관 카드 유량 「낡음」 가림(sub3) — 확인 = 노선 바꿈 → 가림 · [업데이트] → 값 · 안 낡으면 값.
- 검증완료 — 판정 한 곳(배수유역 판 낡음 → `setDrainageStale`) · 세월교 · 물넘이 칸 안내 「설계유량 낡음 — 배수유역도 [업데이트] 뒤 셈」 · 낡은 동안 월류 높이 자동값 안 채움 · B06 폼도 [업데이트] 뒤 새 유량(옛 빈틈) · 새 test_514_2 5 · 관련 시험 392 통과 · test_440 오류 3 = 옛 stub 빠짐(이 일 무관) · typecheck 0 · ORCA 검증_sub3: 안 낡음 「필요 수심 0.44 이상」 → 노선 점 끌기 → 「낡음」(B05 · B06 · 새로고침 뒤 · 밝음 · 어두움) → [업데이트] 8~13 s → 「필요 수심 0.44 이상」(B05 · B06) · 세션 되돌림 · 서버 관 정본 그대로. 검증 대기.
- [x] 514-3 B07 유역도 등고선 엔티티 가볍게(sub2) — 확인 = 유역도 MB 전후 · CAD 화면 같음 · B05 · B06 등고선 응답 해시 전후 같음.
- 검증완료 — 유역도 등고선 · 계류 = 폴리선 하나 + 꼭짓점 목록(자식 Line · UUID 없음 · CAD 가 읽을 때 선분으로 펼침 · DXF · 인쇄 PDF = 열린 선) · 검증_sub2 유역도 5 m 23.17 → 3.22 MB · 10 m 11.91 → 1.77 MB · 등고선 1501 · 계류 166 줄 · 꼭짓점 105,441 · 좌표 · id · 색 해시 전후 같음 · CAD 화면 같음 · 1761 개 · 고르기 1501 · 옮기기 1501 · 지우기 166 · DWG 내보내기 200(5.78 MB) · 새로고침 = 그대로 · B05 · B06 등고선 6 · 배수 3 응답 해시 전후 같음 · 엔진 도장 바뀜 = 한 번 다시 셈 · test_514_3 · vitest polyline-points-514-3 · 관련 시험 64 통과 · typecheck 0. 검증 대기
- [x] 514-4 전역 싱크 막힘 — test_508_2_browser 추천 창 「저장본 있는 갈래 없음」(512-3 지문 glob 넓힘 뒤 추천 저장본 낡음 판정인지) · 노선 크게 끌기 들쭉날쭉(sub4) — 확인 = 원인 한 줄 · 제품 흠이면 고침 · 그 시험 세 번 연속 통과.
- 검증완료 — 원인 = 지문 glob 아님(묶음 지문 같음 · 접근은 이미 엔진 지문 무시) · B05 · B06 [저장]이 손대지 않은 표준 횡단면 기본값을 종단 정본 options 에 실음 → 추천 키 꼬리 None ≠ 기본값 dict → 전처리 저장본 못 찾음(409) · 고침 = 프로젝트 접근이 「없음 = 기본값」 두 꼴 다 견줌(지금 꼴 먼저 · 추천 · 초기 종단 · `standard_forms` · Store 파일 그대로 = 엔진 지문 안 바뀜) · 고친 표준은 그대로 409 · 검증_sub4 다섯 갈래 409 → 저장본 · 검증_sub8(기본값 실림) 저장본 + 초기 종단 그대로 · 검증_sub3 = 옛 저장본이 지금 입력 어느 꼴과도 안 맞음(자료 탓 · 전처리 다시 하면 생김) · 끌기 들쭉날쭉 = 평면 보던 화면이 계정 설정(user_ui_prefs)에 남아 판마다 더 줄인 화면에서 시작(노선 2201 → 5516 m) + 둘째 도엽 4 초 안 못 옴 → 시작 전 그 열쇠 비움 · 끝나면 되돌림 · 둘 다 올 때까지 기다림 · test_508_2_browser 세 번 연속 3 통과(받은 양 · 노선 1787.2 m 같음) · 새 test_514_4 3 · 관련 시험 52 통과 · typecheck 0. 검증 대기
## 515. 요구 329 남은 시험 빨강 가림 B (sub3)
- [x] 지정 시험 단독 재현 · ① 낡은 기대 수정 / ② 지킴 시험 아닌 항목 삭제 / ③ 제품 흠 보고.
- [x] 바꾼 시험 파일 묶음 재실행 · 커밋 · push.
- 검증완료 — ① 23(구조물 명세 helper의 `logic/` 상대 불러오기·`baseType` 가짜 의존성, B09 안내 글, 대시보드 카드 범위·mount 가짜, M02 견본 관 값, 시트 번호 helper 기대) · ② 3(실제 사용자 마스터 값·전체 로직을 읽는 M01 둘, 실제 마스터 동력상하차기 값 한 건) · ③ 0. 지정 파일 열 개를 각각 재현하고 함께 `pytest` 실행 = 130 통과·경고 1(httpx deprecated) · 제품 코드·마스터 파일 안 고침.
## 516. 계산 등록부 거울 시험 메움 (요구 329 · sub1)
- [x] 지운 화면 시험을 가리키는 등록부 10행을 남은 지킴 시험과 대조.
- [x] 덮는 시험은 기존 이름으로 바꾸고, 없는 계산만 합성 자료 Node ↔ 파이썬 거울 시험 보강.
- [x] 등록부 시험 · 바꾼 거울 시험 · 실자료 표식 · typecheck 확인 뒤 커밋 · push.
- 검증완료 — 10행 모두 기존 지킴 시험이 덮어 지운 이름만 걷음 · R3은 `test_430_route_edit_rules`에 합성 자료 TS `nodeEdits` = 파이썬 `node_edits` 직접 대조 보강 · 등록부 + 관련 거울 12파일 89 통과 · 바꾼 시험 실자료 표식 0 · typecheck 0 · 등록부 다른 행 변경 없음.
## 517. B07 표준 횡단면도 = B06 저장값 (요구 330 · 331)
- 사용자 확정: B07 횡단은 B06 저장 정보로 그림 · B06 → B07 는 늘 저장 뒤라 B07 = 최신(알림 없음) · 추천 · 표준 횡단 지금 유지(추천 열쇠 흠 안 고침).
- [x] 517-1 B07 「표준 횡단면도」 = B06 이 저장 · 셈에 쓴 값 그대로(횡단경사 max → B06 값) · B07 이 그리는 노선(route_id)의 저장값만 읽음(최근 종단 행 아님) · 코덱스 — 확인 = B06 저장값 3% → B07 표준도 3% · 노선 둘 프로젝트에서 그리는 노선 값.
- 검증완료: 합성 3건과 B07 Router · 표준도 · 지문 관련 230건 통과(실패 0) · ruff format 완료.
## 518. 472-3 계산 · 그림 분리 · ⚠ 흠 넷 재현 · 433 확인 (요구 334 · 코덱스)
- 사용자 확정: 472-3 반영(구조물 모양 계산을 그림 파일에서 떼어 logic 으로 · 값 · 화면 그대로) · ⚠ 433-7 · 11 · 17 · 19 재현만 · 433 묶음 지금도 맞는지 확인만.
- [x] 518-1 검사 도구 헛잡음 15 + B05 Corridor 8 파일 계산 떼기(sub5) — 확인 = test_472_3 KNOWN 줄 줄어 통과 · golden · 거울 · typecheck.
- 검증완료 — 헬퍼 = 줄 머리 import 만 셈 · 헛잡음 6 줄 걷음(남은 ui_template_locale 10 = `Route_Carry_Patch` → `common_util_svg` 진짜 끌림 · 518-3 몫) · B05 8 줄 걷음 · 시험 110 통과 · 묶음 · 브라우저 새 판 = 옛 판 결과 같음 · 검증 대기.
- [x] 518-2 B06 Culvert 6 · Box 2 · Ford 3 계산 떼기(sub6) — 확인 = 같음.
- 검증완료 — logic 새 파일 9(Culvert · _Geom · _Extra · _Tiers · _Types · _Wire · Box_Geom · Ford_Geom · Ford_Pavement) · 그림 파일 5 는 그리기만 · 옛 순수 기하 6 파일 지움 · 부르는 쪽 import 줄만 · test_472_3 자기 11 줄 + 안 끌리게 된 Design_Surface 1 줄 걷음 · 시험 69 파일 384 통과 · typecheck · design-calc · corridor · b07-extent 묶음 · 브라우저 옛 판 ↔ 새 판 130 측점(관 16 · BOX 2 · 세월교 2 · 물넘이 65) 기하 JSON · SVG 같음 · 검증 대기.
- [x] 518-3 B06 Wall 2 · Revetment · Body_Guard · Design_Surface · Excavation · Structure_Layouts · Route_Carry_Patch 계산 떼기(sub7) — 확인 = 같음.
- 검증완료 — logic 새 파일 5(Cross_Wall_Geom · Cross_Wall_Hatch_Geom · Cross_Excavation_Geom · Cross_Design_Surface_Geom · Cross_Revetment_Geom) · logic 으로 옮김 3(Body_Guard → Cross_Body_Guard · Structure_Layouts · Route_Carry_Patch) · 그림 파일 5 는 그리기만 · `inferStationInterval` → common_util_station(ui_template_locale 끌림 10 줄 걷음 · SESSION_PULLS 빈 목록) · test_472_3 자기 5 줄 걷음 · Wall_Hatch · Excavation · Design_Surface 3 줄 = 518-2 전 Culvert · Box · Ford 그림 파일이 그리기 함수로 부름(518-2 합친 뒤 걷음) · origin/main_laptop_1 합침(B05 logic 이동 충돌 6 = import 줄 · 양쪽 살림) · 고친 대상 시험 294 통과 · 넓힌 시험 856 통과 · golden · typecheck 0 · design-calc · corridor · b07-extent 묶음 · 옛 판 ↔ 새 판 그림 대조(벽 84 · 터파기 168 · 물빼기 266 · 띠 12 · 포장층 22 · 기슭막이 배치 171) 2,018,121 바이트 같음 · 화면(검증_sub7 · B06) 횡단 63 SVG 1,619,983 바이트 지문 같음 · 검증 대기.
- [x] 518-4 ⚠ 433-7 · 433-11 · 433-17 · 433-19 지금도 생기는지 재현(sub2 · 고치지 않음) — 결과 = 흠마다 생김 / 안 생김 · 근거. → 검증완료(조사 · 브레인 PLAN 닫음).
- [x] 518-5 433 묶음 나머지 · 440-3 · 440-4 지금도 맞는지(sub3 · 고치지 않음) — 결과 = 줄마다 남음 / 고쳐짐 · 근거 → 브레인이 PLAN 닫음. → 검증완료(조사 · 브레인 PLAN 닫음).