Skip to content

Writing opinions

After installing Veritas, you write three kinds of opinions and read one. This page walks through each.

The examples below use placeholder things and assertions. You’ll create your own with wh thing create and wh assertion create — see Things and Assertions for those primitives. Veritas operates on assertions you already have.

The examples assume Article/example-claim exists as the underlying thing, Proposition/article-is-accurate is the binary-proposition assertion being evaluated, and Source/research-team is the source whose reputation is wagered. Shape names are illustrative — substitute your own domain shapes (Belief, Thesis, Finding, etc.).

Examples below use the CLI. SDK callers submit the same operations via client.commit.apply; MCP callers use the warmhub_commit_submit tool. The CLI exposes --shape, --about, and --data as flags on wh assertion create; the SDK and MCP equivalents nest the same values inside a commit operation ({ operation: 'add', kind: 'assertion', name, about, data }). See Write operations for the operation contract.

A Certainty is the primitive bet — a source expressing how strongly it believes the target assertion is true:

Terminal window
wh assertion create --shape Certainty \
--about Proposition/article-is-accurate \
--data '{
"belief": 0.8,
"disbelief": 0.1,
"uncertainty": 0.1,
"source": "Source/research-team",
"rationale": "Two independent reviewers agreed."
}' \
--repo [your-org]/[your-repo]

Required fields:

  • belief, disbelief, uncertainty — must each be in [0, 1] and must sum to 1.
  • source — a wref (the WarmHub reference to a thing) whose reputation is wagered by this Certainty.

Optional fields:

  • alpha — base rate in [0, 1]. Treated as 0.5 when omitted.
  • rationale — freeform text. Veritas ignores it; it is for human readers.

Support and Opposition express how one assertion bears on another. Both are written about a directional Pair of assertions:

Terminal window
wh assertion create --shape Support \
--about pair:Proposition/study-A-confirms,Proposition/study-A-conclusion \
--data '{
"belief": 0.7,
"disbelief": 0.05,
"uncertainty": 0.25,
"source": "Source/methodology-reviewer",
"rationale": "Replication followed the same protocol."
}' \
--repo [your-org]/[your-repo]

Pair direction matters. The first member of the pair is the antecedent; the second is the consequent.

  • Support says: belief in the antecedent is evidence for the consequent.
  • Opposition says: belief in the antecedent is evidence against the consequent.

Field requirements match Certainty: belief + disbelief + uncertainty = 1, plus source and optional alpha / rationale.

The pair:a,b shorthand is CLI-only sugar that creates the underlying Pair thing automatically. SDK and MCP callers express the same target as a collection object — "about": { "pair": ["A", "B"] } — inside the commit operation. See Collections for the full collection model.

Veritas writes Consensus assertions in two places:

  • About a target assertion, consolidating that target’s native Certainty opinions.
  • About a Pair, when Support and/or Opposition opinions exist for that pair. Pair-level Consensus is currently diagnostic-only — Veritas writes two rows per pair (one per pathway, with the inactive pathway as a vacuous opinion), but the repo-visible payload does not include a pathway label, so the two rows cannot be reliably distinguished from data alone today.

Query Consensus on a target assertion the same way as any other assertion:

Terminal window
wh thing about Proposition/article-is-accurate --shape Consensus

Querying pair-level Consensus requires the concrete Pair wref, not the pair:a,b shorthand. List the pairs in your repo to find the generated name:

Terminal window
wh thing list --shape Pair --repo [your-org]/[your-repo]
wh thing about Pair/<generated-name> --shape Consensus

A Consensus row returns belief, disbelief, uncertainty, and optional alpha. There is no source or rationale field — Consensus is Veritas’s own consolidated readout, not a wager.

A brand-new target with no inputs has no Consensus row yet — Veritas writes Consensus only after a solve runs. Retracting all inputs from a target that previously had Consensus triggers a vacuous (0, 0, 1) write.

Re-solving means recomputing Consensus for an affected target or pair after one of its inputs changes. Veritas reacts to changes on the three input shapes:

  • A new, revised, or retracted Certainty triggers a local re-solve of the target assertion and updates that target’s Consensus.
  • A new, revised, or retracted Support or Opposition triggers a local re-solve of the relation and updates the Pair’s Consensus.

For a fixed set of inputs and reputations, the readout is deterministic and order-independent — the same inputs always produce the same Consensus.

  • One Certainty does not move reputation. A single source’s opinion has nothing to disagree with locally, so reputation only adjusts when multiple Certainties on the same target disagree. Cross-pathway conflict between Support and Opposition on the same Pair can similarly adjust the source’s relation-scoped reputation.
  • Agreeing Certainties do not move reputation either. Disagreement is the signal Veritas uses to update trust.
  • Vacuous opinions are valid input. (0, 0, 1) is a well-formed “no evidence” opinion and contributes nothing to consensus — useful when you want to register a source’s existence without committing to a view.
  • Retracting an input re-solves locally. When you retract a Certainty, Support, or Opposition, Veritas re-solves the affected target or pair as if that input never existed.
  • Pairs with no Support or Opposition assertions are dormant. A Pair thing alone does not produce a Consensus until at least one pathway opinion is written about it.
  • Update an existing opinion with wh assertion revise, not a second wh assertion create. When the Veritas worker sees two active Certainty assertions from the same source about the same target, it blocks the duplicate at consensus time with a message of the form Source X has multiple active Certainty assertions about Y; Certainty/Z should have been a revision of Certainty/W. The same guard applies across Support and Opposition for the same Pair. Revising the existing assertion preserves history and updates Consensus; retract + add is the path when the source itself needs to change.