💬말로 만드는 AI▶ 유튜브
🗂️ 뒷이야기 · 17

17 일하는 방식 — 규칙과 함정 모음

이 페이지 목차목적만든 순서1 · 숫자는 코드가 진실이다 (8/6 → 9/16)2 · 규칙을 문서로 박은 날 — CLAUDE.md (9/16)3 · 커밋 메시지 = 왜 + 어떻게 발견했나4 · 고장은 재발 방지까지 (9/15 · 9/16)5 · 한글 쓰면 죽는 자리 일곱 (9/19 ~ 10/3)6 · PowerShell 5.1에는 &&가 없다 (9/18 ~ 10/8)7 · 조용히 죽는 고장은 실물에서 숫자를 찍어야 잡힌다 (9/22 · 9/26)8 · 충돌 해소와 push를 잇지 마라 (9/26 ~ 10/2)9 · 싼 모델이 짓고 센 모델이 검증 · 승인되면 끝까지 (10/1 · 10/8)10 · 코드 밖에서 죽이는 것들 — 보안 프로그램과 앱 업데이트 (9/10 · 9/21)💡 설명함정과 배운 것출처

뒷이야기 · 17 / 17단계 · 2026-08-06 ~ 10-08 · 갈래 규칙
이전 단계: 16 가르치기 — 발표와 강좌

핵심 요약

항목내용
이 단계에서 한 일같은 실수를 두 번 하지 않으려고 적어 둔 규칙과 함정 열 가지를 모았다. 규칙은 세 곳에 나뉘어 있다. 저장소 규칙 문서(CLAUDE.md), 시험(selftest의 불변식), 기억 노트다.
기간2026-08-06 ~ 10-08 (숫자 어긋남이 처음 적힌 날 → 오늘)
규모규칙 문서 CLAUDE.md 커밋 2개(9/16 · 9/17). 첫 규칙 문서 커밋부터 HEAD 9658d20까지 파이스 저장소 커밋 226개(그 커밋 포함). 기억 노트 파일 70개(목차 포함). 모두 직접 센 값(checks.md)
다룬 도구CLAUDE.md · git · selftest · PowerShell 5.1 · Git Bash · NFC/NFD(한글 정규화) · Opus · Sonnet · ponytail
결과문서 숫자가 코드와 어긋나 있던 41일 → 문서에서 숫자를 뺌. 파이스 자동 커밋을 뺀 커밋 중 본문이 있는 비율 75% → 94%. 한글이 죽이는 자리와 조용히 죽는 고장은 하나씩 시험으로 바뀜
공개 범위사내(로그인 뒤) — 🔒 항목은 넣지 않음

한 줄 요약 — 같은 실수를 막는 방법은 규칙을 한 줄 더 적는 것이 아니라 그 실수를 검사로 바꾸는 것이었다.

17단계 · 일하는 방식 — 규칙과 함정 모음

목적

파이스는 자기 코드를 고치는 에이전트다. 아침에 없던 커밋이 저녁에 생겨 있고, 사람과 파이스와 다른 세션이 같은 저장소에 올린다. 그래서 일하는 규칙이 대화 속에만 있으면 세션마다 새로 판단하게 된다. 아래 열 가지는 하나씩 당하고 나서 적은 것이다. 먼저 규칙·검사·기록 가운데 어디에 적을지 가렸고, 가능하면 검사로 바꿨다.

만든 순서

1 · 숫자는 코드가 진실이다 (8/6 → 9/16)

설계 문서 ARCHITECTURE.md에 「도구 41종」이 8/6 01:57에 적혔다. 그날 저녁 코드는 47종이었고, 그 문장은 9/16 09:04까지 41일 7시간 남았다.

  • 왜 문제인가: 파이스는 이 문서를 읽고 자기수정의 근거로 삼는다. 틀린 숫자는 틀린 전제가 된다.
  • 고친 것: 9/16 09:04 커밋(37521c4)이 문서에서 도구·능력 수를 뺐다. 커밋 메시지는 「41종·9종이라 적고 있었는데 실제는 66종·12종」이라 썼고, 부모 커밋을 직접 세면 67종·12종이다(1 어긋나는 이유는 확인 못 함). 규칙 문서에는 「도구 수는 toolSchemas.length, 능력은 CAPABILITIES의 키」라고 적었다.
  • 오늘 센 값: HEAD(지금 가장 끝 커밋) 9658d20을 임시 폴더에 풀어 불러오면 도구 72 · 능력 12 · 기본 ON 1(files_workspace)이다. 이 PC·빈 설정 기준이다.
  • 규칙 문서도 같은 병이다: CLAUDE.md가 「tools.js 149KB, app.js 1,900줄」이라 적은 파일이 지금은 205,439바이트·1,965줄이다. 숫자를 박으면 반드시 뒤처진다는 규칙이 박은 숫자 때문에 증명됐다.

2 · 규칙을 문서로 박은 날 — CLAUDE.md (9/16)

09:43에 저장소 규칙 문서(60줄)를 커밋했다(905f3d9). 9/17 17:53에 본체가 맥북에서 맥미니로 바뀐 것과 포트 함정을 고쳐 적었다(74f0120). 커밋은 둘이다.

  • 왜: 규칙이 대화 속에만 있어서 세션마다 커밋 형식 · 푸시 대상 · 셀프체크 범위를 새로 판단했다. 기억 노트는 「무슨 일이 있었나」의 기록이지 「어떻게 일하라」의 규칙이 아니라, 그 층이 비어 있었다.
  • 담은 것: 본체는 맥(9/17 고침부터 맥미니)이고 이 PC는 작업 사본이라는 전제 · 파이스가 스스로 커밋하니 푸시 전에 git fetch · 숫자를 문서에 박지 않기 · 브랜치 없이 main에 직접 · 고장은 재발 방지까지 · 겪어서 아는 함정 · 토큰 규칙 · 세션을 끝낼 때 「기억에 남길까요?」 묻기.
  • 겪어서 아는 함정: 파이스 본체는 포트 8787이고 8788은 감시기라, 8788로 API를 때리면 라우트가 전부 404가 된다(9/17에 실제로 헛짚었다). src/tools.js는 BOM·NUL 때문에 grep이 binary로 판정하니 grep -a를 쓴다. launchd 설정 파일을 고치면 kickstart -k로는 안 읽힌다(bootout 뒤 bootstrap). 파이스가 자기를 bootout하면 안 살아난다(재시작은 kickstart -k만). 구글 인증 진행 중에는 재시작하지 않는다. 비대화형 zsh에는 /usr/local/bin이 없다.
  • 토큰 규칙: 9/3에 한 건 처리에 5시간 한도가 10%대 닳은 일에서 나왔다. 스크린샷은 가장 비싸서 DOM·스타일을 텍스트로 뽑고, 전체 selftest는 커밋 직전 1회만 돌리며, 큰 파일은 grep으로 줄번호부터 찾는다.

3 · 커밋 메시지 = 왜 + 어떻게 발견했나

규칙 문서는 커밋 메시지를 「한국어로, 왜 그랬는지와 어떻게 발견했는지」 남기라고 한다. 다음 사람(과 파이스)이 같은 함정을 피하는 유일한 방법이기 때문이다.

  • 예: 849fe3f는 3단계 시험지를 밤 채점에 붙이고 손으로 돌렸더니 46/49가 나와서 거슬러 올라간 과정을 적었다. 7ce568a는 주간 점검에서 파이스 커밋 둘을 읽다가 제목에 없는 70줄이 섞인 것을 발견한 경위를 적었다. 643ebbf는 b68~b77을 열 번 올리는 동안 판 번호가 그대로였다는 증상에서 시작한다.
  • 측정: 규칙 문서 시점(9/16 09:43) 앞뒤로, 작성자가 PAIS인 자동 커밋을 뺀 커밋을 나눠 셌다. 이 커밋들도 대부분 Claude 세션이 사람 계정으로 쓴 것이다(Claude 공동 저자 표시가 앞 400개 중 292개, 뒤 221개 중 205개). 본문이 있는 커밋은 400개 중 300개(75%) → 221개 중 207개(94%). 전체 커밋에서 「어떻게 발견·찾았」이라는 말이 든 것은 469개 중 0개 → 226개 중 26개다. 낱말 몇 개로 센 대리 지표라 규칙 문서만의 효과라고 단정할 수 없다.

4 · 고장은 재발 방지까지 (9/15 · 9/16)

증상만 고치고 끝내지 않는다. 특히 조용히 죽는 고장은 selftest에 불변식(안 바뀌어야 하는 규칙)을 박는다.

  • 능력 이름 오타: 감시자 등록 도구 둘이 can('schedules')를 검사했는데 CAPABILITIES에는 scheduler뿐이었다. 없는 키는 늘 거짓이라 무슨 권한을 켜도 거부됐다. 오류 메시지는 설정 화면에 없는 schedules를 켜라고 안내했고, 목록 도구는 게이트(권한 검사 문)가 없어 목록만 보여서 겉으로는 「감시자가 있는데 새로 안 만들어진다」로 나타났다. 9/16 09:22(2b96225)에 이름을 고치고, tools.js의 can()·deny() 인자를 전부 긁어 CAPABILITIES에 있는 키인지 selftest가 보게 했다. 현재 12종이 모두 실재한다.
  • 확산 점검: 9/12에 한 스크립트의 로그 열기를 'w' → 'a'로 고쳤는데 9/14에 다른 스크립트에서 똑같은 버그를 또 고쳤다. 「고칠 땐 호출부를 전부 grep한다」는 규칙은 이미 있었다. 프롬프트에 한 줄 더 적는 것은 소용이 없다고 보고, 자기수정이 끝나는 순간 같은 코드가 다른 파일에 남았는지 스스로 grep하는 검사(src/spread_check.js)로 바꿨다(9/15 08:35 · 08:38, 둘 다 작성자 PAIS). 최근 커밋 26건에 돌려 1건만 보고했고 그 1건이 정확히 그 버그였다(오탐 0, 코드 주석의 기록).
  • 같은 날 따라온 사고: 능력 오타를 고친 같은 커밋(2b96225)에 작업 폴더의 음성·영상 파일 16개(33,442,480바이트)가 딸려 들어갔다. 같은 날 15:55에 파이스가 스스로 .gitignore에 미디어 확장자를 넣고(c345d92), 같은 시각 커밋(569d0ad)에서 16개가 저장소에서 빠졌다. 기록에는 남아 있다. 파이스의 자기수정 커밋도 9/26에 같은 병이 있었다. 바뀐 파일을 전부 올리는 git add -A 때문에 남의 작업 중 변경이 섞였고, 고친 파일만 올리게 바꾸고 selftest가 add -A를 보게 했다(7ce568a).
failure loop · 크게 보기 ↗

5 · 한글 쓰면 죽는 자리 일곱 (9/19 ~ 10/3)

이 저장소는 변수·함수·주석을 한국어로 쓴다. 그런데 아스키(영문·숫자)만 받는 자리가 있다. 이름은 사람이 읽는 것이 아니라 기계가 파싱하는 것이라 한국어 이름의 이점이 없다.

  • 일곱 자리: ① Firestore(플랫폼 데이터베이스) 필드 경로(컬렉션마다 400 오류) ② R2(클라우드 파일 저장소)·게이트웨이 열쇠(400) ③ POSIX sh 변수 이름(조용히 빈 값, 또는 루프가 통째로 안 돎) ④ Firestore 보안 규칙 필드(규칙 전체 컴파일 실패) ⑤ PowerShell .ps1 파일 전체(BOM 없는 UTF-8을 ANSI로 읽어 파일 전체가 파싱 실패, 9/21) ⑥ 자바스크립트 정규식 \b(한글은 낱말 글자가 아니라 아무 데도 안 걸린다, 9/22) ⑦ MCP 도구 칸 이름(Anthropic API가 ^[a-zA-Z0-9_.-]{1,64}$ 밖이면 도구를 통째로 뺀다, 9/25).
  • 가장 조용한 것: ⑥은 「질의가 표를 몇 개 건드리나」를 세는 안전장치였는데 늘 0이 나와 한 번도 안 돌았다. ⑦은 규격 검색·표 질의가 claude.ai에서 9/22~25 내내 안 돌았다. 직접 호출로 잰 길과 사람이 쓰는 길이 달라서 잡히지 않았고, 연결해 보니 「제외된 도구」로 떠서 알았다.
  • 고친 방식: 밖으로 나가는 이름은 영문으로 짓고 사람이 읽을 이름은 기록이나 주석에 남긴다. 한글 이름은 \b 대신 includes나 앞뒤 조건으로 찾는다. 이름 검사는 MCP selftest에 들어갔다(src/mcp.js의 아스키 검사). 사람에게 건네는 .ps1은 일부러 아스키로만 썼다(tools/remove-kr-sec.ps1에는 한글이 0바이트다).
  • 곁가지 — 한글 정규화(NFC/NFD): 맥에서 만든 경로와 파일 이름은 한글이 분해형(NFD)이다. 조합형으로 쓴 정규식·includes가 조용히 안 걸려 남의 개인 자료가 나올 뻔했다(9/25). 반대로 맥의 NAS 마운트는 NFD로만 열어서 도면 카드 5.6만 장(22%)이 「원본 없음」이었다(10/1, c5c15ad). 비교는 NFC로, 열기는 디스크가 아는 꼴로 한다. 다만 정규화를 범인으로 단정하면 틀린다. 10/3 새벽 카드 요약이 밤마다 25만 장을 건너뛴 것을 이 탓으로 보고 고쳤지만(849fe3f) 낫지 않았다. 같은 날 오전에 찾은 진짜 원인은 폴더째 옮겨진 카드 하나를 「공유가 끊겼다」로 친 것이었다(1b18116).
  • 오늘 이 PC에서 다시 확인한 것: /\bH04\b/는 true, /\b표04\b/는 false다. 「한글」은 NFC로 길이 2, NFD로 6이고 서로 같지 않다. Git Bash에서 날=2026은 「command not found」로 죽는다.
  • 그래도 또 걸린다: 9/24에 날=$(…)로 날짜를 담았더니 루프가 한 번도 안 돌고 끝났는데 종료 코드는 0이었다. 9/28에는 한글 변수 때문에 뒤의 && 줄이 안 돌고 뒤의 ; 시험만 돌아 통과처럼 보였다. 이 문서를 읽고도 걸린다. 새 자리에서 걸리면 한 줄 더 적는다.

6 · PowerShell 5.1에는 &&가 없다 (9/18 ~ 10/8)

사용자가 실제로 치는 터미널은 Windows PowerShell 5.1이고 &&가 없다. cd X && node y를 건네면 구문 오류로 죽는다.

  • 같은 실수를 두 번 했다: 9/18(스크린샷 명령)과 9/19(platform-count.mjs). Bash로 작업하는 쪽(Claude)이 습관적으로 cd … && …로 건넨 것이다.
  • 고친 방식: 사용자에게 건네는 줄은 cd 없이 스크립트 절대경로 한 줄로, 여러 단계면 코드 블록 하나에 명령 하나씩 나눠 건넨다. 작업하는 쪽이 직접 돌릴 때는 &&를 써도 된다.
  • ssh와 따옴표: PowerShell 5.1은 외부 프로그램에 넘기는 인자 속 큰따옴표를 벗긴다. ssh 맥 'grep -E "a|b"'(맥 = 본체로 가는 ssh 별칭)가 원격에서 grep -E a|b가 돼 파이프로 쪼개진다(9/28). 긴 스크립트는 표준입력으로 흘렸다.
  • 그런데 표준입력도 한글에 약하다: 10/3에 Get-Content x.sh | ssh 맥 'bash -s'로 흘린 스크립트의 한글 인자 --연습이 깨져 연습이 아니라 진짜 실행으로 돌았다. 로그에 「연습 ·」이 없어서 알았다. 한글이 든 스크립트·인자는 scp로 보낸 뒤 ssh 맥 'bash 파일'로 돌린다.
  • 같은 종류: claude -p '…"검색어"…'도 큰따옴표가 벗겨져 검색어가 줄었다. git commit -F -에 here-string(여러 줄 글을 통째로 넘기는 PowerShell 문법)을 파이프하면 메시지 줄이 pathspec(커밋할 파일 이름 자리)으로 들어가 커밋이 안 되고 push는 「up-to-date」로 조용히 지나갔다(9/29).
  • 10/8: 백그라운드 작업 4개가 「실행 중」으로 남은 것을 발견했다(10/2~10/7). 서브에이전트가 python3 - <<EOF를 써서 입력을 영영 기다렸다. 원인으로 Microsoft Store 가짜 실행 파일을 의심했으나 오늘 확인하니 python3는 설치 관리자 바로가기를 가리켰다. 원인은 확인 못 함. 정리할 때 python을 먼저 죽이면 || 뒤의 node 패치가 며칠 늦게 지금 파일에 실행되므로 그 명령을 품은 bash를 안쪽부터 끝낸다.

7 · 조용히 죽는 고장은 실물에서 숫자를 찍어야 잡힌다 (9/22 · 9/26)

9/22 하루에 조용히 죽어 있던 고장 넷을 찾았다. 넷 다 사용자 눈에는 「AI가 좀 멍청해졌다」로만 보였고 오류도 경고도 한 줄 안 났다. 추측으로 잡힌 것은 하나도 없다.

  • 게이트웨이가 기록 색인을 안 봄(나흘): 맥이 대답하면 그 자리에서 돌려보내서, 9/19에 규격 문서를 맥으로 옮긴 뒤 클라우드 색인에 남은 기록(NCR·CAR 등 44조각)이 한 번도 안 읽혔다. 문턱을 「맥 목록의 꼴찌 점수」로 잡았다가 그 목록이 하이브리드 순위라 자리 순서가 점수 순서가 아니라는 것을 몰라 한 판을 날렸다. 진단 값을 응답에 남기고서야 보였다(d3477c4, 9/22 13:30).
  • 화면 판 번호가 b67에 멈춤(배포 열 번): b68~b77을 열 번 올리는 동안 index.html의 MESSENGER_BUILD가 b67 그대로라 iframe 주소가 안 바뀌었고, 캐시와 서비스워커가 옛 껍데기를 내줬다. 판 번호가 네 곳에 적혀 있어 사람 기억으로는 또 어긋난다. 네 곳이 같은 값인지 보는 검사를 만들었다(643ebbf, 9/22 14:25).
  • 지침이 지어내라고 시킴: 「어느 화면에서 무엇을 하면 되는지 짚어 준다」는 줄이 있었다. 모델은 화면 이름만 알고 버튼·차례는 모르니 지어낼 수밖에 없었다. 화살표 금지를 두 번 얹어도 안 먹혔고 지침 전문을 찍어 보고서야 원인을 찾았다(fb53031, 9/22 11:36).
  • 볼트 카드가 코드북 조각을 밀어냄: 맥에서 조각 찾기를 직접 돌려 순위와 점수를 보고서야 알았다.
  • 9/26 하나 더: 맥에서만 깨진 셀프체크가 자동 되돌리기용 last-good 갱신을 하루 넘게 멈췄다. 옛 .hwp 기대값이 PC 답이었는데 PC에서만 돌려 보고 통과라고 믿었다. 밤 채점이 이제 맥에서 selftest를 돌려 실패한 모듈 이름까지 본다. 맥 zsh에는 timeout이 없어서 timeout 60 find …가 조용히 아무것도 안 돈 일이 두 번 있었다.

8 · 충돌 해소와 push를 잇지 마라 (9/26 ~ 10/2)

플랫폼의 main은 push 즉시 직원 화면이 된다. 해소가 실패했는데 push가 이어지면 전사가 깨진다.

  • 9/26: 다른 세션이 같은 시간에 올린 커밋과 index.html의 판 번호 줄에서 rebase 충돌이 났다. 해소를 node heredoc(명령 안에 스크립트를 통째로 적어 넘기는 셸 문법)으로 했는데 셸이 \n의 역슬래시를 먹어 스크립트가 실패했고, 같은 Bash 호출의 다음 줄 git add … && git rebase --continue … && git push가 그대로 돌았다. 충돌 표시(<<<<<<< ======= >>>>>>>)가 남은 index.html이 배포됐고, npm test는 그 줄을 안 봐서 통과했다. 충돌 표시가 들어간 커밋 fbcf45d는 14:33에 쓰고 14:43:50에 rebase로 다시 붙었고, 걷어낸 커밋 511f68c가 14:45:22다(커밋 사이 1분 32초). 배포가 반영되는 시간까지 더해 기록에는 플랫폼이 3~4분 깨져 있었다고 남아 있다.
  • 고친 방식: 해소 → grep -c '^<<<<<<<'로 0 확인 → 그다음 따로 add·continue·push. 한 호출에 heredoc과 push를 줄로 잇지 않는다. 시험(test/read-meter.test.mjs)이 index.html의 충돌 표시를 잡게 했다.
  • 9/28 두 번째: npm test > log; echo exit=$?; git commit …; git push에서 exit=1이 찍혔는데 다음 줄이 그대로 돌아 올라갔다. 실패는 다른 사람의 커밋이 넣은 것이었지만 그 명령이 멈췄어야 했다. push 앞에 시험 결과로 멈추는 줄을 둔다.
  • 10/2 세 번째: push가 non-fast-forward(원격에 내가 모르는 커밋이 먼저 들어와 있음)로 거절됐는데(다른 사람의 자동 커밋이 먼저 들어옴) 같은 줄의 npm run site가 돌아, 그 커밋이 빠진 HEAD로 사이트를 지었다. fetch로 앞선 커밋이 보이면 먼저 rebase하고, push는 혼자 돌려 성공을 확인한 다음 배포한다.
  • 갈래를 나눠 고칠 때는 worktree를 쓰되 지울 때 순서가 중요하다. 연결(node_modules junction, 다른 폴더를 가리키는 윈도우 바로가기 폴더)부터 끊고 git worktree remove를 해야 원본 node_modules까지 지워지지 않는다.

9 · 싼 모델이 짓고 센 모델이 검증 · 승인되면 끝까지 (10/1 · 10/8)

일하는 방식 규칙도 둘 적었다.

  • 작업 방식부터 묻기(10/1): 로드맵의 새 단계를 코드로 짓기 전에 「Sonnet 5.5로 짓고 Opus 5.5로 검증할까요, 제가 바로 할까요」를 한 줄로 먼저 묻는다. 10/1에 1-1·1-6을 묻지 않고 지었더니 모델을 나눠 쓰는 흐름을 원했다는 말이 나왔다. 조사·실측·계획까지는 먼저 해도 된다.
  • 실제 분포: 강좌 시연 앱 55개 커밋 중 Sonnet 5.5 공동 저자가 37개, Opus 5.5가 15개다. 같은 날 로드맵 저장소의 1-3 커밋은 「Sonnet 짓고 Opus 검토(고침 셋)」로 남았다(dec6e61).
  • 끝까지 알아서(10/8): 계획이 승인되면 중간에 「다음에 이걸 하겠습니다」 하고 턴을 끝내거나 확인을 구하지 않는다. 백그라운드 에이전트를 띄우고 상태만 말하고 멈췄다가 묻지 말고 알아서 진행하라는 말을 들었다. 기다리는 동안 겹치지 않는 일을 미리 하고, 돈 · 공개 · 외부 게시 · 되돌릴 수 없는 일만 묻는다. 작업 방식을 묻는 것은 새 단계를 처음 시작할 때 한 번뿐이다.

10 · 코드 밖에서 죽이는 것들 — 보안 프로그램과 앱 업데이트 (9/10 · 9/21)

이 저장소의 코드가 아닌 환경이 프로그램을 죽인 두 건이다.

  • 공공기관 보안 프로그램(9/21): 공공기관 사이트에 잠깐 들어갔더니 그때부터 크롬과 Aside가 계속 튕겼다. 이벤트 로그가 0xc0000409(프로그램이 위험한 상태를 보고 스스로 끝낼 때 남는 윈도우 코드 — 이번엔 크로미움이 허용되지 않은 호출을 잡은 것)를 남겼다. 사이트가 접속만으로 자동으로 까는 키보드 보안 프로그램이 브라우저가 쓰는 윈도우 DLL(USER32)에 후킹(남의 프로그램 호출을 가로채 끼어드는 것)을 걸어서 생긴 일이다. 16:11 설치 폴더 생성 → 16:18 크래시 시작 → 16:20 서비스 기동으로 확정했다. 전부 서명이 유효한 정상 제품이라 악성코드가 아니다. 지우는 스크립트(tools/remove-kr-sec.ps1, 15bf5d1)를 쓰고 크래시는 제거 전 39분에 10건 → 0건이 됐다. 지워도 손해는 없다(다시 들어가면 알아서 깔린다). 공동인증서 관리 프로그램은 같은 회사 제품이라 헷갈리기 쉬우니 지우면 안 된다.
  • 데스크톱 앱 자동 업데이트 직후(9/10): PC가 47시간 켜져 있던 날 07:55에 앱이 자동 업데이트됐고, 같은 초(07:55:29)에 밀린 예약 3개가 한꺼번에 발사됐다. 세 세션이 도구 호출 중간에서 끊겼고 질문이 전부 실패하다가 08:25 재부팅으로만 풀렸다. 네트워크는 멀쩡했다(원인은 로컬 앱 상태). 앱 재시작 때 놓친 예약을 몰아서 실행하고 그것을 막는 옵션은 없다. 처방은 같은 일을 하는 예약을 겹치지 않게 합치는 것이었다. 같은 날 13:29 커밋은 폐기한 메일 예약 3개가 하던 라벨 분류를 파이스가 이어받게 했다(ae9af7f). 지금 예약 목록은 9개 중 반복 예약이 1개다.
  • 진단 위치: 서비스 상세 로그(ProgramData\Claude\Logs\cowork-service.log) · Application 로그(CoworkVMService) · System 로그 · 세션 기록(.claude\projects\…\*.jsonl, 수십 MB라 스트리밍으로 읽는다).
  • 이 서비스는 죽으면 재부팅 전까지 안 살아난다는 경고가 매번 뜬다. 같은 증상이 또 나면 여기를 먼저 본다.

💡 설명

  • 불변식: 어떤 수정이 있어도 안 바뀌어야 하는 규칙. selftest가 매번 확인한다.
  • selftest(셀프체크): 모듈마다 스스로 시험을 돌려 보는 프로그램. 통과해야 커밋하고, 통과한 버전만 마지막 정상(last-good)이 된다.
  • BOM: 파일 맨 앞에 붙는 글자 인코딩 표시. PowerShell 5.1은 이것이 없으면 UTF-8을 ANSI로 읽는다.
  • NFC / NFD: 한글의 두 저장 꼴. NFC는 「한」이 글자 하나, NFD는 자음·모음으로 쪼갠 꼴이다. 맥은 파일 이름을 NFD로 둔다. 보기엔 같아도 비교하면 다르다.
  • 정규식 \b: 낱말 경계를 뜻하는 표시. 영문·숫자만 낱말 글자로 보고 한글은 보지 않는다.
  • rebase / 충돌 표시: 자기 커밋을 다른 사람의 커밋 위로 옮기는 일. 같은 줄을 둘 다 고쳤으면 <<<<<<< 표시가 파일 안에 남는다.
  • worktree: 한 저장소를 폴더 여러 곳에 동시에 펼치는 git 기능. 갈래마다 따로 작업할 때 쓴다.
  • launchd / bootout: 맥이 프로그램을 켜 두고 지키는 장치와 그것을 내리는 명령. 설정 파일을 고치면 내렸다가 다시 올려야 읽는다.
  • 서비스워커: 브라우저가 옛 화면 파일을 붙들고 내주는 장치. 화면을 고쳤는데 그대로면 이것부터 의심한다.
  • 오탐: 문제가 아닌데 문제라고 알리는 것. 검사의 신뢰도를 재는 기준이다.
  • 서브에이전트: 큰 일을 나눠 맡기려고 따로 띄우는 보조 AI.

함정과 배운 것

  • 문서에 숫자를 박지 않는다: 코드를 불러와 센다. 규칙 문서도 예외가 아니다.
  • 조용히 죽는 것은 소리 나게 만든다: 같은 실수는 규칙 한 줄이 아니라 검사로 바꾼다(확산 점검 · 능력 이름 검사 · 판 번호 네 곳 검사 · 충돌 표시 검사).
  • 한글 이름이 들어가는 자리를 먼저 의심한다: 필드 경로 · 열쇠 · 셸 변수 · 보안 규칙 · .ps1 · \b · MCP 도구 이름 · NFC/NFD. 비교는 NFC, 열기는 디스크가 아는 꼴.
  • 명령 한 줄이 끝까지 이어지는지 본다: &&와 ;는 다르고, heredoc이 실패해도 다음 줄은 돈다. push와 배포 앞에는 결과로 멈추는 줄을 둔다.
  • 직접 잰 길과 사람이 쓰는 길을 같게 한다: 직접 호출로 잰 값은 실제 쓰임과 다를 수 있다(MCP 도구 이름 · 맥에서만 깨진 셀프체크).
  • 확인 명령 자체를 먼저 의심한다: 명령이 로컬 저장소를 보고 「없다」고 답하는 경우가 있다(Wrangler r2 object get에는 --remote가 필요했다). curl -s는 502에도 성공하므로 curl -f. launchd 주기형은 PID가 없는 것이 정상이다.
  • 코드 밖의 환경도 의심 목록에 둔다: 같은 증상이 앱을 바꿔도 나오면 보안 프로그램, 업데이트 직후면 앱 상태를 본다.
  • 「고쳤는데 그대로다」면 전달을 먼저 본다: 서비스워커와 판 번호가 코드보다 먼저다.
  • 끝낸 뒤 남은 것을 본다: 백그라운드 작업이 「실행 중」으로 남아 있지 않은지, git status가 깨끗한지 확인한다.

출처

  • 커밋(저장소 pais_project): 67df8cd · 37521c4 · 905f3d9 · 74f0120 · 2b96225 · c345d92 · 569d0ad · 86b0710 · de91b0d · 7ce568a · 849fe3f · 1b18116 · c5c15ad · c4c120e(MCP 이름 검사) · 15bf5d1 · ae9af7f
  • 커밋(플랫폼 저장소 sejong-platform-v2): fb53031 · d3477c4 · 643ebbf · fbcf45d · 511f68c
  • 커밋(로드맵 저장소 making-ai): 5d38acb · dec6e61
  • 파일: CLAUDE.md · ARCHITECTURE.md · selftest.js · src/spread_check.js · src/mcp.js · tools/remove-kr-sec.ps1 · test/read-meter.test.mjs(플랫폼)
  • 기억 노트: ascii-only-places · powershell-no-ampersand · silent-failure-hunting · kr-gov-security-plugins · claude-desktop-pc · ask-delegation-before-build · merge-push-trap · feedback-carry-through · pais-token-budget · weekly-code-review
  • 숫자를 센 명령과 결과: 같은 폴더 checks.md

← 16 가르치기 — 발표와 강좌