not_null
test, a dbt not_null_proportion test, an elementary test, a SQLMesh audit,
and a hand-written SQL assertion can all be checking the same thing — that a
column has no missing values — yet none of them share a name. Left as-is,
there’s no way to ask “how well is completeness covered across my stack?”
without knowing every tool’s vocabulary.
Check categorisation solves this. Coalesce Quality categorises every check
(dbt tests, SQLMesh audits, custom assertions, …) as it is ingested, mapping
each one onto a consistent taxonomy regardless of which tool produced it.
That shared vocabulary is what powers the analytics dashboards, coverage
reports, and filtering across the product — so a check only shows up in the
right place if it is categorised correctly.
Categorisation happens along two independent dimensions:
The governance dimension maps onto the
data quality dimensions you see in Analytics.
The technical dimension groups checks by their validation logic — for example
every
not_null variant across dbt, SQLMesh and custom SQL collapses into a
single nullness group.
A check carries one category per dimension. The two are resolved
independently, so a single check can be Completeness for governance and
nullness for technical at the same time.
Where categories come from
For each dimension, a check’s effective category is resolved from three sources, in descending priority:- Admin override — a per-check category set by a workspace admin from the Checks tab (see Per-check overrides). Overrides always win.
- Producer-explicit category — set directly by the producer, or carried on
the source asset as a
synq.check_category/synq.governance_categoryannotation. - Computed category — derived by the categorisation engine from the categorisation rules described below. A matching workspace rule wins over a matching global rule.
Categorisation rules
A categorisation rule says “checks matching this predicate get this category”. Rules are managed under Health → Check categorisation, which has a section per dimension (Governance, Technical) plus a Checks section for inspecting how individual checks were categorised. Each rule has:- a category — the value assigned to checks it matches (free-form, e.g.
completenessornullness); - a priority — when several rules match the same check, the highest-priority rule wins;
- a predicate — either a structured predicate or a CEL expression, never both.
Rules created in the app are workspace rules — they apply only to your
workspace and win over the global, Coalesce Quality-provided rules on a
priority tie. Global rules are maintained by Coalesce Quality administrators.
Structured predicate
The structured predicate matches on the facts a check already carries. A check matches when every non-empty group below contains the check’s value — an empty group matches anything.
For example, a rule with Platforms =
dbt and Kinds = not_null,
not_null_proportion matches every dbt not-null-style test and nothing else.
Names use * as a wildcard for any sequence of characters (every other
character is literal); multiple patterns are OR-ed.
Annotation predicates match a check’s annotations by key, with one of four
modes per key:
The platform and asset-type dropdowns are populated from checks actually present
in your workspace and narrow as you pick, so you only ever see real values.
CEL expressions
When the structured predicate isn’t expressive enough — string prefixes, regular expressions, combining conditions with|| — switch the predicate to a
CEL expression. The rule matches a check when the expression evaluates to
true.
CEL (Common Expression Language) is a
small, safe expression language. The following variables are available:
PLATFORM_* and ASSET_TYPE_* enum names are exposed as string constants, so
you can compare against them directly.