From 35b50039d23ac36cf6e5917d8dd85e20ae3cdd6c Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 21 Oct 2026 06:04:56 +0900 Subject: [PATCH] =?UTF-8?q?chore(=EC=A1=B0=EC=82=AC):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=20309=20=EB=B6=84=EC=84=9D=20C2=20=E2=80=94=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=8C=20=EC=9E=A5=20=ED=9B=84=EB=B3=B4=20B07~B09=20=C2=B7?= =?UTF-8?q?=20CAD(=EB=82=A8=EC=9D=8C=2016=20=C2=B7=20=EB=81=9D=EB=82=A8=20?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- ...2026-10-21_요구309_C2_다음장_B07B09_CAD.md | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/raw/조사/2026-10-21_요구309_C2_다음장_B07B09_CAD.md diff --git a/docs/raw/조사/2026-10-21_요구309_C2_다음장_B07B09_CAD.md b/docs/raw/조사/2026-10-21_요구309_C2_다음장_B07B09_CAD.md new file mode 100644 index 000000000..a9483286e --- /dev/null +++ b/docs/raw/조사/2026-10-21_요구309_C2_다음장_B07B09_CAD.md @@ -0,0 +1,133 @@ +# 요구 309-3 C2 — 다음 장 후보 B07 · B08 · B09 · CAD (조사 · 코드 X) + +조사 = 클로드 에이전트(Opus · 읽기만) · 기준 `main_laptop_1` `d4da1f29d` · 서버 · 브라우저 실측 없음 · 단위 시험만. + +## 0. 요약 + +| 번호 | 조각 | 상태 | 크기 | 결정 필요 | +| --- | --- | --- | --- | --- | +| 1 | B07 미리받기 중 [저장] 30 s 끊김 | 남음 | 작음(화면) · 중간~큼(서버 캐시) | 예 — 미리받기 범위 · 서버 캐시 | +| 2 | CAD 자동백업 열쇠 = 도면 id 만 | 남음 | 작음 | 아니오 | +| 3-1 | 프로젝트 도각이 [초기화] 밖 | 남음 | 작음 | 예 | +| 3-2 | 풀린 drawings json 찌꺼기 | 남음(해 없음) | 작음 | 아니오 | +| 3-3 | 8001 고아 uvicorn | 끝남(지금 8001 듣는 것 없음) | — | — | +| 4-1 | B09 [인쇄 미리보기] 저장 없이 이동 | 남음 | 작음 | 예 | +| 4-2 | B08 로케일 [확정] 글 | 남음(안 쓰는 글 11) | 작음 | 아니오 | +| 5-1 | B07 확정 풀기 · 배치 · 축척 옛 단계 규칙 | 남음 | 작음 | 아니오 | +| 5-2 | `ui-button` 정의 없음 | 남음(B05 임시 횡단 창 단추 셋) | 작음 | 아니오 | +| 6-a | navigateDrawing · onNavigate 죽은 길 | 남음 | 작음 | 아니오 | +| 6-b | `state.ts` cad-host-save 클래스 | 남음 | 작음 | 아니오 | +| 6-c | 리본 누름 + Esc 초점 테두리 | 끝남 `161b0a9f7` | — | — | +| 6-d | 그립 · cloneKeepingLook vitest 빨강 | 코드 흠 아님 · 실행 설정 낡음 | 작음 | 아니오 | +| 6-e | M02 카드 미리보기 [DWG 불러오기] | 남음 | 작음 | 예 | +| 6-f | 특성 판 색 끌기 되돌리기 칸 연발 | 남음 | 작음 | 아니오 | +| 6-g | LAYMRG 제자리 고침 | 남음 | 작음~중간 | 아니오 | +| 6-h | 확정 도면 DWG 막힘 | 끝남(대상 없음 · `659baa775`) | — | — | +| 6-i | `dxf-clip.test.ts` 상대 경로 | 남음 | 작음 | 아니오 | +| 7-1 | 축척 주소 `drawing-scales` 꼴 | 남음(이름 꼴만) | 작음 | 예 — 추천 안 고침 | +| 7-2 | 축척 붉은 글 X · Y 높이 어긋남 | 끝남 `161b0a9f7` | — | — | +| 7-3 | 개발 잠금풀기 중 저장 = 잠김 | 남음(축척만 아님 · B07 쓰기 다섯 길) | 작음 | 아니오 | + +시험(읽기 전용): `test_298_2_stage_state` · `test_298_2_page_reset` · `test_280_5_b07_drawing_scales` 34 통과 · `test_298_2_b07_buttons` · `test_298_2_b08_b09_buttons` 14 통과 · CAD vitest(grips · clone-keeps-look · geometry · 별칭 설정) 28 통과 · `dxf-clip.test.ts` 뿌리 node 실행 통과 · openwebcad vitest 실행 ENOENT. + +## 1. B07 미리받기 중 [저장] 30 s 끊김 — 남음 + +- 화면 한도: `B07_DesignDetail_Api_Fetch.ts:141-157` `requestJson` = 모든 요청 30 s abort(`config/config_frontend.ts:17`) · 요청별 한도 칸 없음(B05 는 있음 `B05_Profile_Api_Fetch.ts:110`). +- 미리받기: 첫 장 뒤 `prefetchAllDrawings`(`_UI_Page.ts:256-268 · 570`) — 목록 전부 차례로 · 쉬는 조건 = 클릭(`loadInFlight` `:260`)만 · 저장 중엔 안 쉼. +- 서버 GET: 작도 = `asyncio.to_thread`(`_Router.py:356-370`) · 평면도 = `load_drainage_context` + `plan_kind_source`(지형 · 유역 배경) · 서버 캐시 = 프로세스 안 `lru_cache(8)` 하나(`_Router_Support_Basin.py:188`) · `--reload` 재시작마다 빔 · `_derived/` 없음. +- 원인(코드 근거 추정 · 실측 필요): + - 30 s 넘는 장 = 화면은 끊어도 서버 스레드는 끝까지 셈(취소 길 없음) → 미리받기가 다음 장을 또 보냄 → 버려진 작도 스레드 겹침 → GIL 다툼. + - PUT confirm 도 `_drawing_list`(횡단 파일 전부 읽음 · `_Router_Support.py:195-260`) · `_cross_sheet_plan` · 쓰기를 스레드로 → 같이 느려짐 → 30 s 넘으면 화면 abort · 서버는 끝까지 저장. + - 화면 = 「… — 이 화면에 머묾」(`_UI_Save.ts:105`) · ● 남음 → 저장 안 된 줄 앎 · 다시 [저장] = 같은 PUT 되풀이(덮어씀 · 해 없음). [>] · ☰ 이동도 같은 길(`saveEditedDrawings`). + - 덧: 30 s 넘는 장은 클릭으로도 늘 끊김 — 실패 = 캐시 지움(`_UI_Page.ts:242`) → 다음 클릭 다시 셈. +- 고칠 길: + - 1-A 작음(화면 한 묶음): `requestJson` 에 한도 칸(B05 꼴) → confirm PUT · 평면도 GET = `API_ANALYSIS_TIMEOUT_MS` · 저장 중 미리받기 쉼(`loadInFlight` 옆 한 칸) · abort 면 목록 다시 읽어 `confirmed` 로 판정(저장됐으면 ● 지움 · 「저장했습니다」). + - 1-B 결정: 미리받기에서 평면도 · 유역도 뺌(누를 때만) — 2026-08-30 사용자 지시 「모든 도면 미리받기」(`_UI_Page.ts:219-226`)와 갈림. + - 1-C 중간~큼(서버): 평면도 · 유역 원본 조각을 `_derived/` 파생 저장본으로(입력 지문 · 지침 5장) → 둘째부터 즉시 · 또는 작도를 프로세스 풀로. +- 위험: 1-A = B07 화면 세 파일 · `test_298_2_b07_buttons` 둘레. 1-C = 지문 입력(노선 · 종단 · 지형 · 평면도 종류 · 도각) 하나라도 빠지면 옛 그림. +- 먼저 잴 것: 장별 GET 시간 · 미리받기 중 PUT 시간 · 겹친 작도 스레드 수(서버 로그에 요청 시간 없음). + +## 2. CAD 자동백업 열쇠 = 도면 id 만 — 남음 + +- B07 본 화면 `cad.load(…, { guide })`(`_UI_Page.ts:300`) = `recoveryScope` 없음 → `meta.drawingId`(`openwebcad/src/integration/aislo-drawing-bridge.ts:196`) → 칸 `OPEN_WEB_CAD__RECOVERY__cross_s00320m`(`openwebcad/src/helpers/autosave.ts:20 · 41-43`) · 프로젝트 없음. +- [도각 편집] = meta null · scope 없음(`ui_template/cad_host/cad_host_frame_edit.ts:147 · 177`) → 맨 칸 `OPEN_WEB_CAD__RECOVERY`(모든 프로젝트 · 도각 공유). +- B07 [초기화]가 지금 도면 id 로 칸 지움(`_UI_Save.ts:164 · 184`) → 같은 id 의 남의 프로젝트 백업도 지움. +- 견줌: M02 = 층 · 프로젝트 붙임(`M02_MasterTemplete_Drawing.ts:69-75`) · B06 표 위 CAD = `b06-detail-note:{프로젝트}:{노선}:{측점}`(`B06_Section_UI_Cross_Detail_Cad.ts:349`). +- 해: A 프로젝트 백업을 B 에서 RECOVER → A 그림이 B 에 붙음 · B [초기화]가 A 백업 지움 · RECOVER 는 명령만(리본에 없음) → 드묾. +- 고칠 길: `_UI_Page.ts:300` 에 `recoveryScope: b07:{프로젝트}:{도면}` · 도각 편집 `sendLoad` 에 `b07-frame:{프로젝트}` · `_UI_Save.ts:184` 같은 열쇠 · 옛 칸 = 주인 모름 → 버림. +- 시험: `test_298_2_b07_buttons.py:86-87` 옛 열쇠 박음 → 고쳐 씀. + +## 3. B07 [초기화] 밖 · 찌꺼기 · 8001 + +- 3-1 남음 · 결정: `_Router_Reset.py:7-8 · 39-60` = 축척 · 배치 · 표식 · 평면도 종류만 · 프로젝트 도각(`{프로젝트}/templates/drawing/00_template_A1.json` · `_Engine_Template.py:292-313` · M02 층 모듈 `M02_Template_Layers.py:89`) 안 건드림 · [도각 편집] 안 [기본 도각으로](DELETE `frame-template` · `_Router_Frame.py:250-270` = `_initial/` 덮어씀) 따로 있음. + - 물음 = 요구 300 C3 「그 페이지 설정 모두 · M02 마스터 층 안 건드림」에서 프로젝트 도각이 B07 설정인가 M02 프로젝트 층인가. + - 넣음 = reset 에 `reset_project_template(root)` 한 줄 + 응답 `cleared` · 안 넣음 = 확인 창 글에 「도각 = [도각 편집 → 기본 도각으로]」 한 줄. +- 3-2 남음 · 해 없음: 풂 = `confirmed=False` 만(`_Router_Reset.py:41-47` · invalidate `_Router_Support.py:685-690`) · `drawings/{id}.json` · manifest `quantity_table(s)` 남음 · 읽는 곳 = `_read_drawing` 하나 · `confirmed` 일 때만(`_Router_Support.py:486-487`) · B08 은 안 읽음. 고칠 길 = 풀 때 json 지움(작음) · 미뤄도 됨. +- 3-3 끝남: 10-21 `Get-NetTCPConnection` = 8001 듣는 프로세스 없음 · 8001 = sub_laptop_1 자리(`OWNERS.md:21`) · 코드 흠 아님. + +## 4. B09 · B08 + +- 4-1 남음 · 결정: `B09_Estimation/draft/B09_Draft_Print_UI.ts:17-25` [인쇄 미리보기] = 바로 `navigateTo` · [>] 는 저장 → `estimation/complete` → `DRAFT.next`(`B09_Estimation_UI_Shell.ts:364-380`) · 미리보기는 세션 초안을 덮어 보임(`draft/B09_Draft_Print_Cost.ts:94`) → 보이는 값 = 화면 값 · 정본 미저장 · 단계 그대로. + - 가. 단추 = `saveChanged` 성공 뒤 이동 · 단계 그대로(셸이 `DRAFT` 에 저장 길 한 칸 넘김) — 추천. + - 나. 단추 지움([>] 가 같은 곳 · 단계 완료까지). + - 지킬 것: `test_302_1_print_frame.py` 글자 금지(셸에 「b09-print」 없음). +- 4-2 남음: `ui_template/ui_template_locale_b2.ts:569-581`(Side_Pending 「[확정]을 누르면…」 · Btn_Confirm · Confirm_Success · Confirm_Failed) + `:606-618`(Dev_* 7 · 「확정 없이 다음으로」) — 부르는 곳 0 · 박은 시험 0(git grep) · 옛 B08 [확정] · 개발 잠금풀기 판 잔재 → 지움. + +## 5. 옛 단계 규칙 · ui-button + +- 5-1 남음: 새 규칙 `mark_stage(save)`(`common_util_workflow_state.py:151-187` · 뒤 IN_PROGRESS 도 STALE) 대신 옛 `start_stage(4)`(뒤 COMPLETE 만 STALE) 셋 — `_Router.py:536`(⚙ 원본에서 다시 그리기 = 확정 풀기) · `:626`(횡단 배치 PUT) · `_Router_Support_Scale.py:179`(축척 PUT · 풀린 장 있을 때만) → B08 · B09 진행 중이 낡음으로 안 바뀜. + - 고칠 길 = 셋을 `mark_stage(str(project_id), 4, "save", cursor)` · `test_298_2_stage_state` 에 글 박음 한 칸(지금 confirm PUT 만 `:201-206`). +- 5-2 남음(B05 쪽): `B05_Profile_UI_Profile_CrossModal.ts:199-201` `class="ui-button"` 정의 없음 → 브라우저 기본 단추 · 공용 = `ui-btn ui-btn--ghost ui-btn--sm`(`ui_template_elements_styles.ts:17-80` · `ui_template_elements.ts:44-46`) · ui_checks 셋의 `.ui-button--danger` = 옛 대비 선택자(해 없음). + +## 6. B07 · CAD (PLAN 491-2) + +- 6-a 남음: `_UI_Page.ts:132`(`onNavigate`) · `:355-360`(`navigateDrawing`) · `ui_template/cad_host/cad_host.ts:24 · 71 · 346-347`(`aislo:b08:navigate`) — 486(`dce63ccc2`)이 CAD 쪽 이전 · 다음 단추와 메시지를 지움 → 받는 길만 남음. + - 함께 죽음: DesignMeta `hasPrev` · `hasNext`(`_UI_Page.ts:80-81 · 215-216` · `openwebcad/src/App.types.ts:55-56` · 읽는 곳 0). + - 고칠 길 = 다섯 곳 걷음 · 박은 시험 0. +- 6-b 남음: `openwebcad/src/state.ts:526-527` 클래스 토글만 · CSS 규칙 0(486 이 지움) · `setHostSave` · `isHostSave` 는 삶 → 토글 한 줄 지움. 덧: `M02_MasterTemplete_DrawingCard.ts:42-45` `.cad-titlebar` 숨김도 헛 선택자. +- 6-c 끝남 `161b0a9f7`: `Ribbon.tsx:208-211` nav 한 곳 마우스 누름만 blur · 495-1 화면 검증(누름 + Esc 뒤 `:focus-visible` 0 · Tab 초점 1). +- 6-d 코드 흠 아님: 별칭 설정으로 28 건 통과 · 별칭 없이 = `Failed to load url @flatten-js/core`(뿌리 node_modules 에 없음) · 추적 설정 `openwebcad/vitest.tmp.config.ts:19` include = 옛 `tmp/tests/cad/**` → `resources/tester/cad/**/*.test.ts` 한 줄. +- 6-e 남음 · 결정: `M02_MasterTemplete_DrawingCard.ts:42-45 · 92` 보기 · 고치기 카드 둘 다 `.cad-ribbon` 숨김 → 단추 안 보임. + - 고치기 카드 = 끌어 놓기(`dxf-clip-paste.ts:121-127`) · 명령 `IMPORT`(`registry.ts:126-133`)는 닿음 · 도움말 `DRAWING_KEYS` 엔 안 적힘 · 보기 카드 = 읽기 전용 막이(`dxf-clip-paste.ts:74-78`) 정상. + - 물음 = 카드에서도 DWG 받을지(495-2 「CAD [DWG 불러오기] 한 길」) · 둠 = 도움말 한 줄 · 안 둠 = 491-2 에서 걷음. +- 6-f 남음: `openwebcad/src/components/PropertiesEditor.tsx:45-55` 색 칸 onChange 마다 `restyle(…, track=true)`(`helpers/selection-style.ts:87-100`) = 끄는 동안 되돌리기 칸 연발 · 리본 색 칸은 `paintNowCommitLater`(`RibbonWidgets.tsx:39-47`) 한 칸. + - 고칠 길 = 그 함수를 `selection-style.ts` 로 옮겨 같이 씀. +- 6-g 남음: `openwebcad/src/tools/utility/layer-tools.ts:226-228` 원본 개체 `layerId` 를 제자리에서 바꾼 뒤 `setEntities(…, true)` → 되돌리기 칸이 같은 참조(`state.ts:351-355`) → Ctrl+Z 해도 그대로 · 레이어 목록 지움은 되돌리기 밖(LAYDEL `:245-246` 같은 처지). + - 고칠 길 = `restyle` 사본 길 · 레이어 목록도 같은 칸에 넣을지 함께(AutoCAD = 둘 다 되돌림). +- 6-h 끝남: 484(`659baa775`)부터 B07 늘 `confirmed: false`(`_UI_Page.ts:213`) → 읽기 전용 안 됨 → 막을 대상 없음 · 남은 막이 = 읽기 전용용(B07 평면 미리보기 · M02 보기 층). +- 6-i 남음: `resources/tester/cad/dxf-clip.test.ts:13` cwd 기준 경로 · vitest 묶음 아닌 node 스크립트 → 뿌리 실행 통과 · openwebcad vitest = ENOENT · 고칠 길 = `new URL('../fixtures/…', import.meta.url)` 한 줄 · 6-d include 에서 빼거나 함께. + +## 7. 축척 · 개발 잠금풀기 (PLAN 491-3) + +- 7-1 남음(이름 꼴만): `_Router_Support_Scale.py:146 · 158` `/api/projects/{id}/drawing-scales` = 횡단 배치 `/cross-layout`(`_Router.py:598 · 605`)와 같은 꼴 · `/design-drawings/` 밑 아님 · 부르는 곳 `_Api_Fetch.ts:244-258` · `test_280_5_b07_drawing_scales.py` · 기능 흠 없음 · 바꾸면 두 주소 같이 → 추천 안 고침. +- 7-2 끝남 `161b0a9f7`: `_UI_Settings_Scale.ts:119-133` 칸 밑 오류 숨김 + 줄 아래 알림 한 줄 · `_UI_Style.css:525-533` · 495-1 검증 X · Y 높이 30 · 30. +- 7-3 남음 · 범위 넓음: + - 우회 = 단계 4 `message` 의 `DEV_UNLOCK:` 표식(`common_util_dev_unlock.py:40 · 145-160`)을 `_confirmed_source` 가 봄(`_Router.py:104-106`). + - `start_stage` 가 `message = NULL`(`common_util_workflow_state.py:61`) → B07 쓰기 다섯 길 모두 표식 지움 — 장 [저장] `_Router.py:473` · 확정 풀기 `:536` · 배치 `:626` · 축척 `_Router_Support_Scale.py:179` · [초기화] `_Router_Reset.py:82` → 다음 GET 409 「B06 종·횡단 확정 후…」. + - 운영 영향 없음(개발 전용) · B08 · B09 `mark_stage(save)` 도 같은 뿌리. + - 고칠 길 = 공용 `start_stage` 한 곳 — `message = CASE WHEN message LIKE 'DEV_UNLOCK:%' THEN message ELSE NULL END`(B05~B09 함께 덮음). + - 위험 = 되돌리기(`relock_stages`)가 적어 둔 옛 상태로 = 그 사이 진행 덮음(개발 전용 · 지금과 같음). + - 시험 = 가짜 커서로 `start_stage` 표식 남김 한 칸. + +## 8. 묶음 제안 + +| 묶음 | 조각 | 파일 | 크기 | +| --- | --- | --- | --- | +| 가. B07 저장 길 | 1-A · 2 · 5-1 · 7-3 | `_Api_Fetch.ts` · `_UI_Page.ts` · `_UI_Save.ts` · `_Router.py` · `_Router_Support_Scale.py` · `common_util_workflow_state.py` | 작음~중간 · 한 창 | +| 나. 죽은 길 걷음 | 6-a · 6-b · 4-2 · 5-2 · 3-2 | `_UI_Page.ts` · `cad_host.ts` · `state.ts` · `App.types.ts` · 로케일 · `CrossModal.ts` · `_Router_Reset.py` | 작음 · CAD 빌드 한 번 | +| 다. CAD 되돌리기 · 시험 설정 | 6-f · 6-g · 6-d · 6-i | `PropertiesEditor.tsx` · `selection-style.ts` · `RibbonWidgets.tsx` · `layer-tools.ts` · `vitest.tmp.config.ts` · `dxf-clip.test.ts` | 작음~중간 · CAD 빌드 | +| 라. 결정 뒤 | 1-B · 1-C · 3-1 · 4-1 · 6-e · 7-1 | 결정마다 | 1-C 만 중간~큼 | + +- 가 · 나 둘 다 `_UI_Page.ts` → 같은 창 또는 차례. +- 장부 정리만: 3-3 · 6-c · 6-h · 7-2 = PLAN 491-2 · 491-3 에서 걷음. + +## 9. 사용자 결정 필요 + +| # | 물음 | 갈래 | 추천 | +| --- | --- | --- | --- | +| E1 | B07 미리받기 범위(1-B) | 가. 지금대로 전부 / 나. 평면도 · 유역도는 누를 때만 | 1-A · 1-C 뒤 다시 봄 — 1-C 되면 가 그대로 | +| E2 | 평면도 · 유역 서버 파생 저장본(1-C) | 함 / 미룸 | 실측(장별 시간) 뒤 정함 | +| E3 | 프로젝트 도각 [초기화] 포함(3-1) | 넣음 / 안 넣음(확인 창 글로 안내) | 안 넣음 — M02 프로젝트 층 · [기본 도각으로] 따로 있음 | +| E4 | B09 [인쇄 미리보기](4-1) | 가. 저장 뒤 이동 · 단계 그대로 / 나. 단추 지움 | 가 | +| E5 | M02 카드 [DWG 불러오기](6-e) | 둠(도움말 한 줄) / 안 둠 | 둠 — 고치기 카드엔 이미 닿음 | +| E6 | 축척 주소 이름(7-1) | 그대로 / `/design-drawings/` 밑으로 | 그대로 |