"AI가 알아서 사고판다"보다 "어떤 상황에서 절대 사지 못하게 할 것인가"가 이 시스템의 실제 설계 대상이었다. 그래서 안전장치를 두 층으로 나눠둔다. AI 판단을 거르는 층과 그 판단이 거래소로 나가기 직전에 다시 검사하는 층이다.

safety-flow.png


1층 — 판단을 거르는 장치

초기부터 만든 층이다. AI가 BUY를 내도 여기서 대부분 걸린다.

2026.07에 같은 층에서 세 가지를 더 막았다. 저장된 분석 ID만 실행에 전달해 과거 분석이 실행되는 경로를 없앴고, BUY 직전 2차 검증은 비중을 줄이거나 차단만 할 수 있게 reduce-only로 제한했으며, provider 호출에 목적별 deadline을 걸어 분석 timeout은 HOLD로, precheck timeout은 주문 0회로 고정했다.


2층 — 주문이 나가기 직전 (2026.07)

1층은 AI 판단이 함부로 주문이 되지 않게 막는 데 초점이 있었다. 7월 안전성 리뷰에서는 그 아래쪽을 봤다. 이미 통과한 주문이 실제로 거래소에 나가는 구간을 다시 읽고 여기에 별도 층을 만들었다.

위험 대응
타임아웃 재시도로 같은 주문이 두 번 체결 주문 의도를 DB에 먼저 저장하고 identifier 확정, 재전송 대신 조회로 복구, 15초 reconciliation이 체결을 exactly-once 반영
정지시켰는데 다음 스케줄에 주문이 나감 모든 거래소 POST 앞에 ARMED / EXIT_ONLY / BLOCK_ALL 게이트, 정지 시 진행 중 제출 drain
설정 누락·오타가 live로 해석 기본값 paper + inactive + BLOCK_ALL, 판정 실패는 live로 보정하지 않고 unavailable 처리
전량청산 실패를 성공으로 표시 미체결 0, 잔고 0, 원장 일치를 확인한 COMPLETED + VERIFIED만 성공, 잔여는 PARTIAL

잠금은 하나가 아니다. live 모드 전환과 봇 시작, 게이트 ARMED 전환이 각각 별개의 관리자 작업이고 어느 것도 다음 단계를 자동으로 실행하지는 않는다.


막지 말아야 할 것

게이트가 닫혀 있어도 분석과 reconciliation은 계속 돌고, 잠그는 것은 신규 매수뿐이다.