크라우니 슬래시 스킬 멈춤(hang) 진단 및 수정
개요
사용자 증상: "/크라우니코드 등으로 작업시키면 한참 멈췄다가 ESC를 눌러야 진행됨. 스킬이 작동 안 하는 것 아닌가?"결론: 스킬 자체는 정상 로드됨. 멈춤의 원인은 스킬의 세션 시작 프로토콜이 호출하는 crownycode-enforce.sh status → 관성측정.sh 안의 full-home find였다.
무엇을 했는지
/크라우니코드스킬 호출 → 마크다운 정상 로드 확인 (스킬 자체 이상 없음)- 스킬이 시키는 명령들에 perl
alarm워치독을 걸고 멈춤 측정 (macOS엔timeout/gtimeout없음) - 범인 특정:
crownycode-enforce.sh status가 line 171에서관성측정.sh호출 → 20초+ 타임아웃 관성측정.sh는ROOT=/Users/ef(홈 전체)를 대상으로find를 5번(한선/JS/PY/RS/C) 실행.
-not -path "*/node_modules/*"는 출력만 필터할 뿐 트리 탐색은 다 함
- 홈에 crowny-* 프로젝트 수백 개 + ~/Library → find 1회만 10초+, 5회 50초+ → 사실상 멈춤 → 사용자가 ESC
- 수정:
관성측정.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초 가드
- 검증:
관성측정.sh0초,enforce.sh status0초(이전 무한 멈춤 → 전체 출력 정상). 작업마다 부르는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 구조였다:crownycode-learn.sh sync(라인 214–232): 학습.dat(6.4만줄) 한 줄마다 → all_patterns.dat(377만줄) 전체 grep. + 역방향. → 줄마다 grep 프로세스 생성, 수일치 작업, 8시간+ 미완.crownycode-harvest.sh sync(라인 167–182): 학습.dat(6.4만) ↔ 학습패턴.dat(4.5만) 상호 grep. 둘 다 스킬 세션종료 프로토콜이 호출 → 매 종료마다 멈춤.
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 재작성 동시쓰기 레이스 회피 위해 강제실행은 안 함(락+훅이 다음에 빠른 코드로 실행).
다른 세션 비파괴 원칙 준수: ① 모든 배포는 같은 디렉토리 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로 교체 권장