hermes - 💡(How to fix) Fix [Feature]: Surface recall_types workaround for hindsight memory bloat in setup/docs

Official PRs (…)
ON THIS PAGE

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…

The hindsight plugin's default recall_types=None (recall all types: world + experience + observation) causes visible near-duplicate memory injection in long-running sessions. The upstream Hindsight project has closed the three most relevant fixes as NOT_PLANNED or rejected the PR, and the one community-validated workaround (recall_types=["observation"]) is buried in an issue comment — not mentioned in either Hermes docs or Hindsight's Hermes-oriented guides. Hermes could help its users a lot by surfacing this trade-off during hermes gateway setup, or at minimum documenting it on the hindsight plugin page.

Error Message

WARN-level one-shot log when recall_types is None and the bank has > N experience entries, pointing to the flag and doc section.

Root Cause

Root cause chain

Fix Action

Fix / Workaround

The hindsight plugin's default recall_types=None (recall all types: world + experience + observation) causes visible near-duplicate memory injection in long-running sessions. The upstream Hindsight project has closed the three most relevant fixes as NOT_PLANNED or rejected the PR, and the one community-validated workaround (recall_types=["observation"]) is buried in an issue comment — not mentioned in either Hermes docs or Hindsight's Hermes-oriented guides. Hermes could help its users a lot by surfacing this trade-off during hermes gateway setup, or at minimum documenting it on the hindsight plugin page.

  1. Upstream retain feedback loop (vectorize-io/hindsight#360) — already mitigated on Hermes side via _strip_injected_memories in plugins/memory/hindsight/__init__.py. Retain side only.
  2. Upstream recall has no MMR / result-level dedupvectorize-io/hindsight#1309 (MMR + temporal decay) closed NOT_PLANNED on 2026-04-29. vectorize-io/hindsight#826 (retain-time dedup) closed NOT_PLANNED on 2026-04-07; maintainer suggested document_id upsert.
  3. Experience-layer semantic dedupvectorize-io/hindsight#1284 OPEN; community PR #1371 (dedup observations by semantic similarity) was closed un-merged on 2026-05-04. In that thread the maintainer advises: recall_types=["observation"] as a workaround.

None mention recall_types as a tunable knob. The 2026-04-15 guide enumerates autoRecall, recallInjectionPosition, recallBudget, recallMaxTokens, recallTopK, recallContextTurns, recallPromptPreamble — no recallTypes. The only user-facing mention of recall_types=["observation"] as a bloat mitigation lives inside a maintainer comment on #1284, effectively undiscoverable for an affected user.

Code Example

self._recall_types = self._config.get("recall_types") or None

---

self._auto_recall = self._config.get("auto_recall", True)
self._recall_max_tokens = int(self._config.get("recall_max_tokens", 4096))
self._recall_types = self._config.get("recall_types") or None
RAW_BUFFERClick to expand / collapse

Summary

The hindsight plugin's default recall_types=None (recall all types: world + experience + observation) causes visible near-duplicate memory injection in long-running sessions. The upstream Hindsight project has closed the three most relevant fixes as NOT_PLANNED or rejected the PR, and the one community-validated workaround (recall_types=["observation"]) is buried in an issue comment — not mentioned in either Hermes docs or Hindsight's Hermes-oriented guides. Hermes could help its users a lot by surfacing this trade-off during hermes gateway setup, or at minimum documenting it on the hindsight plugin page.

Symptom (reproduced locally)

  • WSL2 Ubuntu, Hermes gateway (user-scope systemd unit), hindsight-* 0.6.0 local_embedded, profile hermes.
  • After normal use on the WeChat IM channel, turns started receiving the same fact re-surfaced 2–3 times within one LLM response (verbatim or near-duplicate wording).
  • Two prior debugging sessions (wipe hindsight DB / spin up a second pg instance) did not help — symptoms return once experience entries accumulate again.

Root cause chain

  1. Upstream retain feedback loop (vectorize-io/hindsight#360) — already mitigated on Hermes side via _strip_injected_memories in plugins/memory/hindsight/__init__.py. Retain side only.
  2. Upstream recall has no MMR / result-level dedupvectorize-io/hindsight#1309 (MMR + temporal decay) closed NOT_PLANNED on 2026-04-29. vectorize-io/hindsight#826 (retain-time dedup) closed NOT_PLANNED on 2026-04-07; maintainer suggested document_id upsert.
  3. Experience-layer semantic dedupvectorize-io/hindsight#1284 OPEN; community PR #1371 (dedup observations by semantic similarity) was closed un-merged on 2026-05-04. In that thread the maintainer advises: recall_types=["observation"] as a workaround.

The document_id path from #826 does not apply to Hermes: Hermes uses session_id + update_mode="append" to protect /resume from overwriting prior turns (commit f9c6c5ab — "fix(hindsight): scope document_id per process to avoid resume overwrite"). Correct for conversational flow, but can't double as a dedup mechanism.

Why the current default is a footgun

plugins/memory/hindsight/__init__.py:1180:

self._recall_types = self._config.get("recall_types") or None

None → all types → experience layer (provably accumulating per #1284) gets injected every turn.

Verified against main as of filing: plugins/memory/hindsight/__init__.py:1178-1180 still reads

self._auto_recall = self._config.get("auto_recall", True)
self._recall_max_tokens = int(self._config.get("recall_max_tokens", 4096))
self._recall_types = self._config.get("recall_types") or None

— so this issue applies to tip-of-main, not just the filer's version.

Cross-check of Hindsight's three Hermes/OpenClaw-oriented guides:

  • 2026-04-14-guide-debug-hermes-memory-not-recalling-context
  • 2026-04-15-guide-control-recall-injection-in-openclaw-with-hindsight
  • 2026-04-28-guide-zh-fix-openclaw-retention-and-recall-on-default-main-sessions

None mention recall_types as a tunable knob. The 2026-04-15 guide enumerates autoRecall, recallInjectionPosition, recallBudget, recallMaxTokens, recallTopK, recallContextTurns, recallPromptPreamble — no recallTypes. The only user-facing mention of recall_types=["observation"] as a bloat mitigation lives inside a maintainer comment on #1284, effectively undiscoverable for an affected user.

Proposal (lightest → heaviest)

Option A — Documentation (lowest effort, highest ROI) Add a "Memory bloat / repeated recall" section to plugins/memory/hindsight/README.md:

  • Brief explanation of why recall with default types accumulates
  • Link chain to #1284 / #826 / #1309
  • recall_types: ["observation"] as the config-level mitigation + explicit trade-off (loses synthesized experience/world layers)

Option B — Setup wizard opt-in In hermes gateway setup / memory setup, when hindsight is selected, add:

Enable bloat mitigation via recall_types=["observation"]? Avoids cumulative experience-layer duplicates (upstream #1284 OPEN), at the cost of losing synthesized "experience" memories. Default: off.

Option C — Startup-time hint WARN-level one-shot log when recall_types is None and the bank has > N experience entries, pointing to the flag and doc section.

Happy to draft the PR for A (and B if the framing resonates first).

Environment

  • Hermes Agent: v0.12.0 (2026.4.30) — 216 commits behind main at filing time (verification against main included above)
  • hindsight-*: 0.6.0 (local_embedded mode)
  • OS: WSL2 Ubuntu, systemd user scope
  • Gateway management: systemctl --user

Related

  • vectorize-io/hindsight#826 (CLOSED NOT_PLANNED): Deduplicate near-identical content at retain time
  • vectorize-io/hindsight#1309 (CLOSED NOT_PLANNED): Add MMR diversification + temporal decay to recall scoring
  • vectorize-io/hindsight#1284 (OPEN): Experience entries accumulate without further consolidation
  • vectorize-io/hindsight PR #1371 (CLOSED, un-merged): fix(consolidation): deduplicate observations by semantic similarity
  • vectorize-io/hindsight#360 (CLOSED): Memory feedback loop (mitigated on Hermes side)
  • NousResearch/hermes-agent#20595 (OPEN): Memory hygiene checks are advisory-only — parallel problem in built-in memory

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…

Still need to ship something?

×6

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

Back to top recommendations

TRENDING