SSOT 를 저장소에서 확인해 더 보강하고 그것으로 다시 썼다.
§7.2 참조 검사 SQL 을 문자열로 조립하는 실제 코드 — 컴파일러가 표 이름도
컬럼 이름도 보지 않는다는 것이 그 모양에서 드러난다
§11.2 section-heading-rank 가 미디어 쿼리 값을 먼저 걷어내는 이유(테스트 주석)
§16.1 질문 삭제는 참조가 둘뿐이라 같은 문제가 덜하다는 대조
Case 열 편과 Question 셋을 다시 썼다. Question 은 사실·가정·미지수·제약을 갈라
채우고 선택지마다 무엇을 감수하는지 적었다 — 오류 코드를 나누면 계약과 반입한 두
저장소가 함께 움직인다는 것처럼.
SSOT 62,643 → 68,319 자. 검사 넷 전부 통과한다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
101 lines
5.1 KiB
Markdown
101 lines
5.1 KiB
Markdown
---
|
|
kind: CASE
|
|
slug: the-guard-worked-and-i-did-not-run-it
|
|
title: 가드는 작동했는데 제가 그것을 돌리지 않아 두 번 새어 나갔다
|
|
topic: when-a-guard-can-be-trusted
|
|
topicName: 가드를 언제 믿을 수 있는가
|
|
project: TechLog
|
|
status: 게시 전
|
|
lastVerifiedOn: 2026-09-04
|
|
sourceRevision: tech-log@2026-09-02
|
|
source:
|
|
- final/document.md#§7.5
|
|
- final/document.md#§8.5
|
|
- final/document.md#§17.4
|
|
---
|
|
|
|
# 가드는 작동했는데 제가 그것을 돌리지 않아 두 번 새어 나갔다
|
|
|
|
가드를 넣고 제가 그것을 돌리지 않아 두 번 새어 나갔다. 화면 테스트를 다른 명령이 돌리는데 그 명령을 안 돌려서 23건이 빨간 채로 여러 커밋을 지나갔고, 주제 화면 셋을 더하면서 CI 게이트 기준값을 빠뜨려 게이트가 빨간 채로 여러 커밋을 지나갔다.
|
|
|
|
## 관계
|
|
|
|
- **가드는 결함을 되돌려 실제로 멈추는 것을 확인한 뒤 커밋한다**
|
|
가드가 무엇을 잡는지 확인하는 기준이다.
|
|
- **배포 전에 사람이 돌려야 하는 것과 그 함정**
|
|
이 사건 뒤에 목록으로 굳혔다.
|
|
- **라우트 하나가 건드리는 여덟 곳과, 그것들이 우는 시점**
|
|
두 번째 사건에서 빠뜨린 목록이 그 기록에 있다.
|
|
|
|
## 문제
|
|
|
|
가드는 있었고 작동했다. 실행되지 않았다.
|
|
|
|
화면 테스트는 단위 테스트 명령이 아니라 별도 명령이 돌린다. 그 명령을 돌리지 않으면 화면 테스트가 빨간 것을 아무도 모른다.
|
|
|
|
CI 게이트도 마찬가지였다. 라우트를 더하면서 기준값을 함께 올리지 않으면 게이트가 거절하는데, 그 게이트가 빨간 것을 확인하지 않은 채 커밋을 이어 갔다.
|
|
|
|
## 결론
|
|
|
|
두 번 다 가드가 아니라 실행이 빠진 것이었다.
|
|
|
|
첫 번째 : 화면 테스트를 별도 명령이 돌리는데 그것을 안 돌려 23건이 빨간 채로 여러 커밋을 지나갔다
|
|
두 번째 : 주제 화면 셋을 더하면서 게이트 기준값을 빠뜨려 게이트가 빨간 채로 여러 커밋을 지나갔다
|
|
|
|
> **가드는 CI 에 묶여야 의미가 있습니다.** 사람이 기억해서 돌리는 가드는 절반만 존재합니다.
|
|
|
|
## 검증 환경
|
|
|
|
tech-log-frontend : fd73bc8 · fe6b56a
|
|
명령 : check:types · lint · test:unit · test:component · test:tech-log 다섯
|
|
확인 방식 : 다섯 명령을 각각 돌려 어느 것이 무엇을 잡는지 확인
|
|
|
|
## 재현 조건
|
|
|
|
1. 화면 테스트가 깨지는 변경을 하나 넣는다
|
|
2. 단위 테스트 명령만 돌린다 — 통과한다
|
|
3. 화면 테스트 명령을 돌린다 — 깨진다
|
|
|
|
## 본문
|
|
|
|
<!-- body:start -->
|
|
|
|
## 화면 테스트를 돌리지 않았다
|
|
|
|
> 화면 테스트는 `test:unit` 이 아니라 `test:tech-log` 가 돌린다. 그것을 돌리지 않아 위 두 결함과, 의도한 변경에 고정돼 있던 단언들이 **23건 빨간 채로 여러 커밋을 지나갔다.**
|
|
|
|
두 명령이 보는 디렉터리가 다르다. 단위 테스트 명령은 단위 테스트 디렉터리를, 화면 테스트 명령은 기능별 테스트 디렉터리를 돈다. 넷을 돌리고 「전부 통과」라고 읽으면 다섯 번째가 빠진다.
|
|
|
|
23건이 한 종류가 아니었다는 것이 문제를 키웠다. 일부는 실제 결함을 잡은 것이고 일부는 의도한 변경에 단언이 고정돼 있던 것이다. 둘을 구분하려면 그 명령을 돌려 하나씩 봐야 하는데, 돌리지 않으니 둘 다 그대로 남았다.
|
|
|
|
## 게이트 기준값을 빠뜨렸다
|
|
|
|
주제 화면 셋을 더할 때 CI 게이트가 요구하는 기준값 셋을 함께 올리지 않았다. 게이트는 라우트 집합과 증거 집합이 정확히 일치하기를 요구하므로 그 상태를 정확히 거절한다.
|
|
|
|
게이트가 빨간 채로 여러 커밋을 지나갔고, 결정 링크 404 를 고치던 커밋에서야 함께 맞췄다.
|
|
|
|
## 가드가 아니라 실행이 빠졌다
|
|
|
|
두 번 다 가드는 정확했다.
|
|
|
|
| | 가드가 있었나 | 가드가 잡았나 | 무엇이 빠졌나 |
|
|
|---|---|---|---|
|
|
| 화면 테스트 23건 | o | o | 그 명령을 돌리지 않음 |
|
|
| CI 게이트 기준값 | o | o | 결과를 보지 않음 |
|
|
|
|
가드가 없어서 샌 것이 아니라 결과를 아무도 읽지 않아서 샜다. 그래서 가드를 하나 더 넣는 것으로는 같은 일이 다시 난다.
|
|
|
|
> **가드는 CI 에 묶여야 의미가 있습니다.** 사람이 기억해서 돌리는 가드는 절반만 존재합니다.
|
|
|
|
## 명령이 많으면 「다 돌렸다」가 흐려진다
|
|
|
|
이 저장소의 프론트엔드는 검사 명령이 수십 개다. 타입 검사만 여섯 개의 tsconfig 를 돌고, 테스트도 단위·컴포넌트·통합·기능별로 나뉜다.
|
|
|
|
명령을 나눈 이유는 각각 다른 대상을 보기 때문이고 그 자체는 맞다. 대신 「배포 전에 무엇을 돌리는가」를 목록으로 고정하지 않으면 그중 일부만 돌고도 전부 돌린 것으로 읽힌다.
|
|
|
|
## 확인하지 못한 것
|
|
|
|
다섯 명령을 CI 에 묶는 작업은 하지 않았다. 지금 남은 것은 메모리와 배포 전 검증 목록이고, 그 목록을 읽는 것도 사람이다.
|
|
|
|
<!-- body:end -->
|