← The Open Values Standard

The Open Values Standard — v0

The formal protocol beneath Values Commons: the data contract at the heart of the Values Layer. This is not a new design — it is the written, versioned specification of what Conscious Consuming already implies, so a second site can share it. CC's content/lenses/.json, the app/engine.js library, and the "You" export are the reference implementation. Status: v0 (draft-but-shipping). 2026-06-20; naming canon updated 2026-07-02.*

Naming. Values Commons is the public ecosystem. The Open Values Standard is this protocol. Conscious Consuming is the first real instance.
Why this exists. The substrate's keystone is one honest answer to: "what is an entity, a criterion, a value, and a provenance?" Everything else — the portable identity, the skinnable shells, the second instance, and the future decentralized commons — composes on this one contract. Writing it down costs little, commits to nothing irreversible, and makes CC itself cleaner today.

0. Design invariants (the non-negotiables the format encodes)

  1. Values-relative, not verdicts. A score is fit to a person's declared values, never "good/bad."
  2. Provenance-first. Every value-laden claim carries how we know it (a tier, and for judgements a source + date).
  3. Missing ≠ zero. Absent data is omitted, never guessed; the engine shrinks confidence toward neutral instead of inventing it.
  4. No pay-to-rank. Nothing in the format can encode sponsorship or paid placement. Rank order is a pure function of facts × the user's weights.
  5. Portable identity. The values that drive ranking belong to the user and travel between instances; an instance never needs to collect them.
  6. Forkable & plural. The format is a neutral mechanism. It carries whatever values a community defines; it does not privilege one value system.

1. Criterion — a single axis of value

{
  "key": "environment",        // stable id; reused across lenses → joins Discover facets + the theme map
  "label": "Green financing",  // free display text (per-lens)
  "tier": "assessed",          // measured | certified | assessed  (epistemic honesty)
  "source": "curated"          // provenance class for the axis as a whole
}

2. Entity — a thing being weighed

{
  "code": "triodos",                 // stable id, unique within the lens
  "name": "Triodos Bank",
  "brand": "ethical bank",           // optional
  "description": "…",                // optional
  "scores": { "environment": 98, "ethics": 92, "...": 0 },   // 0–100 ints, keyed by Criterion.key; OMIT unknowns
  "provenance": { "environment": { "...": "see §3" } },      // per-key basis
  "links":  [ { "label": "Website", "url": "https://…" } ],  // optional
  "region": ["UK", "EU"],            // optional: US | UK | EU | global
  "focuses": ["Fossil-free", "B Corp"]  // optional cross-cutting facet labels
}

3. Provenance — how we know a score

A provenance value is either a legacy plain string (a bare note) or a citation object:

"provenance": {
  "environment": {
    "note": "World's #1 fossil-fuel financier — ~$58bn in 2025, ~$430bn since 2016",
    "source": "https://www.ran.org/press-releases/bocc26/",   // a real, resolvable URL
    "asof":   "2026"                                           // year (or ISO date) the claim was true
  },
  "fees": "Monthly account fees common unless waived"          // legacy string still valid
}

4. Values — the portable identity (the "Values Passport")

A person's values are N universal themes, each weighted, that derive per-criterion weights via a theme map. They are local-first, user-owned, exportable, and portable across instances.

// the passport (CC persists this as cc.themes.v1; exports it in the "You" bundle)
{ "planet": 5, "people": 3, "health": 3, "honesty": 4,
  "privacy": 5, "animals": 3, "cost": 3, "local": 3 }   // theme → weight 1–5 (3 = neutral)

5. Lens — a domain, as a config file

A lens is one ranked domain. It is data, not code — adding one is adding a file.

{
  "meta": {
    "id": "banking",                 // globally unique, kebab-case
    "label": "Ethical banking",
    "type": "Services",              // Products | Services | Media | Organizations | Initiatives
    "domain": "Money",               // life-domain (navigation)
    "source": "Conscious Consuming (curated)",
    "attribution": "… not financial advice. Reviewed 2026-06.",
    "allergens": false,              // domain flag (food = true)
    "productBase": "https://…/",     // optional: deep-link base for "see source"
    "presets": { "Balanced": { "w": { "environment": 3, "...": 2 }, "x": [] } }
  },
  "criteria": [ /* §1 — exactly the axes this lens ranks on */ ],
  "products": [ /* §2 — the entities */ ]
}

Conformance (v0): a lens is valid if it has meta.id; criteria[] each with key + label; products[] each with code + name + a scores object whose keys ⊆ the criteria keys. Everything else is optional/extensible.

6. The engine contract — Ranking

The reference engine (app/engine.js) is a pure function of (entities, criteria, passport-derived weights). It returns, per entity:

{
  "score": 49,          // 0–100 values-relative fit
  "coverage": 0.57,     // share of your weighted axes that had data
  "why": ["Ethics","Transparent"],   // your top-contributing axes
  "facts": 4, "wanted": 7,           // "based on 4 of 7 facts you value"
  "cap": { "label": "Green financing", "v": 12 }   // non-null if a dealbreaker capped the fit
}

The formula, fixed in v0: round( (Σ wᵢ·sᵢ / Σ wᵢ)·coverage + 50·(1−coverage) ), where coverage = Σ(weighted axes with data) / Σ(weighted axes); results below MIN_COVERAGE (0.25) are withheld (unknown, not faked); an axis you weight ≥4 that scores ≤20 caps the fit at 49 (a non-compensatory veto, so a dealbreaker can't be averaged away). assessed sub-scores display as bands (Strong/Good/Fair/Limited/Poor), measured ones precisely.


7. What is not in v0 (deliberately deferred)

8. Versioning

This is v0, now at v0.1. v0.1 was forced by exactly the event this section anticipated: the second instance (Kosplora) consumed v0 and revealed one real revision — the value vocabulary (THEMES / KEY2THEME) must be instance-injectable, not baked into the engine — so themeDefaults(criteria, passport, k2t) now takes the key→theme map as an optional parameter (engine.js VERSION: '0.1', backward-compatible; CC untouched). See INSTANCE-2-KOSPLORA.html §9. v1 is cut when more instances force more revisions. Breaking changes bump the major; the reference implementation (CC) always tracks head.