AgentFailurePattern is defined in the v1 contract because the shape is stable and a pilot surface depends on it. The team rollup route that returns it is not in the v1 route set. What ships in v1 is the ingest half, POST /v1/ingest/agent-signals. This page teaches the object and promises no endpoint.What it is
Signal, one moment where a person pushed back on an agent (in practice, a correction, a re-prompt of the same request, or an expression of frustration). Pattern, a cluster of signals that mean the same thing (in practice, a named recurring failure mode with counts and a couple of redacted examples). Verdict, an admin’s curation of a pattern (in practice, a way to mark a cluster as noise without deleting the evidence behind it). A pattern is evidence about agents, not about people. That constraint shows up in every field: counts are distinct-user tallies rather than identities, and examples pass through redaction before storage.Where it comes from
The three signal types are detected on the client, inside the session, and posted in batches.202 application/json
signalId is counted as deduped rather than stored twice, which makes a retried batch safe.
A reprompt may include priorText, the earlier version of the request. The server uses it to confirm the two really are the same ask, then discards it. priorText is never stored.
Clustering runs in the background. A new signal joins an existing pattern when it is close enough to that pattern’s centre; whatever is left over is clustered fresh. Only the largest new clusters get a written label and summary on each pass, which bounds the cost. The rest keep accumulating evidence and are named later.
Field reference
Read
summaryOverride first and fall back to summary. An admin who rewrote a summary did it because the generated one was wrong.
The pair worth watching is signalCount against distinctUsers. Forty-seven signals from one person is that person’s workflow. Forty-seven from six people is a team-level problem with the agent.
How the privacy shape works
Three mechanisms, and it is worth knowing all three before putting this in front of a team.- Aggregate counts only.
distinctUsersis a tally. No field on the object names a person, and none is planned. - Redaction at rest. Email addresses and home-directory usernames are stripped from example text before it is stored, which is why
[user]appears mid-path in the example above. The same redaction runs again on read, so the two cannot drift apart. - Example selection. Very short filler and very long pasted dumps are rejected as examples even when the cluster itself is real, so what you see is representative prose rather than the first two rows.
Why the rollup route is not in v1
Why the rollup route is not in v1
The clustering, the redaction and the aggregate shape are built and running as a pilot. What is not settled is the read surface: who inside an organization should see it, at what granularity, and under which scope. Shipping a route and then changing it would break the rule that no shipped route is ever renamed. The object is documented now so pilot callers have a stable contract, and the route follows once its authorization posture is decided.
Can a small team be de-anonymised by the counts?
Can a small team be de-anonymised by the counts?
On a two-person team,
distinctUsers: 1 narrows the field to two people, and a distinctive example can narrow it further. Redaction removes identifiers, not style. Treat this as team-level analytics for teams, and do not present it to a group small enough for attribution by elimination.Does a verdict delete the evidence?
Does a verdict delete the evidence?
No. A verdict marks the cluster and the underlying signals stay. That is deliberate: a pattern dismissed as noise one month can turn out to be a real regression the next, and the evidence has to survive the first judgement for that to be visible. A verdict can be undone.
Where session content goes, as opposed to signals
Where session content goes, as opposed to signals
Signals are a separate, narrow channel. Session content itself flows through the coding-session routes and becomes ordinary graph nodes joined by
session_sequence and spawned_subagent edges. Signals never become nodes and are not retrievable as sources. See Coding session history.Limits
- No route in the v1 set returns
AgentFailurePattern. Ingest ships; the rollup does not. - Signals are detected on the client. Exo does not mine them from transcripts it already holds, so a team that does not send them has no patterns.
priorTextis used for confirmation and never persisted, so no route can return it.- There is no per-person breakdown, by design.
- The team routes that do ship,
GET /v1/teamandGET /v1/team/members, return organization and membership data only. Neither returns agent insights, andGET /v1/team/membersrequires an admin key.
Next
Coding session history
Getting sessions into the graph in the first place.
Ingest agent signals
The shipped route, its batch shape and its dedup behaviour.