← 목록
기타 2026-06-09 5KB 읽기 5분

크라우니 슬래시 스킬 멈춤(hang) 진단 및 수정

개요

사용자 증상: "/크라우니코드 등으로 작업시키면 한참 멈췄다가 ESC를 눌러야 진행됨. 스킬이 작동 안 하는 것 아닌가?"

결론: 스킬 자체는 정상 로드됨. 멈춤의 원인은 스킬의 세션 시작 프로토콜이 호출하는 crownycode-enforce.sh status관성측정.sh 안의 full-home find였다.

무엇을 했는지

  1. /크라우니코드 스킬 호출 → 마크다운 정상 로드 확인 (스킬 자체 이상 없음)
  2. 스킬이 시키는 명령들에 perl alarm 워치독을 걸고 멈춤 측정 (macOS엔 timeout/gtimeout 없음)
  3. 범인 특정: crownycode-enforce.sh status가 line 171에서 관성측정.sh 호출 → 20초+ 타임아웃
  4. 관성측정.shROOT=/Users/ef(홈 전체)를 대상으로 find를 5번(한선/JS/PY/RS/C) 실행.
- -not -path "*/node_modules/*"출력만 필터할 뿐 트리 탐색은 다 함 - 홈에 crowny-* 프로젝트 수백 개 + ~/Library → find 1회만 10초+, 5회 50초+ → 사실상 멈춤 → 사용자가 ESC
  1. 수정: 관성측정.sh의 스캔을 Spotlight 인덱스(mdfind) 기반으로 교체 + 자체 타임아웃 가드 추가
- mdfind -onlyin "$ROOT" "kMDItemContentModificationDate >= $time.now(-N)" → 풀스캔 없이 0~1초 - _run_timeout 순수 bash 워치독(서브셸 stdout을 /dev/null로 닫아 명령치환 파이프 미점유) → 어떤 스캔도 세션을 멈출 수 없음 - mdfind 없는 환경 대비 fallback: find -maxdepth 4 -prune 5초 가드
  1. 검증: 관성측정.sh 0초, enforce.sh status 0초(이전 무한 멈춤 → 전체 출력 정상). 작업마다 부르는 kpscode search(1s)/quadcode status(2s)/harvest recent(1s)/agent.sh run(8s) 모두 정상.

관련 파일

  • /Users/ef/.claude/scripts/관성측정.sh — 수정됨 (mdfind + 타임아웃 가드)
  • /Users/ef/.claude/scripts/관성측정.sh.bak-20260609 — 원본 백업
  • /Users/ef/.claude/scripts/crownycode-enforce.sh — line 171에서 관성측정.sh 호출 (변경 없음)
  • 스킬 정의: /크라우니코드 (세션 시작 프로토콜에 enforce.sh status 포함)

더 깊은 근본 원인 — sync O(N×M) 폭탄 2개 (세션종료/턴종료 핫패스)

관성측정 수정 후 추가 조사 중, 실제로 멈춰있던 8시간짜리 프로세스는 관성측정이 아니라 crownycode-learn.sh sync였음. 두 개의 sync가 동일한 O(N×M) 중첩 grep 구조였다:

  1. crownycode-learn.sh sync (라인 214–232): 학습.dat(6.4만줄) 한 줄마다 → all_patterns.dat(377만줄) 전체 grep. + 역방향. → 줄마다 grep 프로세스 생성, 수일치 작업, 8시간+ 미완.
  2. crownycode-harvest.sh sync (라인 167–182): 학습.dat(6.4만) ↔ 학습패턴.dat(4.5만) 상호 grep. 둘 다 스킬 세션종료 프로토콜이 호출 → 매 종료마다 멈춤.
수정: 두 sync 모두 awk 집합연산 단일패스(O(N+M))로 교체. FNR==NR{seen[$1]=1} 로 대상 DB intent 셋 구성 후 소스 스트리밍하며 신규만 append. 런내 중복도 seen 마킹으로 1회 처리(원로직 동치).
  • learn.sh sync: 8시간+ 미완 → 5초, 백로그 +5,697건 실제 병합 완료
  • harvest.sh sync: 복사본 검증 2초, OS→TVM 33,154건·TVM→OS 91건 미동기화분 확인, 멱등성(2회차 +0) 확인. python UTF-8 재작성 동시쓰기 레이스 회피 위해 강제실행은 안 함(락+훅이 다음에 빠른 코드로 실행).
좀비 정리: 옛 코드로 돌던 sync 프로세스 2개(PID 79435 체인, 59318 체인=48분째) kill + stale 락 제거.

다른 세션 비파괴 원칙 준수: ① 모든 배포는 같은 디렉토리 temp→mv 원자적 교체(실행중 세션은 기존 inode 유지) ② 살아있는 락은 건드리지 않음(동시 sync 보호) ③ kill은 오작동 백그라운드 sync만(대화형 작업 무관) ④ DB는 append-only로만 변경.

다른 스킬 점검 결과 (전부 정상)

  • 스킬 정의 4종(~/.claude/commands/크라우니코드.md·한선씨.md·KPS.md, ~/.claude/skills/분별/SKILL.md)에 find/관성측정/mdfind/무한루프 직접 호출 없음
  • .claude/scripts·kpscode·crownycode-agent 디렉토리에 full-home find/grep-r-home 위험 패턴 없음 (enforce.sh의 find 2개는 libs/std 하위로 한정돼 안전)
  • 명령 실측: learn.sh search 1s, ports.sh list 0s, kpscode verse 2s/domain 1s, agent.sh multi 8s, kpscode search 1s, quadcode status 2s, harvest recent 1s — 멈춤 0

잔여 이슈

  • mdfind는 Spotlight 인덱스 제외 디렉토리의 파일을 놓칠 수 있음(관성측정 휴리스틱엔 허용 범위)
  • 향후 새 스크립트에서 full-home find 재등장 시 동일하게 mdfind로 교체 권장