# 014 — 여러 대상을 배치하고 작업을 다시 열기 2026-09-23. 이번 단계는 작성한 인터페이스를 한 번 조작하고 끝내지 않고, 작업 결과를 저장한 뒤 새 실행기에서 계속 편집할 수 있게 하는 것이다. 처리량·지연·대규모 합성 벤치마크는 수행하지 않았다. ## 실제로 할 수 있는 일 [세 도형 배치](../../prototypes/workbench/examples/layout.pure)를 불러와 적용하면 각 대상을 따로 움직일 수 있다. 마지막으로 잡은 대상은 방향키로 조정한다. **배치 저장** 후 파일을 **파일 열기**로 다시 열면 적용된 코드와 현재 배치가 복원된다. 아직 적용하지 않은 미완성 코드도 별도 초안으로 남는다. 새 페이지 또는 CLI에서 열어도 기존 실행기의 값을 참조하지 않는다. 색상·이동·선택·키 반응은 예제 소스에 있다. 호스트에는 세 도형 전용 상태나 이동 코드를 추가하지 않았다. 이전 드래그 놓기 수정도 유지했다. 기존 .pure 저장과 코드 JSON 저장은 계속 초안만 저장하므로 배치 저장과 구별된다. ## 무엇이 일치해야 하는가 한 작업물에 서로 다른 세 종류의 정보가 있다. | 정보 | 저장·복원 의미 | |---|---| | 적용된 코드 | 복원한 값을 해석하고 실행할 정의 | | 현재 작성 상태 | 대상 위치·선택 등 선언된 모든 숫자 값 | | 편집 초안 | 미적용·문법 미완성이어도 보존, 자동 실행하지 않음 | 현재 값을 코드의 초깃값으로 덮어쓰면 원래의 초기화 의미가 사라진다. 반대로 코드만 저장하면 조작 결과가 사라진다. 따라서 소스와 현재 값을 별도로 저장하고, 복원 시 한 번에 확정한다. **초깃값으로**는 여전히 작성한 소스의 초기값으로 돌아간다. 입력 소유권·시계·오류 기록·계산 캐시·렌더러 객체는 작업 결과에 포함하지 않는다. 복원은 정지 상태에서 시작하며 입력을 재생하지 않는다. 저장 전에 조작과 시간 진행을 끝내도록 한다. 실행 실패가 남아 있으면 해결한 뒤 저장한다. 작성자가 상태로 선언한 드래그 보조 값은 현재 모두 저장한다. 영속·일시 상태를 구분하는 언어 기능이 생겼다고 주장하지 않는다. ## 복원 구현 version2 파일은 적용된 소스, 별도 초안, 이름과 값의 목록을 가진다. 모든 상태 이름이 정확히 한 번씩 있어야 하며, 값은 유한한 숫자여야 한다. 순서는 의미가 없다. 음의 0은 JSON 숫자 직렬화에서 사라지므로 전용 문자열 `"-0"`로 보존한다. 다른 숫자 문자열은 허용하지 않는다. 파일 크기와 코드 한도를 검사한다. version1은 기존 코드 전용 파일로 계속 지원한다. 호스트는 정의와 상태 목록을 검사한 뒤 코어의 준비 공간에 넣는다. 코어는 전체 정의와 모든 복원 값을 검증한 후 활성 정의·상태를 함께 교체한다. 값 하나를 넣다 실패해 현재 배치가 절반만 바뀌는 경로가 없다. 새 준비 값은 기존 로드/계산 기록 공유 공간에 들어가며, 활성 프로그램 형식은 늘리지 않았다. 32개 복원 값과 유효성 비트·정렬 때문에 준비 공간은 264 B 늘었다. 현재 Wasm 코어 예약 구조체는 19,392 B, 선형 메모리 한도는 여전히 64 KiB다. 이는 원자적 복원에 사용한 저장 공간의 회계이며 성능 개선 주장이나 프로세스 RAM 측정이 아니다. 브라우저의 비동기 파일 읽기에는 초안 변경 번호, 적용 정의의 동일성, 성공 사건 수를 확인한다. 읽는 도중 편집하거나 도형을 움직였다면 파일을 다시 열도록 안내한다. 느린 파일 읽기가 뒤늦게 현재 작업을 덮어쓰지 않는다. CLI `save-project`와 `restore`도 같은 검증·복원 API를 사용하고 기존 파일은 덮어쓰지 않는다. ## 검증 - 네이티브 29개: 정의·복원 값의 원자적 확정, 부족·중복·비유한 값 거절, 0개·32개 상태 경계, 기존 활성 실행과 준비 값의 분리, 원래 초기값 유지. - JavaScript 68개: 소스·상태·미완성 초안의 왕복, 상태 순서 변경, 음의 0, 잘못된 파일의 비변경, 캐시 무효화, 조작 중 거절, CLI 파일 왕복과 기존 동작. - 실제 브라우저 작성·저장 17개: 세 대상 이동, 키보드 조정, 다운로드 파일로 새 페이지 복원, 잘못된 파일, 편집·입력과 비동기 읽기의 충돌, 조작 중 저장 거절, 모바일에서 추가 버튼의 가로 넘침 여부. - 기존 브라우저 작성 흐름 44개: 코드 저장·불러오기, 편집·적용·오류·키 입력 등 회귀 검사. 브라우저 검증은 Linux AArch64 Chromium에서 수행했다. Codex 내장 브라우저에서 이 새 파일 흐름까지 사용자가 검증한 것은 아니다. 앞선 놓기 수정은 사용자가 정상 동작을 확인했다. 테스트 실행 도구의 경과 시간은 성능 근거로 해석하지 않는다. 근거: [검증 로그](../../prototypes/workbench/results/2026-09-23-layout/verification.json), [코어 빌드·테스트](../../prototypes/workbench/results/2026-09-23-layout/build.json), [브라우저 결과](../../prototypes/workbench/results/2026-09-23-layout/layout-browser.json), [기존 작성 흐름](../../prototypes/workbench/results/2026-09-23-layout/authoring-browser.json), [브라우저 재현](../../prototypes/workbench/qa-layout.js), [문서 계약](../../prototypes/workbench/CONTRACT.md). ## 다음에 풀 제약 세 도형을 만들면서 대상마다 위치·잡은 위치·취소 위치·입력·반응을 반복 선언해야 했다. 같은 이동 규칙이 대상 수만큼 커지는 구조가 현재의 구체적인 제약이다. 현재 예제만으로 대규모 도구의 적합성이나 개발 경험 우위를 주장하지 않는다. 다음 후보는 **대상 집합의 데이터는 분리하고, 같은 반응은 한 번만 정의하는 실행 표현**이다. 포인터가 소유한 대상, 키보드가 선택한 대상, 저장한 대상의 식별이 일치해야 한다. 개체 추가·삭제 뒤 잘못된 대상에 입력이 적용되지 않는 조건도 함께 검토해야 한다. 문법을 꾸미거나 기존 수치를 반복 측정하기보다 이 반복과 식별 문제를 먼저 해결한다. 현재 파일 저장은 수동 저장이며 자동 저장·실행 취소·다중 사용자 동기화는 구현하지 않았다.