Show HN: Benzi 사용해 Claude Code보다 나은 코딩 하네스/에이전트 테스트
요약
Benzi는 코드베이스를 호출, 데이터, 제어 흐름의 지도로 컴파일하여 코드를 설명하고 검증하는 새로운 코딩 하네스/에이전트 테스트 도구입니다. 이 도구는 정적 분석만으로는 알 수 없는 런타임 트레이서를 포함하며, 에이전트가 목적 기반 도구를 이용해 코드베이스를 깊이 있게 분석할 수 있도록 지원합니다.
핵심 포인트
- 코드베이스를 컴파일하여 호출/데이터/제어 흐름 지도를 생성합니다.
- 정적 분석의 한계를 극복하는 런타임 트레이서를 포함합니다.
- 에이전트가 구조화된 지도와 목적 기반 도구를 이용해 코드 분석을 수행합니다.
- 호출 그래프 추적 및 영향 범위(blast radius)를 정확하게 파악할 수 있습니다.
Benzi는 먼저 코드베이스를 호출(call), 데이터 흐름(data flow), 제어 흐름(control flow)의 해상된(resolved), 쿼리 가능한 지도(map)로 컴파일합니다. 그런 다음 이 지도를 사용하여 코드를 설명하고, 실행하며, 편집하고, 검증합니다. 정적 분석으로는 파악할 수 없는 부분을 해결하는 런타임 트레이서(runtime tracer)를 포함합니다.
github.com/oooscoos/Benzi 대부분의 코드베이스 질문은 세 가지로 요약됩니다: 어디에 있는지, 무엇을 건드리는지, 그리고 실제로 실행될 때 무슨 일이 일어나는가? Benzi는 먼저 리포지토리를 컴파일한 다음, 에이전트에게 동일한 지도를 조사하기 위한 목적 기반 도구(purpose-built tools)를 제공합니다. 정적 분석으로는 답을 확정할 수 없을 때는 런타임 증거(runtime evidence)에 의존합니다.
LLM을 로드하기 전에 엔티티들을 정확한 심볼로 변환하고 그들의 관계, 심지어 출처(provenance)까지 기록합니다. 그런 다음 에이전트는 컴파일러가 파생시킨 구조에 의존하며 가능한 한 원본 소스 읽기를 피하면서 30가지 이상의 목표 지향 도구(targeted tools)를 이용해 코드베이스를 분석합니다.
직접적인 호출뿐만 아니라 호출자(callers), 별칭(aliases), 콜백(callbacks), 레지스트리 참조(registry references) 및 기타 간접적인 관계까지 추적합니다. 모든 편집은 즉시 구문 검사(parse-checked)되며, 완성된 변경 사항은 새로운 오류가 없는지 정적으로 검사됩니다.
실행을 통해서만 파악할 수 있는 것은 실행을 통해 파악됩니다. 동적 관계는 CANDIDATE로 시작하여, 런타임에 관찰되면 실제 인자(arguments)와 반환 값(return values)이 트레이서에 의해 기록되면서 OBSERVED가 됩니다.
본문은 그것이 무엇을 하는지 알려줍니다. 간선(edges)은 그것이 무엇을 의미하는지 알려줍니다. 렌즈를 전환해 보세요:
스켈레톤(The skeleton). 컴파일러가 해결한 모든 증명된 간선과, 아직 해결하지 못한 후보 간선들—동적 디스패치(dynamic dispatch)와 그것이 착륙할 수 있는 오버라이드 세트(set of overrides)로 태그됩니다. 이를 앞으로 따라가면 경로가 어디에 도달하는지 알 수 있고, 역으로 추적하면 전체 영향 범위(full blast radius)를 알 수 있습니다.
reverse blast radius main └─ run_capture └─ Sensor.read ← you are here ├─ calibrate └─ db.insert (external) 3 proven callers · 1 possible via dispatch
매개변수를 호출자의 할당(assignments)을 통해 거슬러 올라가고, 호출 그래프를 따라 그 출처의 리터럴까지 추적하고—반환 값을 전진하여 최종적으로 도달하는 곳까지 따라갈 수 있습니다.
backflow Sensor.read(sensor_id) sensor_id ← req.query.id @ api.py:41 sensor_id ← route.params @ main.py:12 sensor_id ← "T-42" origin: fixture 2 call sites · 1 defaulted arg
'언제 이런 일이 발생하는가'에 답하는 도구입니다. 본문(body)의 한 단계 개요: 모든 분기 헤더를 원문 그대로, 모든 루프 종료는 레이블과 함께, 모든 조기 반환을 포함하며, 소스 순서대로 호출들이 번갈아 나타나고 — 실제 중첩 구조에 맞춰 들여쓰기 되어 있습니다.
def tick(self):
if self.game_over or self.paused: return
if self.pending: # queued turn
self.direction = pending.pop(0)
if self._off_board(head) or head in body: return
self.end_game() # ← the guard ...
이것은 Benzi가 실제 레포지토리에서 하는 일을 근사합니다: 심볼을 선택하면, 해당 심볼의 호출자(callers), 피호출자(callees), 그리고 계층(tier)이 한 번에 반환됩니다.
노드는 심볼이며; 엣지는 해결된 호출입니다. 녹색 엣지는 증명되었으며; 계층 라벨은 모든 디스패치 후보를 명시합니다.
재현율(recall)보다 정밀도(precision)가 중요합니다 — 동전 던지기 같은 추측은 전체 지도를 무너뜨릴 것입니다. 따라서 아무것도 조용히 추측되지 않으며; 태그가 지정됩니다.
컴파일러는 확실한 증거를 바탕으로 호출을 해결했습니다. 이것은 사실입니다 — 신뢰할 수 있는 호출자입니다.
동적 디스패치(Dynamic dispatch)와 오직 그것뿐입니다. 도착할 수 있는 제한된 오버라이드 세트를 담고 있습니다. 실행하는 것이 이를 해결합니다.
보였지만 확정되지 않은 경우 — 그리고 이유를 알려줍니다: 불투명한 수신자(opaque receiver), 타입 지정되지 않은 지역 변수(untyped local), 또는 후보들과 연결된 실제 이름 충돌입니다.
트레이서 아래에서 실제로 실행되었고, 실제 인자와 반환 값을 가진 것. 디스패치 대상이 승리한 유일한 진실입니다.
인덱스는 항상 컨텍스트 안에 있습니다; Benzi가 학습하는 사실들은 영구적인 기억(durable memories)으로 저장되어, 미래 세션은 이미 그것들을 알고 시작합니다 — 관례(convention), 함정(gotcha), 버그의 실제 기원지입니다.
나중에 스스로 비용을 지불하는 메모리 타입 gotcha 이름 "config-load-order" 본문 "env.py는 settings보다 먼저 임포트되어야 하며," "또는 SECRET_KEY가 비어 있게 읽힙니다. 핵심적인." # → 모든 미래 세션이 이것을 알고 시작합니다.
모든 조회(lookup)는 O(1)입니다. 컴파일러가 이미 답변들을 hashmaps로 해결했기 때문에, 도구들은 검색하는 대신 이를 읽어옵니다. 이 목록은 Benzi의 36개 도구 중 16개를 보여줍니다. 전체 도구 목록은 여기에서 확인하세요.
하나의 설정으로 인스턴스당 한 번 시도하며, 앙상블(ensembling)이나 테스트 시간 선택(test-time selection)은 없습니다. 공식 SWE-bench 하네스로 평가되었습니다.
별도의 버그 수정 벤치마크: 10개 언어에 걸친 24개의 실제 버그가 각각 한 번씩 수정되었습니다. 모델은 Sonnet과 DeepSeek으로 동일하게 유지되었기 때문에, 달라지는 것은 오직 하네스(harness)뿐입니다: Benzi, Claude Code, 또는 일반적인 DeepSeek 하네스입니다. 아래는 각 도구들이 버그별로 읽어야 했던 소스 코드 라인 수이며, 가장 쉬운 것부터 어려운 순서입니다. 특정 지점을 마우스 오버하면 해당 버그와 그 횟수를 확인할 수 있습니다.
동일한 24개 버그에 걸쳐 **읽은 소스 라인 수 (낮을수록 좋음)**는 두 Benzi 시리즈의 경우 9,125개와 16,407개였고, Claude Code의 경우 20,704개, 일반 하네스의 경우 43,598개였습니다. 이는 측정치가 모든 하네스에서 동일한 단일 지표이며, 난이도가 높아질수록 격차가 벌어집니다.
CodeGraph 자체 벤치마크 — 그들의 리포지토리, 질문, 방법론 — 네 가지 답변 모두가 신규 계정에서 프론티어 모델(frontier models)에 의해 블라인드하게 점수화되었습니다:
- 비교할 수 없는 기술적 깊이, 아키텍처 통찰력, 엣지 케이스 커버리지 및 구조적 시각화(순서도/표).
- 예외적으로 정확하고 간결한 라인별 추적, 높은 인용 정확도, 그리고 즉각적인 군더더기 없는 코드 메커니즘.
- 강력한 전반적 구조, 명확한 단계별 분석, 그리고 핵심 메커니즘에 대한 신뢰할 수 있는 커버리지.
- 읽기 쉬우며 훌륭한 코드 스니펫과 요약이 포함되어 있지만, 깊은 런타임 불변성(deep runtime invariants) 측면에서는 약간 덜 세밀합니다.
Benzi가 모든 리뷰어로부터 1위를 차지했습니다. 전체 결과 보기 →
모든 말 초상화는 코드로 그려졌습니다 — 이미지 파일이 아닌 절차적 SVG이며 — 그리고 매칭된 말들은 라이브 AI 모델을 통해 서로를 유혹합니다. 프론트엔드, 백엔드 및 프롬프트 모두 Benzi가 작성했습니다.
총 9개의 질문과 명확한 답변 — 무엇이 어디서 실행되는지, 비용은 얼마인지, 그리고 Benzi가 여러분이 이미 알고 있는 도구들과 어떻게 다른지를 보여줍니다.
브라우저에서 제로 설정으로 사용하거나, 자체 머신에서 전체 제품을 사용하거나, 이미 사용하는 에이전트에게 인덱스를 전달할 수 있습니다.
GitHub URL을 붙여넣으면 Benzi가 이를 호출(calls), 데이터 흐름(data flow), 클래스 계층 구조(class hierarchy)의 맵으로 컴파일한 다음, 대화 패널에서 인터랙티브 그래프와 함께 답변합니다. 읽기 전용이므로 저장소에 아무것도 쓰지 않으며 가입도 필요 없습니다.
varianttech.net/demo → Benzi가 읽고, 설명하고, 실행하고, 자체 변경 사항을 편집 및 확인합니다. 설정은 사이드바의 Benzi 설정 패널(모델, API 키, 이메일 로그인)에 있습니다. 사용자의 키를 가져와서 사용하면 베타 기간 동안 무료입니다.
Marketplace에서 받기 → 세 가지 명령어와 VS Code와 공유되는 하나의 로그인 설정이 필요합니다.
$ pip install benzi
Windows, macOS 및 Linux의 Python 3.11–3.14에 설치됩니다. benzi-login, benzi-mcp, 그리고 benzi-headless 명령어를 설치합니다.
사용자에게 일회용 코드를 이메일로 보내고 키를 저장합니다. 동일한 로그인이 VS Code에서도 작동합니다.
$ benzi-login --login [email protected] $ benzi-login --anthropic-key YOUR_KEY # 또는: benzi-login --nonanthropic-key YOUR_KEY
컴파일된 인덱스를 Claude Code, Cursor 또는 모든 MCP 클라이언트에 도구로 제공합니다.
$ benzi-mcp
터미널에서 저장소에 포인팅하여 스크립트 및 CI(지속적 통합) 목적으로 사용합니다.
$ benzi-headless . "parser.py의 실패하는 테스트를 수정해 줘"
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Claude Code Search의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기