diff --git a/docs/anomalies/api.md b/docs/anomalies/api.md new file mode 100644 index 0000000000..f62d7b1045 --- /dev/null +++ b/docs/anomalies/api.md @@ -0,0 +1,394 @@ +# :material-api:{ .middle style="color: var(--q-brick)" } Anomalies API + +This page documents the REST endpoints for working with anomalies in Qualytics. All endpoints share the base URL of your deployment (for example, `https://your-instance.qualytics.io/api`) and require a Bearer token. + +Sections below are grouped by what you are trying to do. The same anomaly object is exchanged across reads and writes: see the [Anomaly schema](#anomaly-schema) section for the field reference. + +!!! tip + For complete API documentation, including request/response schemas, visit the [API docs](https://demo.qualytics.io/api/docs){:target="_blank"}. + +!!! note "Permissions" + All endpoints require the **Member** role. Most reads need the **Viewer** team permission on the anomaly's datastore; writes need the **Author** team permission (or higher), with description edits additionally requiring the **Editor** team permission. Ticket-link writes need the **Manager** role plus the **Author** team permission on the datastore. Per-endpoint requirements are called out below. + +## Anomaly schema + +Every read endpoint that returns an anomaly emits the same shape. The most relevant fields are: + +| Field | Type | Notes | +| :--- | :--- | :--- | +| `id` | `int` | Numeric primary identifier. | +| `uuid` | `string (UUID)` | Stable, globally unique identifier. | +| `type` | `"record" \| "shape"` | Anomaly category. See [Types](deep-dive/types.md){:target="_blank"}. | +| `status` | `string` | One of `Active`, `Acknowledged`, `Resolved`, `Duplicate`, `Invalid`, `Discarded`. See [Status](deep-dive/status.md){:target="_blank"}. | +| `weight` | `int` | Severity score. | +| `anomalous_records_count` | `int` | Number of records flagged for record anomalies. | +| `description` | `string` | User-editable business description. | +| `created` | `string (ISO 8601)` | When the anomaly was detected. | +| `fingerprint` | `int` | Used to deduplicate recurring anomalies. See [Fingerprints](deep-dive/fingerprints.md){:target="_blank"}. | +| `global_tags` | `Tag[]` | Tags applied to the anomaly. | +| `assignees` | `UserStub[]` | Users assigned to the anomaly. See [Assignees](deep-dive/assignees.md){:target="_blank"}. | +| `failed_checks` | `FailedCheck[]` | Checks that produced the anomaly. | +| `datastore`, `container`, `partition_scan` | refs | Source location of the anomaly. | + +??? example "Example response (abbreviated)" + + ```json + { + "id": 12345, + "uuid": "8e8b9f8b-1234-4abc-9def-012345678901", + "type": "record", + "status": "Active", + "weight": 54, + "anomalous_records_count": 1, + "description": "Customer ID is missing for new orders", + "created": "2026-05-15T17:22:08Z", + "fingerprint": 9182736455, + "global_tags": [{ "id": 7, "name": "High" }], + "assignees": [ + { "id": 42, "name": "Alice Lee", "email": "alice@example.com" } + ], + "failed_checks": [{ "id": 778, "rule_type": "notNull", "message": "..." }] + } + ``` + +## List and retrieve + +### List anomalies + +Returns a paginated list of anomalies sorted by creation timestamp and severity (most recent first). + +**Endpoint:** `GET /api/anomalies` + +**Permission:** Member. Results are scoped to datastores the caller can see. + +**Common query parameters (all optional, most accept multiple values):** + +| Parameter | Type | Description | +| :--- | :--- | :--- | +| `search` | `string` | Substring match on the anomaly message or ID. | +| `status` | `AnomalyStatusType[]` | Filter by status (`Active`, `Acknowledged`, `Resolved`, `Duplicate`, `Invalid`, `Discarded`). | +| `anomaly_type` | `"record" \| "shape"` | Filter by anomaly type. | +| `datastore`, `container` | `int[]` | Scope to specific datastores or containers. | +| `field`, `quality_check`, `rule_type` | varies | Scope to specific fields, checks, or rule types. | +| `tag` | `string[]` | Filter by tag names. | +| `assignee` | `int[]` | Filter by anomaly assignee user IDs. | +| `archived` | `"include" \| "only"` | Include or restrict to archived anomalies. | +| `timeframe`, `created_date`, `start_date`, `end_date` | varies | Time-based filters. | +| `related_to_id` | `int` | Return anomalies that share a fingerprint with the given anomaly. | +| `sort_id`, `sort_created`, `sort_weight`, `sort_anomalous_records_count` | `"asc" \| "desc"` | Sort options. | + +??? example "Example request" + + ```bash + curl -X GET "https://your-instance.qualytics.io/api/anomalies?status=Active&assignee=42&tag=High&sort_weight=desc" \ + -H "Authorization: Bearer YOUR_TOKEN" + ``` + + Returns active anomalies assigned to user 42 with the tag `High`, sorted by severity descending. + +### Get a single anomaly + +**Endpoint:** `GET /api/anomalies/{id}` + +`{id}` accepts either the numeric ID or the UUID. Pass `include_deleted=true` to surface anomalies that have been soft-deleted. + +??? example + + ```bash + curl -X GET "https://your-instance.qualytics.io/api/anomalies/12345" \ + -H "Authorization: Bearer YOUR_TOKEN" + ``` + +### Get failed checks for an anomaly + +Returns the list of checks that produced the anomaly, with the message text and the rule type for each. + +**Endpoint:** `GET /api/anomalies/{id}/failed-checks` + +## Update + +### Update a single anomaly + +Updates the writable fields of an anomaly. Only the fields you include in the body are changed; omitted fields are left untouched. + +**Endpoint:** `PUT /api/anomalies/{id}` + +**Permission:** Member role + **Author** team permission on the anomaly's datastore. Description updates additionally require the **Editor** team permission. + +**Body fields:** + +| Field | Type | Description | +| :--- | :--- | :--- | +| `status` | `"Active" \| "Acknowledged"` | Change the open-state of the anomaly. Setting `"Acknowledged"` on an archived anomaly restores it to the **Acknowledged** state (direct restore to `Active` is not allowed). Use the [delete endpoint](#archive-or-delete-a-single-anomaly) to archive. | +| `description` | `string` | User-editable business description. | +| `tags` | `string[]` | Tag names. Replaces the current set; pass `[]` to clear. | +| `assignee_ids` | `int[]` | User IDs assigned to the anomaly. Replaces the current set; pass `[]` to unassign everyone. Each user must have at least the **Viewer** team permission on the datastore. | + +??? example "Example request" + + ```bash + curl -X PUT "https://your-instance.qualytics.io/api/anomalies/12345" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "status": "Acknowledged", + "description": "Investigating with the data engineering team", + "tags": ["High", "Customer-Impact"], + "assignee_ids": [42, 57] + }' + ``` + +### Bulk update anomalies + +Applies the same changes to many anomalies in one call. + +**Endpoint:** `PATCH /api/anomalies` + +**Permission:** Member role + **Author** team permission on each anomaly's datastore. Description updates additionally require the **Editor** team permission on the corresponding datastore. + +**Body:** A list of bulk-update entries, each with the anomaly identifier plus the fields to change. Per-entry fields match the [single-update body](#update-a-single-anomaly), with the addition of: + +| Field | Type | Description | +| :--- | :--- | :--- | +| `id` | `int` or `UUID` | The anomaly to update. | + +??? example + + ```bash + curl -X PATCH "https://your-instance.qualytics.io/api/anomalies" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '[ + { "id": 12345, "status": "Acknowledged" }, + { "id": 12346, "assignee_ids": [42] }, + { "id": 12347, "tags": [] } + ]' + ``` + +### Manage assignees + +Assignees are managed via the standard update endpoints. The `assignee_ids` field is **replace-only**, so pass the full target set on every write rather than the changes you want to apply. + +**Endpoints:** + +- `PUT /api/anomalies/{id}` with `assignee_ids` in the body for a single anomaly. +- `PATCH /api/anomalies` with `assignee_ids` per entry for many anomalies. +- `GET /api/anomalies?assignee=` to filter the list by assignee. + +**Behavior:** + +- Each user passed in `assignee_ids` must have at least the **Viewer** team permission on the anomaly's datastore. Users without access are rejected. +- Pass `assignee_ids: []` to unassign everyone. +- To add a user to an existing set, read `assignees` first and submit the union. The API does not support append. +- Auto-assignment from a check's default assignee runs only at anomaly creation and is not reachable through this endpoint. See [Deep Dive · Anomaly Assignees · Inheritance](deep-dive/assignees.md#inheritance-from-the-originating-check){:target="_blank"}. + +??? example "Set or replace the assignee list" + + ```bash + curl -X PUT "https://your-instance.qualytics.io/api/anomalies/12345" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ "assignee_ids": [42, 57] }' + ``` + +??? example "Clear all assignees" + + ```bash + curl -X PUT "https://your-instance.qualytics.io/api/anomalies/12345" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ "assignee_ids": [] }' + ``` + +??? example "Bulk-replace assignees across many anomalies" + + ```bash + curl -X PATCH "https://your-instance.qualytics.io/api/anomalies" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '[ + { "id": 12345, "assignee_ids": [42, 57] }, + { "id": 12346, "assignee_ids": [42] }, + { "id": 12347, "assignee_ids": [] } + ]' + ``` + +See [Deep Dive · Anomaly Assignees](deep-dive/assignees.md){:target="_blank"} for inheritance rules, notification behavior, and history tracking. + +## Archive and delete + +The single-anomaly endpoint covers both the **archive** flow (mark with a resolution status and keep for audit) and the **hard-delete** flow (remove the record entirely). Bulk versions follow the same pattern. + +### Archive or delete a single anomaly + +**Endpoint:** `DELETE /api/anomalies/{id}` + +**Permission:** Member role + **Author** team permission on the anomaly's datastore. + +**Query parameters:** + +| Parameter | Type | Description | +| :--- | :--- | :--- | +| `status` | `"Resolved" \| "Duplicate" \| "Invalid" \| "Discarded"` | The archived status to apply. Required when `archive=true`. | +| `archive` | `bool` | `true` (default) archives the anomaly with the resolution `status`; `false` permanently deletes the anomaly. The hard-delete is irreversible. | + +**Body (optional):** Lets you attach a comment and tag teammates when archiving. + +| Field | Type | Description | +| :--- | :--- | :--- | +| `status` | `ArchivedAnomalyStatusType` | Same as the query parameter; either may be used. | +| `comment` | `string` | Comment posted to the anomaly's history when archiving. | +| `mentioned_user_ids` | `int[]` | Users to notify via `@mention` in the comment. | + +??? example "Example request: archive with a resolution comment" + + ```bash + curl -X DELETE "https://your-instance.qualytics.io/api/anomalies/12345?archive=true&status=Resolved" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "comment": "Resolved after backfill, see @[Alice Lee](42)", + "mentioned_user_ids": [42] + }' + ``` + +??? example "Example request: hard-delete an archived anomaly" + + ```bash + curl -X DELETE "https://your-instance.qualytics.io/api/anomalies/12345?archive=false" \ + -H "Authorization: Bearer YOUR_TOKEN" + ``` + +### Bulk archive or delete + +**Endpoint:** `DELETE /api/anomalies` + +**Permission:** Member role + **Author** team permission on each anomaly's datastore. + +**Body:** A list of entries combining the anomaly ID with the same fields used in the single-anomaly delete (`status`, `comment`, `mentioned_user_ids`, `archive`). + +??? example + + ```bash + curl -X DELETE "https://your-instance.qualytics.io/api/anomalies" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '[ + { "id": 12345, "archive": true, "status": "Resolved" }, + { "id": 12346, "archive": true, "status": "Duplicate" }, + { "id": 12347, "archive": false } + ]' + ``` + +## History and comments + +### Get the anomaly history + +Returns the paginated change log for an anomaly: status changes, description edits, tag updates, assignee changes, and comments. Each entry carries the user who made the change and a timestamp. + +**Endpoint:** `GET /api/anomalies/{id}/history` + +??? example "Example response (abbreviated)" + + ```json + [ + { + "transaction_id": 9876, + "user": { "id": 1, "name": "Alice Lee" }, + "timestamp": "2026-05-15T17:22:08Z", + "changeset": { + "status": ["Active", "Acknowledged"], + "assignees": [ + [{ "id": 42, "name": "Alice Lee" }], + [{ "id": 42, "name": "Alice Lee" }, { "id": 57, "name": "Bob Patel" }] + ] + } + } + ] + ``` + +Each changeset field is a `[before, after]` tuple, so you can reconstruct the audit trail offline. + +### Get comments + +Returns the comments on an anomaly, newest first. + +**Endpoint:** `GET /api/anomalies/{id}/comments` + +**Query parameters:** + +| Parameter | Type | Description | +| :--- | :--- | :--- | +| `start_date` | `datetime` (ISO 8601, inclusive) | Lower bound on `created`. | +| `end_date` | `datetime` (ISO 8601, exclusive) | Upper bound on `created`. Lets you fetch back-to-back ranges without overlap. | +| `include_deleted` | `bool` (default false) | When `true`, deleted comments are included in the response. | + +## Source records + +Source records are the raw rows from the source data that contributed to a record anomaly. Two formats are available: JSON for inline display and CSV for export. + +### Get source records as JSON + +**Endpoint:** `GET /api/anomalies/{id}/source-record` + +**Query parameters:** + +| Parameter | Type | Description | +| :--- | :--- | :--- | +| `limit` | `int` (≥1, default 10) | Maximum number of rows returned. | +| `include_masked` | `bool` (default false) | When `true`, returns raw values for masked fields. Requires the **Editor** team permission on the container, and the platform writes an audit-log entry naming the masked fields you accessed. | + +### Download source records as CSV + +**Endpoint:** `GET /api/anomalies/{id}/source-record/download` + +Streams a CSV file (`source_records_.csv`). Same query parameters as the JSON endpoint. + +!!! note + Source records are cached for up to 8 hours. If you need fresher data, see the [Refresh Source Records](deep-dive/source-record.md#force-refresh-source-records){:target="_blank"} section. + +## Tickets + +Manage the link between an anomaly and an external ticket (Jira, ServiceNow). Linking does **not** call the external system; it just records the association so the UI can render the linked ticket. + +### List ticket links + +**Endpoint:** `GET /api/anomalies/{anomaly_id}/ticket-links` + +### Create a ticket link + +**Endpoint:** `POST /api/anomalies/{anomaly_id}/ticket-links` + +**Permission:** **Manager** role + **Author** team permission on the anomaly's datastore. + +**Body fields:** + +| Field | Type | Description | +| :--- | :--- | :--- | +| `integration_id` | `int` | The ticketing integration that owns this ticket. | +| `ticket_id` | `string` | External ticket identifier (e.g., the ServiceNow `sys_id`). | +| `ticket_number` | `string` | Human-readable ticket number (e.g., `INC0010001`). | +| `ticket_url` | `string` (optional) | Direct URL to the ticket. | +| `status` | `string` | Current external status of the ticket. | +| `ticket_metadata` | `object` (optional) | Additional metadata to store alongside the link. | + +??? example + + ```bash + curl -X POST "https://your-instance.qualytics.io/api/anomalies/12345/ticket-links" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "integration_id": 3, + "ticket_id": "abc123sys", + "ticket_number": "INC0010001", + "ticket_url": "https://example.service-now.com/incident.do?sys_id=abc123sys", + "status": "New" + }' + ``` + +### Delete a ticket link + +**Endpoint:** `DELETE /api/anomalies/{anomaly_id}/ticket-links/{link_id}` + +**Permission:** **Manager** role + **Author** team permission on the anomaly's datastore. Removes the association only; the external ticket is left untouched. diff --git a/docs/anomalies/deep-dive/assignees.md b/docs/anomalies/deep-dive/assignees.md new file mode 100644 index 0000000000..f013d06f83 --- /dev/null +++ b/docs/anomalies/deep-dive/assignees.md @@ -0,0 +1,85 @@ +# Anomaly Assignees + +This page covers the behavior of the **Assignees** field on an anomaly. For step-by-step actions, see [Add Anomaly Assignees](../how-tos/assignee/add-assignee.md){:target="_blank"}, [Remove Anomaly Assignees](../how-tos/assignee/remove-assignee.md){:target="_blank"}, and [Bulk-Assign Anomalies](../how-tos/assignee/bulk-assign.md){:target="_blank"}. + +## The field + +The **Assignees** field on an anomaly is a list of users responsible for reviewing and resolving it. An anomaly can have zero, one, or many assignees, and any user with at least the **Viewer** role on the datastore can be selected. In the **Summary** section of the anomaly details, the first assignee's avatar is shown, with the names of assignees beside it. With one or two assignees, all names appear. With three or more, only the first assignee's name appears, followed by `+N` for the remaining count. A `+N` badge sits beside the avatar whenever an anomaly has more than one assignee; hovering the badge shows the remaining assignees. + +The field is independent from the anomaly's **status**, **description**, and **tags**: assigning a user does not change any of those, and changing those does not change the assignees. The only automatic write to this field happens at creation, as described in [Inheritance from the originating check](#inheritance-from-the-originating-check) below. + +## Inheritance from the originating check + +Every quality check has a single **Default Anomaly Assignee** field, available on both Authored and AI Managed checks. For details, see [Anomaly Assignee](../../data-quality-checks/ai-managed/edit.md#anomaly-assignee){:target="_blank"} on the check editing guide. When a new anomaly is created from a check that has a default assignee set, that user is automatically added as the initial assignee of the anomaly. + +A few details worth knowing: + +- **Anomalies can have many failed checks.** When the anomaly is generated from multiple failed checks, the default assignees of every contributing check are combined into a single list with duplicates removed, then applied to the anomaly. So if check A defaults to user *Alice* and check B defaults to user *Bob*, an anomaly produced from both checks is created with **Alice and Bob** as assignees. +- **Inheritance happens only at creation.** Changing a check's default assignee later does **not** retroactively re-assign anomalies that have already been created. Existing anomalies keep whatever assignees they have until someone edits them. +- **Checks without a default contribute nothing.** Only failed checks that have a default assignee add users to the list. If every failed check behind an anomaly has no default, the anomaly is created with no assignees. + +## Permissions + +| Action | Required permission on the anomaly's datastore | +| :--- | :--- | +| See the Assignees field | Viewer | +| Be selectable as an assignee | Viewer | +| Add or remove assignees | Author | + +When editing, the user picker lists every user that has at least the **Viewer** role on the datastore. Users without access are filtered out by the platform and cannot be assigned even by an Author. See [Team Permissions](../../settings/security/teams/team-permissions/overview.md){:target="_blank"} for the full role matrix. + +!!! note "Archived anomalies are read-only" + Assignees of archived anomalies (status **Resolved**, **Duplicate**, **Invalid**, or **Discarded**) cannot be changed. Restore the anomaly first (it returns to **Acknowledged**) before editing assignees. + +## Notifications + +Whenever an anomaly's **status**, **tags**, **description**, or **assignees** change, the platform creates an **Assignment** in-app notification for every user currently listed as an assignee, except the user who made the change. The notification has the form: + +> ** updated an anomaly you're assigned to +> +> `#` • ** + +Clicking the notification opens the affected anomaly. + +A few specifics: + +- **Self-edits do not notify.** If you edit the anomaly yourself, you do not get a notification for that edit. Other assignees do. +- **Newly added assignees are notified.** When a user is added to the assignee list, they become part of the recipient set for the same update event. The notification is the first signal they receive about the anomaly. +- **Removed assignees are not notified.** Users who are removed from the assignee list as part of the update do not receive a notification for that update. +- **Creation is silent.** Auto-assignment via the originating check's default assignee at anomaly creation does **not** produce a notification. The first notification for a newly created anomaly fires on the next update event. + +See [In-App Notifications · What Triggers a Notification](../../using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md#what-triggers-a-notification){:target="_blank"} for how Assignment notifications appear in the bell-icon list alongside other notification types. + +## History tracking + +Every change to the assignee list is recorded in the anomaly's **History** section, alongside status changes, description edits, tag updates, and comments. The timeline shows: + +- **Who** made the change. +- **When** the change happened. +- **Which users** were added and which were removed. +- **Self-assignment and self-unassignment** entries are surfaced explicitly, so it is clear when a teammate took ownership of an anomaly or stepped away from it. Like other assignee edits, this requires the **Author** team permission on the anomaly's datastore. + +See the [History](insights.md#history){:target="_blank"} section of the Anomaly Insights page for how to read and comment on the timeline. + +## Assignees, owners, and default assignees + +Three related concepts are easy to mix up. Here is how they differ: + +| Concept | Lives on | Cardinality | What it does | +| :--- | :--- | :---: | :--- | +| **Owner** | Quality check | One user | The person responsible for the check itself. Used for filtering checks by owner and for ownership notifications. | +| **Default Anomaly Assignee** | Quality check | One user | The user that anomalies produced by the check are auto-assigned to at creation time. | +| **Assignees** | Anomaly | Many users | The users actually responsible for resolving the anomaly. Editable per anomaly. | + +So the chain reads: a check has one owner and one default assignee; when the check produces an anomaly, that default seeds the anomaly's assignees list, which can then be expanded or narrowed independently. + +## Filtering by assignee + +You can narrow the anomaly list to a specific set of users in two ways: + +- **The Assignees filter.** A multi-select dropdown of active platform users. Selecting one or more users narrows the list to anomalies where any selected user is an assignee. Available on both the [explore anomalies](../../explore/anomalies.md){:target="_blank"} page and the per-datastore anomalies tab. + + +- **The Assigned subtab inside Open.** A one-click shortcut to "open anomalies assigned to me." See [Open · Assigned](../../explore/anomalies.md#open){:target="_blank"}. + +Both work alongside the other anomaly filters (tags, rule type, timeframe, etc.), so you can layer them. For example, combine "assigned to me" with a specific tag or a "last 7 days" window to narrow the list further. diff --git a/docs/anomalies/deep-dive/description.md b/docs/anomalies/deep-dive/description.md new file mode 100644 index 0000000000..4011368e40 --- /dev/null +++ b/docs/anomalies/deep-dive/description.md @@ -0,0 +1,69 @@ +# Anomaly Description + +The **Description** is a business-friendly explanation of the data quality issue captured by an anomaly. It appears in the **Description** section of the anomaly details view and serves as a free-text field that complements the structured attributes (Status, Severity, Failed Checks, etc.) with narrative context. + +For the step-by-step tutorial on editing, see [Edit Anomaly Description](../how-tos/edit-description.md){:target="_blank"}. + +## How the default description is built + +When Qualytics creates an anomaly during a Scan operation, it auto-fills the description by combining the messages of every failed check into a multi-line summary like: + +``` +Field customer_id is expected to be not null; + Field email is expected to match pattern ^[^@]+@[^@]+\.[^@]+$ +``` + +Each failed-check message includes the rule type, the field involved, and the expected condition that was violated. The default acts as a starting point: users can leave it as-is, refine it, or rewrite it entirely. + +!!! note + The default description is only set at anomaly creation. Once a user edits the text, re-running a Scan does not overwrite it. + +## Editing the description + +Any user with the **Editor** team permission (or higher) on the anomaly's datastore can edit the description. The **Edit :material-pencil-outline:** button appears next to the **Description** label in the anomaly details view. Clicking it switches the section into edit mode, with the following actions: + +| Action | What it does | +| :--- | :--- | +| **Edit :material-pencil-outline:** | Opens the description in edit mode. | +| **Save** | Saves the new text and exits edit mode. The change is recorded in the anomaly's **History**. Disabled if the description is empty or contains only whitespace. | +| **Cancel** | Discards unsaved changes and reverts to the previous description. | + +The Edit button is hidden on archived anomalies (Resolved, Duplicate, Invalid, Discarded) and for users without the **Editor** team permission. + +## AI-suggested description + +When Agent Q is configured on the deployment, a second button appears next to the **Description** label: **Suggest a description :material-star-four-points:**. Clicking it asks Agent Q to generate a candidate description from the anomaly's failed checks. The suggestion appears in an overlay with three options: + +| Action | What it does | +| :--- | :--- | +| **Use** | Replaces the current description with the suggestion. The text appears in the editor so you can still refine it before saving. | +| **Regenerate** | Asks Agent Q for a fresh suggestion. Useful if the first proposal does not match the issue. | +| **Dismiss** | Closes the overlay and keeps the current description unchanged. | + +If Agent Q is not configured for the deployment, the Suggest button is hidden. For details on configuring Agent Q, see the [Agent Q](../../agent-q/overview.md){:target="_blank"} documentation. + +## Description and masked fields + +If the failed check involved a [masked field](../../fields/field-status/concepts/field-masking.md){:target="_blank"}, the original value **never** appears in the description. The check failure message permanently shows `***MASKED***` in place of the actual value, both in the default description and in any later regeneration. To investigate the underlying value, reveal masked source records via the Source Records toolbar instead. See [Masked Fields in Source Records](source-record.md#masked-fields-in-source-records){:target="_blank"}. + +## Archived anomalies are read-only + +Once an anomaly is archived (status **Resolved**, **Duplicate**, **Invalid**, or **Discarded**), the description becomes read-only. The Edit and Suggest buttons disappear. To edit the description, restore the anomaly first; see [Restore Anomalies](../how-tos/restore-anomalies.md){:target="_blank"}. + +## History tracking + +Every description change is recorded in the anomaly's **History** section, alongside status changes, tag updates, assignee changes, and comments. Each entry shows: + +- The user who made the change. +- The timestamp of the edit. +- The previous value and the new value, so you can see exactly what changed. + +See the [History](insights.md#history){:target="_blank"} section of the Anomaly Insights page for details on the timeline. + +## Permissions summary + +| Action | Required permission on the anomaly's datastore | +| :--- | :--- | +| Read the description | Viewer team permission | +| Edit the description | Editor team permission | +| Suggest a description with Agent Q | Editor team permission + Agent Q configured on the deployment | diff --git a/docs/anomalies/fingerprints.md b/docs/anomalies/deep-dive/fingerprints.md similarity index 90% rename from docs/anomalies/fingerprints.md rename to docs/anomalies/deep-dive/fingerprints.md index 50eca0b5fd..404d67a7b8 100644 --- a/docs/anomalies/fingerprints.md +++ b/docs/anomalies/deep-dive/fingerprints.md @@ -32,7 +32,7 @@ For **record-level anomalies**, fingerprinting is based on the specific check th ### Shape Anomalies -For **shape anomalies**—which refer to patterns or distributions of data rather than individual records, the fingerprint is derived from a broader set of attributes: +For **shape anomalies**, which refer to patterns or distributions of data rather than individual records, the fingerprint is derived from a broader set of attributes: * **Identifying check(s):** The rule(s) that triggered the anomaly at the dataset level. @@ -69,7 +69,7 @@ The lack of a persistent identifier means **Qualytics** cannot distinguish betwe To handle recurring anomalies in truncate-and-reload tables, configure your scan to use fingerprint-based duplicate handling. -Follow the steps in the [scan operation configuration](../operations/scan/scan.md#configuration) to reach the correct settings. Then, under **Step 8 → Scan Settings**, open the [anomaly options section](https://userguide.qualytics.io/source-datastore/scan/#configuration:~:text=Step%208%3A%20Configure%20the%20Scan%20Settings) and enable both duplicate-handling options: +Follow the steps in the [scan operation configuration](../../operations/scan/scan.md#configuration) to reach the correct settings. Then, under **Step 8 → Scan Settings**, open the [anomaly options section](https://userguide.qualytics.io/source-datastore/scan/#configuration:~:text=Step%208%3A%20Configure%20the%20Scan%20Settings) and enable both duplicate-handling options: - **Archive Duplicate Anomalies:** When the same 127 anomalies appear again after the table reload, Qualytics recognizes their fingerprints and automatically marks them as duplicates rather than new anomalies. - **Reactivate Recurring Anomalies:** If an anomaly was previously archived or resolved but reappears in subsequent scans, Qualytics reactivates the original anomaly record, maintaining full historical context. diff --git a/docs/anomalies/details/insights.md b/docs/anomalies/deep-dive/insights.md similarity index 52% rename from docs/anomalies/details/insights.md rename to docs/anomalies/deep-dive/insights.md index 7b410ec1c7..0104f1dfa5 100644 --- a/docs/anomalies/details/insights.md +++ b/docs/anomalies/deep-dive/insights.md @@ -1,22 +1,22 @@ # Anomaly Insights -Anomaly Insights provides key insights into a specific data anomaly, including its status, anomalous record count, failed checks, and **Severity**. It also shows when the anomaly was detected, the triggering scan, and the related datastore, table, and location. If every failed check behind the anomaly is AI Managed, an **AI badge** is shown alongside these attributes. This view helps users quickly understand the scope and source of the anomaly for easier investigation and resolution. +Anomaly Insights provides key insights into a specific data anomaly, including its status, anomalous record count, failed checks, **Severity**, and the users **assigned** to it. It also shows when the anomaly was detected, the triggering scan, and the related datastore, table, and location. If every failed check behind the anomaly is AI Managed, an **AI badge** is shown alongside these attributes. This view helps users quickly understand the scope and source of the anomaly for easier investigation and resolution. Let's get started 🚀 **Step 1:** Click on the anomaly that you want to see the details of. -![anomaly-details](../../assets/anomalies/details/insights/anomaly-details.png) +![anomaly-details](../../assets/anomalies/deep-dive/insights/anomaly-details.png) You will be navigated to the details section, where you can view the **Summary**, **Description**, **Failed Checks**, **Source Records**, **Tickets** and **History** information. -![anomaly-details-view](../../assets/anomalies/details/insights/anomaly-details-view.png) +![anomaly-details-view](../../assets/anomalies/deep-dive/insights/anomaly-details-view.png) ## Summary The **Summary** section provides a quick overview of the anomaly's key attributes. It includes the anomaly's status, total anomalous records, failed checks, **Severity**, detection time, scan information, and the corresponding datastore and table. If every failed check is AI Managed, an **AI badge** is displayed in this section. This section helps users quickly understand where the anomaly occurred and its potential impact. -![summary](../../assets/anomalies/details/insights/summary.png) +![summary](../../assets/anomalies/deep-dive/insights/summary.png) | No. | Field | Description | | :---- | :---- | :---- | @@ -30,132 +30,45 @@ The **Summary** section provides a quick overview of the anomaly's key attribute | 8 | Table | Points to the specific table involved in the anomaly. The affected table is CDC_REPORTED_PATIENT_IMPACT. Clicking on the expand icon navigates to the table's page, providing more in-depth information about the table structure and contents. | | 9 | Location | Displays the full path of the table in the datastore. This helps users trace the exact location of the anomaly within the data pipeline. You can click on the copy icon to copy the full location path of the table where the anomaly was detected. | | 10 | Tags | Highlights the severity or categorization of the anomaly. The tag High indicates a high-priority issue. You can add or remove tags from the anomaly by clicking on the tag badge. | +| 11 | Assignees | Lists the users responsible for reviewing and resolving the anomaly. Each assignee is shown as an avatar; when more than one user is assigned, a `+N` badge appears next to the first avatar and hovering it reveals the remaining users. Click the **Edit :material-pencil-outline:** button (or **Plus :material-plus:** when empty) next to the **Assignees** label to open the user picker. For the full behavior, see [Deep Dive · Anomaly Assignees](assignees.md){:target="_blank"}; for the step-by-step tutorial, see [Add Anomaly Assignees](../how-tos/assignee/add-assignee.md){:target="_blank"}. | -![summary-fields](../../assets/anomalies/details/insights/summary-fields.png) +![summary-fields](../../assets/anomalies/deep-dive/insights/summary-fields.png) ## Description -The **Description** section displays a detailed, business-friendly explanation of the anomaly. When an anomaly is detected during a scan operation, the system automatically generates a description based on the quality check that failed, including relevant context such as filter conditions, thresholds, and the nature of the data quality issue. - -![description](../../assets/anomalies/details/insights/description.png) - -Users with **Editor** permission or higher can edit the description to add additional context, clarify the business impact, or document investigation findings. This makes it easier for team members to understand and address data quality issues. - -### Editing the Description - -**Step 1:** Click the **Edit :material-pencil-outline:** button next to the "Description" label to enter edit mode. - -![description-edit-button](../../assets/anomalies/details/insights/description-edit-button.png) - -**Step 2:** Make your changes to the description text in the editable text area. - -![description-edit-mode](../../assets/anomalies/details/insights/description-edit-mode.png) - -**Step 3:** Click **Save** to persist your changes, or click **Cancel** to discard them and revert to the original description. - -![description-save](../../assets/anomalies/details/insights/description-save.png) - -!!! info - Only users with the **Editor** role (or higher) on the respective datastore can edit the description. For more details, see the [Team Permissions](../../settings/security/teams/team-permissions/overview.md){:target="_blank"} page. - -!!! note - - Archived anomalies cannot be edited — restore the anomaly first if you need to modify the description - - All changes to the description are tracked in the **History** section, maintaining a complete audit trail of modifications +The **Description** section shows a business-friendly explanation of the anomaly. For how the default text is generated, who can edit it, AI suggestions, Markdown support, and how the field interacts with masked data, see [Anomaly Description](description.md){:target="_blank"}. ## Failed Checks The **Failed Checks** section lists the data quality checks that were violated and subsequently triggered the anomaly. Each listed item displays the check ID, type of violation, and a summarized description of the failure condition. -![failed-checks-section](../../assets/anomalies/details/insights/failed-checks-section.png) +![failed-checks-section](../../assets/anomalies/deep-dive/insights/failed-checks-section.png) Click on a failed check to view the corresponding quality check information. A right-side panel will open, allowing you to view the details without navigating to a different page. -![check](../../assets/anomalies/details/insights/check.png) +![check](../../assets/anomalies/deep-dive/insights/check.png) -![right-panel](../../assets/anomalies/details/insights/right-panel.png) +![right-panel](../../assets/anomalies/deep-dive/insights/right-panel.png) ### Anomalous Fields The **Anomalous Fields** button allows you to filter the failed checks list by the specific fields that triggered the anomaly. The button displays a badge with the count of selected fields out of the total anomalous fields (e.g., `13/13`). -![anomalous-fields-button](../../assets/anomalies/details/insights/anomalous-fields-button.png) +![anomalous-fields-button](../../assets/anomalies/deep-dive/insights/anomalous-fields-button.png) Click the **Anomalous Fields** button to open a dropdown with a searchable list of all fields involved in the failed checks. Each field has a toggle to show or hide its related failed checks. -![anomalous-fields-dropdown](../../assets/anomalies/details/insights/anomalous-fields-dropdown.png) +![anomalous-fields-dropdown](../../assets/anomalies/deep-dive/insights/anomalous-fields-dropdown.png) Use the **Hide All** option at the bottom of the dropdown to deselect all fields at once. When all fields are hidden, the option changes to **Show All**, allowing you to re-enable them. -![anomalous-fields-hide-all](../../assets/anomalies/details/insights/anomalous-fields-hide-all.png) +![anomalous-fields-hide-all](../../assets/anomalies/deep-dive/insights/anomalous-fields-hide-all.png) -![anomalous-fields-show-all](../../assets/anomalies/details/insights/anomalous-fields-show-all.png) +![anomalous-fields-show-all](../../assets/anomalies/deep-dive/insights/anomalous-fields-show-all.png) ## Source Records -The Source Records section displays all the data and fields related to the detected anomaly from the dataset. It is an Enrichment Datastore that is used to store the analyzed results, including any anomalies and additional metadata in files; therefore, it is recommended to add/link an enrichment datastore with your connected source datastore. - -![source-records](../../assets/anomalies/details/insights/source-records.png) - -### Sort By - -The **Sort By** option allows you to organize the source record columns. Click the **Sort By** button to open a dropdown with the available sorting options. - -![source-records-sort-by](../../assets/anomalies/details/insights/source-records-sort-by.png) - -The available sort options are: - -![source-records-sort-by-options](../../assets/anomalies/details/insights/source-records-sort-by-options.png) - -| Option | Description | -| :---- | :---- | -| **Anomalous First** | Prioritizes anomalous fields at the beginning of the table. This option is enabled by default and is automatically disabled when the **Only Anomalous** filter is active. | -| **Name** | Sorts columns alphabetically by field name. | -| **Weight** | Sorts columns by the field weight value (default). | -| **Quality Score** | Sorts columns by the field quality score. | -| **Asc / Desc** | Toggles between ascending and descending order for the selected sort option. | - -### Fields - -The **Fields** button displays a badge with the count of visible fields out of the total fields (e.g., `64/64`). Click it to open a searchable dropdown where you can control which columns are displayed in the source records table. - -![source-records-fields-button](../../assets/anomalies/details/insights/source-records-fields-button.png) - -The dropdown lists all available fields with toggles to show or hide each one individually. - -![source-records-fields-dropdown](../../assets/anomalies/details/insights/source-records-fields-dropdown.png) - -At the bottom of the dropdown, two actions are available: - -- **Only Anomalous**: Filters the visible fields to display only the ones that triggered failed checks. This is useful for focusing on the fields that caused the anomaly. - - ![source-records-fields-only-anomalous](../../assets/anomalies/details/insights/source-records-fields-only-anomalous.png) - -- **Hide All / Show All**: Deselects or selects all fields at once. When all fields are hidden, the option changes to **Show All** to re-enable them. - - ![source-records-fields-hide-all](../../assets/anomalies/details/insights/source-records-fields-hide-all.png) - - ![source-records-fields-show-all-unchecked](../../assets/anomalies/details/insights/source-records-fields-show-all-unchecked.png) - - ![source-records-fields-show-all](../../assets/anomalies/details/insights/source-records-fields-show-all.png) - -### Refresh Source Records - -Source records are cached locally for up to **8 hours** to improve performance. If you need to view the most recent data, click the **Refresh :material-refresh:** button in the source records toolbar to bypass the cache and fetch the latest records directly from the API. - -A tooltip on the button displays the **last updated timestamp**, helping you track when the data was last refreshed. - -![source-records-refresh](../../assets/anomalies/details/insights/source-records-refresh.png) - -For more information, please refer to the [Force Refresh Source Records](source-record.md#force-refresh-source-records) section in the documentation. - -### Download All Source Records - -Click the **Download :material-download:** button to export all source records as a `.csv` file, with a maximum size of **250MB**. - -![source-records-download](../../assets/anomalies/details/insights/source-records-download.png) - -!!! note - The download includes only the records that were captured during the scan. The number of available records depends on the **maximum source records per anomaly** configured in the [scan settings](../../operations/scan/scan.md#configuration). If you need more records, increase the limit and re-run the scan. +The **Source Records** section displays the rows and fields tied to the detected anomaly, sourced from the linked **Enrichment Datastore**. For visualization, sorting, field selection, refresh, download, masked-field handling, and comparison records, see [Source Records](source-record.md){:target="_blank"}. ## Tickets @@ -167,7 +80,7 @@ The **Tickets** section allows you to link the anomaly to external ticketing sys !!! info Linking, creating, and unlinking tickets requires at least the **Author** role on the respective datastore, along with the **Manager** global role. For more details, see the [Team Permissions](../../settings/security/teams/team-permissions/overview.md){:target="_blank"} page. -![tickets-section](../../assets/anomalies/details/insights/tickets-section.png) +![tickets-section](../../assets/anomalies/deep-dive/insights/tickets-section.png) ### Linking an Existing Ticket @@ -175,15 +88,15 @@ You can link an existing ticket from your external ticketing system to an anomal **Step 1:** Click the **Add :material-ticket-outline:** button in the Tickets section toolbar to open the link/create dialog. -![tickets-add-button](../../assets/anomalies/details/insights/tickets-add-button.png) +![tickets-add-button](../../assets/anomalies/deep-dive/insights/tickets-add-button.png) **Step 2:** In the **Link Ticket** modal, use the search field to find an existing ticket by keyword. Select the ticket you want to link from the search results. -![tickets-link-search-modal](../../assets/anomalies/details/insights/tickets-link-search-modal.png) +![tickets-link-search-modal](../../assets/anomalies/deep-dive/insights/tickets-link-search-modal.png) **Step 3:** The ticket will appear in the Tickets section as a linked card, displaying the ticket number, status badge, description, and the last synced timestamp. -![tickets-linked-card](../../assets/anomalies/details/insights/tickets-linked-card.png) +![tickets-linked-card](../../assets/anomalies/deep-dive/insights/tickets-linked-card.png) ### Creating a New Ticket @@ -194,13 +107,13 @@ If no existing ticket matches the anomaly, you can create a new one directly fro **Step 1:** Click the **Add :material-ticket-outline:** button to open the dialog, then click the **Create New Ticket :material-plus-circle:** button. -![tickets-create-new-button](../../assets/anomalies/details/insights/tickets-create-new-button.png) +![tickets-create-new-button](../../assets/anomalies/deep-dive/insights/tickets-create-new-button.png) **Step 2:** Fill in the ticket form fields. The available fields depend on the configured ticketing system. #### ServiceNow -![tickets-create-form](../../assets/anomalies/details/insights/tickets-create-form.png) +![tickets-create-form](../../assets/anomalies/deep-dive/insights/tickets-create-form.png) | Field | Description | | :---- | :---- | @@ -219,7 +132,7 @@ If no existing ticket matches the anomaly, you can create a new one directly fro #### Jira -![tickets-create-form-jira](../../assets/anomalies/details/insights/tickets-create-form-jira.png) +![tickets-create-form-jira](../../assets/anomalies/deep-dive/insights/tickets-create-form-jira.png) | Field | Description | | :---- | :---- | @@ -232,25 +145,25 @@ If no existing ticket matches the anomaly, you can create a new one directly fro **Step 3:** Click **Create Ticket** to submit the ticket. The new ticket will be created in the external ticketing system and automatically linked to the anomaly. -![tickets-linked-card](../../assets/anomalies/details/insights/tickets-linked-card.png) +![tickets-linked-card](../../assets/anomalies/deep-dive/insights/tickets-linked-card.png) ### Viewing a Linked Ticket Click the **View :material-arrow-top-right:** button on a linked ticket card to open the ticket directly in the external ticketing system (ServiceNow or Jira) in a new browser tab. -![tickets-view-button](../../assets/anomalies/details/insights/tickets-view-button.png) +![tickets-view-button](../../assets/anomalies/deep-dive/insights/tickets-view-button.png) ### Unlinking a Ticket -Click the **Unlink :material-close-thick:** button on a linked ticket card to remove the association between the ticket and the anomaly. The ticket itself remains in the external system — only the link in Qualytics is removed. +Click the **Unlink :material-close-thick:** button on a linked ticket card to remove the association between the ticket and the anomaly. The ticket itself remains in the external system; only the link in Qualytics is removed. -![tickets-unlink-button](../../assets/anomalies/details/insights/tickets-unlink-button.png) +![tickets-unlink-button](../../assets/anomalies/deep-dive/insights/tickets-unlink-button.png) ## History -The **History** section provides a chronological log of all actions taken on the anomaly. It automatically records system events such as anomaly creation, duplicate identification based on fingerprint matching, status changes, description edits, and tag updates. Each entry includes the user or system that performed the action and a timestamp. +The **History** section provides a chronological log of all actions taken on the anomaly. It automatically records system events such as anomaly creation, duplicate identification based on fingerprint matching, status changes, description edits, tag updates, and assignee changes. Each entry includes the user or system that performed the action and a timestamp. Assignee changes display the users added or removed, with self-assignments and self-unassignments labeled explicitly so it is clear when a teammate takes ownership of an anomaly or steps away from it. -![history-section](../../assets/anomalies/details/insights/history-section.png) +![history-section](../../assets/anomalies/deep-dive/insights/history-section.png) !!! warning Comments cannot be added, edited, or deleted when an anomaly is archived **(Resolved, Duplicate, Invalid, or Discarded)**. Restore the anomaly first to enable commenting. @@ -264,15 +177,15 @@ Users can leave comments to discuss the issue, add context, or communicate decis **Step 1:** Type your comment in the **"Leave a comment"** input field. -![history-comment-input](../../assets/anomalies/details/insights/comment.png) +![history-comment-input](../../assets/anomalies/deep-dive/insights/comment.png) **Step 2:** Click the **Send :material-send:** button to post your comment. -![history-comment-send](../../assets/anomalies/details/insights/history-comment-send.png) +![history-comment-send](../../assets/anomalies/deep-dive/insights/history-comment-send.png) The comment will appear in the timeline with your name, the message, and a timestamp. -![history-comment-posted](../../assets/anomalies/details/insights/history-comment-posted.png) +![history-comment-posted](../../assets/anomalies/deep-dive/insights/history-comment-posted.png) ### Editing a Comment @@ -281,15 +194,15 @@ The comment will appear in the timeline with your name, the message, and a times **Step 1:** Click the **vertical ellipsis :material-dots-vertical:** on the comment you want to edit. -![history-comment-options](../../assets/anomalies/details/insights/history-comment-options.png) +![history-comment-options](../../assets/anomalies/deep-dive/insights/history-comment-options.png) **Step 2:** Select **Edit :material-pencil-outline:** from the dropdown menu. The comment text will become editable. -![history-comment-menu](../../assets/anomalies/details/insights/history-comment-menu.png) +![history-comment-menu](../../assets/anomalies/deep-dive/insights/history-comment-menu.png) **Step 3:** Make your changes and click **Save** to persist them, or click **Cancel** to discard the changes. -![history-comment-edit](../../assets/anomalies/details/insights/history-comment-edit.png) +![history-comment-edit](../../assets/anomalies/deep-dive/insights/history-comment-edit.png) ### Deleting a Comment @@ -298,13 +211,13 @@ The comment will appear in the timeline with your name, the message, and a times **Step 1:** Click the **vertical ellipsis :material-dots-vertical:** on the comment you want to delete. -![history-comment-options-delete](../../assets/anomalies/details/insights/history-comment-options.png) +![history-comment-options-delete](../../assets/anomalies/deep-dive/insights/history-comment-options.png) **Step 2:** Select **Delete :material-trash-can-outline:** from the dropdown menu. -![history-comment-menu-delete](../../assets/anomalies/details/insights/history-comment-menu.png) +![history-comment-menu-delete](../../assets/anomalies/deep-dive/insights/history-comment-menu.png) A confirmation flash message will appear indicating the comment has been successfully deleted. -![history-comment-deleted](../../assets/anomalies/details/insights/history-comment-deleted.png) +![history-comment-deleted](../../assets/anomalies/deep-dive/insights/history-comment-deleted.png) diff --git a/docs/anomalies/deep-dive/source-record.md b/docs/anomalies/deep-dive/source-record.md new file mode 100644 index 0000000000..35e6c584ff --- /dev/null +++ b/docs/anomalies/deep-dive/source-record.md @@ -0,0 +1,118 @@ + + +# Source Records + +The **Source Records** section of the Anomaly Details view provides a detailed look at the records from your dataset that triggered anomalies. Visual highlights indicate the specific fields that failed quality checks. All displayed records come from the linked **Enrichment Datastore**, which captures the rows and metadata produced by each scan. + +If the Anomaly Type is **Shape**, the highlighted column(s) with anomalies appear in the source record. + +![shape-anomaly-highlight](../../assets/anomalies/deep-dive/source-record/shape-anomaly-highlight.png) + +If the Anomaly Type is **Record**, the highlighted row(s) that failed the checks appear in the source record. + +![record-anomaly-highlight](../../assets/anomalies/deep-dive/source-record/record-anomaly-highlight.png) + +!!! note + Source records appear in the Anomaly Details view. For a Record anomaly, the specific record is highlighted. For a Shape anomaly, up to 10 samples from the underlying anomalous records are highlighted by default (configurable per scan). + +## Source Record Visualization + +The number of source records displayed per anomaly is determined by the **Maximum Source Examples per Anomaly** setting, which can be configured during [scan setup](../../operations/scan/scan.md#configuration){:target="_blank"}. The available limits are 10, 100, 1,000, or 10,000 records. The interface includes sticky headers that remain visible when scrolling through large datasets, making navigation easier during data review. + +![visualization](../../assets/anomalies/deep-dive/source-record/visualization.png) + +## Sort By + +The **Sort By** option allows you to organize the source record columns. Click the **Sort By** button to open a dropdown with the available sorting options. + +![sort-by](../../assets/anomalies/deep-dive/source-record/sort-by.png) + +The available sort options are: + +![sort-by-options](../../assets/anomalies/deep-dive/source-record/sort-by-options.png) + +| Option | Description | +| :--- | :--- | +| **Anomalous First** | Prioritizes anomalous fields at the beginning of the table. Enabled by default and automatically disabled when the **Only Anomalous** filter is active. | +| **Name** | Sorts columns alphabetically by field name. | +| **Importance** | Sorts columns by the field weight value. Default sort option. | +| **Quality Score** | Sorts columns by the field quality score. | +| **Asc** / **Desc** | Toggles between ascending and descending order for the selected sort option. | + +## Fields + +The **Fields** button displays a badge with the count of visible fields out of the total fields (e.g., `64/64`). Click it to open a searchable dropdown where you can control which columns are displayed in the source records table. + +![fields-button](../../assets/anomalies/deep-dive/source-record/fields-button.png) + +The dropdown lists all available fields with toggles to show or hide each one individually. + +![fields-dropdown](../../assets/anomalies/deep-dive/source-record/fields-dropdown.png) + +At the bottom of the dropdown, two actions are available: + +- **Only Anomalous**: Filters the visible fields to display only the ones that triggered failed checks. Useful for focusing on the fields that caused the anomaly. + + ![fields-only-anomalous](../../assets/anomalies/deep-dive/source-record/fields-only-anomalous.png) + +- **Hide All** / **Show All**: Deselects or selects all fields at once. When all fields are hidden, the option changes to **Show All** to re-enable them. + + ![fields-hide-all](../../assets/anomalies/deep-dive/source-record/fields-hide-all.png) + + ![fields-show-all-unchecked](../../assets/anomalies/deep-dive/source-record/fields-show-all-unchecked.png) + + ![fields-show-all](../../assets/anomalies/deep-dive/source-record/fields-show-all.png) + +## Force Refresh Source Records + +Source records are cached locally for up to **8 hours** to improve performance. If you need to view the most recent data, click the **Refresh :material-refresh:** button in the source records toolbar to bypass the cache and fetch the latest records directly from the API. + +A tooltip on the button displays the **last updated timestamp**, helping you track when the data was last refreshed. + +![force-refresh](../../assets/anomalies/deep-dive/source-record/force-refresh.png) + +## Download Source Records + +Click the **Download :material-download:** button to export all source records as a `.csv` file, with a maximum size of **250 MB**. + +![download](../../assets/anomalies/deep-dive/source-record/download.png) + +!!! note + The download includes only the records that were captured during the scan. The number of available records depends on the **Maximum Source Examples per Anomaly** setting, configured in the [scan settings](../../operations/scan/scan.md#configuration){:target="_blank"}. If you need more records, increase the limit and re-run the scan. + +## Masked Fields in Source Records + +If a container contains [masked fields](../../fields/field-status/concepts/field-masking.md){:target="_blank"}, their values display as `***MASKED***` by default in the source records table. + +Users with the **Editor** team permission can reveal masked values for an anomaly using the reveal toggle. Toggling reveal shows all source records attached to that anomaly at once. The reveal is per-anomaly, not per-record. + +### Revealing Masked Values + +**Step 1:** Click the **Show masked values :material-shield-lock-outline:** toggle in the source records toolbar to initiate the reveal process. + +![masked-fields-toggle](../../assets/anomalies/deep-dive/source-record/masked-fields-toggle.png) + +**Step 2:** A confirmation dialog will appear indicating the number of masked fields to be revealed and the number of records affected. Click **Reveal :material-eye:** to proceed, or **Cancel** to discard. + +![masked-fields-reveal-confirmation](../../assets/anomalies/deep-dive/source-record/masked-fields-reveal-confirmation.png) + +### Masking Audit Log + +Every reveal action is recorded in the **masking audit log** with the user identity, timestamp, IP address, and the specific fields accessed. This log is reviewable by users with the **Admin** role. + +**Step 1:** Click the **Show audit log :material-history:** button in the source records toolbar to open the audit log panel. + +![masked-fields-audit-log-button](../../assets/anomalies/deep-dive/source-record/masked-fields-audit-log-button.png) + +**Step 2:** A right-side panel will open displaying the **Masking Audit Log** with details including the user name, email, revealed fields, IP address, and timestamp of each reveal action. + +![masked-fields-audit-log](../../assets/anomalies/deep-dive/source-record/masked-fields-audit-log.png) + +!!! info + To protect sensitive data consistently, masking also applies to anomaly descriptions. Check failure messages permanently show `` in place of actual values. The original value is not stored in the anomaly record. Use the source record reveal toggle to investigate specific values. + +## Comparison Source Records + +Anomalies identified by the Data Diff rule type, configured with Row Identifiers, are displayed with a detailed source record comparison. This visualization highlights differences between rows, making it easier to identify specific discrepancies. + +![comparison](../../assets/anomalies/deep-dive/source-record/comparison.png) diff --git a/docs/anomalies/deep-dive/status.md b/docs/anomalies/deep-dive/status.md new file mode 100644 index 0000000000..8bd38f6fe2 --- /dev/null +++ b/docs/anomalies/deep-dive/status.md @@ -0,0 +1,53 @@ +# :material-alert:{ .middle style="color: var(--q-brick)" } Anomaly Status + +Every anomaly carries a status that tracks its lifecycle stage, from initial detection to final resolution. Statuses split into two groups: **Open**, for anomalies that still need attention, and **Archived**, for anomalies that have been resolved, dismissed, or categorized for reference. + +To filter the anomaly list by these groups in the UI, see [Filter Anomalies by Status](../how-tos/filter-by-status.md){:target="_blank"}. + +## Status colors + +Each status has a distinctive color, kept consistent across the UI (anomaly lists, details views, and notifications). The icon next to a status can change by context, but the color stays the same. The legend below shows the color associated with each status: + +| Icon | Status | Description | +| :-: | :--- | :--- | +| :material-alert:{ .lg style="color: #ffbb33" } | **Active** | Unresolved and awaiting triage. | +| :material-alert:{ .lg style="color: #5B86AA" } | **Acknowledged** | Reviewed, still needs follow-up. | +| :material-alert:{ .lg style="color: #21BA45" } | **Resolved** | Legitimate concern that has been addressed. | +| :material-alert:{ .lg style="color: #FF9780" } | **Duplicate** | Same issue as another anomaly. | +| :material-alert:{ .lg style="color: #E91E63" } | **Invalid** | Not a real data quality concern. | +| :material-alert:{ .lg style="color: #8B7355" } | **Discarded** | No longer relevant or under review. | + +## Open Anomalies + +Open anomalies are issues that have been detected but not yet resolved or archived. They have two sub-statuses: + +| Status | Description | +| :--- | :--- | +| **Active** | Newly detected and unresolved. Has not been acknowledged, archived, or resolved. May require immediate attention. | +| **Acknowledged** | Reviewed and acknowledged by someone, but still needs further action. | + +To view every open anomaly at once regardless of sub-status, use the **All** sub-tab in the anomaly list; see [Filter Anomalies by Status](../how-tos/filter-by-status.md#open-anomalies){:target="_blank"}. + +## Archived Anomalies + +Archived anomalies have been reviewed and moved out of active monitoring. They are categorized by how they were resolved or classified, keeping a clean historical record without cluttering the active list. They have four sub-statuses: + +| Status | Description | +| :--- | :--- | +| **Resolved** | Was a legitimate data quality concern, now addressed. | +| **Duplicate** | A duplicate of another anomaly that has already been addressed. | +| **Invalid** | Not a legitimate concern; no further action required. | +| **Discarded** | No longer relevant or under review. Removes outdated entries without marking them as Invalid or Resolved. | + +To view every archived anomaly at once regardless of sub-status, use the **All** sub-tab in the anomaly list; see [Filter Anomalies by Status](../how-tos/filter-by-status.md#archived-anomalies){:target="_blank"}. + +!!! info + **Duplicate** and **Discarded** both archive the anomaly, but they tell the system different things about future scans: + + - **Duplicate**: future scans that detect the same fingerprint do not reopen this anomaly. Use this when you want to silence recurring detections. + - **Discarded**: future scans that detect the same fingerprint reopen this anomaly (when the scan operation's automatic re-opening option is enabled). Use this when you want the system to flag the issue if it returns. + + Qualytics links anomalies that share a fingerprint to the earliest matching anomaly automatically; you do not need to reference an "original anomaly ID" when archiving as Duplicate. See [Anomaly Fingerprints](fingerprints.md){:target="_blank"} for matching criteria and the re-opening option. + +!!! note + For step-by-step instructions, see [Archive Anomalies](../how-tos/archive-anomalies.md){:target="_blank"} or [Restore Anomalies](../how-tos/restore-anomalies.md){:target="_blank"}. diff --git a/docs/anomalies/types.md b/docs/anomalies/deep-dive/types.md similarity index 100% rename from docs/anomalies/types.md rename to docs/anomalies/deep-dive/types.md diff --git a/docs/anomalies/details/source-record.md b/docs/anomalies/details/source-record.md deleted file mode 100644 index 24a826e99c..0000000000 --- a/docs/anomalies/details/source-record.md +++ /dev/null @@ -1,74 +0,0 @@ -# Source Records - -The **Source Records** page provides a detailed view of all records from your dataset that have failed data quality checks and been identified as anomalies. It serves as the primary interface for reviewing anomalous data at the row level, with visual highlights indicating the specific fields that triggered the anomalies. All displayed records are sourced from the linked **Enrichment Datastore**, which stores the results of data quality scans along with relevant metadata. - -If the Anomaly Type is **Shape**, you will find the highlighted column(s) having anomalies in the source record. - -![source-record](../../assets/anomalies/details/source-record/source-record.png) - -If the Anomaly Type is **Record**, you will find the highlighted row(s) in the source record indicating failed checks. - -![record](../../assets/anomalies/details/source-record/record.png) - -!!! note - In anomaly detection, source records are displayed as part of the Anomaly Details. For a Record anomaly, the specific record is highlighted. For a Shape anomaly, up to 10 samples from the underlying anomalous records are highlighted by default (configurable per scan). - -## Source Record Visualization - -The number of source records displayed per anomaly is determined by the **Maximum Source Examples per Anomaly** setting, which can be configured during [scan setup](../../operations/scan/scan.md#configuration){:target="_blank"}. The available limits are 10, 100, 1,000, or 10,000 records. The interface includes sticky headers that remain visible when scrolling through large datasets, making navigation easier during data review. - -![record](../../assets/anomalies/details/source-record/visualization.png) - -## Force Refresh Source Records - -Source records are cached locally for up to **8 hours** to improve performance. If you need to view the most recent data, click the **Refresh :material-refresh:** button in the source records toolbar to bypass the cache and fetch the latest records directly from the API. - -A tooltip on the button displays the **last updated timestamp**, helping you track when the data was last refreshed. - -![source-records-refresh](../../assets/anomalies/details/insights/source-records-refresh.png) - -## Download Source Records - -Click the **Download :material-download:** button to export all source records as a `.csv` file, with a maximum size of **250MB**. - -![source-records-download](../../assets/anomalies/details/insights/source-records-download.png) - -!!! note - The download includes only the records that were captured during the scan. The number of available records depends on the **maximum source records per anomaly** configured in the [scan settings](../../operations/scan/scan.md#configuration){:target="_blank"}. If you need more records, increase the limit and re-run the scan. - -## Masked Fields in Source Records - -If a container contains [masked fields](../../fields/field-status/concepts/field-masking.md){:target="_blank"}, their values are obfuscated by default in source records. - -Users with **Editor** permission can reveal masked values for an anomaly using the reveal toggle. Toggling reveal shows all source records attached to that anomaly at once — reveal is per-anomaly, not per-record. - -### Revealing Masked Values - -**Step 1:** Click the **Show masked values :material-shield-lock-outline:** toggle in the source records toolbar to initiate the reveal process. - -![masked-fields-toggle](../../assets/anomalies/details/source-record/masked-fields-toggle.png) - -**Step 2:** A confirmation dialog will appear indicating the number of masked fields to be revealed and the number of records affected. Click **Reveal :material-eye:** to proceed, or **Cancel** to discard. - -![masked-fields-reveal-confirmation](../../assets/anomalies/details/source-record/masked-fields-reveal-confirmation.png) - -### Masking Audit Log - -Every reveal action is recorded in the **masking audit log** with the user identity, timestamp, IP address, and the specific fields accessed — this log is reviewable by Administrators. - -**Step 1:** Click the **Show Audit Log :material-history:** button in the source records toolbar to open the audit log panel. - -![masked-fields-audit-log-button](../../assets/anomalies/details/source-record/masked-fields-audit-log-button.png) - -**Step 2:** A right-side panel will open displaying the **Masking Audit Log** with details including the user name, email, revealed fields, IP address, and timestamp of each reveal action. - -![masked-fields-audit-log](../../assets/anomalies/details/source-record/masked-fields-audit-log.png) - -!!! info - To protect sensitive data consistently, masking also applies to anomaly descriptions. Check failure messages permanently show `` in place of actual values. The original value is not stored in the anomaly record. Use the source record reveal toggle to investigate specific values. - -## Comparison Source Records - -Anomalies identified by the Data Diff rule type, configured with Row Identifiers, are displayed with a detailed source record comparison. This visualization highlights differences between rows, making it easier to identify specific discrepancies. - -![is-replica](../../assets/anomalies/details/source-record/is-replica.png) diff --git a/docs/anomalies/detection.md b/docs/anomalies/detection.md index 36fd9bbe01..8b03b8d21f 100644 --- a/docs/anomalies/detection.md +++ b/docs/anomalies/detection.md @@ -1,6 +1,6 @@ # Anomaly Detection Process -The anomaly detection process in Qualytics ensures data quality by identifying deviations from expected patterns through a structured workflow. It starts with configuring datastores, syncing metadata, and profiling data to understand its structure. Users then apply quality checks—either Authored or AI Managed—during Scan operations. Any failures are flagged as anomalies, enabling timely detection and resolution of data issues to maintain overall data integrity. +The anomaly detection process in Qualytics ensures data quality by identifying deviations from expected patterns through a structured workflow. It starts with configuring datastores, syncing metadata, and profiling data to understand its structure. Users then apply quality checks, either Authored or AI Managed, during Scan operations. Any failures are flagged as anomalies, enabling timely detection and resolution of data issues to maintain overall data integrity. Let’s get started 🚀 diff --git a/docs/anomalies/faq.md b/docs/anomalies/faq.md new file mode 100644 index 0000000000..526d62f1c7 --- /dev/null +++ b/docs/anomalies/faq.md @@ -0,0 +1,201 @@ +# :material-help-circle-outline:{ .middle style="color: var(--q-brick)" } Anomalies FAQ + +Answers to common questions about anomalies in Qualytics. Sections are grouped by topic; pick the heading closest to what you are working on. + +## General + +#### What is an anomaly? + +An anomaly is a data point that deviates from the expectations a quality check defines. A check that requires `customer_id` to be non-null produces an anomaly for every row where that field is null in a given scan. Anomalies are how Qualytics surfaces what needs human attention. + +#### How are anomalies created? + +Anomalies are created automatically by **Scan** operations. When a scan runs, every Active quality check is evaluated against the scoped data; rows or schema observations that fail the check produce anomalies. See [Detection](detection.md){:target="_blank"} for the full pipeline. + +#### What's the AI badge on an anomaly? + +The AI badge (purple pill with a four-point star) marks an anomaly whose failed checks are *all* AI Managed. Hovering reveals "Identified by AI managed checks." See [Overview](overview.md){:target="_blank"} for the criteria. + +--- + +## Types + +#### What is the difference between Record and Shape anomalies? + +A **Record anomaly** flags a single row that fails a value-level check (missing value, out-of-range, pattern mismatch). A **Shape anomaly** flags a structural problem (missing column, schema drift, unexpected type). See [Deep Dive · Types](deep-dive/types.md){:target="_blank"} for examples and trade-offs. + +#### Can a single anomaly mix both types? + +No. Each anomaly is either `record` or `shape`. The two share the same status, history, and notification surface, but their `failed_checks` semantics differ: record anomalies link to row-level checks, shape anomalies to structural checks. + +--- + +## Status and lifecycle + +#### What is the difference between Active, Acknowledged, and Archived? + +**Active** means the anomaly was detected and nobody has triaged it. **Acknowledged** means someone reviewed it and decided it needs follow-up but is not yet resolved; it remains in the open queue. **Archived** is a terminal state with one of four resolutions: **Resolved**, **Duplicate**, **Invalid**, or **Discarded**. See [Deep Dive · Status](deep-dive/status.md){:target="_blank"} for what each resolution means. + +#### Can an Acknowledged anomaly go back to Active? + +Yes. While an anomaly stays in the open queue you can switch freely between **Active** and **Acknowledged** from the status picker. Acknowledgement is a soft label, not a one-way gate. The only direction that is blocked is **Archived → Active**: to bring an archived anomaly back, restore it (which lands it in **Acknowledged**, not Active). + +#### How do I restore an archived anomaly? + +Open the anomaly and click **Restore**, or call `PUT /api/anomalies/{id}` with `"status": "Acknowledged"`. The anomaly returns to the **Acknowledged** state; it cannot go directly back to Active. See [Restore Anomalies](how-tos/restore-anomalies.md){:target="_blank"}. + +--- + +## Fingerprints and duplicates + +#### What is an anomaly fingerprint? + +A fingerprint is a deterministic identifier the platform generates for each anomaly. Two anomalies that describe the same issue on the same data get the same fingerprint, so Qualytics can detect and archive duplicates automatically. See [Deep Dive · Fingerprints](deep-dive/fingerprints.md){:target="_blank"}. + +#### Why are my truncate-and-reload tables generating duplicate anomalies every scan? + +Because every reload creates fresh `_qualytics_self_id` values, which makes the record look new to the engine. Enable both **Archive Duplicate Anomalies** and the fingerprint-based handling described in [Fingerprints · Truncate-and-reload tables](deep-dive/fingerprints.md){:target="_blank"} so the platform recognises the recurring rows. + +#### Should I archive an anomaly as Duplicate or as Discarded? + +If you can identify the **original** anomaly the new one duplicates, set **Duplicate** and reference the original in the comment. If you can't (or the engine archived it on its own without a back-reference), prefer **Discarded** to keep fingerprinting accurate. + +--- + +## Tags + +#### Can I tag many anomalies at once? + +Yes. Use **Bulk Edit Anomalies** from the anomalies list, turn on the **Tags** toggle, pick the tags, and save. See [Bulk-Edit Tags](how-tos/tags/bulk-edit.md){:target="_blank"} for the full flow. Bulk edit **replaces** the tag set on each selected anomaly; it does not merge with existing tags. + +#### Are anomaly tags the same catalog as check tags? + +Yes. Both anomalies and checks pull from the same platform-level tag catalog (see [Tags](../tags/overview.md){:target="_blank"}), so a tag like `HIPAA` means the same thing wherever it appears. + +--- + +## Comments and tickets + +#### Who can comment on an anomaly? + +Anyone with at least the **Viewer** team permission on the datastore can post and read comments. Editing or deleting a comment is restricted to the comment author (admins can also delete others' comments). See [History](deep-dive/insights.md#history){:target="_blank"}. + +#### Can I mention a teammate in a comment? + +Yes, use the `@` token and pick from the autocomplete. Mentioned users receive an in-app **Mention** notification linking to the anomaly. See [In-App Notifications · What Triggers a Notification](../using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md#what-triggers-a-notification){:target="_blank"}. + +#### Can I link an anomaly to a Jira or ServiceNow ticket? + +Yes, once the corresponding [Ticketing Integration](../settings/integrations/ticketing/ticketing.md){:target="_blank"} is configured. From the anomaly details, click **Add** in the **Tickets** section to link an existing ticket or to create a new one. Linking requires the **Manager** role plus the **Author** team permission on the datastore. + +--- + +## Source records + +#### Why doesn't my anomaly have source records? + +Source records require a linked **Enrichment Datastore** on the source datastore. Without one, the platform has nowhere to store the failing rows, and the **Source Records** section on the anomaly stays empty. See [Source Record](deep-dive/source-record.md){:target="_blank"}. + +#### How fresh are the source records I see? + +Source records are cached locally for up to **8 hours** to keep the UI responsive. Click the **Refresh** button in the Source Records toolbar to bypass the cache and re-fetch from the API. + +#### How many source records can I download? + +The CSV download includes every record that was captured during the scan, up to the **maximum source records per anomaly** configured in your [Scan settings](../operations/scan/scan.md#configuration){:target="_blank"}. The CSV is capped at 250 MB. + +#### Can I see the raw value of a masked field? + +Only if you have the **Editor** team permission on the container. The download/view request must include `include_masked=true`; the platform records an audit-log entry naming each masked field you read. See the [Source records API](api.md#source-records){:target="_blank"}. + +--- + +## Assignees + +#### Why didn't a new anomaly auto-assign anyone? + +Auto-assignment only happens when at least one of the quality checks that produced the anomaly has a **Default Anomaly Assignee** set. If every contributing check has the default empty, the anomaly is created with no assignees. See [Inheritance from the originating check](deep-dive/assignees.md#inheritance-from-the-originating-check){:target="_blank"}. + +#### I changed the check's Default Anomaly Assignee. Why didn't existing anomalies pick it up? + +Inheritance happens only at the moment the anomaly is created. Updating a check's default later does **not** retroactively change anomalies that already exist. To update them, edit the anomalies directly (individually via [Add Anomaly Assignees](how-tos/assignee/add-assignee.md){:target="_blank"} or via [Bulk-Assign Anomalies](how-tos/assignee/bulk-assign.md){:target="_blank"}). + +#### Two checks failed on the same row. Whose default assignee wins? + +Both. When an anomaly is produced by multiple failed checks, the default assignees of every contributing check are combined into a single list with duplicates removed, then applied to the anomaly. So a row that fails check A (defaulting to Alice) and check B (defaulting to Bob) creates an anomaly with **Alice and Bob** as assignees. + +#### Can a user with only the Viewer team permission be an assignee? + +Yes. Viewer is the minimum requirement to be assigned. Viewers see the anomaly and receive notifications, but they cannot edit the assignee list themselves. + +#### A user does not show up in the assignee picker. Why? + +The picker only lists users that have at least the **Viewer** team permission on the datastore where the anomaly lives. If a teammate is missing, check their team membership in [Team Permissions](../settings/security/teams/team-permissions/overview.md){:target="_blank"}. + +#### Do I get notified when I assign myself to an anomaly? + +No. You do not receive notifications for changes you make yourself. Other assignees on the same anomaly do get notified. + +#### What about the *very first* time an assignee is added? Do they get a notification? + +Yes. A newly added user is part of the recipient set for the same update event, so the first thing they hear about the anomaly is the **Assignment** notification linking to it. + +#### Can I edit assignees on an archived anomaly? + +No. Archived anomalies are read-only with respect to assignees. Restore the anomaly to **Acknowledged** first; see [Restore Anomalies](how-tos/restore-anomalies.md){:target="_blank"}. + +#### How do I unassign everyone from an anomaly? + +Open the anomaly, click the **Edit** button next to **Assignees**, and remove every selected user. Via the API, send `"assignee_ids": []`; see [API · Manage assignees](api.md#manage-assignees){:target="_blank"}. + +#### Can I filter for anomalies that have no assignees? + +There is no first-class **Unassigned** filter today. The Assignees filter only accepts user IDs and returns anomalies where any selected user is an assignee. Workarounds: sort by **Assignees** so empty lists float to one end, or use the [`GET /anomalies`](api.md#list-anomalies){:target="_blank"} endpoint and filter client-side on the `assignees` array length. + +#### What is the difference between the Assignees filter and the Assigned subtab? + +The **Assignees** filter lets you pick any users and shows anomalies assigned to any of them. The **Assigned** subtab (inside the **Open** tab) is a one-click shortcut to "open anomalies assigned to me," scoped to your own user. + +--- + +## Permissions + +#### Who can view an anomaly? + +Any user with at least the **Viewer** team permission on the datastore that produced the anomaly. + +#### Who can edit an anomaly? + +Users with the **Author** team permission (or higher) on the datastore can edit status, tags, and assignees. Description edits additionally require the **Editor** team permission. Archive and delete also require the **Author** team permission. Linking external tickets requires the **Manager** role plus the **Author** team permission on the datastore. + +#### Can a Member without team access see an anomaly? + +No. Anomaly visibility is scoped to the team permissions on the datastore. A Member without any team that owns the datastore sees an empty list. + +--- + +## Filtering and search + +#### Can I combine filters? + +Yes. Every filter narrows the same result set, and the filters are combined with AND. Within a single filter (for example, **Tags**), values are combined with OR. So `Tags: HIPAA, SOX` + `Status: Active` returns active anomalies tagged with `HIPAA` *or* `SOX`. See [Filter & Sort](how-tos/filter-and-sort.md){:target="_blank"} for the full list of supported filters. + +#### Can I search the anomaly message text? + +Yes. The **Search** field (or `?search=` on the [list endpoint](api.md#list-anomalies){:target="_blank"}) does substring matching against the anomaly message and the numeric ID. + +--- + +## Bulk operations + +#### What can I bulk-edit on multiple anomalies? + +From the UI's **Bulk Edit Anomalies** modal: Tags and Assignees. Status and description must be set per anomaly in the UI. The [`PATCH /anomalies`](api.md#bulk-update-anomalies){:target="_blank"} API accepts all four fields per entry if you prefer to script bulk status or description changes. See [Bulk-Edit Tags](how-tos/tags/bulk-edit.md){:target="_blank"} and [Bulk-Assign Anomalies](how-tos/assignee/bulk-assign.md){:target="_blank"} for the UI flows. To add assignees to a single anomaly, see [Add Anomaly Assignees](how-tos/assignee/add-assignee.md){:target="_blank"}. + +#### Does bulk edit merge or replace? + +It **replaces**. The values you choose in the bulk-edit modal become the new value for every selected anomaly; previous tags or assignees not in your selection are removed. If you want to preserve previous values, edit each anomaly individually. + +#### Can I bulk archive? + +Yes. Select multiple anomalies, click the **Bulk menu :material-dots-vertical:** button in the selection toolbar, and choose **Archive**. The API equivalent is the bulk delete endpoint with `archive=true`; see [Bulk archive or delete](api.md#bulk-archive-or-delete){:target="_blank"}. diff --git a/docs/anomalies/manage-anomalies/acknowledge-anomalies.md b/docs/anomalies/how-tos/acknowledge-anomalies.md similarity index 70% rename from docs/anomalies/manage-anomalies/acknowledge-anomalies.md rename to docs/anomalies/how-tos/acknowledge-anomalies.md index c0ceb4e5b1..56e54c448c 100644 --- a/docs/anomalies/manage-anomalies/acknowledge-anomalies.md +++ b/docs/anomalies/how-tos/acknowledge-anomalies.md @@ -11,21 +11,21 @@ You can acknowledge individual anomalies either directly or through the action m **Step 1:** Log in to your Qualytics account and select the datastore from the left menu on which you want to manage your anomalies. -![datastore-light-1](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/datastore-1.png) +![datastore-light-1](../../assets/anomalies/how-tos/acknowledge-anomalies/datastore-1.png) **Step 2**: Click on the **“Anomalies”** from the Navigation Tab. -![anomalies](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/anomalies.png) +![anomalies](../../assets/anomalies/how-tos/acknowledge-anomalies/anomalies.png) **1. Acknowledge Directly** **Step 1:** Locate the active anomaly you want to acknowledge. -![acknowledge-directly](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-directly.png) +![acknowledge-directly](../../assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-directly.png) **Step 2:** Click on the **vertical ellipsis (⋮)** located on the right side of the anomaly and select **“Acknowledge”** from the dropdown menu. -![acknowledge-option](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-option.png) +![acknowledge-option](../../assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-option.png) After clicking on the **Acknowledge** button your anomaly is successfully moved to the acknowledged state and a confirmation message appears on the screen. @@ -33,11 +33,11 @@ After clicking on the **Acknowledge** button your anomaly is successfully moved **Step 1**: Click on the active anomaly from the list of available anomalies that you want to acknowledge. -![acknowledge-directly](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-directly.png) +![acknowledge-directly](../../assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-directly.png) **Step 2:** You will be directed to the anomaly details page. Click on the **Acknowledge** button located at the top-right corner of the interface. -![vertical-acknowledge](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/vertical-acknowledge.png) +![vertical-acknowledge](../../assets/anomalies/how-tos/acknowledge-anomalies/vertical-acknowledge.png) After clicking on the **Acknowledge** button your anomaly is successfully moved to the acknowledged state and a confirmation message appears on the screen. @@ -47,24 +47,24 @@ By acknowledging anomalies in bulk, you can quickly mark multiple anomalies as r **Step 1:** Hover over the active anomalies and click on the checkbox to select multiple anomalies. -![acknowledge-bulk](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-bulk.png) +![acknowledge-bulk](../../assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-bulk.png) When multiple anomalies are selected, an action toolbar appears, displaying the total number of selected anomalies along with a vertical ellipsis for additional bulk action options. -![action-toolbar](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/action-toolbar.png) +![action-toolbar](../../assets/anomalies/how-tos/acknowledge-anomalies/action-toolbar.png) **Step 2:** Click on the **vertical ellipsis (⋮)** and choose **"Acknowledge"** from the dropdown menu to acknowledge the selected anomalies. -![vertical-acknowledge-1](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/vertical-acknowledge-1.png) +![vertical-acknowledge-1](../../assets/anomalies/how-tos/acknowledge-anomalies/vertical-acknowledge-1.png) A modal window titled **“Acknowledge Anomalies”** will appear, confirming that this action acknowledges the anomalies as a legitimate data quality concern. You also have the option to leave a comment in the provided field to provide additional context or details. -![acknowledge-anomalies](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-anomalies.png) +![acknowledge-anomalies](../../assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-anomalies.png) **Step 3:** Click on the **Acknowledge** button to acknowledge the anomalies. -![acknowledge-button](../../assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-button.png) +![acknowledge-button](../../assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-button.png) After clicking on the **Acknowledge** button your anomalies are successfully moved to the acknowledged state and a confirmation message appears on the screen. \ No newline at end of file diff --git a/docs/anomalies/manage-anomalies/archive-anomalies.md b/docs/anomalies/how-tos/archive-anomalies.md similarity index 78% rename from docs/anomalies/manage-anomalies/archive-anomalies.md rename to docs/anomalies/how-tos/archive-anomalies.md index f1122b8d8c..150956f561 100644 --- a/docs/anomalies/manage-anomalies/archive-anomalies.md +++ b/docs/anomalies/how-tos/archive-anomalies.md @@ -10,11 +10,11 @@ You can archive individual anomalies either directly or through the action menu. **Step 1:** Locate the anomaly (whether Active or Acknowledged) you want to archive. -![archive-action](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-action.png) +![archive-action](../../assets/anomalies/how-tos/archive-anomalies/archive-action.png) **Step 2:** Click on the **vertical ellipsis (⋮)** located on the right side of the anomaly and select **“Archive”** from the dropdown menu. -![archive-option](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-option.png) +![archive-option](../../assets/anomalies/how-tos/archive-anomalies/archive-option.png) **Step 3:** A modal window titled **“Archive Anomaly”** will appear, providing you with the following archive options: @@ -23,15 +23,15 @@ You can archive individual anomalies either directly or through the action menu. * **Duplicate**: Choose this option if the anomaly is a duplicate of another existing data quality concern. This helps avoid redundant tracking and ensures that related issues are managed under a single, consolidated anomaly. * **Discarded**: Choose this option if the anomaly is no longer being reviewed or considered relevant. This helps remove outdated or unnecessary anomalies from the active list without marking them as invalid or resolved. -![archive-anomaly-options](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-anomaly-options.png) +![archive-anomaly-options](../../assets/anomalies/how-tos/archive-anomalies/archive-anomaly-options.png) You also have the option to leave a comment in the provided field to provide additional context or details. -![comment-1](../../assets/anomalies/manage-anomalies/archive-anomalies/comment-1.png) +![comment-1](../../assets/anomalies/how-tos/archive-anomalies/comment-1.png) **Step 4:** Once you've made your selection, click the **Archive** button to proceed. -![archive-button](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-button.png) +![archive-button](../../assets/anomalies/how-tos/archive-anomalies/archive-button.png) After clicking on the **Archive** button, your anomaly is moved to the archive and a confirmation message appears on the screen. @@ -39,11 +39,11 @@ After clicking on the **Archive** button, your anomaly is moved to the archive a **Step 1**: Click on the anomaly from the list of available (whether Active or Acknowledged) anomalies that you want to archive. -![archive-action](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-action.png) +![archive-action](../../assets/anomalies/how-tos/archive-anomalies/archive-action.png) **Step 2:** You will be directed to the anomaly details page. Click on the **Archive** button located at the top right corner of the interface. -![vertical-archive](../../assets/anomalies/manage-anomalies/archive-anomalies/vertical-archive.png) +![vertical-archive](../../assets/anomalies/how-tos/archive-anomalies/vertical-archive.png) **Step 3:** A modal window titled **“Archive Anomaly”** will appear, providing you with the following archive options: @@ -52,15 +52,15 @@ After clicking on the **Archive** button, your anomaly is moved to the archive a * **Duplicate**: Choose this option if the anomaly is a duplicate of another existing data quality concern. This helps avoid redundant tracking and ensures that related issues are managed under a single, consolidated anomaly. * **Discarded**: Choose this option if the anomaly is no longer being reviewed or considered relevant. This helps remove outdated or unnecessary anomalies from the active list without marking them as invalid or resolved. -![archive-options](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-anomaly-options.png) +![archive-options](../../assets/anomalies/how-tos/archive-anomalies/archive-anomaly-options.png) You also have the option to leave a comment in the provided field to provide additional context or details. -![comment-2](../../assets/anomalies/manage-anomalies/archive-anomalies/comment-1.png) +![comment-2](../../assets/anomalies/how-tos/archive-anomalies/comment-1.png) **Step 4:** Once you've made your selection, click the **Archive** button to proceed. -![archive-button-2](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-button.png) +![archive-button-2](../../assets/anomalies/how-tos/archive-anomalies/archive-button.png) After clicking on the **Archive** button, your anomaly is moved to the archive and a confirmation message appears on the screen. @@ -70,15 +70,15 @@ To handle multiple anomalies efficiently, you can archive them in bulk, allowing **Step 1:** Hover over the anomaly (whether Active or Acknowledged) and click on the checkbox to select multiple anomalies. -![archive-bulk](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk.png) +![archive-bulk](../../assets/anomalies/how-tos/archive-anomalies/archive-bulk.png) When multiple anomalies are selected, an action toolbar appears, displaying the total number of selected anomalies along with a vertical ellipsis for additional bulk action options. -![archive-bulk-vertical](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk-vertical.png) +![archive-bulk-vertical](../../assets/anomalies/how-tos/archive-anomalies/archive-bulk-vertical.png) **Step 2:** Click on the **vertical ellipsis (⋮)** and choose **"Archive"** from the dropdown menu to archive the selected anomalies. -![archive-option-bulk](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-option-bulk.png) +![archive-option-bulk](../../assets/anomalies/how-tos/archive-anomalies/archive-option-bulk.png) **Step 3:** A modal window titled **“Archive Anomalies”** will appear, providing you with the following archive options: @@ -87,14 +87,14 @@ When multiple anomalies are selected, an action toolbar appears, displaying the * **Duplicate**: Choose this option if the anomaly is a duplicate of another existing data quality concern. This helps avoid redundant tracking and ensures that related issues are managed under a single, consolidated anomaly. * **Discarded**: Choose this option if the anomaly is no longer being reviewed or considered relevant. This helps remove outdated or unnecessary anomalies from the active list without marking them as invalid or resolved. -![archive-bulk-options](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk-options.png) +![archive-bulk-options](../../assets/anomalies/how-tos/archive-anomalies/archive-bulk-options.png) You also have the option to leave a comment in the provided field to provide additional context or details. -![comment-3](../../assets/anomalies/manage-anomalies/archive-anomalies/comment-3.png) +![comment-3](../../assets/anomalies/how-tos/archive-anomalies/comment-3.png) **Step 4:** Once you've made your selection, click on the **Archive** button to proceed. -![archive-button-2](../../assets/anomalies/manage-anomalies/archive-anomalies/archive-button-3.png) +![archive-button-2](../../assets/anomalies/how-tos/archive-anomalies/archive-button-3.png) After clicking on the **Archive** button, your anomalies are moved to the archive and a confirmation message appears on the screen. \ No newline at end of file diff --git a/docs/anomalies/how-tos/assignee/add-assignee.md b/docs/anomalies/how-tos/assignee/add-assignee.md new file mode 100644 index 0000000000..0a597f5ca9 --- /dev/null +++ b/docs/anomalies/how-tos/assignee/add-assignee.md @@ -0,0 +1,62 @@ +# :material-plus-circle:{ .middle style="color: var(--q-brick)" } Add Anomaly Assignees + +Step-by-step tutorial for adding one or more users to the **Assignees** list of a single anomaly. To take a user off an anomaly, see [Remove Anomaly Assignees](remove-assignee.md){:target="_blank"}. To apply the same set of assignees to many anomalies at once, see [Bulk-Assign Anomalies](bulk-assign.md){:target="_blank"}. For how the field behaves in detail, see [Deep Dive · Anomaly Assignees](../../deep-dive/assignees.md){:target="_blank"}. For programmatic access, see the [Anomalies API](../../api.md){:target="_blank"}. + +You can add assignees from two places, and the flow is identical because both views use the same user picker. Pick the tab that matches where you start from. + +=== "From the Anomaly Overview" + + **Step 1:** Open the anomaly from the per-datastore **Anomalies** tab. In the **Summary** section, locate the **Assignees** field. + + ![overview-step-1-assignee-field](../../../assets/anomalies/how-tos/assignee/add-assignee/overview-step-1-assignee-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Assignees** label to open the user picker. When no users are assigned yet, the same button shows a `+` icon instead. + + ![overview-step-2-edit-button](../../../assets/anomalies/how-tos/assignee/add-assignee/overview-step-2-edit-button.png) + + **Step 3:** The user picker opens, listing every user with at least the **Viewer** role on the anomaly's datastore. Use the **Search users** input to narrow the list. + + ![overview-step-3-users-list](../../../assets/anomalies/how-tos/assignee/add-assignee/overview-step-3-users-list.png) + + **Step 4:** Select one or more users from the list to assign them to the anomaly. + + ![overview-step-4-select-user](../../../assets/anomalies/how-tos/assignee/add-assignee/overview-step-4-select-user.png) + + **Step 5:** The selected users appear at the top of the list with a check icon, confirming they are now assigned. + + ![overview-step-5-user-marked](../../../assets/anomalies/how-tos/assignee/add-assignee/overview-step-5-user-marked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Assignees** field updates with the new avatar (or avatars), and the change is recorded in the **History** section. + + ![overview-step-6-updated-field](../../../assets/anomalies/how-tos/assignee/add-assignee/overview-step-6-updated-field.png) + +=== "From Explore > Anomalies" + + **Step 1:** Open the anomaly from **Explore > Anomalies**. In the right-side details panel, locate the **Assignees** field. + + ![explore-step-1-assignee-field](../../../assets/anomalies/how-tos/assignee/add-assignee/explore-step-1-assignee-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Assignees** label to open the user picker. When no users are assigned yet, the same button shows a `+` icon instead. + + ![explore-step-2-edit-button](../../../assets/anomalies/how-tos/assignee/add-assignee/explore-step-2-edit-button.png) + + **Step 3:** The user picker opens, listing every user with at least the **Viewer** role on the anomaly's datastore. Use the **Search users** input to narrow the list. + + ![explore-step-3-users-list](../../../assets/anomalies/how-tos/assignee/add-assignee/explore-step-3-users-list.png) + + **Step 4:** Select one or more users from the list to assign them to the anomaly. + + ![explore-step-4-select-user](../../../assets/anomalies/how-tos/assignee/add-assignee/explore-step-4-select-user.png) + + **Step 5:** The selected users appear at the top of the list with a check icon, confirming they are now assigned. + + ![explore-step-5-user-marked](../../../assets/anomalies/how-tos/assignee/add-assignee/explore-step-5-user-marked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Assignees** field updates with the new avatar (or avatars), and the change is recorded in the **History** section. + + ![explore-step-6-updated-field](../../../assets/anomalies/how-tos/assignee/add-assignee/explore-step-6-updated-field.png) + +!!! info + Adding or removing assignees on an anomaly requires the **Author** team permission (or higher) on the anomaly's datastore. Archived anomalies cannot have their assignees changed; restore the anomaly first. + + Each newly added assignee (except yourself) is notified about the change as part of the same update event. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. diff --git a/docs/anomalies/how-tos/assignee/bulk-assign.md b/docs/anomalies/how-tos/assignee/bulk-assign.md new file mode 100644 index 0000000000..93a42f04db --- /dev/null +++ b/docs/anomalies/how-tos/assignee/bulk-assign.md @@ -0,0 +1,106 @@ +# :material-dots-vertical-circle:{ .middle style="color: var(--q-brick)" } Bulk-Assign Anomalies + +Use this flow when you want to apply the same set of assignees to many anomalies at once. To add users on a single anomaly from its details view, see [Add Anomaly Assignees](add-assignee.md){:target="_blank"}. To take a user off an anomaly, see [Remove Anomaly Assignees](remove-assignee.md){:target="_blank"}. For how the field behaves in detail, see [Deep Dive · Anomaly Assignees](../../deep-dive/assignees.md){:target="_blank"}. For programmatic access, see the [Anomalies API](../../api.md){:target="_blank"}. + +!!! info + Bulk-editing assignees requires the **Author** team permission (or higher) on the datastore of every selected anomaly. Archived anomalies cannot have their assignees changed; restore them first. + +You can launch a bulk assignment from two places, and the flow is identical because both lists use the same selection toolbar and **Bulk Edit Anomalies** modal. Pick the tab that matches where you start from. + +=== "From the Datastore Anomalies tab" + + **Step 1:** Open the source datastore and go to the **Anomalies** tab. You see the list of anomalies for that datastore. + + ![datastore-step-1-anomalies-list](../../../assets/anomalies/how-tos/shared/datastore-step-1-anomalies-list.png) + + **Step 2:** Hover over each anomaly you want to include and click the checkbox on the left of the row. The selected rows stay highlighted and the top of the list switches into a selection toolbar showing the count (for example, **2 selected**). + + ![datastore-step-2-select-anomalies](../../../assets/anomalies/how-tos/shared/datastore-step-2-select-anomalies.png) + + **Step 3:** Click the **Bulk menu :material-dots-vertical:** button in the selection toolbar. + + ![datastore-step-3-click-ellipsis](../../../assets/anomalies/how-tos/shared/datastore-step-3-click-ellipsis.png) + + **Step 4:** A menu opens showing the bulk actions available: **Edit**, **Acknowledge**, and **Archive**. + + ![datastore-step-4-menu-options](../../../assets/anomalies/how-tos/shared/datastore-step-4-menu-options.png) + + **Step 5:** Click **Edit** from the menu. + + ![datastore-step-5-click-edit](../../../assets/anomalies/how-tos/shared/datastore-step-5-click-edit.png) + + **Step 6:** The **Bulk Edit Anomalies** modal opens. It shows the count of selected anomalies, a notice that the action will overwrite existing data, and **Tags** and **Assignees** toggles (both off by default). + + ![datastore-step-6-modal-opens](../../../assets/anomalies/how-tos/shared/datastore-step-6-modal-opens.png) + + **Step 7:** Turn on the **Assignees** toggle. A **Select assignees** field appears below the toggle. + + ![datastore-step-7-toggle-assignees](../../../assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-7-toggle-assignees.png) + + **Step 8:** Click the **Select assignees** field to open the user dropdown. + + ![datastore-step-8-click-field](../../../assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-8-click-field.png) + + **Step 9:** The dropdown opens, listing every user with at least the **Viewer** team permission on the datastore of the selected anomalies, plus an **All** option that selects all users at once. + + ![datastore-step-9-users-list](../../../assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-9-users-list.png) + + **Step 10:** Click the checkbox next to each user you want to assign. Selected users appear as chips inside the **Select assignees** field. + + ![datastore-step-10-select-user](../../../assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-10-select-user.png) + + **Step 11:** Click the **Save** button to apply the change. Every selected anomaly is updated with the new assignees, and each newly assigned user (except yourself) receives an in-app notification. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + + ![datastore-step-11-save-button](../../../assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-11-save-button.png) + +=== "From the Check Template Anomalies tab" + + **Step 1:** Open the check template and go to its **Anomalies** tab. You see the list of anomalies generated by that specific check. + + ![check-template-step-1-anomalies-list](../../../assets/anomalies/how-tos/shared/check-template-step-1-anomalies-list.png) + + **Step 2:** Hover over each anomaly you want to include and click the checkbox on the left of the row. The selected rows stay highlighted and the top of the list switches into a selection toolbar showing the count (for example, **2 selected**). + + ![check-template-step-2-select-anomalies](../../../assets/anomalies/how-tos/shared/check-template-step-2-select-anomalies.png) + + **Step 3:** Click the **Bulk menu :material-dots-vertical:** button in the selection toolbar. + + ![check-template-step-3-click-ellipsis](../../../assets/anomalies/how-tos/shared/check-template-step-3-click-ellipsis.png) + + **Step 4:** A menu opens showing the bulk actions available: **Edit**, **Acknowledge**, and **Archive**. + + ![check-template-step-4-menu-options](../../../assets/anomalies/how-tos/shared/check-template-step-4-menu-options.png) + + **Step 5:** Click **Edit** from the menu. + + ![check-template-step-5-click-edit](../../../assets/anomalies/how-tos/shared/check-template-step-5-click-edit.png) + + **Step 6:** The **Bulk Edit Anomalies** modal opens. It shows the count of selected anomalies, a notice that the action will overwrite existing data, and **Tags** and **Assignees** toggles (both off by default). + + ![check-template-step-6-modal-opens](../../../assets/anomalies/how-tos/shared/check-template-step-6-modal-opens.png) + + **Step 7:** Turn on the **Assignees** toggle. A **Select assignees** field appears below the toggle. + + ![check-template-step-7-toggle-assignees](../../../assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-7-toggle-assignees.png) + + **Step 8:** Click the **Select assignees** field to open the user dropdown. + + ![check-template-step-8-click-field](../../../assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-8-click-field.png) + + **Step 9:** The dropdown opens, listing every user with at least the **Viewer** team permission on the datastore of the selected anomalies, plus an **All** option that selects all users at once. + + ![check-template-step-9-users-list](../../../assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-9-users-list.png) + + **Step 10:** Click the checkbox next to each user you want to assign. Selected users appear as chips inside the **Select assignees** field. + + ![check-template-step-10-select-user](../../../assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-10-select-user.png) + + **Step 11:** Click the **Save** button to apply the change. Every selected anomaly is updated with the new assignees, and each newly assigned user (except yourself) receives an in-app notification. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + + ![check-template-step-11-save-button](../../../assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-11-save-button.png) + +!!! warning "Bulk edit replaces existing assignees" + Bulk edit overwrites the assignees of each selected anomaly with the new set. It does **not** add to existing assignees. To preserve previous assignees on a specific anomaly, open it individually via [Add Anomaly Assignees](add-assignee.md){:target="_blank"}. + +!!! tip + The **Bulk Edit Anomalies** modal also exposes a **Tags** toggle. Turn both toggles on if you want to change assignees and tags in the same operation. See [Bulk-Edit Tags](../tags/bulk-edit.md){:target="_blank"}. diff --git a/docs/anomalies/how-tos/assignee/remove-assignee.md b/docs/anomalies/how-tos/assignee/remove-assignee.md new file mode 100644 index 0000000000..bf97915ce6 --- /dev/null +++ b/docs/anomalies/how-tos/assignee/remove-assignee.md @@ -0,0 +1,68 @@ +# :material-minus-circle:{ .middle style="color: var(--q-brick)" } Remove Anomaly Assignees + +Use this flow when you want to take one or more users off the **Assignees** list of an anomaly, for example when a teammate is no longer responsible for the issue or when an inherited default assignee does not apply. To add new assignees instead, see [Add Anomaly Assignees](add-assignee.md){:target="_blank"}. To replace the assignee list across many anomalies at once, see [Bulk-Assign Anomalies](bulk-assign.md){:target="_blank"}. For how the field behaves in detail, see [Deep Dive · Anomaly Assignees](../../deep-dive/assignees.md){:target="_blank"}. For programmatic access, see the [Anomalies API](../../api.md){:target="_blank"}. + +You can remove assignees from two places, and the flow is identical because both views use the same user picker. Pick the tab that matches where you start from. + +=== "From the Anomaly Overview" + + **Step 1:** Open the anomaly from the per-datastore **Anomalies** tab. In the **Summary** section, locate the **Assignees** field, which lists the users currently assigned as avatars. + + ![overview-step-1-assignee-field](../../../assets/anomalies/how-tos/assignee/remove-assignee/overview-step-1-assignee-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Assignees** label to open the user picker. + + ![overview-step-2-edit-button](../../../assets/anomalies/how-tos/assignee/remove-assignee/overview-step-2-edit-button.png) + + **Step 3:** The user picker opens. Currently assigned users appear marked with a check icon at the top of the list, and a **:material-close:** icon shows on the right of each marked row. + + ![overview-step-3-users-list](../../../assets/anomalies/how-tos/assignee/remove-assignee/overview-step-3-users-list.png) + + **Step 4:** For each user you want to remove from the anomaly, click the **:material-close:** icon next to their name. + + ![overview-step-4-remove-button](../../../assets/anomalies/how-tos/assignee/remove-assignee/overview-step-4-remove-button.png) + + **Step 5:** The removed users are no longer marked: the check icon and the **:material-close:** icon disappear, confirming they are no longer assigned. + + ![overview-step-5-user-unmarked](../../../assets/anomalies/how-tos/assignee/remove-assignee/overview-step-5-user-unmarked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Assignees** field updates: it shows the remaining avatars, or **No assignees** when every user has been removed. The change is recorded in the **History** section. + + ![overview-step-6-updated-field](../../../assets/anomalies/how-tos/assignee/remove-assignee/overview-step-6-updated-field.png) + +=== "From Explore > Anomalies" + + **Step 1:** Open the anomaly from **Explore > Anomalies**. In the right-side details panel, locate the **Assignees** field, which lists the users currently assigned as avatars. + + ![explore-step-1-assignee-field](../../../assets/anomalies/how-tos/assignee/remove-assignee/explore-step-1-assignee-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Assignees** label to open the user picker. + + ![explore-step-2-edit-button](../../../assets/anomalies/how-tos/assignee/remove-assignee/explore-step-2-edit-button.png) + + **Step 3:** The user picker opens. Currently assigned users appear marked with a check icon at the top of the list, and a **:material-close:** icon shows on the right of each marked row. + + ![explore-step-3-users-list](../../../assets/anomalies/how-tos/assignee/remove-assignee/explore-step-3-users-list.png) + + **Step 4:** For each user you want to remove from the anomaly, click the **:material-close:** icon next to their name. + + ![explore-step-4-remove-button](../../../assets/anomalies/how-tos/assignee/remove-assignee/explore-step-4-remove-button.png) + + **Step 5:** The removed users are no longer marked: the check icon and the **:material-close:** icon disappear, confirming they are no longer assigned. + + ![explore-step-5-user-unmarked](../../../assets/anomalies/how-tos/assignee/remove-assignee/explore-step-5-user-unmarked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Assignees** field updates: it shows the remaining avatars, or **No assignees** when every user has been removed. The change is recorded in the **History** section. + + ![explore-step-6-updated-field](../../../assets/anomalies/how-tos/assignee/remove-assignee/explore-step-6-updated-field.png) + +!!! note "Removing yourself" + To unassign yourself, click the **:material-close:** icon next to your own user. The change is recorded in the **History** section as a self-unassignment. + +!!! info + Removing assignees from an anomaly requires the **Author** team permission (or higher) on the anomaly's datastore. Archived anomalies cannot have their assignees changed; restore the anomaly first. + + Removed assignees are **not** notified of the change. Only users still on the list at the time of the update receive the in-app notification. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + +!!! tip + To replace the current assignees with a different set across many anomalies at once, use [Bulk-Assign Anomalies](bulk-assign.md){:target="_blank"}. The bulk flow replaces the existing list rather than adding to it. diff --git a/docs/anomalies/manage-anomalies/delete-anomalies.md b/docs/anomalies/how-tos/delete-anomalies.md similarity index 73% rename from docs/anomalies/manage-anomalies/delete-anomalies.md rename to docs/anomalies/how-tos/delete-anomalies.md index 7d4c2ee2eb..7ce3a57299 100644 --- a/docs/anomalies/manage-anomalies/delete-anomalies.md +++ b/docs/anomalies/how-tos/delete-anomalies.md @@ -16,15 +16,15 @@ You can delete individual anomalies using one of two methods: **Step 1:** Click on **Archived** from the **navigation bar** in the **Anomalies** section to view all archived anomalies. -![archive-anomaly](../../assets/anomalies/manage-anomalies/delete-anomalies/archive-anomaly.png) +![archive-anomaly](../../assets/anomalies/how-tos/delete-anomalies/archive-anomaly.png) **Step 2:** Locate the anomaly that you want to delete and click on the **Delete** icon located on the right side of the anomaly. -![delete-anomaly](../../assets/anomalies/manage-anomalies/delete-anomalies/delete-anomaly.png) +![delete-anomaly](../../assets/anomalies/how-tos/delete-anomalies/delete-anomaly.png) **Step 3:** A confirmation modal window will appear, click on the **Delete** button to permanently remove the anomaly from the system. -![delete-button-1](../../assets/anomalies/manage-anomalies/delete-anomalies/delete-button-1.png) +![delete-button-1](../../assets/anomalies/how-tos/delete-anomalies/delete-button-1.png) After clicking on the **Delete** button, your anomaly is successfully deleted and a confirmation message appears on the screen. @@ -32,15 +32,15 @@ After clicking on the **Delete** button, your anomaly is successfully deleted an **Step 1:** Click on the archived anomaly from the list of archived anomalies that you want to delete. -![delete-anomaly-1](../../assets/anomalies/manage-anomalies/delete-anomalies/delete-anomaly-1.png) +![delete-anomaly-1](../../assets/anomalies/how-tos/delete-anomalies/delete-anomaly-1.png) **Step 2:** You will be directed to the anomaly details page. Click on the **Settings** icon located at the top right corner of the page and select **“Delete”** from the dropdown menu. -![vertical-delete](../../assets/anomalies/manage-anomalies/delete-anomalies/vertical-delete.png) +![vertical-delete](../../assets/anomalies/how-tos/delete-anomalies/vertical-delete.png) **Step 3:** A confirmation modal window will appear, click on the **Delete** button to permanently remove the anomaly from the system. -![delete-button-2](../../assets/anomalies/manage-anomalies/delete-anomalies/delete-button-1.png) +![delete-button-2](../../assets/anomalies/how-tos/delete-anomalies/delete-button-1.png) After clicking on the **Delete** button, your anomaly is successfully deleted and a confirmation message appears on the screen. @@ -50,18 +50,18 @@ For more efficient management, you can delete multiple anomalies at once using t **Step 1:** Hover over the archived anomalies and click on the checkbox to select anomalies in bulk. -![bulk-delete](../../assets/anomalies/manage-anomalies/delete-anomalies/bulk-delete.png) +![bulk-delete](../../assets/anomalies/how-tos/delete-anomalies/bulk-delete.png) When multiple anomalies are selected, an action toolbar appears, displaying the total number of anomalies chosen along with a vertical ellipsis for additional bulk action options. -![bulk-delete-options](../../assets/anomalies/manage-anomalies/delete-anomalies/bulk-delete-options.png) +![bulk-delete-options](../../assets/anomalies/how-tos/delete-anomalies/bulk-delete-options.png) **Step 2:** Click on the **vertical ellipsis (⋮)** and choose **"Delete"** from the dropdown menu to delete the selected anomalies. -![delete-bulk](../../assets/anomalies/manage-anomalies/delete-anomalies/delete-bulk.png) +![delete-bulk](../../assets/anomalies/how-tos/delete-anomalies/delete-bulk.png) **Step 3:** A confirmation modal window will appear, click on the **Delete** button to permanently remove the selected anomalies from the system. -![delete-button-3](../../assets/anomalies/manage-anomalies/delete-anomalies/delete-button-3.png) +![delete-button-3](../../assets/anomalies/how-tos/delete-anomalies/delete-button-3.png) After clicking on the **Delete** button, your anomalies are successfully deleted and a confirmation message appears on the screen. \ No newline at end of file diff --git a/docs/anomalies/how-tos/edit-description.md b/docs/anomalies/how-tos/edit-description.md new file mode 100644 index 0000000000..188145aafa --- /dev/null +++ b/docs/anomalies/how-tos/edit-description.md @@ -0,0 +1,30 @@ +# Edit Anomaly Description + +!!! tip "Editing tags or assignees instead?" + - **Tags:** [Add](tags/add-tags.md){:target="_blank"} · [Remove](tags/remove-tags.md){:target="_blank"} · [Bulk-Edit](tags/bulk-edit.md){:target="_blank"} + - **Assignees:** [Add](assignee/add-assignee.md){:target="_blank"} · [Remove](assignee/remove-assignee.md){:target="_blank"} · [Bulk-Assign](assignee/bulk-assign.md){:target="_blank"} + +The anomaly description is a business-friendly explanation of the data quality issue. When an anomaly is detected during a scan, the system generates a default description from the failed check (filter conditions, thresholds, nature of the problem). Users with the **Editor** role (or higher) on the datastore can edit that text to add context, clarify the business impact, or document investigation findings. + +![description](../../assets/anomalies/how-tos/edit-description/description.png) + +## Editing the description + +**Step 1:** Open the anomaly from the anomalies list. In the **Description** section, click the **Edit :material-pencil-outline:** button next to the **Description** label to enter edit mode. + +![description-edit-button](../../assets/anomalies/how-tos/edit-description/description-edit-button.png) + +**Step 2:** Make your changes in the editable text area. You can add bullet points, links, and formatting using standard Markdown. + +![description-edit-mode](../../assets/anomalies/how-tos/edit-description/description-edit-mode.png) + +**Step 3:** Click **Save** to persist your changes, or click **Cancel** to discard them and revert to the original description. + +![description-save](../../assets/anomalies/how-tos/edit-description/description-save.png) + +!!! info + Only users with the **Editor** role (or higher) on the respective datastore can edit the description. For more details, see the [Team Permissions](../../settings/security/teams/team-permissions/overview.md){:target="_blank"} page. + +!!! note + - Archived anomalies cannot be edited; restore the anomaly first if you need to modify the description. + - All changes to the description are tracked in the **History** section, maintaining a complete audit trail of modifications. See [History](../deep-dive/insights.md#history){:target="_blank"} on the Anomaly Insights page. diff --git a/docs/anomalies/how-tos/filter-and-sort.md b/docs/anomalies/how-tos/filter-and-sort.md new file mode 100644 index 0000000000..aca7fe43d9 --- /dev/null +++ b/docs/anomalies/how-tos/filter-and-sort.md @@ -0,0 +1,118 @@ +# Filter and Sort + +Filter and Sort options let you organize and narrow your anomaly list by various criteria. Sort options arrange the list by **Anomalous Records**, **Created Date**, or **Severity**. Filter options refine the list by **Timeframe**, **Type**, **Rule**, **Table**, **Field**, **Check**, **Tags**, or **Assignees**. + +!!! tip "Fuzzy search" + Every filter dropdown supports **fuzzy matching**, so you can find values using partial terms, abbreviations, or even typos. For example, typing `dat` matches a datastore named **Customer Data**. + +## Sort options + +Click the sort selector at the top of the anomaly list to choose how the list is ordered. Use the caret next to the selected option to toggle ascending or descending order. The sort selector appears in the same place across every entry point: + +=== "From Explore > Anomalies" + + ![explore-sort](../../assets/anomalies/how-tos/filter-and-sort/explore-sort.png) + +=== "From the Datastore Anomalies tab" + + ![datastore-sort](../../assets/anomalies/how-tos/filter-and-sort/datastore-sort.png) + +=== "From the Check Template Anomalies tab" + + ![check-template-sort](../../assets/anomalies/how-tos/filter-and-sort/check-template-sort.png) + +=== "From the Container Anomalies tab" + + ![container-sort](../../assets/anomalies/how-tos/filter-and-sort/container-sort.png) + +| No. | Sort By Option | Description | +| :-- | :-- | :-- | +| 1 | Anomalous Records | Sorts anomalies based on the number of anomalous records identified. | +| 2 | Created Date | Sorts anomalies according to the date they were detected. | +| 3 | Severity | Sorts anomalies by their assigned severity value. Higher-severity issues appear first. | + +## Filter options + +Click the filter icon to open the filter panel and refine the list by one or more criteria. Filters can be combined; selecting more than one value within a single filter widens the result set (OR), while different filters narrow it (AND). The filter icon appears in the same place across every entry point: + +=== "From Explore > Anomalies" + + ![explore-filter](../../assets/anomalies/how-tos/filter-and-sort/explore-filter.png) + +=== "From the Datastore Anomalies tab" + + ![datastore-filter](../../assets/anomalies/how-tos/filter-and-sort/datastore-filter.png) + +=== "From the Check Template Anomalies tab" + + ![check-template-filter](../../assets/anomalies/how-tos/filter-and-sort/check-template-filter.png) + +=== "From the Container Anomalies tab" + + ![container-filter](../../assets/anomalies/how-tos/filter-and-sort/container-filter.png) + +| No. | Filter | Description | +| :-- | :-- | :-- | +| 1 | Timeframe | Filter anomalies detected within a specific time range (e.g., the last week or year). | +| 2 | Type | Filter anomalies by anomaly type (Record or Shape). | +| 3 | Rule | Filter anomalies by the rule type applied. Clicking the caret next to the Rule field reveals every rule type present in the current results, with a counter showing the number of occurrences (e.g., **Between** with a total of **7**). | +| 4 | Table | Filter anomalies by the table where they occurred. | +| 5 | Field | Filter anomalies by the field where the issue was found. | +| 6 | Check | Filter anomalies by the check that generated them. | +| 7 | Tags | Filter anomalies by the tags applied. The dropdown lists only the tags associated with the currently visible items, with their color icon, name, type, and the number of matching records. Selecting one or more tags refines the list. | +| 8 | Assignees | Filter anomalies by the users they are assigned to. The dropdown lists active platform users; selecting one or more users narrows the list to anomalies where any selected user is an assignee. To quickly see open anomalies assigned to you, use the **Assigned** subtab inside **Open**, described in [Explore Anomalies](../../explore/anomalies.md#open){:target="_blank"}. | + +!!! tip + To filter by anomaly status (Open vs Archived sub-statuses), see [Filter Anomalies by Status](filter-by-status.md){:target="_blank"} instead. + + + + diff --git a/docs/anomalies/how-tos/filter-by-status.md b/docs/anomalies/how-tos/filter-by-status.md new file mode 100644 index 0000000000..0ca1b0066e --- /dev/null +++ b/docs/anomalies/how-tos/filter-by-status.md @@ -0,0 +1,154 @@ +# Filter Anomalies by Status + +Step-by-step tutorial for narrowing the anomaly list to a specific status group. Anomalies are split into two top-level groups, **Open** and **Archived**, each with its own sub-statuses. For the meaning of every status, see [Anomaly Status](../deep-dive/status.md){:target="_blank"}. For other filters (Timeframe, Type, Rule, Assignees) and sorting, see [Filter & Sort](filter-and-sort.md){:target="_blank"}. + +## Open Anomalies + +Open anomalies are detected issues that have not yet been resolved or archived. Switch to this group when you want to focus on anomalies that still need attention. Pick the tab that matches where you start from. + +=== "From Explore > Anomalies" + + **Step 1:** Open **Explore > Anomalies**. If the **Open** filter is not already selected, click it at the top of the anomaly list. + + ![explore-open-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/explore-open-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![explore-open-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/explore-open-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Active** | Anomalies that are currently unresolved and have not been acknowledged, archived, or resolved. | + | 2 | **Acknowledged** | Anomalies that have been reviewed and marked as acknowledged, though they may still need further action. | + | 3 | **Assigned** | Open anomalies where you are listed as an assignee. | + | 4 | **All** | All open anomalies, including Active and Acknowledged. | + +=== "From the Datastore Anomalies tab" + + **Step 1:** Open the source datastore and go to the **Anomalies** tab. If the **Open** filter is not already selected, click it at the top of the list. + + ![datastore-open-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/datastore-open-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![datastore-open-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/datastore-open-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Active** | Anomalies that are currently unresolved and have not been acknowledged, archived, or resolved. | + | 2 | **Acknowledged** | Anomalies that have been reviewed and marked as acknowledged, though they may still need further action. | + | 3 | **All** | All open anomalies, including Active and Acknowledged. | + +=== "From the Check Template Anomalies tab" + + **Step 1:** Open the check template and go to its **Anomalies** tab. If the **Open** filter is not already selected, click it at the top of the list. + + ![check-template-open-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/check-template-open-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![check-template-open-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/check-template-open-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Active** | Anomalies that are currently unresolved and have not been acknowledged, archived, or resolved. | + | 2 | **Acknowledged** | Anomalies that have been reviewed and marked as acknowledged, though they may still need further action. | + | 3 | **All** | All open anomalies, including Active and Acknowledged. | + +=== "From the Container Anomalies tab" + + **Step 1:** Open the container and go to its **Anomalies** tab. If the **Open** filter is not already selected, click it at the top of the list. + + ![container-open-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/container-open-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![container-open-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/container-open-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Active** | Anomalies that are currently unresolved and have not been acknowledged, archived, or resolved. | + | 2 | **Acknowledged** | Anomalies that have been reviewed and marked as acknowledged, though they may still need further action. | + | 3 | **All** | All open anomalies, including Active and Acknowledged. | + +## Archived Anomalies + +Archived anomalies are issues that have already been reviewed and moved out of the active monitoring flow. Switch to this group to inspect resolved or dismissed anomalies without cluttering the active list. Pick the tab that matches where you start from. + +=== "From Explore > Anomalies" + + **Step 1:** Open **Explore > Anomalies**. If the **Archived** filter is not already selected, click it at the top of the anomaly list. + + ![explore-archived-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/explore-archived-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![explore-archived-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/explore-archived-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Resolved** | The anomaly was a legitimate data quality concern and has been addressed. | + | 2 | **Duplicate** | The anomaly is a duplicate of an existing record and has already been addressed. | + | 3 | **Invalid** | The anomaly is not a legitimate data quality concern and does not require further action. | + | 4 | **Discarded** | The anomaly is no longer being reviewed or considered relevant. | + | 5 | **All** | All archived anomalies across the four sub-statuses. | + +=== "From the Datastore Anomalies tab" + + **Step 1:** Open the source datastore and go to the **Anomalies** tab. If the **Archived** filter is not already selected, click it at the top of the list. + + ![datastore-archived-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/datastore-archived-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![datastore-archived-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/datastore-archived-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Resolved** | The anomaly was a legitimate data quality concern and has been addressed. | + | 2 | **Duplicate** | The anomaly is a duplicate of an existing record and has already been addressed. | + | 3 | **Invalid** | The anomaly is not a legitimate data quality concern and does not require further action. | + | 4 | **Discarded** | The anomaly is no longer being reviewed or considered relevant. | + | 5 | **All** | All archived anomalies across the four sub-statuses. | + +=== "From the Check Template Anomalies tab" + + **Step 1:** Open the check template and go to its **Anomalies** tab. If the **Archived** filter is not already selected, click it at the top of the list. + + ![check-template-archived-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/check-template-archived-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![check-template-archived-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/check-template-archived-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Resolved** | The anomaly was a legitimate data quality concern and has been addressed. | + | 2 | **Duplicate** | The anomaly is a duplicate of an existing record and has already been addressed. | + | 3 | **Invalid** | The anomaly is not a legitimate data quality concern and does not require further action. | + | 4 | **Discarded** | The anomaly is no longer being reviewed or considered relevant. | + | 5 | **All** | All archived anomalies across the four sub-statuses. | + +=== "From the Container Anomalies tab" + + **Step 1:** Open the container and go to its **Anomalies** tab. If the **Archived** filter is not already selected, click it at the top of the list. + + ![container-archived-step-1-click-filter](../../assets/anomalies/how-tos/filter-by-status/container-archived-step-1-click-filter.png) + + **Step 2:** Pick the sub-status you want to view from the sub-tabs that appear (each marked with its colored indicator). + + ![container-archived-step-2-view-statuses](../../assets/anomalies/how-tos/filter-by-status/container-archived-step-2-view-statuses.png) + + | No. | Sub-status | Description | + | :-- | :-- | :-- | + | 1 | **Resolved** | The anomaly was a legitimate data quality concern and has been addressed. | + | 2 | **Duplicate** | The anomaly is a duplicate of an existing record and has already been addressed. | + | 3 | **Invalid** | The anomaly is not a legitimate data quality concern and does not require further action. | + | 4 | **Discarded** | The anomaly is no longer being reviewed or considered relevant. | + | 5 | **All** | All archived anomalies across the four sub-statuses. | + +!!! tip + To further narrow the list by other criteria (Timeframe, Type, Rule, Assignees, Tags, etc.) or to change sorting, see [Filter & Sort](filter-and-sort.md){:target="_blank"}. + + + diff --git a/docs/anomalies/manage-anomalies/restore-anomalies.md b/docs/anomalies/how-tos/restore-anomalies.md similarity index 77% rename from docs/anomalies/manage-anomalies/restore-anomalies.md rename to docs/anomalies/how-tos/restore-anomalies.md index df984da140..e88239d10d 100644 --- a/docs/anomalies/manage-anomalies/restore-anomalies.md +++ b/docs/anomalies/how-tos/restore-anomalies.md @@ -4,10 +4,10 @@ By restoring archived anomalies, you can bring them back into the **acknowledged **Step 1**: Click on the anomaly that you want to restore from the list of archived anomalies. -![restore-anomaly](../../assets/anomalies/manage-anomalies/restore-anomalies/restore-anomaly.png) +![restore-anomaly](../../assets/anomalies/how-tos/restore-anomalies/restore-anomaly.png) **Step 2:** You will be directed to the anomaly details page. Click on the **Settings** icon located at the top right corner of the page and select **“Restore”** from the drop down menu. -![restore-option](../../assets/anomalies/manage-anomalies/restore-anomalies/restore-option.png) +![restore-option](../../assets/anomalies/how-tos/restore-anomalies/restore-option.png) After clicking on the **Restore** button, the selected anomaly is now restored in an acknowledged state and a confirmation message appears on the screen. \ No newline at end of file diff --git a/docs/anomalies/how-tos/tags/add-tags.md b/docs/anomalies/how-tos/tags/add-tags.md new file mode 100644 index 0000000000..d07824af21 --- /dev/null +++ b/docs/anomalies/how-tos/tags/add-tags.md @@ -0,0 +1,64 @@ +# :material-plus-circle:{ .middle style="color: var(--q-brick)" } Add Tags + +Step-by-step tutorial for adding one or more tags to a single anomaly. To take a tag off an anomaly, see [Remove Tags](remove-tags.md){:target="_blank"}. To apply the same set of tags to many anomalies at once, see [Bulk-Edit Tags](bulk-edit.md){:target="_blank"}. For the platform-level tag catalog, see [Tags](../../../tags/overview.md){:target="_blank"}. For programmatic access, see the [Anomalies API](../../api.md#update-a-single-anomaly){:target="_blank"}. + +You can add tags from two places, and the flow is identical because both views use the same tag picker. Pick the tab that matches where you start from. + +=== "From the Anomaly Overview" + + **Step 1:** Open the anomaly from the per-datastore **Anomalies** tab. In the **Summary** section, locate the **Tags** field. + + ![overview-step-1-tags-field](../../../assets/anomalies/how-tos/tags/add-tags/overview-step-1-tags-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Tags** label to open the tag picker. When no tags are applied yet, the same button shows a `+` icon instead. + + ![overview-step-2-edit-button](../../../assets/anomalies/how-tos/tags/add-tags/overview-step-2-edit-button.png) + + **Step 3:** The tag picker opens, listing every tag from the platform catalog. Start typing to narrow the list. + + ![overview-step-3-tag-picker](../../../assets/anomalies/how-tos/tags/add-tags/overview-step-3-tag-picker.png) + + **Step 4:** Select one or more tags from the list to apply them to the anomaly. + + ![overview-step-4-select-tag](../../../assets/anomalies/how-tos/tags/add-tags/overview-step-4-select-tag.png) + + **Step 5:** The selected tags appear at the top of the list with a check icon, confirming they are now applied. + + ![overview-step-5-tag-marked](../../../assets/anomalies/how-tos/tags/add-tags/overview-step-5-tag-marked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Tags** field updates with the new chips, and the change is recorded in the **History** section. + + ![overview-step-6-updated-field](../../../assets/anomalies/how-tos/tags/add-tags/overview-step-6-updated-field.png) + +=== "From Explore > Anomalies" + + **Step 1:** Open the anomaly from **Explore > Anomalies**. In the right-side details panel, locate the **Tags** field. + + ![explore-step-1-tags-field](../../../assets/anomalies/how-tos/tags/add-tags/explore-step-1-tags-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Tags** label to open the tag picker. When no tags are applied yet, the same button shows a `+` icon instead. + + ![explore-step-2-edit-button](../../../assets/anomalies/how-tos/tags/add-tags/explore-step-2-edit-button.png) + + **Step 3:** The tag picker opens, listing every tag from the platform catalog. Start typing to narrow the list. + + ![explore-step-3-tag-picker](../../../assets/anomalies/how-tos/tags/add-tags/explore-step-3-tag-picker.png) + + **Step 4:** Select one or more tags from the list to apply them to the anomaly. + + ![explore-step-4-select-tag](../../../assets/anomalies/how-tos/tags/add-tags/explore-step-4-select-tag.png) + + **Step 5:** The selected tags appear at the top of the list with a check icon, confirming they are now applied. + + ![explore-step-5-tag-marked](../../../assets/anomalies/how-tos/tags/add-tags/explore-step-5-tag-marked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Tags** field updates with the new chips, and the change is recorded in the **History** section. + + ![explore-step-6-updated-field](../../../assets/anomalies/how-tos/tags/add-tags/explore-step-6-updated-field.png) + +!!! info + Adding or removing tags on an anomaly requires the **Author** team permission (or higher) on the anomaly's datastore. Archived anomalies cannot have their tags changed; restore the anomaly first. + + Current assignees (except yourself) are notified about the change as part of the same update event. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + + Tags are managed at the platform level. To create or delete tags from the catalog, see [Tags](../../../tags/overview.md){:target="_blank"}. diff --git a/docs/anomalies/how-tos/tags/bulk-edit.md b/docs/anomalies/how-tos/tags/bulk-edit.md new file mode 100644 index 0000000000..15f21603d1 --- /dev/null +++ b/docs/anomalies/how-tos/tags/bulk-edit.md @@ -0,0 +1,106 @@ +# :material-dots-vertical-circle:{ .middle style="color: var(--q-brick)" } Bulk-Edit Tags + +Use this flow when you want to apply the same set of tags to many anomalies at once. To add tags on a single anomaly from its details view, see [Add Tags](add-tags.md){:target="_blank"}. To take a tag off an anomaly, see [Remove Tags](remove-tags.md){:target="_blank"}. For the platform-level tag catalog, see [Tags](../../../tags/overview.md){:target="_blank"}. For programmatic access, see the [Anomalies API](../../api.md){:target="_blank"}. + +!!! info + Bulk-editing tags requires the **Author** team permission (or higher) on the datastore of every selected anomaly. Archived anomalies cannot have their tags changed; restore them first. + +You can launch a bulk edit from two places, and the flow is identical because both lists use the same selection toolbar and **Bulk Edit Anomalies** modal. Pick the tab that matches where you start from. + +=== "From the Datastore Anomalies tab" + + **Step 1:** Open the source datastore and go to the **Anomalies** tab. You see the list of anomalies for that datastore. + + ![datastore-step-1-anomalies-list](../../../assets/anomalies/how-tos/shared/datastore-step-1-anomalies-list.png) + + **Step 2:** Hover over each anomaly you want to include and click the checkbox on the left of the row. The selected rows stay highlighted and the top of the list switches into a selection toolbar showing the count (for example, **2 selected**). + + ![datastore-step-2-select-anomalies](../../../assets/anomalies/how-tos/shared/datastore-step-2-select-anomalies.png) + + **Step 3:** Click the **Bulk menu :material-dots-vertical:** button in the selection toolbar. + + ![datastore-step-3-click-ellipsis](../../../assets/anomalies/how-tos/shared/datastore-step-3-click-ellipsis.png) + + **Step 4:** A menu opens showing the bulk actions available: **Edit**, **Acknowledge**, and **Archive**. + + ![datastore-step-4-menu-options](../../../assets/anomalies/how-tos/shared/datastore-step-4-menu-options.png) + + **Step 5:** Click **Edit** from the menu. + + ![datastore-step-5-click-edit](../../../assets/anomalies/how-tos/shared/datastore-step-5-click-edit.png) + + **Step 6:** The **Bulk Edit Anomalies** modal opens. It shows the count of selected anomalies, a notice that the action will overwrite existing data, and **Tags** and **Assignees** toggles (both off by default). + + ![datastore-step-6-modal-opens](../../../assets/anomalies/how-tos/shared/datastore-step-6-modal-opens.png) + + **Step 7:** Turn on the **Tags** toggle. A **Select tags** field appears below the toggle. + + ![datastore-step-7-toggle-tags](../../../assets/anomalies/how-tos/tags/bulk-edit/datastore-step-7-toggle-tags.png) + + **Step 8:** Click the **Select tags** field to open the tag dropdown. + + ![datastore-step-8-click-field](../../../assets/anomalies/how-tos/tags/bulk-edit/datastore-step-8-click-field.png) + + **Step 9:** The dropdown opens, listing every tag from the platform catalog. + + ![datastore-step-9-tags-list](../../../assets/anomalies/how-tos/tags/bulk-edit/datastore-step-9-tags-list.png) + + **Step 10:** Click the checkbox next to each tag you want to apply. Selected tags appear as chips inside the **Select tags** field. + + ![datastore-step-10-select-tag](../../../assets/anomalies/how-tos/tags/bulk-edit/datastore-step-10-select-tag.png) + + **Step 11:** Click the **Save** button to apply the change. Every selected anomaly is updated with the new tags, and the current assignees of each anomaly (except yourself) receive an in-app notification. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + + ![datastore-step-11-save-button](../../../assets/anomalies/how-tos/tags/bulk-edit/datastore-step-11-save-button.png) + +=== "From the Check Template Anomalies tab" + + **Step 1:** Open the check template and go to its **Anomalies** tab. You see the list of anomalies generated by that specific check. + + ![check-template-step-1-anomalies-list](../../../assets/anomalies/how-tos/shared/check-template-step-1-anomalies-list.png) + + **Step 2:** Hover over each anomaly you want to include and click the checkbox on the left of the row. The selected rows stay highlighted and the top of the list switches into a selection toolbar showing the count (for example, **2 selected**). + + ![check-template-step-2-select-anomalies](../../../assets/anomalies/how-tos/shared/check-template-step-2-select-anomalies.png) + + **Step 3:** Click the **Bulk menu :material-dots-vertical:** button in the selection toolbar. + + ![check-template-step-3-click-ellipsis](../../../assets/anomalies/how-tos/shared/check-template-step-3-click-ellipsis.png) + + **Step 4:** A menu opens showing the bulk actions available: **Edit**, **Acknowledge**, and **Archive**. + + ![check-template-step-4-menu-options](../../../assets/anomalies/how-tos/shared/check-template-step-4-menu-options.png) + + **Step 5:** Click **Edit** from the menu. + + ![check-template-step-5-click-edit](../../../assets/anomalies/how-tos/shared/check-template-step-5-click-edit.png) + + **Step 6:** The **Bulk Edit Anomalies** modal opens. It shows the count of selected anomalies, a notice that the action will overwrite existing data, and **Tags** and **Assignees** toggles (both off by default). + + ![check-template-step-6-modal-opens](../../../assets/anomalies/how-tos/shared/check-template-step-6-modal-opens.png) + + **Step 7:** Turn on the **Tags** toggle. A **Select tags** field appears below the toggle. + + ![check-template-step-7-toggle-tags](../../../assets/anomalies/how-tos/tags/bulk-edit/check-template-step-7-toggle-tags.png) + + **Step 8:** Click the **Select tags** field to open the tag dropdown. + + ![check-template-step-8-click-field](../../../assets/anomalies/how-tos/tags/bulk-edit/check-template-step-8-click-field.png) + + **Step 9:** The dropdown opens, listing every tag from the platform catalog. + + ![check-template-step-9-tags-list](../../../assets/anomalies/how-tos/tags/bulk-edit/check-template-step-9-tags-list.png) + + **Step 10:** Click the checkbox next to each tag you want to apply. Selected tags appear as chips inside the **Select tags** field. + + ![check-template-step-10-select-tag](../../../assets/anomalies/how-tos/tags/bulk-edit/check-template-step-10-select-tag.png) + + **Step 11:** Click the **Save** button to apply the change. Every selected anomaly is updated with the new tags, and the current assignees of each anomaly (except yourself) receive an in-app notification. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + + ![check-template-step-11-save-button](../../../assets/anomalies/how-tos/tags/bulk-edit/check-template-step-11-save-button.png) + +!!! warning "Bulk edit replaces existing tags" + Bulk edit overwrites the tags of each selected anomaly with the new set. It does **not** add to existing tags. To preserve previous tags on a specific anomaly, open it individually via [Add Tags](add-tags.md){:target="_blank"}. + +!!! tip + The **Bulk Edit Anomalies** modal also exposes an **Assignees** toggle. Turn both toggles on if you want to change tags and assignees in the same operation. See [Bulk-Assign Anomalies](../assignee/bulk-assign.md){:target="_blank"}. diff --git a/docs/anomalies/how-tos/tags/remove-tags.md b/docs/anomalies/how-tos/tags/remove-tags.md new file mode 100644 index 0000000000..37088d8feb --- /dev/null +++ b/docs/anomalies/how-tos/tags/remove-tags.md @@ -0,0 +1,67 @@ +# :material-minus-circle:{ .middle style="color: var(--q-brick)" } Remove Tags + +Use this flow when you want to take one or more tags off the **Tags** list of an anomaly, for example when a tag was applied by mistake or the categorization no longer reflects the issue. To apply new tags instead, see [Add Tags](add-tags.md){:target="_blank"}. To replace the tag set across many anomalies at once, see [Bulk-Edit Tags](bulk-edit.md){:target="_blank"}. For the platform-level tag catalog, see [Tags](../../../tags/overview.md){:target="_blank"}. For programmatic access, see the [Anomalies API](../../api.md#update-a-single-anomaly){:target="_blank"}. + +You can remove tags from two places, and the flow is identical because both views use the same tag picker. Pick the tab that matches where you start from. + +=== "From the Anomaly Overview" + + **Step 1:** Open the anomaly from the per-datastore **Anomalies** tab. In the **Summary** section, locate the **Tags** field, which lists the tags currently applied as chips. + + ![overview-step-1-tags-field](../../../assets/anomalies/how-tos/tags/remove-tags/overview-step-1-tags-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Tags** label to open the tag picker. + + ![overview-step-2-edit-button](../../../assets/anomalies/how-tos/tags/remove-tags/overview-step-2-edit-button.png) + + **Step 3:** The tag picker opens. Currently applied tags appear marked with a check icon at the top of the list, and a **:material-close:** icon shows on the right of each marked row. + + ![overview-step-3-tag-picker](../../../assets/anomalies/how-tos/tags/remove-tags/overview-step-3-tag-picker.png) + + **Step 4:** For each tag you want to remove from the anomaly, click the **:material-close:** icon next to its name. + + ![overview-step-4-remove-tag](../../../assets/anomalies/how-tos/tags/remove-tags/overview-step-4-remove-tag.png) + + **Step 5:** The removed tags are no longer marked: the check icon and the **:material-close:** icon disappear, confirming they are no longer applied. + + ![overview-step-5-tag-unmarked](../../../assets/anomalies/how-tos/tags/remove-tags/overview-step-5-tag-unmarked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Tags** field updates: it shows the remaining chips, or **No tags** when every tag has been removed. The change is recorded in the **History** section. + + ![overview-step-6-updated-field](../../../assets/anomalies/how-tos/tags/remove-tags/overview-step-6-updated-field.png) + +=== "From Explore > Anomalies" + + **Step 1:** Open the anomaly from **Explore > Anomalies**. In the right-side details panel, locate the **Tags** field, which lists the tags currently applied as chips. + + ![explore-step-1-tags-field](../../../assets/anomalies/how-tos/tags/remove-tags/explore-step-1-tags-field.png) + + **Step 2:** Click the **Edit :material-pencil-outline:** button next to the **Tags** label to open the tag picker. + + ![explore-step-2-edit-button](../../../assets/anomalies/how-tos/tags/remove-tags/explore-step-2-edit-button.png) + + **Step 3:** The tag picker opens. Currently applied tags appear marked with a check icon at the top of the list, and a **:material-close:** icon shows on the right of each marked row. + + ![explore-step-3-tag-picker](../../../assets/anomalies/how-tos/tags/remove-tags/explore-step-3-tag-picker.png) + + **Step 4:** For each tag you want to remove from the anomaly, click the **:material-close:** icon next to its name. + + ![explore-step-4-remove-tag](../../../assets/anomalies/how-tos/tags/remove-tags/explore-step-4-remove-tag.png) + + **Step 5:** The removed tags are no longer marked: the check icon and the **:material-close:** icon disappear, confirming they are no longer applied. + + ![explore-step-5-tag-unmarked](../../../assets/anomalies/how-tos/tags/remove-tags/explore-step-5-tag-unmarked.png) + + **Step 6:** Click anywhere outside the picker to close it. The **Tags** field updates: it shows the remaining chips, or **No tags** when every tag has been removed. The change is recorded in the **History** section. + + ![explore-step-6-updated-field](../../../assets/anomalies/how-tos/tags/remove-tags/explore-step-6-updated-field.png) + +!!! info + Removing tags from an anomaly requires the **Author** team permission (or higher) on the anomaly's datastore. Archived anomalies cannot have their tags changed; restore the anomaly first. + + Current assignees (except yourself) are notified about the change as part of the same update event. See [Deep Dive · Anomaly Assignees · Notifications](../../deep-dive/assignees.md#notifications){:target="_blank"}. + + Tags removed here are only unlinked from this anomaly; they remain in the platform-level catalog. To delete a tag from the catalog itself, see [Tags](../../../tags/overview.md){:target="_blank"}. + +!!! tip + To replace the current tags with a different set across many anomalies at once, use [Bulk-Edit Tags](bulk-edit.md){:target="_blank"}. The bulk flow replaces the existing list rather than adding to it. diff --git a/docs/anomalies/manage-anomalies/edit-anomalies.md b/docs/anomalies/manage-anomalies/edit-anomalies.md deleted file mode 100644 index 098f9817ac..0000000000 --- a/docs/anomalies/manage-anomalies/edit-anomalies.md +++ /dev/null @@ -1,46 +0,0 @@ -# Edit Anomalies - -Anomalies support two editable properties: **description** and **tags**. The description allows you to add business context or investigation findings, while tags help you categorize and organize anomalies for downstream workflows. - -!!! note - - Individual anomalies can have both their description and tags edited - - When editing multiple anomalies in bulk, only tags can be modified - - Only users with the **Editor** role (or higher) on the respective datastore can make edits to non-archived anomalies - -## Edit Description - -The anomaly description provides a detailed explanation of the data quality issue. You can edit it to add additional context, clarify the business impact, or document investigation findings. - -For detailed instructions on editing the description, see the [**Description**](../details/insights.md#description) section in the Anomaly Insights documentation. - -## Edit Tags (Bulk Edit) - -**Step 1:** Hover over the anomaly (whether Active or Acknowledged) and click on the checkbox. - -![edit-anomaly](../../assets/anomalies/manage-anomalies/edit-anomalies/edit-anomaly.png) - -You can edit multiple anomalies by selecting the checkboxes next to each anomaly to choose multiple anomalies at once. - -![hover-edit](../../assets/anomalies/manage-anomalies/edit-anomalies/hover-edit.png) - -When multiple anomalies are selected, an action toolbar appears, displaying the total number of selected anomalies along with a vertical ellipsis for additional bulk action options. - -![vertical-edit](../../assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit.png) - -**Step 2:** Click on the **vertical ellipsis (⋮)** and choose **"Edit"** from the dropdown menu to edit the selected anomalies. - -![vertical-edit-options](../../assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit-options.png) - -A modal window titled **“Bulk Edit Anomalies”** will appear. Here you can only modify the **“tags”** of the selected anomalies. - -![edit-modal](../../assets/anomalies/manage-anomalies/edit-anomalies/edit-modal.png) - -**Step 3**: Turn on the toggle and assign tags to the selected anomalies. - -![edit-bulk](../../assets/anomalies/manage-anomalies/edit-anomalies/edit-bulk.png) - -**Step 4:** Once you have assigned the tags, click on the **“Save”** button. - -After clicking the **Save** button, the selected anomalies will be updated with the assigned tags. - -![save-button](../../assets/anomalies/manage-anomalies/edit-anomalies/save-button.png) diff --git a/docs/anomalies/manage-anomalies/filter-and-sort.md b/docs/anomalies/manage-anomalies/filter-and-sort.md deleted file mode 100644 index a7eeaee41d..0000000000 --- a/docs/anomalies/manage-anomalies/filter-and-sort.md +++ /dev/null @@ -1,46 +0,0 @@ -# Filter and Sort - -Filter and Sort options allow you to organize your anomalies by various criteria, such as Severity, Anomalous Records, and Created Date. You can also apply filters to refine your list of anomalies based on Timeframe, Type, and Rule etc. - -## Sort - -You can sort your anomalies by **Anomalous Records**, **Created Date**, and **Severity** to easily organize and prioritize them according to your needs. - -![sort-options](../../assets/anomalies/manage-anomalies/filter-and-sort/sort-options.png) - -| No. | Sort By Option | Description | -| :---- | :---- | :---- | -| 1 | Anomalous Records | Sorts anomalies based on the number of anomalous records identified. | -| 2 | Created Date | Sorts anomalies according to the date they were detected. | -| 3 | Severity | Sorts anomalies by their assigned **Severity** value. Higher-severity issues appear first. | - -Whatever sorting option is selected, you can arrange the data either in ascending or descending order by clicking the caret button next to the selected sorting criteria. - -![sort-order](../../assets/anomalies/manage-anomalies/filter-and-sort/sort-order.png) - -## Filter - -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} -![filter](../../assets/anomalies/manage-anomalies/filter-and-sort/fuzzy-anomalies.png) - -You can filter your anomalies based on values like **Timeframe**, **Type**, **Rule**, and **Tags**, etc. - -![filter](../../assets/anomalies/manage-anomalies/filter-and-sort/filter-1.png) - -| No. | Field | Description | -| :---- | :---- | :---- | -| 1 | Timeframe | Filtering anomalies detected within specific time ranges (e.g., anomalies detected in the last week or year). | -| 2 | Type | Filter anomalies based on anomaly type (Record or Shape). | -| 3 | Rule | Filter anomalies based on specific rules applied to the anomaly. By clicking on the caret down button next to the Rule field, the available rule types will be dynamically populated based on the rule types present in the results. The rules displayed are based on the current dataset and provide more granular control over filtering. Each rule type will show a counter next to it, displaying the total number of occurrences for that rule in the dataset. For example, the rule type **Between** is displayed with a total of **7** occurrences. | -| 4 | Table | Filters anomalies based on the table where they occurred. | -| 5 | Field | Filters anomalies based on the column in the table where the issue was found. | -| 6 | Check | Filters anomalies based on the check that generated them. | - -![filter](../../assets/anomalies/manage-anomalies/filter-and-sort/filter-2.png) - -| No. | Filter | Description | -| :---- | :---- | :---- | -| 7 | Tags | Tag Filter displays only the tags associated with the currently visible items, along with their color icon, name, type, and the number of matching records. Selecting one or more tags refines the list based on your selection. If no matching items are found, a No options found message is displayed. | \ No newline at end of file diff --git a/docs/anomalies/overview.md b/docs/anomalies/overview.md index 32ea72c912..845a2ec1d9 100644 --- a/docs/anomalies/overview.md +++ b/docs/anomalies/overview.md @@ -1,17 +1,17 @@ # **Anomalies** -Anomalies in Qualytics represent data points that deviate from expected patterns or violate defined quality rules, often highlighting issues such as missing values, structural inconsistencies, or incorrect data. These anomalies are detected during scan operations through AI Managed or user-authored checks. When every failed check behind an anomaly is AI Managed, the anomaly displays an **AI badge** (purple pill with a four-point star icon) — hovering it shows *"Identified by AI managed checks."* +Anomalies in Qualytics represent data points that deviate from expected patterns or violate defined quality rules, often highlighting issues such as missing values, structural inconsistencies, or incorrect data. These anomalies are detected during scan operations through AI Managed or user-authored checks. When every failed check behind an anomaly is AI Managed, the anomaly displays an **AI badge** (purple pill with a four-point star icon). Hovering it shows *"Identified by AI managed checks."* ## Anomaly Types Qualytics classifies anomalies into two types: **Record Anomalies** and **Shape Anomalies**. Record anomalies flag rows with data issues like missing or invalid values, while shape anomalies detect structural problems such as missing columns or schema changes. Together, they ensure thorough data quality coverage at both the value and structure levels. !!! note - For more information, please refer to the [Anomaly Types](types.md) Documentation. + For more information, please refer to the [Anomaly Types](deep-dive/types.md) Documentation. ## Anomaly Detection Process -The anomaly detection process in Qualytics ensures data quality by identifying deviations from expected patterns through a structured workflow. It starts with configuring datastores, syncing metadata, and profiling data to understand its structure. Users then apply quality checks—either Authored or AI Managed—during Scan operations. Any failures are flagged as anomalies, enabling timely detection and resolution of data issues to maintain overall data integrity. +The anomaly detection process in Qualytics ensures data quality by identifying deviations from expected patterns through a structured workflow. It starts with configuring datastores, syncing metadata, and profiling data to understand its structure. Users then apply quality checks, either Authored or AI Managed, during Scan operations. Any failures are flagged as anomalies, enabling timely detection and resolution of data issues to maintain overall data integrity. !!! note For more information, please refer to the [Anomaly Detection Process](detection.md) Documentation. \ No newline at end of file diff --git a/docs/anomalies/status.md b/docs/anomalies/status.md deleted file mode 100644 index e2e706a72c..0000000000 --- a/docs/anomalies/status.md +++ /dev/null @@ -1,45 +0,0 @@ -# Anomaly Status - -Anomaly status provides a structured way to track the lifecycle of data quality issues—from detection to resolution. Each anomaly is assigned a status that indicates its current state, helping teams prioritize actions and maintain oversight. These statuses are divided into two main categories: Open, for anomalies that still need attention, and Archived, for those that have been resolved, dismissed, or categorized for reference. - -Let’s get started 🚀 - -## Open Anomalies - -Open anomalies are data quality issues that have been detected but not yet resolved or archived. This category is divided into three sub-statuses that help track the progress and handling of each anomaly. - -![open-anomalies](../assets/anomalies/status/open-anomalies.png) - -**1 Active**: By clicking on the Active button, the user can see anomalies that are currently unresolved and have not been acknowledged, archived, or resolved. It may require immediate attention. - -**2 Acknowledged**: By clicking on the Acknowledged button, the user can see anomalies that has been reviewed and marked as acknowledged, though it may still need further action. - -**3 All**: By clicking on the All button, the user can view all open anomalies, including those marked as Active and Acknowledged, providing a complete view of ongoing issues. - -## Archived Anomalies - -Archived anomalies are issues that have already been reviewed and moved out of the active monitoring flow. These anomalies are categorized based on how they were resolved or classified, helping maintain a clear historical record without cluttering ongoing monitoring efforts. - -![archive-anomalies](../assets/anomalies/status/archive-anomalies.png) - -**1 Resolved**: This indicates that the anomaly was a legitimate data quality concern and has been addressed. - -**2 Duplicate**: This indicates that the anomaly is a duplicate of an existing record and has already been addressed. - -!!! info - The main purpose of marking an anomaly as **Duplicate** is to support fingerprinting. - If an anomaly is set as *Duplicate* without referencing the original anomaly, Qualytics cannot determine which one is the true original, which breaks fingerprinting. - - **Recommended approach:** - Set the anomaly as **Discarded** instead and include the **original anomaly ID** or a meaningful comment. This keeps the fingerprinting logic accurate. - - For more information refer to the [Anomaly Fingerprint Documentation](../anomalies/fingerprints.md) - -**3 Invalid**: This indicates that the anomaly is not a legitimate data quality concern and does not require further action. - -**4 Discarded**: This indicates that the anomaly is no longer being reviewed or considered relevant. It helps remove outdated or unnecessary anomalies from the active list without marking them as invalid or resolved. - -**5 All**: Displays all archived anomalies, including those marked as Resolved, Duplicate, and Invalid, giving a comprehensive view of all past issues. - -!!! note - For more information, refer to the [Archived Anomalies Documentation](manage-anomalies/archive-anomalies.md). diff --git a/docs/assets/anomalies/details/insights/anomalous-fields-button.png b/docs/assets/anomalies/deep-dive/insights/anomalous-fields-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/anomalous-fields-button.png rename to docs/assets/anomalies/deep-dive/insights/anomalous-fields-button.png diff --git a/docs/assets/anomalies/details/insights/anomalous-fields-dropdown.png b/docs/assets/anomalies/deep-dive/insights/anomalous-fields-dropdown.png similarity index 100% rename from docs/assets/anomalies/details/insights/anomalous-fields-dropdown.png rename to docs/assets/anomalies/deep-dive/insights/anomalous-fields-dropdown.png diff --git a/docs/assets/anomalies/details/insights/anomalous-fields-hide-all.png b/docs/assets/anomalies/deep-dive/insights/anomalous-fields-hide-all.png similarity index 100% rename from docs/assets/anomalies/details/insights/anomalous-fields-hide-all.png rename to docs/assets/anomalies/deep-dive/insights/anomalous-fields-hide-all.png diff --git a/docs/assets/anomalies/details/insights/anomalous-fields-show-all.png b/docs/assets/anomalies/deep-dive/insights/anomalous-fields-show-all.png similarity index 100% rename from docs/assets/anomalies/details/insights/anomalous-fields-show-all.png rename to docs/assets/anomalies/deep-dive/insights/anomalous-fields-show-all.png diff --git a/docs/assets/anomalies/details/insights/anomaly-details-view.png b/docs/assets/anomalies/deep-dive/insights/anomaly-details-view.png similarity index 100% rename from docs/assets/anomalies/details/insights/anomaly-details-view.png rename to docs/assets/anomalies/deep-dive/insights/anomaly-details-view.png diff --git a/docs/assets/anomalies/details/insights/anomaly-details.png b/docs/assets/anomalies/deep-dive/insights/anomaly-details.png similarity index 100% rename from docs/assets/anomalies/details/insights/anomaly-details.png rename to docs/assets/anomalies/deep-dive/insights/anomaly-details.png diff --git a/docs/assets/anomalies/details/insights/check.png b/docs/assets/anomalies/deep-dive/insights/check.png similarity index 100% rename from docs/assets/anomalies/details/insights/check.png rename to docs/assets/anomalies/deep-dive/insights/check.png diff --git a/docs/assets/anomalies/details/insights/comment.png b/docs/assets/anomalies/deep-dive/insights/comment.png similarity index 100% rename from docs/assets/anomalies/details/insights/comment.png rename to docs/assets/anomalies/deep-dive/insights/comment.png diff --git a/docs/assets/anomalies/details/insights/failed-checks-section.png b/docs/assets/anomalies/deep-dive/insights/failed-checks-section.png similarity index 100% rename from docs/assets/anomalies/details/insights/failed-checks-section.png rename to docs/assets/anomalies/deep-dive/insights/failed-checks-section.png diff --git a/docs/assets/anomalies/details/insights/history-comment-deleted.png b/docs/assets/anomalies/deep-dive/insights/history-comment-deleted.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-comment-deleted.png rename to docs/assets/anomalies/deep-dive/insights/history-comment-deleted.png diff --git a/docs/assets/anomalies/details/insights/history-comment-edit.png b/docs/assets/anomalies/deep-dive/insights/history-comment-edit.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-comment-edit.png rename to docs/assets/anomalies/deep-dive/insights/history-comment-edit.png diff --git a/docs/assets/anomalies/details/insights/history-comment-menu.png b/docs/assets/anomalies/deep-dive/insights/history-comment-menu.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-comment-menu.png rename to docs/assets/anomalies/deep-dive/insights/history-comment-menu.png diff --git a/docs/assets/anomalies/details/insights/history-comment-options.png b/docs/assets/anomalies/deep-dive/insights/history-comment-options.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-comment-options.png rename to docs/assets/anomalies/deep-dive/insights/history-comment-options.png diff --git a/docs/assets/anomalies/details/insights/history-comment-posted.png b/docs/assets/anomalies/deep-dive/insights/history-comment-posted.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-comment-posted.png rename to docs/assets/anomalies/deep-dive/insights/history-comment-posted.png diff --git a/docs/assets/anomalies/details/insights/history-comment-send.png b/docs/assets/anomalies/deep-dive/insights/history-comment-send.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-comment-send.png rename to docs/assets/anomalies/deep-dive/insights/history-comment-send.png diff --git a/docs/assets/anomalies/details/insights/history-section.png b/docs/assets/anomalies/deep-dive/insights/history-section.png similarity index 100% rename from docs/assets/anomalies/details/insights/history-section.png rename to docs/assets/anomalies/deep-dive/insights/history-section.png diff --git a/docs/assets/anomalies/details/insights/right-panel.png b/docs/assets/anomalies/deep-dive/insights/right-panel.png similarity index 100% rename from docs/assets/anomalies/details/insights/right-panel.png rename to docs/assets/anomalies/deep-dive/insights/right-panel.png diff --git a/docs/assets/anomalies/details/insights/summary-fields.png b/docs/assets/anomalies/deep-dive/insights/summary-fields.png similarity index 100% rename from docs/assets/anomalies/details/insights/summary-fields.png rename to docs/assets/anomalies/deep-dive/insights/summary-fields.png diff --git a/docs/assets/anomalies/details/insights/summary.png b/docs/assets/anomalies/deep-dive/insights/summary.png similarity index 100% rename from docs/assets/anomalies/details/insights/summary.png rename to docs/assets/anomalies/deep-dive/insights/summary.png diff --git a/docs/assets/anomalies/details/insights/tickets-add-button.png b/docs/assets/anomalies/deep-dive/insights/tickets-add-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-add-button.png rename to docs/assets/anomalies/deep-dive/insights/tickets-add-button.png diff --git a/docs/assets/anomalies/details/insights/tickets-create-form-jira.png b/docs/assets/anomalies/deep-dive/insights/tickets-create-form-jira.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-create-form-jira.png rename to docs/assets/anomalies/deep-dive/insights/tickets-create-form-jira.png diff --git a/docs/assets/anomalies/details/insights/tickets-create-form.png b/docs/assets/anomalies/deep-dive/insights/tickets-create-form.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-create-form.png rename to docs/assets/anomalies/deep-dive/insights/tickets-create-form.png diff --git a/docs/assets/anomalies/details/insights/tickets-create-new-button.png b/docs/assets/anomalies/deep-dive/insights/tickets-create-new-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-create-new-button.png rename to docs/assets/anomalies/deep-dive/insights/tickets-create-new-button.png diff --git a/docs/assets/anomalies/details/insights/tickets-link-search-modal.png b/docs/assets/anomalies/deep-dive/insights/tickets-link-search-modal.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-link-search-modal.png rename to docs/assets/anomalies/deep-dive/insights/tickets-link-search-modal.png diff --git a/docs/assets/anomalies/details/insights/tickets-linked-card.png b/docs/assets/anomalies/deep-dive/insights/tickets-linked-card.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-linked-card.png rename to docs/assets/anomalies/deep-dive/insights/tickets-linked-card.png diff --git a/docs/assets/anomalies/details/insights/tickets-section.png b/docs/assets/anomalies/deep-dive/insights/tickets-section.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-section.png rename to docs/assets/anomalies/deep-dive/insights/tickets-section.png diff --git a/docs/assets/anomalies/details/insights/tickets-unlink-button.png b/docs/assets/anomalies/deep-dive/insights/tickets-unlink-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-unlink-button.png rename to docs/assets/anomalies/deep-dive/insights/tickets-unlink-button.png diff --git a/docs/assets/anomalies/details/insights/tickets-view-button.png b/docs/assets/anomalies/deep-dive/insights/tickets-view-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/tickets-view-button.png rename to docs/assets/anomalies/deep-dive/insights/tickets-view-button.png diff --git a/docs/assets/anomalies/details/source-record/is-replica.png b/docs/assets/anomalies/deep-dive/source-record/comparison.png similarity index 100% rename from docs/assets/anomalies/details/source-record/is-replica.png rename to docs/assets/anomalies/deep-dive/source-record/comparison.png diff --git a/docs/assets/anomalies/details/insights/source-records-download.png b/docs/assets/anomalies/deep-dive/source-record/download.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-download.png rename to docs/assets/anomalies/deep-dive/source-record/download.png diff --git a/docs/assets/anomalies/details/insights/source-records-fields-button.png b/docs/assets/anomalies/deep-dive/source-record/fields-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-fields-button.png rename to docs/assets/anomalies/deep-dive/source-record/fields-button.png diff --git a/docs/assets/anomalies/details/insights/source-records-fields-dropdown.png b/docs/assets/anomalies/deep-dive/source-record/fields-dropdown.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-fields-dropdown.png rename to docs/assets/anomalies/deep-dive/source-record/fields-dropdown.png diff --git a/docs/assets/anomalies/details/insights/source-records-fields-hide-all.png b/docs/assets/anomalies/deep-dive/source-record/fields-hide-all.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-fields-hide-all.png rename to docs/assets/anomalies/deep-dive/source-record/fields-hide-all.png diff --git a/docs/assets/anomalies/details/insights/source-records-fields-only-anomalous.png b/docs/assets/anomalies/deep-dive/source-record/fields-only-anomalous.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-fields-only-anomalous.png rename to docs/assets/anomalies/deep-dive/source-record/fields-only-anomalous.png diff --git a/docs/assets/anomalies/details/insights/source-records-fields-show-all-unchecked.png b/docs/assets/anomalies/deep-dive/source-record/fields-show-all-unchecked.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-fields-show-all-unchecked.png rename to docs/assets/anomalies/deep-dive/source-record/fields-show-all-unchecked.png diff --git a/docs/assets/anomalies/details/insights/source-records-fields-show-all.png b/docs/assets/anomalies/deep-dive/source-record/fields-show-all.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-fields-show-all.png rename to docs/assets/anomalies/deep-dive/source-record/fields-show-all.png diff --git a/docs/assets/anomalies/details/insights/source-records-refresh.png b/docs/assets/anomalies/deep-dive/source-record/force-refresh.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-refresh.png rename to docs/assets/anomalies/deep-dive/source-record/force-refresh.png diff --git a/docs/assets/anomalies/details/source-record/masked-fields-audit-log-button.png b/docs/assets/anomalies/deep-dive/source-record/masked-fields-audit-log-button.png similarity index 100% rename from docs/assets/anomalies/details/source-record/masked-fields-audit-log-button.png rename to docs/assets/anomalies/deep-dive/source-record/masked-fields-audit-log-button.png diff --git a/docs/assets/anomalies/details/source-record/masked-fields-audit-log.png b/docs/assets/anomalies/deep-dive/source-record/masked-fields-audit-log.png similarity index 100% rename from docs/assets/anomalies/details/source-record/masked-fields-audit-log.png rename to docs/assets/anomalies/deep-dive/source-record/masked-fields-audit-log.png diff --git a/docs/assets/anomalies/details/source-record/masked-fields-reveal-confirmation.png b/docs/assets/anomalies/deep-dive/source-record/masked-fields-reveal-confirmation.png similarity index 100% rename from docs/assets/anomalies/details/source-record/masked-fields-reveal-confirmation.png rename to docs/assets/anomalies/deep-dive/source-record/masked-fields-reveal-confirmation.png diff --git a/docs/assets/anomalies/details/source-record/masked-fields-toggle.png b/docs/assets/anomalies/deep-dive/source-record/masked-fields-toggle.png similarity index 100% rename from docs/assets/anomalies/details/source-record/masked-fields-toggle.png rename to docs/assets/anomalies/deep-dive/source-record/masked-fields-toggle.png diff --git a/docs/assets/anomalies/details/source-record/record.png b/docs/assets/anomalies/deep-dive/source-record/record-anomaly-highlight.png similarity index 100% rename from docs/assets/anomalies/details/source-record/record.png rename to docs/assets/anomalies/deep-dive/source-record/record-anomaly-highlight.png diff --git a/docs/assets/anomalies/details/source-record/source-record.png b/docs/assets/anomalies/deep-dive/source-record/shape-anomaly-highlight.png similarity index 100% rename from docs/assets/anomalies/details/source-record/source-record.png rename to docs/assets/anomalies/deep-dive/source-record/shape-anomaly-highlight.png diff --git a/docs/assets/anomalies/details/insights/source-records-sort-by-options.png b/docs/assets/anomalies/deep-dive/source-record/sort-by-options.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-sort-by-options.png rename to docs/assets/anomalies/deep-dive/source-record/sort-by-options.png diff --git a/docs/assets/anomalies/details/insights/source-records-sort-by.png b/docs/assets/anomalies/deep-dive/source-record/sort-by.png similarity index 100% rename from docs/assets/anomalies/details/insights/source-records-sort-by.png rename to docs/assets/anomalies/deep-dive/source-record/sort-by.png diff --git a/docs/assets/anomalies/details/source-record/visualization.png b/docs/assets/anomalies/deep-dive/source-record/visualization.png similarity index 100% rename from docs/assets/anomalies/details/source-record/visualization.png rename to docs/assets/anomalies/deep-dive/source-record/visualization.png diff --git a/docs/assets/anomalies/details/insights/source-records.png b/docs/assets/anomalies/details/insights/source-records.png deleted file mode 100644 index 5d7c253dab..0000000000 Binary files a/docs/assets/anomalies/details/insights/source-records.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-anomalies.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-anomalies.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-anomalies.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-anomalies.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-bulk.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-bulk.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-bulk.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-bulk.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-button.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-button.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-button.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-button.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-directly.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-directly.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-directly.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-directly.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-option.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-option.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/acknowledge-option.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/acknowledge-option.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/action-toolbar.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/action-toolbar.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/action-toolbar.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/action-toolbar.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/anomalies.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/anomalies.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/anomalies.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/anomalies.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/datastore-1.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/datastore-1.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/datastore-1.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/datastore-1.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/vertical-acknowledge-1.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/vertical-acknowledge-1.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/vertical-acknowledge-1.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/vertical-acknowledge-1.png diff --git a/docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/vertical-acknowledge.png b/docs/assets/anomalies/how-tos/acknowledge-anomalies/vertical-acknowledge.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/acknowledge-anomalies/vertical-acknowledge.png rename to docs/assets/anomalies/how-tos/acknowledge-anomalies/vertical-acknowledge.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-action.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-action.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-action.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-action.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-anomaly-options.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-anomaly-options.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-anomaly-options.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-anomaly-options.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk-options.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-bulk-options.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk-options.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-bulk-options.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk-vertical.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-bulk-vertical.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk-vertical.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-bulk-vertical.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-bulk.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-bulk.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-bulk.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-button-3.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-button-3.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-button-3.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-button-3.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-button.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-button.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-button.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-button.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-option-bulk.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-option-bulk.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-option-bulk.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-option-bulk.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-option.png b/docs/assets/anomalies/how-tos/archive-anomalies/archive-option.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/archive-option.png rename to docs/assets/anomalies/how-tos/archive-anomalies/archive-option.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/comment-1.png b/docs/assets/anomalies/how-tos/archive-anomalies/comment-1.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/comment-1.png rename to docs/assets/anomalies/how-tos/archive-anomalies/comment-1.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/comment-3.png b/docs/assets/anomalies/how-tos/archive-anomalies/comment-3.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/comment-3.png rename to docs/assets/anomalies/how-tos/archive-anomalies/comment-3.png diff --git a/docs/assets/anomalies/manage-anomalies/archive-anomalies/vertical-archive.png b/docs/assets/anomalies/how-tos/archive-anomalies/vertical-archive.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/archive-anomalies/vertical-archive.png rename to docs/assets/anomalies/how-tos/archive-anomalies/vertical-archive.png diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-1-assignee-field.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-1-assignee-field.png new file mode 100644 index 0000000000..e858147004 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-1-assignee-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-2-edit-button.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-2-edit-button.png new file mode 100644 index 0000000000..40b076ab2a Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-3-users-list.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-3-users-list.png new file mode 100644 index 0000000000..dee7905eb7 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-3-users-list.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-4-select-user.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-4-select-user.png new file mode 100644 index 0000000000..19e1032506 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-4-select-user.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-5-user-marked.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-5-user-marked.png new file mode 100644 index 0000000000..ea1c8d0a47 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-5-user-marked.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-6-updated-field.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-6-updated-field.png new file mode 100644 index 0000000000..48377a95ee Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/explore-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-1-assignee-field.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-1-assignee-field.png new file mode 100644 index 0000000000..acdc9f370c Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-1-assignee-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-2-edit-button.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-2-edit-button.png new file mode 100644 index 0000000000..8212e84083 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-3-users-list.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-3-users-list.png new file mode 100644 index 0000000000..87169fbc45 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-3-users-list.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-4-select-user.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-4-select-user.png new file mode 100644 index 0000000000..79dc6f2977 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-4-select-user.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-5-user-marked.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-5-user-marked.png new file mode 100644 index 0000000000..9882ff2f9f Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-5-user-marked.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-6-updated-field.png b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-6-updated-field.png new file mode 100644 index 0000000000..e48cf498b2 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/add-assignee/overview-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-10-select-user.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-10-select-user.png new file mode 100644 index 0000000000..e44268e08c Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-10-select-user.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-11-save-button.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-11-save-button.png new file mode 100644 index 0000000000..495f6dfae5 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-11-save-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-7-toggle-assignees.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-7-toggle-assignees.png new file mode 100644 index 0000000000..3b62d98cee Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-7-toggle-assignees.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-8-click-field.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-8-click-field.png new file mode 100644 index 0000000000..a50e705cef Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-8-click-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-9-users-list.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-9-users-list.png new file mode 100644 index 0000000000..3f5e463b00 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/check-template-step-9-users-list.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-10-select-user.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-10-select-user.png new file mode 100644 index 0000000000..aea99cc874 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-10-select-user.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-11-save-button.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-11-save-button.png new file mode 100644 index 0000000000..542f11d0e3 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-11-save-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-7-toggle-assignees.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-7-toggle-assignees.png new file mode 100644 index 0000000000..39b450dc1c Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-7-toggle-assignees.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-8-click-field.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-8-click-field.png new file mode 100644 index 0000000000..eeb7e1f6bd Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-8-click-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-9-users-list.png b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-9-users-list.png new file mode 100644 index 0000000000..f926a11b84 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/bulk-assign/datastore-step-9-users-list.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-1-assignee-field.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-1-assignee-field.png new file mode 100644 index 0000000000..e2823a4a96 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-1-assignee-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-2-edit-button.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-2-edit-button.png new file mode 100644 index 0000000000..7edce25daf Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-3-users-list.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-3-users-list.png new file mode 100644 index 0000000000..526a53829a Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-3-users-list.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-4-remove-button.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-4-remove-button.png new file mode 100644 index 0000000000..4dda62698f Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-4-remove-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-5-user-unmarked.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-5-user-unmarked.png new file mode 100644 index 0000000000..992ce57fc7 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-5-user-unmarked.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-6-updated-field.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-6-updated-field.png new file mode 100644 index 0000000000..87504de9e0 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/explore-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-1-assignee-field.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-1-assignee-field.png new file mode 100644 index 0000000000..9d1d61f956 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-1-assignee-field.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-2-edit-button.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-2-edit-button.png new file mode 100644 index 0000000000..bbb21a0a34 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-3-users-list.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-3-users-list.png new file mode 100644 index 0000000000..0370476b72 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-3-users-list.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-4-remove-button.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-4-remove-button.png new file mode 100644 index 0000000000..4682a5d09a Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-4-remove-button.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-5-user-unmarked.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-5-user-unmarked.png new file mode 100644 index 0000000000..a740ae358a Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-5-user-unmarked.png differ diff --git a/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-6-updated-field.png b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-6-updated-field.png new file mode 100644 index 0000000000..0ddd44ea95 Binary files /dev/null and b/docs/assets/anomalies/how-tos/assignee/remove-assignee/overview-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/archive-anomaly.png b/docs/assets/anomalies/how-tos/delete-anomalies/archive-anomaly.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/archive-anomaly.png rename to docs/assets/anomalies/how-tos/delete-anomalies/archive-anomaly.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/bulk-delete-options.png b/docs/assets/anomalies/how-tos/delete-anomalies/bulk-delete-options.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/bulk-delete-options.png rename to docs/assets/anomalies/how-tos/delete-anomalies/bulk-delete-options.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/bulk-delete.png b/docs/assets/anomalies/how-tos/delete-anomalies/bulk-delete.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/bulk-delete.png rename to docs/assets/anomalies/how-tos/delete-anomalies/bulk-delete.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-anomaly-1.png b/docs/assets/anomalies/how-tos/delete-anomalies/delete-anomaly-1.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-anomaly-1.png rename to docs/assets/anomalies/how-tos/delete-anomalies/delete-anomaly-1.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-anomaly.png b/docs/assets/anomalies/how-tos/delete-anomalies/delete-anomaly.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-anomaly.png rename to docs/assets/anomalies/how-tos/delete-anomalies/delete-anomaly.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-bulk.png b/docs/assets/anomalies/how-tos/delete-anomalies/delete-bulk.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-bulk.png rename to docs/assets/anomalies/how-tos/delete-anomalies/delete-bulk.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-button-1.png b/docs/assets/anomalies/how-tos/delete-anomalies/delete-button-1.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-button-1.png rename to docs/assets/anomalies/how-tos/delete-anomalies/delete-button-1.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-button-3.png b/docs/assets/anomalies/how-tos/delete-anomalies/delete-button-3.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/delete-button-3.png rename to docs/assets/anomalies/how-tos/delete-anomalies/delete-button-3.png diff --git a/docs/assets/anomalies/manage-anomalies/delete-anomalies/vertical-delete.png b/docs/assets/anomalies/how-tos/delete-anomalies/vertical-delete.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/delete-anomalies/vertical-delete.png rename to docs/assets/anomalies/how-tos/delete-anomalies/vertical-delete.png diff --git a/docs/assets/anomalies/details/insights/description-edit-button.png b/docs/assets/anomalies/how-tos/edit-description/description-edit-button.png similarity index 100% rename from docs/assets/anomalies/details/insights/description-edit-button.png rename to docs/assets/anomalies/how-tos/edit-description/description-edit-button.png diff --git a/docs/assets/anomalies/details/insights/description-edit-mode.png b/docs/assets/anomalies/how-tos/edit-description/description-edit-mode.png similarity index 100% rename from docs/assets/anomalies/details/insights/description-edit-mode.png rename to docs/assets/anomalies/how-tos/edit-description/description-edit-mode.png diff --git a/docs/assets/anomalies/details/insights/description-save.png b/docs/assets/anomalies/how-tos/edit-description/description-save.png similarity index 100% rename from docs/assets/anomalies/details/insights/description-save.png rename to docs/assets/anomalies/how-tos/edit-description/description-save.png diff --git a/docs/assets/anomalies/details/insights/description.png b/docs/assets/anomalies/how-tos/edit-description/description.png similarity index 100% rename from docs/assets/anomalies/details/insights/description.png rename to docs/assets/anomalies/how-tos/edit-description/description.png diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/check-template-filter.png b/docs/assets/anomalies/how-tos/filter-and-sort/check-template-filter.png new file mode 100644 index 0000000000..7eb83b46a1 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/check-template-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/check-template-sort.png b/docs/assets/anomalies/how-tos/filter-and-sort/check-template-sort.png new file mode 100644 index 0000000000..77f739f4dc Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/check-template-sort.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/container-filter.png b/docs/assets/anomalies/how-tos/filter-and-sort/container-filter.png new file mode 100644 index 0000000000..939b85cf5f Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/container-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/container-sort.png b/docs/assets/anomalies/how-tos/filter-and-sort/container-sort.png new file mode 100644 index 0000000000..3cf11e031e Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/container-sort.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/datastore-filter.png b/docs/assets/anomalies/how-tos/filter-and-sort/datastore-filter.png new file mode 100644 index 0000000000..593df545e1 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/datastore-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/datastore-sort.png b/docs/assets/anomalies/how-tos/filter-and-sort/datastore-sort.png new file mode 100644 index 0000000000..73ec58ebdc Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/datastore-sort.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/explore-filter.png b/docs/assets/anomalies/how-tos/filter-and-sort/explore-filter.png new file mode 100644 index 0000000000..d7814a1d5a Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/explore-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-and-sort/explore-sort.png b/docs/assets/anomalies/how-tos/filter-and-sort/explore-sort.png new file mode 100644 index 0000000000..730d09bb0d Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-and-sort/explore-sort.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/check-template-archived-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/check-template-archived-step-1-click-filter.png new file mode 100644 index 0000000000..c69702ab08 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/check-template-archived-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/check-template-archived-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/check-template-archived-step-2-view-statuses.png new file mode 100644 index 0000000000..f6130c7a14 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/check-template-archived-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/check-template-open-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/check-template-open-step-1-click-filter.png new file mode 100644 index 0000000000..3db8412943 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/check-template-open-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/check-template-open-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/check-template-open-step-2-view-statuses.png new file mode 100644 index 0000000000..ebe11f194f Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/check-template-open-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/container-archived-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/container-archived-step-1-click-filter.png new file mode 100644 index 0000000000..d16a7729ae Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/container-archived-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/container-archived-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/container-archived-step-2-view-statuses.png new file mode 100644 index 0000000000..36e530aca3 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/container-archived-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/container-open-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/container-open-step-1-click-filter.png new file mode 100644 index 0000000000..12805e58ab Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/container-open-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/container-open-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/container-open-step-2-view-statuses.png new file mode 100644 index 0000000000..a7e66047cd Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/container-open-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/datastore-archived-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/datastore-archived-step-1-click-filter.png new file mode 100644 index 0000000000..a916199847 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/datastore-archived-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/datastore-archived-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/datastore-archived-step-2-view-statuses.png new file mode 100644 index 0000000000..658aead799 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/datastore-archived-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/datastore-open-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/datastore-open-step-1-click-filter.png new file mode 100644 index 0000000000..95e225284a Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/datastore-open-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/datastore-open-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/datastore-open-step-2-view-statuses.png new file mode 100644 index 0000000000..2bc55ec58c Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/datastore-open-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/explore-archived-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/explore-archived-step-1-click-filter.png new file mode 100644 index 0000000000..5d4b298365 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/explore-archived-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/explore-archived-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/explore-archived-step-2-view-statuses.png new file mode 100644 index 0000000000..bce6ae1864 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/explore-archived-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/explore-open-step-1-click-filter.png b/docs/assets/anomalies/how-tos/filter-by-status/explore-open-step-1-click-filter.png new file mode 100644 index 0000000000..0ae6224624 Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/explore-open-step-1-click-filter.png differ diff --git a/docs/assets/anomalies/how-tos/filter-by-status/explore-open-step-2-view-statuses.png b/docs/assets/anomalies/how-tos/filter-by-status/explore-open-step-2-view-statuses.png new file mode 100644 index 0000000000..ecbca702fc Binary files /dev/null and b/docs/assets/anomalies/how-tos/filter-by-status/explore-open-step-2-view-statuses.png differ diff --git a/docs/assets/anomalies/manage-anomalies/restore-anomalies/restore-anomaly.png b/docs/assets/anomalies/how-tos/restore-anomalies/restore-anomaly.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/restore-anomalies/restore-anomaly.png rename to docs/assets/anomalies/how-tos/restore-anomalies/restore-anomaly.png diff --git a/docs/assets/anomalies/manage-anomalies/restore-anomalies/restore-option.png b/docs/assets/anomalies/how-tos/restore-anomalies/restore-option.png similarity index 100% rename from docs/assets/anomalies/manage-anomalies/restore-anomalies/restore-option.png rename to docs/assets/anomalies/how-tos/restore-anomalies/restore-option.png diff --git a/docs/assets/anomalies/how-tos/shared/check-template-step-1-anomalies-list.png b/docs/assets/anomalies/how-tos/shared/check-template-step-1-anomalies-list.png new file mode 100644 index 0000000000..6beb769d47 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/check-template-step-1-anomalies-list.png differ diff --git a/docs/assets/anomalies/how-tos/shared/check-template-step-2-select-anomalies.png b/docs/assets/anomalies/how-tos/shared/check-template-step-2-select-anomalies.png new file mode 100644 index 0000000000..122aea64e0 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/check-template-step-2-select-anomalies.png differ diff --git a/docs/assets/anomalies/how-tos/shared/check-template-step-3-click-ellipsis.png b/docs/assets/anomalies/how-tos/shared/check-template-step-3-click-ellipsis.png new file mode 100644 index 0000000000..6aeb4998c8 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/check-template-step-3-click-ellipsis.png differ diff --git a/docs/assets/anomalies/how-tos/shared/check-template-step-4-menu-options.png b/docs/assets/anomalies/how-tos/shared/check-template-step-4-menu-options.png new file mode 100644 index 0000000000..462aa24a0c Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/check-template-step-4-menu-options.png differ diff --git a/docs/assets/anomalies/how-tos/shared/check-template-step-5-click-edit.png b/docs/assets/anomalies/how-tos/shared/check-template-step-5-click-edit.png new file mode 100644 index 0000000000..ace4726e11 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/check-template-step-5-click-edit.png differ diff --git a/docs/assets/anomalies/how-tos/shared/check-template-step-6-modal-opens.png b/docs/assets/anomalies/how-tos/shared/check-template-step-6-modal-opens.png new file mode 100644 index 0000000000..0718d5766b Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/check-template-step-6-modal-opens.png differ diff --git a/docs/assets/anomalies/how-tos/shared/datastore-step-1-anomalies-list.png b/docs/assets/anomalies/how-tos/shared/datastore-step-1-anomalies-list.png new file mode 100644 index 0000000000..fa5c4be050 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/datastore-step-1-anomalies-list.png differ diff --git a/docs/assets/anomalies/how-tos/shared/datastore-step-2-select-anomalies.png b/docs/assets/anomalies/how-tos/shared/datastore-step-2-select-anomalies.png new file mode 100644 index 0000000000..f0d449d8f8 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/datastore-step-2-select-anomalies.png differ diff --git a/docs/assets/anomalies/how-tos/shared/datastore-step-3-click-ellipsis.png b/docs/assets/anomalies/how-tos/shared/datastore-step-3-click-ellipsis.png new file mode 100644 index 0000000000..0b8d4b8c29 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/datastore-step-3-click-ellipsis.png differ diff --git a/docs/assets/anomalies/how-tos/shared/datastore-step-4-menu-options.png b/docs/assets/anomalies/how-tos/shared/datastore-step-4-menu-options.png new file mode 100644 index 0000000000..462aa24a0c Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/datastore-step-4-menu-options.png differ diff --git a/docs/assets/anomalies/how-tos/shared/datastore-step-5-click-edit.png b/docs/assets/anomalies/how-tos/shared/datastore-step-5-click-edit.png new file mode 100644 index 0000000000..70108704c8 Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/datastore-step-5-click-edit.png differ diff --git a/docs/assets/anomalies/how-tos/shared/datastore-step-6-modal-opens.png b/docs/assets/anomalies/how-tos/shared/datastore-step-6-modal-opens.png new file mode 100644 index 0000000000..260eea7d3d Binary files /dev/null and b/docs/assets/anomalies/how-tos/shared/datastore-step-6-modal-opens.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-1-tags-field.png b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-1-tags-field.png new file mode 100644 index 0000000000..2b4a073ba2 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-1-tags-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-2-edit-button.png b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-2-edit-button.png new file mode 100644 index 0000000000..dbe744e71d Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-3-tag-picker.png b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-3-tag-picker.png new file mode 100644 index 0000000000..6c147d776d Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-3-tag-picker.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-4-select-tag.png b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-4-select-tag.png new file mode 100644 index 0000000000..96ece256bc Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-4-select-tag.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-5-tag-marked.png b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-5-tag-marked.png new file mode 100644 index 0000000000..7795ec2694 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-5-tag-marked.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-6-updated-field.png b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-6-updated-field.png new file mode 100644 index 0000000000..337bdc3996 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/explore-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-1-tags-field.png b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-1-tags-field.png new file mode 100644 index 0000000000..07045ccdd3 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-1-tags-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-2-edit-button.png b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-2-edit-button.png new file mode 100644 index 0000000000..5bf01abc07 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-3-tag-picker.png b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-3-tag-picker.png new file mode 100644 index 0000000000..c72a97bf80 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-3-tag-picker.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-4-select-tag.png b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-4-select-tag.png new file mode 100644 index 0000000000..7d5731fee8 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-4-select-tag.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-5-tag-marked.png b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-5-tag-marked.png new file mode 100644 index 0000000000..b0ee48f1ae Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-5-tag-marked.png differ diff --git a/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-6-updated-field.png b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-6-updated-field.png new file mode 100644 index 0000000000..ccd84d662a Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/add-tags/overview-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-10-select-tag.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-10-select-tag.png new file mode 100644 index 0000000000..480eb60597 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-10-select-tag.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-11-save-button.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-11-save-button.png new file mode 100644 index 0000000000..b29d0f581b Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-11-save-button.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-7-toggle-tags.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-7-toggle-tags.png new file mode 100644 index 0000000000..fb525b0b4a Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-7-toggle-tags.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-8-click-field.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-8-click-field.png new file mode 100644 index 0000000000..7d1626a50b Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-8-click-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-9-tags-list.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-9-tags-list.png new file mode 100644 index 0000000000..ddeba875ad Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/check-template-step-9-tags-list.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-10-select-tag.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-10-select-tag.png new file mode 100644 index 0000000000..d7a17ecb11 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-10-select-tag.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-11-save-button.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-11-save-button.png new file mode 100644 index 0000000000..c7a64645c9 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-11-save-button.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-7-toggle-tags.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-7-toggle-tags.png new file mode 100644 index 0000000000..7629ab4ff6 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-7-toggle-tags.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-8-click-field.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-8-click-field.png new file mode 100644 index 0000000000..4850a7da72 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-8-click-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-9-tags-list.png b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-9-tags-list.png new file mode 100644 index 0000000000..ff5672ba3f Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/bulk-edit/datastore-step-9-tags-list.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-1-tags-field.png b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-1-tags-field.png new file mode 100644 index 0000000000..729b1e63c8 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-1-tags-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-2-edit-button.png b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-2-edit-button.png new file mode 100644 index 0000000000..2061baad22 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-3-tag-picker.png b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-3-tag-picker.png new file mode 100644 index 0000000000..36b1d8faba Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-3-tag-picker.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-4-remove-tag.png b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-4-remove-tag.png new file mode 100644 index 0000000000..1a82b4dd87 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-4-remove-tag.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-5-tag-unmarked.png b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-5-tag-unmarked.png new file mode 100644 index 0000000000..a7ec8ae80f Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-5-tag-unmarked.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-6-updated-field.png b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-6-updated-field.png new file mode 100644 index 0000000000..48cfe0f104 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/explore-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-1-tags-field.png b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-1-tags-field.png new file mode 100644 index 0000000000..59444dd0af Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-1-tags-field.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-2-edit-button.png b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-2-edit-button.png new file mode 100644 index 0000000000..f8364dd678 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-2-edit-button.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-3-tag-picker.png b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-3-tag-picker.png new file mode 100644 index 0000000000..6d2e1d77d4 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-3-tag-picker.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-4-remove-tag.png b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-4-remove-tag.png new file mode 100644 index 0000000000..40315d0960 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-4-remove-tag.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-5-tag-unmarked.png b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-5-tag-unmarked.png new file mode 100644 index 0000000000..ea47b43d36 Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-5-tag-unmarked.png differ diff --git a/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-6-updated-field.png b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-6-updated-field.png new file mode 100644 index 0000000000..049914d46a Binary files /dev/null and b/docs/assets/anomalies/how-tos/tags/remove-tags/overview-step-6-updated-field.png differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-anomaly.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-anomaly.png deleted file mode 100644 index 2cbea7cfc3..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-anomaly.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-bulk.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-bulk.png deleted file mode 100644 index ff5e96453c..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-bulk.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-modal.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-modal.png deleted file mode 100644 index bd04948ccc..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/edit-modal.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/hover-edit.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/hover-edit.png deleted file mode 100644 index 15be2b2b09..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/hover-edit.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/save-button.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/save-button.png deleted file mode 100644 index c8ff33627a..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/save-button.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit-options.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit-options.png deleted file mode 100644 index bcf28926d1..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit-options.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit.png b/docs/assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit.png deleted file mode 100644 index 2328154148..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/edit-anomalies/vertical-edit.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/filter-and-sort/filter-1.png b/docs/assets/anomalies/manage-anomalies/filter-and-sort/filter-1.png deleted file mode 100644 index 7a408eb067..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/filter-and-sort/filter-1.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/filter-and-sort/filter-2.png b/docs/assets/anomalies/manage-anomalies/filter-and-sort/filter-2.png deleted file mode 100644 index 44739484b2..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/filter-and-sort/filter-2.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/filter-and-sort/fuzzy-anomalies.png b/docs/assets/anomalies/manage-anomalies/filter-and-sort/fuzzy-anomalies.png deleted file mode 100644 index 83302a11d3..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/filter-and-sort/fuzzy-anomalies.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/filter-and-sort/sort-options.png b/docs/assets/anomalies/manage-anomalies/filter-and-sort/sort-options.png deleted file mode 100644 index 1378465602..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/filter-and-sort/sort-options.png and /dev/null differ diff --git a/docs/assets/anomalies/manage-anomalies/filter-and-sort/sort-order.png b/docs/assets/anomalies/manage-anomalies/filter-and-sort/sort-order.png deleted file mode 100644 index 7e6f9d0de1..0000000000 Binary files a/docs/assets/anomalies/manage-anomalies/filter-and-sort/sort-order.png and /dev/null differ diff --git a/docs/assets/anomalies/status/archive-anomalies.png b/docs/assets/anomalies/status/archive-anomalies.png deleted file mode 100644 index 20dc6aee52..0000000000 Binary files a/docs/assets/anomalies/status/archive-anomalies.png and /dev/null differ diff --git a/docs/assets/anomalies/status/open-anomalies.png b/docs/assets/anomalies/status/open-anomalies.png deleted file mode 100644 index ae2c2ba385..0000000000 Binary files a/docs/assets/anomalies/status/open-anomalies.png and /dev/null differ diff --git a/docs/assets/explore/anomalies/assign-light.png b/docs/assets/explore/anomalies/assign-light.png deleted file mode 100644 index ed01434b79..0000000000 Binary files a/docs/assets/explore/anomalies/assign-light.png and /dev/null differ diff --git a/docs/assets/explore/anomalies/tag-light.png b/docs/assets/explore/anomalies/tag-light.png deleted file mode 100644 index 41d147d8ba..0000000000 Binary files a/docs/assets/explore/anomalies/tag-light.png and /dev/null differ diff --git a/docs/data-quality-checks/data-diff-check.md b/docs/data-quality-checks/data-diff-check.md index d063ec9d13..fe31074b78 100644 --- a/docs/data-quality-checks/data-diff-check.md +++ b/docs/data-quality-checks/data-diff-check.md @@ -294,7 +294,7 @@ Specify the datastore and table/file where the reference data for the targeted f !!! info Anomalies produced by a `DataDiff` quality check making use of `Row Identifiers` have their source records presented in a different visualization.

- See more at: *[Comparison Source Records](../anomalies/details/source-record.md/#comparison-source-records)* + See more at: *[Comparison Source Records](../anomalies/deep-dive/source-record.md/#comparison-source-records)* {% include-markdown "components/comparators/index.md" diff --git a/docs/data-quality-checks/is-replica-of-check.md b/docs/data-quality-checks/is-replica-of-check.md index 3853283ebf..792ef9340a 100644 --- a/docs/data-quality-checks/is-replica-of-check.md +++ b/docs/data-quality-checks/is-replica-of-check.md @@ -72,7 +72,7 @@ Specify the datastore and table/file where the replica of the targeted fields is !!! info Anomalies produced by a `IsReplicaOf` quality check making use of `Row Identifiers` have their source records presented in a different visualization.

- See more at: *[Comparison Source Records](../anomalies/details/source-record.md/#comparison-source-records)* + See more at: *[Comparison Source Records](../anomalies/deep-dive/source-record.md/#comparison-source-records)* {% include-markdown "components/comparators/index.md" %} diff --git a/docs/explore/anomalies.md b/docs/explore/anomalies.md index 2e93002b2d..8da6393bf2 100644 --- a/docs/explore/anomalies.md +++ b/docs/explore/anomalies.md @@ -28,7 +28,7 @@ By selecting **Open Anomalies**, you can view anomalies that have been detected ![open](../assets/explore/anomalies/open-light.png) -This option helps focus on unaddressed issues while allowing seamless navigation to **All**, **Active**, or **Acknowledged** anomalies as needed. +This option helps focus on unaddressed issues while allowing seamless navigation to **Active**, **Acknowledged**, **Assigned**, or **All** anomalies as needed. **1. Active**: By selecting **Active Anomalies**, you can focus on anomalies that are currently unresolved or require immediate attention. These are the anomalies that are still in play and have not yet been acknowledged, archived, or resolved. @@ -38,7 +38,15 @@ This option helps focus on unaddressed issues while allowing seamless navigation ![acknowledge](../assets/explore/anomalies/acknowledge-light.png) -**3. All**: By selecting **All Anomalies**, you can view the complete list of anomalies, regardless of their status. This option helps you get a comprehensive overview of all issues that have been detected, whether they are currently active, acknowledged, or archived. +**3. Assigned**: By selecting **Assigned**, you can view only the open anomalies where you are listed as an assignee. This subtab is a quick way to surface the work that is on you without manually filtering by your user in the Assignees filter. The list respects whatever sort and additional filters you have applied, so you can combine it with a tag filter, for example, to focus on the high-priority anomalies that are yours to handle. + + + +!!! note + The **Assigned** subtab is empty until someone (you, a teammate, or a default assignee inherited from a quality check) adds your user to an anomaly. See [Deep Dive · Anomaly Assignees](../anomalies/deep-dive/assignees.md){:target="_blank"} for how anomalies pick up assignees. + +**4. All**: By selecting **All Anomalies**, you can view the complete list of anomalies, regardless of their status. This option helps you get a comprehensive overview of all issues that have been detected, whether they are currently active, acknowledged, or archived. ![all](../assets/explore/anomalies/all-light.png) @@ -82,7 +90,7 @@ A modal window titled **“Anomaly Details”** will appear, displaying all the ![modal](../assets/explore/anomalies/modal-light.png) -For more details on Anomaly Details, please refer to the [**Anomaly Insights**](../anomalies/details/insights.md) section in the documentation. +For more details on Anomaly Details, please refer to the [**Anomaly Insights**](../anomalies/deep-dive/insights.md) section in the documentation. ## Acknowledged Anomalies @@ -151,18 +159,6 @@ By restoring archived anomalies, you can bring them back into the **acknowledged ![button](../assets/explore/anomalies/restored-light.png) -## Assign Tags - -Assigning tags to an anomaly serves the purpose of labeling and grouping anomalies and driving downstream workflows. - -**Step 1:** Click on the **Assign tags to this Anomaly** or **+** button. - -![tag](../assets/explore/anomalies/assign-light.png) - -**Step 2:** A dropdown menu will appear with existing tags. Scroll through the list and click on the tag you wish to assign. - -![scroll](../assets/explore/anomalies/tag-light.png) - ## Delete Anomalies Deleting an anomaly allows you to permanently remove a record that is no longer relevant or was logged in error. This action is done individually, ensuring that your anomaly records remain clean and up to date. @@ -212,7 +208,7 @@ Whatever sorting option is selected, you can arrange the data either in ascendin ### Filter -You can filter your anomalies based on values like **Source Datastores, Timeframe**, **Type**, **Rule**, and **Tags**. +You can filter your anomalies based on values like **Source Datastores, Timeframe**, **Type**, **Rule**, **Tags**, and **Assignees**. ![filter](../assets/explore/anomalies/filter-1-light.png) @@ -230,4 +226,5 @@ You can filter your anomalies based on values like **Source Datastores, Timefram | **2** | **Select Tags** | Filter anomalies by specific tags to categorize and prioritize issues effectively. | | **3** | **Timeframe** | Filtering anomalies detected within specific time ranges (e.g., anomalies detected in the last week or year). | | **4** | **Type** | Filter anomalies based on anomaly type (Record or Shape). | -| **5** | **Rule** | Filter anomalies based on specific rules applied to the anomaly. By clicking on the caret down button next to the Rule field, the available rule types will be dynamically populated based on the rule types present in the results. The rules displayed are based on the current dataset and provide more granular control over filtering.

Each rule type will show a counter next to it, displaying the total number of occurrences for that rule in the dataset.

For example, the rule type **After Date Time** is displayed with a total of **514** occurrences. | \ No newline at end of file +| **5** | **Rule** | Filter anomalies based on specific rules applied to the anomaly. By clicking on the caret down button next to the Rule field, the available rule types will be dynamically populated based on the rule types present in the results. The rules displayed are based on the current dataset and provide more granular control over filtering.

Each rule type will show a counter next to it, displaying the total number of occurrences for that rule in the dataset.

For example, the rule type **After Date Time** is displayed with a total of **514** occurrences. | +| **6** | **Assignees** | Filter anomalies by the users they are assigned to. The dropdown lists active platform users; selecting one or more users narrows the list to anomalies where any of the selected users is an assignee. To quickly see only the open anomalies assigned to you, use the **Assigned** subtab inside **Open**, described in [Open](#open){:target="_blank"}. | \ No newline at end of file diff --git a/docs/operations/scan/scan.md b/docs/operations/scan/scan.md index 294427e165..5c57636d25 100644 --- a/docs/operations/scan/scan.md +++ b/docs/operations/scan/scan.md @@ -161,7 +161,7 @@ However, when scan results are displayed, masked field values are obfuscated in - **Anomaly Descriptions** — check failure messages permanently show `` in place of actual values; the original value is not stored - **Enrichment Datastore** — source record values written during a [Materialize operation](../../operations/materialize-operation/materialize-operation.md#field-masking-and-materialize) are obfuscated for masked fields -For more details, see [Masked Fields in Source Records](../../anomalies/details/source-record.md#masked-fields-in-source-records). +For more details, see [Masked Fields in Source Records](../../anomalies/deep-dive/source-record.md#masked-fields-in-source-records). ## Run Instantly diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index acec27b991..7814607179 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -1363,6 +1363,35 @@ button[aria-label*="Next"] svg, color: var(--q-primary) !important; } +/* Content material-icons inside tabs must inherit text color, not the + primary color used by the tab navigation arrows above. */ +.md-typeset .tabbed-set .twemoji svg, +.md-typeset .tabbed-block .twemoji svg { + fill: currentcolor !important; + color: inherit !important; +} + +/* Tab overflow navigation arrows (button.tabbed-button rendered by Material + when tabs overflow horizontally). The arrow shape is a :after + pseudo-element with mask-image filled by background-color. Force the + fill so the icon stays visible regardless of theme-mode color cascades. */ +.tabbed-button { + color: var(--q-primary) !important; +} + +.tabbed-button::after { + background-color: var(--q-primary) !important; +} + +.tabbed-button:hover { + color: var(--q-brick) !important; + background-color: transparent !important; +} + +.tabbed-button:hover::after { + background-color: var(--q-brick) !important; +} + .tabbed-control:hover, .tabbed-alternate button:hover, .tabbed-labels button:hover, @@ -1382,12 +1411,21 @@ button[aria-label*="Next"]:hover, button[aria-label*="Previous"]:hover svg, button[aria-label*="Next"]:hover svg, .md-typeset .tabbed-set button:hover svg, -.md-typeset .tabbed-alternate button:hover svg, -.md-typeset .tabbed-set:hover svg { +.md-typeset .tabbed-alternate button:hover svg { fill: var(--q-brick) !important; color: var(--q-brick) !important; } +/* Re-affirm content material-icons stay neutral on tab-set hover; the + broader hover rules above must not paint them brick when the user just + hovers anywhere inside the tabbed-set. */ +.md-typeset .tabbed-set:hover .twemoji svg, +.md-typeset .tabbed-block:hover .twemoji svg, +.md-typeset .tabbed-set .twemoji:hover svg { + fill: currentcolor !important; + color: inherit !important; +} + /* Feedback Buttons */ .md-feedback__icon { color: var(--q-primary) !important; diff --git a/mkdocs.yml b/mkdocs.yml index e54bcd4a70..3d814c3bac 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -394,20 +394,33 @@ nav: - Observability Filter: observability/observability-filter.md - Anomalies: - Overview: anomalies/overview.md - - Types: anomalies/types.md - Detection: anomalies/detection.md - - Details: - - Insights: anomalies/details/insights.md - - Source Record: anomalies/details/source-record.md - - Status: anomalies/status.md - - Fingerprints: anomalies/fingerprints.md - - Manage Anomalies: - - Acknowledge Anomalies: anomalies/manage-anomalies/acknowledge-anomalies.md - - Archive Anomalies: anomalies/manage-anomalies/archive-anomalies.md - - Restore Anomalies: anomalies/manage-anomalies/restore-anomalies.md - - Edit Anomalies: anomalies/manage-anomalies/edit-anomalies.md - - Delete Anomalies: anomalies/manage-anomalies/delete-anomalies.md - - Filter & Sort: anomalies/manage-anomalies/filter-and-sort.md + - Deep Dive: + - Insights: anomalies/deep-dive/insights.md + - Description: anomalies/deep-dive/description.md + - Source Record: anomalies/deep-dive/source-record.md + - Types: anomalies/deep-dive/types.md + - Status: anomalies/deep-dive/status.md + - Fingerprints: anomalies/deep-dive/fingerprints.md + - Assignees: anomalies/deep-dive/assignees.md + - How-tos: + - Acknowledge Anomalies: anomalies/how-tos/acknowledge-anomalies.md + - Archive Anomalies: anomalies/how-tos/archive-anomalies.md + - Restore Anomalies: anomalies/how-tos/restore-anomalies.md + - Edit Description: anomalies/how-tos/edit-description.md + - Tags: + - Add Tags: anomalies/how-tos/tags/add-tags.md + - Remove Tags: anomalies/how-tos/tags/remove-tags.md + - Bulk-Edit Tags: anomalies/how-tos/tags/bulk-edit.md + - Assignee: + - Add Assignee: anomalies/how-tos/assignee/add-assignee.md + - Remove Assignee: anomalies/how-tos/assignee/remove-assignee.md + - Bulk-Assign Anomalies: anomalies/how-tos/assignee/bulk-assign.md + - Delete Anomalies: anomalies/how-tos/delete-anomalies.md + - Filter by Status: anomalies/how-tos/filter-by-status.md + - Filter & Sort: anomalies/how-tos/filter-and-sort.md + - API: anomalies/api.md + - FAQ: anomalies/faq.md - Explore: - Overview: explore/overview-of-explore.md - Insights: explore/insights.md @@ -917,18 +930,49 @@ plugins: 'flows/notifications/pagerduty/faq.md': 'flows/actions-node/notifications/pagerduty/faq.md' # Anomalies reorganization 'anomalies/anomalies.md': 'anomalies/overview.md' - 'anomalies/anomaly-types.md': 'anomalies/types.md' + 'anomalies/anomalies-in-datastore.md': 'anomalies/overview.md' + 'anomalies/anomaly-details.md': 'anomalies/deep-dive/insights.md' + 'anomalies/manage-anomalies.md': 'anomalies/overview.md' + 'anomalies/overview-of-an-anomaly.md': 'anomalies/overview.md' + # Legacy "General Anomalies View" page; its successor is the cross-datastore explore view. + 'anomalies/universal-anomaly.md': 'explore/anomalies.md' + 'anomalies/what-is-anomaly.md': 'anomalies/overview.md' + 'anomalies/anomaly-types.md': 'anomalies/deep-dive/types.md' 'anomalies/anomaly-detection.md': 'anomalies/detection.md' - 'anomalies/anomaly-insights.md': 'anomalies/details/insights.md' - 'anomalies/source-record.md': 'anomalies/details/source-record.md' - 'anomalies/anomaly-status.md': 'anomalies/status.md' - 'anomalies/anomaly-fingerprints.md': 'anomalies/fingerprints.md' - 'anomalies/acknowledge-anomalies.md': 'anomalies/manage-anomalies/acknowledge-anomalies.md' - 'anomalies/archive-anomalies.md': 'anomalies/manage-anomalies/archive-anomalies.md' - 'anomalies/restore-anomalies.md': 'anomalies/manage-anomalies/restore-anomalies.md' - 'anomalies/edit-anomalies.md': 'anomalies/manage-anomalies/edit-anomalies.md' - 'anomalies/delete-anomalies.md': 'anomalies/manage-anomalies/delete-anomalies.md' - 'anomalies/filter-and-sort.md': 'anomalies/manage-anomalies/filter-and-sort.md' + 'anomalies/anomaly-insights.md': 'anomalies/deep-dive/insights.md' + 'anomalies/source-record.md': 'anomalies/deep-dive/source-record.md' + 'anomalies/details/insights.md': 'anomalies/deep-dive/insights.md' + 'anomalies/details/source-record.md': 'anomalies/deep-dive/source-record.md' + 'anomalies/anomaly-status.md': 'anomalies/deep-dive/status.md' + 'anomalies/status.md': 'anomalies/deep-dive/status.md' + 'anomalies/anomaly-fingerprints.md': 'anomalies/deep-dive/fingerprints.md' + 'anomalies/fingerprints.md': 'anomalies/deep-dive/fingerprints.md' + 'anomalies/acknowledge-anomalies.md': 'anomalies/how-tos/acknowledge-anomalies.md' + 'anomalies/archive-anomalies.md': 'anomalies/how-tos/archive-anomalies.md' + 'anomalies/restore-anomalies.md': 'anomalies/how-tos/restore-anomalies.md' + 'anomalies/edit-anomalies.md': 'anomalies/how-tos/edit-description.md' + 'anomalies/delete-anomalies.md': 'anomalies/how-tos/delete-anomalies.md' + 'anomalies/filter-and-sort.md': 'anomalies/how-tos/filter-and-sort.md' + # Manage Anomalies → How-tos rename (release 2026.4.24) + 'anomalies/manage-anomalies/acknowledge-anomalies.md': 'anomalies/how-tos/acknowledge-anomalies.md' + 'anomalies/manage-anomalies/archive-anomalies.md': 'anomalies/how-tos/archive-anomalies.md' + 'anomalies/manage-anomalies/restore-anomalies.md': 'anomalies/how-tos/restore-anomalies.md' + 'anomalies/manage-anomalies/edit-anomalies.md': 'anomalies/how-tos/edit-description.md' + 'anomalies/manage-anomalies/delete-anomalies.md': 'anomalies/how-tos/delete-anomalies.md' + 'anomalies/manage-anomalies/filter-and-sort.md': 'anomalies/how-tos/filter-and-sort.md' + 'anomalies/details/assignees/how-tos.md': 'anomalies/how-tos/assignee/add-assignee.md' + 'anomalies/how-tos/edit-assignees.md': 'anomalies/how-tos/assignee/add-assignee.md' + 'anomalies/how-tos/add-assignee.md': 'anomalies/how-tos/assignee/add-assignee.md' + 'anomalies/how-tos/remove-assignee.md': 'anomalies/how-tos/assignee/remove-assignee.md' + 'anomalies/how-tos/bulk-assign.md': 'anomalies/how-tos/assignee/bulk-assign.md' + 'anomalies/how-tos/edit-tags.md': 'anomalies/how-tos/tags/add-tags.md' + 'anomalies/details/assignees/deep-dive.md': 'anomalies/deep-dive/assignees.md' + 'anomalies/details/assignees/api.md': 'anomalies/api.md' + 'anomalies/details/assignees/faq.md': 'anomalies/faq.md' + 'anomalies/details/assignees/getting-started.md': 'anomalies/deep-dive/assignees.md' + 'anomalies/api/assignees.md': 'anomalies/api.md' + 'anomalies/faq/assignees.md': 'anomalies/faq.md' + 'anomalies/types.md': 'anomalies/deep-dive/types.md' # Notifications restructure 'flows/notification.md': 'flows/actions-node/notifications/overview.md' 'flows/notification-tokens.md': 'flows/actions-node/notifications/message-variables.md'