"[261014] 실전 계좌 수동 개입, 하루 만에 안전장치 8건으로 정리"
실계좌 매수 차단으로 현금이 쌓여 직접 앱으로 매매했는데, 그 과정에서 드러난 구멍을 같은 날 전부 메웠습니다.
실계좌에서 매수가 막혀 현금이 쌓였다
실전 계좌(새 창)의 한 슬리브에서, 손실을 제한하는 안전장치가 작동해 매수만 막힌 상태가 됐습니다.
이 장치는 하루짜리 디리스크 용도로 설계돼 있어서 다음날 자동으로 풀립니다. 다만 그날 안에는 매수가 전혀 안 나가니, 매도 대금이 들어올수록 현금 비중만 계속 올라갔습니다.
이날 현금 비중이 상당히 높게 쌓였습니다. 그대로 두면 하루를 통째로 날리는 셈이라, 직접 차단을 해제하고 수동으로 라운드를 돌려봤습니다.
그런데 시스템이 넣은 주문 중 일부가 회전 한도에 걸려 거부됐고, 한 건은 실패 사유조차 기록이 안 남았습니다. 결국 증권사 앱으로 직접 매매를 쳐서 메웠는데, 이 수작업 체결을 원장에 반영하는 절차가 없다 보니 한동안 브로커 계좌와 원장 수치가 눈에 띄게 벌어졌습니다. 나중에 수작업 부기 스크립트로 맞춰서 격차는 거의 사라질 정도로 줄였습니다.
수동 개입 자체를 감시 대상으로 만들었다
이 사고를 다른 AI에게 통째로 검토시켜서, 수동 개입 과정에서 드러난 구멍을 전부 찾아달라고 했습니다.
8가지가 나왔고, 같은 날 전부 구현해서 배포했습니다.
하나는 수동으로 라운드를 시작했을 때 시스템이 이걸 "예정된 자동 실행"으로 잘못 판단하던 버그였습니다. 타이머 기록과 서비스 상태를 대조해서 수동 개입인지 정확히 구분하도록 고쳤습니다.
주문이 실패했을 때 사유가 기록에 안 남는 문제도 손봤습니다. 이제는 증권사가 돌려준 실패 사유를 저널에 남기고, 라운드당 한 번 알림도 보냅니다.
마감 직전 시간대에 수동으로 주문을 넣으려면 명시적으로 허용 플래그를 켜야만 나가도록 가드를 추가했습니다. 평소엔 자동으로 막힙니다.
증권사 앱에서 직접 체결한 내역을 원장에 반영하는 표준 절차도 새로 만들었습니다. 이전에는 임시 스크립트로 때웠는데, 이제는 정식 명령 하나로 선언하면 끝입니다.
차단 해제·수동 라운드·앱 매매 이 세 가지 개입이 전부 감사 기록에 남고, 일일 리포트에도 "수동 개입 있었음" 줄로 표시되게 만들었습니다. 런북 문서도 이번에 겪은 절차 그대로 다시 썼습니다.
마지막으로, 수동으로 쓸어담는 상황에서는 평소 자동 거래용 회전 한도가 오히려 발목을 잡는다는 걸 확인해서, 수동 라운드에서만 한도를 조정할 수 있는 옵션을 추가했습니다. 종목별 한도나 비상정지 같은 다른 안전장치는 그대로 유지됩니다.
그 외 정리한 것들
며칠째 끌어온 실험 하나는 판정이 애매하게 나와서 더 끌지 않고 종결했습니다.
계좌 하나는 한동안 시범 운영만 하던 상태였는데, 이번 사고를 계기로 공식적으로 퇴역시켰습니다.
경보를 텔레그램 말고 이메일로도 받을 수 있게 만들어봤는데, 지금 있는 텔레그램 경보만으로 충분하다고 판단해서 그대로 되돌렸습니다.
왜 중요한가
오늘 사고의 핵심은 "막힌 자동화를 사람이 직접 풀고 메웠다"는 것 자체가 아니라, 그 과정이 기록에 제대로 안 남았다는 점이었습니다.
수동 개입은 가끔 필요합니다. 문제는 그게 일어났을 때 왜 일어났는지, 뭐가 거부됐는지, 원장과 실제 계좌가 얼마나 벌어졌는지를 사람이 나중에 더듬어 찾아야 했다는 겁니다.
오늘 만든 8가지 장치는 전부 같은 방향을 보고 있습니다. 수동 개입이 생기는 그 순간 자체를 자동으로 기록하고 경보하게 만드는 것입니다.