Discovery Independent solution

eDiscovery & Doc Review

Works through large document populations to rank by relevance, propose privilege and responsiveness calls, and cluster near-duplicates — accelerating review while keeping qualified reviewers making the final calls and sampling for QC.

The problem

Linear document review doesn't scale to modern data volumes

Discovery populations run to hundreds of thousands of documents. Reviewing them linearly is slow and expensive, and the most relevant material can sit deep in the pile while reviewers wade through noise.

This solution prioritises the likely-relevant first, proposes privilege and responsiveness calls with reasons, and clusters duplicates — with reviewers confirming and QC sampling throughout.

Primary objective
Get through large document sets faster without lowering the standard of review — humans keep control.
How it works

Ingest → prioritise → classify → human QC

Ingest
Process & de-duplicate set
Prioritise
Rank by likely relevance
Classify
Responsive / privileged calls
Human QC
Reviewers confirm, sample
What it does
  • ✓ Relevance prioritisation
  • ✓ Privilege call proposals
  • ✓ Responsiveness classification
  • ✓ Near-duplicate clustering
  • ✓ Key-document surfacing
  • ✓ Reviewer QC sampling
Built with
  • ✓ Claude for classification
  • ✓ Embeddings for clustering
  • ✓ Review platform integration
  • ✓ Active-learning ranking
  • ✓ Reviewer decision workflow
Guardrails
  • ✓ Assistive — humans decide
  • ✓ Privilege confirmed by review
  • ✓ Reasons attached to calls
  • ✓ Defensible audit trail
  • ✓ QC sampling built in
Under the hood

Every call carries a reason for QC

Proposed responsiveness and privilege calls come with the model's rationale and confidence, so reviewers can QC efficiently and defensibly.

ediscovery/classify.py PYTHON
from anthropic import Anthropic
client = Anthropic()

def classify(doc: str, issues: list) -> dict:
    prompt = f"""Assess this document for review.
Issues in scope: {issues}
Document: {doc[:6000]}
Return JSON: {{"responsive": bool, "privileged": bool,
"confidence": float, "reason": str}}"""
    msg = client.messages.create(model="claude-sonnet-4-20250514",
        max_tokens=400, temperature=0,
        messages=[{"role": "user", "content": prompt}])
    call = parse_json(msg.content[0].text)
    # Proposed call only — a reviewer confirms before it's final
    return as_proposed(doc, call)
Outcomes
Faster
Through large sets
Prioritised
Relevant docs first
Defensible
Reasons on every call
Human
Final decisions

Accelerate review, keep it defensible

Works with Matter Summaries to turn key documents into narratives.

Start a conversation →
More Legal & Professional Services solutions
eDiscovery & Doc Review | Smort