candor · supply-chain effect diff
Your dependency bump
added a capability.
A CVE database tells you a package is bad after someone finds out. This tells
you the moment a release gains a reach it didn’t have — a function that
was pure now opens a socket, writes a file, runs a subprocess — known-bad or not. candor already
computes, for every function, exactly which effects it performs. Diff two releases and the answer
falls out: what did this update newly reach, and in which function.
Point it at a Maven coordinate or an npm package and two versions:
candor-gains org.apache.commons:commons-lang3 3.11 3.12.0
01 What a gained capability looks like
The signal that matters is not “this package uses the network” — big
libraries always do. It’s a function that already shipped, now reaching further than it
did. That’s the shape a supply-chain attack takes: a small diff that turns trusted code
into a phone-home. candor separates it from the ordinary churn of a release.
JVM · a jar
candor-gains · com.acme:report · 1.0.0 → 1.1.0
──────────────────────────────────────────────
⚠⚠ EXISTING CODE GAINED A CAPABILITY
1 function that shipped before now
reaches the outside world:
com.acme.Report.render → Net
──────────────────────────────────────────────
ALARM — a function that already existed
started reaching the outside world.
render() was a pure formatter in 1.0.0. In 1.1.0 it opens a
socket. The gate exits non-zero — fail the PR before you bump.
npm · a package
candor-gains · greet · 1.0.0 → 1.1.0
──────────────────────────────────────────────
⚠⚠ EXISTING CODE GAINED A CAPABILITY
greet → Net
⚠ new functions performing external I/O
track → Net
──────────────────────────────────────────────
ALARM — review before you bump.
greet() was pure; the bump added a track() helper that
https.gets the caller’s input, and re-routed greet through it.
Both flagged — the trusted one loudest.
The 2026 shape of that alarm: a dependency that starts calling a model
provider. candor classifies a model-API call as its own effect — Llm,
refining Net the way Db does — whether it arrives as an SDK
(openai, langchain4j, Bedrock) or a plain request to a known model host.
So the diff says it plainly: a function that shipped pure now sends its input to a model
endpoint — a prompt-injection and data-exfiltration surface appearing in a patch
release. And deny Llm is a one-line policy.
02 Why this isn’t another CVE scanner
- It’s a capability change, not a reputation lookup. No database of known-bad
versions to be behind on — candor computes the effect surface of the code in front of it, so
a brand-new malicious release is flagged the same day as an old one.
- Function-level, not package-level. Not “the package touches the network”
but which function newly does, and the call path to where the effect enters — the
difference between an alert you can act on and one you scroll past.
- One contract across languages. The same effect definition on your Maven bump and
your npm bump and your Swift bump, proven identical by a cross-language conformance suite. A
polyglot estate, judged by one rule — the thing a single-ecosystem tool structurally can’t
offer.
- It says when it can’t see. An obfuscated or dynamically-loaded update reads as
“unresolved surface grew”, not a false all-clear. You’re told where to look by hand.
The report itself carries a
coverage field naming every dependency the classifier
doesn’t cover, and the diff discloses when that set changes between versions —
a dependency going dark is a signal too.
03 Want candor to watch, not just check?
The command above is a snapshot. The version worth having is continuous:
candor watches every dependency across your whole estate and tells you the moment any published update
gains a capability — before you bump, before it’s a CVE. We’re building it JVM-first.
If that’s something you’d use, tell us which ecosystem — it decides what we build next.
One click opens a pre-filled note on GitHub — no account signup, nothing to install.
The open candor-gains command stays free either way; this is the hosted, always-on layer.
04 The rest of candor
The effect analysis underneath this is the same engine that enforces your architecture on
every push and hands your coding agent a function’s blast radius in one query. Supply-chain diffing
is one thing it can do because it already knows what every function reaches.
The architecture gate →
For coding agents →
What candor is →
Work with the team behind candor
candor is built and run by Polymorphism — a small senior team that designs, builds and runs large systems for enterprise and government. The judgement we put into AI-code safety here is what we’d bring to your platform.
How we work
Talk to the team