Architecture Decision Record

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.