hermes - ✅(Solved) Fix [Bug]: Hindsight plugin reads bank_mission/bank_retain_mission but does not sync them to Hindsight Banks API [1 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#18774Fetched 2026-05-03 04:54:23
View on GitHub
Comments
0
Participants
1
Timeline
4
Reactions
0
Author
Participants
Timeline (top)
labeled ×3cross-referenced ×1

Root Cause

This is especially confusing in local_external setups, where users often compare:

  • Hermes config at ~/.hermes/hindsight/config.json
  • Hindsight WebUI bank config/profile

and assume a bad install when the problem is actually a plugin drift / missing implementation.

Fix Action

Fix / Workaround

Manual workaround that proves the server supports it

Manually patching the Hindsight bank via its own API works immediately:

  • PATCH /v1/default/banks/{bank_id}/config with reflect_mission / retain_mission
  • PATCH /v1/default/banks/{bank_id} with mission

PR fix notes

PR #18789: fix(hindsight): sync bank_mission and bank_retain_mission to Banks API

Description (problem / solution / changelog)

Summary

Fixes #18774

The Hindsight memory plugin reads bank_mission and bank_retain_mission from config (~/.hermes/hindsight/config.json) but never syncs these values to the live Hindsight Banks API. This causes the Hindsight WebUI and Banks API to show empty mission / retain_mission even when configured in Hermes.

Changes

  • plugins/memory/hindsight/__init__.py: Add _sync_bank_settings() method that:

    • Calls client.aset_mission(bank_id, mission) when bank_mission is configured
    • Calls client._aupdate_bank_config(bank_id, updates={"retain_mission": ...}) when bank_retain_mission is configured
    • Runs on a background thread during initialize() to avoid blocking startup
    • Logs warnings on failure without raising (graceful degradation)
  • tests/plugins/memory/test_hindsight_provider.py: Add TestSyncBankSettings class with 5 tests covering:

    • Mission sync via aset_mission
    • Retain mission sync via _aupdate_bank_config
    • Both missions synced together
    • No-op when neither mission is configured
    • Graceful error handling (logged, not raised)

Testing

pytest tests/plugins/memory/test_hindsight_provider.py -x -q
# 96 passed

Scope

1 file changed (+ test file). No changes to public API or config schema.

Changed files

  • plugins/memory/hindsight/__init__.py (modified, +42/-0)
  • tests/plugins/memory/test_hindsight_provider.py (modified, +61/-0)

Code Example

| `bank_mission` || Reflect mission (identity/framing for reflect reasoning). Applied via Banks API. |
| `bank_retain_mission` || Retain mission (steers what gets extracted). Applied via Banks API. |

---

{
  "mode": "local_external",
  "api_url": "http://127.0.0.1:8889",
  "bank_id": "hermes",
  "bank_mission": "Local-first long-term memory for Maxim's personal AI agent...",
  "bank_retain_mission": "Retain only durable information likely to matter in future sessions..."
}

---

{
  "config": {
    "retain_mission": null,
    "reflect_mission": null,
    "observations_mission": null
  }
}

---

{
  "bank_id": "hermes",
  "name": "hermes",
  "mission": "",
  "background": ""
}

---

self._bank_mission = self._config.get("bank_mission", "")
self._bank_retain_mission = self._config.get("bank_retain_mission") or None
RAW_BUFFERClick to expand / collapse

Bug description

When Hermes is configured to use the Hindsight memory plugin, the documented config keys bank_mission and bank_retain_mission are read from ~/.hermes/hindsight/config.json but are not actually synced into the live Hindsight bank state.

This causes a confusing drift:

  • Hermes-side config contains the values
  • Hindsight WebUI / Banks API still show empty mission / reflect_mission / retain_mission
  • users conclude that Hindsight "did not apply" the settings

Environment

  • Hermes Agent: v0.12.0 (2026.4.30)
  • Local source checkout commit: 05c63259b
  • Hindsight API: 0.5.6
  • Mode: local_external
  • Repo: NousResearch/hermes-agent

What the docs currently say

/usr/local/lib/hermes-agent/plugins/memory/hindsight/README.md

| `bank_mission` | — | Reflect mission (identity/framing for reflect reasoning). Applied via Banks API. |
| `bank_retain_mission` | — | Retain mission (steers what gets extracted). Applied via Banks API. |

What happens in practice

Example Hermes config:

{
  "mode": "local_external",
  "api_url": "http://127.0.0.1:8889",
  "bank_id": "hermes",
  "bank_mission": "Local-first long-term memory for Maxim's personal AI agent...",
  "bank_retain_mission": "Retain only durable information likely to matter in future sessions..."
}

Hermes reports the Hindsight plugin as installed + available, and auto-retain works.

But the live Hindsight bank still shows:

GET /v1/default/banks/hermes/config

{
  "config": {
    "retain_mission": null,
    "reflect_mission": null,
    "observations_mission": null
  }
}

GET /v1/default/banks/hermes/profile

{
  "bank_id": "hermes",
  "name": "hermes",
  "mission": "",
  "background": ""
}

So WebUI is showing the real Hindsight bank state, and it does not reflect the Hermes config file.

Code audit

The installed plugin reads the config keys:

self._bank_mission = self._config.get("bank_mission", "")
self._bank_retain_mission = self._config.get("bank_retain_mission") or None

but in the installed plugins/memory/hindsight/__init__.py these fields appear to be assigned only and never used to call Hindsight bank/profile/config APIs.

In the audited install, the only references to _bank_mission / _bank_retain_mission were the field declarations and the assignments above.

Manual workaround that proves the server supports it

Manually patching the Hindsight bank via its own API works immediately:

  • PATCH /v1/default/banks/{bank_id}/config with reflect_mission / retain_mission
  • PATCH /v1/default/banks/{bank_id} with mission

After that, the values appear in both the Hindsight API and WebUI.

That suggests the bug is in Hermes plugin sync behavior, not in Hindsight.

Expected behavior

One of these should happen:

  1. On plugin init / config load, Hermes should sync bank_mission → Hindsight reflect_mission (and/or profile mission) and bank_retain_mission → Hindsight retain_mission via Banks API.
  2. If this sync is intentionally unsupported, the README/docs should stop claiming these keys are "Applied via Banks API".

Why this matters

This is especially confusing in local_external setups, where users often compare:

  • Hermes config at ~/.hermes/hindsight/config.json
  • Hindsight WebUI bank config/profile

and assume a bad install when the problem is actually a plugin drift / missing implementation.

Related

Possibly adjacent to, but not the same as:

  • #18554 — Hindsight plugin: expose bank management, cross-bank recall, mental models, and observations as Hermes tools

extent analysis

TL;DR

The Hermes plugin for Hindsight is not syncing the bank_mission and bank_retain_mission config keys to the Hindsight bank state, causing a drift between the Hermes config and the Hindsight WebUI.

Guidance

  • The issue is likely caused by the Hermes plugin not using the _bank_mission and _bank_retain_mission fields to call the Hindsight bank/profile/config APIs.
  • To verify, check the Hermes plugin code for any references to these fields being used to make API calls to Hindsight.
  • A manual workaround is to patch the Hindsight bank via its own API using PATCH /v1/default/banks/{bank_id}/config and PATCH /v1/default/banks/{bank_id}.
  • The Hermes plugin should be updated to sync the bank_mission and bank_retain_mission config keys to the Hindsight bank state on plugin init or config load.

Example

# Example of how the Hermes plugin could sync the config keys to Hindsight
import requests

# ...

self._bank_mission = self._config.get("bank_mission", "")
self._bank_retain_mission = self._config.get("bank_retain_mission") or None

# Sync config keys to Hindsight
requests.patch(f"/v1/default/banks/{self._bank_id}/config", json={"reflect_mission": self._bank_mission, "retain_mission": self._bank_retain_mission})
requests.patch(f"/v1/default/banks/{self._bank_id}", json={"mission": self._bank_mission})

Notes

  • The issue is specific to the Hermes plugin for Hindsight and does not appear to be a problem with the Hindsight API itself.
  • The manual workaround suggests that the Hindsight API supports the necessary endpoints for syncing the config keys.

Recommendation

Apply workaround: update the Hermes plugin

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

One of these should happen:

  1. On plugin init / config load, Hermes should sync bank_mission → Hindsight reflect_mission (and/or profile mission) and bank_retain_mission → Hindsight retain_mission via Banks API.
  2. If this sync is intentionally unsupported, the README/docs should stop claiming these keys are "Applied via Banks API".

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - ✅(Solved) Fix [Bug]: Hindsight plugin reads bank_mission/bank_retain_mission but does not sync them to Hindsight Banks API [1 pull requests, 1 participants]