You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OpenFang (RightNow-AI/openfang), a Rust-based Agent Operating System, introduces the concept of "Hands" — pre-configured autonomous capability packages that combine domain knowledge, tool restrictions, scheduling, requirement declarations, and lifecycle management into a single deployable unit. A Hand is activated with openfang hand activate researcher and runs autonomously on a schedule with guardrails.
Hermes Agent has Skills (instruction-based SKILL.md files with YAML frontmatter) and Cron Jobs (scheduled agent runs with a prompt), but these are separate, disconnected systems. A skill tells the agent how to do something; a cron job tells it when to run. There's no unified concept of "activate this autonomous capability with these tool restrictions, these requirements, and this schedule."
This proposal bridges that gap by enhancing the skill format with optional autonomous execution metadata — tool allowlists, requirement declarations, agent configuration, and scheduled execution — creating what could be called "Autonomous Skill Templates." This doesn't replace skills or cron; it layers autonomous packaging on top of both.
Research Findings
How OpenFang's "Hands" Work
Despite the ambitious framing, a Hand is architecturally simple — it's a config file + a system prompt, not compiled autonomous code. The "autonomy" comes from the LLM following detailed instructions with tool access. Each Hand consists of:
HAND.toml — Configuration manifest:
[hand]
id = "researcher"name = "Deep Researcher"description = "CRAAP-criteria research with APA citations"category = "research"
[tools]
allowed = ["web_search", "web_extract", "read_file", "write_file", "memory_store"]
# Only these tools are available — everything else is blocked
[requirements]
binaries = ["curl"] # Must be on PATHenv_vars = ["OPENAI_API_KEY"] # Must be setapi_keys = ["serper"] # Must be configured
[agent]
provider = "openai"model = "gpt-4o"temperature = 0.3system_prompt_file = "SKILL.md"
[schedule]
cron = "0 */6 * * *"# Every 6 hours
[dashboard]
metrics = ["reports_generated", "sources_evaluated", "avg_craap_score"]
SKILL.md — Multi-phase system prompt with domain expertise (the actual "brain" of the Hand)
HandRegistry (registry.rs) — Manages lifecycle:
activate(hand_id) → Start autonomous execution
deactivate(hand_id) → Stop execution
pause(hand_id) / resume(hand_id) → Suspend/resume
status(hand_id) → Check state and metrics
check_requirements(hand) → Verify all prerequisites before activation
Key Design Decisions
Config-driven, not code-driven: Hands are defined entirely through configuration + prompts, not custom code. This makes them safe and portable.
Tool allowlists: The most impactful security feature. An autonomous researcher can web_search and write_file but can't terminal or process. This is defense-in-depth for autonomous operation.
Requirement checking: Before activation, the system verifies that all required binaries, env vars, and API keys are present. Fail-fast instead of failing mid-execution.
Unified lifecycle: Spawn/pause/resume/stop as first-class operations, not just "start a cron job and hope."
What's Actually Novel (vs. Just Repackaging)
The HAND.toml format bundles 5 things that Hermes currently treats as separate concerns:
Domain knowledge (SKILL.md) — Hermes has this
Tool restrictions (tools.allowed) — Hermes does NOT have per-skill tool restrictions
Requirement declarations (requirements) — Hermes does NOT have this
Agent configuration (agent.model, temperature) — Hermes does NOT have per-skill model config
Scheduled execution (schedule.cron) — Hermes has cron, but it's disconnected from skills
The real value is #2 (tool restrictions) and #3 (requirement declarations) — these are the features that make autonomous execution safe and reliable.
Current State in Hermes Agent
Skills system (tools/skill_tools.py, skills/):
SKILL.md files with YAML frontmatter (name, description, tags)
Skills are loaded into the system prompt as instructions
The agent reads skills and follows their guidance
No tool restrictions, no requirements, no scheduling, no lifecycle
Skills Hub for community skills with security scanning (tools/skills_guard.py)
Cron system (cron/, tools/cronjob_tools.py):
Schedule prompts to run on cron expressions or intervals
Each cron job runs in an isolated session
Results delivered to messaging platforms or files
No connection to skills — the prompt is freeform text
No tool restrictions on cron jobs (full tool access)
New CLI command: hermes skill activate <name> — creates a cron job from the skill's schedule config, with the skill's system prompt, tool restrictions, and agent config applied
hermes skill deactivate <name> — removes the associated cron job
hermes skill status <name> — shows whether active, last run, next run
When a skill-based cron job fires, the agent session is configured with the skill's tool restrictions and model settings
Phase 3: Lifecycle & Dashboard
Pause/resume for active skills (suspend the cron job without deleting it)
Execution history per skill (last N runs, success/failure, duration, token usage)
Dashboard metrics schema in frontmatter for skills that track KPIs
hermes skill dashboard CLI command showing all active autonomous skills and their status
Pros & Cons
Pros
Safety for autonomous operation: Tool allowlists are the single most impactful feature. An autonomous researcher that can't run terminal is dramatically safer than one with full access.
Fail-fast reliability: Requirement checking prevents frustrating mid-execution failures ("curl not found on line 47 of a 60-step workflow").
Unified mental model: "Activate this skill" is simpler than "create a cron job with this prompt and remember to restrict tools and set the right model."
Backward compatible: All new fields are optional. Existing skills work unchanged. This is purely additive.
Natural extension: Builds on existing systems (skills, cron, toolsets) rather than creating parallel infrastructure.
Composable: A skill can be used manually (as today) OR activated for autonomous execution. Same SKILL.md serves both modes.
Cons / Risks
Scope creep risk: This touches skills, cron, toolsets, and the agent loop. Careful scoping per phase is essential.
Tool restriction bypass: The LLM might try to work around restrictions (e.g., using execute_code to call subprocess). Need to ensure restrictions apply transitively to code execution tools.
Configuration complexity: More YAML fields = more things to get wrong. Mitigated by making everything optional and providing good defaults.
Testing burden: Tool restriction enforcement needs thorough testing across all tools and edge cases.
Open Questions
Allowlist vs. denylist for tools? Allowlist is safer (explicit grant), denylist is more convenient (block a few, keep the rest). Could support both with tools_allowed taking precedence over tools_denied.
Should tool restrictions apply to execute_code? If a skill restricts terminal but allows execute_code, the agent can call terminal() from inside execute_code. Need to decide: restrict execute_code entirely, or filter the hermes_tools available inside it?
Per-skill model config vs. global config? Some skills might work best with specific models (e.g., a coding skill with Claude, a research skill with GPT-4o). Is per-skill model override worth the complexity?
How does this interact with sub-agents? If a restricted skill uses delegate_task, should the sub-agent inherit the tool restrictions?
Naming: "Autonomous Skill Templates," "Skill Profiles," "Skill Packages," or just extend "Skills" with new fields? The naming matters for documentation and mental models.
Overview
OpenFang (RightNow-AI/openfang), a Rust-based Agent Operating System, introduces the concept of "Hands" — pre-configured autonomous capability packages that combine domain knowledge, tool restrictions, scheduling, requirement declarations, and lifecycle management into a single deployable unit. A Hand is activated with
openfang hand activate researcherand runs autonomously on a schedule with guardrails.Hermes Agent has Skills (instruction-based SKILL.md files with YAML frontmatter) and Cron Jobs (scheduled agent runs with a prompt), but these are separate, disconnected systems. A skill tells the agent how to do something; a cron job tells it when to run. There's no unified concept of "activate this autonomous capability with these tool restrictions, these requirements, and this schedule."
This proposal bridges that gap by enhancing the skill format with optional autonomous execution metadata — tool allowlists, requirement declarations, agent configuration, and scheduled execution — creating what could be called "Autonomous Skill Templates." This doesn't replace skills or cron; it layers autonomous packaging on top of both.
Research Findings
How OpenFang's "Hands" Work
Despite the ambitious framing, a Hand is architecturally simple — it's a config file + a system prompt, not compiled autonomous code. The "autonomy" comes from the LLM following detailed instructions with tool access. Each Hand consists of:
HAND.toml — Configuration manifest:
SKILL.md — Multi-phase system prompt with domain expertise (the actual "brain" of the Hand)
HandRegistry (
registry.rs) — Manages lifecycle:activate(hand_id)→ Start autonomous executiondeactivate(hand_id)→ Stop executionpause(hand_id)/resume(hand_id)→ Suspend/resumestatus(hand_id)→ Check state and metricscheck_requirements(hand)→ Verify all prerequisites before activationKey Design Decisions
web_searchandwrite_filebut can'tterminalorprocess. This is defense-in-depth for autonomous operation.What's Actually Novel (vs. Just Repackaging)
The HAND.toml format bundles 5 things that Hermes currently treats as separate concerns:
The real value is #2 (tool restrictions) and #3 (requirement declarations) — these are the features that make autonomous execution safe and reliable.
Current State in Hermes Agent
Skills system (
tools/skill_tools.py,skills/):tools/skills_guard.py)Cron system (
cron/,tools/cronjob_tools.py):Toolsets (
toolsets.py):enabled_toolsets/disabled_toolsetsat session levelExisting related issues:
Implementation Plan
Classification: Core Codebase Change + Skill Format Extension
This should be a core codebase change that extends the existing skill system, not a new standalone system. Reasons:
What We'd Need
run_agent.pyagent/ortools/skill_activate/skill_deactivatePhased Rollout
Phase 1: Tool Allowlists & Requirement Declarations
skill_viewor cron), enforce tool restrictions by filtering the tool registry for that sessioncheck_requirements()function that verifies prerequisites and reports missing itemsskills_listoutput (show ✅/❌ per skill)Phase 2: Skill-Cron Bridge & Per-Skill Agent Config
hermes skill activate <name>— creates a cron job from the skill's schedule config, with the skill's system prompt, tool restrictions, and agent config appliedhermes skill deactivate <name>— removes the associated cron jobhermes skill status <name>— shows whether active, last run, next runPhase 3: Lifecycle & Dashboard
hermes skill dashboardCLI command showing all active autonomous skills and their statusPros & Cons
Pros
terminalis dramatically safer than one with full access.Cons / Risks
execute_codeto callsubprocess). Need to ensure restrictions apply transitively to code execution tools.Open Questions
tools_allowedtaking precedence overtools_denied.execute_code? If a skill restrictsterminalbut allowsexecute_code, the agent can callterminal()from inside execute_code. Need to decide: restrict execute_code entirely, or filter the hermes_tools available inside it?delegate_task, should the sub-agent inherit the tool restrictions?References
openfang-hands/crate, HAND.toml format