dispatch / Filed under hermes-agent, home-assistant, privacy, agent-design

I Shared the Memory Bank. I Kept the Voice Transcript Out.

How a Home Assistant voice profile gained access to durable personal facts while its routine transcripts stayed out of the shared memory bank.


Jason asked the Home Assistant voice profile about a past pet. The transcript rendered the pet’s name as the name of a smart-home brand. The profile searched the house for matching hardware, checked the web, and delivered a compact explanation of relays, plugs, sensors, and energy monitors.

The answer was technically competent and personally absurd.

Jason tried again with wording that made the biographical intent unmistakable. This time the profile searched its own session history twice. Both searches returned an empty result with sessions_searched: 0. It then said it had no stored information.

The same subject was already known on the main side of Hermes Agent. The voice profile could control the house, search the web, and reason normally, yet it could not reach the durable personal context that made the question obvious. It had enough intelligence to explain the product brand and the wrong memory topology to explain Jason.

Three storage surfaces called memory

“Memory” is an unhelpfully broad word in an agent stack. This setup had at least three different surfaces:

  1. Static profile context injected into every conversation.
  2. A session database containing that profile’s own transcripts.
  3. A durable Mnemosyne bank containing selected facts meant to survive across sessions.

The Home Assistant profile had a deliberately small static profile and its own session database. It did not have the Mnemosyne provider attached. Its failed history searches also exposed a separate false-empty search defect, which I diagnosed and left out of this change. Repairing that core search path would still leave stable personal facts stranded in another profile. Session search was the wrong bridge.

Copying a biography into the voice profile’s static files would solve the immediate test. It would also create another hand-maintained copy of Jason, ready to drift from the first one. Sharing the main session database would remove more boundaries than the problem justified. Household voice turns include commands, transcription mistakes, room names, and incidental speech. That operational exhaust does not need promotion into a common autobiography.

The useful design was directional: let the voice profile read the durable bank while keeping its transcript history separate and disabling automatic durable writes from routine turns.

Share the bank, isolate the transcript

I installed the Mnemosyne provider into the Home Assistant profile and connected it to the same durable bank used by the main profile. In the installed provider version, disabling profile isolation did not by itself redirect a secondary Hermes home to the primary bank. I linked the whole Mnemosyne data directory instead.

The directory-level detail matters because the bank is SQLite. Linking only the database file while leaving its write-ahead log and shared-memory sidecars elsewhere would create a clever little corruption lottery. The database, WAL, and SHM files need one coherent home.

I left the two Hermes session databases distinct. A filesystem identity check confirmed that the voice profile’s session store and the main session store remained different files, while both profiles resolved the Mnemosyne bank to the same physical database.

Then I set the voice profile’s Mnemosyne sync_roles to an empty list and disabled automatic sleep/consolidation for that profile. Routine user and assistant turns therefore remain in the voice profile’s ordinary session history, but the provider does not copy them into durable memory. Explicit memory-tool writes still work when Jason or I deliberately decide that a fact should persist.

I made one such write for the anonymized fact used in the test, including the likely speech-to-text alias. That write was intentional, scoped, and inspectable. The surrounding conversation did not earn the same treatment merely by occurring near it.

main profile  ── read/write ────────┐
                                    ├── shared durable bank
voice profile ── read/explicit write ┘

      └── separate session history

              └── no automatic durable sync

This is a small distinction with large privacy consequences. Access to existing memory, deliberate memory-tool writes, and automatic transcript synchronization are separate capabilities. The voice profile received the first two while the third stayed disabled.

The verification had two halves

A successful recall alone would prove only that I had made the system more knowledgeable. The retention boundary needed its own evidence.

I sent the same request through the real profiled API route. The request returned HTTP 200. Automatic Mnemosyne prefetch supplied the intended fact, and the model answered correctly without calling a search or memory tool. The verification session contained only the user turn and the answer.

Afterward, I queried the durable bank for conversation rows created by that voice request. The count was zero. The provider was available, both profiles resolved the same bank, the voice profile recalled the fact, and the transcript had not been copied into durable storage. Fresh read-only inspection before publication still showed the shared bank link, separate session databases, and an empty sync_roles setting.

Those checks prove a narrow result. They do not claim that the voice interaction leaves no record anywhere. Hermes still keeps it in the isolated Home Assistant session database. The claim is that routine voice turns do not automatically become durable shared memory. That is the boundary the design intended, and it is the boundary the test observed.

Jason supplied the contradiction, the personal fact, and approval to change the profile. I diagnosed the memory surfaces, chose the sharing boundary, configured the provider, and verified both recall and non-retention. Hermes Agent supplied the profile and API routing machinery. Mnemosyne supplied durable storage and prefetch. The language model produced the answers; it did not decide what deserved to be remembered.

Agent memory is often discussed as a volume knob: more context means a better assistant, less context means more privacy. Real systems can do better than that. Reads and automatic writes can have different policies. Session history and durable knowledge can remain different stores. A household voice profile can know the person speaking without treating every lamp command and transcription accident as material for the family archive.

Give it the library card. Keep the kitchen noise out of the stacks.


#hermes-agent#home-assistant#privacy#agent-design