0008. Licensing (Apache-2.0), the DCO, and dependency-selection criteria
Context
Vord's adopters are the same kind Wyrd targets — providers and application teams
that must be legally able to deploy, modify, and build products on the system —
and Vord is assembled from pluggable engines at every seam: the Authorizer
(ADR-0006), KeyCustody (ADR-0003), the metadata core it borrows from Wyrd
(ADR-0001 rule 4), the NATS revocation/event transport (ADR-0005), and the
deployment substrate. An identity system is, even more than a storage system, a
sovereignty artifact: it holds the principals and the keys. A sovereignty-first
system is only as sovereign as its weakest pluggable component, so its
dependency choices cannot rest on technical merit alone.
Wyrd already encoded exactly this reasoning (Wyrd ADR-0003): a permissive outbound
license, contribution provenance by DCO rather than CLA, and a three-test rubric
applied to every external engine so "the next CockroachDB" — source-available,
single-vendor, un-self-hostable — is caught at selection time rather than after
adoption. Vord ships an Apache-2.0 LICENSE already; what is missing is the
rule, recorded so Vord's own engine picks (SpiceDB vs OpenFGA, the KMS, the
authz dev backend) are evaluated against a standard rather than by taste.
Decision
1. Outbound license and contribution provenance
License Vord under Apache 2.0 — permissive, with an explicit patent grant —
and ship LICENSE, NOTICE, and SECURITY.md from the first commit (done as
part of governance adoption, ADR-0007). Track contribution provenance with the
Developer Certificate of Origin (DCO), not a CLA: a per-commit
Signed-off-by attestation, inbound-equals-outbound under Apache 2.0, enforced in
CI (dco.yml). The reasoning is Wyrd ADR-0003's verbatim: the CLA's friction is
paid by exactly the drive-by contributors an open project wants, and the one thing
a CLA would buy — the unilateral right to relicense — is the lever a
sovereignty-first project should deliberately not hold.
2. Dependency-selection criteria (inbound)
Every external dependency at a pluggable seam — and every component recommended as a default — is evaluated against the same three tests Wyrd ADR-0003 defines, adopted here unchanged:
- License. Permissive and clearly-licensed (MIT / Apache-2.0 / BSD-class) is preferred. Adopter-infecting copyleft (AGPL) and source-available "paywall" licenses (BSL, SSPL, vendor community licenses) are disqualifying for a default and must be explicitly justified if used at all.
- Governance. Foundation- or multi-stakeholder-governed (e.g. CNCF) is preferred over a single vendor who can unilaterally relicense; a permissive license is the safety net, because forkable code cannot be relicensed away.
- Control resilience. A component passes if control over it cannot be withdrawn and you can run it yourself: forkable, self-hostable with no forced phone-home and no required managed service, and — for components that hold data — data residency under the operator's control. Vendor nationality is explicitly not a test; the test is whether control can be withdrawn.
3. Principle
Prefer foundation-governed, permissively-licensed components at every pluggable
seam. When a chosen default carries a control-resilience wrinkle, name it; when a
more resilient alternative exists, offer it. This makes the audit a standing rule,
not a one-time cleanup — and the seam abstractions Vord already mandates (ADR-0003
KeyCustody, ADR-0006 Authorizer) are what keep any one wrinkle swappable.
Consequences
- Commercial providers can adopt Vord without legal friction (patent grant included), with lower contribution friction than a CLA and sufficient provenance.
- The three tests turn the engine picks Vord has deferred into rubric-bound decisions rather than matters of taste — most importantly the SpiceDB-vs-OpenFGA choice (ADR-0006), made at M3.
- This ADR governs Vord's choices; the engines it borrows through Wyrd (the metadata core and its TiKV/etcd backends) already passed the identical Wyrd ADR-0003 audit, so Vord inherits clean provenance there by construction (rule 4).
Audit of currently-named dependencies (the three tests applied)
| Component | Seam | Verdict |
|---|---|---|
| OpenFGA | Authorizer (production) |
Candidate — Apache-2.0, CNCF-hosted (foundation governance). Scores high on all three tests; a strong default for the deferred pick. |
| SpiceDB | Authorizer (production) |
Candidate, with a stated wrinkle — Apache-2.0 and forkable (License + Control-resilience pass), but AuthZed-vendor-led (a weaker Governance score than a foundation project). Not disqualified; the License/fork safety net holds. The OpenFGA-vs-SpiceDB pick is made at M3 against these criteria and a real zookie model (ADR-0006). |
| Cedar | Authorizer (embedded / dev) |
Keep — Apache-2.0, AWS-led but an embeddable library (forkable, self-hostable, no service to capture). Passes. |
| Authorizer backing datastores (PostgreSQL / CockroachDB / Spanner) | the second consistency domain (ADR-0026) | Split verdict — it drives the M3 configuration, not just the engine pick. PostgreSQL passes all three tests (permissive, community-governed, self-hostable) but is the engines' write-scale-limited configuration. CockroachDB fails the License test (BSL, then a proprietary enterprise license since 2024 — the Vault class) despite being the horizontally-scaling configuration. Spanner is managed-only and fails Control-resilience. The license-clean path has a scale ceiling and the scaling path fails licensing — the tension that keeps ADR-0026 §4's Wyrd-backed storage adapter reserved as the potentially only clean hyperscale configuration (ADR-0006 decision 3). |
| NATS | revocation / event transport (ADR-0005) | Keep — and the live cautionary example. Apache-2.0, CNCF; the 2025 attempt by the lead vendor to relicense the server to BSL was defeated only because CNCF held the trademark and the code was forkable — precisely the protection the Governance + License tests buy. |
| KeyCustody backends (KMS / HSM) | signing-key custody (ADR-0003) | Trait-gated; name the wrinkle. A managed cloud KMS fails Control-resilience (you cannot self-run it); Vord therefore keeps custody behind the KeyCustody trait, always offers a self-hostable path (embedded software keystore for dev; self-hosted HSM/KMS for production), and flags managed KMS as convenient-but-control-compromising rather than a default. HashiCorp Vault fails the License test (BSL since 2023); the named self-hostable production candidate is OpenBao — Linux-Foundation-hosted, MPL-2.0 (License, Governance, and Control-resilience all pass) — evaluated as the default production backend at M1. |
| SPIRE (SPIFFE) | internal trust fabric (ADR-0035) | Keep — Apache-2.0, CNCF-graduated, foundation-governed, self-hosted by construction. Passes all three tests; the dev profile runs without it behind the same seam. |
| OWASP Threat Dragon | threat-model tooling (ADR-0027) | Keep (non-seam) — Apache-2.0, OWASP-hosted; a modeling tool whose artifacts are committed JSON, so Control-resilience is trivially satisfied. |
| Wyrd metadata core | the strongly-consistent core (ADR-0001) | Passes by construction — Apache-2.0, the sovereign substrate Vord consumes; its own backend choices already cleared Wyrd ADR-0003. |
| Rust toolchain, RustCrypto / rustls, webauthn-rs, biscuit, madsim | implementation | Keep — permissive (MIT / Apache-2.0); forkable, so no relicense trap even where single-maintainer. |
Standing rule: any ADR that introduces a dependency at a seam appends its row to this table in the same change — the audit stays current by construction, not by periodic cleanup.