Read-only health scanner for long-running Hermes Agent setups
Project description
Hermes Doctor
Linters check your code. Hermes Doctor checks your agent's mind.
A local, read-only annual physical for a long-lived personal Hermes Agent installation.
Hermes Doctor scans bloated memories, stale skills, reminder/cron drift, oversized sessions, broken local Markdown links, and runtime warnings — without modifying anything.
Hermes gets better as it remembers. But long-lived personal agents also accumulate entropy.
It started as a family physician's tool for treating a different kind of patient: my personal AI agent. Designed by someone who thinks in preventive checkups, not emergency surgery.
Early public preview. Useful, small, and intentionally conservative.
Non-goals
Hermes Doctor is deliberately small. The following are not going to happen:
- ❌ No
--fixmode, ever. The doctor writes the prescription; you go to the pharmacy. - ❌ No cloud service, dashboard, or telemetry. Reports are local-only.
- ❌ No automatic memory deduplication, skill rewriting, or cron reconciliation.
- ❌ No support for other agent frameworks (AutoGPT, LangChain, etc.) until Hermes itself is stable.
- ❌ No generic Markdown linting — there are better tools for that.
- ❌ No runtime dependencies in the core scanner. Stdlib only.
Who is this for?
Hermes Doctor is for people who run Hermes Agent as a long-lived personal agent and want to know when local state is getting messy:
- people using Hermes memories and skills heavily
- people relying on reminder / cron automation
- people keeping Markdown-based personal state around an agent
- people who want safe diagnosis before cleanup
- people interested in personal agent observability and hygiene
What it checks
- Markdown bloat and broken local links
- Memory / skill size, duplication, and mutable project-fact candidates
REMINDERS.mdvshermes cron listconsistency- Session file size
- Recent runtime / gateway warning and error event counts
- Domain scores and overall health score
Safety model
Hermes Doctor v1 is observational and read-only.
It does not:
- edit files
- delete files
- deduplicate memories or skills
- reconcile reminders
- modify cron jobs
- scan external project folders unless explicitly requested
- send your local data anywhere
Reports redact paths, secret-like strings, and identifier-like strings on a best-effort basis. Do not publish reports from real personal deployments without reviewing them first.
Privacy
- No telemetry.
- No network calls, except local execution of installed
hermesCLI commands. - Reports are generated locally.
- Raw Hermes command output is excluded by default.
--debug-rawis for local debugging only and should not be used for public reports.- Redaction is best-effort, not a formal secret-scanning guarantee.
Install
Recommended (zero-install, ephemeral):
pipx run hermes-doctor --summary
Persistent install:
pipx install hermes-doctor
Or from source:
git clone https://github.com/samahn0601/hermes-doctor.git
cd hermes-doctor
python -m pip install -e .
Usage
# Full Markdown report
hermes-doctor
# Compact output for cron/watchdogs
hermes-doctor --summary
# Safe JSON output
hermes-doctor --json
# Write timestamped report and refresh <HERMES_HOME>/reports/health/latest.md
hermes-doctor --write-report
# Automation gate: exit 2 on critical findings
hermes-doctor --summary --fail-on critical
By default, Hermes Doctor scans only the Hermes home directory:
hermes-doctor --hermes-home ~/.hermes
External Markdown paths are opt-in:
hermes-doctor --include ./my-notes
hermes-doctor --include-project-hub
Raw Hermes command output is excluded by default. For local debugging only:
hermes-doctor --json --debug-raw
Example summary
Hermes Health: 100/100 (healthy)
Findings: critical=0 warning=0 info=3
Domains: markdown=100, memory_skills=100, reminder_cron=100, session_context=100, runtime_gateway=100
Reminder/Cron: ids=['r_0001']
Runtime: errors=0 warnings=0
Actionable: none
Example finding
Actionable:
- [warning] Memory/skill size warning (memory.size): <HERMES_HOME>/memories/notes.md size=84KB
- [critical] Active reminder missing cron job (reminder.cron_missing): r_0007
Hermes Doctor does not fix these automatically. It tells you what to inspect before you change state.
Scoring model
Hermes Doctor uses heuristic domain scores, not a formal proof of system health.
- warning findings apply a small penalty
- critical findings apply a larger penalty
- the weakest domain is weighted heavily so one bad subsystem is not hidden by a good average
- info findings do not reduce the score
Treat the score as a screening result, not a diagnosis carved in stone.
Limitations
- Hermes Doctor is heuristic and may produce false positives or false negatives.
- Hermes CLI output formats may change over time.
- Redaction is best-effort; review real reports manually before sharing.
- v1 is intentionally conservative and does not repair state.
- This is not an official Hermes Agent project.
Development
python -m pip install -e .[dev]
python -m pytest
python -m ruff check .
Roadmap
- v0.1 — read-only scanner (current)
- v0.2 — golden fixture corpus + adversarial redaction tests + stable finding IDs (
HD-MEM-001,HD-CRON-002) + analyzer status reporting + PyPI publication - v0.3 — dry-run "review candidates" suggestions, conditional on v0.2 trust. Never executable scripts. Still no silent mutation.
- v1.0+ — boring, trusted, intentionally feature-frozen. Wins by credibility and restraint, not feature volume.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hermes_doctor-0.2.0.tar.gz.
File metadata
- Download URL: hermes_doctor-0.2.0.tar.gz
- Upload date:
- Size: 17.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9179ddefab585c0a7cf0e23942a00952aed974b90cde639bf17300d61f2861d3
|
|
| MD5 |
6d2fd3d622be8f4646879a566c06f706
|
|
| BLAKE2b-256 |
9f7730b56ab99d7c25f8be42dea1629a12247576bd2de41e3c376edb558dc16a
|
Provenance
The following attestation bundles were made for hermes_doctor-0.2.0.tar.gz:
Publisher:
release.yml on samahn0601/hermes-doctor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_doctor-0.2.0.tar.gz -
Subject digest:
9179ddefab585c0a7cf0e23942a00952aed974b90cde639bf17300d61f2861d3 - Sigstore transparency entry: 1418010499
- Sigstore integration time:
-
Permalink:
samahn0601/hermes-doctor@ee245c739be370c79386e2b3ea8a75e34e996bdf -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/samahn0601
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ee245c739be370c79386e2b3ea8a75e34e996bdf -
Trigger Event:
push
-
Statement type:
File details
Details for the file hermes_doctor-0.2.0-py3-none-any.whl.
File metadata
- Download URL: hermes_doctor-0.2.0-py3-none-any.whl
- Upload date:
- Size: 13.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c5180ccc62b9464a570b8cdcb1cabdfca1b2d10ade4482ea365a2d85567ebc9
|
|
| MD5 |
b6a1339d5eb7a74e9c00746e503097da
|
|
| BLAKE2b-256 |
c67c449b044dfa84a8a3ac21e236dbad4f16e88202d7b925d6f8b7e2d5a3d88a
|
Provenance
The following attestation bundles were made for hermes_doctor-0.2.0-py3-none-any.whl:
Publisher:
release.yml on samahn0601/hermes-doctor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_doctor-0.2.0-py3-none-any.whl -
Subject digest:
6c5180ccc62b9464a570b8cdcb1cabdfca1b2d10ade4482ea365a2d85567ebc9 - Sigstore transparency entry: 1418010518
- Sigstore integration time:
-
Permalink:
samahn0601/hermes-doctor@ee245c739be370c79386e2b3ea8a75e34e996bdf -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/samahn0601
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ee245c739be370c79386e2b3ea8a75e34e996bdf -
Trigger Event:
push
-
Statement type: