Skip to content
clearance.config.yml valid intent sha256:9f2b…
Illustration · planned interface This screen is a mockup of a graphical interface that does not exist yet. The shipped product is a command-line tool: one static binary that runs locally, with no account and no server. The config format below is real; edit it in a text editor today.
Declared intent

Six facts only you can supply

Without intent, most obligations are conditional and unanswerable. So Clearance requires all six — and an omitted field evaluates to UNKNOWN, never to a default. Defaulting mau to 0 or territories to global would mean the tool invents facts and then reasons from them.

Change impact
Fields changed2
Findings affected3
Verdict changeDO NOT SHIP → CONDITIONAL
use — all six required
use.commercial
Are you charging, or earning revenue?
use.licence_model
Gates copyleft disclosure duties.
use.modified
Do you edit vendored code? The §13 trigger.
use.network_exposed
HTTP, API or SaaS? The second half of the §13 trigger.
use.distributed
Do binaries or source leave your control?
use.saas
A service rather than a shipped product.
scale & territories — conditionally required
scale.mau
Required because hey-gem gates at 1,000. Omitted ≠ zero.
territories
Omitted is not global. Omitting makes every territorial clause UNKNOWN.
EU US GB + add
policy — escalate or narrowly whitelist
Policy may only escalate severity or narrowly whitelist. It can never globally downgrade a corpus severity — an attempt is refused with E-CFG-006.
never_allow
AGPL-3.0-only AGPL-3.0-or-later + add SPDX id
ignore — reason mandatory
vendor/legacy-internal-only/**
internal tooling, never distributed

An ignore without a reason is refused (E-CFG-005), and an ignore covering more than half the tree raises E-SCAN-020. Ignored paths are recorded in the verdict so a reader can see what was skipped.

clearance.config.yml
schema_version: 1

project:
  name: my-saas
  description: A hosted document-analysis service.

use:
  commercial: true
  licence_model: closed-source
  modified: true          # the §13 trigger
  network_exposed: true     # with modified
  distributed: false
  saas: true

scale:
  mau: 5000
  employees: 2
  revenue_eur: 40000

territories:
  - EU
  - US
  - GB

policy:
  never_allow:
    - AGPL-3.0-only
    - AGPL-3.0-or-later
  block_on:
    - BLOCK
  allow_if:
    - licence: LGPL-3.0-only
      when:
        op: "=="
        field: use.modified
        value: false
  ignore:
    - path: "vendor/legacy-internal-only/**"
      reason: "internal tooling, never distributed"
Validation9 / 9 rules pass
schema_version knownE-CFG-008 ✓
six use.* presentE-CFG-002 ✓
licence_model enumE-CFG-003 ✓
territories validE-CFG-004 ✓
every ignore has a reasonE-CFG-005 ✓
no global downgradeE-CFG-006 ✓
never_allow SPDX idsE-CFG-007 ✓
strict YAML, no tagsE-PARSE-003 ✓
≤ 256 KiBE-PARSE-004 ✓
Discovery & precedence
1 · --config <path>explicit wins
2 · ./clearance.config.ymlin use
3 · ./.clearance/config.ymlnot found
4 · ~/.config/clearance/config.ymlmerged, project wins
5 · noneE-CFG-001 · exit 2

A user-level config supplies defaults; a project config overrides field by field. The resolved config is hashed into meta.intent_hash, so every verdict is traceable to the exact intent that produced it.

A minimal clearance.config.yml

Every field that can change a verdict is written out and has to be answered. Nothing that can change a verdict is inferred. The tool does not guess intent — not even helpfully.

schema_version: 1

use:                        # all six are required
  commercial: true          # are you charging?
  licence_model: closed-source
  modified: false         # do you edit vendored code?
  network_exposed: true   # is it reachable over a network?
  distributed: false
  saas: true