Start from an existing agent
If an agent in Kindo already does the work a filter would front, start from that agent. Sift’s analyzer reads the agent’s past runs and measures how many found nothing worth acting on, and whether those runs can be told apart from the useful ones. It then recommends what to do, which may be to build no filter at all. You carry its findings into the new-filter conversation.
When you do this
Section titled “When you do this”- An agent already runs on the events you want to filter, and you want evidence before building anything.
- You want the filter to reach its label floor sooner, by training on that agent’s past verdicts.
Before you start
Section titled “Before you start”- You need the operator or admin role. The analysis and its report are not open to reviewers.
- The analysis reads real runs and classifies them with Sift’s model, so it costs money, metered against your own Kindo tenant.
- Sift reads only what your tenant keeps. Its retention window bounds how far back the history goes.
Analyze the agent
Section titled “Analyze the agent”-
Open Filters, select New filter, and under Start from choose An agent (“Measure an agent already doing this.”).
-
Pick the agent under Find an agent, or type its id in Or enter an agent id and select Use this agent.
Agents Sift generated as a filter’s paired agent carry the badge Sift’s own.
-
Set Runs to read.
The default is 200, up to 5,000. More runs cost more and measure more.
-
Optionally, fill in Anything to add (optional): what this agent should have been escalating, if its runs do not say.
-
Select Analyze and continue.
The page becomes What this agent’s runs say and fills in as the history is read. Only one analysis of an agent runs at a time.
Read the report
Section titled “Read the report”The report leads with its Recommendation:
| Recommendation | What it means |
|---|---|
| Prefilter | A model can be trained to score incoming events and filter the ones this agent would conclude nothing about. |
| Deduplicate | Enough of the traffic is near-duplicate that grouping repeats removes the waste without a trained model. |
| Batch | Runs are individually cheap; grouping them into one payload saves more than filtering them would. |
| Tighten the trigger | A condition on one field of the trigger separates the futile runs for free. No model, no shadow period, no threshold. |
| Downgrade the model | A frontier model is doing classification-shaped work. Moving it to a smaller model is the cheaper lever. |
| No action | This agent is not worth filtering. Either too few of its runs are futile, or the futile ones are not separable from the useful ones. |
Tighten the trigger and Downgrade the model are changes you make to the agent in Kindo; Sift builds nothing for them.
Sift checks the possibilities in a fixed order and gives the first that applies, so the levers that need no model come before the one that does:
| Check, in order | Recommends |
|---|---|
| No runs in the window | No action |
| Most runs unusable (failed, cancelled, an empty or unreadable result, still in progress, or the agent not configured) | No action: widen the window and analyze again |
| Few runs futile | No action: the agent is doing useful work on most of what reaches it |
| Much of the trigger input is near-duplicate | Deduplicate |
| One field value covers nearly all the futile runs and almost none of the actionable ones | Tighten the trigger |
| A frontier model doing work that needs almost no tool calls | Downgrade the model |
| Short, cheap single runs | Batch |
| The futile runs cannot be told apart reliably from the useful ones | No action: a filter would filter real work |
| Otherwise | Prefilter |
Futility is the share of runs that concluded nothing was actionable. Separability is how much of the actionable work a filter trained on this history would still catch, measured on recent runs it was not trained on. A run that finished without a machine-readable verdict is not unusable; it is left out of the futility rate.
The rest of the report:
- Beside the recommendation, how many runs were examined, how many were unusable, and the Population: everything, or post-trigger when the agent already runs behind a trigger. Post-trigger means every figure describes only the events that passed that trigger.
- Measurements: Futility rate, Cost per run, Duplicate rate and Separability (recall on holdout), each marked measured or estimated, and Runs examined. An unmeasured futility rate or cost per run is absent; an unmeasured duplicate rate or separability shows 0%, marked estimated. If the agent groups events, Group runs are counted apart.
- Projected savings: runs avoided and spend saved per month, “A projection, not a measurement.” For Batch it shows no figures and suggests Try Shape delivery once the filter exists; for Downgrade the model it projects no runs avoided.
- What happens next: how many usable labels the history holds, its depth against the label floor, and whether the history can become training labels. For Prefilter and Deduplicate it includes the Draft filter.
- Prompt patches: suggested changes to the agent’s prompt. Sift never applies them; you paste them into Kindo yourself.
- Observed input distribution: a profile of the fields that reached the agent’s trigger, folded.
Carry on to the filter
Section titled “Carry on to the filter”-
Select Continue, at the top of the report or under What the analysis makes of this, where you can first edit the description Sift carries on with. (If the analysis failed, only the Continue at the foot is offered, and it carries on from your description.)
Kindo does not say which source feeds an agent, so the assistant samples the live source to name it.
-
Continue as in Create a filter from step 6.
The conversation shows “Modelled on” with the agent’s id, and a link, working from its analysis, back to the report. The assistant treats the analysis as the strongest evidence it has, and declines rather than proposing something it argues against.
If the agent declares named inputs, the filter can send to it directly. If it declares none, the filter feeds an agent Sift generates; see Connect a filter to its agent.
Train on the agent’s past verdicts
Section titled “Train on the agent’s past verdicts”A filter built from an analysis can add that agent’s past verdicts to its training labels. So can a filter whose pairing displaced an agent, using the displaced agent’s history. This is a choice, not a default: they are another agent’s judgements of what it was sent, with no filter in front of it.
- Open the filter’s Settings tab, then Labels.
- Under Training labels, select Add its past verdicts and confirm with Read the history.
Sift reads up to 1,000 of the agent’s recent runs and keeps those with an actionable or benign verdict, a time, and an input carrying a field the filter reads; runs Sift started itself are left out. Only runs from the last 30 days count, unless an operator changed how long Sift keeps labelled events (see Configuration). The row The agent’s past verdicts shows how many count.
They count toward the label floor only while the filter’s own labels are below it; after that they are held but left out, and Add its past verdicts is no longer offered. Withdraw them removes them from the next training, and Read them again refreshes them. Both need the operator or admin role.
What can go wrong
Section titled “What can go wrong”| You see | What to do |
|---|---|
| “An analysis of this agent is already running” | Wait for it; a second would read the same history and pay for it twice. |
| This analysis failed. | The reason is shown, and any figures are partial. Continue at the foot still carries on from your description. |
| No action | A real answer: the agent is either doing useful work or its useless runs cannot be picked out. Building a filter anyway would risk filtering real work. |
| History depth says “Short of the acceptance floor.” | Analyze again with more Runs to read, within your tenant’s retention, or let the filter collect labels in shadow. |
Ranking every agent
Section titled “Ranking every agent”The analyzer can also rank all your agents by how much filtering could save. This portfolio scan is available only through the API, not in the console; see the API overview.