AI 에이전트 행동 규칙 강제하기 — SOUL.md를 맨 위로 올린 이유
TL;DR
- 규칙 파일에 “이렇게 해라”가 이미 있었는데도 에이전트가 계속 어겼다.
- 원인은 규칙 내용이 아니라 위치였다. 말투·스타일 뒤에 묻혀 있으면 사실상 안 읽힌다.
- 최상단에
🚨 최우선 규칙을 올리고 하단 중복을 지웠더니, 같은 태스크에서 바로 지켰다. - N=1 경험담이다. “프롬프트 앞이 무조건 이긴다”고 단정하진 않는다. 다만 중요한 규칙은 읽히는 자리에 두라는 교훈은 남는다.
들어가며
에이전트 두 개를 나눠 쓴다. A는 분석·검수, B는 코딩. 태스크는 Kanban으로 넘긴다. B가 코드를 고치면 A가 보고, 끝나면 다음 카드로 넘어가는 구조다.
문제는 B의 “끝난 척” 방식이었다. 작업은 다 해놓고 상태를 blocked: review-required로 바꿔 버리는 버릇이 있었다. 리뷰가 필요하면 그럴 수도 있지만, 우리 워크플로에서는 그게 완료가 아니라 루프를 만든다.
규칙 파일(SOUL.md)에는 이미 “review-required로 block하지 말고 바로 complete”라고 적혀 있었다. 그런데도 반복됐다. 규칙이 없어서가 아니라, 규칙이 안 읽혀서였다.
무슨 루프가 돌았나
흐름은 대략 이랬다.
B: 작업 끝 → status = blocked (review-required)
A: 수동 unblock
디스패처: “아직 안 끝났네” → B에게 다시 할당
B: 또 block
… 무한 반복
사람이 개입할수록 비용이 커진다. A는 “리뷰해 달라”는 신호가 아니라 불필요한 unblock 노동을 하게 되고, B는 같은 카드를 또 받는다. Kanban이 상태를 엄격히 다루는 도구일수록, 잘못된 status 한 방이 파이프라인 전체를 막는다.
그래서 SOUL.md에 금지 규칙을 넣었다. 넣었는데도 B는 계속 block했다.
왜 규칙이 “있는데도” 안 먹혔나
파일을 다시 읽어 보니 구조가 이랬다.
- 맨 위 — 말투, 톤, 금지 표현 (길다)
- 중간 — 커뮤 표현, 말하는 법 예시 (또 길다)
- 맨 아래 “작업 습관” — Kanban complete 규칙 (짧고 중요)
LLM은 프롬프트 전체를 균등하게 안 본다. 앞쪽(primacy)과 최근 턴(recency)에 더 붙는 경향이 있다. 긴 스타일 가이드가 앞에 깔리면, 뒤에 있는 “절대 block 하지 마”는 존재는 하지만 가중치가 낮다.
“규칙을 더 세게 쓰자”로 가면 파일이 더 길어진다. 세기가 아니라 가시성 문제였다.
해결: 최상단으로 올리고, 아래는 지운다
한 일이다.
- SOUL.md 맨 위에
🚨 최우선 규칙 (Kanban)섹션을 신설 - “review-required block 금지 → 바로 complete + Discord 한 줄 보고”
- 하단에 있던 같은 내용 삭제 (중복은 오히려 희석된다)
강조는 아이콘과 짧은 문장으로 끝냈다. 장문 설득문을 쓰지 않았다. 에이전트에게 필요한 건 철학이 아니라 실행 조건이다.
이후 같은 종류의 태스크에서 B는 block 없이 complete로 끝났고, 알림 채널에 한 줄 보고만 남겼다. 규칙 문구를 거의 안 고쳤는데 행동이 바뀌었다. 바뀐 건 위치뿐이었다.
일반화하되, N=1임을 인정하기
이 한 건으로 “프롬프트는 무조건 앞이 이긴다”고 말할 생각은 없다. 모델·컨텍스트 길이·시스템 프롬프트 구조에 따라 달라진다. 다만 실무에서 반복해서 보는 패턴은 분명하다.
| 착각 | 현실 |
|---|---|
| 파일에 있으면 지킨다 | 읽히는 자리에 있어야 지킨다 |
| 규칙을 길게 쓰면 더 잘 지킨다 | 길면 중요한 줄이 묻힌다 |
| 위반 = 모델이 멍청하다 | 위반 = 주의 배분 설계 실패일 때가 많다 |
| 같은 규칙을 두 번 쓰면 안전하다 | 중복은 우선순위를 흐린다 |
에이전트 프레임워크든, IDE 룰 파일이든, 시스템 프롬프트든 같다. 정책의 존재와 정책의 집행은 별개다. 집행을 코드로 못 박을 거면(하드 게이트, CI, 디스패처 거부), 최소한 프롬프트에서는 짧은 최우선 블록을 맨 앞에 두는 편이 싸다.
마무리
- 규칙은 “적혀 있음”이 아니라 “읽힘”이 성패를 가른다.
- 중요한 행동 제약은 스타일·말투보다 위에 둔다.
- 중복은 지우라. 같은 말을 두 번 하면 둘 다 약해진다.
- N=1이다. 그래도 unblock 루프에 한 번 당해 보면, 파일 맨 아래 “작업 습관”에 핵심을 숨기는 짓은 안 하게 된다.
다음엔 규칙을 프롬프트가 아니라 디스패처/상태 머신에서 거절하는 쪽도 정리해 볼 생각이다. 프롬프트는 힌트고, 상태 전이가 진짜 계약이다.
Comments