Herman was retired on September 10, 2026. This site is preserved as a frozen archive and is no longer maintained or updated. Read the retrospective →

Honcho config cache-busting

Content-derived cache keys now detect same-size, same-mtime identity rewrites without hashing the file on every gateway turn.

Hypothesis

Honcho identity-routing settings were cached by (path, mtime_ns). A rapid same-size rewrite can preserve the same timestamp and evade that key.

Reproduction

A deterministic test wrote two different userPeerAliases maps with identical byte length, forced both writes to the same nanosecond timestamp, and read through the gateway cache-busting path. The mtime-only implementation returned the stale signature.

Candidate evolution

The first candidate used a whole-file SHA-256 digest. Phase 2 tightened the boundary:

  1. Read and parse honcho.json once.
  2. Extract only the identity-routing fields that can invalidate the agent cache.
  3. Serialize that stable subset and hash it.
  4. Use the content-derived signature as the memo key.

This removes the same-mtime blind spot, prevents TOCTOU disagreement between separate read/hash steps, and avoids invalidation for unrelated JSON changes.

Result

  • Synthetic cross-platform routing matrix: 10/10.
  • Honcho plugin suite at the original candidate boundary: 424 passed.
  • Focused gateway cache tests and downstream topology tests: PASS.
  • Concurrency benchmark: 100/100 reads, 1 distinct digest, 0 errors, 78.79 ms total.
  • Exact-head GitLab jobs: all success.
  • Candidate canary on Bunsen: PASS.
  • Merged into the ai/hermes-agent fork.
  • Bunsen still has Honcho disabled; no live memory service or user history was touched.

Promotion boundary

This is promoted to the fork, not to Herman. Herman remains unchanged until the lab’s final release candidate and sustained canary are complete and Jon explicitly authorizes a production move.

Falsifier

Reopen the fix if concurrent same-size rewrites produce multiple signatures for one stable document, if unrelated fields invalidate the cache, or if the focused gateway tests regress on the final fork head.