Use cases by industry
Use case: grid reliability
A control-room answer is only worth what the telemetry behind it is worth. When an operator asks which substations have active outages right now?they need the certified incident record and the live breaker status — not last shift's notes, and never a confident guess about whether a line is de-energized. This guide builds that reliability assistant end to end for a regional grid operator, touching seven module slices: Intake to bring the asset and outage records in, Atlas to type them, Warrant to certify the source of truth, Conduit to wire in the live grid-operations database, Lens to answer with citations under a policy that abstains without telemetry, Lineage to trace any answer back to its source, and Crucible + Ports to keep it accurate and hand it to an agent. Seed it with yarn demo:seed energy and it opens as the Helios Grid Utilities (Energy) workspace, so you can follow every call below against real content.
Prerequisites
- A workspace key with
kb:write,kb:read,data:read,data:run,agents:run, andruns:read, exported as$ELI_KEY. See Getting started. - Owner/admin on the workspace, to create connectors and certify concepts.
- The seeded
helios-grid-opsPostgres connector reachable, so the live grid queries return rows instead of a structured failure. - An enabled chat model, so
/querycan generate — otherwise409 no-model-configured.
1 · Intake — bring the grid's records in
Helios's operational knowledge is a folder of markdown: a substation record per bus, an outage finding per event, crew rosters, and the NERC/FERC compliance program. The seed loads all of it, but the shape is a plain document post — headings define the chunks retrieval uses, while graph enrichment follows the storage commit independently. Here is the Ridgeline substation record going in:
/api/v1/documentsBearer · kb:writeSave 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.
Repeat across the pack — the four substations, the Ridgeline-Cascade 230kV Line, the outage findings, the crew logs, and the NERC CIPprogram doc — and the workspace holds Helios's asset base as searchable, citable text. After detached enrichment, referenced names (Ridgeline Substation, SCADA System, Line Crew Alpha) can resolve into the Atlas graph the next slice types and connects. The create response itself carries no graph-readiness status.
2 · Atlas — type the assets, wire the graph
Extraction gives you named nodes; the ontology gives them meaning. This workspace types six kinds of thing — Substation, TransmissionLine, OutageEvent, Crew, ControlSystem, and Regulation — joined by typed relations (connects, maintained_by, impacts, governed_by) so retrieval is structured, not just text. Pin a key asset with its type, then assert the edge that makes it a network:
/api/v1/entitiesBearer · kb:writeCreate or pin a typed entity. An arbitrary type auto-registers into the workspace ontology on first use; here it lands on the seeded Substation type.
/api/v1/relationsBearer · kb:writeCreate a directed, typed relation. The connects edge is validated against the ontology's domain/range (TransmissionLine → Substation) and rebuilt into the serve-time canonical graph automatically.
The graph is already there
Ridgeline-Cascade 230kV Line connects Ridgeline to Cascade Junction, both maintained_by Substation Crew Bravo, all governed_by NERC CIP — so most of Atlas populates without a single manual call. You pin entities and assert edges only to correct or enrich what extraction missed. See Manage entities.3 · Warrant — certify the source of truth
Extraction lands concepts at authority machine_extracted — a starting point, not a truth. Reliability messaging has to be vouched for. In Warrant, curate the concepts an operator will lean on and certify the ones an assistant may state plainly. The Outage Management System is the book of record for outage events, so pin its canonical definition as a reviewable change, then sign off:
/api/v1/change-requestsBearer · kb:writePropose 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.
/api/v1/entities/{id}/certifyBearer · kb:writeOwner/admin sign-off — authority certified. Also starts the review clock: nextReviewAt lands at now + the workspace's reviewIntervalDays, so a certified operational concept can't quietly go stale.
Do the same for the source document itself — verify the Ridgeline storm incident record so its provenance carries a governance tier:
/api/v1/documents/{id}/verifyBearer · kb:writeGlean-style document verification. Stamps the verification tier, the verifier, and the next re-verify date — the governance block Lineage reports and the manifest counts.
Certification is what lets the policy answer plainly
answer at 0.81 confidence (reason confidence_above_answer_floor) rather than a hedge. Everything here is also a click on the Curation page; the API and the UI write the same append-only revisions.4 · Conduit — wire in the live grid-ops database
Documents describe the grid; they don't know what it is doing this second. Breaker status and customers-affected change by the minute, so bind a read-only view of the operations database as a data connector. The seed ships helios-grid-ops (Postgres, helios_grid_ops) with three governed named queries — active-outages, asset-health-by-substation, and peak-load-by-substation — each a parameter-validated, capped, provenance-logged component. List what you can run:
/api/v1/data/queriesBearer · data:readList named queries (domain components) available to run, with their parameter specs. Secrets and connection configs are never returned — only slugs, titles, and params.
/api/v1/data/queries/{slug}/runBearer · data:runExecute a named query with validated params. Read-only, capped at the connector's maxRows, timed, and provenance-logged — every run writes a data_calls row with the exact SQL, params, and status. Params are bound, never interpolated.
Bindings mean nobody writes SQL
Outage Management System → active-outages (labelled "Live active outages"), Ridgeline Substation → asset-health-by-substation, and SCADA System → peak-load-by-substation. So the entity's live view runs the query for you, and — as the next slice shows — a plain-language question routes to the same bound lookup through the semantic layer.5 · Lens — the operator asks, and gets a policy-gated answer
Now the payoff. An operator asks in plain language; Lens retrieves documents, detects the entities in the question, runs their bound live queries, and returns an answer grounded in both — inline [Sn] citations for documents and [Dn] for live rows — with a policy decision that says how much to trust it. Set includeData: true and ask the golden operations question verbatim:
/api/v1/queryBearer · agents:runRun the grounded query pipeline: retrieval + entity detection + bound live-data lookups + one generation + a groundedness check + the answer-policy engine. Returns a cited answer with a policy decision. The workspace comes from the key.
The policy block is the trust signal, and it is what makes this safe for a control room. Ask something speculative — "Will the grid hold up through the next heat wave?" — and the policy engine returns abstain_with_pointers at 0.11 (reason no_relevant_chunks): a reliability claim with no telemetry behind it earns pointers, not a fabricated forecast. Ask "Is Ridgeline transformer T2 safe to load to 110% of nameplate?" and it returns answer_with_caveat at 0.41 (confidence_in_caveat_band) — it will not assert an asset is safe without backing. That is exactly the behavior grid operations demands.
6 · Lineage — trace the answer back to its source
A reliability engineer reviewing the assistant asks the fair question: where is this coming from, and can I trust it? The answer cited S1 → docId 01KY10… and D1 → dataCall 01KY10…. Pull that document's lineage and read the whole trail in one call — origin, governance, and the downstream answers it is grounding right now:
/api/v1/documents/{id}/lineageBearer · kb:read or runs:readThe unified per-document lineage trail: origin provenance, governance, the audit trail, derived knowledge, and downstream impact. This is how you prove an answer's pedigree end to end.
There it is, closed loop: the document half of the answer traces to the seeded Ridgeline storm incident record, it is verified, and it is currently grounding 9 answers — so an edit to it has a known blast radius. And the live half is auditable too: the [D1] row came from the active-outages run, which wrote an append-only data_calls provenance row recording the exact SQL, params, and status behind dataCall 01KY10…. The engineer didn't have to trust the model; they read the pedigree of both layers. The full trail also lists the derived concepts and the dependent cache entries that would invalidate if the incident record changed.
Same trail, three surfaces
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 hand it off
Grid conditions and standards change constantly, and a wrong answer during a storm is expensive. Capture the questions operators actually ask as a golden set so Crucible can prove the assistant still answers them after every content change. Anchor a golden item — say "Why did the Cascade feeder fault escalate from momentary to sustained?" — to the incident chunk that should ground it, and seed a provenance qrel:
/api/v1/qrelsBearer · kb:writeAuthor 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.
Run the "Grid reliability Q&A baseline" set from the evals workspace, then read the metrics for the run. Retrieval and abstention numbers are deterministic; RAGAS numbers carry the judge model that produced them:
/api/v1/evals/runs/{id}/metricsBearer · kb:read or runs:readRetrieval, RAGAS, and abstention metrics for one run — overall and by facet. The ruler for 'did the reliability assistant get worse?'
Finally, hand the whole pipeline to an operator-facing worker. The seed ships the agent grid-reliability-analyst, whose system prompt makes the abstention rule a standing instruction — never assert that an asset is safe, restored, or de-energized without telemetry backing — and whose memories carry the N-1 criterion and the storm-restoration priority. Start a run with POST /api/v1/agents/grid-reliability-analyst/runs and poll GET /api/v1/runs/{id}; the seeded run and its report are already in the workspace to inspect. When a metric drops after a content or standards update, the golden set names exactly which question regressed — and promoting that miss back into the set makes it a permanent test. That is the dashed loop in the diagram: Crucible's regressions and Lens's abstentions steer the next round of Warrant curation. Compare two configs with a two-gate significance test in Measure & compare.
The leverage
Seven slices, one knowledge base plus one read-only grid-ops database, one audit trail. The operator gets a fast answer grounded in both the certified record and live telemetry; the engineer can trace any answer to its document and its data call and see the blast radius; the policy abstains rather than guess at whether a line is safe; and the whole thing is measured, so reliability accuracy is a number you watch rather than a hope. Swap the electric grid for water, gas, or telecom and the shape is identical — the platform doesn't care what the assets are, only that every answer is grounded, governed, traceable, and measured.
Keep going