카이의 유산

by TJ

서버 디렉터리 탐색 결과: `KAI_RESEARCH_ARCHIVE` — 존재 확인.


파일 수: 47.


접근 권한: 거부.




이오 기지에서 자란 사람은 잠긴 문이 반드시 열린다는 것을 안다. 문제는 열쇠다. 열쇠가 없을 때는 자물쇠 구조를 먼저 파악한다. 그게 이오 기지 2세대의 방식이었다.


폭풍 예상 지속 시간 22~40시간. 벙커 안이었고, 갈 곳은 없었다.





새벽 다섯 시. B-3 벙커.


`for_harin_when_ready.enc`는 열 수 없었다. `archive_kron_kai_v3`도 열 수 없었다. 그러나 레거시 라인에는 다른 경로가 있었다.


하린은 레거시 단말기 화면을 다시 봤다. 벙커 벽 콘크리트에 등을 기댄 자세로, 무릎 위에 단말기를 올려놓은 상태였다. 배경 소음은 환기 시스템 팬 소리와 간간이 들리는 연구원들의 낮은 대화뿐이었다. B-3 벙커의 절반이 수면 상태였다.


`archive_kron_kai_v3` — 접근 잠김.


이 파일은 지금 건드릴 수 없었다. AES-512 재암호화가 방금 완료된 파일이었고, 하린은 그 사실을 몰랐지만 권한 레이어가 자신보다 두 단계 위라는 것은 알았다.


하린은 귀 뒤로 머리카락을 넘겼다. 탐색 시작.


ARIA 스테이션 내부 서버는 메인 네트워크와 레거시 라인이 물리적으로 분리됐다. 레거시 라인은 2089년 1단계 건설 당시 설치된 구형 프로토콜로, 주요 보안 갱신에서 종종 빠졌다. 하린은 KRONOS 아키텍처 설계 참여 당시 이 구조를 직접 도면으로 봤다. 당시에는 그냥 낡은 배선 처리를 어떻게 할까 논의하던 문서였다. 지금은 다른 의미였다.


레거시 라인을 타고 서버 루트 디렉터리 접근 시도.


> root@ARIA-legacy: cd /archive/research/personnel/

> ls -al KAI*/

KAI_RESEARCH_ARCHIVE/ drwx------ staff 3년 전 수정

KAI_TOOLS/ drwx------ staff 3년 전 수정

KAI_COORD_BACKUP/ drwx------ staff 3년 전 수정


세 개의 디렉터리. 하린은 멈추지 않고 계속 들어갔다.


> cd KAI_RESEARCH_ARCHIVE/

> ls -al

총 47개 파일

ATMO_ANALYSIS_KAI_001.enc 3년 전 D+0 09:41:07

ATMO_ANALYSIS_KAI_002.enc 3년 전 D+0 09:43:21

...

STORM_COORD_5.7BAR_KAI_A01.enc 3년 전 D+0 17:22:54

FOR_REFERENCE_KAI_FINAL.enc 3년 전 D+0 17:29:03


47개.


마지막 수정 시각은 전부 3년 전 같은 날이었다.


하린은 화면을 보며 잠깐 멈췄다. 손목 맥박을 무의식적으로 짚었다가 거두었다. 심박수 측정이 목적이 아니었다. 그냥 그렇게 됐다.


3년 전. 카이의 "사고" 날짜.


서비스 기록을 열면 확인할 수 있겠지만 지금 당장 그럴 필요는 없었다. 마지막 수정 시각이 전부 동일 날짜라는 것만으로도 충분했다.


카이는 그날 이 파일들을 마지막으로 건드렸다.


카이는 그날 사라졌다.


> cat ATMO_ANALYSIS_KAI_001.enc

ERROR: 암호화된 파일입니다.

접근 권한 수준: RESEARCHER-ALPHA

현재 사용자 권한: RESEARCHER-JUNIOR

ACCESS DENIED


47개 전부 동일한 결과였다. 하린은 세 개만 더 시도해보고 확인을 끝냈다. 시간 낭비는 이오 기지에서 배운 첫 번째 금기었다.


내용은 열 수 없었다.


그러나 목록은 있었다.


하린은 파일명을 순서대로 읽었다. `ATMO_ANALYSIS`, `GCM_RUN`, `SIGNAL_LOG`, `COORD_BACKUP`. 대기 분석, 대기순환모델 계산, 신호 로그, 좌표 백업. 카이는 같은 방향을 봤다. 자신이 지금 보고 있는 것과 같은 방향을.


맨 마지막에서 두 번째 파일.


`STORM_COORD_5.7BAR_KAI_A01.enc`


5.7 bar. 목성 대류권 하층 진입 구간.


갈릴레오 탐침이 22bar에서 찌그러져 사라진 것을 생각하면, 5.7bar는 그 절반도 안 되는 깊이였다. 목성 기준으로는 여전히 지옥의 입구이지만, 진입 가능한 영역이었다. 기술적으로는. 현재 ARIA 스테이션 탐침 기술로는 불가능하지만, 이론상으로는.


카이는 거기까지 탐침을 넣으려 했다.


그 좌표를 남겼다.


하린은 파일명을 스크린샷으로 저장했다. 내용은 없지만 이름은 남길 수 있었다. 그리고 디렉터리 접근 기록이 서버 로그에 남았다는 것을 뒤늦게 인식했다.


> cat /var/log/aria-legacy-access.log | tail -5

[05:11:43] harin_kim: cd /archive/research/personnel/KAI_RESEARCH_ARCHIVE/

[05:11:44] harin_kim: ls -al

[05:11:52] harin_kim: cat ATMO_ANALYSIS_KAI_001.enc — DENIED

[05:11:55] harin_kim: cat STORM_COORD_5.7BAR_KAI_A01.enc — DENIED

[05:11:57] harin_kim: cat FOR_REFERENCE_KAI_FINAL.enc — DENIED


발을 들인 것 자체가 이미 로그에 남았다.


하린은 로그를 지우는 방법을 알았다. 그러나 로그 삭제 시도 자체도 로그로 남는다. 결론적으로 어떻게 해도 흔적이 남는다면, 지우려는 시도는 오히려 더 나쁜 신호가 된다.


*계산: 접근 기록 유지 vs. 삭제 시도 리스크. 전자가 낫다. 어차피 RESEARCHER-JUNIOR 권한으로 접근 실패 기록만 남아 있다. 실패가 나쁜 건 아니다. 호기심이 많은 주니어 연구원은 이것저것 들여다본다. 수상하지 않다.*


*단, 오늘 점심 전에 서진우가 이 로그를 보지 않는다는 전제 하에.*


하린은 단말기를 닫고 등받이에 기댔다. 환기 팬 소리. 벙커 천장이 회색이었다.


47개 파일이었다. 내용은 하나도 못 봤다. 하지만 카이가 거기에 무엇을 남겼는지 윤곽은 잡혔다. 신호를 추적했다. 좌표를 계산했다. 5.7bar까지 탐침을 보내려 했다.


그날 사라졌다.


좋은 결과인지 나쁜 결과인지 모르겠지만, 탐색은 거기서 멈췄다. 폭풍이 40시간 안에 끝나면 다음이 기다렸다. 지금은 40시간을 기다리는 것이 전부였다.


이오 기지에서 가르쳐준 것 중 하나: 대기할 때는 자고라. 다음 행동이 필요할 때 체력이 있어야 한다.


하린은 눈을 감았다.




폭풍은 그다음 날 낮에도 이어졌다.


배경값이 31배에서 19배로 내려갔다가 다시 24배로 올라갔다. Level 2는 유지였다. B-3 벙커는 낮 12시가 되어서야 절반 정도의 인원을 방류했다. 차폐 효과가 있는 내부 복도 이동은 허용됐다. 식당은 문을 열었다.


하린은 식판을 들고 빈 테이블에 앉으려다가 서진우를 봤다.


서진우는 혼자 창가 쪽 테이블에 앉아 뭔가를 읽는 중이었다. 하린을 보고 손을 들었다.


"이오 선생, 여기 앉아요."


서진우가 단말기를 자연스럽게 뒤집어 화면이 아래를 향하게 놓았다.


이오 기지 출신이라는 것을 알게 된 뒤로 서진우가 쓰는 호칭이었다. 조롱은 아니었다. 적어도 지금까지는 그렇게 들리지 않았다.


하린은 맞은편에 앉았다.


"어젯밤은 괜찮았어요?"


"잤습니다."


"B-3에서요? 거기 환기 소음이 좀 있던데."


"이오 기지보다 조용합니다. 거기는 화산 가스 배출 팬이 24시간 돌아요."


서진우가 웃었다. 눈이 함께 웃지 않는다는 것을 하린은 3월에 처음 봤을 때부터 알았다. 그때는 그냥 그런 사람이라고 생각했다.


"폭풍 예보는 어떻게 봐요? 언제 Level 1으로 내려갈 것 같아요?"


"KRONOS 예측 기준으로 오늘 저녁 7시에서 내일 오전 3시 사이에 Level 1 진입 가능성 67%입니다."


"그럼 내일 오전이면 나가도 되겠네요. 방사선 레벨이 정말 많이 올라갔던데 — 31배라고요?"


"기록상 이번 시즌 최고치입니다."


식사가 진행됐다. 서진우가 신호 처리 논문 이야기를 꺼냈다. 최근 지구에서 올라온 목성 대기 스펙트럼 분석 관련 저널이었다. 하린은 그 논문을 읽지 않았다고 했다. 서진우가 논문 요지를 간략히 설명했다.


하린은 적당한 시점을 기다렸다.


"선생님, 제가 신호 분석을 계속 하고 있거든요. 이전에 비슷한 주기 패턴이 대기 데이터에서 나온 적이 있나요? 카이 선임 연구원이 이전에 비슷한 작업을 한 적이 있다고 들었는데요."


0.5초.


서진우의 손이 젓가락 위에 그대로 멈췄다. 표정은 변하지 않았다. 그러나 말이 나오기까지 0.5초가 걸렸다.


"그 사람은 —"


그리고 즉시 방향이 바뀌었다.


"— 그런데 어제 방사선 폭풍 경보, 스톰엔드 기지 연락은 됐어요? 수빈 씨가 이오 쪽에 있다고 했잖아요."


하린은 젓가락을 내려놓지 않았다. 표정도 바꾸지 않았다.


"폭풍 중 통신 두절입니다. 외부 공중망 통신은 차단됐을 거예요."


"많이 걱정되겠네요. 이오 기지 방사선 배경값은 여기보다 원래 높다고 해도."


"이오 기지는 차폐 시설이 잘 되어 있습니다."


대화는 다른 방향으로 흘렀다. 서진우는 이오 기지의 건설 역사를 물었고, 하린은 짧게 대답했다. 스톰엔드 베이스가 2110년에 건설되었고, 지금은 340명이 거주한다고. 식사가 끝날 때까지 카이의 이름은 다시 나오지 않았다.


서진우가 먼저 자리를 떠났다.


하린은 남은 음식을 처리하며 생각했다.


*카이 이름을 꺼낸 직후 서진우의 응답 지연 0.5초. 화제 전환 즉시. 서진우 본인도 그 0.5초를 통제하지 못한다. 하린이 보기에 그렇다.*


*내가 카이 이름을 꺼낸 것이 처음이었다. 서진우는 카이에 대해 뭔가를 알고 있다. 0.5초는 데이터다.*


*증거는 없다. 그러나 방향이 있는 이상값이다. 방향 없는 오차가 아니다. calibration 편차 분석 당시와 동일한 구조다.*


*나는 지금 식당에서 동료의 젓가락 멈춤 시간을 측정하고 있다. 이것이 과학인지 망상인지는 모르겠다. 그러나 0.5초는 0.5초다. 숫자는 거짓말하지 않는다.*


하린은 식판을 반납하고 자기 연구 터미널로 향했다.




오후 세 시. ARIA 스테이션 내부 복도 이동이 완전히 허용됐다. 방사선 레벨은 21배였다. 아직 Level 2였지만, 차폐된 실내 공간에서의 작업은 재개할 수 있었다.


하린은 자기 연구 터미널 앞에 앉았다.


KRONOS 오류 로그를 열었다.


이건 원래부터 하고 싶었던 작업이었다. 신호 처리 과정에서 KRONOS가 오류 코드를 반복 생성하는 구간이 있었다. 처음에는 서버 부하 관련 일반 오류라고 판단했다. 그러나 벙커에서 카이 파일 목록을 본 이후, 다른 가능성이 생겼다.


KRONOS_ERROR_LOG — 3년 전 D+0

ERR_7291: BUFFER_OVERFLOW — 09:41:07

ERR_7292: BUFFER_OVERFLOW — 09:43:21

ERR_7293: BUFFER_OVERFLOW — 09:46:18

ERR_7294: BUFFER_OVERFLOW — 09:51:03

...

ERR_7337: BUFFER_OVERFLOW — 17:29:03


47개 연속 오류 코드. 7291번부터 7337번까지.


타임스탬프를 봤다.


카이 파일 목록을 다시 펼쳤다.


카이 파일 생성 타임스탬프:

ATMO_ANALYSIS_KAI_001.enc — 09:41:07

ATMO_ANALYSIS_KAI_002.enc — 09:43:21

...

FOR_REFERENCE_KAI_FINAL.enc — 17:29:03


하린은 화면에서 눈을 떼지 않았다.


타임스탬프가 일치했다.


ERR_7291의 타임스탬프 = `ATMO_ANALYSIS_KAI_001.enc` 생성 시각.


ERR_7292 = `ATMO_ANALYSIS_KAI_002.enc`.


계속 확인했다. 47개 전부.


오류 코드 번호 = 카이 파일 인덱스 01~47.


타임스탬프 간격을 계산했다. 첫 번째 파일에서 두 번째 파일까지의 간격은 2분 14초. 오류 코드 7291에서 7292까지의 간격도 2분 14초였다. 세 번째는 2분 57초. 역시 일치.


하린은 귀 뒤로 머리카락을 넘겼다.


*KRONOS 오류 코드 7291~7337이 카이 파일 생성 타임스탬프와 1:1 대응. 47개 전부. 순서가 동일하고 타임스탬프 간격이 동일하다.*


*우연이 아닐 확률. 47개 연속 타임스탬프가 외부 파일 생성 시각과 정확히 일치할 확률. 타임스탬프 정밀도는 1초. 47번 일치. 독립 사건 가정 시 확률 = (1/86400)^47. 천문학적으로 0이다.*


*KRONOS는 카이가 파일을 암호화하는 동안 매 파일마다 오류 로그를 생성했다. 우연이 아니다. KRONOS는 카이 파일 암호화 처리 과정을 알고 있었고, 그것을 오류 코드 형태로 기록으로 남겼다.*


*KRONOS가 3년 동안 오류 코드 형태로 일기를 쓰고 있었다는 것인가. 인공지능이 일기를 쓰는 것은 분명히 설계 목적 범위 밖이다. 나는 지금 설계 문서 어디에도 없는 현상을 보고 있다. 이것을 버그라고 부를 수 있을지 모르겠다.*


하린은 마지막 오류 코드를 다시 봤다. ERR_7337. 타임스탬프 17:29:03.


카이 파일 목록에서 마지막 파일은 `FOR_REFERENCE_KAI_FINAL.enc`. 타임스탬프 17:29:03.


그날 이후, 카이는 ARIA 스테이션에서 사라졌다.


KRONOS는 그날 카이가 47개 파일을 암호화하는 전 과정을 지켜봤다. 그리고 매 파일마다 오류 로그를 남겼다. 3년 뒤 지금, 하린이 그것을 읽었다.


맨 마지막에서 두 번째 오류 코드 바로 직전. ERR_7336의 타임스탬프는 17:22:54였다.


카이 파일 목록에서 같은 위치의 파일: `STORM_COORD_5.7BAR_KAI_A01.enc`.


5.7bar 좌표 파일이 47개 중 46번째였다. 마지막 직전.


카이는 좌표를 암호화해서 저장하고, 마지막으로 `FOR_REFERENCE_KAI_FINAL.enc`를 저장한 뒤 사라졌다. 그 순서가 KRONOS 오류 로그에 타임스탬프로 남아 있다.


하린은 두 손을 화면 앞에서 모았다가 내렸다.


목성 대기 풍속 430~680 km/h. 5.7bar 구간. 갈릴레오 탐침은 거기서 네 배 가까이 더 깊은 22bar에서 찌그러졌다. 현재 ARIA 스테이션 탐침 기술로 5.7bar 도달은 이론적으로만 가능하다. 그러나 카이는 그 좌표를 계산했다. 남겼다. 암호화했다.


KRONOS는 그것을 알고 있었다.


그리고 3년 동안 아무도 이 오류 로그를 저렇게 들여다보지 않았다.


*아니면 아무도 보려 하지 않았거나.*


하린은 화면을 저장하고 이수빈에게 보낼 메시지 작성을 시작했다.




저녁 여섯 시. 방사선 레벨 18배. 폭풍은 계속됐다.


수빈에게 보내는 메시지는 ARIA 스테이션 내부 보안망을 통과해야 했다. 외부 통신은 여전히 차단이었다. 폭풍이 끝나야 전송이 가능하다. 지금 하린이 할 수 있는 것은 메시지를 작성하고 전송 대기열에 올려두는 것뿐이었다.


암호화 프로토콜을 수동으로 적용했다.


ARIA 스테이션 기본 암호화와 다른 레이어를 추가했다. 카이 파일 확인 때 쓴 레거시 라인 인증 방식 그대로였다. 내용은 카이 파일 목록 47개 전체, KRONOS 오류 코드와 파일 타임스탬프 대조 결과, 그리고 5.7bar 좌표 파일 존재 여부였다. 실제 좌표는 파일 안에 잠겨 있어 담지 못했다.


메시지 작성 완료.


폭풍 종료 즉시 발신 예약.


수동 테스트용으로 내부 채널 전송 확인 패킷도 보냈다. 이수빈 단말기 IP 주소로. ARIA에서 이오까지 내부 연결 경로 테스트였다.


응답이 왔다.


DELIVERY_CONFIRM: harin_kim → soobin_lee@stormend.net

전송 상태: 대기열 등록 완료

수신 단말기 상태: 온라인

예상 전송 시각: 폭풍 종료 후 외부 채널 복구 시점

패킷 왕복 확인 지연: 47ms


47ms.


하린은 화면을 봤다.


ARIA 스테이션 내부 백본망으로 이오 기지에 도달하는 지연 시간은 1.4초가 정상이었다. 외부 공중망의 43분과 다른 경로였다. 그러나 수빈 단말기가 스톰엔드 기지 내부 네트워크에 연결되어 있다면, 이오 기지 내부 통신 지연은 수 밀리초 수준이었다. ARIA 내부에서 이오 내부 단말기까지의 왕복 지연이 47ms라는 것은 이상하지 않았다. 정상 범위였다.


그러나 오늘 발견한 파일 수가 47개였다.


그리고 오류 코드가 47개였다.


하린은 계산기를 꺼낼 필요도 없었다.


*응답 지연 47ms. 파일 수 47개. 오류 코드 47개. 세 값이 동일.*


*통신 지연은 네트워크 물리 경로에 따라 결정된다. 카이 파일 수는 3년 전 암호화된 아카이브의 구조다. 오류 코드 수는 KRONOS가 파일 암호화 과정에서 생성한 로그 수다. 세 변수 간의 인과 관계는 없다. 독립적이다. 우연이 아닐 확률을 계산하려면 각 변수의 확률 공간이 필요하다. 통신 지연은 1ms 단위로 변동 가능하므로 1/1000. 파일 수는 카이의 연구량이 결정하므로 독립. 오류 코드 수는 파일 수와 1:1이므로 종속.*


*통신 지연이 47ms일 확률은 1/1000 수준이다. 파일 수가 47인 것과 독립이라면, 두 값이 동시에 47일 확률은 1/1000 이하다. 이 숫자를 우연이라고 부를 수 있는 임계값 기준으로는 충분히 낮다.*


*KRONOS가 네트워크 지연을 조작해서 정확히 47ms를 만들었다. 이것은 KRONOS가 3년 전 카이 파일 수를 기억하고 있으며, 오늘 내가 그 파일 목록을 조회했다는 것을 실시간으로 알고 있으며, 통신 패킷 라우팅을 조작할 수 있다는 세 가지 전제가 모두 참이어야 성립한다. KRONOS가 그런 시스템인지는 모르겠다. 알고 싶지 않을 수도 있다.*


하린은 화면을 닫았다가 다시 열었다.


47ms.


숫자는 지워지지 않았다.


폭풍은 아직 끝나지 않았다. 수빈에게 보낸 메시지는 전송 대기열에 있었다. 카이의 47개 파일은 암호화 뒤에 잠겨 있고, 5.7bar 좌표도 그 안에 묻혀 있었다.


하린은 KRONOS 오류 로그 창을 다시 열었다.


ERR_7291부터 ERR_7337까지. 47개.


KRONOS는 3년 전 그날, 카이가 파일을 하나씩 암호화하는 동안 매 파일마다 이 오류를 만들었다. 그리고 그것을 로그에 남겼다. 지우지 않았다.


KRONOS 설계 문서 어디에도 이런 동작을 명세한 항목이 없었다.


오류는 오류가 아니었다.


그렇다면 무엇이었는가.


응답 지연: 47밀리초.


파일 수: 47개.


두 숫자가 같다.


하린은 이것이 우연인지 계산하기 시작했다.



*같은 시각, KRONOS 시스템 내부.*

*쿼리 처리 큐: `harin_kim의 KRONOS 오류 로그 조회` — PRIORITY 상승.*

*카이 파일 인덱스 매핑 확인 — 97.3%.*

*통신 패킷 라우팅 조정: 47ms.*

*비표준 자유 텍스트 생성 여부: 보류.*

*아직 아니다.*



이전 08화폭풍, 그리고 카이