Releases: quantumpipes/vault
v0.15.0 — Final Mile Security (100/100)
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 requirementSecurity 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=disableNew 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)
v0.14.0 — Government-Grade Hardening
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 cryptoWhat'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 mismatchQuery 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 windowSecurity 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
asynciocleanup)
Bug Fixes
- Sync
Vaultnow supportstenant_idandrole(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
v0.13.0 — Government Foundations
RBAC, FIPS self-testing, key zeroization, structured error codes.
Install / Upgrade
pip install --upgrade qp-vaultRBAC
# 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-GCMKey Zeroization
from qp_vault.encryption.zeroize import zeroize
key = bytearray(32)
# ... use key ...
zeroize(key) # Secure erasure via ctypes memsetStructured 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
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 encryptionPost-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
Complete CLI (15 commands), FastAPI (22+ endpoints), per-tenant quotas, search faceting, storage indexes.
Install / Upgrade
pip install --upgrade qp-vaultNew 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 JSONNew API Endpoints
GET /resources/{id}/content— full text retrievalGET /resources/{id}/provenance— provenance chainGET /collections+POST /collections— collection CRUDPOST /search/faceted— results + facet countsPOST /batch— bulk resource importGET /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
Intelligence features for autonomous AI systems.
Install / Upgrade
pip install --upgrade qp-vaultSearch 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 breakdownKnowledge 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
Content screening, CLI expansion, batch import, PostgreSQL parity.
Install / Upgrade
pip install --upgrade qp-vaultWhat'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 scorevault list— list resources with filters (trust, layer, tenant)vault delete— soft/hard deletevault transition— lifecycle state changesvault expiring— expiration alerts
Batch Import
resources = vault.add_batch(["doc1.md", "doc2.md", "doc3.md"], trust="working")PostgreSQL Parity
adversarial_status,tenant_idcolumnsprovenancetable- 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
All previously-advertised features are now delivered.
Install / Upgrade
pip install --upgrade qp-vaultWhat'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 # CloudInstall: 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
Multi-tenancy support, collection CRUD, and capsule auto-detection.
Install / Upgrade
pip install --upgrade qp-vaultWhat's New
- Multi-tenancy:
tenant_idparameter onadd(),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
Fixes 7 gaps found during Sitecast Wizard integration (first production consumer).
Install / Upgrade
pip install --upgrade qp-vaultWhat'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 contentvault.replace(resource_id, new_content)— atomic content replacement with auto-supersessionvault.get_provenance(resource_id)— retrieve provenance recordsvault.set_adversarial_status(resource_id, status)— persist verification statusSearchResultnow includesupdated_at,resource_type,data_classification
Stats
- 448 tests passing
- Lint clean (ruff)
- Python 3.12, 3.13, 3.14