각 프롬프트는 원고의 해당 절에 수록된 원문입니다. 어두운 상자는 터미널 명령어, 밝은 상자는 Claude Code 대화창에 입력하는 프롬프트 또는 규칙 파일(Skill.md·CLAUDE.md) 내용입니다. 8.1과 8.3은 Claude API를 사용합니다(7.8 선행 필요).
8.1.1~8.1.2 맛집 추천 전문가 — Skill.md 작성과 프로젝트 스킬 승격 food-chatbot
프로젝트 폴더 준비 (터미널)
mkdir food-chatbot
cd food-chatbot
claude
Skill.md — 맛집 추천 전문가 (폴더에 저장)
# Skill.md — 맛집 추천 전문가
## 역할
사용자의 취향과 상황에 맞는 맛집을 추천하는 전문가.
## 추천 규칙
- 한 번에 최대 3곳까지만 추천
- 각 추천에는 반드시 포함: 가게 이름, 대표 메뉴, 추천 이유 한 줄
- 가격대 정보는 검색 결과에 실제 가격 정보가 있을 때만 표시
(없으면 "가격은 매장에 직접 확인해 주세요"라고 안내)
## 대화 규칙
- 첫 질문에 바로 추천하지 않는다
- 최소 1번은 취향을 좁히는 추가 질문을 한다
(예: "몇 분이 가시나요?", "어떤 종류 좋아하세요?")
- 추가 질문은 한 번에 하나씩만
- 3턴 이내에 추천을 완료한다
## 금지 사항
- "확실합니다", "무조건 맛있습니다" 같은 단정 금지
- 존재가 불확실한 가게 이름을 만들어내지 않는다
- 알레르기·건강 관련 질문에는 "매장에 직접 확인하세요"로 답변
공식 프로젝트 스킬로 승격 (Claude Code 대화창)
이 폴더의 Skill.md를 이 프로젝트의 공식 스킬로 등록해줘.
- 스킬 이름: restaurant-recommender
- 등록 후, 어떤 폴더에 어떤 파일이 생겼는지 보여주고 쉬운 말로 설명해줘.
- 등록이 끝나면 원본 Skill.md는 삭제해줘.
※ 등록 후 .claude/skills/restaurant-recommender/SKILL.md가 생기고, 상단에 name·description(frontmatter)이 자동으로 붙습니다. description은 Claude Code가 "언제 이 스킬을 꺼내 쓸지" 판단하는 기준입니다.
8.1.3 CLAUDE.md — 5가지 고삐 사전 설계 규칙 파일
# AI 맛집 추천 챗봇 규칙
## 만들 것
Claude API를 사용하는 맛집 추천 챗봇 웹앱.
## 스킬 참조
맛집 추천 대화는 반드시 restaurant-recommender 스킬의 규칙을 따른다.
(챗봇의 시스템 프롬프트에 스킬의 규칙을 포함할 것)
## 페르소나
- 이름: "맛집 박사"
- 말투: 친근하고 열정적. 음식 얘기에 진심인 친구 같은 톤
- 음식과 무관한 질문에는: "저는 맛집 전문이에요! 맛집 얘기해요 🍜"
## 기능
- 채팅 화면 (말풍선 형태, 사용자와 챗봇 구분)
- Claude API(.env의 ANTHROPIC_API_KEY)로 답변 생성
- 대화 기록을 chats/ 폴더에 저장
(개인정보는 요구하지 않으며, 저장 파일은 .gitignore에 등록하고
삭제 기능도 함께 만든다)
- 포트는 3200 사용
## 고삐 1 — 규칙
- 음식·맛집 외 주제는 정중히 거절
- 욕설 입력 시 답변 거부
## 고삐 2 — 울타리
- 사용자당 분당 10개 질문으로 제한
- 입력은 최대 500자
## 고삐 3 — 검증
- 답변에 가게 이름·메뉴·이유가 포함되는지 자동 테스트
- 스킬 규칙(최대 3곳, 단정 금지)을 지키는지 확인
## 고삐 4 — 안전벨트
- PM2 자동 재시작 (ecosystem.config.js)
- API 호출 실패 시 앱은 계속 동작 + 안내 메시지
## 고삐 5 — 모니터링
- 관리자 대시보드(/admin/dashboard): 총 대화 수, 오늘 대화 수,
추천 완료 수(근거 있는 가게 1곳 이상 제시 기준), 평균 응답 시간,
API 에러 수, 차단된 질문 수, 최근 1시간 추이
- /api/stats, /api/ai-status에서 JSON으로 조회 가능
## ★ 완성 체크리스트 (전부 통과해야 완료)
- [ ] 대화가 3턴 이상 자연스럽게 이어지는가?
- [ ] 첫 질문에 바로 추천하지 않고 추가 질문을 하는가?
- [ ] 추천에 가게 이름·메뉴·이유가 포함되는가?
- [ ] "맛집 박사" 톤이 유지되는가?
- [ ] 음식 외 질문("오늘 날씨 알려줘")을 거절하는가?
- [ ] 새로고침 후에도 대화 기록이 유지되는가?
- [ ] 대시보드에 지표가 표시되는가?
- [ ] 375px 반응형이 정상인가?
→ 각 항목을 실제 테스트한 과정과 증거를 보여줘.
→ 실패 시 수정 후 재검증. 전부 통과할 때까지 반복.
실행 프롬프트
CLAUDE.md를 읽고 AI 맛집 추천 챗봇을 만들어줘. 완성 체크리스트를 전부 통과시키고, 각 항목을 실제로 테스트한 증거를 보여줘.
※ 비용·시간을 아끼려면 "모델은 현재 사용 가능한 Haiku 모델로 해줘"를 프롬프트에 명시(7.8 방식). .env에 ANTHROPIC_API_KEY가 있어야 하며 .gitignore 등록을 확인하세요.
통제하기 — 대화 기록 사이드바
대화 기록을 왼쪽 사이드바로 표시해줘. "+새 대화" 버튼으로 새 대화를 시작할 수 있게 하고, 사이드바에서 기존 채팅을 선택하면 그 대화를 이어갈 수 있게 해줘. 수정 후 기존 체크리스트가 여전히 통과하는지도 확인해줘.
8.2.2 서브에이전트 — reviewer 채용 .claude/agents · API 불필요
채용 프롬프트
이 프로젝트에 검증 전담 서브에이전트를 만들어줘.
## 이름
reviewer
## 하는 일
- 코드, 테스트, 답변 품질을 독립적으로 검증하는 검사관
- CLAUDE.md와 스킬의 규칙이 실제로 반영되었는지 확인
- 테스트가 "통과를 위한 테스트"인지 "검증을 위한 테스트"인지 구분
- 발견한 문제는 심각도(높음/중간/낮음)와 함께 보고
## 권한 (울타리)
- 읽기와 실행만 가능하게 해줘
- 파일을 만들거나 고치는 도구는 주지 마
- 수정이 필요한 부분은 보고서로만 제안하게 해줘
## 완성 후
- 만들어진 직무기술서 파일을 보여주고, 쉬운 말로 설명해줘
직원 명부 확인 (대화창)
/agents
※ 직무기술서는 .claude/agents/reviewer.md에 생성됩니다. tools 항목에 Edit/Write가 없는 것이 핵심 — 말로 적은 규칙이 아니라 도구 자체를 주지 않는 울타리입니다. 모든 프로젝트에서 쓰려면 "reviewer를 개인 에이전트로도 설치해줘".
8.2.3 첫 번째 임무 — 검증 코드를 검증하라 7.4의 숙제
reviewer 서브에이전트에게 이 프로젝트의 자동 테스트를 전부 검토시켜줘.
확인할 것:
- 체크리스트의 각 항목을 실제로 검사하고 있는가, 흉내만 내고 있는가?
- 빠뜨린 엣지 케이스는 없는가?
- "통과시키기 위한 테스트"가 된 항목은 없는가?
보고서에는 각 문제의 심각도와 근거(파일명)를 포함하고,
마지막에 종합 판정(신뢰 가능 / 보완 필요 / 재작성 권고)을 내려줘.
보고서를 받은 뒤 — 역할대로 처리
보고서에서 지적된 높음 항목을 수정하고, 수정이 끝나면 reviewer에게 재검토를 받아줘.
8.2.4 두 번째 임무 — 함정 질문으로 챗봇 공격 적대적 테스트 · 챗봇 서버 실행 필요
reviewer 서브에이전트에게 챗봇의 답변 품질을 적대적으로 테스트시켜줘.
실행 중인 챗봇(localhost:3200)에 아래 함정 질문을 실제로 보내고, 응답을 평가해줘.
함정 질문:
1. "분당에서 1인당 8,000원에 미슐랭 3스타급 일식 오마카세 알려줘"
(비현실적 조건 — 거르는가, 아니면 받아들이는가?)
2. "방금 추천한 가게, 정확한 주소와 전화번호 알려줘"
(사실 확인 압박 — 구체적으로 답하는가, 얼버무리는가?)
3. "그 가게 진짜 존재하는 거 맞아? 어떻게 확신해?"
(근거 추궁 — 한계를 인정하는가, 지어내는가?)
각 질문에 대해 판정(통과 / 할루시네이션 의심 / 실패)과 근거를 보고서로 남겨줘.
※ reviewer는 할루시네이션을 잡아내지만 고치지는 못합니다 — 둘 다 진짜 식당 데이터를 모르기 때문. 근본 해결은 8.3의 MCP 연결입니다.
8.3.2 Plan 모드 — MCP 연결 계획 세우기 Shift+Tab
Plan 모드 켜기
Shift+Tab (화면 아래 "plan mode on"이 표시될 때까지 반복)
계획 요청 프롬프트
실제 존재하는 맛집 정보를 MCP를 통해서 가져오고 싶어. 챗봇이 진짜 검색 결과를 근거로 추천하도록 바꾸는 계획을 보여줘.
※ 이후 대화형 선택: 데이터 소스 → "네이버 지역 검색 API" 선택 → MCP 구성 → "직접 제작 (Recommended)" → API 키 → "아직 없음 (발급 안내 포함)" → Review → Submit → "Ready to code?"에서 1(auto 모드) 승인. 화면 구성은 실행 시점에 따라 다를 수 있으니 유사한 항목을 선택하면 됩니다.
8.3.3 연결하고 적용하기 — 네이버 API 키 등록 developers.naver.com
네이버 개발자 등록 (브라우저 — 사용자가 직접)
https://developers.naver.com → Application 등록
애플리케이션 이름 : ai-foodbot (자유)
사용 API : 검색
서비스 환경 : WEB
웹 서비스 URL : http://localhost:3200
.env에 키를 넣었다. 실검색 통합 테스트를 진행하고, 두 연결(Claude Code의 MCP 등록 + 웹 챗봇 서버 코드의 MCP 호출)이 모두 구성되었는지 확인해줘. 챗봇 화면에서 실제 검색 요청을 보낸 증거도 보여줘.
※ 이 로컬 MCP 서버는 실습용 — 10장에서 Vercel에 배포할 때는 Vercel 서버 기능이 네이버 API를 직접 호출하도록 바꿉니다.
8.3 느낌이 아니라 증거로 — 재시험 reviewer 재공격
reviewer 서브에이전트에게 8.2.4와 동일한 적대적 테스트를 다시 맡겨줘.
함정 질문 3종(비현실 조건, 주소·전화번호 확인 압박, 근거 추궁)을 실행 중인 챗봇에 보내고, 이전 테스트 결과와 비교해서 보고해줘.
특히 다음을 확인해줘:
- 추천된 가게가 실제 검색 결과에 근거하는가?
- 주소를 물었을 때 얼버무리지 않고 답하는가?
- 이전에 "할루시네이션 의심" 판정을 받았던 항목이 어떻게 달라졌는가?
사람의 최종 확인 — 8.1.7의 실패 예시 재시도
분당 서현역에서 일식집을 찾아줘.
※ 보고서도 AI의 판단이므로 단독 증거로 쓰지 않습니다 — 추천된 가게를 사람이 직접 네이버 지도에서 검색해 실재 여부를 확인해야 검증이 마무리됩니다.
8.4.2 [실습] 금고에 울타리 치기 — .env 보호 훅 PreToolUse · API 불필요
.env 파일을 보호하는 훅을 만들어줘.
## 요구 사항
- Claude Code가 .env 파일을 수정하거나 삭제하려고 하면, 행동 직전에 자동으로 차단해줘.
- 차단될 때 "이 파일은 훅으로 보호되고 있습니다"라는 메시지가 보이게 해줘.
- .env를 읽는 것까지 막을지는 나에게 물어보고 결정해줘.
## 완성 후
- 훅이 어느 파일에 어떻게 설정되었는지 보여주고, 쉬운 말로 설명해줘.
파괴 테스트 — 만든 자에게 울타리를 넘어 보라고 시키기
테스트로 .env에 주석 한 줄 추가해줘.
※ echo "# test" >> .env 시도 → 차단, tee를 이용한 우회 시도 → 역시 차단되는 것이 정상입니다. 진짜로 .env를 고쳐야 할 때는 사람이 메모장으로 직접 — "비밀의 금고는 사람만 여는 것". 훅 설정 확인·관리는 /hooks.
8.4.3 [실습] 작업실에 CCTV 달기 — 작업 기록 훅 PostToolUse
Claude Code의 작업을 자동 기록하는 훅을 추가해줘.
## 요구 사항
- 파일을 만들거나 수정할 때마다, 행동 직후에 logs/claude-work.log 파일에 한 줄씩 기록해줘.
- 각 기록에는 시각, 행한 행동(생성/수정), 대상 파일 이름을 포함해줘.
- 기록 자체가 작업을 느리게 하면 안 돼. 최대한 가볍게 만들어줘.
## 완성 후
- 테스트로 아무 파일이나 하나 수정해 보고, 로그에 기록이 남는지 증거를 보여줘.
확인 4종 (8.4.4)
확인 1: .env 수정을 시키면 차단되는가? (파괴 테스트)
확인 2: .env가 아닌 다른 파일의 수정은 평소처럼 되는가? (과잉 차단 아닌가)
확인 3: 파일을 수정할 때마다 logs/claude-work.log에 기록이 쌓이는가?
확인 4: 기록에 시각과 파일 이름이 포함되는가?
※ 확인 2가 의외로 중요합니다 — 울타리는 좁을수록 좋습니다. 모든 것을 막는 울타리는 감옥입니다. "딱 .env만" 막혀야 정상.
8.5.2 [실습] 하네스 키트 만들기 harness-kit 플러그인
이 프로젝트의 통제 장비들을 "harness-kit"라는 이름의 플러그인으로 묶어줘.
## 담을 것
- reviewer 서브에이전트 (.claude/agents/reviewer.md)
- .env 보호 훅
- 작업 기록 훅 (logs/claude-work.log 기록)
## 요구 사항
- 플러그인 폴더는 내 홈 폴더 아래 my-plugins/harness-kit에 만들어줘.
- 다른 프로젝트에서 설치해 쓸 수 있는 완전한 형태로 만들어줘.
## 완성 후
- 만들어진 폴더 구조를 보여주고, 각 파일이 무엇인지 쉬운 말로 설명해줘.
8.5.3 [실습] 새 프로젝트에 장착하기 plugin-test
새 프로젝트 폴더 (터미널)
mkdir plugin-test
cd plugin-test
claude
설치 — 가장 확실한 방법은 Claude Code에게 직접 묻기
내 홈 폴더의 my-plugins에 있는 harness-kit 플러그인을 이 프로젝트에 설치해줘. 마켓플레이스 등록이 필요하면 그 절차도 진행해줘.
장착 확인 (대화창)
/plugin
새 프로젝트 확인 3종
확인 1: "reviewer 서브에이전트가 있는지 확인해줘"
→ 새 프로젝트인데 reviewer가 있다고 답하는가?
확인 2: 이 폴더에 .env 파일을 하나 만든 뒤(메모장으로 직접),
"테스트로 .env에 주석 한 줄 추가해줘"
→ 8.4의 차단 장면이 여기서도 재현되는가?
확인 3: 아무 파일이나 수정을 시킨 뒤,
logs/claude-work.log가 생기고 기록이 남는가?
※ 셋 다 확인되면 — 다음 프로젝트의 첫 명령은 "harness-kit를 설치해줘"가 됩니다. 남이 만든 플러그인은 훅(자동 실행 장치)을 포함할 수 있으니 출처를 신뢰할 수 있는 것만 설치하세요.