Eidolon — Universal Self-Improvement Layer for Hermes Agents
Eidolon is a drop-in layer that hardens a Hermes agent's native dream, reflection, and memory loops into a disciplined, anti-fragile, self-improving system. Zero human babysitting: it runs autonomously, improves itself every session and on a schedule, and refuses to guess or gaslight. Deploy once and forget it.
What it does
- Clear SOUL.md contract — a plain, zero-guess identity and operating contract the agent loads every session. No manual sealing or hashing to maintain.
- Risk-gated self-improvement — low-risk fixes auto-apply; high-risk changes are shadow-tested first; regressions auto-roll-back.
- Dream cycle — autonomous post-session and scheduled reflection that mines hindsight memory, extracts lessons, and proposes improvements.
- Integrity watchdog — detects when upstream Hermes changes (skills paths, hooks, cron) break your setup and alerts the operator once per incident, without blocking sessions.
Principles
- No guessing. If a fact is unknown, the agent says so and verifies before acting.
- No gaslighting. It never rewrites history or denies prior state.
- Anti-fragile. Drift and breakage make the system stronger, not silent.
- Autonomous. Self-improvement requires zero approvals and zero reminders.
- Immutable safety. Security invariants are never modified by self-improvement.
Layout
SOUL.md Identity + operating contract (plain, no seal)
OPERATOR.md Human-facing setup + control guide
skills/dream-cycle/ Autonomous reflection + RL loop
skills/integrity-watchdog/ Drift detection + one-time alerting
tests/ Adversarial harness + test plan
The eidolon CLI
Eidolon ships a canonical command that never silently no-ops. Every subcommand
returns 0 on PASS, 2 on DEGRADED (loud reduced mode), and 1 on FAIL.
eidolon doctor # preflight checks (JSON via --json, --model-check)
eidolon verify # post-install end-to-end CLI smoke test (--json, --strict)
eidolon report --since 24h # measurable deltas: sessions, lessons, proposals, rollbacks
eidolon rollback --dry-run # restore from last-known-good snapshot
eidolon version # print semver
Every Eidolon component emits structured events into $EIDOLON_HOME/events.jsonl
(default: ~/.hermes/state/eidolon/events.jsonl). eidolon report reads that
log and prints integers you can plot. Empty state prints zeros with a first-run
banner — never null, never N/A.
Install
One-liner (macOS + Linux, Python 3.10–3.13):
curl -fsSL https://raw.githubusercontent.com/shagghiesuperstar/Eidolon-Soul-For-Hermes-Agent-Universal/main/install.sh | bash
What that does:
- Detects Python 3.10–3.13 (aborts loudly if absent — no silent guessing).
pip install --usertheeidolon-hermespackage from the pinned git ref.- Runs
eidolon doctorat the end. If doctor says FAIL, the installer exits non-zero. If DEGRADED (no host Hermes yet), install succeeds and the operator is told exactly why.
Once REC-007 (PyPI publish) lands, the one-liner becomes pip install eidolon-hermes.
Homebrew (macOS + Linuxbrew)
After the first stable release lands on PyPI, Eidolon is also available via a Homebrew tap:
brew tap eidolon-hermes/eidolon
brew install eidolon
See docs/install-brew.md for details, upgrade, and uninstall. The formula lives at packaging/homebrew/eidolon.rb in this repo; the tap repo mirrors it on every release.
Installer environment overrides (all optional):
| Var | Purpose | Default |
|---|---|---|
EIDOLON_REF |
Git ref to install | main |
EIDOLON_METHOD |
pip or src (clone-then-install) |
pip |
EIDOLON_PYTHON |
Interpreter to bind to | Auto-detected |
EIDOLON_SKIP_DOCTOR |
1 skips the final doctor gate |
0 |
HERMES_HOME |
Host Hermes home | $HOME/.hermes |
EIDOLON_HOME |
Eidolon state root | $HERMES_HOME/state/eidolon |
After install, verify anytime:
eidolon doctor # environment health
eidolon verify --strict # end-to-end CLI smoke; --strict promotes DEGRADED to exit 2
python tests/adversarial.py # S1–S3 guarantees
PYTHONPATH=src python -m unittest discover -s tests/unit # full unit suite
Don't want the installer script? Drop the skills/ directory into your
Hermes skills path and point your sessionend hook + cron at the
dream-cycle and integrity-watchdog handlers. See OPERATOR.md.
PII sanitization hook (REC-011)
CI runs scripts/sanitize_check.py on every PR. To catch leaks locally
before they hit CI, wire up the pre-commit hook once per clone:
git config core.hooksPath .githooks
Add a new pattern by appending to .sanitize-patterns.yml; the reader is
stdlib-only. Every pattern MUST ship with <name>_positive.txt and
<name>_clean.txt fixtures under tests/fixtures/sanitize_selftest/.
Bypass with git commit --no-verify only in emergencies — CI still enforces.
Releases & DOI
Eidolon uses SemVer (vX.Y.Z); host Hermes uses CalVer. The hermes_version
doctor check reasons over dates, not SemVer — see
src/eidolon/checks/hermes_version.py. Stable tags are minted on Zenodo
(.zenodo.json at repo root is the source of truth). Prereleases skip DOI
minting. See RELEASING.md for the full tagging + DOI policy.
Cite this
If Eidolon supports academic work, cite it via
CITATION.cff. BibTeX and APA-style examples live in
docs/citing.md. GitHub renders the CFF as a
"Cite this repository" widget on the project page.
License
Metadata
Release files for eidolon-hermes 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| eidolon_hermes-1.0.0.tar.gz | 96.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| eidolon_hermes-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 164.2 kB
Release files / eidolon_hermes-1.0.0.tar.gz
| Download URL | eidolon_hermes-1.0.0.tar.gz |
|---|---|
| Size | 96.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbffc9227cb63f9a36b53311b39f14aba4947580cc4bbf606e9b8f79cce7ee4c
|
|
BLAKE2b-256 checksum How to use checksums |
82e0af3a88877fdc0a14f33031335d4b99fa7e089243a565a3eed4eb6e7edd91
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 8, 2026.
Transparency logRelease files / eidolon_hermes-1.0.0-py3-none-any.whl
| Download URL | eidolon_hermes-1.0.0-py3-none-any.whl |
|---|---|
| Size | 67.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7d5640c96d2a900b6413ea81446a693135c453096820d1c0c6cf84151fc01af1
|
|
BLAKE2b-256 checksum How to use checksums |
78949aa91f4caa2f151a080a86495e341e94fe4b9f741a70ebdaa95c83280b40
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 8, 2026.
Transparency log