Every AI security product makes the same implicit promise: it gets better over time. Almost none of them can prove it, and the reason is mundane. The single most valuable signal these systems generate — a qualified human looking at a proposed finding and deciding whether it is real — is captured as a status flag, used to filter a list, and then thrown away.
Ours did exactly that. Approve and reject existed. They controlled what appeared in a client dashboard and drove a pending-count badge. Nothing aggregated them. Worse, our findings carried no record of which technique produced them, so even if we had aggregated the outcomes, we could not have attributed them to anything actionable.
This post covers what we built to fix that, the numbers it produced on first run, and the questions we think buyers should be asking every vendor in this category — including us.
Why Approve/Reject Is The Only Honest Metric
Security tooling has a long history of measuring the wrong thing. Finding counts reward noise. Coverage percentages measure what you ran, not what you found. Benchmark scores measure performance against a fixed corpus the vendor usually chose, and any system can be tuned toward a benchmark it knows about in advance.
Precision — the share of proposed findings a human confirms — has none of those problems. It is measured on real output, against real targets, judged by the person whose name goes on the report. It cannot be gamed by producing more findings, because every additional weak finding a reviewer rejects pushes the number down. It is, bluntly, the number a vendor least wants to publish and the one you most want to see.
Three questions follow from it, and all three were unanswerable for us six months ago:
- Precision per technique. Of our library of testing skills, which produce findings that survive human review and which produce pure noise? A skill at 0.9 and a skill at 0.05 look identical in a capability list.
- False-positive rate by model and asset type. When we change the model behind the agent, does output quality move? Without a per-model breakdown, a model upgrade is a vibe.
- Cost per approved finding. Inference and compute spend divided by approvals, by depth tier. Rejected findings cost real money to produce; this is the metric that tells you whether a depth tier earns its price.
Cost per approved finding is the unit economic of an autonomous testing product. Everything else is a proxy. If that number does not improve as the system matures, the system is not maturing — it is just running.
The Prerequisite Nobody Budgets For: Attribution
Here is the part that surprised us. The measurement work is not the hard part. The hard part is that you cannot measure anything until each finding records where it came from, and that is a schema decision made long before anyone asks the question.
Our AI findings recorded title, description, severity, evidence, remediation, affected asset. What they did not record was the attack vector, the specific skill, the model version, or the depth tier that produced them. The vector label existed only in a separate engagement activity log, joinable to a finding by nothing better than fuzzy timestamp correlation.
So per-skill precision was not merely unreported. It was not computable — not with a clever query, not with an afternoon of data wrangling. The information had never been written down.
The fix was one migration adding indexed columns to the findings insert:
A day of work. It is the hard prerequisite for everything else in this post, and it is exactly the kind of change that never gets prioritised because it ships with no visible feature attached to it.
If you are building in this space, do this first. Attribution columns are cheap when the table is young and expensive later, and every month you wait is a month of findings that can never be analysed. Ours predate the change, and that data is simply gone.
Making Rejection Mean Something
A reject button with a free-text field feels thorough and is analytically worthless. You cannot count prose. Six months of thoughtful rejection notes produce exactly zero decisions.
Rejection now requires selecting one of six fixed reasons, and the taxonomy is deliberately built so that each value points at a different owner and a different fix:
The finding is not real. A detection-logic problem. Repeated hits on one skill mean that skill's criteria are too loose.
Real, but not ours to report. A scope-enforcement problem, not a detection problem. Any volume here means the scope rules or their enforcement need attention.
Already reported. A deduplication problem. High counts mean the agent is spending budget rediscovering things it already knows.
Technically accurate, no practical impact. A severity-calibration problem. The detection worked; the impact assessment did not.
Might be real; cannot tell. An evidence-collection problem, and the most fixable category on the list — the agent found something and failed to prove it.
Real, and the client has consciously accepted it. Not a defect at all. Critically, this must not be counted against precision — mixing it into a false-positive rate makes the agent look worse than it is.
That last distinction is the one most teams get wrong. Four of these six reasons indicate a defect in the agent. Two do not. A metric that treats them identically will send you optimising the wrong thing.
The First Real Baseline
With attribution and the taxonomy in place, the analytics ran against production data for the first time. Here is the honest starting picture, sample size included:
14 approved, 5 rejected, remainder still in review. A baseline, not a benchmark.
We want to be careful about what this number is and is not. It is a genuine measurement of real output judged by real reviewers. It is also computed over a small sample, from a period before the engine rebuild, and it comes with an asterisk we cannot remove: every one of those findings groups as unattributed, because they predate the columns that would tell us which skill produced them.
So the first real number we have is simultaneously the last number of the old era. Its value is not the 0.74. Its value is that a month from now there will be a second number, computed the same way, broken down by skill, model, and depth — and the comparison will mean something.
We would rather publish a small honest baseline than a polished figure with no sample size attached. When a vendor shows you a precision or false-positive number, the follow-up question is always: over how many findings, judged by whom, on what date?
What The Signal Actually Drives
Metrics that do not change behaviour are decoration. Three mechanisms consume this data:
| Mechanism | How it works |
|---|---|
| Precision floors | A skill whose approval rate falls below a threshold over a meaningful sample drops out of default vector selection. It stays available for explicit use, but stops spending engagement budget by default. |
| Model regression gates | A model change is evaluated against the historical approve/reject corpus before it becomes the default. "The new model felt better" is not a deployment criterion. |
| Negative examples | Rejection reasons feed back into the relevant skill prompts as explicit negative examples. The insufficient evidence bucket is the highest-yield source here, because it identifies real findings the agent failed to prove. |
One piece is deliberately not built yet: a full evaluation harness with golden transcripts and schema validation gating skill edits. Today, a bad edit to a shared formatting instruction can degrade output across multiple surfaces, and the first signal is a human noticing. That is a real gap, it is on the roadmap, and we would rather name it than let the section above imply the loop is complete.
Where The Human Actually Sits
"Human in the loop" is claimed by nearly every vendor in this category and specified by almost none. Since the entire measurement loop above depends on human judgement, it is worth stating precisely what ours does.
- Every AI finding is written to a pending review state. It is excluded from reports, exports, client dashboards, and the findings list until triaged. This is enforced at the query layer on every artifact, not by convention.
- A Lorikeet Security pentester triages it. Approval means a person read the evidence and agrees. Not a second model, not a confidence threshold.
- Rejection requires a structured reason. As above. The reviewer cannot skip it.
- The disposition is data. It is stored, aggregated, and fed back into which techniques run by default.
The review gate had been real and enforced for a long time before any of this — and documented nowhere a client could see. We have since published the human-in-the-loop policy, a model card describing what the agent is and how it is evaluated, an emergency abort protocol, a data retention policy, and a subprocessor list. These are days of writing, not engineering quarters, and they answer procurement questions that no amount of engine work addresses.
Questions To Ask Any Vendor In This Category
- What is your precision, and over how many findings? A number without a sample size is marketing. A vendor with no number has not built the loop.
- Are rejection reasons structured or free text? Free text means the signal is being collected and discarded.
- Does a finding record which technique produced it? If not, no per-technique quality analysis exists, no matter what the dashboard shows.
- What happens to a technique that consistently produces rejections? If the answer is "nothing automatic," the product is not learning from your reviewers' work.
- How do you validate a model change? Against a historical corpus, or against impressions?
- Is accepted risk counted as a false positive? A surprisingly good tell for whether anyone has thought carefully about the metric.
- What does an approved finding cost you to produce? Vendors who know this number have modelled their own economics. Vendors who do not may be pricing on hope.
We publish these knowing they will be asked back at us, which is the point. Related reading: Introducing: Lory AI Autonomous Tester describes the engine these metrics measure, and The AI Pentester That Couldn't Send a POST Request covers the external review that started all of it.
The Uncomfortable Conclusion
An AI security product that cannot measure its own precision is not a product that happens to lack a dashboard. It is a product with no mechanism for improvement, sold on the assumption that improvement happens on its own. Model providers do ship better models, and everyone downstream benefits — but that is the vendor's supplier improving, not the vendor.
The part that is genuinely yours is the loop: attribution, structured outcomes, aggregation, and a mechanism that prunes what does not work. It is unglamorous, it ships with nothing to demo, and it is the only durable advantage in this category. We started ours late. Publishing the baseline is how we make it expensive to quietly stop.
See the loop, not just the demo
We will walk you through a real engagement timeline, the review gate, and how findings are attributed and measured — including the numbers we would rather not show.
Book a Technical Walkthrough Start an EngagementReferences
- NIST AI Risk Management Framework (AI RMF 1.0) — https://www.nist.gov/itl/ai-risk-management-framework
- ISO/IEC 42001:2023 — Artificial Intelligence Management System — https://www.iso.org/standard/81230.html
- Mitchell et al., "Model Cards for Model Reporting" — https://arxiv.org/abs/1810.03993
- FIRST — CVSS v3.1 Specification Document — https://www.first.org/cvss/v3.1/specification-document
- OWASP Web Security Testing Guide — https://owasp.org/www-project-web-security-testing-guide/
- MITRE Common Weakness Enumeration (CWE) — https://cwe.mitre.org/