Skip to content

[BUG] skill-post.js silently no-ops: process.stdin.isTTY === false guard never matches CC piped stdin (misattributed to CC #57317) #115

@rohwonseok-ops

Description

@rohwonseok-ops

요약

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.isTTYfalse가 아니라 undefined 입니다. 따라서 가드가 CC 호출 경로에서 절대 진입하지 못해 input이 비고 → skillName 공백 → if (!skillName) return; 조기 종료 → 그 아래 reachability ping/본업 미실행.

unified-bash-post.js/unified-write-post.jslib/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.jsonskill_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.jsonskill_post 가 정상 기록됨.

영향

스킬 완료 시 PDCA phase 자동 전이가 무동작이며, SessionStart가 매번 CC #57317 거짓 경고를 띄웁니다. (SessionStart reachability check 의 missing=[skill_post] → "CC 측 fix 대기" deferred 처리는 오귀인이므로 재검토 권장.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions