Files
Aislo/docs/raw/plans/2026-09-01_plan_remaining_checked_items.md
T
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록)
- `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록
  — 창끼리 공유하되 저장소에는 안 올리는 장부
- 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠)
- graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 18:19:07 +09:00

27 KiB
Raw Blame History

2026-09-01 상시 계획서 완료 체크 항목 추가 이관

원본: docs/raw/PLAN.md. 혼합 섹션에 남아 있던 완료 체크 블록을 원문 그대로 이관했다. 검증: docs/raw/verification/2026-09-01_verify_remaining_checked_items.md

노선 원천 일원화 + 도엽 서피스 온디맨드 (2026-09-01 신규)

③ 트림된 지점이 종점

  • feat/b03-route-shapefile 병합 (e4b85976) — shapefile 노선·PRJ 2벌·좌표계 짝 선택

LAS 없는 설계 — 곡선 경고 판정 후속

  • 곡선 경고 표시가 검사 간격에 따라 나타났다 사라지는 문제를 확정한다.(현행 유지로 확정, 원청에서 공급하는 계획노선 데이터는 라운드 문제가 없으며 향후 특수한 경우인 계획노선 변경을 위해 필요한 기능임.)

    • 같은 평면 노선에서도 curve_check_step = max(2×target_res, 4.0) 때문에 LAS는 4.376m, 도엽은 4.000m 간격으로 검사한다.
    • 4.376m에서는 위반 표본이 한 점짜리 9건이라 화면에 안 보이고, 4.000m에서는 연속 위반 2건이 되어 빨간 구가 보인다.
    • 검사 간격별 최소 R은 2.61m→2.59m, 4m→5.69m, 8m→9.93m, 10m→13.33m, 15m→17.64m로 변해 정점 잡음을 곡률로 읽은 가짜 경고로 판정됐다.
    • 결정 후보: 검사 간격 10m 고정(권장), 정식 IP/R 데이터 수령 후 제원 R 직접 검사.
    • 경고 자체 제거는 최소곡선반지름 규칙 검사를 잃으므로 권장하지 않는다.
  • 라이다 서피스와 도엽등고선 서피스의 좌표가 어긋나는지 조사한다 (2026-08-31).

    • 자체검증: 저장소 산출물 직접 대조 (구조물검증-LAS 2f940d8a · 구조물검증-도엽 325f57d9).
      • 좌표계: 두 프로젝트 PRJ 모두 KGD2002 / East Belt 2010, 계획노선 CSV crs_epsg 5187, 도엽 9매 인덱스 crs 전부 EPSG:5187(zip 내부 PRJ도 동일 — 오라벨 없음). vworld_*_meta.json 경계값이 두 프로젝트 소수점까지 같다. 좌표계 불일치 없음.
      • XY 정합: 라이다 지반점 50만 개를 도엽 격자에 대응시켜 ±40m 격자 탐색 — 최적 이동 dx 0m / dy 10m (RMS 2.95→2.53m). 도엽 등고선 정점 815,471개 대조도 dx 0 / dy +4m. 계통적 어긋남 없음.
      • 표고차: 평균 +1.17m, 중앙 +0.51m, σ 2.79m, 1m 이내 60.8% · 5m 이내 92.5%.
      • 노선 종단 대조: 노선 CSV z − 라이다 z = 평균 0.08m, σ 0.12m (노선을 라이다 위에 그은 자료임이 수치로 확인됨). 노선 CSV z − 도엽 서피스 z = 평균 +2.37m, 최대 +13.40m.
      • 결론: 앞 240m는 두 서피스가 붙고 끝 110m 한 구역만 갈린다 (x 183,720183,770 / y 489,426489,476, 25m 셀 137개 중 13%가 5m 이상 차이). 그 자리 도엽 최근접 등고선은 7.9m 거리에 530m인데 라이다·노선은 541.4m — 주곡선 간격이 5m이므로 보간 오차로 설명되지 않는다. 도엽 등고선이 그 지형을 담고 있지 않다 (제작 이후 지형 변화 또는 도엽 자료 누락). 도엽 성절토·옹벽 표기는 반경 60m 내 없음.
    • 위 「계곡 통과 시설이 갈리는 것」 항목의 배경이다 — 도엽이 그 구역을 얕게 잡는다.
    • 남은 확인: B04 3D에서 x 183,730 / y 489,450을 위성영상과 대조해 성토인지 미갱신인지 가른다.

B05/B06 구조물 UI 통합 후속

  • 사용자 화면 확인 후 좌측 배치 폼과 횡단 오버레이의 중복 항목 정리.(완료)

B08 CAD 후속

  • 도면 전환 지연·토스트 이질감·커서 지연을 손봤다 (2026-08-30, 커밋 9c1cdf8f).

    • 도면 프리페치: 진입 후 첫 장을 띄우고 목록 전체를 배경에서 받아 모듈 캐시에 담는다. 구조물까지 얹은 상태로 담아 클릭 때 재계산이 없다. 확정·확정취소는 그 도면 캐시만 버린다. sessionStorage가 아니라 메모리에 둔다 — 유역도 한 장이 엔티티 1,581개라 세션 한도(5MB)를 넘길 위험이 있다.
    • 구조물 모듈이 공유 캐시 사용: fetchSectionDetail 직접 호출 → loadSectionDetail (B05·B06과 같은 Section_Store). 장을 넘길 때마다 상세를 다시 받던 회당 ~200ms 제거.
    • 실측(클릭 → CAD 렌더 완료): 8001,000ms → **5565ms**. 서버 조립 자체는 도면당 180~380ms로 그대로다(캐시가 가린다).
    • 토스트 통일: CAD 안 react-toastify 자리에 vite alias로 다리를 끼워 (openwebcad/src/helpers/toast-bridge.ts) 부모로 aislo:b08:toast 메시지를 보내고, B07 페이지가 공용 showToast로 띄운다. 호출부 30여 개 파일은 그대로 뒀다. 누르는 안내(백업 되살리기)를 위해 showToastonClick(선택 인자)을 더했다.
    • 커서 지연: 원인은 프레임이 아니라(측정 avgFrameMs 16.68 = 60fps 상한, 씬 재생성 12.6ms) 합성 파이프라인이었다. Chrome은 mousemove를 rAF 직전에 몰아 보내므로 대기 자체는 거의 없다. 화면 캔버스를 desynchronized: true, alpha: false로 만들어 합성 큐를 건너뛴다(한 줄, 되돌리기 쉬움).
  • 명령행 숨김/보임이 좌측 속성 패널 높이를 함께 흔들던 것을 끊었다 (2026-08-31).

    • 원인: .cad-inspectorbottomcalc(var(--cad-command-height) + var(--cad-status-height)) 라서 상태막대 [명령행] 토글이 바꾸는 --cad-command-height에 좌측 패널이 끌려갔다.
    • 조치: 좌측 팔레트가 상위이므로 bottom: var(--cad-status-height) 한 줄로 상태막대까지 내렸다 (openwebcad/src/App.css). 명령행은 이미 left: var(--cad-panel-width)라 가로로 겹치지 않는다. 캔버스·줌 컨트롤은 그대로 명령행 높이를 따른다.
    • 자체검증(공용 브라우저, B07 1장, 868_hardreload.py): 패널 bottom 737px · 높이 579px가 명령행 보임(--cad-command-height: 86px) → 숨김(0px) → 다시 보임 전 구간에서 불변. 수정 전 측정은 651/493 ↔ 737/579로 흔들렸다.
    • dist/가 gitignore라 검증 전에 openwebcad에서 npm run build 실행. 다른 PC도 동일.

B08 CAD 후속

도각(A1 템플릿)이 설계를 방해한다 — 2026-08-31

  • 잠금 레이어를 집지 않게 했다 (2026-08-31). state.tsgetPickableEntities() (잠금 도면층 제외) 하나를 두고, 집기 경로가 getEntities() 대신 그걸 쓴다.

    • 선택은 setSelectedEntityIds() 한 곳에서 막았다 — 호출부마다 거르지 않는다. Ctrl+A뿐 아니라 앞으로 생길 어떤 선택 경로도 잠금 객체를 담지 못하고, 따라서 select-tool.ts:166 선택 삭제도 도각을 지울 수 없다(같은 결함의 뿌리 하나).
    • tools/eraser-tool.ts 자르기 · tools/factories/sequence-tool.ts pickEntityAt (트림·모따기 등) · input-controller.ts 커서 강조 → getPickableEntities()
    • 자체검증(공용 브라우저 1장 0~240m, 880·882): Ctrl+A 선택이 226 → 107개, 내역 b08-design 48 · structure 27 · rock-boundary 16 · cross-table 16b08-frame·b08-ground 0개. 자르기로 도각 테두리를 클릭해도 엔티티 226개· frame 103개 불변. 수정 전 실측은 226개 전부 선택이었다.
  • 잠금 경로 다섯 곳을 마저 닫았다 (2026-08-31, 첫 감사가 불완전했다).

    • tools/select-tool.helpers.ts pickEntityAt — 클릭 선택 후보에 잠금 객체가 섞여 도각을 물면 아무 일도 안 일어나는 죽은 클릭이 됐다.
    • tools/eraser-tool.ts getAllIntersectionPoints 2곳 — 자르기가 도각 선을 절단 경계로 썼다.
    • tools/modify/property-tools.ts OVERKILL — 선택이 없으면 전체가 대상이라 도각까지 지웠다.
    • tools/annotate/text-tools.ts 찾기/바꾸기 — 도각 표제란 글자를 바꿔 버렸다.
    • tools/utility/selection-tools.ts 유형 선택·유사 선택 — 잠금 객체까지 세어 토스트 개수가 틀렸다.
    • 자체검증(892·893·894, 횡단 1장): 찾기/바꾸기로 도각 라벨(도 면 명)을 노려도 0건, 도각 텍스트 24개 불변. OVERKILL은 설계 콘텐츠에서 2개를 지우면서 b08-frame 63개·b08-ground 16개는 불변. 선택 0. (검증 중 지운 2개는 도면 재요청으로 원복 — 엔티티 186개 복구 확인.)
  • 수량 산출표 패널이 명령 입력칸을 덮던 것을 올렸다 (2026-08-31, 검증 중 발견). .cad-qtablebottom: 상태막대+8px이라 명령행(86px)과 겹쳐 입력칸을 클릭으로 누를 수 없었다. bottom--cad-command-height를 더해 명령행 위로 띄운다. 명령행을 접으면 이 값이 0이라 예전 자리로 돌아간다.

    • 자체검증(897): 패널 [607,643] · 입력칸 [704,730], 겹침 -61px(61px 떨어짐). 입력칸 중앙의 elementFromPointcad-command, 클릭 후 타이핑이 입력칸에 들어간다.
  • 화면맞춤(⛶)을 콘텐츠 기준으로 바꿨다 (2026-08-31 사용자 확정: "당연히 컨텐츠에 맞추는게 좋을것같아"). screenCanvas.drawController.ts zoomToFitScreen이 잠금 도면층을 뺀 bbox에 맞춘다(콘텐츠가 하나도 없으면 전체로 폴백). 도면 로드 직후 자동 맞춤 (aislo-drawing-bridge.ts:128)도 같은 함수라 함께 바뀐다.

    • 자체검증(881): 캔버스 1136×493에서 맞춤 후 배율 94%. 콘텐츠 631×472 기준 예상치 94.0%와 일치, 도각 840×594 기준 예상치 74.7%와 불일치 — 콘텐츠에 맞았다.
  • 임시 도각에서 남의 자료를 걷어냈다 (2026-08-31). 00_template_A1.json 엔티티 87 → 47. 지운 것: 용역회사 로고 벡터 22 · 시행청 로고 6 · 담당자 손서명 9 · 영문 병기와 워드마크 3. 값 텍스트 11개는 같은 좌표·서식에 {{공사명}} {{시행청}} {{용역회사}} {{설계일자}} {{과업책임자}} {{분야별책임자}} {{설계자}} {{도면명}} {{도면번호}} {{축척_A1}} {{축척_A3}} 로 바꿨다. 도각 테두리·표제란 격자·라벨 텍스트·재단 표식은 그대로다. 정리 스크립트는 tmp/clean_a1_template.py, 원본 사본은 tmp/00_template_A1.orig.json.

    • frame_entities(fields=...){{키}} 를 치환하고, 값이 없으면 빈칸으로 둔다. 지금은 4개 엔진이 {{도면명}} 만 채운다(횡단면도·종단면도·토적도·유역도).
    • 자체검증(백엔드 재시작 후, 885_final_verify.py): 4개 도면(횡단·종단·토적·유역) API 응답의 b08-frame 텍스트에 남의 값 0건. {{도면명}} 이 각각 횡단면도·종단면도·토적도·유역도로 치환되고 나머지 칸은 빈칸이다.
  • 방위표 템플릿도 같이 정리했다 (2026-08-31). 00_template_compass.json 에 원본 DXF의 표제란 글자 4개(편 입 용 지 도-2공구·25·2,400)가 도면 반대편에 남아 있었다. 이 때문에 템플릿 bbox가 183×262mm 로 부풀어, 긴 변을 14mm에 맞추는 compass_entities() 가 방위표를 1.1×1.8mm 로 줄여 놓고 있었다 — 사실상 안 보였다. 글자를 지우니 bbox 20.5×32.9mm, 방위표가 8.7×14mm 로 나온다 (유역도 화면에서 확인, 885_watershed.png). 엔티티 39 → 35, 남는 텍스트는 N 뿐.

  • 기본 도면층 이름을 국문으로 바꿨다 (2026-08-31 사용자 지시). 도면층 17종을 프로젝트가 이미 쓰는 용어로 맞췄다 — 원지반·계획선·구조물·암 경계선·수량 산출표· 도각·등고선·계류·노선·배수유역·유역 제원·표제·그래프 격자·측점표·유토곡선· 그래프 축·운반 구간. CAD 앱의 Default·New layer 도 기본·새 도면층으로 바꿨다. layerId 는 그대로라 저장된 도면과 어긋나지 않는다.

    • 자체검증(885): 4개 도면 API 응답의 도면층 이름이 전부 국문. 화면 도면층 패널도 같이 확인(885_watershed.png).
  • 표지를 통째로 템플릿으로 (2026-08-31 완료). 도각을 두르지 않고 템플릿 한 장을 그대로 도면으로 낸다. kind:"cover" 배선까지 끝나 화면에 뜬다. 작업 기록은 docs/raw/plans/2026-08-31_plan_B07_cover_template.md 로 이관했다. 값(공사명·위치·사업량·시행청)은 아직 빈칸 — 아래 「표제란 필드 바인딩」과 같은 판이다.

B08 CAD 후속

도각을 배경으로 굳힌다 — 새 선이 잠금 도면층에 떨어진다 (2026-09-01 보조폴더)

  • 현재 도면층은 잠금 아닌 첫 층으로 (2026-09-01 완료). 가드를 state.ts:setActiveLayerId() 한 곳에 뒀다 — 브리지·자동백업 복구·JSON 가져오기· 도면층 패널·리본이 모두 이 함수를 지난다. 잠금 아닌 층이 없으면 요청값 유지.

    • 자체검증(화면 425_cover.png·425_cross.png): 표지 현재 도면층 주기, 횡단 1장 계획선. 선을 그으니 표지 b08-cover-note, 횡단 b08-design — 둘 다 잠금 아닌 층이다(고치기 전에는 b08-frame·b08-ground).
    • 단위 시험 src/state.test.ts 2건: 잠금층 요청 → 잠금 아닌 첫 층, 전부 잠금 → 요청값 유지.
  • 리본 「현재 도면층」 목록에서 잠금층을 뺐다 (2026-09-01 완료). RibbonWidgets.tsx 목록에서 잠금층을 거르되, 현재 층이 잠금이면 그 항목은 남긴다.

    • 자체검증: 횡단 1장 드롭다운 항목이 계획선·구조물·암 경계선·수량 산출표 4개 — 원지반·도각 빠졌다. 표지는 주기 하나.
  • 표지에 자유 도면층 하나를 줬다 (2026-09-01 완료). 표지 14개 엔티티가 전부 도각(잠금)이라 가드만으로는 그릴 자리가 없었다. Cover.pyb08-cover-note 「주기」를 잠금 없이 실었다(엔티티는 그대로 도각층).

    • 자체검증: 표지 도면층 주기(자유)·도각(잠금), 현재 층 주기, 그은 선 b08-cover-note.
  • 도면 적재를 되돌리기 기준선으로 세웠다 (2026-09-01 완료). state.ts:resetUndoBaseline() 을 만들어 브리지 적재·자동백업 복구에서 부른다.

    • 자체검증: 표지 14 → 선 1개 15 → Ctrl+Z14(백지 아님), 횡단 186 → 187 → Ctrl+Z186. 고치기 전에는 187 → 0 이었다.
    • 단위 시험 src/state.test.ts 1건.
    • 회귀: 도각 스냅 제외 그대로 — 횡단 1장에서 마우스 187지점 훑어 스냅 64회, 도각 전용 영역 0회. 파이썬 스위트 34건 통과. CAD vitest 81건 중 6건 실패는 변경 전부터 있던 것(window is not defined·find-closest-entity 단정) — 내가 고친 함수를 쓰지 않는 시험들이다.
  • 검증 창구에 스냅점을 열었다. debug-hook.tssnap: () => getSnapPoint() 한 줄 — 잠금층이 스냅에 끼는지 수치로 판정하는 데 썼다.

B08 CAD 후속

프로젝트 소유 검증 — 남의 회사 자료에 닿던 구멍 (2026-09-01)

  • 검사를 한 곳에 뒀다 (2026-09-01 완료). common_util_auth.require_project_access 를 만들어 main.pyprotected_with_company 목록에 함께 걸었다. 경로에 project_id 가 있는 요청만 검사하고(55개 경로), 없는 요청은 그대로 지나간다. 시스템 관리자는 통과.
    • 자체검증 tmp/tests/test_project_access_guard.py: 같은 회사 통과 · 다른 회사 403 · 없는 프로젝트 404 · 관리자·프로젝트 없는 경로 통과.
    • 화면(440_after_guard.png): 도면 목록·표지·도각 API 전부 200, 없는 프로젝트 404, 종단도 엔티티 487 정상. 파이썬 스위트 36건 통과.
    • 남은 것: project_id본문·질의로 받는 경로는 이 가드가 닿지 않는다. 지금 B03~B07은 전부 경로 매개변수라 해당 없음 — 새로 만들 때 경로로 받는다.

B08 CAD 후속

도각 편집 모드 — 캐드에서 고치고 [완료] 한 번에 (2026-09-01 사용자 확정)

  • 회사 도각 저장 자리 (2026-09-01 완료). storage/{회사}/templates/00_template_A1.json. 회사 폴더는 프로젝트 경로 두 단계 위에서 얻는다 — DB 조회를 새로 만들지 않았다. 정본(resources/template_2dDrawing/)은 읽기 전용 그대로.

    • 자체검증: [완료] 한 번에 storage/1/templates/00_template_A1.json 생성(48개 엔티티, layerId 전부 b08-frame). 정본 파일은 변경 없음.
  • 도각 로더에 우선순위 (2026-09-01 완료). _load_template() 이 회사 파일을 먼저 보고 없으면 기본을 쓴다. 캐시 키에 mtime을 넣어 저장 즉시 반영된다 — 템플릿을 고칠 때마다 백엔드를 재시작하던 일이 없어졌다. 회사 폴더는 요청마다 ContextVar 로 세운다 (엔진 6개 서명을 줄줄이 고치지 않으려고. asyncio.to_thread 가 문맥을 복사한다). 개인용 도각은 이 함수에 한 줄 더 붙이면 되는 자리로 남겼다.

    • 자체검증: 회사 도각 파일을 지우자 재시작 없이 기본 도각(47개)으로 돌아왔다. tmp/tests/test_b07_frame_template.py 1건(우선순위·저장 즉시 반영·층 정규화).
  • 도각 편집 API (2026-09-01 완료). GET/PUT /api/projects/{id}/frame-template. 1:1 이라 좌표 역변환이 없다. 인증은 라우터에 걸린 protected_with_company 그대로.

    • 자체검증: 편집 화면 도면층이 도각(잠금 아님) 하나, 엔티티 47개 = 기본 도각 그대로.
  • B07 화면의 편집 모드 (2026-09-01 완료). 새 파일 B07_DesignDetail_UI_FrameEdit.ts (페이지가 700줄에 가까워 분리). 도면 목록 아래 「도각 편집」 → 배너 + [완료]·[취소]. [완료]는 기존 저장 통로로 엔티티를 받아 PUT 하고, 받아 둔 도면 캐시를 버린 뒤 보던 도면을 다시 싣는다(안 버리면 옛 도각이 그대로 보인다). 편집 중에 오는 도면 변경 알림은 확정 해제로 이어지지 않게 막았다.

  • 자체검증 완료 (2026-09-01, 보조 폴더 5174 · 프로젝트 wdw).

    • 편집 → [완료] → 반영: 종단도 도각 47 → 48(전체 487 → 488), 배너는 닫히고 보던 도면으로 복귀(432_frame_edit.png).
    • 확정본 보존: 종단도를 확정한 뒤 도각을 한 번 더 고쳐(48 → 49) 저장했더니 확정한 종단도는 48 그대로, 미확정 유역도는 84(새 도각 49 + 방위표 35)로 새 도각을 받았다 (433_confirmed_frame.png).
    • 원복: 종단도 확정 해제(200) + 시험용 회사 도각 삭제 → 종단도 도각 47(기본), 확정 뱃지 false. 사용자 자료는 시험 전 상태로 되돌려 놓았다.
    • 파이썬 스위트 35건 통과, 프론트 tsc --noEmit 무오류.

B08 CAD 후속

유역도 표현 정리 — 2026-08-31 사용자 지시

  • 노선을 굵게, 그리고 맨 위로. 노선이 유역 해칭 아래에 깔려 안 보였다. polyline_entity(width=)(기본 1)를 더하고 노선만 _ROUTE_WIDTH = 3으로 그린다. 그리기 순서도 등고선·계류·해칭·정보표 다음, 번호 배지 바로 앞으로 옮겼다. bbox 계산에는 그대로 포함시켜 오른쪽 칸 위치가 흔들리지 않게 했다.

    • 자체검증(890_route_view.png): 유역 1·3·4 해칭 위로 노란 노선이 끊김 없이 보인다.
    • 축척은 1:6000 유지로 확정 (2026-08-31 사용자 "유역도는 유지"). 도곽이 실거리 약 4km를 담고 노선은 350m다(노선 bbox 40×28mm 대 지형 681×477mm) — 노선이 작게 보이는 것은 이 축척에서 정상이고, 굵기·그리기 순서로 해결한다. 축척을 바꾸자는 이야기는 다시 꺼내지 않는다.
  • 방위표를 키우고 유역 정보표를 그 아래로. 오른쪽 칸을 방위표(맨 위) → 정보표 (아래로 쌓기) 순으로 바꿨다. 방위표 14mm → 26mm(_COMPASS_SIZE), 간격 6mm. 옛 배치(도면 오른쪽 위 구석 max_bx-8, max_by-8)는 걷어냈다.

    • 자체검증(889): 도각 bbox [-70,-67,770,527](840×594) 밖으로 나간 엔티티 0개. 정보표 칸 [693,364]~[739,445], 폭 46mm로 예약 폭 그대로다.
  • 등고선·계류를 배경으로 — 이미 되어 있었다(잠금 도면층). 자체검증(886): Ctrl+A가 엔티티 1,537개 중 27개만 선택하고 등고선·계류는 0개. 스냅·화면맞춤도 잠금 도면층을 제외한다(2026-08-31 getPickableEntities() 작업으로 함께 닫혔다).

  • 등고선·계류 외곽을 곧게 잘랐다. clip_line_to_box()가 경계 바깥 점을 하나씩 물고 나와 외곽이 들쭉날쭉했다. Liang-Barsky 선분 절취(_clip_segment)로 바꿔 끝점이 경계 위에 정확히 놓인다. 물림 여유 _CLIP_SLACK 14mm → 0.

    • 자체검증: tmp/tests/test_clip_line_to_box.py 5건 통과. 화면(887) — 등고선·계류 bbox가 둘 다 정확히 681×477mm 직사각형. 박스 선은 그리지 않는다(사용자 지시).

다른 AI 작업(PRJ 좌표계 판별) 검증 — 2026-08-31

  • origin/feat/prj-crs-identify0d90595a(다른 워크트리 작업)를 내 브랜치에 fast-forward로 가져와 검증했다. 내 46ac5425 위에 쌓인 커밋이라 충돌 없음.
    • 내용: PRJ 판별을 문자열 매칭 → WKT 정본+EPSG 라벨(common_util_crs.py 신규). 옛 코드는 WKT에 항상 있는 false_easting의 "EAST" 때문에 모든 PRJ를 EPSG:5187로 판정하고 있었다 — 실제 결함이 맞다.
    • 실데이터 검증: ① storage 3건의 COMPD_CS(KGD2002 East Belt+KNGeoid24, to_epsg() None) → 5187 정답, ② 실무문서 ESRI WKT(파일명 EPSG5176, AUTHORITY 없음) → 5176 정답, ③ 불량·빈 입력 → None(기본값 5186 폴백), ④ TOWGS84 박힌 WKT → 원문 유지(보정 보존). B03 analyze_prj_metadata· B04 get_epsg_from_prj 호출부도 같은 결과.
    • 회귀 테스트 tmp/tests/test_crs_identify.py 4건 추가, 통과.
    • 전체 스위트 265 통과/10 실패 — 실패는 머지 전과 동일한 이전 결함들 (B05 구조물 8·B06 1·B07 정보표 1). 이 머지가 새로 깨뜨린 것 없음.

B08 횡단도·장 배치 후속

  • 신규 프로젝트에서 구조물이 안 나온다는 증상을 실측으로 종결했다 (2026-08-30).
    • 원인은 그 프로젝트(e05b7ff4)가 workflow.json = {"current_stage":"scan"} — WF1이 안 끝나 자동설계 체인이 호출된 적이 없었다(initial_design.lock도 없음). 구조물만이 아니라 노선·종횡단 자체가 없던 상태였다.

    • 새로 등록해 체인을 완주시켜 대조했다. [저장]을 누르지 않은 상태의 수치:

      항목 LAS 없음(도엽) 325f57d9 r117 LAS 있음 2f940d8a r118
      pipe_points / 종단 표식 / 횡단 표식 4 / 4 / 4 4 / 4 / 4
      load_culvert_sets 매칭 4건 전부 4건 전부
      B06 횡단 카드 표시됨 표시됨
      3D 코리도 구조물 솔리드 corridor_0117.json 31개 corridor_0118.json 36개
      B08 횡단도 1장 structure 엔티티 40 (20블록) 27 (16블록)
    • 3D 코리도 파일도 [저장] 없이 자동 생성됐다 — "저장해야 3D에 나온다"는 종전 인식도 해소.

    • 단 스크립트를 남겼다: ./venv/Scripts/python.exe tmp/tests/diag_structures.py [UUID] (인자 없으면 최근 프로젝트) — 위 5항목을 한 번에 대조한다.

좌표계 라벨 오용 수정 — 상세 배수유역 표기 누락 (2026-09-01, 보조폴더)

  • common_util_drainage_context: DrainageContext.epsg(int)crs(str), crs_input 사용

  • B07_DesignDetail_Router_Support: context.crs 그대로 사용

  • SheetSurface.build_sheet_surface_from_route: load_design_route로 읽어 도엽 서피스를 라이다 지표면과 같은 좌표계에 만든다 (LAS 없는 WF1 경로는 라벨·좌표가 한 벌이라 유지)

  • Router_Inflow._resolve_epsg: 격자 산출물과 같은 .prj 좌표계로 역투영

    • 검증: tmp/tests/test_drainage_crs.py 신규(용화 회귀) + tmp/tests 전체 37 passed. build_detail 실행 시 유역 11개 폴리곤이 lon 129.0947129.0988 / lat 36.810736.8127 (노선 위). 수정 전 같은 점 = 119.7872 / 23.0817. 커밋 b50559d7.
    • 화면 검증 미실시: 데이터가 메인폴더 storage 에만 있어 보조폴더 백엔드(8001)로는 못 띄운다.
  • 옛 저장본 좌표계: 04_detailed_basins.geojson에 변환에 쓴 좌표계를 crs_input으로 남기고 B07 유역도가 그 값으로 되돌린다. 기록이 없는 옛 저장본은 노선 CSV의 EPSG 라벨로 쓰였으므로 그 라벨로 되돌린다(경고 로그 + 재확정 안내).

  • 3D 서피스 겹쳐보기 어긋남: 도엽 서피스가 라이다 포인트 상자(structured.npz = 화면 setReferenceBounds와 같은 값)를 화면 원점으로 쓰게 했다. 표고 격자 상자 (bounds)는 절취 범위 그대로 두고 scene_bounds를 npz에 따로 남겨 등고선 API도 같은 원점을 쓴다. 라이다 없는 사업지는 종전대로 자기 상자.

    • 검증: tmp/tests 42 passed(신규 test_scene_origin_and_basin_crs.py 5건). 패치 코드로 도엽 서피스를 다시 만들어 GLB 정점 상자 대조 — sheet [-426.58, -68.95, -386.41]~[411.42, 71.52, 379.59], csf [-172.12, -44.06, -199.69]~[184.11, 3.22, 165.72] 로 같은 원점(수정 전 sheet는 ±419.5 / ±70.24 / ±383.0 자기 중심). 커밋 0a1ebcfb.
    • 화면 검증 완료(2026-09-01, 보조폴더 8001·5174): 용화(e418fcfc) B04 지도에서 세부유역 11개가 번호 서클과 함께 칠해져 나온다(tmp/browser/shots/509_b04_basins_on.png). API 대조 — 유역 bbox lon 129.0906129.1019 / lat 36.804936.8127, 노선 bbox 129.0948129.1018 / 36.810736.8127 로 겹친다. 수정 전 같은 호출은 119.78 / 23.08. 좌표계가 맞던 프로젝트(c1bb453f)는 값이 그대로 — 회귀 없음.
    • 보조폴더 storage 는 메인폴더로 정션이 걸려 있어 같은 데이터를 본다(2026-08-30 생성). 보조 백엔드는 SERVER_PORT=8001 FRONTEND_DEV_PORT=5174 AISLO_API_PORT=8001 로 띄운다 — AISLO_API_PORT 를 빼면 vite 5174 가 메인 백엔드(8000)로 프록시해 남의 코드를 검증하게 된다.