Obscura is an early-release library. Its stable profiles have governed contracts and current benchmark evidence, but the project does not yet claim universal production readiness, regulatory compliance, or complete Presidio parity.
The 0.1.x compatibility promise applies only to modules and functions listed
in docs/public-api-stability.md. Low-level model adapters, evaluation
tooling, and internal implementation modules can change independently of that
surface.
Detection
:fastis precise but misses arbitrary prose names, locations, organizations, and free-form addresses.- Stable
:balancedand:accuratedepend on general NER models. They still miss entity types outside their label taxonomies and can produce model-specific false positives. - Experimental
:hybrid_gliner_urchadeis the public CPU-only general NER option, but it has lower exact F1 than:balancedon all three shared datasets. Its recommendation is for CPU portability and a clearer model provenance chain, not superior accuracy. - Stable
:accuratehas slightly higher exact F1 than:balancedon all three authoritative datasets, but uses two models and has materially higher latency and memory cost. - Experimental
:openmed_piiis specialized for Nemotron/OpenMed-style PII. It performs substantially worse on broad Presidio-style datasets and has high/tail-heavy latency. On the refreshed Apple/Emily host, Nemotron p95 reached roughly6.67 secondsat concurrency4, and warm runs observed transient process RSS up to48.303 GiBand Emily allocator statistics up to41.293 GiB. These peaks occurred in different runs and must not be summed. - The historical soak classifier labels the 30-minute OpenMed C4 run as allocator caching rather than a probable leak: live Emily memory returned to baseline and cache clearing succeeded. That finite result does not prove bounded production-duration growth. OpenMed memory remains inconclusive for release decisions. Large headroom and strict admission control remain required.
- Ten-minute
:fastand:balancedmemory results are inconclusive under the conservative growth classifier.:fastlatency is stable;:balancedthroughput and tail latency degrade in later windows. The slowdown is localized to fixed-shape Emily model serving, but direct GPU power/frequency/utilization evidence is unavailable without privileged macOS tooling. - Exact byte spans remain the anonymization contract. IoU metrics can identify near-boundary model matches but do not make an incorrect exact span safe.
- Context enhancement changes scores or gates existing candidates; it does not create broad NER coverage.
- Parser-backed phone detection is optional and region-dependent.
- Built-ins do not cover every jurisdiction, secret type, or industry ID.
Models, Assets, and Licensing
- No model weights or external datasets ship in the Hex package.
- Analyzer/redaction calls never download models. Preparation is explicit.
- TNER license status is not established by Obscura. Stable profile status does not license the optional checkpoint; deployers must review and accept all applicable asset terms.
- The Apache-licensed Urchade GLiNER candidate has reproducible native Ortex
support, but exact F1 is lower than
:balancedon all three authoritative datasets. The Obscura Ortex fork can verify CoreML provider assignment, but the dynamic Urchade graph falls back heavily to CPU and measured57.10xslower warm inference than the CPU provider. CoreML does not expose a strict GPU-only mode. The candidate and its CoreML path remain experimental. - Jean-Baptiste uses a tokenizer fallback from
FacebookAI/roberta-large; both model and tokenizer terms must be reviewed. - OpenMed Privacy Filter license metadata is not a clear production grant.
- Emily is validated on Apple Silicon for development/benchmarking, not as a universal deployment backend.
- EXLA presence does not prove GPU execution.
- Linux/EXLA operational load evidence has not been executed. Current capacity recommendations apply only to the measured Apple M4 Max/Emily environment.
- Advanced GLiNER, Ortex, and historical NER profiles are not stable product
profiles.
:hybrid_gliner_urchadeis the only public experimental GLiNER product profile. :balancedand:accurateare stable profile contracts with external asset licensing delegated to the deployer.:hybrid_gliner_urchadeand:openmed_piiremain experimental.- Model preparation is bounded and observable, but byte totals are unavailable when an upstream response omits content length or while work is CPU/GPU model deserialization rather than file transfer. Stage transitions remain visible, and callers must size the overall and inactivity timeouts for their hardware.
- Interrupted unreferenced files are retained under
.obscura-quarantinefor diagnosis. They are excluded from the active cache but continue to consume disk until an operator removes them under an appropriate retention policy. - Per-profile preparation is serialized within the connected Erlang node set. Independent disconnected nodes still require deployment-level coordination when they share a writable model cache.
Privacy and Operations
- Reports and telemetry omit raw values by default, but callers remain responsible for logs produced before Obscura receives data.
- Analyzer results contain detected source text when
include_text: true. Value-safe default inspection does not change explicit field access or serialization throughMap.from_struct/1. - Vault rehydration intentionally stores raw values in memory or ETS until the caller clears/stops the vault.
- Clearing/stopping a vault drops accessible references and removes private ETS tables, but BEAM and native memory cannot be guaranteed zeroized.
- Memory and ETS vaults are reversible, session-scoped stores. They are not encrypted persistent secret stores and do not protect against VM administrators, tracing tools, debuggers, or hostile code running in the same VM.
- Custom recognizers, operators, language detectors, telemetry handlers, and model dependencies are trusted application/runtime code and can independently log or transmit values they receive.
- Logger and Plug helpers cannot redact entities that configured recognizers miss. Callers must evaluate their own data and downstream sinks.
- Security reports use GitHub Private Vulnerability Reporting. Reporters need
a GitHub account, and the project does not promise a response or remediation
SLA. See
SECURITY.md. - No encrypted persistent vault or Ecto storage backend is provided.
- Obscura does not ship Google, Azure, Ollama, or generic HTTP recognizers.
Applications needing an external service must implement and validate a custom
Obscura.Recognizerintegration, including retention, authentication, failure, and compliance policies. - Stream support covers token rehydration, not a complete distributed stream processing system.
Scope
- No OCR, image, PDF, DICOM, or document-layout redaction is implemented.
- No standalone HTTP service or Phoenix application is required or bundled.
- No provider-specific LLM SDK is bundled.
- No encryption anonymizer operator is implemented.
- Secure hash mode prevents identical replacements by using a fresh random salt, but hashing remains irreversible and low-entropy inputs may still be guessed. Deterministic hash mode intentionally reveals equality and requires an explicit salt of at least 16 bytes.
- Structured offsets are byte offsets within each string leaf, not offsets in a serialized document.
Current metrics and dataset-specific caveats are in
docs/benchmark-status.md. Optional setup is in
docs/optional-dependencies-and-assets.md. Security boundaries and accepted
risks are in docs/security-threat-model.md. Operational capacity, memory,
latency, and sustained-load conclusions are summarized in
docs/benchmark-status.md.