Skip to content

Legal & contracts

Solution

Contracts change. Clauses get amended, obligations get renegotiated, and by the time a dispute lands on someone's desk, three versions of the agreement are floating around and nobody is quite sure which one governed which date. Search retrieves text; Telha resolves state, so "which version of this clause was in force on this date" has one answer, with the exact text behind it.

  • Which version of clause 7.3 was in force on the date the incident occurred?
  • What obligations were active under this contract as of a given date, before the amendment that changed them?
  • When did this counterparty's termination right first appear, and in which amendment?
  • What did the contract say before the current, superseded version, and can we still prove it said that?
  • Which effective dates on this agreement are still unconfirmed or ambiguous, and who needs to confirm them?
  • What is the full amendment history of this obligation, in the order it actually changed, not the order the documents were filed?

Why generic RAG breaks here

A vector index returns the paragraph most similar to your question. If three versions of clause 7.3 exist, it may well return the superseded one, with no signal that it's superseded, and no way to ask for the version that was in force on a specific date. Contract review is a temporal question wearing a legal costume; Telha treats it as one.

What to connect

Source Ingestion path Shipped connector Notes
Executed contracts and amendments (PDF) pdf (docling worker) SharePoint/OneDrive Each new upload is a new source version; old spans stay citable.
Word-drafted agreements (.docx) docx (docling worker) SharePoint/OneDrive Same provenance model as PDF; redlines ingest as their own version.
Contract repository / DMS folders pdf/docx (docling worker) SharePoint/OneDrive Point the connector's site allowlist at the DMS library.
Negotiation and countersignature correspondence email (email worker) Exchange Signature-date disputes resolve against the actual message thread.

Other DMS platforms

Only SharePoint/OneDrive has a shipped connector. A contract system that exports to PDF/DOCX or a filesystem SharePoint can reach can still be ingested through the same pdf/docx path via /v1/ingest; there is no shipped connector for other document-management systems today.

Example queries

All clauses of a given type on one contract
{
  "find": "CLAUSE",
  "where": {
    "contractId": { "$eq": "msa-acme-2024" },
    "clauseType": { "$eq": "termination" }
  }
}
Current termination clauses on a named master service agreement.

The clause as it read on a specific incident date
{
  "find": "CLAUSE",
  "where": {
    "contractId": { "$eq": "msa-acme-2024" },
    "clauseNumber": { "$eq": "7.3" }
  },
  "atValidTime": "2025-11-02T00:00:00Z"
}
Which version of clause 7.3 was in force on November 2, 2025, the date in question, regardless of when the amendment introducing it was signed.

What we believed the clause said before a later correction
{
  "find": "CLAUSE",
  "where": { "contractId": { "$eq": "msa-acme-2024" }, "clauseNumber": { "$eq": "7.3" } },
  "atValidTime": "2025-11-02T00:00:00Z",
  "atTxTime": "2025-12-01T00:00:00Z"
}
Both clocks pinned: the reading of clause 7.3 as Telha's records stood on December 1, before a later amendment or clarification changed it.

Obligations active under a contract, with the responsible party
{
  "find": "OBLIGATION",
  "where": { "contractId": { "$eq": "msa-acme-2024" }, "status": { "$eq": "active" } },
  "expand": [{ "type": "OWNED_BY", "direction": "out", "depth": 1 }],
  "limit": 200
}
Every currently active obligation on the agreement, expanded to who owns it.

A verified answer in practice

Q: Which version of the termination clause governed the Acme MSA on November 2, 2025, and what did it require?

POST /v1/generate
{
  "question": "Which version of the termination clause governed the Acme MSA on November 2, 2025, and what did it require?",
  "query": {
    "find": "CLAUSE",
    "where": { "contractId": { "$eq": "msa-acme-2024" }, "clauseNumber": { "$eq": "7.3" } },
    "atValidTime": "2025-11-02T00:00:00Z"
  },
  "semanticModel": "text-embedding-3-small",
  "expandDepth": 1
}

Telha: On November 2, 2025, clause 7.3 of the Acme MSA required 60 days' written notice for termination without cause [S1]. This was the version introduced by Amendment 2, effective September 1, 2025, which shortened the notice period from the original 90 days [S2].

[S1] MSA-Acme-Amendment-2.pdf, clause 7.3 [S2] MSA-Acme-Original.pdf, clause 7.3 (superseded, still queryable at its original transaction time)

Each claim, the notice period, the effective date, the fact that it changed from 90 to 60 days, is checked against its own cited span before the answer is returned; a wrong day count would fail verification even in an otherwise fluent sentence. See Verified answers.

When a date can't be pinned

If Amendment 2's effective date were ambiguous (a signature page dated one day, a countersignature dated another), Telha would apply a best guess at reduced confidence and open a clarification routed to the document's author or owner, rather than silently picking a date. Any answer depending on that clause carries a caveat until it resolves.

Evidence and permissions

  • Provenance to the exact clause text. Citations resolve to the byte span of the clause as extracted from the specific contract version, not "this document" in general. See Provenance to the span.
  • Supersession without loss. A new amendment ingests as a new source version; the prior version's spans keep resolving to the same text they always did, so a superseded clause remains exactly as citable as the day it was created. See the tritemporal model.
  • Deny-by-default RBAC. Contract access follows your identity provider's groups; legal holds and matter-based restrictions map onto Telha roles with nothing visible by default. See Tenancy & security.
  • Field-level encryption. Sensitive commercial terms (pricing, penalty figures, named individuals under NDA) can be declared classified fields and are encrypted in the app layer before core ever sees them.