Every capability falls out of the same structure.

Corroboration, contradiction, causal prediction, temporal decay, gap analysis. These aren't features bolted onto a database. They're consequences of storing claims instead of rows.

A row
"ARR: $500K"
customer:Acme
arr:$500000
Stores a value. You don't know who said it, when, how confident, or whether it's still true.
A claim
Acme.ARR = $500K
source:Salesforce
timestamp:2026-04-15
confidence:0.85
status:active
Stores everything an agent needs to reason about that value. Source, time, confidence, and currency arrive with the fact.
Same fact. Different primitive. Every capability below is a consequence of the right one.
A week with one customer

One question. Four sources. The answer that earns itself.

Before the algebra below, here's the experience: a CS team using AttestDB to know whether Acme is at risk and why - end-to-end, with citations, in real time.

Ingest
Four signals, one claim feed.
Slack
Salesforce
Gainsight
Zendesk
Acme is shopping competitorsslack · 2d
conf 0.78
Acme ARR = $500Ksfdc · apr 15
conf 0.94
Acme health = greengainsight · apr 1
conf 0.92
Acme P1 ticket openzendesk · 3d
conf 0.91
Query
Every answer arrives with its trace.
Is Acme at risk?
Health
greenstale · 37d
gainsight · set apr 1
ARR
$500K$450Kconflict
sfdc (apr 15) vs billing (may 1)
This week
2 risk signals
"shopping competitors" - slack · P1 - zendesk
Answer
Moderate-to-high risk. Health is stale, ARR shows source conflict, two new risk signals this week.
Propagate
Gainsight flips Acme to at-risk. Five answers raise their hand.
HEALTH FLIPPED gainsight · green → yellow FLAGGEDQBR deck FLAGGEDexec brief FLAGGEDrenewal forecast FLAGGEDCSM playbook FLAGGEDweekly digest
12 downstream summaries updated · 0 need archaeology
Reconcile
Salesforce close vs billing run. The disagreement is the answer.
Salesforce
$500,000
acme.arr · apr 15
conf 0.94
Billing
$450,000
acme.arr · may 1
conf 0.97
contradiction · surfaced
What you seeBoth sources, both timestamps. The agent doesn't pick a winner silently - the conflict shows up where someone can resolve it.

The Claim

A claim is a 7-tuple: who asserted what, about which entities, with what confidence, when, in which namespace.

C = (Subject, Predicate, Object, Provenance, Confidence, Timestamp, Namespace)

Claims are immutable and append-only. The system never modifies or deletes a claim. New information creates new claims. Retraction creates a tombstone - the original is preserved for audit.

The Dual Identity System

Every claim carries two cryptographic identifiers. This is the structural trick that makes corroboration and deduplication automatic.

claim_id

SHA-256( S | P | O | source | timestamp )

The claim's unique identity. No two distinct claims share a claim_id. It answers: who said what, when?

content_id

SHA-256( S | P | O )

The claim's semantic identity - what fact it asserts, regardless of who said it or when. All claims asserting the same triple share a content_id.

Three labs publish "Drug X activates Gene A." Each gets a unique claim_id. But they share a content_id - because they're asserting the same fact. That shared ID is how the engine counts independent sources automatically.

Corroboration

When multiple independent sources assert the same fact, the engine boosts confidence logarithmically. One source gives no boost. Two gives 1.3x. Four gives 1.6x. Eight caps at 1.7x.

boost(n) = min(1.0 + 0.3 × log2(n), 1.7)

"Independent" is real deduplication, not a count of rows. Claims sharing a DOI, PMID, or overlapping provenance chain are grouped into one source. Five papers citing the same upstream study count as one source, not five.

The Predicate Algebra

Predicates have three algebraic properties that enable the engine to reason about claims without domain-specific knowledge.

Opposition - involution

opposite(opposite(P)) = P

Some predicates are opposites: activatesinhibits, causesprevents, promotessuppresses. If both (S, P, O) and (S, opposite(P), O) exist, the engine flags a contradiction and counts the evidence on each side.

Composition - sign arithmetic

compose(P1, P2) → P3

Directional predicates compose like multiplication of signs. This is what powers predict() - the engine walks 2-hop causal chains and composes predicates algebraically to discover novel relationships.

First hopSecond hopComposed resultLogic
activatesactivatesactivatespositive × positive = positive
activatesinhibitsinhibitspositive × negative = negative
inhibitsactivatesinhibitsnegative × positive = negative
inhibitsinhibitsactivatesnegative × negative = positive
preventspreventscausesdouble negative

Symmetry

Some predicates are symmetric: if A interacts_with B, then B interacts_with A. Symmetric predicates don't compose - they represent undirected associations, not causal chains.

Walkthrough: The Algebra in Action

A small pharmacology scenario showing how the capabilities compose.

Build a knowledge base

1

Ingest claims from multiple sources

Three independent labs report that Drug X activates Gene A. Two studies report Gene A inhibits Protein B.

Drug X activates Gene A   ← Nature, Cell, Science
Gene A inhibits Protein B   ← PNAS, JBC
2

Corroboration kicks in automatically

The three papers share a content_id because they assert the same triple. Corroboration boost: 1.48x (3 independent sources).

3

A contradicting paper arrives

A fourth paper says Drug X inhibits Gene A. The engine detects: opposite(activates) = inhibits, same entity pair → contradiction. Evidence ratio: 3 vs 1.

what_if("Drug X inhibits Gene A") → contradicted
4

Causal composition discovers a novel prediction

predict("Drug X") walks 2-hop causal chains and composes predicates:

Drug X activates Gene A inhibits Protein B
compose(activates, inhibits) = inhibits

Prediction: Drug X inhibits Protein B   (gap = true, novel)
5

Time-travel reconstructs the state before the controversy

Snapshot at last week: only "activates" exists. what_if("Drug X activates Gene A") returns supported. Snapshot at today: contradiction exists. Same query returns contested.

No ML model. No training data. No statistical inference. The prediction falls directly out of the composition table. The contradiction falls out of the opposition relation. The corroboration falls out of the dual identity system. Every capability is a consequence of the data structure.

Temporal Decay

Confidence decays exponentially at query time. The stored claim is never modified.

effective_confidence = confidence × 0.5(age / half_life)

Half-lives are configurable per predicate. Operational facts (has_status) decay in 30 days. Durable science (inhibits, binds) decays in 730 days. A fact corroborated by 50 old sources and 1 fresh source may have the fresh source dominate effective confidence - without anyone deleting or updating anything.

Twelve capabilities from one structure.

Each one is a moment, not a feature. They compose because they all operate on the same 7-tuple.

Corroboration
0.62 0.91

Three independent sources said the same thing. Confidence rose.

Contradiction
$500K $450K 3:1 evidence

Both surface, weighted. The disagreement is the answer.

Causal Prediction
A B C A→C novel

Two-hop composition discovers an edge nobody wrote down.

Temporal Decay
2020: 0.40  today: 0.94

Old facts weigh less at query time. The claim never mutates.

Provenance Tracing
Answer claim claim source

Every reply is reverse-traceable to the document it came from.

Gap Analysis
A B  ·  A C  ·  A ?

Detect the missing edges between entities you already know.

What-if
what_if("X inhibits Y") contradicted

Test a hypothesis against existing evidence without ingesting it.

Time-travel
db.at("2024-06-01").ask(...)

Re-run any query against any point in history.

Graph Topology
PageRank · Betweenness · Communities

All derived from the claim log. No separate graph store.

Regime Detection
Mar '24

Find inflection points where the rate of new claims changes.

Entity Resolution
Acme · Acme Corp · Acme, Inc same

Variants merge, aliases align, cross-system IDs union-find.

Namespaces
tenant A | tenant B

Disjoint claim spaces, with RBAC inherited from source.

Composition Patterns

These capabilities are individually useful. Their real power is in composition.

Corroborated Causal Prediction

"Find predictions where each step is independently corroborated, and the predicted relationship doesn't already exist." This is the core drug repurposing pattern: Gene A activates Protein B (8 papers) and Protein B inhibits Disease C (3 trials). The predicted Gene A → Disease C is high-confidence because each step is well-sourced.

Historical Contradiction Resolution

"When did this controversy start, and has subsequent evidence resolved it?" Compare snapshots to trace the timeline: at T1 only one side exists; at T2 the opposition appears; at T3 new corroboration shifts the evidence ratio. Provenance tracing identifies which sources drove each phase.

Namespace-Scoped Prediction

"Run predictions within a tenant's data, respecting sensitivity levels." A pharmaceutical company's predictions draw only from their own namespace plus public claims. Predictions requiring restricted data from another tenant are simply invisible - the algebra operates on a reduced but correct claim space.

The Fundamental Insight

Traditional databases store facts and trust them. A claim-native database stores assertions about facts - each carrying provenance, confidence, and a timestamp.

This inversion lets the system reason about why it believes something (provenance), how strongly (confidence × corroboration), whether that belief is contested (contradiction detection), what it might imply (causal composition), and when the belief changed (temporal analysis).

A traditional database could implement any one of these as a feature. But the claim-native model enables arbitrary composition because all 12 capabilities operate on the same underlying structure - the immutable, timestamped, provenanced claim.

From algebra to production.

The same 7-tuple powers every capability. Try the live demo, or pip install and start ingesting in 60 seconds.

Try the live demo Read the quickstart