# svos_miranda Hermes plugin — validation pass (2026-09-15) svos-dev asked infra-ops to run `hermes plugins validate` → `doctor` → `compat` on `/home/lkraven/development/svos/hermes_plugin/` and report before enabling. Hermes Agent v0.21.1 (2026.9.7), local `b88e6776`, on nh3-dev. ## The blocker (found, fixed by svos-dev at `c964e64`) Three absolute intra-package imports — `from hermes_plugin._vendored`, `.forward`, `.jwt` — pinned the package to its **source directory name**. The documented install renames it to `svos_miranda`, and Hermes loads directory plugins under the `hermes_plugins.` namespace; in neither case does a top-level `hermes_plugin` exist. Fix: three relative imports. ⚠ **The harness hid this from three different readers.** My first `validate` passed the import only because my cwd was the SVOS repo root. svos-dev's test suite imports `hermes_plugin.*` from that same root, and their editable install resolves the name from anywhere on the box — it only reproduced for them once `sys.path` was stripped. Same class as `feedback_filters_that_silently_narrow_the_window`: the instrument carried the result. ## ⚠ Two of the three commands CANNOT pass this plugin, ever Neither is fixable from the plugin side. Both are now documented in its README. - **`validate`** — two independent causes. Its `RecordingContext.get_config` (`hermes_cli/plugin_validate.py:219-222`) returns the **default for every key**, ignoring `config.yaml` entirely, so `dispatch_key` is always `""`. And its `register_tool` returns `None`, which the plugin's INV-P6 guard correctly reads as a name collision — so even with a key supplied it raises on the first tool. - **`doctor`** — runs `register()` under a **temp `HERMES_HOME`** with sockets blocked, so no config exists there either. ## Tool-level gotchas worth remembering - ⚠ **`hermes plugins doctor` exits 0 even when it prints ERROR.** Needs `--ci`. - ⚠ **`hermes plugins compat ` prints ✓ and exits 0.** A typo'd path reads as a pass. (The instrument itself is sound — verified with a throwaway plugin importing a real deprecated path, which it flagged with file:line, exit 1.) - ⚠ **`doctor`'s sandbox registry starts EMPTY — 0 entries, no built-ins.** So doctor cannot detect tool-name collisions at all. `validate`'s separate static "built-in tool collisions" check is what covers that. - The real `PluginContext.register_tool` (`hermes_cli/plugins.py:449-491`) returns a truthy `PluginRegistration` on success — confirmed against the live runtime. ## Roster verified another way Since neither command can supply config, a probe mirroring validate's context but returning real settings and a truthy handle gave: **8 tools** with `repo_read_enabled: true`, **7** with false or omitted, names matching `plugin.yaml` exactly, zero hooks/middleware/commands. All nine settings-validation controls (quoted booleans, `"90 s"`, zero/negative timeouts, empty/whitespace strings) raise errors naming their own key. ## A false finding I caught on myself A probe registering `read_file` got back a `PluginRegistration` instead of the expected refusal — which looked like the plugin's collision reading was wrong. It was not: doctor's sandbox holds no built-ins, so nothing was claimed and **my positive case was not positive.** Reported as untested rather than as a finding. ## Where enabling stands Blocked on the operator only. See the OPEN row in the index for the sequence.