handlebar-rule-generation

📁 gethandlebar/agent-skills 📅 10 days ago
1
总安装量
1
周安装量
#48129
全站排名
安装命令
npx skills add https://github.com/gethandlebar/agent-skills --skill handlebar-rule-generation

Agent 安装分布

opencode 1
codex 1
claude-code 1

Skill 文档

Handlebar Rule Generation Skill

Generate governance rules for an agent that has been connected to Handlebar. This skill creates rules based on the agent’s tools and purpose, then uploads them to the Handlebar platform.

Disclaimer: The rules generated by this skill are provided as a starting point and are used at your own risk. They are not a substitute for professional governance, compliance, or legal review. For an in-depth review of your governance rules, please contact the Handlebar team at contact@gethandlebar.com.

Prerequisites

This skill should run after the /handlebar-setup skill has been used to connect the agent. It reads the configuration saved by that skill from .claude/.handlebar/agent-config.json.

When to Use

Use this skill when the user wants to:

  • Generate governance rules for their agent
  • Create Handlebar rules based on their tools
  • Upload rules to Handlebar

Workflow

Step 1: Load Agent Configuration

Read .claude/.handlebar/agent-config.json from the project root. This file was created by the /handlebar-setup skill.

If the file doesn’t exist, INFORM THE USER:

“I couldn’t find .claude/.handlebar/agent-config.json. Please run /handlebar-setup first to connect your agent and generate the configuration.”

If the file exists, load it and summarise:

  1. Tools available – List each tool with its purpose
  2. Tool categories – What categories were assigned (pii, financial, write, etc.)
  3. Agent intent – What workflow the agent supports
  4. Jurisdiction – What regulatory context applies
  5. High-risk actions – What actions need extra controls

Output format:

## Agent Summary

**Agent**: [name/slug]
**Domain**: [healthcare/finance/etc.]
**Workflow**: [what the agent does]

**Tools**:
| Tool | Purpose | Categories |
|------|---------|------------|
| ... | ... | ... |

**High-risk actions**: [list]
**Jurisdiction**: [UK/US/EU]

Step 2: Generate Rules

IMPORTANT: You MUST read and understand the Handlebar rule capabilities below BEFORE generating any rules. Do not proceed to output until you have completed BOTH (a) human-readable rules AND (b) valid JSON rules.


Handlebar Rule Reference

A rule contains:

  • selector: Filtering logic to determine if a rule applies (based on tool names or tags)
  • condition: The logical evaluation
  • effect: The consequence if condition is true (allow, block, or hitl)

Rule spec:

{
  "priority": 100,
  "enabled": true,
  "name": "Human readable rule name",
  "selector": {
    "phase": "tool.before", /* must be this exact value */
    "tool": {
      "name": "toolName",
      "tagsAny": ["pii", "financial"],
      "tagsAll": ["write", "external"]
    }
  },
  "condition": { /* see condition types below */ },
  "effect": { "type": "block", "reason": "Explanation for user" }
}

Effect types:

  • { "type": "allow", "reason": "..." } – Permit the action
  • { "type": "block", "reason": "..." } – Block the action, agent continues
  • { "type": "hitl", "reason": "..." } – Human-in-the-loop review required, blocks until approved

Condition types:

Kind Purpose Example
enduserTag Check enduser metadata { "kind": "enduserTag", "op": "hasValue", "tag": "role", "value": "admin" }
executionTime Limit execution time { "kind": "executionTime", "scope": "tool", "op": "gt", "ms": 5000 }
sequence Require/forbid prior tools { "kind": "sequence", "mustHaveCalled": ["verifyIdentity"] }
maxCalls Limit tool invocations { "kind": "maxCalls", "selector": { "by": "toolName", "patterns": ["*"] }, "max": 10 }
metricWindow Evaluate metrics over time { "kind": "metricWindow", "scope": "agent_user", "metric": { "kind": "inbuilt", "key": "bytes_out" }, "aggregate": "sum", "windowSeconds": 3600, "op": "gt", "value": 1000000 }
timeGate Time-based restrictions { "kind": "timeGate", "timezone": { "source": "enduserTag", "tag": "tz", "fallback": "org" }, "windows": [{ "days": ["mon","tue","wed","thu","fri"], "start": "09:00", "end": "17:00" }] }
signal Custom signal evaluation { "kind": "signal", "key": "mySignal", "args": { "userId": { "from": "enduserId" } }, "op": "eq", "value": "true" }
and All conditions must match { "kind": "and", "all": [ /* conditions */ ] }
or Any condition must match { "kind": "or", "any": [ /* conditions */ ] }
not Invert condition { "kind": "not", "not": { /* condition */ } }

Signal bindings (for signal condition args):

  • { "from": "enduserId" } – The enduser’s ID
  • { "from": "enduserTag", "tag": "role" } – An enduser metadata tag
  • { "from": "toolName" } – Name of the tool being called
  • { "from": "toolArg", "path": "amount" } – A tool argument (dot-path)
  • { "from": "const", "value": "100" } – A constant value

2a: Generate Human-Readable Rules

Based on the agent summary, create a list of governance rules in plain English:

## Proposed Rules

1. **[Rule Name]**
   - When: [describe when this rule applies]
   - Condition: [what must be true]
   - Effect: [block/allow/require approval]
   - Reason: [why this rule exists]

2. **[Rule Name]**
   ...

Consider rules for:

  • Identity verification before sensitive actions
  • Rate limiting on high-risk tools
  • Approval requirements for irreversible actions
  • Time-based restrictions if applicable
  • Role-based access controls
  • Limits on tool parameters
  • Sequence requirements (e.g., verify before access)

2b: Generate Valid JSON Rules

For each human-readable rule, generate the corresponding valid Handlebar JSON:

[
  {
    "priority": 100,
    "enabled": true,
    "name": "Rule Name",
    "selector": { "phase": "tool.before", "tool": { "tagsAny": ["pii"] } },
    "condition": { "kind": "sequence", "mustHaveCalled": ["verifyIdentity"] },
    "effect": { "type": "block", "reason": "Please verify identity first" }
  }
]

Write the rules to a file: Save the JSON rules array to .claude/.handlebar/rules.json.

2c: Output Rule Summary

After generating both formats, output the high-level rule descriptions to the user:

## Generated Rules Summary

| # | Rule Name | Effect | Purpose |
|---|-----------|--------|---------|
| 1 | ... | block | ... |
| 2 | ... | hitl | ... |

Rules have been saved to `.claude/.handlebar/rules.json`

Step 3: Create Policy

Create a policy to group the rules and define which agents they apply to.

Policy spec:

{
  "name": "Policy name",
  "description": "What this policy covers",
  "enabled": true,
  "agentSelector": {
    "anyOfSlugs": ["agent-slug"],
    "anyOfTags": ["prod"],
    "allOfTags": ["customer-facing"]
  },
  "mode": "enforce",
  "combine": "most_severe_wins"
}

IMPORTANT: If the agent does not have a configured slug, use the * catch-all for the agent selector:

{
  "agentSelector": {
    "anyOfSlugs": ["*"]
  }
}

Output:

## Policy

**Name**: [policy name]
**Description**: [description]
**Agent selector**: [how agents are matched]
**Mode**: enforce (or shadow for testing)

Step 4: Upload Rules to Handlebar

Upload the policy and rules to the Handlebar API.

API Endpoint: POST https://api.gethandlebar.com/v1/rules

Authorization: Bearer token (uses HANDLEBAR_API_KEY environment variable)

Request body:

{
  "policy": {
    "name": "Policy Name",
    "description": "Description",
    "enabled": true,
    "agentSelector": { "anyOfSlugs": ["*"] },
    "mode": "enforce",
    "combine": "most_severe_wins"
  },
  "rules": [
    { /* rule 1 */ },
    { /* rule 2 */ }
  ]
}

Execute the upload:

curl -X POST https://api.gethandlebar.com/v1/rules \
  -H "Authorization: Bearer $HANDLEBAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d @.claude/.handlebar/rules-upload.json

Before uploading, save the complete payload (policy + rules) to .claude/.handlebar/rules-upload.json.

INFORM THE USER of the result:

“Rules have been uploaded to Handlebar.

  • Policy: [name]
  • Rules: [count] rules uploaded
  • Mode: [enforce/shadow]

You can view and manage these rules at https://app.gethandlebar.com

If the upload fails (e.g., no API key), inform the user:

“Could not upload rules to Handlebar. Please ensure HANDLEBAR_API_KEY is set in your environment, then run:

curl -X POST https://api.gethandlebar.com/v1/rules \
  -H \"Authorization: Bearer $HANDLEBAR_API_KEY\" \
  -H \"Content-Type: application/json\" \
  -d @.claude/.handlebar/rules-upload.json
```"

Final Output

Provide a summary:

# Rule Generation Complete

## Summary
- **Agent**: [name/slug]
- **Policy**: [policy name]
- **Rules generated**: [count]
- **Mode**: [enforce/shadow]

## Files Created
- `.claude/.handlebar/rules.json` - Rules array
- `.claude/.handlebar/rules-upload.json` - Full payload (policy + rules)

## Next Steps
1. Review rules in Handlebar dashboard: https://app.gethandlebar.com
2. Test with mode: "shadow" before enforcing
3. Monitor audit logs for rule triggers
4. Adjust rules as needed based on real usage

**Disclaimer**: These rules are provided as a starting point and are used at your own risk. They are not a substitute for professional governance, compliance, or legal review. For an in-depth review of your governance rules, please contact the Handlebar team at contact@gethandlebar.com.