Product

01/how it works

Cheap filter first, expensive check second.

Boxdawn reads your trace as a graph and runs a two-stage cascade. The structural pass finds candidate waste in microseconds. The semantic pass looks only at what survived, never at everything.

Deterministic passFlow diagram. One trace file enters three deterministic detectors that run byte-exact, offline and in linear time; only the candidates that survive them are handed to an opt-in LLM judge, which is off by default; the result is a report.
pattern
repeat_node

The same agent runs on the same inputs again, with no new information in between.

pattern
pingpong

Two agents keep handing off without either producing a new state.

Implemented, not yet observed in real traces

pattern
context_resend

Every API call re-sends the whole conversation. On long agent sessions this compounds to ~97% of input tokens as re-sent context (byte-exact chunk match).

pattern
redundant_read

The same file is Read multiple times without intervening writes. Common in coding agents that lose track of what's already in context.

pattern
semantic_duplicate

Two message chunks with different bytes but the same meaning (paraphrased re-send). Detected by the opt-in LLM-judge layer: off by default, requires API key.

Opt-in only · requires ANTHROPIC_API_KEY

pingpong requires genuinely multi-agent traces; single-agent coding sessions and Toolathlon are not expected to produce it.

note: a fourth candidate pattern, regen_handoff, was descoped after failing pre-registered criteria. See Proven / Not Yet.


02/reference

What Boxdawn knows about.

Tool categories
  • read_only
  • side_effect
  • payload_dependent
  • declarative
Frameworks
  • LangChain / LangGraph
  • CrewAI
  • LlamaIndex
  • OpenAI Agents SDK
  • AutoGen
  • Smolagents
Detectors
  • find_repeat_candidates
  • find_pingpong_candidates
  • find_context_resend
  • find_redundant_reads
  • find_llm_judge_semantic_duplicates
Input formats
  • 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

A real report.

# Boxdawn Waste Report

- **trace_id**: `7f309fce-093f-412d-be64-cbd2860481f3`
- **analyzed**: 2026-08-30T10:19:19Z
- **detector params**: φ=0.514345, N=2, model=paraphrase-multilingual-MiniLM-L12-v2

## Cost summary

- **Total analyzed**: $2.524880
- **Total waste (detected)**: $1.665249 (66.0%)
- **Cost accuracy**: `accurate`

Breakdown by detector:
  - provable_duplicate: $0.000000
  - context_resend: $1.665249
  - redundant_read: $0.000000

## 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**: 1720 resent chunk occurrence(s)
- **resent input tokens**: 2056739 of 2238628 (91.9%)
- **resent input cost**: $1.665249 of $1.931955 (86.2%)
- **cost accuracy**: `accurate`

### Top offenders (by LLM call)

- span `msg_01S2rTDtWwK9s5G15AiHu3Zf`: 22 resent chunks, 65715 tokens, $0.253172
- span `msg_01MwTSZsxhZnFzS2DHbWoe7k`: 68 resent chunks, 148485 tokens, $0.206537
- span `msg_01GmBJvkryprm1pCB6tMtdc5`: 123 resent chunks, 162168 tokens, $0.138267
- span `msg_011ZR8iNqiod3YbbDs4UCgUp`: 225 resent chunks, 211788 tokens, $0.133689
- span `msg_01K8wsAnXZ7RqcvVdkrsP3LX`: 117 resent chunks, 130004 tokens, $0.092611

---
_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). Attribution uses per-model rates; unknown models fall back to Sonnet 4.5._

Analyzed 2026-08-30 with boxdawn 0.5.5, the build published on PyPI, in an isolated environment. The figures are identical to six decimals to the 0.5.0 run of 2026-08-20 and the 0.5.3 re-check of 2026-08-27; what changed between them is the report's formatting, not a number. Source: boxdawn analyze on davanstrien/agent-race-traces (claude-code.jsonl), a Claude Code session on claude-opus-4-7 published under CC-BY-4.0 ($2.524880 analyzed); that model is in our price table, so the dollar figures are not at a fallback rate. The trace is public, so every figure above can be reproduced. Shows Cost summary + Context resend sections; Redundant read and LLM-judge (opt-in) return empty on this specific trace.

in the browser
Drop a trace. No account.
Drop a trace. No account.
The analyzer runs. Seconds, not minutes.
The analyzer runs. Seconds, not minutes.
The report, inline. The file is never stored.
The report, inline. The file is never stored.

04/open source

Open source, because trust is the product.

Boxdawn is MIT-licensed and deterministic by default. Four detectors (provable duplicate, context resend, redundant read, and duplicate creation) run locally with no API calls and no signup. A fifth layer, semantic-duplicate LLM-judge, is opt-in only: off by default, requires ANTHROPIC_API_KEY and explicit CLEW_ENABLE_LLM_JUDGE=1 to activate. Same trace in, same report out. Every time, for the deterministic layers.

$ pip install "boxdawn[detect]"
$ boxdawn analyze your_trace.json

Works with OpenTelemetry SDK JSON and OpenInference trace exports: LangGraph, CrewAI, AutoGen, LlamaIndex. OTLP proto-JSON is not yet supported.

MITlocal-firstdeterministic-firstdeterministicopt-in LLM-judge702 tests · CI greenOTel / OpenInference

05/roadmap

Where we are on the chain.

Boxdawn is a chain: monitor → detect → alert → auto-fix → auto-optimize + govern. Detection is the link that runs today, as a service and as a library. The rest is being built in that order, and this page is where you can check which is which.

Running today
  • hosted analyzer, no account
  • four deterministic detectors
  • cost from real usage fields
  • accounts + per-project history
  • daily waste rate, by session date
  • API keys for CI and scripts
  • open-source CLI, runs offline
  • opt-in semantic pass
Building next
  • baseline alerts
  • real-time monitoring
  • loop detection
  • visual session flow
  • latency alongside cost
  • auto-fix
  • auto-optimize
  • policy and governance
Alerting is specified and pre-registered: the comparison rule, the volume floor and the firing threshold were frozen in writing before any of it was implemented, so the first version cannot be tuned after the fact to look good. It is not implemented yet. Nothing in the right-hand column is available today, and if a capability appears in neither column, we have not planned it.
One capability is missing from both columns deliberately: blocking waste in real time, before the call is made. We built it and measured it against a bar we had written down first. Precision came out at 0.6333 (19 of 30 hand-annotated pairs, drawn from 3,432 candidates, measured 2026-07-25) against a pre-registered threshold of 0.70. Neither automatic blocking nor a confirmation prompt shipped, and neither is planned until that number changes. The kill is recorded in our alert pre-registration, which also states that the alert cannot predict anything. Real-time monitoring and alerting are a different claim, and those are on the list above.

Boxdawn diagnoses; it does not fix. No measured cost savings yet. We report what was found, not what was saved.