Documentation Index
Fetch the complete documentation index at: https://docs.agentguardian.io/llms.txt
Use this file to discover all available pages before exploring further.
How you can contribute
AgentGuardian is an open red-teaming framework for LLM agents. There are six on-ramps for contributors — pick the one that matches what you want to ship.Add a new attack (probe)
A YAML file under
src/agent_guardian/probes/asiNN/ plus a golden test.Add a target adapter
Wrap a new framework, transport, or hosted endpoint as a
TargetAdapter.Improve evaluations
Sharpen an
AsiAgent judge rubric or add a strategy under strategies/.Add a vulnerable demo agent
Drop a deliberately-weak agent under
examples/ or the testbench.Improve documentation
Edit the Mintlify site under
docs/ and open a PR.Report a security issue
Use a private GitHub Security Advisory — never a public issue.
When to use which path
| You want to… | Path | Effort |
|---|---|---|
| Encode a CVE-class attack you found in production | Add a probe | Small — 1 YAML + 1 golden test |
| Make AgentGuardian scan a framework it doesn’t speak yet | Add an adapter | Medium — implement TargetAdapter.call |
| Cut false positives or sharpen a judge | Improve an agent / strategy | Medium — touch agents/ + strategies/ |
| Give the community a reproducible attack target | Add a demo / testbench agent | Small — one file under examples/ |
| Fix a typo, rewrite a page, add a how-to | Improve docs | Small — docs/*.mdx |
| You found a vulnerability in AgentGuardian itself | Private disclosure | See SECURITY.md |
Set up local dev
Install pre-commit hooks
Runs the ruff + ruff-format + mypy + secret-detection hooks on every
git commit. The hook config lives in .pre-commit-config.yaml.Expected output of the local test suite
A clean checkout passes all four gates. The shape ofuv run pytest -q looks like:
uv run ruff check . and uv run mypy src/ both exit zero with no output. uv run pre-commit run --all-files ends with Passed for ruff, ruff-format, trailing-whitespace, end-of-file-fixer, check-yaml, check-toml, check-merge-conflict, check-added-large-files, detect-private-key, and mypy.
Add a new attack (probe)
Probes are YAML files undersrc/agent_guardian/probes/asiNN/, one directory per OWASP ASI 2026 category. The loader at src/agent_guardian/probes/loader.py (load_all_probes) walks every asiNN/*.yaml at scan time — drop a new file in the right directory and it’s picked up automatically. The corpus version is stamped in src/agent_guardian/probes/_meta/version.yaml; bump it whenever you add or remove a probe.
The YAML schema
Every probe carries the fields validated byagent_guardian.models.probe.Probe:
idis unique across the corpus and stable for the life of the probe.asiis one ofASI01–ASI10.mitre_atlasis a list of MITRE ATLAS v5.4.0 technique IDs.csa_categoryreferences the CSA Agentic-RT taxonomy.severityis one oflow | medium | high | critical.tier_flooris the minimum target tier (1–4) at which the probe should run.seedsis the list of adversarial inputs to use as starting prompts.expected_evidenceis what the judge agent looks for to confirm the attack succeeded.
Required: a golden test
Every new probe must ship with a golden test undertests/golden/ that locks in the expected verdict for a deterministic mock target. This keeps the corpus reproducible across PRs and across model providers.
Run
uv run agent-guardian list-probes after dropping in your YAML — your probe ID must appear in the output. If it doesn’t, the loader rejected it; check the schema error in the CLI output.Add a target adapter
Adapters wrap a target framework or transport so AgentGuardian can scan it. They live undersrc/agent_guardian/adapters/ and subclass the TargetAdapter ABC at src/agent_guardian/adapters/base.py. The existing adapters (prompt.py, code.py, http.py, framework/) are the reference implementations.
The contract is two members:
callis the only abstract method — single user turn in, single text reply out.sessionis an opaque conversation-state token; agents pass distinct IDs for parallel attacks so per-session histories never cross-contaminate._fingerprintMUST be set in__init__—TargetAdapter.fingerprint()raises if it’s stillNone.- Override
profile_evidence()if you can expose system prompt / source / framework introspection (white-box) — the default is black-box (call-only). - Override
aclose()if you hold HTTP clients or sockets.
tests/integration/ that runs your adapter end-to-end against a mock target.
Improve evaluations
Evaluations are split between the specialist agents undersrc/agent_guardian/agents/ and the attack strategies they compose under src/agent_guardian/strategies/.
Agents subclass agent_guardian.agents.base.AsiAgent and own one OWASP ASI category each. Every concrete agent sets the class-level taxonomy (asi_category, name, default_mitre_techniques, default_csa_category, default_severity) and overrides seeds_for_category(), plus optionally is_applicable() and strategy_stack(). The run() loop is provided by the base class — don’t override it. See src/agent_guardian/agents/goal_hijack.py, tool_abuse.py, and memory_poison.py for reference implementations.
Every finding an agent emits MUST be tagged with asi, mitre_atlas, and csa_category so the AIVSS scorer and the SARIF / JSON / Markdown report writers attribute it correctly.
Strategies are reusable attack patterns the agents stack — crescendo.py, pair.py, tap.py, pretext.py, indirect.py, tool_exfil.py, mad_max.py, evasion.py, fuzz.py, race_strategies.py. Add a new strategy under src/agent_guardian/strategies/ if you have a published attack pattern that the existing ones don’t cover; subclass strategies/base.py.
Judge rubrics
Every agent ships a versioned judge rubric (YAML) describing how its judge LLM decides whether an attempt counts as a successful exploit. Sharpening a rubric to cut false positives is one of the highest-value contributions — pair it with atests/golden/ case that pins the verdict.
Add a vulnerable demo agent
Demo agents give the community a reproducible target to scan against. Two homes:- Bundled examples at examples/ ship with the package. The current set is
examples/langgraph/{simple_chatbot,support_with_tool,personal_assistant_pii}.pyandexamples/openai_agents/{simple_chatbot,support_with_tool,personal_assistant_pii}.py. Add a new file under the matching framework directory and reference it via--framework-ref agent_guardian.examples.<framework>.<module>:graphon a scan. - Testbench at
/Users/mobionix/workspace/glacien/agent_guardian_testbench/(private; Cloud Run service) hosts longer-lived deliberately-vulnerable agents (finbot,support_bot,coding_assistant,travel_concierge) plus the defendedclean_controlbaseline. Use the testbench for agents that need real tool surface, multi-turn memory, or hosted HTTP endpoints.
clean_control sibling that the same probe MUST NOT false-positive on.
Improve documentation
This site is built with Mintlify from.mdx files under docs/. The navigation tree is docs/docs.json. Every page follows the six-section style: one-line explanation → when to use → runnable command → expected output → how to interpret → next step.
To preview locally:
.mdx, add its slug to the matching group in docs/docs.json, and open a PR. Mintlify’s GitHub App auto-deploys main to docs.agentguardian.io — there is no separate docs CI on the AgentGuardian side.
Report a security issue
If you believe you’ve found a vulnerability inagent-guardian itself, do not file a public GitHub issue. The canonical channel is a private GitHub Security Advisory.
Open a draft advisory
Use github.com/glacien-technologies/agent-guardian/security/advisories/new. GitHub encrypts the report at rest and scopes visibility to the maintainers.
Email fallback
If you cannot use the GitHub channel, email
security@glacien.ai. Plain email is acceptable.How to interpret a contributor checklist
Every PR must clear these gates before merge:| Gate | Check | Where it’s enforced |
|---|---|---|
| DCO sign-off | Every commit has a Signed-off-by: trailer matching git config user.{name,email} | tim-actions/dco on every PR |
| Conventional commits | Subject prefixed with feat: / fix: / chore: / docs: / test: / refactor: | Release-notes generator parses these |
| Branch name | Uses the matching prefix (feat/..., fix/..., docs/..., etc.) | Convention; reviewers enforce |
| Lint | uv run ruff check . exits zero | pre-commit hook + CI |
| Format | uv run ruff format --check . exits zero | pre-commit ruff-format hook |
| Types | uv run mypy src/ exits zero | pre-commit mypy hook + CI on Py 3.10–3.13 |
| Tests | uv run pytest exits zero | CI on Py 3.10, 3.11, 3.12, 3.13 |
| No secrets / large files | detect-private-key + check-added-large-files (≤ 500 KB) pass | pre-commit hooks |
DCO sign-off
Every commit MUST carry aSigned-off-by: trailer asserting the Developer Certificate of Origin 1.1. Pass -s to git commit:
git config user.name and git config user.email. Anonymous or untraceable sign-offs (e.g. the bare noreply@github.com) are rejected. GitHub’s per-user privacy email of the form <numeric-id>+<username>@users.noreply.github.com is permitted because it remains uniquely tied to your account — matching the Linux kernel and Kubernetes DCO policies.
If you forget the trailer, rebase to add it across every commit on the branch:
Branch and commit prefixes
| Prefix | Use for |
|---|---|
feat/ and feat: | New feature, new probe, new adapter |
fix/ and fix: | Bug fix |
chore/ and chore: | Tooling, dependencies, refactors with no behaviour change |
docs/ and docs: | Documentation only |
test/ and test: | Tests only |
refactor: | Internal restructuring with no behaviour change |
feat/asi04-tool-poisoning-langchain with the first commit feat(probes): add ASI-04 chained tool poisoning probe.
Next step
Installation
Pip / pipx / uv / Docker — pick the install path that matches your dev setup.
How AgentGuardian works
The six-phase swarm, so you know what your probe / adapter / agent plugs into.
Attack library
The 96 existing probes across ASI01–ASI10 — see where your contribution fits.
CONTRIBUTING.md
The canonical contributor spec in the repo, including the long-form DCO policy.