2026-11 · 작업 노트2026-11 · Project note
〈세이브 파일〉을 만든 코드The Code Behind Save File
작은 세계를 723번 돌리고 그 저장 파일을 작품으로 만든 과정.
Running a small world for 723 ticks and turning its save file into the work.
〈세이브 파일〉은 이미지 생성 모델을 쓰지 않았다. 직접 짠 코드가 작은 세계를 돌리고, 그 세계의 마지막 상태를 저장한 파일이 그대로 작품이 된다. 〈연산의 기억〉의 첫 작업이다.
질문
계산은 매 순간 상태를 바꾸고 지나간다. 그 가운데 한 순간을 파일로 저장하면, 그 파일은 계산의 결과인가 기억인가. 데이터 그 자체를 그림으로 볼 수 있는가.
방법
103 × 157칸의 격자 위에 흙, 식생, 불, 재, 물 다섯 가지 상태가 있다. 매 차례 식생은 조금씩 자라고, 아주 드물게 불씨가 생기며, 불은 이웃한 식생으로 번지고, 탄 자리는 재가 된다. 물은 불이 건너지 못하는 경계다.
| 값 | 의미 |
|---|---|
| 시드 7 | 같은 시드면 같은 세계가 다시 만들어진다 |
| 차례 723 | 이 횟수만큼 갱신한 뒤 멈췄다 |
| 성장 0.01371 | 빈 흙이 식생이 될 확률 |
| 불씨 0.00016 | 식생에 불이 붙을 확률 |
| 번짐 0.4065 | 불이 이웃 식생으로 옮겨 갈 확률 |
| 물 0.14698 | 처음 세계에서 물이 차지하는 비율 |
세계를 723차례 갱신한 뒤 상태를 16,274바이트의 world.sav로 저장했다. 헤더 뒤로 칸마다 한 바이트가 이어진다. 저장한 파일을 다시 읽어 격자와 차례 수가 저장 당시와 같은지 검사했고, 통과했다. 같은 코드와 같은 값으로 언제든 다시 만들 수 있다.
Python 3.12, NumPy, Pillow로 직접 만든 작업 도구의 첫 버전으로 만들었다. 작업마다 매개변수, 출력 파일의 해시, 실행 환경이 기록으로 남는다. 아래는 이 작품의 제작 기록이다.
{
"title_ko": "세이브 파일",
"seed": 7,
"params": { "columns": 103, "ticks": 723, "grow": 0.01371,
"spark": 0.00016, "spread": 0.4065, "water": 0.14698 },
"status": "미승인 시안",
"created": "2026-11-04T14:19:27+09:00",
"reproducible": true,
"outputs": { "world.sav": { "bytes": 16274, "sha256": "08c519ea…0b402" } },
"notes": { "world": [103, 157], "crc32": "B047B4A4",
"tiles": { "soil": 5909, "growth": 7123, "fire": 327,
"ash": 435, "water": 2377 },
"reload": "passed" }
}시도와 실패
이 작품은 처음 고른 출품작이 아니었다. IAAI 2026 초대작가전(마감 11월 6일)에는 11월 1일까지 〈먼 행성의 아랫목〉을 추천안으로 준비했다. 10월 30일 밤 일괄 생성에서 나온 그림이다. 신청서와 규격 파일까지 만들었지만 보내지 않았다.
- 같은 작품을 두 번 낼 수 없었다. 〈발보다 먼저 오른 빛〉은 11월 27일 개막하는 디자인학회 전시에 미전시작으로 냈기 때문에, 11월 20일 IAAI에는 낼 수 없었다.
- 그림이 문장을 따르지 않았다. 〈먼 행성의 아랫목〉의 프롬프트는 슬리퍼 한 켤레였는데, 화면 앞쪽에는 세 짝이 놓였다. 보정하지 않았다.
- 규격이 서로 달랐다. 전시 안내는 200dpi, 신청서는 300dpi 이상을 요구했다. 3937px와 5906px 파일을 모두 만들었는데, 5906px 파일은 3937px 원본을 1.5배 늘린 것일 뿐 새 디테일이 생긴 것은 아니었다.

결정
11월 4일, 이미지 모델 없이 코드로만 만든 〈세이브 파일〉을 대신 골라 11월 6일에 제출했다. 생성된 그림 대신 저장된 데이터를 낸 이 작품에서 〈연산의 기억〉이 시작되었다.


화면은 그 파일을 펼친 것이다. 바이트 하나를 한 칸에 놓고 그 값을 16진수로 적었다. 왼쪽 가장자리는 바이트의 위치, 아래쪽은 파일 크기와 검증값이다. 전시용 정사각 화면을 만들 때는 원본의 세로 비율을 유지하고, 좌우를 원래 배경과 같은 색으로 이어 붙였다.
남은 질문
같은 시드로 같은 세계를 다시 만들 수 있다면, 이 작품의 원본은 그림인가, 파일인가, 코드인가. 저장된 상태를 다시 불러와 이어서 돌린다면, 기억은 다음 계산의 출발점이 될 수 있는가.
Save File uses no image-generation model. Code I wrote runs a small world, and the file that stores the world's last state becomes the work itself. It is the first work in The Memory of Computation.
Question
A computation changes state at every step and moves on. If one moment of it is saved to a file, is that file a result or a memory? Can data itself be looked at as an image?
Method
A 103 × 157 grid holds five states: soil, growth, fire, ash and water. Each tick, growth spreads a little, a spark very rarely appears, fire spreads into neighbouring growth, and what has burned turns to ash. Water is a border fire cannot cross.
| Value | Meaning |
|---|---|
| Seed 7 | The same seed rebuilds the same world |
| 723 ticks | The world stopped after this many updates |
| Growth 0.01371 | Chance that bare soil becomes growth |
| Spark 0.00016 | Chance that growth catches fire |
| Spread 0.4065 | Chance that fire moves to neighbouring growth |
| Water 0.14698 | Share of the starting world covered by water |
After 723 ticks the state was saved as world.sav, 16,274 bytes: a header followed by one byte per cell. Reading the file back confirmed that the grid and tick count matched the moment of saving. The same code and values can rebuild it at any time.
It was made with the first version of my own tool, built with Python 3.12, NumPy and Pillow. Every work records its parameters, the hashes of its outputs and the environment. This is the build record for this work:
{
"title_en": "Save File",
"seed": 7,
"params": { "columns": 103, "ticks": 723, "grow": 0.01371,
"spark": 0.00016, "spread": 0.4065, "water": 0.14698 },
"status": "unapproved draft",
"created": "2026-11-04T14:19:27+09:00",
"reproducible": true,
"outputs": { "world.sav": { "bytes": 16274, "sha256": "08c519ea…0b402" } },
"notes": { "world": [103, 157], "crc32": "B047B4A4",
"tiles": { "soil": 5909, "growth": 7123, "fire": 327,
"ash": 435, "water": 2377 },
"reload": "passed" }
}Attempts and failures
This was not the first work prepared. Until 1 November the recommendation for the IAAI 2026 Invited Artists Exhibition (deadline 6 November) was A Warm Floor on a Distant Planet, an image from the overnight batch of 30 October. The application and files were ready, but it was never sent.
- The same work could not be shown twice. The Light That Climbed Before the Step had been submitted as previously unexhibited work to the design society show opening 27 November, so it could not go to IAAI on 20 November.
- The image did not follow the sentence. The prompt for A Warm Floor asked for one pair of slippers; three single slippers appeared in the foreground. It was not corrected.
- The specifications disagreed. The notice asked for 200 dpi, the application form for 300 dpi or more. Files at 3937 px and 5906 px were both prepared, though the 5906 px file was only the 3937 px original enlarged 1.5 times, with no new detail.

Decision
On 4 November Save File, made with code and no image model, was chosen instead and submitted on 6 November. The Memory of Computation began with this work, which offered stored data in place of a generated picture.


The image is that file laid out. Each byte occupies one cell, labelled with its value in hexadecimal. The left edge shows byte offsets; the bottom shows the file size and checksums. For the square exhibition format, the original vertical proportion was kept and the sides were extended in the original background colour.
Open questions
If the same seed rebuilds the same world, is the original of this work the image, the file or the code? And if a saved state were loaded and run on, could memory become the starting point of the next computation?
