모델의 판단에 맡기는 규칙
지시 파일은 지속적으로 읽히지만 실행 여부는 모델의 행동에 달려 있다. 코딩 스타일, 선호, 아키텍처 방향처럼 어겨도 복구 가능한 규칙에 적합하다.
“하지 말라”고 말하는 것과 “할 수 없게” 만드는 것은 같은 문장이 아니다. 하나는 기억과 판단에 기대고, 다른 하나는 구조와 실행에 기대어 선다. Harness가 취향의 기술에서 공학으로 넘어가는 지점은 바로 이 차이에 있다.
CLAUDE.md에 “main 브랜치로 직접 push하지 말라”고 쓰면 그것은 지속적인 지시지만 여전히 제안이다.
Agent는 대체로 따르지만, 컨텍스트가 길거나 작업이 복잡하거나 모델이 흔들리는 순간 무시할 수 있다.
같은 위험을 프로그램 수준에서 차단하면 성격이 달라진다.
지시 파일은 지속적으로 읽히지만 실행 여부는 모델의 행동에 달려 있다. 코딩 스타일, 선호, 아키텍처 방향처럼 어겨도 복구 가능한 규칙에 적합하다.
도구 호출 전에 matcher가 위험한 명령을 잡고 deny를 반환하면
Agent가 어떤 판단을 하더라도 해당 행동은 실행되지 않는다.
안전선, 생산 환경, 비가역 작업에 적합하다.
Claude Code의 Hook은 도구 실행 전 개입할 수 있다.
원문은 PreToolUse에서 Bash(git push*main*)을 감지하고
명령을 거절하는 설정을 예로 든다.
{
"hooks": {
"PreToolUse": [{
"matcher": "Bash(git push*main*)",
"handler": {
"type": "shell",
"command": "echo 'DENY: main 직접 push 금지'"
}
}]
}
}
원문은 2026년 4월의 Claude Code v2.1.90을 기준으로 20개가 넘는 lifecycle event가 있고, 그중 일곱 개를 가장 자주 쓰는 Hook으로 정리한다. Hook은 대화의 조언이 아니라 실행 경로의 특정 지점에 끼어드는 프로그램이다.
| Event | 언제 발생하는가 | 원문이 제시한 핵심 역할 |
|---|---|---|
| PreToolUse | 도구 호출 전 | 작업 deny · 안전 정책의 핵심 집행점 · defer 결정으로 headless 세션을 멈췄다가 재개 |
| PostToolUse | 도구 호출 후 | 감사, 로그, 자동 formatting |
| SessionStart | 세션 시작 | 동적 컨텍스트 로딩, 환경 초기화 |
| Stop | Agent 종료 시 | 결정론적 완료 검사 |
| PermissionRequest | 권한 요청 시 | 승인 자동화, Slack 등의 승인 경로로 라우팅 |
| PermissionDenied | 자동 모드에서 권한이 거절된 뒤 | 거절 동작 기록, 대체 경로 트리거 |
| PostCompact | 컨텍스트 압축 후 | 압축 이벤트에 반응 |
원문이 가장 중요하게 보는 Hook이다.
도구가 실행되기 전에 deny를 반환해 특정 행동을 프로그램 수준에서 차단한다.
제약이 지시를 넘어 실제 집행으로 바뀌는 지점이다.
원문은 Hook이 추상적인 안전 기능이 아니라 일상적인 개발 피드백 루프를 만드는 도구임을 네 사례로 보여준다. 편집 뒤 검사하고, 위험한 파일을 보호하고, 타입 오류를 즉시 드러내고, commit 전에 테스트를 통과하게 한다.
Edit|Write 이후 ESLint를 실행한다.
실패 출력을 Agent가 바로 읽어 수정하도록 만들어 사람이 별도로 “lint 돌려라”라고 반복하지 않는다.
after Edit / Write → eslint 실행 → 오류 출력 반환 → Agent가 즉시 수정
.env*나 production 설정에 대한 직접 편집을 도구 호출 전에 막는다.
안전선은 문서에 적어두는 것으로 끝내지 않는다.
match Edit(.env*) or Edit(*.production.*) → DENY
.ts, .tsx 파일이 바뀌면 즉시 타입 검사를 수행한다.
Agent가 오류를 보고 스스로 고치므로 수동 확인이 피드백 루프에서 빠진다.
after Edit(*.ts / *.tsx) → tsc --noEmit → type error feedback
git commit 직전에 테스트를 실행해 실패한 상태로 제출하는 것을 막는 예다.
완료 선언보다 검증을 먼저 통과시키는 구조다.
before git commit → test suite 실행 → 실패 시 진행 차단
원문은 Codex CLI에는 Claude Code와 같은 Hook이 없다고 설명한 뒤, OpenAI 팀이 다른 방식의 기계적 강제를 사용했다고 소개한다. 핵심은 “싫은 코드의 성질을 말로 설명할 수 있다면 다음 단계는 그것을 규칙과 검사로 바꾸는 것”이라는 철학이다.
비즈니스 영역 안에서 코드가 한 방향으로만 의존하도록 고정한다. UI는 Service를 의존할 수 있지만 Service는 UI를 거꾸로 참조할 수 없다.
Codex가 자체 ESLint 규칙과 구조 테스트를 생성해 계층 위반을 탐지한다. 오류 메시지는 위반 사실만 말하지 않고 수정 방향과 문서 링크까지 제공해 Agent가 스스로 고칠 수 있게 한다.
앞선 검사들은 CI에서 실행되고, 위반한 PR은 주 브랜치에 합쳐질 수 없다. 규칙은 조언이 아니라 저장소의 실제 통과 조건이 된다.
원문은 원래 수백 명의 엔지니어가 생긴 뒤에야 세우곤 하는 강한 아키텍처가 coding agent 환경에서는 초기 전제 조건으로 앞당겨진다고 해석한다. Agent가 늘어날수록 일관성을 사람의 자각에 맡기기 어려워지기 때문이다.
Codex CLI의 또 다른 Hard Constraint는 sandbox다. 프로그램 로직으로 매 행동을 판정하기보다 Agent가 접근할 수 있는 파일과 네트워크의 범위를 환경 수준에서 제한한다.
기본 모드는 작업공간 안에서만 쓰기를 허용하고 네트워크를 닫는다. 더 넓은 권한 모드는 전체 파일 시스템과 네트워크를 연다.
원문은 기본 모드에서 Agent가 작업 디렉터리 밖을 마음대로 쓰지 못하고 네트워크도 사용할 수 없다고 설명한다.
또한 .git/과 .codex/가 보호된다고 서술한다.
핵심은 규칙을 설명하는 것이 아니라 환경이 가능성 자체를 줄이는 데 있다.
원문은 모든 제약 수단을 한 줄 위에 놓는다. 오른쪽으로 갈수록 신뢰성은 높아지지만 유연성은 줄어든다. 좋은 Harness는 한 종류만 고집하지 않고 손실의 크기에 따라 다른 강도를 배치한다.
| 제약 방식 | 성격 | 집행자 | 우회 가능성 | 원문이 연결한 도구 |
|---|---|---|---|---|
| 대화 속 구두 알림 | 즉시 · 일회성 | 사용자 | 있음 | 모든 도구 |
| CLAUDE.md / AGENTS.md | 지속적 · 제안적 | 모델 | 있음 | 모든 도구 |
| Hook · PreToolUse deny | 지속적 · 강제적 | 프로그램 | 없음 | Claude Code |
| Custom Linter | 지속적 · 강제적 | 정적 분석 | 없음 | 도구 독립 · 직접 구축 |
| CI 차단 | 지속적 · 강제적 | CI 시스템 | 없음 | 도구 독립 · 직접 구축 |
| Sandbox 격리 | 지속적 · 물리적 | 운영체제 / 정책 | 없음 | Codex CLI |
원문은 한 규칙을 제안으로 둘지 제약으로 올릴지 판단하는 단순한 기준을 제시한다. “Agent가 이 규칙을 어겼을 때 어떤 일이 일어나는가?” 손실이 작으면 유연성을 남기고, 손실이 크면 하드한 경계로 올린다.
일관성이 조금 깨지거나 리뷰에서 쉽게 수정할 수 있는 문제다. 유연성을 버리고 강제할 이유가 크지 않다.
복구 비용이 크거나 비가역적이거나 안전 문제로 이어지는 행동이다. 사람의 기억이나 모델의 준수율에 맡기지 않는다.
원문이 남기는 문장은 짧다.
제약이 지켜야 하는 것은 취향이 아니라 바닥선이다.
장의 마지막은 도구별 제약 철학을 비교한다. 원문 시점에서 Claude Code는 프로그래밍 가능한 Hook, Codex CLI는 정책형 Sandbox를 하드 제약으로 제시하고, Cline은 Plan/Act 분리와 사람 승인으로 사회적 제약을 만든다고 설명한다.
Hook 안에 임의 로직을 작성해 approve / deny를 결정한다. 상황별 정책을 프로그램으로 표현할 수 있다는 점이 핵심이다.
Sandbox의 미리 정의된 권한 수준을 선택한다. 임의의 커스텀 로직이라기보다 환경의 접근 가능 범위를 정책으로 고정한다.
Plan 모드는 분석만 하고 수정하지 않으며, Act 모드에서는 각 단계에 인간 승인을 요구한다. 기술적으로 막기보다 과정 안에 사람의 확인을 넣는다.
원문은 해법 공간을 제한할수록 오히려 Agent를 더 신뢰할 수 있다는 분석으로 끝난다.
규칙이 없는 조직이 자유로운 조직이 아니라 혼란스러운 조직인 것처럼,
Agent도 경계가 선명할수록 그 안에서는 더 과감하게 움직일 수 있다.
Harness는 AI의 힘을 줄이는 장치가 아니다.
그 힘을 신뢰할 수 있는 형태로 바꾸는 장치다.
자유에는 언제나 경계가 있다.
경계가 없어서 자유로운 것이 아니라
넘어서는 안 되는 곳이 분명하기 때문에
그 안에서 더 멀리 갈 수 있다.
지시 파일은 방향을 말하고,
Hook은 행동을 막고,
Linter와 CI는 질서를 확인하며,
Sandbox는 세계의 크기 자체를 정한다.
중요한 것은 모든 것을 금지하는 일이 아니다.
무엇만은 절대로 무너지지 않아야 하는지 합의하는 일이다.
Harness의 공학은 바로 그 바닥선을
사람의 기억에서 시스템의 구조로 옮기는 데서 시작한다.