모든 에이전트 작업은 실행 가능한 명령어로 끝나야 한다
요약
에이전트 작업의 '완료' 정의가 시스템 작동을 보장하지 못하는 문제를 지적합니다. 에이전트는 스스로 관찰한 검사만 수행할 뿐, 사용자가 의존했던 동작까지는 확인하지 못하기 때문입니다. 따라서 모든 에이전트 작업은 실행 가능한 단일 명령어로 끝나야 하며, 이는 계약 검사의 역할을 해야 합니다.
핵심 포인트
- 에이전트의 '완료'는 스스로 관찰한 범위에 한정된다.
- 모든 에이전트 작업은 실행 가능한 단일 명령어로 마무리해야 한다.
- 명령어는 변경된 코드보다 이전 아티팩트(계약)를 검사하는 데 사용되어야 한다.
- 실행 가능한 명령어를 요구함으로써, 개발자는 실제 격차를 발견할 수 있다.
패턴
당신은 에이전트 세션으로 돌아옵니다. 요약에는 다음과 같이 적혀 있습니다:
완료됨. 인증 미들웨어(auth middleware)를 리팩토링하고, 속도 제한을 추가했으며, 테스트를 업데이트했고, 모두 녹색입니다.
당신은 그것을 신뢰합니다. 병합(merge)합니다. 사흘 뒤 누군가 변경되지 않은 경로에서 500 에러를 발생시킵니다.
이 패턴의 문제는 에이전트가 거짓말을 했다는 것이 아닙니다. 문제는 에이전트가 정의하는 '완료'가 루프를 끝내는 원인이며, 시스템이 여전히 작동한다는 것을 증명하는 당신의 '완료' 정의는 아무도 실행하지 않은 다른 검사라는 것입니다.
'모두 녹색(all green)'이 실제로 의미하는 것
에이전트가 테스트 통과를 말할 때, 그것은 보통 다음 중 하나를 의미합니다:
- 테스트 스위트를 실행했고 종료 코드가 0이었습니다.
- '어떤' 테스트 명령을 실행하고 성공으로 해석되는 출력을 보았습니다.
- 테스트를 작성하고, 실행하여 통과하는 것을 보고, 자신이 작성하지 않은 테스트는 다시 실행하지 않았습니다.
- 확인하는 것이 비용이 들기 때문에 기존 스위트가 방금 변경한 경로를 커버한다고 가정했습니다.
이 중 어느 것도 '사용자가 의존했던 동작이 여전히 작동한다'와 같지 않습니다. 이들은 모두 에이전트가 설계하고, 실행하고, 스스로 관찰한 검사이며—이는 AI 리뷰 봇이 자신의 diff를 검토하는 것과 같은 구조적 문제입니다.
저렴한 해결책은 더 화려한 평가자(evaluator)가 아닙니다. 그것은 규율입니다: 모든 에이전트 작업은 당신 스스로 실행할 수 있는 한 줄짜리 명령어로 끝나야 합니다.
규칙
어떤 사소하지 않은 에이전트 작업의 끝에서도 다음 한 가지를 요청하세요:
마무리하기 전에, 당신이 변경한 것이 여전히 작동한다는 것을 증명하는 단일 명령어를 신선한 터미널에 붙여넣을 수 있도록 나에게 주세요. 해설 없이, 명령어와 예상되는 출력을만요.
그게 전부입니다. 에이전트는 다음과 같은 것을 생성할 것입니다:
npm test -- --grep
## 왜 이것이 실제 격차를 드러내는가
명령어는 에이전트 외의 누군가가 실행할 수 있어야 한다. 이 단 하나의 제약 조건은 요약본이 놓치는 세 가지를 강제한다:
1. **명령어가 존재해야 한다.** 에이전트는 테스트 명령어, 개발 서버 URL, 시드 스크립트를 알아야 한다. 만약 모른다면, 그것은 모델의 약점이 아니라 온보딩 문서에 실제 격차가 있다는 의미다.
2. **예상 결과가 구체적이어야 한다.** '테스트 통과'는 구체적이지 않다. '12 passing, 0 failing, ~3s'는 구체적이다. 모호한 예상 결과는 에이전트가 실제로 확인하지 않았다는 신호다.
3. **1분 안에 실행할 수 있어야 한다.** 회의적인 시각으로 접근하는 비용이 '에이전트의 diff를 열어 200줄을 읽기'에서 '한 줄 붙여넣고 3초 기다리기'로 떨어진다. 당신은 실제로 확인 작업을 시작한다.
## 명령어가 계약 검사일 때
API 작업의 경우, 실행 가능한 명령어는 보통 단위 테스트가 아니다. 그것은 실행 중인 서비스에 접근하여 응답을 에이전트가 이번 세션에서 작성하지 않은 계약(contract)과 비교하는 무언가이다.
이것이 규칙의 가장 높은 레버리지 버전이다: 명령어가 작업보다 앞선 아티팩트를 검사한다. 에이전트는 5분 전에 자신이 작성한 테스트는 합리화할 수 있다. 하지만 라이브 응답이 사양에 나열되지 않은 필드를 반환하는 경우, 3개월 동안 저장소에 있었던 명세(spec)를 합리화할 수는 없다.
우리는 이 루프를 중심으로 [Powerduck](https://www.powerduck.com/)을 구축했다: OpenAPI 파일이 로컬에 존재하고, 에이전트의 '완료' 명령어는 실행 중인 엔드포인트에 대한 계약 검사이다 — 상태 코드, 미디어 타입, 응답 본문 모두가 에이전트가 반환해야 한다고 생각하는 것과 비교되는 것이 아니라 명세와 비교된다. 만약 명령어가 실패하면, 요약본이 아무리 자신감 있게 들려도 에이전트는 끝나지 않은 것이다.
## 피해야 할 함정
명령어가 에이전트가 암기하고 당신이 읽는 것을 멈추게 하는 의식이 되도록 내버려 두지 마라. 모든 작업이 동일한 `npm test`로 끝나고 당신이 항상 '괜찮아 보인다'고 말한다면, 당신은 단지 신뢰 문제를 한 단계 아래로 옮긴 것뿐이다.
작업과 명령어를 회전시키세요. 응답 형태의 리팩토링은 단위 테스트(unit test)가 아니라 계약 검사(contract check)가 필요합니다. 레이스 조건(race-condition) 수정에는 반복 실행 명령어(repeated-run command)가 필요합니다. 새로운 엔드포인트는 라이브 경로에 대한 curl이 필요합니다. 명령어는 에이전트의 근육 기억(muscle memory)과 일치하는 것이 아니라 위험도와 일치해야 합니다.
## 다음 세션에서 시도해 보세요
실행하지 않고 닫으려던 다음 에이전트 작업을 골라보세요. 병합(merge)하기 전에 명령어를 요청하세요. 대부분의 경우 10초 안에 받고 실행하게 될 것입니다. 그렇지 않은 단 한 번의 경우—에이전트가 망설이는 순간—그것이야말로 이 규칙이 당신을 후회할 만한 병합으로부터 구해주었던 시간입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기