재현 안 되는 버그를 쫓다가 CI 게이트 부재를 발견했다
동료가 제보한 타입 에러를 재현하려다 전혀 다른 에러를 만났고, 그 과정에서 저장소에 typecheck 스크립트 자체가 없었다는 사실을 발견한 이야기.
동료가 MR 리뷰에서 "Toast 스토리에서 타입 에러가 난다"고 알려줬다. 내가 작성한 스토리였다. 에러 메시지 원문을 못 받아서, 직접 확인하려고 타입 체크를 돌렸다.
npx tsc --noEmit결과가 예상과 달랐다
Toast 에러는 재현되지 않았다. 대신 전혀 다른 에러가 하나 나왔다.
vitest.config.ts:37 - error TS2769
'passWithNoTests' does not exist in type 'ProjectConfig'passWithNoTests는 최상위 test 옵션인데, projects 배열 안쪽 블록에
중복으로 들어가 있었다. 최상위에 이미 선언돼 있어서 37행만 지우면 되는
건이었다.
여기서 진짜 문제를 발견했다
"그럼 이 타입 에러는 왜 CI에서 안 걸렸지?" package.json을 봤다.
"scripts": {
"lint": "eslint .",
"format": "prettier --write .",
"format:check": "prettier --check ."
}typecheck 스크립트가 없었다. 통합 스크립트(quality·ci)도 없었다. 타입
에러가 CI를 그냥 통과하고 있었다.
왜 이게 심각한가
스토리북은 컴포넌트 API를 직접 소비한다. 패키지의 API가 바뀌면(예: Button variant 명칭 변경) 스토리에서 타입 에러가 나야 정상이다. 그런데 그걸 잡을 게이트가 없었다. 다른 저장소에는 통합 스크립트에 typecheck가 들어 있었는데, 스토리북 저장소만 빠져 있었다.
동료 제보 건은 어떻게 됐나
다시 물어보니 "이전 버전이 캐싱돼서 발생한 것, Toast 특이사항 없음"이라는 답이 왔다. 로컬 캐시 문제였다. 제보 자체는 오탐이었지만, 확인하는 과정에서 진짜 문제를 찾았다.
결과
- 게이트 부재를 이슈로 등록했다.
- 작업 범위: 타입 에러 수정 +
typecheck스크립트 추가 + CI 파이프라인 편입. - 같은 날 발견한 size-limit 결함과 같은 성격임을 팀에 공유했다.
재현이 안 되면 그냥 넘어갈 수도 있었다. 그런데 "왜 CI에서 안 걸렸지"라는 질문이 남았고, 그 질문을 따라가니 게이트가 아예 없었다. 동료가 틀렸다고 단정하지 않고, 재현이 안 됐다는 사실과 대신 나온 에러를 그대로 공유하며 원문을 다시 물어본 것도 이 결말로 이어진 이유 중 하나였다.
세 문제를 묶는 한 줄이 있다면 이렇다. 게이트가 초록이라는 건 "검증했다"가 아니라 "게이트가 통과시켰다"는 뜻이다. 그 둘이 같은지는 따로 확인해야 한다.
같은 날 다른 두 가지 문제도 함께 발견했다.