Skip to content

feat(agent): per-turn micro-compaction to amortize context compression (salvage of #74522) - #75345

Merged
kshitijk4poor merged 14 commits into
NousResearch:mainfrom
kshitijk4poor:salv/74522-micro-compaction
Jul 31, 2026
Merged

feat(agent): per-turn micro-compaction to amortize context compression (salvage of #74522)#75345
kshitijk4poor merged 14 commits into
NousResearch:mainfrom
kshitijk4poor:salv/74522-micro-compaction

Conversation

@kshitijk4poor

Copy link
Copy Markdown
Collaborator

Summary

Salvage of #74522 by @lxman: opt-in per-turn micro-compaction — instead of one long stall when the context window fills, each completed turn folds the oldest un-absorbed exchange into a rolling summary, keeping occupancy low and flat. All 11 of @lxman's commits cherry-picked with authorship preserved, plus one follow-up commit fixing two integration bugs found in review.

Off by default (compression.micro_compact: false) because each pass rewrites already-sent history and breaks the prompt-cache prefix; the PR body, config comments, and docs/micro-compaction.md state that cost plainly.

What the follow-up commit fixes

Both bugs were confirmed with empirical probes against the production repair path, not just by reading:

1. Alternation: summary marker destroyed by repair_message_sequence.
The marker was role="user" and an exchange was a single assistant+tools group, so splicing between two user turns produced user → marker(user) → user. The pre-request repair pass (runs before EVERY API call) merged the marker into the neighbouring real user message — metadata gone, cursor unrecoverable on resume, summary text duplicated into the transcript on every later pass (the transcript grew each turn).
Fix: an exchange is now a full agent turn (assistant + tools + follow-up iterations, bounded by user messages), the marker is assistant-role, and superseding an old marker deliberately merges the two newly-adjacent real user turns (plain-text \n\n-join, identical to repair pass 2 — no user text is ever lost).
Probe: repairs 2 → 0, marker survives, no summary leakage, resume-scan finds the marker.

2. Defrag silently absorbed user messages.
_defrag_rolling_summary serialized the whole remaining middle (user turns included) and spliced it away — 8 of 10 user prompts destroyed in one pass, contradicting the feature's headline "your messages are never compacted" invariant.
Fix: defrag now re-summarizes only the rolling summary text and rewrites the marker content in place; transcript shape, cursor, and user turns untouched.
Probe: 10 of 10 user prompts survive.

Also: marker provenance is now COMPRESSED_SUMMARY_HAS_USER_TURN_KEY=False (micro markers absorb only assistant/tool content, per the #64650 invariant).

Validation

Before fix After fix
repair pass on compacted transcript 2 repairs, marker destroyed 0 repairs, marker intact
user prompts surviving defrag 2/10 10/10
summary copies after 2 passes + repair 2 (growing) 1
tests/agent/test_micro_compaction.py 23 28 (5 new regression tests)
compression/compaction/finalizer suites 395 passed, 3 skipped
ruff on changed files clean

Credit

Based on #74522 by @lxman — cherry-picked to preserve authorship (11 commits). The feature design, docs, telemetry, and measurement methodology are his; the follow-up commit only corrects the two integration bugs above.

Depends on #75344 (AUTHOR_MAP entry) landing first.

Closes #74522

lxman and others added 12 commits July 31, 2026 14:23
Batch compaction pauses a session for one large summarization once the
window fills. Micro-compaction spreads that cost out: after each completed
turn, `finalize_turn` folds the single oldest un-absorbed exchange
(assistant message plus its tool results) into a rolling summary, so the
work happens in small increments during post-turn idle time instead of one
long stall.

Mechanics:
  - a cursor tracks the first message not yet absorbed, recovered from the
    transcript's last summary marker when in-memory state is unavailable;
  - protected head and tail windows are never touched, so the system prompt
    and recent turns stay verbatim;
  - the absorbed span is replaced by a marker carrying the usual
    `_compressed_summary` metadata, so resume, handoff and `/compress`
    treat it exactly like a batch summary;
  - `archive_and_compact` keeps the session DB in step, otherwise the
    append-only flush would leave the original rows active and a resume
    would double-load both summary and originals;
  - when the rolling summary itself passes a token threshold it is
    defragged: re-summarized in one shot and the cursor jumps to the tail;
  - an exchange the summarizer can't handle is retried a bounded number of
    times, then skipped, so one poison exchange can't stall every turn.

Keep only the newest summary marker. The rolling summary is cumulative, so
each marker already contains everything the previous ones held; leaving them
stacked near-duplicate copies of the same text, each with its own heading and
end-marker scaffolding, and the transcript grew on every turn instead of
shrinking. Measured over six turns on a 12-exchange conversation with tool
output: 4104 -> 4797 tokens before, 4104 -> 2572 after.

Off switch: `compression.micro_compact: false` (default on).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Covers what it does, the head/tail protection, the cursor and rolling
summary, defrag, how the session DB is kept in step, and the failure
paths. States the tradeoff up front: compression cost is amortized across
turns, at the price of older detail becoming summarized earlier in a
session than batch-only compaction would.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
`_find_one_exchange`'s docstring described an exchange as "(optional) user
message + assistant message + its tool results", but the walk skips past
user messages and starts at the assistant, so user turns are never absorbed
into the rolling summary.

The code is right and the docstring was wrong. Assistant output is largely
an account of what was done and survives summarising with little loss. The
user's messages are the intent everything else is derived from and cannot be
reconstructed from the work that followed — paraphrasing "use the existing
helper, don't add a new one" into a summary is how an agent ends up doing
the opposite six turns later. They are also cheap: a prompt is normally a
tiny fraction of what one tool result costs.

Correct the docstring, document the property (and its cost — a floor on how
small the middle can get, since user turns accumulate), and add a test so it
stays deliberate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The `_micro_compact` docstring cited "NousResearch#82483" for the resume double-load
problem. No such issue exists — the repository's highest number is 74323,
so the reference was invented rather than looked up.

The reasoning it was attached to is correct and stays: the session flush is
append-only, so an in-memory splice alone leaves the original rows active
and a resume loads both the summary and the messages it replaced. Only the
citation was wrong.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The existing log line reports message counts, which is the least
informative number available here: absorbing one tool-heavy exchange can
drop hundreds of tokens while moving the count by one. There was no way to
answer "is this actually helping?" from a real session.

Emit one content-free JSON line per pass, in the same shape as the batch
compaction telemetry: before/after tokens, the delta, the size of the
absorbed exchange, the rolling summary size, duration, and running
per-session totals so a whole run can be read off the last line. No
transcript content rides along.

Add scripts/micro_compaction_report.py to aggregate those lines into
passes, outcome mix, net tokens saved, mean exchange size and durations,
with an optional per-session breakdown.

Measuring it immediately surfaced something worth documenting: the first
pass in a session normally *costs* tokens. The summary marker carries a
fixed ~400 tokens of scaffolding, paid on pass one against a single
absorbed exchange. From pass two the marker is replaced rather than added,
so the overhead is already paid and each exchange is close to pure saving.
Break-even is typically the second or third pass. Tests cover the
telemetry contract, the cumulative totals, and that first-pass/later-pass
shape so nobody reads a single turn and concludes it made things worse.

The estimator costs ~5 ms at 600 messages and ~20 ms at 1200, taken twice
per pass, post-turn — and only once an exchange is actually in hand, so
turns that no-op early pay nothing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tokens saved is the wrong headline for this feature. Micro-compaction is
not an efficiency optimisation — the same summarization work happens either
way. What it buys is (a) that work amortized across turns instead of one
stall, and (b) a window kept low enough that a session runs much further
before needing a hard compaction at all.

Neither shows up in "net tokens saved". A session can save nothing on paper
and still be a clear win on both counts.

So the telemetry now carries occupancy: tokens_after as a share of the
compaction threshold, plus the threshold and resolved window it was
computed from. That is the number that says whether a session has headroom
left. The report leads with it, and cross-references the batch
`compression_attempt` lines already in the log so it can show how often the
long pause actually fired — ideally never.

Occupancy is read from the cached threshold only. The public
`threshold_tokens` property resolves lazily and can issue a synchronous
/models probe (NousResearch#32221); telemetry must never be the thing that blocks a
turn, so an unresolved window reports null. In practice a pass has already
resolved it via the tail calculation, so the field is populated. A test
pins the no-forcing behaviour directly against the emitter.

The report is pure ASCII: `scripts/check_subprocess_stdin.py` currently
dies on a cp1252 console before printing its results, and a diagnostic tool
that crashes on the platform it is diagnosing is worse than no tool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The cursor was set to the pre-splice `exchange_end`. A splice collapses the
absorbed span -- an assistant plus its tool results, often four or more
messages -- into a single marker, and may also drop a superseded marker
further back, so every index after it shifts.

The stale cursor therefore overshot, landing inside a *later* exchange's
tool group. The next pass's `_find_one_exchange` walked forward from there
to the following assistant, so the exchange it had landed inside was never
absorbed at all. On tool-bearing conversations micro-compaction was
silently doing roughly half the work it should.

Traced on a 3-tool-per-exchange transcript: the cursor sat at index 6 when
the marker was at 2, and the message count stalled at 32 instead of
continuing to 28.

Derive the cursor from the marker's actual position in the spliced result
instead, which is self-correcting regardless of how much the splice moved.
Apply it on the defrag path too, which had the same staleness.

Found by a randomized long-horizon harness (480 conversation shapes x 25
passes, varying tool-group sizes and summarizer failure modes) asserting
structural and progress invariants after every pass. Existing tests missed
it because their fixtures have no tool results, so the absorbed span is one
message and nothing shifts. The regression test uses tool groups.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three corrections, all from measuring a real 3.5 hour session rather than
reasoning about the design.

"During the idle moment after a response" was wrong. A pass is a real call
to the compression model at the end of a turn: the answer has streamed, but
the turn does not close until it finishes. Measured 2 to 37 seconds, median
around 31, on a small local model. Say so.

Add the choice of `auxiliary.compression` model as its own section, because
it dominates everything else here. A pass sends only a few thousand tokens
but runs every turn, so latency is felt repeatedly, and reasoning models are
a poor fit -- merging one exchange into a summary is mechanical work, and a
thinking model spends reasoning tokens on it for no benefit. Two measured
data points are given as illustrations of the shape, explicitly not as
recommendations: the right answer depends on the operator's hardware.

Add what a working session actually looks like: occupancy climbing to ~22%
and flattening (equilibrium -- 4,841 tokens added between the last two
passes, 4,395 reclaimed), zero batch compactions, and reclamation only
ramping after the tail budget is crossed. Also state the cost in the same
breath rather than burying it.

Frame the feature as a tuning option rather than a win: it lets you choose
how the compression cost is distributed and which model pays it. It is not
a magic bullet and the docs should not imply otherwise.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The rolling summary lives only in memory. A resumed session starts with an
empty one while the marker carrying every previously absorbed exchange is
still in the transcript. The first pass after a resume therefore built a
marker from a single exchange and superseded the marker holding the entire
history -- silently discarding everything micro-compaction had accumulated.

This was introduced by the supersede fix. Before it, markers piled up
wastefully, but nothing was ever lost.

Two changes, so a single failure cannot lose data:

Rehydrate. When the cursor is recovered by scanning the transcript -- the
resume path -- also recover the rolling summary from that marker, so the
next pass merges into the existing history instead of replacing it.
Extraction uses rfind for the heading because SUMMARY_PREFIX references the
heading text itself, so the first occurrence is inside the preamble.

Gate superseding. Earlier markers are dropped only when this pass's summary
is demonstrably cumulative, i.e. the rolling summary was non-empty going in.
If rehydration ever fails, the pass keeps both markers: wasteful, but the
history survives.

Tests cover the resume path, the failed-rehydration fallback, and the
round trip of a summary through a marker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review raised whether default-on can be reconciled with the prompt-cache
contract in AGENTS.md, which permits mutating past context only for context
compression and treats per-conversation caching as sacred. It cannot, and the
codebase already says so in its own words.

A micro-compaction pass rewrites already-sent history, so it invalidates the
cached prefix every turn rather than at an episodic boundary. That is the exact
cost the proactive prune gates against: `proactive_prune_min_reclaim_tokens`
exists, per its own config comment, to keep rewrites to "one big episodic break
instead of a tiny break every tool iteration." Micro-compaction has no
equivalent gate -- one exchange per turn means one break per turn, by design.

Default to off. An operator who wants the amortized stall can opt in with
`compression.micro_compact: true` and accept the tradeoff knowingly; nobody
inherits a per-turn cache break from installing an update.

Also register the key in config_defaults so it is discoverable and picked up by
the update path's new-options check -- it was previously read by agent_init but
declared nowhere -- and document the cache cost in docs/micro-compaction.md
instead of only the benefit. The measurements behind the feature (occupancy
plateau, zero batch compactions) never priced cache invalidation, and the doc
now says which numbers a reader would need to measure to justify enabling it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The on/off switch was the only knob. A pass fired after every completed turn,
absorbed exactly one exchange, and there was no way to ask for less. Since a
pass is also what breaks the prompt-cache prefix, "how often does it run" and
"how often do I pay a cache break" are the same question, and it had no answer.

Add `compression.micro_compact_every_n_turns` (default 1, clamped to >= 1). At 1
the behaviour is what it was; at 5 you get a fifth of the breaks and a fifth of
the reclaim rate. The counter advances per invocation rather than per committed
pass, so a turn that finds nothing to absorb still moves the cadence along and
cannot wedge it, and a bogus 0 or negative degrades to "every turn" instead of
silently disabling compaction.

Also expose `micro_compact_defrag_threshold_tokens`, which has been a hardcoded
attribute on the compressor with no path from config since it was added.

This does not give micro-compaction the prune's reclaim-size gate -- a pass
still commits whatever the single absorbed exchange saved. It makes the break
frequency tunable, which reaches the same end by absorbing less rather than by
waiting for a bigger win. The docs now say that plainly, including that a
reclaim threshold is the obvious follow-up and does not exist yet.

Tests cover the skip-until-due window, the cursor and prefix staying untouched
on skipped turns, the clamp, and that the feature is off unless enabled.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…eserving

Two integration bugs found during review of NousResearch#74522, both confirmed with
empirical probes against the production message-repair path:

1. Alternation: the summary marker was role="user" and an exchange was a
   single assistant+tools group, so splicing between two user turns produced
   user -> marker(user) -> user. The pre-request repair_message_sequence pass
   (conversation_loop.py, runs before EVERY API call) then merged the marker
   into the neighbouring real user message: metadata gone, cursor
   unrecoverable on resume, and the summary text duplicated into the
   transcript on every later pass (the transcript GREW every turn).
   Fix: an exchange is now a full agent turn (assistant + tools + follow-up
   assistant iterations, bounded by user messages), the marker is
   assistant-role, and superseding an old marker deliberately merges the two
   adjacent real user turns (plain-text \n\n-join, identical to repair
   pass 2) so the returned transcript is alternation-valid by construction.
   Probe result: repairs 0 (was 2), marker survives, no summary leakage.

2. Defrag destroyed user messages: _defrag_rolling_summary serialized the
   whole remaining middle (user turns included) and spliced it away —
   8 of 10 user prompts destroyed in one pass, contradicting the feature's
   "your messages are never compacted" invariant. Fix: defrag now
   re-summarizes only the rolling summary TEXT and rewrites the marker
   content in place; transcript shape, cursor, and user turns untouched.
   Probe result: 10 of 10 user prompts survive.

Also: marker provenance is now COMPRESSED_SUMMARY_HAS_USER_TURN_KEY=False —
micro markers absorb only assistant/tool content (NousResearch#64650 invariant), and
real user turns remain in the transcript for provenance detection.

Adds 5 regression tests (repair-pass integration, alternation on
multi-iteration tool turns, defrag user survival, defrag input scope,
marker provenance); updates the two existing tests and the design doc to
the corrected semantics. 28 tests pass.
@teknium1 teknium1 added the area/compression Context compression and continuation sessions label Jul 31, 2026
@alt-glitch alt-glitch added type/feature New feature or request comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint P2 Medium — degraded but workaround exists needs-decision Awaiting maintainer decision before any implementation sweeper:risk-caching Sweeper risk: may break/degrade prompt caching or cache-key stability (invariant) sweeper:risk-session-state Sweeper risk: may lose/corrupt/mis-associate session or context state sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades labels Jul 31, 2026
@alt-glitch

Copy link
Copy Markdown
Collaborator

This was generated by AI during triage.

Salvage of open #74522 with the feature now opt-in (compression.micro_compact: false), avoiding the predecessor's default-on cache regression. Per-turn rewrites still require a maintainer decision on the cache-stability contract, so this is needs-decision; it also depends on #75344 for attribution. Please confirm the current Python slice 7/8 failure is unrelated before merge.

…ck-typed compressors

tests/run_agent/test_proactive_prune_loop_wiring.py builds agents with a
MagicMock compressor; getattr(mock, '_micro_compact_enabled', False)
returns a truthy auto-attribute, so the hook called _micro_compact on the
mock and spliced its (empty-iterating) return over the transcript —
wiping all messages before persist (CI slice 7/8 failure).

Gate now requires _micro_compact_enabled is True, a callable
_micro_compact, and a non-empty list result before touching messages.
Same hardening protects production plugin context engines that don't
subclass ContextCompressor.
Phase 2 review findings on the salvage branch:

C1 (critical): batch and micro summary markers share
COMPRESSED_SUMMARY_METADATA_KEY, and compress() never reset micro state.
After micro absorbed exchanges 1..k, a batch compaction summarizing
1..m (m>k) could fire; the next micro pass's supersede then dropped the
batch marker (whose content the stale rolling summary does NOT contain)
and archive_and_compact immediately made the loss durable. Defrag had
the same hazard: it rewrote "the newest marker" even if that was a
batch marker. Empirically confirmed with a probe (batch marker content
destroyed in one pass).

Fix, three parts:
- Micro-created markers now carry MICRO_COMPACT_MARKER_KEY; supersede
  and defrag only ever touch micro-tagged markers. Rehydration in
  _resolve_compact_cursor tags the marker it absorbs (containment
  proof), which safely covers adopting a batch marker as the new
  rolling base after a reset.
- compress() success path resets micro rolling summary/cursor state so
  a stale summary can never claim cumulativeness over a batch marker.
- Regression tests for both directions plus the reset.

W4: _splice_micro_compact_result no longer strips _db_persisted stamps
from surviving messages. Micro archives in place under the SAME session
id (unlike batch's child-session rotation, NousResearch#57491), so surviving stamps
are accurate; stripping them meant an archive_and_compact failure left
every previously-persisted message unstamped and the next append-only
flush re-inserted them all as duplicate active rows.

W5: finalize_turn micro gate now checks agent._persist_disabled —
persistence-isolated fork agents (background review) must not burn an
aux call per review turn, and must never archive_and_compact the
canonical session rows if their compressor ever gains a DB binding.

W1: _serialize_one_exchange now delegates to _serialize_for_summary
(was a ~70-line near-verbatim copy; one serializer, one place to fix).

S4: _find_one_exchange boundary guard rejects only assistant/tool
boundaries (the actual alternation hazard) instead of requiring user —
a stray mid-list system/injected message can no longer wedge the
cursor forever.

5 new regression tests; 38 micro/prune tests, 400 compression-suite
tests, 61 finalize/persist tests pass; ruff clean.
@kshitijk4poor
kshitijk4poor deleted the salv/74522-micro-compaction branch August 5, 2026 07:08
gabrielcosi pushed a commit to gabrielcosi/home-ops that referenced this pull request Aug 5, 2026
….7.30 ➔ v2026.8.3) (#253)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/gabrielcosi/hermes-agent](https://github.com/NousResearch/hermes-agent) | minor | `v2026.7.30` → `v2026.8.3` |

---

### Release Notes

<details>
<summary>NousResearch/hermes-agent (ghcr.io/gabrielcosi/hermes-agent)</summary>

### [`v2026.8.3`](https://github.com/NousResearch/hermes-agent/releases/tag/v2026.8.3): Hermes Agent v0.20.0 (2026.8.3)

[Compare Source](https://github.com/NousResearch/hermes-agent/compare/v2026.7.30...v2026.8.3)

##### Hermes Agent v0.20.0 (v2026.8.3)

**Release Date:** August 3, 2026
**Since v0.19.0:** \~3,650 commits · \~1,400 merged PRs · \~5,200 files changed · \~559,000 insertions · \~405,000 deletions · **\~1,200 issues closed** · 650+ contributors

> **The Herald Release.** Hermes is the herald of the gods, and this release makes him one in earnest: he **speaks** (real-time conversational voice with streaming TTS, barge-in, on-device wake words, and hands-free control across the CLI, desktop, and every audio-capable gateway platform), he **carries word to other agents** (A2A v1.0), he **announces events to your systems** (signed outbound webhooks), and he **cites his sources** (grounded research with verifiable citations and fact-checking). Around that spine: the desktop app became a platform (artifacts with live preview, a plugin SDK, quick-entry from anywhere, multiple windows), the CLI got a wave of power commands (`!` shell mode, `/init`, `/diff`, `/context`, `/focus`), compression got smarter and gentler, and the tools themselves now recover from their own failures instead of making the model guess. This release rolls up everything from the v0.19.1 infrastructure patch tag — that window is fully documented here.

***

##### ✨ Highlights

- **Talk to Hermes — streaming, conversational voice with barge-in** — Voice mode used to mean: speak, wait for the whole reply to generate, then listen to one long audio file. Now Hermes speaks clause-by-clause as the response streams, you can interrupt it mid-sentence by just talking (it stops, listens, and the model is told you cut in), and busy-aware silence detection means it doesn't talk over you. This works in CLI voice mode, on the desktop, and through gateway adapters. Talking to Hermes finally feels like a conversation, not a voicemail exchange. ([#&#8203;69511](https://github.com/NousResearch/hermes-agent/pull/69511), [#&#8203;73862](https://github.com/NousResearch/hermes-agent/pull/73862), [#&#8203;74223](https://github.com/NousResearch/hermes-agent/pull/74223), [#&#8203;74000](https://github.com/NousResearch/hermes-agent/pull/74000), [#&#8203;69602](https://github.com/NousResearch/hermes-agent/pull/69602) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **Wake words and hands-free control** — Say your own open-vocabulary wake phrase ("hey Hermes", or anything you pick) and Hermes starts listening — detection runs on-device, so no audio leaves your machine while it waits. Multi-profile voice routing means different wake words can reach different profiles, and saying "stop" ends the voice chat on every surface without touching the keyboard. Your terminal is now something you can talk to from across the room. ([#&#8203;70509](https://github.com/NousResearch/hermes-agent/pull/70509), [#&#8203;73106](https://github.com/NousResearch/hermes-agent/pull/73106), [#&#8203;73933](https://github.com/NousResearch/hermes-agent/pull/73933) — [@&#8203;teknium1](https://github.com/teknium1))

- **Voice on every platform** — Send a voice note to Hermes on WhatsApp, Feishu, DingTalk, LINE, QQ, Photon, or Weixin and it's transcribed and answered; auto-TTS replies are delivered platform-aware (opus where platforms want opus, captions attached correctly). STT is now fully configurable — its own `hermes tools` category, GUI toggles, dashboard dropdowns, unified language resolution so transcripts stop coming back in the wrong language, and OpenAI's gpt-transcribe support. One unified spoken-text preprocessor cleans markdown, code, and URLs out of speech across all TTS providers. ([#&#8203;73515](https://github.com/NousResearch/hermes-agent/pull/73515), [#&#8203;73508](https://github.com/NousResearch/hermes-agent/pull/73508), [#&#8203;73910](https://github.com/NousResearch/hermes-agent/pull/73910), [#&#8203;73513](https://github.com/NousResearch/hermes-agent/pull/73513), [#&#8203;73067](https://github.com/NousResearch/hermes-agent/pull/73067) — [@&#8203;teknium1](https://github.com/teknium1))

- **Research you can trust — grounded citations with fact-checking** — The new `grounded-citations` skill makes Hermes produce research where every claim is backed by a verifiable source: quotes are matched against the actual page text (not hallucinated), citations link to the exact evidence, and a fact-checking mode turns the same machinery on any document or claim you hand it — it tells you what checks out, what doesn't, and what couldn't be verified. If you use Hermes for research, this is the difference between "sounds right" and "provably sourced." ([#&#8203;71698](https://github.com/NousResearch/hermes-agent/pull/71698), [#&#8203;77104](https://github.com/NousResearch/hermes-agent/pull/77104) — [@&#8203;teknium1](https://github.com/teknium1))

- **Outbound webhooks — Hermes pushes events to your systems** — Until now, integrating with Hermes meant polling or listening on a platform. Now Hermes pushes **signed lifecycle events** (session activity, turn completions, tool events) to any HTTP endpoint you register — with HMAC signatures so your receiver can verify authenticity. Wire Hermes into your CI, your home automation, your dashboards, or any service that speaks HTTP, with no polling loop. ([#&#8203;69406](https://github.com/NousResearch/hermes-agent/pull/69406) — [@&#8203;teknium1](https://github.com/teknium1))

- **The desktop app becomes a platform — artifacts, plugin SDK, quick entry** — Hermes desktop now renders **artifacts**: versioned cards with sandboxed live preview in a right-rail viewer, so generated HTML/apps run safely next to the chat. A real **plugin SDK** landed with Kanban as its founding plugin, `ctx.download` for handing users files, floating pane placement, and multiple GUI windows. A global-hotkey **quick-entry window** captures a thought into any session from anywhere in your OS. The desktop stopped being a chat client and started being a workbench. ([#&#8203;72345](https://github.com/NousResearch/hermes-agent/pull/72345), [#&#8203;61173](https://github.com/NousResearch/hermes-agent/pull/61173), [#&#8203;74413](https://github.com/NousResearch/hermes-agent/pull/74413), [#&#8203;72315](https://github.com/NousResearch/hermes-agent/pull/72315), [#&#8203;68259](https://github.com/NousResearch/hermes-agent/pull/68259), [#&#8203;73143](https://github.com/NousResearch/hermes-agent/pull/73143) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))

- **Hermes speaks Agent-to-Agent — A2A v1.0** — A new bundled plugin implements the Agent-to-Agent protocol, so Hermes can discover, talk to, and be driven by other A2A-compatible agents. This closes issue [#&#8203;514](https://github.com/NousResearch/hermes-agent/issues/514) — one of the oldest open feature requests in the repo. If you're building multi-agent systems with heterogeneous stacks, Hermes now has a standard wire protocol for joining them. ([#&#8203;77109](https://github.com/NousResearch/hermes-agent/pull/77109) — [@&#8203;teknium1](https://github.com/teknium1))

- **CLI power-user wave** — `!command` runs a shell command instantly without spending a model turn. `/init` scans your project and generates (or updates) an `AGENTS.md`. `/diff` shows staged/all/session changes from any surface, `/context` breaks down exactly what's filling your context window, `/focus` gives you a reduced-output view with hidden-line recovery, and Ctrl+S stashes a half-written prompt into a browsable panel. Plus `hermes import-agent` migrates your Claude Code or Codex CLI setup into Hermes in one command. ([#&#8203;72257](https://github.com/NousResearch/hermes-agent/pull/72257), [#&#8203;72178](https://github.com/NousResearch/hermes-agent/pull/72178), [#&#8203;72240](https://github.com/NousResearch/hermes-agent/pull/72240), [#&#8203;72242](https://github.com/NousResearch/hermes-agent/pull/72242), [#&#8203;72302](https://github.com/NousResearch/hermes-agent/pull/72302), [#&#8203;72262](https://github.com/NousResearch/hermes-agent/pull/72262), [#&#8203;72190](https://github.com/NousResearch/hermes-agent/pull/72190) — [@&#8203;teknium1](https://github.com/teknium1), several salvaging long-standing community PRs)

- **Correct the agent mid-turn — redirects** — If Hermes is heading the wrong way, you no longer have to `/stop` and re-explain. Type a correction while it works and the active turn is redirected: work in flight is preserved, the original prompt is kept, and the agent course-corrects with your new guidance. Paired with double-ESC draft discard and a composer undo stack, steering feels like editing, not restarting. ([#&#8203;63104](https://github.com/NousResearch/hermes-agent/pull/63104), [#&#8203;72339](https://github.com/NousResearch/hermes-agent/pull/72339), [#&#8203;74736](https://github.com/NousResearch/hermes-agent/pull/74736) — [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **Tools that fix themselves** — A sweep of self-recovery upgrades means the agent wastes far fewer turns on tool friction: truncated terminal output spills to a file the agent can read back, `patch` detects already-applied edits and diagnoses whitespace mismatches, `write_file` verifies content on disk, searches that match nothing probe for near-misses and recover, and common failure classes come back with actionable hints. The default tool-calling iteration limit also jumped 90 → 500 — long autonomous runs stopped hitting an artificial wall. ([#&#8203;77041](https://github.com/NousResearch/hermes-agent/pull/77041), [#&#8203;76998](https://github.com/NousResearch/hermes-agent/pull/76998), [#&#8203;77024](https://github.com/NousResearch/hermes-agent/pull/77024), [#&#8203;77055](https://github.com/NousResearch/hermes-agent/pull/77055), [#&#8203;77011](https://github.com/NousResearch/hermes-agent/pull/77011), [#&#8203;76992](https://github.com/NousResearch/hermes-agent/pull/76992), [#&#8203;72176](https://github.com/NousResearch/hermes-agent/pull/72176) — [@&#8203;teknium1](https://github.com/teknium1))

- **Compression that respects your conversation** — Context compression got a deep overhaul: proactive tool-result pruning for large-window models, per-turn micro-compaction that amortizes the cost instead of one giant pause, a guaranteed N-user-message tail so recent conversation always survives, progress-aware timeouts that stop punishing slow summary models, and ghost-skill defense so a pruned skill can never silently haunt a session. Thresholds are now configurable per-model and in absolute tokens. Long sessions stay coherent and stop stalling. ([#&#8203;70254](https://github.com/NousResearch/hermes-agent/pull/70254), [#&#8203;75345](https://github.com/NousResearch/hermes-agent/pull/75345), [#&#8203;70250](https://github.com/NousResearch/hermes-agent/pull/70250), [#&#8203;71508](https://github.com/NousResearch/hermes-agent/pull/71508), [#&#8203;70275](https://github.com/NousResearch/hermes-agent/pull/70275) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), salvaging multiple community PRs)

- **Smart approvals grow up** — `hermes approvals suggest` mines your approval history into allowlist proposals, operators can customize the smart-approval policy, a consecutive-denial circuit breaker stops a misbehaving loop cold, and desktop pairing approvals are profile-correct with a proper surface to answer them from. Plus a new approval gate for docker/podman daemon-redirect commands. Less clicking "approve", without giving an inch of control. ([#&#8203;72259](https://github.com/NousResearch/hermes-agent/pull/72259), [#&#8203;72186](https://github.com/NousResearch/hermes-agent/pull/72186), [#&#8203;72203](https://github.com/NousResearch/hermes-agent/pull/72203), [#&#8203;74446](https://github.com/NousResearch/hermes-agent/pull/74446), [#&#8203;71092](https://github.com/NousResearch/hermes-agent/pull/71092) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **Faster everywhere, again** — Prompt caching now covers tool schemas on native Anthropic without history loss. `hermes -w` cold start dropped \~14s → \~1.8s, `hermes update` no-ops got 2–6s faster, heavy SDKs lazy-load off the import path, config reads stopped deep-copying (54× faster on the telemetry gate), and the desktop shipped a second 60fps wave — streaming cost independent of transcript length, drag at 60fps with five streaming tabs, idle CPU near zero in the background. ([#&#8203;76032](https://github.com/NousResearch/hermes-agent/pull/76032), [#&#8203;71637](https://github.com/NousResearch/hermes-agent/pull/71637), [#&#8203;74218](https://github.com/NousResearch/hermes-agent/pull/74218), [#&#8203;74204](https://github.com/NousResearch/hermes-agent/pull/74204), [#&#8203;71835](https://github.com/NousResearch/hermes-agent/pull/71835), [#&#8203;72346](https://github.com/NousResearch/hermes-agent/pull/72346), [#&#8203;75218](https://github.com/NousResearch/hermes-agent/pull/75218) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **New places to run and be reached** — Buzz lands as a bundled gateway platform (Block's Nostr-based messenger, with native WebSocket transport and NIP-42 auth), the Vercel AI Gateway provider and Vercel Sandbox terminal backend return modernized, desktop gains an SSH remote-backend connection mode, and the Relay shipped four phases of parity — media, interactive prompts, thread lifecycle, typing indicators — plus HSP personal + org skill sync. ([#&#8203;73610](https://github.com/NousResearch/hermes-agent/pull/73610), [#&#8203;73761](https://github.com/NousResearch/hermes-agent/pull/73761), [#&#8203;74518](https://github.com/NousResearch/hermes-agent/pull/74518), [#&#8203;68130](https://github.com/NousResearch/hermes-agent/pull/68130), [#&#8203;71300](https://github.com/NousResearch/hermes-agent/pull/71300)–[#&#8203;71624](https://github.com/NousResearch/hermes-agent/pull/71624), [#&#8203;66730](https://github.com/NousResearch/hermes-agent/pull/66730) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;yoniebans](https://github.com/yoniebans), [@&#8203;benbarclay](https://github.com/benbarclay))

***

##### 🎙️ Voice & Speech

##### Conversational voice

- Streaming, conversational TTS with barge-in across all surfaces; clause-by-clause synthesis for CLI voice mode + gateway adapters ([#&#8203;69511](https://github.com/NousResearch/hermes-agent/pull/69511), [#&#8203;73862](https://github.com/NousResearch/hermes-agent/pull/73862) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))
- Voice chat UX polish — busy-aware silence, stop hint, thinking sounds, barge-in fix; full-duplex turn listener (interrupt by voice during generation AND playback) ([#&#8203;74000](https://github.com/NousResearch/hermes-agent/pull/74000), [#&#8203;74223](https://github.com/NousResearch/hermes-agent/pull/74223) — [@&#8203;teknium1](https://github.com/teknium1))
- On-device wake words with open-vocabulary phrases + multi-profile voice routing; say "stop" to end voice chat hands-free on every surface ([#&#8203;70509](https://github.com/NousResearch/hermes-agent/pull/70509), [#&#8203;73106](https://github.com/NousResearch/hermes-agent/pull/73106), [#&#8203;73933](https://github.com/NousResearch/hermes-agent/pull/73933) — [@&#8203;teknium1](https://github.com/teknium1))
- The model is told when the user interrupts its spoken reply; desktop speaks the whole turn and idle-flushes held narration ([#&#8203;69602](https://github.com/NousResearch/hermes-agent/pull/69602), [#&#8203;69936](https://github.com/NousResearch/hermes-agent/pull/69936) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))
- 15-item CLI/TUI voice-mode UX and environment fix wave ([#&#8203;73520](https://github.com/NousResearch/hermes-agent/pull/73520) — [@&#8203;teknium1](https://github.com/teknium1))

##### TTS / STT infrastructure

- Unified spoken-text preprocessing + speed/instructions/provider tool params; unified STT language resolution (fixes the wrong-language transcription class); global `stt.language` defaults to `en` ([#&#8203;73513](https://github.com/NousResearch/hermes-agent/pull/73513), [#&#8203;73067](https://github.com/NousResearch/hermes-agent/pull/73067), [#&#8203;73100](https://github.com/NousResearch/hermes-agent/pull/73100) — [@&#8203;teknium1](https://github.com/teknium1))
- Fully configurable STT — `hermes tools` category, GUI toggle/matrix, dashboard dropdowns, setup status; OpenAI gpt-transcribe support ([#&#8203;73910](https://github.com/NousResearch/hermes-agent/pull/73910), [#&#8203;73853](https://github.com/NousResearch/hermes-agent/pull/73853) — [@&#8203;teknium1](https://github.com/teknium1))
- Platform-aware auto-TTS voice delivery (opus platforms, streamed/global gap, captions); inbound voice classification/routing for Feishu, DingTalk, LINE, QQ, Photon, WhatsApp, Weixin ([#&#8203;73508](https://github.com/NousResearch/hermes-agent/pull/73508), [#&#8203;73515](https://github.com/NousResearch/hermes-agent/pull/73515) — [@&#8203;teknium1](https://github.com/teknium1))
- Command TTS/STT provider hardening — idle timeouts, env scrubbing, no-shell, path guards ([#&#8203;73514](https://github.com/NousResearch/hermes-agent/pull/73514) — [@&#8203;teknium1](https://github.com/teknium1))
- Sync per-sentence TTS synthesis pipelined with playback — the next sentence renders while the current one speaks ([#&#8203;77355](https://github.com/NousResearch/hermes-agent/pull/77355) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Discord voice PCM streams to ffmpeg stdin instead of a temp file ([#&#8203;76970](https://github.com/NousResearch/hermes-agent/pull/76970) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### 🏗️ Core Agent & Architecture

##### Compression & context

- Proactive tool-result pruning for large-window models; per-turn micro-compaction; N-user tail guarantee (`compression.min_tail_user_messages`); bounded summarizer input with head+tail retention ([#&#8203;70254](https://github.com/NousResearch/hermes-agent/pull/70254), [#&#8203;75345](https://github.com/NousResearch/hermes-agent/pull/75345), [#&#8203;70250](https://github.com/NousResearch/hermes-agent/pull/70250), [#&#8203;70249](https://github.com/NousResearch/hermes-agent/pull/70249) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Ghost-skill defense — `[SKILL_PRUNED]` markers, protected prune, deterministic survival; progress-aware timeouts; lock-contended compression soft-defers instead of exhausting ([#&#8203;70275](https://github.com/NousResearch/hermes-agent/pull/70275), [#&#8203;71508](https://github.com/NousResearch/hermes-agent/pull/71508), [#&#8203;70285](https://github.com/NousResearch/hermes-agent/pull/70285) — [@&#8203;teknium1](https://github.com/teknium1))
- Per-model threshold overrides; absolute token threshold (`compression.threshold_tokens`); opt-in idle-triggered compaction; opt-in progress notices; structured local logging for compression attempts ([#&#8203;69339](https://github.com/NousResearch/hermes-agent/pull/69339), [#&#8203;69335](https://github.com/NousResearch/hermes-agent/pull/69335), [#&#8203;69360](https://github.com/NousResearch/hermes-agent/pull/69360), [#&#8203;70457](https://github.com/NousResearch/hermes-agent/pull/70457), [#&#8203;69338](https://github.com/NousResearch/hermes-agent/pull/69338) — [@&#8203;teknium1](https://github.com/teknium1))
- Context-engine ABC grows `select_context()` + `on_turn_complete()` verbs (salvage of [@&#8203;chaos-xxl](https://github.com/chaos-xxl)'s RFC work); engines can suppress or customize compaction status ([#&#8203;70458](https://github.com/NousResearch/hermes-agent/pull/70458), [#&#8203;69859](https://github.com/NousResearch/hermes-agent/pull/69859) — [@&#8203;teknium1](https://github.com/teknium1))
- Strict redaction applied at every compaction text boundary ([#&#8203;69294](https://github.com/NousResearch/hermes-agent/pull/69294) — [@&#8203;teknium1](https://github.com/teknium1))

##### Prompt caching & hot-path performance

- Tool schemas cached on native Anthropic without history loss + consolidated cache-plan internals ([#&#8203;76032](https://github.com/NousResearch/hermes-agent/pull/76032), [#&#8203;76067](https://github.com/NousResearch/hermes-agent/pull/76067) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- DeepSeek prompt caching on OpenCode gateways; per-API-call token accounting off the turn thread; OpenAI wire client reused across sequential LLM calls; send-path tool-call canonicalization memoized ([#&#8203;75886](https://github.com/NousResearch/hermes-agent/pull/75886), [#&#8203;73359](https://github.com/NousResearch/hermes-agent/pull/73359), [#&#8203;73375](https://github.com/NousResearch/hermes-agent/pull/73375), [#&#8203;76880](https://github.com/NousResearch/hermes-agent/pull/76880) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Readonly config loader at 29 call sites (28× cheaper reads); per-turn config deepcopies killed (telemetry gate 54×); one raw config.yaml parse per process; inter-tool delay removed ([#&#8203;74322](https://github.com/NousResearch/hermes-agent/pull/74322), [#&#8203;74211](https://github.com/NousResearch/hermes-agent/pull/74211), [#&#8203;74228](https://github.com/NousResearch/hermes-agent/pull/74228), [#&#8203;64172](https://github.com/NousResearch/hermes-agent/pull/64172) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;Soju06](https://github.com/Soju06))
- Lazy heavy-SDK imports (−8-10% import cost on top of the mcp/tool-discovery diet); streaming hot loop drops per-chunk repr() (\~3× cheaper accounting); cursor/memo optimizations for per-iteration history walks ([#&#8203;74204](https://github.com/NousResearch/hermes-agent/pull/74204), [#&#8203;74194](https://github.com/NousResearch/hermes-agent/pull/74194), [#&#8203;74221](https://github.com/NousResearch/hermes-agent/pull/74221), [#&#8203;74231](https://github.com/NousResearch/hermes-agent/pull/74231) — [@&#8203;teknium1](https://github.com/teknium1))
- Cold-start \~14s GIL stall during backend init mitigated; turn flush batched into one SQLite transaction; provider-capability-gated prompt cache keys (implied for api.openai.com) ([#&#8203;77814](https://github.com/NousResearch/hermes-agent/pull/77814), [#&#8203;77619](https://github.com/NousResearch/hermes-agent/pull/77619), [#&#8203;77609](https://github.com/NousResearch/hermes-agent/pull/77609) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- AIAgent hot-path salvage — prompt-cache copy, reasoning-timeout precompute, lazy compressor init ([#&#8203;57229](https://github.com/NousResearch/hermes-agent/pull/57229) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### Approvals & the agent loop

- `hermes approvals suggest` mines approval history into allowlist proposals; operator-customizable `approvals.smart_policy`; consecutive-denial circuit breaker; cross-surface approvals mode command ([#&#8203;72259](https://github.com/NousResearch/hermes-agent/pull/72259), [#&#8203;72186](https://github.com/NousResearch/hermes-agent/pull/72186), [#&#8203;72203](https://github.com/NousResearch/hermes-agent/pull/72203), [#&#8203;63517](https://github.com/NousResearch/hermes-agent/pull/63517) — [@&#8203;teknium1](https://github.com/teknium1))
- Docker/podman daemon-redirect commands require approval; session-wide runaway-loop caps for web\_search + delegate\_task (Claude Code-inspired) ([#&#8203;71092](https://github.com/NousResearch/hermes-agent/pull/71092), [#&#8203;66600](https://github.com/NousResearch/hermes-agent/pull/66600) — [@&#8203;teknium1](https://github.com/teknium1))
- Mid-turn redirects — user corrections steer the active turn, preserving in-flight work and the original prompt ([#&#8203;63104](https://github.com/NousResearch/hermes-agent/pull/63104), [#&#8203;72339](https://github.com/NousResearch/hermes-agent/pull/72339) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Delegation: structured timeout/stall metadata + live per-child status in `/agents`; subagents can use `execute_code`; redacted child tool history exposed in `subagent_stop`; public subagent lifecycle API for plugins ([#&#8203;72300](https://github.com/NousResearch/hermes-agent/pull/72300), [#&#8203;69325](https://github.com/NousResearch/hermes-agent/pull/69325), [#&#8203;72403](https://github.com/NousResearch/hermes-agent/pull/72403), [#&#8203;72501](https://github.com/NousResearch/hermes-agent/pull/72501) — [@&#8203;teknium1](https://github.com/teknium1))
- Single-owner refactors for backend identity + failure-scoped skips, empty-content wire repair, call\_id/reasoning sanitization, model-switch parsing ([#&#8203;72505](https://github.com/NousResearch/hermes-agent/pull/72505), [#&#8203;73071](https://github.com/NousResearch/hermes-agent/pull/73071), [#&#8203;74319](https://github.com/NousResearch/hermes-agent/pull/74319), [#&#8203;74229](https://github.com/NousResearch/hermes-agent/pull/74229) — [@&#8203;teknium1](https://github.com/teknium1))
- Labeled reasoning excerpt surfaced at the empty-response terminal; tool\_search probe-validates blind tool\_call args ([#&#8203;65144](https://github.com/NousResearch/hermes-agent/pull/65144), [#&#8203;59267](https://github.com/NousResearch/hermes-agent/pull/59267) — [@&#8203;teknium1](https://github.com/teknium1))

##### Tool self-recovery wave

- Terminal: recoverable truncation (full output spilled + pre-truncation size), cwd echoed when a command changes directory, output-pattern failure hints ([#&#8203;77041](https://github.com/NousResearch/hermes-agent/pull/77041), [#&#8203;77004](https://github.com/NousResearch/hermes-agent/pull/77004), [#&#8203;76992](https://github.com/NousResearch/hermes-agent/pull/76992) — [@&#8203;teknium1](https://github.com/teknium1))
- Patch: already-applied edits return success no-op, whitespace-visualized no-match diagnosis, ambiguous-match locations listed ([#&#8203;76998](https://github.com/NousResearch/hermes-agent/pull/76998), [#&#8203;77024](https://github.com/NousResearch/hermes-agent/pull/77024), [#&#8203;77001](https://github.com/NousResearch/hermes-agent/pull/77001) — [@&#8203;teknium1](https://github.com/teknium1))
- Search: zero-match probes + multi-path recovery, auto-multiline for newline patterns; read\_file default limit 500 → 2000 lines; negative-result cache for read/search misses; write\_file verifies on-disk content ([#&#8203;77011](https://github.com/NousResearch/hermes-agent/pull/77011), [#&#8203;77102](https://github.com/NousResearch/hermes-agent/pull/77102), [#&#8203;76996](https://github.com/NousResearch/hermes-agent/pull/76996), [#&#8203;76945](https://github.com/NousResearch/hermes-agent/pull/76945), [#&#8203;77055](https://github.com/NousResearch/hermes-agent/pull/77055) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- execute\_code recovery hints; skill\_view dedup stub for unchanged re-reads; terminal/execute\_code schema prose trimmed \~40%; tiered tool disclosure scales with catalog size; default iteration limit 90 → 500 ([#&#8203;77106](https://github.com/NousResearch/hermes-agent/pull/77106), [#&#8203;77095](https://github.com/NousResearch/hermes-agent/pull/77095), [#&#8203;77023](https://github.com/NousResearch/hermes-agent/pull/77023), [#&#8203;67034](https://github.com/NousResearch/hermes-agent/pull/67034), [#&#8203;72176](https://github.com/NousResearch/hermes-agent/pull/72176) — [@&#8203;teknium1](https://github.com/teknium1))

##### Providers & models

- Vercel AI Gateway provider + Vercel Sandbox terminal backend return, modernized (SDK 0.7.2, telemetry off) ([#&#8203;74518](https://github.com/NousResearch/hermes-agent/pull/74518) — [@&#8203;teknium1](https://github.com/teknium1))
- Gemini 3.1 Pro + 3.6 Flash in catalogs; Gemini salvage cluster (3.6-flash aux default, Vertex catalog, direct cost tracking); claude-opus-5 in OpenRouter + Nous Portal; deepseek-v4-flash-0731 ([#&#8203;73479](https://github.com/NousResearch/hermes-agent/pull/73479), [#&#8203;73516](https://github.com/NousResearch/hermes-agent/pull/73516), [#&#8203;70946](https://github.com/NousResearch/hermes-agent/pull/70946), [#&#8203;75501](https://github.com/NousResearch/hermes-agent/pull/75501) — [@&#8203;teknium1](https://github.com/teknium1))
- Bedrock Converse API prompt caching (cachePoint) ([#&#8203;70231](https://github.com/NousResearch/hermes-agent/pull/70231) — [@&#8203;JoaoMarcos44](https://github.com/JoaoMarcos44))
- OpenAI data-residency endpoints get declared transport + correct catalog; provider-aware API-server request routing; backend-acknowledged session model lock; Nous sticky routing via top-level session\_id ([#&#8203;74958](https://github.com/NousResearch/hermes-agent/pull/74958), [#&#8203;70853](https://github.com/NousResearch/hermes-agent/pull/70853), [#&#8203;70950](https://github.com/NousResearch/hermes-agent/pull/70950), [#&#8203;69253](https://github.com/NousResearch/hermes-agent/pull/69253) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos), [@&#8203;teknium1](https://github.com/teknium1))
- Model picker: curated defaults + collapsible providers + select-all; stale caches served instantly with background refresh; custom-endpoint probe capped at 1.5s; honcho OAuth device-code login ([#&#8203;73172](https://github.com/NousResearch/hermes-agent/pull/73172), [#&#8203;76430](https://github.com/NousResearch/hermes-agent/pull/76430), [#&#8203;76922](https://github.com/NousResearch/hermes-agent/pull/76922), [#&#8203;61608](https://github.com/NousResearch/hermes-agent/pull/61608) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;akattelu](https://github.com/akattelu))
- ACP: named custom providers in the model selector; authenticated cross-provider model choices; non-blocking startup via background MCP discovery ([#&#8203;70082](https://github.com/NousResearch/hermes-agent/pull/70082), [#&#8203;70404](https://github.com/NousResearch/hermes-agent/pull/70404), [#&#8203;75985](https://github.com/NousResearch/hermes-agent/pull/75985) — [@&#8203;israellot](https://github.com/israellot), [@&#8203;amanning3390](https://github.com/amanning3390), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### Secrets & config

- Command-helper secret source (composes with all vaults); one-command token rotation + actionable startup errors; opt-in encrypted break-glass cache for Bitwarden; vault-injected keys scoped per profile home; orchestrator preserve\_existing + profile aliasing ([#&#8203;69266](https://github.com/NousResearch/hermes-agent/pull/69266), [#&#8203;68605](https://github.com/NousResearch/hermes-agent/pull/68605), [#&#8203;69251](https://github.com/NousResearch/hermes-agent/pull/69251), [#&#8203;69250](https://github.com/NousResearch/hermes-agent/pull/69250), [#&#8203;69058](https://github.com/NousResearch/hermes-agent/pull/69058) — [@&#8203;teknium1](https://github.com/teknium1))
- `${env:VAR}` SecretRef parity between config.yaml and MCP config; secret-source env vars reach stdio MCP servers ([#&#8203;69267](https://github.com/NousResearch/hermes-agent/pull/69267), [#&#8203;69053](https://github.com/NousResearch/hermes-agent/pull/69053) — [@&#8203;teknium1](https://github.com/teknium1))
- Canonical config loaders for behavioral reads; table-driven config migration registry; DEFAULT\_CONFIG extracted to config\_defaults.py; auto-migration support floor at v12 ([#&#8203;74237](https://github.com/NousResearch/hermes-agent/pull/74237), [#&#8203;74200](https://github.com/NousResearch/hermes-agent/pull/74200), [#&#8203;74182](https://github.com/NousResearch/hermes-agent/pull/74182), [#&#8203;74433](https://github.com/NousResearch/hermes-agent/pull/74433) — [@&#8203;teknium1](https://github.com/teknium1))

##### 🌐 Gateway, Relay & Fleet

- Session activity heartbeats, stall watchdog, and bounded compression waits — re-landed hardened after an in-window revert cycle (originally [#&#8203;72424](https://github.com/NousResearch/hermes-agent/issues/72424) by [@&#8203;fangliquanflq](https://github.com/fangliquanflq)) ([#&#8203;76354](https://github.com/NousResearch/hermes-agent/pull/76354) — [@&#8203;teknium1](https://github.com/teknium1))
- SessionState consolidation (19 session-keyed dicts → one turn/conversation/persistent-scoped object); TurnContext/TurnRunner seam extraction; declarative busy\_policy on CommandDef ([#&#8203;74289](https://github.com/NousResearch/hermes-agent/pull/74289), [#&#8203;74353](https://github.com/NousResearch/hermes-agent/pull/74353), [#&#8203;74197](https://github.com/NousResearch/hermes-agent/pull/74197) — [@&#8203;teknium1](https://github.com/teknium1))
- Relay parity waves: Phase 1 (supported\_ops discovery, identity fields, /handoff aliasing), Phase 2 media, Phase 3 interactive prompts, Phase 4 thread lifecycle; egress typing indicators ([#&#8203;71300](https://github.com/NousResearch/hermes-agent/pull/71300), [#&#8203;71363](https://github.com/NousResearch/hermes-agent/pull/71363), [#&#8203;71404](https://github.com/NousResearch/hermes-agent/pull/71404), [#&#8203;71624](https://github.com/NousResearch/hermes-agent/pull/71624), [#&#8203;69721](https://github.com/NousResearch/hermes-agent/pull/69721) — [@&#8203;benbarclay](https://github.com/benbarclay))
- HSP skill sync: personal client (M1) + org-skills client (M2) + org-skill namespace with token-gated discovery ([#&#8203;66730](https://github.com/NousResearch/hermes-agent/pull/66730), [#&#8203;70024](https://github.com/NousResearch/hermes-agent/pull/70024), [#&#8203;70459](https://github.com/NousResearch/hermes-agent/pull/70459) — [@&#8203;benbarclay](https://github.com/benbarclay))
- Buzz (Block/Nostr) platform adapter with native WebSocket inbound transport + NIP-42 auth ([#&#8203;73610](https://github.com/NousResearch/hermes-agent/pull/73610), [#&#8203;73761](https://github.com/NousResearch/hermes-agent/pull/73761) — [@&#8203;teknium1](https://github.com/teknium1))
- Photon: native polls, effects, clarify-as-poll, rich links (4-PR salvage) ([#&#8203;73614](https://github.com/NousResearch/hermes-agent/pull/73614) — [@&#8203;teknium1](https://github.com/teknium1))
- Slack: native Block Kit clarify buttons; opt-in reaction triggers; outbound payload sanitization; thread-context lifecycle fixes ([#&#8203;69318](https://github.com/NousResearch/hermes-agent/pull/69318), [#&#8203;70195](https://github.com/NousResearch/hermes-agent/pull/70195), [#&#8203;69317](https://github.com/NousResearch/hermes-agent/pull/69317), [#&#8203;69320](https://github.com/NousResearch/hermes-agent/pull/69320) — [@&#8203;teknium1](https://github.com/teknium1))
- Discord auto-thread sessions keyed on prospective\_thread\_id; reply references built from ids (no fetch\_message); WhatsApp configurable inbound read receipts ([#&#8203;76513](https://github.com/NousResearch/hermes-agent/pull/76513), [#&#8203;76875](https://github.com/NousResearch/hermes-agent/pull/76875), [#&#8203;73322](https://github.com/NousResearch/hermes-agent/pull/73322) — [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Kanban wakes resume the creator's DM/thread session; kanban/delegate wake-ups reach api\_server sessions; per-task model + thinking-depth from the board ([#&#8203;72191](https://github.com/NousResearch/hermes-agent/pull/72191), [#&#8203;70171](https://github.com/NousResearch/hermes-agent/pull/70171), [#&#8203;69876](https://github.com/NousResearch/hermes-agent/pull/69876), [#&#8203;76417](https://github.com/NousResearch/hermes-agent/pull/76417) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Relay: Discord tool-progress routed into the auto-thread instead of the parent channel ([#&#8203;77830](https://github.com/NousResearch/hermes-agent/pull/77830) — [@&#8203;benbarclay](https://github.com/benbarclay))
- Outbound webhooks — push signed lifecycle events to external endpoints; simplex channel enumeration in `hermes send --list` ([#&#8203;69406](https://github.com/NousResearch/hermes-agent/pull/69406), [#&#8203;77110](https://github.com/NousResearch/hermes-agent/pull/77110) — [@&#8203;teknium1](https://github.com/teknium1))

##### 🖥️ Hermes Desktop App

##### The platform wave

- **Artifacts** — versioned cards, sandboxed live preview, right-rail viewer ([#&#8203;72345](https://github.com/NousResearch/hermes-agent/pull/72345) — [@&#8203;teknium1](https://github.com/teknium1))
- **Plugin SDK** — Kanban as the founding desktop plugin; `ctx.download` hands the user a file; widget-app SDK (apps as state+reducer+render) with three reference apps; widget-grid layout engine + background-aware theme engine ([#&#8203;61173](https://github.com/NousResearch/hermes-agent/pull/61173), [#&#8203;74413](https://github.com/NousResearch/hermes-agent/pull/74413), [#&#8203;68306](https://github.com/NousResearch/hermes-agent/pull/68306), [#&#8203;20379](https://github.com/NousResearch/hermes-agent/pull/20379) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Quick-entry window (global hotkey → any session); multiple GUI windows; floating pane placement; pane toggles anywhere + hidden header; ⌘O open-folder-as-project ([#&#8203;72315](https://github.com/NousResearch/hermes-agent/pull/72315), [#&#8203;68259](https://github.com/NousResearch/hermes-agent/pull/68259), [#&#8203;73143](https://github.com/NousResearch/hermes-agent/pull/73143), [#&#8203;75848](https://github.com/NousResearch/hermes-agent/pull/75848), [#&#8203;74623](https://github.com/NousResearch/hermes-agent/pull/74623) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- SSH remote-backend connection mode; event-driven live sync replaces always-on polls; remote profile routing/sessions/pool lifecycle repaired ([#&#8203;68130](https://github.com/NousResearch/hermes-agent/pull/68130), [#&#8203;73673](https://github.com/NousResearch/hermes-agent/pull/73673), [#&#8203;72835](https://github.com/NousResearch/hermes-agent/pull/72835) — [@&#8203;yoniebans](https://github.com/yoniebans), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Let the agent drive the shell (preview pane + pane focus) AND inspect the desktop app it's developing; find-in-page (Ctrl+F); GUI terminal copy/paste + font picker ([#&#8203;69519](https://github.com/NousResearch/hermes-agent/pull/69519), [#&#8203;73121](https://github.com/NousResearch/hermes-agent/pull/73121), [#&#8203;72235](https://github.com/NousResearch/hermes-agent/pull/72235), [#&#8203;73705](https://github.com/NousResearch/hermes-agent/pull/73705), [#&#8203;76395](https://github.com/NousResearch/hermes-agent/pull/76395) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))

##### Composer & UX

- Attach files/folders/links via picker; composer chips for @&#8203; paths and pasted links; composer undo stack; double-ESC discards draft; double-Enter sends the queued turn; type-to-focus ([#&#8203;74668](https://github.com/NousResearch/hermes-agent/pull/74668), [#&#8203;73110](https://github.com/NousResearch/hermes-agent/pull/73110), [#&#8203;72201](https://github.com/NousResearch/hermes-agent/pull/72201), [#&#8203;72288](https://github.com/NousResearch/hermes-agent/pull/72288), [#&#8203;74736](https://github.com/NousResearch/hermes-agent/pull/74736), [#&#8203;73101](https://github.com/NousResearch/hermes-agent/pull/73101), [#&#8203;68918](https://github.com/NousResearch/hermes-agent/pull/68918) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- 2-keypress model switching (⌘⇧M); YOLO in ⌘K with live toggle state; keyboard-first pickers; keyboard navigation for clarify choices; server-owned pins that follow you between apps ([#&#8203;74545](https://github.com/NousResearch/hermes-agent/pull/74545), [#&#8203;74674](https://github.com/NousResearch/hermes-agent/pull/74674), [#&#8203;74602](https://github.com/NousResearch/hermes-agent/pull/74602), [#&#8203;69799](https://github.com/NousResearch/hermes-agent/pull/69799), [#&#8203;74234](https://github.com/NousResearch/hermes-agent/pull/74234) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Grouped, live-ticking tool-activity line; improved tool call detail views; [@&#8203;session](https://github.com/session) links resolve to clickable titles; brand icons on known-domain links; iMessage-style emoji reactions (opt-in, two-way); double-click to heart ([#&#8203;72893](https://github.com/NousResearch/hermes-agent/pull/72893), [#&#8203;69868](https://github.com/NousResearch/hermes-agent/pull/69868), [#&#8203;71162](https://github.com/NousResearch/hermes-agent/pull/71162), [#&#8203;73047](https://github.com/NousResearch/hermes-agent/pull/73047), [#&#8203;74533](https://github.com/NousResearch/hermes-agent/pull/74533), [#&#8203;74644](https://github.com/NousResearch/hermes-agent/pull/74644) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))
- Sidebar date dividers + pinned section + opt-in stale-session auto-archive; sessions stop lying about running state; credit-usage toasts; configurable attachment size limit; Cron Blueprints + Webhooks pages; searchable timezone picker ([#&#8203;70822](https://github.com/NousResearch/hermes-agent/pull/70822), [#&#8203;72303](https://github.com/NousResearch/hermes-agent/pull/72303), [#&#8203;69828](https://github.com/NousResearch/hermes-agent/pull/69828), [#&#8203;73221](https://github.com/NousResearch/hermes-agent/pull/73221), [#&#8203;70066](https://github.com/NousResearch/hermes-agent/pull/70066), [#&#8203;69687](https://github.com/NousResearch/hermes-agent/pull/69687), [#&#8203;73505](https://github.com/NousResearch/hermes-agent/pull/73505) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;austinpickett](https://github.com/austinpickett), [@&#8203;Adolanium](https://github.com/Adolanium), [@&#8203;teknium1](https://github.com/teknium1))
- RFC 8252 native desktop sign-in (system browser + PKCE, no webview cookies); "Connect to existing Hermes" in first-run onboarding; profile-correct pairing approvals with a desktop surface ([#&#8203;67920](https://github.com/NousResearch/hermes-agent/pull/67920), [#&#8203;70907](https://github.com/NousResearch/hermes-agent/pull/70907), [#&#8203;74446](https://github.com/NousResearch/hermes-agent/pull/74446) — [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Keep-computer-awake toggle + notch wake indicator; /battery status-bar toggle; UI zoom 90% default preset; status bar hideable ([#&#8203;68140](https://github.com/NousResearch/hermes-agent/pull/68140), [#&#8203;76396](https://github.com/NousResearch/hermes-agent/pull/76396), [#&#8203;68860](https://github.com/NousResearch/hermes-agent/pull/68860), [#&#8203;73161](https://github.com/NousResearch/hermes-agent/pull/73161), [#&#8203;72960](https://github.com/NousResearch/hermes-agent/pull/72960) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))

##### Desktop performance (60fps wave 2)

- Streaming cost independent of transcript length; 60fps on real sessions (reflow-gated pins, adaptive flush); drag at 60fps with five streaming tabs; multitab streaming made fast ([#&#8203;71835](https://github.com/NousResearch/hermes-agent/pull/71835), [#&#8203;72504](https://github.com/NousResearch/hermes-agent/pull/72504), [#&#8203;72346](https://github.com/NousResearch/hermes-agent/pull/72346), [#&#8203;71780](https://github.com/NousResearch/hermes-agent/pull/71780) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Hidden-pane timers paused (agents view, cron sidebar, floating pet), scroll/status loops stopped in busy sessions ([#&#8203;77651](https://github.com/NousResearch/hermes-agent/pull/77651) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)); idle CPU near zero in the background; sidebar/overlay render churn killed; statusbar + transcript stop re-rendering per token/sash-drag/session-switch; ⌘K opens instantly; renderer cold start keeps shiki/mermaid off the boot path ([#&#8203;75218](https://github.com/NousResearch/hermes-agent/pull/75218), [#&#8203;73698](https://github.com/NousResearch/hermes-agent/pull/73698), [#&#8203;72163](https://github.com/NousResearch/hermes-agent/pull/72163), [#&#8203;72245](https://github.com/NousResearch/hermes-agent/pull/72245), [#&#8203;72524](https://github.com/NousResearch/hermes-agent/pull/72524), [#&#8203;74665](https://github.com/NousResearch/hermes-agent/pull/74665), [#&#8203;73024](https://github.com/NousResearch/hermes-agent/pull/73024) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- State diagnostics (render + store churn counters) + a lint rule banning atom-mirrored refs so the stale-read bug class cannot return; Playwright E2E suite with visual regression diffs ([#&#8203;71925](https://github.com/NousResearch/hermes-agent/pull/71925), [#&#8203;71560](https://github.com/NousResearch/hermes-agent/pull/71560), [#&#8203;65805](https://github.com/NousResearch/hermes-agent/pull/65805) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;ethernet8023](https://github.com/ethernet8023))

##### 🖥️ CLI, TUI & Dashboard

- `!` shell mode; `/init` AGENTS.md generation; `/diff` (staged/all/session, cross-surface); `/context` breakdown; `/focus` reduced-output view; Ctrl+S prompt stash; persistent `/goal` indicator; multi-select clarify (checkboxes) across CLI/gateway/TUI ([#&#8203;72257](https://github.com/NousResearch/hermes-agent/pull/72257), [#&#8203;72178](https://github.com/NousResearch/hermes-agent/pull/72178), [#&#8203;72240](https://github.com/NousResearch/hermes-agent/pull/72240), [#&#8203;72242](https://github.com/NousResearch/hermes-agent/pull/72242), [#&#8203;72302](https://github.com/NousResearch/hermes-agent/pull/72302), [#&#8203;72262](https://github.com/NousResearch/hermes-agent/pull/72262), [#&#8203;72244](https://github.com/NousResearch/hermes-agent/pull/72244), [#&#8203;72188](https://github.com/NousResearch/hermes-agent/pull/72188) — [@&#8203;teknium1](https://github.com/teknium1), salvaging [@&#8203;SHL0MS](https://github.com/SHL0MS), [@&#8203;iRonin](https://github.com/iRonin), [@&#8203;gigi206](https://github.com/gigi206) + more)
- `hermes import-agent` — one-command migration from Claude Code / Codex CLI setups ([#&#8203;72190](https://github.com/NousResearch/hermes-agent/pull/72190) — [@&#8203;teknium1](https://github.com/teknium1))
- Per-turn summary line + live token flow in the spinner; cross-surface theme SDK (one skin themes CLI, TUI, and desktop, live) ([#&#8203;72246](https://github.com/NousResearch/hermes-agent/pull/72246), [#&#8203;68857](https://github.com/NousResearch/hermes-agent/pull/68857) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- TUI: reach the model picker without wrecking your draft + mid-turn switching; slash menu leads with your most-used skills; attachments live in the composer; Arabic (ar) locale with RTL across desktop/dashboard/agent ([#&#8203;74756](https://github.com/NousResearch/hermes-agent/pull/74756), [#&#8203;75931](https://github.com/NousResearch/hermes-agent/pull/75931), [#&#8203;75210](https://github.com/NousResearch/hermes-agent/pull/75210), [#&#8203;70870](https://github.com/NousResearch/hermes-agent/pull/70870) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- `hermes -w` startup \~14s → \~1.8s; global `--version` fast path; banner update-check 6× faster; dashboard lazy-loads routes + GROUP BY session stats; session filtering tabs (Chats/Automation/All) ([#&#8203;71637](https://github.com/NousResearch/hermes-agent/pull/71637), [#&#8203;62096](https://github.com/NousResearch/hermes-agent/pull/62096), [#&#8203;74188](https://github.com/NousResearch/hermes-agent/pull/74188), [#&#8203;72294](https://github.com/NousResearch/hermes-agent/pull/72294), [#&#8203;73362](https://github.com/NousResearch/hermes-agent/pull/73362), [#&#8203;73865](https://github.com/NousResearch/hermes-agent/pull/73865) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Runtime: Node 26 required across installers/heal/upgrade, managed Node/uv resolve before bare PATH, outdated managed trees heal to target major; brew + pip/PyPI wheel channels retired (shell installer / Docker / Nix are the supported channels) ([#&#8203;76459](https://github.com/NousResearch/hermes-agent/pull/76459), [#&#8203;68217](https://github.com/NousResearch/hermes-agent/pull/68217) — [@&#8203;ethernet8023](https://github.com/ethernet8023))

##### 🧩 Skills, Plugins & MCP

- **A2A v1.0** — Agent-to-Agent protocol plugin (closes [#&#8203;514](https://github.com/NousResearch/hermes-agent/issues/514)) ([#&#8203;77109](https://github.com/NousResearch/hermes-agent/pull/77109) — [@&#8203;teknium1](https://github.com/teknium1))
- Curator: surface unmanaged skills + `curator adopt`; skill-description truncation surfaced to authors; grounded-citations skill (+ fact-checking mode); simplify-code v1.1; tldraw-offline scripting skill ([#&#8203;71648](https://github.com/NousResearch/hermes-agent/pull/71648), [#&#8203;70519](https://github.com/NousResearch/hermes-agent/pull/70519), [#&#8203;71698](https://github.com/NousResearch/hermes-agent/pull/71698), [#&#8203;77104](https://github.com/NousResearch/hermes-agent/pull/77104), [#&#8203;70440](https://github.com/NousResearch/hermes-agent/pull/70440), [#&#8203;66896](https://github.com/NousResearch/hermes-agent/pull/66896) — [@&#8203;teknium1](https://github.com/teknium1))
- Office skills bundled: docx, xlsx, pdf + refreshed powerpoint; skills-tree debloat continues (yuanbao, segment-anything, jupyter, heartmula, audiocraft → optional-skills; claude-marketplace source removed; hub restructure absorbing themes/desktop-plugins/tui-widgets) ([#&#8203;68595](https://github.com/NousResearch/hermes-agent/pull/68595), [#&#8203;70452](https://github.com/NousResearch/hermes-agent/pull/70452)–[#&#8203;70456](https://github.com/NousResearch/hermes-agent/pull/70456), [#&#8203;73903](https://github.com/NousResearch/hermes-agent/pull/73903) — [@&#8203;teknium1](https://github.com/teknium1))
- MCP: Comfy Cloud catalog entry with curated 20-tool default; hidden-whitespace warnings in MCP config; pinecone-research optional skill ([#&#8203;66112](https://github.com/NousResearch/hermes-agent/pull/66112), [#&#8203;75736](https://github.com/NousResearch/hermes-agent/pull/75736), [#&#8203;70512](https://github.com/NousResearch/hermes-agent/pull/70512) — [@&#8203;teknium1](https://github.com/teknium1))
- MCP lazy server startup from a fingerprint-keyed on-disk tool-schema cache — configured servers no longer all boot at session start (design from [#&#8203;56832](https://github.com/NousResearch/hermes-agent/issues/56832)) ([#&#8203;77511](https://github.com/NousResearch/hermes-agent/pull/77511) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- NeMo Relay observability integration — re-landed after an in-window revert, on stable NeMo Relay 0.6 ([#&#8203;67607](https://github.com/NousResearch/hermes-agent/pull/67607) — [@&#8203;afourniernv](https://github.com/afourniernv))
- Gateway health & diagnostics OTLP export ([#&#8203;64536](https://github.com/NousResearch/hermes-agent/pull/64536) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos))

##### 🔒 Security & Reliability

- Iron-proxy credential-injection egress firewall re-landed ([#&#8203;70848](https://github.com/NousResearch/hermes-agent/pull/70848) — [@&#8203;teknium1](https://github.com/teknium1))
- DNS-pinned SSRF-safe fetches + Slack CDN allowlist; strict redaction at compaction boundaries; ReDoS eliminated in config-key redaction patterns; prose words embedding a secret keyword no longer masked ([#&#8203;70193](https://github.com/NousResearch/hermes-agent/pull/70193), [#&#8203;69294](https://github.com/NousResearch/hermes-agent/pull/69294), [#&#8203;76083](https://github.com/NousResearch/hermes-agent/pull/76083), [#&#8203;67776](https://github.com/NousResearch/hermes-agent/pull/67776) — [@&#8203;teknium1](https://github.com/teknium1))
- Tier-3 credential reads scoped (FAL/XAI/VERCEL/DAYTONA/GITHUB presence checks etc.); CVE dependency pins refreshed (cryptography, starlette, python-multipart); hindsight env file 0600; /model moved off the gateway event loop ([#&#8203;75888](https://github.com/NousResearch/hermes-agent/pull/75888), [#&#8203;72362](https://github.com/NousResearch/hermes-agent/pull/72362) — [@&#8203;teknium1](https://github.com/teknium1))
- Windows hardening wave: text-mode subprocess decode bug class closed repo-wide, console flashes hidden across daemons/env probes/LSP/installer paths, residual encoding gaps (MCP stdio, gateway update I/O, STT/TTS, desktop spawn) ([#&#8203;70875](https://github.com/NousResearch/hermes-agent/pull/70875), [#&#8203;70205](https://github.com/NousResearch/hermes-agent/pull/70205), [#&#8203;70264](https://github.com/NousResearch/hermes-agent/pull/70264), [#&#8203;71014](https://github.com/NousResearch/hermes-agent/pull/71014) — [@&#8203;teknium1](https://github.com/teknium1), salvaging several community PRs)
- State/session integrity: four session-state fixes (safe close tracking, flush-cursor class fix, row-retry, usage-PK healer); compact v23 FTS layout + `hermes sessions optimize` + CJK-bigram FTS; read-path split with per-thread read-only connections ([#&#8203;75883](https://github.com/NousResearch/hermes-agent/pull/75883), [#&#8203;65798](https://github.com/NousResearch/hermes-agent/pull/65798), [#&#8203;69423](https://github.com/NousResearch/hermes-agent/pull/69423), [#&#8203;73344](https://github.com/NousResearch/hermes-agent/pull/73344) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- OpenViking memory-provider hardening — fail closed on blocked endpoints, server verification before credentials are sent, config.yaml-first settings ([#&#8203;77747](https://github.com/NousResearch/hermes-agent/pull/77747) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Credential pool: reset-aware primary restore (stay on fallback until the rate-limit window resets) + deferred-refresh locking fixes; FTS UPDATE triggers narrowed with fail-closed CJK migration ([#&#8203;77631](https://github.com/NousResearch/hermes-agent/pull/77631), [#&#8203;77628](https://github.com/NousResearch/hermes-agent/pull/77628) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Config-driven memory allocator trim with telemetry; holographic memory vectors stored float32; loop-invariant HRR encodes hoisted ([#&#8203;76905](https://github.com/NousResearch/hermes-agent/pull/76905), [#&#8203;76917](https://github.com/NousResearch/hermes-agent/pull/76917), [#&#8203;76881](https://github.com/NousResearch/hermes-agent/pull/76881) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### 🐛 Notable Bug Fixes

- Voice: full-duplex interruption during generation AND playback; whole-turn desktop speech; auto-TTS delivery gaps ([#&#8203;74223](https://github.com/NousResearch/hermes-agent/pull/74223), [#&#8203;69936](https://github.com/NousResearch/hermes-agent/pull/69936), [#&#8203;73508](https://github.com/NousResearch/hermes-agent/pull/73508) — [@&#8203;teknium1](https://github.com/teknium1))
- Desktop: Stop parks the queue instead of firing the next queued prompt; branch-in-new-chat restart loss; false remote-gateway reauthentication; cross-session composer leaks ([#&#8203;68725](https://github.com/NousResearch/hermes-agent/pull/68725), [#&#8203;71960](https://github.com/NousResearch/hermes-agent/pull/71960), [#&#8203;68250](https://github.com/NousResearch/hermes-agent/pull/68250), [#&#8203;70986](https://github.com/NousResearch/hermes-agent/pull/70986) — [@&#8203;SHL0MS](https://github.com/SHL0MS), [@&#8203;alelpoan](https://github.com/alelpoan), [@&#8203;helix4u](https://github.com/helix4u), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Gateway: session lists scoped before limiting; relay-backed home delivery after restart; timeline display events persisted ([#&#8203;65509](https://github.com/NousResearch/hermes-agent/pull/65509), [#&#8203;70102](https://github.com/NousResearch/hermes-agent/pull/70102), [#&#8203;69771](https://github.com/NousResearch/hermes-agent/pull/69771) — [@&#8203;GodsBoy](https://github.com/GodsBoy), [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos), [@&#8203;ethernet8023](https://github.com/ethernet8023))
- Agent: context-length fallback logging + batch trajectory durability; Codex OAuth context windows revalidated against the live catalog ([#&#8203;76027](https://github.com/NousResearch/hermes-agent/pull/76027), [#&#8203;68554](https://github.com/NousResearch/hermes-agent/pull/68554) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;teknium1](https://github.com/teknium1))
- ...plus roughly 770 more `fix:` PRs across every subsystem this window.

##### 👥 Contributors

**647 contributors** shipped this release (commit authors, co-authors, and salvaged-PR credits).

##### Core

[@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife) (desktop, voice, perf), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor) (perf, caching, salvage), [@&#8203;ethernet8023](https://github.com/ethernet8023) (runtime, E2E, desktop), [@&#8203;benbarclay](https://github.com/benbarclay) (relay, HSP, auth)

##### All Contributors (alphabetical)

[@&#8203;02356abc](https://github.com/02356abc), [@&#8203;0301chris](https://github.com/0301chris), [@&#8203;0xAlcibiades](https://github.com/0xAlcibiades), [@&#8203;0xDevNinja](https://github.com/0xDevNinja), [@&#8203;0xLeathery](https://github.com/0xLeathery), [@&#8203;0xprincess](https://github.com/0xprincess), [@&#8203;0xr00tf3rr3t](https://github.com/0xr00tf3rr3t), [@&#8203;100yenadmin](https://github.com/100yenadmin),
[@&#8203;2001Y](https://github.com/2001Y), [@&#8203;3ssiri](https://github.com/3ssiri), [@&#8203;55nx954gn6-debug](https://github.com/55nx954gn6-debug), [@&#8203;686f6c61](https://github.com/686f6c61), [@&#8203;87degrees](https://github.com/87degrees), [@&#8203;aaronlab](https://github.com/aaronlab), [@&#8203;abundantbeing](https://github.com/abundantbeing), [@&#8203;Adolanium](https://github.com/Adolanium),
[@&#8203;adriansotomora](https://github.com/adriansotomora), [@&#8203;adurham](https://github.com/adurham), [@&#8203;afourniernv](https://github.com/afourniernv), [@&#8203;afurm](https://github.com/afurm), [@&#8203;AgenticSpark](https://github.com/AgenticSpark), [@&#8203;ahmadashfq](https://github.com/ahmadashfq), [@&#8203;AhmetArif0](https://github.com/AhmetArif0), [@&#8203;ai-ag2026](https://github.com/ai-ag2026),
[@&#8203;AIalliAI](https://github.com/AIalliAI), [@&#8203;aider4ryder](https://github.com/aider4ryder), [@&#8203;airclear](https://github.com/airclear), [@&#8203;ajzrva-sys](https://github.com/ajzrva-sys), [@&#8203;akattelu](https://github.com/akattelu), [@&#8203;AKAZIK-py](https://github.com/AKAZIK-py), [@&#8203;akb4q](https://github.com/akb4q), [@&#8203;akshan-main](https://github.com/akshan-main), [@&#8203;AlanBurningsuit](https://github.com/AlanBurningsuit),
[@&#8203;alelpoan](https://github.com/alelpoan), [@&#8203;AlexFucuson9](https://github.com/AlexFucuson9), [@&#8203;AlexxRussell](https://github.com/AlexxRussell), [@&#8203;AllardQuek](https://github.com/AllardQuek), [@&#8203;alt-glitch](https://github.com/alt-glitch), [@&#8203;aman-merchant](https://github.com/aman-merchant), [@&#8203;amanning3390](https://github.com/amanning3390), [@&#8203;amathxbt](https://github.com/amathxbt),
[@&#8203;aml1973](https://github.com/aml1973), [@&#8203;amoreno16003](https://github.com/amoreno16003), [@&#8203;AndrewMoryakov](https://github.com/AndrewMoryakov), [@&#8203;andrexibiza](https://github.com/andrexibiza), [@&#8203;andynguyendk](https://github.com/andynguyendk), [@&#8203;andyylin](https://github.com/andyylin), [@&#8203;aneym](https://github.com/aneym), [@&#8203;angelos](https://github.com/angelos),
[@&#8203;aniruddhaadak80](https://github.com/aniruddhaadak80), [@&#8203;AnnasMazhar](https://github.com/AnnasMazhar), [@&#8203;annguyenNous](https://github.com/annguyenNous), [@&#8203;anoopmehendale-cue](https://github.com/anoopmehendale-cue), [@&#8203;AnthonyFrancis](https://github.com/AnthonyFrancis), [@&#8203;arcabotai](https://github.com/arcabotai), [@&#8203;ArcherQAQ](https://github.com/ArcherQAQ),
[@&#8203;Ares4Tech](https://github.com/Ares4Tech), [@&#8203;arimu1](https://github.com/arimu1), [@&#8203;arnoldfrancisca](https://github.com/arnoldfrancisca), [@&#8203;asimons81](https://github.com/asimons81), [@&#8203;asorry75](https://github.com/asorry75), [@&#8203;AtakanGs](https://github.com/AtakanGs), [@&#8203;ATran28](https://github.com/ATran28), [@&#8203;austinpickett](https://github.com/austinpickett),
[@&#8203;Automata-intelligentsia](https://github.com/Automata-intelligentsia), [@&#8203;awain7](https://github.com/awain7), [@&#8203;aweiker](https://github.com/aweiker), [@&#8203;aydnOktay](https://github.com/aydnOktay), [@&#8203;ayushere](https://github.com/ayushere), [@&#8203;b](https://github.com/b), [@&#8203;baau](https://github.com/baau), [@&#8203;baauzi](https://github.com/baauzi), [@&#8203;baenregod](https://github.com/baenregod),
[@&#8203;bakhtiersizhaev](https://github.com/bakhtiersizhaev), [@&#8203;Baophan00](https://github.com/Baophan00), [@&#8203;baoyu0](https://github.com/baoyu0), [@&#8203;Bartok9](https://github.com/Bartok9), [@&#8203;basilalshukaili](https://github.com/basilalshukaili), [@&#8203;BB-light](https://github.com/BB-light), [@&#8203;bbopen](https://github.com/bbopen), [@&#8203;Beandon13](https://github.com/Beandon13),
[@&#8203;beardedeagle](https://github.com/beardedeagle), [@&#8203;bedirhancode](https://github.com/bedirhancode), [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;benegessarit](https://github.com/benegessarit), [@&#8203;benjamin2026-dot](https://github.com/benjamin2026-dot), [@&#8203;bennybuoy](https://github.com/bennybuoy), [@&#8203;BenSheridanEdwards](https://github.com/BenSheridanEdwards),
[@&#8203;BKStock](https://github.com/BKStock), [@&#8203;BlackishGreen33](https://github.com/BlackishGreen33), [@&#8203;bnikanjam](https://github.com/bnikanjam), [@&#8203;bounce12340](https://github.com/bounce12340), [@&#8203;Bounty13](https://github.com/Bounty13), [@&#8203;bpross](https://github.com/bpross), [@&#8203;briandevans](https://github.com/briandevans), [@&#8203;bricelb](https://github.com/bricelb), [@&#8203;brunopirz](https://github.com/brunopirz),
[@&#8203;bryanneva](https://github.com/bryanneva), [@&#8203;byshubham](https://github.com/byshubham), [@&#8203;camaleonidas](https://github.com/camaleonidas), [@&#8203;canorionen](https://github.com/canorionen), [@&#8203;carbongotfound](https://github.com/carbongotfound), [@&#8203;carljborg](https://github.com/carljborg), [@&#8203;carlotestor](https://github.com/carlotestor), [@&#8203;carrion256](https://github.com/carrion256),
[@&#8203;caseyanthony](https://github.com/caseyanthony), [@&#8203;cat-thats-fat](https://github.com/cat-thats-fat), [@&#8203;Cdddo](https://github.com/Cdddo), [@&#8203;ceverson70](https://github.com/ceverson70), [@&#8203;chancelu](https://github.com/chancelu), [@&#8203;chaos-xxl](https://github.com/chaos-xxl), [@&#8203;CharlesMcquade](https://github.com/CharlesMcquade), [@&#8203;chazmaniandinkle](https://github.com/chazmaniandinkle),
[@&#8203;chefboyrdave21](https://github.com/chefboyrdave21), [@&#8203;chelsealong](https://github.com/chelsealong), [@&#8203;Christopher-Schulze](https://github.com/Chr…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/compression Context compression and continuation sessions comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint needs-decision Awaiting maintainer decision before any implementation P2 Medium — degraded but workaround exists sweeper:risk-caching Sweeper risk: may break/degrade prompt caching or cache-key stability (invariant) sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:risk-session-state Sweeper risk: may lose/corrupt/mis-associate session or context state type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants