chore(조사): 요구 309 분석 C3 — 다음 장 후보 서버 · 시험 · 기반(여섯 모두 남음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 06:05:47 +09:00
co-authored by Claude Opus 5.5
parent 35b50039d2
commit 801d31909a
@@ -0,0 +1,101 @@
# 요구 309-3 C3 — 다음 장 후보 · 서버 · 시험 · 개발 기반
- 기준 판 `main_laptop_1` d4da1f29d · 코드 · DB · storage · git 손대지 않음 · 단위 시험만 하나씩(live · DB 쓰는 시험 안 돌림).
- 근거 = PLAN 491-3 · 491-4.
## 요약
| 번호 | 후보 | 남음/끝남 | 크기 | 결정 필요 |
|---|---|---|---|---|
| 1-1 | `test_b06_draft_pipe_replay` 빨강 | 남음 · 시험 낡음 | 한 줄 | 없음 |
| 1-2 | `test_269_panel_form` 빨강 | 남음 · 시험 낡음 | 한 줄 | 없음 |
| 1-3 | `test_472_6_route_save` live = 공유 실DB | 남음 | 작음(켜는 표식) ~ 중간(시험 전용 프로젝트) | 있음 — 길 고름 |
| 1-4 | `dxf-clip.test.ts` openwebcad 에서 빨강 | 남음 · 같은 꼴 셋 더 | 작음 | 없음 |
| 1-5 | 시험 헬퍼 가짜 모듈 낡음 | 남음 · 구조 문제 | 큼(198 벌) · 점진 | 있음 — 공용 로더 갈래 |
| 2 | 개발 서버가 시험 · tmp `.py` 에도 다시 읽음 | 남음 · 원인 확정 | 작음(인자 하나) | 없음 · 서버 다시 켜는 때만 |
| 3 | `main.py` 807줄 | 남음 | 작음 ~ 중간 | 없음(옮길 자리만) |
| 4 | 커밋 제목 앞 BOM | 남음 · `.claude` 스크립트 아님 | 한 줄 | 있음 — 지침 · 훅 |
| 5 | 검증_sub7 없어 349-0 · 356-4 늘 건너뜀 | 남음 · 12 파일 | 작음 | 있음 — 픽스처 · 프로젝트 |
| 6 | orca 가 select 위 휠 못 쏨 | 남음 · 안 써 본 길 있음 | 한 번 시도 | 있음 — 할지 말지 |
## 1. 빨강 시험
### 1-1 `test_b06_draft_pipe_replay.py` — 시험 낡음
- 지금: 1 실패 · 동작 단언(월류 폭 3.5 · 관경 1.2 · 측점 · 기슭막이) 모두 통과 · 배선 문자열 단언만 빨강 — `resources/tester/test_b06_draft_pipe_replay.py:45`.
- 원인: 482-1(4da510f6d)이 부름을 `await withDraftShapes(detail, projectId, false, frame);` 로 바꿈 — `B06_Section/B06_Section_Section_Store.ts:103`. 시험은 옛 `(detail, projectId)` 글을 찾음.
- 고칠 길: 단언 글을 새 부름으로. 코드 흠 아님.
### 1-2 `test_269_panel_form.py` — 시험 낡음
- 지금: 9 중 1 실패 `test_공용_양식_칸_라벨_단추_규칙` — 선택자 `.ui-panel-form .ui-btn:not(.ui-help-btn)` 못 찾음(`test_269_panel_form.py:60`).
- 원인: 481-1(d593075ea)이 이웃 단계 단추를 빼려 `:not(.ui-help-btn, .ui-step-nav-btn)` 로 넓힘 — `ui_template/ui_template_overlay.css:472`. 값(padding · radius · 글자) 그대로.
- 고칠 길: 시험 선택자 글만 새 꼴로.
### 1-3 `test_472_6_route_save.py` live — 공유 실DB 씀
- 지금: ④ 넷(`:301` · `:310` · `:345` · `:418`)이 검증_sub8 (`:155`) DB 행을 실제로 씀 → 끝에 `restore_rows` 로 되돌림. storage 는 492 뒤 임시 사본(`helper_temp_storage.py`) · DB 는 그대로 공유. `test_472_6_design_save.py:31` 도 같은 꼴.
- 위험: 시험 도중 다른 창 · 사용자가 같은 프로젝트를 보면 새 노선 행이 잠깐 보임 · 시험이 죽으면(타임아웃 · 강제 종료) 되돌림 못 함. 10-19 14:26 · 14:28 노선 513 · 522 가 이 시험 짓으로 추정(`2026-10-20_요구283_구조물찌꺼기_검증sub8.md` 2장) · 491-3 「검증_sub8 노선을 누가 다시 확정」 과 같은 줄기일 수 있음(미확인). 491-4 「묶어 돌리면 가끔 실패」 도 공유 DB 겹침이 후보(미확인).
- 고칠 길: ① 켜는 표식 — live 는 환경 변수(예 `AISLO_LIVE_DB=1`)가 있을 때만 · 장 시험 · 묶음에선 건너뜀(작음) ② 시험 전용 프로젝트 하나를 따로 둠(중간 · DB 행 · storage 하나 더) ③ 시험 DB 따로(큼).
- 결정: ① 만 · ① + ② 중 고름.
### 1-4 `resources/tester/cad/dxf-clip.test.ts` — 실행 자리 탓
- 지금: 저장소 뿌리에서 `node --experimental-strip-types` = 통과 · openwebcad 안에서(`vitest run --dir ../../resources/tester/cad dxf-clip`) = `ENOENT …\openwebcad\resources\tester\fixtures\b07_webclip_sample.dxf`.
- 원인: 픽스처를 cwd 상대 경로로 읽음(`dxf-clip.test.ts:13`). 덧 — 이 파일은 `describe` · `it` 없는 node 꼴이라 경로를 고쳐도 vitest 는 「No test suite found」 로 빨강. 같은 꼴 셋 더: `table-from-drawing` · `theme-auto-color` · `random-uuid-polyfill`(`table-from-drawing` vitest 실행 = No test suite found 확인).
- 고칠 길: 경로 = `new URL('../fixtures/b07_webclip_sample.dxf', import.meta.url)`(이웃 `prompt-frame.test.ts:424-425` 꼴) · node 꼴 넷은 vitest 가 안 줍게 이름을 `*.node.ts` 류로 바꾸거나 `test()` 로 감쌈.
### 1-5 옛 시험 헬퍼 가짜 모듈 낡음
- 지금: `resources/tester/helper_*.cjs` 291 중 198 이 `function loadTs` 를 저마다 베껴 가짐 · 공용 로더 `helper_ts_cjs_load.cjs` 를 쓰는 `.cjs` 헬퍼 0 · `design_store.ts` 를 손 가짜로 막는 헬퍼 26.
- 482 예: `helper_271_detail_notify.cjs:139` 의 가짜 가게 = `subscribe` 만 · 482-1 이 `useDesignStore(...).get("routeDraft")` 를 쓰자 그 시험이 깨짐 → f27250325 가 제품 코드를 `readState("route-draft", …)` 로 바꿔 가짜에 맞춤(시험이 코드를 끌고 감).
- 원인: 가짜가 헬퍼마다 따로 · 진짜 모듈이 새 export · import 를 늘리면 어디서 낡았는지 안 보임.
- 고칠 길: ① 공용 로더 하나에 공용 가짜(가게 · `@ui/` · storage)를 모으고 깨질 때마다 그 헬퍼만 옮김(점진) ② 진짜 모듈을 vite ssr 로 묶어 돌리는 472-6 꼴(`test_472_6_route_save.py:55` 근처 `out` 픽스처)로 옮김 — 가짜 자체가 줆 · 느림.
- 결정: 갈래(① · ②) · 한 번에 옮길지 깨질 때마다일지.
## 2. 개발 서버가 다시 읽음
- 지금: 감시 범위 = **저장소 뿌리 통째**. `main.py:699-731` `_reload_dirs` 15 폴더는 실제로 안 쓰임.
- 원인: uvicorn 0.24.0 + watchfiles 1.2.0 → `WatchFilesReload` 가 cwd 아래 폴더를 버리고 cwd 를 넣음 — `venv/Lib/site-packages/uvicorn/supervisors/watchfilesreload.py:69-72`. 걸러냄은 `*.py` 포함 · `.*` `.py[cod]` 만 뺌 → `resources/tester` · `tmp` · `venv` · `docs` · `.claude` 의 `.py` 가 다 다시 읽게 함. 로그의 「Will watch … A06_Login …」(`tmp/server.log:967413`)는 겉말뿐 · 바로 뒤 `:968774` = `resources\tester\…py` 로 Reloading.
- 실측(로그 전체): 메인 2,906 번 중 모듈 아닌 것만으로 1,100 안팎 — resources 979 · tmp 69 · docs 37 · venv 9 · .claude 2. 서브 여덟 = 다시 읽음의 35 ~ 58 % 가 resources · tmp(sub1 1,749 / 3,654 · sub4 1,066 / 1,917).
- 위험: 합치기 · 시험 파일 들어옴 · 분석 창 `tmp/*.py` 쓰기마다 워커 `terminate()` → 워커 안 작업이 끊김. B04 전처리 · 재확정 체인은 워커 안 스레드 · 태스크(`B04_PreProcess_Router.py:134` `to_thread` · `:265` `create_task`).
- 고칠 길: `uvicorn.run` 에 `reload_excludes` — **절대 경로**로(`str(root / n)` · n = `_RELOAD_SKIP` 의 있는 폴더 + `.claude` · `old_code`). 상대 이름(`"resources"`)은 안 먹음 — uvicorn `FileFilter` 가 상대 Path 를 절대 경로 부모와 견줘 늘 거짓(`watchfilesreload.py:32` · `:47`). 읽기 전용 확인: 상대 = `resources/tester/x.py` 참(다시 읽음) · 절대 = 거짓 · `B05_Profile` · `B07_DesignDetail` · `main.py` 는 그대로 참.
- 덧: B07(openwebcad 아래 node_modules 로 `_reload_dirs` 에서 빠짐)은 지금 뿌리 감시 덕에 우연히 다시 읽음 — 위 고침은 B07 를 빼지 않으므로 그대로. 서버가 resources · migrations · db_management · ui_template 파이썬을 import 하는 곳 없음(확인).
- 크기: 한두 줄 + `main.py` 머리 주석(「main.py · config 는 손으로」 → 실제로는 다시 읽음) 바로잡기.
- 위험: `main.py` 고침 자체가 메인 서버를 한 번 다시 띄움 · 서브는 싱크로 받을 때 한 번씩 → B04 등 돌지 않을 때.
## 3. `main.py` 807줄
- 지금: 807줄(규칙 700).
- 나눌 길: 개발 전용 두 덩이를 새 파일 하나(예 `config/config_dev_server.py`)로 — 프런트 개발 서버 띄움 · 끔 `main.py:128-311`(약 185줄 · `build_frontend` · `serve_frontend_dev` · `stop_frontend_dev` · 포트 정리) + 리로드 `main.py:696-790`(약 95줄 · `_reload_dirs` · `_RELOAD_SKIP` · `_patch_windows_reload`) → 약 530줄. `_reload_dirs` 의 `Path(__file__).parent` 는 저장소 뿌리로 바꿔야 함.
- 걸림: 시험이 `main.py` 글을 읽는 곳 = 라우터 등록 줄(`test_298_2_page_reset.py:111` 등) · 옮길 덩이는 안 읽음. `test_73_16_project_gone.py:75` 는 `import main` — 공개 이름 그대로면 무탈.
- 2 와 같이 하면 서버 다시 켬 한 번으로 끝.
## 4. 커밋 제목 앞 BOM
- 지금: 최근 3,000 커밋 중 31 개 제목이 `EF BB BF` 로 시작(10-05 ~ 10-19 · 예 8c5312434 `feat(485-1 B07 축척)`).
- 원인: `.claude/*.ps1` 아님 — 메시지 파일을 쓰는 스크립트 없음(`git-autopush.ps1:71` 은 `-m`). 창이 PowerShell 5.1 에서 `Out-File` · `Set-Content -Encoding utf8` 로 메시지 파일을 써서 BOM 이 붙고 `git commit -F` 가 그대로 실음. 증거: `C:/Aislo_wt/sub_laptop_8/tmp/485_msg.txt` 머리 BOM = 8c5312434 제목 · sub2 `tmp/msg27·28·30.txt` · sub4 `tmp/r419/msg1.txt` · sub7 `tmp/spreadsheet_d/msg12.txt` 도 BOM. 훅 없음(`core.hooksPath` 비어 있음).
- 해: `git log --grep "^feat"` · 제목 파싱이 놓침 · 눈엔 안 보임. 옛 31 개는 이력 재작성 금지라 그대로.
- 고칠 길: ① 지침 한 줄 「메시지 파일은 Write 도구로 · PowerShell Out-File 금지」(CLAUDE.md · AGENTS.md — 사용자 몫) ② `commit-msg` 훅으로 첫 BOM 걷음(열세 폴더 훅 설정 = `.claude` 스크립트 손봄 — 사용자 몫).
- 결정: ① · ② 고름.
## 5. 검증_sub7 storage 없어 늘 건너뜀
- 지금: `test_356_4_undo_grade.py` 4 건너뜀 · `test_349_0q_undo_echo.py` 3 건너뜀(「검증_sub7 없음」 확인).
- 원인: 11 파일이 옛 검증_sub7 경로 `storage/1/3/6d3b2812-…` 를 박아 둠(`test_349_0d_follow_store.py:38` · `test_349_0q_undo_echo.py:36` · 349-0g · 0k · 0l · 0o · 0s · 0u 둘 · `test_349_pipeline_once` · `test_346_2_pipeline_cross_page`) · 356-4 는 349-0q 를 빌림(`test_356_4_undo_grade.py:43`). 그 폴더는 storage 에 없음. OWNERS 의 새 검증_sub7 `99fd7005-…` 는 격자 · 종단 · 횡단 57 · 관은 있으나 `B05_Profile/route/planned_route.csv` · `_curves.json` 없음(노선 저장 전) → 경로만 바꿔도 건너뜀.
- 고칠 길: ① 필요한 파일(격자 1.4 MB · B06 1.8 MB · 노선 몇 개)을 `resources/tester/fixtures` 에 굳힌 사본(git 무게 3 ~ 4 MB · 남이 안 바꿈) ② 저장 노선 있는 다른 검증 프로젝트(sub1 · sub3 · sub8)로 경로 바꿈(가볍지만 그 창 작업에 따라 흔들림). 단언 숫자는 대개 프로젝트와 무관(`refresh == 0` 류) · `test_349_0d_follow_store.py:198` 의 87.5 는 시험이 만든 값.
- 결정: ① · ② 고름.
## 6. orca 가 select 위 휠 못 쏨
- 지금: 480 은 `orca scroll`(창 스크롤) 만 써 봄 → select 값 그대로 · 재현 못 함(PLAN 480-1 · `2026-10-19_요구280_A_B06정보칸_드롭다운.md:170`).
- 안 써 본 길: orca CLI 에 `orca mouse move --x --y` · `orca mouse wheel --dy` 가 있음(`orca --help`) — select 한가운데(eval 로 `getBoundingClientRect`)로 옮긴 뒤 휠. 브라우저 진짜 입력이면 재현 가능성 있음(이번엔 ORCA 안 씀 · 미확인). eval 로 만든 `WheelEvent` 는 신뢰 안 된 이벤트라 기본 동작 없음 — 대안 아님.
- 덧: 「Windows Chromium 은 닫힌 select 위 휠로 값 바꿈」 자체가 추정(같은 분석 86줄). 뿌리 고침(마우스 고름 뒤 초점 뺌)은 `test_280_6_select_release.py` 가 이미 잼 → 초점이 select 에 없으면 휠 · ↓ 둘 다 못 바꿈.
- 고칠 길: 다음 화면 검증 때 `mouse move` + `mouse wheel` 한 번 · 안 바뀌면(브라우저가 원래 안 바꿈) 항목 닫음.
- 결정: 시도할지 · 바로 닫을지.
## 돌린 것
- `test_b06_draft_pipe_replay.py` 1 실패 · `test_269_panel_form.py` 1 실패 8 통과 · `test_356_4_undo_grade.py` 4 건너뜀 · `test_349_0q_undo_echo.py` 3 건너뜀 · `dxf-clip.test.ts` 뿌리 node 통과 · openwebcad vitest 실패 · `table-from-drawing.test.ts` vitest 실패(No test suite).
- uvicorn `Config` · `FileFilter` 읽기 전용 흉내(파일 안 만듦) — 상대 · 절대 `reload_excludes` 판정.
- 안 돌림: `test_472_6_*` live · 전체 시험 · 서버 · ORCA.