Commit Graph
432 Commits
Author SHA1 Message Date
eomsangdonandClaude Opus 5 47fa05abd3 fix(B05): 측점번호+잔여거리 확정 즉시 유역 임시 계산 실행
잔여거리까지 입력해도 입력군을 떠나기 전에는 임시 배치가 나가지 않았다
(2026-08-18 사용자 보고). 잔여거리 값 확정(change) 즉시 commitPosition을
실행하고, 측점번호 수정은 잔여거리가 이미 있을 때만 즉시 반영한다.
focusout 경로는 잔여거리 없이 정측점만 쓰는 경우의 확정용으로 유지.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 18:49:36 +09:00
eomsangdonandClaude Opus 5 33fe2fa660 feat(B05): 옵션 활성화 시점을 위치 입력 확정 시점으로 통일
측점번호만 넣어도 옵션이 풀리던 것을, 임시 배치와 같은 시점 — 측점번호+잔여거리를
다 받고 입력군을 빠져나온 순간(commitPosition) — 으로 맞춘다(2026-08-18 사용자
지시). 값을 지우면 확정이 풀려 즉시 다시 잠긴다. 기존 항목·우클릭 추가는 위치가
실려 열리므로 처음부터 활성.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 18:47:42 +09:00
eomsangdonandClaude Opus 5 2e6f657f39 fix(B05): 임시 배치 좌표 = 측점번호+잔여거리 확정값 — Enter도 focusout 경로로 통일
측점번호 칸에서 Enter 시 잔여거리 0으로 즉시 배치되던 빈틈 제거. Enter는
포커스만 빼고, 임시 배치는 입력군 이탈(focusout) 한 경로에서 두 칸 합산값으로만
나간다. 배치 좌표는 스냅 없이 입력값 그대로다(노선 범위 클램프만).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 18:44:16 +09:00
eomsangdonandClaude Opus 5 cdf4814719 fix(B05): 임시 배치를 측점+잔여거리 입력이 끝난 뒤로 지연
측점번호만 넣고 잔여거리 칸으로 넘어가는 순간(blur) 임시 배치가 나가 재계산
동기화가 입력을 끊었다(2026-08-18 사용자 보고 2차).

- 임시 배치 시점 변경: 측점 입력군(positionRow)에서 포커스가 완전히 빠져나간
  뒤(focusout + rAF 판정) 또는 Enter. 칸 사이 이동 중에는 나가지 않는다.
- 관이 계획선에 스냅되며 입력 누가거리와 어긋나면 임시 추적이 풀리던 것 —
  허용오차를 0.05m에서 0.51m(관 매칭 공통 기준)로 넓히고, 재계산 후 실제
  좌표로 임시·선택 누가거리를 갱신해 계속 따라간다.
- 우클릭 추가는 측점이 확정돼 들어오므로 즉시 임시 배치(기존과 동일).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 18:39:39 +09:00
eomsangdonandClaude Opus 5 52b3dfe616 fix(B05): 임시 배치 재계산이 입력 중인 폼을 덮어쓰던 것
기준 측점을 넣으면 임시 배치 → 세부유역 재계산 → 전역 선택 동기화가 그 관의
폼을 통째로 다시 로드해, 잔여거리를 입력하려는 순간 칸이 비워졌다(2026-08-18
사용자 보고).

임시 배치 중 그 관이 동기화로 되돌아오면 폼은 그대로 두고 설계유량만 갱신한다
(facilityOptions.setDesignFlow 신설 — 필드 값 불변, 월류 높이 재계산만).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 18:35:21 +09:00
eomsangdonandClaude Opus 5 3c05052418 feat(B05): 사이드 패널 입력 로직·레이아웃 개편 (PLAN 2-1~2-5)
- 2-1 선택 해제 복구: 목록 재클릭 = 해제(계곡 통과 시설 포함 — 기존엔 시설이
  항상 재선택됨). 해제는 리셋 버튼과 같은 전체 초기화(resetForm — 구조물군·종류·
  측점·옵션)이며, 시설 해제는 onPipeSelect(null)로 그래프·3D·배수유역도까지 푼다.
- 2-2 입력 순서 가이드: 측점(점형 기준, 구간형 시작·종료) 미입력이면 옵션 칸·부속
  서브폼 잠금(disabled+inert+is-locked 흐림). 입력 즉시 해제.
- 2-3 월류폭·월류 높이: 기본값 세월교 10m·물넘이 5m. 월류 높이 칸 신설 —
  fordSection(Manning 역산) 필요 수심을 자동 기입, 계산값 미만 입력은 되돌림.
  저장 키 ford_height_m(0.01m 정밀도).
- 2-3b A군 임시 배치: 기준 측점 입력 순간 관 지점에 임시로 넣어 세부유역·설계유량
  미리보기. [추가]로 확정, 삭제·리셋·다른 항목 선택·종류 변경·외부 해제 시 관을
  물려 직전 상태 복원.
- 2-3c 우클릭 추가 개편: 종단도·테이블·배수유역도 [배관/구조물 추가]가 즉시 추가
  대신 사이드 폼에 종류·측점을 자동 입력(A군은 임시 배치까지). BOX암거 기본
  제원은 폼에 실려 유지.
- 2-4 컨테이너 병합: 등고선 간격+시작 측점·샘플링+종단 설계 기준 → 「페이지 설정」.
  측점 간격 입력 삭제(STATION_INTERVAL_M=20 고정, 서버 스키마 불변). 순서 =
  구조물 배치 > 페이지 설정 > 경로 계산 설정.
- 2-5 경로 계산 설정 비활성화: 사용여부 미결정 — 본문 inert(조작 불가) +
  is-disabled 흐림. 제목·접기는 유지.

검증: tsc --noEmit 무오류, vite build 성공. 상세는 PLAN.md 2-6.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 18:30:18 +09:00
eomsangdonandClaude Opus 5 d192343012 feat(B05): 구조물 목록 항목 양식 — 측점 좌측·이름 우측, 그 외 정보 삭제
한 항목 = [측점(좌측 맞춤)][구조물 이름(우측 맞춤)]. 메모·"배수유역 연동" 등
부가 표기는 지운다(2026-08-18 사용자 지시).

- labelOfStructure/labelOfPipe("측점 · 이름" 결합 문자열) 폐지 —
  측점 표기만 stationOfStructure로 남기고 이름은 렌더에서 따로 그린다.
- 이름 span: margin-left:auto + text-align:right, 주 정보가 되었으므로
  본문색으로 승격(기존 muted 캡션은 메모용이었다).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 17:29:11 +09:00
eomsangdonandClaude Opus 5 a3382212ea fix(ui): 사이드 액션 줄 분리가 동작하지 않던 선택자 수정
splitSidebarActions가 body 직계자식(:scope >)에서만 .ui-sidebar-actions를
찾았지만, 실제 액션 줄은 페이지 패널 루트(b05-route__panel 등) 안에 있어 분리가
아예 일어나지 않았다 — 직전 커밋에서 sticky까지 걷어낸 상태라 액션 줄이 내용을
따라 끌려 올라갔다(2026-08-18 사용자 보고).

- 깊이 무관하게 찾고, 액션 줄의 실제 부모를 기준으로 [스크롤 래퍼][액션 줄]로 쪼갠다.
- body와 그 부모 사이 중간 요소에 ui-sidebar-fill을 붙여 높이 체인(플렉스 세로
  확장 + min-height:0)을 이어준다. B08 목록의 자체 overflow도 이 규칙이 덮어
  스크롤이 래퍼로 옮겨간다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 17:24:34 +09:00
eomsangdonandClaude Opus 5 a794252e2e refactor(ui): 사이드 패널을 [스크롤 영역][고정 액션 영역]으로 분리
sticky + margin-top:auto 조합은 본문 높이가 패널 높이를 넘나들 때마다 액션 줄이
붙었다 떨어졌다 했다(2026-08-18 사용자 보고). 액션 줄을 스크롤 대상에서 아예 빼는
구조로 바꾼다.

- overlay.ts: 사이드 패널 생성 시 본문의 `.ui-sidebar-actions` 앞 형제들을
  마진·패딩 없는 `.ui-sidebar-scroll` 래퍼로 옮기고 body에 `ui-sidebar-split`을
  붙인다. 페이지 코드는 지금처럼 본문 끝에 액션 줄을 붙이기만 하면 된다.
- overlay.css: split body = 세로 플렉스 + overflow hidden + padding-bottom 0,
  스크롤 래퍼 = flex:1/min-height:0/overflow-y:scroll + gap:inherit(그룹 간격 유지),
  액션 줄 = flex:none(sticky·margin-top 제거).
- B08: 전용 sticky 규칙을 버리고 공용 ui-sidebar-actions로 통합 — B04~B08이 한 규칙.

스크롤바 자리 상시 예약(2026-08-17)은 래퍼가 이어받아 내용 폭은 그대로다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 17:21:40 +09:00
eomsangdonandClaude Opus 5 74b1cd2143 fix(ui): 사이드 패널 액션 줄을 내용이 짧아도 최하단에 고정
지금까지는 sticky만 걸려 있어 내용이 패널보다 짧으면 버튼 줄이 내용 바로 아래에
떠 있었다. 공용 .ui-sidebar-actions에 margin-top:auto를 주고, 액션 줄을 담은
사이드 body를 세로 플렉스로 만들어(:has) 남는 세로 공간을 액션 줄 위 여백이
전부 먹게 했다. B04·B05·B06·B07 공통 적용(B08은 .b08-drawing-actions가 이미
같은 방식).

- B05: 액션 dock 위 구분선·구조물 목록도 함께 최하단에 붙는다.
- B05 .b05-route__panel의 padding-bottom(24px) 제거 — dock이 바닥에 붙은 뒤로는
  버튼 아래 빈 띠로만 남는다. 공용 body 패딩 16px는 dock의 sticky bottom:-16px가 덮는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 17:12:24 +09:00
eomsangdonandClaude Opus 5 7753c53522 feat(B05): 구조물 목록을 사이드 하단 고정 영역으로 이동
선택한 구조물의 폼 길이에 밀려 「구조물 배치」 섹션 아래 목록이 화면 밖으로
나가던 문제. 목록(<ul>)을 섹션 본문에서 빼 StructuresSection.listRoot로 노출하고,
패널이 하단 고정 영역(b05-route__dock)에 배치한다.

배치 순서: 상단 구분선(dock border-top) → 구조물 목록 → 중간 구분선 →
[초기화][임시저장][횡단 이동].

- 공용 ui-sidebar-actions(sticky·배경·상단선)는 그대로 쓰고, 안쪽만 세로 배치로
  되돌리는 .b05-route__dock 규칙 추가(공용 규칙보다 좁은 선택자로 로드 순서 무관).
- 선택·폼 로드·스크롤 동작은 그대로 — DOM 부모만 바뀌었다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 17:06:06 +09:00
eomsangdon fdd9c77cb3 feat(B05): 배수유역도 필터 버튼을 지도 오버레이로 · 유역 번호 배지를 라운드 사각으로
- 표시 필터 버튼 묶음을 헤더에서 지도 좌측 상단(8px 여백)으로 옮겼다. 버튼 줄과
  상태 문구를 한 오버레이가 세로로 쌓아, 문구가 버튼 아래에서 시작한다
- 버튼 줄은 한 줄 유지. 오른쪽 진행단계 오버레이에 끝이 가려도 창을 넓히거나 그
  오버레이를 접으면 드러난다(사용자 확정) — 두 줄로 접는 쪽이 지도를 더 가린다
- 오버레이 빈 자리는 pointer-events를 흘려 지도 팬·유역 고르기를 막지 않고,
  버튼 위 pointerdown만 지도로 내려가지 않게 끊는다
- 유역 번호 배지를 원에서 라운드 사각으로. 지도 위 다른 숫자가 전부 동그라미라
  크기로만 갈렸다. 크기(지름 22px)는 그대로. B04 지도 배지도 같은 함수라 함께 바뀐다
2026-08-17 20:17:05 +09:00
eomsangdon b92ba4592e refactor(B05): 구조물 설치측·이격 입력 폐지 — 데이터 필드까지 제거
사용자 지시로 두 값을 걷어낸다. 구조물별 옵션·정의는 앞으로 타입마다
따로 정한다. 어차피 소비처가 없어(B06~B08은 structures를 읽지 않는다)
화면에만 남아 있던 값이었다.

- 폼: 설치측 select·이격 칸 행 삭제, 목록 부제·종단 벌룬에서 측 표기 제거
- 계약: StructureSide 타입, StructureInstance.side/offset_m 삭제(프론트·스키마)
- 설계지문에서 두 값 제외 — 후속 단계 무효화 판정에서 빠진다
- 구 저장분은 읽을 때 두 키만 떨어낸다. extra="forbid"라 그냥 두면 정본이
  통째로 버려진다. 다른 낯선 키는 계속 거절한다
2026-08-17 20:04:32 +09:00
eomsangdonandClaude Opus 5 6c6a0c2773 fix(B05): 유역 목록 표기 통일 — 세월교만 유효직경·추천 자리가 뒤바뀌던 것
세월교 줄만 `세월교 검토 (Ø4719mm)`로 추천이 앞, 유효직경이 괄호 안이었다(구 문구
잔재). 같은 열을 위아래로 훑을 때 읽는 방향이 달라진다는 사용자 지적에 따라 네 줄을
`유효직경 Ø…mm → 추천 …` 한 형식으로 맞췄다.

- B05_Drainage_Basin_Bridge 문구에서 {d}를 빼고 "세월교 검토"만 남긴다 — 유효직경은
  앞머리가 적는다
- recommendationOf()가 ford_bridge도 맡아 bridge_required 특례 분기를 없앤다

실화면 확인(서버 기동 + Playwright): 네 줄이 각각 Ø929→추천 Ø1000 배관 /
Ø4719→세월교 검토 / Ø1529→BOX암거 후보 / Ø549→추천 Ø800 배관으로 표시된다.

검증: npm run typecheck 무오류, pytest tmp/tests 124 passed·7 skipped.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 19:33:18 +09:00
eomsangdonandClaude Opus 5 a9c46b9711 feat(B05): 배수 추천 구조물·관경 자동 설정 + 물넘이·세월교 개략 단면
지시 2 — 배수유역도가 유효직경 다음에 추천을 보여 주고, 초기 전처리 계산이
그 값으로 관 지점을 설정한다:
- recommend_structure(): 유효직경 임계로 구조물·관경을 고른다. D≤1500 배관(규격
  스냅 800·1000·1200·1500), 1500<D≤2000 BOX암거 후보, D>2000 세월교 검토.
  판정 근거는 유량뿐 — 계곡 횡단경사·하천 차수는 지형 계산이 필요해 뺐고 화면이
  "현장 확인"으로 안내한다(2026-08-17 사용자 확정)
- WatershedBasin에 recommended_facility·recommended_diameter_mm·required_area_m2
  추가, 응답 payload와 DetailBasin 타입까지 배선
- _apply_recommendations(): 자동 배치 관의 **빈칸에만** 추천을 채운다. 사용자가
  놓은 관(source=user)·이미 바꾼 시설·이미 있는 옵션 키는 건드리지 않는다.
  carry_facility_attributes 뒤에 얹어 승계값이 덮이지 않게 했다
- 유역 목록 표기: `Ø1234mm → 추천 Ø1500 배관` / `→ BOX암거 후보`
- 추천 관경 목록은 레지스트리 pipe_diameter_mm 선택지와 같아야 한다 — 폼에서 못
  고르는 값을 추천하지 않도록 테스트로 묶었다

지시 1 — 물넘이포장·세월교는 지정할 옵션이 거의 없으니 계산값이라도 보여 준다:
- 레지스트리에 ford_width_m(월류 폭) 신설. 기본값 없음 — 지식DB에 폭 근거가 없어
  프로그램이 지어내지 않는다
- fordSection(): 설계유량과 폭으로 필요 수심을 되짚는다. 광폭 근사로 출발해 실제
  동수반경(R=A/P)으로 수렴시킨다 — 근사값을 그대로 쓰면 통수능이 늘 설계유량에
  못 미쳐 판정이 무의미해진다. n=0.017·S=10%는 실무 수리계산서 역산값
  (울진1 물넘이·관 시트가 둘 다 S=0.10에서 검산 일치)
- 폼에 월류 폭 한 칸 + 읽기전용 요약(설계유량·필요 수심·필요 단면·유속). 설계유량은
  유역 payload에서 폼까지 배선(onPipesChanged → Page → setFacility)

⚠ 실무 시트의 수심 0.27m는 Qd 역산값이 아니라 가정 수심이다(B=20·h=0.27의 통수능
41.2㎥/s ≫ 그 시트 Qd 2.54㎥/s). 실무는 단면을 가정해 통수능을 검증하고, 프로그램은
필요 최소 수심을 낸다 — 화면 문구도 "필요 수심"으로 적었다.

검증: pytest tmp/tests 124 passed·7 skipped(신규 17건), npm run typecheck 무오류,
npm run build 성공. 물넘이 산식은 프론트 전용이라 수치 손검증으로 대신했다 —
Qd=2.54·B=20에서 필요 수심 0.0503m·유속 2.526m/s, 통수능이 2.5400㎥/s로 Qd와 일치.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 19:18:28 +09:00
eomsangdonandClaude Opus 5 d8aa525bb8 refactor(B05): 700줄 초과 잔여 2파일 분리 — Page·Profile_Panel
앞 커밋에서 남긴 두 파일을 마저 갈랐다. 상태를 모듈로 옮기면 나머지 참조가 전부
바뀌므로 상태는 제자리에 두고 **접근자만 넘기는** 방식으로 동작·공개 인터페이스를
보존했다.

- Profile_Panel 1152 → 649
  - _Profile_Layout: X축 배치(측점 칸 폭·캔버스 폭·chainage↔x 매핑). 순수 함수
  - _Profile_Heights: 그래프·유토곡선·테이블 높이 배분. 드래그 플래그·상세 유무는
    본체가 계속 들고 접근자로 읽는다(저장 높이 기준 판정 규칙 그대로)
  - _Profile_Render: 본문 재구성(캔버스·그래프·구조물 레인·테이블·유토곡선).
    그리기 시작 시 상태를 스냅숏하되 이벤트 핸들러 안에서만 현재값을 다시 읽는다
  - _Profile_Balance: 상단 균형 표시줄(절·성토·불균형·위반 경고·초기선 복원)
- Page 1031 → 685
  - _Page_Helpers: 설계폭 조회·모델 경계 변환·마커 복원·비정규 측점 보간 +
    시설 표시 이름
  - _Page_Structures: 구조물 정본과 관 지점 정본을 사이드 목록·그래프·3D에 맞추는
    다리. 두 정본을 섞는 지점이라 여기만 상태(비정규 측점 목록·판번호·저장 큐·
    타입 사전)를 팩토리 안으로 옮겼고, 본체는 bridge.irregularStations()로 읽는다

B05_Profile 전 파일이 700줄 이하가 됐다(최대 695).

검증: npm run typecheck 무오류, npm run build 성공(374 modules),
pytest tmp/tests 107 passed·7 skipped, prettier 정합.
프론트 테스트 러너가 없어 실제 화면 동작 확인은 남는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 18:51:21 +09:00
eomsangdonandClaude Opus 5 77f833bb25 feat(B05): 보호공 개편·종단 기준 기본 접힘·700줄 파일 분리 3건
지시 1 — 사이드 「종단 설계 기준」 컨테이너를 기본 접힘으로. section()에
collapsed 인자를 더해 초기 is-collapsed만 붙이고 토글은 전역 collapsible이
그대로 맡는다(B06 buildGroup과 같은 패턴).

지시 4 — 배수관 유입·유출 바닥 보호를 "보호공" 한 축으로 개편:
- 구 돌붙임 있음/없음 + 표면처리(찰/메) 두 축 → 돌붙임(찰)/돌붙임(메)/도수로.
  도수로·산비탈수로(B4)는 유출부에서 돌붙임 대신 쓰는 공종이라 별도 구조물이
  아니라 이 선택지로 받는다(별표2 유출구~원지반 도달 의무)
- "없음" 삭제 — 물이 흐르는 자리라 보호공은 필수(사용자 확정). 기본값은
  유입 돌붙임(찰)·유출 돌붙임(메)
- 치수는 배타 — 돌붙임이면 면적(㎡, 기본 10), 도수로면 폭(m, 기본 1.0)
- 저장 키 개명 *_pitching → *_protection, *_pitching_finish 삭제,
  *_protection_width_m 신설. 독립 기슭막이(D4)도 같은 축
- 구 저장분은 parse_pipe_points가 읽는 순간 새 키로 옮긴다("없음"은 부위
  기본값으로 승격). 폼 write()도 구 키를 폴백으로 읽어 structures.json 몫을 덮는다
- revetment.pitching_area_m2가 기본값과 required를 동시에 갖던 모순도 정리

지시 5 — 700줄 초과 파일 분리(순수 이동 + import 정리, 공개 인터페이스 불변):
- Drainage_Facility 724 → 401 (+_Facility_Fields 354)
- Structures_Panel 753 → 695 (+_Structures_List 113)
- Drainage_Panel 822 → 693 (+_Drainage_Chrome 150, +_Drainage_Interact 159)
- Page 1031 → 911 (+_Page_Helpers 144) — 아직 초과
- Profile_Panel 1152 — 미착수. 두 파일은 가변 클로저 상태를 곳곳에서 직접
  읽고 써 상태 승격이 선행돼야 하며, 프론트 테스트가 없어 순수 이동으로는
  떼어낼 수 없다. 분리안은 PLAN.md 3-3에 기록

검증: pytest tmp/tests 107 passed·7 skipped(신규 보호공 마이그레이션 6건 포함),
npm run typecheck 무오류, npm run build 성공(374 modules).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 18:19:46 +09:00
eomsangdonandClaude Opus 5 70bfddce1b feat(B05): BOX암거 본체 규격 프리셋·날개벽 기본 제원
- 본체 규격을 실무 관측 규격 프리셋(기본 2.0×2.0·3.0×3.0)으로 받고, 그 밖의
  규격만 "사용자 지정"으로 폭·높이를 직접 입력한다. 저장 키는 어느 쪽이든
  body_width_m·body_height_m 숫자 그대로 — 프리셋 전용 키를 만들지 않아야
  하류(B06 횡단도·수량)가 폭·높이만 읽고 끝난다
- 날개벽 유입·유출을 createWingFields 한 조각으로 묶고(기존 기슭막이
  createRevetmentFields와 같은 패턴) 설치 있음·짧은쪽 높이 1m·길이 2m·
  각도 45°를 프리필. 설치 "없음"이면 제원 칸을 접는다
- setFacility 빈값 폴백을 기본값으로 — 빈 문자열 대입으로 select가
  selectedIndex=-1(공백 표시)되던 문제도 함께 해소
- 레지스트리 정본에 위 기본값 10건 등재하고 required·phase:detail 해제.
  이 값들은 B05 서브폼이 실제로 받으므로 detail 표기가 정본과 어긋나 있었다
- addAt의 managed_by 분기에 BOX암거 한정 defaultOptions 동봉(방어선 —
  현재 우클릭 메뉴는 managed_by 타입을 제외하므로 도달하지 않는다)

기본값 전부 2026-08-17 사용자 확정. 검증: tmp/tests 101 passed·7 skipped,
npm run typecheck 무오류, prettier·ruff format 변경 없음.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 17:36:16 +09:00
eomsangdon 3e9be53e7c auto: 2026-08-17 17:09 (ESD_LAPTOP) 2026-08-17 17:09:05 +09:00
eomsangdon 38ea71e15b refactor(B05): 배관 편집을 구조물 배치 폼으로 단일화 — 별도 시설 폼 폐지
- 자동 배관·수동 배관은 같은 구조물(2026-08-17 사용자 지시) — 별도 편집 UI
  (createFacilityEditor) 폐지. 배관/BOX암거/물넘이/세월교도 일반 구조물과
  같은 흐름(구조물군 → 종류 → 시작·기준·종료 측점 → 옵션 → 추가/수정/삭제)
- createFacilityOptionsForm: 부속 옵션 서브폼이 구조물 폼 옵션 자리에 삽입.
  시설 종류는 종류 드롭다운, 위치는 측점 칸이 담당
- loadPipeForm: 목록·그래프·3D·배수유역도 어디서 골라도 같은 폼에 로드,
  버튼 [수정]. onPipeUpdate 신설(기준점 이동=관 이동, 옵션만=재계산)
- 기슭막이 총/앞/뒤 → 시작·종료 측점 칸 자동 채움. onPipesChanged에
  source·options 추가. 배수유역 패널은 지도·정본 보관·재계산만 담당
- 700줄 대응: 입력 조각을 B05_Profile_UI_Structures_Fields.ts로 분리
  (패널 685줄). tmp/tests 98건·typecheck·build 통과
2026-08-17 15:02:45 +09:00
eomsangdon 1e4da21dbc feat(B05): 부속 옵션 폼을 사이드 구조물 배치 섹션으로 이동
- 구조물 수정은 사이드 패널이 정위치(2026-08-17 사용자 지시) — 시설 편집 폼
  DOM을 배수유역 패널에서 분리(DrainagePanel.facilityForm)해 구조물 배치
  섹션 목록 위에 마운트(mountFacilityForm). 데이터·정본 동기화는 배수유역
  패널 소유 유지, 위치만 이동
- 전역 선택 동기화(97dd7cb9)와 결합: 리스트·그래프·3D·배수유역도 어느
  경로든 사이드에서 폼 개방. A군 [추가] 시 자동 선택으로 즉시 폼 개방
- 사이드 폭 대응 CSS flex-wrap. typecheck/build 통과
2026-08-17 14:50:21 +09:00
eomsangdon 97dd7cb968 feat(B05): 구조물 전역 선택 동기화 — 어느 화면에서 골라도 부속 옵션 폼 개방
- 갭: 배관 부속 폼(시설 편집)이 배수유역도 마커 직접 클릭에서만 열림 —
  리스트·종단 그래프·3D·유역 클릭은 강조만 되고 폼 미개방 (2026-08-17 확인)
- DrainagePanel.selectPipeAtChainage 신설: 밖에서 관 선택 시 마커+폼+유역
  강조까지 (같으면 무시). onPipeSelected 콜백: 유역 없는 관도 전 화면 전파,
  같은 값 재알림 억제(재계산 후 선택 풀림 방지)
- SelectionSync.selectPipeForm 포트: 그래프·3D(syncIrregularSelection)·유역
  (selectStationOfPipe) 경로에서 폼 개방. 리스트(onPipeFacilitySelect) 배선
- 재진입은 기존 selectionSyncing 가드 차단. typecheck/build 통과
2026-08-17 14:27:56 +09:00
eomsangdon df73d1e933 auto: 2026-08-17 14:05 (ESD_LAPTOP) 2026-08-17 14:05:32 +09:00
eomsangdon 16010da5a6 feat(B05): 구조물 선택지 재편·배관 부속 옵션 — B06 이관 보류·리셋 빈값
- 레지스트리: 바닥막이·생태연못 삭제(임도 미사용 확정), B·F·G군 10종
  enabled:false 보존(B06 횡단도 옵션 재사용), 배관 부속 13종(유형/관경 기본
  1000/집수정/기슭막이/돌붙임)·BOX암거 본체+날개벽(유입·유출 개별) 옵션 정의
- FacilityEditor 재작성: 유형 제안(자동 배치 source 승격), 집수정 유무 토글로
  유입부 옵션 전환, 기슭막이 길이 총/앞/뒤 상호 연계로 범위(시작·종료) 자동
- 구조물 배치: 군·종류 빈값 옵션+리셋 시 초기화, 사용법 설명 문단 제거
- tmp/tests 98건·ruff·prettier·typecheck·build 통과 (2026-08-17 사용자 확정)
2026-08-17 14:05:25 +09:00
eomsangdonandClaude Opus 5 2028af6152 feat(B05): 구조물 컨테이너 병합 3단계 — 섹션 통합·측점 두 칸 입력·구 UI 폐기
사용자 화면 피드백 3건(2026-08-17) 반영 + PLAN 3단계(이관·폐기).

- 「구조물 배치」 단일 섹션: 구 비정규 측점 섹션을 흡수·삭제하고 「구조물
  추가」를 개칭. 위치 입력은 측점번호+잔여거리 두 칸(구 비정규 UI 방식),
  순서 = 시작 측점 → 기준 측점 → 종료 측점(점형은 기준만, 비우면 시작).
- A그룹 제어 통합: A군 종류 목록에 계곡 통과 시설(배관/BOX암거/물넘이/세월교)
  표시 — 추가는 관 지점 정본 경유(onPipeAdd, 시설 종류 = type_id), 목록에
  "배수유역 연동"으로 병합 표시·선택 동기화·삭제. 노출형 횡단수로·개거는
  수동 구조물.
- 그래프 측점 표현: 서클마크 툴팁·벌룬 위치를 누가거리에서 측점번호+잔여
  거리 표기로 변경(mountStructureMarks에 측점간격 주입).
- 구 비정규 측점 이관: POST /route/structures/migrate 신설 — 기존 Migration
  매핑(배관 제외·기성막이→기슭막이·대피로→대피소) 사용, 정본 기존 (타입,
  기준점) 점유 검사로 멱등. Page 진입 시 구 확정분을 자동 이관하고 건수를
  토스트로 알린다. TDD 라우터 테스트 4건.
- 구 UI 폐기: onIrregularChange/Select 콜백 제거, 배관 투영은 Page의
  pipesToStations()가 직접 생성(시설 종류별 라벨). 그래프 측점선 드래그·
  삭제는 배관 전용으로 단일화, 구 우클릭 항목은 레지스트리 타입으로 매핑.
  drainage addPipe(chainage, facility?) 확장 — 통합 목록에서 시설 종류를
  지정해 추가하면 재계산 요청에 실려 정본까지 간다.

tmp/tests 92건·ruff·typecheck·build 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 09:28:07 +09:00
eomsangdonandClaude Opus 5 deaf51778f feat(B05): 구조물 컨테이너 병합 2단계 — 측점 표기·기준점 입력·계곡 통과 시설 UI
PLAN 2026-08-17 「B05 구조물 컨테이너 병합」 프론트엔드.

- B05_Profile_Util_Station.ts 신설: 측점번호+잔여거리("3+18.0") ↔ 누가거리
  변환·서식·해석. 누가거리 직접 입력도 허용, 부동소수 올림 보정.
- 구조물 패널: 위치 입력을 측점 표기 텍스트로 재편. 점형 = 기준 측점 1칸,
  구간형 = 기준점(비우면 시작)+시작+종료 3칸, 시작≤기준≤종료 검증과 잘못된
  입력 붉힘. 목록 표기도 측점식. 구간형 마크 드래그는 기준점 기준으로 시작·
  종료가 따라온다. 상세(detail) 옵션은 폼에서 숨긴다 — B05는 유무·종류·위치
  단계(2026-08-17 사용자 확정).
- 우클릭 메뉴 필터 완화: managed_by와 b05 phase 필수만 제외 — 상세 필수였던
  타입(옹벽·돌쌓기 등)도 우클릭 한 번으로 추가된다.
- B05_Profile_UI_Drainage_Facility.ts 신설(패널 700줄 제한 대응 분리): 관 마커
  선택 시 시설 종류(배관/BOX암거/물넘이/세월교)·구간·세월교 관 종류/크기/수량
  폼. FacilityStore가 시설 확장 정보를 보관하고 세부유역 재계산·저장 요청에
  되붙인다(관 이동 후에도 최근접 승계 — 백엔드 carry와 같은 기준). 응답이
  정본이라 apply()에서 전량 재구성.
- B04_PreProcess_Api_Fetch.ts: PipeFacility·DetailPipeInput 타입, 요청·응답에
  시설 필드 반영.

npm run typecheck·npm run build 통과. 통합 서클마크 표시와 구 비정규 측점
이관·폐기(3단계)는 배관 측점선 체계 이전과 묶어 다음 작업 — PLAN.md 체크리스트
에 미완 사유 기록.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 09:06:19 +09:00
eomsangdonandClaude Opus 5 1d07633260 feat(B05): 구조물 컨테이너 병합 1단계 — 계곡 통과 시설·구간 기준점·phase 분리
PLAN 2026-08-17 「B05 구조물 컨테이너 병합」 백엔드. 배관 정본은 유역 계산의
입력이라 저장소를 옮기지 않고 제자리 확장한다.

- PipePoint: facility(배관/BOX암거/물넘이/세월교)·start_m/end_m(기준점 앞뒤
  구간)·options(세월교 관 종류/크기/수량) 추가. 구 파일은 배관·폭 미지정으로
  읽히고 기본값은 저장 시 생략된다(하위 호환). 교량은 임도용이 아니라 없다.
- carry_facility_attributes: 세부유역 계산기는 chainage만 다뤄 재구성 목록이
  전부 기본 배관이 된다 — 원본에서 종류·구간·옵션을 되붙인다. B04 basins
  라우터의 재구성 지점에 적용하고 응답·GeoJSON에도 시설 정보를 싣는다.
- StructureInstance: 구간형 chainage_m = 기준점(마킹 위치) 허용, 시작≤기준≤종료
  검증, 미지정 시 시점으로 채움(기존 저장분 호환). anchor_m = 기준점.
- 레지스트리: 옵션 phase 필드(b05/detail) 신설. required 32건을 detail로 이동
  — 필수 원칙은 유지하고 강제 시점만 B06/B07로 미룬다(B05 = 유무·종류·위치
  단계, 2026-08-17 사용자 확정). BOX암거·물넘이·세월교(표시용, managed_by=
  pipe_points)와 A6 노출형 횡단수로·A7 개거(수동) 5종 추가, 총 37종.
- Repository: phase=detail 옵션은 B05 저장에서 필수 강제 제외. b05 필수는
  기존대로 강제.

tmp/tests 88건 통과 (신규: pipe facility 16·span anchor 10·registry 정책 재편).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 08:54:47 +09:00
eomsangdonandClaude Opus 5 9a5496c47f fix(B04): NURBS 곡면 발산 — 평활계수 완화·표고 범위 방어·등고선 레벨 상한 순서
csf-nurbs 등고선 캐시가 Maximum allowed size exceeded로 실패하던 문제.
평활계수 s가 제어점당 잔차제곱 0.01(RMS 0.1m)로 너무 빡빡해 FITPACK이
제어점 수(122x113)보다 많은 knot(126x117)을 밀어넣고 계수가 발산했다.
실측 표고: csf 1e105, grid_min_z 1e10. grid_min_z는 footprint 안쪽만
보고 z 범위를 잡아 조용히 통과하고 있었다.

- ModelContext에 fit_nurbs_spline/evaluate_nurbs_spline 신설. 모델 빌더와
  등고선 엔진이 같은 곡면을 각각 만들면서 s 식이 두 곳에 중복돼 있었다.
- NURBS_RESIDUAL_PER_CONTROL_POINT = 1.0 (RMS 1m). knot이 17~35로 떨어지고
  세 지면 필터 모두 데이터 표고 범위 안에 머문다. NURBS는 평활 곡면
  표현이라 이 정도 완화가 맞다.
- 평가 결과가 제어 표고 범위(±50% 여유)를 벗어나면 잘라내고 경고를 남긴다.
  방치하면 float32 캐스팅에서 inf가 되어 프리뷰 색상(nan)과 등고선까지 번진다.
- extract_contours_from_grid: 레벨 수 상한 검사를 np.arange 앞으로 옮겼다.
  뒤에 있어서 상한이 무용지물이었다 — 배열이 만들어지기 전에 터진다.

확인: 3필터 모두 곡면이 제어 표고 범위 내(grid_min_z 503.6~573.1,
csf 504.7~552.3, pmf 504.6~551.8), 등고선 0.55~1.64초에 정상 산출.
표고 범위 1e12 격자도 예외 없이 처리. tmp/tests 59건 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 02:23:42 +09:00
eomsangdon f4a9791662 auto: 2026-08-17 02:03 (ESD_LAPTOP) 2026-08-17 02:03:12 +09:00
eomsangdonandClaude Opus 5 5d0346aa5c perf(B04): 등고선 추출 삼각망 래스터화 — 15유닛 27분39초에서 77.6초로
griddata가 질의점마다 삼각형 98만개 망에서 위치탐색(find_simplex)을 돌던
것이 등고선 1회 2~5분의 원인이었다. 삼각형을 격자에 직접 래스터화해
위치탐색을 제거한다. 분석 범위 15유닛과 스무딩 온오프는 그대로 유지.

- rasterize_triangle_mesh 신설: 삼각형별 격자 bbox만 순회하며 무게중심
  선형보간. 격자 인덱스는 np.searchsorted로 축을 직접 탐색한다 — _grid_axes가
  float32 축을 만드는데 UTM 좌표에서 해상도가 0.015625m라 등간격 환산 시
  최대 0.81셀 어긋나 실데이터 8,819셀을 놓쳤다.
- triangular_mesh: griddata 제거, npz에 저장된 faces 재사용. 저장 faces는
  긴 변 제거·외곽 클리핑이 반영된 실제 TIN이라 재삼각분할보다 충실하다.
- meshfree_surfels: Delaunay 1회로 삼각분할과 hull 판정을 함께 해결.
  기존의 griddata 내부 + 별도 Delaunay 2회를 1회로 줄였다.

검증: meshfree·dtm 산출물 완전 일치(세그먼트·정점 수), tin은 삼각망 차이만큼
정점 -0.03%(레벨 집합·좌표 범위 동일, 표고차 최대 0.4083m). 래스터화에 같은
재Delaunay를 넣으면 griddata와 셀 단위 차이 0 — 보간 정확성 확인.
tmp/tests 66건 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 02:03:03 +09:00
eomsangdonandClaude Fable 5 84eb027348 fix(B05): 크로스체크 2차 4건 반영 — 우클릭 추가 실패·미협의 기본값·STALE 통지
교차검증 2차에서 재현된 실제 실패를 수정한다.

1. 우클릭 구조물 추가가 대부분 저장 거절되던 문제
   - 메뉴가 레지스트리 앞 12개를 그대로 노출해 배관(별도 정본)과 필수 제원이
     있는 C군이 섞였고, addAt()이 값 없이 즉시 저장해 서버가 거절했다.
     실패 항목은 structure_id 없이 화면에 남아 수정·삭제도 막혔다.
   - 메뉴는 managed_by 없고 required 옵션 없는 타입만 노출한다.
   - 필수 입력 타입은 저장 대신 측점을 채운 사이드 폼을 열고 첫 필수 칸에
     포커스를 준다.
   - 저장이 실패하거나 충돌하면 서버 정본을 다시 받아 화면을 되돌린다.

2. 미협의 선택값이 기본값으로 자동 저장되던 문제
   - 재료·형식 선택형 18건의 default를 없애고 required로 바꿨다.
     화면 select에는 "선택하세요" 빈 항목을 두고, defaultOptions()가 첫
     선택지를 대신 채우던 동작을 없앴다.
   - 남긴 default는 법정 단일값, 사용자 확정값(골막이), 표시용 문자열뿐이다.

3. STALE 갱신 실패를 사용자가 알 수 없던 문제
   - 응답에 needs_downstream_invalidation을 추가해 "되돌려야 했는가"와
     "되돌렸는가"를 구분한다. 어긋나면 화면이 B06 재실행을 안내한다.

4. 회귀 방지: 레지스트리 정책 테스트 신설(우클릭 목록 구성·기본값 원칙).

pytest 49건 통과 · tsc 0 · ruff 통과 · npm run build 성공.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 23:13:19 +09:00
eomsangdonandClaude Fable 5 f7f1cb3163 revert(B08): openwebcad typescript 핀 원복 — 진단 중 설치한 5.5.4 고정을 ^5.2.2로 되돌림
빌드 실패 원인은 typescript 버전이 아니라 node_modules 부분 설치(패키지 dist·bin
디렉터리가 빈 상태로 남아 npm이 재추출을 건너뜀)였다. node_modules를 지우고 다시
설치해 해결했으므로, 진단 과정에서 바뀐 버전 핀은 원래 범위로 되돌린다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 23:06:40 +09:00
eomsangdon f1c17e2a75 auto: 2026-08-16 23:05 (ESD_LAPTOP) 2026-08-16 23:05:57 +09:00
eomsangdonandClaude Fable 5 9bc13b0bc8 fix(main): 포트 정리 netstat 인코딩 — 한글 Windows에서 UnicodeDecodeError로 죽던 문제
`_free_dev_port`의 netstat 호출이 text=True만 주고 encoding을 지정하지 않아
기본 utf-8로 읽었다. 한글 Windows의 netstat는 콘솔 코드페이지(cp949)로 찍으므로
한글 헤더의 0xbc 바이트에서 디코딩이 터졌고, 그 예외가 subprocess 읽기 스레드에서
발생해 try/except로도 잡히지 않았다.

시스템 기본 인코딩으로 읽고 깨진 바이트는 대체 문자로 넘긴다 — 이 함수가 보는 값은
포트 번호와 PID뿐이라 한글 헤더는 읽지 못해도 무방하다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 23:05:56 +09:00
eomsangdonandClaude Fable 5 4af0dbdb8a fix(B05): 크로스체크 5건 반영 — 마이그레이션 문자열 판별·서버 검증·기본값 원칙·404·STALE 정합
외부 AI 교차검증 미통과 지적을 전부 수정한다.

1. 마이그레이션: 확정 저장분은 structure 문자열뿐(structureType 없음) —
   라벨 파싱 판별 추가(기성막이/대피로 X.Xm/관종 D직경). 명시 필드가
   라벨 파싱보다 우선.
2. 서버 검증 강화(_validate_types 확장): 레지스트리 배치형태 대조,
   미정의 옵션 거절, number 옵션 유한·0 이상, select 선택지 검사,
   required 옵션 누락 거절, structure_id 중복 거절, 노선 연장 범위
   검증(라우터가 get_latest_route로 총연장 주입, 없으면 생략).
3. 기본값 원칙: 법정 명시값(별표2 측구 30cm·대피소 5/15m 등)·사용자
   기확정값(골막이)만 default 유지. 옹벽·돌쌓기 높이, 사토장·토취장
   면적/용량, 포장·쇄석 두께 등 미확정 수치는 default 제거 + required
   (화면 placeholder "필수 입력"+빈 값 추가 차단, 서버도 거절).
4. 404: get_project_storage_relative_path는 없는 프로젝트에서
   LookupError를 던짐 — _project_root에서 잡아 None, 라우터 예외
   사다리에도 LookupError→404 분기.
5. STALE 정합: _invalidate_downstream이 성공 여부 반환 —
   invalidated_downstream은 실제 전파 성공 시에만 true.

pytest 42건(tmp/tests) 통과 · tsc 0 · ruff 통과.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 22:58:43 +09:00
eomsangdonandClaude Fable 5 61108f540d feat(B05): 구조물 수동 추가 프론트 — 패널·종단도 서클마크·벌룬·정본 연동
구조물군 B~G 전체를 화면에서 수동 배치할 수 있게 한다. 타입 목록·옵션 폼은
서버 레지스트리(GET /structure-types)에서 받아 그리므로 구조물이 늘어도
프론트 코드는 그대로다.

- B05_Profile_Api_Structures.ts: 레지스트리·정본 CRUD 클라이언트.
  409(판번호 충돌)를 전용 오류로 구분, 구간형 기점 앵커 헬퍼.
- B05_Profile_UI_Structures_Panel.ts: 사이드바 「구조물 추가」 섹션.
  구조물군→종류→위치(점형/구간형)·설치측·이격·옵션 동적 폼·메모.
- B05_Profile_UI_Structures_Marks.ts: 종단 그래프 서클마크 오버레이.
  전 배치형태 = 마크 하나(구간형은 기점), 선택 시 벌룬 + 구간 띠 확장
  (2026-08-16 사용자 확정 표기 규칙). 드래그 이동·겹침 스택.
- B05_Profile_UI_Style_Structures.css: 마크·띠·벌룬 스타일.
- Profile_Panel: 마크 레이어 장착·타입 주입·선택 동기화 API 추가.
  우클릭 메뉴(Profile_Structures)에 레지스트리 타입 추가 항목.
- Page: 진입 시 타입·정본 로드, 변경 즉시 정본 저장(직렬화 큐),
  409 시 최신본 재적재 안내, 그래프↔사이드 선택 양방향 동기화.
  정본 주입은 onChange를 울리지 않아 저장 루프를 차단.

tsc --noEmit 통과. 기존 배관·배수유역·종단 편집 흐름은 손대지 않았다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 22:30:36 +09:00
eomsangdonandClaude Fable 5 50e5626a95 feat(B05): 구조물 타입 레지스트리·정본 CRUD 백엔드 추가
임도 구조물 전체(구조물군 B~G)를 수동 배치할 수 있도록 백엔드 기반을 만든다.
타입 정의를 코드가 아닌 데이터(JSON 레지스트리)로 두어, 구조물 목록이 바뀌어도
코드를 고치지 않고 화면 폼까지 따라오게 했다.

- B05_Profile_Structure_Types.json: 타입 레지스트리 정본 (B~G 32종 + 호환 4종).
  배치형태(point/interval/site)·옵션 스키마·마크 스타일·drawing_views 메타 포함.
- B05_Profile_Structures_Schema.py: 타입·인스턴스 Pydantic 모델.
  배치형태별 위치 필드 배타 검증, side·offset_m·placement_source·status·revision.
- B05_Profile_Structures_Repository.py: structures.json 단일 정본 읽기·쓰기.
  atomic_write_json 재사용, base_revision 불일치 시 충돌 예외,
  설계 영향 변경만 후속 단계를 무효화하도록 판정하는 지문 비교.
- B05_Profile_Structures_Migration.py: 기존 비정규 측점 이관.
  배관은 pipe_points.json 정본이라 제외, 기성막이→기슭막이, 대피로→대피소 통합,
  나머지는 이름을 살려 기타. 같은 입력이면 같은 결과.
- B05_Profile_Structures_Router.py: GET /structure-types, 구조물 목록 조회·저장.
  판번호 충돌 409, 미등록·타 정본 관리 타입 400, 저장 후 B06 이후 STALE 전파.

테스트 45건(tmp/tests) 통과. 기존 배관·배수유역·종단 편집 코드는 건드리지 않았다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 22:19:00 +09:00
eomsangdonandClaude Fable 5 7705a9c961 docs(pipeline): gen_md.py 잔여 코드 안내 주석 — 구 전체생성 조립부는 산출물 미사용
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 20:35:40 +09:00
eomsangdonandClaude Fable 5 40e7d8301a knowledge(색인): 04 목록 근거 원장 재구성 — 절 계층화·AUTO 마커·gen_md 스플라이스화
04_참조_법령기준_목록.md (파일명 유지):
- 제목 정정(# 0. → # 04.) + 성격 재정의: 근거 등록부·탐색 관문
  (전체 인벤토리는 각 _index.md, 역링크 없이 technical_info sources = SSOT)
- 근거 수준 절 분리: §1~§4 법정 등록표(수동) / §5 원문 색인(자동) /
  §6 품셈·원가 기능별 링크 모음(중복 등록 없음) / §7 공식 기초가격 원천
  (노임 2·나라장터·ECOS·오피넷, 전용 필드) / §8 교본(보조 참고) /
  §9 포맷·실무 검증자료(경고+인덱스 위임) / §10 갱신 관리 / §11 통계(114건 실측)

gen_md.py:
- 전체 덮어쓰기 → AUTO:INDEX 마커 스플라이스 (수기 행·큐레이션 절 보존,
  마커 없으면 실행 거부)
- 잠복 버그 2건 수정: ORIG=OUTMD.parent(이동 후 빈 색인 생성) → ROOT_DIR,
  색인 링크 original/ 접두 누락 → 보정. 재실행으로 색인 최신화
  (법령 md 161→182·별표 292→312, 조달수수료 폴더 자동 반영, 깨진 링크 0)

연동 정정:
- 00_운영지침: 깨진 구경로 2곳 수정, §6 갱신주기표 → 04 §10 이관(SSOT)
- 01_수집지침 W6: 색인 절만 재생성으로 절차 변경, 수기 행 추가 규칙 명시
- _pipeline/README·knowledge README 설명 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 20:33:18 +09:00
eomsangdonandClaude Fable 5 b6fc46ebf7 knowledge(원가): 조달수수료 md 성격 표현 정정 — 전문 md화 → 핵심 규정 구조화본
맞춤형서비스 요율 요지 압축·단위업무별 구성비 생략을 헤더에 명시.
전체 원문 = 첨부 추출본(_extracted_fulltext.txt)·원본 HWP.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 20:09:27 +09:00
eomsangdonandClaude Fable 5 52f4e512f5 knowledge(원가): 미결 No.20 해소 — 조달수수료 고시 제2025-22호 원문 수집·반영
- original/행정규칙/조달수수료 고시/ 신설: 현행_20250701.md(전문 md화)
  + 원본 HWP(나라장터 공지 첨부) + 추출 원자료 + _index/_meta
- 핵심 규명: 실무 관측 0.54% = 현행 내자구매 단가계약(일반·3자·MAS)
  정률 0.54%(10억원 이하, 초과 0.47/0.37% 체감)와 일치 — 관급자재
  쇼핑몰 구매 시 단가계약 열 적용. 총액계약은 구간별 정액·정률 별도
- 반영: 제비율(§1 현행값·sources·§3 해소), 원가계산_체계, 입출력변수사전
  (⚠ 각주 갱신 — 원문 확보·검증 세션 대조 전), 단수처리_규칙 §3
- 04_참조_법령기준_목록 No.25 등록, 03_미결 No.20 행 삭제
- 주의 기록: 한시적 감경 특례 고시(조기·신속집행) 수시 병행 — 적용
  시점 특례 확인 필요

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 20:05:20 +09:00
eomsangdonandClaude Fable 5 67d04ed8fa knowledge(원가·STC): 검증 지적 4건 반영 — XOR 프로브 스크립트·표현 완화·상태 각주
- _scripts/xor_probe.py 신설: 키스트림 후보 유도 가정·계산 범위·한계 명시,
  파일 간 일치율·공백 복원 데모 출력. STC_난독화_상태 §2에 실행 명령·출력 기록
  (SYSINFO 7파일 100%·BDQTY 83~100%·공백 복원 82~91% — 재현 가능해짐)
- 단수처리_규칙: "설계연도 무관 규칙" → "2024~25 STmate 산출물 5건 관측 구현
  후보 규칙"으로 완화, 일반화 전 미확정 5요소(타 버전·발주기관·법령 의무·
  CUTNM·예외값) 명시, "5건 전부 일치" → "항목 존재 파일 전부 동일"
- 입출력변수사전(verified): 조달수수료·D9-1·D10 신규 행에 검증 범위 밖
  ⚠ 각주 (evidence=observed, 미결 No.20 연동) — 문서 상태는 유지
- 표현 완화 2곳: "포맷 고유 특성 확정" → "강한 증거 (알고리즘 미확정)"
  (교차비교·_STC포맷분석), extract_rounding.py 주석 6개→5개 정정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 19:46:57 +09:00
eomsangdonandClaude Fable 5 89e3b034e9 knowledge(원가·STC): 계산로직 3건 신설·STC 포맷 명세 9문서 + BDQTY 난독화 오판 정정
계산 로직 트랙 (technical_info/05_원가정보):
- 단수처리_규칙.md 신설: 위치별 3함수(내역·제경비 ROUNDDOWN 원절사 / 집계표
  ROUND / 관급자재대 ROUNDUP 천원올림) — 5공사지 xlsx 수식 교차 추출,
  관급자재대 +620원 차이 = 천원올림 규명
- 조달수수료 계상 구조: base→fee→total 3변수 분리(순환 정의 방지),
  원가계산_체계·제비율·입출력변수사전 반영 (0.54%는 과거 관측 ⚠, 현행 원문 미수집)
- 자재단가_적용 §3-1: 적용단가 채택 규칙 후보 — COSTN PG_1 분포(자재만 출처
  선택 존재) 관측, 알고리즘 미확정 명시

STC 포맷 트랙 (original/원가계산/STmate/ 신설 — import/export 필수 요구사항):
- 컨테이너·필드사전 핵심/보조·난독화상태·교차비교·SIxMemo·INITIAL·왕복검증
  9문서 + 재현 스크립트 2본
- 7개 STC 전수 자동 비교: BDQTY·SYSINFO 난독화 전수 재현(플래그 0x45),
  SYSINFO 키스트림 파일 간 100% 동일, BOQ12(다공구)·차수 슬롯 신규 발견

정정:
- _STC포맷분석.md: BDQTY·SYSINFO "빈 것" 오판 정정(실재 667·8건 난독화),
  교차대조 7파일 확장
- _숨김탭분석.md: INITIAL "무가치" 철회 — STC/xlsx 입출력 매핑 참조로 재분류

미결 3건 등록: No.19 STmate 실기 환경, No.20 조달수수료 현행 원문,
No.21 포맷 역공학 라이선스

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 19:40:27 +09:00
eomsangdonandClaude Fable 5 a29ca1a11d docs(knowledge): 신설 7문서 원문 전수 검증 (Z11) — 65문서 검증 완료·verified 승격
Z1~Z10(2026-08-12, 58건) 이후 신설된 원가·수량 계열 7건을 원문 1:1 대조.
사방 2건(01_수량산출·01_원가_특이사항)은 개명분으로 기검증 확인 — 잔여는 7건.

 통과 4건:
- 노임단가_적용: 승인번호·직종수·조사규모·적용요령(8시간/기본급여액/유사직종
  준용/증가율 보정)·제조업 수당 6종·용도 제한 문구·품셈 1-2-5 구분 전수 일치
- 기계경비_산정: 품셈 8-1-2~8-1-7 전 조항(손료 구성·C.I.F·잔존율·보정표·
  [주]①②·운전사 3구분·Q식) 일치
- 건설품셈_활용: 5부문 45장 실측·장 매핑 링크 전수 실존·별표2 근거 문구 일치
- 원가_기초데이터_원천: ESTX SHA·산식 통계·슬롯 채택률·게시판 표 정합 재확인

✏ 정정 3건:
- 자재단가_적용·원가_입력변수_사전: 모래·자갈 할증 단일값 표기를 용도별
  구분(잔골재 10/12·노반 6·관류기초 4 / 굵은골재 3/5·노반 4)으로 정정
- 원가_출력변수_사전: B6-2 포장 근거 — 별표3의2(노폭확장 한정) 단독 인용을
  별표2 Ⅰ.2.바.(2) 일반 근거 병기로 보완

_최종검증로그: Z11 7행 추가, 총괄 65문서 전수 검증으로 갱신.
7건 status: draft → verified (00_운영지침 4단계 스키마 최초 적용).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 08:23:23 +09:00
eomsangdonandClaude Fable 5 950d3828d0 docs(knowledge): 문서 승인 상태 4단계 스키마 정의 (draft→verified→approved→exported)
- 00_운영지침 §4: 구 draft|confirmed 를 4단계로 대체 — verified(원문 검증)·
  approved(사용자 승인)·exported(JSON 반영). 승격 조건·강등 규칙(원문 개정 시
  draft 강등 = 검증 자동 무효화)·건너뛰기 금지 명시
- 기존 65문서는 draft 유지 — 검증 세션 통과분부터 개별 승격 (일괄 변경 금지)
- §7 프로그램 연계: 기준값 배포 = approved 이상, 데이터 연동 = exported 만 신뢰

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 08:11:54 +09:00
eomsangdonandClaude Fable 5 1932e1c4d1 fix(data): coef 토량 중복행 원문 미러링 + 노임 신뢰도 플래그 40건
- coef_2026.json: 2026-08-14 감사 반영 — '암괴ㆍ호박돌 섞인 점질토'(원문 부재)를
  '암괴(岩塊)나 호박돌이 섞인 점토'로 정정, '역이 섞인 점질토' 값 상이 2행을
  원문 그대로 수록. 중복 쌍에 duplicate_group·duplicate_index·selection:pending
  부여 (기본 채택행 = 개발 단계 사용자 선정). 토량계산.md 해시 재동기화 —
  원가 JSON 해시 불일치 잔여 0건
- labor_const JSON: 원문 신뢰도 기호 reliability 필드로 반영 (* 26 · ** 14 =
  40직종). 포설공·일반기계운전사 등 임도 빈발 직종 경고 근거. 단가 무변
- _manifest.json: coef·labor 해시/크기 갱신, selection_pending에 토량 중복행
  채택 항목 등록 (rate_environment와 동일 패턴 — 값 선정형은 미결표 미등록)
- 원가_입력변수_사전: G3에 신뢰도 플래그 설명 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 08:11:06 +09:00
eomsangdonandClaude Fable 5 6df07f60a1 fix(knowledge): 검토내역 8건 반영 — 상한 제거·행정규칙 부칙 복원·회귀검사 신설
타 AI 검토내역(tmp/기술문서DB_검토내역_260814.md) 전수 검증 후 동의분 적용.

파이프라인:
- fix_fences.py units[:20] / collect_law.py 별표 limit=80·변경이력 [:40] 상한 제거
- gen_md.py 기준목록 출력을 운영본(04_참조_법령기준_목록.md) 경로로 정정
- README 구경로(docs/raw/law) 3곳 현행화, ruff format 일괄 적용
- verify_structure.py 신설: XML↔md 부칙·목·별표·CHANGELOG 행수 회귀검사

신규 발견 결함 2건 정정 (검토내역에 없던 것):
- 행정규칙 XML은 부칙내용이 부칙 직속(부칙단위 래퍼 없음) — 변환기가 미처리해
  행정규칙 md 22건에 부칙 전무. patch_law_md 확장 후 부칙 138건 복원
- patch_law_md 부칙 dedup 키가 괄호형 타법개정 헤더 미매칭 — 재실행 시
  기존 부칙 1,724건 중복 추가되는 비멱등 결함. 정규식 보강

재수집 (law.go.kr):
- 대기환경보전법 시행규칙 별표 PDF 78건 추가 확보 (80→158, 전수)
- CHANGELOG 절단 3건 재생성 (고용보험법 시행령 42·국가계약법 시행령 41·
  대기환경 45회 — API 연혁과 전건 일치 확인)

기술문서·데이터:
- _최종검증로그: 55문서 스냅샷 범위 명시 (현재 65문서, 신설 10건 미검증 주지)
- 제비율.md frontmatter에 조달청 제비율(2026.04.13)·국민연금법 출처 보강
- 원가_입력변수_사전: 장비대금 지급보증을 공사종류별 표로 정정, csv→json 표기
- labor_const JSON: 원문 노임 118건 전건 일치 확인 후 해시만 재동기화
  (원문 변경분 = 신뢰도 플래그 컬럼뿐, 단가 무변)

검증: verify_structure 결함 0건, patch_law_md 재실행 +0 (멱등),
원가 JSON 해시 56건 중 잔여 불일치 1건(coef_2026 — 사용자 협의 대상)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 07:47:36 +09:00
eomsangdon 46bcaf4f4a docs(knowledge): 원문 인용 4원칙·갱신주기표 + 원가 입력변수 데이터셋 10건
- 00_운영지침 §5: 원문 인용 4원칙 신설(범위 축약 금지·조건 단서 동반·법률
  부칙 특례 확인·교본값을 현행으로 쓰지 않기) — 감사 오류 30건의 공통 원인
- §6: 갱신 주기표(산재고시 2027-01·노임 2026-09·제비율 분기·품셈 연간),
  재검토기한 경과 고시 4건, patch_law_md 절차
- data_cost_input_value: 노임·자재·품·제비율·환율·유가·중기·계수 JSON 10건
2026-08-14 20:38:52 +09:00
eomsangdon a3b23dea49 fix(knowledge): 기술문서 오류 30건 정정 (전역 감사 결과 반영)
상: 국가지점번호판 1km→500m(훈령 제26조⑤, 수량식 ⌈연장÷500⌉로 교체)
중: 연금·요양 요율 출처를 부칙 §4·법 §9①로 / 암석 손료 보정 제외 단서 복원 /
  찰쌓기 채움 콘크리트 소요량표 전면 수록 / 배수공 2~3㎡당 1개소 이상(범위
  유지) / 쇄석 두께 근거 삭제 / 모래 할증 용도별 3종 / 노임 근거 산림품셈
  1-2-5 / 투과형 사방댐 토석류 1.5배 할증 / 돌쌓기댐 1:0.3~0.5 / 지반반력
  P₁=2V/(3d) / 평가위원 기술특급·고급 4명 이상 / 물빼기구멍 PVC·흄관 분리 /
  평면도 축척 오해석
하: 안전관리비 밑수 +도급자관급(3문서 통일) / KDS 현행 23.01 인용 / 조번호·
  항목명 / 미결 참조 / 고용보험 7등급 이하 1.01% / 산림재난방지법 체계표

링크 전수 검사 67문서 0건 깨짐
2026-08-14 20:38:33 +09:00
eomsangdon b586c7443f fix(knowledge): 원문 변환 누락분 복원 (부칙 2,264·목 2,114·노임 플래그 40·KDS 표 2)
- 법령 md 83건: 최신 부칙 전건과 목(가·나·다) 보충. 국민연금 2025 연금개혁
  부칙, 임도 종류 정의(간선·산불진화·작업임도) 복원. 사후 점검 109건 중복 0
- 노임 정밀파싱표: 신뢰도 플래그 * 26 · ** 14 복원(원문 일치). 포설공·일반
  기계운전사 등 임도 빈발 직종 경고 표시 회복
- 조달청 제비율 md: xlsx 누락 표 6종(고용보험 등급표·환경보전비·법정부담금·
  퇴직공제·보증수수료) 복원
- KDS 44 40 00 md: hwp 원본 판독으로 유출계수 12항목·경제적 수로단면
  원형수로 행(H=0.94D) 복원 — 수식개체(EQEDIT) 미변환분
2026-08-14 20:38:10 +09:00