Inspiration

Contracts tend to be very long and overly wordy making reading and understanding them inaccessible for the layperson. We wanted to come up with a solution that would allow non legally trained people to be able to understand their obligations and liabilities based on the contracts they have entered into.

What it does

Users provide a collection of finalized agreements (regardless of format) and CLARA extracts the vital details: participants, termination dates, renewal terms, cancellation consequences, financial commitments, and exclusivity clauses. Each piece of information provides a direct reference to its source page and includes a certainty rating to distinguish between verified data and estimates. The system further generates a three-month outlook for upcoming expirations or renewals, identifies potential contractual conflicts, and drafts concise summaries for legal review when ambiguities arise.

How we built it

  • Ingest — PDF/DOCX text with page offsets and per‑word boxes; Tesseract OCR for scans with no text layer.
  • Extract — one cached, structured LLM call per contract. No cache hit and no key ⇒ throw, never invent.
  • Verify (lib/verify.ts) — every model quote is re‑found in our extracted text: exact → normalised → fuzzy (> 0.92, costs a confidence level) → discard. A quote we can't locate destroys the field it supports.
  • Confidence (lib/confidence.ts) — a pure function of what verification found, never what the model claims about itself.
  • Deadlines & conflicts — no model at all: $t_{\text{act}} = t_{\text{end}} - d_{\text{notice}}$, so a renewal 74 days out with 60 days' notice is a 14‑day problem. Conflicts are set intersection over normalised territory/product codes. ## Challenges we ran into
  • Silence vs. blindness — making "not found" mechanically distinct from "uncertain," with a keyword probe that survives false friends like exclusive of GST and exclusive jurisdiction.
  • OCR gating — one low‑confidence word was forcing whole fields to Uncertain and flooding the tab; we reworked it to hedge only when the poor word carries the answer, or when two or more substantive words are bad.
  • Uncooperative clauses — a liability cap split mid‑sentence across a page break; a notice period sitting three clauses away from the renewal term it governs.
  • A demo that can't fail on stage — every model response cached to disk, zero network at runtime.

Accomplishments that we're proud of

0.0% confident error rate — 0 of 43 fields stated as fact were wrong; 96.7% field accuracy overall.

  • 0 fabricated citations, by construction — all 97 citations located in source, all exact matches.
  • The two fields we didn't nail cleanly are both honest hedges on a noisy scan — they'd have scored higher if we'd just asserted them, and we chose not to.
  • 145 tests across verification, confidence, date maths, and scope overlap. ## What we learned For a non‑expert user, calibration beats raw accuracy: the question isn't "is it right?" but "does it know when it isn't?"
  • Confidence belongs in code, derived from evidence — a model's self‑reported confidence is just a guess about itself.
  • Narrowing the claim surface (contract text only — no statutes, no market norms) turns a fabricated external citation from unlikely into impossible.

What's next for Team 32 - CLARA

Retrieval — send targeted clauses instead of whole documents to scale past ~80 contracts (the limit is tokens, not latency).

  • Business‑day arithmetic with a real public‑holiday calendar, so business‑day notice periods become actual dates.
  • More conflict classes beyond exclusivity, plus missing‑contract detection.
  • Natural‑language query over the verified, cited layer — but only once it provably can't surface an unverifiable answer.

Built With

Share this project:

Updates