Privacy intelligence

Read the fine print,
at scale.

Visentix reads a company's public privacy notice and turns it into a scorecard — what's disclosed, what's missing, how it compares to its peers — with every number traceable back to the clause it came from. It reports exposure, never legal verdicts.

FastAPI · Supabase Postgres + pgvector · Qwen3:8b on RunPod Serverless

Assessment summary

Reviewed

Example vendor notice · 212 substantive clauses

Regulatory exposure
64F-002
Disclosure maturity
71F-005
Transparency
58F-006
AI transparency
34F-007
Every score stores its formula version, its inputs and its source lineage, so the same notice always produces the same report.
  • 14

    scoring formulas

  • 30

    clause types in the taxonomy

  • 67

    API endpoints

  • ~48

    database tables

  • 985

    test functions

  • 0

    legal verdicts, by construction

The problem

Nobody can compare a hundred privacy notices by reading them.

Privacy policies are long, deliberately vague, and written by lawyers. Comparing one company's notice to another — or spotting what a policy quietly leaves out — is slow manual work, and any tool that automates it risks drifting into legal advice, which is the one thing a privacy team cannot ship.

Visentix splits a notice into clauses, labels each one against a 30-type taxonomy, correlates it with real regulator enforcement actions, and runs a deterministic scoring engine over the result. It reports exposure and maturity, flags weak evidence rather than hiding it, and holds everything behind an expert reviewer before a customer sees a number.

What it does

Built to produce a number someone can defend in a meeting.

  • Three ways in

    A URL, a PDF/DOCX/TXT upload, or pasted text — one shared pipeline behind all three.

  • Safe by default

    URL fetches pass an SSRF guard, uploads are typed by their real bytes, and every route is role-gated.

  • Semantic matching

    Clauses link to actual regulator enforcement actions and statutory obligations by meaning, not keywords.

  • Fourteen explainable scores

    Exposure, benchmark deviation, disclosure maturity, transparency and AI readiness — each with its formula and inputs stored.

  • No legal verdicts

    A hard guardrail blocks words like violation or illegal from any generated text, and raises rather than shipping one.

  • Expert in the loop

    Nothing reaches a customer until a reviewer approves it; the report is then frozen and re-renders byte for byte.

Under the hood

A straight pipeline, with the AI kept off the scoring path.

Extract, decompose, classify, score, review, freeze. There is no agent loop, no natural-language-to-SQL, and no retrieval-augmented generation — embeddings correlate clauses to enforcement actions and obligations, and their neighbours are never injected into a prompt.

  1. Extract

    URL, upload or pasted text. URLs pass an SSRF guard; uploads are typed by magic bytes, not the filename they arrived with.

  2. Decompose

    A deterministic splitter walks the notice's real structure. A noise filter keeps headings and boilerplate for lineage but excludes them from scoring.

  3. Classify

    Qwen3:8b labels each clause. On any failure it records an honest degraded result rather than a confident guess.

  4. Correlate

    384-dim MiniLM embeddings match clauses to enforcement actions above a 0.30 floor and obligations above 0.35, weighted by regulator priority.

  5. Score

    Formulas F-001 to F-014 run over substantive clauses only, with weights read from the database and lineage stored per score.

  6. Review and freeze

    An expert confirms or edits every finding; approval freezes a snapshot that re-renders to PDF identically.

The honesty layer

Every score carries a Confidence Index built from five weighted inputs. Below 40, the finding is suppressed rather than shown — a thin peer cohort or a degraded classification lowers confidence, and a low-confidence number is worse than no number. Drag the slider to see it.

  • NLP classification30%
  • Benchmark cohort25%
  • Regulatory coverage15%
  • Enforcement match15%
  • Source reliability15%
72

Suppression threshold: 40

Finding presented · retention disclosure

Retention language is present but unspecific: no defined period and no deletion trigger. Exposure is elevated relative to the industry cohort. Phrased in exposure terms only — never as a legal conclusion.

Three decisions worth defending

Determinism

The model labels and rephrases. It never scores.

Qwen3:8b does exactly two jobs: classify a clause against a 30-type taxonomy, and rephrase a finding that has already been computed. Every score comes from formulas F-001 to F-014 whose weights and thresholds are read from a formula_version row, never hardcoded — so a score can be traced to the exact formula version that produced it. If a number could move because a model felt different today, nobody could stand behind the report.

app/services/scoring/ · formula_version

Guardrail

Banned verdict language raises instead of shipping.

Generated prose is scanned for legal-verdict terms — violation, unlawful, non-compliant, liable — and assembly fails loudly rather than emitting one, because the product reports exposure, not legality. Verbatim source excerpts inside double or smart quotes are exempt, but single quotes deliberately are not: they collide with contractions, which is exactly how the GRD-003 regression got through the first time.

app/services/guardrail.py

Cost control

Startup validates the GPU backend without calling it.

The classifier runs on a scale-to-zero RunPod Serverless endpoint, so there is no idle GPU bill — but a naive health check would wake the worker on every deploy and every uptime ping. Backend selection resolves from configuration alone, with no network call at boot, and /health reports model-backend state without touching the endpoint. The trade is a cold start on the first request after a quiet period.

app/config.py:117-155

Stack

Backend
Python 3.13FastAPI 0.115Pydantic 2.11APSchedulerPyJWT
Data
Supabase Postgrespgvector 0.4 (ivfflat)~48 tables55 additive migrationsRow-Level Security
AI & retrieval
Qwen3:8b via Ollamaall-MiniLM-L6-v2384-dim, L2-normalisedcosine similarity
Frontend
React 19TypeScript 6Vite 8React Router 7Recharts 3
Infra
Azure VM + CaddyRunPod ServerlessCloudflareWeasyPrintnightly pg_dump → S3

Honest limitations: it's a pilot. Classification quality and latency aren't formally benchmarked, background jobs run in a single process, and enforcement similarity is computed in Python rather than as an indexed pgvector query — fine at pilot scale, all first in line if it needed to serve load.