검증기 설계
개요
좋은 rule이 있어도 validator가 약하면 규칙은 다시 설명으로 퇴행한다.
validator는 rule을 실제 시스템에 참여시키는 첫 번째 실행 층이다. 이 문서는 좋은 validator를 어떻게 설계해야 하는지 설명한다.
validator의 역할
validator는 최소한 다음 질문에 답해야 한다.
- 위반이 지금 발생했는가
- 어디서 발생했는가
- 어떤 rule을 위반했는가
- 무엇을 해야 허용된 경로로 돌아가는가
즉 validator는 단순 검출기가 아니라, rule을 실패와 수정 행동으로 연결하는 번역기다.
좋은 validator의 조건
deterministic하다
같은 입력에 같은 결과가 나와야 한다. flaky하면 rule 신뢰가 무너진다.
local하다
가능한 한 위반이 발생한 가까운 표면에서 실패해야 한다. 너무 늦거나 너무 넓은 검사는 수정 범위를 흐린다.
precise하다
파일, symbol, transition, direct path 같은 위반 위치를 좁혀줘야 한다.
stable bucket을 가진다
같은 위반은 같은 rule id와 code로 묶일 수 있어야 한다. 그래야 반복 실패를 비교할 수 있다.
합법 경로를 가리킨다
validator는 무엇이 잘못됐는지만 말하면 부족하다. 허용된 경로를 같이 가리켜야 한다.
validator와 enforcement의 차이
둘은 연결되지만 같은 층은 아니다.
- validator 위반을 판정하고 위치와 이유를 드러낸다
- enforcement 그 위반이 실제로 통과되지 못하게 만든다
validator가 없으면 enforcement는 너무 거칠어지고, enforcement가 없으면 validator는 참고사항으로 남는다.
validator surface의 종류
좋은 validator는 하나일 필요는 없다. 같은 rule이 여러 surface에서 나타날 수 있다.
- static validator lint, analyzer, build-time rule
- runtime validator invariant, guard, transition check
- environment validator test harness, fixture, story check
핵심은 surface가 늘어나는 것이 아니라, 같은 rule 의미가 유지되는 것이다.
나쁜 validator 패턴
- rule id가 없다
- 위치가 너무 넓어 broad refactor를 유도한다
- violation은 잡지만 합법 경로를 안 보여준다
- tool마다 다른 이름으로 같은 문제를 말한다
- static에서 잡을 수 있는데 runtime에서만 늦게 잡는다
이런 validator는 존재해도 실제 통제 비용을 줄이지 못한다.
appendix와의 관계
이 문서는 validator의 구조적 역할을 다룬다.
보다 세부적인 message shape과 feedback 품질은
appendix/feedback-design에서 더 구체적으로 본다.
즉 여기서는 validator의 위치와 성격을, 부록에서는 validator 출력의 운영 품질을 본다.
AI 코딩에서 왜 더 중요해지는가
AI는 validator를 가장 가까운 rule signal로 읽는다.
- validator가 precise하면 local fix로 수렴하고
- validator가 vague하면 broad refactor로 퍼지고
- validator가 unstable하면 같은 failure를 학습하지 못한다
그래서 AI 환경에서는 validator 품질이 실질적인 harness 품질의 일부가 된다.
실무 질문
- validator는 같은 입력에 같은 결과를 내는가
- 위반 위치를 충분히 좁혀주는가
- 합법 경로를 같이 보여주는가
- 같은 rule이 여러 surface에서 같은 이름으로 보이는가
- static으로 잡을 수 있는 것을 충분히 앞당겼는가
요약
좋은 validator design은 다음을 만족한다.
- deterministic하고
- local하며
- precise하고
- stable bucket을 가지며
- 합법 경로를 가리킨다
validator는 규칙을 잡아내는 도구가 아니라, 규칙을 시스템의 실제 행동으로 연결하는 첫 번째 실행층이다.