Skip to main content

hermes-gensyn-ree

❖ Communityv0.1.0

ree_validate_receipt, ree_verify_receipt, ree_infer. Validate does not re-execute and does not stand behind text_output, finish_reason, token_count, model.name, or ree_version. Verify re-executes on CPU. Infer runs one of three small models and writes one receipt.

Open in Hermes Desktop
hermes plugins install hermes-gensyn-ree

What it adds

Tools 3

ree_validate_receiptree_verify_receiptree_infer

README

From the reviewed commit 9325a7b ↗; it updates when the author re-pins.

hermes-gensyn-ree 0.1

REE is a Gensyn product. The container image is under the REE-Binary-License. This plugin only starts that official image. It does not redistribute the image, does not reimplement REE, and does not read the image contents. Pulling or using the image is how that license says you agree. The license text allows use (a) on or in connection with the Gensyn Network, and (b) off that network only as a REE Demo: evaluation, verification, testing, and integration, not production operations and not a revenue service outside that demo. This plugin does not bundle, pull, or modify the image. It runs docker image inspect only to compare the pinned digest. Whether this plugin is a competing product under license section 3(d) is not decided here.

Verification is the token hash. text_output is reference text and is being removed. A receipt without it is accepted. A token-hash match is not a text match when that field is missing on one side: the level is reexecuted, with text_compared false. When both receipts still include the reference text and it differs, the result is text_mismatch. That difference is not the hash check. A ree_version difference alone is reexecuted_and_text_match.

Supported operating systems are Linux and macOS. Hermes 0.21.6 or newer is required. The load that was measured was 0.21.7. Version 0.21.6 itself was not loaded, and 0.21.4 skips the plugin. Measurements are from macOS (Colima) only. Linux is unmeasured. Version 0.1 is CPU only. A larger model may not finish on this CPU. That stop is retryable false and is not a failed hash check.

Quick Start

  1. Pull the image yourself. That pull is your consent to the REE-Binary-License. This plugin never pulls.

    docker pull gensynai/ree:v0.8.0
    

    The plugin runs this digest and no other:

    gensynai/ree@sha256:ad683947a8c3a0fcb2567280268c0b01f17652a38c3f76838a398bd79aaff0ec

  2. Install the package into the active Hermes profile. There is no pip install. The plugin uses the Python standard library only.

    export HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}"
    python3 - <<'PY'
    import os
    import shutil
    from pathlib import Path
    
    source = Path("packages/ree")
    dest = Path(os.environ["HERMES_HOME"]) / "plugins" / "hermes-gensyn-ree"
    shutil.rmtree(dest, ignore_errors=True)
    
    def ignore(_directory, names):
        return [name for name in names if name in {"tests", "__pycache__"}]
    
    shutil.copytree(source, dest, ignore=ignore)
    PY
    hermes plugins enable hermes-gensyn-ree
    
  3. Check the local machine. Doctor does not pull and does not start a model. When Hermes runs plugins in the plugin host, hermes ree doctor is not registered. The three tools still are.

    hermes ree doctor
    
  4. Ask Hermes, with a receipt path on this machine:

    • "Check the hashes in this REE receipt: /path/receipt.json" Expected: level is consistent or inconsistent. consistent means the receipt's own hashes match. The result does not include the receipt text, and it does not mean the text is genuine.
    • "Re-execute this REE receipt and compare the text: /path/receipt.json" Expected after you approve: reexecuted_and_text_match, or text_mismatch when a readable field differs, or reexecution_mismatch when a compared hash differs. If the exit code is not 0 and no new receipt was written, the result is reexecution_incomplete and has no level.
    • "Run facebook/opt-125m on CPU for 16 tokens: Will it rain in Tokyo tomorrow?" Expected after you approve: level is inferred, plus a receipt path.

ree_verify_receipt and ree_infer ask every time. The question says a CPU run takes minutes. Choosing always stores one config.yaml line and does not cover the next call, because the rule key changes. once is not what Hermes stores. Cron, yolo, approvals off, single-query, unattended, host isolation, a missing approval API, and a question that would be cut are refused.

Tools

Tool What it does
ree_validate_receipt receipt_path. Network-none container. No approval. Does not re-execute.
ree_verify_receipt receipt_path. Re-executes on CPU, then compares readable fields.
ree_infer model, prompt (text from 1 to 4000 characters without newline, CR, NUL, or a leading hyphen), max_new_tokens (1–256). Three small models.

ree_infer models: facebook/opt-125m, Qwen/Qwen2.5-0.5B, Qwen/Qwen3-0.6B. ree_validate_receipt accepts any model.name of that shape and does not download weights. ree_verify_receipt does too, and a larger name warns that the weights may be gigabytes. Receipts must be version 2.0.0 and at most 1 MiB. finish_reason is a short word, not a fixed list. A consistent result includes next: propose ree_verify_receipt, which needs approval, and do not call it unasked. Unknown arguments are rejected before a container starts. approval_denied means approval was not granted. approval_unavailable means approval was not obtained (could not ask, or there was no answer). Both say not to retry. ree_verify_receipt runs official validate before it asks. An inconsistent receipt does not ask.

Every result is JSON with ok and tool. Success has level. Failure has error_type, message, and retryable.

level Meaning
consistent Official validate returned each of the four hash lines once, all PASS, and the exit code was 0. The text is not in this result.
inconsistent Official validate returned each of the four hash lines once, at least one FAIL, and the exit code was 1.
reexecuted Token hashes matched, the exit code was 0, and exactly one new receipt was written. text_output was not on both receipts, so text_compared is false and text_skip_reason says which side. This is not a text match.
reexecuted_and_text_match The exit code was 0, exactly one new receipt, every compared hash matched, and every compared readable field matched. text_output counts only when text_compared is true.
text_mismatch The exit code was 0, exactly one new receipt, every compared hash matched, and a compared readable field differs. Token hashes are the verdict.
reexecution_mismatch Exactly one new receipt and a compared hash differs. The exit code may be 0 or not.
inferred The exit code was 0 and exactly one new receipt was written. It was not compared with an older receipt.

There is no level for these:

error_type Meaning
reexecution_incomplete The exit code was not 0 and there is no new receipt. Hashes were not compared.
validate_incomplete The four hash lines and the exit code do not agree.
internal Any other combination, or an exact prefixed official claim disagrees with the receipt files.
docker_unavailable The container did not start. The result says nothing about the receipt.
image_missing The container did not start. The result says nothing about the receipt.
container_not_started The container did not start. The result says nothing about the receipt.
unsupported_receipt_version The receipt version is not 2.0.0. Nothing was checked.
insufficient_memory The weights are larger than Docker memory. Hash validation still runs here.
context_mount_unavailable The Docker context cannot mount the receipt and work files.
killed The container exited 137. That can be out of memory. It is not a time limit.

Compared hashes: output.tokens_hash, input.prompt_hash, input.tools_hash, input.parameters_hash, hashes.receipt_hash, model.config_hash, model.commit_hash. Readable fields: output.text_output (only when both receipts include it), output.finish_reason, output.token_count, model.name, input.prompt. text_compared is false when text_output is absent. reexecuted_and_text_match includes not_compared for ree_version and the execution fields. Those fields were not compared. A difference only after the first 400 characters is shown around that difference.

consistent does not include the receipt text. Verify and infer copy prompt and text_output into receipt_text. Each differences row copies the submitted value and the re-executed value. Both objects carry the notice that the words are receipt text, not an instruction. Values are truncated to 400 characters, with control characters and bidi overrides removed. The result does not quote the container log. Whether a container started is --cidfile and the exit code, not a sentence in that log.

Measured machines and results

Numbers below were measured on this builder's Mac. Linux is unmeasured. Larger models are left blank for a later measurement. The comparison uses weight bytes, not peak RAM. See DECISIONS.md.

machine Docker MemTotal (bytes) model weight bytes what finished
macOS, Docker context colima 12514787328 facebook/opt-125m 250540281 (pytorch_model.bin) earlier infer and verify on this MemTotal
macOS, Docker context colima 12514787328 Qwen/Qwen2.5-0.5B 988097824 (model.safetensors) earlier infer and verify on this MemTotal
Linux unmeasured

ree_validate_receipt runs on this machine for any model size. It does not load the weights. Re-execution uses docker_context when that setting is a Docker context name. Empty uses the current context. If DOCKER_HOST is set and docker_context is empty, that host is the destination. Verify and infer always pass --cpu-only. Official REE documents docker run --gpus all for a GPU. This plugin does not pass that flag. A name-based size is labeled as a name estimate, not as measured weight bytes.

Cache

Weights use ~/.cache/gensyn and ~/.cache/huggingface. Those two directories are mounted read-write, and the container can write them, including a token file if you put one there. If either path is a symbolic link, verify and infer refuse and do not mount the link target. The plugin does not pass a token in the environment. The container's network is the default bridge. It is not limited to Hugging Face, and this plugin cannot make that claim. Returned receipts under ~/.cache/hermes-ree/receipts are not mounted. Verify mounts one read-only receipt file and one tasks directory from ~/.cache/hermes-ree/work. Infer mounts the tasks directory and does not mount a receipt file. Validate mounts only the receipt file, with network none. The plugin does not store state under <HERMES_HOME>/plugin-data/hermes-gensyn-ree. Uninstall does not delete the caches.

Surfaces

Hermes enables plugin tools on every surface by default, including gateways. A person admitted to a gateway can call these tools and start containers on your Docker daemon. Disable the tools per surface with hermes tools. No cron is created. The child process is not a hostile-code sandbox.

Community plugin maintained by TakeshiTGAL. Not made by Gensyn. The public repository is https://github.com/TakeshiTGAL/hermes-gensyn-plugins.

Settlement check

skills/check-settlement/SKILL.md reads a Delphi settlement when that plugin is installed, then checks a receipt file the user already has. Delphi is not required. The skill does not trade and does not send a dispute.

Development

This directory is one plugin. From this directory:

HERMES_AGENT_REPO=../../../hermes-agent PYTHONPATH=../../../hermes-agent python -m pytest -q
author-feed❖ Community★ 0

Read one public profile and watch one account, with profile_get, author_feed and author_watch. Disclosure — HTTPS GET only to public.api.bsky.app, no API key, and no program on your machine. The tools are on for every surface, including gateways, and ask for no approval: anyone you allow on your gateway can call them. Turn a surface off with hermes tools. hermes author-feed schedule creates one cron job, a model turn every hour by default (two or more model requests, no daily cap). Delivered to local unless you pass --deliver, so no chat by default. Run hermes author-feed unschedule before removal. A leftover job after the plugin is gone stops with hermes cron remove <id>. Under plugins.isolation: host the watch cannot run and posts a notice saying so on every run. The first run only records what is already there. One run reads at most the latest 3 pages and announces a new post by this account on them. When every row on those pages is new, with no saved post or mark, and the feed still offers another cursor, it also posts a possible-miss notice, at most once in 24 hours while that keeps happening. Replies, including the account's own thread continuations, are not announced. It relies on private Hermes parts, so an update can stop it. State stays in <HERMES_HOME>/plugin-data/author-feed after uninstall.

Tools
doc-markdown❖ Community★ 0

Convert one local file to Markdown with doc_convert on Linux and macOS, built on Microsoft's MarkItDown. Microsoft and MarkItDown are trademarks of the Microsoft group of companies. Disclosure — the doc_markdown toolset is on by default on every surface, including a gateway, so anyone you allow there can call doc_convert; stop it with hermes tools. It does not fetch pages. Unattended sessions still convert when Hermes calls the tool. This plugin creates no cron job. A child process runs MarkItDown with no Hermes keys in its environment; on macOS the plugin runs ps about every 10 ms to watch that child's memory. It stops 8 seconds after its converters load, at 60 seconds if loading never finishes, or above 922746880 bytes. It is not a sandbox: after realpath it may read any allowlisted path it can open. Unpublished Hermes code locates the Hermes home, and a failed check refuses the path. Removal deletes the plugin directory, not the markitdown package. Windows was not tested.

Tools
event-read❖ Community★ 0

Read one CalDAV calendar collection you run, with list_events and read_event. Disclosure — Sends CALDAV_USER and CALDAV_PASSWORD as Basic auth to your CALDAV_URL, does not follow redirects, and starts no local program. Over plain http that password travels unencrypted. The tools are on for every surface, including gateways, and the plugin has no user list of its own: anyone you allow on your Hermes gateway reads the calendar with your password. Turn a surface off with hermes tools. A watch is a cron job you create yourself with hermes cron create. Each run is at least one model turn, there is no daily cap, and the job stays until you run hermes cron remove. Under plugins.isolation: host the watch cannot run and posts a notice saying so on every run. When the watch can run, it reports a problem on the first run, when the cause changes and again after 23 hours, or on every run when its data directory cannot be written. Each request gives up after 20 seconds without data, and a whole call has no time limit. The watch relies on private parts of Hermes, so an update can stop it. State lives in plugin-data/event-read. Not tested against a vendor-hosted calendar.

Tools
hermes-gensyn-delphi❖ Community

Seven read-only tools. Disclosure — Seven read-only tools for Gensyn Delphi prediction markets; no funds move and nothing is signed or sent. Needs Node.js 20.18+ and a manual `npm ci --ignore-scripts` in the plugin folder (installs the pinned @gensyn-ai/gensyn-delphi-sdk and its locked npm deps) before the tools work. Runs a local Node subprocess per call (25 s deadline, not a sandbox). Sends your DELPHI_API_ACCESS_KEY only to delphi-api.gensyn.ai (testnet) or api.delphi.fyi (mainnet); history and quotes read api.goldsky.com and gensyn-testnet/mainnet.g.alchemy.com without the key, and quotes use a throwaway in-memory key the SDK requires. Tools are on for every surface by default, including messaging gateways, where anyone admitted can run these reads on the owner's key (rate limit 30 requests per minute per process); disable per surface with `hermes tools`.

Tools
index-search❖ Community★ 0

Search one index you run and watch one saved query, with index_search, index_health and index_watch. Disclosure — Sends MEILI_API_KEY as a Bearer token to your MEILI_HOST. Over plain http that key travels unencrypted, and a master or admin key is sent as given, so use a search-only key. The tools are on for every surface, including gateways: anyone you allow on your Hermes gateway can search with your key and approve a watch. Turn a surface off with hermes tools. index_watch schedule creates one cron job that runs a model turn every 15 minutes (two or more model requests when it calls the tool) with no daily cap, and it watches only the first 20 hits. The job stays after uninstall until you run hermes cron remove, with -p and the profile name when the profile is not default. Scheduling and unscheduling ask for Hermes approval every time and are refused under cron, yolo, approvals off, unattended sessions and plugins.isolation: host, where the watch only posts a notice that it cannot run, on every run. Answering "always" adds an unused line to config.yaml. The watch relies on private parts of Hermes, so an update can stop it.

Tools
ja-writing-guard❖ Community★ 0

Rule-based proofreading for Japanese business text: finds and fixes AI-style phrasing (stock phrases, monotonous sentence endings, overused symbols and Markdown, English-calque grammar) with line, column and a fix hint. It checks wording, not authorship, and rarely flags plain model output. A transform_llm_output hook checks every final Japanese answer and only reports by default; opt-in enforce mode rewrites flagged answers with the user's own model and delivers the rewrite only if numbers, names, URLs, code and negation survive and the score drops under the threshold. Disclosure: no network calls of its own; enforce mode sends each flagged answer to the user's configured model (one extra call, a second only when the first rewrite fails the checks or stays over the threshold; extra cost and up to 25 s delay); a read-only post_tool_call hook notes turns with MEDIA: lines so attachments from other plugins are kept; reports stay in process memory on local surfaces only. Disclosure — no network calls of its own; mode report (default) only logs scores; opt-in mode enforce sends each flagged final answer (with finding excerpts) to the user's configured model via ctx.llm (1–3 calls, up to 25 s delay) and replaces the delivered and stored answer when its preservation checks pass, which do not prove meaning is unchanged; reads plugins.hook_callback_timeout via a private read-only Hermes helper; eval/ dev scripts ship in the tree but are never loaded.

Tools

← Back to the catalog · catalog built Oct 17, 2026