Conversation
…4926) Platform operators who mount a centrally-managed skill set into the Hermes container as a read-only volume currently have no way to stop Hermes from mutating skill files at runtime. The background self-improvement review loop and the dashboard learn flow call into `skill_manage`, which patches/edits SKILL.md and references/ files — the exact "Self-improvement review: Patched SKILL.md" behavior the reporter saw on a shared, externally-mounted skill dir. Add a `skills.read_only` config flag (default false). When true, `skill_manage` blocks every write action (create/edit/patch/delete/write_file/remove_file) before any handler runs, returning a clear "read-only by platform policy" error. Because all runtime skill writes — the `skill_manage` tool, the background review fork, and the dashboard learn flow — funnel through `skill_manage`, this single guard covers every write path. Listing, viewing, and *using* skills are untouched. Config doc updated in cli-config.yaml.example. Closes NousResearch#64926
Addresses #64926. Complementary to #64964 (which gates the |
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Approved
Summary
PR #64963 adds a skills.read_only runtime flag that blocks ALL skill write operations (create, edit, patch, delete) while leaving list/view/use paths functional. Enables centrally managed skill mounts in pod/container environments.
Assessment
- Correctness: Comprehensive coverage — blocks skill_manage, background self-improvement review loop, and dashboard learn flow from mutating skills.
- Scope: Config example + tool changes + new test class.
- Risk: Low. Read-only is opt-in via config.
No concerns
Reviewed by Hermes Agent
|
Thanks for proposing a config-level policy for managed skill deployments. The dispatcher guard is a useful start, but it does not yet provide the complete runtime write boundary requested in #64926. Problems
Suggested changes
This is an automated hermes-sweeper review. |
Summary
Platform operators who mount a centrally-managed skill set into the Hermes
container as a read-only volume currently have no way to stop Hermes from
mutating skill files at runtime. The background self-improvement review loop
and the dashboard learn flow call into
skill_manage, which patches/editsSKILL.mdandreferences/files — the exact "Self-improvement review:Patched SKILL.md in skill 'ontology-infer-sql'" behavior the reporter saw on a
shared, externally-mounted skill directory (#64926).
Changes
tools/skill_manager_tool.py_skills_read_only()helper readsskills.read_onlyfrom config(cfg_get/load_config, default
False) — same pattern as the existing_guard_agent_created_enabled().skill_manage()now short-circuits at the very top: whenskills.read_onlyis true and the action is one ofcreate/edit/patch/delete/write_file/remove_file, it returns a clearread_onlyerror before any handler (background-review preflight,write-approval gate, or the actual write) runs.
skill_managetool, thebackground self-improvement review fork, and the dashboard learn flow —
funnels through
skill_manage, this one guard covers all write paths.Listing, viewing, and using skills are unaffected.
cli-config.yaml.example— documents the newskills.read_onlyflag.tests/tools/test_skill_manager_tool.py— newTestSkillsReadOnlyclass(7 tests): each write action is blocked under
read_only,deleteleaves the file on disk, and writes still succeed when the flag is off.
How to Test
7 passed. Full file: 113 passed (no regression).
Why a single guard is sufficient
curator.pydoes not write skill files (it only reports provenancecounts) — out of scope.
tui_gateway/server.pyskills.manageRPC only supportslist/search/install/browse/inspect — no runtime write.
background_review.pydrives skill evolution via theskill_managetool(LLM-directed), so it is covered by the same guard.
Checklist
fix(skills): …)skill_manage+ config doc + its test fileRisk & Impact
Low. Only adds an opt-in, default-off config gate on skill writes. When
skills.read_onlyis unset/false (the default), behavior is byte-for-byteidentical to before. When enabled, the only change is skill write calls
return a refusal instead of mutating files; reads/use are untouched.
Type: Bug fix
Closes: #64926