agent 출력에 테스트 게이트 걸기
에이전트가 패치를 빠르게 쌓아도, 테스트가 빨간 채로 다음 단계로 넘어가면 비용만 커집니다. 에이전트 테스트 게이트는 “품질 문항을 사람이 채점한다”가 아니라 명령 exit code로 통과/중단을 기계적으로 거는 차단막입니다.
이 글은 **어디에 검사? · 실패 시 중단? · CI와 중복은?**만 다룹니다. agent-tdd-loop는 작성 중 red→green 루프를 프롬프트에 고정하는 축이고, agent-eval-checklist는 머지 직전 사람(또는 CODEOWNERS) eval 문항입니다. 여기서는 게이트(중단/통과) 축만 정리합니다. 요금·플랜·토큰·제휴 링크는 없습니다.
어디에 검사?
한 줄 답: 게이트는 에이전트 턴이 끝난 직후(로컬/훅) 와 PR이 열리기 전·후(CI required check) 에 둡니다. “에이전트 채팅 안에서 스스로 통과했다고 함”은 게이트가 아닙니다.
검사 위치 후보:
| 위치 | 무엇을 돌리나 | 언제 적합한가 |
|---|---|---|
| 에디터/에이전트 훅 | 스모크·단위 서브셋, 린트, 타입체크 | 턴 단위로 빨리 끊을 때 |
| 로컬 pre-commit / pre-push | 빠른 스위트 + 포맷 | 사람이 푸시하기 전 최종 차단 |
| 에이전트 Done 정의 | “지정 명령 exit 0”을 Skill/Rule에 고정 | 루프 안에서 스스로 재시도하게 할 때 |
| CI required check | 합의된 스위트·빌드·계약 테스트 | 머지 버튼 앞의 공식 게이트 |
| 머지 큐 / protected branch | required status만 green일 때 merge | 우회 푸시를 막을 때 |
실무 배치 순서:
- 가장 싼 검사를 에이전트 훅·Done에 둡니다 (관련 경로 단위 테스트,
tsc --noEmit, 린트). - 중간 비용은 pre-push 또는 PR CI의 필수 잡에 둡니다.
- 비싼 E2E·통합은 CI에만 두고, 에이전트 매 턴에는 넣지 않습니다.
- 게이트 명령은 한 줄로 재현 가능하게 적습니다. “테스트 돌려 봐”는 게이트가 아닙니다.
복붙용 Done 게이트:
Gate (must exit 0 before claiming done):
<exact command, e.g. npm test -- path/to/spec>
Do not open PR / do not start next task while gate is red.
경계: agent-tdd-loop는 그 명령을 red→green 사이클로 쓰는 법이고, 이 절은 그 명령을 어느 층에 차단막으로 꽂는지입니다.
실패 시 중단?
한 줄 답: 게이트가 정한 명령이 non-zero면 중단합니다. 다음 기능·다음 파일·PR 오픈·“일단 커밋”을 허용하지 않습니다. 재시도는 같은 게이트 명령으로만 하고, flaky면 상향 타임아웃이 아니라 격리·재현·이슈화로 넘깁니다.
중단 정책 표:
| 신호 | 기본 동작 | 예외 |
|---|---|---|
| 단위/스모크 red | 에이전트 턴 종료·패치 보류 | 없음(게이트 범위 안이면) |
| 린트/타입 red | 중단 후 최소 수정 | 생성 코드만 warn 허용은 문서화된 예외 목록 |
| 관련 없는 스위트 red | 보고만, 고치지 않음 | 게이트 범위 밖은 별도 티켓 |
| flaky 의심 | 동일 명령 N회(팀 한도)만 재시도 | 한도 초과 → 중단 + flake 이슈 |
| 시크릿/권한 스캔 red | 즉시 중단·머지 금지 | 예외 없음 |
에이전트에게 줄 중단 규칙:
On gate failure:
1. Stop. Do not start unrelated edits.
2. Re-run the exact gate command.
3. If still red: minimal patch OR report blocker (log + command).
4. Never mark done, open PR, or push while gate is red.
5. Flaky: max <N> retries; then open flake ticket — do not weaken asserts.
중단 ≠ eval 전부: agent-eval-checklist의 문서·시크릿 문항은 사람 합격이 남을 수 있습니다. 테스트 게이트는 기계 exit code만 담당합니다. 게이트 green이어도 eval 표가 red면 머지하지 않습니다.
CI와 중복은?
한 줄 답: 중복은 같은 명령을 두 번 돌리는 낭비가 아니라, 역할이 겹치면 문제입니다. 로컬/훅은 빠른 피드백·에이전트 중단, CI는 공유 진실·머지 권한입니다. 둘 다 필요하지만 스위트 크기와 required 여부를 나눕니다.
역할 분리:
| 층 | 목적 | 중복을 줄이는 법 |
|---|---|---|
| 에이전트 게이트 | 턴을 빨리 끊기 | 영향 경로 서브셋, 캐시 가능 명령 |
| 로컬 pre-* | 푸시 전 실수 차단 | CI와 동일 엔트리포인트 스크립트 호출 |
| CI required | 머지 차단의 공식 기록 | 로컬과 같은 scripts/test-gate.sh |
| CI optional | 느리거나 flake 많은 잡 | required에서 제외, 차단은 하지 않음 |
중복 설계 체크리스트:
[ ] 게이트 명령이 레포 스크립트 하나로 고정돼 있는가?
[ ] 에이전트 Done / 훅 / CI required가 같은 엔트리포인트를 부르는가?
[ ] 에이전트 매 턴에 E2E 전체를 넣지 않았는가?
[ ] required 잡 목록이 CODEOWNERS/브랜치 보호와 맞는가?
[ ] “로컬만 green, CI red”면 로컬 게이트가 약한가? (환경·시드·의존성)
[ ] CI green만 믿고 eval·시크릿 표를 건너뛰지 않는가?
흔한 실패: 에이전트는 npm test 서브셋만, CI는 다른 패키지 매니저·다른 Node 버전 → 게이트가 거짓말합니다. 엔트리포인트와 런타임을 맞춥니다.
한 줄 정리: 테스트 게이트 = 어디에 꽂고 / red면 멈추고 / CI와 같은 스크립트로 진실 맞추기. TDD 루프·머지 eval과 축이 다릅니다.
FAQ
agent-tdd-loop와 무엇이 다른가요?
그 글은 실패 로그를 넘기고 red→green 한 사이클을 끝내게 하는 작성 루프입니다. 이 글은 그 성공 조건(명령 exit 0)을 훅·Done·CI에 차단막으로 거는 위치와 중단 정책입니다.
agent-eval-checklist와 무엇이 다른가요?
eval 체크리스트는 기능·보안·문서 문항의 사람 합격입니다. 테스트 게이트는 자동 테스트/린트/타입의 기계 합격입니다. 게이트 green ≠ eval 통과입니다.
게이트를 에이전트가 끄게 두면?
Rule/Skill에 게이트 명령 변경·스킵·assertion 완화 금지를 명시합니다. 예외는 티켓 ID와 소유자 승인 없이 허용하지 않습니다.
모든 패키지에 같은 게이트?
monorepo면 변경된 패키지 + 계약 테스트만 게이트에 넣고, 전체 워크스페이스는 CI required로 올립니다. 매 턴 전체는 보통 과합니다.
출처 (Sources)
- 팀 관행: 에이전트 Done·훅·CI required를 같은 게이트 스크립트로 묶기 — 본문 표
- 인접 축: agent-tdd-loop(작성 중 red→green), agent-eval-checklist(머지 전 사람 eval), multi-agent-pr-workflow(브랜치·머지 게이트)