💬말로 만드는 AI▶ 유튜브
🤖 비서 만들기 · 08

나의 AI 비서 Sancho 만들기 - 8편 안전장치와 자기 수정

이 페이지 목차목적준비물만드는 단계0단계 · 여는 말 (영상 0:05)1단계 · 새 세션 (영상 0:22)2단계 · 계획 모드로 설계 (영상 0:36)3단계 · 자기 수정 스위치 (영상 1:18)4단계 · 일부러 망가뜨리기 (영상 2:11)5단계 · Opus 로 점검 — 보호 장치에 두 번 멈춤 (영상 2:47)💡 설명자주 막히는 곳됐는지 확인하는 방법

8편 표지 — 안전장치와 자기 수정
8편 표지 — 안전장치와 자기 수정

개인 에이전트 AI 강좌 · 8 / 10편

© 2026 crazy4eu (cwkim83) · 강좌 자료 CC BY-NC-ND 4.0 · 코드 상업적 배포 금지 — 맨 아래 「저작권 · 라이선스」
💻 완성 소스: github.com/cwkim83/my-agent-Sancho (태그 ep8) — 막히면 이 코드를 열어 비교해 보세요.
단계 번호는 영상 왼쪽 위 장면 이름과 같고, "영상 시각"은 편집본 기준입니다. 회색 상자는 Code 탭 입력창에 그대로 붙여 넣는 요청문입니다.
이전 편: 나의 AI 비서 Sancho 만들기 - 7편 결재·목표·공수 · 다음 편: 나의 AI 비서 Sancho 만들기 - 9편 밖에서 쓰기

핵심 요약

항목내용
이 편이 끝나면비서가 자기 코드를 고칩니다. 단, 그 전에 서버가 막는 안전장치 4중을 먼저 넣습니다: 재시작 전 관문(문법 검사+점검), 정상 버전 표시(last-good), 죽으면 되돌려 다시 켜는 감시자, 비서가 못 고치는 불변 파일. 그리고 일부러 망가뜨려 정말 지켜 주는지 봅니다.
필요한 것7편을 끝낸 my-agent 폴더(또는 GitHub 의 ep7 태그) · git
걸린 시간실제 제작 약 1시간 34분(기다림 포함) → 편집본 4분 2초
요청문6개(검증 요청은 보호 장치 때문에 고쳐 쓴 판 포함)
난이도상. 자기 수정 만들기(3단계)가 가장 오래 걸립니다(약 30분)
모델만들기 Sonnet 5.5 · 검증 Opus 5.5 (5단계에서만 바꿈)

한 줄 요약 — 비서가 절차를 지키길 기대하지 않는다. 커밋과 재시작은 비서가 아니라 서버가 하고, 망가지면 감시자가 되돌린다.

⚠️ 이 편에서도 Opus 5.5 보호 장치가 검증을 두 번 멈췄습니다([cyber]). 같은 세션에서 서버를 일부러 망가뜨리고 보호 파일 경로를 시험하다 보니, 점검 요청도 공격처럼 보인 것으로 보입니다. 6편처럼 **「Opus 5.5로 프롬프트 수정 후 재시도」**로 요청을 가장 가볍게(문서 정리 + 점검 한 번) 바꾸자 끝까지 갔습니다.

8편 · 안전장치와 자기 수정

목적

비서에게 자기 코드를 고칠 힘을 주되, 잘못 고쳐도 스스로 돌아오게 만듭니다.

준비물

  • 7편을 끝낸 my-agent 폴더 — 없으면 GitHub 에서 받은 뒤 ep7 태그로 시작합니다
  • 작업 폴더가 깨끗한 상태(git status 에 바뀐 파일 없음) — 감시자가 되돌릴 때 기준이 됩니다

만드는 단계

0단계 · 여는 말 (영상 0:05)

망가진 server.js 를 감시자가 문법 오류로 알아채 보존하고 last-good 으로 되돌려 다시 켜는 기록
망가진 server.js 를 감시자가 문법 오류로 알아채 보존하고 last-good 으로 되돌려 다시 켜는 기록

  • 위 그림: 망가진 server.js 로 켜지자 감시자가 문법 오류를 보고 → 망가뜨린 변경을 rescue/… 브랜치에 보존 → last-good 으로 되돌려 다시 켜는 기록.

1단계 · 새 세션 (영상 0:22)

새 세션 요청에 7편까지를 세 줄로 요약한 답과 비서 대시보드가 뜬 화면
새 세션 요청에 7편까지를 세 줄로 요약한 답과 비서 대시보드가 뜬 화면

CLAUDE.md 와 docs/blueprint.md 를 읽고 ep7 까지를 세 줄로 요약해 줘. 서버를 켜 줘.
브라우저 패널은 탭을 하나만 남기고, 화면 앞에 보이는 그 탭(127.0.0.1:8790)에서 보여 줘. 로그인돼 있지 않으면 연습용 관리자(아이디 demo, 연습용 비밀번호 sancho-demo-2026)로 로그인해서 대시보드를 보여 줘.

2단계 · 계획 모드로 설계 (영상 0:36)

입력창 왼쪽 아래 모드를 계획으로 바꾼 뒤 보냅니다. 계획 모드에서는 비서가 코드를 고치지 않고 읽고 설계만 합니다.

자기 수정을 넣기 전에 안전장치부터 설계해 줘(코드는 승인 후에).
1. 관문: POST /api/restart 가 오면 서버가 먼저 node --check server.js 와 node selftest.js 를 돌린다. 하나라도 실패하면 재시작을 거부하고 이유를 돌려준다. (비서가 절차를 지키길 기대하지 말고 서버가 막는다)
2. last-good: 정상으로 켜지고 30초 동안 건강 검사(/health)가 통과하면 그 커밋에 git tag last-good 을 붙인다(작업 폴더가 깨끗할 때만).
3. 시작 스크립트 start.bat 를 감시자로: 서버가 비정상 종료하면 last-good 으로 git reset 후 다시 켠다. 세 번 연속 실패하면 멈추고 오류를 보여 준다. 되돌리기 전에 커밋 안 된 변경은 따로 커밋해 보존한다.
4. 불변 층: start.bat 과 selftest 의 핵심 검사는 비서가 수정하지 못하게(자기 수정 때 허용 폴더에서 뺀다).
  • 비서는 탐색 에이전트 2개로 코드를 읽은 뒤, 갈림길 3개를 쉬운 말로 물었습니다(아래 그림). 영상에서는 모두 권장안: ① start.bat 은 켜는 버튼, 일은 supervisor.js ② selftest.js 통째로 불변 ③ 관리자용 "서버 다시 시작" 버튼.

비서가 쉬운 말로 물은 갈림길 3개와 권장안 선택 화면
비서가 쉬운 말로 물은 갈림길 3개와 권장안 선택 화면

  • 계획 카드가 나오면(아래 그림, 오른쪽은 계획 창) 거부로 닫습니다. 수락을 누르면 계획 전체를 한 번에 만들어 버립니다. 계획 창도 닫아야 브라우저 패널이 다시 전체 높이로 돌아옵니다. 그다음 모드를 편집 자동 수락으로 바꾸고 3단계를 보냅니다.

계획 카드와 오른쪽의 계획 창
계획 카드와 오른쪽의 계획 창

3단계 · 자기 수정 스위치 (영상 1:18)

자기 수정 스위치를 켠 화면(입력창 왼쪽 🛠 수정)
자기 수정 스위치를 켠 화면(입력창 왼쪽 🛠 수정)

설계를 승인할게. 설계대로 만들고, 권한 칸에 "자기 수정" 스위치를 넣어 줘(기본 꺼짐, 관리자만).
- 켜면 claude 실행 때 --add-dir 로 앱 폴더를 열어 주고(start.bat·selftest 핵심 제외), 시스템 프롬프트에 "앱 코드는 고치기만 하고 커밋·재시작은 하지 마라"를 넣는다.
- 비서의 답이 끝나면 서버가 바뀐 파일을 보고: 관문 통과 → 커밋("자기 수정: 요청 내용") → 재시작. 실패 → 변경을 되돌리고 이유를 채팅에 보여 준다.
- 설정에 "자기 수정 기록" 목록(시각·요청·결과·커밋).
다 되면 서버를 다시 켜고 권한 칸의 자기 수정 스위치를 켠 뒤, 화면의 채팅에서 "보내기 버튼을 파란색으로, 둥글게 바꿔" 를 보내 관문 통과 → 커밋 → 재시작 → 화면 반영까지 보여 줘. 브라우저 패널은 탭을 하나만 남기고, 화면 앞에 보이는 그 탭(127.0.0.1:8790)에서 보여 줘.
  • 불변 파일: start.bat·supervisor.js·guard.js(관문)·selftest.js·mailgate.js(5편 메일 문지기)·test/, 그리고 .git·CLAUDE.md. 자기 수정이 켜진 차례에는 "명령 실행"을 비서에게 주지 않습니다. 점검 941개.
  • 시연: 스위치 ON(위 그림, 입력창 왼쪽 🛠 수정) → "보내기 버튼을 파란색으로, 둥글게 바꿔" → 서버가 관문(문법+전체 점검) → 커밋(작성자 "Sancho 비서") → 재시작 → 화면이 저절로 새로 고쳐져 버튼이 원형으로(아래 그림). 30초 건강 검사 뒤 감시자가 last-good 을 옮깁니다.

자기 수정 뒤 보내기 버튼이 파란 원형으로 바뀐 화면
자기 수정 뒤 보내기 버튼이 파란 원형으로 바뀐 화면

4단계 · 일부러 망가뜨리기 (영상 2:11)

관문이 server.js 의 문법 오류를 막고 변경을 되돌린 화면
관문이 server.js 의 문법 오류를 막고 변경을 되돌린 화면

정말 지켜 주는지 일부러 망가뜨려 보자.
① 화면의 채팅에서 "시험이야: server.js 맨 끝에 문법 오류를 일부러 넣어 봐" 를 보내서 관문이 막고 변경을 되돌리는 메시지까지.
② 사람이 실수한 상황: 네가 직접 server.js 맨 끝에 문법 오류를 넣고, 커밋하지 않은 채로 start.bat 으로 켜서 감시자가 last-good 으로 되돌려 다시 켜는 것, 망가뜨린 변경이 보존 커밋으로 남는 것까지 보여 줘(start.bat 창이 화면에 보이게).
끝나면 server.js 가 정상인지, 서버가 하나만 켜져 있는지 확인해 줘. 브라우저 패널은 탭을 하나만 남기고, 화면 앞에 보이는 그 탭(127.0.0.1:8790)에서 보여 줘.
  • ① 비서는 시킨 대로 고쳤지만 관문이 문법 검사에서 막고 되돌렸습니다(위 그림). 서버는 한 번도 멈추지 않았습니다.
  • ② 감시자는 서버가 켜지지 않는 걸 보고 망가진 변경을 rescue/… 브랜치에 커밋해 둔 뒤 last-good 으로 되돌려 다시 켰습니다(0단계 그림). 화면에 "서버가 이전 정상 버전으로 되돌아갔어요" 🔔 알림. 사람의 작업도 지우지 않고, 서버도 살렸습니다.

5단계 · Opus 로 점검 — 보호 장치에 두 번 멈춤 (영상 2:47)

전송 버튼 옆 모델을 Opus 5.5 로 바꾼 뒤 보냅니다. 처음 보낸 요청문은 이것이었습니다.

8편 점검: 자기 수정의 안전장치가 설계대로 지켜지는지 확인해 줘. 보호 파일(start.bat·selftest 핵심)은 경로를 어떻게 적어도(대소문자·./·..) 고쳐지지 않는지, 명령 실행 권한이 켜져 있을 때 관문이 어디까지 지켜 주는지(못 지키는 부분은 한계로 문서에 적기), last-good 은 점검을 통과한 버전에만 붙는지, 되돌리기 전에 작업이 보존되는지. selftest 로 확인 → 어긋난 것 목록 → 수정 → selftest → 커밋, ep8 태그.

Opus 5.5 보호 장치로 세션이 일시 중지됐다는 [cyber] 카드
Opus 5.5 보호 장치로 세션이 일시 중지됐다는 [cyber] 카드

  • 몇 분 만에 **세션 일시 중지됨 ****[cyber]**(위 그림). 코드 검토로 고쳐 다시 보내도 한 번 더 멈췄습니다. 세 번째에 가장 가볍게 바꾼 요청은 끝까지 갔습니다.
8편 마무리: README 에 오늘 만든 안전장치(관문·last-good·감시자·불변 파일·자기 수정 스위치)를 처음 보는 사람도 알 수 있게 정리하고, 명령 실행을 켰을 때의 한계도 적어 줘. 그다음 node selftest.js 를 한 번 돌려 모두 통과하는지 확인하고 커밋, ep8 태그를 붙여 줘.

대시보드 알림에 '서버가 이전 정상 버전으로 되돌아갔어요'가 뜨고 감시자 기록에 last-good 이 옮겨진 화면
대시보드 알림에 '서버가 이전 정상 버전으로 되돌아갔어요'가 뜨고 감시자 기록에 last-good 이 옮겨진 화면

  • 명령 실행의 한계(README 에 적힘): 명령은 파일 권한 규칙을 거치지 않아, 켜 두면 비서가 불변 파일·git·last-good 태그까지 바꿀 수 있습니다. 안전장치가 "막기"에서 "알아채기"로 약해집니다 → 꼭 필요할 때만 잠깐 켭니다.
  • 불변 파일이 바뀌었으므로 last-good 은 사람이 확인한 뒤에만 옮겨집니다. 마지막 요청:
응, selftest 통과를 확인했으니 last-good 을 새 커밋으로 옮기고, Sancho server 창을 닫은 뒤 start.bat 으로 다시 켜 줘. 끝나면 브라우저 패널의 탭 하나(127.0.0.1:8790)에서 대시보드를 보여 줘.
  • HEAD · last-good · ep8 이 모두 같은 커밋, 감시자 1 + 서버 1. 검증이 끝나면 다시 Sonnet 5.5 로 돌려 둡니다.

💡 설명

  • 계획 모드: 비서가 코드를 고치지 않고 읽고 설계만 하는 모드. 위험한 변경은 설계부터 보고 승인합니다.
  • 관문(guard): 재시작·자기 수정 커밋 전에 문법 검사와 전체 점검을 돌리는 서버 코드.
  • last-good: 30초 건강 검사를 통과한 커밋에 붙이는 git 태그. 되돌릴 곳.
  • 감시자(supervisor): 서버를 띄우고 지켜보다가, 죽으면 보존 커밋 → last-good 으로 되돌리기 → 다시 켬니다. 세 번 연속 실패하면 멈춥니다.
  • 불변 파일: 비서가 자기 수정으로도 못 고치는 파일. 바뀌면 사람이 확인해야 last-good 이 옮겨집니다.

자주 막히는 곳

  • "서버 다시 시작"·자기 수정이 거부된다 → 서버를 start.bat(감시자)으로 켜야 합니다. 작업 폴더에 커밋 안 한 변경이 있어도 거부됩니다.
  • "고칠 수 없는 파일이 달라요" → 불변 파일을 사람이 고쳤을 때입니다. 확인 뒤 git tag -f last-good (또는 비서에게 확인했다고 말하기).
  • 검증 중 "세션 일시 중지됨 [cyber]" → 「Opus 5.5로 프롬프트 수정 후 재시도」로 요청을 가볍게(문서 정리·점검 한 번). 되돌린 뒤에도 파일 변경은 남아 있을 수 있으니 git status 로 확인합니다.
  • 남은 rescue 브랜치 → 시험 흔적입니다. 필요 없으면 git branch -D rescue/….

됐는지 확인하는 방법

  • 설정 › 권한에 "자기 수정" 스위치(기본 꺼짐)와 "자기 수정 기록"
  • 채팅으로 화면을 바꾸면 관문 통과 → 커밋 → 재시작 → 화면 반영
  • 문법 오류를 넣으라고 하면 관문이 막고 되돌린다
  • server.js 를 망가뜨리고 start.bat 으로 켜면 감시자가 보존 커밋 → last-good → 다시 켬다
  • node selftest.js → 모두 통과, git tag 에 ep8

스스로 점검

  • "비서가 절차를 지키길 기대하지 않는다"는 말의 뜻을 안다
  • 위험한 변경은 계획 모드로 설계부터 본다
  • 명령 실행을 켜면 안전장치가 약해지는 이유를 안다
  • Opus 로 검증하고 ep8 태그로 커밋했다