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)
- Values-relative, not verdicts. A score is fit to a person's declared values, never "good/bad."
- Provenance-first. Every value-laden claim carries how we know it (a tier, and for judgements a source + date).
- Missing ≠ zero. Absent data is omitted, never guessed; the engine shrinks confidence toward neutral instead of inventing it.
- 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.
- Portable identity. The values that drive ranking belong to the user and travel between instances; an instance never needs to collect them.
- 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
}
tieris the trust contract:measured— an objective open-data fact (a Nutri-Score, a price). Shown precisely.certified— a third-party certification (B Corp, Fair Trade).assessed— a researched judgement. Rendered as a coarse band, never a false 2-digit number, and every claim must cite (§3).keyis the interoperability primitive: reusing a key (environment,privacy,ethics…) auto-joins an entity to the Discover facets and the Values theme map (§4). New keys are a deliberate act.
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
}
scoreskeys MUST be a subset of the lens'sCriterion.keys. A missing key means "unknown" — never 0.- Domain extensions are allowed as extra fields (e.g. food adds
allergens,allergensDeclared); consumers ignore unknown fields.
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
}
- For any
assessedcriterion, the citation object (note+source+asof) is the bar. Low-controversy axes (ease, fees) may stay plain notes. - The engine renders an
asof-dated source↗ link per claim and exposes a dispute path. Provenance is meant to be contested, not trusted blindly.
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)
- The canonical theme set + the
key → thememap are the engine's value vocabulary (CC.engine.THEMES,CC.engine.KEY2THEME). v0 ships 8 themes covering 40+ criterion keys with no orphans. themeDefaults(criteria, passport)projects the passport onto a lens → the per-criterion weights the engine ranks by. Set your values once; they travel everywhere.- A full export is the user's whole local state (
cc.themes, profile, saved, notes, contributions) — a file they carry, the privacy-preserving answer to "sync."
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)
- The future decentralized commons layer — contribution, signing, content-addressing, federation, governance. That is the Values-Layer L5 layer, gated on real use. v0 is the read contract; the write/merge contract is a later version.
- A formal JSON Schema / validator file. v0 is prose + the reference implementation. A machine validator earns its place when a second instance needs to be checked against it (the rule of three).
- Cross-instance trust/discovery. How a passport decides which commons to trust is an L5 concern.
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.