AI security and evaluation engineer. I build open-source tools that measure how AI systems fail, then make those failures harder to repeat. My route into this field ran through hands-on model evaluation and red-teaming, so I design detectors against real failure cases and publish the misses next to the hits.
Open to contract work in AI evaluation, red-teaming, and AI security tooling.
| Project | What it does |
|---|---|
| Subcanopy Guard | Context-aware scanner for indirect prompt injection in agent tool outputs. Pure Python, zero runtime dependencies, pip install subcanopy-guard. |
| Subcanopy Gateway | HTTP gateway for Subcanopy Guard. Scans prompts and tool outputs, stores scan history, and searches known attack patterns. |
| verirust | Rust CLI that compiles and verifies code submissions, returning a deterministic ACCEPTED or REJECTED verdict for RLVR training pipelines. |
| sid-ea-findings-lab | Structured findings for LLM agent and RAG vulnerabilities. Every scenario ships vulnerable, fixed, and hard-negative variants with traces, deterministic tests, and Semgrep rules. |
| RepoProbe | Clones a Python repo, detects its test setup, runs the tests in Docker, and emits a structured JSON report. v0.1.0, 22 unit tests, verified on pallets/click. |
| issue-scout | Curates GitHub issues into a versioned dataset for evaluating LLM bug-fixing. |
On AgentDojo v1 it catches 86.5% of 629 attacks buried in tool output, at a 5.2% false positive rate (p50 0.88 ms). On the broader PromptWall set it catches 47.0% with zero false positives, which is the better guide to how well it generalizes. Known weak spots are documented in the repo.
pip install subcanopy-guard
scg scan --source tool_output response.jsonfrom subcanopy_guard import ContextScanner
scanner = ContextScanner(source="tool_output")
result = scanner.scan(tool_response)
if result.severity in ("HIGH", "CRITICAL"):
... # block or reviewRequires Python 3.14+.
Subcanopy Guard v0.5.0 (streaming scanner and framework integrations), plus wider OWASP LLM Top 10 coverage.

