제품

01/how it works

값싼 필터가 먼저, 비싼 검증은 그다음.

Boxdawn은 트레이스를 그래프로 읽어 2단 캐스케이드로 실행합니다. 구조 패스는 마이크로초 단위로 후보를 걸러내고, 의미 패스는 살아남은 것만 봅니다. 전체를 훑지 않습니다.

결정론적 패스흐름도. 트레이스 파일 하나가 바이트 단위로 정확하게, 네트워크 없이, 선형 시간에 도는 결정론적 탐지기 셋을 지나갑니다. 거기서 살아남은 후보만 선택형 LLM 판정기로 넘어가고, 그 판정기는 기본적으로 꺼져 있습니다. 결과는 리포트입니다.
패턴
repeat

같은 에이전트가 같은 입력으로 다시 실행됩니다. 그 사이에 새로 유입된 정보는 없습니다. JSON 리포트의 비용 breakdown 에서는 provable_duplicate 로 키잉되고, 대시보드가 그 이름으로 조회하는 이유가 그것입니다. 그 옆의 waste-rate 블록은 repeat 을 씁니다.

패턴
context_resend

매 API 호출마다 대화 전체가 다시 전송됩니다. 긴 에이전트 세션에서는 input 토큰의 약 97%가 재전송 컨텍스트(byte-exact 청크 매칭)로 누적됩니다.

패턴
redundant_read

같은 파일이 사이에 쓰기 없이 여러 번 Read 됩니다. 컨텍스트에 이미 있는 것을 잊는 코딩 에이전트에서 흔합니다.

패턴
duplicate_creation

에이전트 바깥의 무언가를 바꾸는 도구가 같은 입력으로 두 번 실행되고, 두 실행이 서로 다른 id 를 돌려줍니다. 두 번째 호출이 두 번째 개체를 만든 것입니다. id 가 같으면 같은 개체이고, id 를 돌려주지 않는 도구는 어느 쪽으로도 판정하지 않습니다.

패턴
semantic_duplicate

바이트는 다르지만 의미가 같은 두 메시지 청크(paraphrased 재전송). opt-in LLM-judge 층이 감지 · 기본 비활성 · API 키 필요.

Opt-in 전용 · ANTHROPIC_API_KEY 필요

pingpong은 실제 멀티에이전트 트레이스가 있어야 나타납니다. 단일 에이전트 코딩 세션이나 Toolathlon에서는 발생하지 않습니다.

pingpong 은 구현돼 있지만 위 카드에는 넣지 않았습니다. 리포트가 그 이름을 붙이는 것은 pingpong 검출기가 직접 낸 쌍뿐이고, 낭비율 지표는 이름으로 그것을 제외합니다.

참고: 네 번째 후보 패턴이었던 regen_handoff은(는) 사전 등록 기준을 통과하지 못해 제외되었습니다. Proven / Not Yet 섹션 참조.


02/reference

Boxdawn이 아는 것.

도구 분류
  • read_only
  • side_effect
  • payload_dependent
  • declarative
프레임워크
  • LangChain / LangGraph
  • CrewAI
  • LlamaIndex
  • OpenAI Agents SDK
  • AutoGen
  • Smolagents
탐지기
  • find_repeat_candidates
  • find_pingpong_candidates
  • find_context_resend
  • find_redundant_reads
  • find_llm_judge_semantic_duplicates
입력 형식
  • Boxdawn Trace JSON
  • OTel SDK JSON
  • Claude Code JSONL
  • Toolathlon JSONL
  • OpenInference nested
  • RedundancyBench
Register your tools (clew.yaml)
version: 1
tools:
  search_web:    { category: read_only }
  create_ticket: { category: side_effect, entity_id: response.ticket.id }
  run_python:    { category: payload_dependent }
  finalize:      { category: declarative }

03/report

실제 리포트.

# Boxdawn Waste Report

- **trace_id**: `7f309fce-093f-412d-be64-cbd2860481f3`
- **analyzed**: 2026-10-14T09:36:44Z
- **detector params**: φ=0.514345, N=2, model=paraphrase-multilingual-MiniLM-L12-v2

## Cost summary

- **Total analyzed**: $1.972395
- **Total waste (detected)**: $0.901532 (45.7%)
- **Cost accuracy**: `accurate`

Breakdown by detector:
  - repeat: $0.000000
  - context_resend: $0.901532
  - redundant_read: $0.000000
  _Cost attribution across four detectors: repeat, context_resend, redundant_read, semantic_duplicate. A detector that did not run has no row -- absence here is not a measured zero. `repeat` is keyed `provable_duplicate` in the JSON report (same cascade detector, key kept for compatibility). Not the same four as the waste-rate line, which unions repeat, context_resend, redundant_read and duplicate_creation._

## Context resend

Message chunks that appear in the input of two or more LLM calls within this trace, byte-exact by sha256. System-role chunks are exempt. First occurrence of each chunk is not counted (it is the necessary payload); occurrences from the second onward are recorded as resent.

- **events**: 1050 resent chunk occurrence(s)
- **resent input tokens**: 1415467 of 1596520 (88.7%)
- **resent input cost**: $0.901532 of $1.595870 (56.5%)
- **cost accuracy**: `accurate`

### Top offenders (by LLM call)

- span `msg_01S2rTDtWwK9s5G15AiHu3Zf`: 10 resent chunks, 32595 tokens, $0.182613
- span `msg_01GmBJvkryprm1pCB6tMtdc5`: 33 resent chunks, 54433 tokens, $0.053735
- span `msg_013ceb6apNMTyUjDmnSbhMVF`: 74 resent chunks, 80333 tokens, $0.041130
- span `msg_01EszjrD8ho9PWfTYQmsUbsz`: 72 resent chunks, 79982 tokens, $0.039991
- span `msg_011yRBpAFZsnaWQbf7whkZ3a`: 70 resent chunks, 74073 tokens, $0.037036

---
_Note: detection thresholds are frozen at synthetic values (phi=0.514345, N=2); real-trace evaluation is ongoing, but parameters have not been recalibrated. Borderline matches (cosine near phi) deserve human review. This applies to non-tool spans; tool spans use exact sha256 identity._
_Cost is estimated saving potential, not measured: it assumes the wasted output is re-consumed each subsequent turn (structural assumption). Range spans cache-hit (lower) to cache-miss (upper) — two billing outcomes for the same tokens, not a ratio. Attribution uses per-model rates; a model the table does not carry resolves to the nearest named one where an alias exists, and falls back to Sonnet 4.5 otherwise. Only the fallback is reported as a substitution._

2026-10-14에 PyPI 최신 게시본이자 호스팅 분석기가 돌리는 빌드인 boxdawn 0.5.15로, 격리된 환경에서 분석했습니다. 이 블록은 앞서 여기 서 있다가 철회된 실행을 대체합니다. 그 실행은 Claude Code 어댑터가 API 콜 1건의 usage 를 content block 줄마다 세고 있어서 토큰 수와 금액이 전부 과대 집계된 것이었습니다. 그 수치는 0.5.0 부터 0.5.12 까지 소수점 여섯 자리까지 같았는데, 그건 결함이 없었다는 뜻이 아니라 결함이 그만큼 오래 지속됐다는 뜻이었습니다. 수치를 움직인 결함은 셋이고 방향이 같지 않았습니다. 그래서 총액이 한 번도 틀려 보이지 않았습니다. 탐지 건수와 동결 파라미터, 임계값은 하나도 움직이지 않았습니다. 바뀐 것은 같은 탐지 건을 얼마로 매기느냐이지 트레이스 속 낭비가 줄어든 것이 아닙니다. 위에는 분모가 둘 있고 서로 바꿔 쓸 수 없습니다. 45.7%는 입력과 출력을 합한 전체 분석 비용 대비 낭비이고, 56.5%는 LLM 입력 비용만을 분모로 한 재전송 입력 비용입니다. 출처: davanstrien/agent-race-traces 의 claude-code.jsonl 에 boxdawn analyze 실행. CC-BY-4.0으로 공개된 claude-opus-4-7 Claude Code 세션($1.972395 분석). 이 모델은 가격표에 있으므로 달러 수치는 대체 요율이 아닙니다. 공개 트레이스 한 건이지 코퍼스 평균이 아닙니다. 트레이스가 공개되어 있어 위 수치는 전부 재현할 수 있습니다. Cost summary 와 Context resend 절을 보여줍니다. Redundant read 와 LLM-judge(선택형)는 이 트레이스에서는 빈 결과를 냅니다. cost accuracy 는 분석기가 설정하는 필드이며 이 수치에 대한 검증이 아닙니다.

브라우저에서
트레이스를 놓습니다. 계정 없이.
트레이스를 놓습니다. 계정 없이.
분석기가 돕니다. 분이 아니라 초 단위입니다.
분석기가 돕니다. 분이 아니라 초 단위입니다.
프로젝트를 연결하면
로그인한 앱의 Repeats 화면. 각 행은 "다시 읽은 파일"이고 옆에 횟수가 붙습니다. 7개 세션에서 8번, 5개 세션에서 12번, 4개 세션에서 4번. 행마다 8자리 지문과 1센트 미만의 비용, 걸친 날짜가 있고, 어느 행도 파일 이름을 말하지 않습니다.
연결하면 쌓입니다. 이 화면은 경로가 아니라 지문만 봅니다.

04/open source

오픈소스입니다. 신뢰 자체가 곧 제품이니까요.

Boxdawn은 MIT 라이선스이며 기본값은 결정론입니다. 네 개의 디텍터(repeat, context resend, redundant read, duplicate creation)가 로컬에서 실행됩니다. API 호출 없음, 가입 없음. 다섯 번째 층 semantic-duplicate LLM-judge는 opt-in 전용입니다: 기본 비활성이며, ANTHROPIC_API_KEY와 CLEW_ENABLE_LLM_JUDGE=1을 명시적으로 설정해야 활성화됩니다. 결정론 층은 같은 트레이스가 들어가면 매번 같은 리포트가 나옵니다.

$ pip install boxdawn
$ boxdawn analyze your_trace.json

OpenTelemetry SDK JSON과 OpenInference 트레이스 익스포트를 지원합니다: LangGraph, CrewAI, AutoGen, LlamaIndex. OTLP proto-JSON은 아직 지원하지 않습니다.

MITlocal-first결정론 우선결정론적opt-in LLM-judge1,000+ tests · CI greenOTel / OpenInference

05/roadmap

Where we are on the chain.

Boxdawn 은 사슬입니다: monitor → detect → alert → auto-fix → auto-optimize + govern. 오늘 돌아가는 고리는 탐지이고, 서비스로도 라이브러리로도 돌아갑니다. 나머지는 그 순서대로 만들고 있습니다. 어느 것이 어느 쪽인지는 이 페이지에서 확인하실 수 있습니다.

오늘 돌아가는 것
  • 호스팅 분석기, 계정 불필요
  • 결정론적 탐지기 4종
  • 실제 usage 필드에서 뽑은 비용
  • 계정 + 프로젝트별 이력
  • 일별 낭비율, 세션 날짜 기준
  • CI·스크립트용 API 키
  • 오픈소스 CLI, 오프라인 실행
  • 선택형 의미 분석 패스
다음에 만들 것
  • 기준선 알림
  • 실시간 모니터링
  • 루프 탐지
  • 세션 흐름 시각화
  • 비용과 함께 지연시간
  • 자동 수정
  • 자동 최적화
  • 정책·거버넌스
알림은 명세와 사전등록이 끝나 있습니다. 비교 규칙과 볼륨 하한, 발화 임계값을 구현 전에 글로 먼저 고정했기 때문에 첫 버전을 나중에 보기 좋게 맞출 수 없습니다. 아직 구현되지 않았습니다. 오른쪽 칸에 있는 것은 오늘 쓸 수 없고, 어느 칸에도 없는 기능은 계획한 적이 없는 것입니다.
두 칸 어디에도 일부러 넣지 않은 기능이 하나 있습니다. 호출이 나가기 전에 실시간으로 낭비를 차단하는 것입니다. 만들었고, 먼저 적어 둔 기준에 대고 쟀습니다. 정밀도는 0.6333 이 나왔습니다. 후보 3,432건에서 뽑아 사람이 라벨링한 30쌍 중 19쌍이고, 2026-07-25 측정입니다. 사전등록한 임계값은 0.70 이었습니다. 자동 차단도 확인 프롬프트도 내보내지 않았고, 그 숫자가 바뀌기 전까지는 둘 다 계획에 없습니다. 이 폐기 결정은 저희 알림 사전등록 문서에 기록돼 있습니다. 그 문서는 알림이 무엇도 예측하지 못한다는 것도 함께 적고 있습니다. 실시간 모니터링과 알림은 다른 주장이고, 그 둘은 위 목록에 있습니다.

Boxdawn 은 진단합니다. 고치지 않습니다. 측정된 절감액은 아직 없습니다. 저희는 찾은 것을 보고하지, 아낀 것을 보고하지 않습니다.