An agent is a step in someone's week, and attention is the budget it spends.
A working agent is not judged on its outputs. It is judged on what somebody's week looks like afterwards. So the design questions are about placement: what fires it, how often it is allowed to speak, what it hands over and when, and what it does on the days it has nothing useful to say.
Two dials decide most of it. A confidence threshold chooses what it handles by itself against what it passes up, and moving it trades errors for escalations. A cadence cap limits how many times a day it may interrupt, which protects the one resource that does not scale.
The failure that ends most internal agents is not a wrong answer. It is being noisy enough that people stop reading it, at which point the correct outputs stop counting too.
The week does not run itself because your system asks for reduced motion. Run a day still works.
The routing is three branches and a budget. Everything interesting is in where the two numbers are set.
def route(item, threshold, budget_left):
if item.confidence >= threshold:
return "handle" if budget_left else "hold" # cap protects attention
if item.confidence >= threshold - 25:
return "escalate" if budget_left else "hold" # ask, do not guess
return "quiet" # nothing useful to say
def run_day(items, threshold, cap, trigger):
budget = cap
routed = []
for item in sorted(items, key=lambda i: -i.confidence):
action = route(item, threshold, budget)
if action in ("handle", "escalate"):
budget -= 1
routed.append((item, action))
# a digest is one interruption for the whole day; per-event is one each
speaks = [r for r in routed if r[1] in ("handle", "escalate")]
interruptions = (1 if speaks else 0) if trigger == "digest" else len(speaks)
return routed, interruptions
Sorting by confidence before spending the budget matters: the cap should be spent on what the agent is surest about, not on whatever arrived first.
| Choice | Time saved | Attention spent | Risk |
|---|---|---|---|
| Daily digest | High | One interruption a day | Latency: urgent things wait for the digest |
| On every event | High | One per item | Notification fatigue, then it gets muted |
| Only when asked | Low | None | Depends on someone remembering it exists |
| Lower the threshold | More handled | Same | More handled wrongly, and cleanup costs double |
Cleanup is the number people forget to model. An item the agent gets wrong does not cost zero, it costs more than doing it by hand, because someone has to notice, undo, and redo it.
A marketing lead spends three hours every Monday assembling a performance digest from three tools. The agent's job is that assembly.
Set it as a daily digest at 08:00 with a cadence cap of one, because the whole point is a single artifact. Set the confidence threshold high, so anything it is unsure about is escalated inside that same digest rather than asserted. On a day where nothing moved, it says so in one line and stops.
Now try the panel with the threshold at 55 and the trigger set to every event. More items get handled, the tally of time saved goes up, and so does the count of items handled wrongly, each costing double to undo. The interruption count climbs from one a day to a dozen. Both configurations "work". Only one of them is still being used in a month.
Your triage agent handles 80% of tickets correctly and escalates the rest. Adoption is falling and people say it is "noisy". What do you change first?