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했다.


왜 규칙이 “있는데도” 안 먹혔나

파일을 다시 읽어 보니 구조가 이랬다.

  1. 맨 위 — 말투, 톤, 금지 표현 (길다)
  2. 중간 — 커뮤 표현, 말하는 법 예시 (또 길다)
  3. 맨 아래 “작업 습관” — 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