본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 05:03

Express.js에 명령어 하나를 실행해 보았습니다. 그 저장소는 7개의 지식 공백(knowledge voids)을 숨기고 있었습니다.

요약

Kage-graph-mcp 도구를 사용하여 Express.js 저장소의 지식 공백(knowledge voids), 중복 구현, 고스트 엑스포트 등을 분석한 사례를 소개합니다. 코드 그래프와 git 히스토리를 기반으로 문서화되지 않은 코드의 위험성을 식별합니다.

핵심 포인트

  • 지식 공백(knowledge void)은 변경 빈도가 높고 의존성이 크지만 문서화되지 않은 파일을 의미함
  • Kage 도구는 AST와 git 히스토리를 분석하여 코드의 구조적 결함을 찾아냄
  • 중복 구현, 고스트 엑스포트, 버스 팩터 1, 문서 불일치 등을 자동으로 탐지함
  • 분석된 데이터는 AI 에이전트가 정확한 맥락에서 코드를 수정할 수 있는 검증된 메모리로 활용됨

가입도, 설정도 필요 없습니다. 우리는 Express.js를 새로 클론(clone)한 상태에서 명령어 하나를 실행했습니다:

npx -y @kage-core/kage-graph-mcp scan

0.3초간의 분석(142개 파일, 3,160개 심볼, 전체 git 히스토리) 후, 다음과 같은 결과가 출력되었습니다:

Kage Truth Report - express
  0 duplicate clusters - 0 ghost exports - 0 bus-factor-1 hot files - 7 knowledge voids

...

지식 공백(knowledge void)이란 무엇인가?

저장소의 모든 파일에 대해 두 가지 질문을 던져보십시오. 얼마나 자주 변경되었는가(churn, 변동성), 그리고 얼마나 많은 것들이 그 파일에 의존하는가(import/call graph에서의 centrality, 중심성)? 이제 세 번째 질문을 던지십시오. 그 파일에 대해 축적된 지식은 어디에 기록되어 있는가?

lib/response.js의 경우 답은 다음과 같습니다: 390개의 결정이 담긴 커밋(commits), 149개의 의존성(dependents), 그리고... 어디에도 없습니다. README에도, 문서(docs)에도, 그 어떤 구조화된 메모리에도 없습니다. 그 390개의 커밋 각각에는 이유가 있었습니다. 그 이유들은 그것을 작성한 사람의 머릿속에만 존재합니다.

AI 에이전트(또는 새로운 팀원)가 해당 파일을 건드리기 전까지는 괜찮습니다. 하지만 그들은 아무런 정보 없이(fly blind) 작업하게 되며, 중심성(centrality)이 높은 파일에서 이러한 눈먼 편집은 회귀(regressions)를 일으키는 원인이 됩니다.

스캔이 확인하는 다른 항목들

  • 중복 구현 (Duplicate implementations) - 서로 다른 패키지에 존재하는 동일한 이름과 동일한 시그니처(signature)를 가진 함수들로, 최근에 나타난 경우 플래그가 지정됩니다 (AI 시대의 복사-붙여넣기 시그니처).
  • 고스트 엑스포트 (Ghost exports) - 호출 엣지(call edges)가 전혀 없는 내보내진 심볼(exported symbols)들입니다. CommonJS의 property-requires로 인한 오탐을 방지하기 위해 원본 소스(raw source)를 대조하여 검증합니다.
  • 버스 팩터 1 (Bus factor 1) - 단 한 명의 사람만이 커밋한 '핫 파일(hot files)'로, 그래프 중심성(graph centrality)에 따라 순위가 매겨집니다.
  • 문서의 거짓말 (Doc lies) - README의 주장을 코드 그래프와 대조하여 확인합니다: 존재하지 않는 경로, package.json에 없는 npm 스크립트, 어디에도 나타나지 않는 CLI 플래그 등이 해당됩니다.

모든 발견 사항에는 파일:라인(file:line) 증거가 함께 제공됩니다. 느낌(vibe)에 의존하는 것은 아무것도 없습니다.

내부 작동 원리

스캔은 로컬 코드 그래프 (local code graph)를 기반으로 구축됩니다: TS/JS의 경우 TypeScript 컴파일러 AST, Python/Go/Rust/Java/Ruby의 경우 tree-sitter (순수 WASM, 네이티브 의존성 없음), 호출 엣지 (call edge)가 실제 해당 위치로 임포트 (import)가 해결됨을 의미하는 임포트 인식 호출 해결 (import-aware call resolution), 그리고 변경 사항 (churn) 및 작성자 (authorship) 확인을 위한 git 히스토리 1회 통과가 포함됩니다. 모든 과정은 로컬에서 이루어지며, 데이터는 기기를 떠나지 않습니다.

동일한 엔진이 Kage의 나머지 부분, 즉 코딩 에이전트 (coding agents)를 위한 검증된 메모리 (verified memory)를 구동합니다. 존재하지 않는 파일을 인용하는 메모리는 쓰기 단계에서 거부됩니다. 인용된 코드가 변경된 메모리는 회상 (recall) 단계에서 제외되며, 사용자의 디프 (diff)가 이를 무효화하는 정확한 순간에 플래그 (flag)가 지정됩니다:

사용자의 변경 사항이 1개의 팀 메모리를 무효화했습니다:
  - 결제 검증 규칙 - src/payments.ts를 인용함
    (이 메모리가 검증된 이후 내용이 변경됨)

또한, 도구는 가치를 주장하는 대신 보여주어야 하므로 영수증 (receipts)을 출력합니다:

이번 주 Kage가 약 845K 토큰 (~$12.67)을 절약했으며,
0개의 오래된 메모리를 차단하고, 5개의 회상 (recalls)에 응답했습니다.

당신의 저장소에서 시도해 보세요

npx -y @kage-core/kage-graph-mcp scan

만약 흥미로운 것을 찾지 못했다면, 당신은 유난히 문서화가 잘 된 저장소를 가지고 있는 것입니다. 진심으로 축하드립니다. 만약 가장 의존도가 높은 파일에서 공백 (void)을 발견한다면, 그것은 다음 에이전트 세션이 눈을 감고 건드리게 될 파일입니다.

오픈 소스 (GPL-3.0), Claude Code, Codex, Cursor, Windsurf 및 모든 MCP 클라이언트와 함께 작동합니다: https://github.com/kage-core/Kage

당신의 저장소에서 스캔이 무엇을 찾아내는지 정말 알고 싶습니다. 가장 이상한 발견 사항을 댓글로 남겨주세요.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0