Skip to content

Finance & compliance

Solution

Every close, filing, and audit request comes down to the same problem: proving what you reported, and what you knew when you reported it. Search retrieves text; Telha resolves state, so "what was our exposure at quarter-end" and "what did we know when we filed" are both answerable, with a citation on every number.

The state questions finance needs to answer

  • What did we report as our exposure at quarter-end, and what did we actually know at the moment we filed it?
  • Which version of a control was in effect on the date of a given transaction?
  • What changed between the draft filing and the final filing, and who changed it?
  • Which counterparty exposures were open on a specific date, before a later correction moved the number?
  • What did this spreadsheet say before the restatement, and what does it say now, with both versions still provable?
  • Which facts behind this quarter's report are still pending confirmation?

Why generic RAG breaks here

A vector index over your filings retrieves the most similar paragraph, not the version that was in force on the reporting date, and it has no concept of "as we believed it on the day we filed." Audit and regulatory questions are inherently temporal; a retrieval layer with only one clock cannot answer them without manual reconciliation.

What to connect

Source Ingestion path Shipped connector Notes
Spreadsheets (models, working papers, exposure trackers) csv/xlsx (tabular worker) SharePoint/OneDrive Row-level facts, versioned on every re-upload.
Filing PDFs (10-Q/10-K style, regulatory submissions) pdf (docling worker) SharePoint/OneDrive Provenance to the exact clause or figure.
Policy and control documents pdf/docx (docling worker) SharePoint/OneDrive Effective dates become valid-time facts.
Finance mailbox correspondence (auditor queries, sign-offs) email (email worker) Exchange Sign-off threads become provenance for approvals.
Ledger or data-warehouse extracts (e.g. PostgreSQL) inline json none (promote via /v1/ingest, format=json) Promote structured rows directly; synchronous, no worker needed.

PostgreSQL and other systems of record

There is no shipped PostgreSQL connector. The supported path is to export or stream the rows you need as format=json against /v1/ingest, which core applies synchronously and versions like any other fact. See Ingestion.

Example queries

Open exposures above a materiality threshold
{
  "find": "EXPOSURE",
  "where": {
    "amount": { "$gte": 500000 },
    "status": { "$eq": "open" }
  },
  "limit": 100
}
Every counterparty exposure at or above the threshold, current state.

Exposure as reported at quarter-end, as we believed it then
{
  "find": "EXPOSURE",
  "where": { "counterparty": { "$eq": "acme-corp" } },
  "atValidTime": "2026-06-30T00:00:00Z",
  "atTxTime": "2026-07-05T00:00:00Z"
}
Pins both clocks: what was true as of June 30, using only what Telha had recorded by July 5, the state the quarter-end report actually used.

Controls in force on a transaction date, with owner
{
  "find": "CONTROL",
  "where": { "code": { "$eq": "SOX-402" } },
  "atValidTime": "2026-03-14T00:00:00Z",
  "expand": [{ "type": "OWNED_BY", "direction": "out", "depth": 1 }]
}
The version of a named control that was in force on a specific transaction date, expanded to its owner.

Filings with figures near a topic, ranked by relevance
{
  "find": "FILING_CLAUSE",
  "vector": { "text": "going concern liquidity risk", "model": "m1", "k": 15, "minScore": 0.55 },
  "where": { "$or": [{ "status": { "$eq": "filed" } }, { "status": { "$eq": "draft" } }] }
}
Hybrid recall: semantically similar clauses across drafts and filed versions.

A verified answer in practice

Q: What did we report as our accounts-receivable exposure to Acme Corp at Q2 close, and what did we know about the dispute at that point?

POST /v1/generate
{
  "question": "What did we report as our AR exposure to Acme Corp at Q2 close, and what did we know about the dispute at that point?",
  "query": {
    "find": "EXPOSURE",
    "where": { "counterparty": { "$eq": "acme-corp" } },
    "atValidTime": "2026-06-30T00:00:00Z",
    "atTxTime": "2026-07-05T00:00:00Z"
  },
  "semanticModel": "text-embedding-3-small",
  "expandDepth": 1
}

Telha: We reported AR exposure to Acme Corp of $1.42M as of June 30 [S1]. A dispute over a $180K invoice was flagged as unresolved on June 18 [S2], and no resolution was recorded before the July 5 filing cutoff [S3].

[S1] Q2-exposure-tracker.xlsx, row 44, as of the July 5 recording date [S2] ar-dispute-notes.pdf, p.2 [S3] finance-close-signoff@2026-07-05.eml

The draft is decomposed into individual claims (the dollar figure, the dispute flag, the absence of resolution) and each is checked against its own cited span before delivery; a claim asserting the wrong figure would be scored unsupported even if the surrounding sentence read as a plausible paraphrase. See Verified answers.

If a fact was still pending

If the dispute's resolution date had been ambiguous in the source document, Telha would have opened a clarification and the answer above would carry an explicit caveat until it resolved, rather than presenting a guessed date as fact.

Evidence and permissions

  • Audit-grade citations. Every number in a generated answer traces to a byte span in a specific source version; see Provenance to the span. A restated spreadsheet does not erase the old citations, the superseded version stays queryable at its original transaction time.
  • Deny-by-default RBAC. Access to exposure, control, and filing data comes from your identity provider's groups; someone with no mapped role sees nothing, not a reduced default. See Tenancy & security.
  • Field-level encryption. Classified fields (account numbers, counterparty banking details, other financial PII) are encrypted in the app layer before core ever stores them; core holds only opaque ciphertext and cannot index or embed those fields.
  • Cross-tenant isolation. If Telha serves multiple entities or subsidiaries as separate tenants, a query scoped to one cannot address another's storage keys, by construction, not by policy check.