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
quality.check_category/quality.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.
quality.check_category and quality.governance_category are the documented
annotation names. The original synq.check_category and
synq.governance_category names remain supported permanently, so existing
configurations do not need to change.Both namespaces also accept an underscore in place of the dot (for example,
quality_check_category). A producer may prefix the annotation name; matching
by suffix means a name such as dbt.tag.quality.check_category resolves the
same way. Use the quality.* names in new configurations.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 in the same scope 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 take precedence over the global, Coalesce Quality-provided
rules whatever their priority. A global rule applies only when no workspace rule
matches the check, so overriding a global rule takes a workspace rule that
matches, not a higher priority number. 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.