Releases: omic/attest
v0.1.41 — Temporal Analytics
What's New
Temporal analytics — db.at(timestamp) now exposes the full analytics layer, not just query() and stats().
snapshot = db.at(timestamp)
snapshot.what_if(("KRAS", "gene"), ("activates", "relation"), ("MEK", "gene"))
snapshot.predict("BRCA1")
snapshot.evolution("TP53")
snapshot.knowledge_health()
# ... all analytics methods work on point-in-time stateArchitecture
TemporalStoreView proxy filters claim-returning store methods by timestamp. AnalyticsEngine(snapshot) works transparently — zero changes to the analytics engine itself. Every analytics method automatically operates on point-in-time state.
Benchmarked
Proxy overhead: <0.5µs per call, +3.3% on compounded access patterns (statistically not significant at p>0.05).
Full Changelog: v0.1.40...v0.1.41
v0.1.40 — Enterprise pipeline
What's New
- Enterprise provenance:
project,agent_id,source_version,labelsfields on Provenance struct (Rust + Python) - LegacyProvenance fallback: backward-compatible bincode deserialization for databases created before namespace/provenance fields
- Discovery pipeline: schema sampler, analyzer, aligner, claim templates, drift detection, schema versioning
- Calibration engine: prediction log, adaptive threshold engine, data quality tracker, feedback loop
- Review API: human review queue, bulk approve, MCP tools for conversational review
- Entity resolution: fuzzy/exact/domain matching, materialized views, ingestion hooks, CDC
- Unified query: query decomposer, conflict resolver, source authority matrix
- Access control: ACL sync, provenance-based policy engine, security middleware
- Audit layer: tamper-evident SHA-256 hash chain, SOC 2 export, SIEM webhook
- Extraction pipeline: unstructured claim extraction (email, Slack, QBR), entity linker, claim normalizer
- Resilience: circuit breakers, dead letter queues, rate limiter, idempotency store, source health tracker
- Claim type taxonomy: 32 hierarchical types with runtime extension
- CLI:
attest discovercommand for schema discovery - Drift check job: scheduled drift detection with auto-resolve and circuit breaker
Full Changelog
v0.1.39 — Launch CLI
New CLI commands: quickstart, mcp-config, doctor, trial, upgrade, share, stats, telemetry. 10 authored skill templates. ~12µs queries. 106 MCP tools.
v0.1.38 — Launch CLI
New CLI commands: quickstart, mcp-config, doctor, trial, upgrade, share, stats, telemetry.
10 authored skill templates. Bundled sample data. ~12µs queries. 106 MCP tools.
v0.1.37 — Fix MCP server crash on clean install
Bug fix
Fixed ModuleNotFoundError: No module named 'attestdb.mcp_tools_learning' that crashed attest-mcp on clean pip install. Enterprise-only modules (mcp_tools_learning, mcp_tools_viz, mcp_tools_autonomous, mcp_tools_analysis) are now guarded with try/except ImportError.
Also includes (from v0.1.36)
attest brain install— personal knowledge system for AI agents- Proactive MCP server instructions (tells agents to USE the brain tools)
- MCP server name changed from "attest" to "brain" (fixes Claude Code /doctor errors)
pip install -U attestdb
attest brain installFull changelog: v0.1.36...v0.1.37
v0.1.36 — Attest Brain
Attest Brain — personal knowledge system for AI agents
Give Claude Code, Cursor, OpenClaw, and any MCP-compatible agent a persistent brain that gets smarter every session.
pip install attestdb
attest brain installWhat's new
attest brain install— one command to install the brain into your coding tools (Claude Code, Cursor, Windsurf, Codex, Gemini CLI)attest brain status— view brain statistics (claims, entities, sessions, knowledge breakdown)attest brain uninstall— clean removalattest-brain— standalone CLI entry point
What the brain does
- Session recall — prior knowledge injected at session start
- Pre-edit warnings — known bugs surface before you edit a file
- Post-test fixes — prior solutions appear when tests fail
- Negative results — records what didn't work so nobody repeats the search
- Confidence scoring — every fact has a 0-1 score that updates with evidence
- Gap detection — finds what the brain doesn't know
Landing page
Full changelog: v0.1.35...v0.1.36
v0.1.35 — pip install attestdb now auto-installs Rust engine
What's New
One-command install
pip install attestdb now automatically installs attest-py (the Rust storage engine) as a dependency. No more ModuleNotFoundError: No module named 'attest_rust'.
Quality of life
- Downgraded "Unknown entity_type" warnings to DEBUG level — clean output for new users
- Performance regression tests (8 tests verifying ask <500ms, search <10ms)
- MCP tool cleanup: 4 uncapped claims_for calls fixed
- LIVE indicator on demo search inputs
- Updated PyPI descriptions and keywords
Full Changelog
v0.1.34 — Enterprise RBAC, Rust neighbors(), 3D graph labels
What's New
Enterprise RBAC (Group-Based Access Control)
- Groups & memberships:
db.create_group(),db.add_to_group()— team-based access - Declarative policies:
db.add_policy()— allow/deny rules per group/namespace/predicate - Entitlement resolution: principal → groups → policies → effective access
- SecureStoreProxy: wraps Rust store, filters ALL claim-returning methods
- 6-level sensitivity: SHARED → PUBLIC → INTERNAL → CONFIDENTIAL → RESTRICTED → REDACTED
- JWT + SAML auth: API middleware resolves user identity per request
- Audit logging: group_created, member_added, policy_created, access_denied events
- 29 security review findings fixed (5 CRITICAL, 8 HIGH, 10 MEDIUM)
Rust-native neighbors()
store.neighbors(entity_id)returns neighbor IDs from adjacency index- 11,020 neighbors in 3ms (no claim materialization)
Demo improvements
- 3D force-graph with HTML overlay labels (DOM-based, works everywhere)
- 2D force-graph with d3-force collision detection
- Stronger charge repulsion, circular initial positions
Full Changelog
v0.1.33 — Rust neighbors(), predicate composition, security fixes
What's New
Rust-native neighbors() method
store.neighbors(entity_id)returns neighbor IDs from adjacency index — no claim materialization- KRAS: 11,020 neighbors in 3ms (vs seconds for claims_for)
- Wired into ask engine's bridge finding for O(degree) intersection
Predicate-chain composition
- Bridges now compose predicates:
A --[inhibits]--> X --[causes]--> B→ inferred:A prevents B - Uses
PREDICATE_COMPOSITIONtable (41 rules) - Evidence shows composed relationship in citations
Security fixes
- XSS: 6 innerHTML points in legal search results now escaped via
esc() _safe_claims_forfallback always caps at 500 (was unbounded on old wheels)
Code quality
compose_predicatesandEntitySummarymoved to module-level imports- Exception logging added to
_get_llm_clientfallback path
Full Changelog
v0.1.32 — V2 ask engine (45s → 2.5s), predicate-weighted bridges
What's New
V2 Ask Engine (45s → 2.5s on 85M claims)
- Entity-first retrieval: exact match → single-word BM25 → LLM extraction (replaces word-by-word BM25 scanning that took 30-40s)
- Neighborhood intersection: sample neighbors of both entities, intersect sets to find bridges. O(sample_a + sample_b) — no BFS needed
- Predicate-weighted bridge scoring:
inhibits/binds=1.0,associated_with=0.1. Score = weight_a × weight_b _llm_call_via_requests(): usesrequestslibrary directly instead ofopenai/httpx (avoids asyncio deadlock in web servers)
Performance
- Rust
claims_for(limit=N): stops materialization at Rust level (was deserializing ALL claims then slicing in Python) - 18 uncapped
claims_for()calls fixed across query_engine, topic_threads, mcp_server - Hub entity filtering: entities with >100K claims are filtered from bridges (Inflammation, Protein, Calcium bridge everything)
- BM25 skip list: common bio terms like "disease" (9s BM25 scan) are skipped in entity resolution
Bug Fixes
claim_from_dict():display_namenow falls back tonamefield (fixes empty names for SemMedDB entities)- Entity name resolution:
_entity_name()helper checksdisplay_name→name→ fallback