hermes-pr-guidelines
Skill1 starsChanged 5 months agoMITView on GitHub
Hermes Agent PR submission standards: commits, tests, skills, cross-platform rules.
- Reads credentials
- Commits and pushes
In this repository8 other files it gives its agents.
- ai-cognitive-loadSkill
- android-controlSkill
- autonomous-researchSkill
- cron-task-specSkill
- git-worktreeSkill
- jj-workspaceSkill
- knowledge-explorerSkill
- xurl-best-practicesSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 6 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 44
One logical change per PR: Do not mix bug fix + refactor + feature.
- Distinctive: line 58
Every PR must satisfy these when submitting:
- Distinctive: line 97
Does NOT need custom Python integration or API key management
- Distinctive: line 177
Only add a clearly delimited block.
- Distinctive: line 181
If you can't test on Windows, avoid these:
- Very specific: line 191
Run before submitting: scripts/check-windows-footguns.py
- Distinctive: line 195
All new PyPI deps require upper bounds:
- Very specific: line 233
CI passes locally but fails remotely?: Check .gitignore isn't silently blocking source files.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Hermes Agent PR Submission Guidelines
Load this skill before creating or updating a PR to the NousResearch/hermes-agent repo. Covers all hard requirements from CONTRIBUTING.md and the PR template checklist.
When to Use
- Creating a new PR to hermes-agent
- Fixing a PR after review feedback
- Deciding whether to write a Skill vs Tool
- Writing commit messages for hermes-agent contributions
Commit Conventions (mandatory)
Format: <type>(<scope>): <description>
| Type | Use for |
fix | Bug fixes |
feat | New features |
docs | Documentation |
test | Tests only |
refactor | Code restructure (no behavior change) |
chore | Build, CI, dependency updates |
Common scopes: cli, gateway, tools, skills, agent, install, security
Examples:
fix(cli): prevent crash in save_config_value when model is a string
feat(gateway): add WhatsApp multi-user session isolation
test(tools): add unit tests for file_operationsOne logical change per PR. Do not mix bug fix + refactor + feature.
Branch Naming
fix/description # Bug fixes
feat/description # New features
docs/description # Documentation
test/description # Tests
refactor/description # Code restructuringPR Template Checklist
Every PR must satisfy these when submitting:
- Read the Contributing Guide
- Commit messages follow Conventional Commits
- Searched for existing PRs — not a duplicate
- Only related changes — no unrelated commits
pytest tests/ -qall pass (orscripts/run_tests.sh)- Added tests for changes (required for bug fixes)
- Tested on declared platform
- Updated relevant documentation — or N/A
PR description must include:
- What changed and why
- How to test (reproduction steps for bugs, usage for features)
- What platforms tested on
- Reference any related issues (e.g.,
Fixes #12345)
Testing
# Preferred — matches CI (hermetic env)
scripts/run_tests.sh
# Alternative (activate venv first)
pytest tests/ -q
# For new skills:
scripts/run_tests.sh tests/skills/test_<name>_skill.py -qTests for skills must use stdlib + pytest + unittest.mock only. No live network calls. Use monkeypatch and tmp_path for env/filesystem deps.
Skill vs Tool Decision
This is the most common contributor question. Answer is almost always Skill.
Write a Skill when:
- Can be expressed as instructions + shell commands + existing tools
- Wraps an external CLI or API called via
terminalorweb_extract - Does NOT need custom Python integration or API key management
Write a Tool when:
- Requires end-to-end auth flows, API key management, or multi-component config
- Needs custom processing logic that must execute precisely every time
- Handles binary data, streaming, or real-time events
Bundled vs Optional vs Hub:
| Location | When |
skills/ | Broadly useful to most users |
optional-skills/ | Useful but not universal (e.g., paid service) |
| Skills Hub | Niche / community-specific |
Skill Authoring Hardline Rules (8 rules — reviewers reject violations)
Rule 1: Description ≤ 60 characters
One sentence, ends with period. No marketing words ("powerful", "comprehensive", "seamless"). Don't repeat the skill name.
# ✅ Good
description: "Search arXiv papers by keyword, author, category, or ID."
# ❌ Rejected
description: "A powerful and comprehensive skill for searching arXiv academic papers"Rule 2: Use Hermes native tool names in prose
| Don't say | Say |
grep, rg | search_files |
cat, head, tail | read_file |
sed, awk | patch |
find, ls | search_files (with target='files') |
curl for content | web_extract |
echo > file | write_file |
Rule 3: platforms: gating
Skills using POSIX-only primitives must declare platform support:
platforms: [macos] # macOS only
platforms: [macos, linux] # macOS + Linux
platforms: [windows] # Windows onlyOmit for cross-platform skills.
Rule 4: author credits human first
# ✅ Correct
author: "Jane Doe (jane-doe)"
# ❌ Rejected
author: "Hermes Agent" # Tool credit, not humanRule 5: Fixed section order
# Skill Title (2-3 sentence intro)
## When to Use
## Prerequisites
## How to Run
## Quick Reference
## Procedure
## Pitfalls
## VerificationRule 6: Scripts/references/templates in named subdirectories
skills/my-skill/
├── SKILL.md
├── scripts/ # Helper scripts
├── references/ # API docs, examples
└── templates/ # Config templatesRule 7: Tests at tests/skills/test_<skill>_skill.py
Stdlib + pytest only. No network calls. Hermetic CI.
Rule 8: .env.example additions isolated
Only add a clearly delimited block. Don't touch surrounding content (stale versions dropped during salvage).
Cross-Platform Gotchas (Top 5)
If you can't test on Windows, avoid these:
| Forbidden | Replace with |
os.kill(pid, 0) | psutil.pid_exists(pid) |
os.setsid() / os.fork() | platform.system() guard or psutil |
signal.SIGALRM / SIGKILL | getattr(signal, "SIGKILL", signal.SIGTERM) |
Hardcoded /tmp paths | tempfile.gettempdir() |
| Shell shebang for Python | [sys.executable, "script.py"] |
Run before submitting: scripts/check-windows-footguns.py
Dependency Pinning (Supply Chain)
All new PyPI deps require upper bounds:
# ✅ Correct — post-1.0
"openai>=2.21.0,<3"
# ✅ Correct — pre-1.0 (tight ±2 minor window)
"asyncpg>=0.29,<0.32"
# ❌ Rejected
"some-package>=1.2.3" # No upper bound
"some-package==1.2.3" # Too tight
"some-package>=0.20,<1" # Too loose for pre-1.0The Salvage Pattern
Hermes maintainers may salvage your PR into a larger combined PR after review approval. This is normal — not a rejection.
Signs of salvage:
- PR marked "Closed" by a maintainer (teknium1, etc.)
- Comment mentions another PR number: "Salvaged into #XXXXX"
- Your authorship preserved via
Co-authored-by
What you should NOT do: reopen, rebase, or push more commits. What you should do: nothing. The maintainer handles it.
See references/salvage-example-40264.md for the full timeline of a real salvage (PR #40264 → #40625).
Pitfalls
- Don't mix changes in one PR. Bug fix + refactor + feature = rejected.
- Don't skip tests. Bug fixes require tests. Features strongly encouraged.
- Don't use
@in branch names (e.g.,fix/@mention-sanitize). Usefix/mention-sanitize. - Don't add tools for things that should be skills. Tools are rarely needed.
- Don't add memory providers to
plugins/memory/. They are no longer accepted — publish as standalone plugin. - Skill descriptions over 60 chars get rejected. Count before pushing.
- Using
grep/sed/catin SKILL.md prose instead of Hermes tool names gets requested changes. - CI passes locally but fails remotely? Check
.gitignoreisn't silently blocking source files. See github-workflows for CI troubleshooting patterns including the.gitignoreanchoring pitfall. - Files that exist locally but weren't committed cause CI build failures. This is the #1 cause of "passes locally, fails CI". Always verify with
git ls-files <path>/before pushing. Real-world example:internal/l3/tdigest_tracker.goexisted locally, passedgo vet ./..., but was never committed — CI failed withundefined: tdigestTrackeracross 5 packages (PR #smart_routing, 2026-06-06). - Detached HEAD state causes silent push failures.
git pushin detached HEAD only updates the remote ref if explicitly specified. Always checkgit statusandgit branchbefore pushing. Usegit checkout main(or the target branch) first.
Verification Checklist
Before opening PR:
scripts/run_tests.shpasses- All commits follow
type(scope): description - Branch name follows
type/description - PR description has What + Why + How to test + Platform
- New deps have upper bounds (
>=x,<next_major) - If adding a skill, all 8 hardline rules checked
- Cross-platform impact considered
- No unrelated changes included
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

