--- name: v2.0 핵심 불변식 — 누적 보존, 리셋 금지 description: sk-v2.0 에서 라인이동/offset변경/보조선추가 가 서로 리셋시키면 안 됨. 최종 그림 = wall.baseLines 현재 좌표 + Phase 2 offset 확장. type: project --- **불변식 (사용자 명시, 2026-04-28)**: > "최종 그림 = `wall.baseLines` 좌표점 + offset 만큼 확장된 그림" > 어떤 작업이 일어나도 다른 작업의 결과를 리셋시키면 안 됨. **구체적으로**: - 사용자가 **라인 이동** → `wall.baseLines` 좌표만 갱신, offset/보조선 보존 - 사용자가 **offset 변경** → `wall.baseLines[i].attributes.offset` 만 갱신, 라인이동/보조선 보존 - 사용자가 **보조선 추가** → 별도 컬렉션에 추가, 라인이동/offset 보존 **v1 의 문제** (사용자 표현): "v1은 리셋이 되는 문제가 있다." 한 작업이 다른 작업의 결과를 덮어쓰는 케이스가 있었음. v2.0 에서는 발생 금지. **v2.0 설계상 자동 보장되는 부분**: - SK 입력은 `wall.baseLines` 현재 좌표 매번 읽음 (`skeleton-utils.js:715`) — 누적 이동 자동 반영 - Phase 2 확장은 `bl.attributes?.offset` 매번 dynamic 읽음 — 누적 offset 자동 반영 - SK 재빌드는 SK-derived 라인만 다시 만듦 **주의 지점 (리셋 위험)**: - `roof.innerLines` 통째 교체 (`skeleton-utils.js:882-883`): ```js roof.innerLines = createInnerLinesFromSkeleton(...) ``` 사용자가 별도로 그린 보조선이 `roof.innerLines` 에 섞여있으면 SK 재빌드 시 사라짐. 보조선은 별도 name/컬렉션으로 보관해야 함. - `canvas.skeleton = cleanSkeleton` 교체 (`skeleton-utils.js:915-917`) — `lastPoints` 만 명시적으로 보존하고 있음. 다른 누적 상태 (e.g. 사용자 보조선) 도 동일하게 보존 필요할 수 있음. **How to apply**: - v2.0 에서 새 기능 작업 시 항상 이 불변식 만족하는지 확인. - "한 작업이 다른 결과를 지우는가?" 자체질문 필수. - 리셋 위험 지점 (위 주의 지점) 수정 시 누적 보존 코드 추가. - offset/이동/보조선 셋 모두 동시에 발생하는 시나리오로 회귀 테스트. **관련**: - `project_v2_design_direction.md` — v2.0 phase 분할 - `feedback_no_touch_working_code.md` — 정상 코드 건들지 않기