knowledge(요구): 620 분석 기록 — B06 관 옵션 칸 지워짐 까닭 커밋 · 고칠 길(데이터 손실 아님)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015uTVHHDv583hbLQAFeBmd9
This commit is contained in:
2026-10-31 19:03:08 +09:00
co-authored by Claude Opus 5.5
parent 64dfd2565c
commit 1ba5d49043
@@ -0,0 +1,69 @@
# 620 분석 — B06 [저장] 뒤 관 지점 옵션 inlet_revet_* 지워짐 · 동물이동형 true 들어감
판 = main_laptop_1 HEAD 2648c92b7 · 읽기만 · 재현 스크립트 `tmp/brain_620/repro_620.cjs`(검증_sub6 파일 읽기만).
## 0. 결론
- 데이터 손실 아님. 지워지는 다섯 칸 = 유입 구조가 집수정일 때 **아무도 안 읽는 칸**. 형상 · 수량 · 내역 그대로.
- 지워짐 = 의도된 병합 규칙(a1b1182b9). 동물이동형 true = 의도된 기본값 채움(3ed10bf38 · 177-2).
- 증상이 보이는 까닭 = 서버가 새 관에 **안 쓰는 갈래 기본값까지** 채움(79ca22082) + 유입 기본값이 기슭막이 → 집수정으로 바뀜(d5d9c5f66 · 10-06). 그래서 자동으로 놓인 관은 폼을 처음 거칠 때 파일이 바뀜.
## 1. 재현
| 항목 | 값 |
| --- | --- |
| 프로젝트 | 검증_sub6 `8b98ca75…` · 관 지점 351.0 m(`p35100` · 자동 세류선 관) |
| 저장 전(정본 = 초기값과 같음) | `storage/1/3/8b98ca75…/B04_PreProcess/drainage/edits/pipe_points.json` · `inlet_type` 집수정 + `inlet_revet_form` 돌쌓기(찰) · `_length_m` 10 · `_before_m` 5 · `_after_m` 5 · `_height_m` 1.7 · `inlet_basin_animal` 없음 |
| 초기값 | `initial_snapshot/B04_PreProcess__drainage/edits/pipe_points.json`(10-17) — 같은 다섯 칸 = 자동설계 체인이 넣은 기본값 |
| 조작 | K6 — B06 구조물 배치에서 그 관 고르고 구조물 조합 지정 · [적용] → [저장] |
| 저장 뒤 | 다섯 칸 빠짐 · `inlet_basin_animal: "true"` 더함 · `pipe_diameter_mm` 글 "1000" → 수 1000 |
| 스크립트 재현 | 폼 `write → read → merge` 를 그 옵션으로 돌림 → removed 다섯 칸 · added `inlet_basin_animal` "true" (보고와 같음) |
## 2. 저장 길(어디서 바뀌나)
| 차례 | 파일:줄 | 하는 일 | 칸 변화 |
| --- | --- | --- | --- |
| ① 폼 확정 | `B05_Profile/B05_Profile_UI_Structures_Panel_Commit.ts:266-285` | 관 고침([적용] · 조합 지정 · 실시간) = 폼 칸 **전부**(`readOptions`)를 `onPipeUpdate` 로 | — |
| ② 폼 읽기 | `B05_Profile/B05_Profile_UI_Drainage_Facility.ts:663-689` → `A00_Common/design/design_structure_form.ts:369` → `A00_Common/design/logic/design_structure_spec.ts:96-105 · 175-202` | 필수 상자 칸은 **지금 갈래 키만** 씀. 집수정 갈래 = `inlet_structure` · `inlet_basin_height_m` · `inlet_basin_animal`(`design_structure_pipe.ts:70-85`) | `inlet_revet_*` 안 실림 |
| ③ 빈 고르기 채움 | `design_structure_form.ts:227-237` | 필수 상자 빈 고르기 = 기본값을 실제 값으로(54-43) · 동물이동형 기본 "true"(`design_structure_pipe.ts:83`) | `inlet_basin_animal` "true" 생김 |
| ④ 병합 | `B06_Section/B06_Section_UI_Page_Structures_Panel.ts:260-266` → `B05_Profile/logic/B05_Profile_UI_Drainage_Facility_Merge.ts:112-122` | 같은 종류면 폼이 **아는 칸**(`FORM_OPTION_KEYS.pipe` :25-35 = `inlet_revet_*` 포함)은 폼 값으로 갈음 · 안 온 아는 칸은 버림 | **`inlet_revet_*` 다섯 칸 지워짐** |
| ⑤ 초안 | `Structures_Panel.ts:428-442` → `B05_Profile/B05_Profile_Api_Pipes_Draft.ts:32-38` | 가게 `pipes` 초안 → [저장] 조각 `{points}` | 그대로 |
| ⑥ 한 본문 | `A00_Common/design/design_save.ts:200-201` · `design_save_api.ts:67-90` → `B06_Section/B06_Section_Router_DesignSave.py:188-197` | `POST /design/save` → `put_pipe_points` | 그대로 |
| ⑦ 서버 쓰기 | `B04_PreProcess/B04_PreProcess_Router_Basins.py:601-651` · `common_util/common_util_drainage_pipes.py:426-441` | 옵션을 받은 그대로 씀(거르기 · 기본값 채움 없음 · 새 관만 `_apply_new_defaults`) | 그대로 |
- B05 폼도 같은 병합(`B05_Profile/B05_Profile_UI_Drainage_Panel.ts:632`) — B05 [저장]도 같은 결과.
- [저장] 자체는 옵션을 안 고침 — 관 초안이 폼 확정으로 써졌을 때만. 조작 없는 길 하나 가능(미확인): 횡단 자료가 흙막이 단 수를 늘리면 `recount()`(`design_view_cross.ts:294 · 651` · `design_shared.ts:200`) → 실시간 확정 → 같은 병합.
## 3. 지워지는 칸을 읽는 곳(영향)
| 쪽 | 파일:줄 | 집수정일 때 `inlet_revet_*` |
| --- | --- | --- |
| B06 횡단 형상(파이썬) | `B06_Section/B06_Section_Engine_Culvert.py:172-193` | 집수정이면 흙막이 칸 안 읽고 돌아감 |
| B06 · B05 3D(TS) | `common_util/common_util_culvert_sets.ts:163` | 같음 |
| B08 구조물집계표 | `B08_Quantity/B08_Quantity_Router_Summary.py:607` | `{쪽}_type == 기슭막이` 만 |
| B07 전개도 | `B07_DesignDetail/B07_DesignDetail_Engine_Cad_Development.py:120` | 같음 |
| B09 내역 | B08 집계 받음 | 그대로 |
| `inlet_basin_animal` | `design_structure_pipe.ts:74` 주석 | 저장만 · B07 · B08 안 읽음 |
## 4. 언제 생겼나
| sha | 날짜 | PLAN | 한 일 | 이 증상에서 몫 |
| --- | --- | --- | --- | --- |
| a1b1182b9 | 2026-09-14 | 브레인 판정 | 병합 신설 — 폼이 아는 칸만 갈음 · 폼이 비운 아는 칸 지움 | 지우는 규칙. 그 전엔 옵션 **통째** 갈음(더 많이 지움) |
| 0a095c14b | 2026-10-05 | 52-1 | 명세 폼(갈래 키만 씀) | 옛 폼도 집수정이면 `inletRevet.read` 안 함(`0a095c14b^` 판 :636-643) — 동작 같음 |
| 79ca22082 | 2026-10-05 | 46-7 | `_apply_new_defaults` — 새 관에 등록부 기본값 **전부**(`Router_Basins.py:259-262`) | 안 쓰는 갈래 칸을 파일에 넣음 |
| d5d9c5f66 | 2026-10-06 | 54-36 | 유입 기본값 기슭막이 → 집수정(`구조물정의.json:71` · 판 16) · 흙막이 기본값은 그대로(:154-206) | **증상 시작** — 새 관 = 집수정 + 죽은 흙막이 칸. 그 전엔 기슭막이 갈래라 폼이 그 칸을 다시 씀 · 안 지워짐 |
| d02f7033e | 2026-10-06 | 54-43 | 필수 상자 빈 고르기 = 기본값 실제 값 | ③ |
| e92dcb424 | 2026-10-10 | 173-7 | 동물이동형 체크 칸(bool) — 안 누르면 안 씀 | 이때는 안 들어감 |
| 3ed10bf38 | 2026-10-10 | 177-2 | 고르기 유 / 무 · 빈 값 = 유 **적힘**(시험 `test_173_7` `test_빈_값은_유_실제_값으로_적힘`) | **true 들어감 시작** · 등록부엔 이 키 없음 → 자동 관은 첫 폼 확정 때 생김 |
## 5. 고칠 길(안 고침)
| 안 | 자리 | 내용 | 영향 | 위험 |
| --- | --- | --- | --- | --- |
| A(권함) | `B04_PreProcess_Router_Basins.py:259-265` `_apply_new_defaults` | `inlet_type` 집수정이면 `inlet_revet_*` 기본값 안 채움(기슭막이면 `inlet_basin_*` 안 채움) · 집수정이면 `inlet_basin_animal` "true" setdefault(옆 `inlet_structure` "L" 선례 :264-265) | 새 자동 관만 · 옛 파일 안 건드림 · B05 · B06 · B07 · B08 · B09 결과 그대로 · 이주 불필요 | 시험 기대값 고침 — `test_b05_new_structure_defaults.py:38-41 · 70-71` · `test_211_1_inlet_revet_height.py:51-52` · `test_494_2_crossing_pipe_defaults.py` 확인. 211-1(새 관 유입 흙막이 d+0.7)은 빈 높이 규칙(`Router_Summary.py:623` · `pipe_wall_min_height_m(d, "inlet")`)이 같은 값을 줘 동작 그대로. 기본값 정책이라 사용자 확인 필요 |
| B | `Merge.ts:117-120` | 집수정이면 `inlet_revet_*` 를 아는 칸에서 빼 보존 | — | 병합 규칙(Merge.ts:11-12)과 어긋남 · 죽은 10 m 돌쌓기가 남아 다른 길로 유입 구조가 바뀌면 B08 에 몰래 섬. 권하지 않음 |
| C | — | 고치지 않음 · 「첫 폼 확정 때 정리」로 둠 | 없음 | 저장 뒤 파일 차이가 계속 보임(점검 혼선) |
- 옛 프로젝트 이주: 불필요 — 남은 죽은 칸은 무해 · 다음 폼 확정 때 빠짐.
- 지킴 시험 한 개 꼴(안 A): 새 관 왕복 불변 — `_apply_new_defaults` 로 만든 집수정 관 옵션을 명세 폼 `write → read → mergeFacilityOptions` 에 돌려 **차이 없음**(지워짐 0 · 더함 0). 파이썬이 옵션을 JSON 으로 내고 node 헬퍼(`repro_620.cjs` 꼴 · `helper_173_7_inlet_animal.cjs` 로더)가 왕복 · pytest 한 파일. 덧: `pipe_diameter_mm` 글 → 수 차이도 같은 시험이 잡음(등록부 기본값 글 "1000" 이면 서버 채움도 수로).