v0.8.1
gaze v0.8.1 — reversibility as the new default
TL;DR
v0.8.1 makes reversible pseudonymization the default safety-net behavior. When Pass-3 SafetyNet flags a suspect leak, the pipeline now attempts to promote the suspect to a manifest entry first (--safety-net-mode resolve), and only strips the span (--safety-net-fallback redact) if that promotion fails closed. Adopters who want hard-fail semantics keep opting into --safety-net-mode strict.
This is a minor release that ships behind the v0.8.0 manifest contract — bundle_version for SafeBundle adopters bumps from 1 to 2, but no breaking API changes in gaze, gaze-recognizers, gaze-audit, or gaze-mcp-*. v0.8.0 adopters can upgrade in place. If you're upgrading from v0.7.x: read UPGRADE.md first — v0.8.0 already flipped several defaults that v0.7.x users do not see in this CHANGELOG entry alone.
Defaults changed
--safety-net-mode resolveis the new default (wasstrict). Reversibility-first; falls back toredacton resolve failure. Strict mode is still available for hard-fail deployments via--safety-net-mode strict. Tolerant mode remains dev-only behindGAZE_ALLOW_TOLERANT=1opt-in. (Axes 1, 2.)--safety-net-fallback redactis the new default for the new fallback flag. Emits a:Redact_token and a typedFallbackReasonaudit row when SafetyNet promotion cannot complete. (Axes 1, 2.)- The published release binary now bakes
--features proxysogaze proxy {serve,start,stop,status,logs,restart}works without rebuild. Source builds are unchanged. (Axis 5.)
Example: keep the old behavior explicitly with
gaze clean --safety-net-mode strict --safety-net-fallback none input.txtHighlights
- SafetyNet
resolve+redact+ fallback flag impl (#223, axes 1+2+4). Suspect spans flagged by SafetyNet are now promoted to custom-recognizer matches and rejoin conflict resolution. On promotion failure (ValidatorVeto,AnchorMissing,OverlapConflict,ResidualSuspect), the typed fallback path kicks in — no more silent passthrough, no irreversible strip without a typed reason in the audit log. - gaze-document layout report v2 (#219 + #222, axis 1). Vector-PDF text-extraction fallback when PDFs have selectable text; multi-column segmentation in the post-processor; per-page confidence + low-confidence flagging against
low_confidence_threshold; table-cell preservation in markdown output; rotation/deskew preprocessing before OCR. SafetyNet has more structured text to work with, less to reconstruct. OcrBackendsingle-trait single-impl (#218 + #224, axes 4+5).gaze-documentnow exposes one OCR contract. Second-party backends (ocrs, Apple Vision, PaddleOCR) can slot in cleanly. LegacyOcrAdaptershims removed; magic-byte validation at theclean_with_ocr_backendboundary is now mandatory and fails closed viaDocumentError::UnsupportedInput.- Kiji model-SHA integrity (#221, axes 1+4). The
KijiDistilbertSafetyNetbackend's DistilBERT bundle SHA256 is pinned and verified at backend init. Mismatch fails closed viaSafetyNetError::ModelIntegrityMismatch { expected, actual }. Direct-vs-observer benchmark harness shipped; metric fields staynulluntil populated on a machine with the local Kiji runtime — gaze does not publish uncited benchmark numbers.
Schema changes
- SafeBundle
BundleReport.bundle_versionbumps1 → 2. New per-page fields:ocr_source,ocr_backend,confidence,low_confidence,column_count,page_index. New top-level field:low_confidence_threshold. v1 bundles continue to parse on read; new emission is always v2. Adopter-tooling-reading SafeBundle JSON must handle the v2 field set. gaze-auditrow schema delta: new nullable columnfallback_triggered: Option<FallbackReason>. Closed-enumFallbackReasonvariants:OverlapConflict,ValidatorVeto,AnchorMissing,ResidualSuspect. The existingdecided_bycolumn gains new variants:Redact,Resolve,Fallback. The column is nullable on pre-migration rows; existing queries continue to work.
Known limitations
- Kiji
cargo benchharness ships withnullmetric fields. Populating them requires a local Kiji runtime + pinned model directory. Axis 4: gaze does not publish uncited benchmark numbers. - Multi-backend SafetyNet bench (Kiji vs OpenAI Privacy Filter vs OpenMed) is a v0.9 thread, not v0.8.x.
Adopter notes
- Upgrading from v0.7.x? Read UPGRADE.md. Multi-hop migrations require attention to defaults that flipped at v0.8.0 and again at v0.8.1.
- Downstream tooling reads SafeBundle JSON? Handle the
bundle_version=2field. v1 reads work; v2 emission is non-optional. - You query the audit log? The new
fallback_triggeredcolumn is nullable on existing rows; newdecided_byvariants are closed-enum. - Custom OCR via
OcrAdapter? Port toOcrBackend(object-safe, same shape). - Pipeline expected
--safety-net-mode strictas default? Pass the flag explicitly.
Download
- aarch64-darwin:
gaze-v0.8.1-aarch64-apple-darwin.tar.gz - x86_64-linux:
gaze-v0.8.1-x86_64-unknown-linux-gnu.tar.gz SHA256SUMS
Both binaries are built with --features proxy --features document.
Changelog
Full PR-by-PR detail: CHANGELOG.md.