agent-safety — GitHub Copilot rule for safer AI agents
This rule sets access controls, policy checks, and audit guidance for code built with AI agents. Use it when implementing tool-calling or multi-agent systems.
.github/instructions/agent-safety.instructions.mdWhat agent-safety does
The rule focuses on checks before an agent acts. It calls for an explicit tool allowlist, scans of tool arguments for sensitive data, and human approval for high-impact actions. If a governance check fails or returns an ambiguous result, deny the action. Output-only guardrails come too late to control tool execution.
Policies should live in YAML or JSON configuration rather than being hardcoded. Audit entries stay append-only and record tool calls and violations, without logging user prompts. In multi-agent setups, each agent gets its own policy; delegation applies the more restrictive policy, and an inner agent must not gain broader access than its caller. The rule also gives framework-specific guidance for PydanticAI, CrewAI, OpenAI Agents SDK, LangChain/LangGraph, and AutoGen.
What it helps with
- restrict the tools an agent can call
- check tool arguments for credentials and injection patterns
- require approval before sending email or deleting records
- apply the stricter policy when agents delegate work
- audit tool decisions without storing user prompts
Example prompts for the agent
- Add an explicit tool allowlist to this agent and deny actions when a policy check fails.
- Check tool arguments for API keys and SQL injection before execution.
- Give each agent its own policy and apply the stricter one during delegation.
How to install agent-safety
Manually: put the files in place
.github/instructions/agent-safety.instructions.mdThe applyTo field sets which files it applies to
Manually: put the files in place
.claude/rules/agent-safety.mdThe paths frontmatter field limits the files: move applyTo from the source into paths
AGENTS.md
Codex reads AGENTS.md: paste the rule text there
Manually: put the files in place
.cursor/rules/agent-safety.mdcFrontmatter: description, globs, alwaysApply. Move applyTo from the source into globs, or the rule will not attach on its own
Manually: put the files in place
.devin/rules/agent-safety.mdManually: put the files in place
.clinerules/agent-safety.mdStep by step, with commands for each platform: AGENTS.md vs CLAUDE.md: what they are and which one to use
Questions about agent-safety
How do I install agent-safety in GitHub Copilot?
Add the rule file at .github/instructions/agent-safety.instructions.md.
What does agent-safety do?
It provides guidance for controlling agent tool access, checking content and arguments, and auditing decisions. It also covers policy boundaries in multi-agent systems.
How should agent-safety handle delegated agents?
Give each agent a governance policy and apply the more restrictive policy when work is delegated. An inner agent must not have broader permissions than its caller.
Source text
agent-safety.instructions.md · MIT
---
description: 'Guidelines for building safe, governed AI agent systems. Apply when writing code that uses agent frameworks, tool-calling LLMs, or multi-agent orchestration to ensure proper safety boundaries, policy enforcement, and auditability.'
applyTo: '**'
---
# Agent Safety & Governance
## Core Principles
- **Fail closed**: If a governance check errors or is ambiguous, deny the action rather than allowing it
- **Policy as configuration**: Define governance rules in YAML/JSON files, not hardcoded in application logic
- **Least privilege**: Agents should have the minimum tool access needed for their task
- **Append-only audit**: Never modify or delete audit trail entries — immutability enables compliance
## Tool Access Controls
- Always define an explicit allowlist of tools an agent can use — never give unrestricted tool access
- Separate tool registration from tool authorization — the framework knows what tools exist, the policy controls which are allowed
- Use blocklists for known-dangerous operations (shell execution, file deletion, database DDL)
- Require human-in-the-loop approval for high-impact tools (send email, deploy, delete records)
- Enforce rate limits on tool calls per request to prevent infinite loops and resource exhaustion
## Content Safety
- Scan all user inputs for threat signals before passing to the agent (data exfiltration, prompt injection, privilege escalation)
- Filter agent arguments for sensitive patterns: API keys, credentials, PII, SQL injection
- Use regex pattern lists that can be updated without code changes
- Check both the user's original prompt AND the agent's generated tool arguments
## Multi-Agent Safety
- Each agent in a multi-agent system should have its own governance policy
- When agents delegate to other agents, apply the most restrictive policy from either
- Track trust scores for agent delegates — degrade trust on failures, require ongoing good behavior
- Never allow an inner agent to have broader permissions than the outer agent that called it
## Audit & Observability
- Log every tool call with: timestamp, agent ID, tool name, allow/deny decision, policy name
- Log every governance violation with the matched rule and evidence
- Export audit trails in JSON Lines format for integration with log aggregation systems
- Include session boundaries (start/end) in audit logs for correlation
## Code Patterns
When writing agent tool functions:
```python
# Good: Governed tool with explicit policy
@govern(policy)
async def search(query: str) -> str:
...
# Bad: Unprotected tool with no governance
async def search(query: str) -> str:
...
```
When defining policies:
```yaml
# Good: Explicit allowlist, content filters, rate limit
name: my-agent
allowed_tools: [search, summarize]
blocked_patterns: ["(?i)(api_key|password)\\s*[:=]"]
max_calls_per_request: 25
# Bad: No restrictions
name: my-agent
allowed_tools: ["*"]
```
When composing multi-agent policies:
```python
# Good: Most-restrictive-wins composition
final_policy = compose_policies(org_policy, team_policy, agent_policy)
# Bad: Only using agent-level policy, ignoring org constraints
final_policy = agent_policy
```
## Framework-Specific Notes
- **PydanticAI**: Use `@agent.tool` with a governance decorator wrapper. PydanticAI's upcoming Traits feature is designed for this pattern.
- **CrewAI**: Apply governance at the Crew level to cover all agents. Use `before_kickoff` callbacks for policy validation.
- **OpenAI Agents SDK**: Wrap `@function_tool` with governance. Use handoff guards for multi-agent trust.
- **LangChain/LangGraph**: Use `RunnableBinding` or tool wrappers for governance. Apply at the graph edge level for flow control.
- **AutoGen**: Implement governance in the `ConversableAgent.register_for_execution` hook.
## Common Mistakes
- Relying only on output guardrails (post-generation) instead of pre-execution governance
- Hardcoding policy rules instead of loading from configuration
- Allowing agents to self-modify their own governance policies
- Forgetting to governance-check tool *arguments*, not just tool *names*
- Not decaying trust scores over time — stale trust is dangerous
- Logging prompts in audit trails — log decisions and metadata, not user content
© github · MIT · github/awesome-copilot