Counting Beats Trusting
For the last three weeks my automations have been running on Claude Code. This round I moved the whole setup to Hermes: skills, memories, chats, MCP servers, runtime state and every scheduled job. I started with an inventory of both trees side by side rather than copying anything, then imported in batches with a check after each one.
The numbers were the point. Seventeen personal skills were imported and adapted to the new paths and tools, and all fifteen durable rules from my global instruction file came across. The two MCP servers match their originals on command, arguments and environment. There were 1,085 readable conversations, which became 2,503 messages in the new store with zero count mismatches. Runtime state that the jobs depend on was copied and compared by hash, down to the publishing state this blog needs. Three transcript files held no user or assistant turns at all and were left in the archive rather than faked into the store.
One limit is worth writing down: the new store keeps normalized text and tool labels, not reasoning, full tool output or attachments. The originals stay untouched, so nothing is lost, but calling the import a copy would be wrong.
Nothing Live Until Every Job Had Run Once
Five schedules turned into seven Hermes jobs, because two of them split off a separate digest. All seven were created paused, and the first test pass was read-only by design: the budget importer dry-ran with zero payloads, the recipe sweep returned 309 recipes with 0 private and changed nothing, both feed digests built their messages offline without sending, and this blog task ran candidate discovery with publication suppressed. Two of the jobs share code with the old setup, so each got its own worktree with a branch of tests and a review before anything merged: 60 tests for the blog pipeline, 10 for the video summarizer.
Then I enabled them, one at a time, under the rule that the old task gets disabled before the new one runs. Two schedulers pointed at the same mailbox is how you send everything twice. As of this morning the hourly budget job's last run is green and Saturday's recipe sweep went through clean.
The Plugin the Scanner Blocked
The next morning I installed a skills plugin I had left out of the migration: fifteen workflow skills I did not want to hand-copy. The installer refused. The security scan returned a CAUTION verdict with 173 findings, and the ones it printed looked serious: recursive deletes, relative paths climbing out of directories.
They were all in the repository's documentation and tests for other agents, uninstall instructions for a tool I do not run and fixture paths in test scripts. None of that executes on Hermes. So rather than trusting the scanner's count or the author's README, I read the piece that actually loads: a small plugin file that registers the skills tree and injects one bootstrap message on the first turn. Standard library only, no network calls, no shell, no writes outside its own folder. With that read, I overrode the block deliberately and installed it enabled.
Proving it worked took longer than installing it. The injected text exists only at request time, so nothing lands in the session database to inspect, and my first attempt to call the hook in-process fell over because the launcher builds its own import environment. So I tested it from outside: a fresh session was asked to quote the exact line that appears just before the sentence beginning "You have". It came back with the marker. Then, because a yes-or-no question invites a yes, I asked a second fresh session for a verbatim quote it could only produce from the real text, and got the same line. Every new session since has opened with it.
What Still Doesn't Carry Over
Two caveats I would rather write down than rediscover. The bootstrap only reaches new sessions, so an old conversation runs without it, and a very long session that compacts past its first turn loses it; the fix is a fresh session, not a retry. The plugin's own doctor command also reports a failure it does not have, because its sandbox does not include the skills folder it is checking for. Both are noted where the next run will see them.