knip은 “이 심볼을 누가 import하나?“를 심볼마다 거꾸로 묻지 않는다. 모듈 그래프를 한 번 만들고, entry에서 import를 따라 도달 가능한 집합 R을 구한 뒤, 그 여집합(전체 \ R)을 미사용으로 본다. (심볼별 역참조 질의 O(|심볼|·|모듈|) → 그래프 1회 구축 + 도달 1회 + 집합 차)

그래서 dead의 정체는 아무도 안 쓰는 코드가 아니라 entry에서 도달 불가한 코드다 — 자기가 남을 import해도, 자신이 (간접적으로라도) entry에서 import되지 않으면 dead.

entry 선언이 곧 판정의 기준점이다. entry 하나를 빠뜨리면 R이 줄고 그 아래 멀쩡한 서브트리가 통째로 거짓 미사용으로 잡힌다 — config·플러그인·동적 import 진입점을 knip에 꼭 등록해야 하는 이유.

explorer: 노드를 누르면 entry→그 노드 도달 경로가 펼쳐지고, plugin entry를 끄면 api로 가는 유일 경로가 끊겨 빨갛게 거짓 미사용으로 뒤집힌다.

#558