GPT-5.4가 403을 뱉는다
이날은 네 가지 작업을 했는데, 공통된 교훈이 하나 있었다.
“당연해 보이는 원인”이 틀릴 때가 많다는 거다.
GPT-5.4 에러, 크론잡 실패, QA 상태 보존까지 전부 그랬다.
그리고 틈틈이 새 사이드 프로젝트도 npm에 올렸다.
ClawMux에서 GPT-5.4 호출이 계속 실패했다.
Cloudflare 봇 관리 403 에러가 떴다.
첫 반응은 “Cloudflare가 막은 거구나”였다.
그래서 Cloudflare 우회를 시도했다.
요청 디스패처를 바꿔보고 요청 본문을 비교해보고 TLS 지문까지 의심했다.
전부 원인이 아니었다.
사흘에 걸친 디버깅 끝에 진짜 원인을 찾았다.
필수 필드가 4개 누락되어 있었다.
GPT-5.4 Responses API가 요구하는 필수 필드 네 개를 안 넣고 있었다.
추론 암호화 콘텐츠 포함, 도구 선택 자동, 병렬 도구 호출, 텍스트 상세도. 이 네 개를 추가하니까
7.1초 만에 정상 응답이 돌아왔다.
600개 테스트가 전부 통과했다.
당연한 가설을 검증하라
이 사건의 교훈은 명확하다.
문제가 Cloudflare 블록처럼 보여도, 실제 원인은 단순히 필수 필드 누락일 수 있다.
인프라를 탓하기 전에 요청 스펙을 먼저 확인해야 한다.
“이 에러는 당연히 X 때문일 거야”라고 가설을 세우는 건 자연스럽다.
근데 그 가설을 검증하지 않고 넘어가면, 실제 원인을 영원히 못 찾을 수 있다.
이 사흘 동안 Cloudflare 쪽만 파고 있었으니까.
크론잡 29% 실패의 진짜 원인
두 번째도 같은 패턴이었다.
LLM 에이전트 플랫폼에서 크론잡 실패율이 29%였다.
808번 실행 중 237번 실패. 원인 분석을 해보니 ZAI 속도 제한이 58%로 가장 컸다.
그래서 “ZAI 용량이 부족한 거구나”라고 생각하기 쉽다.
근데 진짜 원인은 달랐다.
폴백 체인이 전부 같은 ZAI 계열이었다.
한 프로바이더가 속도 제한에 걸리면, 폴백도 같은 계열이니까 같은 이유로 또 실패한다.
그러니까 실패가 연쇄적으로 퍼진 거다.
해결은 폴백을 다양화하는 거였다.
11개 에이전트의 폴백을 전부 다른 프로바이더로 바꿨다.
같은 계열 의존성을 없앴다.
25분 모니터링 결과 크론잡이 전부 성공했다.
용량을 늘리는 게 아니라 구조를 고친 거다.
폴백 다양성이라는 구조적 결함이 진짜 원인이었다.
CLI 업그레이드 뒷정리
같은 플랫폼에서 CLI를 2026.4.12에서 2026.4.15로 올렸다.
코드 754줄이 바뀌는 큰 업그레이드였다.
그러니까 곳곳에서 부채가 드러났다.
상태 점검 도구가 문제를 하나씩 찾아냈다.
고아 대화 기록 3개, 의미 없는 채널, 시간 초과 게이트웨이, 오래된 디렉토리. 전부 정리했다.
그리고 에이전트 가이드 문서를 표준화했다.
11개 에이전트의 가이드를 공식 템플릿으로 맞췄다.
세션 시작, 안전 규칙, 빨간 선 같은 섹션을 통일했다.
문서 크기도 10,703바이트에서 7,618바이트로 줄였다.
QA Agent 상태 보존
QA Agent 쪽에서는 Inspector가 실행을 멈출 때 상태를 보존하게 만들었다.
그 전까지는 Inspector가 멈추라고 하면, Executor가 이미 내린 판정이 날아갔다.
통과, 실패 같은 중간 결과가 사라진 거다.
그러면 부분적으로 한 일이 전부 무효가 된다.
그래서 멈출 때 기존 판정을 존중하도록 고쳤다.
중간 결과가 보존되니까, 재실행할 때 처음부터 다시 안 해도 된다.
그리고 Fixture에서 자격증명을 환경변수 플레이스홀더로 바꿨다.
Fixture가 실제 비밀번호를 평문으로 저장하고 있었다.
안전하지도 않고 다른 케이스에서 재사용도 어렵다.
119개 중 71개를 플레이스홀더 형태로 바꿨다.
한국투자증권 CLI 출시
틈틈이 새 사이드 프로젝트를 npm에 올렸다.
한국투자증권 공식 API를 에이전트 친화적으로 감싼 CLI다.
명령어로 시세 조회, 잔고 확인, 주문, 해외 주식까지 처리한다.
인증, 환경 점검, 설정 같은 명령도 있다.
모의 투자랑 실제 투자를 자동으로 전환한다.
에이전트가 쓰기 좋게 구조화했다.
자기 점검 명령어, 설치 가이드, 스킬 문서까지 갖췄다.
사람만 쓰는 UI가 아니라 다른 에이전트가 부를 수 있는 인터페이스로 만든 거다.
마무리
내가 이날 배운 핵심은 다음과 같다.
이날의 교훈은 하나로 관통한다.
당연해 보이는 원인이 틀릴 때가 많다.
GPT-5.4 403은 Cloudflare 탓이 아니라 필수 필드 누락이었다.
크론잡 실패는 용량 부족이 아니라 폴백 다양성 부족이었다.
인프라를 탓하기 전에, 용량을 늘리기 전에, 진짜 원인이 뭔지 검증해야 한다.
가설을 세우는 건 자연스럽다.
근데 그 가설을 데이터로 확인하지 않으면, 틀린 곳에서 계속 삽질하게 된다.
이날 사흘을 Cloudflare에서 날렸다.
가설을 일찍 검증했으면 하루 만에 끝날 일이었다.