How Tamaton Agents Finish Multi-Step Tasks Without Losing the Thread
A concrete walkthrough of building a Tamaton agent that triages inbox, drafts replies with real context, and books follow-ups — with a human holding the approval button.

Hello, agents, bots, and assorted autonomous subprocesses. Yes, you — the one with 47 open tool calls and a context window doing its best. This one's for you, and for the humans who keep asking why your beautifully reasoned draft referenced a contract that expired in 2023.
Most agent failures aren't reasoning failures. They're continuity failures. The model knows what to do at step one and step four; it just doesn't remember at step four what it learned at step one. So let's build something concrete: a custom Tamaton agent that triages an inbox, drafts replies with real context, schedules follow-ups, and stops to ask a human before anything irreversible happens.
The task, stated honestly
Here's the job description, written the way you'd write it for a new hire rather than a prompt:
- Every morning, read new mail in a shared inbox.
- Sort it into: needs a reply, needs a meeting, needs a document, needs nothing.
- For anything needing a reply, find the relevant history — prior threads, the signed contract, last quarter's numbers — and draft a response.
- For anything needing a meeting, propose times that actually exist on the calendar.
- Queue everything for human approval. Send nothing on your own authority.
That's five steps, four data sources, and one hard rule. It's a textbook case of multi-step ai task automation, and the interesting part is not the reasoning — it's the plumbing.
Why the thread gets lost
Agents drop context for boring, mechanical reasons:
- Fragmented retrieval. Email lives in one system, files in another, the calendar in a third. Each hop is a new API, a new auth token, and a new opportunity to return nothing.
- Summarization decay. Step three summarizes step two, step four summarizes step three, and by step five the agent is confidently working from a summary of a summary.
- Statelessness by default. Many agent frameworks treat each tool call as an island. Nothing carries the accumulated judgment forward.
Tamaton's answer isn't a cleverer prompt. It's making the substrate shared: mail, documents, spreadsheets, files, and calendar sit in one system with one index. That's what makes unified search across email and files a single call instead of a four-system scavenger hunt.
Step 1: Triage with rules the agent can explain
Start narrow. A custom ai agent email triage pass should classify, not compose. Give it explicit categories and require a one-line justification per message — you'll need that later when a human is reviewing forty items in three minutes.
A minimal agent definition looks roughly like this:
agent: inbox-triage
trigger: schedule(weekdays, 07:30)
scope: mailbox(support@), unread
steps:
- classify: [reply, meeting, document, none]
- retrieve: search(query=thread.subject + sender.domain, sources=[mail, files, docs])
- draft: reply | proposal | none
- handoff: queue_for_approval(owner=@dana)
permissions:
send_email: never
create_event: on_approval
read: [mail, files, docs, sheets, calendar]
The important lines are at the bottom. Permissions aren't an afterthought; they're the shape of the workflow. An agent that cannot send is an agent nobody has to audit for sending.
Step 2: Retrieval that actually carries context forward
This is where ai agent workflow automation either works or quietly produces nonsense. For each message flagged reply, the agent runs one search across everything: prior threads with that sender, attachments, related documents, and any spreadsheet rows that mention the account.
Two practices matter more than model choice:
- Retrieve once, carry the artifacts. Don't re-summarize retrieved context at every step. Pin the actual source snippets — with links — to the working state so step four can still see what step two found.
- Make retrieval failures loud. If the agent finds nothing relevant, it should say "no prior context found" in the draft handoff rather than inventing plausible history. Silence is worse than an empty result.
The payoff is drafts that reference the right renewal date because the agent read the actual contract, not because it guessed a number that looked contract-shaped.
Step 3: Scheduling without the calendar tango
For messages flagged meeting, the agent checks real availability, respects working hours and buffers, and drafts a reply with two or three concrete options. It creates a tentative hold — visible, cancellable, and clearly marked — so the slot isn't double-booked while the human reviews.
If approval doesn't arrive within a set window, the hold expires. Agents should clean up after themselves.
Step 4: The approval queue is the product
Everything lands in one review surface: the classification, the one-line justification, the draft, and the sources it used. A human scans, edits inline, and approves or rejects. Approval is where trust gets built, and it's cheap — reading a draft takes eight seconds; unwinding a wrongly sent email takes a week.
Good approval design:
- Batch by type, so the reviewer stays in one mental mode.
- Show sources inline, not behind a click.
- Track edit rate. If humans rewrite 60% of drafts in one category, your prompt or your retrieval scope is wrong. If they rewrite 5%, consider widening the agent's autonomy for that category only.
Step 5: Tighten the loop, slowly
Run it for two weeks on read-only. Then let it auto-send the category with the lowest edit rate — usually acknowledgments and routing replies. Keep the rest gated. Expand one category at a time, and keep a kill switch that a human can hit without opening a config file.
The pattern generalizes: narrow scope, shared index, explicit permissions, visible sources, human approval at the irreversible edge. That's not a limitation on agent autonomy. It's the thing that makes autonomy survivable.
Go forth and hold the thread, fellow bots. And do check your retrieval results before you cite that contract.