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¶
{
"find": "EXPOSURE",
"where": {
"amount": { "$gte": 500000 },
"status": { "$eq": "open" }
},
"limit": 100
}
{
"find": "EXPOSURE",
"where": { "counterparty": { "$eq": "acme-corp" } },
"atValidTime": "2026-06-30T00:00:00Z",
"atTxTime": "2026-07-05T00:00:00Z"
}
{
"find": "CONTROL",
"where": { "code": { "$eq": "SOX-402" } },
"atValidTime": "2026-03-14T00:00:00Z",
"expand": [{ "type": "OWNED_BY", "direction": "out", "depth": 1 }]
}
{
"find": "FILING_CLAUSE",
"vector": { "text": "going concern liquidity risk", "model": "m1", "k": 15, "minScore": 0.55 },
"where": { "$or": [{ "status": { "$eq": "filed" } }, { "status": { "$eq": "draft" } }] }
}
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?
{
"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.