MyAI(마이아이)개발 · 제품 · 운영 학습 노트

AI Agent 세팅 지도: 설정을 층으로 나누어 보기

학습 목표: Agent 설정을 여러 층으로 나누고, 각 층이 Claude Code와 Codex에서 어느 파일에 있으며 어떤 우선순위로 합쳐지는지 설명할 수 있다. 1인 스튜디오에 맞는 최소 설정과 확장 설정을 고를 수 있다.

앞의 문서들(「AI 개발 운영 개요」, 「Session · Agent · Subagent」, 「Multi-Agent 역할과 모델 라우팅」)은 AI를 어떻게 조직할지를 다뤘다. 이 문서부터는 그 조직을 실제 설정 파일로 옮기는 방법을 다룬다. 설정 키와 경로는 2026-09 기준으로 공식 문서와 소스에서 확인한 것만 적었다.

핵심 개념

Agent의 능력은 모델만으로 정해지지 않는다. 같은 모델도 무엇을 읽고, 무엇을 할 수 있고, 무엇이 자동으로 실행되느냐에 따라 전혀 다르게 행동한다. 이 바깥 구조를 harness라 하고, harness를 구성하는 것이 agent setup이다.

층 답하는 질문 Claude Code Codex
지시문 · 메모리 무엇을 항상 알고 시작하는가 CLAUDE.md, .claude/rules/, auto memory AGENTS.md, AGENTS.override.md
권한 · Mode 묻지 않고 무엇을 해도 되는가 settings.json의 permissions, permission mode approval_policy, .rules 파일
Sandbox OS가 무엇을 막는가 sandbox 설정 (Bash 대상) sandbox_mode
Hook 어떤 시점에 무엇이 반드시 실행되는가 settings.json의 hooks hooks.json 또는 config.toml의 [hooks]
Subagent 누구에게 격리된 일을 맡기는가 .claude/agents/*.md .codex/agents/*.toml
Skill · Slash command 반복 절차를 어떻게 부르는가 .claude/skills/<name>/SKILL.md .agents/skills/<name>/SKILL.md
Plugin 설정 묶음을 어떻게 배포하는가 plugin · marketplace plugin (plugins 설정)
MCP · 외부 도구 무엇에 연결되는가 .mcp.json, ~/.claude.json config.toml의 [mcp_servers.<name>]
환경 어디서 실행되는가 로컬, cloud session, CI 로컬, cloud, CI (codex exec)
모델 · 비용 어떤 모델을 얼마나 쓰는가 model, subagent model 필드 model, model_reasoning_effort

층마다 힘의 종류가 다르다

"절대 .env를 수정하지 마라"를 CLAUDE.md에만 적으면 권고다. 반드시 지켜져야 한다면 deny 규칙이나 PreToolUse hook으로 옮겨야 강제가 된다. 이 구분이 설정 설계의 출발점이다.

원리

Claude Code: scope와 우선순위

Claude Code는 settings 파일 네 개(user, project, local, managed)를 읽고, 여기에 한 세션에만 적용되는 command line 단계가 더해진다. 같은 키는 높은 단계가 덮어쓴다(2026-09 기준).

우선순위 Scope 파일 용도
1 Managed managed-settings.json, MDM, 서버 관리 설정 조직 정책. 원칙적으로 덮어쓸 수 없다 (일부 보안 키는 더 엄격한 하위 값이 이긴다)
2 Command line (파일이 아닌 단계) claude --settings, --permission-mode 등 이번 세션만
3 Project local .claude/settings.local.json 나만, 이 프로젝트만. git에서 제외
4 Shared project .claude/settings.json 팀 전체. commit한다
5 User ~/.claude/settings.json 나만, 모든 프로젝트

단, "덮어쓰기"는 단일 값에만 해당한다. 층마다 합쳐지는 방식이 다르다.

Codex: 설정 층과 신뢰

Codex는 TOML 층을 낮은 우선순위부터 쌓는다(openai/codex 소스의 설정 로더 주석, 2026-09 기준). 시스템 /etc/codex/config.toml → 사용자 ~/.codex/config.toml → 선택한 profile → 프로젝트 .codex/config.toml → 실행 시 --config와 플래그 순이다. 조직이 강제할 제약은 별도의 requirements.toml에 둔다.

Profile은 --profile <name>으로 고르는 설정 묶음이다. 2026-09 main 소스(codex-rs/config/src/loader/mod.rs) 기준으로 --profile work는 ~/.codex/work.config.toml을 사용자 config.toml 위에 한 층 더 얹으므로, profile 파일에는 바꿀 값만 적으면 된다. 선택한 이름과 같은 legacy profile = "work" 선택자나 [profiles.work] 표가 config.toml에 남아 있으면 --profile work는 오류로 멈춘다. 또 profile, profiles는 model_provider, notify 등과 함께 프로젝트 .codex/config.toml에서 무시되는 키다. 저장소 내용이 사용자의 자격 증명이나 실행 명령을 고르지 못하게 하려는 것이다.

중요한 차이는 프로젝트 설정이 신뢰(trust)를 받아야 켜진다는 점이다. 신뢰하지 않은 디렉터리의 .codex/config.toml은 읽히지만 비활성 상태로 남는다. Claude Code도 비슷하게, 커밋된 .claude/settings.json의 permissions.allow는 workspace trust 대화상자를 수락한 뒤에야 적용된다. 반면 deny와 ask는 제한만 하므로 즉시 적용된다.

model = "gpt-6-sol"
model_reasoning_effort = "medium"
approval_policy = "on-request"
sandbox_mode = "workspace-write"

[sandbox_workspace_write]
network_access = false

[projects."/Users/me/work/product-a"]
trust_level = "trusted"

위는 ~/.codex/config.toml의 예다. 모델 이름은 이 저장소 .ai/HARNESS.md의 라우팅 표를 따랐다.

커밋할 것과 개인 것

이 저장소의 .ai/HARNESS.md는 설정을 나누는 시험을 이렇게 적는다. 새 기여자가 clone했을 때 그것이 없으면 다르게 동작하는가? 그렇다면 project capability이므로 commit한다. 말투만 달라진다면 개인 선호이므로 commit하지 않는다. 기본 모델, 응답 언어는 개인 선호이고, 권한, hook, 역할 agent, MCP 서버는 capability다.

flowchart TD
    U[사람의 요청] --> I[지시문과 메모리<br/>CLAUDE.md · AGENTS.md]
    I --> M[모델과 비용 설정]
    M --> D{도구 호출}
    D --> H[PreToolUse Hook]
    H --> P[권한 규칙과 Mode]
    P --> S[Sandbox와 실행 환경]
    S --> T[도구 실행<br/>Bash · Edit · MCP]
    D --> A[Subagent · Skill]
    A --> I
    T --> R[결과]
    R --> ST[Stop Hook]

그림은 한 번의 도구 호출이 층을 통과하는 순서다. 권고 층(지시문)은 호출이 만들어지기 전에 영향을 주고, 강제 층(hook, 권한, sandbox)은 호출이 실행되기 전에 개입한다.

적용: 이 저장소의 설정

이 사이트의 저장소는 Claude Code와 Codex를 함께 쓰는 설정의 실제 사례다.

tech-jeongsu/
├─ CLAUDE.md                     Claude Code 진입 계약 (31줄)
├─ AGENTS.md                     Codex 진입 계약 (34줄)
├─ .ai/                          공유 정책 세트 (CORE, MANAGER, HARNESS …)
│  └─ tools/check_policy_set.py  정책 세트 구조 검사
├─ .claude/
│  ├─ agents/fast-explorer.md          읽기 전용 탐색 subagent
│  ├─ agents/adversarial-reviewer.md   독립 리뷰 subagent
│  └─ skills/auto-dev/SKILL.md         자동 개발 루프 skill
├─ .codex/agents/                dispatcher · fast-explorer · adversarial-reviewer (.toml)
└─ .agents/skills/auto-dev/      같은 skill의 Codex 판 + agents/openai.yaml
층 이 저장소에서 관찰
지시문 CLAUDE.md, AGENTS.md가 .ai/를 가리킴 진입 파일은 짧은 계약, 본문은 trigger로 on demand 로드
Subagent 두 Claude agent, 세 Codex agent 부모가 default·plan·dontAsk일 때 읽기 전용: permissionMode: plan, sandbox_mode = "read-only". 부모가 acceptEdits · auto · bypassPermissions면 Claude agent는 부모 mode를 따르고, Codex agent도 상위 runtime override가 이길 수 있다
Skill auto-dev 두 판 Codex 판은 allow_implicit_invocation: false로 자동 실행 금지
모델 Codex dispatcher와 fast-explorer만 TOML에 모델 고정 Codex reviewer와 두 Claude agent는 비워 둠. reviewer는 구현자와 다른 모델을 호출 시점에 고르기 위해
권한 · Hook · MCP 커밋된 파일 없음 HARNESS.md는 "commit하라"고 하지만 강제 층은 아직 비어 있다

마지막 줄이 이 저장소의 가장 큰 빈칸이다. 권고와 역할 정의는 충실하지만, 강제 층은 각자의 개인 설정에 맡겨져 있다. 「권한 · Sandbox · Hook」 문서에서 이 저장소에 맞는 .claude/settings.json 초안을 제안한다.

심화

최소 설정과 스튜디오 설정

항목 최소 설정 (제품 1개, 첫 주) 스튜디오 설정 (제품 여러 개, 1인 운영)
지시문 60줄 이하 CLAUDE.md 하나, 또는 AGENTS.md 하나 짧은 진입 계약 + 공유 정책 폴더 + trigger 표
도구 호환 한 도구만 AGENTS.md를 기준으로 두고 Claude Code는 import 또는 별도 진입 파일
권한 기본 mode, 떠오를 때마다 승인 커밋된 allow/ask/deny + 위험 등급 표
Sandbox 없음 로컬은 Claude /sandbox 또는 Codex workspace-write, 무인 실행은 container
Hook 없음 force push 차단, 미커밋 종료 방지, 편집 후 lint
Subagent 기본 제공 agent 읽기 전용 explorer, 모델이 다른 reviewer
Skill 없음 배포, 릴리스, 자동 개발 루프 같은 반복 절차
공유 없음 여러 저장소가 같은 설정을 쓰면 plugin으로 묶기

최소 설정에서 시작해 같은 문제가 두 번 생길 때 한 층씩 추가하는 것이 Claude Code 문서가 권하는 순서이기도 하다. 규칙을 두 번 틀리면 CLAUDE.md, 같은 프롬프트를 세 번 붙여 넣으면 skill, 매번 반드시 일어나야 하면 hook, 두 번째 저장소가 같은 설정을 원하면 plugin이다.

환경: 로컬 설정이 따라가지 않는 곳

결론은 같다. 여러 환경에서 같아야 하는 설정은 저장소에 있어야 한다.

모델과 비용 설정

Claude Code는 model 키(보통 user scope), subagent 파일의 model 필드, 조직용 availableModels 허용 목록으로 모델을 정한다. Codex는 model, model_reasoning_effort, subagent 기본값 [agents] default_subagent_model을 쓴다. 역할별 모델 배정 원칙은 「Multi-Agent 역할과 모델 라우팅」을 참고한다. 나머지 층의 상세는 이어지는 「Subagent · Skill · Plugin」, 「MCP와 외부 도구」, 「Headless · CI · Cloud 실행」에서 다룬다.

흔한 오해

자기 점검 질문

  1. 어떤 규칙을 CLAUDE.md에 둘지 deny 규칙으로 둘지 가르는 기준은 무엇인가?
  2. user 설정에 Bash(git push *) deny가 있고 project 설정에 같은 allow가 있으면 결과는 무엇이며 왜 그런가?
  3. Codex에서 프로젝트 .codex/config.toml이 무시되는 대표적인 이유는 무엇인가?
  4. 이 저장소의 reviewer agent가 모델을 고정하지 않는 이유를 설정 우선순위와 연결해 설명하라.
  5. cloud session에서 개인 skill이 "not found"가 되는 이유와 해결책은 무엇인가?

참고 자료