타입체크도 통과하고 파싱도 정상인데 메시지만 사라졌습니다 — zod 4 무음 실패
메이저 업그레이드에서 무서운 건 깨지는 API라고 생각했습니다. 실제로 위험했던 건 안 깨지는 쪽이었습니다. 타입도 통과하고 파싱도 정상 동작하는데 커스텀 메시지만 조용히 사라지고 있었습니다.
AI 에이전트를 몇 개까지 띄울지 스스로 점검하게 하는 규율을 문서에 박아뒀습니다. 네 번 연속 실패했고 네 번 다 제가 비용을 치른 뒤에 발견했습니다. 그래서 판단 자체를 다른 곳으로 옮겼습니다.
타입체크가 깨진 채 main에 머물러 있었는데 아무도 몰랐습니다. 그 패키지는 CI에 빌드 잡도 e2e 잡도 없었기 때문입니다. 같은 종류의 구멍이 이 레포에서 세 번째였습니다.
화면에서 메뉴를 감춰두고 그것을 권한이라고 불렀습니다. 백엔드를 열어보니 메서드 데코레이터를 안 붙인 엔드포인트가 자동으로 admin 전체에게 열리는 구조였고, 누락은 조용히 통과하고 있었습니다.
배포 플랫폼이 compose 리소스의 환경변수를 그 안 모든 서비스 컨테이너에 주입하고 있었습니다. mysql 드라이버가 0개인 프론트가 DB 비밀번호와 토큰 키를 통째로 들고 있었고, 범위를 좁힐 방법은 하나뿐이었습니다.
배포 도구는 빌드 실패로 기록했지만 빌드는 성공했고 컨테이너가 부팅 중에 죽었습니다. 번들러가 빠뜨린 파일 하나였고, 그 파일이 필요해진 건 한 달 전 Node 버전을 올렸기 때문이었습니다.
Coolify를 EC2에 올리기 전, 읽기 전용 describe만으로 계정을 먼저 쟀습니다. 계획서의 1순위 단계는 불필요했고, 정작 필수였던 것들은 계획서에 아예 없었습니다. 비용 0인 준비만 먼저 끝낸 과정을 정리했습니다.
배포가 겹치지 않게 락을 걸었더니 겹침은 정말 사라졌습니다. 다만 사라진 것은 겹침이지 낭비가 아니었습니다. 뒤에 온 세션은 앞 체인이 끝나기를 기다렸다가 같은 코드를 다시 빌드하고 있었습니다.
Node 20이 지원 종료를 맞아 24로 올리며 확인한 것들. V8의 JIT 계층 구조와 Maglev가 채우는 빈칸, 그리고 합성 벤치마크 35%가 실제 테스트 스위트에서 2%가 되는 이유. 메모리는 오히려 15% 늘고, N-API 덕에 네이티브 모듈 재빌드는 필요 없었습니다.
경로를 감싸는 함수가 콜론을 이스케이프하고 있었습니다. 그래서 윈도우 경로를 막아준다고 주석에 적혀 있었는데, 재보니 콜론만 여전히 실패했습니다. 이스케이프하는 것과 지켜주는 것은 다른 말이었습니다.