Skip to content

Common Scenarios

Copy-paste configurations for common governance setups. Each scenario includes the YAML config and what happens when triggered.

Lock Down a Contractor

Read-only access. Every action requires human approval.

yaml
# governance-rules.yaml
roles:
  contractor:
    allowed_tools: [read, grep, find, ls]
    blocked_tools: [write, edit, bash]
    execution_mode: supervised
    human_approval:
      required_for: [all]
    token_budget_daily: 1000
    allowed_paths:
      - '{{project_path}}/src/**'
    blocked_paths:
      - '**/secrets/**'
      - '**/.env*'
      - '**/node_modules/**'

What happens: The contractor's agent can only read source files. Every read triggers an approval prompt. Bash, write, and edit are blocked entirely.

Supervised Developer

Full tool access, but writes and bash need human approval.

yaml
# governance-rules.yaml
roles:
  developer:
    allowed_tools: [read, write, edit, bash, grep, find, ls]
    blocked_tools: []
    execution_mode: supervised
    human_approval:
      required_for: [bash, write]
      auto_approve: [read, edit, grep, find, ls]
    token_budget_daily: 500000
    allowed_paths:
      - '{{project_path}}/**'
    blocked_paths:
      - '**/secrets/**'
      - '**/.env*'

What happens: Reads and edits proceed automatically. Bash commands and new file writes pause for approval. Dangerous bash is blocked outright.

Full Autonomy for Admins

No approvals, no budget limit, full access.

yaml
# governance-rules.yaml
roles:
  admin:
    allowed_tools: [all]
    blocked_tools: []
    execution_mode: autonomous
    human_approval:
      required_for: []
    token_budget_daily: -1
    allowed_paths: ['**']
    blocked_paths: []

What happens: All tools proceed without approval. Dangerous bash is still classified and logged, but not blocked. All actions are audited.

Audit Everything (Compliance Mode)

Observe without executing. Log every decision.

yaml
# governance-rules.yaml
roles:
  auditor:
    allowed_tools: [read, grep, find, ls]
    blocked_tools: [write, edit, bash]
    execution_mode: dry_run
    human_approval:
      required_for: [all]
    token_budget_daily: 50000
    allowed_paths: ['**']
    blocked_paths:
      - '**/secrets/**'
yaml
# governance.yaml
audit:
  sinks:
    - type: jsonl
      path: ~/.pi/agent/audit.jsonl
    - type: webhook
      url: https://compliance.example.com/api/events

What happens: Every tool call is blocked and logged as tool_dry_run. The agent cannot execute anything, but you get a complete log of what it would have done.

Block All Secrets from the LLM

Maximum DLP protection for sensitive environments.

yaml
# governance.yaml
dlp:
  enabled: true
  on_input: block
  on_output: mask
  masking:
    strategy: partial
    show_chars: 4
  severity_threshold: low
  built_in:
    secrets: true
    pii: true

What happens: Tool calls containing API keys, tokens, or credentials are blocked before execution. Tool outputs containing PII are masked (***1234). Audit events record what was detected.

Custom Organization Secrets

Add patterns for your internal key formats alongside built-in detection.

yaml
# governance.yaml
dlp:
  enabled: true
  mode: mask
  custom_patterns:
    - name: internal_api_key
      pattern: 'grwnd_[a-zA-Z0-9]{32}'
      severity: critical
      action: block
    - name: internal_service_token
      pattern: 'svc_[a-zA-Z0-9]{40}'
      severity: high
      action: mask
  allowlist:
    - pattern: 'EXAMPLE_KEY_.*'
    - pattern: '127\.0\.0\.1'
    - pattern: 'test@example\.com'

What happens: Internal API keys are blocked. Service tokens are masked. Known test values are ignored.

Team Setup with Shared Policy

Git-committed configuration for the whole team.

yaml
# .pi/governance.yaml (commit to git)
auth:
  provider: env

policy:
  engine: yaml
  yaml:
    rules_file: ./governance-rules.yaml

hitl:
  default_mode: supervised
  approval_channel: cli
  timeout_seconds: 300

audit:
  sinks:
    - type: jsonl
      path: ~/.pi/agent/audit.jsonl
    - type: webhook
      url: https://audit.yourcompany.com/api/v1/events

dlp:
  enabled: true
  on_input: block
  on_output: mask
  built_in:
    secrets: true
    pii: true
yaml
# governance-rules.yaml (commit to git)
roles:
  analyst:
    allowed_tools: [read, grep, find, ls]
    blocked_tools: [write, edit, bash]
    execution_mode: supervised
    human_approval:
      required_for: [all]
    token_budget_daily: 100000
    allowed_paths:
      - '{{project_path}}/**'
    blocked_paths:
      - '**/secrets/**'
      - '**/.env*'

  developer:
    allowed_tools: [read, write, edit, bash, grep, find, ls]
    blocked_tools: []
    execution_mode: supervised
    human_approval:
      required_for: [bash, write]
    token_budget_daily: 500000
    allowed_paths:
      - '{{project_path}}/**'
    blocked_paths:
      - '**/secrets/**'

  admin:
    allowed_tools: [all]
    blocked_tools: []
    execution_mode: autonomous
    human_approval:
      required_for: []
    token_budget_daily: -1
    allowed_paths: ['**']
    blocked_paths: []

What happens: Every team member gets the same policy. Set PI_GOV_ROLE per developer. All actions are audited to both local files and a central webhook. Config changes are auto-reloaded.

Released under the Apache-2.0 License.