Apache Ossie logoApache Ossie integration

Your Ossie document defines the metric. KPI Tree explains the movement, names the owner and proves the fix.

Post an Apache Ossie document, the Open Semantic Interchange format, to a KPI Tree connection.

What Apache Ossie is, and where it stops.

The open standard for moving a semantic model between tools.

Apache Ossie, incubating, is the open standard that began as the Open Semantic Interchange: a vendor-neutral YAML and JSON format for a semantic model, with datasets, fields, dimensions, time flags, relationships, metrics, multi-dialect expressions and AI context. Snowflake, dbt Labs and Salesforce founded it in 2025, more than fifty organisations take part, and version 0.1.1 is the released spec. Snowflake exports a Semantic View to Ossie YAML with one system function, dbt Core 1.12 writes an Ossie document beside every semantic manifest, and converters exist for Databricks metric views, Sigma, Omni and Tableau.

It settles what a metric is, wherever it was defined. It does not say why the metric fell, who owns the driver, or whether the fix worked, and the spec carries no owners, targets, causal links or verified outcomes. Those live in a layer above the interchange, and that is the layer this integration adds. The definition stays in the Ossie document and the tool that produced it. The causal tree, the owners and the verified outcomes live in KPI Tree, and Canopy hands all of it to your people and your agents.

Defined anywhere. Explained in KPI Tree. One document, the whole loop.

An Ossie document is the most portable definition of a metric there is: the same file Snowflake exports from a Semantic View and dbt writes at parse time. KPI Tree reads it as written and runs each metric as one query on the warehouse you link, with the document as the source of truth. Where the standard leaves a rollup unsaid, KPI Tree infers one and says so, so nothing is silently assumed.

What the interchange does not know is why Revenue fell, who owns Conversion, or whether Monday's release moved it. That is the layer KPI Tree adds: a causal metric tree re-tested every night, RACI ownership on every node, action plans measured against a forecast, and Canopy, the business context layer that hands all of it to your people and to the agents they already use over MCP. The interchange stays the single source of truth for how a metric is calculated. KPI Tree becomes the source of truth for what to do about it.

Every definition, as interchanged, nothing re-declared

Datasets, fields, dimensions, time dimensions, relationships and metrics come across from the document with their descriptions. Expressions in the ANSI SQL or Snowflake dialect render as they are written.

Choose metrics to sync

4 of 5 selected

Revenue

dimensions: region, channel

sum

Orders

dimensions: region, channel, plan

count

Average order value

dimensions: region

ratio

Active customers

dimensions: plan

count distinct

Cumulative bookings

dimensions: none

cumulative

Aggregation read from each definition. Nothing re-declared.

One query per metric, everything else in memory

Each metric is one MetricFlow-rendered query at day grain on the warehouse you link. Comparisons, rollups, breakdowns and the nightly correlation and causality sweep run in KPI Tree’s own engine, so no bill grows with the tree.

Warehouse queries · last sync

4 total
Revenue1 query · 1.8s · 412 rows
Orders1 query · 1.2s · 412 rows
Average order value1 query · 1.6s · 412 rows
Active customers1 query · 2.3s · 412 rows

0 warehouse queries for

period comparisons, weekly and monthly rollups, dimension breakdowns, nightly correlation and causality tests. All computed in memory from those four results.

Dimension metrics, created automatically

Switch on Create Dimension Metrics and every dimension you chose becomes a child metric per value: Revenue (Region: EMEA), Revenue (Region: APAC), and so on. Each child gets its own owner, baseline and nightly driver tests. No changes to the document.

Revenue

Create Dimension Metrics · on

dimensions: region, channel · 5 child metrics created

Revenue (Region: EMEA)£612k4%
Revenue (Region: APAC)£318k21%
Revenue (Region: UK)£350k2%
Revenue (Channel: Web)£880k1%
Revenue (Channel: App)£400k9%

Each child has its own owner, baseline and nightly driver tests. No YAML changes.

Re-post as a diff, trees and owners untouched

Every document you post is compared with the last. New metrics appear, changed ones update in place, removed ones retire with their history kept. Ownership, trees and action history stay exactly where you left them.

Sync summary

Completed 06:14

42

Found

3

Created

38

Updated

1

Archived

0

Skipped

Dimension metrics created118

customer__customer_id skipped: 48,211 values, above the 50 value limit

Trees, owners and action history preserved · gross_margin renamed in place

Connected in three steps. Export the document, post it, link a warehouse.

Create an Ossie connection in the wizard, link the warehouse the definitions run on, and post the document from a terminal or the last step of your pipeline. Every post starts a sync.

Export an Ossie document from where your semantics live

A Snowflake Semantic View exports to Ossie YAML with SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW. A dbt Core 1.12 project writes osi_document.json into its target directory at parse time. Databricks metric views, Sigma, Omni and Tableau models convert with the tools in the Apache Ossie repository. Version 0.1.1 is what KPI Tree reads.
  • Snowflake: one system function, YAML out
  • dbt Core 1.12: osi_document.json beside semantic_manifest.json
  • Converters for Databricks, Sigma, Omni and Tableau in the Apache repo
exporttwo ways out

-- Snowflake: a Semantic View as Ossie YAML

SELECT SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW('analytics.marts.sales_sv');

-- dbt Core 1.12: written at parse time, no extra step

dbt parse

target/semantic_manifest.json

target/osi_document.json

Post it to your connection

Create an Ossie connection in the wizard and link the warehouse the definitions run on. Then post the YAML or JSON document to the connection’s upload endpoint with an API key scoped to semantic layer uploads, from a terminal or the last step of your pipeline. The document is encrypted at rest and the sync starts on arrival.
  • YAML or JSON, up to 50 MB
  • One scoped API key, no other credentials
  • Sync starts automatically on every post
post.shfrom any pipeline

curl -X POST \

-H "Authorization: Bearer $KPITREE_API_KEY" \

-F "spec=@target/osi_document.json" \

"https://acme.kpitree.co/api/connections/$CONNECTION_ID/semantic_layer/osi/artifacts"

-- 202 Accepted · converted to a MetricFlow manifest · sync started

The metrics run on your warehouse

Each metric in the document becomes one query at day grain, in the dialect of the Snowflake, BigQuery, Databricks, Redshift or PostgreSQL connection you link, run under read-only credentials. Nothing is re-declared. Where the standard leaves a rollup unsaid, KPI Tree infers one and marks it so you can change it.
  • One query per metric, on the warehouse you already run
  • Read-only credentials, nothing written back
  • Inferred rollups marked so you can change them

Warehouse connection

Connected
Hostanalytics-prod.••••••.cloud
Service credential••••••••••••
TLS verifiedScoped service credentialsSecrets encrypted

Read-only access · credentials never leave the encrypted store

What comes across from an Ossie document. And what the interchange leaves for KPI Tree to infer.

The spec carries definitions, not rollups. KPI Tree reads what is there, infers the rest, and says which is which.

Datasets, fields and relationships the model

Every dataset with its source, primary and unique keys and fields, the dimensions and the time dimensions, and the relationships between datasets. Descriptions come with them. Custom extensions from the exporting tool are carried but not interpreted.

Metrics ANSI SQL and Snowflake dialects

Model-level metrics with their expressions. A metric needs a day-level time dimension to sync, and one written only in a dialect KPI Tree cannot render is reported as skipped rather than guessed at.

Rollups inferred, then yours

Ossie carries no rollup rule, so KPI Tree infers one from each metric’s expression: sums and counts add up across weeks and months, averages and ratios take the latest value. Every inference is marked in the app and the sync report, and a rollup you set by hand is never overwritten.

Ask an agent the same question twice. Once on the semantic layer, once on Canopy above it.

An Ossie document already gives every tool in your stack the same governed number, and an agent on any of them comes back with it. The fair question is what Canopy adds. The pair below shows the shape of the difference, and the benchmark beneath it measures it on eight real business questions.

The semantic layer alone

A correct number, and a dead end.

Every consumer of the interchange, whichever platform it runs on, gets the same governed figure. None of them gets the cause, the owner or the follow-up, so the question goes back to the data team.

Why is revenue down this month?
Revenue is £1.28m month to date, 15% below last month. The metric is defined as the sum of order_total where status is complete.
I do not have information about what caused the change or who is responsible. Would you like me to break it down by region?

Canopy on top of dbt

The driver, the owner, the build check and the next step.

Canopy reads the causal tree, the RACI, the build history from your dbt artifacts and the open tasks, so the first answer is the one people act on.

Why is revenue down this month?
Conversion rate is the driver, down 23%, Granger-causal at a three day lag. Traffic and order value are flat. The drop starts the day after Monday's checkout release.
The data is sound: fct_orders built at 06:12 and every source passed freshness. Sarah Chen is Accountable and a rollback task is already open. Shall I attach this analysis to it?
driver · q < 0.05owner · Sarah Chenbuild · freshtask · open

Or connect the source directly. dbt, Snowflake Semantic Views and Unity Catalog metric views each have a native path.

If your definitions live in dbt, in a Snowflake Semantic View or in a Unity Catalog metric view, the native integrations read them without an export step and keep the source doing the maths. The Ossie path is for everything else, and for definitions that move between tools.

Common questions

What is Apache Ossie, and how does it relate to the Open Semantic Interchange?

They are the same standard. The Open Semantic Interchange, OSI, was founded by Snowflake, dbt Labs and Salesforce in 2025 as a vendor-neutral YAML and JSON format for semantic models, and it entered the Apache Incubator in 2026 under the name Apache Ossie. Version 0.1.1 is the released spec and the one KPI Tree reads.

Which tools produce an Ossie document today?

Snowflake exports any Semantic View to Ossie YAML with SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW. dbt Core 1.12 writes osi_document.json into the target directory at parse time. Strategy Mosaic and Honeydew export natively. Databricks metric views, Sigma, Omni, Salesforce and Tableau models convert with the tools in the Apache Ossie repository.

How does KPI Tree read an Ossie document?

Post the document to your connection and every dataset, dimension, relationship and metric in it becomes a tracked metric, exactly as defined. Each metric runs as one query at day grain on the warehouse you link, under read-only credentials, and the sync reports what it created, updated and skipped.

How do I set up an Ossie connection?

Create an Ossie connection in the wizard, link the warehouse the definitions run on, and post the document to the connection’s upload endpoint with an API key scoped to semantic layer uploads, from a terminal or from the last step of your pipeline. Every post starts a sync.

What comes across, and what has to be inferred?

Datasets with their keys and fields, dimensions and time dimensions, relationships, metrics, descriptions and AI context come across from the document. The standard carries no rollup rule, so KPI Tree infers one from each metric’s expression, marks it in the app and the sync report, and never overwrites a rollup you set by hand.

Which expression dialects are supported?

Expressions in the ANSI SQL or Snowflake dialect render as written. A metric that only carries another dialect, or that has no day-level time dimension, is reported as skipped rather than guessed at.

Which warehouses can the metrics run on?

Snowflake, BigQuery, Databricks, Redshift and PostgreSQL. The linked connection should point at the database the document’s datasets resolve in.

Does KPI Tree export Ossie?

Not at present. KPI Tree imports Ossie documents; it does not write them. If you need a definition to travel, export it from the tool that owns it and post it here.

Should I use Ossie or a native integration?

If your definitions live in dbt, in a Snowflake Semantic View or in a Unity Catalog metric view, use the native integration: it reads the source without an export step and keeps the source doing the maths. The Ossie path is for definitions that live elsewhere, or that move between tools.

What happens when the document changes?

Post it again. Each sync is compared with the previous one and the report lists what was created, updated, retired and skipped. Trees, ownership, action history and any rollup you set by hand are preserved.

You made the definition portable. Now make the decision accountable.

Post an Ossie document and see your own metrics as a causal tree with named owners and verified actions, in a demo on your data.

The guide

Semantic layer vs business context layer: what a definition settles, and what it cannot.

Read the guide

Experience That Matters

Built by a team that's been in your shoes

Our team brings deep experience from leading Data, Growth and People teams at some of the fastest growing scaleups in Europe through to IPO and beyond. We've faced the same challenges you're facing now.

Checkout.com
Planet
UK Government
Travelex
BT
Sainsbury's
Goldman Sachs
Dojo
Redpin
Farfetch
Just Eat for Business