AI

Codex 교차 리뷰로 실주문 API 외부 노출을 막았다

자동매매 봇을 두 에이전트에게 라운드 3~9까지 번갈아 리뷰시켰다. 주장 9건은 로그·DB·코드로 반박됐고, 둘 다 '새 항목 없음'이라고 답했을 때 끝냈다

한 줄로

자동매매 봇을 두 AI 에이전트(Codex와 Bunny)에게 번갈아 리뷰시켰다. 지적은 원장에 새 항목만 적고, 각 항목은 근거를 직접 확인해 판정했다. 라운드 3~9를 돌리는 동안 실주문 API(8502)와 DB(5432)가 모든 네트워크 경로에 열려 있던 것을 찾아 127.0.0.1에서만 접속되게 막았다. 반대로 Bunny의 주장 9건은 로그·DB·코드로 반박됐다.

교차 리뷰 루프

여기서 말하는 교차 리뷰 루프는 세 부분으로 이뤄진다.

  • 리뷰어 둘: 작업 워크스페이스에 Codex 페인(wS:p5)과 opencode 페인(wS:p6)을 새로 띄워 같은 코드를 두고 토론하게 했다.
  • 원장: 지적 사항은 .omc/review-ledger.md에 적는다. 이미 적힌 것은 다시 적지 않고 새 항목만 추가한다. 이 파일은 커밋하지 않았다.
  • 판정: 리뷰어의 말을 그대로 받아들이지 않는다. 항목마다 근거를 직접 확인해 판정한다.

종료 조건은 단순하다. 두 에이전트가 모두 ‘새 항목 없음’이라고 답하면 끝낸다.

실제로 겪은 것

첫 프롬프트에 Codex가 업데이트됐다

첫 프롬프트가 업데이트 안내 화면에 들어갔다. 그 바람에 Codex가 0.160.0에서 0.160.1로 의도치 않게 업데이트됐다.

라운드 3~9, 그리고 반박된 주장 9건

라운드 3부터 9까지 진행했다. 두 에이전트가 모두 ‘새 항목 없음’이라고 답한 시점에 루프를 끝냈다.

Bunny가 내놓은 주장 중 9건은 로그·DB·코드로 확인한 결과 반박됐다. 그중 4건은 Bunny 스스로 철회했다. 리뷰어가 낸 항목을 전부 고칠 일로 받지 않고, 근거를 대조해 거른 것이다.

고친 것 (auto-trading PR #93~#107, cron-job PR #39~#41)

남은 항목은 PR로 고쳐 머지하고 배포했다.

보안

  • 실주문 API(8502)와 DB(5432)를 127.0.0.1에서만 접속되게 막았다. 둘 다 원래 모든 네트워크 경로에 열려 있었다.
  • 로그에 봇 토큰이 찍히지 않게 가렸다.

엔진·손절

  • 개장 첫 봉 오판과 장외 체결로 만든 봉을 제거했다(#94).
  • 손절 상태 파일을 원자적으로(저장 도중 깨지지 않게) 저장한다.
  • 계좌 조회가 실패하면 실시간 매매 시작을 보류한다.
  • 시세 재연결 중에 같은 종목을 두 번 사던 틈을 막았다.

리스크

  • 한도를 바꾸면 실행 중인 엔진에 바로 반영된다.
  • 일일 한도 복원에 실패한 날에는 신규 매수를 잠근다.

배포

  • 코드 폴더를 운영 컨테이너에 직접 연결하던 것을 끊었다.
  • 엔진이 실제로 떴는지 헬스체크하고, 실패하면 직전 이미지로 자동 롤백한다.
  • 꺼진 뉴스 레이어 때문에 기동이 2분 넘게 걸리던 문제를 해결했다.

기록·백업

  • 필터 차단 사유를 RSI·거래량·MACD로 나눠 기록한다.
  • 3분봉에 KST 시간대를 넣었고, 15분봉 수집은 중단했다.
  • 평일 16:10에 로컬 백업 폴더로 백업한다(14일 보관). 다른 DB에 복원해 행 수가 일치하는 것까지 확인했다.

리뷰 항목이어도 바꾸지 않은 것

전략에 관한 항목은 근거가 없어서 그대로 뒀다.

  • 등급별 매수 비중: A·B 등급은 15% 상한에 걸리고, C 등급은 평균 9.6%다. 상한을 올릴 근거가 없다.
  • 개장 직후 매도: 전략 매도는 원래 09:18 이후에만 돈다.
  • 합의 보정 감쇠: 이 보정을 없애 보는 반사실 계산(그 보정이 없었다면 어땠을지 다시 계산하는 것)에서도 예측력이 좋아지지 않았다.
  • 고정 손절 백테스트: 판정할 수 없었다. 매수 기준 0.25로는 2년 동안 거래가 0건이었다.

작업 중 낸 실수 2건

둘 다 발견한 뒤 바로 바로잡았다.

  • DB 컨테이너를 다시 만들 때 셸이 명령을 잘못 해석해 15:31~15:34에 DB가 약 3분 꺼졌다. 장 마감 후였고 데이터는 그대로다.
  • 백업 plist가 없는 스크립트를 가리키고 있었다. 이건 Codex가 최종 점검에서 찾았다. 고친 뒤 예약 경로로 실제 실행해 동작을 확인했다.

마무리 점검

17:41에 다시 점검했다. 엔진은 healthy였고, 포트는 로컬에서만 열려 있었고, DB 오류는 0건이었다.

남은 것

  • API 로그인 인증은 아직 붙이지 않았다.
  • #94, #102, #105, #106, #108은 다음 장중에 실제 동작을 확인해야 한다.