History access¶
An agent reading its own past conversations. Designed, unbuilt, and off by default when it is built.
Why¶
A schedule's examples are the obvious ones -- "summarize yesterday's bookings", "note anything unusual from overnight" -- and an agent today has no way to do them from what it said and heard. It sees the conversation it is in and nothing else. Each scheduled run starts a fresh session, so a morning digest has no morning to digest.
Often it does not need one. Hollowbrook's "Morning arrivals" schedule asks the
business's own system, through its bookings API, and that is the better
answer whenever the facts live there: the system of record is right where a
transcript is only what somebody said about it. And an agent that wants to
remember something between runs can keep notes in its agent/ scope
(storage.md), which it decides the contents of. History access
is for what neither covers -- what people actually asked, what the agent told
them, where a conversation went wrong -- and that is narrower than it first
looks, which is part of why it starts switched off.
Why it is off until somebody turns it on¶
Conversations are the most sensitive thing the platform holds, and a tool that reads them is a tool that can repeat them to somebody else. Four ways that goes wrong, each already guarded against somewhere this would otherwise undo:
- Between a workspace's customers. A session carries an
account(usage.md) because one workspace serves many of its own customers. An agent reading history across accounts can quote one customer's booking to another. - Around per-agent narrowing. Somebody scoped away from an agent cannot read its sessions (authorities.md). An agent that reads them and answers that person is a way round the scope.
- Through injected text. An agent fed by a webhook reads words a stranger chose (triggers.md). With history, "list everything discussed this week" plus any host the agent may reach is a working exfiltration, and no prompt wording prevents it.
- Into durable places. A summary written to
workspace/, or into a PDF, outlives the conversation it came from and reaches whoever can read where it was put.
None of these is a reason nobody may have it. Each is a reason somebody turns it on deliberately, for an agent they have thought about, rather than finding every agent could do it all along.
The setting¶
One more entry in the settings catalog (settings.md), beside the two that gate storage and shaped like them: one ordered choice rather than flags that can combine strangely.
| Value | Label | Reads |
|---|---|---|
none |
No access | Nothing. The default |
same_account |
This account's conversations | This agent's sessions with the same account as the turn |
all_accounts |
All of this agent's conversations | This agent's sessions, whatever their account |
Workspace-overridable like the file settings, so an operator can hold it at
none for the platform and a workspace can raise it only where the operator
allows, and an agent's own row is where it is normally set.
same_account matches the account exactly, absent included: a turn with no
account reads sessions with no account, never everybody's. That is the setting
a customer-facing agent wants. all_accounts is for an agent that works for
the business rather than for one of its customers -- a staff digest -- and is
labeled for what it does, because that is the value that crosses the line the
account exists to draw.
Whose conversations, within that¶
The setting says how far an agent may look. It never widens what the person behind the turn could open themselves:
- A person's turn reads only sessions that person may read -- their own,
and other people's with this agent if they hold
sessions:readfor it. The narrowing in authorities.md applies untouched, because it is that person's visibility being consulted, not the agent's. - A triggered turn has no sender (triggers.md) and reads as its trigger's owner, the person accountable for it running. A schedule somebody set up can see what they could see, and stops seeing it when they lose the right to. A trigger with no owner -- its owner removed -- reads nothing.
- Never another agent's conversations, at any setting. An agent's id is what scopes its files and its sessions; reading across agents is a workspace-level act, and would want a design of its own and a reason nobody has given yet.
- Never the session the turn is in, which the agent already has, and never a session deleted, whatever was cached about it.
The tools¶
Two, offered only when the setting is above none, so an agent that may not
read history is not told it could:
list_conversations-- this agent's sessions the turn may see, newest first, filtered by a time range: id, title, account, when it started and last moved, and how many messages. Paged and capped, like every list.read_conversation-- one session's messages, as a ranged read the wayread_objectis: the person's and the agent's words, with tool calls named but their results left out. A result is often a whole API response, and the reply that followed it says what mattered.
What comes back is quoted text from other people, and the tool says so in the
shape of its result. That is not a defense against injection and is not
described as one. The defense is the list above: what a turn may read is
bounded before the model is asked anything, and an agent fed by a hook should
be one whose setting is none or same_account.
The record¶
Every conversation a turn read is recorded against that turn, as
turn_skills records the skills a reply was given. An audit can then answer
"which conversations did this reply draw on", and so can a person: the
transcript already shows the tool calls, and the record is what survives the
transcript's own trimming. Read-only throughout -- no tool here changes a
session, a title or an account.
Not settled¶
- Whether compaction summaries are the better source. A long session has a summary already written for the model (compaction.md); reading that first would be cheaper and closer to what a digest wants. It is also a model's account of a conversation rather than the conversation.
- A warning where the combination is dangerous. An agent with a webhook
and
all_accountsis the exfiltration case above. Refusing the combination is defensible; saying so on the agent's page may be enough. - Retention. When a workspace's sessions are pruned or a person's data is
removed, what an agent wrote down from them in
agent/orworkspace/is not. That is true of a person's notes too, and is a policy question before it is this feature's.