Safeguard
Developer Tools•

How do you find manifests your scanner silently skipped?

List every manifest and lockfile in a repository with git ls-files, then diff it against what the scanner reported. A simple way to catch silent skips.

Safeguard Security Team
3 min read

List every manifest and lockfile the repository tracks with git ls-files, then compare that list to the files your scanner says it analysed. Any file on the first list and not the second was skipped. This takes minutes and catches nested projects, odd names and ignored folders.

Why skips happen silently

Scanners often have default ignore rules, depth limits or file name patterns. A nested services/billing/requirements.txt or a requirements-prod.txt may fall outside them. The scan finishes with no error, and the results look normal. A failure that produces no output is the hardest to notice.

Step 1: list what exists

The git documentation describes git ls-files as showing information about files in the index and working tree. Use it to list tracked files by name.

git ls-files | grep -E '(^|/)(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|requirements.*\.txt|Pipfile\.lock|poetry\.lock|go\.mod|Cargo\.lock|pom\.xml|build\.gradle(\.kts)?|Gemfile\.lock|composer\.lock|packages\.lock\.json)$' | sort > manifests-present.txt

Adjust the pattern to your ecosystems.

Step 2: list what was scanned

Export the scanner's list of analysed files, which many tools provide in JSON or verbose output. Reduce it to one path per line and sort it into manifests-scanned.txt.

Step 3: diff

comm -23 manifests-present.txt manifests-scanned.txt

Every line printed is a manifest the scanner did not report on.

Step 4: classify each skip

Skipped fileLikely reasonFix
Nested project folderDepth or workspace rulesConfigure scan roots
Unusual file namePattern matchAdd the name to config
Test or example folderDefault exclusionDecide if it matters
Lockfile only, no manifestParser needs bothAdd the manifest

Some skips are right. An example folder may not ship. Make that a decision, not an accident.

Step 5: keep it running

Put the diff in CI as a nonblocking report first. Once the list is clean, make any new unscanned manifest a failing check. That turns coverage from a one off audit into a standing control. See check every repository is scanned: coverage evidence for the repository level version.

Also look for manifests that are not tracked, such as generated ones, with the other-files option in git ls-files, since the build may create dependency files at run time.

Safeguard offers dependency scanning and a free scan at gold.safeguard.sh/scan. Whatever tool you use, keep a file level diff.

A worked example

Imagine a repository with three tracked manifests: a root package-lock.json, services/billing/requirements.txt and tools/report/go.mod. The scanner reports on the first and the third only. The diff prints services/billing/requirements.txt. You open the scanner configuration and find a rule that stops descending past the second folder level. You raise the limit, rescan, and the billing dependencies now appear, along with several findings nobody had seen. That is the typical outcome: the first diff is uncomfortable, and every one after it is quiet.

Write down the date and the result, because the history of the diff shows whether coverage is improving.

Quick check

Does this work for non-Git repositories?

The idea does. Use find or your version control's listing command instead.

Should every skipped file be fixed?

No. Decide for each. Skips that are intended should be written down.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.