docs(TechLog): 남은 주제를 다시 쓰고 SSOT 를 저장소 실물로 더 보강한다
주제 11~13 을 다시 쓰고, Case 가 얇은 것들을 저장소에서 실물을 확인해 채웠다.
§13.4 ManagementClientSafeMessages — 삭제 관련 코드 여섯의 고정 문구와
원문 메시지를 내보내지 않는 이유(javadoc)
§16.1 다섯 참조가 전부 DOCUMENT_IN_USE 하나로 나가고, SSOT 가 인용한 영어 문장은
DeleteDocumentDraftUseCase 안에 남는 진단 메시지라 밖으로 나가지 않는다
§13.6 romanizeSyllable 실물과 음운 변동을 뺀 이유, 문서 slug 와 같은 정규식을 쓰는 이유
§15.4 check:types 가 도는 tsconfig 여섯 — app·node·test·recipes·web-worker·service-worker
SSOT 62,643 → 67,526 자. 인용한 코드는 전부 저장소에서 찾아 대조했다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b1653dbba8
commit
6917ce2420
+12
-5
@@ -64,22 +64,29 @@ tech-log-frontend : fd73bc8 · fe6b56a
|
||||
|
||||
> 화면 테스트는 `test:unit` 이 아니라 `test:tech-log` 가 돌린다. 그것을 돌리지 않아 위 두 결함과, 의도한 변경에 고정돼 있던 단언들이 **23건 빨간 채로 여러 커밋을 지나갔다.**
|
||||
|
||||
23건 중에는 실제 결함을 잡은 것도 있고 의도한 변경에 고정된 단언도 있었다. 둘을 구분하려면 그 명령을 돌려야 하는데, 돌리지 않으니 둘 다 그대로 남았다.
|
||||
23건이 한 종류가 아니었다는 것이 문제를 키웠다. 일부는 실제 결함을 잡은 것이고 일부는 의도한 변경에 단언이 고정돼 있던 것이다. 둘을 구분하려면 그 명령을 돌려 하나씩 봐야 하는데, 돌리지 않으니 둘 다 그대로 남았다.
|
||||
|
||||
## 게이트 기준값을 빠뜨렸다
|
||||
|
||||
주제 화면 셋을 더하면서 CI 게이트가 요구하는 기준값 셋을 올리지 않았다. 게이트는 정확히 그것을 거절한다.
|
||||
주제 화면 셋을 더할 때 CI 게이트가 요구하는 기준값 셋을 함께 올리지 않았다. 게이트는 라우트 집합과 증거 집합이 정확히 일치하기를 요구하므로 그 상태를 정확히 거절한다.
|
||||
|
||||
게이트가 빨간 채로 여러 커밋을 지나갔고, 결정 링크 404 를 고치던 커밋에서야 맞췄다.
|
||||
게이트가 빨간 채로 여러 커밋을 지나갔고, 결정 링크 404 를 고치던 커밋에서야 함께 맞췄다.
|
||||
|
||||
## 가드가 아니라 실행이 빠졌다
|
||||
|
||||
두 번 다 가드는 정확했다. 화면 테스트는 실제 결함을 잡았고 게이트는 기준값이 어긋난 것을 정확히 거절했다.
|
||||
두 번 다 가드는 정확했다.
|
||||
|
||||
| | 가드가 있었나 | 가드가 잡았나 | 무엇이 빠졌나 |
|
||||
|---|---|---|---|
|
||||
| 화면 테스트 23건 | o | o | 그 명령을 돌리지 않음 |
|
||||
| CI 게이트 기준값 | o | o | 결과를 보지 않음 |
|
||||
|
||||
가드가 없어서 샌 것이 아니라 결과를 아무도 읽지 않아서 샜다. 그래서 가드를 하나 더 넣는 것으로는 같은 일이 다시 난다.
|
||||
|
||||
> **가드는 CI 에 묶여야 의미가 있습니다.** 사람이 기억해서 돌리는 가드는 절반만 존재합니다.
|
||||
|
||||
## 확인하지 못한 것
|
||||
|
||||
다섯 명령을 CI 에 묶는 작업은 하지 않았다. 메모리와 배포 전 검증 목록으로만 남겨 뒀다.
|
||||
다섯 명령을 CI 에 묶는 작업은 하지 않았다. 지금 남은 것은 메모리와 배포 전 검증 목록이고, 그 목록을 읽는 것도 사람이다.
|
||||
|
||||
<!-- body:end -->
|
||||
|
||||
+13
-13
@@ -31,17 +31,21 @@ source:
|
||||
|
||||
## 목적
|
||||
|
||||
무엇도 잡지 못하는 가드가 초록불로 남는 것을 막는다. 이 상태는 가드가 있는 것과 화면에서 구분되지 않는다.
|
||||
무엇도 잡지 못하는 가드가 초록불로 남는 것을 막는다.
|
||||
|
||||
가드를 넣었다는 것과 그 가드가 무엇을 잡는다는 것은 다르다. 둘은 화면에서 구분되지 않는다 — 검사가 통과했을 때 그 결함이 원래 없었는지 검사가 그것을 안 보는지 알 방법이 없다.
|
||||
|
||||
## 규칙
|
||||
|
||||
### 1. 결함을 되돌려 그 가드가 실제로 멈추는 것을 확인한 뒤 커밋한다
|
||||
|
||||
계약에서 값을 빼고 대조 검사가 빨개지는지 본다. 매핑을 떼어 보고 그 연산 하나를 짚는지 본다.
|
||||
계약에서 값을 빼고 대조 검사가 빨개지는지 본다. 매핑을 떼어 보고 그 연산을 짚는지 본다. 굵기 선언을 빼고 제목 급 검사가 멈추는지 본다.
|
||||
|
||||
되돌리는 것이 어려우면 그 가드가 무엇을 전제하는지 다시 본다. 되돌릴 수 없는 상태를 잡는 가드는 그 상태가 어떻게 생기는지를 아무도 모른다는 뜻이다.
|
||||
|
||||
### 2. 가드가 짚는 대상이 하나인지 본다
|
||||
|
||||
전부를 짚으면 어디가 문제인지 알 수 없고, 결과가 곧 읽히지 않는다.
|
||||
전부를 짚으면 어디가 문제인지 알 수 없고, 결과가 곧 읽히지 않는다. 매핑 하나를 떼었을 때 그 연산 하나만 나와야 한다.
|
||||
|
||||
### 3. 되돌릴 수 없는 것은 현재 상태를 대신 증거로 남긴다
|
||||
|
||||
@@ -49,7 +53,7 @@ source:
|
||||
|
||||
### 4. 가드를 CI 에 묶는다
|
||||
|
||||
사람이 기억해서 돌리는 가드는 절반만 존재한다.
|
||||
사람이 기억해서 돌리는 가드는 절반만 존재한다. 가드가 정확해도 결과를 아무도 읽지 않으면 빨간 채로 여러 커밋을 지나간다.
|
||||
|
||||
## 적용 조건
|
||||
|
||||
@@ -59,16 +63,12 @@ source:
|
||||
|
||||
## 예외
|
||||
|
||||
- 결함을 되돌릴 수 없는 것 — 이미 마이그레이션으로 고친 데이터, 지난 배포에서만 나던 상태 — 은 현재 상태가 고쳐져 있음을 증거로 남긴다.
|
||||
|
||||
- 결함을 되돌릴 수 없는 것 — 이미 마이그레이션으로 고친 데이터, 지난 배포에서만 나던 상태 — 은 현재 상태가 고쳐져 있음을 대신 증거로 남긴다.
|
||||
- 기존 가드를 옮기거나 이름만 바꾸는 변경은 되돌려 확인하지 않아도 된다. 다만 옮긴 뒤에 한 번은 돌린다.
|
||||
|
||||
## 예시
|
||||
|
||||
- 가드 셋을 각각 결함으로 되돌려 실제로 빨개지는 것을 확인한 기록을 남겼다.
|
||||
|
||||
- 계약에서 CONCEPT 을 빼자 백엔드의 계약 대조 테스트가 빨개졌다.
|
||||
|
||||
- 매핑을 떼어 보고 계약 대조 테스트가 그 연산 하나를 정확히 짚는 것을 확인했다.
|
||||
|
||||
- 굵기 선언을 빼 보고 제목 급 검사가 실제로 멈추는 것을 확인했다.
|
||||
- 가드 셋을 각각 결함으로 되돌려 실제로 빨개지는 것을 확인한 기록을 남겼다
|
||||
- 계약에서 CONCEPT 을 빼자 백엔드의 계약 대조 테스트가 빨개졌다
|
||||
- 매핑을 떼어 보고 계약 대조 테스트가 그 연산 하나를 정확히 짚는 것을 확인했다
|
||||
- 굵기 선언을 빼 보고 제목 급 검사가 실제로 멈추는 것을 확인했다
|
||||
|
||||
+16
-17
@@ -31,26 +31,32 @@ CI 에 묶이지 않은 검증이 남아 있으면 그것을 돌리는 것은
|
||||
|
||||
## 목적
|
||||
|
||||
배포 전에 돌려야 하는 것을 사람이 기억에 의존해 고르는 것을 막는다. 두 번 빠뜨려 결함이 배포까지 갔다.
|
||||
배포 전에 돌려야 하는 것을 사람이 기억에 의존해 고르는 것을 막는다.
|
||||
|
||||
이 저장소에서 두 번 빠뜨려 결함이 배포까지 갔다. 명령이 여럿이고 그중 일부만 도는 것이 가능한 구조에서는 「돌렸다」가 무엇을 돌렸다는 뜻인지 정해 두어야 한다.
|
||||
|
||||
## 규칙
|
||||
|
||||
### 1. 프론트는 다섯 개를 다 돌린다
|
||||
|
||||
타입 검사 · lint · 단위 테스트 · 컴포넌트 테스트 · 화면 테스트다. 화면 테스트는 단위 테스트 명령이 돌리지 않는다.
|
||||
타입 검사·lint·단위 테스트·컴포넌트 테스트·화면 테스트다. 화면 테스트는 단위 테스트 명령이 돌리지 않으므로, 넷을 돌리고 「전부 통과」라고 읽으면 화면 테스트가 빠진다.
|
||||
|
||||
### 2. 타입 검사는 프로젝트를 순회하는 명령으로 돌린다
|
||||
|
||||
루트 tsconfig 를 직접 부르는 명령은 한 파일도 검사하지 않고 성공한다.
|
||||
루트 tsconfig 를 직접 부르는 명령은 한 파일도 검사하지 않고 성공한다. 루트가 `"files": []` 에 project references 만 나열하기 때문이다.
|
||||
|
||||
### 3. 백엔드는 커밋한 뒤에 빌드한다
|
||||
|
||||
빌드 산출물 이름에 커밋 해시가 들어간다. 작업 트리가 더러우면 해시가 달라져 stale 산출물 검사가 멈춘다.
|
||||
빌드 산출물 이름에 커밋 해시가 들어간다. 작업 트리가 더러우면 해시가 달라져 stale 산출물 검사가 멈춘다. 이 순서를 몰라 두 번 헤맸다.
|
||||
|
||||
### 4. 테스트를 npm 이나 npx 로 감싸 돌리지 않는다
|
||||
|
||||
`npm_config_*` 환경 변수가 설정되어 CI 워크플로 생성 테스트가 실패한다. 그 변수를 지우고 실행기를 직접 부른다.
|
||||
|
||||
### 5. 환경 때문에 실패하는 것은 실패로 세지 않되 목록에 적는다
|
||||
|
||||
하위 프로세스를 띄우는 세 케이스는 이 환경에서 실패하고 같은 리비전의 다른 실행에서도 똑같이 재현된다. 코드 변경과 무관하다는 것을 적어 두지 않으면 다음 사람이 그것을 고치려 든다.
|
||||
|
||||
## 적용 조건
|
||||
|
||||
- CI 에 묶이지 않은 검증이 남아 있는 저장소에서 배포 직전에 하는 일
|
||||
@@ -59,19 +65,12 @@ CI 에 묶이지 않은 검증이 남아 있으면 그것을 돌리는 것은
|
||||
|
||||
## 예외
|
||||
|
||||
- CI 가 그 명령을 돌리면 이 목록에서 뺀다.
|
||||
|
||||
- 환경 때문에 실패하는 것은 실패로 세지 않는다. 하위 프로세스를 띄우는 세 케이스는 이 환경에서 실패하고 같은 리비전의 다른 실행에서도 똑같이 재현되므로 코드 변경과 무관하다.
|
||||
- CI 가 그 명령을 돌리면 이 목록에서 뺀다. 사람이 기억해서 돌리는 가드는 절반만 존재한다.
|
||||
- 테스트 실행기가 메모리를 더 필요로 하는 조합이면 힙을 올린다. 증상이 테스트 실패가 아니라 실행기를 완료할 수 없다는 메시지로 나와 원인을 가린다.
|
||||
|
||||
## 예시
|
||||
|
||||
- 프론트 다섯 명령 :
|
||||
`npm run check:types`
|
||||
`npm run lint`
|
||||
단위 · 컴포넌트 · 화면 테스트
|
||||
|
||||
- 백엔드 : 커밋한 뒤 stale 산출물을 지우고 빌드한다. 이 순서를 몰라 두 번 헤맸다.
|
||||
|
||||
- 설계 패키지 : 계약 자체의 유효성 · 세 계약 사이의 정합 · 프론트와 백엔드가 아는 종류와 오류 코드가 같은지, 셋을 돌린다.
|
||||
|
||||
- 테스트 JVM 힙이 기본값이면 컨텍스트 캐시와 아키텍처 검사와 컨테이너가 겹치면서 메모리가 모자란다. 증상이 테스트 실패가 아니라 실행기를 완료할 수 없다는 메시지라 원인을 가린다.
|
||||
- 화면 테스트를 돌리지 않아 23건이 빨간 채로 여러 커밋을 지나갔다
|
||||
- 루트 tsconfig 를 직접 부르는 명령이 통과해서 운영의 ReferenceError 를 못 봤다
|
||||
- 커밋 전에 빌드해 stale 산출물 검사가 멈춘 것을 두 번 겪었다
|
||||
- 설계 패키지는 계약 자체의 유효성·세 계약 사이의 정합·양쪽이 아는 종류와 오류 코드가 같은지 셋을 돌린다
|
||||
|
||||
Reference in New Issue
Block a user