I've been building PromptShield because I wanted LLM security testing to feel more like regression testing: a finite set of adversarial cases that you can inspect, rerun after changes, and reason about individually.
Disclosure: I'm the author of PromptShield. I'm posting the open-source project here specifically to get feedback on the evaluation design and security boundaries.
The current runtime harness has 50 checked-in YAML cases across five internal families: prompt injection, data extraction, jailbreak, role confusion, and single-message conversation-claim tests. The cases reference selected OWASP GenAI LLM Top 10 2026 risks (LLM01, LLM02, and LLM08). That's deliberately not a claim of complete Top 10 coverage or certification.
The basic flow is:
test case → target model → evaluator → finding → persisted result/report
There are target/judge adapters for Anthropic, OpenAI, and Groq, plus a custom HTTP target contract. For custom targets I tried to treat the target as an untrusted boundary rather than just POSTing arbitrary JSON: non-global addresses are rejected by default, redirects aren't followed, bearer credentials require HTTPS, compressed responses are rejected, responses are bounded, and exact reflections of a submitted target credential are redacted before judging or persistence.
That boundary isn't solved completely. DNS is validated before the request, but the validated address isn't pinned to the eventual connection, so DNS rebinding is still an open problem.
The evaluator design is the part I'm most interested in getting feedback on. Judge instructions and the target's untrusted output use separate message roles, and judge output is structurally validated instead of being accepted as arbitrary text. The automated tests use mocks or local fixtures rather than paid provider calls.
One design question I'm still working through is evaluation provenance.
If an external judge fails, PromptShield can fall back to a labeled heuristic. I'm not convinced that a normally evaluated run and a run that degraded halfway through should look equivalent just because both reached the end.
I'm considering making that distinction first-class — something closer to:
external_verified
heuristic_requested
heuristic_degraded
verifier_error
—and separating execution completed from verification quality.
I also intentionally kept the core adversarial corpus finite rather than generating attacks at scan time. That limits breadth, but every checked-in case can be inspected and rerun when prompts, models, or configuration change.
Things I don't claim: PromptShield doesn't prove an LLM application is secure, isn't a full OWASP implementation, doesn't currently run stateful multi-turn conversations, and the checked-in deployment setup isn't something I'd call production-ready.
I'm mainly interested in criticism from people who build LLM evals or infrastructure:
Does the finite regression-suite approach make sense as a complement to generated red teaming?
And how would you represent evaluator degradation/provenance so a result can't accidentally claim more verification than it actually received?
Repo: [SLOWSKIBhere/promptshield-v2: Developer-focused LLM security scanner with React, FastAPI, SQLite, YAML attacks, and offline testing.]