/ 01Why graduated disclosure
Most disclosure questions are not yes or no. They are how much. A senior partner doing a conflict check needs different information than a junior associate searching cross-silo, even when both are asking about the same matter.
The ladder is the mechanism that lets one query yield seven different answers depending on who is asking. Each step up requires more authority; each step is logged.
/ 02The seven rungs
| Level | What the requester sees | Generation |
|---|---|---|
| L0 | Nothing. No count, no signal, no graph traversal | Enforced at query; no asset |
| L1 | Existence stub — "1 document exists; request access?" | Deterministic, no AI |
| L2 | Faceted view (practice group, jurisdiction, year, doc type) | Pre-generated at ingest |
| L3 | Sanitised abstract — LLM narrative with specifics stripped | Pre-generated; steward-reviewed > Internal |
| L4 | Redacted claim view — claims visible, sensitive fields redacted | Pre-generated; steward-reviewed > Internal |
| L5 | Full claim payload + provenance (no document binary) | Gated retrieval |
| L6 | Full claim + on-demand document fetch via connector | Step-up auth required |
/ 03Per-requester computation
Every result's level is computed at query time, using OPA against the requester context and the document's classification, ownership, and overrides.
max_level = min( classification_ceiling[document.classification][requester.silo, document.silo], author_disclosure_setting[document], steward_override[document], ) max_level = max_level INTERSECT ( requester.silo_share_policy[document.silo], requester.clearances, ethical_wall_recusals[requester, document.matter], conflict_screen[requester, document.client], ) if max_level == L0: # excluded entirely — no row, no count, no signal continue render(result, at_level=max_level)
Filter at retrieval, not at render. Filtering in the UI means restricted data was on the wire — a bug in the renderer becomes a leak. The query layer must never select L0 for an unauthorised requester.
/ 04The L4 reveal pattern
L4 is the cleverest level. A user sees "we have a claim of type deal_value for matter X" without seeing the value itself. They decide whether to request access based on the shape of claims, not their content.
Closer to FOIA-style redaction than summarisation; most often gets a user from "I don't know whether to ask" to "I should ask."
Default redaction policy
- PII fields → tokenised
- Client / party names →
[REDACTED] - Monetary values →
[REDACTED](or banded, opt-in per silo) - Dates → year only, or
[REDACTED] - Predicates and structure preserved
/ 05Aggregation respect
Cross-silo aggregations — counts, sums, averages — must respect each result's disclosure level. A "47 results" count must exclude L0 entries; a sum of deal values must exclude entries below L5 for the requester. Aggregations leak signal too.
The aggregation engine recomputes per-requester at query time. There is no global aggregation cache.
/ 06Asset versioning
Every generated disclosure asset (L2 facets, L3 abstract, L4 redacted view) records its lineage:
prompt_version— the versioned prompt template usedmodel_version— the inference model and pingenerated_at— timestamp (UTC)reviewed_by·reviewed_at— steward, if reviewedapproved·edited·rejected— outcomehash— SHA-256 of canonical payload, for chain-of-custody
Re-generation (model upgrade, prompt upgrade, reclassification) creates a new asset; the previous version is retained for audit.
/ 07Deep dive (visual)
For a visual walk-through of all seven rungs with worked examples per requester role, see the disclosure ladder feature page. It carries the same model, told differently.
