fix(451 B06 초안 버림): 버림 차례가 뒤 cross 입력에 밀려도 마지막 차례 끝에서 되돌림 — B05 와 같게

- 버림 차례가 뒤 차례에 밀림(dropped) · 노선 초안 그대로 없음 = 마지막 차례 끝에서 finishDrop 다시(새 초안이 밀면 안 함)
- 밀어낸 차례도 조용히(가게에 측점 안 냄 · 종단도는 되돌림 뒤 저장 기준)
- 새 test_451_drop_cross(진짜 묶음 · 가짜 지형)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-18 22:10:09 +09:00
co-authored by Claude Opus 5.5
parent 71b67611f6
commit b68d6ff12e
3 changed files with 376 additions and 0 deletions
+10
View File
@@ -223,6 +223,8 @@ function createPagePipeline(
} | null = null;
/** 초안을 버린 차례가 끝나 되돌림까지 마치는 약속(종단도는 그 뒤 저장 기준으로 — 349-0l). */
let dropping: Promise<string> | null = null;
/** 초안을 버린 차례가 되돌림까지 못 감(뒤 차례에 밀림) — 뒤 차례도 조용히 · 그 끝에서 되돌림(B06 cross · 451). */
let dropPending = false;
/** 노선 초안 전 가게 관 · 구조물 — 초안 동안 follow 가 새 측점을 가게에 씀 · 초안을 버리면 이것으로. */
let beforeDraft: Facilities | null = null;
/** 묶음이 가게에 마지막으로 쓴 관 · 구조물 · 쓰는 동안(메아리 — 다시 입력으로 안 받음). */
@@ -402,6 +404,11 @@ function createPagePipeline(
* 기록에) · 그 상세가 저장 정본(다시 하기도 같은 기준). 차례 끝에서 판정 — ground 를 건너뛰어도 · 사진첩
* 되돌리기가 가게 초안을 먼저 비워도(349-0m). */
const finishDrop = async (record: PipelineRunRecord): Promise<string> => {
// 뒤 차례(B06 cross 등)에 밀림 · 초안은 그대로 버려짐 — 마지막 차례 끝에서 되돌림(B05 와 같게)
const pushed = record.outcome === "dropped" && record.generation !== pipe.generation;
if (pushed && dropPending && !pipe.input("route"))
return (lastRun as Promise<PipelineRunRecord>).then(finishDrop);
dropPending = false;
const routeId = canon?.routeId;
const stations = pipe.output("ground")?.stations ?? [];
let why: string = record.outcome; // 새 조작에 밀림 · 단계 실패 — 초안 전 상세는 그대로 둠
@@ -534,6 +541,7 @@ function createPagePipeline(
// 초안 둔 채 열기(새로고침 · B06 바로 열기 · 365-1) — 초안 전 = 지금 저장 상세(세션 그대로) · 측점은 가게에 냄
held = inputs.route ? (held ?? holdNow()) : null;
dropping = null;
dropPending = false;
Object.assign(given, inputs);
const run = (lastRun = pipe.start(inputs));
trackPageBusy(projectId, run); // 「계산 중」 점(386-2)
@@ -549,6 +557,7 @@ function createPagePipeline(
given[SOURCE_INPUT[source]] = value as never;
const run = pipe.update(source, value, part);
if (run) trackPageBusy(projectId, (lastRun = run));
if (run && dropPending && !pipe.input("route")) quietGeneration = pipe.generation; // 되돌림이 맡음
return run;
};
let reconciling: Promise<number> | null = null;
@@ -648,6 +657,7 @@ function createPagePipeline(
const run = feed("route", draft, routeRange(before, after));
if (run && !draft && wasDraft) {
quietGeneration = pipe.generation;
dropPending = true;
dropping = run.then(finishDrop);
}
},