# B05 초기화 복원 실측·계산 중 진입 차단 완료 아카이브 - 완료일: 2026-08-29 - 상태: 사용자 검증 완료 - 검증: `docs/raw/verification/2026-08-29_verify_initial_design_lock.md` - 검증 방식: 사용자 실무 검증 채택, Codex 2차 교차검증 생략 ## 완료 범위 ### B05 노선·초기화 - [ ] 새 프로젝트 업로드에서 계산 중 B05 진입이 준비 화면으로 차단되고 완료 후 자동 전환되는지 화면 실측. - [ ] 노선 경로 변경 시 전체 재계산 분리와 `route_signature` 게이트 정리. - [X] **[초기화] 복원 경로 실측 완료**(2026-08-29) — 스냅샷을 갖춘 뒤 [초기화]를 다시 눌러 응답이 `{"route_id":104,"deleted_routes":1,"restored":true}`임을 확인했다. 재계산이 아니라 스냅샷 복원 경로다. 옛 route 1행 삭제 → 덤프에서 새 id로 재삽입(103 → 104), 연장 350.11m· 관 지점 4건이 스냅샷 값 그대로 돌아왔고 3초 안에 끝났다(폴백 재계산은 10초+). route id가 매번 오르는 것은 설계대로다 — 덤프의 `id` 열을 비우고 INSERT하므로 AUTO_INCREMENT가 새 번호를 붙이고 자식 4표가 그 id로 붙는다. 촬영·폴백 실측은 `docs/raw/plans/2026-08-29_plan_initial_snapshot_reset.md` 「화면 실측」 참조. - [X] **작업본 처리 종결**(2026-08-29 사용자) — 현재 작업본은 초기값이다. 직전 설계 (route 101) 백업 `tmp/backup_before_initial/`는 **불필요**로 판단해 사용자가 삭제한다. ### 초기값 보전 마무리 — 계산 중 진입 차단·스냅샷 무효화 (2026-08-29 구현 완료, 화면 실측 대기) 사용자 확정(2026-08-29) - **계산이 끝날 때까지 B05·B06에 못 들어가게 막는다.** 지금은 지표면 확정 직후 "노선 설계로 이동하세요"를 적고 **그 뒤에** 초기 설계 체인이 돌아, 반쯤 계산된 화면에 들어가 만질 수 있다. 그 편집이 섞인 채 스냅샷이 찍히면 초기값이 오염된다. - **지표면이 바뀌면 초기값도 바뀐다** — 파일을 다시 올려 전처리를 새로 하므로 당연히 처음부터다. **노선 경로가 바뀌어도** 전처리 일부가 다시 계산되므로 마찬가지다. - 스냅샷 용량은 실측으로 해소 — **1.1MB**(프로젝트 3.3GB의 0.03%). 압축 불필요. 설계 - 진입 차단은 **이미 있는 준비 화면(B11)** 을 쓴다(`routeAfterPreloadCheck` → `ROUTES.B11_LOADING`). 새 화면을 만들지 않는다. 지금 게이트가 못 막는 이유는 판정 기준이 **확정 지표면 서명**이라, 체인이 시작되기 전에 이미 열리기 때문이다. - 판정 신호는 **마커 파일** 하나로 둔다(`{프로젝트 루트}/initial_design.lock`). 체인 시작에 만들고 `finally`에서 지운다. `workflow_state`의 stage 2는 체인이 끝나도 `IN_PROGRESS`라 구분에 못 쓰고, route 존재 여부도 체인 3단계에서 이미 생겨 못 쓴다. 마커는 스냅샷 대상 4트리 **밖**(프로젝트 루트)에 둬 복원에 딸려 들어가지 않게 한다. - 스냅샷은 **무효화(삭제)** 로 처리하고 그 자리에서 다시 뜨지 않는다 — `run_redesign_chain`은 "사용자 입력을 유지한 채" 재계산하므로 그 결과를 찍으면 사용자 편집이 섞인 가짜 초기값이 된다. 삭제해 두면 다음 [초기화]가 재계산 폴백을 타면서 새 초기값을 만들고 체인이 그때 촬영한다. - 그러려면 **폴백 경로가 편집 정본을 먼저 지워야 한다** — 지금은 안 지워서 재계산이 사용자 편집(`structures.json`·`edits/pipe_points.json`)을 다시 읽는다. 2026-08-29 실측 때 이 둘을 손으로 지워야 했던 바로 그 문제다. 체크리스트 - [X] `common_util_initial_snapshot` — `designing_lock_path()` · `discard_initial_snapshot()` 추가(마커 경로와 스냅샷 삭제를 한 곳에 둔다). - [X] `run_auto_design_chain` · `run_redesign_chain`(`B03_FileInput_Service_Chain.py`) — 시작에 마커 생성, `finally`에서 제거. 재설계 체인은 끝에 스냅샷도 무효화한다. - [X] `/surface/status`(`B04_PreProcess_Router.py:501`) — 마커가 있으면 `status="in_progress"` · `current_stage="initial_design"` · 안내 문구를 돌려준다. 지금은 stage 1이 COMPLETE면 진행률 파일을 덮어써 "completed"로 나온다. - [X] `routeAfterPreloadCheck`(`A00_Common/b_workflow_nav.ts:64`) — 상태가 `initial_design`이면 서명과 무관하게 B11로 보낸다. - [X] B11(`B11_Status_UI_Loading.ts`) — 프리로드 전에 상태를 폴링해 `initial_design`이 풀릴 때까지 기다린다(진행 문구 표시). 풀리면 종전대로 프리로드 후 목표 화면으로. - [X] `reset_route_design` 폴백 경로 — 체인을 돌리기 **전에** `structures.json`과 `edits/` 를 지운다. 복원 경로는 스냅샷이 덮어쓰므로 손대지 않는다. - [X] 테스트 — 마커 유무에 따른 상태 전환, 폴백이 편집 정본을 지우는지, `discard_initial_snapshot()` 동작. - [X] 자체검증(2026-08-29) — `npm run typecheck` 통과, 변경 TS prettier, 변경 Python ruff format·check 통과. `pytest tmp/tests/ -q` → **249 passed**(신규 4건 포함) ·7 skipped·8 failed. 실패 8건은 기슭막이 이관 때 생긴 **기존 실패**로 이번 변경과 무관하다(변경 전에도 동일). · 신규 테스트 4건 — 마커 생성·해제·중복 해제, 마커가 **스냅샷에 안 담기는지**, `discard_initial_snapshot()` 있음/없음, `wipe_edited_masters()`가 편집 정본 2개만 지우고 다른 정본은 건드리지 않는지. - [ ] 화면 실측(미완) — 마커가 걸린 동안 B05 진입이 준비 화면으로 가는지, 체인이 끝나면 자동으로 넘어가는지. 새 프로젝트 업로드가 있어야 자연스러운 재현이 되므로 다음 업로드 때 확인한다. 마커 파일을 손으로 만들어 게이트만 따로 볼 수도 있다. 구현 메모 — `/surface/status`는 stage 1이 COMPLETE면 진행률 파일을 무시하고 "completed"로 답한다. 그래서 진행률 파일에 단계를 적는 대신 **마커를 별도로 확인해 덮어쓰는** 방식으로 갔다. 게이트는 상태 조회가 실패하면 막지 않는다 — 조회가 막혔다고 사용자를 준비 화면에