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.renderNet
──────────────────────────────────────────────
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
     greetNet
⚠  new functions performing external I/O
     trackNet
──────────────────────────────────────────────
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