Join our Newsletter — 33% off our NHI Course

What are the signs that an AI security scanner is under-covering a repository?

The clearest signal is a finding set that looks plausible but remains small relative to the size and complexity of the codebase, especially when later manual review finds vulnerabilities in untouched endpoints. Inconsistent results across runs are another warning. If the tool cannot show what it inspected, teams should assume hidden blind spots until proven otherwise.

How to tell when a scanner is under-covering a repository

A scanner is under-covering when its output looks tidy, but the result set is too small for the repository’s size, language mix, or endpoint count. The most useful clue is not a single missed finding, but a pattern: the tool keeps returning the same narrow slice of issues while later manual review finds vulnerabilities in code it never seemed to reach.

A second signal is inconsistency. If repeated runs on the same commit produce materially different findings without a clear code change, coverage is probably unstable. That usually means the scanner is not traversing the full reachable surface, is stopping early, or is being constrained by parsing, configuration, or auth visibility gaps.

The third signal is lack of inspectability. If the tool cannot explain what paths, files, endpoints, or dependencies it actually inspected, then “no findings” is not evidence of safety. In practice, under-coverage becomes most visible when the scanner cannot demonstrate breadth, depth, and repeatability together.

What coverage gaps usually look like in practice

Under-coverage often shows up as a mismatch between repository complexity and reported findings. Large monorepos, polyglot services, generated code, nested packages, and many API routes create a wider search space than a scanner can safely assume from top-level summaries alone. A plausible report that never changes shape across very different codebases is a warning sign.

Another pattern is endpoint skew. The tool may repeatedly focus on obvious entry points, public routes, or recently changed files while missing background jobs, admin paths, error handlers, test fixtures that leak into production flows, or code reachable only through indirect import chains. That kind of partial traversal can leave the most interesting bugs untouched.

Coverage gaps can also come from poor normalization. If the scanner mishandles framework conventions, dynamic route generation, vendored code, or split configuration files, it may believe it has inspected the repository when it has only inspected a subset of the executable surface. A small finding set is not automatically bad, but it should be proportionate to what the scanner actually claims to have analyzed.

How to validate the scanner before trusting the result

Validation should start with a coverage conversation, not a vulnerability conversation. Ask what the scanner enumerates, what it excludes, how it handles generated or embedded code, and whether it can produce an inspection trace or file list that lets you compare scan scope to repository scope. Without that evidence, the result should be treated as a partial search, not a complete assessment.

Independent verification matters because blind spots often hide in untouched code paths. One practical check is to seed the repository with known issues in representative locations, then confirm that the scanner finds them consistently across runs. If it only catches obvious cases, or only catches them when the repository is small, its apparent precision may be masking shallow reach.

It also helps to compare scanner output against simple structural expectations, such as number of packages, route handlers, dependency manifests, and service entry points. The goal is not to force a fixed number of findings, but to see whether the tool’s observed coverage scales with the subject it is supposed to inspect.

Risk and Threat Considerations

Under-covering scanners create false confidence, which is dangerous because teams may stop searching once the report looks clean. The risk is not just missed findings, but missed classes of findings in the exact places attackers prefer, especially less-travelled endpoints and rarely reviewed code paths.

Failure mechanism: The scanner only reaches a subset of the repository because of parsing limits, configuration gaps, auth barriers, dynamic code paths, or early termination, then reports that subset as if it were representative.

Impact: Vulnerabilities can persist in untouched routes, jobs, or modules, and remediation priorities become distorted because the team believes the scan had broader visibility than it really did.

Standards & Framework Alignment

This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.

MITRE ATT&CK addresses the attack and risk surface, while OWASP ASVS, CIS Controls v8 and NIST CSF 2.0 set the governance and control requirements practitioners need to meet.

Framework Control / Reference Relevance
OWASP ASVS V15 — Secure Coding and Architecture Scanner coverage gaps hide insecure paths in code and architecture.
Recommendation — Review code paths and execution paths that the scanner did not demonstrate it inspected.
CIS Controls v8 CIS-16 — Application Software Security Application scanning needs validation against the real attack surface and codebase.
Recommendation — Validate that scanning actually covers the application surface, not just the obvious entry points.
NIST CSF 2.0 DE.CM-08 — Vulnerability scans are performed The question is about whether scanning is occurring with sufficient coverage and reliability.
Recommendation — Confirm scanning scope and quality before using scan results as evidence of security.
MITRE ATT&CK T1595 — Active Scanning Under-coverage matters because attackers exploit unexamined surfaces after reconnaissance.
Recommendation — Hunt the paths that automated scanning failed to cover and test them manually.

Practitioner Guidance

What to verify: Require a scope artifact or inspection trace that shows what the tool actually examined. If it cannot prove breadth, do not treat the output as coverage-complete, even if the findings are plausible.

Decision rule: If repeated scans are stable only on small repos or only on obvious issues, treat that as a tool limitation rather than a repository with low risk. In that case, pair the scanner with targeted manual review of uninspected or high-value paths.

What good looks like: A healthy scanner produces repeatable results, covers a range of repository structures, and can explain why its inspected surface matches the codebase shape. The best signal is not “few findings,” but “few findings with demonstrated reach.”

Practitioner takeaway: A scanner is trustworthy only when low findings and visible coverage move together. If you cannot see what it inspected, assume blind spots until the tool proves otherwise.