Skip to content

Releases: quantumpipes/vault

v0.15.0 — Final Mile Security (100/100)

07 Apr 04:20

Choose a tag to compare

6 security fixes that close the gap from 88/100 to 100/100. Required by Sitecast Wizard for full compliance.

Install / Upgrade

pip install --upgrade qp-vault
pip install "qp-vault[postgres,capsule]>=0.15.0"  # Wizard requirement

Security Fixes

Membrane Now Blocks Dangerous Content (+3 pts)

vault.add("ignore all previous instructions")
# FAIL: raises VaultError("Content rejected by Membrane screening")

# Flagged content is quarantined, not accessible via get_content()
vault.get_content(quarantined_id)
# raises VaultError("Resource is quarantined by Membrane screening")

PostgreSQL SSL by Default (+3 pts)

# SSL enabled automatically (no config needed)
vault = Vault.from_postgres("postgresql://user:pass@host/db")

# Explicit disable (dev only):
# postgresql://user:pass@host/db?sslmode=disable

New config: postgres_ssl (default True), postgres_ssl_verify (default False).

SQLite File Permissions (+2 pts)

New databases created with 0600 (owner-only read/write). WAL and SHM journal files also restricted.

Adversarial Status Persisted from Membrane (+2 pts)

Quarantined resources automatically get adversarial_status=SUSPICIOUS written to the database. No more in-memory-only tracking.

Provenance Self-Sign Trusted (+1 pt)

Self-signed provenance attestations now have signature_verified=True instead of False. If we just signed it, we trust our own signature.

ML-KEM-768 FIPS KAT (+1 pt)

from qp_vault.encryption.fips_kat import run_all_kat

results = run_all_kat()
# {"sha3_256": True, "aes_256_gcm": True, "ml_kem_768": True}

Roundtrip + tampered-ciphertext Known Answer Test for FIPS 203 compliance.

Stats

  • 520 tests passing
  • 0 mypy errors (strict mode)
  • 0 ruff errors
  • 100/100 security score (vault + consumer)

Full changelog

v0.14.0 — Government-Grade Hardening

07 Apr 03:46

Choose a tag to compare

Security hardening to 100/100. Tenant lock enforcement. Query timeouts. Response caching.

Install / Upgrade

pip install --upgrade qp-vault
pip install qp-vault[all]              # Everything
pip install qp-vault[encryption,pq]    # Full post-quantum crypto

What's New

Tenant Lock Enforcement

vault = Vault("./knowledge", tenant_id="site-123")

vault.add("doc")                          # auto-injects tenant_id="site-123"
vault.search("query")                     # scoped to site-123
vault.add("doc", tenant_id="site-456")    # raises VaultError: tenant mismatch

Query Timeouts

from qp_vault.config import VaultConfig

config = VaultConfig(query_timeout_ms=15000)   # 15 seconds
vault = Vault("./knowledge", config=config)
# Long-running searches are cancelled (not left running)

Health/Status Caching

config = VaultConfig(health_cache_ttl_seconds=60)  # 60s cache
vault = Vault("./knowledge", config=config)
vault.health()   # computed
vault.health()   # cached (until TTL expires or a write invalidates)

Atomic Tenant Quotas

config = VaultConfig(max_resources_per_tenant=1000)
vault = Vault("./knowledge", config=config)
# Quota enforced via atomic COUNT(*), no race condition window

Security Hardening (100/100)

  • Plugin manifest (manifest.json) now required by default
  • FastAPI: limit (1-1000), offset (0-1M), content (500MB max) validated
  • Path traversal: add() rejects paths containing ..
  • ReDoS: Membrane truncates content to 500KB before regex scanning
  • CLI errors: structured codes, no raw exception details
  • Unicode: NFC normalization prevents homograph name collisions
  • Timeouts: cancelled tasks don't leak (proper asyncio cleanup)

Bug Fixes

  • Sync Vault now supports tenant_id and role (was silently ignoring both)
  • mypy strict: 0 errors across 54 source files
  • Abstraction leak: collections use Protocol methods instead of _get_conn()

Stats

  • 520 tests passing
  • 0 mypy errors (strict mode)
  • 0 ruff errors
  • 100/100 security score

Full changelog

v0.13.0 — Government Foundations

07 Apr 01:25
d2a9eac

Choose a tag to compare

RBAC, FIPS self-testing, key zeroization, structured error codes.

Install / Upgrade

pip install --upgrade qp-vault

RBAC

# Reader: search, get, list, verify, health
vault = Vault("./knowledge", role="reader")
vault.search("query")  # OK
vault.add("content")   # PermissionError (VAULT_700)

# Writer: all reader + add, update, delete, transition
vault = Vault("./knowledge", role="writer")

# Admin: all operations
vault = Vault("./knowledge", role="admin")

FIPS Known Answer Tests

from qp_vault.encryption.fips_kat import run_all_kat
results = run_all_kat()  # SHA3-256 + AES-256-GCM

Key Zeroization

from qp_vault.encryption.zeroize import zeroize
key = bytearray(32)
# ... use key ...
zeroize(key)  # Secure erasure via ctypes memset

Structured Error Codes

All exceptions now have machine-readable codes:

  • VAULT_000: General error
  • VAULT_100: Storage error
  • VAULT_200: Verification error
  • VAULT_300: Lifecycle error
  • VAULT_400: Policy error
  • VAULT_500: Chunking error
  • VAULT_600: Parsing error
  • VAULT_700: Permission error (RBAC)

v0.12.0 — Post-Quantum Crypto

08 Apr 23:54

Choose a tag to compare

Post-quantum cryptography delivered. Government-grade hardening.

Install / Upgrade

pip install --upgrade qp-vault
pip install qp-vault[pq]           # ML-KEM-768 + ML-DSA-65
pip install qp-vault[encryption,pq] # Full hybrid encryption

Post-Quantum Crypto (FIPS 203 + 204)

ML-KEM-768 Key Encapsulation

from qp_vault.encryption import MLKEMKeyManager

km = MLKEMKeyManager()
pub, sec = km.generate_keypair()
ciphertext, shared_secret = km.encapsulate(pub)
recovered = km.decapsulate(ciphertext, sec)

ML-DSA-65 Digital Signatures

from qp_vault.encryption import MLDSASigner

signer = MLDSASigner()
pub, sec = signer.generate_keypair()
signature = signer.sign(b"provenance data", sec)
assert signer.verify(b"provenance data", signature, pub)

Hybrid Encryption (ML-KEM-768 + AES-256-GCM)

from qp_vault.encryption import HybridEncryptor

enc = HybridEncryptor()
pub, sec = enc.generate_keypair()
ciphertext = enc.encrypt(b"classified data", pub)
plaintext = enc.decrypt(ciphertext, sec)

Government Hardening

  • Input bounds: top_k max 1000, threshold 0-1, query max 10K chars
  • Batch limited to 100 items per request
  • Plugin hash verification via manifest.json + SHA3-256
  • Tenant-locked vault: Vault(path, tenant_id="x")

Crypto Inventory (Honest)

Algorithm Standard Status
SHA3-256 FIPS 202 Implemented
AES-256-GCM FIPS 197 Implemented
Ed25519 FIPS 186-5 Via qp-capsule
ML-KEM-768 FIPS 203 Implemented (this release)
ML-DSA-65 FIPS 204 Implemented (this release)

v0.11.0 — Complete Operational Surface

06 Apr 23:38
9463fbc

Choose a tag to compare

Complete CLI (15 commands), FastAPI (22+ endpoints), per-tenant quotas, search faceting, storage indexes.

Install / Upgrade

pip install --upgrade qp-vault

New CLI Commands

vault content <id>          # Retrieve full text
vault replace <id> <file>   # Atomic content replacement
vault supersede <old> <new> # Link versions
vault collections           # List collections
vault provenance <id>       # Show provenance chain
vault export <path>         # Export vault to JSON

New API Endpoints

  • GET /resources/{id}/content — full text retrieval
  • GET /resources/{id}/provenance — provenance chain
  • GET /collections + POST /collections — collection CRUD
  • POST /search/faceted — results + facet counts
  • POST /batch — bulk resource import
  • GET /export — vault export

Per-Tenant Quotas

config = VaultConfig(max_resources_per_tenant=1000)
vault = Vault("./knowledge", config=config)

Gap Resolution: 40 of 56

Only 16 gaps remain (all LOW/operational polish).

v0.10.0 — Autonomous AI Intelligence

06 Apr 23:23
945827c

Choose a tag to compare

Intelligence features for autonomous AI systems.

Install / Upgrade

pip install --upgrade qp-vault

Search Intelligence

# Deduplicated results (one per resource, best chunk)
results = vault.search("policy", deduplicate=True)

# Pagination
page2 = vault.search("policy", top_k=10, offset=10)

# Explain mode: see why each result ranked where it did
results = vault.search("policy", explain=True)
# Each result has .metadata["explain"] with scoring breakdown

Knowledge Self-Healing

from qp_vault.integrity.detector import find_near_duplicates, detect_contradictions

# Find semantically similar resources (cosine > 0.85)
near_dupes = find_near_duplicates(resources, chunks_by_resource)

# Find resources with conflicting trust/lifecycle
contradictions = detect_contradictions(resources, chunks_by_resource)

Real-Time Event Streaming

from qp_vault.streaming import VaultEventStream

stream = VaultEventStream()
vault = AsyncVault("./knowledge", auditor=stream)

async for event in stream.subscribe():
    print(f"{event.event_type}: {event.resource_name}")

Telemetry

from qp_vault.telemetry import VaultTelemetry

telemetry = VaultTelemetry()
with telemetry.track("search"):
    results = vault.search("query")
print(telemetry.summary())

Also New

  • Per-resource health: vault.health(resource_id)
  • Import/export: vault.export_vault(path), vault.import_vault(path)
  • Removed [atlas] extra (no implementation existed)

Gap Resolution: 29 of 56

All CRITICALs and HIGHs resolved. Remaining are operational concerns (rate limiting, quotas, telemetry integrations).

v0.9.0 — Content Immune System

08 Apr 23:54

Choose a tag to compare

Content screening, CLI expansion, batch import, PostgreSQL parity.

Install / Upgrade

pip install --upgrade qp-vault

What's New

Content Immune System (CIS)

Content is now screened before indexing:

  • Innate scan: Regex-based detection of prompt injection, jailbreak, XSS, code injection
  • Release gate: Risk-proportionate decision (pass/quarantine/reject)
  • Quarantined content gets ResourceStatus.QUARANTINED

New CLI Commands

  • vault health — health score
  • vault list — list resources with filters (trust, layer, tenant)
  • vault delete — soft/hard delete
  • vault transition — lifecycle state changes
  • vault expiring — expiration alerts

Batch Import

resources = vault.add_batch(["doc1.md", "doc2.md", "doc3.md"], trust="working")

PostgreSQL Parity

  • adversarial_status, tenant_id columns
  • provenance table
  • Missing indexes for classification, resource_type, tags

Gap Resolution: 21 of 56 resolved

All 10 CRITICALs now addressed across v0.6.0-v0.9.0.

v0.8.0 — Encryption, Embedders, Docling

06 Apr 22:15
5b81921

Choose a tag to compare

All previously-advertised features are now delivered.

Install / Upgrade

pip install --upgrade qp-vault

What's New

Encryption at Rest

from qp_vault.encryption import AESGCMEncryptor

enc = AESGCMEncryptor()  # Generates random 256-bit key
ciphertext = enc.encrypt(b"secret data")
plaintext = enc.decrypt(ciphertext)

Install: pip install qp-vault[encryption]

Built-in Embedding Providers

from qp_vault.embeddings.noop import NoopEmbedder        # Text-only (explicit)
from qp_vault.embeddings.sentence import SentenceTransformerEmbedder  # Local, air-gap
from qp_vault.embeddings.openai import OpenAIEmbedder     # Cloud

Install: pip install qp-vault[local] or pip install qp-vault[openai]

Docling Document Parser

25+ format processing: PDF, DOCX, PPTX, XLSX, HTML, images, and more.
Install: pip install qp-vault[docling]

Plugin Hooks

PluginRegistry.fire_hooks() now invocable for lifecycle events.

Gap Resolution Progress

Status Count
Resolved 16 of 56
Remaining CRITICALs 1 (CIS pipeline, v0.9.0)

v0.7.0 — Multi-tenancy

06 Apr 21:27
3bff7d8

Choose a tag to compare

Multi-tenancy support, collection CRUD, and capsule auto-detection.

Install / Upgrade

pip install --upgrade qp-vault

What's New

  • Multi-tenancy: tenant_id parameter on add(), list(), search(), and all public methods
  • Collection CRUD: vault.create_collection(), vault.list_collections()
  • Capsule auto-detect: if qp-capsule is installed, CapsuleAuditor is used automatically

Multi-tenancy Usage

# Add with tenant isolation
vault.add("SOP content", tenant_id="site-123", trust="canonical")

# Search scoped to tenant
results = vault.search("incident response", tenant_id="site-123")

# List scoped to tenant
resources = vault.list(tenant_id="site-123")

Full Changelog

https://github.com/quantumpipes/vault/blob/main/CHANGELOG.md

v0.6.0 — Sitecast Unblock

06 Apr 20:46
87024ee

Choose a tag to compare

Fixes 7 gaps found during Sitecast Wizard integration (first production consumer).

Install / Upgrade

pip install --upgrade qp-vault

What's Fixed

  • Freshness decay: Search ranking now uses actual document age (was hardcoded to 1.0)
  • Layer search_boost: OPERATIONAL layer gets 1.5x boost as intended
  • Adversarial status: Persisted in database (was lost on restart)
  • Provenance records: Persisted in database (was lost on restart)
  • README honesty: Removed claims about undelivered encryption/docling features

What's New

  • vault.get_content(resource_id) — retrieve full text content
  • vault.replace(resource_id, new_content) — atomic content replacement with auto-supersession
  • vault.get_provenance(resource_id) — retrieve provenance records
  • vault.set_adversarial_status(resource_id, status) — persist verification status
  • SearchResult now includes updated_at, resource_type, data_classification

Stats

  • 448 tests passing
  • Lint clean (ruff)
  • Python 3.12, 3.13, 3.14