diff --git a/docs/components/anomaly-support/index.md b/docs/components/anomaly-support/index.md
index d948cd2e24..48d077e21b 100644
--- a/docs/components/anomaly-support/index.md
+++ b/docs/components/anomaly-support/index.md
@@ -1,20 +1,20 @@
| Type | Supported |
|---------|--------------------------|
-|
Record
Flag inconsistencies at the row level
| :octicons-check-16:
|
-| Shape
Flag inconsistencies in the overall patterns and distributions of a field
| :octicons-check-16:
|
+| RecordFlag inconsistencies at the row level
| :material-check-circle:{ style="color: #4caf50" }
|
+| ShapeFlag inconsistencies in the overall patterns and distributions of a field
| :material-check-circle:{ style="color: #4caf50" }
|
| Type | Supported |
|---------|--------------------------|
-| Record
Flag inconsistencies at the row level
| :octicons-check-16:
|
-| Shape
Flag inconsistencies in the overall patterns and distributions of a field
| |
+| RecordFlag inconsistencies at the row level
| :material-check-circle:{ style="color: #4caf50" }
|
+| ShapeFlag inconsistencies in the overall patterns and distributions of a field
| :material-close-circle:{ style="color: #f44336" }
|
| Type | Supported |
|---------|--------------------------|
-| Record
Flag inconsistencies at the row level
| |
-| Shape
Flag inconsistencies in the overall patterns and distributions of a field
| :octicons-check-16:
|
+| RecordFlag inconsistencies at the row level
| :material-close-circle:{ style="color: #f44336" }
|
+| ShapeFlag inconsistencies in the overall patterns and distributions of a field
| :material-check-circle:{ style="color: #4caf50" }
|
diff --git a/docs/data-quality-checks/after-date-check.md b/docs/data-quality-checks/after-date-check.md
index 760fd1d6c8..758d3b8d30 100644
--- a/docs/data-quality-checks/after-date-check.md
+++ b/docs/data-quality-checks/after-date-check.md
@@ -228,10 +228,10 @@ Use After Date Time whenever you need to:
**Accepted Types**
-| Type | |
+| Type | Supported |
|---------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/any-not-null-check.md b/docs/data-quality-checks/any-not-null-check.md
index b551c7332c..a130a5010a 100644
--- a/docs/data-quality-checks/any-not-null-check.md
+++ b/docs/data-quality-checks/any-not-null-check.md
@@ -198,14 +198,14 @@ Any Not Null acts as a safety net that prevents contextless records from silentl
**Accepted Types**
-| Type | |
+| Type | Supported |
|---------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional` | :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional` | :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
## General Properties
diff --git a/docs/data-quality-checks/before-date-time-check.md b/docs/data-quality-checks/before-date-time-check.md
index be2bb00708..7d037b8ef1 100644
--- a/docs/data-quality-checks/before-date-time-check.md
+++ b/docs/data-quality-checks/before-date-time-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/between-check.md b/docs/data-quality-checks/between-check.md
index db59bf4c9f..e3bd6344d6 100644
--- a/docs/data-quality-checks/between-check.md
+++ b/docs/data-quality-checks/between-check.md
@@ -214,10 +214,10 @@ In this case, the Between check caught values that were technically valid number
**Accepted Types**
-| Type | |
+| Type | Supported |
|---------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional` | :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/between-times-check.md b/docs/data-quality-checks/between-times-check.md
index db2fb97828..6a61c369cf 100644
--- a/docs/data-quality-checks/between-times-check.md
+++ b/docs/data-quality-checks/between-times-check.md
@@ -185,10 +185,10 @@ Use Between Times whenever you need to validate **when** data occurs:
**Accepted Types**
-| Type | |
+| Type | Supported |
|---------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/contains-credit-card-check.md b/docs/data-quality-checks/contains-credit-card-check.md
index ff537fd89e..d962659f49 100644
--- a/docs/data-quality-checks/contains-credit-card-check.md
+++ b/docs/data-quality-checks/contains-credit-card-check.md
@@ -142,9 +142,9 @@ Contains Credit Card acts as a guardrail for payment data. If a system says *“
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/contains-email-check.md b/docs/data-quality-checks/contains-email-check.md
index 33c82935dc..41e2b4b439 100644
--- a/docs/data-quality-checks/contains-email-check.md
+++ b/docs/data-quality-checks/contains-email-check.md
@@ -157,9 +157,9 @@ Manual data review works only at small scale. Automated checks like **Contains E
**Accepted Types**
-| Type | |
+| Type | Supported |
|----------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/contains-social-security-number-check.md b/docs/data-quality-checks/contains-social-security-number-check.md
index 9384da9306..cd0ec5d6bb 100644
--- a/docs/data-quality-checks/contains-social-security-number-check.md
+++ b/docs/data-quality-checks/contains-social-security-number-check.md
@@ -156,9 +156,9 @@ The **Contains Social Security Number** check acts as an automated safeguard—e
**Accepted Types**
-| Type | |
+| Type | Supported |
|---------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/contains-url.md b/docs/data-quality-checks/contains-url.md
index 6a602ab874..14b64bd442 100644
--- a/docs/data-quality-checks/contains-url.md
+++ b/docs/data-quality-checks/contains-url.md
@@ -10,9 +10,9 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|---------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/data-diff-check.md b/docs/data-quality-checks/data-diff-check.md
index db775c93fe..f985f557a8 100644
--- a/docs/data-quality-checks/data-diff-check.md
+++ b/docs/data-quality-checks/data-diff-check.md
@@ -254,14 +254,14 @@ Use Data Diff whenever you:
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/distinct-count-check.md b/docs/data-quality-checks/distinct-count-check.md
index cbb1506a80..9b8a42e8b8 100644
--- a/docs/data-quality-checks/distinct-count-check.md
+++ b/docs/data-quality-checks/distinct-count-check.md
@@ -10,14 +10,14 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/entity-resolution.md b/docs/data-quality-checks/entity-resolution.md
index 1876a2df44..618857527e 100644
--- a/docs/data-quality-checks/entity-resolution.md
+++ b/docs/data-quality-checks/entity-resolution.md
@@ -16,9 +16,9 @@ entity identifier shares the same value for the designated `distinction field`
**Accepted Types**
-| Type | |
+| Type | Supported |
|----------|----------------------------------------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/equal-to-check.md b/docs/data-quality-checks/equal-to-check.md
index 84fde7939b..8dbe217a84 100644
--- a/docs/data-quality-checks/equal-to-check.md
+++ b/docs/data-quality-checks/equal-to-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/equal-to-field-check.md b/docs/data-quality-checks/equal-to-field-check.md
index 809fc02609..c4f2c3d00d 100644
--- a/docs/data-quality-checks/equal-to-field-check.md
+++ b/docs/data-quality-checks/equal-to-field-check.md
@@ -10,12 +10,12 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|----------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/exists-in-check.md b/docs/data-quality-checks/exists-in-check.md
index b77125510b..a438ae4f3f 100644
--- a/docs/data-quality-checks/exists-in-check.md
+++ b/docs/data-quality-checks/exists-in-check.md
@@ -21,14 +21,14 @@ These enhancements enable businesses to maintain data integrity even in complex,
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/expected-values-check.md b/docs/data-quality-checks/expected-values-check.md
index 84d175d2dd..09f84a4545 100644
--- a/docs/data-quality-checks/expected-values-check.md
+++ b/docs/data-quality-checks/expected-values-check.md
@@ -16,14 +16,14 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/greater-than-check.md b/docs/data-quality-checks/greater-than-check.md
index 7cf30a5303..c23fa40f72 100644
--- a/docs/data-quality-checks/greater-than-check.md
+++ b/docs/data-quality-checks/greater-than-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/greater-than-field-check.md b/docs/data-quality-checks/greater-than-field-check.md
index 2ac38f19b0..60d10411cc 100644
--- a/docs/data-quality-checks/greater-than-field-check.md
+++ b/docs/data-quality-checks/greater-than-field-check.md
@@ -10,12 +10,12 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/is-address.md b/docs/data-quality-checks/is-address.md
index ae6fb1ec2f..1c19c841b6 100644
--- a/docs/data-quality-checks/is-address.md
+++ b/docs/data-quality-checks/is-address.md
@@ -14,9 +14,9 @@ This check leverages machine learning powered by the [libpostal library](https:/
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/is-credit-card-check.md b/docs/data-quality-checks/is-credit-card-check.md
index db51a8114d..210764f730 100644
--- a/docs/data-quality-checks/is-credit-card-check.md
+++ b/docs/data-quality-checks/is-credit-card-check.md
@@ -10,9 +10,9 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/is-replica-of-check.md b/docs/data-quality-checks/is-replica-of-check.md
index a1c3d58973..e5ed9f5a18 100644
--- a/docs/data-quality-checks/is-replica-of-check.md
+++ b/docs/data-quality-checks/is-replica-of-check.md
@@ -31,14 +31,14 @@ In a distributed data ecosystem, replication often occurs to maintain high avail
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/is-type-check.md b/docs/data-quality-checks/is-type-check.md
index 14c44f4a16..bb979dc0ce 100644
--- a/docs/data-quality-checks/is-type-check.md
+++ b/docs/data-quality-checks/is-type-check.md
@@ -10,9 +10,9 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/less-than-check.md b/docs/data-quality-checks/less-than-check.md
index cbe033658b..5c9835c426 100644
--- a/docs/data-quality-checks/less-than-check.md
+++ b/docs/data-quality-checks/less-than-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/less-than-field-check.md b/docs/data-quality-checks/less-than-field-check.md
index 3f5ae5297b..d32d658fbb 100644
--- a/docs/data-quality-checks/less-than-field-check.md
+++ b/docs/data-quality-checks/less-than-field-check.md
@@ -10,12 +10,12 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/matches-pattern-check.md b/docs/data-quality-checks/matches-pattern-check.md
index 03c07a6c92..c1f780a35e 100644
--- a/docs/data-quality-checks/matches-pattern-check.md
+++ b/docs/data-quality-checks/matches-pattern-check.md
@@ -14,9 +14,9 @@ Patterns, typically expressed as regular expressions, allow for the enforcement
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/max-length-check.md b/docs/data-quality-checks/max-length-check.md
index 836e4590bd..552537f45b 100644
--- a/docs/data-quality-checks/max-length-check.md
+++ b/docs/data-quality-checks/max-length-check.md
@@ -10,9 +10,9 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/max-value-check.md b/docs/data-quality-checks/max-value-check.md
index 021b3685e7..2a207e25db 100644
--- a/docs/data-quality-checks/max-value-check.md
+++ b/docs/data-quality-checks/max-value-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/metric-check.md b/docs/data-quality-checks/metric-check.md
index bf90ac84cc..1446151677 100644
--- a/docs/data-quality-checks/metric-check.md
+++ b/docs/data-quality-checks/metric-check.md
@@ -14,10 +14,10 @@ The `Metric` rule is designed to monitor the values of a selected field over tim
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/min-length-check.md b/docs/data-quality-checks/min-length-check.md
index c47b5d0f5c..ddb5e44e42 100644
--- a/docs/data-quality-checks/min-length-check.md
+++ b/docs/data-quality-checks/min-length-check.md
@@ -10,9 +10,9 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|------------|--------------------------|
-| `String` | :octicons-check-16:
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/min-value-check.md b/docs/data-quality-checks/min-value-check.md
index 058950e66f..cb3b9d47fe 100644
--- a/docs/data-quality-checks/min-value-check.md
+++ b/docs/data-quality-checks/min-value-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/not-exists-in-check.md b/docs/data-quality-checks/not-exists-in-check.md
index 101cbd96e4..04bf6511f6 100644
--- a/docs/data-quality-checks/not-exists-in-check.md
+++ b/docs/data-quality-checks/not-exists-in-check.md
@@ -21,14 +21,14 @@ These functionalities enable businesses to maintain data exclusivity even in int
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### Specific Properties
diff --git a/docs/data-quality-checks/not-future-check.md b/docs/data-quality-checks/not-future-check.md
index 82651a7f8e..2f1b2e1c05 100644
--- a/docs/data-quality-checks/not-future-check.md
+++ b/docs/data-quality-checks/not-future-check.md
@@ -10,10 +10,10 @@
**Accepted Fields**
-| Field | |
+| Field | Supported |
|-------------|-----------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/not-negative-check.md b/docs/data-quality-checks/not-negative-check.md
index a831a55014..cdfe09ec9a 100644
--- a/docs/data-quality-checks/not-negative-check.md
+++ b/docs/data-quality-checks/not-negative-check.md
@@ -10,10 +10,10 @@
**Accepted Fields**
-| Type | |
+| Type | Supported |
|-------------|-----------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/not-null-check.md b/docs/data-quality-checks/not-null-check.md
index 343b531dfb..9021323754 100644
--- a/docs/data-quality-checks/not-null-check.md
+++ b/docs/data-quality-checks/not-null-check.md
@@ -10,14 +10,14 @@
**Accepted Fields**
-| Type | |
+| Type | Supported |
|-------------|-----------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/overview-of-a-check.md b/docs/data-quality-checks/overview-of-a-check.md
index f245455d70..faf8627146 100644
--- a/docs/data-quality-checks/overview-of-a-check.md
+++ b/docs/data-quality-checks/overview-of-a-check.md
@@ -202,5 +202,5 @@ For more details about check rule types, please refer to the [**Rule Types Overv
| [Satisfies Expression](../data-quality-checks/satisfies-expression-check.md) | Evaluates the given expression (any valid `Spark SQL`) for each record. |
| [Sum](../data-quality-checks/sum-check.md) | Asserts that the sum of a field is a specific amount. |
| [Time Distribution Size](../data-quality-checks/time-distribution-size-check.md) | Asserts that the count of records for each interval of a timestamp is between two numbers. |
-| [Unique](../data-quality-checks/unique-check.md) | Asserts that the field's values are unique. When multiple fields are selected, asserts that the combination of values is unique (composite key). |
+| [Unique](../data-quality-checks/unique/introduction.md) | Asserts that the field's values are unique. When multiple fields are selected, asserts that the combination of values is unique (composite key). |
| [Volumetric](../data-quality-checks/volumetric-check.md) | Asserts that the data volume (rows or bytes) remains within dynamically inferred thresholds based on historical trends (daily, weekly, monthly).|
\ No newline at end of file
diff --git a/docs/data-quality-checks/positive-check.md b/docs/data-quality-checks/positive-check.md
index f0446f4e99..235f06f343 100644
--- a/docs/data-quality-checks/positive-check.md
+++ b/docs/data-quality-checks/positive-check.md
@@ -10,10 +10,10 @@
**Accepted Fields**
-| Type | |
+| Type | Supported |
|-------------|-----------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/predicted-by-check.md b/docs/data-quality-checks/predicted-by-check.md
index 75e6514a3b..b137cbfd06 100644
--- a/docs/data-quality-checks/predicted-by-check.md
+++ b/docs/data-quality-checks/predicted-by-check.md
@@ -14,12 +14,12 @@ The `Predicted By` rule is used to verify whether the actual values of a specifi
**Accepted Fields**
-| Type | |
+| Type | Supported |
|--------------|-----------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional` | :octicons-check-16:
|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/required-values-check.md b/docs/data-quality-checks/required-values-check.md
index a6c1a9ebbe..4d243976a5 100644
--- a/docs/data-quality-checks/required-values-check.md
+++ b/docs/data-quality-checks/required-values-check.md
@@ -16,14 +16,14 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/rule-types-overview.md b/docs/data-quality-checks/rule-types-overview.md
index 81b0a683e6..7f08905007 100644
--- a/docs/data-quality-checks/rule-types-overview.md
+++ b/docs/data-quality-checks/rule-types-overview.md
@@ -51,5 +51,5 @@ Here’s an overview of the rule types and their purposes:
| [Satisfies Expression](../data-quality-checks/satisfies-expression-check.md) | Evaluates the given expression (any valid `Spark SQL`) for each record. |
| [Sum](../data-quality-checks/sum-check.md) | Asserts that the sum of a field is a specific amount. |
| [Time Distribution Size](../data-quality-checks/time-distribution-size-check.md) | Asserts that the count of records for each interval of a timestamp is between two numbers. |
-| [Unique](../data-quality-checks/unique-check.md) | Asserts that the field's values are unique. When multiple fields are selected, asserts that the combination of values is unique (composite key). |
+| [Unique](../data-quality-checks/unique/introduction.md) | Asserts that the field's values are unique. When multiple fields are selected, asserts that the combination of values is unique (composite key). |
| [Volumetric Check](../data-quality-checks/volumetric-check.md) | Asserts that the volume of the data asset has not changed by more than an inclusive percentage amount for the prescribed moving daily average.|
\ No newline at end of file
diff --git a/docs/data-quality-checks/sum-check.md b/docs/data-quality-checks/sum-check.md
index a7813065d8..d38ed661dc 100644
--- a/docs/data-quality-checks/sum-check.md
+++ b/docs/data-quality-checks/sum-check.md
@@ -10,10 +10,10 @@
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
### General Properties
diff --git a/docs/data-quality-checks/time-distribution-size-check.md b/docs/data-quality-checks/time-distribution-size-check.md
index feaae4d95f..8025e5b36c 100644
--- a/docs/data-quality-checks/time-distribution-size-check.md
+++ b/docs/data-quality-checks/time-distribution-size-check.md
@@ -16,10 +16,10 @@ For instance, in a retail context, it could ensure that there’s a consistent n
**Accepted Types**
-| Type | |
+| Type | Supported |
|-------------|--------------------------|
-| `Timestamp` | :octicons-check-16:
|
-| `Date` | :octicons-check-16:
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
### Specific Properties
diff --git a/docs/data-quality-checks/unique-check.md b/docs/data-quality-checks/unique-check.md
deleted file mode 100644
index 99950be599..0000000000
--- a/docs/data-quality-checks/unique-check.md
+++ /dev/null
@@ -1,105 +0,0 @@
-# Unique
-
-### Definition
-
-*Asserts that each field's value is unique across rows. When multiple fields are selected, the combination of values across those fields must be unique (composite key).*
-
-### In-Depth Overview
-
-The Unique rule behaves in two modes depending on how many fields you select:
-
-- **Single field** — every value in the field must appear only once across all rows. Equivalent to enforcing a primary key on that column.
-- **Multiple fields (composite key)** — the *combination* of values across the selected fields must appear only once. Individual fields may repeat values, but the combined values across the selected fields must be unique on every row. This is equivalent to enforcing a composite/compound primary key.
-
-Typical use cases include enforcing primary key constraints, detecting duplicate records, and enforcing composite primary key uniqueness across multiple columns (for example, `(order_id, line_item_id)` in an order-lines table).
-
-### Field Scope
-
-**Multi:** The rule evaluates one or more specified fields.
-
-**Accepted Types**
-
-| Type | |
-|-------------|---------------------------|
-| `Date` | :octicons-check-16:
|
-| `Timestamp` | :octicons-check-16:
|
-| `Integral` | :octicons-check-16:
|
-| `Fractional`| :octicons-check-16:
|
-| `String` | :octicons-check-16:
|
-| `Boolean` | :octicons-check-16:
|
-
-### General Properties
-
-{%
- include-markdown "components/general-props/index.md"
- start=''
- end=''
-%}
-
-### Anomaly Types
-
-{%
- include-markdown "components/anomaly-support/index.md"
- start=''
- end=''
-%}
-
-### Example
-
-**Objective**: *Ensure that each combination of C_NAME and C_ADDRESS in the CUSTOMER table is unique.*
-
-**Sample Data**
-
-| C_CUSTKEY | C_NAME | C_ADDRESS |
-|-----------|-------------|----------------------|
-| 1 | Customer_A | 123 Main St |
-| 2 | Customer_B | 456 Oak Ave |
-| 3 | Customer_A | 123 Main St |
-| 4 | Customer_C | 789 Elm St |
-
-=== "Payload example"
- ``` json
- {
- "description": "Ensure that each combination of C_NAME and C_ADDRESS in the CUSTOMER table is unique",
- "coverage": 1,
- "properties": null,
- "tags": [],
- "fields": ["C_NAME", "C_ADDRESS"],
- "additional_metadata": {"key 1": "value 1", "key 2": "value 2"},
- "rule": "unique",
- "container_id": {container_id},
- "template_id": {template_id},
- "filter": "1=1"
- }
- ```
-
-**Anomaly Explanation**
-
-In the sample data above, the entries with `C_CUSTKEY` **1** and **3** share the same `(C_NAME, C_ADDRESS)` pair. Since the rule treats the selected fields as a composite key, this repeated combination violates uniqueness — even though either column alone could legitimately repeat.
-
-=== "Flowchart"
- ```mermaid
- graph TD
- A[Start] --> B[Retrieve C_NAME and C_ADDRESS]
- B --> C{Is the combination unique?}
- C -->|Yes| D[Move to Next Record/End]
- C -->|No| E[Mark as Anomalous]
- E --> D
- ```
-
-=== "SQL"
- ```sql
- -- An illustrative SQL query to find non-unique C_NAME and C_ADDRESS combinations.
- select
- c_custkey,
- c_name,
- c_address
- from customer
- group by c_name, c_address
- having count(*) > 1;
- ```
-
-**Potential Violation Messages**
-
-!!! example "Shape Anomaly"
- In `C_NAME` and `C_ADDRESS`, 25.000% of 4 filtered records (1) are not unique.
diff --git a/docs/data-quality-checks/unique/api.md b/docs/data-quality-checks/unique/api.md
new file mode 100644
index 0000000000..7fc51dc157
--- /dev/null
+++ b/docs/data-quality-checks/unique/api.md
@@ -0,0 +1,55 @@
+# :material-api:{ .middle style="color: var(--q-brick)" } Unique Check API
+
+The Unique check is created and managed through the standard Quality Checks API by setting `rule` to `unique` and listing one or more fields under `fields`. When `fields` contains a single entry, the check evaluates row-level uniqueness; when it contains two or more entries, it evaluates the **combination** of those fields as a composite key.
+
+!!! tip
+ For complete API documentation, including request and response schemas, visit the [API docs](https://demo.qualytics.io/api/docs){:target="_blank"}.
+
+## Payload Example
+
+Create a composite-key Unique check on `C_NAME` and `C_ADDRESS`, showing every field accepted by the create endpoint:
+
+```json
+{
+ "description": "Ensure that each combination of C_NAME and C_ADDRESS in the CUSTOMER table is unique",
+ "rule": "unique",
+ "fields": ["C_NAME", "C_ADDRESS"],
+ "container_id": 145,
+ "coverage": 1,
+ "filter": null,
+ "properties": null,
+ "tags": ["primary-key", "pii"],
+ "additional_metadata": {"jira": "DATA-1234"},
+ "anomaly_message_field": null,
+ "template_id": null,
+ "status": "Active",
+ "owner_id": 7,
+ "default_anomaly_assignee_id": 12
+}
+```
+
+## Field Notes
+
+| Field | Required | Notes |
+|:---|:---:|:---|
+| `description` | Yes | Free-text description shown in the UI. |
+| `rule` | Yes | Must be `"unique"`. |
+| `fields` | Yes | Array of field names. One entry → single-field unique; two or more entries → composite-key unique. |
+| `container_id` | Yes | ID of the container (table or file) the check runs against. |
+| `coverage` | No | Fractional value between `0` and `1` (`1` enforces 100% uniqueness). Defaults to `1` when omitted (strict mode: no duplicates tolerated). |
+| `filter` | No | Spark SQL `WHERE` expression. Applied **before** the uniqueness evaluation, so only filtered rows are grouped and compared. Send `null` for no filter. |
+| `properties` | No | For scalar fields, `null`. For Array fields, set `{"is_element_context": true}` to check uniqueness of elements *within* each array instead of treating the array as a single value. |
+| `tags` | No | List of tag names applied to the check for filtering and organization. |
+| `additional_metadata` | No | Free-form key-value pairs (typically links to catalog, tickets, governance records). |
+| `anomaly_message_field` | No | Name of a source-record field whose value should be used as the anomaly message instead of the system-generated one. In the UI this corresponds to the **Custom Anomaly Description** toggle (ON when the field is set, OFF when `null`). **Not applicable to Unique:** because the Unique check emits only Shape Anomalies (which use a fixed message template), this field is silently ignored at evaluation time. Send `null`. |
+| `template_id` | No | ID of a Check Template to associate the check with. `null` if not using a template. |
+| `status` | No | `"Active"` (default) or `"Draft"`. Draft checks are not evaluated by Scans. |
+| `owner_id` | No | ID of the user who owns the check. Defaults to the user creating the check when omitted. |
+| `default_anomaly_assignee_id` | No | ID of the user automatically assigned to anomalies produced by the check. |
+
+## Related
+
+- [Introduction](introduction.md){:target="_blank"}: formal definition, modes overview, field scope, and general/anomaly properties.
+- [How It Works](how-it-works.md){:target="_blank"}: full semantics, NULL handling, filter behavior, and edge cases.
+- [Examples](examples.md){:target="_blank"}: three production scenarios with sample data and resulting anomalies.
+- [FAQ](faq.md){:target="_blank"}: short answers to the most frequent questions.
diff --git a/docs/data-quality-checks/unique/examples.md b/docs/data-quality-checks/unique/examples.md
new file mode 100644
index 0000000000..b3dd554cde
--- /dev/null
+++ b/docs/data-quality-checks/unique/examples.md
@@ -0,0 +1,264 @@
+# :material-clipboard-text-outline:{ .middle style="color: var(--q-brick)" } Unique Check Examples
+
+Three real-world scenarios that show how the Unique check is typically used in production: enforcing a primary key on a single field, enforcing a composite key on a line-item table, and scoping uniqueness to a time window with a filter clause.
+
+=== "Single-Field Primary Key"
+
+ **The situation:** Your `customers` table holds one row per customer. The `customer_id` column must be unique across the whole table. Duplicate IDs would break downstream joins in the data warehouse.
+
+ **Check configuration**
+
+ | Field | Value |
+ |:---|:---|
+ | Rule | Unique |
+ | Fields | `customer_id` |
+ | Filter | *(none)* |
+ | Coverage | 100% |
+ | Custom Anomaly Description | Off |
+ | Status | Active |
+ | Owner | *(check creator)* |
+ | Anomaly Assignee | *(data-quality engineer)* |
+ | Tags | `pii`, `critical` |
+ | Additional Metadata | `jira: DATA-1234` |
+ | Description | Customer ID must be unique across the customers table |
+
+ **Payload**
+
+ ```json
+ {
+ "description": "Customer ID must be unique across the customers table",
+ "rule": "unique",
+ "fields": ["customer_id"],
+ "container_id": 145,
+ "coverage": 1,
+ "filter": null,
+ "properties": null,
+ "tags": ["pii", "critical"],
+ "additional_metadata": {"jira": "DATA-1234"},
+ "anomaly_message_field": null,
+ "template_id": null,
+ "status": "Active",
+ "owner_id": 7,
+ "default_anomaly_assignee_id": 12
+ }
+ ```
+
+ **Sample Data**
+
+ | customer_id | name | email |
+ |-------------|-------------|------------------------|
+ | 1001 | Alice Cohen | alice@example.com |
+ | 1002 | Ben Dias | ben@example.com |
+ | 1001 | Alice C. | alice.c@example.com |
+ | 1003 | Cara Mota | cara@example.com |
+
+ **What gets flagged**
+
+ `customer_id = 1001` repeats on rows 1 and 3, so both rows are reported as part of the duplicate group.
+
+ !!! example "Shape Anomaly"
+ For the field `customer_id`, 50.000% of 4 records (2) contain duplicate values
+
+ **Flowchart**
+
+ ```mermaid
+ graph TD
+ A["No filter, evaluate all rows"] --> B["Group rows by customer_id"]
+ B --> C{"Any customer_id
appears more than once?"}
+ C -->|No| D["All rows pass"]
+ C -->|Yes| E["Flag every row in the duplicate group.
customer_id 1001 appears twice, both flagged."]
+ ```
+
+ **Equivalent SQL**
+
+ ```sql
+ -- Rows the Unique check would flag for the customers table.
+ SELECT c.*
+ FROM customers c
+ INNER JOIN (
+ SELECT customer_id
+ FROM customers
+ GROUP BY customer_id
+ HAVING COUNT(*) > 1
+ ) dup ON c.customer_id = dup.customer_id
+ ORDER BY c.customer_id;
+ ```
+
+=== "Composite Key on Order Items"
+
+ **The situation:** Your `order_items` table holds the individual lines of each customer order. The combination of `(order_id, line_number)` must be unique. `order_id` legitimately repeats (one row per line of the same order) and `line_number` legitimately repeats (every order has a line 1), but the pair must be unique on each row.
+
+ **Check configuration**
+
+ | Field | Value |
+ |:---|:---|
+ | Rule | Unique |
+ | Fields | `order_id`, `line_number` |
+ | Filter | *(none)* |
+ | Coverage | 100% |
+ | Custom Anomaly Description | Off |
+ | Status | Active |
+ | Owner | *(check creator)* |
+ | Anomaly Assignee | *(orders-domain owner)* |
+ | Tags | `primary-key`, `orders` |
+ | Additional Metadata | `jira: DATA-2045` |
+ | Description | Each (order_id, line_number) pair must be unique in order_items |
+
+ **Payload**
+
+ ```json
+ {
+ "description": "Each (order_id, line_number) pair must be unique in order_items",
+ "rule": "unique",
+ "fields": ["order_id", "line_number"],
+ "container_id": 212,
+ "coverage": 1,
+ "filter": null,
+ "properties": null,
+ "tags": ["primary-key", "orders"],
+ "additional_metadata": {"jira": "DATA-2045"},
+ "anomaly_message_field": null,
+ "template_id": null,
+ "status": "Active",
+ "owner_id": 7,
+ "default_anomaly_assignee_id": 18
+ }
+ ```
+
+ **Sample Data**
+
+ | order_id | line_number | sku | quantity |
+ |----------|-------------|--------|----------|
+ | 5001 | 1 | SKU-A | 2 |
+ | 5001 | 2 | SKU-B | 1 |
+ | 5001 | 1 | SKU-C | 3 |
+ | 5002 | 1 | SKU-A | 1 |
+
+ **What gets flagged**
+
+ `order_id = 5001` legitimately repeats on rows 1, 2, and 3 (a 3-line order). `line_number = 1` legitimately repeats on rows 1, 3, and 4 (every order has a line 1). The violation is the combination `(5001, 1)`, which appears twice on rows 1 and 3, so both rows are reported as part of the duplicate group.
+
+ !!! example "Shape Anomaly"
+ For the field `order_id, line_number`, 50.000% of 4 records (2) contain duplicate values
+
+ **Flowchart**
+
+ ```mermaid
+ graph TD
+ A["No filter, evaluate all rows"] --> B["Group rows by the order_id, line_number tuple"]
+ B --> C{"Any tuple
appears more than once?"}
+ C -->|No| D["All rows pass"]
+ C -->|Yes| E["Flag every row in the duplicate group.
(5001, 1) appears twice, both flagged."]
+ ```
+
+ **Equivalent SQL**
+
+ ```sql
+ -- Rows the Unique check would flag for the order_items table.
+ SELECT oi.*
+ FROM order_items oi
+ INNER JOIN (
+ SELECT order_id, line_number
+ FROM order_items
+ GROUP BY order_id, line_number
+ HAVING COUNT(*) > 1
+ ) dup ON oi.order_id = dup.order_id
+ AND oi.line_number = dup.line_number
+ ORDER BY oi.order_id, oi.line_number;
+ ```
+
+=== "Scoped Uniqueness with Filter"
+
+ **The situation:** Your `events` table receives a daily feed of user activity. Within a single day, each `(user_id, event_type)` pair must appear only once, since an idempotent ingestion job is supposed to guarantee no same-day duplicates. The same pair is allowed to repeat *across* days, so a date-scoped uniqueness check is what you want.
+
+ **Check configuration**
+
+ | Field | Value |
+ |:---|:---|
+ | Rule | Unique |
+ | Fields | `user_id`, `event_type` |
+ | Filter | `event_date = current_date()` |
+ | Coverage | 100% |
+ | Custom Anomaly Description | Off |
+ | Status | Active |
+ | Owner | *(check creator)* |
+ | Anomaly Assignee | *(ingestion on-call)* |
+ | Tags | `ingestion`, `idempotency` |
+ | Additional Metadata | `jira: DATA-3071` |
+ | Description | Within a single day, each (user_id, event_type) pair must be unique |
+
+ **Payload**
+
+ ```json
+ {
+ "description": "Within a single day, each (user_id, event_type) pair must be unique",
+ "rule": "unique",
+ "fields": ["user_id", "event_type"],
+ "container_id": 318,
+ "coverage": 1,
+ "filter": "event_date = current_date()",
+ "properties": null,
+ "tags": ["ingestion", "idempotency"],
+ "additional_metadata": {"jira": "DATA-3071"},
+ "anomaly_message_field": null,
+ "template_id": null,
+ "status": "Active",
+ "owner_id": 7,
+ "default_anomaly_assignee_id": 24
+ }
+ ```
+
+ **Why the filter matters**
+
+ The filter runs **before** the uniqueness evaluation. Each scan only groups and compares rows from today, so cross-day repeats (which are expected) are intentionally ignored. The check fires only when the ingestion job produces a genuine same-day duplicate.
+
+ **Sample Data** (filtered to `event_date = current_date()`)
+
+ | user_id | event_type | event_date | event_id |
+ |---------|------------|------------|------------|
+ | u-77 | login | today | e-001 |
+ | u-77 | checkout | today | e-002 |
+ | u-77 | login | today | e-003 |
+ | u-88 | login | today | e-004 |
+
+ **What gets flagged**
+
+ `(u-77, login)` appears twice on rows 1 and 3, so both rows are reported as part of the duplicate group. A separate `(u-77, login)` recorded yesterday would not affect today's scan because the filter scopes evaluation to the current day.
+
+ !!! example "Shape Anomaly"
+ For the field `user_id, event_type`, 50.000% of 4 records (2) contain duplicate values [filter: event_date = current_date()]
+
+ **Flowchart**
+
+ ```mermaid
+ graph TD
+ A["Apply filter: event_date = current_date()"] --> B["Group filtered rows by the user_id, event_type tuple"]
+ B --> C{"Any tuple appears
more than once within today's rows?"}
+ C -->|No| D["All filtered rows pass"]
+ C -->|Yes| E["Flag every row in the duplicate group.
(u-77, login) appears twice today, both flagged."]
+ ```
+
+ **Equivalent SQL**
+
+ ```sql
+ -- Rows the Unique check would flag for today's events.
+ SELECT e.*
+ FROM events e
+ INNER JOIN (
+ SELECT user_id, event_type
+ FROM events
+ WHERE event_date = current_date()
+ GROUP BY user_id, event_type
+ HAVING COUNT(*) > 1
+ ) dup ON e.user_id = dup.user_id
+ AND e.event_type = dup.event_type
+ WHERE e.event_date = current_date()
+ ORDER BY e.user_id, e.event_type;
+ ```
+
+## Related
+
+- [Introduction](introduction.md){:target="_blank"}: formal definition, modes overview, field scope, and general/anomaly properties.
+- [How It Works](how-it-works.md){:target="_blank"}: full semantics, NULL handling, filter behavior, and edge cases.
+- [API](api.md){:target="_blank"}: payload shape and field notes for creating a Unique check programmatically.
+- [FAQ](faq.md){:target="_blank"}: short answers to the most frequent questions.
diff --git a/docs/data-quality-checks/unique/faq.md b/docs/data-quality-checks/unique/faq.md
new file mode 100644
index 0000000000..f093fea3f5
--- /dev/null
+++ b/docs/data-quality-checks/unique/faq.md
@@ -0,0 +1,60 @@
+# :material-help-circle-outline:{ .middle style="color: var(--q-brick)" } Unique Check FAQ
+
+Common questions about how the Unique check evaluates uniqueness, how it handles NULLs and filters, and how anomalies are reported.
+
+## Behavior
+
+### What happens when I select multiple fields?
+
+The combination of values across the selected fields must be unique on every row (composite key). Individual columns can repeat values; only the **combined** tuple has to be unique. For example, a Unique check on `(order_id, line_number)` allows `order_id` to repeat and `line_number` to repeat, but the pair must be unique.
+
+### How are NULLs treated?
+
+The check treats NULL as a real value when grouping rows. Multiple rows where the selected field is NULL (or where every field of the composite key is NULL) are counted as duplicates and flagged as a violation. This is different from a SQL `UNIQUE` constraint, where NULLs are treated as distinct from each other. If you need SQL-style NULL semantics, combine the Unique check with a `WHERE field IS NOT NULL` filter.
+
+### Does the filter clause run before or after the uniqueness check?
+
+Before. The platform applies the filter first and then evaluates uniqueness only on the rows that pass the filter. This lets you scope a Unique check to a subset of records (for example, only `status = 'active'` rows) without flagging duplicates that exist outside the scope.
+
+## Anomaly Reporting
+
+### Why does the violation count include both copies of a duplicate, not just the extra one?
+
+The platform reports every row that participates in a duplicate group as part of the violation. If `(Customer_A, 123 Main St)` appears on rows 1 and 3, both rows are flagged, not just row 3. This makes the resulting anomaly count match the rows you would see by running a `SELECT ... WHERE (a, b) IN (duplicates)` query against the source data.
+
+### What does the Shape Anomaly message look like?
+
+Single-field: `For the field 'order_id', X.XXX% of N records (K) contain duplicate values`
+
+Composite key (multi-field): `For the field 'order_id, line_number', X.XXX% of N records (K) contain duplicate values`
+
+The template wording uses *"field"* (singular) even when multiple fields are checked; the joined field list inside the quotes is how you tell single-field from composite-key checks at a glance.
+
+### Why doesn't Unique produce a Record Anomaly?
+
+Unique is a *shape*-only rule type: the violation is a property of the dataset as a whole (a duplicate group), not of an individual record's value. Other rule types (such as Min Value or Matches Pattern) can produce Record Anomalies because each row's value can be evaluated independently against the rule.
+
+## Configuration
+
+### Does Unique have any rule-specific properties?
+
+For scalar fields, no: the rule is fully defined by the **fields** it applies to, the **coverage**, and the optional **filter** clause, and `properties` is `null`. For Array fields, there is one optional property: setting `properties` to `{"is_element_context": true}` makes the check evaluate uniqueness of elements *within* each array instead of treating the array as a single value. See the [API](api.md){:target="_blank"} page for the payload shape.
+
+### Can I lower the coverage on a Unique check?
+
+Yes. Coverage at 100% (`1.0`) means *every* row must be part of a unique tuple; lowering it to, say, 99.5% (`0.995`) means the check tolerates up to 0.5% of records appearing in duplicate groups before flagging an anomaly. This is useful when a small known gap of duplicates is acceptable.
+
+### Can I combine Unique with a Not Null check on the same column?
+
+Yes, and it is a common pattern when you want true primary-key semantics. Add a [Not Null](../not-null-check.md){:target="_blank"} check alongside the Unique check on the same field; together they enforce the equivalent of a SQL `PRIMARY KEY` (`UNIQUE` + `NOT NULL`).
+
+### Does Custom Anomaly Description (the `anomaly_message_field` payload field) work for Unique?
+
+No. The Custom Anomaly Description toggle (and the corresponding `anomaly_message_field` payload field) only affects Record Anomaly messages. Because Unique emits only Shape Anomalies, the field is silently ignored at evaluation time, and the resulting anomaly message uses the fixed Shape Anomaly template described above.
+
+## Related
+
+- [Introduction](introduction.md){:target="_blank"}: formal definition, modes overview, field scope, and general/anomaly properties.
+- [How It Works](how-it-works.md){:target="_blank"}: full semantics, NULL handling, filter behavior, and edge cases.
+- [API](api.md){:target="_blank"}: payload example and field notes for creating a Unique check programmatically.
+- [Examples](examples.md){:target="_blank"}: three production scenarios with sample data and resulting anomalies.
diff --git a/docs/data-quality-checks/unique/how-it-works.md b/docs/data-quality-checks/unique/how-it-works.md
new file mode 100644
index 0000000000..2193a802ce
--- /dev/null
+++ b/docs/data-quality-checks/unique/how-it-works.md
@@ -0,0 +1,138 @@
+# :material-information-outline:{ .middle style="color: var(--q-brick)" } How Unique Checks Work
+
+This page covers everything the Unique check does, in detail: how it decides which rows are violations, how single-field and composite-key checks differ, and how NULL values affect grouping. It also covers the filter clause, coverage, the resulting anomaly, and how Unique relates to other rule types.
+
+If you only need a quick reference, the [Introduction](introduction.md){:target="_blank"} page covers the formal definition, the two modes, field scope, and general/anomaly properties. This page is the detailed reference.
+
+## How the Check Evaluates Uniqueness
+
+Every Unique check follows the same four-step evaluation flow, regardless of how many fields you select:
+
+1. **Apply the filter clause.** If the check has a `filter` set, only the rows that match the filter expression continue to the next step. Rows that fall outside the filter are ignored and cannot cause a violation.
+2. **Group the remaining rows by the selected fields.** For a single-field check, rows are grouped by that one column's value. For a multi-field check, rows are grouped by the tuple of values across all selected columns.
+3. **Find groups with more than one row.** Any group of size 2 or larger represents a duplicate: every row in that group has the same key (or tuple of keys) as at least one other row in the filtered set.
+4. **Report every row in every duplicate group as a Shape Anomaly.** This means the violation count reflects *all* rows that participate in a duplicate, not just the "extra" copies. If `customer_id = 1001` appears on rows 1 and 3, both rows are reported.
+
+The order of operations matters: the filter is applied **before** the grouping, so rows that the filter excludes cannot contribute to a duplicate group or to the violation count.
+
+## Single-Field vs. Composite-Key Semantics
+
+The Unique check supports two modes, switched by the number of fields you list in `fields`:
+
+### Single Field
+
+Every row's value in the selected column must be distinct from every other row's value in that column. This is the textbook uniqueness constraint and is equivalent to a SQL `UNIQUE` constraint on a single column (with the NULL caveat described below).
+
+Typical use: enforcing a primary key (`customer_id`, `order_id`, `sku`) on a dimension or fact table where the column is the identifier.
+
+### Multiple Fields (Composite Key)
+
+The **combination** of values across all selected fields must be unique on each row. Individual columns may freely repeat, but the tuple as a whole must not. This is equivalent to a composite `UNIQUE` constraint in SQL.
+
+Typical use: enforcing uniqueness on a junction or line-item table where neither column alone is a key (`(order_id, line_number)` on `order_items`, `(student_id, course_id)` on enrollments, `(user_id, event_type, event_date)` on daily event aggregates).
+
+!!! note "Field order doesn't affect duplicate detection"
+ `["a", "b"]` and `["b", "a"]` flag the same rows as duplicates. The anomaly message reflects the order you specified (the field names are joined in the order they appear in `fields`).
+
+## How NULLs Are Handled
+
+This is a common source of confusion with the Unique check, so it deserves its own section.
+
+**The platform treats NULL as a real value when grouping rows.** Two rows where the selected field is NULL are placed in the *same* group and are therefore counted as duplicates of each other. The same applies to composite keys: two rows where every selected field is NULL share a key (a tuple of all NULLs) and will be flagged.
+
+This is **different from a SQL `UNIQUE` constraint**, where NULL is treated as *distinct from every other value, including other NULLs*, so a SQL `UNIQUE` column can hold many NULL rows without violating the constraint. The Unique check is stricter on NULL.
+
+### When NULL handling matters
+
+| Situation | What the check does |
+|:---|:---|
+| A required field that should never be NULL | Combine Unique with a [Not Null](../not-null-check.md){:target="_blank"} check. Together they enforce true primary-key semantics (`UNIQUE` + `NOT NULL`). |
+| An optional field where many NULLs are expected | Add a `filter` clause like `external_ref IS NOT NULL` so only non-NULL rows are evaluated. |
+| A composite key where one column is optional | The tuple `(value, NULL)` repeats only if another row has the same value in the first column AND NULL in the second column. If you also want to exclude all-NULL tuples or repeated `(value, NULL)` pairs, filter the optional column with `IS NOT NULL`. See "Composite keys and partial NULLs" below. |
+
+### Composite keys and partial NULLs
+
+For a composite key like `(a, b)`, a row is grouped with another row only when the **full tuple** matches. So:
+
+- `(1, NULL)` and `(1, NULL)` → same group → duplicate.
+- `(1, NULL)` and `(1, 2)` → different groups → not a duplicate.
+- `(NULL, NULL)` repeated → same group → duplicate.
+
+If your data model allows partial NULLs in a composite key and you do not want repeated partial-NULL tuples or the all-NULL tuple to register as duplicates, scope the check with a filter that excludes those rows.
+
+## The Filter Clause
+
+The filter clause is a Spark SQL `WHERE` expression that the platform applies before the uniqueness evaluation. It serves two purposes:
+
+1. **Scoping the check.** Restrict uniqueness to a subset of the data (for example, `status = 'active'`, `event_date = current_date()`, or `tenant_id = 42`). Rows outside the scope cannot trigger a violation and are not counted in the totals reported in the anomaly message.
+2. **Working around NULL semantics.** A filter such as `email IS NOT NULL` makes the Unique check behave like a SQL `UNIQUE` constraint on the `email` column by removing NULL rows from consideration entirely.
+
+The filter is part of the check definition, so the anomaly message includes the filter expression (`[filter: ]`) when one is set, making it explicit which slice of data was evaluated when the anomaly fired.
+
+## Coverage and Tolerance
+
+Coverage is a fractional value between `0` and `1` that sets the threshold for what counts as a violating shape:
+
+- **`1.0` (100%):** every row must be part of a singleton group. Any duplicate triggers a Shape Anomaly. This is the default and the most common setting.
+- **`< 1.0`:** the check tolerates a fraction of records appearing in duplicate groups before flagging an anomaly. For example, `0.995` allows up to 0.5% of rows to participate in duplicates without firing.
+
+Lower coverage values are useful when a small, known fraction of duplicates is expected (legacy data that has not been deduplicated yet, slow-running migrations, or a tolerated overlap between data sources). Use coverage with care: lowering it by, say, 0.5% means a real regression introducing duplicates in up to 0.5% of rows will look identical to the tolerated baseline and won't fire.
+
+## The Resulting Shape Anomaly
+
+When the Unique check fires, it produces a single **Shape Anomaly** describing the dataset-level violation. The Unique check does **not** produce Record Anomalies: uniqueness is a property of the dataset as a whole (a duplicate group), not of any individual row's value, so the platform reports the violation at the shape level only.
+
+### Anomaly message format
+
+Single-field check:
+
+```
+For the field 'order_id', X.XXX% of N records (K) contain duplicate values
+```
+
+Composite-key check:
+
+```
+For the field 'order_id, line_number', X.XXX% of N records (K) contain duplicate values
+```
+
+The template wording uses "field" (singular) even when multiple fields are checked; the joined list inside the quotes is what distinguishes single-field from composite-key checks at a glance.
+
+When a filter is set, the message is followed by `[filter: ]`.
+
+### What the numbers mean
+
+- **X.XXX%:** the fraction of filtered rows that participate in any duplicate group. If 2 rows out of 4 are part of duplicates, this reads `50.000%`.
+- **N:** the total number of rows the check evaluated (after the filter, if any).
+- **K:** the number of rows that participate in any duplicate group, counted in full (not "extras only"). For 2 rows sharing the same tuple, K = 2, not 1.
+
+Because K is the full count (and not just the extras), the anomaly's row count matches 1:1 against the rows you would find by running the equivalent SQL `WHERE (a, b) IN (duplicate combinations)` query.
+
+## Relationship with Other Rule Types
+
+The Unique check is most powerful when used together with a small set of complementary rule types:
+
+| Rule Type | Why pair it with Unique |
+|:---|:---|
+| [Not Null](../not-null-check.md){:target="_blank"} | Together they enforce true primary-key semantics. Unique alone treats NULL like any other value, so a second NULL row becomes a duplicate of the first. Pairing it with Not Null on the same column rejects every NULL up front and gives you `UNIQUE` + `NOT NULL`. |
+| [Distinct Count](../distinct-count-check.md){:target="_blank"} | Unique guarantees that the column has no duplicates; Distinct Count asserts the *number* of distinct values is what you expect. Use Distinct Count when the cardinality is itself meaningful (for example, "this lookup table should always have exactly 7 states"). |
+| [Exists In](../exists-in-check.md){:target="_blank"} / [Not Exists In](../not-exists-in-check.md){:target="_blank"} | Unique handles intra-table integrity (one table's rows are unique); Exists In and Not Exists In handle referential integrity across tables (foreign keys). The three rule types together model the relational core: primary keys, no duplicates, and valid references. |
+| [Satisfies Expression](../satisfies-expression-check.md){:target="_blank"} | Use a custom Spark SQL expression alongside Unique when uniqueness depends on a derived value (for example, uniqueness of `LOWER(email)` or of a hashed identifier). The Satisfies Expression check can complement Unique by enforcing the canonical form, and Unique enforces no duplicates on the raw column. |
+
+The Unique check can also be created automatically as an **AI Managed check** when a Profile operation detects that a column is fully unique in the observed data. See the [AI Managed Checks Introduction](../ai-managed/introduction.md){:target="_blank"} for how AI Managed checks are generated and how editing one converts it to Authored.
+
+## Performance Considerations
+
+Uniqueness evaluation requires the platform to group every filtered row by the selected fields, which is a distributed operation. Two practical implications:
+
+- **Composite keys with many fields cost more to evaluate** than single-field unique checks, because the grouping work scales with the size of each row's key. Most production composite keys use 2-4 fields; going much wider is rare and worth a second look at the data model.
+- **Filtering before evaluation reduces the cost.** A filter that narrows the dataset to a meaningful subset (today's records, a single tenant, active rows only) shrinks the grouping workload proportionally. When uniqueness only matters within a scope, set the filter to that scope explicitly.
+
+There is no separate optimized path for single-field Unique versus composite Unique; the same evaluation flow applies. Performance differences come from how much data is grouped and how wide each key is.
+
+## Related
+
+- [Introduction](introduction.md){:target="_blank"}: formal definition, modes overview, field scope, and general/anomaly properties.
+- [Examples](examples.md){:target="_blank"}: three production scenarios with sample data and resulting anomalies.
+- [API](api.md){:target="_blank"}: payload shape and field notes for creating a Unique check programmatically.
+- [FAQ](faq.md){:target="_blank"}: short answers to the most frequent questions.
diff --git a/docs/data-quality-checks/unique/how-to-create.md b/docs/data-quality-checks/unique/how-to-create.md
new file mode 100644
index 0000000000..3418746197
--- /dev/null
+++ b/docs/data-quality-checks/unique/how-to-create.md
@@ -0,0 +1,73 @@
+
+
+# :material-plus-circle:{ .middle style="color: var(--q-brick)" } How to Create a Unique Check
+
+Configure a Unique check inside the **Authored Check Details** modal. For the navigation steps that get you to the modal (selecting the datastore, opening the Checks tab, clicking **Add :material-plus:** → **Check**), see [Authored Check](../authored-check.md){:target="_blank"}.
+
+!!! tip "Prerequisites"
+ - At least the **Author** team permission on the datastore.
+ - A container (table or file) already loaded into the datastore.
+ - The field (or fields) you want to enforce uniqueness on exists on the container.
+
+## Configure the Unique Check
+
+**Step 1:** Set the **Rule Type** to **Unique**.
+
+The form simplifies because Unique has no rule-specific Properties section: the rule is fully defined by the fields, filter, and coverage.
+
+**Step 2:** Select the **File** (or table) the check should run against.
+
+**Step 3:** Select one or more **Fields**.
+
+- For a **single-field** Unique check, pick the column that must be unique row-by-row (for example, `customer_id`).
+- For a **composite-key** Unique check, pick two or more columns. The platform evaluates uniqueness on the *combination* of values, not on each column independently.
+
+**Step 4:** *(Optional)* Set a **Filter Clause** to scope the check to a subset of records.
+
+The filter is a Spark SQL `WHERE` expression evaluated **before** the uniqueness check. Use it to:
+
+- Limit the check to active or current rows (`status = 'active'`, `event_date = current_date()`).
+- Work around NULL handling (`email IS NOT NULL`) when you want SQL-style uniqueness semantics.
+
+**Step 5:** *(Optional)* Adjust **Coverage**.
+
+The default is **100%**, meaning every filtered row must be part of a singleton group. Lower it (for example, to `99.5%`) only when a small fraction of duplicates is expected and tolerated.
+
+**Step 6:** *(Optional)* Add a **Description**, **Tags**, and **Additional Metadata** for catalog and triage purposes. These do not affect evaluation.
+
+## Validate and Save
+
+**Step 7:** Click **Validate** at the bottom of the modal.
+
+The platform runs the check against the data without saving. A green confirmation message appears when the rule is well-formed.
+
+**Step 8:** Click **Save** to create the check.
+
+The new Unique check appears in the Checks list with the Authored badge. The next Scan operation will evaluate it.
+
+!!! tip "Preview the results before saving"
+ For a richer preview that lists exactly which rows would be flagged, use [Dry Run](../../datastore-checks/dry-run.md){:target="_blank"} from the check's actions menu. Dry Run returns sample anomalies and source records, which is helpful when tuning the filter or coverage.
+
+## Common Variations
+
+The table below summarizes the three most common Unique check configurations. For end-to-end worked scenarios with sample data, see the [Examples](examples.md){:target="_blank"} page.
+
+| Goal | Fields | Filter | Coverage |
+|:---|:---|:---|:---|
+| Enforce a primary key on a single identifier | `customer_id` | *(none)* | `100%` |
+| Enforce a composite key on a junction or line-item table | `order_id`, `line_number` | *(none)* | `100%` |
+| Scope uniqueness to a time window | `user_id`, `event_type` | `event_date = current_date()` | `100%` |
+| Make Unique behave like SQL `UNIQUE` (NULLs distinct) | `email` | `email IS NOT NULL` | `100%` |
+| Tolerate a small known fraction of duplicates | `legacy_id` | *(none)* | `99.5%` |
+
+## Related
+
+- [Introduction](introduction.md){:target="_blank"}: formal definition, modes overview, field scope, and general/anomaly properties.
+- [How It Works](how-it-works.md){:target="_blank"}: full semantics, NULL handling, filter behavior, and edge cases.
+- [Examples](examples.md){:target="_blank"}: three production scenarios with sample data and resulting anomalies.
+- [API](api.md){:target="_blank"}: payload shape for creating a Unique check programmatically.
diff --git a/docs/data-quality-checks/unique/introduction.md b/docs/data-quality-checks/unique/introduction.md
new file mode 100644
index 0000000000..c3d2e3e01d
--- /dev/null
+++ b/docs/data-quality-checks/unique/introduction.md
@@ -0,0 +1,93 @@
+# :material-key-variant:{ .middle style="color: var(--q-brick)" } Unique Check
+
+## Definition
+
+*Asserts that each field's value is unique across rows. When multiple fields are selected, the combination of values across those fields must be unique (composite key).*
+
+## Overview
+
+The Unique rule behaves in two modes depending on how many fields you select:
+
+- **Single field**: every value in the field must appear only once across all rows. Equivalent to a SQL `UNIQUE` constraint on that column.
+- **Multiple fields (composite key)**: the *combination* of values across the selected fields must appear only once. Individual fields may repeat values, but the combined values across the selected fields must be unique on every row. This is equivalent to enforcing a composite/compound primary key.
+
+Typical use cases: enforcing primary keys, detecting duplicates, and enforcing composite-key uniqueness.
+
+## Field Scope
+
+**Multiple:** Accepts one or more fields. With two or more fields, uniqueness is evaluated on the tuple of values across all selected fields.
+
+**Accepted Types**
+
+| Type | Supported |
+|-------------|---------------------------|
+| `Date` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Timestamp` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Integral` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Fractional`| :material-check-circle:{ style="color: #4caf50" }
|
+| `String` | :material-check-circle:{ style="color: #4caf50" }
|
+| `Boolean` | :material-check-circle:{ style="color: #4caf50" }
|
+
+## General Properties
+
+{%
+ include-markdown "components/general-props/index.md"
+ start=''
+ end=''
+%}
+
+## Anomaly Types
+
+{%
+ include-markdown "components/anomaly-support/index.md"
+ start=''
+ end=''
+%}
+
+## Next Steps
+
+
+
+- :material-information-outline:{ .lg .middle } **How It Works**
+
+ ---
+
+ Full semantics: evaluation flow, NULL handling, filter behavior, coverage, and how Unique relates to other rule types.
+
+ [:octicons-arrow-right-24: How It Works](how-it-works.md)
+
+
+
+- :material-clipboard-text-outline:{ .lg .middle } **Examples**
+
+ ---
+
+ Three production scenarios with sample data, anomaly messages, and the SQL equivalent of what the check evaluates.
+
+ [:octicons-arrow-right-24: Examples](examples.md)
+
+- :material-api:{ .lg .middle } **API**
+
+ ---
+
+ Payload shape and field notes for creating a Unique check programmatically.
+
+ [:octicons-arrow-right-24: API](api.md)
+
+- :material-help-circle-outline:{ .lg .middle } **FAQ**
+
+ ---
+
+ Short answers to questions about composite keys, NULL handling, coverage, and anomaly reporting.
+
+ [:octicons-arrow-right-24: FAQ](faq.md)
+
+
diff --git a/docs/self-hosted/license/deep-dive/permissions.md b/docs/self-hosted/license/deep-dive/permissions.md
index 1bf3d084a1..9dc29c7349 100644
--- a/docs/self-hosted/license/deep-dive/permissions.md
+++ b/docs/self-hosted/license/deep-dive/permissions.md
@@ -25,11 +25,42 @@ This page covers the roles and permissions required to view and manage the licen
## API Permissions
-| Endpoint | Method | Required Role | Description |
-| :--- | :---: | :---: | :--- |
-| `/license/expiration` | GET | Admin | Retrieve license expiration date and deployment type. |
-| `/license/request` | GET | Admin | Generate a license request code. |
-| `/license/assign` | POST | Admin | Apply a new license key. |
+
+
+
+
+
+
+
+
+
+ | Endpoint |
+ Method |
+ Required Role |
+ Description |
+
+
+
+
+ /license/expiration |
+ GET |
+ Admin |
+ Retrieve license expiration date and deployment type. |
+
+
+ /license/request |
+ GET |
+ Admin |
+ Generate a license request code. |
+
+
+ /license/assign |
+ POST |
+ Admin |
+ Apply a new license key. |
+
+
+
!!! info "Full Permissions Reference"
For the complete permissions and roles matrix across all Qualytics features, see the [Team Permissions](../../../settings/security/teams/team-permissions/overview.md){:target="_blank"} page.
diff --git a/mkdocs.yml b/mkdocs.yml
index 1729b60cf8..68ee4a6751 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -309,7 +309,14 @@ nav:
- Satisfies Expression: data-quality-checks/satisfies-expression-check.md
- Sum: data-quality-checks/sum-check.md
- Time Distribution Size: data-quality-checks/time-distribution-size-check.md
- - Unique: data-quality-checks/unique-check.md
+ - Unique:
+ - Introduction: data-quality-checks/unique/introduction.md
+ - How It Works: data-quality-checks/unique/how-it-works.md
+ # TODO: re-enable once how-to-create screenshots are added back
+ # - How to Create: data-quality-checks/unique/how-to-create.md
+ - Examples: data-quality-checks/unique/examples.md
+ - API: data-quality-checks/unique/api.md
+ - FAQ: data-quality-checks/unique/faq.md
- Volumetric Checks: data-quality-checks/volumetric-check.md
- Check Templates: data-quality-checks/checks-template.md
- Apply Check Template for Quality Check: data-quality-checks/apply-check-template-for-quality-checks.md
@@ -1079,7 +1086,8 @@ plugins:
'checks/satisfies-expression-check.md': 'data-quality-checks/satisfies-expression-check.md'
'checks/sum-check.md': 'data-quality-checks/sum-check.md'
'checks/time-distribution-size-check.md': 'data-quality-checks/time-distribution-size-check.md'
- 'checks/unique-check.md': 'data-quality-checks/unique-check.md'
+ 'checks/unique-check.md': 'data-quality-checks/unique/introduction.md'
+ 'data-quality-checks/unique-check.md': 'data-quality-checks/unique/introduction.md'
'checks/volumetric-check.md': 'data-quality-checks/volumetric-check.md'
'checks/checks-template.md': 'data-quality-checks/checks-template.md'
'checks/apply-check-template-for-quality-checks.md': 'data-quality-checks/apply-check-template-for-quality-checks.md'