- 자동 배관·수동 배관은 같은 구조물(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 사용자 지시) — 시설 편집 폼
DOM을 배수유역 패널에서 분리(DrainagePanel.facilityForm)해 구조물 배치
섹션 목록 위에 마운트(mountFacilityForm). 데이터·정본 동기화는 배수유역
패널 소유 유지, 위치만 이동
- 전역 선택 동기화(97dd7cb9)와 결합: 리스트·그래프·3D·배수유역도 어느
경로든 사이드에서 폼 개방. A군 [추가] 시 자동 선택으로 즉시 폼 개방
- 사이드 폭 대응 CSS flex-wrap. typecheck/build 통과
- 갭: 배관 부속 폼(시설 편집)이 배수유역도 마커 직접 클릭에서만 열림 —
리스트·종단 그래프·3D·유역 클릭은 강조만 되고 폼 미개방 (2026-08-17 확인)
- DrainagePanel.selectPipeAtChainage 신설: 밖에서 관 선택 시 마커+폼+유역
강조까지 (같으면 무시). onPipeSelected 콜백: 유역 없는 관도 전 화면 전파,
같은 값 재알림 억제(재계산 후 선택 풀림 방지)
- SelectionSync.selectPipeForm 포트: 그래프·3D(syncIrregularSelection)·유역
(selectStationOfPipe) 경로에서 폼 개방. 리스트(onPipeFacilitySelect) 배선
- 재진입은 기존 selectionSyncing 가드 차단. typecheck/build 통과
사용자 화면 피드백 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>
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>
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>
교차검증 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>
빌드 실패 원인은 typescript 버전이 아니라 node_modules 부분 설치(패키지 dist·bin
디렉터리가 빈 상태로 남아 npm이 재추출을 건너뜀)였다. node_modules를 지우고 다시
설치해 해결했으므로, 진단 과정에서 바뀐 버전 핀은 원래 범위로 되돌린다.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
`_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>
구조물군 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>
임도 구조물 전체(구조물군 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>
- _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>
- 00_운영지침 §4: 구 draft|confirmed 를 4단계로 대체 — verified(원문 검증)·
approved(사용자 승인)·exported(JSON 반영). 승격 조건·강등 규칙(원문 개정 시
draft 강등 = 검증 자동 무효화)·건너뛰기 금지 명시
- 기존 65문서는 draft 유지 — 검증 세션 통과분부터 개별 승격 (일괄 변경 금지)
- §7 프로그램 연계: 기준값 배포 = approved 이상, 데이터 연동 = exported 만 신뢰
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 05_원가정보/내역서_구성항목_총람.md: A 문서구성 17종(별표2+미결17 대상표),
B 공종 79항목(산림품셈 절번호·단위·빈도, 준비~부대공 8그룹), C 기초단가
(직종 15·자재 3경로·중기 10작업군·값층 5), D 원가 14항목, E 현행 공백 6건.
채택 칸 공란 = 사용자 결정용. 링크 검사 0깨짐
- p.260 항타 그래프 등이 가로 조각 8개로 분할 추출된 문제(사용자 발견)
- 조각 삭제 후 원본 PDF 그림 영역을 2.5배 렌더 캡처로 교체 (품셈 p260·건협 p6·중기중앙회 p45)
- md 참조를 병합본 1건으로 치환, 챕터 하위폴더의 ../pic 상대경로 깊이 오류 10건 수정
- 해시 중복(5회 이상) 그룹 시각 확인 후 삭제: 페이지 배경 띠(90)·헤더 바(34)·
KBIZ 로고(18)·간지 배너 조각(54)·말풍선/빈 이미지(15)
- md 48건에서 해당 이미지 참조 라인 제거 (깨진 링크 방지)
- 유지 59건 = 실제 내용 그림 (조사 입력화면·품셈 삽도 등)