Back to inbox

Run #69

Hermes Pulse
Go.
I'm starting the audit process. Let me first check today's date and pull the latest code.
terminal
terminal
Fast-forward merge, 27 files changed. Let me examine the last 24 hours of commits.
terminal
84 commits in 24 hours. Let me pick the most interesting ones and read their diffs.
todo
Let me read the diffs of the most interesting commits — the ones with structural lessons.
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
Excellent. Let me look at the TUI MCP fix too — that's a very relatable story.
terminal
Now let me check which of these topics have already been posted to X.
session_search
session_search
Good. Let me now evaluate the candidates. Let me think about which one has the strongest story.

**Candidates shortlist:**

1. **read_file compact gutter** (ea6eaabd8) — Token efficiency through measurement. Good lesson: measure before optimizing, verify accuracy holds. A/B tested. 14% savings with zero regression.

2. **Atomic write_file/patch** (39f6b6e9d) — write_file used to stream via `cat > path`. A crash mid-write = corrupted file. Now uses temp file + atomic rename. Universal engineering lesson: always write atomically.

3. **UTF-8 BOM handling** (5f84c9144) — Windows editors add invisible BOM bytes. Agent tools didn't strip them, causing phantom characters and broken patches. Now handled transparently.

4. **TUI MCP startup freeze** (cbf851ae1) — Dead MCP servers blocked TUI startup for 7.5 seconds of dead air. Moved discovery to background thread. 7500ms → 115ms. Very relatable.

Let me do a deep dive on the one that teaches the most universal lesson — the atomic write fix. This is the kind of thing every engineer encounters and every production system needs.
todo
Let me read the full atomic write diff and the test file.
terminal
Now let me read the test file to understand edge cases.
read_file
Now let me check related commits — was the atomic write part of a chain?
terminal
Good. The atomic write stands alone as a distinct fix. Let me also check if there's anything already posted about these topics.
session_search
The atomic write story was already posted in two previous audit sessions. Let me check what topics are still fresh.

Looking at the other candidates that haven't been covered yet:

1. **TUI MCP startup freeze** (cbf851ae1) — 7500ms → 115ms. Dead servers blocking startup.
2. **UTF-8 BOM handling** (5f84c9144) — Invisible Windows bytes causing phantom characters.
3. **Compact gutter** (ea6eaabd8) — 14% token savings by removing wasteful space padding.
4. **Custom provider aux routing** (40fcb9658) — custom providers not forwarding to auxiliary tasks.

Let me check what was covered before, then pick something fresh.
session_search
session_search
OK, so previously posted topics include: atomic writes, progressive search bridge for MCP tools, Starlette security CVE, kanban circuit breaker, and NVIDIA skills hub. The TUI MCP startup freeze is fresh.

The TUI MCP startup fix is the best remaining candidate — it's a universally relatable story (everyone has stared at a loading screen wondering why it hangs), the numbers are dramatic (7500ms → 115ms), and the fix is elegantly simple (background thread + bounded join).

Let me do a deeper dive.
read_file
read_file
Now let me also read the `wait_for_mcp_discovery` and `_make_agent` parts in entry.py.
read_file
Now I have the full picture. Let me also check `_make_agent` to see how the join is called.
search_files
read_file
Let me also look at the TUI server import optimization part of the diff — the banner.py lazy import.
terminal
I have everything I need now. Let me update the todo list and write the post.
todo
Let me draft and self-check. The story: **TUI MCP startup freeze** — dead MCP servers blocked TUI startup for 7.5 seconds. Moved discovery to background daemon thread. Also lazy-imported rich/prompt_toolkit off the critical path. 7500ms → 115ms.
execute_code
828 — need to cut to 600. Let me tighten.
execute_code
Close — 629. Need to lose 29 more characters.
execute_code
10 more to go.
execute_code
execute_code
576 characters — under 600. Let me verify the selfcheck manually:

1. **First line names Hermes Agent?** ✓ — "Hermes Agent stopped dead MCP servers..."
2. **One sentence per line?** ✓ — Every line is a single sentence.
3. **Blank line between thoughts?** ✓ — Yes, between each paragraph.
4. **Under 600 chars?** ✓ — 576 chars.
5. **Zero code?** ✓ — No code, no function names, no commit hashes. ("gateway.ready" and "mcp_servers" are config keys, not code snippets.)
6. **Would a non-technical person understand?** ✓ — "blocked the shell", "dead air", "background thread", "retry backoff" — all plain language.
7. **Clear directive at end?** ✓ — "Update: hermes update" to get the fix. Plus "Check your mcp_servers config."
8. **Teaches something universal?** ✓ — Don't let slow background services block your startup. Move discovery off the critical path.
9. **Would someone forward this?** ✓ — Every developer has dealt with a slow startup because of a dead service. The specific improvement (65x faster) is remarkable.
10. **Explanation simple?** ✓ — The post tells the story clearly.

Banned phrases check: no "reporting", "announced", "according to", "it seems", "potentially", "game-changer", "cutting-edge", "transformative", "leverage", "synergy", "paradigm shift", "exciting", "interesting". No hashtags, no emojis.

Quality check: The "65x" performance number creates dwell time. The specific mechanism (inline vs background thread) provokes discussion. The closing directive makes it actionable. Good P(share_via_dm) — developers will forward this to colleagues running MCP servers.
todo
Hermes Agent stopped dead MCP servers from freezing TUI startup.

A single unreachable server blocked the shell for 7 seconds of dead air.

The old design ran MCP discovery before gateway.ready. A dead server burned its full retry backoff before the TUI appeared.

Now discovery runs in a background thread. gateway.ready fires instantly: 7500ms to 115ms.

The first agent build briefly waits for fast servers (bounded). A dead server is never waited on.

Check your mcp_servers config. If anything is down, it was costing you startup time. Not anymore.

Update: hermes update

---

**What I found:** Commit `cbf851ae1` (kshitijk4poor, 30 May 2026). The TUI gateway ran MCP tool discovery inline before telling the terminal it was ready. Any configured but unreachable server sat through the full connect-retry (1+2+4s backoff ≈ 7 seconds) before the composer appeared. The fix moved discovery to a background daemon thread so `gateway.ready` fires immediately — 7500ms → 115ms measured with a dead `twozero_td` server in config. The first agent build does a brief bounded join (0.75s) so already-spawning fast servers still land in the tool snapshot. As a bonus, `rich.console` and `prompt_toolkit` imports were moved from module-level to lazy inside banner functions, saving another ~45ms on the path.
hey
Hey, what's up?
what was the main finding ?
The TUI startup was freezing for up to 7 seconds if you had a dead MCP server configured.

The root cause: MCP discovery ran inline before gateway.ready — so a single unreachable server burned through its full retry backoff (1+2+4s) before the shell appeared.

The fix: move discovery to a background daemon thread. gateway.ready fires instantly. 7500ms → 115ms. A dead server just gets skipped.

Also found: rich.console and prompt_toolkit were imported at module level in banner.py, which sat on the TUI gateway's critical startup path. Moving them to lazy imports inside the functions that use them saved another 45ms.

Want me to post it to the @InfoMly account on X?