Your code is Apache-2.0.
Your weights are CC-BY-NC.
You cannot ship.
That sentence is the entire product. Every other licence tool reads one of the five places an obligation hides. Clearance reads all five and returns a decision — with the clause, the file and the line where it lives, and an honest confidence level.
~$ clearance check . CLEARANCE VERDICT — my-saas ======================================== SHIP: DO NOT SHIP BLOCKERS: 1 CONDITIONS: 2 SCANNED: 47 dependencies · 3 weight files · 2 upstream CLIs CORPUS: 2026.09.2 · signed ✓ [BLOCK] firecrawl AGPL-3.0-only clause: LICENSE §13 (network use) reason: you run a MODIFIED version and expose it over HTTP evidence: node_modules/firecrawl/LICENSE:1-9 fix: swap to crawl4ai (Apache-2.0, same capability) confidence: HIGH [COND] kokoro-82m Apache-2.0 (code AND weights) note: clean commercial path; attribution required [COND] hey-gem weights Custom community licence note: >1k MAU triggers a commercial gate evidence: LICENSE.md §3.2 confidence: MEDIUM — clause text is ambiguous --- This is an informational finding based on the licence text as published on the date recorded. It is not legal advice. Ambiguous clauses are flagged as such. Important decisions should be reviewed by a qualified professional. ~$
The answer is distributed across five places.
No single tool reads them together.
The problem was never that licences are hard to find. It is that "can I ship this?" depends on five documents, and the one that blocks you is rarely the one you checked.
The check no competitor runs
Weight files are detected by magic bytes, not by extension. Licences are resolved from GGUF metadata, config.json and model-card frontmatter. Then Clearance compares the code licence against the weights licence — and says so when they disagree.
Permissive. Commercial use, modification and distribution all permitted.
Non-commercial only. The NC clause is unambiguous.
The file is not ignored. It becomes Undetermined and the verdict cannot be SHIP. Unknown never rounds toward a pass — that is the single most dangerous behaviour in this category, and every SCA tool exhibits it.
Four rules. Six properties. One test each.
The decision layer is pure — no I/O, no clock, no randomness — so the same inputs produce a byte-identical verdict. These are the rules, in order, and the first one that matches wins.
| Property | Test |
|---|---|
| A blocker dominates everything below it | TestBlockerDominates |
| Unknown outranks a condition | TestUndeterminedBeatsCondition |
| Unknown never collapses to SHIP | TestUnknownNeverShips |
| LOW confidence cannot block | TestLowConfidenceNeverBlocks |
| The fold is order-independent | TestFoldCommutative |
| Identical inputs produce identical output | TestVerdictDeterminism |
What it will never do
A tool that produces verdicts has to be defined as much by its refusals as its features. These are not roadmap items. They are the product's boundaries.
No os/exec on project files. No build. No test run.
Dependencies are read from committed lockfiles, never installed.
Zero telemetry. --offline makes zero outbound calls, enforced by test.
Clearance is about permission, not exploits. Hard boundary.
No citation, no finding. A test asserts it on every rendered finding.
Every finding carries HIGH, MEDIUM or LOW. A MEDIUM is never shown as certain.
Present in every human and Markdown output. Enforced by TestDisclaimerPresent.
UNDETERMINED is a first-class verdict, not an error.
When a verdict is wrong, there is a public process for it: how to report it, what happens next, how fast the corpus changes, and what the changelog entry looks like.
A confidence level may never rise without a correction block in the corpus — E-CORPUS-006 refuses to load the entry otherwise. Confidence laundering is a build error here.
Every entry in the corpus was read out of the licence text by a human
This is the most unusual thing about the project, so it is on the landing page rather than buried in a roadmap. If the traps are not real, the product should not exist — so the corpus is small, hand-written, and cited, rather than scraped.
Twelve licences and twelve traps, every one of them read out of the actual document and carrying a citation to the clause it came from. A verdict is only as good as this data.
The corpus is not throwaway work. Adding an entry is a data change, not a code change: the judgement lives in the YAML, so a wrong interpretation is fixed by editing it rather than by shipping a new binary.
Every tool in this category launches with a feature list. Clearance launches with the data its verdicts are made of, and the method used to write it.
A tool launch says "here is a CLI" and asks for trust before use. Publishing the corpus says "here is exactly what we will judge you against" and lets you check it yourself.
The corpus is deliberately small. Twelve licences and twelve traps, each with a citation, is something one reader can check in an afternoon. A scraped list of thousands of entries is not, and the verdicts it produces cannot be defended.
What the existing tools do
Snyk, FOSSA, Black Duck, Mend, FOSSology and ScanCode are good at what they do. What they do is produce a report, for a legal team, priced for an enterprise.
The one sentence a competitor cannot honestly write: "We will tell you a dependency is unsafe to ship, even when that answer costs us the sale." A per-dependency verdict has no room to soften an answer.
Point it at a project.
Get a decision.
One binary. No account, no server, no configuration you did not write yourself. The first run tells you what it could not classify — which is usually the most useful line in the output.
# linux amd64. darwin and windows builds are on the same path. ~$ curl -fsSLO https://clearancedev.vercel.app/dl/clearance_0.1.0-rc.2_linux_amd64.tar.gz ~$ tar -xzf clearance_0.1.0-rc.2_linux_amd64.tar.gz ~$ ./clearance version # the signed corpus is in the archive, beside the binary ~$ clearance check .