Skip to content

Ecosystems ​

Securock reads language lockfiles and records trust evidence per artifact. Subject identity uses the ecosystem (registry family), not the package manager. Switching npm ↔ pnpm does not rewrite every subject identity because resolver is stored separately.

When multiple resolvers for the same family are present, prefer one resolver per family (for example pnpm over npm).

Supported lockfiles ​

EcosystemResolverLockfile
npmnpmpackage-lock.json
npmpnpmpnpm-lock.yaml
npmyarnyarn.lock
npmbunbun.lock
npmdenodeno.lock
jsrdenodeno.lock
urldenodeno.lock
cargocargoCargo.lock
gogogo.mod + go.sum
pypiuvuv.lock
pypipoetrypoetry.lock
pypipdmpdm.lock
packagistcomposercomposer.lock
rubygemsbundlerGemfile.lock
nugetnugetpackages.lock.json
swiftswiftpmPackage.resolved
pubpubpubspec.lock
hexmixmix.lock
mavengradlegradle.lockfile

All resolvers above are stable. Deno deno.lock v5 is the preferred target; v3/v4 remain supported for compatibility.

Evidence depth ​

Evidencenpm family (npm / pnpm / yarn / bun / deno npm)PyPI (uv / Poetry / PDM)Other ecosystems
digestfrom the language lockfilefrom the language lockfilefrom the language lockfile
vulnerabilitiesOSV (non-MAL-*)OSV when the source is proven publicOSV when the source is proven public
maliciousOSV MAL-*same, when OSV is queriedsame, when OSV is queried
provenancenpm attestation; verified after Sigstore + digest bindPEP 740 Integrity API; verified after Sigstore re-verifyunknown
signaturenpm dist.signatures; verified after ECDSA + digest bindsame PEP 740 path as provenanceunknown
capabilitiesregistry metadata + source heuristicsunknownunknown
behaviorhosts, paths, commands, env from heuristicsunknownunknown
ownershippublisher and maintainersunknownunknown
chainSLSA fields from provenanceTrusted Publisher + Sigstore identityunknown

npm collection verifies registry ECDSA signatures against /-/npm/v1/keys and Sigstore provenance bundles against the public-good trusted root. Both require the lockfile digest to match the signed artifact before emitting verified.

Reachability ​

--reachability (Usage) needs two things from the lockfile: how each package enters the project (its scope) and what each package depends on. What each resolver can read:

ResolverScope comes fromDependency edges
npmdev, optional and devOptional flagsdependencies of each package
pnpmimporters (direct dependencies), spread along the graphsnapshots, or packages in older lockfiles
yarnpackage.json of the project and workspaces, spread along edgesdependencies of each entry
bunworkspaces (direct dependencies), spread along the graphdependency map of each package
denoworkspace imports, spread along the graph (all runtime)dependencies of each package
uvproject and workspace member: dependencies, extras, dev groupsdependencies of each package
poetrygroups, or category, or pyproject.toml for older lockfiles[package.dependencies]
pdmgroups, with pyproject.toml saying which are extras or devdependencies requirement strings
cargoCargo.toml of the project and workspace membersdependencies of each package
composerpackages is runtime, packages-dev is devrequire of each package
bundlerDEPENDENCIES, with the Gemfile marking dev and test groupsgems listed under each spec
nugetDirect packages are runtimedependencies within each target framework
pubdirect main, direct dev, direct overriddennot recorded
mixmix.exs, where only: :dev or :test marks devdependency list of each hex entry
gradlethe configurations a dependency is locked fornot recorded
gonot recordednot recorded
swiftpmnot recordednot recorded

Where a lockfile records neither, vulnerabilities stay unknown. Where the scope comes from a manifest (package.json, Cargo.toml, pyproject.toml, Gemfile, mix.exs) and the manifest is missing, scopes stay unknown as well. Go modules are the notable gap: go.mod does not say which modules a package actually imports, so reachability for Go needs call-graph analysis such as govulncheck, which Securock does not do.

Caveats by ecosystem ​

Deno ​

  • Deno npm packages use OSV and npm evidence collectors.
  • JSR and HTTPS URL artifacts parse stably; OSV does not cover them yet, so vulnerability state stays unknown.
  • URL subjects use the requested URL as subject.name; do not put URLs in version.

Go ​

  • OSV runs in public-only only when the effective GOPROXY is the single public proxy and the module is not private.
  • GOPRIVATE / ambiguous multi-proxy lists keep names off OSV; state is unknown, not trusted.
  • Digests use the goh1: prefix from go.sum.

Gradle (Maven coordinates) ​

  • gradle.lockfile records coordinates but does not prove a registry URL.
  • OSV is not queried in public-only.

Swift ​

  • Package URLs are recorded, but public-only does not treat Git hosts as a public registry for OSV.

pnpm / NuGet / PDM / Mix ​

Fail-closed public origin rules apply: Securock does not assume a public registry when the lockfile omits a resolvable public tarball or index. See Privacy.

Choosing a profile ​

TreeSuggested starting point
npm-heavy with attestations--profile strict
Mixed / non-npmdefault, then add digest / origin rules carefully
Offline fixtures--offline and expect many unknown axes

Examples ​

Offline walkthroughs for several resolvers live under examples/:

ResolverDirectory
npmexamples/npm
pnpmexamples/pnpm
Yarnexamples/yarn
Bunexamples/bun
uvexamples/uv
Poetryexamples/poetry
Goexamples/go
Cargoexamples/cargo

Next steps ​

  • Evidence — how to read each state
  • Policy — floors that match your evidence depth
  • Privacy — what leaves the machine in public-only

Released under the Apache-2.0 License. Pre-1.0: all lockfile resolvers are stable.