chore(계획): 요구 407 분석 — 498-2 계획고 덮어쓰기 남음 · 492 이관 글에 493 걷음 표시
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
# PLAN 492 이관 (2026-10-28 · 요구 283~287 · 408)
|
||||
|
||||
※ 492-1 · 492-2 「노선 모양 바뀐 [저장] = 초기화」는 493(요구 289 · 290)이 걷음 — 지금 손 고침 [저장] = 화면 그대로(시설 따라감) · 초기화 = 추천 [적용]만(`docs/raw/요구_1025/_분석_407_계획고_덮어쓰기.md` 39 줄).
|
||||
|
||||
## 492. 노선 모양 바뀐 [저장] = 초기화 + 초기값 다시 세움 (요구 283 · 284 · 285 · 492-1 sub4 · 492-2 sub1 · Opus high)
|
||||
|
||||
- 사용자 확정(요구 284 · 285): 노선 모양이 바뀐 [저장](교점 끌기 · 더함 · 지움 · R 바꿈) · 추천 [적용] · 다른 노선 확정 = 초기화 + 초기값 다시 세움 — 사용자 구조물 · 관 · 추가 측점 · 종단 · 횡단 손 입력 버림 · 자동(세류선 교차 관 · 일반 · 곡선 측점 · 초기 종단 · 횡단) 다시 셈.
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
# 요구 407 — PLAN 498-2 계획고 덮어쓰기 다시 확인
|
||||
|
||||
범위: 코드 읽기만(서버 · 브라우저 안 띄움) · 기준 = `main_laptop_1` HEAD `919a2eb1e`.
|
||||
|
||||
## 결론
|
||||
|
||||
- **남음.** 「같은 코드」로 풀린 것은 절반(계산 함수가 한 벌이 된 것)뿐임. 흠의 뿌리는 「누가 마지막에 덮나」라서 지금도 그대로임.
|
||||
- 511-B B-3(`a88faa731`)부터 서버 노선 저장의 계획고 옮김 = Node 가 브라우저와 같은 TS `carryEdits` 를 돌림 → 「코드 두 벌」 몫은 사라짐.
|
||||
- 하지만 ① 브라우저가 자기가 옮긴 계획고 편집을 「사용자 초안」으로 늘 보냄 ② 서버가 자기가 옮긴 값 위에 그 본문을 통째로 덮음 ③ 두 쪽이 넣는 **입력(측점 목록 · 기준 꼭짓점)이 다름** → 같은 함수라도 결과 열쇠가 갈림 → 서버가 자기 측점에 없는 열쇠를 버림 → 토스트 「계획고 편집 N곳을 지웠습니다」. 덮어쓰는 길 자체는 `4b6800e38`(10-19) 그대로임.
|
||||
- 사용자 전제 「492 로 노선 바뀐 [저장]은 손 입력을 다 버림」은 **지금 코드와 다름** — 493(요구 289 · 290)이 492 초기화를 걷음. 지금 초기화 = 추천 [적용]만 · 손으로 고친 노선 [저장] = 시설 따라감 + 계획고 옮김. 그래서 이 길은 막히지 않음.
|
||||
- 실제로 토스트가 얼마나 뜨는지(빈도 · 곳)는 코드로 못 정함 → 재현 필요(PLAN 498-2 「511 뒤 재측정 먼저」 그대로).
|
||||
|
||||
## [저장] 흐름 — 노선 모양 바뀐 손 고침 [저장]
|
||||
|
||||
| 차례 | 하는 일 | 근거 |
|
||||
|---|---|---|
|
||||
| 1 | 노선 초안을 끄는 동안 follow 단계가 계획고 편집을 옮김(`carryEdits` · 측점 = 브라우저 `buildStations`) | `B05_Profile/logic/B05_Profile_Pipeline_Grade.ts:160-173` · 측점 `A00_Common/design/design_pipeline_page.ts:268-275` |
|
||||
| 2 | 옮긴 값이 묶음 **입력 칸** `input.alignment` 에 되쓰임(출력 칸 아님) | `A00_Common/design/logic/design_pipeline.ts:63-68`(FOLLOW_KEYS 에 alignment) · `:213-223` |
|
||||
| 3 | 노선 초안 동안 profile · cross 차례마다 그 입력을 계획고 0 칸(`DRAFT_ROUTE_ID`)에 씀 — 사용자가 종단을 안 건드려도 늘 씀 | `design_pipeline_page.ts:455-479`(479 줄) |
|
||||
| 4 | [저장] — 노선 바뀜이면 계획고 조각 = 0 칸 ?? 옛 노선 칸 → 본문 `alignment` 에 실음 | `A00_Common/design/design_save.ts:166-182`(172 줄) · `:251-276` |
|
||||
| 5 | 서버 노선 차례 — 새 노선 · 새 종단 생성 뒤 저장된 옛 편집을 **서버 측점**에 옮겨 씀(Node `profile.carry` = 같은 `carryEdits`) · 이 때는 안 버림(marks 없음) | `B06_Section/B06_Section_Router_DesignSave.py:160-166` → `B05_Profile/B05_Profile_Route_Save.py:562-573` · `:249-304`(291-293 · 295-297) · `B05_Profile/B05_Profile_Engine_Grade_Node.py:197-224` · `A00_Common/design/logic/design_calc_node_profile.ts:98` |
|
||||
| 6 | 본문 계획고의 노선 번호만 새 번호로 바꿈 | `B06_Section_Router_DesignSave.py:175-177` |
|
||||
| 7 | 관 → 구조물 → 추가 측점 차례 뒤 **계획고 차례가 브라우저 본문으로 덮음** — 저장 기준 꼭짓점(서버 옮김) 위에 브라우저 편집 통째(서버가 옮긴 편집은 버려짐) | `B06_Section_Router_DesignSave.py:194-195` → `B05_Profile/B05_Profile_Router.py:456-500` · `:416-453` · `B05_Profile/B05_Profile_Engine_Grade_Profile.py:544-558` |
|
||||
| 8 | 덮기 직전 새 측점 · 관 · 구조물 자리 0.006 m 밖 열쇠를 버림 → 응답 `dropped_edit_chainages` | `B05_Profile_Router.py:472-477 · 436-444` · `B05_Profile/B05_Profile_Engine_Grade_Alignment.py:248-269` |
|
||||
| 9 | 브라우저가 토스트 「계획고 편집 N곳을 지웠습니다 — 측점 · 관 · 구조물이 없는 자리: …」(info) · 0 칸 · 옛 칸 비움 | `design_save.ts:151-164` · `:176-180` |
|
||||
|
||||
정리 — 서버는 계획고를 **받아 적음**(브라우저가 셈한 옮김 결과). CLAUDE.md 5장 「[저장]은 서버가 정본으로 다시 계산 · 브라우저 값을 받아 적지 않음」과 어긋난 자리 그대로임.
|
||||
|
||||
## 핵심 판정 — 계산 값 차이인가 · 데이터 흐름인가
|
||||
|
||||
- **데이터 흐름 · 정본 자리 흠임.** 같은 코드여도 남음.
|
||||
- 같은 함수라도 넣는 값이 다름:
|
||||
- 측점 목록 — 브라우저 = `buildStations`(격자 · 곡선 · 관 · 구조물 · 추가 측점은 전역 `plusSource` = 한 걸음 앞 초안 값) · 서버 = 새로 지은 종단 `stations`(서버만 아는 새 세류선 교차 관 `_place_pipes` · 서버 따라감 추가 측점 · 풀린 노선 끝 길이).
|
||||
- 옮김 기준 꼭짓점 — 브라우저 `ref.basePvi` = planline 의 `plantedBase`(같은 세션 관 · 구조물 초안이 꼭짓점을 옮김 · `design_pipeline_page.ts:325`) · 서버 = 저장된 `base_pvi`(시설 차례가 노선 차례 뒤).
|
||||
- 옮길 편집 — 브라우저 = 초안 동안 사용자 ▲▼ 포함 · 서버 = 저장분만.
|
||||
- 결과: 측점이 한 쪽에만 있으면 ⓐ 브라우저 열쇠가 서버 측점에 없음 → 버림 + 토스트 ⓑ 서버만 옮긴 열쇠 → 브라우저 본문에 없어 말없이 사라짐(토스트 없음).
|
||||
- 511-B 가 지운 것 = 파이썬 `carry_edits` ↔ TS `carryEdits` 차이(`a88faa731` · `B05_Profile_Engine_Grade_Carry.py:13` 「편집 셈 = TS carryEdits · 파이썬 짝 없음」). 0 칸 쓰기 · 본문 실음 · 서버 덮음 세 자리는 10-20 판 그대로.
|
||||
|
||||
## 492 · 493 과의 관계
|
||||
|
||||
- 492(노선 모양 바뀐 [저장] = 초기화)는 493-1 · 493-2 가 걷음. 지금: `as_initial`(추천 [적용])만 초기화 — `B05_Profile/B05_Profile_Router_Replan.py:553-567` · `B05_Profile_Route_Save.py:518-527 · 566-573` · 판정 함수 `route_shape_changed` · `routeShapeChanged` 코드에 없음.
|
||||
- `PLAN.md` 492 절 「사용자 확정」 줄은 아직 옛 초기화 글 — 493 으로 바뀐 것 반영 안 됨(계획서 정리 몫).
|
||||
|
||||
## 갈래별 표
|
||||
|
||||
| 갈래 | 서버 노선 차례 옮김 | 브라우저 계획고 본문 | 열쇠 어긋남 | 판정 |
|
||||
|---|---|---|---|---|
|
||||
| 노선 모양 바뀐 손 [저장](교점 끌기 · 더함 · 지움 · R) | 함(서버 측점) | 0 칸 = 브라우저가 옮긴 값 · 늘 보냄 | 측점 목록 · 기준이 다르면 생김 | **남음(주 갈래)** |
|
||||
| 위 + 같은 세션 관 · 구조물 옮김 | 저장 기준으로 옮김 | `plantedBase` 기준으로 옮김 | 「손댄 꼭짓점 이웃」 가름이 갈릴 수 있음 | 남음 가능 · 확인 못 함 |
|
||||
| 위 + 추가 측점이 꼬리 구간(같은 자리 · 누가거리 밀림)에 있음 | 서버 따라간 자리 | 브라우저 측점 = 한 걸음 앞 추가 측점 값(`design_pipeline_page.ts:268-275` 에 `plus` 안 넘김 → `common_util_structure_station.ts:57-64 · 246` 전역 값) | 마지막 걸음에 밀렸으면 어긋남 | 남음 가능 · 확인 못 함 |
|
||||
| 위 + 노선 끝(EP) 계획고를 고쳤음 | 풀린 노선 길이 | 초안 선 길이 | 길이가 0.006 m 넘게 다르면 어긋남 | 확인 못 함 |
|
||||
| 위 + 새 세류선 교차 관 | 서버만 측점 | 없음 | 대개 바뀐 구간이라 옮김 대상 아님 | 영향 작음 · 확인 못 함 |
|
||||
| 0 칸이 빈 채 [저장](노선 초안 profile 차례 전) | 함 | 옛 노선 칸 초안(안 옮긴 옛 열쇠) | 바뀐 구간 열쇠 버림 · 엉뚱한 자리 얹힘 | 남음 가능 · [저장]이 묶음 끝을 기다리는지 확인 못 함 |
|
||||
| 선 그대로 스냅 켬끔 · 스냅 간격 바꿈 | 선 같음 → 옛 편집 그대로(안 버림) | 옮김 없이 옛 편집 그대로 | 두 쪽 같음 · 곡선 MC 측점이 움직이면 그 자리 편집을 계획고 차례가 버림 + 토스트 | 덮어쓰기 흠 아님 · 213-2 규칙(MC 편집이 새 MC 로 안 옮겨짐 = 별 흠 후보) |
|
||||
| 추천 [적용] | 안 옮김(초기화) | 안 보냄(`/route/replan` 직접 · 초안 비움) | 없음 | 길 없음 — `B05_Profile_UI_RouteEdit_Apply.ts:189-215` |
|
||||
| 노선 그대로 [저장](B05 · B06 둘 다) | 노선 차례 없음 | 그 노선 칸 = 사용자 손 편집 | 없음 · 옮긴 관 옛 자리 등은 213-2 로 버림 · 토스트(의도) | 498-2 무관 |
|
||||
| 추가 측점만 더함 | 없음 | 손 편집 | 추가 측점 차례가 계획고 앞(368-2) | 무관 |
|
||||
| B06 에서 노선 초안 둔 채 [저장] | 한 본문 같은 길 | 같은 0 칸 | 첫 줄과 같음 | 남음(같은 길) |
|
||||
| 저장 중 고침 | 노선 바뀐 [저장] = 잠금(`design_save.ts:251-255`) · 고칠 수 없음 | — | — | 무관 |
|
||||
|
||||
## 재현 차례(사용자 말)
|
||||
|
||||
1. 검증 프로젝트 B05 를 엶 → 종단도에서 노선 뒤쪽 측점 하나(추가 측점 자리면 더 좋음)의 계획고를 ▲ 몇 번 → [저장].
|
||||
2. 평면에서 그 측점보다 **앞쪽** 교점 하나를 몇 m 끌어 뒤 구간 누가거리를 밂(종단은 안 건드림).
|
||||
3. 끌기 중 종단도에서 그 측점 계획고를 읽어 둠 → [저장].
|
||||
4. 판정: 토스트 「계획고 편집 N곳을 지웠습니다」 뜨나 · 저장 뒤(새로고침) 그 측점 계획고 = 3 의 값인가.
|
||||
5. 수치: 저장 본문 `alignment` 열쇠(0 칸) 대 노선 차례 직후 새 종단 `profile_alignment.edits`(서버 옮김) 대 최종 `edits` — 셋이 같으면 지금 자료에선 안 생김.
|
||||
- 덧 갈래: 관 하나를 옮긴 채(저장 안 함) 2 ~ 4 · 스냅 켬 [저장] 전 곡선 안 측점 ▲.
|
||||
|
||||
## 고칠 자리 · 방향
|
||||
|
||||
방향 한 줄: **노선 바뀐 [저장]의 계획고 정본 = 서버 옮김 · 브라우저는 초안 동안 사용자가 ▲▼ 한 열쇠만 보내고 서버가 옮김 위에 그것만 다시 얹음**(관 · 구조물 `rebase_drafts` 와 같은 꼴 · 10-20 D 보고 고칠 자리 6 · H 보고 4.4 와 같은 뜻).
|
||||
|
||||
| 자리 | 고칠 것 |
|
||||
|---|---|
|
||||
| `A00_Common/design/logic/design_pipeline.ts:63-68` · `:213-223` | follow 가 옮긴 계획고를 입력 칸에 되쓰지 않음 — 출력 칸에만 · 뒤 단계는 `follow ?? input` |
|
||||
| `A00_Common/design/design_pipeline_page.ts:478-479` | 0 칸 = 사용자 손댐만(따라감 결과 아님) |
|
||||
| `A00_Common/design/design_save.ts:171-182` | 노선 바뀜 + 0 칸이 따라감뿐이면 계획고 안 보냄(추가 측점 `followedOnly` 꼴 · `B05_Profile/B05_Profile_Api_PlusStations.ts:88 · 134-146`) · 옛 노선 칸 대체(172 줄 `?? pendingAlignment(routeId)`) 걷음 |
|
||||
| `B06_Section/B06_Section_Router_DesignSave.py:175-177` · `:194-195` | 노선 바뀜이면 계획고 본문을 통째 덮지 않고 서버 옮김 편집 위에 사용자 손댐만 얹음(Node 다시 얹기) |
|
||||
| 덧(별 흠 후보) `B05_Profile/B05_Profile_Route_Save.py:271-272` | 선 그대로 · 측점만 움직임(스냅)일 때 편집 열쇠를 새 MC 로 옮기지 않음 → 지움 |
|
||||
|
||||
위험: 초안 동안 사용자 ▲▼ 가름이 틀리면 사용자 편집을 안 보냄 → 시험 필요(`test_472_6_profile_save.py` · `test_design_store_save.py` · `test_213_2_ghost_edit_drop.py` · `test_400_profile_carry.py` · `test_472_6_route_save` · 새 시험 = 노선 바뀐 본문에 따라감만 계획고가 안 실림).
|
||||
|
||||
## 확인 못 함
|
||||
|
||||
- 지금 자료에서 실제 토스트가 뜨는지 · 몇 곳인지(서버 · 브라우저 안 띄움).
|
||||
- 서버 노선 풀기(`solve_route_record`) 끝 길이가 초안 선 길이와 0.006 m 안인지.
|
||||
- 서버 새 종단 측점에 추가 측점 · 새 교차 관이 어떤 자리로 들어가는지(실자료).
|
||||
- [저장]이 묶음(profile 차례) 끝을 기다린 뒤 0 칸을 읽는지 — `saveDesign` 은 기다림이 안 보이고 `prepare` 는 B06 `reconcileDesigns` 뿐(`B06_Section_UI_Page_Persist.ts:388`).
|
||||
- 「측점 간격 바꿈」이 스냅 간격(`stationSnapStep`) 말고 따로 있는지 — 따로 있으면 그 길은 안 봄.
|
||||
Reference in New Issue
Block a user