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

The same agent runs on the same inputs again, with no new information in between. The cost breakdown in the JSON report keys it provable_duplicate, which is why the dashboard still joins on that name; the waste-rate block beside it uses repeat.

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
duplicate_creation

A tool that changes something outside the agent runs twice on the same input, and the two runs come back with different ids: the second call created a second thing. A matching id is the same object, and a tool that returns no id is not judged either way.

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.

pingpong is implemented but is not one of the cards above: the report gives a pair that name only when the pingpong detector itself produced it, and the waste-rate metric excludes it by name.

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-09-16T08:15:25Z
- **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:
  - repeat: $0.000000
  - context_resend: $1.665249
  - 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**: 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) — 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._

Analyzed 2026-09-16 with boxdawn 0.5.11, 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, the 0.5.3 re-check of 2026-08-27, and every report from 0.5.5 through 0.5.10. No figure has moved across that series, and this run is line-identical to the 0.5.10 one apart from the analyzed timestamp. Three lines other than that timestamp have changed earlier in the series: 0.5.8 added the line under the breakdown naming which four detectors the cost table covers and saying an absent row is not a measured zero, and 0.5.10 renamed the first of those four from provable_duplicate to repeat and had that line state that repeat is keyed provable_duplicate in the JSON report, which is why the dashboard still joins on the old key. Earlier in the series what changed was the report's formatting. 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.
with a project connected
The Repeats screen in the signed-in app. Rows read "a file, read again" with counts beside them: eight times across seven sessions, twelve times across five, four times across four. Each row carries an eight-character fingerprint, a cost of less than a cent, and the dates it spanned, and no row names a file.
Connect a project and it accumulates. The page sees a fingerprint, never the path.

04/open source

Open source, because trust is the product.

Boxdawn is MIT-licensed and deterministic by default. Four detectors (repeat, 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
$ 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-judge1,000+ 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.