Skip to documentation

Use cases by industry

Use case: wealth management

A registered investment advisor lives on two things: research it can stand behind, and positions it can prove. An advisor asking "which clients are overweight technology?"needs the certified Reg BI limit, the current holdings from the book of record, and a straight answer that abstains rather than guesses when the firm can't back it. This guide builds that assistant end to end for Cedar Peak Capital, a fictional RIA, touching seven module slices: Intake to ingest the advisory corpus, Atlas to type advisors and clients, Warrant to certify the compliance research, Conduit to query the live positions book, Lens to answer with citations, Lineage to trace any answer to its certified source, and Crucible to keep it accurate as portfolios drift.

One knowledge base, seven slices. The dashed edge is the loop that keeps it honest: a regression the golden set catches steers the next round of Warrant curation.

Seed this workspace and follow along

Everything below runs against a real, pre-built workspace. Run yarn demo:seed finance and it appears as Cedar Peak Capital (Finance) — advisors, clients, three model portfolios, the Reg BI program, a read-only positions connector, and the portfolio-analyst agent, all wikilinked so Atlas populates with zero LLM. See the demo workspaces catalog for the full roster.

Prerequisites

  • A workspace key with kb:write, kb:read, agents:run, data:read, data:run, and runs:read, exported as $ELI_KEY. See Getting started.
  • Owner/admin on the workspace, to certify concepts and verify source documents.
  • An enabled chat model, so /query can generate — otherwise 409 no-model-configured.

1 · Intake — ingest the advisory corpus

The firm's knowledge already exists as documents: a firm overview, the advisor roster, one file per client household, one per model portfolio, the strategy write-ups, and the compliance program. Post them as markdown so each becomes a searchable, citable document — yarn demo:seed finance does exactly this, but the shape is a plain document ingest you can drive yourself. Push the Reg BI program note that later slices will lean on:

POST/api/v1/documentsBearer · kb:write

Save markdown through the vault. The file, chunks, and full-text index commit before 201; embedding and graph enrichment continue as detached work, so the response contains stored-document metadata only.

Example requestbash
curl -s -X POST https://your-host/api/v1/documents \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "path": "compliance/reg-bi-program.md",
    "title": "Compliance — Reg BI Program",
    "content": "# [[Reg BI]] Program\n\nOwned by [[Dana Voss]]. Concentration limits apply to the [[Aggressive Growth Model]] (e.g. [[Technology Sector]] exposure from client [[RSU]] positions)..."
  }'
Responsejson
{ "docId": "01KY30REGBIPROGRAM0000000", "path": "compliance/reg-bi-program.md", "contentHash": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", "title": "Compliance — Reg BI Program" }

At 201, the compliance note is stored and FTS-searchable. Later enrichment in Atlas can reconcile references to entities — [[Dana Voss]] an Advisor, [[The Nguyen Household]] a Client, [[Reg BI]] a Regulation — and wire relations between them. That work is detached and is not represented in the create payload.

2 · Atlas — type advisors, clients, and portfolios

Retrieval is far stronger when the corpus is structured, not just text. The workspace ships a domain ontology: Advisor, Client, Portfolio, Strategy, AssetClass, and Regulation, tied together by typed relations (advises, holds, follows_strategy, governed_by). Read a key node — The Nguyen Household, the growth-book client at the center of this story — and see the graph the wikilinks built:

GET/api/v1/entities/{id}Bearer · kb:read or runs:read

Return one entity with its type, authority tier, and curation metadata. Its typed neighbors (advisor, portfolio, regulation) come from GET /api/v1/entities/{id}/neighborhood.

Example requestbash
curl -s https://your-host/api/v1/entities/01KZNGUYEN000000000000000 \
  -H "Authorization: Bearer $ELI_KEY"
Responsejson
{
  "id": "01KZNGUYEN000000000000000",
  "name": "The Nguyen Household",
  "type": "Client",
  "authority": "machine_extracted",
  "aliases": ["Nguyen Household"],
  "description": "Dual-income tech household on the Aggressive Growth Model; Technology Sector overweight, employer RSU concentration.",
  "curation": { "advisedBy": "Marcus Bell", "followsStrategy": "Aggressive Growth Model", "governedBy": "Reg BI" }
}

Note the authority: machine_extracted. Atlas gives you the shape of the firm for free, but nothing here is vouched foryet — that is Warrant's job. The typed graph is what lets a later question like "which clients follow the Aggressive Growth Model?" traverse relations instead of hoping a keyword matched.

3 · Warrant — certify the compliance research

A compliance answer has to be defensible. In Warrant, curate the concepts advisors will quote and certify the ones that carry regulatory weight — certified is the only tier the assistant states without hedging. Pin the Reg BI single-sector concentration limit as a reviewable change, then sign off:

POST/api/v1/change-requestsBearer · kb:write

Propose the canonical definition as a reviewable change rather than editing silently. Approval promotes authority to at least curated and records the reviewer on the revision.

Example requestbash
curl -s -X POST https://your-host/api/v1/change-requests \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "update",
    "entityId": "01KZREGBI0000000000000000",
    "payload": { "description": "Reg BI: every recommendation passes a Best Interest Review. The Aggressive Growth Model carries a 25% single-sector concentration limit; breaches are documented or the position does not ship." },
    "note": "Pinning the 25% single-sector concentration limit advisors must apply"
  }'
Responsejson
{ "id": "01KZCRREGBI0000000000000A", "entityId": "01KZREGBI0000000000000000", "kind": "update", "status": "open" }
POST/api/v1/entities/{id}/certifyBearer · kb:write

Owner/admin sign-off — authority certified. Also starts the review clock: nextReviewAt lands at now + the workspace's reviewIntervalDays, so certified compliance rules can't quietly go stale.

Example requestbash
curl -s -X POST https://your-host/api/v1/entities/01KZREGBI0000000000000000/certify \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"note": "Signed off by Dana Voss (CCO) for the FY26 Reg BI program"}'
Responsejson
{ "authority": "certified", "lifecycleStatus": "published", "version": 3, "nextReviewAt": "2027-01-18T09:10:00.000Z" }

Then verify the source document itself, so its provenance carries a governance tier the rest of the platform can read:

POST/api/v1/documents/{id}/verifyBearer · kb:write

Glean-style document verification. Stamps the verification tier, the verifier, and the next re-verify date — the governance block Lineage reports and the manifest counts.

Example requestbash
curl -s -X POST https://your-host/api/v1/documents/01KY30REGBIPROGRAM0000000/verify \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"verification":"certified","note":"Current Reg BI program, reviewed by Compliance"}'
Responsejson
{ "id": "01KY30REGBIPROGRAM0000000", "verification": "certified", "verifiedAt": "2026-07-22T09:12:00.000Z", "nextVerifyAt": "2026-12-29T00:00:00.000Z" }

Certification is what moves a verdict out of the caveat band

Ask the assistant "is the Harlow Trust allowed to hold junk bonds?" before the research is certified and the policy engine returns answer_with_caveat at confidence 0.44 (reason confidence_in_caveat_band) — a hedge, because the backing is thin. Certifying the governing rule is exactly what promotes the next answer to a clean, plainly-stated one. The Curation page does all of this with a click; the API and the UI write the same append-only revisions.

4 · Conduit — query the live positions book

Documents describe the firm; they don't know today's holdings. Positions live in the Portfolio Accounting System, wired in as a read-only data connector named cedarpeak-pas. The seed provisions it along with three governed, parameterized queries — allocation-by-asset-class, clients-overweight-sector, and harvesting-candidates — each a read-only SELECT the executor sandboxes. Confirm the source is live:

GET/api/v1/data/connectorsBearer · data:read

List the workspace's data connectors, credential-masked. cedarpeak-pas is the Postgres book of record; its governed queries are listed at GET /api/v1/data/queries.

Example requestbash
curl -s https://your-host/api/v1/data/connectors \
  -H "Authorization: Bearer $ELI_KEY"
Responsejson
{
  "items": [
    { "id": "01KZCONNPAS00000000000000", "name": "cedarpeak-pas", "kind": "postgres", "database": "cedarpeak_pas", "hasCredential": true, "status": "active" }
  ],
  "total": 1
}
POST/api/v1/data/queries/{slug}/runBearer · data:run

Execute a governed named query with typed params. The executor enforces read-only SQL and a row cap; the response carries the rows plus dataCallId — the [Dn] provenance anchor a grounded answer can cite.

Example requestbash
curl -s -X POST https://your-host/api/v1/data/queries/clients-overweight-sector/run \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"params":{"sector":"Technology"}}'
Responsejson
{
  "dataCallId": "01KZDATACALL000000000000A",
  "connectorId": "01KZCONNPAS00000000000000",
  "queryId": "01KZQOVERWEIGHTSECTOR0000",
  "columns": ["client", "sector", "weight_pct", "target_pct"],
  "rows": [
    { "client": "The Nguyen Household", "sector": "Technology", "weight_pct": 31.4, "target_pct": 25.0 }
  ],
  "rowCount": 1,
  "durationMs": 18,
  "truncated": false
}

The book of record answers the live question deterministically: The Nguyen Household sits at 31.4% Technology against a 25.0% target. That dataCallId is a first-class provenance anchor — the next slice cites it as [D1] right alongside the certified document. Bindings attach these queries to entities too, so the Technology Sector node in Atlas carries a "clients overweight this sector" live panel with no query authoring.

5 · Lens — the advisor asks, and gets a cited answer

Now the payoff. An advisor asks in plain language; Lens retrieves the certified research, threads in the live positions, grounds one generation, and returns an answer with inline [Sn] document citations and [Dn] data citations, plus a policy decision that says how much to trust it:

POST/api/v1/queryBearer · agents:run

Run the grounded query pipeline: retrieval + entity detection + a live data call + one generation + a groundedness check + the answer-policy engine. Returns a cited answer with a policy decision. The workspace comes from the key.

Example requestbash
curl -s -X POST https://your-host/api/v1/query \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question":"Which clients are overweight technology?","includeData":true}'
Responsejson
{
  "answer": "The Nguyen Household is overweight technology: the Aggressive Growth Model carries a Technology Sector tilt [S2], and live positions put the sleeve at 31.4% against a 25% model target [D1] — a breach of the Reg BI single-sector concentration limit [S1].",
  "claims": [
    { "text": "The Nguyen Household follows the Aggressive Growth Model with a Technology Sector tilt", "citations": ["S2"] },
    { "text": "Live Technology weight is 31.4% against a 25% target", "citations": ["D1"] },
    { "text": "This breaches the Reg BI 25% single-sector concentration limit", "citations": ["S1"] }
  ],
  "sources": [
    { "id": "S1", "docId": "01KY30REGBIPROGRAM0000000", "docTitle": "Compliance — Reg BI Program", "docPath": "compliance/reg-bi-program.md", "chunkId": "01KY30REGBIPROGRAMCHUNK00" },
    { "id": "S2", "docId": "01KY20NGUYEN00000000000AA", "docTitle": "Client — The Nguyen Household", "docPath": "clients/nguyen-household.md", "chunkId": "01KY20NGUYENCHUNK00000000" }
  ],
  "dataCalls": [
    { "id": "D1", "dataCallId": "01KZDATACALL000000000000A", "querySlug": "clients-overweight-sector" }
  ],
  "entities": [ { "id": "01KZNGUYEN000000000000000", "name": "The Nguyen Household", "type": "Client", "authority": "machine_extracted" } ],
  "policy": { "mode": "enforce", "verdict": "answer", "confidence": 0.78, "reasons": ["confidence_above_answer_floor"], "caveats": [], "conflicts": [] },
  "groundedness": { "verified": 3, "total": 3 },
  "model": { "chat": "claude-sonnet-4-5", "judge": "claude-haiku-4-5" }
}

The policy block is the trust signal: answer at confidence 0.78because the evidence is a certified rule, a supporting client note, and a live figure that agree. Ask something the firm can't back — "what will the market do next quarter?" — and the policy engine returns abstain_with_pointers at 0.12 (reason no_relevant_chunks) instead of inventing a forecast — the behavior a compliant RIA demands. The same pipeline is a native MCP tool, so it drops straight into an advisor's Claude workspace.

6 · Lineage — trace the answer back to its source

Compliance reviewing the assistant asks the fair question: where is this coming from, and can I trust it? The answer cited S1 → docId 01KY30REGBI…. Pull that document's lineage and read the whole trail in one call — origin, governance, and the downstream answers it is grounding right now:

GET/api/v1/documents/{id}/lineageBearer · kb:read or runs:read

The unified per-document lineage trail: origin provenance, governance, the audit trail, derived knowledge, and downstream impact. This is how you prove a compliance answer's pedigree end to end.

Example requestbash
curl -s https://your-host/api/v1/documents/01KY30REGBIPROGRAM0000000/lineage \
  -H "Authorization: Bearer $ELI_KEY" | jq '{origin: .origin, verification: .governance.verification, certifiedConcept: .derived.entities[0], citedBy: .downstream.citedByAnswers}'
Responsejson
{
  "origin": { "kind": "ingest", "path": "compliance/reg-bi-program.md", "ingestedAt": "2026-07-22T09:05:11.402Z" },
  "verification": "certified",
  "certifiedConcept": { "id": "01KZREGBI0000000000000000", "name": "Reg BI", "authority": "certified" },
  "citedBy": 9
}

There it is, closed loop: the answer traces to compliance/reg-bi-program.md, the document is certified, it derives the Reg BI concept that is itself certified, and it is currently grounding 9answers — so an edit to it has a known blast radius. Reviewers didn't have to trust the model; they read the pedigree. The same breach also surfaces as a monitoring alert concentration.breach, warning severity: "The Nguyen Household exceeds the 25% Technology concentration limit (Aggressive Growth Model)."

Same trail, in the document view

The workspace UI renders this exact DocumentLineage as a visual trail on the document page (via the BFF at GET /api/w/{workspaceId}/documents/{docId}/lineage), and an agent can pull it mid-run with the kb_document_lineage MCP tool. One shape, three surfaces.

7 · Crucible & Ports — lock the accuracy in, then ship it

Portfolios drift and rules change, and a wrong compliance answer is expensive. Capture the questions advisors actually ask as a golden set so Crucible can prove the assistant still answers them after every change. The seed ships the "Advisory Q&A baseline" eval with items like "Which model portfolio does the Harlow Family Trust follow?" Anchor a provenance qrel from the chunk that should ground it:

POST/api/v1/qrelsBearer · kb:write

Author a graded relevance judgment for a golden item. source=provenance derives the highest-grade judgment from the item's anchored citation — deterministic, no judge model needed.

Example requestbash
curl -s -X POST https://your-host/api/v1/qrels \
  -H "Authorization: Bearer $ELI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "queryId": "01KZGOLDENHARLOW00000000A",
    "chunkId": "01KY25INCPRESCHUNK000000A",
    "docId": "01KY25INCPRESMODEL000000A",
    "grade": 3,
    "source": "provenance"
  }'
Responsejson
{ "id": "01KZQRELHARLOW0000000000A", "queryId": "01KZGOLDENHARLOW00000000A", "grade": 3, "source": "provenance" }

Run the set, then read the metrics for the run. Retrieval and abstention numbers are deterministic; RAGAS numbers carry the judge model that produced them:

GET/api/v1/evals/runs/{id}/metricsBearer · kb:read or runs:read

Retrieval, RAGAS, and abstention metrics for one run — overall and by facet. The ruler for 'did the advisory assistant get worse?'

Example requestbash
curl -s https://your-host/api/v1/evals/runs/01KZRUNADVISORY0000000000/metrics \
  -H "Authorization: Bearer $ELI_KEY"
Responsejson
{
  "runId": "01KZRUNADVISORY0000000000",
  "n": 24,
  "retrieval": { "recallAtK": 0.79, "ndcgAt10": 0.74, "mrr": 0.82, "hitAtK": 0.96 },
  "ragas": { "faithfulness": 0.93, "responseRelevancy": 0.86, "contextPrecision": 0.68 },
  "abstention": { "truthfulness": 0.71, "abstainRate": 0.17, "aurc": 0.061 }
}

The healthy abstainRate is the point: on the market-forecast question the assistant stayed silent, and Crucible counts that as correct rather than a miss. Everything then ships behind the seeded portfolio-analyst agent — data-enabled, primed with a memory that the Aggressive Growth Model carries a 25% concentration limit under Reg BI — which advisors run through Ports (POST /api/v1/agents/portfolio-analyst/runs) to produce durable, cited runs and reports. When a metric drops after a rule change, promoting that miss back into the set turns it into a permanent test — the dashed loop in the diagram, where Crucible's regressions steer the next round of Warrant curation.

The leverage

Seven slices, one knowledge base, one audit trail. The advisor gets a fast answer that fuses certified research with the live book of record; compliance can trace any answer to a certified source and see its blast radius and alerts; and the whole thing is measured, so accuracy is a number you watch rather than a hope. Swap Cedar Peak for any RIA — or wealth for insurance, lending, or treasury — and the shape is identical: the platform doesn't care what the positions are, only that every answer is grounded, governed, traceable, and measured.

Keep going

Automate the deliverable side of this with Automated reports, end to end, or see the whole platform at a glance in the Capability map.