Boxdawn

2026-07

A pattern we implemented but never saw

Dataset
Three real adapters — Claude Code sessions, Toolathlon trajectories, RedundancyBench
Pre-registered
No — this is an observation log, not an experiment
Frozen params
φ=0.514345, N=2, paraphrase-multilingual-MiniLM-L12-v2 — the detector's frozen configuration, published at /product
Verdict
N/A
What this does NOT show
Whether pingpong occurs in genuinely multi-agent systems. We have not yet analyzed a true multi-agent trace.

What we built

Clew ships detectors for three waste patterns: repeat_node, pingpong, and requery_known. The first two are structural; the third is a special case of the first, detected through a shared code path.

The pingpong detector looks for a specific structural motif — two agents alternating without either producing a new state: A → B → A → B, all four spans classified as LLM spans, occurring as strictly adjacent events, with A ≠ B. It targets a failure mode common in multi-agent supervisor/worker routers, where a coordinator and a specialist keep handing control back and forth without new context accruing.

The definition was chosen to be precise. Adjacency, cross-agent identity, and LLM-span typing together narrow the pattern enough that a match should mean something.

What we saw

We ran the detector over three real trace corpora: Claude Code sessions (6,780 tool spans), Toolathlon trajectories (176,270 tool spans), and RedundancyBench (1,628 tool spans). Pingpong fired zero times in all three.

The pattern does contribute to our synthetic evaluation — the reported F1 of 0.857 covers all three detectors, and pingpong is one of them. But that pingpong component fires exclusively through a synthetic trace generator (pingpong_aba.py), which constructs the trace directly and assigns span_kind="llm" explicitly. On real traces, we have zero observed firings.

Implemented is not the same as observed. We should say so.

Why

Two structural factors block pingpong on our current inputs.

The first is at the adapter layer. None of our three real adapters emit LLM spans. Every span they produce is tagged span_kind="tool": the Claude Code adapter hardcodes it and does not spanify thinking or textblocks; the Toolathlon adapter is defined as “synthetic CHAIN root + tool spans only”; the RedundancyBench adapter emits every matched pair as span_kind="tool" and does not spanify assistant text. A pattern defined over LLM spans cannot fire on inputs that contain none.

The second is at the preprocessing layer. OTel and LangGraph traces do carry LLM spans — the adapter's _KIND_MAP recognizes them. But the official entrypoint runs a preprocess step, collapse_llm_spans, which removes every span with span_kind == "llm", rolling their token counts up into their parent chain span. Even a trace that entered the pipeline with LLM spans arrives at the detector without them.

Beyond the two blockers, the workloads themselves matter. Coding and single-agent tool-calling sessions dominate the traces we can currently observe. A → B → A → B cross-agent alternation requires two distinct agent identities taking turns. That is a shape of work we have not yet had access to.

What we did about it

We changed how the site describes the pattern. On the Clew page, the pingpong card now carries a status line — “Implemented — not yet observed in real traces” — and a note that pingpong requires genuinely multi-agent traces; single-agent coding sessions and Toolathlon are not expected to produce it.

The pattern is still implemented. The code has not changed. The site has. This report is the reason.

This is an observation, not a pre-registered experiment. Pingpong may well fire on genuinely multi-agent traces — we simply have not seen one yet.