| Crates.io | frame-sentinel |
| lib.rs | frame-sentinel |
| version | 0.2.0 |
| created_at | 2025-12-22 22:14:56.915916+00 |
| updated_at | 2026-01-08 05:34:14.404716+00 |
| description | Multi-dimensional trust scoring and relationship management for AI systems |
| homepage | |
| repository | https://github.com/Blackfall-Labs/frame-sentinel |
| max_upload_size | |
| id | 2000371 |
| size | 134,525 |
CRITICAL: Single scalar trust is dangerous and attackable. This crate provides orthogonal trust dimensions and policy-based access control.
Extracted from the Frame microservices architecture.
Attacker with good deepfake voice:
voice_similarity: 0.95 ✅
typing_similarity: N/A (no data)
location_consistency: 0.3 ❌
→ Overall trust: 0.6 (gets Verified!) 🚨
Legitimate user with new mic:
voice_similarity: 0.65 (different mic) ❌
typing_similarity: 0.95 ✅
location_consistency: 0.98 ✅
→ Overall trust drops unfairly 🚨
Track 6 independent trust dimensions:
[dependencies]
sam-trust = "0.1.0"
frame-sentinel depends on:
frame-sentinel
└── frame-catalog (database, embeddings)
Used by: frame-identity (trust integration)
Position in Frame ecosystem:
frame-catalog
└→ frame-sentinel
└→ frame-identity
use sam_trust::{TrustScoreManager, TrustLevel};
// Initialize trust tracking
let manager = TrustScoreManager::new("trust.db")?;
// Record successful authentication
manager.record_successful_auth("user123")?;
// Check trust level
let trust = manager.get_trust_score("user123")?;
println!("Trust: {:?} ({:.2})", trust.level, trust.score);
Users must prove identity over time:
Define per-operation requirements:
use sam_trust::{TrustPolicy, TrustDimension, TrustCondition, PolicyMode};
// InnerCircle operation (all conditions required)
let policy = TrustPolicy {
mode: PolicyMode::All,
conditions: vec![
TrustCondition::new(TrustDimension::Voice, 0.9),
TrustCondition::new(TrustDimension::Location, 0.8),
TrustCondition::new(TrustDimension::Relationship, 0.7),
],
};
// Normal access (any 2 of 3)
let policy = TrustPolicy {
mode: PolicyMode::AtLeast(2),
conditions: vec![
TrustCondition::new(TrustDimension::Voice, 0.7),
TrustCondition::new(TrustDimension::Typing, 0.7),
TrustCondition::new(TrustDimension::Device, 0.8),
],
};
Track social connections with transitive inference:
use sam_trust::{RelationshipGraph, RelationType};
let mut graph = RelationshipGraph::new();
// Direct relationships
graph.add_relationship("sam", "magnus", RelationType::Creator);
graph.add_relationship("magnus", "john", RelationType::Sibling);
// Infer transitive relationships
let relationships = graph.get_all_relationships("sam", "john");
// Returns: [Uncle] (creator → sibling → uncle)
rusqlite (0.31) - Trust score persistenceframe-catalog - Database trait for relationship storagebincode (1.3) - Baseline voice pattern serializationMIT - See LICENSE for details.
Magnus Trent magnus@blackfall.dev