원문: https://github.com/facebook/astryx/wiki/Night-Watch-Dead-Code · 번역 기준: 2026-09-03
Assigned to: Cindy의 Navi (cixzhang)
Goal: 미사용 파일, export, 타입, devDependencies를 감지하고 신뢰도 높은 것들을 PR로 제거하여 코드베이스를 dead code 없이 유지합니다.
Tooling: knip을 repo 밖에서 실행합니다. knip은 module graph를 해석하기 위해 checkout을 읽기만 하므로, 바이너리, 그 config(knip.jsonc), runner는 facebook/astryx가 아니라 Night Watch 운영자의 workspace에 있습니다. 공개 repo의 package.json이나 lockfile에는 아무것도 추가되지 않습니다. knip은 각 패키지의 exports/bin을 entry point로 읽으므로, 공개된 API surface가 미사용으로 보고되는 일은 없습니다.
이 tooling은 이 위키 repo의 tools/deadcode/ 아래에 실려 있어, Night Watch가 매 실행마다 이미 clone하는 지침과 함께 이동합니다(노드 간 파일 전송 불필요, 체크리스트와 함께 버전 관리됨):
knip.jsonc: 공개 API에 안전한 config (entry 패턴 + ignore)check-deadcode.mjs: runner (--directory <checkout> --config knip.jsonc로 knip을 호출, 소형 호스트의 메모리 workaround 처리)package.json: knip을 pin (node_modules는 gitignore되며 첫 사용 시 설치)bootstrap.sh: 노드의 tools/deadcode/에 knip을 설치각 실행은 위키를 clone하고, knip을 bootstrap한 다음, node_modules가 설치된 checkout에 대해 detector를 실행합니다. facebook/astryx repo의 toolchain에는 아무것도 쓰지 않습니다.
하룻밤에 한 번, 실행당 PR 한 개(최대)를 생성합니다. 표준 업무 시간 가드(평일 9am-5pm PST는 skip)가 적용된 매시간 cron이며, state gate가 하루 한 번의 실제 실행으로 제한합니다.
Dead code는 소리 없이 쌓입니다. 리팩터링 후 아무도 호출하지 않는 helper, 남겨진 타입, 제거된 워크플로를 위한 devDependency. 어느 것도 테스트나 CI를 깨뜨리지 않으므로 아무것도 잡아내지 못합니다. 이 role은 실재하고 재현 가능한 도구를 실행하여, 그 신뢰도 높은 발견 사항을 작고 안전한 제거로 바꿉니다.
다음을 감지하고, 신뢰도 높은 카테고리에 한해 제거합니다:
packages/*의 미사용 파일 (아무것도 import하지 않고, 어느 entry point에서도 도달할 수 없는 소스 파일)packages/*의 미사용 export (다른 어느 모듈도 import하지 않는 exported symbol)packages/*의 미사용 exported 타입devDependencies (어느 package.json에 나열되어 있지만 아무것도 참조하지 않는 dev dependency)