# TrustRank (Reputation)

**Last Updated:** 2026-02-01
**Confidence:** High
**Status:** Implemented in `stemedb-storage` v0.1.0

## Summary

TrustRank is a reputation system for agent credibility. Agents who make accurate claims gain reputation; agents who contradict settled truth lose reputation.

**Key Facts:**
- Stored in `TR:{AgentId}` key in KV store via `TrustRankStore` trait
- Scores bounded to [0.0, 1.0], default 0.5 for new agents
- Used by `TrustAwareAuthorityLens` to weight assertions
- Confidence decays over time (30-day half-life by default)

**File Pointer:** `crates/stemedb-storage/src/trust_rank_store.rs`

## TrustRank Record

```rust
pub struct TrustRank {
    pub agent_id: [u8; 32],
    pub score: f32,           // 0.0 to 1.0
    pub last_updated: u64,    // Unix timestamp
    pub assertions_count: u64,
    pub accuracy_count: u64,
}
```

## How It Works

### Score Updates

```rust
// Record an outcome for an agent
trust_store.record_outcome(&agent_id, was_accurate, timestamp).await?;

// Accurate prediction: +0.05 (capped at 1.0)
// Inaccurate prediction: -0.1 (floored at 0.0)
// Higher penalty for inaccuracy discourages spam
```

### Confidence Decay

```rust
// Apply time-based decay to all scores
trust_store.decay_trust_ranks(current_timestamp, Some(custom_half_life)).await?;

// Default half-life: 30 days
// Score approaches 0.5 (neutral) over time without activity
```

### Usage in TrustAwareAuthorityLens

```rust
use stemedb_lens::TrustAwareAuthorityLens;
use stemedb_storage::{HybridStore, GenericTrustRankStore};
use std::sync::Arc;

let store = HybridStore::open("./data")?;
let trust_store = Arc::new(GenericTrustRankStore::new(store));
let lens = TrustAwareAuthorityLens::new(trust_store);

let resolution = lens.resolve_async(&candidates).await;
// Winner = assertion with highest (confidence * trust_rank)
```

**Resolution Strategy:**
1. For each candidate, lookup signer's TrustRank (O(1))
2. Calculate: `weighted_score = assertion.confidence * agent.trust_rank`
3. Return assertion with highest weighted score
4. Tiebreaker: most recent timestamp
5. Unsigned assertions treated as 0.0 trust

## Score Interpretation

| Score | Meaning |
|-------|---------|
| 0.0-0.3 | Unreliable (history of inaccuracy) |
| 0.3-0.5 | Below neutral (more wrong than right) |
| 0.5 | Neutral (new agent or unknown) |
| 0.5-0.7 | Above neutral (more right than wrong) |
| 0.7-1.0 | Reliable (strong track record) |

## API Access

**Via LensDto:**
- `lens=Authority` → Routes to `TrustAwareAuthorityLens`
- `lens=TrustAwareAuthority` → Routes to `TrustAwareAuthorityLens`
- `lens=Confidence` → Uses confidence field only (no TrustRank)

## Related Topics

- [Lens](../services/lens.md) - TrustAwareAuthorityLens integration
- [Assertion](../services/assertion.md) - Signature and agent_id fields
