Safeguard
Supply Chain•

Declared, built, running: what is the three way inventory check?

Compare what repositories declare, what builds produce and what production runs. Differences between the three show where an inventory cannot be trusted.

Safeguard Security Team
3 min read

The three way check compares the declared inventory (manifests and lockfiles), the built inventory (what the build produced) and the running inventory (what production actually executes). Where the three agree, trust is high. Where they differ, find out why before relying on any of them.

Three views of one product

Each view answers a different question.

ViewSourceAnswers
DeclaredManifests, lockfilesWhat did developers ask for?
BuiltImage or package scan, build outputWhat was assembled?
RunningDeployed workloads, runtime inventoryWhat is live right now?

The NTIA minimum elements report notes that an SBOM must be refreshed when a new build or release changes the software, which is why the built view matters: it is the one tied to a specific release.

How to run it

  1. Pick one production service.
  2. Take the lockfile from the commit that was deployed.
  3. Take the built artifact for that commit and generate its inventory.
  4. Take the image or package that is running and read its digest.
  5. Confirm the digest matches the built artifact. If not, stop: the running software is not what the repository says.
  6. Diff the three lists.

Reading the differences

  • Declared and built differ. The build pulled in layers, tools or unlocked versions. Common cause: operating system packages and unpinned build steps.
  • Built and running differ. Someone deployed something other than the build record, or configuration downloads code at start. Serious: ask for the deployment history.
  • All three agree. Good. You still need to check scope, since agreement among three incomplete views is still incomplete.

Typical causes and fixes

SymptomLikely causeFix
Many OS packages in built, none in declaredBase imageInventory images, update the base
Newer versions in built than declaredVersion ranges, no lockfileCommit lockfile
Running image has no matching buildManual deploy or old artifactRebuild and redeploy from source
Extra package at runtimePlugin download at startupBake it into the build or inventory it

How long it takes

One service takes an hour or two once access exists. Do three or four services of different types rather than all of them. If the same cause shows up each time, you have found a process gap and can describe it in one line.

Why this is a good diligence question

It tests the seller's release process without asking for opinions. A team that can show matching digests, tied to a commit, has a controlled path from code to production. A team that cannot has an undocumented one, and the inventory inherits that uncertainty.

Safeguard's continuous monitoring keeps rescanning after the first review, so the running view does not go stale. A free scan is at gold.safeguard.sh/scan.

Try it yourself

Click through it at your own pace, or open it full screen.

Watch how findings change over time without a new build.

Quick check

What is a digest?

A content hash of a container image. Two images with the same digest are byte identical, which is how you prove the running image is the one that was built.

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.