실험 버그, GPU 사고, 실계좌 매수 차단 — 사람 개입을 감시 대상으로 만든 한 주
이번 주 터진 사고 세 건 모두 직접 손을 대서 넘겼는데, 그 뒤로 "같은 개입이 다시 생기면 자동으로 기록·경보되게" 만드는 작업이 매번 따라붙었습니다.
이번 주는 사람이 직접 손을 대야 했던 상황이 세 번 있었습니다.
실험 인프라 버그, GPU 드라이버 꼬임, 실계좌 매수 차단. 성격은 다 다르지만 처리 방식은 똑같았습니다.
급한 불을 끄는 것과, 같은 상황이 다시 와도 사람 없이 혹은 최소한 기록이 남도록 장치를 추가하는 것을 분리해서 둘 다 했습니다.
월요일, 실험을 막 돌렸더니 장치에서 버그가 세 번 터졌다
며칠 전 설계해 둔 실험을 이번 주 초저녁에 실제로 돌렸습니다. AI에게 주는 입력에 미국장 시세 정보를 한 줄 더 넣었을 때 판단이 나아지는지 확인하는 A/B 테스트였습니다.
돌리자마자 버그 세 개가 연달아 나왔습니다. 날짜별 종목 목록을 교집합이 아니라 합집합으로 잡던 로직, 재시도 기능이 옛 결과를 그대로 재활용해버린 충돌, 검증용 표식 문구가 모호해서 모델이 바꿔 쓴 걸 오탐으로 잡아낸 문제였습니다.
세 버그 모두 사전 점검에서는 안 잡혔고, 실제로 돌려봐야만 드러나는 종류였습니다. 첫 런이 예상보다 빨리 끝났다는 작은 이상 신호를 그냥 넘기지 않은 덕에 두 번째 버그를 알아챘습니다.
같은 날 수치형 응답을 점검하는 기준선도 손봤습니다. 평균값이 예전보다 낮아진 걸 반영 안 한 옛 규칙이 닷새에 한 번꼴로 가짜 경보를 울리고 있었던 걸 바로잡았습니다.
화요일, GPU 드라이버가 꼬이고 전체 구조를 처음 그려봤다
밤사이 걸린 자동 업데이트가 그래픽카드 드라이버를 절반만 적용했습니다. 디스크의 라이브러리는 새 버전인데 커널에 올라간 모듈은 옛 버전인 채로 엇갈리면서, GPU를 쓰는 작업이 전부 막히고 진행 중이던 실험도 멈췄습니다.
재부팅하면 해결될 상황이었지만, 바로 하지 않고 조건을 걸었습니다. 가상머신이 꺼져 있고 백업이 끝나 있고 GPU 작업이 겹치지 않을 때만 자동 재부팅되도록 예약하고, 재부팅 뒤 버전 확인과 멈췄던 실험 재개까지 사람 없이 이어지도록 미리 짜뒀습니다.
실제로는 예약 시각 전에 직접 재부팅했는데도, 뒤에 걸어둔 확인·재개 절차가 그대로 작동해서 중복 없이 깔끔하게 넘어갔습니다.
같은 날 이 프로젝트(새 창) 전체가 돈을 어떻게 움직이고 어떤 장치가 지키는지를 한 장의 구성도로 처음 그렸습니다. 여러 달에 걸쳐 조각조각 만들어온 구조라 전체를 한눈에 보는 그림이 그동안 없었습니다.
이 구성도를 AI에게 통째로 검토시켜서 감시 공백을 찾았습니다. 사전 계산 실패 시 조용히 다른 경로로 넘어가는 지점, 외부 시세 수집 경로가 대체 없이 단일 경로에만 의존하는 점, 백업은 매일 돌지만 실제 복원은 한 번도 안 해본 점이 나왔습니다. 당장 고치지는 않고 우선순위를 매겨 할 일 목록에 올렸습니다.
수요일, 실계좌 매수가 막혀서 직접 매매를 쳤고 그날 안에 구멍 8개를 메웠다
실전 계좌(새 창)의 한 슬리브에서 손실제한 안전장치가 작동해 매수만 막혔습니다. 하루짜리 장치라 다음 날 풀리는 구조인데, 그날 안에는 매도 대금이 들어올수록 현금 비중만 계속 올라갔습니다.
현금 비중이 상당히 쌓인 채로 하루를 통째로 날릴 수는 없어서, 직접 차단을 풀고 수동으로 라운드를 돌렸습니다. 그런데 일부 주문이 회전 한도에 걸려 거부됐고 한 건은 사유조차 기록이 안 남아, 결국 증권사 앱으로 직접 매매를 쳐서 메웠습니다.
이 수작업 체결을 원장에 반영하는 절차가 없었던 탓에 한동안 브로커 계좌와 원장 수치가 눈에 띄게 벌어졌고, 나중에 수작업 부기로 거의 맞췄습니다.
이 사고를 AI에게 통째로 검토시켜 구멍을 전부 찾아달라고 했고, 8가지가 나와 같은 날 전부 구현했습니다. 수동 개입을 자동 실행으로 오판하던 버그를 고치고, 주문 실패 사유를 저널에 남기고 알림도 걸고, 마감 직전 수동 주문엔 명시적 허용 플래그를 걸고, 수작업 체결을 원장에 반영하는 정식 명령을 만들고, 차단 해제·수동 라운드·앱 매매 세 가지 개입이 전부 감사 기록과 일일 리포트에 남게 했습니다. 수동 라운드에서만 회전 한도를 조정할 수 있는 옵션도 추가했습니다.
토요일, 60일 지켜본 실험을 사전에 정해둔 기준대로 접었다
포지션 크기 조정 방식 하나를 두 달 넘게 실계좌에 넣지 않고 모의로만 돌려온 게 있었습니다. 시작할 때 "얼마나 차이가 나야 채택하고 어느 선 밑이면 접는다"는 기준을 미리 적어뒀습니다.
60일치 데이터를 다시 계산해 그 기준에 대조해보니, 기존 방식 대비 우위가 통계적으로 의미 있다고 보기엔 부족했고 "더 지켜본다"는 연장 조건에도 못 미쳤습니다. 연장 조건을 억지로 살리려면 몇 년치 데이터가 더 필요하다는 계산까지 나와서, 애매하다고 더 끌지 않고 접었습니다.
같은 날 가격 데이터 꼬리 정정 작업도 마무리했습니다. 거래소 확정치와 어긋나던 오차를 다시 맞춰 넣었고, 이 오차가 실제 매매에 영향을 줬는지도 점검했습니다. "영향은 있었지만 감지하기 어려운 수준"으로 결론나서 과거 점수를 다시 계산하지는 않고 기록만 남겼습니다.
화요일 GPU 드라이버 사고의 재발방지도 이날 닫았습니다. 문제가 됐던 패키지들을 자동 업데이트 대상에서 뺐습니다.
이번 주를 관통한 것
이번 주 세 사고 — 실험 버그, GPU 드라이버, 실계좌 매수 차단 — 는 전부 사람이 직접 손을 대야 끝났습니다.
그런데 손을 대고 나서가 더 중요했습니다. GPU 사고는 재부팅 조건과 재개 절차를 미리 걸어 다음번엔 사람 없이도 넘어가게 만들었고, 실계좌 사고는 수동 개입 자체가 일어나는 순간을 자동으로 기록·경보하게 만들었습니다.
토요일의 사전등록 판단도 같은 결이었습니다. 데이터가 애매하면 더 지켜보고 싶어지는 게 사람 마음인데, 미리 적어둔 기준이 그 유혹을 대신 막아줬습니다.
세 사고가 보여준 공통점은, 방어가 로직 한복판이 아니라 가장자리 — 사전 점검이 못 잡는 실행 환경, 사람이 끼어드는 순간, 판단이 애매해지는 경계 — 에서 뚫린다는 것이었습니다. 다음 주는 이번 주 새로 건 장치들(수동 개입 감시 8건, GPU 재부팅 자동화, 섀도 실험 종료)이 실제로 조용히 작동하는지 지켜보는 구간입니다.