요약
scripts/skill-post.js 의 PostToolUse(matcher:"Skill") 훅이 CC가 정상 호출함에도 항상 조기 종료되어, reachability ping·PDCA phase 자동 전이·setActiveSkill·orchestrator 제안이 모두 실행되지 않습니다. v2.1.14 SessionStart reachability check가 이를 missing=[skill_post] → "CC #57317 suspected, 회피 불가 — CC 측 fix 대기" 로 deferred 처리했으나, 실측 결과 CC가 아니라 skill-post.js 자체 버그입니다.
환경
- bkit 2.1.21 / Claude Code CLI 2.1.158 / Node (WSL2 Linux)
근본원인
scripts/skill-post.js:
let input = '';
if (process.stdin.isTTY === false) { // ← 버그
for await (const chunk of process.stdin) chunks.push(chunk);
...
}
CC는 훅에 JSON을 파이프 stdin으로 전달하는데, 파이프/리다이렉트 stdin의 process.stdin.isTTY는 false가 아니라 undefined 입니다. 따라서 가드가 CC 호출 경로에서 절대 진입하지 못해 input이 비고 → skillName 공백 → if (!skillName) return; 조기 종료 → 그 아래 reachability ping/본업 미실행.
unified-bash-post.js/unified-write-post.js는 lib/core/io.readStdinSync를 무가드로 쓰고 ping이 top-level이라 정상 → bash_post/write_post만 stamped, skill_post만 missing 인 비대칭이 이 때문.
재현
$ echo x | node -e 'console.log(process.stdin.isTTY === false)'
false # 파이프 stdin → isTTY는 undefined, === false 는 거짓
가역 probe(top-level write)를 skill-post.js에 삽입 후 Skill 호출 → probe 파일 생성됨(= CC가 hook 을 실제로 spawn 확인) 그러나 .bkit/runtime/hook-reachability.json 의 skill_post 는 여전히 부재. → CC 는 PostToolUse(Skill) 플러그인 훅을 정상 발화시키며, #57317(silent drop)이 아님.
수정 제안
if (!process.stdin.isTTY) { // undefined(pipe)·false 모두 읽고 TTY만 skip
또는 bash-post와 동일하게 readStdinSync 사용 + reachability ping을 조기 return 위로 이동.
수정 후 검증: 패치된 스크립트를 파이프 stdin으로 실행하면 skill_post stamp 가 기록되고, 실제 CC 런타임에서도 Skill 호출 시 .bkit/runtime/hook-reachability.json 에 skill_post 가 정상 기록됨.
영향
스킬 완료 시 PDCA phase 자동 전이가 무동작이며, SessionStart가 매번 CC #57317 거짓 경고를 띄웁니다. (SessionStart reachability check 의 missing=[skill_post] → "CC 측 fix 대기" deferred 처리는 오귀인이므로 재검토 권장.)
요약
scripts/skill-post.js의 PostToolUse(matcher:"Skill") 훅이 CC가 정상 호출함에도 항상 조기 종료되어, reachability ping·PDCA phase 자동 전이·setActiveSkill·orchestrator 제안이 모두 실행되지 않습니다. v2.1.14 SessionStart reachability check가 이를missing=[skill_post]→ "CC #57317 suspected, 회피 불가 — CC 측 fix 대기" 로 deferred 처리했으나, 실측 결과 CC가 아니라 skill-post.js 자체 버그입니다.환경
근본원인
scripts/skill-post.js:CC는 훅에 JSON을 파이프 stdin으로 전달하는데, 파이프/리다이렉트 stdin의
process.stdin.isTTY는false가 아니라undefined입니다. 따라서 가드가 CC 호출 경로에서 절대 진입하지 못해input이 비고 →skillName공백 →if (!skillName) return;조기 종료 → 그 아래 reachability ping/본업 미실행.unified-bash-post.js/unified-write-post.js는lib/core/io.readStdinSync를 무가드로 쓰고 ping이 top-level이라 정상 →bash_post/write_post만 stamped,skill_post만 missing 인 비대칭이 이 때문.재현
가역 probe(top-level write)를
skill-post.js에 삽입 후 Skill 호출 → probe 파일 생성됨(= CC가 hook 을 실제로 spawn 확인) 그러나.bkit/runtime/hook-reachability.json의skill_post는 여전히 부재. → CC 는 PostToolUse(Skill) 플러그인 훅을 정상 발화시키며, #57317(silent drop)이 아님.수정 제안
또는 bash-post와 동일하게
readStdinSync사용 + reachability ping을 조기 return 위로 이동.수정 후 검증: 패치된 스크립트를 파이프 stdin으로 실행하면
skill_poststamp 가 기록되고, 실제 CC 런타임에서도 Skill 호출 시.bkit/runtime/hook-reachability.json에skill_post가 정상 기록됨.영향
스킬 완료 시 PDCA phase 자동 전이가 무동작이며, SessionStart가 매번 CC #57317 거짓 경고를 띄웁니다. (SessionStart reachability check 의
missing=[skill_post]→ "CC 측 fix 대기" deferred 처리는 오귀인이므로 재검토 권장.)