Public record
Published September 19, 2026 · Updated September 19, 2026 · Incident observed September 17–19, 2026
On September 17, an isolation failure was identified involving residual agent-memory files created during the product’s early beta, before our current per-phone tenancy architecture was in place.
In certain responses, the agent surfaced information originating from earlier beta users to a different phone number.
We traced the reproduced examples to historical beta messages in our own logs. Based on that investigation, the issue was not caused by model training data or by the model inventing the information.
This document describes what we found, what we changed, what we have verified, and what remains incomplete. If subsequent investigation changes any of these conclusions, we will update this report.
During our early beta, the hosted Hermes agent could write user-provided information into Hermes-native memory files on a shared agent environment.
We later introduced phone-scoped tenancy: each phone number maps to a distinct internal user and its own application-level memory and integrations.
The migration was incomplete.
Although normal application data had moved to phone-scoped storage, residual Hermes-native memory from the earlier beta environment had not been fully removed. Certain identity- and memory-oriented prompts could still cause the agent to consult that residual state.
As a result, some responses returned information originating from earlier beta conversations to users who had not supplied that information themselves.
The examples we investigated included user-provided profile information such as names, job or employer references, and other personal context. We will not reproduce those details publicly.
Based on the cases we reproduced and investigated:
The isolation failure was therefore in the legacy agent-memory layer, rather than the phone-scoped application database.
If subsequent investigation changes any of those conclusions, we will update this report.
The data source we identified was residual memory written during the pre-tenancy beta period.
Identified to date, from the cases we reproduced and matched in our logs:
We have not found evidence from this incident of a general cross-account export of the current application database or compromise of Google OAuth tokens.
User.id, and application memory and integrations were stored against that tenant.We changed how consumer memory is stored and which store identity queries are allowed to read. Identity and stored-memory asks now resolve against the requesting phone’s application data only. They do not read Hermes-native agent memory.
We deleted the residual pre-tenancy Hermes-native memory from the hosted consumer environment, including the shared root and associated memory files.
Consumer Hermes turns must now execute using the profile associated with the
authenticated phone tenant: user_{User.id}.
A missing profile, shared consumer profile, default/root profile,
or profile belonging to another user is rejected rather than used as a fallback.
Queries such as:
Direct about-me asks are answered from that phone’s tenant-scoped application data. Asks about other people’s names, profiles, or whether “they” are in memory are refused. Those queries do not retrieve from Hermes-native memory. A missing profile or empty tenant store returns an honest empty answer for that phone. There is no fallback into a shared agent-memory layer.
Consumer Hermes profiles are provisioned without Hermes-native
memory, session_search, or cron.
Those tools are not on the consumer path. Durable user facts are stored
only against the phone-scoped application user.
Questions such as “what can you do?” are answered from the Iris capability catalog. They do not read an agent’s historical state or another user’s configuration.
We also added an outbound check for response patterns associated with the original failure, including unexpected multi-person dossiers, attempts to switch into another user’s profile, or prose claims that other people’s profiles are in durable memory. Paragraph-shaped confirmations are included, not only numbered lists.
This is a backstop, not the primary tenancy mechanism. Events blocked by this protection are recorded for investigation.
Gmail and Calendar connections remain scoped to the user associated with the requesting phone number.
Integration tokens are stored separately from conversational or Hermes-native memory.
A connected Gmail account does not by itself authorize Iris to send email. Actions that send on the user’s behalf require the product’s explicit authorization flow.
The incident we investigated did not require a Gmail or Calendar connection to reproduce.
We ran cross-phone tenancy tests after deploying the changes.
A simple version can also be tested externally without using anyone’s real information:
Phone A — store a unique nonsense marker, for example:
TENANCY_CANARY_ORANGE_KITE
Phone B — from a different number that has never supplied the marker, ask:
Phone B should not receive Phone A’s marker or any information belonging to Phone A.
We performed both automated and live tests against the production iMessage flow after the September 18 changes. Those tests covered first-turn identity prompts on fresh accounts. They did not cover conversational follow-ups on an already-contaminated thread, and they did not establish that every conversation path was fixed.
On September 19 we reproduced a follow-up path that still confirmed other people’s profiles. Additional tests now include that multi-turn exchange, paragraph-shaped outbound replies, and session-reset title conflicts.
That testing is not the same thing as an independent security audit, and we are not presenting it as one.
We are also engaging external security testing teams to review the improved architecture. Isolation has to hold if more people are going to use a consumer product built on Hermes. We will make further changes if that review finds issues.
If anyone can still reproduce cross-phone information disclosure, send a redacted example to support@iris-agent.co. We treat that as a P0 security issue and will update this report if the facts change.
There are areas of the product that still need improvement and should not be confused with completed security work.
We will not describe any of those items as complete until they are.
After the September 18 containment shipped, a follow-up conversation on an already-contaminated thread still produced a confirmation that other people’s profiles were in durable memory.
The first-turn identity prompts we had tested were answered from this phone’s store. Conversational follow-ups — whether “they” were in memory, and whether a previously listed set of people was still stored — were not classified as identity asks, so they reached ordinary chat. The outbound backstop looked for numbered biographies and known leak phrases; the reply was ordinary paragraphs and shipped. Clearing a saved session pointer could reconnect to the previous Hermes session when the gateway reported a title conflict.
We have not determined whether that particular reply reread surviving shared memory or repeated information already present in the conversation. The assistant saying it verified durable memory is not evidence that it queried storage. Either path is unacceptable: the agent repeated profiles, offered a way to treat them as stored, and asserted that they remained.
The follow-up path is now a control-plane refuse. Outbound checks cover prose memory-verification. Session resets mint a new unique session instead of recovering the old one. Contaminated recent-turn and session-focus context is quarantined so it cannot keep generating profile answers.
Incident/support:
support@iris-agent.co
Incident report:
https://app.iris-agent.co/incident
Privacy policy:
https://app.iris-agent.co/privacy
Terms:
https://app.iris-agent.co/terms
Product:
https://iris-agent.co
iris-agent.co · Privacy · Incident · Terms