챕터 08

I CALL IT A CLUE

이 챕터와 함께 듣기

Night Data Loop

모니터와 게임 장비가 가득한 방에서 반복되는 장면과 신호를 조사하는 아린.

아린은 같은 장면을 열세 번째 돌려 보고 있었다.

가운데 모니터에서 오래된 레이싱 게임의 플레이 녹화본이 재생됐다. 화면 속 자동차가 교차로를 빠져나와 왼쪽 골목으로 들어가자 프레임이 한 번 흔들리며 차량이 아무것도 없는 곳에 부딪혔다.

쿵.

아린은 영상을 멈췄다. 한 프레임 뒤로. 또 한 프레임. 그리고 다시 앞으로. 화면 오른쪽 아래에서 작은 픽셀 두 개가 연달아 깜빡였다. 한 번. 두 번. 아린은 타임코드를 적었다.

[01:47:22.183]

왼쪽 모니터에는 다른 게임의 로그가 길게 내려가고 있었다. 개발사도, 출시 시기도, 장르도 다른 도시 건설 시뮬레이션이었다.

아린은 작은 주거 시설 하나를 지도 위로 끌어다 놓았다.

[PLACEMENT ERROR(배치 오류)]

조금 옆으로 옮겼다. 설치됐다. 다시 원래 위치.

[PLACEMENT ERROR]

“또 여기.”

오른쪽에는 세로로 세운 모니터가 있었다. 게시판과 메신저, 몇 개의 작은 창이 겹쳐 떠 있었다. 세 화면의 빛만으로 방 안은 충분히 밝았다.

그 빛이 아린의 안경에 여러 겹으로 비쳤다. 거의 검게 보이는 머리카락은 화면이 바뀔 때마다 끝부분에 짙은 녹색을 희미하게 드러냈고, 앞머리 한쪽은 작은 금속 핀으로 눌러 두었다. 그 아래의 눈은 회색이 섞인 어두운 녹색이었고, 모니터 빛을 받아 희미하게 반짝였다.

책상 아래에는 어디로 연결되는지 구분하기 힘든 충전선들이 발에 치일 만큼 늘어져 있었고, 모니터 앞에는 오래 써서 스틱 표면이 반들반들해진 게임패드가 놓여 있었다. 선반에는 구형 휴대용 게임기와 몇 개의 카트리지가 아무렇게나 겹쳐 있었고, 그 옆에는 아직 엔딩을 보지 못한 게임의 패키지가 비스듬히 꽂혀 있었다. 빈 캔 두 개, 뜯다 만 과자 봉지, 정체를 알 수 없는 케이블들. 굳게 닫힌 창문에 반쯤 쳐진 커튼만이 현실의 시간을 알려주는 단서였다.

아린은 세 번째 프로그램을 열었다. 이번에는 오래된 생활 시뮬레이션이었다. 캐릭터가 길을 걷다가 특정 골목 앞에서 멈췄다. 길은 이어져 있었고 장애물도 없었지만 캐릭터는 그곳을 넘어가지 않았다. 경로 탐색을 다시 돌리자 긴 우회로가 표시됐다.

아린이 중얼거렸다.

“너도?”

그녀는 세 프로그램의 화면을 한꺼번에 띄웠다.

레이싱, 도시 건설 시뮬레이션, 생활 시뮬레이션. 전혀 다른 게임들이었다. 그런데 각자 오류가 발생한 지점을 표시한 맵 데이터를 번갈아 보자 묘한 기시감이 들었다.

아린은 화면의 방향과 확대 비율을 맞췄다. 세 지점이 거의 같은 장소에 겹쳤다. 그녀는 화면들을 캡처하여 저장했다. 자동으로 버그 리포트 파일명이 붙었다.

[bug_042]

아린은 잠시 그것을 바라봤다. 그리고 이름을 버그에서 단서로 바꿨다.

[clue_042]

오른쪽 모니터에서 알림이 떴다.

NIRA

아린이 온라인에서 쓰는 이름이었다. ARIN을 거꾸로. 처음 계정을 만들 때 별생각 없이 뒤집었다. 지금은 본명보다 그 이름을 아는 사람이 훨씬 많았다.

채팅방에 새 글이 달렸다.

Legend_of_Legend: 그 시절 맵이면 충돌 깨지는 게 당연하지 않음?

아린은 바로 타자를 쳤다.

NIRA: 그럼 설명해봐요.

한 줄 더.

NIRA: 엔진 다른 게임 세 개가 왜 같은 좌표에서 깨지는지.

잠시 뒤 다른 사용자가 끼어들었다.

fat_and_furious: 형님들 또 시작했네 ㅋㅋ

NIRA: 시작한 건 버그 쪽인데.

fat_and_furious: 이번엔 뭐 찾았는데

아린은 캡처 세 장을 올렸다.

NIRA: 엔진 다름. 개발사 다름. 출시 연도 다름. 위치는 같음.

잠시 답변이 멈췄다.

Legend_of_Legend: 공통 asset 아니고?

NIRA: 아님.

NIRA: 이미 확인했지. asset hash 전부 다름.

fat_and_furious: 그럼 뭐가 같은데

아린의 손이 잠깐 멈췄다.

NIRA: 그걸 찾는 중.

잠깐 뒤.

NIRA: 다음 가설.

아린은 댓글창을 최소화했다. 웃는 얼굴도, 비꼬는 말투도 별로 신경 쓰이지 않았다. 화면 안에서는 누가 어떻게 반응하는지 오래 신경 쓸 필요가 없었다. 틀리면 지우면 됐다. 맞으면 남았다. 그리고 필요하면 언제든 창을 닫을 수 있었다.

그녀는 또 다른 게임 하나를 실행했다.

두 시간이 지나자 아린은 아홉 개의 오래된 프로그램을 돌려 봤다. 여섯 개가 서로 다른 방식으로 같은 장소를 피했다.

아린은 캡처 영상을 멈췄다.

“같네.”

좌표를 바꾸는 방식도, 높이값도 제각각이었다. 그런데 겹쳐 놓자 점들은 작은 한 구역으로 모였다. 아린은 좌표들을 겹쳤다. 점들이 하나의 작은 영역을 만들었다. 오른쪽 모니터에서 새 댓글이 떴다.

fat_and_furious: 아직도 함?

NIRA: 당연.

fat_and_furious: 집요하다 진짜

아린은 피식 웃고 다시 왼쪽 모니터를 봤다. 프로그램들의 개발 자료를 하나씩 뒤지던 중 공통된 이름 하나가 반복해서 나타났다.

[URBAN SPATIAL GRID SDK(도시 공간 격자 개발 키트)]

아린의 손이 멈췄다.

“아.”

같은 SDK를 사용한 목록을 펼치자 게임과 교육·교통·관광 프로그램이 뒤섞여 나왔다. 용도는 달라도 현실의 공간을 읽는 층이 있다는 사실은 같았다.

아린이 채팅창을 다시 열었다.

NIRA: 공통 레이어 찾음.

Legend_of_Legend: 뭔데

NIRA: Spatial Grid(공간 격자).

fat_and_furious: 그러면 좌표 오류겠네

NIRA: 아니.

Legend_of_Legend: 왜

NIRA: 좌표 오류면 위치가 흔들리겠지.

한 줄 더.

NIRA: 얘들은 계속 같은 데서 멈춤.

fat_and_furious: 그럼 거기 뭐 있나

아린은 그 문장을 잠시 바라봤다.

NIRA: 그게 다음 문제.

그녀는 채팅창을 닫았다.

깨진 문서와 캐시 파일, 즉, 프로그램에 임시로 저장된 데이터를 맞춰 보던 중, 서로 다른 프로그램에서 같은 값 하나가 반복해서 튀어나왔다.

[0x7F]

첫 번째 게임.

[OBJECT_REF(개체 참조) 0x7F]

두 번째.

[SPATIAL_CLASS(공간 등급) 0x7F]

다른 프로그램.

[RESTRICTED_VOLUME(제한 볼륨) 0x7F]

아린이 눈을 가늘게 떴다.

“잠깐.”

같은 메모리 주소일 수는 없었다. 엔진도 다르고 구조도 달랐다. 그녀는 처음부터 다시 확인했다.

0x7F.

0x7F.

0x7F.

우연한 숫자가 아니었다. 프로그램들이 각자 만든 값도 아니었다. 도시 공간 격자 쪽에서 공통으로 넘겨받은 표식이었다.

아린은 오래된 인덱스 하나를 찾아냈다.

[0x7C — PUBLIC TRANSIT(대중교통)] [0x7D — STRUCTURAL SERVICE(시설 유지보수)] [0x7E — EMERGENCY ACCESS(비상 접근)] [0x7F — RESERVED(예약 영역)]

그 아래는 비어 있었다.

아린은 몇 초 동안 그대로 화면을 바라봤다. 오른쪽 모니터에 알림이 떴다.

Legend_of_Legend: 뭔가 나옴?

아린은 입력했다.

NIRA: 찾았다.

fat_and_furious: 뭔데뭔데

NIRA: 0x7F.

Legend_of_Legend: 그게 뭔데

NIRA: 아직 모름.

fat_and_furious: 찾았다며

NIRA: 뭔지는 몰라도 있다는 건 찾았지.

잠시 뒤.

NIRA: 근데 전부 이걸 봄.

Legend_of_Legend: 전부?

NIRA: 전부.

프로그램마다 피하는 방식만 달랐다. 막고, 우회하고, 카메라를 밀어냈다. 같은 무언가를 서로 다른 방식으로 보고 있었다.

아린의 손이 멈췄다. 그녀는 화면을 차례로 봤다.

“버그가 같은 게 아니었어.”

키보드에 손을 올렸다.

NIRA: 버그가 아님.

fat_and_furious: ?

잠시 뒤.

NIRA: 모두 같은 걸 피하고 있었음.

댓글창이 조용해졌다.

Legend_of_Legend: ……오.

fat_and_furious: 그건 좀 소름인데

이후에 그들은 그들의 음모론을 펼쳐갔다. 아린은 그걸 보고 조금 웃었다.

민간 프로그램은 제한 구역의 정체를 알 필요가 없었다. 그저 이 공간을 통과하지 말 것, 여기에는 객체를 만들지 말 것, 이 높이에는 접근하지 말 것. 그 정도의 정보만 있으면 됐다. 원래 무엇이 있었는지는 필요하지 않았다. 경계를 겹칠수록 형태가 잡혔다. 그리고 세 자료에서 거의 같은 깊이값이 남았다. 직사각형에 가까운 공간, 옆으로 길게 이어진 좁은 통로, 그 끝의 작은 구역. 그리고 높이값. 한 프로그램에서 숫자 하나가 남아 있었다.

[-18.4]

아린은 다른 자료와 맞춰 보정했다.

[-18.7]

다른 좌표를 하나 더 넣었다.

“……마이너스?”

지상 좌표는 맞았다. 높이만 상당히 깊은 지하였다. 아린은 현재의 구도심 지도를 띄웠다.

B-04 지하 좌표로 이어지는 신호 경로를 추적하는 아린.

[구도심 서부]

[B-04]

현재 지도에도, 옛 지도에도 B-04 지하 통신실 아래는 비어 있었다.

아린은 모니터에 턱을 가까이 댔다.

“없는 게 아니라.”

잠시 후.

“안 보이는 거네.”

말하고 나서 스스로 조금 민망해졌다. 아무도 없는 방을 한 번 돌아봤다. 그리고 다시 화면을 봤다.

새벽 세 시가 넘었다.

아린은 Spatial Grid에 남아 있던 오래된 테스트 접속 주소를 열었다. 정상이라면 오래전에 끊겼어야 할 주소였다. 연결 상태는:

[UNKNOWN(확인 불가)]

아린은 입력창을 바라봤다. 게시판에 물어볼까 생각했지만 그러지 않았다. 사람이 끼면 귀찮았다. 설명해야 했다. 증명해야 했다. 틀리기라도 하면 더 귀찮았다.

아린은 입력창에 연결이 살아 있는지 확인하는 짧은 호출을 입력했다.

[PING]

손가락이 엔터 위에서 멈췄다. 죽은 주소, 남은 캐시, 깨진 데이터. 그뿐일 것이다.

아린은 엔터를 눌렀다.

커서가 다음 줄로 내려갔다. 아무것도 나오지 않았다. 오 초, 십 초. 오류도 없었다. 아린의 미간이 좁아졌다. 보통은 실패 메시지가 바로 나와야 했다.

[HOST UNAVAILABLE(대상에 연결할 수 없음)]

[ROUTE NOT FOUND(전송 경로를 찾을 수 없음)]

그런데 아무 오류도 뜨지 않았다. 아린이 전송 기록을 열었다. 신호는 실패한 게 아니었다. 목적지까지 도달해 있었다.

[DELIVERED(목적지 도달)]

아린은 움직이지 않았다.

“……뭐야.”

추가 응답은 없었다. 그녀는 이어서 입력했다.

[HELLO?]

잠깐 바라보다 지웠다. 대신 신호가 어디를 거쳐 갔는지 추적했다. 중간의 연결 지점들은 거의 전부 끊겨 있었다. 그런데 끝에 있는 하나만 아직 응답하고 있었다.

[B-04, -18.6]

아린은 화면을 한동안 바라봤다. 죽은 줄 알았던 망의 끝이, B-04 지하 18.6미터에서 아직 살아 있었다.

아린은 의자 등받이에 머리를 기대고 천장을 봤다. 게임 파일을 열고, 로그를 뒤지고, 프레임을 하나씩 비교하는 건 어렵지 않았다. 화면은 가까이 와도 괜찮았다. 필요하면 언제든 창을 닫을 수 있었다. 문제는 그 마지막 지점이 화면 안이 아니라 현실에 있다는 것이었다.

아린은 눈을 감았다.

“아…”

잠시 뒤.

“밖에 나가야 되네.”

그날 가장 힘든 결론이었다.

다음 날 오후.

아린은 같은 블록을 세 번 지나쳤다. 첫 번째는 입구를 못 찾았다. 두 번째는 찾았지만 앞에 사람이 있어서 그냥 지나갔다. 세 번째에는 아무도 없었다. 그제야 골목으로 들어갔다.

검은 재킷의 후드를 깊게 눌러썼다. 검은 머리 끝에 섞인 짙은 녹색이 바람을 받을 때마다 잠깐씩 드러났다. 안경 너머의 시선은 거의 계속 단말에 붙어 있었다. 고양이 귀 모양 LED가 달린 헤드폰은 목에 걸려 있었고, 양쪽 테두리에는 어두운 녹색 불빛이 희미하게 들어와 있었다.

[143m]

아린은 고개를 들었다. 낡은 건물, 막힌 골목, 무너진 콘크리트. 다시 화면.

[121m]

“맞긴 맞네.”

사람 하나가 반대편에서 걸어오자 아린은 자동으로 길 가장자리로 붙었다. 몸까지 조금 굳었다. 상대는 그녀를 쳐다보지도 않고 지나갔지만 아린은 몇 초를 더 기다린 뒤에야 다시 걷기 시작했다.

구도심은 화면으로 봤을 때보다 컸다. 당연한 사실이 그녀에게는 이상했다. 게임 지도에서는 손가락 두 개로 확대하면 끝이었다. 현실에서는 한 블록을 도는 데 몇 분이 걸렸다. 깨진 창문에서는 바람이 들었고, 먼지가 목에 걸렸다. 무너진 건물은 텍스처가 아니라 머리 위에 있었다.

아린은 다시 단말을 확인했다.

[37m]

낡은 표지가 벽에 남아 있었다.

[B-04]

그녀는 멈췄다.

“여기.”

입구는 막혀 있지 않았다. 아린은 그게 더 싫었다. 그녀는 한동안 어두운 안쪽을 바라봤다. 돌아가도 됐다. 좌표도 확인했다. 여기까지 온 것만으로도 충분했다. 내일 와도 됐다.

누군가와 같이—

아린의 생각이 멈췄다.

‘누구랑?’

없었다.

그녀는 작게 한숨을 쉬었다.

“가보자.”

그녀의 호기심이 등을 떠밀었다.

구도심 B-04 지하 시설로 내려가는 아린.

지하로 내려갈수록 통신 상태가 나빠졌다. 현재 지도는 입구 근처에서 끊겼다. 대신 아린이 직접 짠 좌표 오버레이만 남았다.

[DEPTH(깊이) : -6.3]

복도.

[DEPTH : -9.1]

계단.

벽에는 오래된 안내선이 희미하게 남아 있었다.

아린은 손전등을 비췄다. 응급 시설, 통신실, 폐쇄 구역, 그리고 먼지가 흐트러진 자국. 누군가 최근에 지나간 흔적이었다.

아린의 걸음이 멈췄다.

온라인이었다면 바로 캡처부터 했을 것이다. 현실에서는 먼저 주변부터 봤다. 아무도 없었다. 그래도 몇 초 동안 움직이지 않았다.

단말을 확인했다. 목표 지점은 더 아래였다.

[DEPTH : -18.6]

현재 위치보다 거의 구 미터 아래였지만 계단은 끝나 있었다. 아린은 어두운 복도를 한 바퀴 돌았다. 막다른 벽, 폐쇄된 문, 무너진 통로. 좌표는 계속 같은 방향을 가리켰다.

“말이 안 되는데.”

그녀는 벽을 따라 걸었다. 그리고 바닥 일부가 무너진 곳에서 멈췄다. 검은 구멍이 있었다. 손전등을 비추자 빛이 아래로 떨어졌다. 깊었다. 깨진 콘크리트와 철근 사이로 아래층의 구조물이 희미하게 보였다.

“……여기네.”

무너진 가장자리에 한 걸음 가까이 갔다가 바로 물러났다. 다시 내려다봤다.

“이건 좀 아닌 거 같은데.”

부서진 가장자리 일부에는 먼지가 덜 쌓여 있었다. 오래된 붕괴처럼 보이지 않았다. 누군가 최근에 이곳을 지나간 흔적이 남아 있었다. 아린이 손전등을 옆으로 비추자 벽에 오래된 유지보수 사다리가 붙어 있었다. 아래까지 이어져 있었다.

그녀는 한참 그것을 바라봤다.

“어우, 진짜…”

작게 욕을 삼켰다. 헤드폰을 벗어 가방에 넣고 후드를 더 깊게 눌러썼다. 그리고 사다리를 잡았다.

아래층은 더 차가웠다. 공기에는 오래된 먼지와 금속 냄새가 섞여 있었고, 벽에는 위층과 다른 규격의 패널이 박혀 있었다.

아린은 몇 걸음 움직이다 멈췄다.

오래된 장비, 낮은 캐비닛, 부서진 케이블, 그리고 벽 쪽에 붙은 작은 도킹 구조물 같은 금속 프레임.

단말을 확인했다.

[8m]

앞으로.

[5m]

벽을 돌아.

[2m]

아린은 멈췄다.

[0.4m]

“여기?”

아무것도 없어 보였다. 그녀는 손전등을 천천히 움직였다.

먼지, 부서진 천 조각, 뒤집힌 금속 판. 그리고 그 아래.

어두운 B-04 시설에서 흰색 기체 COCORO를 발견한 아린.

흰색.

아린의 손이 멈췄다. 몸을 조금 숙여 보자 작은 기계의 형체를 알아볼 수 있었다. 처음에는 버려진 오래된 서비스 장비처럼 보였다. 둥근 몸체. 양쪽 위로 짧게 튀어나온 두 개의 구조물. 바닥에는 접힌 다리인지 바퀴인지 알 수 없는 부품이 붙어 있었다. 외장은 누렇게 변색돼 있었고 한쪽에는 긴 긁힌 자국이 남아 있었다.

아린은 가까이 가지 않고 몇 초 동안 그대로 바라봤다. 단말의 좌표는 정확히 그것을 가리키고 있었다.

“너야?”

당연히 대답은 없었다. 아린은 한 걸음 다가갔다. 기계는 움직이지 않았다. 또 한 걸음. 손전등을 낮췄다. 외장 한쪽에 거의 지워진 문자가 보였다. 아린이 먼지를 불자 기침이 터졌다.

“아, 씨…”

팔로 입을 막았다가 다시 들여다봤다. 문자는 일부만 남아 있었다.

[C—S]

그 아래에는 읽을 수 없는 일련번호가 있었다. 아린은 단말을 들어 사진을 찍었다.

찰칵.

둥근 기계의 전면에서 아주 작은 표시등 하나가 켜졌다. 아린의 손이 멈췄다. 빛이 꺼졌다가 다시 켜졌다.

아린은 숨을 멈췄다. 화면 속에서 수십 번 보았던 것과 같은 간격이었다. 아무것도 움직이지 않았다. 그런데 이제 그것은 더 이상 버그가 아니었다.

End track

I Call it a Clue

YOUTUBE CHANNEL

채널을 구독하면 새 챕터와 트랙의 신호를 수신할 수 있습니다.