fix(평면): 새 구조물 측점 놓는 즉시 평면 비탈 끝 · 면적 = 저장 뒤 — 튐 없음 · 옮김 계획고 (PLAN 583-1 · 요구 441)

- 원인: 구조물을 새 측점에 놓으면 측점 갈아끼움(비동기)이 끝나기 전 묶음 cross 단계가 옛 상세를 봐 엔진 길로 빠짐 — 구조물 얹기 없는 한 차례(벽 측점 비탈 끝 35 · 55 m · 기존 벽 측점 18.96 m)가 약 80 ms 평면에 튐 · 다음 차례(0.25 s)에 저장 값
- design_shared savedCross = 도는 갈아끼움(swapInFlight)을 기다려 그 상세로 다시 셈 · 상세 가게 swapInFlight 새로
- 종단도 listed() 옛 측점 = 저장 정본 상세 — 갈아끼운 상세로 셈해 옮긴 구조물 옛 측점 꼭짓점이 안 옮겨져 계획고 최대 2.4 cm 갈리던 것(옮김 면적 차 0.17 → 0.0175 ㎡)
- 시험: test_272_swap_keeps_canon 에 도는 갈아끼움 기다림 · test_473_lane_ready 글 대조를 새 호출 꼴로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-29 15:05:16 +09:00
co-authored by Claude Opus 5.5
parent c4b37023c7
commit f4a7b183b0
7 changed files with 60 additions and 8 deletions
+10 -1
View File
@@ -246,7 +246,16 @@ const keyList = () => KEYS.map((key, i) => ({ key, chainageM: LIST[i][1] }));
await m.loadSectionDetail(P, R);
m.useStationKeyList(P, R, keyList());
pipeAt(P, 55);
const moved = await m.swapSectionStations(P, R, stationsAt(55));
// 583 — 도는 갈아끼움 = swapInFlight(cross 단계가 기다림) · 같은 목록 다시 부름은 null · 끝나면 비움
const run = m.swapSectionStations(P, R, stationsAt(55));
const flight = m.swapInFlight(P, R);
const again = await m.swapSectionStations(P, R, stationsAt(55));
const moved = await run;
out.inFlight = {
same: flight !== null && (await flight) === moved,
again: again === null,
cleared: m.swapInFlight(P, R) === null,
};
pipeAt(P, 45);
const back = await m.swapSectionStations(P, R, stationsAt(45));
out.storeNoDraft = {
@@ -5,6 +5,7 @@ export {
} from "../../B06_Section/logic/B06_Section_Station_Swap";
export {
loadSectionDetail,
swapInFlight,
swapSectionStations,
} from "../../B06_Section/B06_Section_Section_Store";
export { useStationKeyList } from "../../B06_Section/B06_Section_Station_Keys";
@@ -9,6 +9,7 @@
- 노선 초안 차례 = 옛 규칙(축 허용 1e-4 · 넘으면 브라우저 표본).
- 가게 길(`swapSectionStations`) = 가게 `routeDraft` 로 가름 — 없음 · 있음 ·
초안 버린 직후(초안 표본이 안 남음).
- 583 — 도는 갈아끼움 = `swapInFlight`(묶음 cross 단계가 기다림) · 끝나면 비움.
Node 헬퍼 `helper_272_swap_canon.mjs` 가 vite ssr 로 묶은 진짜 모듈을 부름.
"""
@@ -142,3 +143,7 @@ def test_관_지움_되돌림_정본_설계(out):
assert r["design"] and r["copy"] # 지우기 전 설계(정본 사본) — 빈 기본 설계 아님(472 덧)
assert r["place"] and r["bytes"]
assert r["bareFresh"]
def test_583_도는_갈아끼움_기다림(out):
assert out["inFlight"] == {"same": True, "again": True, "cleared": True}
+3 -1
View File
@@ -59,7 +59,9 @@ def test_심기_전_종단도_기준_저장분(got) -> None:
def test_준비_전_빈_목록_안_심는_자리() -> None:
profile = (ROOT / "A00_Common/design/design_profile.ts").read_text(encoding="utf-8")
assert "listedBase(storedBase, detail, planted ? irregularStations : null)" in profile
# 옛 측점 = 저장 정본 상세(583) · 심기 전 = null(저장분 그대로)
assert "savedSectionDetail(projectId, routeId)) || detail," in profile
assert "planted ? irregularStations : null," in profile
sections = (ROOT / "A00_Common/design/design_view_profile_sections.ts").read_text(
encoding="utf-8"
)