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 branchrequired status만 green일 때 merge우회 푸시를 막을 때

실무 배치 순서:

  1. 가장 싼 검사를 에이전트 훅·Done에 둡니다 (관련 경로 단위 테스트, tsc --noEmit, 린트).
  2. 중간 비용은 pre-push 또는 PR CI의 필수 잡에 둡니다.
  3. 비싼 E2E·통합은 CI에만 두고, 에이전트 매 턴에는 넣지 않습니다.
  4. 게이트 명령은 한 줄로 재현 가능하게 적습니다. “테스트 돌려 봐”는 게이트가 아닙니다.

복붙용 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(브랜치·머지 게이트)