From 3475af27a2ea29ccb93acf13960dc82ee58b86ad Mon Sep 17 00:00:00 2001 From: josecsotomorales Date: Thu, 4 Jun 2026 22:14:49 -0400 Subject: [PATCH] build: migrate from Material for MkDocs to Zensical + uv Migrate the User Guide from Material for MkDocs to Zensical (modern theme variant) and from pip/requirements.txt to uv/pyproject.toml. Tooling - Add pyproject.toml, .python-version (3.12), uv.lock; drop requirements.txt - Native zensical.toml config (replaces mkdocs.yml); build output verified byte-identical between the two configs before removing mkdocs.yml Plugin gaps (Zensical reimplements MkDocs plugins as modules) - include-markdown -> main.py macros module; components/ moved to repo root - redirects -> redirects.yml + scripts/generate-redirects.py (349 stubs) - print-site -> docs/stylesheets/print.css + browser Print->PDF - render_macros:false front-matter on docs with literal {{token}} syntax Design (modern theme) - Redesigned homepage (hero + filterable destination cards) - tokens.css / components.css / home.css design system; branded 404; nav and search polish CI and dev tooling - ci.yml: uv + zensical build + redirect stubs + gh-pages deploy - pre-commit, scripts, and .vscode rewired to uv/zensical Also fixes 67 pre-existing build warnings (type-annotation bracket false-positives + broken internal links) and removes legacy files (includes/, archived/, stray dirs). Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 24 +- .gitignore | 2 +- .pre-commit-config.yaml | 6 +- .python-version | 1 + .typos.toml | 8 +- .vscode/settings.json | 2 +- CLAUDE.md | 137 +- README.md | 174 +- archived/use-cases/entity-management.md | 30 - ...-consistency-across-multiple-datastores.md | 36 - archived/use-cases/metadata-analysis.md | 1 - archived/use-cases/use-cases.md | 20 - .../anomaly-support/index.md | 0 .../comparators/duration.md | 0 .../comparators/index.md | 0 .../comparators/numeric.md | 0 .../comparators/string.md | 0 .../general-props/filter-guide.md | 0 .../general-props/index.md | 0 .../general-props/typos.md | 0 .../general-props/warning.md | 0 contributing/check-content-template-guide.md | 31 +- docs/agent-q/deep-dive/best-practices.md | 2 +- .../manage-anomalies/filter-and-sort.md | 5 +- docs/changelog-2023.md | 6 +- docs/changelog-2024.md | 2566 +++++++++-------- docs/changelog-2025.md | 2398 +++++++-------- docs/changelog.md | 1402 ++++----- docs/container/complex-data-types.md | 30 +- docs/data-quality-checks/after-date-check.md | 12 +- .../aggregation-comparison-check.md | 384 ++- .../data-quality-checks/any-not-null-check.md | 12 +- .../before-date-time-check.md | 12 +- docs/data-quality-checks/between-check.md | 12 +- .../between-times-check.md | 12 +- .../contains-credit-card-check.md | 12 +- .../contains-email-check.md | 12 +- .../contains-social-security-number-check.md | 12 +- docs/data-quality-checks/contains-url.md | 12 +- docs/data-quality-checks/data-diff-check.md | 28 +- .../distinct-count-check.md | 12 +- docs/data-quality-checks/entity-resolution.md | 12 +- docs/data-quality-checks/equal-to-check.md | 20 +- .../equal-to-field-check.md | 28 +- docs/data-quality-checks/exists-in-check.md | 12 +- .../expected-schema-check.md | 12 +- .../expected-values-check.md | 18 +- docs/data-quality-checks/field-count-check.md | 12 +- .../data-quality-checks/greater-than-check.md | 20 +- .../greater-than-field-check.md | 24 +- docs/data-quality-checks/is-address.md | 12 +- .../is-credit-card-check.md | 12 +- .../is-replica-of-check.md | 28 +- docs/data-quality-checks/is-type-check.md | 12 +- docs/data-quality-checks/less-than-check.md | 20 +- .../less-than-field-check.md | 24 +- .../matches-pattern-check.md | 12 +- docs/data-quality-checks/max-length-check.md | 12 +- .../max-partition-size-check.md | 12 +- docs/data-quality-checks/max-value-check.md | 12 +- docs/data-quality-checks/metric-check.md | 12 +- docs/data-quality-checks/min-length-check.md | 12 +- .../min-partition-size-check.md | 12 +- docs/data-quality-checks/min-value-check.md | 12 +- .../not-exists-in-check.md | 6 +- docs/data-quality-checks/not-future-check.md | 12 +- .../data-quality-checks/not-negative-check.md | 12 +- docs/data-quality-checks/not-null-check.md | 12 +- docs/data-quality-checks/positive-check.md | 12 +- .../data-quality-checks/predicted-by-check.md | 12 +- .../required-values-check.md | 18 +- .../satisfies-expression-check.md | 14 +- docs/data-quality-checks/sum-check.md | 12 +- .../time-distribution-size-check.md | 6 +- .../unique/how-to-create.md | 4 +- .../unique/introduction.md | 12 +- docs/datastore-checks/filter-and-sort.md | 5 +- docs/deployments/databricks-deployment.md | 4 + docs/explore/anomalies.md | 5 +- docs/explore/checks.md | 5 +- docs/explore/insights.md | 5 +- docs/explore/profiles.md | 5 +- .../computed-fields-details.md | 2 +- .../field-status/concepts/field-status-api.md | 16 +- .../managing-field-status/delete-a-field.md | 4 +- .../managing-field-status/exclude-a-field.md | 6 +- .../actions-node/notifications/email/api.md | 4 + .../notifications/email/overview.md | 4 + docs/flows/actions-node/notifications/faq.md | 4 + .../actions-node/notifications/in-app/api.md | 4 + .../actions-node/notifications/in-app/faq.md | 4 + .../notifications/in-app/overview.md | 4 + .../notifications/message-variables.md | 4 + .../notifications/microsoft-teams/api.md | 4 + .../notifications/microsoft-teams/overview.md | 4 + .../actions-node/notifications/overview.md | 4 + .../notifications/pagerduty/api.md | 4 + .../notifications/pagerduty/faq.md | 4 + .../notifications/pagerduty/overview.md | 4 + .../actions-node/notifications/slack/api.md | 4 + .../notifications/slack/overview.md | 4 + docs/flows/actions-node/workflow.md | 4 + docs/index.md | 165 +- .../automated-setup-using-qualytics-cli.md | 2 +- docs/operations/promote/api.md | 28 +- docs/operations/scan/scan.md | 4 + .../connections/manage-connections.md | 5 +- .../integrations/alerting/msft_teams.md | 2 +- .../alerting/pagerduty/deep-dive.md | 4 + .../managing-pagerduty/add-integration.md | 2 +- .../alerting/pagerduty/pagerduty-api.md | 4 + .../alerting/pagerduty/pagerduty-faq.md | 2 +- .../integrations/data-catalogs/overview.md | 2 +- docs/settings/security/teams/api.md | 6 +- docs/source-datastore/datastore/api.md | 24 +- docs/source-datastore/datastore/faq.md | 4 + .../jdbc/athena/managing/add-source.md | 4 + .../jdbc/sap-hana/how-tos/add-source.md | 4 + .../datastore/multi-schema/faq.md | 4 + .../datastore/multi-schema/how-it-works.md | 4 + docs/source-datastore/tags/api.md | 4 + docs/stylesheets/components.css | 71 + docs/stylesheets/home.css | 111 + docs/stylesheets/print.css | 73 + docs/stylesheets/tokens.css | 70 + docs/tags/filter-and-sort.md | 5 +- docs/using-the-platform/printing.md | 25 +- .../in-app-notifications/api.md | 2 +- .../in-app-notifications/faq.md | 2 +- .../in-app-notifications/introduction.md | 2 +- includes/abbreviations.md | 3 - main.py | 107 + mkdocs.yml | 1272 -------- overrides/404.html | 42 +- pyproject.toml | 27 + redirects.yml | 353 +++ requirements.txt | 9 - scripts/check-anchor-changes.sh | 9 +- scripts/check-broken-images.sh | 2 +- scripts/check-build-warnings.sh | 27 + scripts/check-mkdocs-warnings.sh | 33 - scripts/generate-redirects.py | 120 + uv.lock | 440 +++ zensical.toml | 1001 +++++++ 144 files changed, 6438 insertions(+), 5670 deletions(-) create mode 100644 .python-version delete mode 100644 archived/use-cases/entity-management.md delete mode 100644 archived/use-cases/maintaining-data-consistency-across-multiple-datastores.md delete mode 100644 archived/use-cases/metadata-analysis.md delete mode 100644 archived/use-cases/use-cases.md rename {docs/components => components}/anomaly-support/index.md (100%) rename {docs/components => components}/comparators/duration.md (100%) rename {docs/components => components}/comparators/index.md (100%) rename {docs/components => components}/comparators/numeric.md (100%) rename {docs/components => components}/comparators/string.md (100%) rename {docs/components => components}/general-props/filter-guide.md (100%) rename {docs/components => components}/general-props/index.md (100%) rename {docs/components => components}/general-props/typos.md (100%) rename {docs/components => components}/general-props/warning.md (100%) create mode 100644 docs/stylesheets/components.css create mode 100644 docs/stylesheets/home.css create mode 100644 docs/stylesheets/print.css create mode 100644 docs/stylesheets/tokens.css delete mode 100644 includes/abbreviations.md create mode 100644 main.py delete mode 100644 mkdocs.yml create mode 100644 pyproject.toml create mode 100644 redirects.yml delete mode 100644 requirements.txt create mode 100755 scripts/check-build-warnings.sh delete mode 100755 scripts/check-mkdocs-warnings.sh create mode 100644 scripts/generate-redirects.py create mode 100644 uv.lock create mode 100644 zensical.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 93d0b951d7..98ad2bdca3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,9 +9,23 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v4 with: - python-version: 3.x - - run: pip install -r requirements.txt - - run: mkdocs gh-deploy --force + fetch-depth: 0 + - name: Set up uv + uses: astral-sh/setup-uv@v5 + with: + python-version: "3.12" + enable-cache: true + - name: Install dependencies + run: uv sync --frozen + - name: Build site + run: uv run zensical build + - name: Generate redirect stubs + run: uv run python scripts/generate-redirects.py + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site + cname: userguide.qualytics.io diff --git a/.gitignore b/.gitignore index 6d5e0e0956..7a16cc845b 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ coverage.xml *,cover .hypothesis/ venv/ -.python-version +.venv/ # Translations *.mo diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 824a336c12..3dfa2a33ab 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,9 +6,9 @@ repos: args: ["--config", ".typos.toml"] - repo: local hooks: - - id: mkdocs-warnings - name: mkdocs build (check for warnings) - entry: bash scripts/check-mkdocs-warnings.sh + - id: build-warnings + name: zensical build (check for warnings) + entry: bash scripts/check-build-warnings.sh language: system pass_filenames: false always_run: true diff --git a/.python-version b/.python-version new file mode 100644 index 0000000000..e4fba21835 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/.typos.toml b/.typos.toml index a9998ebd8a..74a97cf100 100644 --- a/.typos.toml +++ b/.typos.toml @@ -14,12 +14,14 @@ ALTERIN = "ALTERIN" [files] extend-exclude = [ "docs/assets/*", - "docs/legacy/*", "scripts/ignore_this.sh", "venv/*", + ".venv/*", ".env.local", ".gitignore", - "mkdocs.yml", - "requirements.txt", + "zensical.toml", + "pyproject.toml", + "uv.lock", + "redirects.yml", "**/.*" ] \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 8dc6947a64..b1f438ad40 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,7 @@ "commands": [ { "match": ".*", - "cmd": "venv/bin/pre-commit run --all-files" + "cmd": "uv run pre-commit run --all-files" } ] } diff --git a/CLAUDE.md b/CLAUDE.md index dffe1f4610..eec234a102 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,62 +4,88 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -This is the Qualytics User Guide documentation repository, built with [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). It documents the Qualytics data quality platform. +This is the Qualytics User Guide documentation repository, built with +[Zensical](https://zensical.org/) (the modern successor to Material for MkDocs) +and managed with [uv](https://docs.astral.sh/uv/). It documents the Qualytics +data quality platform. Configuration lives in the native `zensical.toml`, with +the `modern` theme variant. ## Common Commands ```bash -# Activate virtual environment first -source venv/bin/activate +# Install / sync dependencies (creates .venv, downloads Python 3.12 if needed) +uv sync # Serve documentation locally (default: http://localhost:8000) -mkdocs serve +uv run zensical serve -# Serve on custom port -mkdocs serve -a localhost:8080 +# Serve on a custom address/port +uv run zensical serve -a localhost:8080 -# Build static site -mkdocs build +# Build static site (output in site/) +uv run zensical build -# Run spell check -pre-commit run --all-files +# Build + generate legacy redirect stubs (as CI does) +uv run zensical build && uv run python scripts/generate-redirects.py + +# Run all pre-commit checks (typos, build warnings, images, anchors) +uv run pre-commit run --all-files ``` -## Setup (if venv doesn't exist) +## Setup (fresh clone) ```bash -python3 -m venv venv -source venv/bin/activate -pip install -r requirements.txt -pre-commit install +uv sync +uv run pre-commit install ``` ## Repository Structure -- `docs/` - All documentation markdown files -- `mkdocs.yml` - Site configuration, navigation tree, and plugins -- `docs/components/` - Reusable markdown snippets (anomaly-support, comparators, general-props) -- `overrides/` - MkDocs theme customizations -- `docs/assets/` - Images and static files +- `docs/` - All documentation markdown files and assets +- `zensical.toml` - Site configuration and navigation tree (native Zensical config) +- `components/` - Reusable markdown snippets (anomaly-support, comparators, general-props), injected via macros +- `main.py` - Macros module (`define_env`) exposing the snippet functions +- `redirects.yml` - Legacy URL → new URL map (consumed by `scripts/generate-redirects.py`) +- `scripts/` - Pre-commit checks and the redirect generator +- `overrides/` - Theme template overrides (`main.html`, `404.html`) +- `docs/stylesheets/` - `tokens.css`, `extra.css`, `components.css`, `home.css`, `print.css` +- `pyproject.toml` / `uv.lock` - Dependencies (managed by uv) - `contributing/check-content-template-guide.md` - Template for writing quality check rule documentation ## Documentation Conventions -### Reusable Components +### Reusable Components (Macros) + +Zensical has no `include-markdown` plugin, so shared content is pulled in with +macros defined in `main.py`. Snippets live in the top-level `components/` +directory: + +```markdown +{{ general_props('all-props') }} +{{ anomaly_support('all-types') }} +{{ comparators('numeric') }} +``` -Quality check documentation uses include-markdown to pull in shared content: +When a macro call is indented (e.g. inside an admonition or content tab), pipe it +through Jinja's `indent` filter so multi-line output keeps the indentation: ```markdown -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +!!! note "Details" + {{ comparators('index') | indent(4) }} ``` -Available component arguments: -- General props: `all-props`, `filter-only`, `coverage-only`, `none-props` -- Anomaly support: `all-types`, `record-only`, `shape-only` +Available macro arguments: +- `general_props`: `all-props`, `filter-only`, `coverage-only`, `none-props` +- `anomaly_support`: `all-types`, `record-only`, `shape-only` +- `comparators`: `index`, `numeric`, `duration`, `string` +- `fuzzy_search()`, `spacing_warning()`, `filter_guide()` (no arguments) + +### Literal `{{ }}` Tokens + +Pages that document literal `{{token}}` syntax (notification variables, API/CI +examples) must not have those processed as macros. Either add +`render_macros: false` to the page front matter, or wrap the snippet in a +`{% raw %} ... {% endraw %}` block. ### Quality Check Documentation Structure @@ -67,53 +93,42 @@ When documenting a quality check rule, follow `contributing/check-content-templa 1. Definition 2. In-Depth Overview (optional) 3. Field Scope (Single/Multiple/Calculated) with Accepted Types table -4. General Properties (via include-markdown) +4. General Properties (via the `general_props` macro) 5. Specific Properties -6. Anomaly Types (via include-markdown) +6. Anomaly Types (via the `anomaly_support` macro) 7. Example with: Objective, Sample Data table, Anomaly Explanation, Flowchart (mermaid), SQL query, Potential Violation Messages ### Spell Checking -The repository uses `typos` via pre-commit for spell checking. Custom word allowances are in `.typos.toml`. Files in `docs/assets/`, `venv/`, and dotfiles are excluded. +The repository uses `typos` via pre-commit for spell checking. Custom word +allowances are in `.typos.toml`. Files in `docs/assets/`, `.venv/`, `uv.lock`, +and dotfiles are excluded. ## Pre-Commit Hooks -The repository uses two pre-commit hooks (configured in `.pre-commit-config.yaml`): +Configured in `.pre-commit-config.yaml`: 1. **typos** - Spell checking across all docs (custom words in `.typos.toml`) -2. **mkdocs-warnings** - Runs `mkdocs build` and surfaces any `WARNING` lines (broken links, missing nav entries, etc.) +2. **build-warnings** - Runs `zensical build` and surfaces warnings (broken links, etc.); non-blocking +3. **broken-images** - Verifies referenced images exist on disk +4. **anchor-changes** - Detects heading/URL changes and writes `.anchor-changes.md` Run all hooks manually: ```bash -pre-commit run --all-files +uv run pre-commit run --all-files ``` -### MkDocs Validation - -The `mkdocs.yml` has a `validation` section that controls which link/reference issues produce warnings during build. The current pre-commit hook runs `mkdocs build` in non-strict mode and reports warnings without failing the build — this is intentional to avoid blocking commits on acceptable warnings. - -If stricter validation is needed in the future: - -- **Granular control:** Expand the `validation` section in `mkdocs.yml` to enable/disable specific checks (anchors, absolute links, unrecognized links, omitted nav files) -- **Strict mode:** Change the hook to use `mkdocs build --strict` to turn all warnings into errors (only do this after resolving or filtering out all existing warnings) -- **Filtered strict mode:** Keep non-strict but update the hook's grep to exclude known acceptable warning patterns and fail on the rest - -```yaml -# Example: expanded validation config in mkdocs.yml -validation: - nav: - omitted_files: info - absolute_links: warn - links: - anchors: warn - absolute_links: warn - unrecognized_links: warn -``` +### Link Validation -### Adding New Pre-Commit Checks +Zensical validates internal links, anchors, and references by default. The +`build-warnings` hook runs `zensical build` and reports warnings without failing +the commit (intentional, to avoid blocking on acceptable warnings). To fail on +warnings instead, use `uv run zensical build --strict`. -Additional tools that can be added to `.pre-commit-config.yaml` for catching more issues: +## Deployment -- **markdownlint-cli2** - Catches malformed tables, inconsistent list formatting, missing blank lines around fences -- **lychee** - Validates all links including images, anchors, and external URLs +`.github/workflows/ci.yml` runs on push to `main`: `uv sync` → `uv run zensical +build` → `uv run python scripts/generate-redirects.py` → deploy `site/` to the +`gh-pages` branch via `peaceiris/actions-gh-pages` (custom domain +`userguide.qualytics.io` set via the action's `cname` input). diff --git a/README.md b/README.md index 28ccee5909..e1238db6a5 100644 --- a/README.md +++ b/README.md @@ -1,155 +1,117 @@ # Qualytics User Guide Repository -This repository contains the documentation for the Qualytics platform, built using [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). +This repository contains the documentation for the Qualytics platform, built with +[Zensical](https://zensical.org/) — the modern static site generator from the +team behind Material for MkDocs. Dependencies are managed with +[uv](https://docs.astral.sh/uv/). ## Getting Started ### Requirements -This project requires the following tools: - -- [Python 3.13+](https://www.python.org/) -- [MkDocs](https://www.mkdocs.org/) -- [pre-commit](https://pre-commit.com/) -- [typos](https://github.com/crate-ci/typos) -- [mkdocs-print-site-plugin](https://github.com/timvink/mkdocs-print-site-plugin) +- [uv](https://docs.astral.sh/uv/) (manages Python and all dependencies) +- [Python 3.12](https://www.python.org/) (installed automatically by uv via `.python-version`) +- [typos](https://github.com/crate-ci/typos) (spell checking, run through pre-commit) - [VS Code](https://code.visualstudio.com/) with the [Run on Save](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave) extension (recommended) -### Running the Project Locally +### Set Up the Environment + +```bash +# Install dependencies into a local .venv (uv downloads Python 3.12 if needed) +uv sync -To preview the documentation locally +# Install the pre-commit hooks +uv run pre-commit install +``` -1. Activate the [virtual environment](#setting-up-the-local-environment) -2. Run the following command: +### Run the Project Locally ```bash -mkdocs serve +uv run zensical serve ``` > [!NOTE] -> By default, the documentation will be served at `http://localhost:8000`. +> By default, the documentation is served at `http://localhost:8000`. > [!TIP] -> To run it on a custom port (e.g., 8080): +> To run on a custom address/port: > > ```bash -> mkdocs serve -a localhost:8080 +> uv run zensical serve -a localhost:8080 > ``` -### Enabling PDF Export - -To enable PDF export via the print-site plugin: - -1. Open the mkdocs.yml file. -2. Set the print-site plugin to enabled. -3. Run mkdocs build or mkdocs serve. - -## Setting Up the Local Environment - -### Create a Virtual Environment - -Create a Python virtual environment: +### Build the Static Site ```bash -python3 -m venv +uv run zensical build ``` -> [!NOTE] -> Replace `` with your desired virtual environment folder name. - -### Activate the Virtual Environment - -Use the appropriate command based on your operating system and shell: - -| Platform | Shell | Command | -| -------- | ---------- | --------------------------------- | -| POSIX | bash/zsh | `source /bin/activate` | -| | fish | `source /bin/activate.fish` | -| | csh/tcsh | `source /bin/activate.csh` | -| | pwsh | `/bin/Activate.ps1` | -| Windows | cmd.exe | `\Scripts\activate.bat` | -| | PowerShell | `\Scripts\Activate.ps1` | - -> [!NOTE] -> Replace `` with the path to your virtual environment folder. - -### Upgrade pip +The site is generated into `site/` (git-ignored). -```bash -python -m pip install --upgrade pip -``` +### Redirects -### Install Project Dependencies +Legacy URLs are preserved by `redirects.yml` (old path → new path). After a build, +generate the redirect stub pages with: ```bash -pip install -r requirements.txt +uv run zensical build && uv run python scripts/generate-redirects.py ``` -### Pre-Commit Setup - -This repository uses [pre-commit](https://pre-commit.com/) hooks to catch issues before they reach the repository. Two hooks are configured: +This replaces the old `mkdocs-redirects` plugin. The same two commands run in CI +(`.github/workflows/ci.yml`) before deploying to GitHub Pages. -1. **typos** - Spell checking across all documentation files using [typos](https://github.com/crate-ci/typos). Custom word allowances are defined in `.typos.toml`. -2. **mkdocs-warnings** - Runs `mkdocs build` and reports any `WARNING` lines (broken links, missing nav entries, etc.). This hook reports warnings without failing the build to avoid blocking commits on acceptable warnings. +### Saving Pages as PDF -#### Install Pre-Commit +There is no dedicated PDF export. Any page can be saved as a PDF with the +browser's **Print → Save as PDF** — a print stylesheet +(`docs/stylesheets/print.css`) hides navigation and other chrome for a clean +result. See [`docs/using-the-platform/printing.md`](docs/using-the-platform/printing.md). -```bash -pip install pre-commit -``` +## Reusable Content (Macros) -#### Install Pre-Commit Hooks +Shared documentation snippets live in the top-level `components/` directory and +are injected via macros defined in [`main.py`](main.py) (the +[`macros`](https://zensical.org/) extension). For example: -```bash -pre-commit install +```markdown +{{ general_props('all-props') }} +{{ anomaly_support('all-types') }} +{{ comparators('numeric') }} ``` -#### Run Hooks Manually +When a page contains literal `{{ ... }}` tokens that should **not** be processed +as macros (e.g. notification variables like `{{flow_name}}`), add +`render_macros: false` to its front matter, or wrap the snippet in a +`{% raw %} ... {% endraw %}` block. -To run all pre-commit checks manually: +## Pre-Commit Hooks -```bash -pre-commit run --all-files -``` +Configured in `.pre-commit-config.yaml`: -#### MkDocs Validation +1. **typos** — spell checking ([typos](https://github.com/crate-ci/typos); custom words in `.typos.toml`). +2. **build-warnings** — runs `zensical build` and reports warnings (non-blocking). +3. **broken-images** — verifies referenced images exist on disk. +4. **anchor-changes** — detects heading/URL changes and writes `.anchor-changes.md`. -The `mkdocs.yml` file includes a `validation` section that controls which link and reference issues produce warnings during the build. This can be expanded to catch more issues: +Run all hooks manually: -```yaml -# Example: expanded validation config -validation: - nav: - omitted_files: info - absolute_links: warn - links: - anchors: warn - absolute_links: warn - unrecognized_links: warn +```bash +uv run pre-commit run --all-files ``` -To enforce stricter checks, the hook can be updated to use `mkdocs build --strict` (turns warnings into errors) or to filter out known acceptable warnings while failing on the rest. - -## Run on Save (Opctional) - -If you are using Visual Studio Code, it's recommended to install the [Run on Save](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave) extension. +## Run on Save (Optional) -With this extension, every time you save a file in the project, it automatically executes `Typos` to check for misspelled words throughout the codebase. The results will be shown in the Output panel under the `Run On Save` section. +If you use VS Code, install the [Run on Save](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave) +extension. The repository's `.vscode/settings.json` runs +`uv run pre-commit run --all-files` on every save. -To configure it, add the following snippet to your `.vscode/settings.json`: +## Repository Structure -```json -{ - "emeraldwalk.runonsave": { - "commands": [ - { - "match": ".*", - "cmd": "pre-commit run --all-files" - } - ] - } -} -``` - -> [!NOTE] -> Make sure `pre-commit` is installed and the virtual environment is activated in your terminal when using this setup. +- `docs/` — all documentation Markdown and assets +- `components/` — reusable snippets injected via `main.py` macros +- `main.py` — macros module (`define_env`) exposing the snippet functions +- `zensical.toml` — site configuration and navigation (native Zensical config) +- `redirects.yml` — legacy URL → new URL map +- `scripts/` — pre-commit checks and the redirect generator +- `overrides/` — theme template overrides (`main.html`, `404.html`) +- `pyproject.toml` / `uv.lock` — dependencies (managed by uv) diff --git a/archived/use-cases/entity-management.md b/archived/use-cases/entity-management.md deleted file mode 100644 index ec74da1067..0000000000 --- a/archived/use-cases/entity-management.md +++ /dev/null @@ -1,30 +0,0 @@ -# Entity Management with Metadata Analysis - -## Overview - -This use case focuses on profiling data, generating metadata, and gaining insights for enhanced entity management and resolution using Qualytics. - -## Goal - -The primary objective is to improve entity management and resolution efforts through data profiling, metadata generation, and insightful analysis. - -## Prerequisites - -- Access to the dataset you want to profile -- Familiarity with Qualytics' data profiling and metadata generation features - -## Steps - -1. Set up connections to the Datastores in Qualytics by selecting "Add a Datastore" from Datastore Operations -2. Run a Profile Operation on your desired Datastore -3. Analyze the generated metadata to gain valuable insights about your data. -4. Use these insights to inform your entity management and resolution strategies. -5. Use API to export into PowerBI. - -## Expected Outcome - -Upon successful implementation of this use case, you should be able to more effectively manage and resolve entities in your data, informed by the insights gained from data profiling and metadata analysis. - -## Troubleshooting - -If the histogram diff reveals significant discrepancies between values that should be equivalent, revisit your data profiling process to ensure it's accurately capturing the characteristics of your data. diff --git a/archived/use-cases/maintaining-data-consistency-across-multiple-datastores.md b/archived/use-cases/maintaining-data-consistency-across-multiple-datastores.md deleted file mode 100644 index e4f8db040e..0000000000 --- a/archived/use-cases/maintaining-data-consistency-across-multiple-datastores.md +++ /dev/null @@ -1,36 +0,0 @@ -# Maintaining Data Consistency Across Multiple Datastores - -## Overview - -This use case focuses on ensuring data consistency across various datastores, which is fundamental for data replication and migration tasks. - -## Goal - -The primary objective is to maintain data integrity and consistency across different datastores using Qualytics' `ExistsIn` and `dataDiff` checks. - -## Prerequisites - -- Access to multiple datastores -- Familiarity with the `ExistsIn` and `dataDiff` features in Qualytics -- Identified source and destination datastores for comparison - -## Steps - -1. Set up connections to the Source and Destination Datastores in Qualytucs by selecting "Add a Datastore" from Datastore Operations -2. Run a Profile Operation on the Source and Destination Datastores -3. Click Add a Check to add an authored check for `ExistsIn` or `dataDiff` - - For verifying against a reference table of Account IDs or Zip Codes, we recommend using `ExistsIn`. - - For validating full tables against each other, use `dataDiff` -4. Select your Source Tables/Files and fields, if applicable -5. The select your Target Tables/Files and fields, if applicable -6. Enter your description and add any Tags for downstream workflows -7. Run a Scan Operation to assert Checks and to find Anomalies -8. Review the results to identify any Anomalies - -## Expected Outcome - -Upon successful implementation of this use case, any Anomalies between datastores will be promptly highlighted, ensuring the integrity and consistency of your data. - -## Troubleshooting - -If Anomalies are identified, check the data replication process for any issues. If missing values are found, verify the completeness of data migration from the source datastore to the destination datastore. diff --git a/archived/use-cases/metadata-analysis.md b/archived/use-cases/metadata-analysis.md deleted file mode 100644 index b935a31c89..0000000000 --- a/archived/use-cases/metadata-analysis.md +++ /dev/null @@ -1 +0,0 @@ -# Metadata Analysis diff --git a/archived/use-cases/use-cases.md b/archived/use-cases/use-cases.md deleted file mode 100644 index 0f40982b43..0000000000 --- a/archived/use-cases/use-cases.md +++ /dev/null @@ -1,20 +0,0 @@ -## Introduction - -In this section, we present a variety of practical scenarios illustrating how Qualytics can be utilized to solve real-world problems and achieve specific goals. - -Each use case is designed to deepen your understanding of how Qualytics functions in different contexts and situations. By exploring these examples, you'll gain valuable insights into how to optimally use the various features and capabilities of Qualytics to meet your particular needs. - -We've sought to include a diverse set of scenarios to cater to a wide array of user requirements. However, please keep in mind that these use cases are simply starting points. The true potential of Qualytics lies in its adaptability and customizability to fit your unique circumstances and requirements. - -- **Maintaining Data Consistency Across Multiple Datastores:** - - Guaranteeing data consistency across various datastores is crucial for data replication and migration tasks. In this context, our unique features - `ExistsIn` and `dataDiff` checks - play a pivotal role. Regardless of the database technology involved, these checks help in comparing values across datastores, pinpointing any discrepancies or missing values. The `ExistsIn` check ensures that specific data exists in the destination datastore, while the `dataDiff` ensures that data integrity is maintained when comparing data between different sources. Thus, any inaccuracies or omissions are promptly highlighted, ensuring the integrity and consistency of your data. - - [Click here to learn more about Maintaining Data Consistency](/docs/use-cases/maintaining-data-consistency-across-multiple-datastores.md) - -- **Resting Anomaly Detection - Enterprise Data Warehouse:** - - This use case involves a mixture of automated rule inference and notifications, with the potential inclusion of manually authored rules. The user establishes a connection between Qualytics and a chosen EDW, Data Lake, or Database (options include Snowflake, BigQuery, MSSQL, and more), then applies the platform's methodology to infer rules and detect anomalies. - - [Click here to learn more about Resting Anomaly Detection]() - -- **Entity Management with Metadata Analysis:** - - Profiling data, generating metadata, and gaining insights for improved entity management and resolution. Since Qualytics trains on data actuals, being able to do a histogram diff between values that should be equivalent can aid significantly with entity management & resolution efforts. - - [Click here to learn more about Entity Management](/docs/use-cases/entity-management.md) - diff --git a/docs/components/anomaly-support/index.md b/components/anomaly-support/index.md similarity index 100% rename from docs/components/anomaly-support/index.md rename to components/anomaly-support/index.md diff --git a/docs/components/comparators/duration.md b/components/comparators/duration.md similarity index 100% rename from docs/components/comparators/duration.md rename to components/comparators/duration.md diff --git a/docs/components/comparators/index.md b/components/comparators/index.md similarity index 100% rename from docs/components/comparators/index.md rename to components/comparators/index.md diff --git a/docs/components/comparators/numeric.md b/components/comparators/numeric.md similarity index 100% rename from docs/components/comparators/numeric.md rename to components/comparators/numeric.md diff --git a/docs/components/comparators/string.md b/components/comparators/string.md similarity index 100% rename from docs/components/comparators/string.md rename to components/comparators/string.md diff --git a/docs/components/general-props/filter-guide.md b/components/general-props/filter-guide.md similarity index 100% rename from docs/components/general-props/filter-guide.md rename to components/general-props/filter-guide.md diff --git a/docs/components/general-props/index.md b/components/general-props/index.md similarity index 100% rename from docs/components/general-props/index.md rename to components/general-props/index.md diff --git a/docs/components/general-props/typos.md b/components/general-props/typos.md similarity index 100% rename from docs/components/general-props/typos.md rename to components/general-props/typos.md diff --git a/docs/components/general-props/warning.md b/components/general-props/warning.md similarity index 100% rename from docs/components/general-props/warning.md rename to components/general-props/warning.md diff --git a/contributing/check-content-template-guide.md b/contributing/check-content-template-guide.md index 8e48df1a5b..a46cc48af7 100644 --- a/contributing/check-content-template-guide.md +++ b/contributing/check-content-template-guide.md @@ -48,21 +48,19 @@ --> -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -92,20 +90,17 @@ --> -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/agent-q/deep-dive/best-practices.md b/docs/agent-q/deep-dive/best-practices.md index 380246f4f1..ad4d0e7d4e 100644 --- a/docs/agent-q/deep-dive/best-practices.md +++ b/docs/agent-q/deep-dive/best-practices.md @@ -33,7 +33,7 @@ The injected context appears as a badge above the input box so you always know w Each conversation has a limit of **300 LLM tool-call requests**. For complex, multi-step workflows, split them into sequential messages rather than one large request. -- **Good**: *"First, show me quality scores for `sales_db`. [wait for response] Now create checks for any container scoring below 80."* +- **Good**: *"First, show me quality scores for `sales_db`. \[wait for response\] Now create checks for any container scoring below 80."* - **Risky**: *"Analyze all 12 containers in `sales_db`, create quality checks for each, run scans, then send a Slack summary."* ### Use Workflow Tools for Complex Tasks diff --git a/docs/anomalies/manage-anomalies/filter-and-sort.md b/docs/anomalies/manage-anomalies/filter-and-sort.md index a7eeaee41d..51a76a37e8 100644 --- a/docs/anomalies/manage-anomalies/filter-and-sort.md +++ b/docs/anomalies/manage-anomalies/filter-and-sort.md @@ -20,10 +20,7 @@ Whatever sorting option is selected, you can arrange the data either in ascendin ## Filter -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![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. diff --git a/docs/changelog-2023.md b/docs/changelog-2023.md index f86ee64e78..d0ae54f3dd 100644 --- a/docs/changelog-2023.md +++ b/docs/changelog-2023.md @@ -792,7 +792,7 @@ #### Feature Enhancements -- [**Explore**](/explore/overview-of-explore.md) is the new centralized view of Activities, Containers (Profiles, Tables, Computed Tables), Checks, Anomalies and Insights across ALL Datastores. This new view allows for filtering by Datastores & Tags, which will persist the filters across all of the submenu tabs. The goal is to help with Critical Data Elements and filter out irrelevant information. +- [**Explore**](explore/overview-of-explore.md) is the new centralized view of Activities, Containers (Profiles, Tables, Computed Tables), Checks, Anomalies and Insights across ALL Datastores. This new view allows for filtering by Datastores & Tags, which will persist the filters across all of the submenu tabs. The goal is to help with Critical Data Elements and filter out irrelevant information. - Enhanced Navigation Features - The navigation tabs have been refined for increased user-friendliness. - Enhanced the Profile View and added a toggle between card and list views. @@ -806,8 +806,8 @@ - ![Screenshot](assets/changelog/absolute-relative-change-limit.png#only-light){: style="height:100px"} ![Screenshot](assets/changelog/absolute-relative-change-limit.png#only-dark){: style="height:100px"} - - The [`Absolute Change Limit`](/data-quality-checks/metric-check.md#comparison-options) check is designed to monitor changes in a field's value by a fixed amount. If the field's value changes by more than the specified limit since the last applicable scan, an anomaly is generated. - - The [`Relative Change Limit`](/data-quality-checks/metric-check.md#comparison-options) check works similarly but tracks changes in terms of percentages. If the change in a field's value exceeds the defined percentage limit since the last applicable scan, an anomaly is generated. + - The [`Absolute Change Limit`](data-quality-checks/metric-check.md#comparison-options) check is designed to monitor changes in a field's value by a fixed amount. If the field's value changes by more than the specified limit since the last applicable scan, an anomaly is generated. + - The [`Relative Change Limit`](data-quality-checks/metric-check.md#comparison-options) check works similarly but tracks changes in terms of percentages. If the change in a field's value exceeds the defined percentage limit since the last applicable scan, an anomaly is generated. #### General Fixes diff --git a/docs/changelog-2024.md b/docs/changelog-2024.md index 5a02ca529f..45c4db0e6b 100644 --- a/docs/changelog-2024.md +++ b/docs/changelog-2024.md @@ -1,1282 +1,1286 @@ -# 2024 - -## Release Notes - -### 2024.12.23 { id=2024.12.23 } - -#### Feature Enhancements - -- User and Teams Permissions - - We are excited to introduce an enhancement to User and Team Permissions. - - Users can now have `Admin`, `Manager`, or `Member` roles. - - The Manager role provides a subset of Admin permissions for global assets or settings but does not include the "Admin exemption to team roles." - - Teams can have specific permissions: `Editor`, `Author`, `Drafter`, `Viewer`, and `Reporter`. - - Each permission type includes restricted capabilities tailored to its role. - - Admins can now create special tokens that grant access exclusively to SCIM endpoints. These tokens allow customers to enable SCIM integrations with minimal access, ensuring the holder cannot access other endpoints or log in to the platform. - -- Improve Visibility of Datastore Teams - - Users can now view respective teams in the tree view footer. Depending on privileges, they can manage this field. - - Teams are also visible in the table and field context for improved collaboration and data transparency. - -#### General Fixes - -- Completeness Rounding - - Added two more decimal places to the Completeness metric in the Overview tab. - - Previously, percentages were being rounded up incorrectly. - -- "Is Replica Of" Check Validation - - Fixed a bug that occurred when users attempted to validate this check using the same container. - -- Global Search - - Fixed the label to better distinguish between Enrichment Datastores and Source Datastores. - -- General Fixes and Improvements. - -### 2024.12.11 { id=2024.12.11 } - -#### Feature Enhancements - -- Add `Max Parallelization` Field on Datastore Connection - - Users can now configure the maximum parallelization level for certain datastores, providing greater control over operation performance. - -#### General Fixes - -- General Fixes and Improvements. - -### 2024.11.29 { id=2024.11.29 } - -#### Feature Enhancements - -- Activity List - - Removed the `Warning` status for a cleaner and more concise status display. - - Added an alert icon to indicate if an operation completed with warnings, improving visibility into operation outcomes. - -#### General Fixes - -- Better handling of Oracle Date and Numeric columns during Catalog operations for improved partition field selection. -- General Fixes and Improvements. - -### 2024.11.21 { id=2024.11.21 } - -#### Feature Enhancements - -- Improved Operations Container Dialogs - - Added container status details based on profile and scan results, providing better visibility of container-level operations. - - Introduced a loading tracker component for containers, enhancing feedback during operation processing. - - Made the entire modal reactive to operation updates, enabling real-time tracking of operation progress within the modal. - - Removed "containers requested" and "containers analyzed" dialogs for a cleaner interface. - -#### General Fixes - -- Resolved an issue where the table name was not rendering correctly in notifications when using the `{{customer_name}}` variable. - -- General Fixes and Improvements. - -### 2024.11.12 { id=2024.11.12 } - -#### Feature Enhancements - -- Enhance Data Catalog Integration - - Introduced a new domain input field that allows users to select specific domains, enabling more granular control over assets synchronization. - -- Scan Results Enhancements - - Added partition label to the scan results modal for improved partition identification. - - Removed unnecessary metadata partitions created solely for volumetric checks, reducing clutter in scan results. - -- Activity Tab - - Display of Unprocessed Containers in the Operation List - - Unprocessed containers are now visible in the operation list within the operation summary. - - A total count label was added to indicate if the number of analyzed containers exceeds the total requested. - - The search icon now highlights in a different color if not all containers were analyzed, making it easier to identify incomplete operations. - - Reorder the Datastore Column in the Activity Tab - - Users can now reorder columns in the Activity tab for easier navigation and data organization. - - Profile Operations - - Users can now view added, updated, and total inferred checks within Profile operations. - - Triggered by Column - - Updated the term "Triggered by API" to "Triggered by System" for clarity. - -#### General Fixes - -- General Fixes and Improvements. - -### 2024.11.1 { id=2024.11.1 } - -#### Feature Enhancements - -- Observability Enhancements - - An observability heatmap was added to the volumetric card in the Observability tab. - - The heatmap allows users to monitor volumetric status and check for new anomalies. - - Improved observability chart for clearer insights. - - Users can now view the count of volumetric anomalies produced over time, along with the last recorded measurements for each period. - - Introduced new color indicators to help distinguish volumetric measures outside thresholds that didn’t produce anomalies from those that did. - -- Editable Tags in Field Details - - Users with write permissions can now manage tags directly in the Field Details within the Explore context. - -- Distinct Count Rule Update - - The Distinct Count rule now excludes the Coverage field for more accurate assessments. - -- Support for Pasting into Expected Values - - Users can now paste values from spreadsheets directly into Expected Values, saving time on data entry. - -#### General Fixes - -- General Fixes and Improvements. - -### 2024.10.23 { id=2024.10.23 } - -#### Feature Enhancements - -- Dremio Connector - - We’ve expanded our connectivity options by supporting a new connection with Dremio. - -- Full View of Abbreviated Metrics in Operation Summary - - Users can now hover over abbreviated metrics to see the full value for better clarity. - -- Redirect to Conflicting Check - - Added a redirect link to the conflicting check from the error message, improving navigation when addressing errors. - -- Enhanced Visibility and Engagement for Tags and Notifications Setup - - Introduced a Call to Action to encourage users to manage Tags and Notifications for better engagement. - -- Favorite Containers - - Users can now favorite individual containers. - - The option to favorite datastores and containers is now available in both card and list views. - -#### General Fixes - -- General Fixes and Improvements. - -### 2024.10.16 { id=2024.10.16 } - -#### Feature Enhancements - -- Improved Anomaly Modal - - Introduced an information icon in each failed check to display the check's description. - - Anomaly links now persist filters for sort order and displayed fields. - - Added integration details to fields in a source record. - -- Secrets Management - - Added support for Secrets Manager in connection properties, enabling integration with Vault and other secrets management systems. - -- Alation Data Dictionary - - Enhanced the dictionary to display friendly names in anomaly screens for improved usability. - - Added integration information to the datastore, container, and fields in the tree view footer. - -- Tag Category - - Introduced support for tag categories to improve tag management, with sorting and filtering options based on the category field. - -- Call to Action for Volumetric Measurements - - A call to action was added in the overview tab within the container context, and the observability page per container was added to enable volumetric measurements. - -- Error Display for Check Operations - - Bulk operations like Edit, Activate, Update, and Template Edit now display error messages clearly when validation fails. - -- Check Validation - - Improved check validation logic to enhance bulk check validation speed and prevent timeouts. - -- Tag Filtering for Fields - - Users can now filter fields by tags in the field list under the datastore context. - -- Field Remarks in Native Field Properties - - Added support for displaying field remarks alongside other native field properties. - -- Customer Support Link - - Users can now access the Qualytics Helpdesk via the Discover menu in the main header. - -#### General Fixes - -- General Fixes and Improvements. - -### 2024.10.4 { id=2024.10.4 } - -#### Feature Enhancements - -- Insights Page Redesign - - Introduced a new Overview card displaying key metrics such as `Data Under Management`, `Source Datastores`, and `Containers`. - - Added a doughnut chart visualization for checks and anomalies, providing a clearer view of data health. - - Expanded available metrics to include profile runs and scan runs. - - Users can now easily navigate to Checks and Anomalies based on their current states and statuses. - - Implemented data volume visualizations to give users better insight into data trends. - - Introduced a legend option that allows users to compare specific metrics against the primary one. - - Enhanced the check distribution visualization across the platform within the overview tabs. - -- Check Filter - - Now users can filter `Not Asserted` checks. - -- Team Management - - Now admin users can modify the `Read` and `Write` permissions of the `Public` Team. - -- Reapplying Clone Field - - Check cloning functionality by attempting to reapply the field from the original (source) check when a new container is selected. If the selected container matches the field and type from the original check, the cloned field will be reapplied automatically. - -#### General Fixes - -- Allow saving checks with attached templates as drafts - - Adjusted the behavior to allow checks attached to a template to be saved as drafts. The `Save as draft` feature now remains functional when a template is attached. - -- Incremental identifier strange behavior - - When a user tries to modify a query in a computed table, the Incremental Modifier is set to null. - -- General Fixes and Improvements - -### 2024.9.25 { id=2024.9.25 } - -#### Feature Enhancements - -- Observability - - Time-series charts are presented to monitor data volume and related anomalies for each data asset. - - Custom thresholds were added to adjust minimum and maximum volume expectations. - - The Metrics tab has been moved to the Observability tab. - - The Observability tab has replaced the Freshness page. - -- Check Category Options for Scan Operations - - Users can select one or multiple check categories when running a scan operation. - -- Anomaly Trigger Rule Type Filter - - Added a filter by check rule types to anomaly triggers. A help component was added to the tags selector to improve clarity. - -- Auto-Archive Anomalies - - A new Duplicate status has been introduced for anomalies. - - Users can now use Incremental Identifier ranges to auto-archive anomalies with the new Duplicate status. - - An option has been added to scan operations to automatically archive anomalies identified as duplicates if the containers analyzed have incremental identifiers configured. - - A dedicated tab for filtering duplicate anomalies has been added for better visibility. - -- Tree View and Breadcrumb Context Menu - - A context menu has been added, allowing users to copy essential information and open links in new tabs. - - Users can access the context menu by right-clicking on the assets. - -- Incremental Identifier Support - - Users can manage incremental identifiers for computed tables and computed files. - -- Native Field Properties - - Users can now see native field properties in the field profile, displayed through an info icon next to the Type Inferred section. - -- Qualytics CLI Update - - Users can now import check templates. - - A status filter has been added to check exports. Users can filter by `Active`, `Draft`, or `Archived` (which will include `Invalid` and `Discarded` statuses). - -#### General Fixes - -- The Oracle connector now handles invalid schemas when creating connections. -- Anomalies identified in scan operations were not counting archived statuses. -- Improved error message when a user creates a schedule name longer than 50 characters. -- General Fixes and Improvements. - -#### Breaking Changes - -- Freshness and SLA references have been removed from user notifications and notification rules, users should migrate to Observability using volumetric checks. - -### 2024.9.14 { id=2024.9.14 } - -#### Feature Enhancements - -- Volumetric Measurement - - We are excited to introduce support for volumetric measurements of views, computed tables and computed files. - -- Enhanced Source Record CSV Download - - Users can now download all source records as CSV that have been written to the enrichment datastores. - -- Tags and Notifications Moved to Left-Side Navigation - - Users can now quickly switch between Tags, Notifications, and Data Assets through the left-side navigation. - - Access to the Settings page is restricted to admin users. - -- Last Asserted Information in Checks - - The `Created Date` information has been replaced with `Last Asserted` to improve visibility. - - Users can hover over an info icon to view the `Created Date`. - -- Auto-Generated Description in Check Template Dialog - - Descriptions are now automatically generated in the Template Dialog based on the rule type, ensuring consistency with the check form. - -- Exposed Properties in Profile and Scan Operations - - Profile and scan operations now expose properties when listed: - - Record Limit - - Infer As Draft - - Starting Threshold - - Enrichment Record Limit - -#### General Fixes - -- Fixed a bug where the container list would not update when a user created a computed container. -- Fixed an issue where deactivated users were not filtered on the Settings page under the Security tab. -- Improved error messages when operations fail. -- Fixed a bug where the `Last Editor` field was empty after a user was deactivated by an admin. -- General Fixes and Improvements. - -### 2024.9.10 { id=2024.9.10 } - -#### Feature Enhancements - -- Add Source Datastore Modal - - Enhanced text messages and labels for better clarity and user experience. - -- Add Datastore - - Users can now add a datastore directly from the Settings page under the Connections tab, simplifying connection management. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.9.6 { id=2024.9.6 } - -#### Feature Enhancements - -- Introducing Bulk Activation on Draft Checks - - Users can now activate and validate multiple draft checks at once, streamlining the workflow and reducing manual effort. - -#### General Fixes - -- Improved error message for BigQuery temporary dataset configuration exceptions. - -- Added a retry operation for Snowflake when no active warehouse is selected in the current session. - -- General Fixes and Improvements - -#### Breaking Changes - -- API fields (`type` and `container_type`) are now mandatory in request payloads where they were previously optional. - - POST /global-tags: `type` is now required. - - PUT /global-tags/{name}: `type` is now required. - - POST /containers: `container_type` is now required. - - PUT /containers/{id}: `container_type` is now required. - - POST /operations/schedule: `type` is now required. - - PUT /operations/schedule/{id}: `type` is now required. - - POST /operations/run: `type` is now required. - -### 2024.9.3 { id=2024.9.3 } - -#### Feature Enhancements - -- Introducing Catalog Scheduling - - Users can now schedule a Catalog operation like Profile and Scan Operations, allowing automated metadata extraction. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.8.31 { id=2024.8.31 } - -#### Feature Enhancements - -- New Draft Status for Checks - - Introduced a new 'draft' status for checks to enhance lifecycle management, allowing checks to be prepared and reviewed without impacting scan operations. - - Validation is only applied to active checks, ensuring draft checks remain flexible for adjustments without triggering automatic validations. - -- Introduce Draft Check Inference in Profile Operations - - Added a new option to infer checks as drafts, offering more flexibility during data profiling. - -- Improve Archive Capabilities for Checks and Anomalies - - Enhanced the archive capabilities for both checks and anomalies, allowing recovery of archived items. - - Introduced a hard delete option that allows permanent removal of archived items, providing greater control over their management. - - The Anomaly statuses 'Resolved' and 'Invalid' are now treated as archived states, aligning with the consistent approach used for checks. - -- Introduce a new Volumetric Check - - Introduced the Volumetric Check to monitor and maintain data volume stability within a specified range. This check ensures that the volume of data assets does not fluctuate beyond acceptable limits based on a moving daily average. - - Automatically inferred and maintained by the system for daily, weekly, and monthly averages, enabling proactive management of data volume trends. - -- Incremental Identifier Warning in Scan Dialog - - Enhanced the dialog to notify users when they attempt an incremental scan on containers lacking an incremental identifier, ensuring transparency and preventing unexpected full scans. - -#### General Fixes - -- Improve enrichment writes with queuing all writes (up to a queue threshold) for the entire scan operation. This will dramatically reduce the number of write operations performed. - -- Explicit casting to avoid weak CSV parser support for typing. - -- General Fixes and Improvements - -### 2024.8.19 { id=2024.8.19 } - -#### Feature Enhancements - -- Enhance Auto-Refresh Mechanism on Tree View - - The datastore and container tree footers are now automatically refreshed after specific actions, eliminating the need for manual page refreshes. - -- Support Oracle Client-Side Encryption - - Connections with Oracle now feature end-to-end encryption. Database connection encryption adds an extra layer of protection, especially for transmissions over long-distance, insecure channels. - -#### General Fixes - -- UI Label on Explore Page - - Fixed an issue where the labels on the Explore page did not change based on the selected time frame. - -- Inferred Field Type Enhancements - - Behavior updated to infer field types at data load time rather than implicitly cast them to latest profiled type. This change supports more consistent expected schema verification for delimited file types and resolves issues when comparing inferred fields to non-inferred fields in some rule types. - -- Boolean Type Inference - - Behavior updated to align boolean inference with Spark Catalyst so that profiled types are more robustly handled during Spark based comparisons - -- General Fixes and Improvements - -### 2024.8.10 { id=2024.8.10 } - -#### Feature Enhancements - -- Introducing Profile Inference Threshold - - This feature allows users to adjust which check types will be automatically created and updated during data profiling, enabling them to manage data quality expectations based on the complexity of inferred data quality rules. -- Anomaly Source Records Retrieval Retry Option - - Enabled users to manually retry fetching anomaly source records when the initial request fails. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.7.31 { id=2024.7.31 } - -#### Feature Enhancements - -- Introducing Field Count to the Datastore Overview - - This enhancement allows users to easily view the total number of fields present in a datastore across all containers. - -- Search Template - - Added a check filter to the templates page. - - Added a template filter to the checks page in the datastore context and explore. - -- Driver Free Memory - - Added driver free memory information on the Health Page. - -- Anomalous Record Count to the Anomaly Sidebar Card - - Added the anomalous record count information to the anomaly sidebar card located under the Scan Results dialog. - -#### General Fixes - -- Enhanced write performance on scan operations with enrichment and relaxed hard timeouts. - -- Updated Azure Blob Storage connector to use TLS encrypted access by default. - -- Overview Tab is not refreshing asset details automatically. - -- General Fixes and Improvements - -### 2024.7.26 { id=2024.7.26 } - -#### Feature Enhancements - -- Introducing Event Bus for Extended Auto-Sync with Data Catalog Integrations - - We are excited to expand our auto-sync capabilities with data catalog integrations by implementing an event bus pattern. - - Added functionality to delete any DQ values that do not meet important checks. - - Included support for a WARNING status in the Alation Data Health tab for checks that have not been asserted yet. - -- Add Autocomplete to the Notification Form - - Improved the notification message form by implementing autocomplete. Users can now easily include internal variables when crafting custom messages, streamlining the message creation process. - -- Redesign the Analytics Engine Functions - - The functions are now accessible through a menu, which displays the icon and full functionality. - - Added a modal to alert users before proceeding with the restart. The modal informs users that the system will be unavailable for a period during the restart process. - -- Improve Qualytics metadata presentation in Alation - - Previously, multiple custom fields were used to persist data quality metrics measured by Qualytics. This process has been simplified by consolidating the metrics into a single rich text custom field formatted in HTML, making it easier for users to analyze the data. - -#### General Fixes - -- Normalize Enrichment Internal Containers - - To improve user recognition and differentiate between our internal tables and those in source systems, we now preserve the original case of table names. - -- Validation Error on Field Search Result - - Resolved the logic for cascade deletion of dependencies on containers that have been soft deleted, ensuring proper handling of related data. - -- Members Cannot Add Datastore on the Onboarding Screen - - Updated permissions so that members can no longer add Datastores during the onboarding process. Only Admins now have this capability. - -- General Fixes and Improvements - -### 2024.7.19 { id=2024.7.19 } - -#### Feature Enhancements - -- Global Search - - We are thrilled to introduce the “Global Search” feature into Qualytics! This enhancement is designed to streamline the search across the most crucial assets: Datastores, Containers, and Fields. It provides quick and precise search results, significantly improving navigation and user interaction. - - Navigation Update: To integrate the new global search bar seamlessly, we have relocated the main menu icons to the left side of the interface. This adjustment ensures a smoother user experience. -- Teradata Connector - - We’ve expanded our connectivity options by supporting a new connection with Teradata. This enhancement allows users to connect and interact with Teradata databases directly from Qualytics, facilitating more diverse data management capabilities. -- Snowflake Key-pair Authentication - - In our ongoing efforts to enhance security, we have implemented support for Snowflake Key-pair authentication. This new feature provides an additional layer of security for our users accessing Snowflake, ensuring that data transactions are safe and reliable. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.7.15 { id=2024.7.15 } - -#### Feature Enhancements - -- Alation Data Catalog Integration - - We're excited to introduce integration with Alation, enabling users to synchronize and manage assets across both Qualytics and Alation. - - Metadata Customization: - - Trust Check Flags: We now support warning flags at both the container and field levels, ensuring users are aware of deprecated items. - - Data Health: Qualytics now pushes important checks to Alation's Data Health tab, providing a comprehensive view of data health at the container level. - - Custom Fields: Quality scores and related metadata are pushed under a new section in the Overview page of Alation. This includes quality scores, quality score factors, URLs, anomaly counts, and check counts. - -- Support for Never Expiration Option for Tokens - - Users now have the option to create tokens that never expire, providing more flexibility and control over token management. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.7.5 { id=2024.7.5 } - -#### Feature Enhancements - -- Enhanced Operations Listing Performance - - Optimized the performance of operations listings and streamlined the display of container-related information dialogs. These enhancements include improved handling of operations responses and the addition of pagination for enhanced usability - -#### General Fixes - -- Fix Computed Field Icon Visibility - - Resolved an issue where the computed field icon was not being displayed in the table header. - -- General Fixes and Improvements - -### 2024.6.29 { id=2024.6.29 } - -#### Feature Enhancements - -- Computed Field Support - - Introduced computed fields allowing users to dynamically create new virtual fields within a container by applying transformations to existing data. - - Computed fields offer three transformation options to cater to various data manipulation needs. Each transformation type is designed to address specific data characteristics: - - Cleaned Entity Name: Automates the removal of business signifiers such as 'Inc.' or 'Corp.' from entity names, simplifying entity recognition. - - Convert Formatted Numeric: Strip formatting like parentheses (for negatives) and commas (as thousand separators) from numeric data, converting them into a clean, numerically-typed format. - - Custom Expression: Allows users to apply any valid Spark SQL expression to combine or transform fields, enabling highly customized data manipulations. - - Users can define specific checks on computed fields to automatically detect anomalies during scan operations. - - Computed fields are also visible in the data preview tab, providing immediate insight into the results of the defined transformations. - -- Autogenerated Descriptions for Authored Checks - - Implemented an auto-generation feature for check descriptions to streamline the check authoring process. This feature automatically suggests descriptions based on the selected rule type, reducing manual input and simplifying the setup of checks. - -- Event-Driven Catalog Integrations and Sync Enhancements - - Enhanced the Atlan integration and synchronization functionalities to include event-driven support, automatically syncing assets during Profile and Scan operations. This update also refines the Sync and Integration dialogs, offering clearer control options and flexibility. - -- Sorting by Anomalous Record Count - - Added a new sorting filter in the Anomalies tabs that allow users to sort anomalies by record count, improving the manageability and analysis of detected anomalies. - -- Refined Tag Sorting Hierarchy: - - Updated the tag sorting logic to consistently apply a secondary alphabetical sort by name. This ensures that tags will additionally be organized by name within any primary sorting category. - - -#### General Fixes - -- Profile Operation Support for Empty Containers - - Resolved an issue where profiling operations failed to record fields in empty containers. Now, fields are generated even if no data rows are present. - -- Persistent Filters on the Explore Page - - Fixed a bug that caused Explore to disable when switching tabs on the Explore page. Filters now remain active and consistent, enhancing user navigation and interaction. - -- Visibility of Scan Results Button - - Corrected the visibility issue of the 'results' button in the scan operation list at the container level. The button now correctly appears whenever at least one anomaly is detected, ensuring users have immediate access to detailed anomaly results. - -- General Fixes and Improvements - -### 2024.6.18 { id=2024.6.18 } - -#### Feature Enhancements - -- Improvement to Anomaly Dialog - - Enhanced the anomaly dialog to include a direct link to the operation that generated the anomaly. Users can now easily navigate from an anomaly to view other anomalies generated by the same operation directly from the Activity tab. - -- Sorting by Duration in Activity Tab - - Introduced the ability to sort by the duration of operations in the Activity tab by ascending or descending order. - -- Last Editor Information for Scheduled Operations - - Added visibility of which users have created or last updated scheduled operations, enhancing traceability in scheduling management. - -- Display Total Anomalous Records for Anomalies - - Added the total count of anomalous records in the anomalies listing view. - -#### General Fixes - -- Performance Fixes on Computed Table Creation and Check Validation - - Optimized the processes for creating computed tables and validating checks. Users previously experiencing slow performance or timeouts during these operations will now find the processes significantly faster and more reliable. - -- General Fixes and Improvements - -### 2024.6.14 { id=2024.6.14 } - -#### Feature Enhancements - -- Improvements to Atlan Integration - - When syncing Qualytics with Atlan, badges now display the "Quality Score Total," increasing visibility and emphasizing key data quality indicators on Atlan assets. - - - Improved performance of the synchronization operation. - - - Implemented the propagation of external tags to checks, now automatically aligned with the container synchronization process, enabling better accuracy and relevance of data tagging. - -- Refactor Metric Check Creation - - Enhanced the encapsulated Metric Check creation flow to improve user experience and efficiency. Users can now seamlessly create computed tables and schedule operations simultaneously with the metric check creation. - -- Support Update of Weight Modifier for External Tags - -- Add Validation on Updated Connections - - Added support for testing the connection if there's at least one datastore attached to the connection, ensuring more reliable and accurate connection updates. - -- Standardize Inner Tabs under the Settings Page - - Tags and Notifications Improvements: The layout has been revamped for better consistency and clarity. General headers have been removed, and now each item features specific headers to enhance readability. - - - Security Tab Improvements: The redesign features chip tabs for improved navigation and consistency. Filters have been updated to ensure they meet application standards. - - - Tokens Tab Accessibility: Moved the action button to the top of the page to make it more accessible. - - - Refine Connector Icons Display: Improved the display of connector icons for Datastores and Enrichments in the Connections Tab. - -- Streamlined Container Profiling and Scanning - - In the container context, the profile and scan modals have been updated to automatically display the datastore and container, eliminating the need for a selection step and streamlining the process. - -- Swap Order During Check Creation - - Rule Type Positioning: The Rule Type now appears before the container selection, making the form more intuitive. - - - Edit Mode Header: In edit mode, the Rule Type is prominently displayed in the modal header, immediately under the check ID. - -#### General Fixes - -- Address Minor Issues in the Datastore Activity Page - - Operation ID Auto-Search: Restored the auto-search feature by operation ID for URL access, enhancing navigation, especially for Catalog Operations. - - - Tree View Auto-Refresh: Implemented an auto-refresh feature for the tree view, which activates after any operation in the CTA flow (Catalog, Profile, Scan). - -- Fix "Greater Than Field" Quality Check - - Corrected the inclusive property of the greater than field quality check. -- Fix Exporting Field Profiles for Non-Admin User with Write Permission - - Resolved issues for non-admin users with write permissions to allow proper exporting of field profile metadata to enrichment. - -- Fix "Is Replica Of" Quality Check validation on Field Names with Special Characters - - Improved validation logic to handle field names with special characters - -- General Fixes and Improvements - -### 2024.6.7 { id=2024.6.7 } - -#### Feature Enhancements - -- Atlan Integration Improvements - - Enhanced the Atlan assets fetch and external tags syncing. - - Added support for external tag propagation to checks and anomalies. - - Merged Global and External tags section for streamlined tag management. - -- Restart Button for Analytics Engine - - Introduced a new "Restart" button under the Settings - Health section, allowing admins to manually restart the Analytics Engine if it is offline or unresponsive. - -- Interactive Tooltip Component - - Added a new interactive tooltip component that remains visible upon hovering, enhancing user interaction across various modules of the application. - - Refactored existing tooltip usage to integrate this new component for a more consistent user experience. - -- Defaulting to Last-Used Enrichment Datastore for Check Template Exports - - Improved user experience by persisting the last selected enrichment datastore as the default option when exporting a check template. - -#### General Fixes - -- Shared Links Fixes - - Fixed issues with shared operation result links, ensuring that dialogs for scan/profile results and anomalies now open correctly. - - Addressed display inaccuracies in the "Field Profiles Updated" metrics. - -- General Fixes and Improvements - -### 2024.6.4 { id=2024.6.4 } - -#### Feature Enhancements - -- Atlan Data Catalog Integration - - We're excited to introduce integration with Atlan, enabling users to synchronize and manage assets across both Qualytics and Atlan: - - Tag Sync: Sync tags assigned to data assets in Atlan with the corresponding assets in Qualytics, enabling tag-based quality score reporting, notifications, and bulk data quality operations using Atlan-managed tags. - - Metadata Sync: Automatically synchronize Atlan with Qualytics metadata, including asset URL, total score, and factor scores such as completeness, coverage, conformity, consistency, precision, timeliness, volume, and accuracy. - -- Entity Resolution Check - - We've removed the previous limitation on the maximum number of distinct entity names that could be resolved with the Entity Resolution rule type. This release includes various performance enhancements that support an unlimited number of entity names. - -- Enhancements to Catalog Operation Results - - We've improved the catalog operation results by now including detailed information on whether tables, views, or both were involved in each catalog operation. - -- Enhancements to 'Equal to Field' Rule Type - - The 'Equal to Field' rule now supports string values, allowing for direct comparisons between text-based data fields. - -- Enhancements to Enrichment - - Qualytics now includes a property for anomalousRecordCount on shape anomaly, which previously was neither populated nor persisted. This aims to accurately capture and record the total number of anomalous records identified in ShapeAnomaly, regardless of the max_source_records threshold. - -- Dynamic Meta Titles - - Pages such as Datastore Details, Container Details, and Field Details now feature dynamic meta titles that accurately describe the page content and are visible in browser tabs providing better searchability. - -#### General Fixes - -- Fix Trends of Quality Scores on the Insights Page - - Addressed issues with displaying trends on the Insights page. Trends now accurately reflect changes and comparisons to the previous report period, providing more reliable and insightful analytics. - -- Resolved a bug in Entity Resolution where the distinction constraint was only applied to entity names that differed. - -- General Fixes and Improvements - -### 2024.5.22 { id=2024.5.22 } - -#### Feature Enhancements - -- Datastore Connection Updates: - - Users can now update the connection on a datastore if the new one has the same type as the current one. - -- Enrichment Datastore Redirection: - - Enhanced the user interface to facilitate easier redirection to enrichment datastores, streamlining the process and improving user experience. - -- Label Enhancements for Data Completeness: - - Updated labels to better distinguish between completeness percentages and Factor Scores. The label for completeness percentage has been changed to provide clear context when viewed alongside. - -#### General Fixes - -- Rule Type Anomaly Corrections: - - Fixed an issue where the violation messages for record anomalies incorrectly included "None" for some rule types. This update ensures accurate messaging across all scenarios. - -- Shape Anomaly Logic Adjustment: - - Revised the logic for Shape Anomalies to prevent the combination of failed checks for high-count record checks on the same field. This change ensures that displayed sample rows have definitively failed the specific checks shown, enhancing the accuracy of anomaly reporting. - -- Entity Resolution Anomalies: - - Addressed an inconsistency where some Entity Resolution Checks did not return source records. Ongoing investigations and fixes have improved the reliability of finding source records for entity resolution checks across DFS and JDBC datastores. - -- General Fixes and Improvements - - -### 2024.5.16 { id=2024.5.16 } - -#### Feature Enhancements - -- Entity Resolution Check - - Introduced rule "Entity Resolution" to determine if multiple records reference the same real-world entity. This feature uses customizable fields and similarity settings to ensure accurate and tailored comparisons. - -- Support for Rerunning Operations - - Added an option to rerun operations from the operations listing, allowing users to reuse the configuration from previously executed operations. - -#### General Fixes - -- Export Operations - - Fixed metadata export operations silently failing on writing to the enrichment datastores. - -- Computed File/Table Creation - - Resolved an issue that prevented the creation of computed files/tables with the same name as previously deleted ones, even though it is a valid action. - -- General Fixes and Improvements - -### 2024.5.13 { id=2024.5.13} - -#### General Fixes - -- Enhanced Quality Score Factors Computation - - Addressed issues in quality score calculation and its associated factors ensuring accuracy - -- General Fixes and Improvements - -### 2024.5.11 { id=2024.5.11} - -#### Feature Enhancements - -- Introducing Quality Score Factors - - This new feature allows users to control the quality score factor weights at the datastore and container levels. - - Quality Score Detail Expansion: Users can now click on the quality score number to expand its details, revealing the contribution of each factor to the overall score. This enhancement aids in understanding what drives the quality score. - - Insights Page Overhaul: The Insights page has been restructured to better showcase the quality score breakdown. This redesign aims to make the page more informative and focused on quality score metrics. - - Customization of Factor Weights: Users can now customize the weights of different factors at the Datastore and Container levels. This feature is essential for adapting the quality score to meet specific user needs, such as disregarding the Timeliness factor for dimensional tables where it might be irrelevant. - - Enhanced Inferred Checks: Introduced a new property in the Check Listing schema and a feature in the Check modal that displays validity metrics, which help quantify the accuracy of inferred checks. A timezone handling issue in the last_updated property of the Check model has also been addressed. - -- Quality Score UI Enhancements - - Enhancements have been made to the user interface to provide a clearer and more detailed view of the quality score metrics, including Completeness, Coverage, Conformity, Consistency, Precision, Timeliness, Volumetrics, and Accuracy. These changes aim to provide deeper insight into the components that contribute to the overall quality score. - -#### General Fixes - -- Fixes to JDBC Incremental Support - - Updated the conditional logic in the catalog operation for update tables to ensure the incremental identifier is preserved if already established. - -- General Fixes and Improvements - -### 2024.5.2 { id=2024.5.2} - -#### Feature Enhancements - -- Datastore Connections: - - Users can now create connections that can be shared across different datastores. This introduces a more flexible approach to managing connections, allowing users to streamline their workflow and reduce duplication of effort. With shared connections, users can easily reuse common elements such as hostname and credentials across various datastores, enhancing efficiency and simplifying management. - -- File Container Header Configuration: - - Adds support for setting the hasHeader boolean property on File Containers, enabling users to specify whether their flat file data sources include a header row. This enhances compatibility and flexibility when working with different file formats. - -- Improved Error Handling in Delete Dialogs: - - Error handling within delete dialogs has been revamped across the application. Error messages will now be displayed directly within the dialog itself, providing clearer feedback and preventing misleading success messages in case of deletion issues. - -#### General Fixes - -- Locked Template Field Editing: - - Resolves an issue where selecting a new container in the check form would reset check properties, causing problems for locked templates. The fix ensures that checks derived from templates retain their properties, allowing users to modify the field_to_compare field as needed. - -- General Fixes and Improvements - -### 2024.4.25 { id=2024.4.25} - -#### Feature Enhancements - -- Profile Results Modal: - - Introducing a detailed Results Modal for each profile operation. Users can now view comprehensive statistics about the produced container profiles and their partitions, enhancing their ability to analyze data effectively. - -- Checks Synchronized Count: - - The operations list now includes the count of synchronized checks for datastore and explore operations. This addition streamlines the identification of operations, improving user experience. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.4.23 { id=2024.4.23} - -#### Feature Enhancements - -- Introduction of Comparators for Quality Checks: - - Launched new Comparator properties across several rule types, enhancing the flexibility in defining quality checks. Comparators allow users to set margins of error, accommodating slight variations in data validation: - - Numeric Comparators: Enables numeric comparisons with a specified margin, which can be set as either a fixed absolute value or a percentage, accommodating datasets where minor numerical differences are acceptable. - - Duration Comparators: Supports time-based comparisons with flexibility in duration differences, essential for handling time-based data with variable precision. - - String Comparators: Facilitates string comparisons by allowing for variations in spacing, ideal for textual data where minor inconsistencies may occur. - - Applicable to rule types such as Equal To, Equal To Field, Greater Than, Greater Than Field, Less Than, Less Than Field, and Is Replica Of. - -- Introduced Row Comparison in the isReplicaOf Rule: - - Improved the rule to support row comparison by id, enabling more precise anomaly detection by allowing users to specify row identifiers for unique row comparison. Key updates include: - - Revamp of the source record presentation to highlight differences between the left and right containers at the cell level, enhancing visibility into anomalies. - - New input for specifying unique row identifiers, transitioning from symmetric difference to row comparison when set. - - The original behavior of symmetric comparison remains unchanged if no row identifiers are provided. - -- New equalTo Rule Type for Direct Value Comparisons - - Introduced the equalTo rule type, enabling precise assertions that selected fields match a specified value. This new rule not only simplifies the creation of checks for constant values across datasets but also supports the use of comparators, allowing for more flexible and nuanced data validation. - -- Redirect Links for Requested Containers in Operation Details: - - Introduced redirect links in the "Containers Requested" section of operation results. This enhancement provides direct links to the requested containers (such as tables or files), facilitating quicker navigation and streamlined access to relevant operational data. - -- Enhanced Description Input with Expandable Option: - - Implemented an expandable option for the Description input in the Check Form & Template Form. This enhancement allows users to more comfortably manage lengthy text entries, improving the usability of the form by accommodating extensive descriptions without compromising the interface's usability. - -#### General Fixes - -- Addressed Data Preview Timeout Issues: - - Tackled the timeout problems in the data preview feature, ensuring that data retrieval processes complete successfully within the new extended timeout limits. - -- General Fixes and Improvements - -### 2024.4.12 { id=2024.4.12} - -#### Feature Enhancements - -- File Pattern Overrides: - - We have added support in the UI to override a file pattern. Now, a file pattern overwritten by a user will replace the one that the system generated during the first catalog. To have a new file pattern in the UI, users need to perform a new catalog operation without prune. -- Batch Edit in the Check Templates Library:: - - We are now supporting batch edits for check templates in the Library. This enhancement will allow filters and tags. -- Improved Presentation of Incremental, Remediation, and Infer Constraints: - - We have improved the presentation of Incremental, Remediation, and Infer Constraints in the operation listing for catalog, profile, and scan operations. The Incremental, Remediation, and Infer Constraints icons have been added to the list of items, and the visualization of these items has been enhanced. -- Default Placeholders for Computed File in UI: - - We are now automatically populating the form dialog with fields from the selected container. This improvement simplifies the process for users, especially in scenarios where they wish to select or cast specific fields directly from the source container. - -#### General Fixes - -- Tree View Default Ordering: - - We have updated the tree view default ordering. Datastore names are now grouped and presented in alphabetical order. - -- General Fixes and Improvements - -### 2024.4.6 { id=2024.4.6 } - -#### Breaking Changes - -- Remediation Naming Convention Update: - - Updated the naming convention for remediation to `{enrich_container_prefix}_remediation_{container_id}`, standardizing remediation identifiers. - -- Add file extension for DFS Enrichment: - - Introduced `.delta` extension to files in the enrichment process on DFS, aligning with data handling standards. - -#### Feature Enhancements - -- Revamp Enrichment Datastore Main Page: - - Tree View & Data Navigation: Enhanced the enrichment page with an updated tree view that now lists source datastores linked to enrichment datastores, improving navigability. A newly introduced page for enrichment datastore enables: - - Data preview across enrichment, remediation, and metadata tables with the ability to apply "WHERE" filters for targeted insights. - - Direct downloading of preview data as CSV. - - UI Performance Optimization: Implemented UI caching to boost performance, reducing unnecessary network requests and smoothly preserving user-inputted filters and recent data views. - -- User Sorting by Role: - - Introduced a sorting feature in the Settings > Users tab, allowing users to be sorted by their roles in ascending or descending order, facilitating easier user management. - -- Expanded Entity Interaction Options: - - Enhanced entity lists and breadcrumbs with new direct action capabilities. Users can now right-click on an item to access useful functions: copy the entity's ID or name, open the entity's link in a new tab, and copy the entity's link. This enhancement simplifies data management by making essential actions more accessible. - -#### General Fixes - -- Record Quality Scores Overlap Correction: - - Resolved a problem where multiple violations could be open for the same container simultaneously, contrary to logic. This fix ensures violations for containers are uniquely recorded, eliminating parallel open violations. - -- Anomaly Details Text Overflow: - - Corrected text overflow issues in the anomaly details' violation box, ensuring all content is properly contained and readable. - -- Enhanced "Not Found" Warnings with Quick Filters: - - Improved user guidance for Checks and Anomalies list filters by adding hints for "not found" items, suggesting users check the "all" group for unfiltered search results, clarifying navigation and search results. - -- General Fixes and Improvements - -### 2024.3.29 { id=2024.3.29} - -#### Feature Enhancements - -- Data Preview - - Introducing the "Data Preview" tab, providing users with a streamlined preview of container data within the platform. This feature aims to enhance the user experience for tasks such as debugging checks, offering a grid view showcasing up to 100 rows from the container's source. - - Data Preview Tab: Implemented a new tab for viewing container data, limited to displaying a maximum of 100 rows for improved performance. - - Filter Support: Added functionality to apply filter clauses to the data preview, enabling users to refine displayed rows based on specific criteria. - - UI Caching: Implemented a caching layer within the UI to enhance performance and reduce unnecessary network requests, storing the latest refreshed data along with applied filters. - -- Enhanced Syntax Highlight Inputs - - Improved the syntax highlight inputs for seamless inline editing, minimizing the friction of entering expressions. This feature includes a dual-mode capability, allowing users to type directly within the input field or utilize an expanded dialog for more complex entries, significantly improving user experience. - -- Volumetric Measurements - - Periodically measure container volumetrics for a more robust approach. This update focuses on measuring only containers without a volume measure in the last 24 hours and scheduling multiple runs of the job daily. - -- Sort Tags by Color - - Users can now sort tags by color, visually grouping similar colors for easier navigation and management. - -- Download Source Records - - Added a "Download Source Records" feature to the Anomaly view in the UI, allowing users to export data held in the enrichment store for that anomaly in CSV format. - -- Check Templates Navigation - - Implemented a breadcrumb trail for the Check Template page to improve user navigation. - -#### General Fixes - -- Fix Scheduling Issues - - Resolved scheduling issues affecting specific sets of containers, particularly impacting scheduled profile and scan operations. Users must manually add new profiles after catalog operations or computed file/table creation for inclusion in existing scheduled operations. - -- Fix Notifications Loading Issue on Large Screens - - Fixed an issue where the infinity loading feature for the user notification list was not functioning properly on large screens. The fix ensures correct triggering of infinity loading regardless of screen size, allowing all notifications to be accessed properly. - -- General Fixes and Improvements - -### 2024.3.15 { id=2024.3.15} - -#### Feature Enhancements - -- Enhanced Observability - - Automated daily volumetric measurements for all tables and file patterns - - Time-series capture and visualizations for volume, freshness, and identified anomalies -- Overview Tab: - - Introduced a new "Overview" tab with information related to monitoring at the datastore and container level. - - This dashboard interface is designed for monitoring and managing data related to qualytics for datastore and containers. - - Users can see: - - Totals: Quality Score, Tables, Records, Checks and Anomalies - - Total of Quality Checks grouped by Rule type - - Data Volume Over Time: A line graph that shows the total amount of data associated with the project over time. - - Anomalies Over Time: A line graph that shows the number of anomalies detected in the project over time. - -- Datastore Field List Update: - - The datastore field profiles list has been updated to match the existing list views design. - - All card-listed pages now display information in a column format, conditionally using scrolling for smaller and larger screens. - - Now the field details will show on a modal with Profiling and Histogram - -- Heatmap Simplification: - - Simplified the heatmap to consider only operations counted. - -- Datastore Metrics: - - Improved distinction between 0 and null values in the datastore metrics (total records, total fields, etc). - -- Explore Page Update: - - Added new metrics to the Explore page. - - We are now adding data volume over time (records and size). - - Improved distinction between 0 and null values in metrics (total records, total fields, etc). - -#### General Fixes - -- UI Wording and Display for Cataloged vs Profiled Fields: - - Addressed user confusion surrounding the display and wording used to differentiate between fields that have been cataloged versus those that have been profiled. - - Updated the messaging within the tree view and other relevant UI components to accurately reflect the state of fields post-catalog operation. - - Implemented a clear distinction between non-profiled and profiled fields in the field count indicators. - - Conducted a thorough review of the CTAs and descriptive text surrounding the Catalog, Profile, and Scan operations to improve clarity and user understanding. - -- General Fixes and Improvements - -### 2024.3.7 { id=2024.3.7} - -#### General Fixes - -- Corrected MatchesPattern Checks Inference: - - Fixed an issue where the inference engine generated MatchesPattern checks that erroneously asserted false on more than 10% of training data. This resolution ensures all inferred checks now meet the 99% coverage criterion, aligning accurately with their training datasets. - -- Fixed Multi-Field Check Parsing Error in DFS: - - Addressed a bug in DFS environments that caused parsing errors for checks asserting against multiple fields, such as AnyNotNull and NotNull, when selected fields contained white spaces. This resolution ensures that checks involving multiple fields with spaces are now accurately parsed and executed. - -- Volumetric Measurements Tracking Fix: - - Addressed a bug that prevented the recording of volumetric measurements for containers without a last modified time. This fix corrects the problem by treating last_modification_time as nullable, ensuring that containers are now accurately tracked for volumetric measurements regardless of their modification date status. - -- General Fixes and Improvements - -### 2024.3.5 { id=2024.3.5} - -#### Feature Enhancements - -- Check Validation Improvement: - - Enhanced the validation process for the "Is Replica Of" check. Previously, the system did not validate the field name and type, potentially leading to undetected issues until a Scan Operation was executed. Now, the validation process includes checking the field name and type, providing users with immediate feedback on any issues. - -#### General Fixes - -- Matches Pattern Data Quality Check Handling White Space: - - Resolved a bug in the Matches Pattern data quality check that caused white space to be ignored during training. With this fix, the system now accounts for white space during training, ensuring accurate pattern inference even with data containing significant white space. If 1% or more of the training data contains blanks, the system will derive a pattern that includes blanks as a valid value, improving data quality assessment. - -- General Fixes and Improvements - -### 2024.2.28 { id=2024.2.28 } - -#### Feature Enhancements - -- User Token Management: - - Transitioned from Generic Tokens to a more robust User Token system accessible under Settings for all users. This enhancement includes features to list, create, revoke, and delete tokens, offering granular control of API access. User activities through the API are now attributable, aligning actions with user accounts for improved accountability and traceability. - -#### General Fixes - -- Datetime Validation in API Requests: - - Strict validation of datetime entries in API requests has been implemented to require the Zulu datetime format. This update addresses and resolves issues where incomplete datetime entries could disrupt Scan operations, enhancing API reliability. - -- Context-Aware Redirection Post-Operation: - - Enhanced the operation modal redirect functionality to be context-sensitive, ensuring that users are directed to the appropriate activity tab after an operation, whether at the container or datastore level. This enhancement ensures a logical and intuitive post-operation navigation experience. - -- Template Details Page Responsiveness: - - Addressed layout issues on the Template Details page caused by long descriptions. Adjustments ensure that the description section now accommodates larger text volumes without disrupting the page layout, maintaining a clean and accessible interface. - -- General Fixes and Improvements - -### 2024.2.23 { id=2024.2.23 } - -#### Feature Enhancements - -- Introduction of Operations Management at the Table/File Level: - - The Activity tab has been added at the table/file level, extending its previous implementation at the source datastore level. This update provides users with the ability to view detailed information on operations for individual tables/files, including scan metrics, and histories of operation runs and schedules. It enhances the user's ability to monitor and analyze operations at a granular level. - -- Enhanced Breadcrumb Navigation UX: - - Breadcrumb navigation has been improved for better user interaction. Users can now click on the breadcrumb representing their current context, enabling more intuitive navigation. In addition, selecting the Source Datastore breadcrumb takes users directly to the Activity tab, streamlining the flow of user interactions. - -#### General Fixes - -- Improved Accuracy in Profile and Scan Metrics: - - Enhanced the accuracy of metrics for profiled and scanned operations by excluding failed containers from the count. Now, metrics accurately reflect only those containers that have been successfully processed. - -- Streamlined input display for Aggregation Comparison rule in Check/Template forms: - - Removed the "Coverage" input for the "Aggregation Comparison" rule in Check/Template Forms, as the rule does not support coverage customization. This simplification helps avoid confusion during rule configuration. - -- Increased Backend Process Timeouts: - - In response to frequent timeout issues, the backend process timeouts have been adjusted. This change aims to reduce interruptions and improve service reliability by ensuring that processes have sufficient time to complete. - -- General Fixes and Improvements - -### 2024.2.19 { id=2024.2.19 } - -#### Feature Enhancements - -- Support for exporting Check Templates to the Enrichment Datastore: - - Added the ability to export Check Library metadata to the enrichment datastore. This feature helps users export their Check Library, making it easier to share and analyze check templates. - -- File Upload Size Limit Handling: - - Implemented a user-friendly error message for file uploads that exceed the 20MB limit. This enhancement aims to improve user experience by providing clear feedback when the file size limit is breached, replacing the generic error message previously displayed. - -#### General Fixes - -- Resolved Parsing Errors in Expected Values Rule: - - Fixed an issue where single quotes in the list of expected values caused parsing errors in the Analytics Engine, preventing the Expected Values rule from asserting correctly. This correction ensures values, including those with quotes or special characters, are now accurately parsed and asserted. - -- General Fixes and Improvements - -### 2024.2.17 { id=2024.2.17} - -#### General Fixes - -- Corrected Typing for Expected Values Check: - - Resolved an issue with the expectedValues rule, where numeric comparisons were inaccurately processed due to a misalignment between the API and the analytics engine. This fix ensures numeric values are correctly typed and compared, enhancing the reliability of validations. - -- Fixed Anomaly Filtering in Scan Results dialog: - - Addressed a flaw where scan results did not consistently filter anomalies based on the operation ID. The fix guarantees that anomalies are only displayed once the operation ID parameter is accurately defined in the URL, ensuring more precise and relevant scan outcome presentations. - -- Check Validation Sampling Behavior Adjustment: - - Fixed intermittent validation issues encountered in specific source datastore types (DB2, Microsoft SQL Server). The problem, where validation could unpredictably fail or succeed based on container size, was corrected by fine-tuning the sampling method for these technologies, leading to consistent validation performance. - -- General Fixes and Improvements - -### 2024.2.15 { id=2024.2.15} - -#### Feature Enhancements - -- UX Improvements for Profile and Scan Operation Dialogs: - - Implemented significant UX enhancements to Profile & Scan Operation Dialogs for improved clarity and user flow. Key improvements include: - - Visibility of incremental fields and their current starting positions in Scan Operation dialogs. - - Logical reordering of Profile and Scan Operation steps to align with user workflows, including prioritizing container selection and clarifying the distinction between "Starting Threshold" and "Limit" settings. - - Simplified operation initiation, allowing users to start operations directly before the final scheduling step, streamlining the process for immediate execution. - -- Naming for Scheduled Operations: - - Added a name field to scheduled operations, enabling users to assign descriptive names or aliases. This feature aids in distinguishing and managing multiple scheduled operations more effectively. - -- Container Name Filters for Operations: - - Provided filtering options for operations and scheduled operations by container name, improving the ability to quickly locate and manage specific operations. - -- Improved Design for Field Identifiers in Tooltips: - - The design of field identifiers within tooltips has been refined for greater clarity. Enhancements focus on displaying Grouping Fields, Excluded Fields, Incremental Fields, and Partition Fields, aiming to offer users a more intuitive experience. - -#### General Fixes - -- External Scan Rollup Threshold Correction: - - Fixed an issue in external scans where the rollup threshold was not applied as intended. This correction ensures that anomalies exceeding the threshold are now accurately consolidated into a single shape anomaly, rather than being reported as multiple individual record anomalies. - -- Repetitive Release Notification and Live Update Fixes: - - Resolved a recurring issue with release notifications continually prompting users to refresh despite acknowledgment. Additionally, it restored the live update notifications' functionality, ensuring users are correctly alerted to new features while actively using the system, with suggestions for a hard refresh to access the latest version. - -- Corrected Field Input Logic in Check & Template Forms: - - Addressed a logic error that incorrectly disabled field inputs for certain rules in check and template forms. This correction re-enables the necessary field input, removing a significant barrier that previously prevented users from creating checks affected by this issue. - -- Addressed Absence of Feedback for No-Match Field Filters on Explore Page: - - Rectified the absence of feedback when field filters on the Explore Page yield no results, ensuring users receive a clear message indicating no items match the specified filter criteria. - -- General Fixes and Improvements - -### 2024.2.10 { id=2024.2.10} - -#### Feature Enhancements - -- Immediate Execution Option for Scheduled Operations: - - Introduced a "Run Now" feature for scheduled operations, enabling users to execute operations immediately without waiting for the scheduled time. This addition provides flexibility in operation management, ensuring immediate execution as needed without altering the original schedule. - -- Simplified Customization of Notification Messages: - - Removed the "use custom message" toggle from the notification form, making the message input field always editable. This change simplifies the user interface and improves usability by allowing direct editing of notification messages. - - Enhanced default messages for each notification trigger type have also been implemented to improve clarity. - -- Performance Improvement in User Notifications Management: - - Implemented infinite scrolling pagination for the user notifications side panel. This update addresses performance issues with loading large numbers of notifications, ensuring a smoother and more responsive experience for users with extensive notification histories. - -- Enhanced Archive Template Confirmation: - - Updated the archive dialog for templates to include information on the number of checks associated with archiving the template. This enhancement ensures users are aware of the impact of checks linked to the template, promoting informed decision-making. - -- Improved Interaction with Computed Tables: - - Refined the Containers list UX to allow navigation to container details immediately after the creation of a computed table, addressing delays caused by background profiling. This improvement ensures users can access computed table details without waiting for the profile operation to complete, drawing inspiration from Tree View functionality for a more seamless experience. - -#### General Fixes - -- General Fixes and Improvements - -### 2024.2.2 { id=2024.2.2} - -#### Feature Enhancements - -- Excluded Fields Inclusion in Drop-downs: - - Refined container settings to incorporate previously excluded fields in the dropdown list, enhancing user flexibility. In addition, a warning message has been added to notify users if a profile operation is required when deselecting excluded fields that were previously selected. - -#### General Fixes - -- Linkable Scan Results for Direct Access: - - Made Scan Results dialogs accessible via direct URL links, addressing previous issues with broken anomaly notification links. This enhancement provides users with a straightforward path to detailed scan outcomes. - -- Property Display Refinement for Various Field Types: - - Corrected illogical property displays for specific field types like Date/Timestamp. The system now intelligently displays only properties relevant to the selected data type, eliminating inappropriate options. This update also includes renaming 'Declared Type' to 'Inferred Type' and adjusting the logic for accurate representation. - -- Timezone Consistency in Insights and Activity Pages: - - Implemented improvements in timezone handling across Insights and Activity pages. These changes ensure that date aggregations are accurately aligned with the user's local time, eliminating previous inconsistencies compared to the Operations list results. - -- Fixed breadcrumb display in the datastore for members with restricted permissions - - Enhanced the datastore interface to address issues faced by members with limited permissions. This update also fixes misleading breadcrumb displays and ensures that correct datastore enhancement information is visible. - -- Resolved State Issue in Bulk Check Archive: - - Addressed a bug in the bulk selection process for archiving checks. The fix corrects an issue where the system recognized individual selections instead of the intended group selection due to an overlooked edge case. - -- Improved Operation Modal State Management: - - Tackled state management inconsistencies in Operation Modals. Fixes include resetting the remediation strategy to its default and ensuring 'include' options do not carry over previous states erroneously. - -- Eliminating Infinite Load for Non-Admin Enrichment Editing: - - Solved a persistent loading issue in the Enrichment form for non-admin users. Updates ensure a smoother, error-free interaction for these users, improving accessibility and functionality. - -- General Fixes and Improvements - -### 2024.1.30 { id=2024.1.30} - -#### Feature Enhancements - -- Enhanced External Scan Operations: - - Improved data handling in External Scans by applying type casting to uploaded data using Spark. This update is particularly significant for date-time fields, which now expect and conform to ISO 8601 standards. - -- Optimized DFS File Reading: - - Streamlined file reading in DFS by storing and utilizing the 'file_format' identified during the Catalog operation. This change eliminates the need for repeated format inspection on each read, significantly reducing overhead, especially for partitioned file types. - -#### General Fixes - -- Resolved DFS Reading Issues with Special Character Headers: - - Fixed a DFS reading issue where columns with headers containing special characters (like pipes |) adversely affected field profiling, including inaccuracies in histogram generation. - -- General Fixes and Improvements - -### 2024.1.26 { id=2024.1.26} - -#### Feature Enhancements - -- Incremental Scan Starting Threshold: - - Introduced a "Starting Threshold" option for incremental Scans. This feature allows users to manually set a starting value for the incremental field in large tables, bypassing the need to scan the entire dataset initially. It's handy for first-time scans of massive databases, facilitating more efficient and targeted data scanning. - -- Add Support for Archiving Anomalies: - - Implemented the capability of archiving anomalies. Users can now remove anomalies from view without permanently deleting them, providing greater control and flexibility in anomaly management. - -- External Scan Operation for Ad hoc Processes: - - Introduced 'External Scan Operation' as a new feature enabling ad hoc data validation for all containers. This operation allows users to validate ad hoc data, such as Excel or CSV files, against a container's existing checks and enrichment configuration. The provided file's structure must align with the container's schema, ensuring a seamless validation process. - -#### General Fixes - -- Preventing Unrelated Entity Selection in Check Form: - - Fixed an issue in the Check Form where users could inadvertently select unrelated entities. Selecting datastores, containers, and fields is restricted during any ongoing data loading, preventing mismatched entity selections. - -- Performance enhancements for BigQuery and Snowflake removing the need for count operations during full table analysis - -- General Fixes and Improvements - -### 2024.1.23 { id=2024.1.23} - -#### Feature Enhancements - -- Introduction of 'Expected Schema' Rule for Advanced Schema Validation: - - Introduced the 'Expected Schema' rule, replacing the 'Required Fields' rule. This new rule asserts that all selected fields are present and their data types match predefined expectations, offering more comprehensive schema validation. It also includes an option to validate additional fields added to the schema, allowing users to specify whether the presence of new fields should cause the check to fail. - -- Refined Tree Navigation Experience: - - Updated the tree navigation to prevent automatic expansion of nodes upon selection and eliminated the auto-reset behavior when re-selecting an active node. These changes provide a smoother and more user-friendly navigation experience, especially in tables/files with numerous fields. - -- Locked/Unlocked Status Filter in Library Page: - - Added a new filter feature to the Library page, enabling users to categorize and view check templates based on their Locked or Unlocked status. This enhancement simplifies the management and selection of templates. - -- Improved Messaging for Locked Template Properties in Check Form: - - Enhanced the Check Form UX by adding informative messages explaining why certain inputs are disabled when a check is associated with a locked template. This update enhances user understanding and interaction with the form. - -#### General Fixes - -- Corrected Insights Metrics for Check Templates: - - Fixed an issue where check templates were incorrectly counted as checks in related metrics and counts on the Insights page. Templates are now appropriately filtered out, ensuring accurate representation of check-related data. - -- Enabled Template Creation with Calculated Rules: - - Resolved a limitation that prevented the creation of templates using calculated rules like 'Satisfies Expression' and 'Aggregation Comparison'. This fix expands the capabilities and flexibility of template creation. - -- General Fixes and Improvements - -### 2024.1.11 { id=2024.1.11} - -#### Feature Enhancements - -- Introduction of Check Templates: - - Implemented Check Templates to offer a balance between flexibility and consistency in quality check management. Checks can now be associated with templates in either a 'locked' or 'unlocked' state, allowing for synchronized properties or independent customization, respectively. This feature streamlines check management and enables efficient tracking and review of anomalies across all checks associated with a template. - -- isType Rule Implementation: - - Replaced the previous dataType rule with the new isType rule for improved accuracy and understanding. The isType rule is now specifically tailored to assert only against string fields, enhancing its applicability and effectiveness. - -- Enhanced Container Details Page with Identifier Icons: - - Updated the Container Details page to display icons for key container identifiers, including Partition Field, Grouping Fields, and Exclude Fields. This enhancement provides a more intuitive and informative user interface, facilitating easier identification and understanding of container characteristics. - -#### General Fixes - -- Notification System Reliability Improvement: - - Fixed intermittent failures in the notifications system. Users will now receive reliable notifications for identified anomalies, ensuring timely awareness and response to data irregularities. - -- Safeguard Against Overlapping Scheduled Operations: - - Implemented a mechanism to prevent the overloading of deployments due to overlapping scheduled operations. If a scheduled operation doesn’t complete before its next scheduled run, the subsequent run will be skipped, thereby avoiding potential strain on system resources. - -- Correction of Group-by Field Display in Containers: - - Resolved an issue where selected grouping fields were not appearing in the list fields of a container. This fix ensures that user-specified fields for group-by operations are correctly displayed, maintaining the integrity of data organization and analysis. - -- General Fixes and Improvements - -### 2024.1.4 { id=2024.1.4} - -#### Feature Enhancements - -- Enhanced Warnings for Schema Inconsistencies in Files Profiled - - Improved the warning message for cases where the user profiles files with different schemas under a single glob pattern. This update ensures users receive clear, helpful information when files within a glob have inconsistent structures. - -#### General Fixes - -- Containers with 'Group By' settings Leading to Erroneous Profile Operation - - Fixed an issue affecting profile operations which included containers with 'Group By' settings. Previously, running a profile without inferring checks resulted in all fields being erroneously removed from the field list. - +--- +render_macros: false +--- + +# 2024 + +## Release Notes + +### 2024.12.23 { id=2024.12.23 } + +#### Feature Enhancements + +- User and Teams Permissions + - We are excited to introduce an enhancement to User and Team Permissions. + - Users can now have `Admin`, `Manager`, or `Member` roles. + - The Manager role provides a subset of Admin permissions for global assets or settings but does not include the "Admin exemption to team roles." + - Teams can have specific permissions: `Editor`, `Author`, `Drafter`, `Viewer`, and `Reporter`. + - Each permission type includes restricted capabilities tailored to its role. + - Admins can now create special tokens that grant access exclusively to SCIM endpoints. These tokens allow customers to enable SCIM integrations with minimal access, ensuring the holder cannot access other endpoints or log in to the platform. + +- Improve Visibility of Datastore Teams + - Users can now view respective teams in the tree view footer. Depending on privileges, they can manage this field. + - Teams are also visible in the table and field context for improved collaboration and data transparency. + +#### General Fixes + +- Completeness Rounding + - Added two more decimal places to the Completeness metric in the Overview tab. + - Previously, percentages were being rounded up incorrectly. + +- "Is Replica Of" Check Validation + - Fixed a bug that occurred when users attempted to validate this check using the same container. + +- Global Search + - Fixed the label to better distinguish between Enrichment Datastores and Source Datastores. + +- General Fixes and Improvements. + +### 2024.12.11 { id=2024.12.11 } + +#### Feature Enhancements + +- Add `Max Parallelization` Field on Datastore Connection + - Users can now configure the maximum parallelization level for certain datastores, providing greater control over operation performance. + +#### General Fixes + +- General Fixes and Improvements. + +### 2024.11.29 { id=2024.11.29 } + +#### Feature Enhancements + +- Activity List + - Removed the `Warning` status for a cleaner and more concise status display. + - Added an alert icon to indicate if an operation completed with warnings, improving visibility into operation outcomes. + +#### General Fixes + +- Better handling of Oracle Date and Numeric columns during Catalog operations for improved partition field selection. +- General Fixes and Improvements. + +### 2024.11.21 { id=2024.11.21 } + +#### Feature Enhancements + +- Improved Operations Container Dialogs + - Added container status details based on profile and scan results, providing better visibility of container-level operations. + - Introduced a loading tracker component for containers, enhancing feedback during operation processing. + - Made the entire modal reactive to operation updates, enabling real-time tracking of operation progress within the modal. + - Removed "containers requested" and "containers analyzed" dialogs for a cleaner interface. + +#### General Fixes + +- Resolved an issue where the table name was not rendering correctly in notifications when using the `{{customer_name}}` variable. + +- General Fixes and Improvements. + +### 2024.11.12 { id=2024.11.12 } + +#### Feature Enhancements + +- Enhance Data Catalog Integration + - Introduced a new domain input field that allows users to select specific domains, enabling more granular control over assets synchronization. + +- Scan Results Enhancements + - Added partition label to the scan results modal for improved partition identification. + - Removed unnecessary metadata partitions created solely for volumetric checks, reducing clutter in scan results. + +- Activity Tab + - Display of Unprocessed Containers in the Operation List + - Unprocessed containers are now visible in the operation list within the operation summary. + - A total count label was added to indicate if the number of analyzed containers exceeds the total requested. + - The search icon now highlights in a different color if not all containers were analyzed, making it easier to identify incomplete operations. + - Reorder the Datastore Column in the Activity Tab + - Users can now reorder columns in the Activity tab for easier navigation and data organization. + - Profile Operations + - Users can now view added, updated, and total inferred checks within Profile operations. + - Triggered by Column + - Updated the term "Triggered by API" to "Triggered by System" for clarity. + +#### General Fixes + +- General Fixes and Improvements. + +### 2024.11.1 { id=2024.11.1 } + +#### Feature Enhancements + +- Observability Enhancements + - An observability heatmap was added to the volumetric card in the Observability tab. + - The heatmap allows users to monitor volumetric status and check for new anomalies. + - Improved observability chart for clearer insights. + - Users can now view the count of volumetric anomalies produced over time, along with the last recorded measurements for each period. + - Introduced new color indicators to help distinguish volumetric measures outside thresholds that didn’t produce anomalies from those that did. + +- Editable Tags in Field Details + - Users with write permissions can now manage tags directly in the Field Details within the Explore context. + +- Distinct Count Rule Update + - The Distinct Count rule now excludes the Coverage field for more accurate assessments. + +- Support for Pasting into Expected Values + - Users can now paste values from spreadsheets directly into Expected Values, saving time on data entry. + +#### General Fixes + +- General Fixes and Improvements. + +### 2024.10.23 { id=2024.10.23 } + +#### Feature Enhancements + +- Dremio Connector + - We’ve expanded our connectivity options by supporting a new connection with Dremio. + +- Full View of Abbreviated Metrics in Operation Summary + - Users can now hover over abbreviated metrics to see the full value for better clarity. + +- Redirect to Conflicting Check + - Added a redirect link to the conflicting check from the error message, improving navigation when addressing errors. + +- Enhanced Visibility and Engagement for Tags and Notifications Setup + - Introduced a Call to Action to encourage users to manage Tags and Notifications for better engagement. + +- Favorite Containers + - Users can now favorite individual containers. + - The option to favorite datastores and containers is now available in both card and list views. + +#### General Fixes + +- General Fixes and Improvements. + +### 2024.10.16 { id=2024.10.16 } + +#### Feature Enhancements + +- Improved Anomaly Modal + - Introduced an information icon in each failed check to display the check's description. + - Anomaly links now persist filters for sort order and displayed fields. + - Added integration details to fields in a source record. + +- Secrets Management + - Added support for Secrets Manager in connection properties, enabling integration with Vault and other secrets management systems. + +- Alation Data Dictionary + - Enhanced the dictionary to display friendly names in anomaly screens for improved usability. + - Added integration information to the datastore, container, and fields in the tree view footer. + +- Tag Category + - Introduced support for tag categories to improve tag management, with sorting and filtering options based on the category field. + +- Call to Action for Volumetric Measurements + - A call to action was added in the overview tab within the container context, and the observability page per container was added to enable volumetric measurements. + +- Error Display for Check Operations + - Bulk operations like Edit, Activate, Update, and Template Edit now display error messages clearly when validation fails. + +- Check Validation + - Improved check validation logic to enhance bulk check validation speed and prevent timeouts. + +- Tag Filtering for Fields + - Users can now filter fields by tags in the field list under the datastore context. + +- Field Remarks in Native Field Properties + - Added support for displaying field remarks alongside other native field properties. + +- Customer Support Link + - Users can now access the Qualytics Helpdesk via the Discover menu in the main header. + +#### General Fixes + +- General Fixes and Improvements. + +### 2024.10.4 { id=2024.10.4 } + +#### Feature Enhancements + +- Insights Page Redesign + - Introduced a new Overview card displaying key metrics such as `Data Under Management`, `Source Datastores`, and `Containers`. + - Added a doughnut chart visualization for checks and anomalies, providing a clearer view of data health. + - Expanded available metrics to include profile runs and scan runs. + - Users can now easily navigate to Checks and Anomalies based on their current states and statuses. + - Implemented data volume visualizations to give users better insight into data trends. + - Introduced a legend option that allows users to compare specific metrics against the primary one. + - Enhanced the check distribution visualization across the platform within the overview tabs. + +- Check Filter + - Now users can filter `Not Asserted` checks. + +- Team Management + - Now admin users can modify the `Read` and `Write` permissions of the `Public` Team. + +- Reapplying Clone Field + - Check cloning functionality by attempting to reapply the field from the original (source) check when a new container is selected. If the selected container matches the field and type from the original check, the cloned field will be reapplied automatically. + +#### General Fixes + +- Allow saving checks with attached templates as drafts + - Adjusted the behavior to allow checks attached to a template to be saved as drafts. The `Save as draft` feature now remains functional when a template is attached. + +- Incremental identifier strange behavior + - When a user tries to modify a query in a computed table, the Incremental Modifier is set to null. + +- General Fixes and Improvements + +### 2024.9.25 { id=2024.9.25 } + +#### Feature Enhancements + +- Observability + - Time-series charts are presented to monitor data volume and related anomalies for each data asset. + - Custom thresholds were added to adjust minimum and maximum volume expectations. + - The Metrics tab has been moved to the Observability tab. + - The Observability tab has replaced the Freshness page. + +- Check Category Options for Scan Operations + - Users can select one or multiple check categories when running a scan operation. + +- Anomaly Trigger Rule Type Filter + - Added a filter by check rule types to anomaly triggers. A help component was added to the tags selector to improve clarity. + +- Auto-Archive Anomalies + - A new Duplicate status has been introduced for anomalies. + - Users can now use Incremental Identifier ranges to auto-archive anomalies with the new Duplicate status. + - An option has been added to scan operations to automatically archive anomalies identified as duplicates if the containers analyzed have incremental identifiers configured. + - A dedicated tab for filtering duplicate anomalies has been added for better visibility. + +- Tree View and Breadcrumb Context Menu + - A context menu has been added, allowing users to copy essential information and open links in new tabs. + - Users can access the context menu by right-clicking on the assets. + +- Incremental Identifier Support + - Users can manage incremental identifiers for computed tables and computed files. + +- Native Field Properties + - Users can now see native field properties in the field profile, displayed through an info icon next to the Type Inferred section. + +- Qualytics CLI Update + - Users can now import check templates. + - A status filter has been added to check exports. Users can filter by `Active`, `Draft`, or `Archived` (which will include `Invalid` and `Discarded` statuses). + +#### General Fixes + +- The Oracle connector now handles invalid schemas when creating connections. +- Anomalies identified in scan operations were not counting archived statuses. +- Improved error message when a user creates a schedule name longer than 50 characters. +- General Fixes and Improvements. + +#### Breaking Changes + +- Freshness and SLA references have been removed from user notifications and notification rules, users should migrate to Observability using volumetric checks. + +### 2024.9.14 { id=2024.9.14 } + +#### Feature Enhancements + +- Volumetric Measurement + - We are excited to introduce support for volumetric measurements of views, computed tables and computed files. + +- Enhanced Source Record CSV Download + - Users can now download all source records as CSV that have been written to the enrichment datastores. + +- Tags and Notifications Moved to Left-Side Navigation + - Users can now quickly switch between Tags, Notifications, and Data Assets through the left-side navigation. + - Access to the Settings page is restricted to admin users. + +- Last Asserted Information in Checks + - The `Created Date` information has been replaced with `Last Asserted` to improve visibility. + - Users can hover over an info icon to view the `Created Date`. + +- Auto-Generated Description in Check Template Dialog + - Descriptions are now automatically generated in the Template Dialog based on the rule type, ensuring consistency with the check form. + +- Exposed Properties in Profile and Scan Operations + - Profile and scan operations now expose properties when listed: + - Record Limit + - Infer As Draft + - Starting Threshold + - Enrichment Record Limit + +#### General Fixes + +- Fixed a bug where the container list would not update when a user created a computed container. +- Fixed an issue where deactivated users were not filtered on the Settings page under the Security tab. +- Improved error messages when operations fail. +- Fixed a bug where the `Last Editor` field was empty after a user was deactivated by an admin. +- General Fixes and Improvements. + +### 2024.9.10 { id=2024.9.10 } + +#### Feature Enhancements + +- Add Source Datastore Modal + - Enhanced text messages and labels for better clarity and user experience. + +- Add Datastore + - Users can now add a datastore directly from the Settings page under the Connections tab, simplifying connection management. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.9.6 { id=2024.9.6 } + +#### Feature Enhancements + +- Introducing Bulk Activation on Draft Checks + - Users can now activate and validate multiple draft checks at once, streamlining the workflow and reducing manual effort. + +#### General Fixes + +- Improved error message for BigQuery temporary dataset configuration exceptions. + +- Added a retry operation for Snowflake when no active warehouse is selected in the current session. + +- General Fixes and Improvements + +#### Breaking Changes + +- API fields (`type` and `container_type`) are now mandatory in request payloads where they were previously optional. + - POST /global-tags: `type` is now required. + - PUT /global-tags/{name}: `type` is now required. + - POST /containers: `container_type` is now required. + - PUT /containers/{id}: `container_type` is now required. + - POST /operations/schedule: `type` is now required. + - PUT /operations/schedule/{id}: `type` is now required. + - POST /operations/run: `type` is now required. + +### 2024.9.3 { id=2024.9.3 } + +#### Feature Enhancements + +- Introducing Catalog Scheduling + - Users can now schedule a Catalog operation like Profile and Scan Operations, allowing automated metadata extraction. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.8.31 { id=2024.8.31 } + +#### Feature Enhancements + +- New Draft Status for Checks + - Introduced a new 'draft' status for checks to enhance lifecycle management, allowing checks to be prepared and reviewed without impacting scan operations. + - Validation is only applied to active checks, ensuring draft checks remain flexible for adjustments without triggering automatic validations. + +- Introduce Draft Check Inference in Profile Operations + - Added a new option to infer checks as drafts, offering more flexibility during data profiling. + +- Improve Archive Capabilities for Checks and Anomalies + - Enhanced the archive capabilities for both checks and anomalies, allowing recovery of archived items. + - Introduced a hard delete option that allows permanent removal of archived items, providing greater control over their management. + - The Anomaly statuses 'Resolved' and 'Invalid' are now treated as archived states, aligning with the consistent approach used for checks. + +- Introduce a new Volumetric Check + - Introduced the Volumetric Check to monitor and maintain data volume stability within a specified range. This check ensures that the volume of data assets does not fluctuate beyond acceptable limits based on a moving daily average. + - Automatically inferred and maintained by the system for daily, weekly, and monthly averages, enabling proactive management of data volume trends. + +- Incremental Identifier Warning in Scan Dialog + - Enhanced the dialog to notify users when they attempt an incremental scan on containers lacking an incremental identifier, ensuring transparency and preventing unexpected full scans. + +#### General Fixes + +- Improve enrichment writes with queuing all writes (up to a queue threshold) for the entire scan operation. This will dramatically reduce the number of write operations performed. + +- Explicit casting to avoid weak CSV parser support for typing. + +- General Fixes and Improvements + +### 2024.8.19 { id=2024.8.19 } + +#### Feature Enhancements + +- Enhance Auto-Refresh Mechanism on Tree View + - The datastore and container tree footers are now automatically refreshed after specific actions, eliminating the need for manual page refreshes. + +- Support Oracle Client-Side Encryption + - Connections with Oracle now feature end-to-end encryption. Database connection encryption adds an extra layer of protection, especially for transmissions over long-distance, insecure channels. + +#### General Fixes + +- UI Label on Explore Page + - Fixed an issue where the labels on the Explore page did not change based on the selected time frame. + +- Inferred Field Type Enhancements + - Behavior updated to infer field types at data load time rather than implicitly cast them to latest profiled type. This change supports more consistent expected schema verification for delimited file types and resolves issues when comparing inferred fields to non-inferred fields in some rule types. + +- Boolean Type Inference + - Behavior updated to align boolean inference with Spark Catalyst so that profiled types are more robustly handled during Spark based comparisons + +- General Fixes and Improvements + +### 2024.8.10 { id=2024.8.10 } + +#### Feature Enhancements + +- Introducing Profile Inference Threshold + - This feature allows users to adjust which check types will be automatically created and updated during data profiling, enabling them to manage data quality expectations based on the complexity of inferred data quality rules. +- Anomaly Source Records Retrieval Retry Option + - Enabled users to manually retry fetching anomaly source records when the initial request fails. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.7.31 { id=2024.7.31 } + +#### Feature Enhancements + +- Introducing Field Count to the Datastore Overview + - This enhancement allows users to easily view the total number of fields present in a datastore across all containers. + +- Search Template + - Added a check filter to the templates page. + - Added a template filter to the checks page in the datastore context and explore. + +- Driver Free Memory + - Added driver free memory information on the Health Page. + +- Anomalous Record Count to the Anomaly Sidebar Card + - Added the anomalous record count information to the anomaly sidebar card located under the Scan Results dialog. + +#### General Fixes + +- Enhanced write performance on scan operations with enrichment and relaxed hard timeouts. + +- Updated Azure Blob Storage connector to use TLS encrypted access by default. + +- Overview Tab is not refreshing asset details automatically. + +- General Fixes and Improvements + +### 2024.7.26 { id=2024.7.26 } + +#### Feature Enhancements + +- Introducing Event Bus for Extended Auto-Sync with Data Catalog Integrations + - We are excited to expand our auto-sync capabilities with data catalog integrations by implementing an event bus pattern. + - Added functionality to delete any DQ values that do not meet important checks. + - Included support for a WARNING status in the Alation Data Health tab for checks that have not been asserted yet. + +- Add Autocomplete to the Notification Form + - Improved the notification message form by implementing autocomplete. Users can now easily include internal variables when crafting custom messages, streamlining the message creation process. + +- Redesign the Analytics Engine Functions + - The functions are now accessible through a menu, which displays the icon and full functionality. + - Added a modal to alert users before proceeding with the restart. The modal informs users that the system will be unavailable for a period during the restart process. + +- Improve Qualytics metadata presentation in Alation + - Previously, multiple custom fields were used to persist data quality metrics measured by Qualytics. This process has been simplified by consolidating the metrics into a single rich text custom field formatted in HTML, making it easier for users to analyze the data. + +#### General Fixes + +- Normalize Enrichment Internal Containers + - To improve user recognition and differentiate between our internal tables and those in source systems, we now preserve the original case of table names. + +- Validation Error on Field Search Result + - Resolved the logic for cascade deletion of dependencies on containers that have been soft deleted, ensuring proper handling of related data. + +- Members Cannot Add Datastore on the Onboarding Screen + - Updated permissions so that members can no longer add Datastores during the onboarding process. Only Admins now have this capability. + +- General Fixes and Improvements + +### 2024.7.19 { id=2024.7.19 } + +#### Feature Enhancements + +- Global Search + - We are thrilled to introduce the “Global Search” feature into Qualytics! This enhancement is designed to streamline the search across the most crucial assets: Datastores, Containers, and Fields. It provides quick and precise search results, significantly improving navigation and user interaction. + - Navigation Update: To integrate the new global search bar seamlessly, we have relocated the main menu icons to the left side of the interface. This adjustment ensures a smoother user experience. +- Teradata Connector + - We’ve expanded our connectivity options by supporting a new connection with Teradata. This enhancement allows users to connect and interact with Teradata databases directly from Qualytics, facilitating more diverse data management capabilities. +- Snowflake Key-pair Authentication + - In our ongoing efforts to enhance security, we have implemented support for Snowflake Key-pair authentication. This new feature provides an additional layer of security for our users accessing Snowflake, ensuring that data transactions are safe and reliable. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.7.15 { id=2024.7.15 } + +#### Feature Enhancements + +- Alation Data Catalog Integration + - We're excited to introduce integration with Alation, enabling users to synchronize and manage assets across both Qualytics and Alation. + - Metadata Customization: + - Trust Check Flags: We now support warning flags at both the container and field levels, ensuring users are aware of deprecated items. + - Data Health: Qualytics now pushes important checks to Alation's Data Health tab, providing a comprehensive view of data health at the container level. + - Custom Fields: Quality scores and related metadata are pushed under a new section in the Overview page of Alation. This includes quality scores, quality score factors, URLs, anomaly counts, and check counts. + +- Support for Never Expiration Option for Tokens + - Users now have the option to create tokens that never expire, providing more flexibility and control over token management. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.7.5 { id=2024.7.5 } + +#### Feature Enhancements + +- Enhanced Operations Listing Performance + - Optimized the performance of operations listings and streamlined the display of container-related information dialogs. These enhancements include improved handling of operations responses and the addition of pagination for enhanced usability + +#### General Fixes + +- Fix Computed Field Icon Visibility + - Resolved an issue where the computed field icon was not being displayed in the table header. + +- General Fixes and Improvements + +### 2024.6.29 { id=2024.6.29 } + +#### Feature Enhancements + +- Computed Field Support + - Introduced computed fields allowing users to dynamically create new virtual fields within a container by applying transformations to existing data. + - Computed fields offer three transformation options to cater to various data manipulation needs. Each transformation type is designed to address specific data characteristics: + - Cleaned Entity Name: Automates the removal of business signifiers such as 'Inc.' or 'Corp.' from entity names, simplifying entity recognition. + - Convert Formatted Numeric: Strip formatting like parentheses (for negatives) and commas (as thousand separators) from numeric data, converting them into a clean, numerically-typed format. + - Custom Expression: Allows users to apply any valid Spark SQL expression to combine or transform fields, enabling highly customized data manipulations. + - Users can define specific checks on computed fields to automatically detect anomalies during scan operations. + - Computed fields are also visible in the data preview tab, providing immediate insight into the results of the defined transformations. + +- Autogenerated Descriptions for Authored Checks + - Implemented an auto-generation feature for check descriptions to streamline the check authoring process. This feature automatically suggests descriptions based on the selected rule type, reducing manual input and simplifying the setup of checks. + +- Event-Driven Catalog Integrations and Sync Enhancements + - Enhanced the Atlan integration and synchronization functionalities to include event-driven support, automatically syncing assets during Profile and Scan operations. This update also refines the Sync and Integration dialogs, offering clearer control options and flexibility. + +- Sorting by Anomalous Record Count + - Added a new sorting filter in the Anomalies tabs that allow users to sort anomalies by record count, improving the manageability and analysis of detected anomalies. + +- Refined Tag Sorting Hierarchy: + - Updated the tag sorting logic to consistently apply a secondary alphabetical sort by name. This ensures that tags will additionally be organized by name within any primary sorting category. + + +#### General Fixes + +- Profile Operation Support for Empty Containers + - Resolved an issue where profiling operations failed to record fields in empty containers. Now, fields are generated even if no data rows are present. + +- Persistent Filters on the Explore Page + - Fixed a bug that caused Explore to disable when switching tabs on the Explore page. Filters now remain active and consistent, enhancing user navigation and interaction. + +- Visibility of Scan Results Button + - Corrected the visibility issue of the 'results' button in the scan operation list at the container level. The button now correctly appears whenever at least one anomaly is detected, ensuring users have immediate access to detailed anomaly results. + +- General Fixes and Improvements + +### 2024.6.18 { id=2024.6.18 } + +#### Feature Enhancements + +- Improvement to Anomaly Dialog + - Enhanced the anomaly dialog to include a direct link to the operation that generated the anomaly. Users can now easily navigate from an anomaly to view other anomalies generated by the same operation directly from the Activity tab. + +- Sorting by Duration in Activity Tab + - Introduced the ability to sort by the duration of operations in the Activity tab by ascending or descending order. + +- Last Editor Information for Scheduled Operations + - Added visibility of which users have created or last updated scheduled operations, enhancing traceability in scheduling management. + +- Display Total Anomalous Records for Anomalies + - Added the total count of anomalous records in the anomalies listing view. + +#### General Fixes + +- Performance Fixes on Computed Table Creation and Check Validation + - Optimized the processes for creating computed tables and validating checks. Users previously experiencing slow performance or timeouts during these operations will now find the processes significantly faster and more reliable. + +- General Fixes and Improvements + +### 2024.6.14 { id=2024.6.14 } + +#### Feature Enhancements + +- Improvements to Atlan Integration + - When syncing Qualytics with Atlan, badges now display the "Quality Score Total," increasing visibility and emphasizing key data quality indicators on Atlan assets. + + - Improved performance of the synchronization operation. + + - Implemented the propagation of external tags to checks, now automatically aligned with the container synchronization process, enabling better accuracy and relevance of data tagging. + +- Refactor Metric Check Creation + - Enhanced the encapsulated Metric Check creation flow to improve user experience and efficiency. Users can now seamlessly create computed tables and schedule operations simultaneously with the metric check creation. + +- Support Update of Weight Modifier for External Tags + +- Add Validation on Updated Connections + - Added support for testing the connection if there's at least one datastore attached to the connection, ensuring more reliable and accurate connection updates. + +- Standardize Inner Tabs under the Settings Page + - Tags and Notifications Improvements: The layout has been revamped for better consistency and clarity. General headers have been removed, and now each item features specific headers to enhance readability. + + - Security Tab Improvements: The redesign features chip tabs for improved navigation and consistency. Filters have been updated to ensure they meet application standards. + + - Tokens Tab Accessibility: Moved the action button to the top of the page to make it more accessible. + + - Refine Connector Icons Display: Improved the display of connector icons for Datastores and Enrichments in the Connections Tab. + +- Streamlined Container Profiling and Scanning + - In the container context, the profile and scan modals have been updated to automatically display the datastore and container, eliminating the need for a selection step and streamlining the process. + +- Swap Order During Check Creation + - Rule Type Positioning: The Rule Type now appears before the container selection, making the form more intuitive. + + - Edit Mode Header: In edit mode, the Rule Type is prominently displayed in the modal header, immediately under the check ID. + +#### General Fixes + +- Address Minor Issues in the Datastore Activity Page + - Operation ID Auto-Search: Restored the auto-search feature by operation ID for URL access, enhancing navigation, especially for Catalog Operations. + + - Tree View Auto-Refresh: Implemented an auto-refresh feature for the tree view, which activates after any operation in the CTA flow (Catalog, Profile, Scan). + +- Fix "Greater Than Field" Quality Check + - Corrected the inclusive property of the greater than field quality check. +- Fix Exporting Field Profiles for Non-Admin User with Write Permission + - Resolved issues for non-admin users with write permissions to allow proper exporting of field profile metadata to enrichment. + +- Fix "Is Replica Of" Quality Check validation on Field Names with Special Characters + - Improved validation logic to handle field names with special characters + +- General Fixes and Improvements + +### 2024.6.7 { id=2024.6.7 } + +#### Feature Enhancements + +- Atlan Integration Improvements + - Enhanced the Atlan assets fetch and external tags syncing. + - Added support for external tag propagation to checks and anomalies. + - Merged Global and External tags section for streamlined tag management. + +- Restart Button for Analytics Engine + - Introduced a new "Restart" button under the Settings - Health section, allowing admins to manually restart the Analytics Engine if it is offline or unresponsive. + +- Interactive Tooltip Component + - Added a new interactive tooltip component that remains visible upon hovering, enhancing user interaction across various modules of the application. + - Refactored existing tooltip usage to integrate this new component for a more consistent user experience. + +- Defaulting to Last-Used Enrichment Datastore for Check Template Exports + - Improved user experience by persisting the last selected enrichment datastore as the default option when exporting a check template. + +#### General Fixes + +- Shared Links Fixes + - Fixed issues with shared operation result links, ensuring that dialogs for scan/profile results and anomalies now open correctly. + - Addressed display inaccuracies in the "Field Profiles Updated" metrics. + +- General Fixes and Improvements + +### 2024.6.4 { id=2024.6.4 } + +#### Feature Enhancements + +- Atlan Data Catalog Integration + - We're excited to introduce integration with Atlan, enabling users to synchronize and manage assets across both Qualytics and Atlan: + - Tag Sync: Sync tags assigned to data assets in Atlan with the corresponding assets in Qualytics, enabling tag-based quality score reporting, notifications, and bulk data quality operations using Atlan-managed tags. + - Metadata Sync: Automatically synchronize Atlan with Qualytics metadata, including asset URL, total score, and factor scores such as completeness, coverage, conformity, consistency, precision, timeliness, volume, and accuracy. + +- Entity Resolution Check + - We've removed the previous limitation on the maximum number of distinct entity names that could be resolved with the Entity Resolution rule type. This release includes various performance enhancements that support an unlimited number of entity names. + +- Enhancements to Catalog Operation Results + - We've improved the catalog operation results by now including detailed information on whether tables, views, or both were involved in each catalog operation. + +- Enhancements to 'Equal to Field' Rule Type + - The 'Equal to Field' rule now supports string values, allowing for direct comparisons between text-based data fields. + +- Enhancements to Enrichment + - Qualytics now includes a property for anomalousRecordCount on shape anomaly, which previously was neither populated nor persisted. This aims to accurately capture and record the total number of anomalous records identified in ShapeAnomaly, regardless of the max_source_records threshold. + +- Dynamic Meta Titles + - Pages such as Datastore Details, Container Details, and Field Details now feature dynamic meta titles that accurately describe the page content and are visible in browser tabs providing better searchability. + +#### General Fixes + +- Fix Trends of Quality Scores on the Insights Page + - Addressed issues with displaying trends on the Insights page. Trends now accurately reflect changes and comparisons to the previous report period, providing more reliable and insightful analytics. + +- Resolved a bug in Entity Resolution where the distinction constraint was only applied to entity names that differed. + +- General Fixes and Improvements + +### 2024.5.22 { id=2024.5.22 } + +#### Feature Enhancements + +- Datastore Connection Updates: + - Users can now update the connection on a datastore if the new one has the same type as the current one. + +- Enrichment Datastore Redirection: + - Enhanced the user interface to facilitate easier redirection to enrichment datastores, streamlining the process and improving user experience. + +- Label Enhancements for Data Completeness: + - Updated labels to better distinguish between completeness percentages and Factor Scores. The label for completeness percentage has been changed to provide clear context when viewed alongside. + +#### General Fixes + +- Rule Type Anomaly Corrections: + - Fixed an issue where the violation messages for record anomalies incorrectly included "None" for some rule types. This update ensures accurate messaging across all scenarios. + +- Shape Anomaly Logic Adjustment: + - Revised the logic for Shape Anomalies to prevent the combination of failed checks for high-count record checks on the same field. This change ensures that displayed sample rows have definitively failed the specific checks shown, enhancing the accuracy of anomaly reporting. + +- Entity Resolution Anomalies: + - Addressed an inconsistency where some Entity Resolution Checks did not return source records. Ongoing investigations and fixes have improved the reliability of finding source records for entity resolution checks across DFS and JDBC datastores. + +- General Fixes and Improvements + + +### 2024.5.16 { id=2024.5.16 } + +#### Feature Enhancements + +- Entity Resolution Check + - Introduced rule "Entity Resolution" to determine if multiple records reference the same real-world entity. This feature uses customizable fields and similarity settings to ensure accurate and tailored comparisons. + +- Support for Rerunning Operations + - Added an option to rerun operations from the operations listing, allowing users to reuse the configuration from previously executed operations. + +#### General Fixes + +- Export Operations + - Fixed metadata export operations silently failing on writing to the enrichment datastores. + +- Computed File/Table Creation + - Resolved an issue that prevented the creation of computed files/tables with the same name as previously deleted ones, even though it is a valid action. + +- General Fixes and Improvements + +### 2024.5.13 { id=2024.5.13} + +#### General Fixes + +- Enhanced Quality Score Factors Computation + - Addressed issues in quality score calculation and its associated factors ensuring accuracy + +- General Fixes and Improvements + +### 2024.5.11 { id=2024.5.11} + +#### Feature Enhancements + +- Introducing Quality Score Factors + - This new feature allows users to control the quality score factor weights at the datastore and container levels. + - Quality Score Detail Expansion: Users can now click on the quality score number to expand its details, revealing the contribution of each factor to the overall score. This enhancement aids in understanding what drives the quality score. + - Insights Page Overhaul: The Insights page has been restructured to better showcase the quality score breakdown. This redesign aims to make the page more informative and focused on quality score metrics. + - Customization of Factor Weights: Users can now customize the weights of different factors at the Datastore and Container levels. This feature is essential for adapting the quality score to meet specific user needs, such as disregarding the Timeliness factor for dimensional tables where it might be irrelevant. + - Enhanced Inferred Checks: Introduced a new property in the Check Listing schema and a feature in the Check modal that displays validity metrics, which help quantify the accuracy of inferred checks. A timezone handling issue in the last_updated property of the Check model has also been addressed. + +- Quality Score UI Enhancements + - Enhancements have been made to the user interface to provide a clearer and more detailed view of the quality score metrics, including Completeness, Coverage, Conformity, Consistency, Precision, Timeliness, Volumetrics, and Accuracy. These changes aim to provide deeper insight into the components that contribute to the overall quality score. + +#### General Fixes + +- Fixes to JDBC Incremental Support + - Updated the conditional logic in the catalog operation for update tables to ensure the incremental identifier is preserved if already established. + +- General Fixes and Improvements + +### 2024.5.2 { id=2024.5.2} + +#### Feature Enhancements + +- Datastore Connections: + - Users can now create connections that can be shared across different datastores. This introduces a more flexible approach to managing connections, allowing users to streamline their workflow and reduce duplication of effort. With shared connections, users can easily reuse common elements such as hostname and credentials across various datastores, enhancing efficiency and simplifying management. + +- File Container Header Configuration: + - Adds support for setting the hasHeader boolean property on File Containers, enabling users to specify whether their flat file data sources include a header row. This enhances compatibility and flexibility when working with different file formats. + +- Improved Error Handling in Delete Dialogs: + - Error handling within delete dialogs has been revamped across the application. Error messages will now be displayed directly within the dialog itself, providing clearer feedback and preventing misleading success messages in case of deletion issues. + +#### General Fixes + +- Locked Template Field Editing: + - Resolves an issue where selecting a new container in the check form would reset check properties, causing problems for locked templates. The fix ensures that checks derived from templates retain their properties, allowing users to modify the field_to_compare field as needed. + +- General Fixes and Improvements + +### 2024.4.25 { id=2024.4.25} + +#### Feature Enhancements + +- Profile Results Modal: + - Introducing a detailed Results Modal for each profile operation. Users can now view comprehensive statistics about the produced container profiles and their partitions, enhancing their ability to analyze data effectively. + +- Checks Synchronized Count: + - The operations list now includes the count of synchronized checks for datastore and explore operations. This addition streamlines the identification of operations, improving user experience. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.4.23 { id=2024.4.23} + +#### Feature Enhancements + +- Introduction of Comparators for Quality Checks: + - Launched new Comparator properties across several rule types, enhancing the flexibility in defining quality checks. Comparators allow users to set margins of error, accommodating slight variations in data validation: + - Numeric Comparators: Enables numeric comparisons with a specified margin, which can be set as either a fixed absolute value or a percentage, accommodating datasets where minor numerical differences are acceptable. + - Duration Comparators: Supports time-based comparisons with flexibility in duration differences, essential for handling time-based data with variable precision. + - String Comparators: Facilitates string comparisons by allowing for variations in spacing, ideal for textual data where minor inconsistencies may occur. + - Applicable to rule types such as Equal To, Equal To Field, Greater Than, Greater Than Field, Less Than, Less Than Field, and Is Replica Of. + +- Introduced Row Comparison in the isReplicaOf Rule: + - Improved the rule to support row comparison by id, enabling more precise anomaly detection by allowing users to specify row identifiers for unique row comparison. Key updates include: + - Revamp of the source record presentation to highlight differences between the left and right containers at the cell level, enhancing visibility into anomalies. + - New input for specifying unique row identifiers, transitioning from symmetric difference to row comparison when set. + - The original behavior of symmetric comparison remains unchanged if no row identifiers are provided. + +- New equalTo Rule Type for Direct Value Comparisons + - Introduced the equalTo rule type, enabling precise assertions that selected fields match a specified value. This new rule not only simplifies the creation of checks for constant values across datasets but also supports the use of comparators, allowing for more flexible and nuanced data validation. + +- Redirect Links for Requested Containers in Operation Details: + - Introduced redirect links in the "Containers Requested" section of operation results. This enhancement provides direct links to the requested containers (such as tables or files), facilitating quicker navigation and streamlined access to relevant operational data. + +- Enhanced Description Input with Expandable Option: + - Implemented an expandable option for the Description input in the Check Form & Template Form. This enhancement allows users to more comfortably manage lengthy text entries, improving the usability of the form by accommodating extensive descriptions without compromising the interface's usability. + +#### General Fixes + +- Addressed Data Preview Timeout Issues: + - Tackled the timeout problems in the data preview feature, ensuring that data retrieval processes complete successfully within the new extended timeout limits. + +- General Fixes and Improvements + +### 2024.4.12 { id=2024.4.12} + +#### Feature Enhancements + +- File Pattern Overrides: + - We have added support in the UI to override a file pattern. Now, a file pattern overwritten by a user will replace the one that the system generated during the first catalog. To have a new file pattern in the UI, users need to perform a new catalog operation without prune. +- Batch Edit in the Check Templates Library:: + - We are now supporting batch edits for check templates in the Library. This enhancement will allow filters and tags. +- Improved Presentation of Incremental, Remediation, and Infer Constraints: + - We have improved the presentation of Incremental, Remediation, and Infer Constraints in the operation listing for catalog, profile, and scan operations. The Incremental, Remediation, and Infer Constraints icons have been added to the list of items, and the visualization of these items has been enhanced. +- Default Placeholders for Computed File in UI: + - We are now automatically populating the form dialog with fields from the selected container. This improvement simplifies the process for users, especially in scenarios where they wish to select or cast specific fields directly from the source container. + +#### General Fixes + +- Tree View Default Ordering: + - We have updated the tree view default ordering. Datastore names are now grouped and presented in alphabetical order. + +- General Fixes and Improvements + +### 2024.4.6 { id=2024.4.6 } + +#### Breaking Changes + +- Remediation Naming Convention Update: + - Updated the naming convention for remediation to `{enrich_container_prefix}_remediation_{container_id}`, standardizing remediation identifiers. + +- Add file extension for DFS Enrichment: + - Introduced `.delta` extension to files in the enrichment process on DFS, aligning with data handling standards. + +#### Feature Enhancements + +- Revamp Enrichment Datastore Main Page: + - Tree View & Data Navigation: Enhanced the enrichment page with an updated tree view that now lists source datastores linked to enrichment datastores, improving navigability. A newly introduced page for enrichment datastore enables: + - Data preview across enrichment, remediation, and metadata tables with the ability to apply "WHERE" filters for targeted insights. + - Direct downloading of preview data as CSV. + - UI Performance Optimization: Implemented UI caching to boost performance, reducing unnecessary network requests and smoothly preserving user-inputted filters and recent data views. + +- User Sorting by Role: + - Introduced a sorting feature in the Settings > Users tab, allowing users to be sorted by their roles in ascending or descending order, facilitating easier user management. + +- Expanded Entity Interaction Options: + - Enhanced entity lists and breadcrumbs with new direct action capabilities. Users can now right-click on an item to access useful functions: copy the entity's ID or name, open the entity's link in a new tab, and copy the entity's link. This enhancement simplifies data management by making essential actions more accessible. + +#### General Fixes + +- Record Quality Scores Overlap Correction: + - Resolved a problem where multiple violations could be open for the same container simultaneously, contrary to logic. This fix ensures violations for containers are uniquely recorded, eliminating parallel open violations. + +- Anomaly Details Text Overflow: + - Corrected text overflow issues in the anomaly details' violation box, ensuring all content is properly contained and readable. + +- Enhanced "Not Found" Warnings with Quick Filters: + - Improved user guidance for Checks and Anomalies list filters by adding hints for "not found" items, suggesting users check the "all" group for unfiltered search results, clarifying navigation and search results. + +- General Fixes and Improvements + +### 2024.3.29 { id=2024.3.29} + +#### Feature Enhancements + +- Data Preview + - Introducing the "Data Preview" tab, providing users with a streamlined preview of container data within the platform. This feature aims to enhance the user experience for tasks such as debugging checks, offering a grid view showcasing up to 100 rows from the container's source. + - Data Preview Tab: Implemented a new tab for viewing container data, limited to displaying a maximum of 100 rows for improved performance. + - Filter Support: Added functionality to apply filter clauses to the data preview, enabling users to refine displayed rows based on specific criteria. + - UI Caching: Implemented a caching layer within the UI to enhance performance and reduce unnecessary network requests, storing the latest refreshed data along with applied filters. + +- Enhanced Syntax Highlight Inputs + - Improved the syntax highlight inputs for seamless inline editing, minimizing the friction of entering expressions. This feature includes a dual-mode capability, allowing users to type directly within the input field or utilize an expanded dialog for more complex entries, significantly improving user experience. + +- Volumetric Measurements + - Periodically measure container volumetrics for a more robust approach. This update focuses on measuring only containers without a volume measure in the last 24 hours and scheduling multiple runs of the job daily. + +- Sort Tags by Color + - Users can now sort tags by color, visually grouping similar colors for easier navigation and management. + +- Download Source Records + - Added a "Download Source Records" feature to the Anomaly view in the UI, allowing users to export data held in the enrichment store for that anomaly in CSV format. + +- Check Templates Navigation + - Implemented a breadcrumb trail for the Check Template page to improve user navigation. + +#### General Fixes + +- Fix Scheduling Issues + - Resolved scheduling issues affecting specific sets of containers, particularly impacting scheduled profile and scan operations. Users must manually add new profiles after catalog operations or computed file/table creation for inclusion in existing scheduled operations. + +- Fix Notifications Loading Issue on Large Screens + - Fixed an issue where the infinity loading feature for the user notification list was not functioning properly on large screens. The fix ensures correct triggering of infinity loading regardless of screen size, allowing all notifications to be accessed properly. + +- General Fixes and Improvements + +### 2024.3.15 { id=2024.3.15} + +#### Feature Enhancements + +- Enhanced Observability + - Automated daily volumetric measurements for all tables and file patterns + - Time-series capture and visualizations for volume, freshness, and identified anomalies +- Overview Tab: + - Introduced a new "Overview" tab with information related to monitoring at the datastore and container level. + - This dashboard interface is designed for monitoring and managing data related to qualytics for datastore and containers. + - Users can see: + - Totals: Quality Score, Tables, Records, Checks and Anomalies + - Total of Quality Checks grouped by Rule type + - Data Volume Over Time: A line graph that shows the total amount of data associated with the project over time. + - Anomalies Over Time: A line graph that shows the number of anomalies detected in the project over time. + +- Datastore Field List Update: + - The datastore field profiles list has been updated to match the existing list views design. + - All card-listed pages now display information in a column format, conditionally using scrolling for smaller and larger screens. + - Now the field details will show on a modal with Profiling and Histogram + +- Heatmap Simplification: + - Simplified the heatmap to consider only operations counted. + +- Datastore Metrics: + - Improved distinction between 0 and null values in the datastore metrics (total records, total fields, etc). + +- Explore Page Update: + - Added new metrics to the Explore page. + - We are now adding data volume over time (records and size). + - Improved distinction between 0 and null values in metrics (total records, total fields, etc). + +#### General Fixes + +- UI Wording and Display for Cataloged vs Profiled Fields: + - Addressed user confusion surrounding the display and wording used to differentiate between fields that have been cataloged versus those that have been profiled. + - Updated the messaging within the tree view and other relevant UI components to accurately reflect the state of fields post-catalog operation. + - Implemented a clear distinction between non-profiled and profiled fields in the field count indicators. + - Conducted a thorough review of the CTAs and descriptive text surrounding the Catalog, Profile, and Scan operations to improve clarity and user understanding. + +- General Fixes and Improvements + +### 2024.3.7 { id=2024.3.7} + +#### General Fixes + +- Corrected MatchesPattern Checks Inference: + - Fixed an issue where the inference engine generated MatchesPattern checks that erroneously asserted false on more than 10% of training data. This resolution ensures all inferred checks now meet the 99% coverage criterion, aligning accurately with their training datasets. + +- Fixed Multi-Field Check Parsing Error in DFS: + - Addressed a bug in DFS environments that caused parsing errors for checks asserting against multiple fields, such as AnyNotNull and NotNull, when selected fields contained white spaces. This resolution ensures that checks involving multiple fields with spaces are now accurately parsed and executed. + +- Volumetric Measurements Tracking Fix: + - Addressed a bug that prevented the recording of volumetric measurements for containers without a last modified time. This fix corrects the problem by treating last_modification_time as nullable, ensuring that containers are now accurately tracked for volumetric measurements regardless of their modification date status. + +- General Fixes and Improvements + +### 2024.3.5 { id=2024.3.5} + +#### Feature Enhancements + +- Check Validation Improvement: + - Enhanced the validation process for the "Is Replica Of" check. Previously, the system did not validate the field name and type, potentially leading to undetected issues until a Scan Operation was executed. Now, the validation process includes checking the field name and type, providing users with immediate feedback on any issues. + +#### General Fixes + +- Matches Pattern Data Quality Check Handling White Space: + - Resolved a bug in the Matches Pattern data quality check that caused white space to be ignored during training. With this fix, the system now accounts for white space during training, ensuring accurate pattern inference even with data containing significant white space. If 1% or more of the training data contains blanks, the system will derive a pattern that includes blanks as a valid value, improving data quality assessment. + +- General Fixes and Improvements + +### 2024.2.28 { id=2024.2.28 } + +#### Feature Enhancements + +- User Token Management: + - Transitioned from Generic Tokens to a more robust User Token system accessible under Settings for all users. This enhancement includes features to list, create, revoke, and delete tokens, offering granular control of API access. User activities through the API are now attributable, aligning actions with user accounts for improved accountability and traceability. + +#### General Fixes + +- Datetime Validation in API Requests: + - Strict validation of datetime entries in API requests has been implemented to require the Zulu datetime format. This update addresses and resolves issues where incomplete datetime entries could disrupt Scan operations, enhancing API reliability. + +- Context-Aware Redirection Post-Operation: + - Enhanced the operation modal redirect functionality to be context-sensitive, ensuring that users are directed to the appropriate activity tab after an operation, whether at the container or datastore level. This enhancement ensures a logical and intuitive post-operation navigation experience. + +- Template Details Page Responsiveness: + - Addressed layout issues on the Template Details page caused by long descriptions. Adjustments ensure that the description section now accommodates larger text volumes without disrupting the page layout, maintaining a clean and accessible interface. + +- General Fixes and Improvements + +### 2024.2.23 { id=2024.2.23 } + +#### Feature Enhancements + +- Introduction of Operations Management at the Table/File Level: + - The Activity tab has been added at the table/file level, extending its previous implementation at the source datastore level. This update provides users with the ability to view detailed information on operations for individual tables/files, including scan metrics, and histories of operation runs and schedules. It enhances the user's ability to monitor and analyze operations at a granular level. + +- Enhanced Breadcrumb Navigation UX: + - Breadcrumb navigation has been improved for better user interaction. Users can now click on the breadcrumb representing their current context, enabling more intuitive navigation. In addition, selecting the Source Datastore breadcrumb takes users directly to the Activity tab, streamlining the flow of user interactions. + +#### General Fixes + +- Improved Accuracy in Profile and Scan Metrics: + - Enhanced the accuracy of metrics for profiled and scanned operations by excluding failed containers from the count. Now, metrics accurately reflect only those containers that have been successfully processed. + +- Streamlined input display for Aggregation Comparison rule in Check/Template forms: + - Removed the "Coverage" input for the "Aggregation Comparison" rule in Check/Template Forms, as the rule does not support coverage customization. This simplification helps avoid confusion during rule configuration. + +- Increased Backend Process Timeouts: + - In response to frequent timeout issues, the backend process timeouts have been adjusted. This change aims to reduce interruptions and improve service reliability by ensuring that processes have sufficient time to complete. + +- General Fixes and Improvements + +### 2024.2.19 { id=2024.2.19 } + +#### Feature Enhancements + +- Support for exporting Check Templates to the Enrichment Datastore: + - Added the ability to export Check Library metadata to the enrichment datastore. This feature helps users export their Check Library, making it easier to share and analyze check templates. + +- File Upload Size Limit Handling: + - Implemented a user-friendly error message for file uploads that exceed the 20MB limit. This enhancement aims to improve user experience by providing clear feedback when the file size limit is breached, replacing the generic error message previously displayed. + +#### General Fixes + +- Resolved Parsing Errors in Expected Values Rule: + - Fixed an issue where single quotes in the list of expected values caused parsing errors in the Analytics Engine, preventing the Expected Values rule from asserting correctly. This correction ensures values, including those with quotes or special characters, are now accurately parsed and asserted. + +- General Fixes and Improvements + +### 2024.2.17 { id=2024.2.17} + +#### General Fixes + +- Corrected Typing for Expected Values Check: + - Resolved an issue with the expectedValues rule, where numeric comparisons were inaccurately processed due to a misalignment between the API and the analytics engine. This fix ensures numeric values are correctly typed and compared, enhancing the reliability of validations. + +- Fixed Anomaly Filtering in Scan Results dialog: + - Addressed a flaw where scan results did not consistently filter anomalies based on the operation ID. The fix guarantees that anomalies are only displayed once the operation ID parameter is accurately defined in the URL, ensuring more precise and relevant scan outcome presentations. + +- Check Validation Sampling Behavior Adjustment: + - Fixed intermittent validation issues encountered in specific source datastore types (DB2, Microsoft SQL Server). The problem, where validation could unpredictably fail or succeed based on container size, was corrected by fine-tuning the sampling method for these technologies, leading to consistent validation performance. + +- General Fixes and Improvements + +### 2024.2.15 { id=2024.2.15} + +#### Feature Enhancements + +- UX Improvements for Profile and Scan Operation Dialogs: + - Implemented significant UX enhancements to Profile & Scan Operation Dialogs for improved clarity and user flow. Key improvements include: + - Visibility of incremental fields and their current starting positions in Scan Operation dialogs. + - Logical reordering of Profile and Scan Operation steps to align with user workflows, including prioritizing container selection and clarifying the distinction between "Starting Threshold" and "Limit" settings. + - Simplified operation initiation, allowing users to start operations directly before the final scheduling step, streamlining the process for immediate execution. + +- Naming for Scheduled Operations: + - Added a name field to scheduled operations, enabling users to assign descriptive names or aliases. This feature aids in distinguishing and managing multiple scheduled operations more effectively. + +- Container Name Filters for Operations: + - Provided filtering options for operations and scheduled operations by container name, improving the ability to quickly locate and manage specific operations. + +- Improved Design for Field Identifiers in Tooltips: + - The design of field identifiers within tooltips has been refined for greater clarity. Enhancements focus on displaying Grouping Fields, Excluded Fields, Incremental Fields, and Partition Fields, aiming to offer users a more intuitive experience. + +#### General Fixes + +- External Scan Rollup Threshold Correction: + - Fixed an issue in external scans where the rollup threshold was not applied as intended. This correction ensures that anomalies exceeding the threshold are now accurately consolidated into a single shape anomaly, rather than being reported as multiple individual record anomalies. + +- Repetitive Release Notification and Live Update Fixes: + - Resolved a recurring issue with release notifications continually prompting users to refresh despite acknowledgment. Additionally, it restored the live update notifications' functionality, ensuring users are correctly alerted to new features while actively using the system, with suggestions for a hard refresh to access the latest version. + +- Corrected Field Input Logic in Check & Template Forms: + - Addressed a logic error that incorrectly disabled field inputs for certain rules in check and template forms. This correction re-enables the necessary field input, removing a significant barrier that previously prevented users from creating checks affected by this issue. + +- Addressed Absence of Feedback for No-Match Field Filters on Explore Page: + - Rectified the absence of feedback when field filters on the Explore Page yield no results, ensuring users receive a clear message indicating no items match the specified filter criteria. + +- General Fixes and Improvements + +### 2024.2.10 { id=2024.2.10} + +#### Feature Enhancements + +- Immediate Execution Option for Scheduled Operations: + - Introduced a "Run Now" feature for scheduled operations, enabling users to execute operations immediately without waiting for the scheduled time. This addition provides flexibility in operation management, ensuring immediate execution as needed without altering the original schedule. + +- Simplified Customization of Notification Messages: + - Removed the "use custom message" toggle from the notification form, making the message input field always editable. This change simplifies the user interface and improves usability by allowing direct editing of notification messages. + - Enhanced default messages for each notification trigger type have also been implemented to improve clarity. + +- Performance Improvement in User Notifications Management: + - Implemented infinite scrolling pagination for the user notifications side panel. This update addresses performance issues with loading large numbers of notifications, ensuring a smoother and more responsive experience for users with extensive notification histories. + +- Enhanced Archive Template Confirmation: + - Updated the archive dialog for templates to include information on the number of checks associated with archiving the template. This enhancement ensures users are aware of the impact of checks linked to the template, promoting informed decision-making. + +- Improved Interaction with Computed Tables: + - Refined the Containers list UX to allow navigation to container details immediately after the creation of a computed table, addressing delays caused by background profiling. This improvement ensures users can access computed table details without waiting for the profile operation to complete, drawing inspiration from Tree View functionality for a more seamless experience. + +#### General Fixes + +- General Fixes and Improvements + +### 2024.2.2 { id=2024.2.2} + +#### Feature Enhancements + +- Excluded Fields Inclusion in Drop-downs: + - Refined container settings to incorporate previously excluded fields in the dropdown list, enhancing user flexibility. In addition, a warning message has been added to notify users if a profile operation is required when deselecting excluded fields that were previously selected. + +#### General Fixes + +- Linkable Scan Results for Direct Access: + - Made Scan Results dialogs accessible via direct URL links, addressing previous issues with broken anomaly notification links. This enhancement provides users with a straightforward path to detailed scan outcomes. + +- Property Display Refinement for Various Field Types: + - Corrected illogical property displays for specific field types like Date/Timestamp. The system now intelligently displays only properties relevant to the selected data type, eliminating inappropriate options. This update also includes renaming 'Declared Type' to 'Inferred Type' and adjusting the logic for accurate representation. + +- Timezone Consistency in Insights and Activity Pages: + - Implemented improvements in timezone handling across Insights and Activity pages. These changes ensure that date aggregations are accurately aligned with the user's local time, eliminating previous inconsistencies compared to the Operations list results. + +- Fixed breadcrumb display in the datastore for members with restricted permissions + - Enhanced the datastore interface to address issues faced by members with limited permissions. This update also fixes misleading breadcrumb displays and ensures that correct datastore enhancement information is visible. + +- Resolved State Issue in Bulk Check Archive: + - Addressed a bug in the bulk selection process for archiving checks. The fix corrects an issue where the system recognized individual selections instead of the intended group selection due to an overlooked edge case. + +- Improved Operation Modal State Management: + - Tackled state management inconsistencies in Operation Modals. Fixes include resetting the remediation strategy to its default and ensuring 'include' options do not carry over previous states erroneously. + +- Eliminating Infinite Load for Non-Admin Enrichment Editing: + - Solved a persistent loading issue in the Enrichment form for non-admin users. Updates ensure a smoother, error-free interaction for these users, improving accessibility and functionality. + +- General Fixes and Improvements + +### 2024.1.30 { id=2024.1.30} + +#### Feature Enhancements + +- Enhanced External Scan Operations: + - Improved data handling in External Scans by applying type casting to uploaded data using Spark. This update is particularly significant for date-time fields, which now expect and conform to ISO 8601 standards. + +- Optimized DFS File Reading: + - Streamlined file reading in DFS by storing and utilizing the 'file_format' identified during the Catalog operation. This change eliminates the need for repeated format inspection on each read, significantly reducing overhead, especially for partitioned file types. + +#### General Fixes + +- Resolved DFS Reading Issues with Special Character Headers: + - Fixed a DFS reading issue where columns with headers containing special characters (like pipes |) adversely affected field profiling, including inaccuracies in histogram generation. + +- General Fixes and Improvements + +### 2024.1.26 { id=2024.1.26} + +#### Feature Enhancements + +- Incremental Scan Starting Threshold: + - Introduced a "Starting Threshold" option for incremental Scans. This feature allows users to manually set a starting value for the incremental field in large tables, bypassing the need to scan the entire dataset initially. It's handy for first-time scans of massive databases, facilitating more efficient and targeted data scanning. + +- Add Support for Archiving Anomalies: + - Implemented the capability of archiving anomalies. Users can now remove anomalies from view without permanently deleting them, providing greater control and flexibility in anomaly management. + +- External Scan Operation for Ad hoc Processes: + - Introduced 'External Scan Operation' as a new feature enabling ad hoc data validation for all containers. This operation allows users to validate ad hoc data, such as Excel or CSV files, against a container's existing checks and enrichment configuration. The provided file's structure must align with the container's schema, ensuring a seamless validation process. + +#### General Fixes + +- Preventing Unrelated Entity Selection in Check Form: + - Fixed an issue in the Check Form where users could inadvertently select unrelated entities. Selecting datastores, containers, and fields is restricted during any ongoing data loading, preventing mismatched entity selections. + +- Performance enhancements for BigQuery and Snowflake removing the need for count operations during full table analysis + +- General Fixes and Improvements + +### 2024.1.23 { id=2024.1.23} + +#### Feature Enhancements + +- Introduction of 'Expected Schema' Rule for Advanced Schema Validation: + - Introduced the 'Expected Schema' rule, replacing the 'Required Fields' rule. This new rule asserts that all selected fields are present and their data types match predefined expectations, offering more comprehensive schema validation. It also includes an option to validate additional fields added to the schema, allowing users to specify whether the presence of new fields should cause the check to fail. + +- Refined Tree Navigation Experience: + - Updated the tree navigation to prevent automatic expansion of nodes upon selection and eliminated the auto-reset behavior when re-selecting an active node. These changes provide a smoother and more user-friendly navigation experience, especially in tables/files with numerous fields. + +- Locked/Unlocked Status Filter in Library Page: + - Added a new filter feature to the Library page, enabling users to categorize and view check templates based on their Locked or Unlocked status. This enhancement simplifies the management and selection of templates. + +- Improved Messaging for Locked Template Properties in Check Form: + - Enhanced the Check Form UX by adding informative messages explaining why certain inputs are disabled when a check is associated with a locked template. This update enhances user understanding and interaction with the form. + +#### General Fixes + +- Corrected Insights Metrics for Check Templates: + - Fixed an issue where check templates were incorrectly counted as checks in related metrics and counts on the Insights page. Templates are now appropriately filtered out, ensuring accurate representation of check-related data. + +- Enabled Template Creation with Calculated Rules: + - Resolved a limitation that prevented the creation of templates using calculated rules like 'Satisfies Expression' and 'Aggregation Comparison'. This fix expands the capabilities and flexibility of template creation. + +- General Fixes and Improvements + +### 2024.1.11 { id=2024.1.11} + +#### Feature Enhancements + +- Introduction of Check Templates: + - Implemented Check Templates to offer a balance between flexibility and consistency in quality check management. Checks can now be associated with templates in either a 'locked' or 'unlocked' state, allowing for synchronized properties or independent customization, respectively. This feature streamlines check management and enables efficient tracking and review of anomalies across all checks associated with a template. + +- isType Rule Implementation: + - Replaced the previous dataType rule with the new isType rule for improved accuracy and understanding. The isType rule is now specifically tailored to assert only against string fields, enhancing its applicability and effectiveness. + +- Enhanced Container Details Page with Identifier Icons: + - Updated the Container Details page to display icons for key container identifiers, including Partition Field, Grouping Fields, and Exclude Fields. This enhancement provides a more intuitive and informative user interface, facilitating easier identification and understanding of container characteristics. + +#### General Fixes + +- Notification System Reliability Improvement: + - Fixed intermittent failures in the notifications system. Users will now receive reliable notifications for identified anomalies, ensuring timely awareness and response to data irregularities. + +- Safeguard Against Overlapping Scheduled Operations: + - Implemented a mechanism to prevent the overloading of deployments due to overlapping scheduled operations. If a scheduled operation doesn’t complete before its next scheduled run, the subsequent run will be skipped, thereby avoiding potential strain on system resources. + +- Correction of Group-by Field Display in Containers: + - Resolved an issue where selected grouping fields were not appearing in the list fields of a container. This fix ensures that user-specified fields for group-by operations are correctly displayed, maintaining the integrity of data organization and analysis. + +- General Fixes and Improvements + +### 2024.1.4 { id=2024.1.4} + +#### Feature Enhancements + +- Enhanced Warnings for Schema Inconsistencies in Files Profiled + - Improved the warning message for cases where the user profiles files with different schemas under a single glob pattern. This update ensures users receive clear, helpful information when files within a glob have inconsistent structures. + +#### General Fixes + +- Containers with 'Group By' settings Leading to Erroneous Profile Operation + - Fixed an issue affecting profile operations which included containers with 'Group By' settings. Previously, running a profile without inferring checks resulted in all fields being erroneously removed from the field list. + - General Fixes and Improvements \ No newline at end of file diff --git a/docs/changelog-2025.md b/docs/changelog-2025.md index ce12ab068a..2a6e3c0a1e 100644 --- a/docs/changelog-2025.md +++ b/docs/changelog-2025.md @@ -1,1197 +1,1201 @@ -# 2025 - -## Release Notes - -### 2025.12.23 { id=2025.12.23 } - -#### Feature Enhancements - -- Added Jira Cloud ticketing integration and enhanced ServiceNow with search and link capabilities. - - Connect with Jira Cloud or ServiceNow to streamline anomaly management through centralized ticket tracking. - - Introduced ticketing section on the anomaly page with quick actions for creating or linking tickets. - - Users can search for existing tickets and link them directly to anomalies. - - Supports retrieving ticket details by ID or key for status tracking. - -- Introduced Group by clause support for Computed Joins and Computed Files. - - Users can now define grouping expressions when creating computed joins and computed files, enabling aggregation functions in select clauses. - -#### General Fixes and Improvements - -- Improved Insights endpoint performance with optimized quality score queries. - -- Enhanced Agent Q with global data asset search, async operation monitoring, and metadata management capabilities. - -- General Fixes and Improvements. - -### 2025.12.12 { id=2025.12.12 } - -#### Feature Enhancements - -- Launched ServiceNow Ticketing System integration. - - Connect Qualytics with ServiceNow to streamline anomaly management through automated incident creation and tracking. - - Users can create ServiceNow incidents directly from anomalies via API, populating incident details automatically. - - Anomaly status changes in Qualytics are pushed to the linked ServiceNow incident as work notes. - - Comments added to anomalies are automatically synced to the corresponding ServiceNow incident. - -- Introduced Microsoft Purview Data Catalog integration. - - Connect Qualytics with Microsoft Purview to enrich catalog assets with actionable data quality context. - - Supports importing tags from Purview to replace matching Qualytics tags, ensuring consistent tagging and classification. - - Publishes quality scores and their dimensions, along with active check counts and active anomaly counts, to corresponding Purview assets. - - Event-driven synchronization keeps Purview up to date based on Qualytics events, including scan completions, anomaly status changes, anomaly archiving, check updates, and other actions that trigger quality score recalculation. - -- Added new beta Data Catalog integrations for Collibra and DataHub. - - Enables synchronization of Qualytics data quality metadata with external data catalog platforms. - - Supports importing tags from the catalog provider to replace matching Qualytics tags, keeping tags consistent across platforms. - - Publishes quality scores, active check counts, and anomaly metrics to corresponding catalog assets. - - Uses event-driven synchronization to automatically propagate metadata updates triggered by data quality events in Qualytics. - -- Enhanced Flows with scheduling support and node management improvements. - - Introduced scheduled trigger type, allowing users to configure flows triggered by cron expressions. - - Flow list now displays schedule information and next trigger time for scheduled flows. - - Included filters by trigger type and deactivation status to the flow definitions page. - - Enabled bulk activate and deactivate actions for flows. - - Incorporated Activate/Deactivate toggle to the Flow Settings panel for quicker access to flow status controls. - - Users can now rearrange action nodes after creation using drag-and-drop to move nodes and their descendants to a new parent. - - Swap functionality allows exchanging a node's position with its parent in a single click while maintaining flow hierarchy. - - Visual feedback during rearrangement indicates valid and invalid drop targets for intuitive editing. - -- Introduced Cast Type computed field. - - New computed field type allows casting fields to different data types without writing raw expressions. - - Supports standard SQL CAST function with direct JDBC dialect compatibility for improved cross-datastore portability. - - Enabled date format specification support for Cast Type computed fields when converting non-standard date and timestamp formats. - -#### General Fixes and Improvements - -- Corrected sampling metrics in container profiles where records processed could exceed total record count, resulting in inaccurate percentage calculations. - -- Adjusted the "Drop Suffix" option to be active by default in the Computed Field dialog. - -- Addressed Snowflake permissions error affecting enrichment operations in JDBC datastores. - -- Fixed quality score calculation that could produce negative accuracy values in certain conditions. - -- Removed auto-activation in check activation dialog to prevent accidental activations. - -- Corrected scan operations to properly report enrichment failures in operation results instead of showing success status. - -- Resolved row count mismatch between Overview and Observability charts caused by timezone alignment issues. - -- Fixed single-value `each()` keyword not generating permutations correctly in check templates. - -- Cleared Delta Table metadata cache issue that persisted after container operations completed. - -- Resolved connection verification failures not returning operation results to the Controlplane. - -- Updated Scan Settings labels and descriptions that caused confusion about threshold behavior and scanning limits. - -- Optimized materialize operation performance with enhanced partition calculation. - -- Added Engine information on the Settings Status page, displaying the deployment engine (Kubernetes, or Databricks). - -- Refined error messages for sync operation timeouts to better distinguish between Dataplane availability and datastore response issues. - -- Added visual in-progress indicator to Data Volume Over Time charts when measurements are still being recorded for the current period. - -- Included tooltip explanation on Data Volume charts indicating when current period measurements are still in progress. - -- Enhanced Data Volume charts to display the previous period's value as a placeholder when current period data is not yet available. - -- Optimized scan performance by eliminating unnecessary data shuffling when applying record limits. - -- Implemented bulk deactivate and activate actions for schedules within the datastore context. - -- General Fixes and Improvements. - -### 2025.11.27 { id=2025.11.27 } - -#### Feature Enhancements - -- Introduced Quality Score Over Time and enhanced Insights dashboard. - - Quality Scores are now tracked historically, allowing users to monitor data quality trends over time at the datastore, container, and field levels. - - Added interactive Quality Score charts displaying score progression with dimension-level breakdown. - - Introduced a new Containers Scanned metric with trend indicators in Insights - - Added the Anomaly Rule Type Distribution histogram in Insights to identify which rule types generate the most anomalies. - - Quality Score Dimensions now include detailed explanations and recommendations for scores below 30. - - Added preview charts for field metrics, providing at-a-glance trend visualization alongside each metric. - - Reorganized Insights page layout with improved section grouping for better visual hierarchy. - - Quality Score history is available at both the total score and individual dimension levels for detailed trend analysis. - -- Introduced automated anomaly lifecycle management with new Archive and Delete flow actions. - - Both actions target anomalies with no recent activity, including status updates, assignments, or comments within the specified inactivity timeframe. - - Archive action supports status selection, optional tag assignment, and comments to provide context during archiving. - - Anomalies can be filtered by source datastores and tags for both actions, with additional status filters available for Delete operations. - - Notification messages now support dynamic tokens such as {{anomaly_count}} and {{inactivity_timeframe}} for context-aware alerts. - - Archive and Delete operations can be aborted mid-execution, but any anomalies already processed will not be rolled back. - -- Improved Check Templates with automated check permutation generation from filter arrays. - - Introduced `each()` keyword that automatically expands a single filter into multiple checks, one for each specified value in the array. - - Supports multiple `each()` clauses in a single filter to generate all possible value combinations across different dimensions. - - Template locking behavior determines check lifecycle—locked templates delete checks when values are removed, while unlocked templates preserve existing checks. - -- Added an “Activate” option for draft checks on the check page. - - Draft checks can now be activated directly from the gear menu on the check overview page, eliminating the need to navigate back to the field checks list. - - Includes persistent error notifications that remain visible until manually dismissed, ensuring users don't miss critical errors during activation. - -- Improved Dry Run validation for `Data Diff` checks with filters. - - Dry Run now queries the number of records matching the filter to compare left and right side row counts, mirroring the behavior of checks without filters. - -- Added ability to modify relative path on file patterns. - - Users can now edit the relative path field, enabling advanced globbing patterns for file selection. - -- Added View Results button for Materialize and Export operations. - - Users can now navigate directly to the Enrichment Materialize or Export tab with a single click from the operation card. - - Enrichment container tabs are now router-based, enabling direct navigation and shareable URLs to specific tabs. - -#### General Fixes and Improvements - -- Fixed history flow side panel not displaying after specific flow editing operations. - -- Corrected Quality Score displaying as 0 when navigating between datastores. - -- Resolved Expected Values check displaying a blank list when configured with numeric values. - -- Fixed issue where Observability triggers were not being recorded properly. - -- Correct operations getting stuck in running status instead of being marked as failed. - -- Resolved flow executions getting stuck in running status when multiple actions completed concurrently. - -- Flow execution nodes now display historical action configuration in their inline views for accurate review of past executions. - -- General Fixes and Improvements. - -### 2025.11.6 { id=2025.11.6 } - -#### Feature Enhancements - -- Introduced Service Users and Enhanced Token Management - - Added dedicated accounts for API integrations, separating service credentials from personal user accounts. - - Service Users include automatic token generation, making it easier to set up integrations and manage automated workflows. - - The Tokens page has been redesigned with a new tabbed layout that separates `Personal Tokens` from `Service Tokens`, with quick navigation to user details and improved search capabilities. - - Token generation has been improved with download-as-file support, clearer copy feedback, and the ability to generate tokens directly from the user settings dropdown. - -- Added historical settings view for flow executions. - - Flow execution actions now display the configuration used during their execution. - - Each action's settings are preserved, enabling accurate historical review and troubleshooting of past executions. - - Actions in the flow execution view are now clickable, allowing users to inspect their historical configuration details. - -- Introduced `Discarded` status for anomalies - - New archive option allows marking anomalies as no longer relevant without implying resolution or error. - - Added ability to reactivate acknowledged anomalies, allowing them to be moved back to the active state. - -- Improved computed table creation for SQL Server, Oracle, and Redshift. - - Autocomplete suggestions now display table names with schema prefixes for these JDBC datastores. - -#### General Fixes and Improvements - -- Corrected issue where operation status remained unchanged after completion in container activity displays. - -- Resolved webhook integration issues for Microsoft Teams and Slack that prevented interactive features from working properly. - -- General Fixes and Improvements. - -### 2025.10.23 { id=2025.10.23 } - -#### Feature Enhancements - -- Expanded Command Palette with quick access to creation actions across datastores, flows, templates, and settings. - -- Enhanced operation tracking by adding end time display in datastore activity and navigation links for container profiles and scans. - - Operation duration tooltips now show completion time for finished operations. - - Profile and scan tooltips now include clickable links in tooltips that navigate to the corresponding operation in the activity view. - -- Added abort option for flow executions. - - New abort action available in flow execution list and details pages. - -#### General Fixes and Improvements - -- Fixed volumetric chart threshold bar calculations to correctly use the configured window size in Absolute and Percentage Change comparisons. - -- Corrected missing runtime display for fast export operations. - -- Improved Quality Score calculation reliability and error handling. - -- Fixed table count display showing double the actual number of tables in Snowflake and Oracle datastores when members belong to multiple teams. - -- Added validation to prevent computed fields from being used as partition or incremental fields in container configurations. - -- Corrected user list filtering and sorting errors when combining team filters with team-based sorting. - -- Resolved container profile creation errors caused by concurrent operations processing inferred quality checks. - -- Corrected materialize operation failures for glob-pattern containers by sanitizing invalid characters in output table names. - -- Resolved Quality Score calculation failures when container rowcount - -- General Fixes and Improvements. - -### 2025.10.15 { id=2025.10.15 } - -#### Feature Enhancements - -- Introduced fuzzy search to form and filter inputs. - - Search results now tolerate typos and partial matches for more natural filtering. - -- Improved Expected Values and Required Values check configuration with visual warnings for spacing issues. - - Values with trailing or leading spaces now display in warning-colored chips. - - A tooltip will show when a value containing extra spaces. - -- Added informational message to Flow action datastores selection explaining filter criteria. - -- Improved DFS datastore overview to display file format type. - -#### General Fixes and Improvements - -- Fixed data write failures in BigQuery enrichment datastores caused by message size limits exceeding API thresholds. - -- Optimized operation triggering endpoint performance, including scheduled runs. - -- Improved Quality Score calculation accuracy according to Quality Score Dimensions. - -- Fixed breadcrumb navigation not updating correctly when cloning checks and changing field or container context. - -- Improved background task processing for enhanced system reliability and performance with optimized task execution. - -- General Fixes and Improvements. - -### 2025.10.3 { id=2025.10.3 } - -#### Feature Enhancements - -- Optimized computed tables, files, and joins creation process. - - Now the creation is much faster with optimized validation and asynchronous profiling. - - Added "Validate" button to check only syntax and semantics, eliminating wait times for full data profiling. - -- Enhanced Quality Score calculation with improved clarity and transparency. - - Renamed "Quality Score Factors" to "Quality Score Dimensions" throughout the application for better conceptual understanding. - - Quality scores now better reflect data fitness for intended use cases rather than simple error counts. - -- Introduced "Has Logs" filter to display operations that completed with logs. - -- Added sort by "Last Triggered" option to the Flows list page for better workflow management. - -- Improved page metadata for better link sharing across Flow, Check, Anomaly, Library, and Enrichment pages. - -#### General Fixes and Improvements - -- Fixed validation error when clearing filter clause fields in computed table and join forms. - -- Corrected Ctrl+C copy functionality that was blocked by command palette shortcuts. - -- Resolved delete button visibility for archived anomalies in both light and dark themes. - -- Fixed inconsistent text styling for "No inference" label. - -- Corrected catalog operation incorrectly identifying Iceberg metadata files as data files. - -- Resolved bulk selection checkboxes disappearing after multiple select/deselect cycles. - -- Fixed error when updating computed tables with excluded fields. - -- Corrected icon alignment in collapsed datastore tree view sidebar. - -- Resolved missing background color for "Not Asserted" status in Insights checks section. - -- Fixed misleading error messages when attempting to edit comments on archived anomalies. - -- Corrected a regression in computed joins that prevented using columns with non-normalized names in join conditions. - -- General Fixes and Improvements. - -### 2025.9.17 { id=2025.9.17 } - -#### Feature Enhancements - -- We are happy to announce the new Keyboard Commands feature - - Execute common actions using context-sensitive shortcuts that adapt based on your current location and selection within the application. - - Quickly navigate between main pages using intuitive multi-key sequences with the new "Go to" shortcuts. - - Press `G` followed by a specific key to quickly jump to pages like: `G` + `E` for Explore, `G` + `L` for Library, `G` + `T` for Tags, and etc. - - Enhance Tab navigation allows smooth movement through interface elements using `⌥` / `Alt` + `←` and `⌥` / `Alt` + `→` with clear visual focus indicators. - - Update the global search shortcut to be accessible via `⌘`/`Ctrl` + `Shift` + `F`. - - Access the Command Palette by pressing `⌘`/`Ctrl` + `K` to search, navigate, and execute actions without leaving your current context. - - View a complete list of all available keyboard shortcuts by pressing `⌘`/`Ctrl` + `/` for easy reference and learning. - -- Improved hover highlighting to Data Preview, Source Records, and Enrichment tables for consistent user experience across all data views. - -- Enhanced queries with metadata comments for better cost tracking and operation identification in query logs. - -#### General Fixes and Improvements - -- Fixed profile operations failing on BigQuery tables with nested record types. - -- Limited anomaly rollup threshold to 1,000 with visual markers to prevent system overload from excessive anomaly generation. - -- Fixed dataDiff validation errors when using computed fields as row identifiers. - -- General Fixes and Improvements. - -### 2025.9.12 { id=2025.9.12 } - -#### Feature Enhancements - -- We are thrilled to introduce the Profiles Over Time for tracking field-level data changes - - Users can now compare the current field profile with previous profiles to track changes. - - Visual indicators highlight metrics that changed between selected profiles. - - Interactive charts display numeric metric trends across profile history. - - Easily identify data drift and type changes at the field level. - - Special badges indicate when field types have changed between profiles. - -- Introducing the `Data Diff` check as an enhancement of the Is Replica Of functionality. - -- Enhanced File Profile visibility with file format display and improved handling of long names with tooltips. - -- Improved hover contrast for list items in light mode for better visibility. - -- Optimized slim profile logic to protect existing field typing from being overwritten by limited data samples. - -- Added OAuth support to the Databricks connector. - -#### General Fixes and Improvements - -- Fixed broken enrichment datastore redirect link in the datastore tree footer. - -- Corrected filter application in `Exists In` checks that was causing inaccurate anomaly detection. - -- Fixed grouped inference checks to properly validate against filtered test data for each group combination. - -- Resolved `Is Address` check failing to assert during scan. - -- Removed `User Defined Function` check support. - -- General Fixes and Improvements. - -### 2025.9.4 { id=2025.9.4 } - -#### Feature Enhancements - -- Introducing Product Updates - - Users can now view feature announcements directly within the application. - - Read full posts by clicking the external link for each update. - -- Enhanced filter clause display in readonly checks with copy functionality and improved text formatting. - -#### General Fixes and Improvements - -- Resolved an issue where the API allowed creation of quality checks with string fields for rules that don't support them. - -- Corrected cache logic to avoid unnecessary data refresh in insights. - -- Fixed input field overflow when entering long filter values that caused UI layout issues. - -- Fixed Data Preview errors when filters return no records, now properly displays empty results instead of failing with a server error. - -- Fixed activation failures for Exists In checks that reference computed fields. - -- Fixed issue where rule type filter options did not appear on the check list page for Member users. - -- Updated enrichment processing for more frequent and reliable data writes. - -- General Fixes and Improvements. - -### 2025.8.20 { id=2025.8.20 } - -#### Feature Enhancements - -- Introducing Bulk Quality Check Creation through Templates - - Users can now create multiple quality checks from a single template. - - Select multiple target containers across different datastores and apply the same template configuration. - -- Announcing Pause Schedule operation - - Users can now deactivate and reactivate schedules without losing configuration. - - Added a new filter option to show only deactivated schedules. - -- Introducing Test Connection capability for existing connections - - Users can now verify connection changes before saving when editing a connection configurations. - -- Improved isReplicaOf check to better handle incremental data comparisons. - -- Added support for connecting to Kerberos-secured Hive datastores. - -#### General Fixes and Improvements - -- Fixed Data Preview filtering to properly indicate that computed fields are not supported in WHERE clauses and not exposing as auto complete options. - -- Fixed issues related to ANSI SQL compliance in Spark 4. - -- Fixed issues with nested data types in the Databricks connector. - -- Corrected inconsistent formatting in operation details where containers read appeared larger than total containers. - -- Resolved filter UI issues where selected items caused layout misalignment. - -- General Fixes and Improvements. - -### 2025.8.8 { id=2025.8.8 } - -#### Feature Enhancements - -- Enhanced Source Record visualization - - Users can now view more source records with selectable limits (10, 100, 1000, or 10000 records). - - Added sticky headers for easier navigation when scrolling through large datasets. - -- Introducing Quality Check Migration - - Users can now migrate quality checks from one container to another, even across different datastores. - - Archived and inferred checks are excluded from migration. - - Migrated checks are set to Draft status for users review before activation. - -- Enhanced search functionality for datastores and flows - - Users can now search by ID or name using a single search field. - -#### General Fixes and Improvements - -- Updated Dataplane to Spark 4 - -- Fixed Is Replica Of dry run validation to correctly handle filtered datasets. - -- Resolved an issue where anomaly action buttons redirect to the details page instead of performing the intended action. - -- Corrected the navigation issue when switching between the Checks and Observability tabs that prevented lists from rendering properly. - -- General Fixes and Improvements. - -#### API Changes - -- The following endpoint `GET /operations` is affected: - - Added `start_date` and `end_date` query parameters to filter operations by date range. - -### 2025.7.28 { id=2025.7.28 } - -#### Feature Enhancements - -- Improved Spark SQL autocomplete handling for complex field names - - SQL autocomplete now automatically adds backticks to field names, preventing errors with special characters. - -#### General Fixes and Improvements - -- Resolved an issue where scheduled operations were not executing reliably under high load. - -- Fixed last asserted timestamp accuracy for all check types. - -- General Fixes and Improvements. - -### 2025.7.23 { id=2025.7.23 } - -#### Feature Enhancements - -- Simplified Computed Join prefix management - - Select expressions automatically adjust when prefixes change, eliminating manual field name updates. - -- Added User Guide links to Check Creation form - - Selecting a Rule Type provides a direct link to that specific rule's documentation in the User Guide. - -#### General Fixes and Improvements - -- Corrected Quality Check Update errors affecting `Greater Than Field`, `Less Than Field`, and `Equal To Field` rule types. - -- Fixed source record display for high-precision decimal values - - Source records now display full decimal precision on hover for truncated numeric values. - -- General Fixes and Improvements. - - -### 2025.7.18 { id=2025.7.18 } - -#### Feature Enhancements - -- Introducing Computed Join for creating new containers by joining data across different datastores - - Users can now create computed joins between two containers, even from different datastores, enabling cross-datastore data analysis. - - Supports multiple join types: Inner Join, Left Join, Right Join, and Full Outer Join to accommodate various data combination needs. - - Configure joins using intuitive left and right reference selections with field mapping and optional prefixes. - - Add custom SELECT expressions and WHERE clauses to refine the joined data output. - -- Introducing Dry Run operation for draft checks - -- Enhanced Bulk Check Operations and Management Capabilities - - Added metadata field to bulk update dialog, enabling users to update metadata across multiple checks simultaneously without opening each individually. - - Extended bulk operations to support archived checks, previously limited to active only. - - Bulk activate and draft actions now available for archived checks, expanding beyond the previous delete-only option. - -- Added Subject Field to Email Notifications - - Email notifications now support customizable subject lines, allowing users to add meaningful context to their messages. - -- Enhanced Record Limit Configuration - - Users can now manually input custom record limit values in Profile and Scan operations, as well as Flow operations through a text field, providing flexibility beyond the predefined options. - - A dropdown menu provides quick access to common values (1M, 10M, 100M, All). - -- Adding Unlink Enrichment Datastore - - Users can now unlink enrichment datastores directly from the "Enrichment Datastore Settings" dialog. - -- Improved Datastore Deletion Experience - - Error messages during deletion now appear directly within the confirmation dialog instead of temporary toast notifications. - - When deleting an Enrichment Datastore, the dialog now displays the number of linked source datastores and uses clear labeling to distinguish between datastore types. - -- Enhanced catalog operation to properly recognize subdirectories within partitioned file structures, ensuring more accurate container identification for complex directory hierarchies. - -#### General Fixes and Improvements - -- Addressed modal dismissal issues across multiple dialogs where clicking outside or pressing ESC would cause accidental closure and data loss. - -- Fixed "Open in new tab" and "Copy link" actions for checks and anomalies that were not functioning correctly. - -- Fixed source record formatting for 'Is Replica Of' anomalies when check configuration changes after anomaly detection. - -- Fixed an issue where anomaly URLs generated from check side panels were not functioning correctly when shared. - -- Fixed incorrect redirection after creating checks from templates. - -- Fixed an issue where source records weren't displaying correctly during dry run operations. - -- Corrected cloning behavior to preserve tags from the check being cloned. - -- Fixed scan operations failing after deleting or unlinking enrichment datastores. - -- Corrected failed checks information in anomaly responses to accurately reflect the historical check version at the time the anomaly was detected, rather than showing the current check version. - -- General Fixes and Improvements. - -### 2025.7.2 { id=2025.7.2 } - -#### Feature Enhancements - -- Introduced Failed Check Version display, providing visibility into the exact check configuration that triggered each anomaly. - - Failed Check now displays the specific check properties and configuration that were active when the anomaly was generated. - -- Enhanced Check Activities visualization. - - Users can now view historical check configurations directly from the timeline, including all properties and tags as they were at that point in time. - -- Enhanced flow nodes with improved visual design and contextual information display for better user experience. - - Action nodes now show inline summaries with relevant details based on their type (e.g., datastore names for operation actions, channel names for Slack or Teams, URLs for webhooks, etc). - - Export nodes now display asset types in their titles (e.g., "Export Anomalies"). - - Added filter tooltips to trigger nodes displaying applied conditions (tags, datastores, operation types) for quick configuration visibility. - -- Supports Data Preview functionality for containers that haven't been profiled yet, removing the requirement to profile first before viewing data. - -- Enhanced editing flexibility for Asserted Checks. - - Users can now edit SparkSQL expressions that define calculated fields. - - Row Identifiers and Passthrough Fields are now editable for Is Replica Of Check. - -- Improving Computed Assets: - - Users can now add Additional Metadata to computed Tables/files and computed fields. - - Display the Last Editor information in the tree footer to provide context on who last modified the asset. - -- Added Last Profile visibility in Field Overview and Field Details. - - Users can now see the last time a field was profiled, helping clarify the timeframe of the metrics shown in the Profile section. - -- Improved Anomaly Bulk Archive with comment support. - - Similar to Acknowledge Anomaly, users can now add optional comments when bulk archiving anomalies. - -- Improve dry run result message readability. - -#### General Fixes and Improvements - -- Fix a bug when user selected a date in Date Picker and this return user's timezone instead of UTC timezone. - -- Fixed an issue with Metadata Checks Dry Run execution where status messages were not displaying properly. - -- General Fixes and Improvements. - -### 2025.6.20 { id=2025.6.20 } - -#### Feature Enhancements - -- Added Source Records Download for Check Dry Run: Users can now download the source records as a CSV file after executing a Dry Run. - -- Improving Source Records Performance: Implemented caching for anomaly source records, significantly reducing load times and improving in user session level. - -#### General Fixes and Improvements - -- General Fixes and Improvements. - -### 2025.6.13 { id=2025.6.13 } - -#### Feature Enhancements - -- Introducing Quality Check Dry Run: Users can now quickly assess the impact of a quality check without persisting results. - - The Dry Run functionality is accessible directly from the Data Quality Check settings configuration, enabling users to test checks before scan assertion. - - A comprehensive modal displays the execution results, presenting critical metrics including Dry Run status, operation time, and sampling limits. - - Dedicated section display potential Anomalies and Source Records that would be generated by the check. When no issues are detected, users receive a clear confirmation message indicating no anomalies were identified. - -- Enhancing Fingerprint Visualization: Users can now easily view and manage related anomalies that share the same fingerprint. - - Clicking "View Related Anomalies" opens a right-side panel displaying all anomalies with matching fingerprints, including the total count of related anomalies. - - The panel enables direct anomaly management, allowing users to acknowledge, archive, or click individual cards to view detailed anomaly information without navigating away. - -- Introducing Sticky Navigation: Users can now maintain access to navigation elements and actions while scrolling through content-rich pages. - - The sticky navigation feature ensures breadcrumb information and interaction buttons remain visible and accessible as users scroll down the page. - -- Expanding Scan Operation Support for Iceberg Tables - - Incremental scans now fully support Iceberg table formats, significantly expanding the range of asset types eligible for incremental scanning operations. - -#### General Fixes and Improvements - -- Resolved an issue where metric charts failed to display data when users accessed metric details. -- Fixed a bug that incorrectly allowed users to edit settings on computed fields inherited from parent computed files. -- Corrected the rendering logic for Authored Check Details that prevented information from displaying after tag update operations. -- General Fixes and Improvements. - -### 2025.6.6 { id=2025.6.6 } - -#### Feature Enhancements - -- Introducing the new Quality Check dedicated page, enabling users to analyze check properties and metrics. - - A Check Assert Visualization is provided to analyze assertions over time, helping users monitor assertion results, with the ability to hover over a timeline point to view the latest assertion and totals. - - Displays key metrics such as Status, Rule Type, Last Asserted, Weight, Coverage, and Active Anomalies and including the check description. - - Exposes all relevant check properties to provide a comprehensive view of each check's configuration without opening the edit modal. - - Shows the full activity history for the check, including property updates, and exposes previous and new values when a check setting is modified. - - Supports inline check tag editing by clicking the tag badge, allowing users to add or remove tags without opening a modal. - -- Announcing the Anomaly exclusive page: This new page will allow users to get detailed information about Anomaly metrics, Failed Checks and Source Records. - - Exposes detailed anomaly information, including Status, Anomalous Records, Total Failed Checks, Weight, Detected DateTime, and Scan Operation, as well as Source Datastore, Computed Table, and Location. - - Lists the Failed Checks that were violated and led to the creation of the anomaly. Clicking on a failed check opens a right-side panel with the corresponding quality check information, eliminating the need to navigate to a different page. - - Show Source Records from your data that failed the checks when available. Users can apply filters and sorting options to personalize the data display according to their preferences. - - Displays the complete activity history, including all updates made to the anomaly over time. User comments are also shown, making it easier to follow discussions and decisions. - - Similar to the dedicated Quality Check page, users can edit Anomaly Tags inline. - -- Datastore Connection Status Visibility - - A badge attached to the datastore icon now appears in both the breadcrumb and the tree view footer, clearly indicating the connection status of the datastore. - -- Adding support for gzipped and .txt files in Catalog Operation - - Users can now use gzipped (.gz) and .txt files in DFS Datastores for Catalog Operations. - -#### General Fixes and Improvements - -- General Fixes and Improvements. - -### 2025.5.23 { id=2025.5.23 } - -#### Feature Enhancements - -- Atlan Integration - - Users can now choose whether or not to receive notifications in the Atlan platform, giving more control over their notification preferences. - -- Freshness Heatmap - - The freshness chart has been redesigned for an improved user experience. - - Milliseconds are now displayed in a more readable date/time format for better comprehension, while the underlying data still uses milliseconds. - -#### General Fixes and Improvements - -- Create User - - Fixed a bug that occurred when creating a service user with automatic admin permission enabled. - -- Rerun Operations - - Catalog, export, and materialize operations will now only display rerun operations. - -- General Fixes and Improvements. - -### 2025.5.16 { id=2025.5.16 } - -#### Feature Enhancements - -- Anomaly - - Users can now view the Anomaly Fingerprint directly in the Anomaly Details page. - - A new button allows users to quickly copy the fingerprint value. - - A link to the User Guide has been added to explain how this feature works. - -- Datastore Connection - - A new validation step was added to several connectors to verify if the specified schema exists. - -#### General Fixes and Improvements - -- Schedule Operation - - Fixed a bug in scheduled operations that allowed `None` as a value for `max_records_analyzed_per_partition` when updating. - -- Check - - Fixed an issue where creating a metric check with a non-existent comparison value would fail.. - - Fixed a bug where checks would fail if the filtered set was empty — now the check will pass in this case. - -- Catalog Operation - - Fixed an issue in DB2 where evaluating the distribution of values caused an error. - -- Scheduled Scan - - Fixed an issue that occurred when adding connection retries related to the Secrets Manager. - -- Anomaly - - Fixed an issue where some triggered anomalies had no data available. - -- General Fixes and Improvements. - -### 2025.5.9 { id=2025.5.9 } - -#### Feature Enhancements - -- Microsoft Teams Integration - - We're excited to announce a native integration with Microsoft Teams, bringing powerful collaboration features directly into your Teams workspace. - - Users can now: - - Share Qualytics links to datastores, containers, or fields and see rich previews directly in Teams. - - Receive proactive notifications when: - - An operation completes - - An anomalous table or file is detected - - A specific anomaly is triggered - - Note that the message content and actions will adapt based on the trigger type defined in the Flow. - - Manage anomalies without leaving Teams: - - View, acknowledge, comment on, or archive anomalies from within the Teams UI - - Click to open linked anomalies directly in Qualytics - - The integration must be configured by a Qualytics admin. A dedicated setup guide is available in our User Guide. - - As part of this rollout: - - Any Flows previously configured to send Teams notifications via incoming webhooks or workflows (Teams) have been automatically migrated to the Webhook action. - - The Teams notification action is now only available through the new integration. - -- Tokens - - Users can now view the last time a token was used. - -- Session Expiration - - Improved handling of session expiration for users who are logged in but inactive for an extended period. - -#### General Fixes and Improvements - -- Check Template - - Fixed an issue with the message displayed when a user archives a check that has associated checks. - -- General Fixes and Improvements. - -### 2025.5.5 { id=2025.5.5 } - -#### Feature Enhancements - -- Tokens - - Users can now view the last time a token was used, providing better visibility into token activity. - -#### General Fixes and Improvements - -- Is Replica Of Check - - Fixed a bug where anomalies using pass-through fields on both the left and right side were not handled correctly. - -- Action Operations - - Fixed an issue where cloning an Action Operation could exceed the allowed action limit. - -- Group By - - Fixed a bug that occurred when users added single quotes to string columns in the Group By clause. - -- Atlan Sync - - Updated and created custom metadata objects to align with the latest schema. - -- General Fixes and Improvements. - -### 2025.4.24 { id=2025.4.24 } - -#### Feature Enhancements - -- Improved Filters - - Tag Filter - - Users will only see tag options corresponding to items currently visible in the list pages (Datastore List, Container List, and Filter List). - - The same filtering behavior has been applied to Anomalies and Checks within the datastore context. - - If no visible items contain a specific tag, a `No option found` message will be displayed in the filter dropdown. - -- Scan Operation - - Scan form - - The scan form has been reorganized to improve the user experience. - - Now, the following steps to configure the Scan Flow are Check Categories, Reading Settings and Scan Settings. - - Enrichment Settings - - The Remediation Strategy option is now in the Enrichment Datastore Settings. - - The option will be a Datastore global value. - - Also, the Anomaly Rollup Threshold and Source Record Limit can be configured as defaults. - - During scan operations, these options will be pre-filled but can still be edited within the scan form. - -- Tree View - - The tree view layout is now adjustable, allowing users to customize it to their preferences. - - The footer in the tree view can be expanded or collapsed based on user needs. - -#### General Fixes and Improvements - -- Filters - - Fixed an issue where filters behaved inconsistently when navigating between different datastores. - -- The container page is not loading - - Fixed a bug that caused the container page to fail to load under certain conditions. - -- General Fixes and Improvements. - -#### API Changes - -- Incoming Breaking Changes - - REQUEST PAYLOAD: The fields `enrich_only` and `enrichment_only` will be replaced by `enrich_container_prefix` and `enrichment_prefix` and will affect the following endpoints: - - `POST /datastores` - - `PUT /datastores/{id}` - - RESPONSE PAYLOAD: The fields `enrich_only` and `enrichment_only` will be replaced by `enrich_container_prefix` and `enrichment_prefix` and will affect the following endpoints: - - `GET /anomalies/{id}` - - `PUT /anomalies/{id}` - - `POST /containers` - - `GET /containers/{id}` - - `PUT /containers/{id}` - - `GET /containers/{id}/profile` - - `GET /containers/{id}/scan` - - `POST /containers/{id}/scan` - - `PATCH /containers/{id}/favorite` - - `GET /container-profiles/{id}` - - `GET /container-scans/{id}` - - `POST /datastores` - - `PUT /datastores/{id}` - - `GET /datastores/{id}` - - `PATCH /datastores/{id}/favorite` - - `PATCH /datastores/{datastore_id}/enrichment/{enrich_store_id}` - - `GET /field-profiles/{id}` - - `POST /operations/schedule` - - `PUT /operations/schedule/{id}` - - `GET /operations/schedule/{id}` - - `GET /operations/{id}` - - `POST /operations/run` - - `PUT /operations/run/{id}` - - `PUT /operations/rerun/{id}` - - `PUT /operations/abort/{id}` - - `POST /operations/run`, `POST /operations/schedule`, `PUT /operations/schedule/{id}`, `POST /flows, and PUT /flows/{id}` - - DEPRECATE PARAMETER: `remediation` (To specify a remediation strategy going forward, use the new `enrichment_remediation_strategy` field available in the POST /datastores and PUT /datastores/{id} endpoints.) - -### 2025.4.11 { id=2025.4.11 } - -#### Feature Enhancements - -- Anomalies and Checks Filter - - The Rule filter is now dynamically populated based on the types present in the current view. - - Each rule type displayed in the filter now includes a counter showing the total number of occurrences. - -- Status Page - - The Health page has been renamed to Status page. - - Users can view additional information like Cloud Platform and Deployment Size. - - Deployment size details are now displayed to provide better visibility into environment configurations. - -#### General Fixes and Improvements - -- Anomaly - - Resolved a bug when handling `NaN` values in float-type data. - -- General Fixes and Improvements. - -### 2025.4.5 { id=2025.4.5 } - -#### General Fixes and Improvements - -- Quality Score - - Enhanced the descriptions for each Factor Weight to provide clearer guidance on how they impact the overall score. - -- General Fixes and Improvements. - -### 2025.3.28 { id=2025.3.28 } - -#### Feature Enhancements - -- Anomalies - - The “Anomalies Identified” count now shows the sum of Open and Archived anomalies. - - Anomalies are now categorized into two groups: - - Open: anomalies currently active (Active, Acknowledged). - - Archived: anomalies that have been archived (Resolved, Duplicated, Invalid). - - Users can now view the total counts of Duplicate and Invalid anomalies in the Overview tab under the Explore page. - - Users can now see the total counts of Open and Archived anomalies directly in Scan Operations. - - The Scan Results modal now displays the totals for Open and Archived anomalies. - - Users can filter anomalies by status using a new dropdown selector. - -- Quality Checks - - Users can now sort the Quality Checks list by the “Last Asserted” date. - -#### General Fixes and Improvements - -- Teams Permissions - - Fixed an issue where users with the Drafter role were unable to restore a check as a draft. - -- General Fixes and Improvements. - -### 2025.3.23 { id=2025.3.23 } - -#### Feature Enhancements - -- Slack Integration - - We are excited to introduce a major enhancement to our integration with Slack. - - Users can now add the new Qualytics Slack App for enhanced capabilities. - - Qualytics admins can configure the Slack Integration with two easy steps. - - After configuring the integration, a Slack administrator must approve the Qualytics Slack App. - - The Qualytics Slack App supports selecting specific Slack channels for receiving Qualytics notifications in the context of a Qualytics Flow. - - Different types of messages will be sent for each trigger in Flow operations. - - The text and actions will vary depending on the selected trigger. - - The message state (Slack message color) will change based upon the message status. - - The Qualytics Slack App allows users to interact with Qualytics from the Slack interface: - - Interact with anomalies by acknowledging, commenting, or archiving them without leaving the Slack UI where the flow notification is received. - - Click a link in Slack to be redirected to the Qualytics UI for more details regarding a specific notification. - - View anomalous tables and files detected without leaving Slack. - -- Anomaly Fingerprint - - We are thrilled to introduce support for a new feature that will begin identifying duplicate anomalies. - - Anomalies created after this release will be "fingerprinted" so that re-detection of that same anomaly can be readily identified as a duplicate detection. - - New Scan Operation options allow users to define how detected duplicates should be handled. - - This feature helps maintain the history and timeline of specific data errors, allowing users to track how long a specific issue has persisted and a log of detections over time. - - Anomaly fingerprints will also be exposed in API responses and written to enrichment - -#### General Fixes and Improvements - -- External Scan - - Users can now use and rerun external scans only from the activity listing for the targeted asset. -- Check Last Asserted - - Fixed an issue where checks were still being marked as never asserted even after producing anomalies. - -#### API Changes - -- Integration Impacting Changes - - POST & PUT api/integrations - - REMOVED PARAMETERS: name and api_token - - NEW PARAMETERS: api_access_token, api_refresh_token and api_service_token - - POSTs to api/flows/actions/notifications/ endpoints - - MODIFIED PARAMETERS: tokenized_message is now a json object instead of a string - - All requests to api/datastores endpoints - - REMOVED RESPONSE PROPERTY METRIC: The metric for archived_anomalies previously returned as metrics.archived_anomalies has been removed from responses - -- Deprecation Notices - - POST api/operations/run - - DEPRECATED PARAMETER: archive_overlapping_anomalies (migrate to the new parameter archive_duplicate_anomalies for enhanced functionality) - - POST api/operations/schedule - - DEPRECATED PARAMETER: archive_overlapping_anomalies (migrate to the new parameter archive_duplicate_anomalies for enhanced functionality) - -### 2025.3.17 { id=2025.3.17 } - -#### Feature Enhancements - -- Activity Operation - - Added a column showing the anomaly rollup threshold. - -- Export Operations - - Added an option allowing users to schedule Export Operations. - -- DFS Enrichment Datastore - - Normalized delta file names to lowercase. - -#### General Fixes and Improvements - -- Anomaly Rollup Threshold - - Fixed an issue where the field was not accepting the maximum value. - -- Volumetric Tracking Observability - - Fixed an issue where inferred check validation errors disrupted observability measurements. - -- Export Operation - - Updated wording on the Export dialog. - -- Scan and External Scan - - Fixed an issue where schema checks were failing along with other checks but were not persisting in the enrichment of source records for anomalies. - -- External Scan - - Fixed an issue where CSV data was not being properly cast for non-text fields. - -- Enrichment Datastore - - Fixed a bug where exported tables were not appearing in the UI. - -- General Fixes and Improvements. - -### 2025.3.5 { id=2025.3.5 } - -#### General Fixes and Improvements - -- Tag Updating - - Fixed an issue where some containers failed to receive tag changes when updating tags across multiple containers or performing bulk updates. - -- Edit Scheduled Materialize Operation - - Fixed an issue where the modal did not appear when users attempted to edit a scheduled materialize operation. - -- Restart Analytics Engine - - Fixed an issue where restarting the Analytics Engine did not take effect. - -- Anomaly Count - - Fixed an inconsistency in the anomaly count. - -- General Fixes and Improvements. - -### 2025.2.26 { id=2025.2.26 } - -#### Feature Enhancements - -- Enrichment Operations - - Introducing Materialize Operation - - This will "capture a snapshot" of selected containers from your source datastore and export them to the enrichment datastore for seamless data loading. - - Users can define the maximum number of records to be materialized per table. - - A schedule option is available for users to set up and schedule the operation according to their needs. - - Introducing Export Operation - - Users can extract metadata from selected assets in their source datastore and export it to the enrichment datastore for seamless integration. - - Assets metadata options are available to export to the enrichment datastore. Users can export: - - Anomalies - - Quality checks - - Field profiles - - These operations are available in Flow Action. - -- Flows - - Introduced a cloning feature for actions in flow. - - Users can now clone a simple action by clicking the vertical ellipses. - -- Scan Operation - - Introducing Anomaly Rollup Threshold - - Users can now roll up anomalies that will be created per check before they are merged into a single rolled-up anomaly. - -- Error Messages - - Improved custom messages when users receive 502 and 503 status codes. - -#### General Fixes and Improvements - -- System Timestamp - - Standardized timestamps across the platform. - -- External Integrations - - Fixed an issue where external tags should be updated instead of being deleted and dropped during sync. - -- General Fixes and Improvements. - -### 2025.2.13 { id=2025.2.13 } - -#### Feature Enhancements - -- Explore View - - Users can now refresh the Insights data. - - A label will indicate when the page was last refreshed. - -- System Appearance - - Users can now select the `System` theme. - - This setting automatically adjusts based on the user's system theme, switching between dark and light mode. - - Users can still manually select dark or light mode. - -- Dismiss Popup Window - - Users can now dismiss popup windows by pressing the `Esc` key, improving the user experience. - -#### General Fixes and Improvements - -- External Scan - - Fixed an issue where attempting to run an external scan resulted in a "Request Failed" error message. - -- Explore View - - Fixed an issue causing excessively long loading times. - -- General Fixes and Improvements. - -### 2025.2.6 { id=2025.2.6 } - -#### Feature Enhancements - -- Overview Improvement - - Added inferred and authored check totals - - Users can now view the total number of inferred and authored checks, along with a comparison timeframe. - - A redirect link allows users to access the checks directly, displaying only their current statuses. - - Improved check assertion-related metrics to reflect assertions as of the report date. - -- Team Permissions - - Manager users can now update datastore teams. - - Requires `Editor` permission within the team. - -#### General Fixes and Improvements - -- Flow Graph - - Fixed an issue where the flow graph position was randomly changing when a user updated a flow-node. - -- Observability Chart - - Fixed an issue where threshold calculations incorrectly referenced measurement values that did not account for grouping. - -- General Fixes and Improvements. - -#### Breaking Changes - -- Container Overview Tab - - Refactored the Totals section to clarify that metrics are based on sampled data rather than the full dataset. - - Added the sampling percentage next to the spark chart to indicate that derived metrics are based on this sampling percentage. - - Updated titles and labels for better clarity. - -### 2025.1.31 { id=2025.1.31 } - -#### Feature Enhancements - -- Freshness View - - We are excited to introduce the "Freshness View" feature in Qualytics! - - Users can now visualize both volumetric and freshness checks within the same tab. - - The displayed data includes: - - Unit: Day, Month, Hour, etc. - - Maximum Age: Defines the maximum allowed time since the last data update. - - Last Asserted: Indicates the last time the data was validated. - -- Datastore Filter Condition in Flows - - Users can now configure datastore filter conditions in triggers for flows, enhancing control over triggered actions. - -- Treat Empty Value as Null for DFS - - A new option allows users to enable "Empty value as null" as the default behavior for File Patterns, improving data consistency. - -#### General Fixes and Improvements - -- General Fixes and Improvements. - -### 2025.1.24 { id=2025.1.24 } - -#### Feature Enhancements - -- Introducing Freshness Tracking in Containers - - Users can now enable a freshness tracking option for containers to measure and record the last time data was added or updated in a data asset. This helps ensure data timeliness and identifies pipeline delays. - -- Private Routes on Analytics Engine - - Customers using private routes can now view their IP addresses along with relevant messages displayed in the Analytics Engine for improved transparency. - -- Clone a Flow - - Users can duplicate existing flows, streamlining the process of reusing and modifying flow configurations for similar scenarios. - -- Additional Option to Execute Manual Flows - - A new "Start a Manual Flow" option has been added to the vertical ellipsis menu, providing users with enhanced flexibility for executing manual flows. - -- Cancel Action for Unpublished Flows - - A "Cancel" action has been introduced in the flow builder, allowing users to reset the graph to its initial state for unpublished flows. This update also addresses issues related to the execute button and read-only state logic. - -- "Is Replica Of" Passthrough - - The `IsReplicaOf` rule now supports a passthrough property, allowing users to exclude specific fields from assertions. Fields listed under this property are no longer flagged as anomalous. - -- Enhancement for Volumetric Rule Type - - Volumetric checks now include a `comparison` property, ensuring consistency with metric checks and offering greater flexibility in rule configurations. - -#### General Fixes - -- General Fixes and Improvements. - -### 2025.1.20 { id=2025.1.20 } - -#### Feature Enhancements - -- Enhanced behavior for "All" in Schedule Operations - - The "All" option in Schedule Operations has been updated to include future containers automatically. Previously, if you created a schedule with the "All" option and added new tables or containers later, the schedule would not include these new additions. - -- Validate Button for Enrichment Datastore Connections - - Users can now validate their data when creating or editing an enrichment datastore connection, improving reliability and confidence in datastore setups. - -#### General Fixes - -- Inaccurate Check Assertion Details - - Resolved an issue where some checks were being marked as never asserted despite producing anomalies, ensuring more accurate reporting. - -- General Fixes and Improvements. - -### 2025.1.16 { id=2025.1.16 } - -#### Feature Enhancements - -- Flows - - Introducing Flows: Users can now create automated pipelines by chaining actions and configuring triggers based on predefined events and filters. - - Triggers: Configurable based on events, filters, and operation conditions. - - Actions: Include notifications (Email, Slack, PagerDuty, etc.) and operations (catalog, profile, and scan). - - Real-Time Execution: Monitor execution history and real-time progress in the Flow Executions tab. - - - Setup Made Simple - - Add and configure flows using the “Add Flow” button in the top-right corner. - - Deactivate, delete or edit flows via the vertical ellipses or node configurations. - - - Enhanced Triggering Options - - Operations Complete, Anomalous Table/File Detected, and Anomaly Detected triggers provide flexible, event-driven automation. - - Fine-tune triggers using filters like tags, rule types, or anomaly weights. - - - Diverse Action Support - - Notify through in-app messages, Emails, Slack, Microsoft Teams, PagerDuty, and custom HTTP actions - - Trigger operational tasks across cataloging, profiling, and scanning. - - - Flow Identification on Activity Tab - - Operations executed by flows are marked in the new `Flow` column, displaying the associated flow name. - - Users can navigate directly to the flow execution view from this tab. - -#### General Fixes - -- Duplicate Anomalies on Scan Schedule Operations - - Fixed an issue where duplicate anomalies were not being archived during scan operations despite user selection. - -- BigQuery Message Size - - Enhanced default batch insertion size to improve performance and reliability. - -- Anomalous Record Integer out of Range - - Updated check metrics to use BigInteger, addressing large value handling. - -- Fix the Last Asserted Date - - Resolved inconsistencies in the Last Asserted Date logic for partition and container scans. - -- General Fixes and Improvements. - -#### Breaking Changes - -- Notification Rules Replaced by Flows. - - Existing notification rules have been migrated to Flows and will continue to function as before. - - For new notifications, the users must create a flow leveraging the Flows functionality. +--- +render_macros: false +--- + +# 2025 + +## Release Notes + +### 2025.12.23 { id=2025.12.23 } + +#### Feature Enhancements + +- Added Jira Cloud ticketing integration and enhanced ServiceNow with search and link capabilities. + - Connect with Jira Cloud or ServiceNow to streamline anomaly management through centralized ticket tracking. + - Introduced ticketing section on the anomaly page with quick actions for creating or linking tickets. + - Users can search for existing tickets and link them directly to anomalies. + - Supports retrieving ticket details by ID or key for status tracking. + +- Introduced Group by clause support for Computed Joins and Computed Files. + - Users can now define grouping expressions when creating computed joins and computed files, enabling aggregation functions in select clauses. + +#### General Fixes and Improvements + +- Improved Insights endpoint performance with optimized quality score queries. + +- Enhanced Agent Q with global data asset search, async operation monitoring, and metadata management capabilities. + +- General Fixes and Improvements. + +### 2025.12.12 { id=2025.12.12 } + +#### Feature Enhancements + +- Launched ServiceNow Ticketing System integration. + - Connect Qualytics with ServiceNow to streamline anomaly management through automated incident creation and tracking. + - Users can create ServiceNow incidents directly from anomalies via API, populating incident details automatically. + - Anomaly status changes in Qualytics are pushed to the linked ServiceNow incident as work notes. + - Comments added to anomalies are automatically synced to the corresponding ServiceNow incident. + +- Introduced Microsoft Purview Data Catalog integration. + - Connect Qualytics with Microsoft Purview to enrich catalog assets with actionable data quality context. + - Supports importing tags from Purview to replace matching Qualytics tags, ensuring consistent tagging and classification. + - Publishes quality scores and their dimensions, along with active check counts and active anomaly counts, to corresponding Purview assets. + - Event-driven synchronization keeps Purview up to date based on Qualytics events, including scan completions, anomaly status changes, anomaly archiving, check updates, and other actions that trigger quality score recalculation. + +- Added new beta Data Catalog integrations for Collibra and DataHub. + - Enables synchronization of Qualytics data quality metadata with external data catalog platforms. + - Supports importing tags from the catalog provider to replace matching Qualytics tags, keeping tags consistent across platforms. + - Publishes quality scores, active check counts, and anomaly metrics to corresponding catalog assets. + - Uses event-driven synchronization to automatically propagate metadata updates triggered by data quality events in Qualytics. + +- Enhanced Flows with scheduling support and node management improvements. + - Introduced scheduled trigger type, allowing users to configure flows triggered by cron expressions. + - Flow list now displays schedule information and next trigger time for scheduled flows. + - Included filters by trigger type and deactivation status to the flow definitions page. + - Enabled bulk activate and deactivate actions for flows. + - Incorporated Activate/Deactivate toggle to the Flow Settings panel for quicker access to flow status controls. + - Users can now rearrange action nodes after creation using drag-and-drop to move nodes and their descendants to a new parent. + - Swap functionality allows exchanging a node's position with its parent in a single click while maintaining flow hierarchy. + - Visual feedback during rearrangement indicates valid and invalid drop targets for intuitive editing. + +- Introduced Cast Type computed field. + - New computed field type allows casting fields to different data types without writing raw expressions. + - Supports standard SQL CAST function with direct JDBC dialect compatibility for improved cross-datastore portability. + - Enabled date format specification support for Cast Type computed fields when converting non-standard date and timestamp formats. + +#### General Fixes and Improvements + +- Corrected sampling metrics in container profiles where records processed could exceed total record count, resulting in inaccurate percentage calculations. + +- Adjusted the "Drop Suffix" option to be active by default in the Computed Field dialog. + +- Addressed Snowflake permissions error affecting enrichment operations in JDBC datastores. + +- Fixed quality score calculation that could produce negative accuracy values in certain conditions. + +- Removed auto-activation in check activation dialog to prevent accidental activations. + +- Corrected scan operations to properly report enrichment failures in operation results instead of showing success status. + +- Resolved row count mismatch between Overview and Observability charts caused by timezone alignment issues. + +- Fixed single-value `each()` keyword not generating permutations correctly in check templates. + +- Cleared Delta Table metadata cache issue that persisted after container operations completed. + +- Resolved connection verification failures not returning operation results to the Controlplane. + +- Updated Scan Settings labels and descriptions that caused confusion about threshold behavior and scanning limits. + +- Optimized materialize operation performance with enhanced partition calculation. + +- Added Engine information on the Settings Status page, displaying the deployment engine (Kubernetes, or Databricks). + +- Refined error messages for sync operation timeouts to better distinguish between Dataplane availability and datastore response issues. + +- Added visual in-progress indicator to Data Volume Over Time charts when measurements are still being recorded for the current period. + +- Included tooltip explanation on Data Volume charts indicating when current period measurements are still in progress. + +- Enhanced Data Volume charts to display the previous period's value as a placeholder when current period data is not yet available. + +- Optimized scan performance by eliminating unnecessary data shuffling when applying record limits. + +- Implemented bulk deactivate and activate actions for schedules within the datastore context. + +- General Fixes and Improvements. + +### 2025.11.27 { id=2025.11.27 } + +#### Feature Enhancements + +- Introduced Quality Score Over Time and enhanced Insights dashboard. + - Quality Scores are now tracked historically, allowing users to monitor data quality trends over time at the datastore, container, and field levels. + - Added interactive Quality Score charts displaying score progression with dimension-level breakdown. + - Introduced a new Containers Scanned metric with trend indicators in Insights + - Added the Anomaly Rule Type Distribution histogram in Insights to identify which rule types generate the most anomalies. + - Quality Score Dimensions now include detailed explanations and recommendations for scores below 30. + - Added preview charts for field metrics, providing at-a-glance trend visualization alongside each metric. + - Reorganized Insights page layout with improved section grouping for better visual hierarchy. + - Quality Score history is available at both the total score and individual dimension levels for detailed trend analysis. + +- Introduced automated anomaly lifecycle management with new Archive and Delete flow actions. + - Both actions target anomalies with no recent activity, including status updates, assignments, or comments within the specified inactivity timeframe. + - Archive action supports status selection, optional tag assignment, and comments to provide context during archiving. + - Anomalies can be filtered by source datastores and tags for both actions, with additional status filters available for Delete operations. + - Notification messages now support dynamic tokens such as {{anomaly_count}} and {{inactivity_timeframe}} for context-aware alerts. + - Archive and Delete operations can be aborted mid-execution, but any anomalies already processed will not be rolled back. + +- Improved Check Templates with automated check permutation generation from filter arrays. + - Introduced `each()` keyword that automatically expands a single filter into multiple checks, one for each specified value in the array. + - Supports multiple `each()` clauses in a single filter to generate all possible value combinations across different dimensions. + - Template locking behavior determines check lifecycle—locked templates delete checks when values are removed, while unlocked templates preserve existing checks. + +- Added an “Activate” option for draft checks on the check page. + - Draft checks can now be activated directly from the gear menu on the check overview page, eliminating the need to navigate back to the field checks list. + - Includes persistent error notifications that remain visible until manually dismissed, ensuring users don't miss critical errors during activation. + +- Improved Dry Run validation for `Data Diff` checks with filters. + - Dry Run now queries the number of records matching the filter to compare left and right side row counts, mirroring the behavior of checks without filters. + +- Added ability to modify relative path on file patterns. + - Users can now edit the relative path field, enabling advanced globbing patterns for file selection. + +- Added View Results button for Materialize and Export operations. + - Users can now navigate directly to the Enrichment Materialize or Export tab with a single click from the operation card. + - Enrichment container tabs are now router-based, enabling direct navigation and shareable URLs to specific tabs. + +#### General Fixes and Improvements + +- Fixed history flow side panel not displaying after specific flow editing operations. + +- Corrected Quality Score displaying as 0 when navigating between datastores. + +- Resolved Expected Values check displaying a blank list when configured with numeric values. + +- Fixed issue where Observability triggers were not being recorded properly. + +- Correct operations getting stuck in running status instead of being marked as failed. + +- Resolved flow executions getting stuck in running status when multiple actions completed concurrently. + +- Flow execution nodes now display historical action configuration in their inline views for accurate review of past executions. + +- General Fixes and Improvements. + +### 2025.11.6 { id=2025.11.6 } + +#### Feature Enhancements + +- Introduced Service Users and Enhanced Token Management + - Added dedicated accounts for API integrations, separating service credentials from personal user accounts. + - Service Users include automatic token generation, making it easier to set up integrations and manage automated workflows. + - The Tokens page has been redesigned with a new tabbed layout that separates `Personal Tokens` from `Service Tokens`, with quick navigation to user details and improved search capabilities. + - Token generation has been improved with download-as-file support, clearer copy feedback, and the ability to generate tokens directly from the user settings dropdown. + +- Added historical settings view for flow executions. + - Flow execution actions now display the configuration used during their execution. + - Each action's settings are preserved, enabling accurate historical review and troubleshooting of past executions. + - Actions in the flow execution view are now clickable, allowing users to inspect their historical configuration details. + +- Introduced `Discarded` status for anomalies + - New archive option allows marking anomalies as no longer relevant without implying resolution or error. + - Added ability to reactivate acknowledged anomalies, allowing them to be moved back to the active state. + +- Improved computed table creation for SQL Server, Oracle, and Redshift. + - Autocomplete suggestions now display table names with schema prefixes for these JDBC datastores. + +#### General Fixes and Improvements + +- Corrected issue where operation status remained unchanged after completion in container activity displays. + +- Resolved webhook integration issues for Microsoft Teams and Slack that prevented interactive features from working properly. + +- General Fixes and Improvements. + +### 2025.10.23 { id=2025.10.23 } + +#### Feature Enhancements + +- Expanded Command Palette with quick access to creation actions across datastores, flows, templates, and settings. + +- Enhanced operation tracking by adding end time display in datastore activity and navigation links for container profiles and scans. + - Operation duration tooltips now show completion time for finished operations. + - Profile and scan tooltips now include clickable links in tooltips that navigate to the corresponding operation in the activity view. + +- Added abort option for flow executions. + - New abort action available in flow execution list and details pages. + +#### General Fixes and Improvements + +- Fixed volumetric chart threshold bar calculations to correctly use the configured window size in Absolute and Percentage Change comparisons. + +- Corrected missing runtime display for fast export operations. + +- Improved Quality Score calculation reliability and error handling. + +- Fixed table count display showing double the actual number of tables in Snowflake and Oracle datastores when members belong to multiple teams. + +- Added validation to prevent computed fields from being used as partition or incremental fields in container configurations. + +- Corrected user list filtering and sorting errors when combining team filters with team-based sorting. + +- Resolved container profile creation errors caused by concurrent operations processing inferred quality checks. + +- Corrected materialize operation failures for glob-pattern containers by sanitizing invalid characters in output table names. + +- Resolved Quality Score calculation failures when container rowcount + +- General Fixes and Improvements. + +### 2025.10.15 { id=2025.10.15 } + +#### Feature Enhancements + +- Introduced fuzzy search to form and filter inputs. + - Search results now tolerate typos and partial matches for more natural filtering. + +- Improved Expected Values and Required Values check configuration with visual warnings for spacing issues. + - Values with trailing or leading spaces now display in warning-colored chips. + - A tooltip will show when a value containing extra spaces. + +- Added informational message to Flow action datastores selection explaining filter criteria. + +- Improved DFS datastore overview to display file format type. + +#### General Fixes and Improvements + +- Fixed data write failures in BigQuery enrichment datastores caused by message size limits exceeding API thresholds. + +- Optimized operation triggering endpoint performance, including scheduled runs. + +- Improved Quality Score calculation accuracy according to Quality Score Dimensions. + +- Fixed breadcrumb navigation not updating correctly when cloning checks and changing field or container context. + +- Improved background task processing for enhanced system reliability and performance with optimized task execution. + +- General Fixes and Improvements. + +### 2025.10.3 { id=2025.10.3 } + +#### Feature Enhancements + +- Optimized computed tables, files, and joins creation process. + - Now the creation is much faster with optimized validation and asynchronous profiling. + - Added "Validate" button to check only syntax and semantics, eliminating wait times for full data profiling. + +- Enhanced Quality Score calculation with improved clarity and transparency. + - Renamed "Quality Score Factors" to "Quality Score Dimensions" throughout the application for better conceptual understanding. + - Quality scores now better reflect data fitness for intended use cases rather than simple error counts. + +- Introduced "Has Logs" filter to display operations that completed with logs. + +- Added sort by "Last Triggered" option to the Flows list page for better workflow management. + +- Improved page metadata for better link sharing across Flow, Check, Anomaly, Library, and Enrichment pages. + +#### General Fixes and Improvements + +- Fixed validation error when clearing filter clause fields in computed table and join forms. + +- Corrected Ctrl+C copy functionality that was blocked by command palette shortcuts. + +- Resolved delete button visibility for archived anomalies in both light and dark themes. + +- Fixed inconsistent text styling for "No inference" label. + +- Corrected catalog operation incorrectly identifying Iceberg metadata files as data files. + +- Resolved bulk selection checkboxes disappearing after multiple select/deselect cycles. + +- Fixed error when updating computed tables with excluded fields. + +- Corrected icon alignment in collapsed datastore tree view sidebar. + +- Resolved missing background color for "Not Asserted" status in Insights checks section. + +- Fixed misleading error messages when attempting to edit comments on archived anomalies. + +- Corrected a regression in computed joins that prevented using columns with non-normalized names in join conditions. + +- General Fixes and Improvements. + +### 2025.9.17 { id=2025.9.17 } + +#### Feature Enhancements + +- We are happy to announce the new Keyboard Commands feature + - Execute common actions using context-sensitive shortcuts that adapt based on your current location and selection within the application. + - Quickly navigate between main pages using intuitive multi-key sequences with the new "Go to" shortcuts. + - Press `G` followed by a specific key to quickly jump to pages like: `G` + `E` for Explore, `G` + `L` for Library, `G` + `T` for Tags, and etc. + - Enhance Tab navigation allows smooth movement through interface elements using `⌥` / `Alt` + `←` and `⌥` / `Alt` + `→` with clear visual focus indicators. + - Update the global search shortcut to be accessible via `⌘`/`Ctrl` + `Shift` + `F`. + - Access the Command Palette by pressing `⌘`/`Ctrl` + `K` to search, navigate, and execute actions without leaving your current context. + - View a complete list of all available keyboard shortcuts by pressing `⌘`/`Ctrl` + `/` for easy reference and learning. + +- Improved hover highlighting to Data Preview, Source Records, and Enrichment tables for consistent user experience across all data views. + +- Enhanced queries with metadata comments for better cost tracking and operation identification in query logs. + +#### General Fixes and Improvements + +- Fixed profile operations failing on BigQuery tables with nested record types. + +- Limited anomaly rollup threshold to 1,000 with visual markers to prevent system overload from excessive anomaly generation. + +- Fixed dataDiff validation errors when using computed fields as row identifiers. + +- General Fixes and Improvements. + +### 2025.9.12 { id=2025.9.12 } + +#### Feature Enhancements + +- We are thrilled to introduce the Profiles Over Time for tracking field-level data changes + - Users can now compare the current field profile with previous profiles to track changes. + - Visual indicators highlight metrics that changed between selected profiles. + - Interactive charts display numeric metric trends across profile history. + - Easily identify data drift and type changes at the field level. + - Special badges indicate when field types have changed between profiles. + +- Introducing the `Data Diff` check as an enhancement of the Is Replica Of functionality. + +- Enhanced File Profile visibility with file format display and improved handling of long names with tooltips. + +- Improved hover contrast for list items in light mode for better visibility. + +- Optimized slim profile logic to protect existing field typing from being overwritten by limited data samples. + +- Added OAuth support to the Databricks connector. + +#### General Fixes and Improvements + +- Fixed broken enrichment datastore redirect link in the datastore tree footer. + +- Corrected filter application in `Exists In` checks that was causing inaccurate anomaly detection. + +- Fixed grouped inference checks to properly validate against filtered test data for each group combination. + +- Resolved `Is Address` check failing to assert during scan. + +- Removed `User Defined Function` check support. + +- General Fixes and Improvements. + +### 2025.9.4 { id=2025.9.4 } + +#### Feature Enhancements + +- Introducing Product Updates + - Users can now view feature announcements directly within the application. + - Read full posts by clicking the external link for each update. + +- Enhanced filter clause display in readonly checks with copy functionality and improved text formatting. + +#### General Fixes and Improvements + +- Resolved an issue where the API allowed creation of quality checks with string fields for rules that don't support them. + +- Corrected cache logic to avoid unnecessary data refresh in insights. + +- Fixed input field overflow when entering long filter values that caused UI layout issues. + +- Fixed Data Preview errors when filters return no records, now properly displays empty results instead of failing with a server error. + +- Fixed activation failures for Exists In checks that reference computed fields. + +- Fixed issue where rule type filter options did not appear on the check list page for Member users. + +- Updated enrichment processing for more frequent and reliable data writes. + +- General Fixes and Improvements. + +### 2025.8.20 { id=2025.8.20 } + +#### Feature Enhancements + +- Introducing Bulk Quality Check Creation through Templates + - Users can now create multiple quality checks from a single template. + - Select multiple target containers across different datastores and apply the same template configuration. + +- Announcing Pause Schedule operation + - Users can now deactivate and reactivate schedules without losing configuration. + - Added a new filter option to show only deactivated schedules. + +- Introducing Test Connection capability for existing connections + - Users can now verify connection changes before saving when editing a connection configurations. + +- Improved isReplicaOf check to better handle incremental data comparisons. + +- Added support for connecting to Kerberos-secured Hive datastores. + +#### General Fixes and Improvements + +- Fixed Data Preview filtering to properly indicate that computed fields are not supported in WHERE clauses and not exposing as auto complete options. + +- Fixed issues related to ANSI SQL compliance in Spark 4. + +- Fixed issues with nested data types in the Databricks connector. + +- Corrected inconsistent formatting in operation details where containers read appeared larger than total containers. + +- Resolved filter UI issues where selected items caused layout misalignment. + +- General Fixes and Improvements. + +### 2025.8.8 { id=2025.8.8 } + +#### Feature Enhancements + +- Enhanced Source Record visualization + - Users can now view more source records with selectable limits (10, 100, 1000, or 10000 records). + - Added sticky headers for easier navigation when scrolling through large datasets. + +- Introducing Quality Check Migration + - Users can now migrate quality checks from one container to another, even across different datastores. + - Archived and inferred checks are excluded from migration. + - Migrated checks are set to Draft status for users review before activation. + +- Enhanced search functionality for datastores and flows + - Users can now search by ID or name using a single search field. + +#### General Fixes and Improvements + +- Updated Dataplane to Spark 4 + +- Fixed Is Replica Of dry run validation to correctly handle filtered datasets. + +- Resolved an issue where anomaly action buttons redirect to the details page instead of performing the intended action. + +- Corrected the navigation issue when switching between the Checks and Observability tabs that prevented lists from rendering properly. + +- General Fixes and Improvements. + +#### API Changes + +- The following endpoint `GET /operations` is affected: + - Added `start_date` and `end_date` query parameters to filter operations by date range. + +### 2025.7.28 { id=2025.7.28 } + +#### Feature Enhancements + +- Improved Spark SQL autocomplete handling for complex field names + - SQL autocomplete now automatically adds backticks to field names, preventing errors with special characters. + +#### General Fixes and Improvements + +- Resolved an issue where scheduled operations were not executing reliably under high load. + +- Fixed last asserted timestamp accuracy for all check types. + +- General Fixes and Improvements. + +### 2025.7.23 { id=2025.7.23 } + +#### Feature Enhancements + +- Simplified Computed Join prefix management + - Select expressions automatically adjust when prefixes change, eliminating manual field name updates. + +- Added User Guide links to Check Creation form + - Selecting a Rule Type provides a direct link to that specific rule's documentation in the User Guide. + +#### General Fixes and Improvements + +- Corrected Quality Check Update errors affecting `Greater Than Field`, `Less Than Field`, and `Equal To Field` rule types. + +- Fixed source record display for high-precision decimal values + - Source records now display full decimal precision on hover for truncated numeric values. + +- General Fixes and Improvements. + + +### 2025.7.18 { id=2025.7.18 } + +#### Feature Enhancements + +- Introducing Computed Join for creating new containers by joining data across different datastores + - Users can now create computed joins between two containers, even from different datastores, enabling cross-datastore data analysis. + - Supports multiple join types: Inner Join, Left Join, Right Join, and Full Outer Join to accommodate various data combination needs. + - Configure joins using intuitive left and right reference selections with field mapping and optional prefixes. + - Add custom SELECT expressions and WHERE clauses to refine the joined data output. + +- Introducing Dry Run operation for draft checks + +- Enhanced Bulk Check Operations and Management Capabilities + - Added metadata field to bulk update dialog, enabling users to update metadata across multiple checks simultaneously without opening each individually. + - Extended bulk operations to support archived checks, previously limited to active only. + - Bulk activate and draft actions now available for archived checks, expanding beyond the previous delete-only option. + +- Added Subject Field to Email Notifications + - Email notifications now support customizable subject lines, allowing users to add meaningful context to their messages. + +- Enhanced Record Limit Configuration + - Users can now manually input custom record limit values in Profile and Scan operations, as well as Flow operations through a text field, providing flexibility beyond the predefined options. + - A dropdown menu provides quick access to common values (1M, 10M, 100M, All). + +- Adding Unlink Enrichment Datastore + - Users can now unlink enrichment datastores directly from the "Enrichment Datastore Settings" dialog. + +- Improved Datastore Deletion Experience + - Error messages during deletion now appear directly within the confirmation dialog instead of temporary toast notifications. + - When deleting an Enrichment Datastore, the dialog now displays the number of linked source datastores and uses clear labeling to distinguish between datastore types. + +- Enhanced catalog operation to properly recognize subdirectories within partitioned file structures, ensuring more accurate container identification for complex directory hierarchies. + +#### General Fixes and Improvements + +- Addressed modal dismissal issues across multiple dialogs where clicking outside or pressing ESC would cause accidental closure and data loss. + +- Fixed "Open in new tab" and "Copy link" actions for checks and anomalies that were not functioning correctly. + +- Fixed source record formatting for 'Is Replica Of' anomalies when check configuration changes after anomaly detection. + +- Fixed an issue where anomaly URLs generated from check side panels were not functioning correctly when shared. + +- Fixed incorrect redirection after creating checks from templates. + +- Fixed an issue where source records weren't displaying correctly during dry run operations. + +- Corrected cloning behavior to preserve tags from the check being cloned. + +- Fixed scan operations failing after deleting or unlinking enrichment datastores. + +- Corrected failed checks information in anomaly responses to accurately reflect the historical check version at the time the anomaly was detected, rather than showing the current check version. + +- General Fixes and Improvements. + +### 2025.7.2 { id=2025.7.2 } + +#### Feature Enhancements + +- Introduced Failed Check Version display, providing visibility into the exact check configuration that triggered each anomaly. + - Failed Check now displays the specific check properties and configuration that were active when the anomaly was generated. + +- Enhanced Check Activities visualization. + - Users can now view historical check configurations directly from the timeline, including all properties and tags as they were at that point in time. + +- Enhanced flow nodes with improved visual design and contextual information display for better user experience. + - Action nodes now show inline summaries with relevant details based on their type (e.g., datastore names for operation actions, channel names for Slack or Teams, URLs for webhooks, etc). + - Export nodes now display asset types in their titles (e.g., "Export Anomalies"). + - Added filter tooltips to trigger nodes displaying applied conditions (tags, datastores, operation types) for quick configuration visibility. + +- Supports Data Preview functionality for containers that haven't been profiled yet, removing the requirement to profile first before viewing data. + +- Enhanced editing flexibility for Asserted Checks. + - Users can now edit SparkSQL expressions that define calculated fields. + - Row Identifiers and Passthrough Fields are now editable for Is Replica Of Check. + +- Improving Computed Assets: + - Users can now add Additional Metadata to computed Tables/files and computed fields. + - Display the Last Editor information in the tree footer to provide context on who last modified the asset. + +- Added Last Profile visibility in Field Overview and Field Details. + - Users can now see the last time a field was profiled, helping clarify the timeframe of the metrics shown in the Profile section. + +- Improved Anomaly Bulk Archive with comment support. + - Similar to Acknowledge Anomaly, users can now add optional comments when bulk archiving anomalies. + +- Improve dry run result message readability. + +#### General Fixes and Improvements + +- Fix a bug when user selected a date in Date Picker and this return user's timezone instead of UTC timezone. + +- Fixed an issue with Metadata Checks Dry Run execution where status messages were not displaying properly. + +- General Fixes and Improvements. + +### 2025.6.20 { id=2025.6.20 } + +#### Feature Enhancements + +- Added Source Records Download for Check Dry Run: Users can now download the source records as a CSV file after executing a Dry Run. + +- Improving Source Records Performance: Implemented caching for anomaly source records, significantly reducing load times and improving in user session level. + +#### General Fixes and Improvements + +- General Fixes and Improvements. + +### 2025.6.13 { id=2025.6.13 } + +#### Feature Enhancements + +- Introducing Quality Check Dry Run: Users can now quickly assess the impact of a quality check without persisting results. + - The Dry Run functionality is accessible directly from the Data Quality Check settings configuration, enabling users to test checks before scan assertion. + - A comprehensive modal displays the execution results, presenting critical metrics including Dry Run status, operation time, and sampling limits. + - Dedicated section display potential Anomalies and Source Records that would be generated by the check. When no issues are detected, users receive a clear confirmation message indicating no anomalies were identified. + +- Enhancing Fingerprint Visualization: Users can now easily view and manage related anomalies that share the same fingerprint. + - Clicking "View Related Anomalies" opens a right-side panel displaying all anomalies with matching fingerprints, including the total count of related anomalies. + - The panel enables direct anomaly management, allowing users to acknowledge, archive, or click individual cards to view detailed anomaly information without navigating away. + +- Introducing Sticky Navigation: Users can now maintain access to navigation elements and actions while scrolling through content-rich pages. + - The sticky navigation feature ensures breadcrumb information and interaction buttons remain visible and accessible as users scroll down the page. + +- Expanding Scan Operation Support for Iceberg Tables + - Incremental scans now fully support Iceberg table formats, significantly expanding the range of asset types eligible for incremental scanning operations. + +#### General Fixes and Improvements + +- Resolved an issue where metric charts failed to display data when users accessed metric details. +- Fixed a bug that incorrectly allowed users to edit settings on computed fields inherited from parent computed files. +- Corrected the rendering logic for Authored Check Details that prevented information from displaying after tag update operations. +- General Fixes and Improvements. + +### 2025.6.6 { id=2025.6.6 } + +#### Feature Enhancements + +- Introducing the new Quality Check dedicated page, enabling users to analyze check properties and metrics. + - A Check Assert Visualization is provided to analyze assertions over time, helping users monitor assertion results, with the ability to hover over a timeline point to view the latest assertion and totals. + - Displays key metrics such as Status, Rule Type, Last Asserted, Weight, Coverage, and Active Anomalies and including the check description. + - Exposes all relevant check properties to provide a comprehensive view of each check's configuration without opening the edit modal. + - Shows the full activity history for the check, including property updates, and exposes previous and new values when a check setting is modified. + - Supports inline check tag editing by clicking the tag badge, allowing users to add or remove tags without opening a modal. + +- Announcing the Anomaly exclusive page: This new page will allow users to get detailed information about Anomaly metrics, Failed Checks and Source Records. + - Exposes detailed anomaly information, including Status, Anomalous Records, Total Failed Checks, Weight, Detected DateTime, and Scan Operation, as well as Source Datastore, Computed Table, and Location. + - Lists the Failed Checks that were violated and led to the creation of the anomaly. Clicking on a failed check opens a right-side panel with the corresponding quality check information, eliminating the need to navigate to a different page. + - Show Source Records from your data that failed the checks when available. Users can apply filters and sorting options to personalize the data display according to their preferences. + - Displays the complete activity history, including all updates made to the anomaly over time. User comments are also shown, making it easier to follow discussions and decisions. + - Similar to the dedicated Quality Check page, users can edit Anomaly Tags inline. + +- Datastore Connection Status Visibility + - A badge attached to the datastore icon now appears in both the breadcrumb and the tree view footer, clearly indicating the connection status of the datastore. + +- Adding support for gzipped and .txt files in Catalog Operation + - Users can now use gzipped (.gz) and .txt files in DFS Datastores for Catalog Operations. + +#### General Fixes and Improvements + +- General Fixes and Improvements. + +### 2025.5.23 { id=2025.5.23 } + +#### Feature Enhancements + +- Atlan Integration + - Users can now choose whether or not to receive notifications in the Atlan platform, giving more control over their notification preferences. + +- Freshness Heatmap + - The freshness chart has been redesigned for an improved user experience. + - Milliseconds are now displayed in a more readable date/time format for better comprehension, while the underlying data still uses milliseconds. + +#### General Fixes and Improvements + +- Create User + - Fixed a bug that occurred when creating a service user with automatic admin permission enabled. + +- Rerun Operations + - Catalog, export, and materialize operations will now only display rerun operations. + +- General Fixes and Improvements. + +### 2025.5.16 { id=2025.5.16 } + +#### Feature Enhancements + +- Anomaly + - Users can now view the Anomaly Fingerprint directly in the Anomaly Details page. + - A new button allows users to quickly copy the fingerprint value. + - A link to the User Guide has been added to explain how this feature works. + +- Datastore Connection + - A new validation step was added to several connectors to verify if the specified schema exists. + +#### General Fixes and Improvements + +- Schedule Operation + - Fixed a bug in scheduled operations that allowed `None` as a value for `max_records_analyzed_per_partition` when updating. + +- Check + - Fixed an issue where creating a metric check with a non-existent comparison value would fail.. + - Fixed a bug where checks would fail if the filtered set was empty — now the check will pass in this case. + +- Catalog Operation + - Fixed an issue in DB2 where evaluating the distribution of values caused an error. + +- Scheduled Scan + - Fixed an issue that occurred when adding connection retries related to the Secrets Manager. + +- Anomaly + - Fixed an issue where some triggered anomalies had no data available. + +- General Fixes and Improvements. + +### 2025.5.9 { id=2025.5.9 } + +#### Feature Enhancements + +- Microsoft Teams Integration + - We're excited to announce a native integration with Microsoft Teams, bringing powerful collaboration features directly into your Teams workspace. + - Users can now: + - Share Qualytics links to datastores, containers, or fields and see rich previews directly in Teams. + - Receive proactive notifications when: + - An operation completes + - An anomalous table or file is detected + - A specific anomaly is triggered + - Note that the message content and actions will adapt based on the trigger type defined in the Flow. + - Manage anomalies without leaving Teams: + - View, acknowledge, comment on, or archive anomalies from within the Teams UI + - Click to open linked anomalies directly in Qualytics + - The integration must be configured by a Qualytics admin. A dedicated setup guide is available in our User Guide. + - As part of this rollout: + - Any Flows previously configured to send Teams notifications via incoming webhooks or workflows (Teams) have been automatically migrated to the Webhook action. + - The Teams notification action is now only available through the new integration. + +- Tokens + - Users can now view the last time a token was used. + +- Session Expiration + - Improved handling of session expiration for users who are logged in but inactive for an extended period. + +#### General Fixes and Improvements + +- Check Template + - Fixed an issue with the message displayed when a user archives a check that has associated checks. + +- General Fixes and Improvements. + +### 2025.5.5 { id=2025.5.5 } + +#### Feature Enhancements + +- Tokens + - Users can now view the last time a token was used, providing better visibility into token activity. + +#### General Fixes and Improvements + +- Is Replica Of Check + - Fixed a bug where anomalies using pass-through fields on both the left and right side were not handled correctly. + +- Action Operations + - Fixed an issue where cloning an Action Operation could exceed the allowed action limit. + +- Group By + - Fixed a bug that occurred when users added single quotes to string columns in the Group By clause. + +- Atlan Sync + - Updated and created custom metadata objects to align with the latest schema. + +- General Fixes and Improvements. + +### 2025.4.24 { id=2025.4.24 } + +#### Feature Enhancements + +- Improved Filters + - Tag Filter + - Users will only see tag options corresponding to items currently visible in the list pages (Datastore List, Container List, and Filter List). + - The same filtering behavior has been applied to Anomalies and Checks within the datastore context. + - If no visible items contain a specific tag, a `No option found` message will be displayed in the filter dropdown. + +- Scan Operation + - Scan form + - The scan form has been reorganized to improve the user experience. + - Now, the following steps to configure the Scan Flow are Check Categories, Reading Settings and Scan Settings. + - Enrichment Settings + - The Remediation Strategy option is now in the Enrichment Datastore Settings. + - The option will be a Datastore global value. + - Also, the Anomaly Rollup Threshold and Source Record Limit can be configured as defaults. + - During scan operations, these options will be pre-filled but can still be edited within the scan form. + +- Tree View + - The tree view layout is now adjustable, allowing users to customize it to their preferences. + - The footer in the tree view can be expanded or collapsed based on user needs. + +#### General Fixes and Improvements + +- Filters + - Fixed an issue where filters behaved inconsistently when navigating between different datastores. + +- The container page is not loading + - Fixed a bug that caused the container page to fail to load under certain conditions. + +- General Fixes and Improvements. + +#### API Changes + +- Incoming Breaking Changes + - REQUEST PAYLOAD: The fields `enrich_only` and `enrichment_only` will be replaced by `enrich_container_prefix` and `enrichment_prefix` and will affect the following endpoints: + - `POST /datastores` + - `PUT /datastores/{id}` + - RESPONSE PAYLOAD: The fields `enrich_only` and `enrichment_only` will be replaced by `enrich_container_prefix` and `enrichment_prefix` and will affect the following endpoints: + - `GET /anomalies/{id}` + - `PUT /anomalies/{id}` + - `POST /containers` + - `GET /containers/{id}` + - `PUT /containers/{id}` + - `GET /containers/{id}/profile` + - `GET /containers/{id}/scan` + - `POST /containers/{id}/scan` + - `PATCH /containers/{id}/favorite` + - `GET /container-profiles/{id}` + - `GET /container-scans/{id}` + - `POST /datastores` + - `PUT /datastores/{id}` + - `GET /datastores/{id}` + - `PATCH /datastores/{id}/favorite` + - `PATCH /datastores/{datastore_id}/enrichment/{enrich_store_id}` + - `GET /field-profiles/{id}` + - `POST /operations/schedule` + - `PUT /operations/schedule/{id}` + - `GET /operations/schedule/{id}` + - `GET /operations/{id}` + - `POST /operations/run` + - `PUT /operations/run/{id}` + - `PUT /operations/rerun/{id}` + - `PUT /operations/abort/{id}` + - `POST /operations/run`, `POST /operations/schedule`, `PUT /operations/schedule/{id}`, `POST /flows, and PUT /flows/{id}` + - DEPRECATE PARAMETER: `remediation` (To specify a remediation strategy going forward, use the new `enrichment_remediation_strategy` field available in the POST /datastores and PUT /datastores/{id} endpoints.) + +### 2025.4.11 { id=2025.4.11 } + +#### Feature Enhancements + +- Anomalies and Checks Filter + - The Rule filter is now dynamically populated based on the types present in the current view. + - Each rule type displayed in the filter now includes a counter showing the total number of occurrences. + +- Status Page + - The Health page has been renamed to Status page. + - Users can view additional information like Cloud Platform and Deployment Size. + - Deployment size details are now displayed to provide better visibility into environment configurations. + +#### General Fixes and Improvements + +- Anomaly + - Resolved a bug when handling `NaN` values in float-type data. + +- General Fixes and Improvements. + +### 2025.4.5 { id=2025.4.5 } + +#### General Fixes and Improvements + +- Quality Score + - Enhanced the descriptions for each Factor Weight to provide clearer guidance on how they impact the overall score. + +- General Fixes and Improvements. + +### 2025.3.28 { id=2025.3.28 } + +#### Feature Enhancements + +- Anomalies + - The “Anomalies Identified” count now shows the sum of Open and Archived anomalies. + - Anomalies are now categorized into two groups: + - Open: anomalies currently active (Active, Acknowledged). + - Archived: anomalies that have been archived (Resolved, Duplicated, Invalid). + - Users can now view the total counts of Duplicate and Invalid anomalies in the Overview tab under the Explore page. + - Users can now see the total counts of Open and Archived anomalies directly in Scan Operations. + - The Scan Results modal now displays the totals for Open and Archived anomalies. + - Users can filter anomalies by status using a new dropdown selector. + +- Quality Checks + - Users can now sort the Quality Checks list by the “Last Asserted” date. + +#### General Fixes and Improvements + +- Teams Permissions + - Fixed an issue where users with the Drafter role were unable to restore a check as a draft. + +- General Fixes and Improvements. + +### 2025.3.23 { id=2025.3.23 } + +#### Feature Enhancements + +- Slack Integration + - We are excited to introduce a major enhancement to our integration with Slack. + - Users can now add the new Qualytics Slack App for enhanced capabilities. + - Qualytics admins can configure the Slack Integration with two easy steps. + - After configuring the integration, a Slack administrator must approve the Qualytics Slack App. + - The Qualytics Slack App supports selecting specific Slack channels for receiving Qualytics notifications in the context of a Qualytics Flow. + - Different types of messages will be sent for each trigger in Flow operations. + - The text and actions will vary depending on the selected trigger. + - The message state (Slack message color) will change based upon the message status. + - The Qualytics Slack App allows users to interact with Qualytics from the Slack interface: + - Interact with anomalies by acknowledging, commenting, or archiving them without leaving the Slack UI where the flow notification is received. + - Click a link in Slack to be redirected to the Qualytics UI for more details regarding a specific notification. + - View anomalous tables and files detected without leaving Slack. + +- Anomaly Fingerprint + - We are thrilled to introduce support for a new feature that will begin identifying duplicate anomalies. + - Anomalies created after this release will be "fingerprinted" so that re-detection of that same anomaly can be readily identified as a duplicate detection. + - New Scan Operation options allow users to define how detected duplicates should be handled. + - This feature helps maintain the history and timeline of specific data errors, allowing users to track how long a specific issue has persisted and a log of detections over time. + - Anomaly fingerprints will also be exposed in API responses and written to enrichment + +#### General Fixes and Improvements + +- External Scan + - Users can now use and rerun external scans only from the activity listing for the targeted asset. +- Check Last Asserted + - Fixed an issue where checks were still being marked as never asserted even after producing anomalies. + +#### API Changes + +- Integration Impacting Changes + - POST & PUT api/integrations + - REMOVED PARAMETERS: name and api_token + - NEW PARAMETERS: api_access_token, api_refresh_token and api_service_token + - POSTs to api/flows/actions/notifications/ endpoints + - MODIFIED PARAMETERS: tokenized_message is now a json object instead of a string + - All requests to api/datastores endpoints + - REMOVED RESPONSE PROPERTY METRIC: The metric for archived_anomalies previously returned as metrics.archived_anomalies has been removed from responses + +- Deprecation Notices + - POST api/operations/run + - DEPRECATED PARAMETER: archive_overlapping_anomalies (migrate to the new parameter archive_duplicate_anomalies for enhanced functionality) + - POST api/operations/schedule + - DEPRECATED PARAMETER: archive_overlapping_anomalies (migrate to the new parameter archive_duplicate_anomalies for enhanced functionality) + +### 2025.3.17 { id=2025.3.17 } + +#### Feature Enhancements + +- Activity Operation + - Added a column showing the anomaly rollup threshold. + +- Export Operations + - Added an option allowing users to schedule Export Operations. + +- DFS Enrichment Datastore + - Normalized delta file names to lowercase. + +#### General Fixes and Improvements + +- Anomaly Rollup Threshold + - Fixed an issue where the field was not accepting the maximum value. + +- Volumetric Tracking Observability + - Fixed an issue where inferred check validation errors disrupted observability measurements. + +- Export Operation + - Updated wording on the Export dialog. + +- Scan and External Scan + - Fixed an issue where schema checks were failing along with other checks but were not persisting in the enrichment of source records for anomalies. + +- External Scan + - Fixed an issue where CSV data was not being properly cast for non-text fields. + +- Enrichment Datastore + - Fixed a bug where exported tables were not appearing in the UI. + +- General Fixes and Improvements. + +### 2025.3.5 { id=2025.3.5 } + +#### General Fixes and Improvements + +- Tag Updating + - Fixed an issue where some containers failed to receive tag changes when updating tags across multiple containers or performing bulk updates. + +- Edit Scheduled Materialize Operation + - Fixed an issue where the modal did not appear when users attempted to edit a scheduled materialize operation. + +- Restart Analytics Engine + - Fixed an issue where restarting the Analytics Engine did not take effect. + +- Anomaly Count + - Fixed an inconsistency in the anomaly count. + +- General Fixes and Improvements. + +### 2025.2.26 { id=2025.2.26 } + +#### Feature Enhancements + +- Enrichment Operations + - Introducing Materialize Operation + - This will "capture a snapshot" of selected containers from your source datastore and export them to the enrichment datastore for seamless data loading. + - Users can define the maximum number of records to be materialized per table. + - A schedule option is available for users to set up and schedule the operation according to their needs. + - Introducing Export Operation + - Users can extract metadata from selected assets in their source datastore and export it to the enrichment datastore for seamless integration. + - Assets metadata options are available to export to the enrichment datastore. Users can export: + - Anomalies + - Quality checks + - Field profiles + - These operations are available in Flow Action. + +- Flows + - Introduced a cloning feature for actions in flow. + - Users can now clone a simple action by clicking the vertical ellipses. + +- Scan Operation + - Introducing Anomaly Rollup Threshold + - Users can now roll up anomalies that will be created per check before they are merged into a single rolled-up anomaly. + +- Error Messages + - Improved custom messages when users receive 502 and 503 status codes. + +#### General Fixes and Improvements + +- System Timestamp + - Standardized timestamps across the platform. + +- External Integrations + - Fixed an issue where external tags should be updated instead of being deleted and dropped during sync. + +- General Fixes and Improvements. + +### 2025.2.13 { id=2025.2.13 } + +#### Feature Enhancements + +- Explore View + - Users can now refresh the Insights data. + - A label will indicate when the page was last refreshed. + +- System Appearance + - Users can now select the `System` theme. + - This setting automatically adjusts based on the user's system theme, switching between dark and light mode. + - Users can still manually select dark or light mode. + +- Dismiss Popup Window + - Users can now dismiss popup windows by pressing the `Esc` key, improving the user experience. + +#### General Fixes and Improvements + +- External Scan + - Fixed an issue where attempting to run an external scan resulted in a "Request Failed" error message. + +- Explore View + - Fixed an issue causing excessively long loading times. + +- General Fixes and Improvements. + +### 2025.2.6 { id=2025.2.6 } + +#### Feature Enhancements + +- Overview Improvement + - Added inferred and authored check totals + - Users can now view the total number of inferred and authored checks, along with a comparison timeframe. + - A redirect link allows users to access the checks directly, displaying only their current statuses. + - Improved check assertion-related metrics to reflect assertions as of the report date. + +- Team Permissions + - Manager users can now update datastore teams. + - Requires `Editor` permission within the team. + +#### General Fixes and Improvements + +- Flow Graph + - Fixed an issue where the flow graph position was randomly changing when a user updated a flow-node. + +- Observability Chart + - Fixed an issue where threshold calculations incorrectly referenced measurement values that did not account for grouping. + +- General Fixes and Improvements. + +#### Breaking Changes + +- Container Overview Tab + - Refactored the Totals section to clarify that metrics are based on sampled data rather than the full dataset. + - Added the sampling percentage next to the spark chart to indicate that derived metrics are based on this sampling percentage. + - Updated titles and labels for better clarity. + +### 2025.1.31 { id=2025.1.31 } + +#### Feature Enhancements + +- Freshness View + - We are excited to introduce the "Freshness View" feature in Qualytics! + - Users can now visualize both volumetric and freshness checks within the same tab. + - The displayed data includes: + - Unit: Day, Month, Hour, etc. + - Maximum Age: Defines the maximum allowed time since the last data update. + - Last Asserted: Indicates the last time the data was validated. + +- Datastore Filter Condition in Flows + - Users can now configure datastore filter conditions in triggers for flows, enhancing control over triggered actions. + +- Treat Empty Value as Null for DFS + - A new option allows users to enable "Empty value as null" as the default behavior for File Patterns, improving data consistency. + +#### General Fixes and Improvements + +- General Fixes and Improvements. + +### 2025.1.24 { id=2025.1.24 } + +#### Feature Enhancements + +- Introducing Freshness Tracking in Containers + - Users can now enable a freshness tracking option for containers to measure and record the last time data was added or updated in a data asset. This helps ensure data timeliness and identifies pipeline delays. + +- Private Routes on Analytics Engine + - Customers using private routes can now view their IP addresses along with relevant messages displayed in the Analytics Engine for improved transparency. + +- Clone a Flow + - Users can duplicate existing flows, streamlining the process of reusing and modifying flow configurations for similar scenarios. + +- Additional Option to Execute Manual Flows + - A new "Start a Manual Flow" option has been added to the vertical ellipsis menu, providing users with enhanced flexibility for executing manual flows. + +- Cancel Action for Unpublished Flows + - A "Cancel" action has been introduced in the flow builder, allowing users to reset the graph to its initial state for unpublished flows. This update also addresses issues related to the execute button and read-only state logic. + +- "Is Replica Of" Passthrough + - The `IsReplicaOf` rule now supports a passthrough property, allowing users to exclude specific fields from assertions. Fields listed under this property are no longer flagged as anomalous. + +- Enhancement for Volumetric Rule Type + - Volumetric checks now include a `comparison` property, ensuring consistency with metric checks and offering greater flexibility in rule configurations. + +#### General Fixes + +- General Fixes and Improvements. + +### 2025.1.20 { id=2025.1.20 } + +#### Feature Enhancements + +- Enhanced behavior for "All" in Schedule Operations + - The "All" option in Schedule Operations has been updated to include future containers automatically. Previously, if you created a schedule with the "All" option and added new tables or containers later, the schedule would not include these new additions. + +- Validate Button for Enrichment Datastore Connections + - Users can now validate their data when creating or editing an enrichment datastore connection, improving reliability and confidence in datastore setups. + +#### General Fixes + +- Inaccurate Check Assertion Details + - Resolved an issue where some checks were being marked as never asserted despite producing anomalies, ensuring more accurate reporting. + +- General Fixes and Improvements. + +### 2025.1.16 { id=2025.1.16 } + +#### Feature Enhancements + +- Flows + - Introducing Flows: Users can now create automated pipelines by chaining actions and configuring triggers based on predefined events and filters. + - Triggers: Configurable based on events, filters, and operation conditions. + - Actions: Include notifications (Email, Slack, PagerDuty, etc.) and operations (catalog, profile, and scan). + - Real-Time Execution: Monitor execution history and real-time progress in the Flow Executions tab. + + - Setup Made Simple + - Add and configure flows using the “Add Flow” button in the top-right corner. + - Deactivate, delete or edit flows via the vertical ellipses or node configurations. + + - Enhanced Triggering Options + - Operations Complete, Anomalous Table/File Detected, and Anomaly Detected triggers provide flexible, event-driven automation. + - Fine-tune triggers using filters like tags, rule types, or anomaly weights. + + - Diverse Action Support + - Notify through in-app messages, Emails, Slack, Microsoft Teams, PagerDuty, and custom HTTP actions + - Trigger operational tasks across cataloging, profiling, and scanning. + + - Flow Identification on Activity Tab + - Operations executed by flows are marked in the new `Flow` column, displaying the associated flow name. + - Users can navigate directly to the flow execution view from this tab. + +#### General Fixes + +- Duplicate Anomalies on Scan Schedule Operations + - Fixed an issue where duplicate anomalies were not being archived during scan operations despite user selection. + +- BigQuery Message Size + - Enhanced default batch insertion size to improve performance and reliability. + +- Anomalous Record Integer out of Range + - Updated check metrics to use BigInteger, addressing large value handling. + +- Fix the Last Asserted Date + - Resolved inconsistencies in the Last Asserted Date logic for partition and container scans. + +- General Fixes and Improvements. + +#### Breaking Changes + +- Notification Rules Replaced by Flows. + - Existing notification rules have been migrated to Flows and will continue to function as before. + - For new notifications, the users must create a flow leveraging the Flows functionality. diff --git a/docs/changelog.md b/docs/changelog.md index 94afe5cf1d..4c084b90b4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,699 +1,703 @@ -# 2026 - -## Release Notes - -### 2026.5.28 { id=2026.5.28 } - -#### Feature Enhancements - -- Introduced Data Lineage as a trial feature, providing a new way to explore how data is connected across datastores, containers, and fields. - - Lineage can be pulled automatically from a connected data catalog or defined manually from the graph, with support for cross-datastore relationships. - - Computed tables, files, and joins include built-in lineage to their source containers, requiring no manual setup. - - Supports two perspectives on the graph: a container lens for asset-to-asset dependencies, and a field lens for column-level analysis. - - Relationships can be managed directly from the graph, with inline actions to add upstream or downstream links between containers or fields, or to remove existing ones. - - An active anomaly count badge appears on each container and field, and clicking the badge opens the anomaly side panel pre-filtered to that scope. - -- SAP HANA Connector - - We've expanded our connectivity options by supporting a new connection with SAP HANA. This enhancement allows users to connect and interact with SAP HANA databases directly from Qualytics, facilitating more diverse data management capabilities. - -- Enhanced Agent Q chat with richer feedback during responses and direct navigation to the assets the agent creates. - - Tool calls during streaming render as a collapsible timeline with status indicators and expandable input and output details. - - Quality checks, computed assets, and operations created or started by the agent appear as clickable cards below the response, taking users straight to the asset. - - The UI automatically refreshes after each response when the agent's actions affect the current page, and redirects away if the active asset was deleted. - -#### General Fixes and Improvements - -- Resolved anomaly comments missing from the history view after the anomaly was archived. - -- Corrected the Sync operation appearing as "Catalog" in Flow operation type filters, notifications, and the Audit tab. - -- Fixed Agent Q suggested prompt cards getting cut off on smaller screens, reorganizing them as a single-view carousel above the message input. - -- Corrected the License section on the Platform Status page showing wrong labels and colors for expired and expiring-soon licenses. - -- Fixed inconsistent name validation on tag and group creation, applying shared rules for invalid characters and minimum length. - -- Refined Expected Schema evaluation on Parquet, Avro, and ORC files to honor the physical schema when columns are stored natively as String. - -- Expanded the Audit tab to capture more user actions, including bulk table and field deletions, quality check activations, and changes to comments, filter presets, and datastore groups. - -- Added a warning to the Delete Token confirmation that any integration or service using the token will lose access immediately. - -- Added a license expiration warning for admins when the license is within 30 days of expiring, with a quick link to the Settings Status page. - -- Improved the empty state shown to managers restricted to a team with no accessible datastores, replacing the add-datastore prompt with a clearer no-access message. - -- Increased performance when profiling containers configured with group by's. - -- Optimized loading of the Results tab on operation pages for containers with many partitions, lazy-loading and paginating the partition list, with added search and pass/fail filters on the partitions and checks tabs. - -- Expanded the anomaly history to track when external tickets are linked or unlinked. - -- Improved ID search on the Source Datastores list and on the Activity tab to match partial digits, instead of requiring the exact full ID. - -- Added an action filter to the Audit tab, letting users narrow the activity log by action type. - -- Restricted the Audit tab date picker to today and past dates, disabling future date selection. - -- Strengthened the DataHub integration with full catalog sync parity to Atlan and Alation, plus a new incident lifecycle that raises a Qualytics incident on each asset when anomalies are active and resolves it once they are archived. - -- Improved Entity Resolution check performance and reliability on large datasets, with a configurable row-count cap, smarter caching to avoid redundant work, an automatic shuffle-join fallback for large candidate sets, and a clear warning when most entities remain ungrouped. - -- General Fixes and Improvements. - -### 2026.5.15 { id=2026.5.15 } - -#### Feature Enhancements - -- Introduced AI-generated description suggestions across the platform, letting users request a business-friendly description instead of writing one from scratch. - - Suggestions are generated on demand from a sparkle icon next to each description field. - - Computed asset forms (computed tables, files, joins, and fields) gained a dedicated description field so suggestions can be generated there too. - - Available when Agent Q is configured on the environment. - -- Redesigned several dialogs as right-side panels for more workspace while keeping the underlying page visible. - - Anomaly details now opens as a side panel with collapsible sections. - - Field details (in Explore) opens as a side panel with the field's key metrics at the top. - - The Quality Score breakdown now opens directly from list views in a side panel. - - The Tables list on export and materialize operations opens as a side panel with infinite scroll. - -#### General Fixes and Improvements - -- Resolved a server error returned by the API and CLI when creating S3, Athena, or Redshift connections with IAM Role authentication. - -- Corrected integer and decimal columns in the Source Records tab being sorted as text instead of by numeric value. - -- Fixed Exists In and Data Diff checks intermittently failing on Delta files. - -- Resolved an issue where bulk quality check promotion could hang after destination validation rejected one or more checks. The remaining checks are now promoted normally, with each rejection surfaced individually. - -- Addressed an issue on the Edit Datastore form where switching to a DFS connection would cause the Authentication section to not render correctly. - -- Improved data catalog sync to skip work that hasn't changed and cut down on redundant calls to the catalog. - -- Fixed quality checks saving with a minimum value greater than the maximum on range-based rules (Between, Between Times, Time Distribution Size, Metric, and Volumetric). - -- Resolved an error that prevented deleting a computed table when an unrelated quality check in the workspace had invalid configuration data. - -- Fixed scan remediation failing on BigQuery and other enrichment datastores when a masked field had a numeric or other non-text type. - -- Corrected integer and decimal columns in the Data Preview tab being sorted as text instead of by numeric value. - -- Fixed team names with leading or trailing whitespace creating duplicate teams that could cause inconsistent datastore visibility for their members. - -- Resolved the User Profile menu showing stale team membership after a user edited their own profile. - -- Optimized loading of the quality checks and datastores listings, especially in workspaces with large numbers of checks, containers, and active anomalies. - -- Expanded quality check exports with a First Asserted timestamp alongside Last Asserted. - -- Improved traceability on check and anomaly history. Users can now trace newly created AI Managed checks back to the profile that produced them, and newly auto-resolved anomalies back to the scan that resolved them. - -- Improved performance of resource history views with infinite scroll on anomaly, container, quality check, and template overview pages. - -- Enhanced the Audit tab to also show when users reveal masked field values, with each entry opening a side panel for details and quick copy actions. - -- Expanded the Audit tab to also track integration updates and LLM configuration changes. - -- Added a confirmation step before deleting a comment in anomaly details, preventing accidental deletions. - -- General Fixes and Improvements. - -### 2026.5.7 { id=2026.5.7 } - -#### Feature Enhancements - -- Refreshed product terminology to make AI-driven capabilities easier to recognize across the platform. - - Renamed Inference Threshold to AI Effort, replacing the numeric scale with named levels and plain-language descriptions of what Qualytics AI does at each one. Existing profile configurations and schedules continue to work without changes. - - Renamed Inferred checks to AI Managed checks and added a matching AI badge for at-a-glance recognition. - - Split the Weight value into Importance for checks and Severity for anomalies, so each scoring concept reads clearly in its context. - -- Introduced dedicated pages for operations, replacing the modal-based results dialog with a full-page view of everything that happened in a single run. - - Each operation page is organized into an Overview tab with the type-specific configuration that drove the run, and a Results tab that surfaces what came out of the run. - - For scan operations, the Results tab is broken into views for partition outcomes, individual check results, and source records, giving users a fuller picture of what passed and failed. - - The source records view offers a row-level perspective on the data, listing only the records flagged as anomalous along with how many anomalies each one triggered, helping users quickly identify the most problematic records. - - Operation pages refresh automatically while the run is still in progress. - -- Added a new Audit tab under Settings, where admins can track the actions performed by each user across the platform. - - The audit list is paginated and grouped by day, with filters for users, timeframe, and an option to include or exclude actions performed by the platform itself. - - A summary section surfaces active users, total actions, the most active user, and the top category for the selected timeframe. - - A stacked bar chart compares user-driven and system-driven actions, automatically bucketed by day, week, month, or quarter. - - The current page of audit entries can be exported to CSV for offline review. - -- Introduced IAM Role authentication for AWS-backed datastores, enabling cross-account access via role assumption instead of static access keys. - - Available for S3, Athena, and Redshift datastores. Customers can configure a role ARN, and an optional external ID on the datastore. - - Replaces long-lived access keys with temporary, auditable, and revocable credentials, following AWS recommended practices for cross-account access. - -- Expanded entity resolution checks to compare records across multiple fields, each with its own match strategy and weighting. - - Comparisons now support string, numeric, and date or timestamp fields, with per-type match strategies such as fuzzy spelling, numeric tolerance, and date proximity or calendar granularity. - - Existing entity resolution checks were automatically migrated to the new structure, preserving their original similarity thresholds. - -#### General Fixes and Improvements - -- Corrected type inference for string columns in Parquet, Avro, ORC, Delta, and Iceberg files so timestamp and date values are correctly identified during profiling instead of being kept as strings. - -- Resolved large profile jobs occasionally aborting when a backend worker was retired mid-run. - -- Addressed intermittent computed field creation failures that occurred under concurrent load. - -- Fixed an issue where deactivating a schedule could drop its cron expression. The cron expression configuration is now preserved when a schedule is deactivated. If a schedule deactivated before this release no longer fires after reactivation, re-enter its cron expression to restore it. - -- Corrected flow creation returning a generic server error when actions formed a circular dependency. - -- Resolved flows with a ticket-status-update action hanging indefinitely when triggered without a severity context. - -- Addressed updating anomaly assignees returning a server error when the same user was listed more than once. - -- Fixed listing the checks of a segment with container-level checks included returning a server error. - -- Corrected Alation sync not matching Qualytics datastores to their Alation datasources for certain JDBC connection URL formats, particularly for SQL Server connectors. - -- Expanded Computed Joins to accept Computed Tables on either side, lifting the previous restriction that limited them to base tables and files. - -- Surfaced the Qualytics MCP and CLI as featured products in the header resources menu, making external tooling easier to discover from inside the app. - -- Expanded AgentQ to list quality check templates and create new checks based on them. - -- Strengthened saved filter preset governance with role-based edit, rename, and delete permissions, explicit Save and Reset controls in place of implicit auto-save, owner attribution, and a delete confirmation. - -- Strengthened native integration with Snowflake and Redshift datastores. - - Improved profile execution time on Snowflake and Redshift by computing cardinality, percentiles, top-K values, and other metrics directly in the source warehouse. - - Tagged Snowflake queries from Qualytics with a Connection String Identifier so admins can attribute and monitor Qualytics workloads in their query history. - -- General Fixes and Improvements. - -### 2026.4.24 { id=2026.4.24 } - -#### Feature Enhancements - -- Introduced automatic resolution of previously open anomalies that are not reproduced by a new full scan, reducing manual cleanup when data quality issues are no longer detected. - - A new "Auto Resolve Anomalies" toggle is available in scan settings, enabled by default for full scans and automatically disabled for incremental scans. - - When a full scan completes, previously open anomalies (Active or Acknowledged) are resolved if the same checks ran again and the same issue was no longer detected. - - The scan results modal now separates anomalies into "Identified" and "Auto-Resolved" tabs, with the auto-resolved tab showing anomalies from previous scans that were resolved by the current run. - - Operation status displays include an "Anomalies Auto-Resolved" count, and each auto-resolved anomaly records a history entry attributed to the resolving scan. - -- Introduced ownership for quality checks and assignees for anomalies, establishing clear accountability for data quality issues. - - Quality checks now have an owner that can be changed at any time. Inferred checks are owned by Qualytics, and authored checks default to the user who created them. - - Anomalies can be assigned to one or more users, and inherit the originating check's default assignee when one is set. - - Check owners are notified when someone else updates a check they own, and anomaly assignees are notified when their anomalies change. - - Users can quickly find the checks they own and the anomalies assigned to them. - - Ownership and assignee changes are tracked in the check and anomaly history for full auditability. - -#### General Fixes and Improvements - -- Resolved team assignments not persisting when updating a user. - -- Fixed the Agent Q chat endpoint returning a generic server error when the request body was empty or malformed, now responding with a clear validation message. - -- Corrected flow creation and update failing with a generic server error when the submitted actions formed a cycle, now returning a validation error that identifies the cyclic actions. - -- Addressed Alation integration issue where data catalog syncs were not finding assets for some OCF datasource configurations. - -- Corrected a failure when adding or editing descriptions on computed tables, computed files, and computed joins. - -- Expanded Dry Run permissions to allow users with the Drafter permission to execute quality check dry runs, requiring Editor permission only when masked field values are included in the results. - -- Improved how edits to inferred checks are handled: changing any property now converts the check into an authored check, preventing subsequent profile operations from overwriting it. - -- Enhanced the archive action in flows with an anomaly status filter, giving more control over which anomalies are automatically archived. - -- Clarified how unique quality checks behave when configured on multiple fields: the combination of fields is evaluated as a composite key, with updated rule descriptions and Agent Q guidance reflecting this. - -- Optimized profile and constraint suggestion operations by consolidating histogram computation, noticeably reducing execution time and compute cost. - -- Improved error messaging when connecting to AWS Glue catalogs and Athena-backed datastores, replacing verbose SDK traces with concise messages that clearly point to credentials or permission issues. - -- Enhanced Agent Q with several capability and usability improvements. - - Recognized the new "Sync" terminology for the discover-and-register operation by renaming the `run_catalog` tool to `run_sync` while keeping the legacy name supported, and updated response guidance to default to "Sync" while mirroring the user's language when they still refer to it as "Catalog". - - Exposed promote operations as chat capabilities, allowing users to ask Agent Q to copy computed tables, computed files, computed fields, and quality checks across datastores directly from the conversation. - - Extended attachment support to include Word and Excel documents alongside PDFs, with the upload button now available on additional LLM providers including OpenAI, Azure OpenAI, and Heroku. - -- General Fixes and Improvements. - -### 2026.4.8 { id=2026.4.8 } - -#### Feature Enhancements - -- Introduced Filter Presets on the Explore page, allowing users to save, apply, and share named filter configurations that combine datastores and tags into reusable views. - - Users can create, edit, and delete filter presets from a dropdown in the Explore filter bar, with each preset storing a specific combination of datastores and tags. - - Changing the datastore or tag selection while a preset is active automatically updates the saved configuration, indicated by a sync icon on the affected filters. - - Presets are globally visible, with team-based permissions filtering presets to only show those containing datastores the user has access to. - - Selected presets are reflected in the URL as a query parameter, enabling shareable links that restore the same filtered view for other users. - -- Introduced @mention support in comments, allowing users to tag team members directly in comment fields and trigger in-app notifications for mentioned users. - - Typing `@` followed by a name in any comment field opens an autocomplete dropdown with matching user suggestions, inserting styled mention chips that are visually highlighted in saved comments. - - Mentioned users receive in-app notifications with a direct link to the relevant anomaly detail page, with self-mentions automatically excluded. - - Mention support is available across all comment entry points, including anomaly comments, timeline entries, archive and acknowledge modals, and flow action configurations. - - Bulk operations with mentions — such as archiving multiple anomalies with a comment — trigger one notification per mentioned user per anomaly, each linking directly to the relevant anomaly. - -- Added multi-datastore creation for DFS connections, extending the bulk onboarding flow to allow creating multiple datastores from a single distributed file system connection in one step. - - Users can browse directories from a DFS connection and select multiple root paths to create as individual datastores in a single step. - - Directory browsing includes partition detection and existing datastore indicators for informed path selection. - - Name templates support `{{path}}` (full directory path flattened with underscores) and `{{path_segment}}` (last folder name only) tokens for automatic naming of created datastores. - - Each selected path can be validated before creation, and an optional step allows linking all newly created datastores to an enrichment datastore. - -- Added automatic stale anomaly cleanup with a default scheduled flow that archives anomalies with no updates or comments for over 180 days to Discarded status. - - The cleanup flow is auto-created on deployment and runs weekly on Sundays at midnight UTC, with a chained in-app notification upon completion. - - Existing deployments that already have an active scheduled archive flow are unaffected by the migration. - -#### General Fixes and Improvements - -- Resolved quality check creation failing with an error when applying numeric, date, or time-based rules to string-typed fields that contain temporal values. - -- Fixed data preview and scan operations failing on Oracle datastores with XMLType columns stored as binary XML, now properly excluding unsupported Oracle column types from queries. - -- Addressed user avatars displaying empty circles when no profile picture was available, and enhanced fallback behavior to show user initials instead of a single character. - -- Corrected the flow schedule trigger side panel silently overwriting the existing cron configuration when saved without changes, now preserving the existing schedule unless users explicitly choose to define a new one. - -- Fixed Agent Q additional context rendering as visible plain text inside user message bubbles instead of remaining collapsed behind the context icon, and corrected the copy action to exclude additional context and attachment metadata from copied content. - -- Improved error handling in the multi-datastore creation flow to surface connection validation errors at the correct step, preventing confusion between source datastore creation and enrichment datastore linking failures. - -- Enabled on-demand execution for scheduled flows, giving users the same "Run Now" capability already available for scheduled operations. - -- Enhanced Snowflake key-pair authentication to also accept raw PEM keys and resolve private keys from HashiCorp Vault, with clearer error messages for unresolvable secret references. - -- Introduced visual status indicators for datastores and containers across the platform, displaying colored badges that reflect connection status for datastores and availability status for containers — Available, Inaccessible, or Unloadable — with a dedicated status filter for container listings. - -- Improved Agent Q PDF attachment experience with a first-page thumbnail preview when files are sent, the actual filename displayed instead of the raw MIME type, and a fallback filename card after page reload. - -- Improved in-app notification experience with redesigned toast previews that display message content on arrival and auto-dismiss after five seconds with an animated progress bar. - -- Added flow co-authorship attribution to timeline entries, identifying which flow execution made a change with a link to the corresponding flow run. - -- General Fixes and Improvements. - -### 2026.3.25 { id=2026.3.25 } - -#### Feature Enhancements - -- Added timezone-aware cron scheduling, allowing users to schedule operations and flows in their local timezone with automatic Daylight Saving Time adjustment. - - A searchable IANA timezone selector is available when creating or editing schedules for Scan, Profile, Sync, Materialize, Export, and Flow operations. - - Schedules automatically adjust for DST transitions, ensuring operations run at the intended local time year-round without manual cron changes. - - UTC remains the default for all new and existing schedules, preserving full backward compatibility. - - Schedule cards and labels now display the configured timezone abbreviation instead of a hardcoded UTC indicator. - -- Introduced a Last Active column in the admin user listing, providing visibility into each user's most recent login activity. - - The column displays relative time labels such as "3 days ago" or "Just now" for recent logins, with a tooltip showing the exact UTC timestamp. - - Users who have never logged in display a "Never" indicator for easy identification of inactive accounts. - - The user listing supports sorting by last login date, enabling administrators to quickly identify dormant or recently active users. - -#### General Fixes and Improvements - -- Corrected user avatars displaying a blank colored circle instead of the user's initials when a profile picture was unavailable or failed to load. - -- Addressed misclicks on card selection checkboxes triggering navigation instead of toggling selection, now ensuring the full clickable area registers as a selection action. - -- Fixed the API accepting empty strings for required fields such as names, queries, and crontab expressions, now enforcing proper validation across all inbound schemas. - -- Fixed computed assets incorrectly showing a display name versus source name distinction when renamed, now updating the actual name directly since computed tables, files, joins, and fields exist only in Qualytics. - -- Improved Agent Q to support PDF file uploads, allowing users to attach documents via drag-and-drop or the paperclip button for model-assisted analysis when a compatible LLM provider is configured. - -- Configured Agent Q to honor team restriction mode, scoping chat responses and data discovery to the restricted team's datastores when a team restriction is active. - -- Optimized Agent Q conversation history management, improving context retention and response quality across longer chat sessions. - -- Expanded Agent Q tooling to support editor-level actions, including quality check management, operation and schedule lifecycle controls, anomaly investigation, stewardship of field, container, and datastore metadata, and computed asset maintenance. - -- Updated the CodeMirror syntax editor theme for improved contrast and readability across light and dark modes, aligning with the current design system. - -- Added check variable syntax highlighting in the editor, visually distinguishing `{{variable}}` placeholders and providing autocomplete suggestions from container metadata keys. - -- Enhanced computed field promotion to automatically resolve nested dependencies, ensuring parent computed fields are included and processed before their dependents. - -- Improved profiling performance for data type inference, significantly reducing execution time on datasets with large string columns. - -- General Fixes and Improvements. - -### 2026.3.20 { id=2026.3.20 } - -#### Feature Enhancements - -- Renamed the Catalog operation to Sync, now performing delta-based processing that only analyzes changes instead of recalculating all container metadata. - - The Sync operation processes only what has changed since the last run, significantly reducing execution time on large datastores. - -- Introduced Field Masking to protect sensitive data such as PII and ePHI, allowing fields to be marked as masked so their values are scrubbed from all standard data responses. - - Masked field values are replaced with a placeholder ***MASKED*** in container previews, source record retrievals, enrichment reads, and quality check dry runs. - - Privileged users can request unmasked values through an explicit override, with all access recorded in an audit trail. - - Fields serving as container identifiers (incremental, partition, or group-by fields) cannot be masked to preserve operational integrity. - -- Display names and descriptions from data catalog integrations — When synced with a data catalog (Atlan, Alation, Microsoft Purview, Collibra, or DataHub), Qualytics automatically populates descriptions on datastores, and display names and descriptions on containers and fields from the catalog's asset metadata. - - When a display name is set, it is shown across the entire platform in place of the source name, with the original name still accessible via an info icon. - - Display names and descriptions can also be manually assigned directly in Qualytics, independently of any data catalog integration. - -- Added multi-schema source datastore creation, allowing users to discover and select multiple schemas from a single connection and create all corresponding source datastores in one step. - - Available catalogs and schemas are automatically discovered from the connection, letting users browse and select which ones to onboard. - - An optional second step allows linking all newly created source datastores to a single enrichment datastore, either by selecting an existing one or creating a new one during the same flow. - -- Enabled a Business Context configuration in the LLM integration, providing personalized Agent Q suggestions tailored to each organization's data governance responsibilities. - - Administrators can describe their team's business focus and data quality scope in the LLM integration settings, providing Agent Q with relevant organizational context. - - Agent Q suggestions now incorporate both the organization's business context and a summary of the user's most recent chat session for more relevant recommendations. - -- Introduced team restriction mode, allowing administrators to view and interact with the platform from the perspective of a specific team. - - Administrators can select a team from the profile dropdown to restrict their session, temporarily assuming a Manager role scoped to that team's permissions and visibility. - - A visual indicator is displayed in the toolbar while a restriction is active, providing clear awareness of the current team context. - - The restriction persists across navigation and page reloads until explicitly removed by the user. - -#### General Fixes and Improvements - -- Resolved computed join container previews returning empty results under certain key overlap conditions. - -- Corrected timezone abbreviations not reflecting Daylight Saving Time, now dynamically displaying the correct label (e.g., EDT vs EST) based on the date being shown. - -- Addressed Agent Q chat context and message content overflowing the input field when expanding long responses. - -- Fixed freshness chart anomaly bars not displaying the correct highlight color and heatmap data reflecting all checks instead of only the selected one. - -- Resolved a race condition during API startup that could cause intermittent authentication errors. - -- Fixed stale scheduler jobs causing phantom flow executions after changing a flow's trigger type, now properly cleaning up scheduled jobs when the trigger type is modified or a flow is deleted. - -- Resolved the Atlan integration not populating check and anomaly counts, now correctly synchronizing metadata for both new and existing installations. - -- Corrected observability operations failing on datastores containing computed joins with computed fields. - -- Resolved reference filters in quality checks not substituting check variables, causing validation and scan errors on checks using dynamic placeholder values. - -- Added an Export as PDF option for Agent Q responses, allowing users to download individual messages as formatted PDFs that preserve the chat's visual layout. - -- Optimized profiling performance for containers with large field counts, including more efficient correlation analysis, significantly reducing execution time on wide schemas. - -- Enhanced datastore group visibility across the application, now displaying group information in breadcrumbs and adding management actions directly in the sidebar. - -- Updated delete confirmation dialogs across the application to clearly communicate the impact of each action before proceeding. - -- Improved Snowflake connection validation to surface warning messages about potential warehouse issues, such as undersized or suspended warehouses. - -- Removed the five key-value pair limit from the additional metadata editor, now supporting unlimited entries with scrollable and collapsible views. - -- General Fixes and Improvements. - -### 2026.3.6 { id=2026.3.6 } - -#### Feature Enhancements - -- Introduced promote operation for copying computed assets and quality checks across datastores and containers. - - Users can promote computed tables, computed files, and computed fields from one datastore or container to another, eliminating the need to manually recreate definitions across environments. - - Promote enables environment-based management of computed assets and checks — each entity is matched by name on the destination and either created if missing, updated if the definition differs, or skipped if identical. - - Quality checks can now be promoted across containers as active or draft, replacing the previous check migration feature that only supported creating checks as drafts. - - Each promoted entity reports an individual result status (Created, Updated, Skipped, or Failed) with filterable results and expandable error details. - - Promote operations appear in the Activity list with progress tracking. - -- Introduced PagerDuty as a first-class alerting integration. - - PagerDuty now appears in the Integrations page alongside Slack and Microsoft Teams, with a new additional details field for including custom context in incident notifications and an optional routing key override for directing incidents to a different service than the one configured at the integration level. - -- Added container-level default variables for quality checks and computed containers. - - Containers now support additional metadata key-value pairs that serve as default variable values during scans, configurable from the container settings page. - - Scan operations include a Scan Variables section in advanced options, allowing users to override container defaults on a per-scan basis. - - Variable resolution follows a defined priority: container metadata provides defaults, scan-level variables override those, and system profile variables take highest precedence. - -- Enhanced Agent Q chat experience with background streaming, session management, and infinite scrolling. - - Chat sessions now support archiving, restoring, and permanent deletion, giving users full control over their conversation history. - - Chats continue generating responses when navigating away from the session, with a visual indicator for ongoing or interrupted streams. - - Infinite scrolling is now supported for chat messages, the chat history sidebar, and archived sessions, replacing manual pagination. - - Floating chat mode now includes a chat history dropdown for switching between sessions without leaving the floating interface. - -- Added a force refresh option for anomaly source records, allowing users to bypass the cache and fetch the latest available data directly from the API, with a tooltip displaying the last updated timestamp. - -#### General Fixes and Improvements - -- Resolved an error when favoriting a datastore, container, or quality check for the first time when no other assets had been previously favorited. - -- Corrected performance regressions in known pattern detection during profiling that caused redundant regex evaluations, significantly reducing constraint suggestion time on large datasets. - -- Addressed Aggregation Comparison check validation failing when using expression-only aggregations like `count(*)` with no explicit field references. - -- Fixed fields with "missing" status appearing in the sidebar tree view after schema changes, now showing only active fields to keep the navigation uncluttered. - -- Resolved computed join container previews returning empty results when sampled join keys from each side did not overlap. - -- Corrected inaccurate freshness check results on JDBC datastores caused by silent DATE-to-Timestamp coercion that applied the local timezone instead of UTC. - -- Addressed field profile metric preview charts that appeared empty on hover. - -- Resolved Expected Values checks rendering empty value lists in certain scenarios, such as numeric values, while other types displayed correctly. - -- Corrected BigQuery export and materialize operations displaying raw JDBC error messages on write failures, now providing user-actionable messages for common issues like quota limits, missing datasets, and permission errors. - -- Optimized Redshift write performance by aligning the JDBC batch insert size with the driver configuration, reducing overhead during data operations. - -- Improved dataDiff checks with granular change type filtering, allowing users to specify whether added, removed, or changed rows should trigger anomalies, with at least one type required and all three selected by default. - -- Enhanced the asset timeline with Agent Q co-authorship attribution, allowing users to identify which changes were made through AI-assisted workflows, with the Agent Q avatar and client name displayed on co-authored entries. - -- Improved the command palette with unified search and expanded asset support. - - Asset search is now integrated directly into the command palette alongside command search, replacing the previous standalone Search Assets shortcut. - - Assets can now be filtered by ID in addition to name, allowing users to jump directly to a specific item. - - Added support for new searchable asset types: quality checks, check templates, and anomalies. - -- General Fixes and Improvements. - -### 2026.2.27 { id=2026.2.27 } - -#### Feature Enhancements - -- Introduced field status management to preserve historical data when source schema changes occur. - - Fields removed or renamed at the source are now marked as "missing" instead of being permanently deleted, preserving all associated quality checks, anomalies, and metadata. - - Added merge capability for renamed fields, allowing users to transfer all dependencies — including checks and anomalies — from a missing field to its active counterpart in a single action. - - Field exclusion now assigns a dedicated "excluded" status to individual fields, while remaining accessible from both the field level and the container settings for pre-profile exclusion workflows. - - Excluded fields can be restored to active status without requiring a new profile run. - - Added status indicators, filtering tabs, and a dedicated status filter across field listing pages for clear visibility into active, missing, and excluded fields. - -- Introduced Datastore Grouping for organized sidebar navigation. - - Users can now create custom groups to organize datastores in the sidebar by environment, purpose, or any preferred category. - - Groups support custom icons and names, with a dedicated management menu for renaming and deleting groups. - - Datastores can be assigned to groups directly from the tree view, with grouped datastores visually organized under collapsible sections. - - Added group-based filtering on the datastore listing page for focused browsing across large deployments. - - Group icons are displayed alongside datastore identifiers in card and list views for quick visual identification. - -- Introduced floating chat interface for Agent Q, accessible from any page in the platform. - - A persistent floating action button allows users to open Agent Q without navigating away from their current workflow. - - The assistant automatically detects the current page context — including datastore, container, field, check, and anomaly — and injects relevant metadata into conversations for context-aware responses. - - Supports paste attachments for large clipboard content, enabling users to share text snippets directly in the chat. - - Added `Q` keyboard shortcut for quick access to the floating chat from anywhere in the application. - - Chat history sessions are accessible from both the floating panel and the full-page Agent Q experience. - -- Enhanced Agent Q with chat history management, expanded tool capabilities, and performance optimizations. - - Chat conversations are now persisted and accessible through a searchable sidebar, allowing users to resume previous sessions and review past interactions. - - Introduced five new assistant capabilities: tag management, operation execution, notification delivery, ticket creation, and integration listing — enabling broader task automation through natural language. - - Added per-user rate limiting and prompt injection defenses for improved security and resource protection. - - Added `G + Q` keyboard shortcut for quick access to the Agent Q page from anywhere in the application. - - Optimized agent performance with singleton caching, deferred tool loading, and conversation summarization to reduce token overhead across sessions. - -#### General Fixes and Improvements - -- Corrected percentage value conversion in Volumetric check templates where min and max values for Percentage Change comparisons were sent as whole numbers instead of decimal format. - -- Resolved misleading warning logs during computed file profiling that incorrectly reported fields as missing from the source container when they were intentionally removed from the computed file's SELECT statement. - -- Resolved profile operation failures on Oracle datastores caused by undetected XMLType columns, now properly handling XML data by serializing it as readable text during profiling. - -- Optimized anomaly and field-profile query performance for large-scale deployments, significantly reducing load times for anomaly listings and field profile pages in datastores with high anomaly volumes. - -- Improved Aggregation Comparison anomaly messages to display evaluated values alongside expression names, making violation details immediately actionable without requiring manual investigation. - -- Reduced Agent Q token consumption through conversation compaction and deferred tool loading, lowering per-request overhead and extending effective conversation length within model context limits. - -- Improved database connection error messages with clearer root cause identification and actionable remediation guidance when connection pool limits are reached. - -- Improved authentication error handling to display clear, user-friendly messages on the login page when access is denied due to group authorization restrictions. - -- General Fixes and Improvements. - -### 2026.2.21 { id=2026.2.21 } - -#### Feature Enhancements - -- Introduced support for Complex Datatypes for DFS. - - Profiling and quality checks now support Array and Struct field types, expanding coverage to nested and multi-valued data structures. - - Array fields are profiled with element-level context, allowing quality checks to validate each element individually using supported rule types such as Expected Values, Matches Pattern, and Min/Max Length. - - Struct fields are automatically flattened into individual scalar columns during profiling, enabling full data quality rule inference and monitoring on nested data. - - Flattening supports recursive traversal up to a configurable depth, with path-based naming conventions for generated columns. - - Quality check rule selection adapts to complex field types, showing applicable rules based on whether the check targets the array or its individual elements. - - Field tree views and profile pages display nested field hierarchies with updated iconography for clear identification of complex field types. - - Source record tables and container previews display raw complex values, allowing users to inspect nested and array data directly during anomaly investigation. - -- Introduced MCP-powered AI assistant with built-in chat interface and Bring Your Own Key LLM support. - - Added an interactive chat interface directly in the platform, enabling users to perform data quality tasks through natural language conversations with AI-powered assistance. - - Users can configure their preferred LLM provider and API key under Settings, with support for OpenAI, Anthropic, Google, AWS Bedrock, Cohere, Groq, Mistral, and Hugging Face models. - - The assistant leverages MCP tools to explore datastores, validate queries, create computed assets, manage quality checks, investigate anomalies, and analyze quality scores within a guided workflow. - - Chat responses include real-time tool step progress indicators, displaying each action the assistant performs with expandable input and output details. - - Suggested prompts guide users toward common workflows such as building computed tables, creating quality checks, and analyzing data quality trends. - -- Introduced version history for containers. - - Users can now view a timeline of changes made to any container directly from the container overview page, displaying the editor and timestamp for each modification. - - Computed tables include a side-by-side diff visualization of query changes, making it easy to compare before and after states for troubleshooting. - -- Added n8n workflow integration as a flow action. - - Users can configure n8n webhook URLs and secrets directly on each flow action, enabling automated workflows triggered by flow executions. - - Supports operation-completed, anomaly, and anomaly status change triggers, sending full context payloads to n8n for downstream automation. - -- Added Service Principal authentication support for SQL Server datastores. - - Enables Azure Active Directory OAuth-based connections using tenant ID, client ID, and client secret or certificate credentials as an alternative to username and password authentication. - -#### General Fixes and Improvements - -- Fixed missing loading indicators on the Explore fields list and Activity page tabs. - -- Corrected container creation returning a generic server error instead of a proper conflict response when a container with the same name already existed in the datastore. - -- Resolved incremental ID timezone parsing issue that applied local timezone instead of UTC, causing inaccurate freshness metrics when incremental filtering was enabled. - -- Corrected data catalog sync summary to only count assets that were successfully synced, preventing misleading totals when individual asset syncs failed. - -- Fixed quality check API updates not persisting referenced fields when expressions were modified, ensuring field associations stay consistent with the check expression. - -- Resolved deep link URLs being lost during SSO authentication, ensuring users are redirected to the intended resource after login. - -- Enhanced ticket creation through flows to use the anomaly description as the ticket description, providing richer context for ServiceNow and Jira incidents. - -- Improved Insights data reliability with a force refresh option, allowing users to manually trigger on-demand data updates for the latest quality metrics. - -- Enhanced Observability tooltips with a day-over-day change indicator, displaying row count differences from the previous day for faster trend analysis. - -- General Fixes and Improvements. - -### 2026.2.13 { id=2026.2.13 } - -#### Feature Enhancements - -- Introduced Microsoft Fabric JDBC connector. - - Added read-only connectivity to Microsoft Fabric's SQL Analytics Endpoint, enabling users to profile and monitor data quality on Fabric datasets. - - Authentication is handled via Azure Active Directory Service Principal, with credentials securely managed through connection properties. - -- Added Service Principal authentication support for ABFS datastores, allowing Azure Active Directory OAuth-based connections as an alternative to Shared Key authentication. - -#### General Fixes and Improvements - -- Fixed missing label text color in the bulk action menu on the Flows page when using dark theme. - -- Corrected low-contrast tooltip icon on the check assertion timeline that was difficult to see in both light and dark modes. - -- Optimized data catalog integration sync performance by replacing verbose per-asset logging with concise per-datastore summaries, reducing storage overhead in environments with large asset catalogs. - -- General Fixes and Improvements. - -### 2026.2.7 { id=2026.2.7 } - -#### Feature Enhancements - -- Introduced license management interface under Settings. - - Administrators can now view the current license expiration date directly from the Settings Status page, with visual warnings when the license is nearing expiration. - - Added the ability to generate a license request payload to send to a Qualytics account representative for license renewal. - - Users can apply a new license directly through the interface, streamlining the license assignment process. - -- Added bulk actions and validation improvements for flow executions. - - Users can now select and abort multiple flow executions at once, eliminating the need to handle stuck executions one by one. - - Introduced bulk delete for flow executions to streamline cleanup of completed or failed runs. - - Added filter option for aborted status in the flow executions list for easier tracking. - - Flows without actions are now validated and blocked from publishing to prevent incomplete workflow configurations. - -- Added support for custom anomaly messages from source record fields. - - Quality checks can now use a field value from the source record as the anomaly message, replacing the auto-generated violation text with business-specific context. - - Custom anomaly message field can be configured in both individual check forms and bulk check creation workflows. - - A field selector is available when container fields are loaded, with a manual text input fallback for flexible configuration. - -- Added rule type filter to the Observability listing. - - Users can now filter containers by observability rule type, choosing between Volumetric and Freshness checks for more focused monitoring. - - Filter availability adapts to the current context, displaying relevant filter options across Explore, Datastore, and Container views. - - Improved column alignment and heatmap display across different screen sizes for better readability. - -#### General Fixes and Improvements - -- Corrected auto-generated descriptions for multi-field Unique and Not Null checks to reference all selected fields instead of only the first one. - -- Fixed anomalous field filter in the failed checks section where checkbox selections were not filtering results and layout elements were overlapping. - -- Corrected tooltip icon contrast in the check assertion timeline that was not visible against the tooltip background in both light and dark modes. - -- Fixed incorrect breadcrumb navigation when viewing checks that no longer reference the original field after field association changes. - -- Improved platform reliability by automatically recovering flow executions and data catalog syncs that became stuck after environment restarts. - -- Centralized internal field association logic to improve consistency and reliability across anomaly counts, filtering, and data catalog synchronization. - -- General Fixes and Improvements. - - -### 2026.1.29 { id=2026.1.29 } - -#### Feature Enhancements - -- Introduced Anomaly Status Changed flow trigger. - - Flows can now be triggered when anomaly statuses change, enabling automated workflows for status transitions. - - Trigger settings support filtering by specific status values to target relevant transitions. - -- Added notification support for Create Ticket and Update Ticket Status flow actions. - - Introduced Create Ticket action to automatically generate tickets in connected ticketing systems when anomalies meet defined conditions. - - Introduced Update Ticket Status action to synchronize status changes to linked tickets across integrated platforms. - - Notifications can be sent to Slack and Microsoft Teams when ticketing actions execute. - - Introduced status selection at ticket creation, allowing tickets to be created with a specific initial state. - - Ticketing actions are validated to ensure compatibility with Anomaly or Anomaly Status Change triggers. - - Improved handling when required ticketing integrations are unavailable during flow execution. - -- Enhanced auto-generated check descriptions with context-aware, business-friendly language. - - Descriptions now include field type context such as "numeric field", "timestamp field", or "text field" for clearer rule interpretation. - - Expected values are summarized directly in descriptions, displaying the first three values with a total count indicator. - - Filter clauses are translated into plain English for improved readability. - - Range checks now specify inclusivity labels to clarify boundary behavior. - - Common regex patterns are described in human-readable terms instead of raw expressions. - - Cross-datastore rules include reference field and container context for better traceability. - - Distinct count checks generate comparator-aware descriptions using phrases like "fewer than", "at most", "exactly", "at least", and "more than" based on the configured operator. - -- Improved computed asset management with inline editing from check interfaces and field dependency protection. - - Users can create, edit, and manage computed tables, files, joins, and fields directly from the check interface without navigating to datastore pages. - - Added a warning dialog when computed asset updates would remove fields with active checks or anomalies, with options to cancel or proceed. - - Introduced "E" keyboard shortcut to quickly edit computed containers from any context. - - Enhanced command palette shortcuts to preselect the current container in profile and scan dialogs. - -#### General Fixes and Improvements - -- Improved error messages for network connectivity issues to provide clearer guidance when the API server is unreachable. - -- Enhanced asserted check editing to support field modifications while preserving accurate quality score calculations. - -- Improved anomaly descriptions with editable fields, version tracking, and enriched human-readable messaging. - -- Enhanced tenant observability with build version information. - -- Fixed tags and rule types not appearing in filter lists by aligning filter option counts with the current view perspective. - -- Corrected distinct count anomaly messages that displayed negative values and incorrect expected values. - -- Resolved Collibra integration authentication failures caused by OAuth token expiration with automatic token refresh. - -- General Fixes and Improvements. - -### 2026.1.14 { id=2026.1.14 } - -#### Feature Enhancements - -- Introduced the new Qualytics visual identity - - Refreshed brand experience featuring a modern color palette, updated logo, and refined typography that reflects the platform’s evolution. - - Redesigned Insights dashboard with enhanced quality score cards, vibrant chart gradients, and improved dimension visualizations for clearer data storytelling. - - Modernized card layouts across datastores, containers, checks, anomalies, and templates with improved visual hierarchy and interaction states. - - Streamlined iconography with consistent outline styling and neutral tones for a cleaner, more focused interface. - - Enhanced chart styling with cyan monochromatic palettes, smooth gradients, and rounded segments across key visualizations such as data volume, observability metrics, heatmaps, and others. - - Improved accessibility with better contrast ratios, theme-aware color utilities, and consistent styling across light and dark modes. - - Refined sign-in experience with updated visual styling aligned to the new brand direction. - -#### General Fixes - -- Optimized container preview performance. - -- Standardized enrichment datastore settings labels to ensure consistency with the scan operation options. - -- Enhanced operation timeout behavior to ensure meaningful error responses for long-running sync operations. - -- Fixed scan schedule update errors that occurred when anomaly reactivation settings were not explicitly configured. - -- Resolved intermittent server errors affecting the Flows list page when scheduled information was present. - -- Corrected server errors when publishing flows while action rearrangement was in progress. - -- Resolved field exclusion behavior to properly skip problematic columns during initial data loading in SQL Server datastores. - -- General Fixes and Improvements. - - +--- +render_macros: false +--- + +# 2026 + +## Release Notes + +### 2026.5.28 { id=2026.5.28 } + +#### Feature Enhancements + +- Introduced Data Lineage as a trial feature, providing a new way to explore how data is connected across datastores, containers, and fields. + - Lineage can be pulled automatically from a connected data catalog or defined manually from the graph, with support for cross-datastore relationships. + - Computed tables, files, and joins include built-in lineage to their source containers, requiring no manual setup. + - Supports two perspectives on the graph: a container lens for asset-to-asset dependencies, and a field lens for column-level analysis. + - Relationships can be managed directly from the graph, with inline actions to add upstream or downstream links between containers or fields, or to remove existing ones. + - An active anomaly count badge appears on each container and field, and clicking the badge opens the anomaly side panel pre-filtered to that scope. + +- SAP HANA Connector + - We've expanded our connectivity options by supporting a new connection with SAP HANA. This enhancement allows users to connect and interact with SAP HANA databases directly from Qualytics, facilitating more diverse data management capabilities. + +- Enhanced Agent Q chat with richer feedback during responses and direct navigation to the assets the agent creates. + - Tool calls during streaming render as a collapsible timeline with status indicators and expandable input and output details. + - Quality checks, computed assets, and operations created or started by the agent appear as clickable cards below the response, taking users straight to the asset. + - The UI automatically refreshes after each response when the agent's actions affect the current page, and redirects away if the active asset was deleted. + +#### General Fixes and Improvements + +- Resolved anomaly comments missing from the history view after the anomaly was archived. + +- Corrected the Sync operation appearing as "Catalog" in Flow operation type filters, notifications, and the Audit tab. + +- Fixed Agent Q suggested prompt cards getting cut off on smaller screens, reorganizing them as a single-view carousel above the message input. + +- Corrected the License section on the Platform Status page showing wrong labels and colors for expired and expiring-soon licenses. + +- Fixed inconsistent name validation on tag and group creation, applying shared rules for invalid characters and minimum length. + +- Refined Expected Schema evaluation on Parquet, Avro, and ORC files to honor the physical schema when columns are stored natively as String. + +- Expanded the Audit tab to capture more user actions, including bulk table and field deletions, quality check activations, and changes to comments, filter presets, and datastore groups. + +- Added a warning to the Delete Token confirmation that any integration or service using the token will lose access immediately. + +- Added a license expiration warning for admins when the license is within 30 days of expiring, with a quick link to the Settings Status page. + +- Improved the empty state shown to managers restricted to a team with no accessible datastores, replacing the add-datastore prompt with a clearer no-access message. + +- Increased performance when profiling containers configured with group by's. + +- Optimized loading of the Results tab on operation pages for containers with many partitions, lazy-loading and paginating the partition list, with added search and pass/fail filters on the partitions and checks tabs. + +- Expanded the anomaly history to track when external tickets are linked or unlinked. + +- Improved ID search on the Source Datastores list and on the Activity tab to match partial digits, instead of requiring the exact full ID. + +- Added an action filter to the Audit tab, letting users narrow the activity log by action type. + +- Restricted the Audit tab date picker to today and past dates, disabling future date selection. + +- Strengthened the DataHub integration with full catalog sync parity to Atlan and Alation, plus a new incident lifecycle that raises a Qualytics incident on each asset when anomalies are active and resolves it once they are archived. + +- Improved Entity Resolution check performance and reliability on large datasets, with a configurable row-count cap, smarter caching to avoid redundant work, an automatic shuffle-join fallback for large candidate sets, and a clear warning when most entities remain ungrouped. + +- General Fixes and Improvements. + +### 2026.5.15 { id=2026.5.15 } + +#### Feature Enhancements + +- Introduced AI-generated description suggestions across the platform, letting users request a business-friendly description instead of writing one from scratch. + - Suggestions are generated on demand from a sparkle icon next to each description field. + - Computed asset forms (computed tables, files, joins, and fields) gained a dedicated description field so suggestions can be generated there too. + - Available when Agent Q is configured on the environment. + +- Redesigned several dialogs as right-side panels for more workspace while keeping the underlying page visible. + - Anomaly details now opens as a side panel with collapsible sections. + - Field details (in Explore) opens as a side panel with the field's key metrics at the top. + - The Quality Score breakdown now opens directly from list views in a side panel. + - The Tables list on export and materialize operations opens as a side panel with infinite scroll. + +#### General Fixes and Improvements + +- Resolved a server error returned by the API and CLI when creating S3, Athena, or Redshift connections with IAM Role authentication. + +- Corrected integer and decimal columns in the Source Records tab being sorted as text instead of by numeric value. + +- Fixed Exists In and Data Diff checks intermittently failing on Delta files. + +- Resolved an issue where bulk quality check promotion could hang after destination validation rejected one or more checks. The remaining checks are now promoted normally, with each rejection surfaced individually. + +- Addressed an issue on the Edit Datastore form where switching to a DFS connection would cause the Authentication section to not render correctly. + +- Improved data catalog sync to skip work that hasn't changed and cut down on redundant calls to the catalog. + +- Fixed quality checks saving with a minimum value greater than the maximum on range-based rules (Between, Between Times, Time Distribution Size, Metric, and Volumetric). + +- Resolved an error that prevented deleting a computed table when an unrelated quality check in the workspace had invalid configuration data. + +- Fixed scan remediation failing on BigQuery and other enrichment datastores when a masked field had a numeric or other non-text type. + +- Corrected integer and decimal columns in the Data Preview tab being sorted as text instead of by numeric value. + +- Fixed team names with leading or trailing whitespace creating duplicate teams that could cause inconsistent datastore visibility for their members. + +- Resolved the User Profile menu showing stale team membership after a user edited their own profile. + +- Optimized loading of the quality checks and datastores listings, especially in workspaces with large numbers of checks, containers, and active anomalies. + +- Expanded quality check exports with a First Asserted timestamp alongside Last Asserted. + +- Improved traceability on check and anomaly history. Users can now trace newly created AI Managed checks back to the profile that produced them, and newly auto-resolved anomalies back to the scan that resolved them. + +- Improved performance of resource history views with infinite scroll on anomaly, container, quality check, and template overview pages. + +- Enhanced the Audit tab to also show when users reveal masked field values, with each entry opening a side panel for details and quick copy actions. + +- Expanded the Audit tab to also track integration updates and LLM configuration changes. + +- Added a confirmation step before deleting a comment in anomaly details, preventing accidental deletions. + +- General Fixes and Improvements. + +### 2026.5.7 { id=2026.5.7 } + +#### Feature Enhancements + +- Refreshed product terminology to make AI-driven capabilities easier to recognize across the platform. + - Renamed Inference Threshold to AI Effort, replacing the numeric scale with named levels and plain-language descriptions of what Qualytics AI does at each one. Existing profile configurations and schedules continue to work without changes. + - Renamed Inferred checks to AI Managed checks and added a matching AI badge for at-a-glance recognition. + - Split the Weight value into Importance for checks and Severity for anomalies, so each scoring concept reads clearly in its context. + +- Introduced dedicated pages for operations, replacing the modal-based results dialog with a full-page view of everything that happened in a single run. + - Each operation page is organized into an Overview tab with the type-specific configuration that drove the run, and a Results tab that surfaces what came out of the run. + - For scan operations, the Results tab is broken into views for partition outcomes, individual check results, and source records, giving users a fuller picture of what passed and failed. + - The source records view offers a row-level perspective on the data, listing only the records flagged as anomalous along with how many anomalies each one triggered, helping users quickly identify the most problematic records. + - Operation pages refresh automatically while the run is still in progress. + +- Added a new Audit tab under Settings, where admins can track the actions performed by each user across the platform. + - The audit list is paginated and grouped by day, with filters for users, timeframe, and an option to include or exclude actions performed by the platform itself. + - A summary section surfaces active users, total actions, the most active user, and the top category for the selected timeframe. + - A stacked bar chart compares user-driven and system-driven actions, automatically bucketed by day, week, month, or quarter. + - The current page of audit entries can be exported to CSV for offline review. + +- Introduced IAM Role authentication for AWS-backed datastores, enabling cross-account access via role assumption instead of static access keys. + - Available for S3, Athena, and Redshift datastores. Customers can configure a role ARN, and an optional external ID on the datastore. + - Replaces long-lived access keys with temporary, auditable, and revocable credentials, following AWS recommended practices for cross-account access. + +- Expanded entity resolution checks to compare records across multiple fields, each with its own match strategy and weighting. + - Comparisons now support string, numeric, and date or timestamp fields, with per-type match strategies such as fuzzy spelling, numeric tolerance, and date proximity or calendar granularity. + - Existing entity resolution checks were automatically migrated to the new structure, preserving their original similarity thresholds. + +#### General Fixes and Improvements + +- Corrected type inference for string columns in Parquet, Avro, ORC, Delta, and Iceberg files so timestamp and date values are correctly identified during profiling instead of being kept as strings. + +- Resolved large profile jobs occasionally aborting when a backend worker was retired mid-run. + +- Addressed intermittent computed field creation failures that occurred under concurrent load. + +- Fixed an issue where deactivating a schedule could drop its cron expression. The cron expression configuration is now preserved when a schedule is deactivated. If a schedule deactivated before this release no longer fires after reactivation, re-enter its cron expression to restore it. + +- Corrected flow creation returning a generic server error when actions formed a circular dependency. + +- Resolved flows with a ticket-status-update action hanging indefinitely when triggered without a severity context. + +- Addressed updating anomaly assignees returning a server error when the same user was listed more than once. + +- Fixed listing the checks of a segment with container-level checks included returning a server error. + +- Corrected Alation sync not matching Qualytics datastores to their Alation datasources for certain JDBC connection URL formats, particularly for SQL Server connectors. + +- Expanded Computed Joins to accept Computed Tables on either side, lifting the previous restriction that limited them to base tables and files. + +- Surfaced the Qualytics MCP and CLI as featured products in the header resources menu, making external tooling easier to discover from inside the app. + +- Expanded AgentQ to list quality check templates and create new checks based on them. + +- Strengthened saved filter preset governance with role-based edit, rename, and delete permissions, explicit Save and Reset controls in place of implicit auto-save, owner attribution, and a delete confirmation. + +- Strengthened native integration with Snowflake and Redshift datastores. + - Improved profile execution time on Snowflake and Redshift by computing cardinality, percentiles, top-K values, and other metrics directly in the source warehouse. + - Tagged Snowflake queries from Qualytics with a Connection String Identifier so admins can attribute and monitor Qualytics workloads in their query history. + +- General Fixes and Improvements. + +### 2026.4.24 { id=2026.4.24 } + +#### Feature Enhancements + +- Introduced automatic resolution of previously open anomalies that are not reproduced by a new full scan, reducing manual cleanup when data quality issues are no longer detected. + - A new "Auto Resolve Anomalies" toggle is available in scan settings, enabled by default for full scans and automatically disabled for incremental scans. + - When a full scan completes, previously open anomalies (Active or Acknowledged) are resolved if the same checks ran again and the same issue was no longer detected. + - The scan results modal now separates anomalies into "Identified" and "Auto-Resolved" tabs, with the auto-resolved tab showing anomalies from previous scans that were resolved by the current run. + - Operation status displays include an "Anomalies Auto-Resolved" count, and each auto-resolved anomaly records a history entry attributed to the resolving scan. + +- Introduced ownership for quality checks and assignees for anomalies, establishing clear accountability for data quality issues. + - Quality checks now have an owner that can be changed at any time. Inferred checks are owned by Qualytics, and authored checks default to the user who created them. + - Anomalies can be assigned to one or more users, and inherit the originating check's default assignee when one is set. + - Check owners are notified when someone else updates a check they own, and anomaly assignees are notified when their anomalies change. + - Users can quickly find the checks they own and the anomalies assigned to them. + - Ownership and assignee changes are tracked in the check and anomaly history for full auditability. + +#### General Fixes and Improvements + +- Resolved team assignments not persisting when updating a user. + +- Fixed the Agent Q chat endpoint returning a generic server error when the request body was empty or malformed, now responding with a clear validation message. + +- Corrected flow creation and update failing with a generic server error when the submitted actions formed a cycle, now returning a validation error that identifies the cyclic actions. + +- Addressed Alation integration issue where data catalog syncs were not finding assets for some OCF datasource configurations. + +- Corrected a failure when adding or editing descriptions on computed tables, computed files, and computed joins. + +- Expanded Dry Run permissions to allow users with the Drafter permission to execute quality check dry runs, requiring Editor permission only when masked field values are included in the results. + +- Improved how edits to inferred checks are handled: changing any property now converts the check into an authored check, preventing subsequent profile operations from overwriting it. + +- Enhanced the archive action in flows with an anomaly status filter, giving more control over which anomalies are automatically archived. + +- Clarified how unique quality checks behave when configured on multiple fields: the combination of fields is evaluated as a composite key, with updated rule descriptions and Agent Q guidance reflecting this. + +- Optimized profile and constraint suggestion operations by consolidating histogram computation, noticeably reducing execution time and compute cost. + +- Improved error messaging when connecting to AWS Glue catalogs and Athena-backed datastores, replacing verbose SDK traces with concise messages that clearly point to credentials or permission issues. + +- Enhanced Agent Q with several capability and usability improvements. + - Recognized the new "Sync" terminology for the discover-and-register operation by renaming the `run_catalog` tool to `run_sync` while keeping the legacy name supported, and updated response guidance to default to "Sync" while mirroring the user's language when they still refer to it as "Catalog". + - Exposed promote operations as chat capabilities, allowing users to ask Agent Q to copy computed tables, computed files, computed fields, and quality checks across datastores directly from the conversation. + - Extended attachment support to include Word and Excel documents alongside PDFs, with the upload button now available on additional LLM providers including OpenAI, Azure OpenAI, and Heroku. + +- General Fixes and Improvements. + +### 2026.4.8 { id=2026.4.8 } + +#### Feature Enhancements + +- Introduced Filter Presets on the Explore page, allowing users to save, apply, and share named filter configurations that combine datastores and tags into reusable views. + - Users can create, edit, and delete filter presets from a dropdown in the Explore filter bar, with each preset storing a specific combination of datastores and tags. + - Changing the datastore or tag selection while a preset is active automatically updates the saved configuration, indicated by a sync icon on the affected filters. + - Presets are globally visible, with team-based permissions filtering presets to only show those containing datastores the user has access to. + - Selected presets are reflected in the URL as a query parameter, enabling shareable links that restore the same filtered view for other users. + +- Introduced @mention support in comments, allowing users to tag team members directly in comment fields and trigger in-app notifications for mentioned users. + - Typing `@` followed by a name in any comment field opens an autocomplete dropdown with matching user suggestions, inserting styled mention chips that are visually highlighted in saved comments. + - Mentioned users receive in-app notifications with a direct link to the relevant anomaly detail page, with self-mentions automatically excluded. + - Mention support is available across all comment entry points, including anomaly comments, timeline entries, archive and acknowledge modals, and flow action configurations. + - Bulk operations with mentions — such as archiving multiple anomalies with a comment — trigger one notification per mentioned user per anomaly, each linking directly to the relevant anomaly. + +- Added multi-datastore creation for DFS connections, extending the bulk onboarding flow to allow creating multiple datastores from a single distributed file system connection in one step. + - Users can browse directories from a DFS connection and select multiple root paths to create as individual datastores in a single step. + - Directory browsing includes partition detection and existing datastore indicators for informed path selection. + - Name templates support `{{path}}` (full directory path flattened with underscores) and `{{path_segment}}` (last folder name only) tokens for automatic naming of created datastores. + - Each selected path can be validated before creation, and an optional step allows linking all newly created datastores to an enrichment datastore. + +- Added automatic stale anomaly cleanup with a default scheduled flow that archives anomalies with no updates or comments for over 180 days to Discarded status. + - The cleanup flow is auto-created on deployment and runs weekly on Sundays at midnight UTC, with a chained in-app notification upon completion. + - Existing deployments that already have an active scheduled archive flow are unaffected by the migration. + +#### General Fixes and Improvements + +- Resolved quality check creation failing with an error when applying numeric, date, or time-based rules to string-typed fields that contain temporal values. + +- Fixed data preview and scan operations failing on Oracle datastores with XMLType columns stored as binary XML, now properly excluding unsupported Oracle column types from queries. + +- Addressed user avatars displaying empty circles when no profile picture was available, and enhanced fallback behavior to show user initials instead of a single character. + +- Corrected the flow schedule trigger side panel silently overwriting the existing cron configuration when saved without changes, now preserving the existing schedule unless users explicitly choose to define a new one. + +- Fixed Agent Q additional context rendering as visible plain text inside user message bubbles instead of remaining collapsed behind the context icon, and corrected the copy action to exclude additional context and attachment metadata from copied content. + +- Improved error handling in the multi-datastore creation flow to surface connection validation errors at the correct step, preventing confusion between source datastore creation and enrichment datastore linking failures. + +- Enabled on-demand execution for scheduled flows, giving users the same "Run Now" capability already available for scheduled operations. + +- Enhanced Snowflake key-pair authentication to also accept raw PEM keys and resolve private keys from HashiCorp Vault, with clearer error messages for unresolvable secret references. + +- Introduced visual status indicators for datastores and containers across the platform, displaying colored badges that reflect connection status for datastores and availability status for containers — Available, Inaccessible, or Unloadable — with a dedicated status filter for container listings. + +- Improved Agent Q PDF attachment experience with a first-page thumbnail preview when files are sent, the actual filename displayed instead of the raw MIME type, and a fallback filename card after page reload. + +- Improved in-app notification experience with redesigned toast previews that display message content on arrival and auto-dismiss after five seconds with an animated progress bar. + +- Added flow co-authorship attribution to timeline entries, identifying which flow execution made a change with a link to the corresponding flow run. + +- General Fixes and Improvements. + +### 2026.3.25 { id=2026.3.25 } + +#### Feature Enhancements + +- Added timezone-aware cron scheduling, allowing users to schedule operations and flows in their local timezone with automatic Daylight Saving Time adjustment. + - A searchable IANA timezone selector is available when creating or editing schedules for Scan, Profile, Sync, Materialize, Export, and Flow operations. + - Schedules automatically adjust for DST transitions, ensuring operations run at the intended local time year-round without manual cron changes. + - UTC remains the default for all new and existing schedules, preserving full backward compatibility. + - Schedule cards and labels now display the configured timezone abbreviation instead of a hardcoded UTC indicator. + +- Introduced a Last Active column in the admin user listing, providing visibility into each user's most recent login activity. + - The column displays relative time labels such as "3 days ago" or "Just now" for recent logins, with a tooltip showing the exact UTC timestamp. + - Users who have never logged in display a "Never" indicator for easy identification of inactive accounts. + - The user listing supports sorting by last login date, enabling administrators to quickly identify dormant or recently active users. + +#### General Fixes and Improvements + +- Corrected user avatars displaying a blank colored circle instead of the user's initials when a profile picture was unavailable or failed to load. + +- Addressed misclicks on card selection checkboxes triggering navigation instead of toggling selection, now ensuring the full clickable area registers as a selection action. + +- Fixed the API accepting empty strings for required fields such as names, queries, and crontab expressions, now enforcing proper validation across all inbound schemas. + +- Fixed computed assets incorrectly showing a display name versus source name distinction when renamed, now updating the actual name directly since computed tables, files, joins, and fields exist only in Qualytics. + +- Improved Agent Q to support PDF file uploads, allowing users to attach documents via drag-and-drop or the paperclip button for model-assisted analysis when a compatible LLM provider is configured. + +- Configured Agent Q to honor team restriction mode, scoping chat responses and data discovery to the restricted team's datastores when a team restriction is active. + +- Optimized Agent Q conversation history management, improving context retention and response quality across longer chat sessions. + +- Expanded Agent Q tooling to support editor-level actions, including quality check management, operation and schedule lifecycle controls, anomaly investigation, stewardship of field, container, and datastore metadata, and computed asset maintenance. + +- Updated the CodeMirror syntax editor theme for improved contrast and readability across light and dark modes, aligning with the current design system. + +- Added check variable syntax highlighting in the editor, visually distinguishing `{{variable}}` placeholders and providing autocomplete suggestions from container metadata keys. + +- Enhanced computed field promotion to automatically resolve nested dependencies, ensuring parent computed fields are included and processed before their dependents. + +- Improved profiling performance for data type inference, significantly reducing execution time on datasets with large string columns. + +- General Fixes and Improvements. + +### 2026.3.20 { id=2026.3.20 } + +#### Feature Enhancements + +- Renamed the Catalog operation to Sync, now performing delta-based processing that only analyzes changes instead of recalculating all container metadata. + - The Sync operation processes only what has changed since the last run, significantly reducing execution time on large datastores. + +- Introduced Field Masking to protect sensitive data such as PII and ePHI, allowing fields to be marked as masked so their values are scrubbed from all standard data responses. + - Masked field values are replaced with a placeholder ***MASKED*** in container previews, source record retrievals, enrichment reads, and quality check dry runs. + - Privileged users can request unmasked values through an explicit override, with all access recorded in an audit trail. + - Fields serving as container identifiers (incremental, partition, or group-by fields) cannot be masked to preserve operational integrity. + +- Display names and descriptions from data catalog integrations — When synced with a data catalog (Atlan, Alation, Microsoft Purview, Collibra, or DataHub), Qualytics automatically populates descriptions on datastores, and display names and descriptions on containers and fields from the catalog's asset metadata. + - When a display name is set, it is shown across the entire platform in place of the source name, with the original name still accessible via an info icon. + - Display names and descriptions can also be manually assigned directly in Qualytics, independently of any data catalog integration. + +- Added multi-schema source datastore creation, allowing users to discover and select multiple schemas from a single connection and create all corresponding source datastores in one step. + - Available catalogs and schemas are automatically discovered from the connection, letting users browse and select which ones to onboard. + - An optional second step allows linking all newly created source datastores to a single enrichment datastore, either by selecting an existing one or creating a new one during the same flow. + +- Enabled a Business Context configuration in the LLM integration, providing personalized Agent Q suggestions tailored to each organization's data governance responsibilities. + - Administrators can describe their team's business focus and data quality scope in the LLM integration settings, providing Agent Q with relevant organizational context. + - Agent Q suggestions now incorporate both the organization's business context and a summary of the user's most recent chat session for more relevant recommendations. + +- Introduced team restriction mode, allowing administrators to view and interact with the platform from the perspective of a specific team. + - Administrators can select a team from the profile dropdown to restrict their session, temporarily assuming a Manager role scoped to that team's permissions and visibility. + - A visual indicator is displayed in the toolbar while a restriction is active, providing clear awareness of the current team context. + - The restriction persists across navigation and page reloads until explicitly removed by the user. + +#### General Fixes and Improvements + +- Resolved computed join container previews returning empty results under certain key overlap conditions. + +- Corrected timezone abbreviations not reflecting Daylight Saving Time, now dynamically displaying the correct label (e.g., EDT vs EST) based on the date being shown. + +- Addressed Agent Q chat context and message content overflowing the input field when expanding long responses. + +- Fixed freshness chart anomaly bars not displaying the correct highlight color and heatmap data reflecting all checks instead of only the selected one. + +- Resolved a race condition during API startup that could cause intermittent authentication errors. + +- Fixed stale scheduler jobs causing phantom flow executions after changing a flow's trigger type, now properly cleaning up scheduled jobs when the trigger type is modified or a flow is deleted. + +- Resolved the Atlan integration not populating check and anomaly counts, now correctly synchronizing metadata for both new and existing installations. + +- Corrected observability operations failing on datastores containing computed joins with computed fields. + +- Resolved reference filters in quality checks not substituting check variables, causing validation and scan errors on checks using dynamic placeholder values. + +- Added an Export as PDF option for Agent Q responses, allowing users to download individual messages as formatted PDFs that preserve the chat's visual layout. + +- Optimized profiling performance for containers with large field counts, including more efficient correlation analysis, significantly reducing execution time on wide schemas. + +- Enhanced datastore group visibility across the application, now displaying group information in breadcrumbs and adding management actions directly in the sidebar. + +- Updated delete confirmation dialogs across the application to clearly communicate the impact of each action before proceeding. + +- Improved Snowflake connection validation to surface warning messages about potential warehouse issues, such as undersized or suspended warehouses. + +- Removed the five key-value pair limit from the additional metadata editor, now supporting unlimited entries with scrollable and collapsible views. + +- General Fixes and Improvements. + +### 2026.3.6 { id=2026.3.6 } + +#### Feature Enhancements + +- Introduced promote operation for copying computed assets and quality checks across datastores and containers. + - Users can promote computed tables, computed files, and computed fields from one datastore or container to another, eliminating the need to manually recreate definitions across environments. + - Promote enables environment-based management of computed assets and checks — each entity is matched by name on the destination and either created if missing, updated if the definition differs, or skipped if identical. + - Quality checks can now be promoted across containers as active or draft, replacing the previous check migration feature that only supported creating checks as drafts. + - Each promoted entity reports an individual result status (Created, Updated, Skipped, or Failed) with filterable results and expandable error details. + - Promote operations appear in the Activity list with progress tracking. + +- Introduced PagerDuty as a first-class alerting integration. + - PagerDuty now appears in the Integrations page alongside Slack and Microsoft Teams, with a new additional details field for including custom context in incident notifications and an optional routing key override for directing incidents to a different service than the one configured at the integration level. + +- Added container-level default variables for quality checks and computed containers. + - Containers now support additional metadata key-value pairs that serve as default variable values during scans, configurable from the container settings page. + - Scan operations include a Scan Variables section in advanced options, allowing users to override container defaults on a per-scan basis. + - Variable resolution follows a defined priority: container metadata provides defaults, scan-level variables override those, and system profile variables take highest precedence. + +- Enhanced Agent Q chat experience with background streaming, session management, and infinite scrolling. + - Chat sessions now support archiving, restoring, and permanent deletion, giving users full control over their conversation history. + - Chats continue generating responses when navigating away from the session, with a visual indicator for ongoing or interrupted streams. + - Infinite scrolling is now supported for chat messages, the chat history sidebar, and archived sessions, replacing manual pagination. + - Floating chat mode now includes a chat history dropdown for switching between sessions without leaving the floating interface. + +- Added a force refresh option for anomaly source records, allowing users to bypass the cache and fetch the latest available data directly from the API, with a tooltip displaying the last updated timestamp. + +#### General Fixes and Improvements + +- Resolved an error when favoriting a datastore, container, or quality check for the first time when no other assets had been previously favorited. + +- Corrected performance regressions in known pattern detection during profiling that caused redundant regex evaluations, significantly reducing constraint suggestion time on large datasets. + +- Addressed Aggregation Comparison check validation failing when using expression-only aggregations like `count(*)` with no explicit field references. + +- Fixed fields with "missing" status appearing in the sidebar tree view after schema changes, now showing only active fields to keep the navigation uncluttered. + +- Resolved computed join container previews returning empty results when sampled join keys from each side did not overlap. + +- Corrected inaccurate freshness check results on JDBC datastores caused by silent DATE-to-Timestamp coercion that applied the local timezone instead of UTC. + +- Addressed field profile metric preview charts that appeared empty on hover. + +- Resolved Expected Values checks rendering empty value lists in certain scenarios, such as numeric values, while other types displayed correctly. + +- Corrected BigQuery export and materialize operations displaying raw JDBC error messages on write failures, now providing user-actionable messages for common issues like quota limits, missing datasets, and permission errors. + +- Optimized Redshift write performance by aligning the JDBC batch insert size with the driver configuration, reducing overhead during data operations. + +- Improved dataDiff checks with granular change type filtering, allowing users to specify whether added, removed, or changed rows should trigger anomalies, with at least one type required and all three selected by default. + +- Enhanced the asset timeline with Agent Q co-authorship attribution, allowing users to identify which changes were made through AI-assisted workflows, with the Agent Q avatar and client name displayed on co-authored entries. + +- Improved the command palette with unified search and expanded asset support. + - Asset search is now integrated directly into the command palette alongside command search, replacing the previous standalone Search Assets shortcut. + - Assets can now be filtered by ID in addition to name, allowing users to jump directly to a specific item. + - Added support for new searchable asset types: quality checks, check templates, and anomalies. + +- General Fixes and Improvements. + +### 2026.2.27 { id=2026.2.27 } + +#### Feature Enhancements + +- Introduced field status management to preserve historical data when source schema changes occur. + - Fields removed or renamed at the source are now marked as "missing" instead of being permanently deleted, preserving all associated quality checks, anomalies, and metadata. + - Added merge capability for renamed fields, allowing users to transfer all dependencies — including checks and anomalies — from a missing field to its active counterpart in a single action. + - Field exclusion now assigns a dedicated "excluded" status to individual fields, while remaining accessible from both the field level and the container settings for pre-profile exclusion workflows. + - Excluded fields can be restored to active status without requiring a new profile run. + - Added status indicators, filtering tabs, and a dedicated status filter across field listing pages for clear visibility into active, missing, and excluded fields. + +- Introduced Datastore Grouping for organized sidebar navigation. + - Users can now create custom groups to organize datastores in the sidebar by environment, purpose, or any preferred category. + - Groups support custom icons and names, with a dedicated management menu for renaming and deleting groups. + - Datastores can be assigned to groups directly from the tree view, with grouped datastores visually organized under collapsible sections. + - Added group-based filtering on the datastore listing page for focused browsing across large deployments. + - Group icons are displayed alongside datastore identifiers in card and list views for quick visual identification. + +- Introduced floating chat interface for Agent Q, accessible from any page in the platform. + - A persistent floating action button allows users to open Agent Q without navigating away from their current workflow. + - The assistant automatically detects the current page context — including datastore, container, field, check, and anomaly — and injects relevant metadata into conversations for context-aware responses. + - Supports paste attachments for large clipboard content, enabling users to share text snippets directly in the chat. + - Added `Q` keyboard shortcut for quick access to the floating chat from anywhere in the application. + - Chat history sessions are accessible from both the floating panel and the full-page Agent Q experience. + +- Enhanced Agent Q with chat history management, expanded tool capabilities, and performance optimizations. + - Chat conversations are now persisted and accessible through a searchable sidebar, allowing users to resume previous sessions and review past interactions. + - Introduced five new assistant capabilities: tag management, operation execution, notification delivery, ticket creation, and integration listing — enabling broader task automation through natural language. + - Added per-user rate limiting and prompt injection defenses for improved security and resource protection. + - Added `G + Q` keyboard shortcut for quick access to the Agent Q page from anywhere in the application. + - Optimized agent performance with singleton caching, deferred tool loading, and conversation summarization to reduce token overhead across sessions. + +#### General Fixes and Improvements + +- Corrected percentage value conversion in Volumetric check templates where min and max values for Percentage Change comparisons were sent as whole numbers instead of decimal format. + +- Resolved misleading warning logs during computed file profiling that incorrectly reported fields as missing from the source container when they were intentionally removed from the computed file's SELECT statement. + +- Resolved profile operation failures on Oracle datastores caused by undetected XMLType columns, now properly handling XML data by serializing it as readable text during profiling. + +- Optimized anomaly and field-profile query performance for large-scale deployments, significantly reducing load times for anomaly listings and field profile pages in datastores with high anomaly volumes. + +- Improved Aggregation Comparison anomaly messages to display evaluated values alongside expression names, making violation details immediately actionable without requiring manual investigation. + +- Reduced Agent Q token consumption through conversation compaction and deferred tool loading, lowering per-request overhead and extending effective conversation length within model context limits. + +- Improved database connection error messages with clearer root cause identification and actionable remediation guidance when connection pool limits are reached. + +- Improved authentication error handling to display clear, user-friendly messages on the login page when access is denied due to group authorization restrictions. + +- General Fixes and Improvements. + +### 2026.2.21 { id=2026.2.21 } + +#### Feature Enhancements + +- Introduced support for Complex Datatypes for DFS. + - Profiling and quality checks now support Array and Struct field types, expanding coverage to nested and multi-valued data structures. + - Array fields are profiled with element-level context, allowing quality checks to validate each element individually using supported rule types such as Expected Values, Matches Pattern, and Min/Max Length. + - Struct fields are automatically flattened into individual scalar columns during profiling, enabling full data quality rule inference and monitoring on nested data. + - Flattening supports recursive traversal up to a configurable depth, with path-based naming conventions for generated columns. + - Quality check rule selection adapts to complex field types, showing applicable rules based on whether the check targets the array or its individual elements. + - Field tree views and profile pages display nested field hierarchies with updated iconography for clear identification of complex field types. + - Source record tables and container previews display raw complex values, allowing users to inspect nested and array data directly during anomaly investigation. + +- Introduced MCP-powered AI assistant with built-in chat interface and Bring Your Own Key LLM support. + - Added an interactive chat interface directly in the platform, enabling users to perform data quality tasks through natural language conversations with AI-powered assistance. + - Users can configure their preferred LLM provider and API key under Settings, with support for OpenAI, Anthropic, Google, AWS Bedrock, Cohere, Groq, Mistral, and Hugging Face models. + - The assistant leverages MCP tools to explore datastores, validate queries, create computed assets, manage quality checks, investigate anomalies, and analyze quality scores within a guided workflow. + - Chat responses include real-time tool step progress indicators, displaying each action the assistant performs with expandable input and output details. + - Suggested prompts guide users toward common workflows such as building computed tables, creating quality checks, and analyzing data quality trends. + +- Introduced version history for containers. + - Users can now view a timeline of changes made to any container directly from the container overview page, displaying the editor and timestamp for each modification. + - Computed tables include a side-by-side diff visualization of query changes, making it easy to compare before and after states for troubleshooting. + +- Added n8n workflow integration as a flow action. + - Users can configure n8n webhook URLs and secrets directly on each flow action, enabling automated workflows triggered by flow executions. + - Supports operation-completed, anomaly, and anomaly status change triggers, sending full context payloads to n8n for downstream automation. + +- Added Service Principal authentication support for SQL Server datastores. + - Enables Azure Active Directory OAuth-based connections using tenant ID, client ID, and client secret or certificate credentials as an alternative to username and password authentication. + +#### General Fixes and Improvements + +- Fixed missing loading indicators on the Explore fields list and Activity page tabs. + +- Corrected container creation returning a generic server error instead of a proper conflict response when a container with the same name already existed in the datastore. + +- Resolved incremental ID timezone parsing issue that applied local timezone instead of UTC, causing inaccurate freshness metrics when incremental filtering was enabled. + +- Corrected data catalog sync summary to only count assets that were successfully synced, preventing misleading totals when individual asset syncs failed. + +- Fixed quality check API updates not persisting referenced fields when expressions were modified, ensuring field associations stay consistent with the check expression. + +- Resolved deep link URLs being lost during SSO authentication, ensuring users are redirected to the intended resource after login. + +- Enhanced ticket creation through flows to use the anomaly description as the ticket description, providing richer context for ServiceNow and Jira incidents. + +- Improved Insights data reliability with a force refresh option, allowing users to manually trigger on-demand data updates for the latest quality metrics. + +- Enhanced Observability tooltips with a day-over-day change indicator, displaying row count differences from the previous day for faster trend analysis. + +- General Fixes and Improvements. + +### 2026.2.13 { id=2026.2.13 } + +#### Feature Enhancements + +- Introduced Microsoft Fabric JDBC connector. + - Added read-only connectivity to Microsoft Fabric's SQL Analytics Endpoint, enabling users to profile and monitor data quality on Fabric datasets. + - Authentication is handled via Azure Active Directory Service Principal, with credentials securely managed through connection properties. + +- Added Service Principal authentication support for ABFS datastores, allowing Azure Active Directory OAuth-based connections as an alternative to Shared Key authentication. + +#### General Fixes and Improvements + +- Fixed missing label text color in the bulk action menu on the Flows page when using dark theme. + +- Corrected low-contrast tooltip icon on the check assertion timeline that was difficult to see in both light and dark modes. + +- Optimized data catalog integration sync performance by replacing verbose per-asset logging with concise per-datastore summaries, reducing storage overhead in environments with large asset catalogs. + +- General Fixes and Improvements. + +### 2026.2.7 { id=2026.2.7 } + +#### Feature Enhancements + +- Introduced license management interface under Settings. + - Administrators can now view the current license expiration date directly from the Settings Status page, with visual warnings when the license is nearing expiration. + - Added the ability to generate a license request payload to send to a Qualytics account representative for license renewal. + - Users can apply a new license directly through the interface, streamlining the license assignment process. + +- Added bulk actions and validation improvements for flow executions. + - Users can now select and abort multiple flow executions at once, eliminating the need to handle stuck executions one by one. + - Introduced bulk delete for flow executions to streamline cleanup of completed or failed runs. + - Added filter option for aborted status in the flow executions list for easier tracking. + - Flows without actions are now validated and blocked from publishing to prevent incomplete workflow configurations. + +- Added support for custom anomaly messages from source record fields. + - Quality checks can now use a field value from the source record as the anomaly message, replacing the auto-generated violation text with business-specific context. + - Custom anomaly message field can be configured in both individual check forms and bulk check creation workflows. + - A field selector is available when container fields are loaded, with a manual text input fallback for flexible configuration. + +- Added rule type filter to the Observability listing. + - Users can now filter containers by observability rule type, choosing between Volumetric and Freshness checks for more focused monitoring. + - Filter availability adapts to the current context, displaying relevant filter options across Explore, Datastore, and Container views. + - Improved column alignment and heatmap display across different screen sizes for better readability. + +#### General Fixes and Improvements + +- Corrected auto-generated descriptions for multi-field Unique and Not Null checks to reference all selected fields instead of only the first one. + +- Fixed anomalous field filter in the failed checks section where checkbox selections were not filtering results and layout elements were overlapping. + +- Corrected tooltip icon contrast in the check assertion timeline that was not visible against the tooltip background in both light and dark modes. + +- Fixed incorrect breadcrumb navigation when viewing checks that no longer reference the original field after field association changes. + +- Improved platform reliability by automatically recovering flow executions and data catalog syncs that became stuck after environment restarts. + +- Centralized internal field association logic to improve consistency and reliability across anomaly counts, filtering, and data catalog synchronization. + +- General Fixes and Improvements. + + +### 2026.1.29 { id=2026.1.29 } + +#### Feature Enhancements + +- Introduced Anomaly Status Changed flow trigger. + - Flows can now be triggered when anomaly statuses change, enabling automated workflows for status transitions. + - Trigger settings support filtering by specific status values to target relevant transitions. + +- Added notification support for Create Ticket and Update Ticket Status flow actions. + - Introduced Create Ticket action to automatically generate tickets in connected ticketing systems when anomalies meet defined conditions. + - Introduced Update Ticket Status action to synchronize status changes to linked tickets across integrated platforms. + - Notifications can be sent to Slack and Microsoft Teams when ticketing actions execute. + - Introduced status selection at ticket creation, allowing tickets to be created with a specific initial state. + - Ticketing actions are validated to ensure compatibility with Anomaly or Anomaly Status Change triggers. + - Improved handling when required ticketing integrations are unavailable during flow execution. + +- Enhanced auto-generated check descriptions with context-aware, business-friendly language. + - Descriptions now include field type context such as "numeric field", "timestamp field", or "text field" for clearer rule interpretation. + - Expected values are summarized directly in descriptions, displaying the first three values with a total count indicator. + - Filter clauses are translated into plain English for improved readability. + - Range checks now specify inclusivity labels to clarify boundary behavior. + - Common regex patterns are described in human-readable terms instead of raw expressions. + - Cross-datastore rules include reference field and container context for better traceability. + - Distinct count checks generate comparator-aware descriptions using phrases like "fewer than", "at most", "exactly", "at least", and "more than" based on the configured operator. + +- Improved computed asset management with inline editing from check interfaces and field dependency protection. + - Users can create, edit, and manage computed tables, files, joins, and fields directly from the check interface without navigating to datastore pages. + - Added a warning dialog when computed asset updates would remove fields with active checks or anomalies, with options to cancel or proceed. + - Introduced "E" keyboard shortcut to quickly edit computed containers from any context. + - Enhanced command palette shortcuts to preselect the current container in profile and scan dialogs. + +#### General Fixes and Improvements + +- Improved error messages for network connectivity issues to provide clearer guidance when the API server is unreachable. + +- Enhanced asserted check editing to support field modifications while preserving accurate quality score calculations. + +- Improved anomaly descriptions with editable fields, version tracking, and enriched human-readable messaging. + +- Enhanced tenant observability with build version information. + +- Fixed tags and rule types not appearing in filter lists by aligning filter option counts with the current view perspective. + +- Corrected distinct count anomaly messages that displayed negative values and incorrect expected values. + +- Resolved Collibra integration authentication failures caused by OAuth token expiration with automatic token refresh. + +- General Fixes and Improvements. + +### 2026.1.14 { id=2026.1.14 } + +#### Feature Enhancements + +- Introduced the new Qualytics visual identity + - Refreshed brand experience featuring a modern color palette, updated logo, and refined typography that reflects the platform’s evolution. + - Redesigned Insights dashboard with enhanced quality score cards, vibrant chart gradients, and improved dimension visualizations for clearer data storytelling. + - Modernized card layouts across datastores, containers, checks, anomalies, and templates with improved visual hierarchy and interaction states. + - Streamlined iconography with consistent outline styling and neutral tones for a cleaner, more focused interface. + - Enhanced chart styling with cyan monochromatic palettes, smooth gradients, and rounded segments across key visualizations such as data volume, observability metrics, heatmaps, and others. + - Improved accessibility with better contrast ratios, theme-aware color utilities, and consistent styling across light and dark modes. + - Refined sign-in experience with updated visual styling aligned to the new brand direction. + +#### General Fixes + +- Optimized container preview performance. + +- Standardized enrichment datastore settings labels to ensure consistency with the scan operation options. + +- Enhanced operation timeout behavior to ensure meaningful error responses for long-running sync operations. + +- Fixed scan schedule update errors that occurred when anomaly reactivation settings were not explicitly configured. + +- Resolved intermittent server errors affecting the Flows list page when scheduled information was present. + +- Corrected server errors when publishing flows while action rearrangement was in progress. + +- Resolved field exclusion behavior to properly skip problematic columns during initial data loading in SQL Server datastores. + +- General Fixes and Improvements. + + diff --git a/docs/container/complex-data-types.md b/docs/container/complex-data-types.md index a651ea61d6..5179867e8c 100644 --- a/docs/container/complex-data-types.md +++ b/docs/container/complex-data-types.md @@ -114,7 +114,7 @@ The next scan immediately flagged **23 orders with negative quantities** and **4 - **Array-level statistics** are computed: min/max/mean array length, std dev of length, and total element count. These metrics don't exist for scalar fields. - **Element-level statistics** treat each array element as a value and compute distinct count, min/max (numeric arrays), and min/max string length (string arrays). A separate element histogram shows the frequency distribution of individual values inside arrays. -- **Projection** of Array[Struct] fields into individual sub-fields (e.g., `items.sku`, `items.price`) happens during profiling. This is the step that creates the dot-path fields you use for quality checks. +- **Projection** of `Array[Struct]` fields into individual sub-fields (e.g., `items.sku`, `items.price`) happens during profiling. This is the step that creates the dot-path fields you use for quality checks. **Scanning:** The scan engine handles complex types differently from scalar fields: @@ -124,14 +124,14 @@ The next scan immediately flagged **23 orders with negative quantities** and **4 **Constraint Authoring:** Qualytics AI must understand which check types and thresholds are valid for arrays vs scalars: - `minLength`/`maxLength` on an Array field checks **array length** (number of elements), not string length. -- `expectedValues` on an Array[String] infers from **element values**, not the whole array as a blob. +- `expectedValues` on an `Array[String]` infers from **element values**, not the whole array as a blob. - "Limited" (Array of Arrays) means the engine cannot generate meaningful constraints for doubly-nested structures. --- ## How Fields Are Discovered and Named -All fields, including both top-level parents and complex type sub-fields, only appear in the UI after you run a [**Profile**](../operations/profile/profile.md){target="_blank"} operation. The profile operation discovers all fields, projects complex types (Array[Struct], nested Structs) into dot-path sub-fields, and computes statistical profiles. +All fields, including both top-level parents and complex type sub-fields, only appear in the UI after you run a [**Profile**](../operations/profile/profile.md){target="_blank"} operation. The profile operation discovers all fields, projects complex types (`Array[Struct]`, nested Structs) into dot-path sub-fields, and computes statistical profiles. !!! warning "Important" You must run a **profile** operation before any fields appear in the field list. This is when complex type sub-fields (e.g., `items.sku`, `user.name.first`) are created via projection. @@ -171,12 +171,12 @@ After running a **profile** operation, Qualytics discovers all fields, both top- | Field Path | Type | Origin | | :---- | :---- | :---- | | `id` | Long | declared | -| `tags` | Array[String] | declared | +| `tags` | `Array[String]` | declared | | `user` | Struct | declared | | `user.name.first` | String | projected | | `user.name.last` | String | projected | -| `user.emails` | Array[String] | projected | -| `items` | Array[Struct] | declared | +| `user.emails` | `Array[String]` | projected | +| `items` | `Array[Struct]` | declared | | `items.sku` | String | projected | | `items.price.amount` | Double | projected | | `items.price.currency` | String | projected | @@ -185,7 +185,7 @@ After running a **profile** operation, Qualytics discovers all fields, both top- !!! tip When creating quality checks, use these dot-notation paths exactly as they appear in the field list. For example, to check that every item's SKU matches a pattern, target the field `items.sku`. -### How Array[Struct] Fields Are Projected +### How Array\[Struct\] Fields Are Projected When Qualytics encounters an Array of Structs column, it automatically **projects** (extracts) each struct member into its own independent field. This is the key mechanism that makes nested data quality-checkable. @@ -304,7 +304,7 @@ For scalar (non-array) fields, Qualytics produces a single histogram showing the For array fields, the standard histogram shows the distribution of the **array as a column**. This is the same histogram type used for scalar fields. Depending on the field type, this may show the distribution of array sizes or the top-level column values. -**Example: `tags` field (Array[String])** +**Example: `tags` field (`Array[String]`)** Suppose the `tags` field across 5 rows has these arrays: @@ -436,12 +436,12 @@ For Struct fields, Qualytics provides: | Complex Type | Array-Level Stats | Element-Level Stats | Element Histogram | Sub-Field Discovery | Standard Histogram | | :---- | :---- | :---- | :---- | :---- | :---- | -| **Array[Primitive]** (e.g., `Array[String]`) | Yes | Yes | Yes | N/A | Yes | -| **Array[Struct]** (e.g., `Array[Struct{...}]`) | Yes | Via projected sub-fields | Via projected sub-fields | Yes | Via sub-fields | +| **`Array[Primitive]`** (e.g., `Array[String]`) | Yes | Yes | Yes | N/A | Yes | +| **`Array[Struct]`** (e.g., `Array[Struct{...}]`) | Yes | Via projected sub-fields | Via projected sub-fields | Yes | Via sub-fields | | **Struct** (e.g., `Struct{...}`) | N/A | N/A | N/A | Yes | Via sub-fields | | **Nested Struct** (e.g., `Struct{inner: Struct{...}}`) | N/A | N/A | N/A | Yes (all levels) | Via sub-fields | -| **Array[Array[T]]** | Yes (outer array) | Limited | Limited | N/A | Limited | -| **Map[K,V]** | **Not supported** | **Not supported** | **Not supported** | **Not supported** | **Not supported** | +| **`Array[Array[T]]`** | Yes (outer array) | Limited | Limited | N/A | Limited | +| **`Map[K,V]`** | **Not supported** | **Not supported** | **Not supported** | **Not supported** | **Not supported** | ### Nested Array Profiling @@ -866,7 +866,7 @@ Ensure every element in the array is one of the allowed values. } ``` -=== "Array[Struct] Sub-Field" +=== "Array\[Struct\] Sub-Field" ```json { @@ -896,7 +896,7 @@ Ensure every element in the array matches a regex pattern. } ``` -=== "Array[Struct] Sub-Field" +=== "Array\[Struct\] Sub-Field" ```json { @@ -955,7 +955,7 @@ Ensure every numeric element in the array is zero or positive. } ``` -=== "Array[Struct] Sub-Field" +=== "Array\[Struct\] Sub-Field" ```json { diff --git a/docs/data-quality-checks/after-date-check.md b/docs/data-quality-checks/after-date-check.md index abf3a00911..2804fc2f29 100644 --- a/docs/data-quality-checks/after-date-check.md +++ b/docs/data-quality-checks/after-date-check.md @@ -235,11 +235,7 @@ Use After Date Time whenever you need to: ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -251,11 +247,7 @@ Specify a particular date and time to act as the threshold for the rule. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/aggregation-comparison-check.md b/docs/data-quality-checks/aggregation-comparison-check.md index 7f605a558e..b43ad502c9 100644 --- a/docs/data-quality-checks/aggregation-comparison-check.md +++ b/docs/data-quality-checks/aggregation-comparison-check.md @@ -1,196 +1,188 @@ -# Aggregation Comparison - -### Definition - -*Verifies that the specified comparison operator evaluates true when applied to two aggregation expressions.* - -### In-Depth Overview - -The `Aggregation Comparison` is a rule that allows for the dynamic analysis of aggregations across different datasets. It empowers users to establish data integrity by ensuring that aggregate values meet expected comparisons, whether they are totals, averages, counts, or any other aggregated metric. - -By setting a comparison between aggregates from potentially different tables or even source datastores, this rule confirms that relationships between data points adhere to business logic or historical data patterns. This is particularly useful when trying to validate interrelated financial reports, summary metrics, or when monitoring the consistency of data ingestion over time. - -### Field Scope - -**Calculated:** The rule automatically identifies the fields involved, without requiring explicit field selection. - -### General Properties - -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} - -### Specific Properties - -Facilitates the comparison between a `target` aggregate metric and a `reference` aggregate metric across different datasets. - -| Name | Description | -|--------------------------------|-----------------------------------------------------------| -|
Target Aggregation
| Specifies the aggregation expression to evaluate | -|
Comparison
| Select the comparison operator (e.g., greater than, less than, etc.) | -|
Datastore
| Identifies the source datastore for the reference aggregation | -|
Table/File
| Specifies the table or file for the reference aggregation | -|
Reference Aggregation
| Defines the reference aggregation expression to compare against | -|
Reference Filter
| Applies a filter to the reference aggregation if necessary | - -!!! note "Details" - - It's important to understand that each aggregation must result in a **single row**. Also, similar to Spark expressions, the aggregation expressions must be written in a valid format for DataFrames. - - !!! example "Examples" - - **Simple Aggregations** - ```sql - SUM(O_TOTALPRICE) - ``` - - **Combining with SparkSQL Functions** - ```sql - ROUND(SUM(O_TOTALPRICE)) - ``` - - **Complex Aggregations** - ```sql - ROUND(SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX))) - ``` - - **Aggregation Expressions** - ```sql - COUNT(CATEGORY) * MAX(VALUE) - FIRST(VALUE) - ``` - - Here are some common aggregate functions used in SparkSQL: - - - `SUM`: Calculates the sum of all values in a column. - - `AVG`: Calculates the average of all values in a column. - - `MAX`: Returns the maximum value in a column. - - `MIN`: Returns the minimum value in a column. - - `COUNT`: Counts the number of rows in a column. - - For a detailed list of valid SparkSQL aggregation functions, refer to the [Apache Spark SQL documentation](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/functions.html#aggregate-functions). - -=== "Payload example" - ``` json - { - "description": "The aggregation \"SUM(`TARGET_FIELD`)\" must be less than a reference value", - "coverage": 1, - "properties": { - "ref_datastore_id": ref_datastore_id, - "expression": "SUM(`TARGET_FIELD`)", - "comparison": "lt", - "ref_container_id": ref_container_id, - "ref_expression": "MAX(`REFERENCE_FIELD`)" - }, - "fields": fields, - "status": "Active", - "rule": "aggregationComparison", - "additional_metadata": {"key 1": "value 1", "key 2": "value 2"}, - "container_id": {container_id}, - "template_id": {template_id}, - } - ``` - -### Anomaly Types - -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} - -### Example - -**Objective**: *Ensure that the aggregated sum of `total_price` from the `ORDERS` table matches the aggregated and rounded sum of `calculated_price` from the `LINEITEM` table.* - -!!! info - The `calculated_price` in this example is represented by the sum of each product's extended price, adjusted for discount and tax. - -**Sample Data** - -_Aggregated data from ORDERS (Target)_ - -| TOTAL_PRICE | -|-------------| -| 5000000 | - -_Aggregated data from LINEITEM (Reference)_ - -| CALCULATED_PRICE | -|------------------| -| 4999800 | - -??? example "Inputs" - - **Target Aggregation**: ROUND(SUM(O_TOTALPRICE)) - - **Comparison**: eq (Equal To), lt (Less Than), lte (Less Than or Equal to), gte (Greater Than or Equal To), gt (Greater Than) - - **Reference Aggregation**: ROUND(SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX))) - -=== "Payload example" - ``` json - { - "description": "Ensure that the aggregated sum of total_price from the ORDERS table matches the aggregated and sum of l_totalprice from the LINEITEM table", - "coverage": 1, - "properties": { - "comparison": "eq", - "expression": f"SUM(O_TOTALPRICE)", - "ref_container_id": ref_container_id, - "ref_datastore_id": ref_datastore_id, - "ref_expression": f"SUM(L_TOTALPRICE)", - "ref_filter": "1=1", - }, - "tags": [], - "fields": ["O_TOTALPRICE"], - "additional_metadata": {"key 1": "value 1", "key 2": "value 2"}, - "rule": "aggregationComparison", - "container_id": {container_id}, - "template_id": {template_id}, - "filter": "1=1" - } - ``` - -**Anomaly Explanation** - -In the sample data above, the aggregated `TOTAL_PRICE` from the `ORDERS` table is 5000000, while the aggregated and rounded `CALCULATED_PRICE` from the `LINEITEM` table is 4999800. The difference between these totals indicates a potential anomaly, suggesting issues in data calculation or recording methods. - -=== "Flowchart" - ```mermaid - graph TD - A[Start] --> B[Retrieve Aggregated Values] - B --> C{Do Aggregated Totals Match?} - C -->|Yes| D[End] - C -->|No| E[Mark as Anomalous] - E --> D - ``` - -=== "SQL" - ```sql - -- An illustrative SQL query related to the rule using TPC-H tables. - with orders_agg as ( - select - round(sum(o_totalprice)) as total_order_price - from - orders - ), - lineitem_agg as ( - select - round(sum(l_extendedprice * (1 - l_discount) * (1 + l_tax))) as calculated_price - from - lineitem - ), - comparison as ( - select - o.total_order_price, - l.calculated_price - from - orders_agg o - cross join lineitem_agg l - ) - select * from comparison - where comparison.total_order_price != comparison.calculated_price; - ``` - -**Potential Violation Messages** - -!!! example "Shape Anomaly" - `ROUND(SUM(O_TOTALPRICE))` is not equal to `ROUND(SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX)))`. +# Aggregation Comparison + +### Definition + +*Verifies that the specified comparison operator evaluates true when applied to two aggregation expressions.* + +### In-Depth Overview + +The `Aggregation Comparison` is a rule that allows for the dynamic analysis of aggregations across different datasets. It empowers users to establish data integrity by ensuring that aggregate values meet expected comparisons, whether they are totals, averages, counts, or any other aggregated metric. + +By setting a comparison between aggregates from potentially different tables or even source datastores, this rule confirms that relationships between data points adhere to business logic or historical data patterns. This is particularly useful when trying to validate interrelated financial reports, summary metrics, or when monitoring the consistency of data ingestion over time. + +### Field Scope + +**Calculated:** The rule automatically identifies the fields involved, without requiring explicit field selection. + +### General Properties + +{{ general_props('filter-only') }} + +### Specific Properties + +Facilitates the comparison between a `target` aggregate metric and a `reference` aggregate metric across different datasets. + +| Name | Description | +|--------------------------------|-----------------------------------------------------------| +|
Target Aggregation
| Specifies the aggregation expression to evaluate | +|
Comparison
| Select the comparison operator (e.g., greater than, less than, etc.) | +|
Datastore
| Identifies the source datastore for the reference aggregation | +|
Table/File
| Specifies the table or file for the reference aggregation | +|
Reference Aggregation
| Defines the reference aggregation expression to compare against | +|
Reference Filter
| Applies a filter to the reference aggregation if necessary | + +!!! note "Details" + + It's important to understand that each aggregation must result in a **single row**. Also, similar to Spark expressions, the aggregation expressions must be written in a valid format for DataFrames. + + !!! example "Examples" + + **Simple Aggregations** + ```sql + SUM(O_TOTALPRICE) + ``` + + **Combining with SparkSQL Functions** + ```sql + ROUND(SUM(O_TOTALPRICE)) + ``` + + **Complex Aggregations** + ```sql + ROUND(SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX))) + ``` + + **Aggregation Expressions** + ```sql + COUNT(CATEGORY) * MAX(VALUE) - FIRST(VALUE) + ``` + + Here are some common aggregate functions used in SparkSQL: + + - `SUM`: Calculates the sum of all values in a column. + - `AVG`: Calculates the average of all values in a column. + - `MAX`: Returns the maximum value in a column. + - `MIN`: Returns the minimum value in a column. + - `COUNT`: Counts the number of rows in a column. + + For a detailed list of valid SparkSQL aggregation functions, refer to the [Apache Spark SQL documentation](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/functions.html#aggregate-functions). + +=== "Payload example" + ``` json + { + "description": "The aggregation \"SUM(`TARGET_FIELD`)\" must be less than a reference value", + "coverage": 1, + "properties": { + "ref_datastore_id": ref_datastore_id, + "expression": "SUM(`TARGET_FIELD`)", + "comparison": "lt", + "ref_container_id": ref_container_id, + "ref_expression": "MAX(`REFERENCE_FIELD`)" + }, + "fields": fields, + "status": "Active", + "rule": "aggregationComparison", + "additional_metadata": {"key 1": "value 1", "key 2": "value 2"}, + "container_id": {container_id}, + "template_id": {template_id}, + } + ``` + +### Anomaly Types + +{{ anomaly_support('shape-only') }} + +### Example + +**Objective**: *Ensure that the aggregated sum of `total_price` from the `ORDERS` table matches the aggregated and rounded sum of `calculated_price` from the `LINEITEM` table.* + +!!! info + The `calculated_price` in this example is represented by the sum of each product's extended price, adjusted for discount and tax. + +**Sample Data** + +_Aggregated data from ORDERS (Target)_ + +| TOTAL_PRICE | +|-------------| +| 5000000 | + +_Aggregated data from LINEITEM (Reference)_ + +| CALCULATED_PRICE | +|------------------| +| 4999800 | + +??? example "Inputs" + - **Target Aggregation**: ROUND(SUM(O_TOTALPRICE)) + - **Comparison**: eq (Equal To), lt (Less Than), lte (Less Than or Equal to), gte (Greater Than or Equal To), gt (Greater Than) + - **Reference Aggregation**: ROUND(SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX))) + +=== "Payload example" + ``` json + { + "description": "Ensure that the aggregated sum of total_price from the ORDERS table matches the aggregated and sum of l_totalprice from the LINEITEM table", + "coverage": 1, + "properties": { + "comparison": "eq", + "expression": f"SUM(O_TOTALPRICE)", + "ref_container_id": ref_container_id, + "ref_datastore_id": ref_datastore_id, + "ref_expression": f"SUM(L_TOTALPRICE)", + "ref_filter": "1=1", + }, + "tags": [], + "fields": ["O_TOTALPRICE"], + "additional_metadata": {"key 1": "value 1", "key 2": "value 2"}, + "rule": "aggregationComparison", + "container_id": {container_id}, + "template_id": {template_id}, + "filter": "1=1" + } + ``` + +**Anomaly Explanation** + +In the sample data above, the aggregated `TOTAL_PRICE` from the `ORDERS` table is 5000000, while the aggregated and rounded `CALCULATED_PRICE` from the `LINEITEM` table is 4999800. The difference between these totals indicates a potential anomaly, suggesting issues in data calculation or recording methods. + +=== "Flowchart" + ```mermaid + graph TD + A[Start] --> B[Retrieve Aggregated Values] + B --> C{Do Aggregated Totals Match?} + C -->|Yes| D[End] + C -->|No| E[Mark as Anomalous] + E --> D + ``` + +=== "SQL" + ```sql + -- An illustrative SQL query related to the rule using TPC-H tables. + with orders_agg as ( + select + round(sum(o_totalprice)) as total_order_price + from + orders + ), + lineitem_agg as ( + select + round(sum(l_extendedprice * (1 - l_discount) * (1 + l_tax))) as calculated_price + from + lineitem + ), + comparison as ( + select + o.total_order_price, + l.calculated_price + from + orders_agg o + cross join lineitem_agg l + ) + select * from comparison + where comparison.total_order_price != comparison.calculated_price; + ``` + +**Potential Violation Messages** + +!!! example "Shape Anomaly" + `ROUND(SUM(O_TOTALPRICE))` is not equal to `ROUND(SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX)))`. diff --git a/docs/data-quality-checks/any-not-null-check.md b/docs/data-quality-checks/any-not-null-check.md index 3e587b48b4..903109ba00 100644 --- a/docs/data-quality-checks/any-not-null-check.md +++ b/docs/data-quality-checks/any-not-null-check.md @@ -209,19 +209,11 @@ Any Not Null acts as a safety net that prevents contextless records from silentl ## General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ## Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ## Example diff --git a/docs/data-quality-checks/before-date-time-check.md b/docs/data-quality-checks/before-date-time-check.md index 37b6f1b224..ac0712dcb9 100644 --- a/docs/data-quality-checks/before-date-time-check.md +++ b/docs/data-quality-checks/before-date-time-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -34,11 +30,7 @@ Specify a particular date and time to act as the threshold for the rule. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/between-check.md b/docs/data-quality-checks/between-check.md index b2b2c25938..3d5dc42ff2 100644 --- a/docs/data-quality-checks/between-check.md +++ b/docs/data-quality-checks/between-check.md @@ -221,11 +221,7 @@ In this case, the Between check caught values that were technically valid number ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -240,11 +236,7 @@ Specify both minimum and maximum boundaries, and determine if these boundaries s ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/between-times-check.md b/docs/data-quality-checks/between-times-check.md index 56be95b8ae..1fa7c1a197 100644 --- a/docs/data-quality-checks/between-times-check.md +++ b/docs/data-quality-checks/between-times-check.md @@ -192,11 +192,7 @@ Use Between Times whenever you need to validate **when** data occurs: ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -209,11 +205,7 @@ Specify the range of dates or times that values in the selected field should fal ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/contains-credit-card-check.md b/docs/data-quality-checks/contains-credit-card-check.md index 12e3217adf..0474265688 100644 --- a/docs/data-quality-checks/contains-credit-card-check.md +++ b/docs/data-quality-checks/contains-credit-card-check.md @@ -148,19 +148,11 @@ Contains Credit Card acts as a guardrail for payment data. If a system says *“ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/contains-email-check.md b/docs/data-quality-checks/contains-email-check.md index 5101ab006e..aa5e1dc9db 100644 --- a/docs/data-quality-checks/contains-email-check.md +++ b/docs/data-quality-checks/contains-email-check.md @@ -163,19 +163,11 @@ Manual data review works only at small scale. Automated checks like **Contains E ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/contains-social-security-number-check.md b/docs/data-quality-checks/contains-social-security-number-check.md index 0ee8034058..fe4c839db8 100644 --- a/docs/data-quality-checks/contains-social-security-number-check.md +++ b/docs/data-quality-checks/contains-social-security-number-check.md @@ -162,19 +162,11 @@ The **Contains Social Security Number** check acts as an automated safeguard—e ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/contains-url.md b/docs/data-quality-checks/contains-url.md index 71d5ff26df..cbf45064c3 100644 --- a/docs/data-quality-checks/contains-url.md +++ b/docs/data-quality-checks/contains-url.md @@ -16,19 +16,11 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/data-diff-check.md b/docs/data-quality-checks/data-diff-check.md index d063ec9d13..53a9cb188f 100644 --- a/docs/data-quality-checks/data-diff-check.md +++ b/docs/data-quality-checks/data-diff-check.md @@ -265,11 +265,7 @@ Use Data Diff whenever you: ### General Properties -{% -include-markdown "components/general-props/index.md" -start='' -end='' -%} +{{ general_props('filter-only') }} ### Specific Properties @@ -296,26 +292,14 @@ Specify the datastore and table/file where the reference data for the targeted f 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)* - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} - {% - include-markdown "components/comparators/duration.md" - %} - {% - include-markdown "components/comparators/string.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} + {{ comparators('duration') | indent(4) }} + {{ comparators('string') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/distinct-count-check.md b/docs/data-quality-checks/distinct-count-check.md index a05218b0ad..89c01ee7db 100644 --- a/docs/data-quality-checks/distinct-count-check.md +++ b/docs/data-quality-checks/distinct-count-check.md @@ -21,11 +21,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -49,11 +45,7 @@ Specify the distinct count expectation for the values in the field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/entity-resolution.md b/docs/data-quality-checks/entity-resolution.md index 2c0373aa42..5cbbce0701 100644 --- a/docs/data-quality-checks/entity-resolution.md +++ b/docs/data-quality-checks/entity-resolution.md @@ -22,11 +22,7 @@ entity identifier shares the same value for the designated `distinction field` ### General Properties -{% -include-markdown "components/general-props/index.md" -start='' -end='' -%} +{{ general_props('filter-only') }} ### Specific Properties @@ -40,11 +36,7 @@ end='' ### Anomaly Types -{% -include-markdown "components/anomaly-support/index.md" -start='' -end='' -%} +{{ anomaly_support('record-only') }} ### Example diff --git a/docs/data-quality-checks/equal-to-check.md b/docs/data-quality-checks/equal-to-check.md index da902e74e5..a45a2b110c 100644 --- a/docs/data-quality-checks/equal-to-check.md +++ b/docs/data-quality-checks/equal-to-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -33,20 +29,12 @@ Specify the field to compare for equality with the selected field. |
Comparators
| {{ comparator_short_desc }} | !!! note "Details" - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/equal-to-field-check.md b/docs/data-quality-checks/equal-to-field-check.md index 1b897badff..76efdd2a00 100644 --- a/docs/data-quality-checks/equal-to-field-check.md +++ b/docs/data-quality-checks/equal-to-field-check.md @@ -19,11 +19,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -35,26 +31,14 @@ Specify the field to compare for equality with the selected field. |
Comparators
| {{ comparator_short_desc }} | !!! note "Details" - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/string.md" - %} - {% - include-markdown "components/comparators/duration.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('string') | indent(4) }} + {{ comparators('duration') | indent(4) }} + {{ comparators('numeric') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/exists-in-check.md b/docs/data-quality-checks/exists-in-check.md index 2097904277..2d933df483 100644 --- a/docs/data-quality-checks/exists-in-check.md +++ b/docs/data-quality-checks/exists-in-check.md @@ -32,11 +32,7 @@ These enhancements enable businesses to maintain data integrity even in complex, ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -50,11 +46,7 @@ Define the datastore, table/file, and field where the rule should look for match ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/expected-schema-check.md b/docs/data-quality-checks/expected-schema-check.md index f6f84f203c..07ff57e1f2 100644 --- a/docs/data-quality-checks/expected-schema-check.md +++ b/docs/data-quality-checks/expected-schema-check.md @@ -12,11 +12,7 @@ The expected schema is the first check to be tested during a scan operation. If ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('none-props') }} ### Specific Properties @@ -29,11 +25,7 @@ Specify the fields that must be present in the schema, and determine if a schema ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/expected-values-check.md b/docs/data-quality-checks/expected-values-check.md index 5eba1550ca..4f740f3ca4 100644 --- a/docs/data-quality-checks/expected-values-check.md +++ b/docs/data-quality-checks/expected-values-check.md @@ -4,11 +4,7 @@ *Asserts that values are contained within a list of expected values.* -{% - include-markdown "components/general-props/warning.md" - start='' - end='' -%} +{{ spacing_warning() }} ### Field Scope @@ -27,11 +23,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -43,11 +35,7 @@ Specify the list of expected values for the data in the field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/field-count-check.md b/docs/data-quality-checks/field-count-check.md index dff9e2ee1b..a790afb560 100644 --- a/docs/data-quality-checks/field-count-check.md +++ b/docs/data-quality-checks/field-count-check.md @@ -6,11 +6,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('none-props') }} ### Specific Properties @@ -22,11 +18,7 @@ Specify the exact number of fields expected in the profile. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/greater-than-check.md b/docs/data-quality-checks/greater-than-check.md index 44ffcb1bf2..1ceb670dc9 100644 --- a/docs/data-quality-checks/greater-than-check.md +++ b/docs/data-quality-checks/greater-than-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -34,20 +30,12 @@ Allows specifying a numeric value that acts as the threshold. |
Comparators
| {{ comparator_short_desc }} | !!! note "Details" - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/greater-than-field-check.md b/docs/data-quality-checks/greater-than-field-check.md index fbaf384743..c6a85b3720 100644 --- a/docs/data-quality-checks/greater-than-field-check.md +++ b/docs/data-quality-checks/greater-than-field-check.md @@ -19,11 +19,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -36,23 +32,13 @@ Allows specifying another field against which the value comparison will be perfo |
Comparators
| {{ comparator_short_desc }} | !!! note "Details" - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} - {% - include-markdown "components/comparators/duration.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} + {{ comparators('duration') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/is-address.md b/docs/data-quality-checks/is-address.md index 8bbe9ace66..7b857feb2a 100644 --- a/docs/data-quality-checks/is-address.md +++ b/docs/data-quality-checks/is-address.md @@ -20,11 +20,7 @@ This check leverages machine learning powered by the [libpostal library](https:/ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -49,11 +45,7 @@ This check allows the user to define any combination of these labels as required ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/is-credit-card-check.md b/docs/data-quality-checks/is-credit-card-check.md index 85c7b9f921..a81419b4c3 100644 --- a/docs/data-quality-checks/is-credit-card-check.md +++ b/docs/data-quality-checks/is-credit-card-check.md @@ -16,19 +16,11 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/is-replica-of-check.md b/docs/data-quality-checks/is-replica-of-check.md index 3853283ebf..be10c0b353 100644 --- a/docs/data-quality-checks/is-replica-of-check.md +++ b/docs/data-quality-checks/is-replica-of-check.md @@ -42,11 +42,7 @@ In a distributed data ecosystem, replication often occurs to maintain high avail ### General Properties -{% -include-markdown "components/general-props/index.md" -start='' -end='' -%} +{{ general_props('filter-only') }} ### Specific Properties @@ -73,29 +69,17 @@ 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)* - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} - {% - include-markdown "components/comparators/duration.md" - %} - {% - include-markdown "components/comparators/string.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} + {{ comparators('duration') | indent(4) }} + {{ comparators('string') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/is-type-check.md b/docs/data-quality-checks/is-type-check.md index 3cdfed73c9..dc564c8b29 100644 --- a/docs/data-quality-checks/is-type-check.md +++ b/docs/data-quality-checks/is-type-check.md @@ -16,11 +16,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -32,11 +28,7 @@ Specify the expected type for the data in the field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/less-than-check.md b/docs/data-quality-checks/less-than-check.md index 2f44b41551..a563abab8e 100644 --- a/docs/data-quality-checks/less-than-check.md +++ b/docs/data-quality-checks/less-than-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -34,20 +30,12 @@ Allows specifying a numeric value that acts as the threshold. |
Comparators
| {{ comparator_short_desc }} | !!! note "Details" - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/less-than-field-check.md b/docs/data-quality-checks/less-than-field-check.md index 5540fdc428..5fcc99cf8c 100644 --- a/docs/data-quality-checks/less-than-field-check.md +++ b/docs/data-quality-checks/less-than-field-check.md @@ -19,11 +19,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -36,23 +32,13 @@ Allows specifying another field against which the value comparison will be perfo |
Comparators
| {{ comparator_short_desc }} | !!! note "Details" - {% - include-markdown "components/comparators/index.md" - %} - {% - include-markdown "components/comparators/numeric.md" - %} - {% - include-markdown "components/comparators/duration.md" - %} + {{ comparators('index') | indent(4) }} + {{ comparators('numeric') | indent(4) }} + {{ comparators('duration') | indent(4) }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/matches-pattern-check.md b/docs/data-quality-checks/matches-pattern-check.md index 14ae4df72a..92d41602f4 100644 --- a/docs/data-quality-checks/matches-pattern-check.md +++ b/docs/data-quality-checks/matches-pattern-check.md @@ -20,11 +20,7 @@ Patterns, typically expressed as regular expressions, allow for the enforcement ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -36,11 +32,7 @@ Allows specifying a pattern against which the field will be checked. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/max-length-check.md b/docs/data-quality-checks/max-length-check.md index 5e027bcc8e..2cdf112296 100644 --- a/docs/data-quality-checks/max-length-check.md +++ b/docs/data-quality-checks/max-length-check.md @@ -16,11 +16,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -32,11 +28,7 @@ Determines the maximum acceptable length of the string. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/max-partition-size-check.md b/docs/data-quality-checks/max-partition-size-check.md index 0233372059..8828ba0bb8 100644 --- a/docs/data-quality-checks/max-partition-size-check.md +++ b/docs/data-quality-checks/max-partition-size-check.md @@ -12,11 +12,7 @@ The Max Partition Size rule is designed to set an upper limit on the number of r ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('coverage-only') }} ### Specific Properties @@ -28,11 +24,7 @@ Specifies the maximum allowable record count for each data partition ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/max-value-check.md b/docs/data-quality-checks/max-value-check.md index 6ff90859d1..b4092aee93 100644 --- a/docs/data-quality-checks/max-value-check.md +++ b/docs/data-quality-checks/max-value-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -33,11 +29,7 @@ Determines the maximum allowable value for the field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/metric-check.md b/docs/data-quality-checks/metric-check.md index e76153cf48..a85be5826a 100644 --- a/docs/data-quality-checks/metric-check.md +++ b/docs/data-quality-checks/metric-check.md @@ -21,11 +21,7 @@ The `Metric` rule is designed to monitor the values of a selected field over tim ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -106,11 +102,7 @@ Determines the evaluation method and allowable limits for field value comparison ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('record-only') }} ### Example diff --git a/docs/data-quality-checks/min-length-check.md b/docs/data-quality-checks/min-length-check.md index 450c5f0eda..7aa654ea95 100644 --- a/docs/data-quality-checks/min-length-check.md +++ b/docs/data-quality-checks/min-length-check.md @@ -16,11 +16,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -32,11 +28,7 @@ Determines the minimum allowable length for the field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/min-partition-size-check.md b/docs/data-quality-checks/min-partition-size-check.md index ab056d7124..14e6d0bd5a 100644 --- a/docs/data-quality-checks/min-partition-size-check.md +++ b/docs/data-quality-checks/min-partition-size-check.md @@ -12,11 +12,7 @@ The Min Partition Size rule allows users to set a threshold ensuring that each p ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('coverage-only') }} ### Specific Properties @@ -28,11 +24,7 @@ Sets the required minimum record count for each data partition ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/min-value-check.md b/docs/data-quality-checks/min-value-check.md index 334722b9be..ba3b596567 100644 --- a/docs/data-quality-checks/min-value-check.md +++ b/docs/data-quality-checks/min-value-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -33,11 +29,7 @@ Determines the minimum allowable value for the field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/not-exists-in-check.md b/docs/data-quality-checks/not-exists-in-check.md index acda82d7c0..be3d53389d 100644 --- a/docs/data-quality-checks/not-exists-in-check.md +++ b/docs/data-quality-checks/not-exists-in-check.md @@ -42,11 +42,7 @@ Define the datastore, table/file, and field where the rule should look for non-m ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/not-future-check.md b/docs/data-quality-checks/not-future-check.md index 2f1b2e1c05..56db5d1ef0 100644 --- a/docs/data-quality-checks/not-future-check.md +++ b/docs/data-quality-checks/not-future-check.md @@ -17,19 +17,11 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/not-negative-check.md b/docs/data-quality-checks/not-negative-check.md index c966e2fb26..2b1a9974f6 100644 --- a/docs/data-quality-checks/not-negative-check.md +++ b/docs/data-quality-checks/not-negative-check.md @@ -17,19 +17,11 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/not-null-check.md b/docs/data-quality-checks/not-null-check.md index c0835bcd09..8c417b5015 100644 --- a/docs/data-quality-checks/not-null-check.md +++ b/docs/data-quality-checks/not-null-check.md @@ -21,19 +21,11 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/positive-check.md b/docs/data-quality-checks/positive-check.md index b7dd0a0df9..26d27b3862 100644 --- a/docs/data-quality-checks/positive-check.md +++ b/docs/data-quality-checks/positive-check.md @@ -17,19 +17,11 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/predicted-by-check.md b/docs/data-quality-checks/predicted-by-check.md index b062014d40..ff56704b04 100644 --- a/docs/data-quality-checks/predicted-by-check.md +++ b/docs/data-quality-checks/predicted-by-check.md @@ -23,11 +23,7 @@ The `Predicted By` rule is used to verify whether the actual values of a specifi ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -49,11 +45,7 @@ Determines if the actual value of a field falls within an expected predicted ran ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} ### Example diff --git a/docs/data-quality-checks/required-values-check.md b/docs/data-quality-checks/required-values-check.md index dfd2807fcd..ea7beca099 100644 --- a/docs/data-quality-checks/required-values-check.md +++ b/docs/data-quality-checks/required-values-check.md @@ -4,11 +4,7 @@ *Asserts that all of the defined values must be present at least once within a field.* -{% - include-markdown "components/general-props/warning.md" - start='' - end='' -%} +{{ spacing_warning() }} ### Field Scope @@ -27,11 +23,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -43,11 +35,7 @@ Ensures that a specific set of values is present within a field. ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/satisfies-expression-check.md b/docs/data-quality-checks/satisfies-expression-check.md index 62e56bcd95..8b6daf8c02 100644 --- a/docs/data-quality-checks/satisfies-expression-check.md +++ b/docs/data-quality-checks/satisfies-expression-check.md @@ -16,11 +16,7 @@ This rule will evaluate an expression against each record, marking those that do ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -36,11 +32,7 @@ Evaluates each record against a specified Spark SQL expression to ensure it meet ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('all-types') }} #### Example 1: Satisfies Expression Using a `CASE` Statement @@ -65,7 +57,7 @@ In pricing analysis, it’s important to monitor how discounts affect the final ``` json CASE WHEN (SELECT AVG(l_extendedprice * (1 - l_discount)) FROM lineitem) > - (SELECT MAX(l_discount) FROM {{_qualytics_self}}) + (SELECT MAX(l_discount) FROM {% raw %}{{_qualytics_self}}{% endraw %}) THEN TRUE ELSE FALSE END AS is_discount_within_limits diff --git a/docs/data-quality-checks/sum-check.md b/docs/data-quality-checks/sum-check.md index 989f6352b9..c4bf774d97 100644 --- a/docs/data-quality-checks/sum-check.md +++ b/docs/data-quality-checks/sum-check.md @@ -17,11 +17,7 @@ ### General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ### Specific Properties @@ -33,11 +29,7 @@ Ensures that the total sum of values in a specified field matches a defined amou ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/time-distribution-size-check.md b/docs/data-quality-checks/time-distribution-size-check.md index 1ba98cd0f2..217cbfc526 100644 --- a/docs/data-quality-checks/time-distribution-size-check.md +++ b/docs/data-quality-checks/time-distribution-size-check.md @@ -31,11 +31,7 @@ For instance, in a retail context, it could ensure that there’s a consistent n ### Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ### Example diff --git a/docs/data-quality-checks/unique/how-to-create.md b/docs/data-quality-checks/unique/how-to-create.md index 3418746197..6e08f7cb56 100644 --- a/docs/data-quality-checks/unique/how-to-create.md +++ b/docs/data-quality-checks/unique/how-to-create.md @@ -1,8 +1,8 @@ # :material-plus-circle:{ .middle style="color: var(--q-brick)" } How to Create a Unique Check diff --git a/docs/data-quality-checks/unique/introduction.md b/docs/data-quality-checks/unique/introduction.md index 4e7197a194..622858bb53 100644 --- a/docs/data-quality-checks/unique/introduction.md +++ b/docs/data-quality-checks/unique/introduction.md @@ -30,19 +30,11 @@ Typical use cases: enforcing primary keys, detecting duplicates, and enforcing c ## General Properties -{% - include-markdown "components/general-props/index.md" - start='' - end='' -%} +{{ general_props('all-props') }} ## Anomaly Types -{% - include-markdown "components/anomaly-support/index.md" - start='' - end='' -%} +{{ anomaly_support('shape-only') }} ## Next Steps diff --git a/docs/datastore-checks/filter-and-sort.md b/docs/datastore-checks/filter-and-sort.md index b18241c240..65f12c7bab 100644 --- a/docs/datastore-checks/filter-and-sort.md +++ b/docs/datastore-checks/filter-and-sort.md @@ -25,10 +25,7 @@ Whatever sorting option is selected, you can arrange the data either in ascendin You can filter your checks based on values like **Check Type**, **Asserted State**, **Rule**, **Tags**, **Table**, **Field**, and **Template**. -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![filter](../assets/datastore-checks/filter-and-sort/fuzzy-checks.png) ![filter](../assets/datastore-checks/filter-and-sort/filter-light.png) diff --git a/docs/deployments/databricks-deployment.md b/docs/deployments/databricks-deployment.md index 0d3f42baa7..f6be49ce58 100644 --- a/docs/deployments/databricks-deployment.md +++ b/docs/deployments/databricks-deployment.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Dataplane Deployment Guide for Databricks This guide explains how to deploy the **Qualytics Dataplane** as a **continuous Databricks job** using a **Qualytics-provided Databricks Asset Bundle**. diff --git a/docs/explore/anomalies.md b/docs/explore/anomalies.md index 2e93002b2d..0942404176 100644 --- a/docs/explore/anomalies.md +++ b/docs/explore/anomalies.md @@ -216,10 +216,7 @@ You can filter your anomalies based on values like **Source Datastores, Timefram ![filter](../assets/explore/anomalies/filter-1-light.png) -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![filter](../assets/explore/anomalies/fuzzy-anomalies2.png) ![filter](../assets/explore/anomalies/filter-2-light.png) diff --git a/docs/explore/checks.md b/docs/explore/checks.md index 9ea6f6aa42..9cd1a245fc 100644 --- a/docs/explore/checks.md +++ b/docs/explore/checks.md @@ -387,10 +387,7 @@ Whatever sorting option is selected, you can arrange the data either in ascendin You can filter your checks based on values like **Source Datastores Check Type**, **Asserted State**, **Rule**, **Tags**, **File**, **Field**, and **Template**. -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![filter](../assets/explore/checks/fuzzy-checks2.png) ![filter](../assets/explore/checks/filter-light.png) diff --git a/docs/explore/insights.md b/docs/explore/insights.md index 7f6d1972aa..6a498e2acd 100644 --- a/docs/explore/insights.md +++ b/docs/explore/insights.md @@ -27,10 +27,7 @@ Filtering Controls allow you to refine the data displayed on the **Insights** pa | 3. | Report Date | Set the report date to view data from a particular day. | | 4. | Timeframe | Choose a timeframe to view data for a specific period (week, month, quarter, or year) | -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![filters](../assets/explore/insights/fuzzy-insights.png) ## **Understanding Timeframes and Timeslices** diff --git a/docs/explore/profiles.md b/docs/explore/profiles.md index 2257c59745..7375f63cbb 100644 --- a/docs/explore/profiles.md +++ b/docs/explore/profiles.md @@ -102,10 +102,7 @@ You can filter your containers based on values like Type (Table, View, File, Com ![filter](../assets/explore/profiles/filter-light.png) -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![filter](../assets/explore/profiles/fuzzy-profile.png) ### Mark as Favorite diff --git a/docs/fields/computed-fields/computed-fields-details.md b/docs/fields/computed-fields/computed-fields-details.md index 7b4781a07b..20e0a070a3 100644 --- a/docs/fields/computed-fields/computed-fields-details.md +++ b/docs/fields/computed-fields/computed-fields-details.md @@ -78,4 +78,4 @@ Deleting a computed field permanently removes both the **transformation definiti This action is **irreversible**. Unlike excluding a source field (which preserves the computed field definition for later restoration), deleting a computed field permanently removes the definition and all associated data. !!! note - This is different from what happens when a source field is excluded. When a source field is excluded, the computed field output is also excluded but the definition is **preserved**, allowing restoration later. When you delete a computed field directly, the definition is permanently lost. For more details, see [Computed Fields and Exclusion](/fields/field-status/managing-field-status/exclude-a-field.md#computed-fields-and-exclusion){target="_blank"}. \ No newline at end of file + This is different from what happens when a source field is excluded. When a source field is excluded, the computed field output is also excluded but the definition is **preserved**, allowing restoration later. When you delete a computed field directly, the definition is permanently lost. For more details, see [Computed Fields and Exclusion](../field-status/managing-field-status/exclude-a-field.md#computed-fields-and-exclusion){target="_blank"}. \ No newline at end of file diff --git a/docs/fields/field-status/concepts/field-status-api.md b/docs/fields/field-status/concepts/field-status-api.md index 4fea752c1e..87e7fc5a96 100644 --- a/docs/fields/field-status/concepts/field-status-api.md +++ b/docs/fields/field-status/concepts/field-status-api.md @@ -17,12 +17,12 @@ Retrieves a paginated list of fields with optional filters. | Parameter | Type | Required | Description | | :--- | :--- | :--- | :--- | | `container_id` | integer | No | Filter by container ID | -| `datastore` | list[integer] | No | Filter by datastore IDs | -| `container` | list[integer] | No | Filter by container IDs | +| `datastore` | `list[integer]` | No | Filter by datastore IDs | +| `container` | `list[integer]` | No | Filter by container IDs | | `name` | string | No | Filter by field name | -| `type` | list[string] | No | Filter by field types | -| `tag` | list[string] | No | Filter by tags | -| `status` | list[string] | No | Filter by status: `active`, `masked`, `missing`, `excluded`. When omitted, returns `active` and `missing` fields | +| `type` | `list[string]` | No | Filter by field types | +| `tag` | `list[string]` | No | Filter by tags | +| `status` | `list[string]` | No | Filter by status: `active`, `masked`, `missing`, `excluded`. When omitted, returns `active` and `missing` fields | **Response**: Paginated list of field objects. @@ -184,7 +184,7 @@ Restores a masked field back to `active` status, making its values visible again ## Exclude a Field -Excludes a field from quality monitoring. Associated quality checks are archived (except [Expected Schema](/data-quality-checks/expected-schema-check.md) checks, which are updated to remove the field). +Excludes a field from quality monitoring. Associated quality checks are archived (except [Expected Schema](../../../data-quality-checks/expected-schema-check.md) checks, which are updated to remove the field). **Endpoint**: `DELETE /api/fields/{id}?archive=true` @@ -278,7 +278,7 @@ Updates multiple fields at once. You can change status and tags in a single requ | :--- | :--- | :--- | :--- | | `id` | integer | Yes | The field ID | | `status` | string | No | New status: `active`, `masked`, or `excluded` | -| `tags` | list[string] | No | Updated tags for the field | +| `tags` | `list[string]` | No | Updated tags for the field | ??? example "Example: Mask multiple fields" @@ -483,7 +483,7 @@ Retrieves source records from a container with the option to include unmasked va | Parameter | Type | Default | Description | | :--- | :--- | :--- | :--- | | `filter` | string | — | A Spark SQL where clause to filter records | -| `sort_columns` | list[string] | — | Field names to order by | +| `sort_columns` | `list[string]` | — | Field names to order by | | `include_masked` | boolean | `false` | When `true`, returns actual values for masked fields. Creates an audit log entry | ### Anomaly Source Records with Unmasked Values diff --git a/docs/fields/field-status/managing-field-status/delete-a-field.md b/docs/fields/field-status/managing-field-status/delete-a-field.md index 6c8f7cba38..3ad0a5112f 100644 --- a/docs/fields/field-status/managing-field-status/delete-a-field.md +++ b/docs/fields/field-status/managing-field-status/delete-a-field.md @@ -38,7 +38,7 @@ Only **missing** fields and **computed fields** can be permanently deleted. Acti ### Delete a Computed Field -Deleting a [computed field](/fields/computed-fields/overview.md){target="_blank"} permanently removes both the **transformation definition** and its **output field**. This is the only way to remove a computed field — computed fields cannot be excluded. +Deleting a [computed field](../../computed-fields/overview.md){target="_blank"} permanently removes both the **transformation definition** and its **output field**. This is the only way to remove a computed field — computed fields cannot be excluded. When a computed field is deleted: @@ -48,7 +48,7 @@ When a computed field is deleted: - **Source fields** are not affected — they retain their status and configuration !!! info - For step-by-step instructions on how to delete a computed field, see [Delete a Computed Field](/fields/computed-fields/computed-fields-details.md#delete-a-computed-field){target="_blank"}. + For step-by-step instructions on how to delete a computed field, see [Delete a Computed Field](../../computed-fields/computed-fields-details.md#delete-a-computed-field){target="_blank"}. ## Delete from the Field View diff --git a/docs/fields/field-status/managing-field-status/exclude-a-field.md b/docs/fields/field-status/managing-field-status/exclude-a-field.md index 2a2324c0cd..2efe7e93ff 100644 --- a/docs/fields/field-status/managing-field-status/exclude-a-field.md +++ b/docs/fields/field-status/managing-field-status/exclude-a-field.md @@ -9,8 +9,8 @@ Only fields with **Active** or **Masked** status can be excluded. When you exclude a field: - **Field Profiling**: The field is no longer profiled -- **Quality Checks**: Associated checks are set to Discarded; [Expected Schema](/data-quality-checks/expected-schema-check.md) checks are updated to remove the excluded field from their definition -- **[Computed Fields](/fields/computed-fields/overview.md)**: Any computed fields sourced from this field are also excluded (see [Computed Fields and Exclusion](#computed-fields-and-exclusion)) +- **Quality Checks**: Associated checks are set to Discarded; [Expected Schema](../../../data-quality-checks/expected-schema-check.md) checks are updated to remove the excluded field from their definition +- **[Computed Fields](../../computed-fields/overview.md)**: Any computed fields sourced from this field are also excluded (see [Computed Fields and Exclusion](#computed-fields-and-exclusion)) ## Exclude from the Field Listing @@ -74,7 +74,7 @@ You can exclude multiple fields at once from the container's field listing. ## Computed Fields and Exclusion -[Computed fields](/fields/computed-fields/overview.md) have a different relationship with exclusion compared to regular fields. A computed field depends on one or more **source fields** — if any source field becomes unavailable (missing or excluded), the computed field cannot function. +[Computed fields](../../computed-fields/overview.md) have a different relationship with exclusion compared to regular fields. A computed field depends on one or more **source fields** — if any source field becomes unavailable (missing or excluded), the computed field cannot function. ### Computed fields cannot be excluded directly diff --git a/docs/flows/actions-node/notifications/email/api.md b/docs/flows/actions-node/notifications/email/api.md index 76d4d1f468..200c393f8f 100644 --- a/docs/flows/actions-node/notifications/email/api.md +++ b/docs/flows/actions-node/notifications/email/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Email Notification API This page documents the API endpoints related to Email notification operations within Flows. diff --git a/docs/flows/actions-node/notifications/email/overview.md b/docs/flows/actions-node/notifications/email/overview.md index 6d5dcbb77b..b93b651cf4 100644 --- a/docs/flows/actions-node/notifications/email/overview.md +++ b/docs/flows/actions-node/notifications/email/overview.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Email Notification Email notifications deliver data quality alerts directly to one or more email inboxes. When a Flow trigger fires, Qualytics resolves any message variables, builds an email with the configured subject and body, and sends it to every address in the recipient list. Each address is processed independently — if one address is invalid, the remaining recipients still receive the notification. diff --git a/docs/flows/actions-node/notifications/faq.md b/docs/flows/actions-node/notifications/faq.md index e303e7c5c9..f7d4a2502f 100644 --- a/docs/flows/actions-node/notifications/faq.md +++ b/docs/flows/actions-node/notifications/faq.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Notifications FAQ ## General diff --git a/docs/flows/actions-node/notifications/in-app/api.md b/docs/flows/actions-node/notifications/in-app/api.md index ebf021bc04..dedff1262f 100644 --- a/docs/flows/actions-node/notifications/in-app/api.md +++ b/docs/flows/actions-node/notifications/in-app/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # In App Notification API This page documents the API endpoints related to In App notification operations within Flows. diff --git a/docs/flows/actions-node/notifications/in-app/faq.md b/docs/flows/actions-node/notifications/in-app/faq.md index 62a920334e..deadf9e73a 100644 --- a/docs/flows/actions-node/notifications/in-app/faq.md +++ b/docs/flows/actions-node/notifications/in-app/faq.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # In App Notification FAQ ## Delivery & Targeting diff --git a/docs/flows/actions-node/notifications/in-app/overview.md b/docs/flows/actions-node/notifications/in-app/overview.md index b170d95c55..88218d7533 100644 --- a/docs/flows/actions-node/notifications/in-app/overview.md +++ b/docs/flows/actions-node/notifications/in-app/overview.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # In App Notification In App notifications deliver alerts directly within the Qualytics platform. When a Flow trigger fires, Qualytics creates a notification for each eligible user — all **Admin** users and all users belonging to **teams associated with the target object** (e.g., the datastore or container involved in the event). If the target object has no assigned teams, all users in the platform receive the notification. diff --git a/docs/flows/actions-node/notifications/message-variables.md b/docs/flows/actions-node/notifications/message-variables.md index 1a92b18a08..7125cc13cb 100644 --- a/docs/flows/actions-node/notifications/message-variables.md +++ b/docs/flows/actions-node/notifications/message-variables.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Message Variables Qualytics allows you to customize notification messages using dynamic variables (tokens). These tokens are automatically replaced with real values when a Flow is triggered. diff --git a/docs/flows/actions-node/notifications/microsoft-teams/api.md b/docs/flows/actions-node/notifications/microsoft-teams/api.md index e886f4b13b..c5495942c0 100644 --- a/docs/flows/actions-node/notifications/microsoft-teams/api.md +++ b/docs/flows/actions-node/notifications/microsoft-teams/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Microsoft Teams Notification API This page documents the API endpoints related to Microsoft Teams notification operations within Flows. diff --git a/docs/flows/actions-node/notifications/microsoft-teams/overview.md b/docs/flows/actions-node/notifications/microsoft-teams/overview.md index bd90843d76..1c92880bfa 100644 --- a/docs/flows/actions-node/notifications/microsoft-teams/overview.md +++ b/docs/flows/actions-node/notifications/microsoft-teams/overview.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Microsoft Teams Notification !!! warning diff --git a/docs/flows/actions-node/notifications/overview.md b/docs/flows/actions-node/notifications/overview.md index a579c21e18..a8b2cd7edf 100644 --- a/docs/flows/actions-node/notifications/overview.md +++ b/docs/flows/actions-node/notifications/overview.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Notifications - Overview Notifications are Flow actions that deliver real-time alerts through external channels when data quality events occur. Every time a Flow trigger fires — whether from an anomaly detection, an operation completion, a partition scan, or a scheduled event — Qualytics resolves the configured message variables, builds a channel-appropriate payload, and dispatches it to the target destination. diff --git a/docs/flows/actions-node/notifications/pagerduty/api.md b/docs/flows/actions-node/notifications/pagerduty/api.md index 8b83b96db0..82da48a795 100644 --- a/docs/flows/actions-node/notifications/pagerduty/api.md +++ b/docs/flows/actions-node/notifications/pagerduty/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # PagerDuty Notification API This page documents the API endpoints related to PagerDuty notification operations within Flows. diff --git a/docs/flows/actions-node/notifications/pagerduty/faq.md b/docs/flows/actions-node/notifications/pagerduty/faq.md index 0f93a1f475..ea77375cc8 100644 --- a/docs/flows/actions-node/notifications/pagerduty/faq.md +++ b/docs/flows/actions-node/notifications/pagerduty/faq.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # PagerDuty Notification FAQ ## Configuration diff --git a/docs/flows/actions-node/notifications/pagerduty/overview.md b/docs/flows/actions-node/notifications/pagerduty/overview.md index b5a6797e22..4fbadc835f 100644 --- a/docs/flows/actions-node/notifications/pagerduty/overview.md +++ b/docs/flows/actions-node/notifications/pagerduty/overview.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # PagerDuty Notification !!! warning diff --git a/docs/flows/actions-node/notifications/slack/api.md b/docs/flows/actions-node/notifications/slack/api.md index 2fe70ca20e..c369d90cbb 100644 --- a/docs/flows/actions-node/notifications/slack/api.md +++ b/docs/flows/actions-node/notifications/slack/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Slack Notification API This page documents the API endpoints related to Slack notification operations within Flows. diff --git a/docs/flows/actions-node/notifications/slack/overview.md b/docs/flows/actions-node/notifications/slack/overview.md index 6299744727..6248fba358 100644 --- a/docs/flows/actions-node/notifications/slack/overview.md +++ b/docs/flows/actions-node/notifications/slack/overview.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Slack Notification !!! warning diff --git a/docs/flows/actions-node/workflow.md b/docs/flows/actions-node/workflow.md index 89a6b2deef..7ba1b66cc8 100644 --- a/docs/flows/actions-node/workflow.md +++ b/docs/flows/actions-node/workflow.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Workflow Users can connect to external apps for notifications using one of these services: diff --git a/docs/index.md b/docs/index.md index e6b21dc24c..290eb7a5b9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,60 +1,163 @@ --- hide: - navigation + - toc --- -# Introduction to Qualytics +
-Qualytics is your Active Data Quality Platform that empowers teams to manage data quality at scale through advanced automation. By analyzing the shapes and patterns in your historical data, Qualytics AI manages contextual data quality checks that actively monitor new data, including incremental loads, to identify anomalies. When issues arise, Qualytics provides your team with everything needed to take corrective actions using your existing data tools and preferred monitoring solutions. +
-## Managing Data Quality +# Active Data Quality, on autopilot { .q-hero__title } -Qualytics helps your data teams proactively address data issues by automating the discovery and maintenance of essential data quality measures. +Qualytics learns the shape of your data, lets AI manage contextual quality +checks, and surfaces anomalies before they reach your stakeholders — across +modern and legacy data stacks alike. +{ .q-hero__subcopy } -Here's how it works: +[:material-rocket-launch-outline: Quick Start](using-the-platform/quick-start-guide.md){ .q-btn .q-btn--primary } +[:material-compass-outline: Explore the platform](using-the-platform/web-app/overview.md){ .q-btn .q-btn--ghost } -1. **Analyzing Historical Data**: Qualytics examines your existing data to understand its patterns and characteristics, creating a comprehensive set of rules that define good data quality. +
-2. **Finding Anomalies**: AI Managed checks, along with any custom checks you author, work together to identify abnormalities in both historical and new data, even as it arrives incrementally. +## Explore the docs { .q-home__section-title } -3. **Taking Corrective Actions**: When Qualytics detects an anomaly, it springs into action. Using tags, it can: - - Send notifications through your preferred platforms (Teams, Slack, PagerDuty) - - Trigger workflows in your tools (Airflow, Fivetran, Airbyte) - - Provide detailed anomaly information to your chosen datastore - - Suggest optimal solutions through its intuitive interface and API +
-4. **Continuous Monitoring and Improvement**: Qualytics maintains constant vigilance over your data quality, automatically adapting quality checks to reflect changes in your data and business needs. This ongoing process strengthens data quality and builds confidence in your organization's data assets. +- :material-database-outline:{ .lg .middle } **Source Datastores** -## Key Features + --- -Qualytics delivers powerful capabilities designed to transform your data quality management: + Connect JDBC and DFS sources, manage connections, and onboard your data. -1. **Automated Data Profiling**: Qualytics creates comprehensive profiles of your data assets automatically, providing deep insights that form the foundation of robust data quality management. + [:octicons-arrow-right-24: Source Datastores](source-datastore/overview.md) -2. **AI Managed Checks**: Say goodbye to the challenge of manually crafting and maintaining data quality rules at scale. Qualytics AI manages appropriate checks based on your data profiles — and the **AI Effort** control lets you decide how deeply AI explores your data, from basic integrity checks (Low) to predictive cross-field checks (Max). +- :material-robot-outline:{ .lg .middle } **AI-Managed Checks** -3. **Anomaly Detection**: Detect data irregularities both at rest and in flight throughout your data ecosystem. Qualytics excels at highlighting outliers and anomalies, helping you maintain high data quality standards. + --- -4. **Anomaly Remediation**: When issues emerge, Qualytics seamlessly integrates with your preferred tools to enable swift corrective actions through automated workflows. + Let Qualytics author and maintain quality checks from your data profiles. -5. **Freshness Monitoring**: Keep your data current with built-in monitoring of data freshness Service Level Agreements (SLAs). Define and track timeliness requirements to ensure your data meets critical business needs. + [:octicons-arrow-right-24: AI-Managed Checks](data-quality-checks/ai-managed/getting-started.md) -6. **Insights Dashboard**: Access a clear, intuitive executive dashboard that provides a holistic view of your data health and quality. Visualize key metrics, track progress, and derive actionable insights to drive data-driven strategies. +- :material-check-decagram-outline:{ .lg .middle } **Data Quality Checks** -## Seamless Integration and Deployment + --- -Qualytics adapts to your infrastructure with flexible integration options: + Browse every rule type, from Not Null to Predicted By, with examples. -- **Deployment Options**: Choose the deployment model that works best for you — Managed (hosted by Qualytics in a single-tenant cloud) or Self-Hosted (on your own infrastructure, including on-premises). Qualytics meets you where your data lives. + [:octicons-arrow-right-24: Quality Checks](data-quality-checks/overview-of-a-check.md) -- **Support for Modern & Legacy Data Stacks**: Whether you use modern solutions like Snowflake and Amazon S3 or legacy systems like Oracle and MSSQL, Qualytics seamlessly integrates with your entire data stack to maintain quality across all sources. +- :material-alert-circle-outline:{ .lg .middle } **Anomalies** -## Demo -Here is a short video demonstrating the platform with a quick walkthrough: - + --- + + Detect, triage, and remediate record- and shape-level data anomalies. + + [:octicons-arrow-right-24: Anomalies](anomalies/overview.md) + +- :material-cog-sync-outline:{ .lg .middle } **Operations** + + --- + + Run sync, profile, scan, export, materialize, and promote operations. + + [:octicons-arrow-right-24: Operations](operations/sync/sync.md) + +- :material-sitemap-outline:{ .lg .middle } **Flows** + + --- + + Automate notifications, ticketing, and workflows when anomalies appear. + + [:octicons-arrow-right-24: Flows](flows/overview.md) + +- :material-robot-happy-outline:{ .lg .middle } **Agent Q** + + --- + + Chat with your data quality estate through Qualytics' AI agent and MCP. + + [:octicons-arrow-right-24: Agent Q](agent-q/overview.md) + +- :material-console:{ .lg .middle } **Qualytics CLI** + + --- + + Automate onboarding, checks, and operations from the command line. + + [:octicons-arrow-right-24: CLI](cli/overview.md) + +
+ +## How Qualytics works { .q-home__section-title } + +Qualytics helps data teams proactively address data issues by automating the +discovery and maintenance of essential data quality measures: + +1. **Analyzing historical data** — Qualytics examines your existing data to learn + its patterns and characteristics, forming a comprehensive set of rules that + define good data quality. +2. **Finding anomalies** — AI-Managed checks and any custom checks you author work + together to flag abnormalities in both historical and incrementally arriving data. +3. **Taking corrective action** — when an anomaly is detected, Qualytics can notify + your team (Teams, Slack, PagerDuty), trigger workflows (Airflow, Fivetran, + Airbyte), and write detailed anomaly information to your chosen datastore. +4. **Continuous monitoring** — Qualytics adapts checks as your data and business + needs evolve, strengthening data quality over time. -## Embarking on Your Journey +## Key features { .q-home__section-title } -This user guide will walk you through Qualytics' key capabilities with clear, step-by-step instructions. Whether you're new to the platform or looking to deepen your expertise, we're here to help you optimize your data quality management journey. +
+ +- :material-chart-box-outline:{ .lg .middle } **Automated Data Profiling** + + --- + + Comprehensive, automatic profiles of your data assets form the foundation of + robust data quality management. + +- :material-brain:{ .lg .middle } **AI-Managed Checks** + + --- + + The **AI Effort** control decides how deeply AI explores your data — from + basic integrity checks (Low) to predictive cross-field checks (Max). + +- :material-magnify-scan:{ .lg .middle } **Anomaly Detection & Remediation** + + --- + + Detect irregularities at rest and in flight, then remediate through automated + workflows with your preferred tools. + +- :material-timer-sand:{ .lg .middle } **Freshness Monitoring** + + --- + + Define and track timeliness SLAs so your data always meets critical business + needs. + +- :material-view-dashboard-outline:{ .lg .middle } **Insights Dashboard** + + --- + + An executive view of data health — visualize key metrics, track progress, and + derive actionable insights. + +- :material-server-network:{ .lg .middle } **Flexible Deployment** + + --- + + Managed (single-tenant cloud) or Self-Hosted (your own infrastructure) — + Qualytics meets you where your data lives. + +
+ +## See it in action { .q-home__section-title } + +A short walkthrough of the platform: + + -Let's begin empowering your organization with accurate, reliable, and trustworthy data using Qualytics! +
diff --git a/docs/operation-automation/automated-setup-using-qualytics-cli.md b/docs/operation-automation/automated-setup-using-qualytics-cli.md index 5533dc3432..0b4d0e0b7e 100644 --- a/docs/operation-automation/automated-setup-using-qualytics-cli.md +++ b/docs/operation-automation/automated-setup-using-qualytics-cli.md @@ -40,7 +40,7 @@ The script files will be located in `home/user/.qualytics` with a pattern `task_ * `` and ``: Replace with the IDs of the containers. You can add more containers as needed. -* ``: Comma-separated list of container IDs or array-like format. Example: "1, 2, 3" or "[1,2,3]". +* ``: Comma-separated list of container IDs or array-like format. Example: "1, 2, 3" or "`[1,2,3]`". * ``: Comma-separated list of operation to export or all for everything. Example: anomalies, checks, field-profiles or all. diff --git a/docs/operations/promote/api.md b/docs/operations/promote/api.md index 94842f57f7..908dfcc6f4 100644 --- a/docs/operations/promote/api.md +++ b/docs/operations/promote/api.md @@ -29,9 +29,9 @@ Promotes quality check definitions from one container to another. | `datastore_id` | integer | Yes | — | The source datastore ID | | `container_id` | integer | Yes | — | The source container ID | | `destination_container_id` | integer | Yes | — | The destination container ID | -| `check_ids` | list[integer] | No | — | Specific quality check IDs to promote. Mutually exclusive with `check_tags` | -| `check_tags` | list[string] | No | — | Tags to filter quality checks for promotion. Mutually exclusive with `check_ids` | -| `check_additional_tags` | list[string] | No | — | Tags to add to promoted checks at the destination | +| `check_ids` | `list[integer]` | No | — | Specific quality check IDs to promote. Mutually exclusive with `check_tags` | +| `check_tags` | `list[string]` | No | — | Tags to filter quality checks for promotion. Mutually exclusive with `check_ids` | +| `check_additional_tags` | `list[string]` | No | — | Tags to add to promoted checks at the destination | | `as_draft` | boolean | No | `true` | When `true`, promoted checks are created as Draft. When `false`, new checks are validated and created as Active | !!! note @@ -71,9 +71,9 @@ Promotes computed field definitions from one container to another. | `datastore_id` | integer | Yes | — | The source datastore ID | | `container_id` | integer | Yes | — | The source container ID | | `destination_container_id` | integer | Yes | — | The destination container ID | -| `computed_field_ids` | list[integer] | No | — | Specific computed field IDs to promote. Mutually exclusive with `computed_field_tags` | -| `computed_field_tags` | list[string] | No | — | Tags to filter computed fields for promotion. Mutually exclusive with `computed_field_ids` | -| `computed_field_additional_tags` | list[string] | No | — | Tags to add to promoted computed fields at the destination | +| `computed_field_ids` | `list[integer]` | No | — | Specific computed field IDs to promote. Mutually exclusive with `computed_field_tags` | +| `computed_field_tags` | `list[string]` | No | — | Tags to filter computed fields for promotion. Mutually exclusive with `computed_field_ids` | +| `computed_field_additional_tags` | `list[string]` | No | — | Tags to add to promoted computed fields at the destination | !!! note If neither `computed_field_ids` nor `computed_field_tags` is specified, all computed fields on the source container are promoted. @@ -106,9 +106,9 @@ Promotes computed table definitions from one JDBC datastore to another. | `type` | string | Yes | — | Must be `promote_computed_table` | | `datastore_id` | integer | Yes | — | The source datastore ID | | `destination_datastore_id` | integer | Yes | — | The destination JDBC datastore ID | -| `container_ids` | list[integer] | No | — | Specific computed table container IDs to promote. Mutually exclusive with `container_tags` | -| `container_tags` | list[string] | No | — | Tags to filter computed tables for promotion. Mutually exclusive with `container_ids` | -| `container_additional_tags` | list[string] | No | — | Tags to add to promoted computed tables at the destination | +| `container_ids` | `list[integer]` | No | — | Specific computed table container IDs to promote. Mutually exclusive with `container_tags` | +| `container_tags` | `list[string]` | No | — | Tags to filter computed tables for promotion. Mutually exclusive with `container_ids` | +| `container_additional_tags` | `list[string]` | No | — | Tags to add to promoted computed tables at the destination | !!! note If neither `container_ids` nor `container_tags` is specified, all computed tables on the source datastore are promoted. @@ -141,8 +141,8 @@ Promotes computed file definitions from one DFS datastore to another, with expli | `type` | string | Yes | — | Must be `promote_computed_file` | | `datastore_id` | integer | Yes | — | The source datastore ID | | `destination_datastore_id` | integer | Yes | — | The destination DFS datastore ID | -| `source_container_mappings` | list[object] | Yes | — | Mapping of each source computed file to a destination file pattern (see below) | -| `container_additional_tags` | list[string] | No | — | Tags to add to promoted computed files at the destination | +| `source_container_mappings` | `list[object]` | Yes | — | Mapping of each source computed file to a destination file pattern (see below) | +| `container_additional_tags` | `list[string]` | No | — | Tags to add to promoted computed files at the destination | **`source_container_mappings` object**: @@ -256,7 +256,7 @@ You can filter the entities in a promote operation by their result status using | Parameter | Type | Required | Description | | :--- | :--- | :--- | :--- | | `search` | string | No | Filter by check description or rule type | -| `promote_result` | list[string] | No | Filter by result: `created`, `updated`, `skipped`, `failed` | +| `promote_result` | `list[string]` | No | Filter by result: `created`, `updated`, `skipped`, `failed` | #### Computed Field Results @@ -267,7 +267,7 @@ You can filter the entities in a promote operation by their result status using | Parameter | Type | Required | Description | | :--- | :--- | :--- | :--- | | `search` | string | No | Filter by field name | -| `promote_result` | list[string] | No | Filter by result: `created`, `updated`, `skipped`, `failed` | +| `promote_result` | `list[string]` | No | Filter by result: `created`, `updated`, `skipped`, `failed` | #### Computed Table / File Results @@ -278,7 +278,7 @@ You can filter the entities in a promote operation by their result status using | Parameter | Type | Required | Description | | :--- | :--- | :--- | :--- | | `search` | string | No | Filter by container name | -| `promote_result` | list[string] | No | Filter by result: `created`, `updated`, `skipped`, `failed` | +| `promote_result` | `list[string]` | No | Filter by result: `created`, `updated`, `skipped`, `failed` | --- diff --git a/docs/operations/scan/scan.md b/docs/operations/scan/scan.md index 294427e165..bee80861cb 100644 --- a/docs/operations/scan/scan.md +++ b/docs/operations/scan/scan.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Scan Operation The Scan Operation in Qualytics is performed on a datastore to enforce data quality checks for various data collections, such as tables, views, and files. It supports centralized configuration through the Datastore Enrichment Settings, where options like the Remediation Strategy, Source Record Limit, and Anomaly Rollup Threshold are defined. While these defaults are applied automatically during a scan, users retain the flexibility to adjust the Source Record Limit and Anomaly Rollup Threshold directly within the scan form. This operation has several key functions: diff --git a/docs/settings/connections/manage-connections.md b/docs/settings/connections/manage-connections.md index 3e4f15cfb3..49f02ff19f 100644 --- a/docs/settings/connections/manage-connections.md +++ b/docs/settings/connections/manage-connections.md @@ -96,8 +96,5 @@ You can filter connections by selecting specific data source types from the drop ![filter](../../assets/connections/filter-light-14.png) -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![filter](../../assets/connections/fuzzy-connection.png) \ No newline at end of file diff --git a/docs/settings/integrations/alerting/msft_teams.md b/docs/settings/integrations/alerting/msft_teams.md index 067dae085c..dfebd61dba 100644 --- a/docs/settings/integrations/alerting/msft_teams.md +++ b/docs/settings/integrations/alerting/msft_teams.md @@ -61,7 +61,7 @@ A dropdown appears search for **Application.ReadWrite.OwnedBy**, check the box u ![msft-graph-application-permission](../../../assets/settings/integrations/alerting/msft_teams/add-permissions.png) -**Step 5:** Once the permission is added, you'll return to the API permissions page. Click **Grant admin consent for [Your Organization]** to approve the selected permissions. +**Step 5:** Once the permission is added, you'll return to the API permissions page. Click **Grant admin consent for \[Your Organization\]** to approve the selected permissions. ![app-readwrite-all](../../../assets/settings/integrations/alerting/msft_teams/admin.png) diff --git a/docs/settings/integrations/alerting/pagerduty/deep-dive.md b/docs/settings/integrations/alerting/pagerduty/deep-dive.md index f896b62b39..32272f66ac 100644 --- a/docs/settings/integrations/alerting/pagerduty/deep-dive.md +++ b/docs/settings/integrations/alerting/pagerduty/deep-dive.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # PagerDuty Deep Dive This page provides an in-depth look at how Qualytics manages PagerDuty integration behind the scenes — from event construction and routing to severity mapping and deduplication. diff --git a/docs/settings/integrations/alerting/pagerduty/managing-pagerduty/add-integration.md b/docs/settings/integrations/alerting/pagerduty/managing-pagerduty/add-integration.md index 3a7530a5ff..986e277203 100644 --- a/docs/settings/integrations/alerting/pagerduty/managing-pagerduty/add-integration.md +++ b/docs/settings/integrations/alerting/pagerduty/managing-pagerduty/add-integration.md @@ -26,7 +26,7 @@ If you don't already have a PagerDuty service configured with Events API v2, fol **Step 2:** Locate the **Events API v2** integration and copy the **Integration Key**. This is the **Routing Key** you'll need for the Qualytics integration. !!! tip - You can also find the Integration Key later by navigating to **Services > [Your Service] > Integrations > Events API v2**. + You can also find the Integration Key later by navigating to **Services > \[Your Service\] > Integrations > Events API v2**. --- diff --git a/docs/settings/integrations/alerting/pagerduty/pagerduty-api.md b/docs/settings/integrations/alerting/pagerduty/pagerduty-api.md index b459a23152..c72ac74ff3 100644 --- a/docs/settings/integrations/alerting/pagerduty/pagerduty-api.md +++ b/docs/settings/integrations/alerting/pagerduty/pagerduty-api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # PagerDuty API This page documents the API endpoints related to PagerDuty integration operations. Use these endpoints to programmatically manage your PagerDuty integration — from creating and validating to editing and removing it. diff --git a/docs/settings/integrations/alerting/pagerduty/pagerduty-faq.md b/docs/settings/integrations/alerting/pagerduty/pagerduty-faq.md index 09806a9d6e..164fffeb32 100644 --- a/docs/settings/integrations/alerting/pagerduty/pagerduty-faq.md +++ b/docs/settings/integrations/alerting/pagerduty/pagerduty-faq.md @@ -4,7 +4,7 @@ #### What is a Routing Key and where do I find it? -A Routing Key (also called an Integration Key) is a unique identifier that routes events to a specific PagerDuty service. You can find it in your PagerDuty account by navigating to **Services > [Your Service] > Integrations > Events API v2**. Each service can have its own Routing Key. +A Routing Key (also called an Integration Key) is a unique identifier that routes events to a specific PagerDuty service. You can find it in your PagerDuty account by navigating to **Services > \[Your Service\] > Integrations > Events API v2**. Each service can have its own Routing Key. #### Do I need admin access to PagerDuty to set up the integration? diff --git a/docs/settings/integrations/data-catalogs/overview.md b/docs/settings/integrations/data-catalogs/overview.md index de0ea08646..7a550ef990 100644 --- a/docs/settings/integrations/data-catalogs/overview.md +++ b/docs/settings/integrations/data-catalogs/overview.md @@ -106,7 +106,7 @@ Trigger complete metadata synchronization on-demand: ![manual-sync](../../../assets/settings/integrations/data-catalogs/overview/manual-sync.png){: style="width:750px"} -For detailed steps, see the [**Synchronization**](atlan.md/#synchronization){target="_blank} section. +For detailed steps, see the [**Synchronization**](atlan.md#synchronization){target="_blank"} section. ### Event Driven diff --git a/docs/settings/security/teams/api.md b/docs/settings/security/teams/api.md index 28721ceb02..c9c53ac147 100644 --- a/docs/settings/security/teams/api.md +++ b/docs/settings/security/teams/api.md @@ -49,7 +49,7 @@ Authorization: Bearer {token} | Parameter | Type | Description | | :--- | :--- | :--- | -| `users` | list[int] | Filter by user IDs | +| `users` | `list[int]` | Filter by user IDs | | `permission` | string | Filter by team permission level | **Required Role:** Member or above @@ -114,8 +114,8 @@ Content-Type: application/json | :--- | :--- | :--- | :---: | | `name` | string | Team name (max 255 characters, must be unique) | Yes | | `description` | string | Brief description of the team | No | -| `user_ids` | list[int] | User IDs to add to the team | No | -| `datastore_ids` | list[int] | Datastore IDs to assign to the team | No | +| `user_ids` | `list[int]` | User IDs to add to the team | No | +| `datastore_ids` | `list[int]` | Datastore IDs to assign to the team | No | | `permission` | string | Permission level: `Editor`, `Author`, `Drafter`, `Viewer`, or `Reporter` (default: `Viewer`) | No | **Required Role:** Admin diff --git a/docs/source-datastore/datastore/api.md b/docs/source-datastore/datastore/api.md index e9fd75f858..2588c3fcf6 100644 --- a/docs/source-datastore/datastore/api.md +++ b/docs/source-datastore/datastore/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Datastore API You can manage source datastores programmatically using the Qualytics API. This page covers all endpoints related to creating, reading, updating, and deleting datastores, as well as multi-schema bulk creation. @@ -187,8 +191,8 @@ Creates a single source datastore with either a new or existing connection. | `root_path` | string | Conditional | — | Base directory path (DFS only, required for DFS). | | `folder_globbing_enabled` | boolean | No | `false` | Enable folder-level globbing for DFS datastores (DFS only). | | `description` | string | No | `null` | Description for the datastore (max 255 characters). | -| `teams` | list[string] | No | `null` | Team names to assign. | -| `tags` | list[string] | No | `null` | Tag names to assign. | +| `teams` | `list[string]` | No | `null` | Team names to assign. | +| `tags` | `list[string]` | No | `null` | Tag names to assign. | | `group_id` | integer | No | `null` | Existing datastore group ID to assign. | | `group` | object | No | `null` | Inline group to create and assign (mutually exclusive with `group_id`). | | `trigger_catalog` | boolean | No | `null` | Whether to trigger a sync operation after creation. | @@ -306,12 +310,12 @@ Retrieves a paginated list of datastores with optional filtering and sorting. | Parameter | Type | Description | | :--- | :--- | :--- | -| `id` | list[int] | Filter by datastore ID(s). | +| `id` | `list[int]` | Filter by datastore ID(s). | | `name` | string | Filter by exact name. | | `search` | string | Search by name or ID (partial match). | -| `datastore_type` | list[string] | Filter by connection type (e.g., `postgresql`, `snowflake`, `s3`). | -| `tag` | list[string] | Filter by tag names. | -| `group` | list[int] | Filter by datastore group ID(s). | +| `datastore_type` | `list[string]` | Filter by connection type (e.g., `postgresql`, `snowflake`, `s3`). | +| `tag` | `list[string]` | Filter by tag names. | +| `group` | `list[int]` | Filter by datastore group ID(s). | | `enrichment_only` | boolean | Filter enrichment-only (`true`) vs source (`false`) datastores. Default: `false`. | | `sort_name` | string | Sort by name (`asc` or `desc`). | | `sort_created` | string | Sort by created date (`asc` or `desc`). | @@ -899,8 +903,8 @@ Creates multiple source datastores from selected schemas in a single operation. | Property | Type | Required | Default | Description | | :--- | :--- | :--- | :--- | :--- | | `connection` | object | Yes (new only) | — | Connection details to create before bulk creation. | -| `schemas` | list[string] | Conditional | — | List of schema names to create JDBC/Native datastores for. Required if `root_paths` is not provided. | -| `root_paths` | list[string] | Conditional | — | List of root paths to create DFS datastores for. Required if `schemas` is not provided. Mutually exclusive with `schemas`. | +| `schemas` | `list[string]` | Conditional | — | List of schema names to create JDBC/Native datastores for. Required if `root_paths` is not provided. | +| `root_paths` | `list[string]` | Conditional | — | List of root paths to create DFS datastores for. Required if `schemas` is not provided. Mutually exclusive with `schemas`. | | `database` | string | No | `null` | Database/catalog name (for connectors with catalog hierarchy). | | `name_template` | string | No | `{connection_name}_{{schema}}` | Naming pattern with `{{schema}}` placeholder. | | `description` | string | No | `null` | Description applied to all created datastores. | @@ -911,8 +915,8 @@ Creates multiple source datastores from selected schemas in a single operation. | `high_count_rollup_threshold` | integer | No | `10` | Max anomalies per check before rolling up (1–1,000). | | `group_id` | integer | No | `null` | Existing datastore group ID to assign. | | `group` | object | No | `null` | Inline group to create and assign (mutually exclusive with `group_id`). | -| `tags` | list[string] | No | `null` | Tags to apply to all created datastores. | -| `teams` | list[string] | No | `null` | Teams to assign to all created datastores. | +| `tags` | `list[string]` | No | `null` | Tags to apply to all created datastores. | +| `teams` | `list[string]` | No | `null` | Teams to assign to all created datastores. | | `trigger_catalog` | boolean | No | `null` | Whether to trigger a sync operation after each creation. | !!! warning diff --git a/docs/source-datastore/datastore/faq.md b/docs/source-datastore/datastore/faq.md index cd28f8cf69..e1356a685f 100644 --- a/docs/source-datastore/datastore/faq.md +++ b/docs/source-datastore/datastore/faq.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Datastore FAQ Answers to frequently asked questions about source datastores in Qualytics. diff --git a/docs/source-datastore/datastore/jdbc/athena/managing/add-source.md b/docs/source-datastore/datastore/jdbc/athena/managing/add-source.md index fb6251af71..23dd29ccf4 100644 --- a/docs/source-datastore/datastore/jdbc/athena/managing/add-source.md +++ b/docs/source-datastore/datastore/jdbc/athena/managing/add-source.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # ![](../../../../../assets/shared/connector-logos/logo-athena.svg){ width="36" style="vertical-align: middle;" } Add an Athena Source Datastore A source datastore is a storage location Qualytics connects to so it can profile, scan, and monitor data. Adding Athena as a source lets Qualytics query your AWS data lake through the Athena JDBC driver and run quality operations on the tables it discovers. diff --git a/docs/source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md b/docs/source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md index 7555d71c75..6062c6e191 100644 --- a/docs/source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md +++ b/docs/source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # ![](../../../../../assets/shared/connector-logos/logo-sap-hana.svg){ width="36" style="vertical-align: middle;" } Add a SAP HANA Source Datastore A source datastore is a storage location Qualytics connects to so it can profile, scan, and monitor data. Adding SAP HANA as a source lets Qualytics query your HANA tables and views through the SAP HANA JDBC driver and run quality operations on the schemas it discovers. diff --git a/docs/source-datastore/datastore/multi-schema/faq.md b/docs/source-datastore/datastore/multi-schema/faq.md index b745758994..38a1dd3589 100644 --- a/docs/source-datastore/datastore/multi-schema/faq.md +++ b/docs/source-datastore/datastore/multi-schema/faq.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Multi-Schema Creation FAQ ## General diff --git a/docs/source-datastore/datastore/multi-schema/how-it-works.md b/docs/source-datastore/datastore/multi-schema/how-it-works.md index 41bdeaf240..d7cd80059b 100644 --- a/docs/source-datastore/datastore/multi-schema/how-it-works.md +++ b/docs/source-datastore/datastore/multi-schema/how-it-works.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # How Multi-Schema Creation Works ## Overview diff --git a/docs/source-datastore/tags/api.md b/docs/source-datastore/tags/api.md index ed67b02a3c..bd467a34bd 100644 --- a/docs/source-datastore/tags/api.md +++ b/docs/source-datastore/tags/api.md @@ -1,3 +1,7 @@ +--- +render_macros: false +--- + # Datastore Tags API Tags on datastores are managed through the `PUT /api/datastores/{id}` endpoint. There is no separate endpoint for tag assignment — you update the `tags` field in the datastore update payload, and Qualytics automatically determines which tags to add and which to remove. diff --git a/docs/stylesheets/components.css b/docs/stylesheets/components.css new file mode 100644 index 0000000000..c0a5b5e735 --- /dev/null +++ b/docs/stylesheets/components.css @@ -0,0 +1,71 @@ +/* ========================================================================== + Reusable modern components (q- prefix) + small nav/search polish. + Additive layer: loaded after extra.css, uses tokens.css. Authored in plain + Markdown via attr_list/md_in_html wrappers, e.g.
. + ========================================================================== */ + +/* --- Accent feature cards:
--- */ +.md-typeset .grid.cards.q-cards--accent > ul > li { + border-top: 3px solid var(--q-brand); +} + +/* --- Comparison / spec table:
+ a table --- */ +.md-typeset .q-spec-table > table:not([class]) { + width: 100%; + border-collapse: separate; + border-spacing: 0; + border-radius: var(--q-radius-md); + overflow: hidden; + box-shadow: var(--q-shadow-1); +} +.md-typeset .q-spec-table > table:not([class]) th { + background: var(--q-brand); + color: var(--q-on-brand); + font-weight: var(--q-fw-medium); + border: none; +} +.md-typeset .q-spec-table > table:not([class]) tbody tr:nth-child(even) td { + background: var(--q-surface-2); +} +.md-typeset .q-spec-table > table:not([class]) tbody tr:hover td { + background: color-mix(in srgb, var(--q-brand) 8%, transparent); +} + +/* --- Brand callout: !!! qualytics "Title" (custom admonition) --- */ +.md-typeset .admonition.qualytics, +.md-typeset details.qualytics { + border-color: var(--q-brand); +} +.md-typeset .qualytics > .admonition-title, +.md-typeset .qualytics > summary { + background: color-mix(in srgb, var(--q-brand) 12%, transparent); +} +.md-typeset .qualytics > .admonition-title::before, +.md-typeset .qualytics > summary::before { + background-color: var(--q-brand); + -webkit-mask-image: var(--md-admonition-icon--note); + mask-image: var(--md-admonition-icon--note); +} + +/* --- Example wrapper:
around tabbed code --- */ +.md-typeset .q-example { + border: 1px solid var(--q-border); + border-radius: var(--q-radius-md); + padding: var(--q-space-2) var(--q-space-4); + background: var(--q-surface); +} + +/* --- Nav polish: brand rail on the active item --- */ +.md-nav__link--active, +.md-nav__item--active > .md-nav__link { + box-shadow: inset 2px 0 0 var(--q-brand); +} + +/* --- Search polish: brand left-accent on result hover/active --- */ +.md-search-result__item:hover, +.md-search-result__more + .md-search-result__item { + border-left: 2px solid transparent; +} +.md-search-result__item:hover { + border-left-color: var(--q-brand); +} diff --git a/docs/stylesheets/home.css b/docs/stylesheets/home.css new file mode 100644 index 0000000000..69a6ba680a --- /dev/null +++ b/docs/stylesheets/home.css @@ -0,0 +1,111 @@ +/* ========================================================================== + Modern homepage (scoped under .q-home) and the branded 404 page (.q-404). + ========================================================================== */ + +.q-home { + max-width: 62rem; + margin-inline: auto; +} + +/* --- Hero --- */ +.q-home .q-hero { + padding: var(--q-space-8) 0 var(--q-space-6); +} + +.q-home .q-hero__title { + font-size: var(--q-fs-hero); + line-height: 1.05; + font-weight: var(--q-fw-bold); + letter-spacing: -0.02em; + margin: 0 0 var(--q-space-4); + background: linear-gradient(92deg, var(--q-brand), var(--q-brand-strong)); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +/* Fallback if background-clip:text is unsupported */ +@supports not ((-webkit-background-clip: text) or (background-clip: text)) { + .q-home .q-hero__title { + color: var(--q-brand-strong); + background: none; + } +} + +.q-home .q-hero__subcopy { + font-size: var(--q-fs-lg); + color: var(--q-fg-muted); + max-width: 46ch; + margin: 0 0 var(--q-space-6); +} + +/* --- Buttons --- */ +.q-home .q-btn, +.q-404 .q-btn { + display: inline-flex; + align-items: center; + gap: var(--q-space-2); + padding: 0.6rem 1.15rem; + margin: 0 var(--q-space-3) var(--q-space-2) 0; + border-radius: var(--q-radius-pill); + font-weight: var(--q-fw-medium); + text-decoration: none !important; + transition: transform var(--q-ease), box-shadow var(--q-ease), + background-color var(--q-ease), border-color var(--q-ease), color var(--q-ease); +} +.q-home .q-btn--primary, +.q-404 .q-btn--primary { + background: var(--q-brand); + color: var(--q-on-brand) !important; +} +.q-home .q-btn--primary:hover, +.q-404 .q-btn--primary:hover { + background: var(--q-brand-strong); + transform: translateY(-1px); + box-shadow: var(--q-shadow-2); +} +.q-home .q-btn--ghost, +.q-404 .q-btn--ghost { + border: 1px solid var(--q-border-strong); + color: var(--q-fg) !important; +} +.q-home .q-btn--ghost:hover, +.q-404 .q-btn--ghost:hover { + border-color: var(--q-brand); + color: var(--q-brand) !important; +} + +/* --- Section titles --- */ +.q-home .q-home__section-title { + font-size: var(--q-fs-xl); + margin-top: var(--q-space-8); +} + +/* --- 404 --- */ +.q-404 { + text-align: center; + max-width: 40rem; + margin: var(--q-space-12) auto; +} +.q-404 .q-404__code { + font-size: clamp(4rem, 14vw, 8rem); + font-weight: var(--q-fw-bold); + line-height: 1; + margin: 0; + background: linear-gradient(92deg, var(--q-brand), var(--q-brand-strong)); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} +@supports not ((-webkit-background-clip: text) or (background-clip: text)) { + .q-404 .q-404__code { color: var(--q-brand-strong); background: none; } +} +.q-404 .q-404__actions { + margin-top: var(--q-space-6); +} + +/* --- Responsive --- */ +@media screen and (max-width: 44.9375em) { + .q-home .q-hero { padding-top: var(--q-space-4); text-align: center; } + .q-home .q-hero__subcopy { margin-inline: auto; } +} diff --git a/docs/stylesheets/print.css b/docs/stylesheets/print.css new file mode 100644 index 0000000000..92301e66ff --- /dev/null +++ b/docs/stylesheets/print.css @@ -0,0 +1,73 @@ +/* ========================================================================== + Print styles — replaces the mkdocs-print-site plugin. + Lets readers use the browser's native "Print -> Save as PDF" on any page + with a clean, content-only layout (no chrome, no interactive elements). + ========================================================================== */ + +@media print { + /* Hide site chrome and interactive-only elements */ + .md-header, + .md-tabs, + .md-sidebar, + .md-sidebar--primary, + .md-sidebar--secondary, + .md-nav, + .md-footer, + .md-top, + .md-feedback, + .md-search, + .md-banner, + .md-content__button, + .md-source, + .md-dialog, + .card-filter-wrapper { + display: none !important; + } + + /* Let content use the full page width */ + .md-main__inner, + .md-content, + .md-content__inner, + .md-grid { + margin: 0 !important; + max-width: none !important; + width: 100% !important; + } + + /* Keep code, tables, and admonitions from being clipped across pages */ + .md-typeset pre, + .md-typeset table, + .md-typeset .admonition, + .md-typeset details, + .md-typeset .grid.cards > ul > li { + break-inside: avoid; + overflow: visible !important; + } + + .md-typeset pre > code { + white-space: pre-wrap !important; + word-break: break-word; + } + + /* Avoid orphaned headings at the bottom of a page */ + .md-typeset h1, + .md-typeset h2, + .md-typeset h3, + .md-typeset h4 { + break-after: avoid; + } + + /* Expand the URL after external links so printouts remain useful */ + .md-typeset a[href^="http"]::after { + content: " (" attr(href) ")"; + font-size: 0.75em; + word-break: break-all; + color: #555; + } + + /* Ensure backgrounds/brand colors render in print */ + * { + -webkit-print-color-adjust: exact !important; + print-color-adjust: exact !important; + } +} diff --git a/docs/stylesheets/tokens.css b/docs/stylesheets/tokens.css new file mode 100644 index 0000000000..a2d2ac58d8 --- /dev/null +++ b/docs/stylesheets/tokens.css @@ -0,0 +1,70 @@ +/* ========================================================================== + Design tokens — a modern, semantic layer that complements the brand + variables already defined in extra.css (--q-primary, --q-brick, ...). + These NEW tokens (radii, spacing, type scale, elevation, surfaces) are used + by the modern homepage (home.css) and the reusable components (components.css). + ========================================================================== */ + +:root { + /* Brand (constant across both color schemes) */ + --q-brand: #ff9933; /* Qualytics orange */ + --q-brand-strong: #b83200; /* brick — hover / active */ + + /* Radius scale */ + --q-radius-sm: 4px; + --q-radius-md: 8px; + --q-radius-lg: 14px; + --q-radius-pill: 999px; + + /* Spacing scale */ + --q-space-1: 0.25rem; + --q-space-2: 0.5rem; + --q-space-3: 0.75rem; + --q-space-4: 1rem; + --q-space-6: 1.5rem; + --q-space-8: 2rem; + --q-space-12: 3rem; + + /* Type scale */ + --q-fs-sm: 0.8rem; + --q-fs-md: 0.95rem; + --q-fs-lg: 1.15rem; + --q-fs-xl: 1.5rem; + --q-fs-2xl: 2rem; + --q-fs-hero: clamp(2.1rem, 4.5vw, 3.4rem); + --q-fw-medium: 600; + --q-fw-bold: 700; + + /* Elevation */ + --q-shadow-1: 0 1px 3px rgb(0 0 0 / 8%); + --q-shadow-2: 0 4px 14px rgb(184 50 0 / 18%); /* brand-tinted */ + --q-shadow-3: 0 10px 34px rgb(0 0 0 / 14%); + + /* Motion */ + --q-ease: 0.2s ease; +} + +/* Light scheme — semantic surface roles */ +[data-md-color-scheme="default"] { + --q-surface: #ffffff; + --q-surface-2: #faf8f6; + --q-border: #e7e1da; + --q-border-strong: #d3cabf; + --q-fg: #1a1a1a; + --q-fg-muted: #5b5b5b; + --q-on-brand: #ffffff; +} + +/* Dark (slate) scheme — improved elevation & contrast over the old pure-black + cards on #232526: surfaces now read as raised, text is off-white to reduce + glare, and brick is brightened so links/buttons keep AA contrast. */ +[data-md-color-scheme="slate"] { + --q-surface: #1f2329; + --q-surface-2: #262b31; + --q-border: #343a42; + --q-border-strong: #454c56; + --q-fg: #ececec; + --q-fg-muted: #b3b3b3; + --q-on-brand: #1a1a1a; + --q-brand-strong: #ff5a2c; +} diff --git a/docs/tags/filter-and-sort.md b/docs/tags/filter-and-sort.md index ac03695a73..9d76966af1 100644 --- a/docs/tags/filter-and-sort.md +++ b/docs/tags/filter-and-sort.md @@ -24,10 +24,7 @@ Whatever sorting option is selected, you can arrange the data either in ascendin You can filter your tags by type and category, which allows you to categorize and manage them more effectively. -{% include-markdown "components/general-props/typos.md" - start='' - end='' -%} +{{ fuzzy_search() }} ![typos-tag](../assets/tags/typos-tag.png) ![filter-tag](../assets/tags/filter-tag-light-8.png) diff --git a/docs/using-the-platform/printing.md b/docs/using-the-platform/printing.md index 89dba79e6e..74bb42283c 100644 --- a/docs/using-the-platform/printing.md +++ b/docs/using-the-platform/printing.md @@ -5,6 +5,25 @@ hide: # Printing This Guide -This guide changes often, so we can't recommend printing it or saving it offline. However, we recognize that there are -circumstances beyond some users' control that make doing so more convenient. Thus, we are [providing this link to our -userguide as a single page](../print_page/) appropriate for saving as a PDF. If you find this useful, please let us know. +This guide changes often, so we don't recommend printing it or saving it offline. +However, we recognize that there are circumstances beyond some users' control that +make doing so more convenient. + +To save any page as a PDF, use your browser's built-in print dialog: + +=== ":material-microsoft-windows: Windows / Linux" + + Press ++ctrl+p++, then choose **Save as PDF** as the destination. + +=== ":material-apple: macOS" + + Press ++cmd+p++, then choose **Save as PDF** from the PDF menu. + +The page is automatically reformatted for print — navigation, search, and other +interactive elements are hidden so you get a clean, content-only document. + +!!! tip + + To capture a whole section, open each page you need and save them + individually, or use your browser's **Print → Save as PDF** on the page + you're currently reading. diff --git a/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/api.md b/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/api.md index b19b7722fe..c9001b93c3 100644 --- a/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/api.md +++ b/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/api.md @@ -19,7 +19,7 @@ Include the token in the `Authorization` header: Authorization: Bearer YOUR_QUALYTICS_API_TOKEN ``` -For instructions on generating a token, see [Tokens](../../../../settings/tokens/overview-of-tokens.md){:target="_blank"}. +For instructions on generating a token, see [Tokens](../../../../settings/access-tokens/getting-started.md){:target="_blank"}. --- diff --git a/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/faq.md b/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/faq.md index 87872c2107..4bf67cd900 100644 --- a/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/faq.md +++ b/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/faq.md @@ -8,7 +8,7 @@ Four categories: **Flow** executions (success or failure of a flow run), **Menti #### Are these the same as Slack or Email notifications from flows? -No. The bell icon shows **in-app** notifications for you, the signed-in user. To send messages to Slack, Email, Microsoft Teams, or PagerDuty as part of a flow, configure a notification action inside the flow itself. See the [Flow Notifications](../../../../flows/notifications/overview.md){:target="_blank"} documentation. +No. The bell icon shows **in-app** notifications for you, the signed-in user. To send messages to Slack, Email, Microsoft Teams, or PagerDuty as part of a flow, configure a notification action inside the flow itself. See the [Flow Notifications](../../../../flows/actions-node/notifications/overview.md){:target="_blank"} documentation. #### Can I disable specific notification types? diff --git a/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md b/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md index 28c9e8d46f..51ad80ad5d 100644 --- a/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md +++ b/docs/using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md @@ -18,7 +18,7 @@ Qualytics delivers four kinds of in-app notifications: Each notification is **personal to you** — only the events relevant to your account, ownerships, assignments, and mentions appear in your panel. !!! info "In-app vs. flow notifications" - The bell icon here surfaces activity for **you, the signed-in user**. To send notifications to external channels (Slack, Email, Microsoft Teams, PagerDuty) as part of a flow, configure a notification action inside the flow itself. See the [Flow Notifications](../../../../flows/notifications/overview.md){:target="_blank"} documentation. + The bell icon here surfaces activity for **you, the signed-in user**. To send notifications to external channels (Slack, Email, Microsoft Teams, PagerDuty) as part of a flow, configure a notification action inside the flow itself. See the [Flow Notifications](../../../../flows/actions-node/notifications/overview.md){:target="_blank"} documentation. --- diff --git a/includes/abbreviations.md b/includes/abbreviations.md deleted file mode 100644 index 1a3f4a3727..0000000000 --- a/includes/abbreviations.md +++ /dev/null @@ -1,3 +0,0 @@ - -*[HTML]: Hyper Text Markup Language -*[W3C]: World Wide Web Consortium diff --git a/main.py b/main.py new file mode 100644 index 0000000000..26bedb7aaf --- /dev/null +++ b/main.py @@ -0,0 +1,107 @@ +"""Macros module for the Qualytics User Guide (Zensical `macros` extension). + +Zensical does not provide an equivalent of `mkdocs-include-markdown-plugin`, so +the reusable documentation snippets that used to be pulled in with +`{% include-markdown ... %}` are exposed here as macros instead. Pages call them +as Jinja expressions, e.g. `{{ general_props('all-props') }}`, and the returned +Markdown is injected before the Markdown parser runs (the macros extension is a +preprocessor). See https://zensical.org/ for the macros module contract. + +The source snippets live in the top-level `components/` directory (moved out of +`docs/` so Zensical does not build them as standalone pages — this replaces the +old `mkdocs-exclude` globs). + +Note: function output is NOT re-evaluated as Jinja, so literal tokens such as +`{{_qualytics_self}}` inside `filter-guide.md` are emitted verbatim. +""" + +from __future__ import annotations + +import re +from pathlib import Path + +# Snippets live in /components, alongside this module. +_COMPONENTS = Path(__file__).resolve().parent / "components" + +# Matches a nested `{% include-markdown "components/general-props/filter-guide.md" %}` +# directive inside general-props/index.md, regardless of surrounding whitespace. +_NESTED_FILTER_GUIDE = re.compile( + r"\{%\s*include-markdown\s+" + r"\"components/general-props/filter-guide\.md\"\s*%\}" +) + + +def _read(rel_path: str) -> str: + """Return the contents of a component file (relative to components/).""" + return (_COMPONENTS / rel_path).read_text(encoding="utf-8") + + +def _between(text: str, start_marker: str, end_marker: str) -> str: + """Return the text strictly between two marker strings. + + Mirrors mkdocs-include-markdown-plugin's `start`/`end` behavior: the markers + themselves are excluded and surrounding blank lines are trimmed. + """ + try: + body = text.split(start_marker, 1)[1].split(end_marker, 1)[0] + except IndexError as exc: # pragma: no cover - guards against typos + raise ValueError( + f"Marker pair not found: {start_marker!r} .. {end_marker!r}" + ) from exc + return body.strip("\n") + + +def define_env(env) -> None: + """Register documentation snippet macros with the Zensical macros env.""" + + @env.macro + def filter_guide() -> str: + """Spark SQL filter usage guide (components/general-props/filter-guide.md).""" + return _read("general-props/filter-guide.md").strip("\n") + + @env.macro + def comparators(which: str = "index") -> str: + """Comparator snippet: 'index', 'numeric', 'duration', or 'string'.""" + return _read(f"comparators/{which}.md").strip("\n") + + @env.macro + def general_props(which: str) -> str: + """General Properties table: 'all-props', 'filter-only', 'coverage-only', 'none-props'. + + The 'all-props' and 'filter-only' sections embed the Filter Guide, which + is resolved here so the macro output matches the old include-markdown + recursive behavior. + """ + section = _between( + _read("general-props/index.md"), + f"", + f"", + ) + return _NESTED_FILTER_GUIDE.sub(lambda _m: filter_guide(), section) + + @env.macro + def anomaly_support(which: str) -> str: + """Anomaly support table: 'all-types', 'record-only', or 'shape-only'.""" + return _between( + _read("anomaly-support/index.md"), + f"", + f"", + ) + + @env.macro + def fuzzy_search() -> str: + """Fuzzy-search/typo-tolerance info admonition.""" + return _between( + _read("general-props/typos.md"), + "", + "", + ) + + @env.macro + def spacing_warning() -> str: + """Leading/trailing whitespace warning admonition.""" + return _between( + _read("general-props/warning.md"), + "", + "", + ) diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 649473ca96..0000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,1272 +0,0 @@ -site_name: User Guide -## DEPLOYMENT URL -site_url: https://userguide.qualytics.io/ -## LOCAL URL -# site_url: http://localhost:8001/userguide/ -site_description: User Guide for the Qualytics data quality platform -site_author: Qualytics Team - -repo_url: https://github.com/Qualytics/userguide -repo_name: GitHub -edit_uri: edit/main/docs/ -copyright: Copyright © 2026 Qualytics - -validation: - nav: - omitted_files: info - not_found: warn - absolute_links: warn - links: - not_found: warn - anchors: warn - absolute_links: relative_to_docs - unrecognized_links: warn - -# Page tree -nav: - - Introduction: index.md - # new page tree structure start - - Using the Platform: - - using-the-platform/onboarding.md - - using-the-platform/quick-start-guide.md - - glossary.md - - using-the-platform/printing.md - - Web Application: - - Overview: using-the-platform/web-app/overview.md - - App Navigation: using-the-platform/web-app/app-navigation.md - - Top Right Side Menu: - - Getting Started: using-the-platform/web-app/top-right-menu/getting-started.md - - Add-ons: using-the-platform/web-app/top-right-menu/add-ons.md - - In-App Notifications: - - Introduction: using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md - - How-tos: - - Navigate: using-the-platform/web-app/top-right-menu/in-app-notifications/how-tos/navigate.md - - Mark as Read: using-the-platform/web-app/top-right-menu/in-app-notifications/how-tos/mark-as-read.md - - Bulk Mark as Read: using-the-platform/web-app/top-right-menu/in-app-notifications/how-tos/bulk-mark-as-read.md - - FAQ: using-the-platform/web-app/top-right-menu/in-app-notifications/faq.md - - API: using-the-platform/web-app/top-right-menu/in-app-notifications/api.md - - Discover: using-the-platform/web-app/top-right-menu/discover.md - - Theme: using-the-platform/web-app/top-right-menu/theme.md - - View Mode: using-the-platform/web-app/top-right-menu/view-mode.md - - Product Updates: using-the-platform/web-app/top-right-menu/product-updates.md - - User Profile: - - Introduction: using-the-platform/web-app/top-right-menu/user-profile/introduction.md - - Profile: using-the-platform/web-app/top-right-menu/user-profile/profile.md - - Team Restriction: using-the-platform/web-app/top-right-menu/user-profile/team-restriction.md - - Global Search: - - Getting Started: using-the-platform/web-app/global-search/getting-started.md - - Command Palette: using-the-platform/web-app/global-search/command-palette.md - - Keyboard Shortcuts: using-the-platform/web-app/global-search/keyboard-shortcuts.md - - Source Datastores: - - Overview: source-datastore/overview.md - - Datastore: - - Getting Started: source-datastore/datastore/overview-of-a-datastore.md - - JDBC: - - Introduction: source-datastore/datastore/jdbc/overview-of-a-jdbc-datastore.md - - Athena: - - Athena Connector: source-datastore/datastore/jdbc/athena/athena-connector.md - - Permissions: source-datastore/datastore/jdbc/athena/permissions.md - - Authentication: source-datastore/datastore/jdbc/athena/authentication.md - - Troubleshooting: source-datastore/datastore/jdbc/athena/troubleshooting.md - - Managing: - - Add Source Datastore: source-datastore/datastore/jdbc/athena/managing/add-source.md - - Create via API: source-datastore/datastore/jdbc/athena/managing/api.md - - source-datastore/datastore/jdbc/bigquery.md - - source-datastore/datastore/jdbc/databricks.md - - source-datastore/datastore/jdbc/db2.md - - source-datastore/datastore/jdbc/dremio.md - - source-datastore/datastore/jdbc/fabric-analytics.md - - source-datastore/datastore/jdbc/hive.md - - source-datastore/datastore/jdbc/maria-db.md - - source-datastore/datastore/jdbc/microsoft-sql-server.md - - source-datastore/datastore/jdbc/mysql.md - - source-datastore/datastore/jdbc/oracle.md - - source-datastore/datastore/jdbc/postgresql.md - - source-datastore/datastore/jdbc/presto.md - - source-datastore/datastore/jdbc/redshift.md - - SAP HANA: - - SAP HANA Connector: source-datastore/datastore/jdbc/sap-hana/sap-hana-connector.md - - Permissions: source-datastore/datastore/jdbc/sap-hana/permissions.md - - Authentication: source-datastore/datastore/jdbc/sap-hana/authentication.md - - Troubleshooting: source-datastore/datastore/jdbc/sap-hana/troubleshooting.md - - How-tos: - - Add Source Datastore: source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md - - Create via API: source-datastore/datastore/jdbc/sap-hana/how-tos/api.md - - source-datastore/datastore/jdbc/snowflake.md - - source-datastore/datastore/jdbc/synapse.md - - source-datastore/datastore/jdbc/teradata.md - - source-datastore/datastore/jdbc/timescale-db.md - - source-datastore/datastore/jdbc/trino.md - - DFS: - - Introduction: source-datastore/datastore/dfs/overview-of-a-dfs-datastore.md - - Deep Dive: - - Supported File Formats: source-datastore/datastore/dfs/deep-dive/dfs-supported-file-formats.md - - Filename Globbing: source-datastore/datastore/dfs/deep-dive/dfs-filename-globbing.md - - source-datastore/datastore/dfs/amazon-s3.md - - source-datastore/datastore/dfs/azure-datalake-storage.md - - source-datastore/datastore/dfs/google-cloud-storage.md - - Connection: - - Introduction: source-datastore/datastore/connection/introduction.md - - How It Works: source-datastore/datastore/connection/how-it-works.md - - Available Connectors: source-datastore/datastore/connection/available-datastore-connectors.md - - Multiple-Schema: - - Introduction: source-datastore/datastore/multi-schema/overview.md - - How It Works: source-datastore/datastore/multi-schema/how-it-works.md - - Supported Connectors: source-datastore/datastore/multi-schema/supported-connectors.md - - Permissions: source-datastore/datastore/multi-schema/permissions.md - - FAQ: source-datastore/datastore/multi-schema/faq.md - - How-tos: - - Add Source Datastore: source-datastore/datastore/how-tos/add-new-source-datastore.md - - Add Datastore with existing connection: source-datastore/datastore/how-tos/existing-connection.md - - Edit Datastore: source-datastore/datastore/how-tos/edit-datastore.md - - Delete Datastore: source-datastore/datastore/how-tos/delete-datastore.md - - API: source-datastore/datastore/api.md - - FAQ: source-datastore/datastore/faq.md - - Enrichment Datastore: - - Getting Started: source-datastore/enrichment-datastore/getting-started.md - - Deep Dive: - - Introduction: source-datastore/enrichment-datastore/deep-dive/introduction.md - - Permissions: source-datastore/enrichment-datastore/deep-dive/permissions.md - - How-tos: - - Link Enrichment Datastore: source-datastore/enrichment-datastore/how-tos/link-enrichment.md - - Link on Datastore Creation: source-datastore/enrichment-datastore/how-tos/link-during-creation.md - - Unlink Enrichment Datastore: source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md - - API: source-datastore/enrichment-datastore/api.md - - FAQ: source-datastore/enrichment-datastore/faq.md - - Data Quality Score: - - Getting Started: source-datastore/data-quality-score/getting-started.md - - Deep Dive: - - Introduction: source-datastore/data-quality-score/deep-dive/introduction.md - - Permissions: source-datastore/data-quality-score/deep-dive/permissions.md - - How-tos: - - Settings: source-datastore/data-quality-score/how-tos/quality-score-settings.md - - API: source-datastore/data-quality-score/api.md - - FAQ: source-datastore/data-quality-score/faq.md - - Grouping: - - Getting Started: source-datastore/grouping/getting-started.md - - Deep Dive: - - Introduction: source-datastore/grouping/deep-dive/introduction.md - - Permissions: source-datastore/grouping/deep-dive/permissions.md - - How-tos: - - Create a Group: source-datastore/grouping/how-tos/create-a-group.md - - Edit a Group: source-datastore/grouping/how-tos/edit-a-group.md - - Delete a Group: source-datastore/grouping/how-tos/delete-a-group.md - - Assign a Group: source-datastore/grouping/how-tos/assign-a-datastore.md - - Unassign a Group: source-datastore/grouping/how-tos/unassign-a-datastore.md - - Filter by Group: source-datastore/grouping/how-tos/filter-by-group.md - - API: source-datastore/grouping/api.md - - FAQ: source-datastore/grouping/faq.md - - Tags: - - Getting Started: source-datastore/tags/getting-started.md - - Deep Dive: - - Introduction: source-datastore/tags/deep-dive/introduction.md - - Permissions: source-datastore/tags/deep-dive/permissions.md - - How-tos: - - Assign a Tag: source-datastore/tags/how-tos/assign-tags.md - - Unassign a Tag: source-datastore/tags/how-tos/unassign-tags.md - - API: source-datastore/tags/api.md - - FAQ: source-datastore/tags/faq.md - - Tips & Tricks: - - Right Click Options: source-datastore/tips-and-tricks/right-click-options.md - - Keyboard Shortcuts: source-datastore/tips-and-tricks/keyboard-shortcuts.md - - Enrichment Datastores: - - Overview: enrichment/overview-of-an-enrichment-datastore.md - - Table Types: - - Overview: enrichment/table-types.md - - Enrichment Tables: enrichment/enrichment-tables.md - - Remediation Tables: enrichment/remediation-tables.md - - Metadata Tables: enrichment/metadata-tables.md - - API Payload Examples: enrichment/api-payload-examples.md - - Schema Changelog: enrichment/schema-changelog.md - - Data Preview: enrichment/enrichment-datastore-preview.md - - Supported Enrichment Datastores: enrichment-support/supported-enrichment-datastores.md - - Manage Enrichment: - - Enrichment Actions: enrichment/enrichment-actions.md - - Add Enrichment: enrichment/enrichment-datastore-creation.md - - Edit Enrichment: enrichment/edit-enrichment.md - - Delete Enrichment: enrichment/delete-enrichment.md - - Containers: - - Overview: container/overview.md - - Container Types: container/container-types.md - - Container Attributes: container/container-attributes.md - - Actions on Container: container/actions-on-container.md - - Manage Tables and Files: - - Settings For JDBC Table: container/manage-tables-and-files/setting-for-jdbc-table.md - - Settings For DFS Files Pattern: container/manage-tables-and-files/setting-for-dfs-files-pattern.md - - Identifiers: container/settings/identifiers.md - - Grouping: container/settings/grouping.md - - General: container/settings/general.md - - Add Checks: container/manage-tables-and-files/add-checks.md - - Run: container/manage-tables-and-files/run.md - - Observability Settings: container/manage-tables-and-files/observability-settings.md - - Export: container/manage-tables-and-files/export.md - - Materialize: container/manage-tables-and-files/materialize.md - - Delete: container/manage-tables-and-files/delete.md - - Mark Tables & Files as Favorite: container/manage-tables-and-files/mark-tables-&-files-as-favorite.md - - Complex Data Types: container/complex-data-types.md - - Computed Tables and Files: - - Overview: container/computed-tables-and-files/overview.md - - Computed Tables: container/computed-tables-and-files/computed-tables.md - - Computed Files: container/computed-tables-and-files/computed-files.md - - Computed Table VS File: container/computed-tables-and-files/computed-table-vs-file.md - - Computed Join: container/computed-join.md - - Data Preview: container/data-preview.md - - Lineage: - - Getting Started: container/lineage/getting-started.md - - Deep Dive: - - Introduction: container/lineage/deep-dive/introduction.md - - How Lineage Works: container/lineage/deep-dive/how-lineage-works.md - - Lineage Sources: container/lineage/deep-dive/lineage-sources.md - - Reading the Graph: container/lineage/deep-dive/reading-the-graph.md - - Field-level Lineage: container/lineage/deep-dive/field-level-lineage.md - - How-tos: - - Add an Upstream Connection: container/lineage/how-tos/add-upstream-connection.md - - Add a Downstream Connection: container/lineage/how-tos/add-downstream-connection.md - - Delete an Edge: container/lineage/how-tos/delete-an-edge.md - - Expand the Graph: container/lineage/how-tos/expand-the-graph.md - - Focus on a Field: container/lineage/how-tos/focus-on-a-field.md - - Use the Toolbar: container/lineage/how-tos/use-the-toolbar.md - - View Anomalies: container/lineage/how-tos/view-anomalies.md - - API: container/lineage/api.md - - FAQ: container/lineage/faq.md - - Fields: - - Overview: fields/field-profiles.md - - Status: - - Getting Started: fields/field-status/overview.md - - Deep Dive: - - Introduction: fields/field-status/concepts/understanding-field-status.md - - Status Types: fields/field-status/concepts/field-status-types.md - - Lifecycle: fields/field-status/concepts/field-status-lifecycle.md - - Field Masking: fields/field-status/concepts/field-masking.md - - Merge Fields: fields/field-status/concepts/merge-fields.md - - Managing: - - Filtering by Status: fields/field-status/managing-field-status/filtering-by-status.md - - Mask a Field: fields/field-status/managing-field-status/mask-a-field.md - - Unmask a Field: fields/field-status/managing-field-status/unmask-a-field.md - - Audit Log: fields/field-status/managing-field-status/masking-audit-log.md - - Exclude a Field: fields/field-status/managing-field-status/exclude-a-field.md - - Restore a Field: fields/field-status/managing-field-status/restore-a-field.md - - Delete a Field: fields/field-status/managing-field-status/delete-a-field.md - - Merge Fields: fields/field-status/managing-field-status/merge-fields.md - - API: fields/field-status/concepts/field-status-api.md - - FAQ: fields/field-status/concepts/field-status-faq.md - - Computed Fields: - - Overview: fields/computed-fields/overview.md - - Transformation Types: fields/computed-fields/transformation-types.md - - Computed Fields Details: fields/computed-fields/computed-fields-details.md - - Add Computed Fields: fields/computed-fields/add-computed-fields.md - - Operations: - - Sync: - - Sync: operations/sync/sync.md - - Profile: - - Profile: operations/profile/profile.md - - Scan: - - Scan: operations/scan/scan.md - - External Scan: - - External Scan: operations/external-scan/external-scan.md - - Export Operation: - - Export Operation: operations/export-operation/export-operation.md - - Materialize Operation: - - Materialize Operation: operations/materialize-operation/materialize-operation.md - - Promote: - - Overview: operations/promote/overview.md - - Deep Dive: - - Getting Started: operations/promote/deep-dive/getting-started.md - - Promote Types: operations/promote/deep-dive/promote-types.md - - Entity Matching: operations/promote/deep-dive/entity-matching.md - - Permissions: operations/promote/deep-dive/permissions.md - - Use Cases: operations/promote/deep-dive/use-cases.md - - Managing Promotions: - - Promote Quality Checks: operations/promote/managing-promotions/promote-quality-checks.md - - Promote Computed Fields: operations/promote/managing-promotions/promote-computed-fields.md - - Promote Computed Tables: operations/promote/managing-promotions/promote-computed-tables.md - - Promote Computed Files: operations/promote/managing-promotions/promote-computed-files.md - - View Promotion Results: operations/promote/managing-promotions/view-promotion-results.md - - API: operations/promote/api.md - - FAQ: operations/promote/faq.md - - Weight: - - Weight Mechanism: weight/weighting.md - - Data Quality Checks: - - Overview: data-quality-checks/overview-of-a-check.md - - Authored: data-quality-checks/authored-check.md - - AI Managed: - - Getting Started: data-quality-checks/ai-managed/getting-started.md - - Deep Dive: - - Introduction: data-quality-checks/ai-managed/introduction.md - - How AI Managed Checks Work: data-quality-checks/ai-managed/how-ai-managed-checks-work.md - - AI Managed Checks in Practice: data-quality-checks/ai-managed/in-practice.md - - Permissions: data-quality-checks/ai-managed/permissions.md - - Managing: - - Edit an AI Managed Check: data-quality-checks/ai-managed/edit.md - - API: data-quality-checks/ai-managed/api.md - - FAQ: data-quality-checks/ai-managed/faq.md - - Rule Types: - - Rule Types Overview: data-quality-checks/rule-types-overview.md - - After Date Time: data-quality-checks/after-date-check.md - - Aggregation Comparison: data-quality-checks/aggregation-comparison-check.md - - Any Not Null: data-quality-checks/any-not-null-check.md - - Before Date Time: data-quality-checks/before-date-time-check.md - - Between: data-quality-checks/between-check.md - - Between Times: data-quality-checks/between-times-check.md - - Contains Credit Card: data-quality-checks/contains-credit-card-check.md - - Contains Email: data-quality-checks/contains-email-check.md - - Contains Social Security Number: data-quality-checks/contains-social-security-number-check.md - - Contains Url: data-quality-checks/contains-url.md - - Data Diff: data-quality-checks/data-diff-check.md - - Distinct Count: data-quality-checks/distinct-count-check.md - - Entity Resolution: data-quality-checks/entity-resolution.md - - Equal to: data-quality-checks/equal-to-check.md - - Equal to Field: data-quality-checks/equal-to-field-check.md - - Exists In: data-quality-checks/exists-in-check.md - - Expected Schema: data-quality-checks/expected-schema-check.md - - Expected Values: data-quality-checks/expected-values-check.md - - Field Count: data-quality-checks/field-count-check.md - - Freshness Checks: data-quality-checks/freshness-check.md - - Greater Than: data-quality-checks/greater-than-check.md - - Greater Than Field: data-quality-checks/greater-than-field-check.md - - Is Address: data-quality-checks/is-address.md - - Is Credit Card: data-quality-checks/is-credit-card-check.md - - Is Replica Of: data-quality-checks/is-replica-of-check.md - - Is Type: data-quality-checks/is-type-check.md - - Less Than: data-quality-checks/less-than-check.md - - Less Than Field: data-quality-checks/less-than-field-check.md - - Matches Pattern: data-quality-checks/matches-pattern-check.md - - Max Length: data-quality-checks/max-length-check.md - - Max Partition Size: data-quality-checks/max-partition-size-check.md - - Max Value: data-quality-checks/max-value-check.md - - Metric: data-quality-checks/metric-check.md - - Min Length: data-quality-checks/min-length-check.md - - Min Partition Size: data-quality-checks/min-partition-size-check.md - - Min Value: data-quality-checks/min-value-check.md - - Not Exists In: data-quality-checks/not-exists-in-check.md - - Not Future: data-quality-checks/not-future-check.md - - Not Negative: data-quality-checks/not-negative-check.md - - Not Null: data-quality-checks/not-null-check.md - - Positive: data-quality-checks/positive-check.md - - Predicted By: data-quality-checks/predicted-by-check.md - - Required Values: data-quality-checks/required-values-check.md - - Satisfies Expression: data-quality-checks/satisfies-expression-check.md - - Sum: data-quality-checks/sum-check.md - - Time Distribution Size: data-quality-checks/time-distribution-size-check.md - - Unique: - - Introduction: data-quality-checks/unique/introduction.md - - How It Works: data-quality-checks/unique/how-it-works.md - # TODO: re-enable once how-to-create screenshots are added back - # - How to Create: data-quality-checks/unique/how-to-create.md - - Examples: data-quality-checks/unique/examples.md - - API: data-quality-checks/unique/api.md - - FAQ: data-quality-checks/unique/faq.md - - Volumetric Checks: data-quality-checks/volumetric-check.md - - Check Templates: data-quality-checks/checks-template.md - - Apply Check Template for Quality Check: data-quality-checks/apply-check-template-for-quality-checks.md - - Export Check Templates: data-quality-checks/export-check-templates.md - - Datastore Checks: - - Checks : datastore-checks/checks-datastore.md - - Manage Checks : - - Overview : datastore-checks/overview.md - - Draft Checks : datastore-checks/draft-checks.md - - Activate Draft Check : datastore-checks/activate-draft-check.md - - Archive Checks : datastore-checks/archive-check.md - - Activate Archived Checks : datastore-checks/activate-archived-checks.md - - Draft Archived Checks : datastore-checks/draft-archived-checks.md - - Restore Archived Checks : datastore-checks/restore-archived-checks.md - - Edit Checks : datastore-checks/edit-checks.md - - Delete Checks : datastore-checks/delete-checks.md - - Dry Run : datastore-checks/dry-run.md - - Clone Check : datastore-checks/clone-check.md - - Quality Check Template : datastore-checks/quality-check-template.md - - Mark Check Favorite : datastore-checks/check-favorite.md - - Filter and Sort : datastore-checks/filter-and-sort.md - - Quality Check Migration : datastore-checks/quality-check-migration.md - - Observability: - - Overview: observability/observability.md - - Observability Categories: - - Measures: observability/measures.md - - Metric: observability/metric-check.md - - Volumetric: observability/volumetric.md - - Freshness: observability/freshness.md - - Manage Observability: - - Overview: observability/manage-observability.md - - Edit Check: observability/edit-check.md - - Edit Threshold: observability/edit-threshold.md - - Edit Maximum Age: observability/edit-maximum-age.md - - Mark Check as Favorite: observability/mark-check.md - - 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 - - Explore: - - Overview: explore/overview-of-explore.md - - Insights: explore/insights.md - - Activity: explore/activity.md - - Profiles: explore/profiles.md - - Observability: explore/observability.md - - Checks: explore/checks.md - - Anomalies: explore/anomalies.md - - Flows: - - Overview: flows/overview.md - - Add Flow: flows/add-flow.md - - Flow Entry: flows/flow-entry.md - - Trigger Node: flows/trigger-node.md - - Actions Node: - - Overview: flows/actions-node/overview-action.md - - Operations: flows/actions-node/operations.md - - Anomaly: - - Introduction: flows/actions-node/anomaly/introduction.md - - Archive: flows/actions-node/anomaly/archive-anomaly-action.md - - Delete: flows/actions-node/anomaly/delete-anomaly-action.md - - Notifications: - - Overview: flows/actions-node/notifications/overview.md - - Message Variables: flows/actions-node/notifications/message-variables.md - - In App: - - Overview: flows/actions-node/notifications/in-app/overview.md - - API: flows/actions-node/notifications/in-app/api.md - - FAQ: flows/actions-node/notifications/in-app/faq.md - - Email: - - Overview: flows/actions-node/notifications/email/overview.md - - API: flows/actions-node/notifications/email/api.md - - FAQ: flows/actions-node/notifications/email/faq.md - - Slack: - - Overview: flows/actions-node/notifications/slack/overview.md - - API: flows/actions-node/notifications/slack/api.md - - FAQ: flows/actions-node/notifications/slack/faq.md - - Microsoft Teams: - - Overview: flows/actions-node/notifications/microsoft-teams/overview.md - - API: flows/actions-node/notifications/microsoft-teams/api.md - - FAQ: flows/actions-node/notifications/microsoft-teams/faq.md - - PagerDuty: - - Overview: flows/actions-node/notifications/pagerduty/overview.md - - API: flows/actions-node/notifications/pagerduty/api.md - - FAQ: flows/actions-node/notifications/pagerduty/faq.md - - FAQ: flows/actions-node/notifications/faq.md - - Workflow: flows/actions-node/workflow.md - - Ticketing: flows/actions-node/ticketing.md - - View and Track Flow Executions: flows/view-created-flows.md - - Manage Flow: - - Clone a Flows: flows/clone-a-flow.md - - Execute Manual Flow: flows/execute-manual-flows.md - - Abort Flow: flows/abort.md - - Sort Flow: flows/sort-flow.md - - Edit Flow: flows/edit-flow.md - - Delete Flow: flows/delete-flow.md - - Deactivate Flow: flows/deactivate-flow.md - - Activate Flows: flows/activate-flow.md - - Clone An Action: flows/clone-an-action.md - - Move An Action Node: flows/move-an-action-node.md - - Tags: - - Overview: tags/overview.md - - External Tags: tags/external-tag.md - - Manage Tags: - - Add Tag: tags/add-tag.md - - Applying Tag: tags/applying-a-tag.md - - Edit Tag: tags/edit-tag.md - - Filter and Sort: tags/filter-and-sort.md - - Delete Tag: tags/delete-tag.md - - Agent Q: - - Overview: agent-q/overview.md - - Deep Dive: - - MCP: agent-q/deep-dive/mcp.md - - Agent Q in Action: agent-q/deep-dive/in-action.md - - Conversations, Responses & Context: agent-q/deep-dive/conversations.md - - Best Practices: agent-q/deep-dive/best-practices.md - - Agent Q Limits: agent-q/deep-dive/limits.md - - Agentic API: agent-q/deep-dive/agentic.md - - Managing: - - Connecting External AI Clients: agent-q/managing/connecting-external-ai-clients.md - - Add Integration: agent-q/managing/add-integration.md - - Update Integration: agent-q/managing/update-integration.md - - Remove Integration: agent-q/managing/remove-integration.md - - Start a New Conversation: agent-q/managing/start-a-new-conversation.md - - Resume a Conversation: agent-q/managing/resume-a-conversation.md - - Rename a Conversation: agent-q/managing/rename-a-conversation.md - - Archive a Conversation: agent-q/managing/archive-a-conversation.md - - Restore a Conversation: agent-q/managing/restore-a-conversation.md - - Delete a Conversation: agent-q/managing/delete-a-conversation.md - - Search Conversations: agent-q/managing/search-conversations.md - - Chat Interface Tips: agent-q/managing/chat-interface-tips.md - - API: agent-q/api.md - - FAQ: agent-q/faq.md - - Settings: - - Overview: settings/overview.md - - Connections: settings/connections/manage-connections.md - - Integrations: - - Overview: settings/integrations/overview.md - - Single Sign-On: settings/integrations/sso/sso.md - - Compute: settings/integrations/compute/compute.md - - Workflow: settings/integrations/workflow/workflow.md - - Analytics: settings/integrations/analytics/analytics.md - - Data Catalogs: - - Overview: settings/integrations/data-catalogs/overview.md - - Atlan: settings/integrations/data-catalogs/atlan.md - - Alation: settings/integrations/data-catalogs/alation.md - - Microsoft Purview: settings/integrations/data-catalogs/microsoft-purview.md - - Collibra: settings/integrations/data-catalogs/collibra.md - - DataHub: settings/integrations/data-catalogs/datahub.md - - External Tag Propagation: settings/integrations/data-catalogs/external-tag-propagation.md - - Display Names and Descriptions: settings/integrations/data-catalogs/display-names-and-descriptions.md - - Alerting: - - Overview: settings/integrations/alerting/overview.md - - Slack: settings/integrations/alerting/slack.md - - Microsoft Teams: settings/integrations/alerting/msft_teams.md - - PagerDuty: - - Overview: settings/integrations/alerting/pagerduty/overview.md - - Deep Dive: settings/integrations/alerting/pagerduty/deep-dive.md - - API: settings/integrations/alerting/pagerduty/pagerduty-api.md - - FAQ: settings/integrations/alerting/pagerduty/pagerduty-faq.md - - Managing PagerDuty: - - Add Integration: settings/integrations/alerting/pagerduty/managing-pagerduty/add-integration.md - - Edit Integration: settings/integrations/alerting/pagerduty/managing-pagerduty/edit-integration.md - - Remove Integration: settings/integrations/alerting/pagerduty/managing-pagerduty/remove-integration.md - - Ticketing: - - Overview: settings/integrations/ticketing/ticketing.md - - Jira: - - Introduction: settings/integrations/ticketing/jira/introduction.md - - Deep Dive: - - How It Works: settings/integrations/ticketing/jira/deep-dive/how-it-works.md - - Permissions: settings/integrations/ticketing/jira/deep-dive/permissions.md - - Managing: - - Configure Jira: settings/integrations/ticketing/jira/managing/configure-jira.md - - Add Connection: settings/integrations/ticketing/jira/managing/add-connection.md - - Edit Connection: settings/integrations/ticketing/jira/managing/edit-connection.md - - Unlink Connection: settings/integrations/ticketing/jira/managing/unlink-connection.md - - Create Ticket: settings/integrations/ticketing/jira/managing/create-ticket.md - - Link Existing Ticket: settings/integrations/ticketing/jira/managing/link-existing-ticket.md - - Unlink Ticket: settings/integrations/ticketing/jira/managing/unlink-ticket.md - - Tips & Tricks: settings/integrations/ticketing/jira/managing/tips-and-tricks.md - - FAQ: settings/integrations/ticketing/jira/faq.md - - ServiceNow: - - Introduction: settings/integrations/ticketing/servicenow/introduction.md - - Deep Dive: - - How It Works: settings/integrations/ticketing/servicenow/deep-dive/how-it-works.md - - Permissions: settings/integrations/ticketing/servicenow/deep-dive/permissions.md - - Managing: - - Configure ServiceNow: settings/integrations/ticketing/servicenow/managing/configure-servicenow.md - - Add Connection: settings/integrations/ticketing/servicenow/managing/add-connection.md - - Edit Connection: settings/integrations/ticketing/servicenow/managing/edit-connection.md - - Unlink Connection: settings/integrations/ticketing/servicenow/managing/unlink-connection.md - - Create Ticket: settings/integrations/ticketing/servicenow/managing/create-ticket.md - - Link Existing Ticket: settings/integrations/ticketing/servicenow/managing/link-existing-ticket.md - - Unlink Ticket: settings/integrations/ticketing/servicenow/managing/unlink-ticket.md - - Find ServiceNow Values: settings/integrations/ticketing/servicenow/managing/find-servicenow-values.md - - Tips & Tricks: settings/integrations/ticketing/servicenow/managing/tips-and-tricks.md - - FAQ: settings/integrations/ticketing/servicenow/faq.md - - Security: - - Getting Started: settings/security/overview.md - - Users: - - Introduction: settings/security/users/introduction.md - - Deep Dive: - - How It Works: settings/security/users/how-it-works.md - - Permissions: settings/security/users/permissions.md - - Best Practices: settings/security/users/best-practices.md - - User Roles: - - How It Works: settings/security/users/roles/overview.md - - Admin: settings/security/users/roles/admin.md - - Manager: settings/security/users/roles/manager.md - - Member: settings/security/users/roles/member.md - - Managing: - # TODO: re-enable Add User once user provisioning behavior is verified with engineering - # - Add User: settings/security/users/managing/add-user.md - - Edit User: settings/security/users/managing/edit-user.md - - Deactivate User: settings/security/users/managing/deactivate-user.md - - Reactivate User: settings/security/users/managing/reactivate-user.md - - Sort Users: settings/security/users/managing/sort-users.md - - Filter Users: settings/security/users/managing/filter-users.md - - List Columns: settings/security/users/managing/list-columns.md - - API: settings/security/users/api.md - - FAQ: settings/security/users/faq.md - - Teams: - - Introduction: settings/security/teams/introduction.md - - Deep Dive: - - How It Works: settings/security/teams/how-it-works.md - - Best Practices: settings/security/teams/best-practices.md - - Membership Strategy: settings/security/teams/membership-strategy.md - - Team Permissions: - - How It Works: settings/security/teams/team-permissions/overview.md - - Editor: settings/security/teams/team-permissions/editor.md - - Author: settings/security/teams/team-permissions/author.md - - Drafter: settings/security/teams/team-permissions/drafter.md - - Viewer: settings/security/teams/team-permissions/viewer.md - - Reporter: settings/security/teams/team-permissions/reporter.md - - Managing: - - Add Team: settings/security/teams/managing/add-team.md - - Edit Team: settings/security/teams/managing/edit-team.md - - Delete Team: settings/security/teams/managing/delete-team.md - - Sort Teams: settings/security/teams/managing/sort-teams.md - - List Columns: settings/security/teams/managing/list-columns.md - - API: settings/security/teams/api.md - - FAQ: settings/security/teams/faq.md - - Service Users: - - Introduction: settings/security/service-users/introduction.md - - Deep Dive: - - How It Works: settings/security/service-users/deep-dive/how-it-works.md - - Permissions: settings/security/service-users/deep-dive/permissions.md - - Best Practices: settings/security/service-users/deep-dive/best-practices.md - - Managing: - - Create Service User: settings/security/service-users/managing/create-service-user.md - - Edit Service User: settings/security/service-users/managing/edit-service-user.md - - Deactivate Service User: settings/security/service-users/managing/deactivate-service-user.md - - Reactivate Service User: settings/security/service-users/managing/reactivate-service-user.md - - Generate Token: settings/security/service-users/managing/generate-token.md - - Sort Service Users: settings/security/users/managing/sort-users.md - - Filter Service Users: settings/security/users/managing/filter-users.md - - List Columns: settings/security/users/managing/list-columns.md - - API: settings/security/service-users/api.md - - FAQ: settings/security/service-users/faq.md - - Access Tokens: - - Getting Started: settings/access-tokens/getting-started.md - - Personal Token: - - Introduction: settings/access-tokens/personal-token/introduction.md - - Deep Dive: - - How It Works: settings/access-tokens/personal-token/deep-dive/how-it-works.md - - Permissions: settings/access-tokens/personal-token/deep-dive/permissions.md - - Best Practices: settings/access-tokens/personal-token/deep-dive/best-practices.md - - Managing: - - Generate Token: settings/access-tokens/personal-token/managing/generate-token.md - - Revoke Token: settings/access-tokens/personal-token/managing/revoke-token.md - - Restore Token: settings/access-tokens/personal-token/managing/restore-token.md - - Delete Token: settings/access-tokens/personal-token/managing/delete-token.md - - List Columns: settings/access-tokens/personal-token/managing/list-columns.md - - API: settings/access-tokens/personal-token/api.md - - FAQ: settings/access-tokens/personal-token/faq.md - - Service Token: - - Introduction: settings/access-tokens/service-token/introduction.md - - Deep Dive: - - How It Works: settings/access-tokens/service-token/deep-dive/how-it-works.md - - Permissions: settings/access-tokens/service-token/deep-dive/permissions.md - - Best Practices: settings/access-tokens/service-token/deep-dive/best-practices.md - - Managing: - - Generate Service Token: settings/access-tokens/service-token/managing/generate-service-token.md - - Revoke Service Token: settings/access-tokens/service-token/managing/revoke-service-token.md - - Restore Service Token: settings/access-tokens/service-token/managing/restore-service-token.md - - Delete Service Token: settings/access-tokens/service-token/managing/delete-service-token.md - - List Columns: settings/access-tokens/service-token/managing/list-columns.md - - API: settings/access-tokens/service-token/api.md - - FAQ: settings/access-tokens/service-token/faq.md - - Status: - - Getting Started: settings/status/getting-started.md - - Deep Dive: - - Platform Status: settings/status/deep-dive/platform-status.md - - Private Routes: settings/status/deep-dive/private-routes.md - - Permissions: settings/status/deep-dive/permissions.md - - Managing: - - Refresh Status Summary: settings/status/managing/refresh-status-summary.md - - Restart Dataplane: settings/status/managing/restart-dataplane.md - - Copy Status Summary: settings/status/managing/copy-status-summary.md - - API: settings/status/api.md - - FAQ: settings/status/faq.md - - FAQ: - - quality-scores/what-are-quality-scores.md - - Misc: - - Deployment Options: deployments/overview.md - - Self-Hosted Deployment: - - Deployment Guide: deployments/self-hosted-deployment.md - - OIDC Authentication: deployments/oidc-configuration.md - - Auth0 Authentication: deployments/auth0-setup.md - - SMTP Configuration: deployments/smtp-configuration.md - - Databricks Deployment: deployments/databricks-deployment.md - - IAM Role Authentication: deployments/iam-role-authentication.md - - External Automation: - - Overview: operation-automation/overview.md - - Linux Machine: operation-automation/linux-machine.md - - Windows Machine: operation-automation/windows-machine.md - - Automated Setup Using Qualytics CLI: operation-automation/automated-setup-using-qualytics-cli.md - - dfs-globbing/how-dfs-filename-globbing-works.md - - glossary.md - - Managed Deployment: - - Overview: managed-deployment/overview.md - - SSO Setup: managed-deployment/sso/overview.md - - Directory Sync: - - Introduction: managed-deployment/directory-sync/introduction.md - - Supported Providers: managed-deployment/directory-sync/supported-providers.md - - Managing: - - Microsoft Entra: managed-deployment/directory-sync/managing/ms-entra.md - - Okta: managed-deployment/directory-sync/managing/okta.md - - OneLogin: managed-deployment/directory-sync/managing/onelogin.md - - JumpCloud: managed-deployment/directory-sync/managing/jumpcloud.md - - Self-Hosted: - - License: - - Getting Started: self-hosted/license/getting-started.md - - Deep Dive: - - How It Works: self-hosted/license/deep-dive/how-it-works.md - - Permissions: self-hosted/license/deep-dive/permissions.md - - Managing: - - Update License: self-hosted/license/managing/update-license.md - - Generate License Request: self-hosted/license/managing/generate-license-request.md - - API: self-hosted/license/api.md - - FAQ: self-hosted/license/faq.md - - # - glossary.md - - Qualytics CLI: - - Overview: cli/overview.md - - Setup: - - Installing Python: cli/python-installation.md - - Installing Qualytics CLI: cli/installing-qualytics-cli.md - - Authentication: cli/authentication.md - - Connections: cli/connections.md - - Datastores: cli/datastores.md - - Containers: cli/containers.md - - Quality Checks: cli/quality-checks.md - - Operations: cli/operations.md - - Anomalies: cli/anomalies.md - - Users: cli/users.md - - Teams: cli/teams.md - - Tags: cli/tags.md - - Config as Code: cli/config-as-code.md - - MCP Server: cli/mcp-server.md - - Automation & CI/CD: cli/automation.md - - Examples & Use Cases: - - cli/examples/index.md - - Datastores: - - Onboard a single datastore: cli/examples/onboard-single-datastore.md - - Bulk datastore onboarding: cli/examples/bulk-datastore-onboarding.md - - Operations: - - Daily sync, profile, and scan: cli/examples/daily-pipeline.md - - Targeted scans: cli/examples/targeted-scans.md - - Incremental scans: cli/examples/incremental-scans.md - - Quality Checks: - - Bulk-create quality checks: cli/examples/bulk-create-quality-checks.md - - Promote checks Dev to Prod: cli/examples/promote-checks-dev-prod.md - - Audit and clean up draft checks: cli/examples/audit-draft-checks.md - - Manage check templates: cli/examples/manage-check-templates.md - - Anomalies: - - Bulk anomaly triage: cli/examples/bulk-anomaly-triage.md - - Daily triage automation: cli/examples/triage-automation.md - - Computed Containers: - - Bulk import computed tables: cli/examples/bulk-import-computed-tables.md - - Build a computed join: cli/examples/build-computed-join.md - - Configuration as Code: - - Export and import full configuration: cli/examples/export-import-config.md - - Drift detection: cli/examples/drift-detection.md - - Automation: - - Scheduled metadata exports: cli/examples/scheduled-metadata-exports.md - - GitHub Actions pipelines: cli/examples/github-actions-pipelines.md - - AI Integration: - - Connect MCP clients: cli/examples/connect-mcp-clients.md - - API docs: https://demo.qualytics.io/api/docs - - Changelog: - - changelog.md - - changelog-2025.md - - changelog-2024.md - - changelog-2023.md - -extra_javascript: - - javascripts/os-detect.js - - javascripts/card-filter.js - -extra_css: - - stylesheets/extra.css - -# Configuration -theme: - palette: - # Palette toggle for light mode - # - media: "(prefers-color-scheme: light)" - - scheme: default - primary: white - toggle: - icon: material/brightness-4 - name: Switch to dark mode - - # Palette toggle for dark mode - # - media: "(prefers-color-scheme: --md-primary-fg-color--dark)" - - scheme: slate - primary: white - toggle: - icon: material/brightness-7 - name: Switch to light mode - logo: assets/logo-light.svg - favicon: assets/favicon.ico - name: material - custom_dir: overrides - font: - text: Manrope - - features: - - navigation.footer - - navigation.indexes - - navigation.instant - - navigation.path - - navigation.sections - - navigation.tabs - - navigation.top - - navigation.tracking - - content.action.edit - - content.action.view - - content.code.copy - - content.code.annotate - - content.tables.sortable # Adds horizontal scroll only to table - # - content.tabs.link - -markdown_extensions: - - pymdownx.tabbed: - slugify: !!python/object/apply:pymdownx.slugs.slugify - kwds: - case: lower - - pymdownx.tabbed: - alternate_style: true - - admonition - - pymdownx.details - - pymdownx.keys - - pymdownx.snippets - - attr_list - - md_in_html - - def_list - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - - tables - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg - -plugins: - - search - - exclude: - glob: - - components/anomaly-support/* - - components/comparators/* - - components/general-props/* - - git-revision-date-localized - - include-markdown - - macros - - redirects: - redirect_maps: - 'settings/security/users/managing/filter-users-by-team.md': 'settings/security/users/managing/filter-users.md' - 'settings/security/service-users/managing/filter-service-users.md': 'settings/security/users/managing/filter-users.md' - 'settings/security/teams/managing/description.md': 'settings/security/teams/managing/list-columns.md' - 'settings/security/teams/managing/users.md': 'settings/security/teams/managing/list-columns.md' - 'settings/security/teams/managing/source-datastores.md': 'settings/security/teams/managing/list-columns.md' - 'settings/security/teams/managing/enrichment-datastores.md': 'settings/security/teams/managing/list-columns.md' - 'settings/security/teams/managing/created.md': 'settings/security/teams/managing/list-columns.md' - 'settings/access-tokens/personal-token/managing/token-usage-status.md': 'settings/access-tokens/personal-token/managing/list-columns.md' - 'settings/access-tokens/service-token/managing/token-usage-status.md': 'settings/access-tokens/service-token/managing/list-columns.md' - 'settings/security/users/managing/teams.md': 'settings/security/users/managing/list-columns.md' - 'settings/security/users/managing/last-active.md': 'settings/security/users/managing/list-columns.md' - 'settings/security/users/managing/created.md': 'settings/security/users/managing/list-columns.md' - 'settings/integrations/ticketing/jira.md': 'settings/integrations/ticketing/jira/introduction.md' - 'settings/integrations/ticketing/jira/managing/connect-integration.md': 'settings/integrations/ticketing/jira/managing/configure-jira.md' - 'settings/integrations/ticketing/servicenow/managing/connect-integration.md': 'settings/integrations/ticketing/servicenow/managing/configure-servicenow.md' - 'settings/connections/deep-dive/how-it-works.md': 'source-datastore/datastore/connection/how-it-works.md' - 'settings/connections/managing/add-connection.md': 'source-datastore/datastore/how-tos/add-new-source-datastore.md' - 'source-datastore/add-datastores/connections/new-connection.md': 'source-datastore/datastore/how-tos/add-new-source-datastore.md' - 'source-datastore/add-datastores/connections/add-new-source-datastore.md': 'source-datastore/datastore/how-tos/add-new-source-datastore.md' - 'source-datastore/add-datastores/connections/existing-connection.md': 'source-datastore/datastore/how-tos/existing-connection.md' - # Using the Platform restructure - 'web-app.md': 'using-the-platform/web-app/overview.md' - 'keyboard-shortcuts.md': 'using-the-platform/web-app/global-search/keyboard-shortcuts.md' - 'onboarding.md': 'using-the-platform/onboarding.md' - 'quick-start-guide.md': 'using-the-platform/quick-start-guide.md' - 'printing.md': 'using-the-platform/printing.md' - 'settings/integrations/atlan.md': 'settings/integrations/data-catalogs/atlan.md' - 'settings/integrations/catalog/atlan.md': 'settings/integrations/data-catalogs/atlan.md' - 'settings/integrations/catalog/alation.md': 'settings/integrations/data-catalogs/alation.md' - 'settings/integrations/catalog/collibra.md': 'settings/integrations/data-catalogs/collibra.md' - 'settings/integrations/catalog/datahub.md': 'settings/integrations/data-catalogs/datahub.md' - 'settings/integrations/catalog/external-tag-propagation.md': 'settings/integrations/data-catalogs/external-tag-propagation.md' - 'settings/integrations/catalog/purview.md': 'settings/integrations/data-catalogs/microsoft-purview.md' - 'settings/integrations/catalog/overview.md': 'settings/integrations/data-catalogs/overview.md' - 'deployments/deployments.md': 'deployments/overview.md' - 'upgrades/qualytics-single-tenant-instance.md': 'deployments/self-hosted-deployment.md' - 'container/field-profiles.md': 'fields/field-profiles.md' - 'container/computed-fields/overview.md': 'fields/computed-fields/overview.md' - 'container/computed-fields/transformation-types.md': 'fields/computed-fields/transformation-types.md' - 'container/computed-fields/computed-fields-details.md': 'fields/computed-fields/computed-fields-details.md' - 'container/computed-fields/add-computed-fields.md': 'fields/computed-fields/add-computed-fields.md' - # Flow Anomaly actions split into Introduction / Archive / Delete - 'flows/anomaly.md': 'flows/actions-node/anomaly/introduction.md' - # Flow Actions Node pages consolidated under flows/actions-node/ - 'flows/overview-action.md': 'flows/actions-node/overview-action.md' - 'flows/operations.md': 'flows/actions-node/operations.md' - 'flows/workflow.md': 'flows/actions-node/workflow.md' - 'flows/ticketing.md': 'flows/actions-node/ticketing.md' - 'flows/notifications/overview.md': 'flows/actions-node/notifications/overview.md' - 'flows/notifications/faq.md': 'flows/actions-node/notifications/faq.md' - 'flows/notifications/message-variables.md': 'flows/actions-node/notifications/message-variables.md' - 'flows/notifications/in-app/overview.md': 'flows/actions-node/notifications/in-app/overview.md' - 'flows/notifications/in-app/api.md': 'flows/actions-node/notifications/in-app/api.md' - 'flows/notifications/in-app/faq.md': 'flows/actions-node/notifications/in-app/faq.md' - 'flows/notifications/email/overview.md': 'flows/actions-node/notifications/email/overview.md' - 'flows/notifications/email/api.md': 'flows/actions-node/notifications/email/api.md' - 'flows/notifications/email/faq.md': 'flows/actions-node/notifications/email/faq.md' - 'flows/notifications/slack/overview.md': 'flows/actions-node/notifications/slack/overview.md' - 'flows/notifications/slack/api.md': 'flows/actions-node/notifications/slack/api.md' - 'flows/notifications/slack/faq.md': 'flows/actions-node/notifications/slack/faq.md' - 'flows/notifications/microsoft-teams/overview.md': 'flows/actions-node/notifications/microsoft-teams/overview.md' - 'flows/notifications/microsoft-teams/api.md': 'flows/actions-node/notifications/microsoft-teams/api.md' - 'flows/notifications/microsoft-teams/faq.md': 'flows/actions-node/notifications/microsoft-teams/faq.md' - 'flows/notifications/pagerduty/overview.md': 'flows/actions-node/notifications/pagerduty/overview.md' - 'flows/notifications/pagerduty/api.md': 'flows/actions-node/notifications/pagerduty/api.md' - '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/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' - # Notifications restructure - 'flows/notification.md': 'flows/actions-node/notifications/overview.md' - 'flows/notification-tokens.md': 'flows/actions-node/notifications/message-variables.md' - 'flows/notifications/in-app.md': 'flows/actions-node/notifications/in-app/overview.md' - 'flows/notifications/email.md': 'flows/actions-node/notifications/email/overview.md' - 'flows/notifications/slack.md': 'flows/actions-node/notifications/slack/overview.md' - 'flows/notifications/microsoft-teams.md': 'flows/actions-node/notifications/microsoft-teams/overview.md' - 'flows/notifications/pagerduty.md': 'flows/actions-node/notifications/pagerduty/overview.md' - # Athena connector hub restructure - 'source-datastore/add-datastores/athena.md': 'source-datastore/datastore/jdbc/athena/athena-connector.md' - # Source Datastore reorganization - 'source-datastore/catalog.md': 'operations/sync/sync.md' - 'source-datastore/operations/catalog.md': 'operations/sync/sync.md' - 'source-datastore/profile.md': 'operations/profile/profile.md' - 'source-datastore/scan.md': 'operations/scan/scan.md' - 'source-datastore/external-scan.md': 'operations/external-scan/external-scan.md' - 'source-datastore/right-click-options.md': 'source-datastore/tips-and-tricks/right-click-options.md' - 'source-datastore/assign-tags.md': 'source-datastore/tags/how-tos/assign-tags.md' - 'source-datastore/settings-overview.md': 'source-datastore/datastore/how-tos/edit-datastore.md' - 'source-datastore/edit-datastore.md': 'source-datastore/datastore/how-tos/edit-datastore.md' - 'source-datastore/link-enrichment.md': 'source-datastore/enrichment-datastore/how-tos/link-enrichment.md' - 'source-datastore/unlink-enrichment.md': 'source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md' - 'source-datastore/quality-score-settings.md': 'source-datastore/data-quality-score/how-tos/quality-score-settings.md' - 'source-datastore/delete-datastore.md': 'source-datastore/datastore/how-tos/delete-datastore.md' - 'source-datastore/managing-datastores/edit-datastore.md': 'source-datastore/datastore/how-tos/edit-datastore.md' - 'source-datastore/managing-datastores/delete-datastore.md': 'source-datastore/datastore/how-tos/delete-datastore.md' - # Old paths redirect to new managing-datastores location - 'source-datastore/navigation-and-organization/right-click-options.md': 'source-datastore/tips-and-tricks/right-click-options.md' - 'source-datastore/navigation-and-organization/assign-tags.md': 'source-datastore/tags/how-tos/assign-tags.md' - 'source-datastore/managing-datastores/assign-tags.md': 'source-datastore/tags/how-tos/assign-tags.md' - 'source-datastore/datastore-settings/settings-overview.md': 'source-datastore/datastore/how-tos/edit-datastore.md' - 'source-datastore/datastore-settings/edit-datastore.md': 'source-datastore/datastore/how-tos/edit-datastore.md' - 'source-datastore/datastore-settings/link-enrichment.md': 'source-datastore/enrichment-datastore/how-tos/link-enrichment.md' - 'source-datastore/datastore-settings/unlink-enrichment.md': 'source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md' - 'source-datastore/datastore-settings/quality-score-settings.md': 'source-datastore/data-quality-score/how-tos/quality-score-settings.md' - 'source-datastore/datastore-settings/delete-datastore.md': 'source-datastore/datastore/how-tos/delete-datastore.md' - # Container Operations reorganization - 'container/enrichment-operation/export-operation.md': 'operations/export-operation/export-operation.md' - 'container/enrichment-operation/materialize-operation.md': 'operations/materialize-operation/materialize-operation.md' - # Legacy add-datastores/* root paths (pre source-datastore namespace) - 'add-datastores/overview-of-a-datastore.md': 'source-datastore/datastore/overview-of-a-datastore.md' - 'add-datastores/overview-of-a-jdbc-datastore.md': 'source-datastore/datastore/jdbc/overview-of-a-jdbc-datastore.md' - 'add-datastores/overview-of-a-dfs-datastore.md': 'source-datastore/datastore/dfs/overview-of-a-dfs-datastore.md' - 'add-datastores/athena.md': 'source-datastore/datastore/jdbc/athena/athena-connector.md' - 'add-datastores/bigquery.md': 'source-datastore/datastore/jdbc/bigquery.md' - 'add-datastores/databricks.md': 'source-datastore/datastore/jdbc/databricks.md' - 'add-datastores/db2.md': 'source-datastore/datastore/jdbc/db2.md' - 'add-datastores/fabric-analytics.md': 'source-datastore/datastore/jdbc/fabric-analytics.md' - 'add-datastores/hive.md': 'source-datastore/datastore/jdbc/hive.md' - 'add-datastores/maria-db.md': 'source-datastore/datastore/jdbc/maria-db.md' - 'add-datastores/microsoft-sql-server.md': 'source-datastore/datastore/jdbc/microsoft-sql-server.md' - 'add-datastores/mysql.md': 'source-datastore/datastore/jdbc/mysql.md' - 'add-datastores/oracle.md': 'source-datastore/datastore/jdbc/oracle.md' - 'add-datastores/postgresql.md': 'source-datastore/datastore/jdbc/postgresql.md' - 'add-datastores/presto.md': 'source-datastore/datastore/jdbc/presto.md' - 'add-datastores/redshift.md': 'source-datastore/datastore/jdbc/redshift.md' - 'add-datastores/snowflake.md': 'source-datastore/datastore/jdbc/snowflake.md' - 'add-datastores/synapse.md': 'source-datastore/datastore/jdbc/synapse.md' - 'add-datastores/teradata.md': 'source-datastore/datastore/jdbc/teradata.md' - 'add-datastores/timescale-db.md': 'source-datastore/datastore/jdbc/timescale-db.md' - 'add-datastores/trino.md': 'source-datastore/datastore/jdbc/trino.md' - 'add-datastores/dremio.md': 'source-datastore/datastore/jdbc/dremio.md' - 'add-datastores/amazon-s3.md': 'source-datastore/datastore/dfs/amazon-s3.md' - 'add-datastores/azure-datalake-storage.md': 'source-datastore/datastore/dfs/azure-datalake-storage.md' - 'add-datastores/google-cloud-storage.md': 'source-datastore/datastore/dfs/google-cloud-storage.md' - 'connections/overview-of-a-connection.md': 'source-datastore/datastore/connection/introduction.md' - 'source-datastore/add-datastores/connections/overview-of-a-connection.md': 'source-datastore/datastore/connection/introduction.md' - # Multi-schema concepts folder removed - 'source-datastore/add-datastores/multi-schema/concepts/how-it-works.md': 'source-datastore/datastore/multi-schema/how-it-works.md' - 'source-datastore/add-datastores/multi-schema/concepts/supported-connectors.md': 'source-datastore/datastore/multi-schema/supported-connectors.md' - 'source-datastore/add-datastores/multi-schema/concepts/multi-schema-permissions.md': 'source-datastore/datastore/multi-schema/permissions.md' - 'source-datastore/add-datastores/multi-schema/concepts/multi-schema-faq.md': 'source-datastore/datastore/multi-schema/faq.md' - # Source Datastore restructure (add-datastores/ → datastore/, managing-datastores/ → multiple, intermediate how-tos/ → datastore/how-tos/) - 'source-datastore/add-datastores/overview-of-a-datastore.md': 'source-datastore/datastore/overview-of-a-datastore.md' - 'source-datastore/add-datastores/overview-of-a-jdbc-datastore.md': 'source-datastore/datastore/jdbc/overview-of-a-jdbc-datastore.md' - 'source-datastore/add-datastores/overview-of-a-dfs-datastore.md': 'source-datastore/datastore/dfs/overview-of-a-dfs-datastore.md' - 'source-datastore/add-datastores/api.md': 'source-datastore/datastore/api.md' - 'source-datastore/add-datastores/faq.md': 'source-datastore/datastore/faq.md' - 'source-datastore/add-datastores/available-datastore-connectors.md': 'source-datastore/datastore/connection/available-datastore-connectors.md' - 'source-datastore/add-datastores/dfs-supported-file-formats.md': 'source-datastore/datastore/dfs/deep-dive/dfs-supported-file-formats.md' - 'source-datastore/add-datastores/dfs-filename-globbing.md': 'source-datastore/datastore/dfs/deep-dive/dfs-filename-globbing.md' - 'source-datastore/datastore/dfs/dfs-supported-file-formats.md': 'source-datastore/datastore/dfs/deep-dive/dfs-supported-file-formats.md' - 'source-datastore/datastore/dfs/dfs-filename-globbing.md': 'source-datastore/datastore/dfs/deep-dive/dfs-filename-globbing.md' - 'source-datastore/add-datastores/amazon-s3.md': 'source-datastore/datastore/dfs/amazon-s3.md' - 'source-datastore/add-datastores/azure-datalake-storage.md': 'source-datastore/datastore/dfs/azure-datalake-storage.md' - 'source-datastore/add-datastores/google-cloud-storage.md': 'source-datastore/datastore/dfs/google-cloud-storage.md' - 'source-datastore/add-datastores/bigquery.md': 'source-datastore/datastore/jdbc/bigquery.md' - 'source-datastore/add-datastores/databricks.md': 'source-datastore/datastore/jdbc/databricks.md' - 'source-datastore/add-datastores/db2.md': 'source-datastore/datastore/jdbc/db2.md' - 'source-datastore/add-datastores/dremio.md': 'source-datastore/datastore/jdbc/dremio.md' - 'source-datastore/add-datastores/fabric-analytics.md': 'source-datastore/datastore/jdbc/fabric-analytics.md' - 'source-datastore/add-datastores/hive.md': 'source-datastore/datastore/jdbc/hive.md' - 'source-datastore/add-datastores/maria-db.md': 'source-datastore/datastore/jdbc/maria-db.md' - 'source-datastore/add-datastores/microsoft-sql-server.md': 'source-datastore/datastore/jdbc/microsoft-sql-server.md' - 'source-datastore/add-datastores/mysql.md': 'source-datastore/datastore/jdbc/mysql.md' - 'source-datastore/add-datastores/oracle.md': 'source-datastore/datastore/jdbc/oracle.md' - 'source-datastore/add-datastores/postgresql.md': 'source-datastore/datastore/jdbc/postgresql.md' - 'source-datastore/add-datastores/presto.md': 'source-datastore/datastore/jdbc/presto.md' - 'source-datastore/add-datastores/redshift.md': 'source-datastore/datastore/jdbc/redshift.md' - 'source-datastore/add-datastores/snowflake.md': 'source-datastore/datastore/jdbc/snowflake.md' - 'source-datastore/add-datastores/synapse.md': 'source-datastore/datastore/jdbc/synapse.md' - 'source-datastore/add-datastores/teradata.md': 'source-datastore/datastore/jdbc/teradata.md' - 'source-datastore/add-datastores/timescale-db.md': 'source-datastore/datastore/jdbc/timescale-db.md' - 'source-datastore/add-datastores/trino.md': 'source-datastore/datastore/jdbc/trino.md' - 'source-datastore/add-datastores/athena/athena-connector.md': 'source-datastore/datastore/jdbc/athena/athena-connector.md' - 'source-datastore/add-datastores/athena/permissions.md': 'source-datastore/datastore/jdbc/athena/permissions.md' - 'source-datastore/add-datastores/athena/authentication.md': 'source-datastore/datastore/jdbc/athena/authentication.md' - 'source-datastore/add-datastores/athena/troubleshooting.md': 'source-datastore/datastore/jdbc/athena/troubleshooting.md' - 'source-datastore/add-datastores/athena/managing/add-source.md': 'source-datastore/datastore/jdbc/athena/managing/add-source.md' - 'source-datastore/add-datastores/athena/managing/api.md': 'source-datastore/datastore/jdbc/athena/managing/api.md' - 'source-datastore/add-datastores/sap-hana/sap-hana-connector.md': 'source-datastore/datastore/jdbc/sap-hana/sap-hana-connector.md' - 'source-datastore/add-datastores/sap-hana/permissions.md': 'source-datastore/datastore/jdbc/sap-hana/permissions.md' - 'source-datastore/add-datastores/sap-hana/authentication.md': 'source-datastore/datastore/jdbc/sap-hana/authentication.md' - 'source-datastore/add-datastores/sap-hana/troubleshooting.md': 'source-datastore/datastore/jdbc/sap-hana/troubleshooting.md' - 'source-datastore/add-datastores/sap-hana/how-tos/add-source.md': 'source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md' - 'source-datastore/add-datastores/sap-hana/how-tos/api.md': 'source-datastore/datastore/jdbc/sap-hana/how-tos/api.md' - 'source-datastore/add-datastores/connections/introduction.md': 'source-datastore/datastore/connection/introduction.md' - 'source-datastore/add-datastores/connections/how-it-works.md': 'source-datastore/datastore/connection/how-it-works.md' - 'source-datastore/add-datastores/multi-schema/overview.md': 'source-datastore/datastore/multi-schema/overview.md' - 'source-datastore/add-datastores/multi-schema/how-it-works.md': 'source-datastore/datastore/multi-schema/how-it-works.md' - 'source-datastore/add-datastores/multi-schema/supported-connectors.md': 'source-datastore/datastore/multi-schema/supported-connectors.md' - 'source-datastore/add-datastores/multi-schema/permissions.md': 'source-datastore/datastore/multi-schema/permissions.md' - 'source-datastore/add-datastores/multi-schema/faq.md': 'source-datastore/datastore/multi-schema/faq.md' - # Intermediate source-datastore/how-tos/ → datastore/how-tos/ - 'source-datastore/how-tos/add-new-source-datastore.md': 'source-datastore/datastore/how-tos/add-new-source-datastore.md' - 'source-datastore/how-tos/existing-connection.md': 'source-datastore/datastore/how-tos/existing-connection.md' - 'source-datastore/how-tos/edit-datastore.md': 'source-datastore/datastore/how-tos/edit-datastore.md' - 'source-datastore/how-tos/delete-datastore.md': 'source-datastore/datastore/how-tos/delete-datastore.md' - # Managing-datastores split across enrichment-datastore/ and data-quality-score/ - 'source-datastore/managing-datastores/link-enrichment.md': 'source-datastore/enrichment-datastore/how-tos/link-enrichment.md' - 'source-datastore/managing-datastores/unlink-enrichment.md': 'source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md' - 'source-datastore/managing-datastores/quality-score-settings.md': 'source-datastore/data-quality-score/how-tos/quality-score-settings.md' - # Enrichment Datastore deep-dive + how-tos - 'source-datastore/enrichment-datastore/introduction.md': 'source-datastore/enrichment-datastore/deep-dive/introduction.md' - 'source-datastore/enrichment-datastore/permissions.md': 'source-datastore/enrichment-datastore/deep-dive/permissions.md' - 'source-datastore/enrichment-datastore/link-during-creation.md': 'source-datastore/enrichment-datastore/how-tos/link-during-creation.md' - # Data Quality Score deep-dive - 'source-datastore/data-quality-score/introduction.md': 'source-datastore/data-quality-score/deep-dive/introduction.md' - 'source-datastore/data-quality-score/permissions.md': 'source-datastore/data-quality-score/deep-dive/permissions.md' - # Tags reorganized into deep-dive/ + how-tos/ - 'source-datastore/tags/introduction.md': 'source-datastore/tags/deep-dive/introduction.md' - 'source-datastore/tags/permissions.md': 'source-datastore/tags/deep-dive/permissions.md' - 'source-datastore/tags/assign-tags.md': 'source-datastore/tags/how-tos/assign-tags.md' - 'source-datastore/tags/unassign-tags.md': 'source-datastore/tags/how-tos/unassign-tags.md' - # Grouping promoted to top-level under source-datastore/ - 'source-datastore/managing-datastores/grouping/overview.md': 'source-datastore/grouping/getting-started.md' - 'source-datastore/managing-datastores/grouping/concepts/understanding-grouping.md': 'source-datastore/grouping/deep-dive/introduction.md' - 'source-datastore/managing-datastores/grouping/concepts/permissions.md': 'source-datastore/grouping/deep-dive/permissions.md' - 'source-datastore/managing-datastores/grouping/concepts/grouping-api.md': 'source-datastore/grouping/api.md' - 'source-datastore/managing-datastores/grouping/concepts/grouping-faq.md': 'source-datastore/grouping/faq.md' - 'source-datastore/managing-datastores/grouping/managing-groups/create-a-group.md': 'source-datastore/grouping/how-tos/create-a-group.md' - 'source-datastore/managing-datastores/grouping/managing-groups/edit-a-group.md': 'source-datastore/grouping/how-tos/edit-a-group.md' - 'source-datastore/managing-datastores/grouping/managing-groups/delete-a-group.md': 'source-datastore/grouping/how-tos/delete-a-group.md' - 'source-datastore/managing-datastores/grouping/managing-groups/assign-a-datastore.md': 'source-datastore/grouping/how-tos/assign-a-datastore.md' - 'source-datastore/managing-datastores/grouping/managing-groups/unassign-a-datastore.md': 'source-datastore/grouping/how-tos/unassign-a-datastore.md' - 'source-datastore/managing-datastores/grouping/managing-groups/filter-by-group.md': 'source-datastore/grouping/how-tos/filter-by-group.md' - # Catalog to Sync redirect - 'source-datastore/sync.md': 'operations/sync/sync.md' - # Operations consolidated into top-level Operations section - 'source-datastore/operations/sync.md': 'operations/sync/sync.md' - 'source-datastore/operations/profile.md': 'operations/profile/profile.md' - 'source-datastore/operations/scan.md': 'operations/scan/scan.md' - 'source-datastore/operations/external-scan.md': 'operations/external-scan/external-scan.md' - 'container/operations/export-operation.md': 'operations/export-operation/export-operation.md' - 'container/operations/materialize-operation.md': 'operations/materialize-operation/materialize-operation.md' - # Agent Q redirects (legacy AI integrations + AI & Agents → Agent Q top-level) - 'settings/integrations/ai/mcp.md': 'agent-q/deep-dive/mcp.md' - 'settings/integrations/ai/agentic.md': 'agent-q/deep-dive/agentic.md' - 'settings/integrations/ai/mcp-quickstart.md': 'agent-q/managing/add-integration.md' - 'settings/integrations/ai-and-agents/managing/update-llm-integration.md': 'agent-q/managing/update-integration.md' - 'settings/integrations/ai-and-agents/managing/remove-llm-integration.md': 'agent-q/managing/remove-integration.md' - 'settings/integrations/ai-and-agents/managing/how-to-use-agent-q.md': 'agent-q/overview.md' - # AI & Agents → Agent Q (move out of Integrations, drop agent-q- prefix) - 'settings/integrations/ai-and-agents/overview.md': 'agent-q/overview.md' - 'settings/integrations/ai-and-agents/agent-q-api.md': 'agent-q/api.md' - 'settings/integrations/ai-and-agents/agent-q-faq.md': 'agent-q/faq.md' - 'settings/integrations/ai-and-agents/deep-dive/mcp.md': 'agent-q/deep-dive/mcp.md' - 'settings/integrations/ai-and-agents/deep-dive/agent-q-in-action.md': 'agent-q/deep-dive/in-action.md' - 'settings/integrations/ai-and-agents/deep-dive/agent-q-conversations.md': 'agent-q/deep-dive/conversations.md' - 'settings/integrations/ai-and-agents/deep-dive/agent-q-best-practices.md': 'agent-q/deep-dive/best-practices.md' - 'settings/integrations/ai-and-agents/deep-dive/agent-q-limits.md': 'agent-q/deep-dive/limits.md' - 'settings/integrations/ai-and-agents/deep-dive/agentic.md': 'agent-q/deep-dive/agentic.md' - 'settings/integrations/ai-and-agents/managing/connecting-external-ai-clients.md': 'agent-q/managing/connecting-external-ai-clients.md' - 'settings/integrations/ai-and-agents/managing/add-agent-q-integration.md': 'agent-q/managing/add-integration.md' - 'settings/integrations/ai-and-agents/managing/update-agent-q-integration.md': 'agent-q/managing/update-integration.md' - 'settings/integrations/ai-and-agents/managing/remove-agent-q-integration.md': 'agent-q/managing/remove-integration.md' - 'settings/integrations/ai-and-agents/managing/start-a-new-conversation.md': 'agent-q/managing/start-a-new-conversation.md' - 'settings/integrations/ai-and-agents/managing/resume-a-conversation.md': 'agent-q/managing/resume-a-conversation.md' - 'settings/integrations/ai-and-agents/managing/rename-a-conversation.md': 'agent-q/managing/rename-a-conversation.md' - 'settings/integrations/ai-and-agents/managing/archive-a-conversation.md': 'agent-q/managing/archive-a-conversation.md' - 'settings/integrations/ai-and-agents/managing/restore-a-conversation.md': 'agent-q/managing/restore-a-conversation.md' - 'settings/integrations/ai-and-agents/managing/delete-a-conversation.md': 'agent-q/managing/delete-a-conversation.md' - 'settings/integrations/ai-and-agents/managing/search-conversations.md': 'agent-q/managing/search-conversations.md' - 'settings/integrations/ai-and-agents/managing/chat-interface-tips.md': 'agent-q/managing/chat-interface-tips.md' - # Ticketing integrations: Configure Qualytics renamed to Add Connection - 'settings/integrations/ticketing/jira/managing/configure-qualytics.md': 'settings/integrations/ticketing/jira/managing/add-connection.md' - 'settings/integrations/ticketing/servicenow/managing/configure-qualytics.md': 'settings/integrations/ticketing/servicenow/managing/add-connection.md' - # Ticketing integrations: View Linked Tickets renamed to Tips & Tricks - 'settings/integrations/ticketing/jira/managing/view-linked-tickets.md': 'settings/integrations/ticketing/jira/managing/tips-and-tricks.md' - 'settings/integrations/ticketing/servicenow/managing/view-linked-tickets.md': 'settings/integrations/ticketing/servicenow/managing/tips-and-tricks.md' - 'flows/http.md': 'flows/actions-node/workflow.md' - # CLI examples-and-use-cases moved to examples/index - 'cli/examples-and-use-cases.md': 'cli/examples/index.md' - # First-time setup moved out of examples/ and renamed to Installing Qualytics CLI - 'cli/examples/first-time-setup.md': 'cli/installing-qualytics-cli.md' - 'cli/first-time-setup.md': 'cli/installing-qualytics-cli.md' - # Checks renamed to data-quality-checks - 'checks/overview-of-a-check.md': 'data-quality-checks/overview-of-a-check.md' - 'checks/authored-check.md': 'data-quality-checks/authored-check.md' - 'checks/inferred-check.md': 'data-quality-checks/ai-managed/getting-started.md' - 'data-quality-checks/inferred-check.md': 'data-quality-checks/ai-managed/getting-started.md' - 'data-quality-checks/ai-managed-check.md': 'data-quality-checks/ai-managed/getting-started.md' - 'data-quality-checks/inferred/getting-started.md': 'data-quality-checks/ai-managed/getting-started.md' - 'data-quality-checks/inferred/introduction.md': 'data-quality-checks/ai-managed/introduction.md' - 'data-quality-checks/inferred/how-inferred-checks-work.md': 'data-quality-checks/ai-managed/how-ai-managed-checks-work.md' - 'data-quality-checks/inferred/in-practice.md': 'data-quality-checks/ai-managed/in-practice.md' - 'data-quality-checks/inferred/permissions.md': 'data-quality-checks/ai-managed/permissions.md' - 'data-quality-checks/inferred/edit.md': 'data-quality-checks/ai-managed/edit.md' - 'data-quality-checks/inferred/api.md': 'data-quality-checks/ai-managed/api.md' - 'data-quality-checks/inferred/faq.md': 'data-quality-checks/ai-managed/faq.md' - 'checks/rule-types-overview.md': 'data-quality-checks/rule-types-overview.md' - 'checks/after-date-check.md': 'data-quality-checks/after-date-check.md' - 'checks/aggregation-comparison-check.md': 'data-quality-checks/aggregation-comparison-check.md' - 'checks/any-not-null-check.md': 'data-quality-checks/any-not-null-check.md' - 'checks/before-date-time-check.md': 'data-quality-checks/before-date-time-check.md' - 'checks/between-check.md': 'data-quality-checks/between-check.md' - 'checks/between-times-check.md': 'data-quality-checks/between-times-check.md' - 'checks/contains-credit-card-check.md': 'data-quality-checks/contains-credit-card-check.md' - 'checks/contains-email-check.md': 'data-quality-checks/contains-email-check.md' - 'checks/contains-social-security-number-check.md': 'data-quality-checks/contains-social-security-number-check.md' - 'checks/contains-url.md': 'data-quality-checks/contains-url.md' - 'checks/data-diff-check.md': 'data-quality-checks/data-diff-check.md' - 'checks/distinct-count-check.md': 'data-quality-checks/distinct-count-check.md' - 'checks/entity-resolution.md': 'data-quality-checks/entity-resolution.md' - 'checks/equal-to-check.md': 'data-quality-checks/equal-to-check.md' - 'checks/equal-to-field-check.md': 'data-quality-checks/equal-to-field-check.md' - 'checks/exists-in-check.md': 'data-quality-checks/exists-in-check.md' - 'checks/expected-schema-check.md': 'data-quality-checks/expected-schema-check.md' - 'checks/expected-values-check.md': 'data-quality-checks/expected-values-check.md' - 'checks/field-count-check.md': 'data-quality-checks/field-count-check.md' - 'checks/freshness-check.md': 'data-quality-checks/freshness-check.md' - 'checks/greater-than-check.md': 'data-quality-checks/greater-than-check.md' - 'checks/greater-than-field-check.md': 'data-quality-checks/greater-than-field-check.md' - 'checks/is-address.md': 'data-quality-checks/is-address.md' - 'checks/is-credit-card-check.md': 'data-quality-checks/is-credit-card-check.md' - 'checks/is-replica-of-check.md': 'data-quality-checks/is-replica-of-check.md' - 'checks/is-type-check.md': 'data-quality-checks/is-type-check.md' - 'checks/less-than-check.md': 'data-quality-checks/less-than-check.md' - 'checks/less-than-field-check.md': 'data-quality-checks/less-than-field-check.md' - 'checks/matches-pattern-check.md': 'data-quality-checks/matches-pattern-check.md' - 'checks/max-length-check.md': 'data-quality-checks/max-length-check.md' - 'checks/max-partition-size-check.md': 'data-quality-checks/max-partition-size-check.md' - 'checks/max-value-check.md': 'data-quality-checks/max-value-check.md' - 'checks/metric-check.md': 'data-quality-checks/metric-check.md' - 'checks/min-length-check.md': 'data-quality-checks/min-length-check.md' - 'checks/min-partition-size-check.md': 'data-quality-checks/min-partition-size-check.md' - 'checks/min-value-check.md': 'data-quality-checks/min-value-check.md' - 'checks/not-exists-in-check.md': 'data-quality-checks/not-exists-in-check.md' - 'checks/not-future-check.md': 'data-quality-checks/not-future-check.md' - 'checks/not-negative-check.md': 'data-quality-checks/not-negative-check.md' - 'checks/not-null-check.md': 'data-quality-checks/not-null-check.md' - 'checks/positive-check.md': 'data-quality-checks/positive-check.md' - 'checks/predicted-by-check.md': 'data-quality-checks/predicted-by-check.md' - 'checks/required-values-check.md': 'data-quality-checks/required-values-check.md' - 'checks/satisfies-expression-check.md': 'data-quality-checks/satisfies-expression-check.md' - 'checks/sum-check.md': 'data-quality-checks/sum-check.md' - 'checks/time-distribution-size-check.md': 'data-quality-checks/time-distribution-size-check.md' - 'checks/unique-check.md': 'data-quality-checks/unique/introduction.md' - 'data-quality-checks/unique-check.md': 'data-quality-checks/unique/introduction.md' - 'checks/volumetric-check.md': 'data-quality-checks/volumetric-check.md' - 'checks/checks-template.md': 'data-quality-checks/checks-template.md' - 'checks/apply-check-template-for-quality-checks.md': 'data-quality-checks/apply-check-template-for-quality-checks.md' - 'checks/export-check-templates.md': 'data-quality-checks/export-check-templates.md' - # License moved to SaaS - 'settings/status/deep-dive/license.md': 'self-hosted/license/deep-dive/how-it-works.md' - 'settings/status/managing/update-license.md': 'self-hosted/license/managing/update-license.md' - 'settings/status/managing/generate-license-request.md': 'self-hosted/license/managing/generate-license-request.md' - # Token deep-dive restructure - 'settings/access-tokens/personal-token/how-it-works.md': 'settings/access-tokens/personal-token/deep-dive/how-it-works.md' - 'settings/access-tokens/personal-token/permissions.md': 'settings/access-tokens/personal-token/deep-dive/permissions.md' - 'settings/access-tokens/personal-token/best-practices.md': 'settings/access-tokens/personal-token/deep-dive/best-practices.md' - 'settings/access-tokens/service-token/how-it-works.md': 'settings/access-tokens/service-token/deep-dive/how-it-works.md' - 'settings/access-tokens/service-token/permissions.md': 'settings/access-tokens/service-token/deep-dive/permissions.md' - 'settings/access-tokens/service-token/best-practices.md': 'settings/access-tokens/service-token/deep-dive/best-practices.md' - # Service Accounts deep-dive restructure - 'settings/security/service-users/how-it-works.md': 'settings/security/service-users/deep-dive/how-it-works.md' - 'settings/security/service-users/permissions.md': 'settings/security/service-users/deep-dive/permissions.md' - 'settings/security/service-users/best-practices.md': 'settings/security/service-users/deep-dive/best-practices.md' - # SSO and Directory Sync moved to SaaS - 'deployments/sso.md': 'managed-deployment/sso/overview.md' - 'settings/security/directory-sync/introduction.md': 'managed-deployment/directory-sync/introduction.md' - 'settings/security/directory-sync/supported-providers.md': 'managed-deployment/directory-sync/supported-providers.md' - 'settings/security/directory-sync/managing/ms-entra.md': 'managed-deployment/directory-sync/managing/ms-entra.md' - 'settings/security/directory-sync/managing/okta.md': 'managed-deployment/directory-sync/managing/okta.md' - 'settings/security/directory-sync/managing/onelogin.md': 'managed-deployment/directory-sync/managing/onelogin.md' - 'settings/security/directory-sync/managing/jumpcloud.md': 'managed-deployment/directory-sync/managing/jumpcloud.md' - # Promote pages moved to operations/promote/ section - 'container/operations/promote-quality-checks.md': 'operations/promote/managing-promotions/promote-quality-checks.md' - 'container/operations/promote-computed-fields.md': 'operations/promote/managing-promotions/promote-computed-fields.md' - 'source-datastore/operations/promote-computed-tables.md': 'operations/promote/managing-promotions/promote-computed-tables.md' - 'source-datastore/operations/promote-computed-files.md': 'operations/promote/managing-promotions/promote-computed-files.md' - - print-site: - add_to_navigation: false - print_page_title: 'Print Site' - add_print_site_banner: false - # Table of contents - add_table_of_contents: false - toc_title: 'Table of Contents' - toc_depth: 6 - # Content-related - add_full_urls: false - enumerate_headings: false - enumerate_figures: true - add_cover_page: true - cover_page_template: "" - path_to_pdf: "" - include_css: true - enabled: !ENV [MKDOCS_SERVE, true] # disable the print plugin when we are developing locally - exclude: - -extra: - homepage: https://qualytics.ai - analytics: - provider: google - property: G-46N5E3NXG0 - feedback: - title: Was this page helpful? - ratings: - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: >- - Thanks for your feedback! Help us improve this page by - using our issue tracker for this user guide. - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: >- - Thanks for your feedback! - comparator_short_desc: Specifies how variations are handled, allowing for slight deviations within a defined margin of error. - diff --git a/overrides/404.html b/overrides/404.html index 6fa35202cd..acc147c898 100644 --- a/overrides/404.html +++ b/overrides/404.html @@ -1,36 +1,20 @@ {% extends "base.html" %} {% block content %} +{% set home = config.site_url | default('/', true) %}
- -

404 - Page Not Found

- -

Oops! The page you're looking for doesn't exist.

- -

What happened?

- -

The page you requested could not be found. This might happen because:

- -
    -
  • The URL was typed incorrectly
  • -
  • The page has been moved or deleted
  • -
  • The link you followed is broken
  • -
- -

What can you do?

- -
    -
  • Go back to the homepage
  • -
  • Use the search function to find what you're looking for
  • -
  • Check the navigation menu for available sections
  • -
  • Contact support if you think this is an error
  • -
- -
- -

Need help? Contact our support team

- +
+

404

+

This page wandered off

+

The page you're looking for doesn't exist or may have moved. Try one of + these instead:

+ +

Still stuck? Contact our support team.

+
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..30fa28bf65 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "qualytics-userguide" +version = "0.0.0" +description = "User Guide for the Qualytics data quality platform, built with Zensical" +readme = "README.md" +requires-python = ">=3.10" +license = { text = "Proprietary" } +authors = [{ name = "Qualytics Team" }] + +# Runtime dependencies needed to build and serve the documentation site. +# Zensical is the static site generator (successor to Material for MkDocs); +# PyYAML is used by scripts/generate-redirects.py to read redirects.yml. +dependencies = [ + "zensical==0.0.44", + "pyyaml>=6.0", +] + +[dependency-groups] +# Tooling used for local development and pre-commit hooks. +dev = [ + "pre-commit>=3.8", +] + +[tool.uv] +# This project is a documentation site, not an installable Python package, +# so uv should manage dependencies without trying to build/install the project. +package = false diff --git a/redirects.yml b/redirects.yml new file mode 100644 index 0000000000..dccbbd7a70 --- /dev/null +++ b/redirects.yml @@ -0,0 +1,353 @@ +# Redirect map: old path -> new path (both relative to docs/). +# Consumed by scripts/generate-redirects.py after `zensical build` +# to emit meta-refresh stub pages, replacing the mkdocs-redirects plugin. +redirects: + settings/security/users/managing/filter-users-by-team.md: settings/security/users/managing/filter-users.md + settings/security/service-users/managing/filter-service-users.md: settings/security/users/managing/filter-users.md + settings/security/teams/managing/description.md: settings/security/teams/managing/list-columns.md + settings/security/teams/managing/users.md: settings/security/teams/managing/list-columns.md + settings/security/teams/managing/source-datastores.md: settings/security/teams/managing/list-columns.md + settings/security/teams/managing/enrichment-datastores.md: settings/security/teams/managing/list-columns.md + settings/security/teams/managing/created.md: settings/security/teams/managing/list-columns.md + settings/access-tokens/personal-token/managing/token-usage-status.md: settings/access-tokens/personal-token/managing/list-columns.md + settings/access-tokens/service-token/managing/token-usage-status.md: settings/access-tokens/service-token/managing/list-columns.md + settings/security/users/managing/teams.md: settings/security/users/managing/list-columns.md + settings/security/users/managing/last-active.md: settings/security/users/managing/list-columns.md + settings/security/users/managing/created.md: settings/security/users/managing/list-columns.md + settings/integrations/ticketing/jira.md: settings/integrations/ticketing/jira/introduction.md + settings/integrations/ticketing/jira/managing/connect-integration.md: settings/integrations/ticketing/jira/managing/configure-jira.md + settings/integrations/ticketing/servicenow/managing/connect-integration.md: settings/integrations/ticketing/servicenow/managing/configure-servicenow.md + settings/connections/deep-dive/how-it-works.md: source-datastore/datastore/connection/how-it-works.md + settings/connections/managing/add-connection.md: source-datastore/datastore/how-tos/add-new-source-datastore.md + source-datastore/add-datastores/connections/new-connection.md: source-datastore/datastore/how-tos/add-new-source-datastore.md + source-datastore/add-datastores/connections/add-new-source-datastore.md: source-datastore/datastore/how-tos/add-new-source-datastore.md + source-datastore/add-datastores/connections/existing-connection.md: source-datastore/datastore/how-tos/existing-connection.md + web-app.md: using-the-platform/web-app/overview.md + keyboard-shortcuts.md: using-the-platform/web-app/global-search/keyboard-shortcuts.md + onboarding.md: using-the-platform/onboarding.md + quick-start-guide.md: using-the-platform/quick-start-guide.md + printing.md: using-the-platform/printing.md + settings/integrations/atlan.md: settings/integrations/data-catalogs/atlan.md + settings/integrations/catalog/atlan.md: settings/integrations/data-catalogs/atlan.md + settings/integrations/catalog/alation.md: settings/integrations/data-catalogs/alation.md + settings/integrations/catalog/collibra.md: settings/integrations/data-catalogs/collibra.md + settings/integrations/catalog/datahub.md: settings/integrations/data-catalogs/datahub.md + settings/integrations/catalog/external-tag-propagation.md: settings/integrations/data-catalogs/external-tag-propagation.md + settings/integrations/catalog/purview.md: settings/integrations/data-catalogs/microsoft-purview.md + settings/integrations/catalog/overview.md: settings/integrations/data-catalogs/overview.md + deployments/deployments.md: deployments/overview.md + upgrades/qualytics-single-tenant-instance.md: deployments/self-hosted-deployment.md + container/field-profiles.md: fields/field-profiles.md + container/computed-fields/overview.md: fields/computed-fields/overview.md + container/computed-fields/transformation-types.md: fields/computed-fields/transformation-types.md + container/computed-fields/computed-fields-details.md: fields/computed-fields/computed-fields-details.md + container/computed-fields/add-computed-fields.md: fields/computed-fields/add-computed-fields.md + flows/anomaly.md: flows/actions-node/anomaly/introduction.md + flows/overview-action.md: flows/actions-node/overview-action.md + flows/operations.md: flows/actions-node/operations.md + flows/workflow.md: flows/actions-node/workflow.md + flows/ticketing.md: flows/actions-node/ticketing.md + flows/notifications/overview.md: flows/actions-node/notifications/overview.md + flows/notifications/faq.md: flows/actions-node/notifications/faq.md + flows/notifications/message-variables.md: flows/actions-node/notifications/message-variables.md + flows/notifications/in-app/overview.md: flows/actions-node/notifications/in-app/overview.md + flows/notifications/in-app/api.md: flows/actions-node/notifications/in-app/api.md + flows/notifications/in-app/faq.md: flows/actions-node/notifications/in-app/faq.md + flows/notifications/email/overview.md: flows/actions-node/notifications/email/overview.md + flows/notifications/email/api.md: flows/actions-node/notifications/email/api.md + flows/notifications/email/faq.md: flows/actions-node/notifications/email/faq.md + flows/notifications/slack/overview.md: flows/actions-node/notifications/slack/overview.md + flows/notifications/slack/api.md: flows/actions-node/notifications/slack/api.md + flows/notifications/slack/faq.md: flows/actions-node/notifications/slack/faq.md + flows/notifications/microsoft-teams/overview.md: flows/actions-node/notifications/microsoft-teams/overview.md + flows/notifications/microsoft-teams/api.md: flows/actions-node/notifications/microsoft-teams/api.md + flows/notifications/microsoft-teams/faq.md: flows/actions-node/notifications/microsoft-teams/faq.md + flows/notifications/pagerduty/overview.md: flows/actions-node/notifications/pagerduty/overview.md + flows/notifications/pagerduty/api.md: flows/actions-node/notifications/pagerduty/api.md + flows/notifications/pagerduty/faq.md: flows/actions-node/notifications/pagerduty/faq.md + anomalies/anomalies.md: anomalies/overview.md + anomalies/anomaly-types.md: anomalies/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 + flows/notification.md: flows/actions-node/notifications/overview.md + flows/notification-tokens.md: flows/actions-node/notifications/message-variables.md + flows/notifications/in-app.md: flows/actions-node/notifications/in-app/overview.md + flows/notifications/email.md: flows/actions-node/notifications/email/overview.md + flows/notifications/slack.md: flows/actions-node/notifications/slack/overview.md + flows/notifications/microsoft-teams.md: flows/actions-node/notifications/microsoft-teams/overview.md + flows/notifications/pagerduty.md: flows/actions-node/notifications/pagerduty/overview.md + source-datastore/add-datastores/athena.md: source-datastore/datastore/jdbc/athena/athena-connector.md + source-datastore/catalog.md: operations/sync/sync.md + source-datastore/operations/catalog.md: operations/sync/sync.md + source-datastore/profile.md: operations/profile/profile.md + source-datastore/scan.md: operations/scan/scan.md + source-datastore/external-scan.md: operations/external-scan/external-scan.md + source-datastore/right-click-options.md: source-datastore/tips-and-tricks/right-click-options.md + source-datastore/assign-tags.md: source-datastore/tags/how-tos/assign-tags.md + source-datastore/settings-overview.md: source-datastore/datastore/how-tos/edit-datastore.md + source-datastore/edit-datastore.md: source-datastore/datastore/how-tos/edit-datastore.md + source-datastore/link-enrichment.md: source-datastore/enrichment-datastore/how-tos/link-enrichment.md + source-datastore/unlink-enrichment.md: source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md + source-datastore/quality-score-settings.md: source-datastore/data-quality-score/how-tos/quality-score-settings.md + source-datastore/delete-datastore.md: source-datastore/datastore/how-tos/delete-datastore.md + source-datastore/managing-datastores/edit-datastore.md: source-datastore/datastore/how-tos/edit-datastore.md + source-datastore/managing-datastores/delete-datastore.md: source-datastore/datastore/how-tos/delete-datastore.md + source-datastore/navigation-and-organization/right-click-options.md: source-datastore/tips-and-tricks/right-click-options.md + source-datastore/navigation-and-organization/assign-tags.md: source-datastore/tags/how-tos/assign-tags.md + source-datastore/managing-datastores/assign-tags.md: source-datastore/tags/how-tos/assign-tags.md + source-datastore/datastore-settings/settings-overview.md: source-datastore/datastore/how-tos/edit-datastore.md + source-datastore/datastore-settings/edit-datastore.md: source-datastore/datastore/how-tos/edit-datastore.md + source-datastore/datastore-settings/link-enrichment.md: source-datastore/enrichment-datastore/how-tos/link-enrichment.md + source-datastore/datastore-settings/unlink-enrichment.md: source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md + source-datastore/datastore-settings/quality-score-settings.md: source-datastore/data-quality-score/how-tos/quality-score-settings.md + source-datastore/datastore-settings/delete-datastore.md: source-datastore/datastore/how-tos/delete-datastore.md + container/enrichment-operation/export-operation.md: operations/export-operation/export-operation.md + container/enrichment-operation/materialize-operation.md: operations/materialize-operation/materialize-operation.md + add-datastores/overview-of-a-datastore.md: source-datastore/datastore/overview-of-a-datastore.md + add-datastores/overview-of-a-jdbc-datastore.md: source-datastore/datastore/jdbc/overview-of-a-jdbc-datastore.md + add-datastores/overview-of-a-dfs-datastore.md: source-datastore/datastore/dfs/overview-of-a-dfs-datastore.md + add-datastores/athena.md: source-datastore/datastore/jdbc/athena/athena-connector.md + add-datastores/bigquery.md: source-datastore/datastore/jdbc/bigquery.md + add-datastores/databricks.md: source-datastore/datastore/jdbc/databricks.md + add-datastores/db2.md: source-datastore/datastore/jdbc/db2.md + add-datastores/fabric-analytics.md: source-datastore/datastore/jdbc/fabric-analytics.md + add-datastores/hive.md: source-datastore/datastore/jdbc/hive.md + add-datastores/maria-db.md: source-datastore/datastore/jdbc/maria-db.md + add-datastores/microsoft-sql-server.md: source-datastore/datastore/jdbc/microsoft-sql-server.md + add-datastores/mysql.md: source-datastore/datastore/jdbc/mysql.md + add-datastores/oracle.md: source-datastore/datastore/jdbc/oracle.md + add-datastores/postgresql.md: source-datastore/datastore/jdbc/postgresql.md + add-datastores/presto.md: source-datastore/datastore/jdbc/presto.md + add-datastores/redshift.md: source-datastore/datastore/jdbc/redshift.md + add-datastores/snowflake.md: source-datastore/datastore/jdbc/snowflake.md + add-datastores/synapse.md: source-datastore/datastore/jdbc/synapse.md + add-datastores/teradata.md: source-datastore/datastore/jdbc/teradata.md + add-datastores/timescale-db.md: source-datastore/datastore/jdbc/timescale-db.md + add-datastores/trino.md: source-datastore/datastore/jdbc/trino.md + add-datastores/dremio.md: source-datastore/datastore/jdbc/dremio.md + add-datastores/amazon-s3.md: source-datastore/datastore/dfs/amazon-s3.md + add-datastores/azure-datalake-storage.md: source-datastore/datastore/dfs/azure-datalake-storage.md + add-datastores/google-cloud-storage.md: source-datastore/datastore/dfs/google-cloud-storage.md + connections/overview-of-a-connection.md: source-datastore/datastore/connection/introduction.md + source-datastore/add-datastores/connections/overview-of-a-connection.md: source-datastore/datastore/connection/introduction.md + source-datastore/add-datastores/multi-schema/concepts/how-it-works.md: source-datastore/datastore/multi-schema/how-it-works.md + source-datastore/add-datastores/multi-schema/concepts/supported-connectors.md: source-datastore/datastore/multi-schema/supported-connectors.md + source-datastore/add-datastores/multi-schema/concepts/multi-schema-permissions.md: source-datastore/datastore/multi-schema/permissions.md + source-datastore/add-datastores/multi-schema/concepts/multi-schema-faq.md: source-datastore/datastore/multi-schema/faq.md + source-datastore/add-datastores/overview-of-a-datastore.md: source-datastore/datastore/overview-of-a-datastore.md + source-datastore/add-datastores/overview-of-a-jdbc-datastore.md: source-datastore/datastore/jdbc/overview-of-a-jdbc-datastore.md + source-datastore/add-datastores/overview-of-a-dfs-datastore.md: source-datastore/datastore/dfs/overview-of-a-dfs-datastore.md + source-datastore/add-datastores/api.md: source-datastore/datastore/api.md + source-datastore/add-datastores/faq.md: source-datastore/datastore/faq.md + source-datastore/add-datastores/available-datastore-connectors.md: source-datastore/datastore/connection/available-datastore-connectors.md + source-datastore/add-datastores/dfs-supported-file-formats.md: source-datastore/datastore/dfs/deep-dive/dfs-supported-file-formats.md + source-datastore/add-datastores/dfs-filename-globbing.md: source-datastore/datastore/dfs/deep-dive/dfs-filename-globbing.md + source-datastore/datastore/dfs/dfs-supported-file-formats.md: source-datastore/datastore/dfs/deep-dive/dfs-supported-file-formats.md + source-datastore/datastore/dfs/dfs-filename-globbing.md: source-datastore/datastore/dfs/deep-dive/dfs-filename-globbing.md + source-datastore/add-datastores/amazon-s3.md: source-datastore/datastore/dfs/amazon-s3.md + source-datastore/add-datastores/azure-datalake-storage.md: source-datastore/datastore/dfs/azure-datalake-storage.md + source-datastore/add-datastores/google-cloud-storage.md: source-datastore/datastore/dfs/google-cloud-storage.md + source-datastore/add-datastores/bigquery.md: source-datastore/datastore/jdbc/bigquery.md + source-datastore/add-datastores/databricks.md: source-datastore/datastore/jdbc/databricks.md + source-datastore/add-datastores/db2.md: source-datastore/datastore/jdbc/db2.md + source-datastore/add-datastores/dremio.md: source-datastore/datastore/jdbc/dremio.md + source-datastore/add-datastores/fabric-analytics.md: source-datastore/datastore/jdbc/fabric-analytics.md + source-datastore/add-datastores/hive.md: source-datastore/datastore/jdbc/hive.md + source-datastore/add-datastores/maria-db.md: source-datastore/datastore/jdbc/maria-db.md + source-datastore/add-datastores/microsoft-sql-server.md: source-datastore/datastore/jdbc/microsoft-sql-server.md + source-datastore/add-datastores/mysql.md: source-datastore/datastore/jdbc/mysql.md + source-datastore/add-datastores/oracle.md: source-datastore/datastore/jdbc/oracle.md + source-datastore/add-datastores/postgresql.md: source-datastore/datastore/jdbc/postgresql.md + source-datastore/add-datastores/presto.md: source-datastore/datastore/jdbc/presto.md + source-datastore/add-datastores/redshift.md: source-datastore/datastore/jdbc/redshift.md + source-datastore/add-datastores/snowflake.md: source-datastore/datastore/jdbc/snowflake.md + source-datastore/add-datastores/synapse.md: source-datastore/datastore/jdbc/synapse.md + source-datastore/add-datastores/teradata.md: source-datastore/datastore/jdbc/teradata.md + source-datastore/add-datastores/timescale-db.md: source-datastore/datastore/jdbc/timescale-db.md + source-datastore/add-datastores/trino.md: source-datastore/datastore/jdbc/trino.md + source-datastore/add-datastores/athena/athena-connector.md: source-datastore/datastore/jdbc/athena/athena-connector.md + source-datastore/add-datastores/athena/permissions.md: source-datastore/datastore/jdbc/athena/permissions.md + source-datastore/add-datastores/athena/authentication.md: source-datastore/datastore/jdbc/athena/authentication.md + source-datastore/add-datastores/athena/troubleshooting.md: source-datastore/datastore/jdbc/athena/troubleshooting.md + source-datastore/add-datastores/athena/managing/add-source.md: source-datastore/datastore/jdbc/athena/managing/add-source.md + source-datastore/add-datastores/athena/managing/api.md: source-datastore/datastore/jdbc/athena/managing/api.md + source-datastore/add-datastores/sap-hana/sap-hana-connector.md: source-datastore/datastore/jdbc/sap-hana/sap-hana-connector.md + source-datastore/add-datastores/sap-hana/permissions.md: source-datastore/datastore/jdbc/sap-hana/permissions.md + source-datastore/add-datastores/sap-hana/authentication.md: source-datastore/datastore/jdbc/sap-hana/authentication.md + source-datastore/add-datastores/sap-hana/troubleshooting.md: source-datastore/datastore/jdbc/sap-hana/troubleshooting.md + source-datastore/add-datastores/sap-hana/how-tos/add-source.md: source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md + source-datastore/add-datastores/sap-hana/how-tos/api.md: source-datastore/datastore/jdbc/sap-hana/how-tos/api.md + source-datastore/add-datastores/connections/introduction.md: source-datastore/datastore/connection/introduction.md + source-datastore/add-datastores/connections/how-it-works.md: source-datastore/datastore/connection/how-it-works.md + source-datastore/add-datastores/multi-schema/overview.md: source-datastore/datastore/multi-schema/overview.md + source-datastore/add-datastores/multi-schema/how-it-works.md: source-datastore/datastore/multi-schema/how-it-works.md + source-datastore/add-datastores/multi-schema/supported-connectors.md: source-datastore/datastore/multi-schema/supported-connectors.md + source-datastore/add-datastores/multi-schema/permissions.md: source-datastore/datastore/multi-schema/permissions.md + source-datastore/add-datastores/multi-schema/faq.md: source-datastore/datastore/multi-schema/faq.md + source-datastore/how-tos/add-new-source-datastore.md: source-datastore/datastore/how-tos/add-new-source-datastore.md + source-datastore/how-tos/existing-connection.md: source-datastore/datastore/how-tos/existing-connection.md + source-datastore/how-tos/edit-datastore.md: source-datastore/datastore/how-tos/edit-datastore.md + source-datastore/how-tos/delete-datastore.md: source-datastore/datastore/how-tos/delete-datastore.md + source-datastore/managing-datastores/link-enrichment.md: source-datastore/enrichment-datastore/how-tos/link-enrichment.md + source-datastore/managing-datastores/unlink-enrichment.md: source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md + source-datastore/managing-datastores/quality-score-settings.md: source-datastore/data-quality-score/how-tos/quality-score-settings.md + source-datastore/enrichment-datastore/introduction.md: source-datastore/enrichment-datastore/deep-dive/introduction.md + source-datastore/enrichment-datastore/permissions.md: source-datastore/enrichment-datastore/deep-dive/permissions.md + source-datastore/enrichment-datastore/link-during-creation.md: source-datastore/enrichment-datastore/how-tos/link-during-creation.md + source-datastore/data-quality-score/introduction.md: source-datastore/data-quality-score/deep-dive/introduction.md + source-datastore/data-quality-score/permissions.md: source-datastore/data-quality-score/deep-dive/permissions.md + source-datastore/tags/introduction.md: source-datastore/tags/deep-dive/introduction.md + source-datastore/tags/permissions.md: source-datastore/tags/deep-dive/permissions.md + source-datastore/tags/assign-tags.md: source-datastore/tags/how-tos/assign-tags.md + source-datastore/tags/unassign-tags.md: source-datastore/tags/how-tos/unassign-tags.md + source-datastore/managing-datastores/grouping/overview.md: source-datastore/grouping/getting-started.md + source-datastore/managing-datastores/grouping/concepts/understanding-grouping.md: source-datastore/grouping/deep-dive/introduction.md + source-datastore/managing-datastores/grouping/concepts/permissions.md: source-datastore/grouping/deep-dive/permissions.md + source-datastore/managing-datastores/grouping/concepts/grouping-api.md: source-datastore/grouping/api.md + source-datastore/managing-datastores/grouping/concepts/grouping-faq.md: source-datastore/grouping/faq.md + source-datastore/managing-datastores/grouping/managing-groups/create-a-group.md: source-datastore/grouping/how-tos/create-a-group.md + source-datastore/managing-datastores/grouping/managing-groups/edit-a-group.md: source-datastore/grouping/how-tos/edit-a-group.md + source-datastore/managing-datastores/grouping/managing-groups/delete-a-group.md: source-datastore/grouping/how-tos/delete-a-group.md + source-datastore/managing-datastores/grouping/managing-groups/assign-a-datastore.md: source-datastore/grouping/how-tos/assign-a-datastore.md + source-datastore/managing-datastores/grouping/managing-groups/unassign-a-datastore.md: source-datastore/grouping/how-tos/unassign-a-datastore.md + source-datastore/managing-datastores/grouping/managing-groups/filter-by-group.md: source-datastore/grouping/how-tos/filter-by-group.md + source-datastore/sync.md: operations/sync/sync.md + source-datastore/operations/sync.md: operations/sync/sync.md + source-datastore/operations/profile.md: operations/profile/profile.md + source-datastore/operations/scan.md: operations/scan/scan.md + source-datastore/operations/external-scan.md: operations/external-scan/external-scan.md + container/operations/export-operation.md: operations/export-operation/export-operation.md + container/operations/materialize-operation.md: operations/materialize-operation/materialize-operation.md + settings/integrations/ai/mcp.md: agent-q/deep-dive/mcp.md + settings/integrations/ai/agentic.md: agent-q/deep-dive/agentic.md + settings/integrations/ai/mcp-quickstart.md: agent-q/managing/add-integration.md + settings/integrations/ai-and-agents/managing/update-llm-integration.md: agent-q/managing/update-integration.md + settings/integrations/ai-and-agents/managing/remove-llm-integration.md: agent-q/managing/remove-integration.md + settings/integrations/ai-and-agents/managing/how-to-use-agent-q.md: agent-q/overview.md + settings/integrations/ai-and-agents/overview.md: agent-q/overview.md + settings/integrations/ai-and-agents/agent-q-api.md: agent-q/api.md + settings/integrations/ai-and-agents/agent-q-faq.md: agent-q/faq.md + settings/integrations/ai-and-agents/deep-dive/mcp.md: agent-q/deep-dive/mcp.md + settings/integrations/ai-and-agents/deep-dive/agent-q-in-action.md: agent-q/deep-dive/in-action.md + settings/integrations/ai-and-agents/deep-dive/agent-q-conversations.md: agent-q/deep-dive/conversations.md + settings/integrations/ai-and-agents/deep-dive/agent-q-best-practices.md: agent-q/deep-dive/best-practices.md + settings/integrations/ai-and-agents/deep-dive/agent-q-limits.md: agent-q/deep-dive/limits.md + settings/integrations/ai-and-agents/deep-dive/agentic.md: agent-q/deep-dive/agentic.md + settings/integrations/ai-and-agents/managing/connecting-external-ai-clients.md: agent-q/managing/connecting-external-ai-clients.md + settings/integrations/ai-and-agents/managing/add-agent-q-integration.md: agent-q/managing/add-integration.md + settings/integrations/ai-and-agents/managing/update-agent-q-integration.md: agent-q/managing/update-integration.md + settings/integrations/ai-and-agents/managing/remove-agent-q-integration.md: agent-q/managing/remove-integration.md + settings/integrations/ai-and-agents/managing/start-a-new-conversation.md: agent-q/managing/start-a-new-conversation.md + settings/integrations/ai-and-agents/managing/resume-a-conversation.md: agent-q/managing/resume-a-conversation.md + settings/integrations/ai-and-agents/managing/rename-a-conversation.md: agent-q/managing/rename-a-conversation.md + settings/integrations/ai-and-agents/managing/archive-a-conversation.md: agent-q/managing/archive-a-conversation.md + settings/integrations/ai-and-agents/managing/restore-a-conversation.md: agent-q/managing/restore-a-conversation.md + settings/integrations/ai-and-agents/managing/delete-a-conversation.md: agent-q/managing/delete-a-conversation.md + settings/integrations/ai-and-agents/managing/search-conversations.md: agent-q/managing/search-conversations.md + settings/integrations/ai-and-agents/managing/chat-interface-tips.md: agent-q/managing/chat-interface-tips.md + settings/integrations/ticketing/jira/managing/configure-qualytics.md: settings/integrations/ticketing/jira/managing/add-connection.md + settings/integrations/ticketing/servicenow/managing/configure-qualytics.md: settings/integrations/ticketing/servicenow/managing/add-connection.md + settings/integrations/ticketing/jira/managing/view-linked-tickets.md: settings/integrations/ticketing/jira/managing/tips-and-tricks.md + settings/integrations/ticketing/servicenow/managing/view-linked-tickets.md: settings/integrations/ticketing/servicenow/managing/tips-and-tricks.md + flows/http.md: flows/actions-node/workflow.md + cli/examples-and-use-cases.md: cli/examples/index.md + cli/examples/first-time-setup.md: cli/installing-qualytics-cli.md + cli/first-time-setup.md: cli/installing-qualytics-cli.md + checks/overview-of-a-check.md: data-quality-checks/overview-of-a-check.md + checks/authored-check.md: data-quality-checks/authored-check.md + checks/inferred-check.md: data-quality-checks/ai-managed/getting-started.md + data-quality-checks/inferred-check.md: data-quality-checks/ai-managed/getting-started.md + data-quality-checks/ai-managed-check.md: data-quality-checks/ai-managed/getting-started.md + data-quality-checks/inferred/getting-started.md: data-quality-checks/ai-managed/getting-started.md + data-quality-checks/inferred/introduction.md: data-quality-checks/ai-managed/introduction.md + data-quality-checks/inferred/how-inferred-checks-work.md: data-quality-checks/ai-managed/how-ai-managed-checks-work.md + data-quality-checks/inferred/in-practice.md: data-quality-checks/ai-managed/in-practice.md + data-quality-checks/inferred/permissions.md: data-quality-checks/ai-managed/permissions.md + data-quality-checks/inferred/edit.md: data-quality-checks/ai-managed/edit.md + data-quality-checks/inferred/api.md: data-quality-checks/ai-managed/api.md + data-quality-checks/inferred/faq.md: data-quality-checks/ai-managed/faq.md + checks/rule-types-overview.md: data-quality-checks/rule-types-overview.md + checks/after-date-check.md: data-quality-checks/after-date-check.md + checks/aggregation-comparison-check.md: data-quality-checks/aggregation-comparison-check.md + checks/any-not-null-check.md: data-quality-checks/any-not-null-check.md + checks/before-date-time-check.md: data-quality-checks/before-date-time-check.md + checks/between-check.md: data-quality-checks/between-check.md + checks/between-times-check.md: data-quality-checks/between-times-check.md + checks/contains-credit-card-check.md: data-quality-checks/contains-credit-card-check.md + checks/contains-email-check.md: data-quality-checks/contains-email-check.md + checks/contains-social-security-number-check.md: data-quality-checks/contains-social-security-number-check.md + checks/contains-url.md: data-quality-checks/contains-url.md + checks/data-diff-check.md: data-quality-checks/data-diff-check.md + checks/distinct-count-check.md: data-quality-checks/distinct-count-check.md + checks/entity-resolution.md: data-quality-checks/entity-resolution.md + checks/equal-to-check.md: data-quality-checks/equal-to-check.md + checks/equal-to-field-check.md: data-quality-checks/equal-to-field-check.md + checks/exists-in-check.md: data-quality-checks/exists-in-check.md + checks/expected-schema-check.md: data-quality-checks/expected-schema-check.md + checks/expected-values-check.md: data-quality-checks/expected-values-check.md + checks/field-count-check.md: data-quality-checks/field-count-check.md + checks/freshness-check.md: data-quality-checks/freshness-check.md + checks/greater-than-check.md: data-quality-checks/greater-than-check.md + checks/greater-than-field-check.md: data-quality-checks/greater-than-field-check.md + checks/is-address.md: data-quality-checks/is-address.md + checks/is-credit-card-check.md: data-quality-checks/is-credit-card-check.md + checks/is-replica-of-check.md: data-quality-checks/is-replica-of-check.md + checks/is-type-check.md: data-quality-checks/is-type-check.md + checks/less-than-check.md: data-quality-checks/less-than-check.md + checks/less-than-field-check.md: data-quality-checks/less-than-field-check.md + checks/matches-pattern-check.md: data-quality-checks/matches-pattern-check.md + checks/max-length-check.md: data-quality-checks/max-length-check.md + checks/max-partition-size-check.md: data-quality-checks/max-partition-size-check.md + checks/max-value-check.md: data-quality-checks/max-value-check.md + checks/metric-check.md: data-quality-checks/metric-check.md + checks/min-length-check.md: data-quality-checks/min-length-check.md + checks/min-partition-size-check.md: data-quality-checks/min-partition-size-check.md + checks/min-value-check.md: data-quality-checks/min-value-check.md + checks/not-exists-in-check.md: data-quality-checks/not-exists-in-check.md + checks/not-future-check.md: data-quality-checks/not-future-check.md + checks/not-negative-check.md: data-quality-checks/not-negative-check.md + checks/not-null-check.md: data-quality-checks/not-null-check.md + checks/positive-check.md: data-quality-checks/positive-check.md + checks/predicted-by-check.md: data-quality-checks/predicted-by-check.md + checks/required-values-check.md: data-quality-checks/required-values-check.md + checks/satisfies-expression-check.md: data-quality-checks/satisfies-expression-check.md + checks/sum-check.md: data-quality-checks/sum-check.md + checks/time-distribution-size-check.md: data-quality-checks/time-distribution-size-check.md + checks/unique-check.md: data-quality-checks/unique/introduction.md + data-quality-checks/unique-check.md: data-quality-checks/unique/introduction.md + checks/volumetric-check.md: data-quality-checks/volumetric-check.md + checks/checks-template.md: data-quality-checks/checks-template.md + checks/apply-check-template-for-quality-checks.md: data-quality-checks/apply-check-template-for-quality-checks.md + checks/export-check-templates.md: data-quality-checks/export-check-templates.md + settings/status/deep-dive/license.md: self-hosted/license/deep-dive/how-it-works.md + settings/status/managing/update-license.md: self-hosted/license/managing/update-license.md + settings/status/managing/generate-license-request.md: self-hosted/license/managing/generate-license-request.md + settings/access-tokens/personal-token/how-it-works.md: settings/access-tokens/personal-token/deep-dive/how-it-works.md + settings/access-tokens/personal-token/permissions.md: settings/access-tokens/personal-token/deep-dive/permissions.md + settings/access-tokens/personal-token/best-practices.md: settings/access-tokens/personal-token/deep-dive/best-practices.md + settings/access-tokens/service-token/how-it-works.md: settings/access-tokens/service-token/deep-dive/how-it-works.md + settings/access-tokens/service-token/permissions.md: settings/access-tokens/service-token/deep-dive/permissions.md + settings/access-tokens/service-token/best-practices.md: settings/access-tokens/service-token/deep-dive/best-practices.md + settings/security/service-users/how-it-works.md: settings/security/service-users/deep-dive/how-it-works.md + settings/security/service-users/permissions.md: settings/security/service-users/deep-dive/permissions.md + settings/security/service-users/best-practices.md: settings/security/service-users/deep-dive/best-practices.md + deployments/sso.md: managed-deployment/sso/overview.md + settings/security/directory-sync/introduction.md: managed-deployment/directory-sync/introduction.md + settings/security/directory-sync/supported-providers.md: managed-deployment/directory-sync/supported-providers.md + settings/security/directory-sync/managing/ms-entra.md: managed-deployment/directory-sync/managing/ms-entra.md + settings/security/directory-sync/managing/okta.md: managed-deployment/directory-sync/managing/okta.md + settings/security/directory-sync/managing/onelogin.md: managed-deployment/directory-sync/managing/onelogin.md + settings/security/directory-sync/managing/jumpcloud.md: managed-deployment/directory-sync/managing/jumpcloud.md + container/operations/promote-quality-checks.md: operations/promote/managing-promotions/promote-quality-checks.md + container/operations/promote-computed-fields.md: operations/promote/managing-promotions/promote-computed-fields.md + source-datastore/operations/promote-computed-tables.md: operations/promote/managing-promotions/promote-computed-tables.md + source-datastore/operations/promote-computed-files.md: operations/promote/managing-promotions/promote-computed-files.md diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b21c0684c0..0000000000 --- a/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -mkdocs-material==9.5.50 -mkdocs-exclude==1.0.2 -mkdocs-git-revision-date-localized-plugin==1.2.6 -mkdocs-include-markdown-plugin==7.1.8 -mkdocs-macros-plugin==1.3.7 -mkdocs-print-site-plugin==2.7.3 -mkdocs-redirects==1.2.2 -pre-commit==3.8.0 -click<8.3 \ No newline at end of file diff --git a/scripts/check-anchor-changes.sh b/scripts/check-anchor-changes.sh index 54f2d875b4..9add7f4da1 100755 --- a/scripts/check-anchor-changes.sh +++ b/scripts/check-anchor-changes.sh @@ -2,10 +2,7 @@ # Pre-commit hook: detects heading/anchor changes in modified markdown files. # Generates .anchor-changes.md report (gitignored). # -# Prefers the project venv interpreter because check-anchor-changes.py uses -# Python 3.10+ type-union syntax (str | None). Falls back to system python3. +# Runs via uv so the pinned Python (>=3.10, see .python-version) is used — +# check-anchor-changes.py relies on 3.10+ type-union syntax (str | None). -if [ -x venv/bin/python ]; then - exec venv/bin/python scripts/check-anchor-changes.py "$@" -fi -exec python3 scripts/check-anchor-changes.py "$@" +exec uv run python scripts/check-anchor-changes.py "$@" diff --git a/scripts/check-broken-images.sh b/scripts/check-broken-images.sh index 7b60bc3fc8..60e5a34eee 100755 --- a/scripts/check-broken-images.sh +++ b/scripts/check-broken-images.sh @@ -9,4 +9,4 @@ # - Relative paths: ../assets/foo.png, ../../assets/bar.png # - Absolute paths: /assets/foo.png (resolved from docs/) -python3 scripts/check-broken-images.py +uv run python scripts/check-broken-images.py diff --git a/scripts/check-build-warnings.sh b/scripts/check-build-warnings.sh new file mode 100755 index 0000000000..578b87930e --- /dev/null +++ b/scripts/check-build-warnings.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Pre-commit hook: runs `zensical build` and reports warnings. +# Warnings (e.g. unresolved links) are surfaced but do not fail the commit, +# matching the previous mkdocs-based behavior. + +set -euo pipefail + +# Build with Zensical; strip ANSI color codes so grep/printing stay clean. +output=$(uv run zensical build 2>&1 | sed $'s/\x1b\\[[0-9;]*m//g') || true +warnings=$(echo "$output" | grep -iE "^warning:|page does not exist|unresolved" || true) +summary=$(echo "$output" | grep -iE "issues found" || true) + +if [ -z "$warnings" ]; then + echo "No build warnings." + exit 0 +fi + +echo "" +echo "=== Zensical Build Warnings ===" +echo "" +echo "$warnings" +echo "" +[ -n "$summary" ] && echo "$summary" +echo "===============================" +echo "" + +exit 0 diff --git a/scripts/check-mkdocs-warnings.sh b/scripts/check-mkdocs-warnings.sh deleted file mode 100755 index df2d4f0650..0000000000 --- a/scripts/check-mkdocs-warnings.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash -# Pre-commit hook: runs mkdocs build and reports warnings. -# Acceptable warnings (e.g., print_page from print-site plugin) are labeled -# but do not fail the build. All warnings are always shown in the log. - -set -euo pipefail - -output=$(source venv/bin/activate && mkdocs build 2>&1) || true -warnings=$(echo "$output" | grep "WARNING" || true) - -if [ -z "$warnings" ]; then - exit 0 -fi - -echo "" -echo "=== MkDocs Build Warnings ===" -echo "" - -while IFS= read -r line; do - if echo "$line" | grep -q "print_page"; then - echo " [acceptable] $line" - else - echo " [review] $line" - fi -done <<< "$warnings" - -total=$(echo "$warnings" | wc -l | tr -d " ") -echo "" -echo "Total: ${total} warning(s)" -echo "=============================" -echo "" - -exit 0 diff --git a/scripts/generate-redirects.py b/scripts/generate-redirects.py new file mode 100644 index 0000000000..c242c8ef56 --- /dev/null +++ b/scripts/generate-redirects.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Generate client-side redirect stub pages into the built site. + +Zensical has no equivalent of the `mkdocs-redirects` plugin yet, so this script +reproduces its output: for every `old -> new` entry in redirects.yml it writes a +small HTML page at the old URL that meta-refreshes (and JS-redirects, preserving +the query string and hash) to the new URL, with a canonical link for SEO. + +Run after the build: + + uv run zensical build && uv run python scripts/generate-redirects.py + +Paths in redirects.yml are relative to docs/ (e.g. `old/page.md`), matching the +old mkdocs `redirect_maps`. URL shapes follow `use_directory_urls` (default true). +""" + +from __future__ import annotations + +import sys +import tomllib +from pathlib import Path + +import yaml + +REPO = Path(__file__).resolve().parent.parent +REDIRECTS_FILE = REPO / "redirects.yml" +CONFIG_FILE = REPO / "zensical.toml" + +STUB = """\ + + + + + Redirecting… + + + + + + + Redirecting to {target}… + + +""" + + +def load_config() -> tuple[str, Path, bool]: + """Read site_url / site_dir / use_directory_urls from zensical.toml.""" + with open(CONFIG_FILE, "rb") as f: + cfg = tomllib.load(f) + project = cfg.get("project", cfg) + site_url = (project.get("site_url") or "/").rstrip("/") + "/" + site_dir = REPO / project.get("site_dir", "site") + use_directory_urls = project.get("use_directory_urls", True) + return site_url, site_dir, use_directory_urls + + +def out_path(md: str, use_directory_urls: bool) -> str: + """Built HTML path for a source markdown path (matches mkdocs-redirects).""" + stem = md[:-3] if md.endswith(".md") else md + if not use_directory_urls: + return stem + ".html" + if stem == "index" or stem.endswith("/index"): + return stem + ".html" + return stem + "/index.html" + + +def target_url(md: str, site_url: str, use_directory_urls: bool) -> str: + """Absolute destination URL for a source markdown path.""" + stem = md[:-3] if md.endswith(".md") else md + if not use_directory_urls: + return site_url + stem + ".html" + if stem == "index": + rel = "" + elif stem.endswith("/index"): + rel = stem[: -len("index")] + else: + rel = stem + "/" + return site_url + rel + + +def main() -> int: + if not REDIRECTS_FILE.exists(): + print(f"error: {REDIRECTS_FILE} not found", file=sys.stderr) + return 1 + + with open(REDIRECTS_FILE, encoding="utf-8") as f: + redirects = (yaml.safe_load(f) or {}).get("redirects", {}) + + site_url, site_dir, use_directory_urls = load_config() + if not site_dir.is_dir(): + print( + f"error: build output {site_dir} not found - run `zensical build` first", + file=sys.stderr, + ) + return 1 + + written = skipped = 0 + for old, new in redirects.items(): + dest = site_dir / out_path(old, use_directory_urls) + if dest.exists(): + # Never clobber a real built page. + print(f" skip (exists): {old}") + skipped += 1 + continue + dest.parent.mkdir(parents=True, exist_ok=True) + dest.write_text( + STUB.format(target=target_url(new, site_url, use_directory_urls)), + encoding="utf-8", + ) + written += 1 + + print(f"\nRedirects: {written} written, {skipped} skipped, {len(redirects)} total") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000..c2c69e86f9 --- /dev/null +++ b/uv.lock @@ -0,0 +1,440 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "deepmerge" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/b2/d6fc3f2347f43dada79e5ff118493e8109c98400a0e29a1d5264a3aa479b/distlib-0.4.1.tar.gz", hash = "sha256:c3804d0d2d4b5fcd44036eb860cb6660485fcdf5c2aba53dc324d805837ea65b", size = 610526, upload-time = "2026-06-02T11:17:40.691Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/18/3497c4fa83a76dcb154923fd2075522e8dd6995ecee4093c00ae18160046/distlib-0.4.1-py2.py3-none-any.whl", hash = "sha256:9c2c552c68cbadc619f2d0ed3a69e27c351a3f4c9baa9ffb7df9e9cdc3d19a97", size = 469216, upload-time = "2026-06-02T11:17:38.779Z" }, +] + +[[package]] +name = "filelock" +version = "3.29.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/f9/f38573ed5844586db374d085911740a501ccfa373b455fc9413f09f85237/filelock-3.29.1.tar.gz", hash = "sha256:d97e6b1b9757569626c58caa07dc4beb1613f4a2938b1e8cc81afca398906c9e", size = 59335, upload-time = "2026-06-03T15:19:04.053Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/a0/614c5fe402fd88951df45f4dda2fa3b4e17a99ecd92340771929169b3b95/filelock-3.29.1-py3-none-any.whl", hash = "sha256:85199dfd706869641b72b2e8955d5416a4b2b7dc4b0e8e6d97b4cc1299a6983b", size = 40750, upload-time = "2026-06-03T15:19:02.959Z" }, +] + +[[package]] +name = "identify" +version = "2.6.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/2de9408ac81acbb8a7d05d4cc064a152ccf33b3d480ebe0cd292153db239/pre_commit-4.6.0.tar.gz", hash = "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9", size = 198525, upload-time = "2026-04-21T20:31:41.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl", hash = "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b", size = 226472, upload-time = "2026-04-21T20:31:40.092Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.21.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/26/d1015444da4d952a1ca487a236b522eb979766f0295a0bd0c5fc089989a9/pymdown_extensions-10.21.3.tar.gz", hash = "sha256:72cfcf55f07aea0d4af2c4f11dd4e52466ddfb1bb819673146398e0bd3a77354", size = 854140, upload-time = "2026-05-13T12:57:32.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/85/545a951eecc270fcd688288c600017e2050a1aacb56c711d208586d3e470/pymdown_extensions-10.21.3-py3-none-any.whl", hash = "sha256:d7a5d08014fc571e80ca21dd6f854e31f94c489800350564d55d15b3c41e76b6", size = 269002, upload-time = "2026-05-13T12:57:30.296Z" }, +] + +[[package]] +name = "python-discovery" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/12/38c1a0b1e64806780c9563e3fc9f6e472251839662587cfbe9bfaf2ae10a/python_discovery-1.4.0.tar.gz", hash = "sha256:eb8bc7daad3c226c147e45bb4e970a1feb1bf4048ee178e6db59e197b8010ce3", size = 68455, upload-time = "2026-05-28T01:15:37.639Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/8d/3d316429f65029532bb1e28ff77b797d86b5ac3915bb44ca4e19aa283d43/python_discovery-1.4.0-py3-none-any.whl", hash = "sha256:26ed78d703e234879a66244c7d4114563fb13ec5cd30a2d1357e5fb4850782da", size = 33217, upload-time = "2026-05-28T01:15:36.573Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "qualytics-userguide" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "pyyaml" }, + { name = "zensical" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pre-commit" }, +] + +[package.metadata] +requires-dist = [ + { name = "pyyaml", specifier = ">=6.0" }, + { name = "zensical", specifier = "==0.0.44" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "pre-commit", specifier = ">=3.8" }] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0d/4e93c8e6d1001a75763f87d8f5ecda8ebc7f4aa2153dddfaf4ae8892821a/virtualenv-21.4.2.tar.gz", hash = "sha256:38e6ee0a555615c0ea9da2ac7e9998fe8dc3b911dd33ad8eaad2020957653b0c", size = 7613326, upload-time = "2026-05-31T17:01:22.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/c4/557dc082be035381b85fdb2b74e21d3d21b57750b74f2b47a32f3a639ff9/virtualenv-21.4.2-py3-none-any.whl", hash = "sha256:854210ca524a1a4d0d744734f4acbc721c3ffe163b85bbf5d56d14d5ae2f0fae", size = 7594079, upload-time = "2026-05-31T17:01:20.735Z" }, +] + +[[package]] +name = "zensical" +version = "0.0.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "deepmerge" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "pyyaml" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/44/e8c891e607708ed6e2b38620948f0715d13cb378f9525caab84aaf4dfb6c/zensical-0.0.44.tar.gz", hash = "sha256:7452eb2a88e2e42e9a9d7861c5ee6a3b4413766a5c737aa6dc840dab344d46aa", size = 3934771, upload-time = "2026-06-04T17:30:53.326Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/0f/08c503dff4077c66a99f00556d02f16bd1c67790e43cdd256499d6cab251/zensical-0.0.44-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f7d562b231129356c1ac0a05147d48da759111b671be5c2d4ff6765639550606", size = 12702807, upload-time = "2026-06-04T17:30:18.476Z" }, + { url = "https://files.pythonhosted.org/packages/f7/01/88806c9e8ca6caa246dd9c5c3e15a8d25015c0862820e32b5cfd5cf01d56/zensical-0.0.44-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:534c5303b7f3e4e842a2aa21cd6afe1a19b89a62cda22bff64a8932d988c1e2a", size = 12575802, upload-time = "2026-06-04T17:30:21.617Z" }, + { url = "https://files.pythonhosted.org/packages/5e/21/bc55faf26e5a5e6d8b9216b9efba8a5f2b8c1db09d123b077696e5286fd9/zensical-0.0.44-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3255e14e648571eba1fc51b5d638e5738b96579acc2fd346ae94bb00ca1a37b9", size = 12944141, upload-time = "2026-06-04T17:30:24.532Z" }, + { url = "https://files.pythonhosted.org/packages/2d/62/27f934e443894174cddd1cc1d99fb296e0657611a21fdceb4e071a1207ac/zensical-0.0.44-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83b167831e181451d266aedad66bf4d199b8ee3147439261c4193bcea09fd8b2", size = 12916341, upload-time = "2026-06-04T17:30:28.134Z" }, + { url = "https://files.pythonhosted.org/packages/18/65/aaa4f0630cb5cd5083176e45af9221bcabfc304af961a5c180f64b5a4dde/zensical-0.0.44-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7556f3a824b45302e29ec2145b2f8c52ca9df3c6c7f2ac40bc7ce3d39f090f01", size = 13277072, upload-time = "2026-06-04T17:30:31.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/542ee91da33ec16fefcb5bf5fee40e29bfb15193adade6e729a2d3089982/zensical-0.0.44-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d27ca2de859241fe13871f252c488b5aabcf757772973ba6e57db6be1cdee55", size = 12977180, upload-time = "2026-06-04T17:30:34.508Z" }, + { url = "https://files.pythonhosted.org/packages/4b/71/4a20eb41b312e458e111119a2902ab402bd60320ea1c029ef1f4839c35ad/zensical-0.0.44-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:062c8a4071f75b25bcbe66c95d8984b967ed43ea9eeb3fd79374b4409618f93d", size = 13122478, upload-time = "2026-06-04T17:30:37.44Z" }, + { url = "https://files.pythonhosted.org/packages/67/90/d01e1fbe39ca687cbd076d1eeee9a2ac70b255d18a0f178ec9c0465ae349/zensical-0.0.44-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:17252630f2e4294ae8852b1616b6d87bdafb4d7608d2eb75f6d5ded043bd05ff", size = 13188163, upload-time = "2026-06-04T17:30:40.218Z" }, + { url = "https://files.pythonhosted.org/packages/08/bf/34a2080dcc131dba174f4247e2309113d9fcdaad0f1bd5bd4e0891d87991/zensical-0.0.44-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:4d0dba5a44634bff9d0661ca212d602c126efdb1d7a122c6a389630d17a5c15c", size = 13330242, upload-time = "2026-06-04T17:30:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/eb/81/d752314525b6309657f5bf52b5f4414884df7b1175dc4ad6aaac5e2f5f1d/zensical-0.0.44-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f7ef005280c62a7cfa258583ff68b443bd5e460da9f996f7c671251403dcdb4a", size = 13261108, upload-time = "2026-06-04T17:30:45.516Z" }, + { url = "https://files.pythonhosted.org/packages/d5/08/cd69f37e43619f5613612d2e6b1eeee2842101c29b2db9fdde501716086d/zensical-0.0.44-cp310-abi3-win32.whl", hash = "sha256:b844e28292e9ea93e5dcca229773c027fd3931419d581e1af4fd5ff310679237", size = 12261668, upload-time = "2026-06-04T17:30:48.217Z" }, + { url = "https://files.pythonhosted.org/packages/d4/4d/261244d82be63383482717651befa9971255a6c1399bae61d6c14a117dd9/zensical-0.0.44-cp310-abi3-win_amd64.whl", hash = "sha256:912219e11af23081a7b6bc13e81131bdeacd6bb3516b9508c6b52d8b23aa8208", size = 12502071, upload-time = "2026-06-04T17:30:51.02Z" }, +] diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 0000000000..72f9acbd0d --- /dev/null +++ b/zensical.toml @@ -0,0 +1,1001 @@ +# ============================================================================ +# Zensical configuration for the Qualytics User Guide. +# Native Zensical config (the modern replacement for the former mkdocs.yml). +# ============================================================================ + +[project] +site_name = "User Guide" +site_url = "https://userguide.qualytics.io/" +site_description = "User Guide for the Qualytics data quality platform" +site_author = "Qualytics Team" +repo_url = "https://github.com/Qualytics/userguide" +repo_name = "GitHub" +edit_uri = "edit/main/docs/" +copyright = "Copyright © 2026 Qualytics" + +plugins = ["search", "macros"] + +extra_css = [ + # Brand tokens first, then base styles, then modern layers, then print. + "stylesheets/tokens.css", + "stylesheets/extra.css", + "stylesheets/components.css", + "stylesheets/home.css", + "stylesheets/print.css", +] + +extra_javascript = [ + "javascripts/os-detect.js", + "javascripts/card-filter.js", +] + +nav = [ + { "Introduction" = "index.md" }, + { "Using the Platform" = [ + "using-the-platform/onboarding.md", + "using-the-platform/quick-start-guide.md", + "glossary.md", + "using-the-platform/printing.md", + { "Web Application" = [ + { "Overview" = "using-the-platform/web-app/overview.md" }, + { "App Navigation" = "using-the-platform/web-app/app-navigation.md" }, + { "Top Right Side Menu" = [ + { "Getting Started" = "using-the-platform/web-app/top-right-menu/getting-started.md" }, + { "Add-ons" = "using-the-platform/web-app/top-right-menu/add-ons.md" }, + { "In-App Notifications" = [ + { "Introduction" = "using-the-platform/web-app/top-right-menu/in-app-notifications/introduction.md" }, + { "How-tos" = [ + { "Navigate" = "using-the-platform/web-app/top-right-menu/in-app-notifications/how-tos/navigate.md" }, + { "Mark as Read" = "using-the-platform/web-app/top-right-menu/in-app-notifications/how-tos/mark-as-read.md" }, + { "Bulk Mark as Read" = "using-the-platform/web-app/top-right-menu/in-app-notifications/how-tos/bulk-mark-as-read.md" }, + ] }, + { "FAQ" = "using-the-platform/web-app/top-right-menu/in-app-notifications/faq.md" }, + { "API" = "using-the-platform/web-app/top-right-menu/in-app-notifications/api.md" }, + ] }, + { "Discover" = "using-the-platform/web-app/top-right-menu/discover.md" }, + { "Theme" = "using-the-platform/web-app/top-right-menu/theme.md" }, + { "View Mode" = "using-the-platform/web-app/top-right-menu/view-mode.md" }, + { "Product Updates" = "using-the-platform/web-app/top-right-menu/product-updates.md" }, + { "User Profile" = [ + { "Introduction" = "using-the-platform/web-app/top-right-menu/user-profile/introduction.md" }, + { "Profile" = "using-the-platform/web-app/top-right-menu/user-profile/profile.md" }, + { "Team Restriction" = "using-the-platform/web-app/top-right-menu/user-profile/team-restriction.md" }, + ] }, + ] }, + { "Global Search" = [ + { "Getting Started" = "using-the-platform/web-app/global-search/getting-started.md" }, + { "Command Palette" = "using-the-platform/web-app/global-search/command-palette.md" }, + { "Keyboard Shortcuts" = "using-the-platform/web-app/global-search/keyboard-shortcuts.md" }, + ] }, + ] }, + { "Source Datastores" = [ + { "Overview" = "source-datastore/overview.md" }, + { "Datastore" = [ + { "Getting Started" = "source-datastore/datastore/overview-of-a-datastore.md" }, + { "JDBC" = [ + { "Introduction" = "source-datastore/datastore/jdbc/overview-of-a-jdbc-datastore.md" }, + { "Athena" = [ + { "Athena Connector" = "source-datastore/datastore/jdbc/athena/athena-connector.md" }, + { "Permissions" = "source-datastore/datastore/jdbc/athena/permissions.md" }, + { "Authentication" = "source-datastore/datastore/jdbc/athena/authentication.md" }, + { "Troubleshooting" = "source-datastore/datastore/jdbc/athena/troubleshooting.md" }, + { "Managing" = [ + { "Add Source Datastore" = "source-datastore/datastore/jdbc/athena/managing/add-source.md" }, + { "Create via API" = "source-datastore/datastore/jdbc/athena/managing/api.md" }, + ] }, + ] }, + "source-datastore/datastore/jdbc/bigquery.md", + "source-datastore/datastore/jdbc/databricks.md", + "source-datastore/datastore/jdbc/db2.md", + "source-datastore/datastore/jdbc/dremio.md", + "source-datastore/datastore/jdbc/fabric-analytics.md", + "source-datastore/datastore/jdbc/hive.md", + "source-datastore/datastore/jdbc/maria-db.md", + "source-datastore/datastore/jdbc/microsoft-sql-server.md", + "source-datastore/datastore/jdbc/mysql.md", + "source-datastore/datastore/jdbc/oracle.md", + "source-datastore/datastore/jdbc/postgresql.md", + "source-datastore/datastore/jdbc/presto.md", + "source-datastore/datastore/jdbc/redshift.md", + { "SAP HANA" = [ + { "SAP HANA Connector" = "source-datastore/datastore/jdbc/sap-hana/sap-hana-connector.md" }, + { "Permissions" = "source-datastore/datastore/jdbc/sap-hana/permissions.md" }, + { "Authentication" = "source-datastore/datastore/jdbc/sap-hana/authentication.md" }, + { "Troubleshooting" = "source-datastore/datastore/jdbc/sap-hana/troubleshooting.md" }, + { "How-tos" = [ + { "Add Source Datastore" = "source-datastore/datastore/jdbc/sap-hana/how-tos/add-source.md" }, + { "Create via API" = "source-datastore/datastore/jdbc/sap-hana/how-tos/api.md" }, + ] }, + ] }, + "source-datastore/datastore/jdbc/snowflake.md", + "source-datastore/datastore/jdbc/synapse.md", + "source-datastore/datastore/jdbc/teradata.md", + "source-datastore/datastore/jdbc/timescale-db.md", + "source-datastore/datastore/jdbc/trino.md", + ] }, + { "DFS" = [ + { "Introduction" = "source-datastore/datastore/dfs/overview-of-a-dfs-datastore.md" }, + { "Deep Dive" = [ + { "Supported File Formats" = "source-datastore/datastore/dfs/deep-dive/dfs-supported-file-formats.md" }, + { "Filename Globbing" = "source-datastore/datastore/dfs/deep-dive/dfs-filename-globbing.md" }, + ] }, + "source-datastore/datastore/dfs/amazon-s3.md", + "source-datastore/datastore/dfs/azure-datalake-storage.md", + "source-datastore/datastore/dfs/google-cloud-storage.md", + ] }, + { "Connection" = [ + { "Introduction" = "source-datastore/datastore/connection/introduction.md" }, + { "How It Works" = "source-datastore/datastore/connection/how-it-works.md" }, + { "Available Connectors" = "source-datastore/datastore/connection/available-datastore-connectors.md" }, + ] }, + { "Multiple-Schema" = [ + { "Introduction" = "source-datastore/datastore/multi-schema/overview.md" }, + { "How It Works" = "source-datastore/datastore/multi-schema/how-it-works.md" }, + { "Supported Connectors" = "source-datastore/datastore/multi-schema/supported-connectors.md" }, + { "Permissions" = "source-datastore/datastore/multi-schema/permissions.md" }, + { "FAQ" = "source-datastore/datastore/multi-schema/faq.md" }, + ] }, + { "How-tos" = [ + { "Add Source Datastore" = "source-datastore/datastore/how-tos/add-new-source-datastore.md" }, + { "Add Datastore with existing connection" = "source-datastore/datastore/how-tos/existing-connection.md" }, + { "Edit Datastore" = "source-datastore/datastore/how-tos/edit-datastore.md" }, + { "Delete Datastore" = "source-datastore/datastore/how-tos/delete-datastore.md" }, + ] }, + { "API" = "source-datastore/datastore/api.md" }, + { "FAQ" = "source-datastore/datastore/faq.md" }, + ] }, + { "Enrichment Datastore" = [ + { "Getting Started" = "source-datastore/enrichment-datastore/getting-started.md" }, + { "Deep Dive" = [ + { "Introduction" = "source-datastore/enrichment-datastore/deep-dive/introduction.md" }, + { "Permissions" = "source-datastore/enrichment-datastore/deep-dive/permissions.md" }, + ] }, + { "How-tos" = [ + { "Link Enrichment Datastore" = "source-datastore/enrichment-datastore/how-tos/link-enrichment.md" }, + { "Link on Datastore Creation" = "source-datastore/enrichment-datastore/how-tos/link-during-creation.md" }, + { "Unlink Enrichment Datastore" = "source-datastore/enrichment-datastore/how-tos/unlink-enrichment.md" }, + ] }, + { "API" = "source-datastore/enrichment-datastore/api.md" }, + { "FAQ" = "source-datastore/enrichment-datastore/faq.md" }, + ] }, + { "Data Quality Score" = [ + { "Getting Started" = "source-datastore/data-quality-score/getting-started.md" }, + { "Deep Dive" = [ + { "Introduction" = "source-datastore/data-quality-score/deep-dive/introduction.md" }, + { "Permissions" = "source-datastore/data-quality-score/deep-dive/permissions.md" }, + ] }, + { "How-tos" = [ + { "Settings" = "source-datastore/data-quality-score/how-tos/quality-score-settings.md" }, + ] }, + { "API" = "source-datastore/data-quality-score/api.md" }, + { "FAQ" = "source-datastore/data-quality-score/faq.md" }, + ] }, + { "Grouping" = [ + { "Getting Started" = "source-datastore/grouping/getting-started.md" }, + { "Deep Dive" = [ + { "Introduction" = "source-datastore/grouping/deep-dive/introduction.md" }, + { "Permissions" = "source-datastore/grouping/deep-dive/permissions.md" }, + ] }, + { "How-tos" = [ + { "Create a Group" = "source-datastore/grouping/how-tos/create-a-group.md" }, + { "Edit a Group" = "source-datastore/grouping/how-tos/edit-a-group.md" }, + { "Delete a Group" = "source-datastore/grouping/how-tos/delete-a-group.md" }, + { "Assign a Group" = "source-datastore/grouping/how-tos/assign-a-datastore.md" }, + { "Unassign a Group" = "source-datastore/grouping/how-tos/unassign-a-datastore.md" }, + { "Filter by Group" = "source-datastore/grouping/how-tos/filter-by-group.md" }, + ] }, + { "API" = "source-datastore/grouping/api.md" }, + { "FAQ" = "source-datastore/grouping/faq.md" }, + ] }, + { "Tags" = [ + { "Getting Started" = "source-datastore/tags/getting-started.md" }, + { "Deep Dive" = [ + { "Introduction" = "source-datastore/tags/deep-dive/introduction.md" }, + { "Permissions" = "source-datastore/tags/deep-dive/permissions.md" }, + ] }, + { "How-tos" = [ + { "Assign a Tag" = "source-datastore/tags/how-tos/assign-tags.md" }, + { "Unassign a Tag" = "source-datastore/tags/how-tos/unassign-tags.md" }, + ] }, + { "API" = "source-datastore/tags/api.md" }, + { "FAQ" = "source-datastore/tags/faq.md" }, + ] }, + { "Tips & Tricks" = [ + { "Right Click Options" = "source-datastore/tips-and-tricks/right-click-options.md" }, + { "Keyboard Shortcuts" = "source-datastore/tips-and-tricks/keyboard-shortcuts.md" }, + ] }, + ] }, + { "Enrichment Datastores" = [ + { "Overview" = "enrichment/overview-of-an-enrichment-datastore.md" }, + { "Table Types" = [ + { "Overview" = "enrichment/table-types.md" }, + { "Enrichment Tables" = "enrichment/enrichment-tables.md" }, + { "Remediation Tables" = "enrichment/remediation-tables.md" }, + { "Metadata Tables" = "enrichment/metadata-tables.md" }, + { "API Payload Examples" = "enrichment/api-payload-examples.md" }, + { "Schema Changelog" = "enrichment/schema-changelog.md" }, + ] }, + { "Data Preview" = "enrichment/enrichment-datastore-preview.md" }, + { "Supported Enrichment Datastores" = "enrichment-support/supported-enrichment-datastores.md" }, + { "Manage Enrichment" = [ + { "Enrichment Actions" = "enrichment/enrichment-actions.md" }, + { "Add Enrichment" = "enrichment/enrichment-datastore-creation.md" }, + { "Edit Enrichment" = "enrichment/edit-enrichment.md" }, + { "Delete Enrichment" = "enrichment/delete-enrichment.md" }, + ] }, + ] }, + { "Containers" = [ + { "Overview" = "container/overview.md" }, + { "Container Types" = "container/container-types.md" }, + { "Container Attributes" = "container/container-attributes.md" }, + { "Actions on Container" = "container/actions-on-container.md" }, + { "Manage Tables and Files" = [ + { "Settings For JDBC Table" = "container/manage-tables-and-files/setting-for-jdbc-table.md" }, + { "Settings For DFS Files Pattern" = "container/manage-tables-and-files/setting-for-dfs-files-pattern.md" }, + { "Identifiers" = "container/settings/identifiers.md" }, + { "Grouping" = "container/settings/grouping.md" }, + { "General" = "container/settings/general.md" }, + { "Add Checks" = "container/manage-tables-and-files/add-checks.md" }, + { "Run" = "container/manage-tables-and-files/run.md" }, + { "Observability Settings" = "container/manage-tables-and-files/observability-settings.md" }, + { "Export" = "container/manage-tables-and-files/export.md" }, + { "Materialize" = "container/manage-tables-and-files/materialize.md" }, + { "Delete" = "container/manage-tables-and-files/delete.md" }, + { "Mark Tables & Files as Favorite" = "container/manage-tables-and-files/mark-tables-&-files-as-favorite.md" }, + ] }, + { "Complex Data Types" = "container/complex-data-types.md" }, + { "Computed Tables and Files" = [ + { "Overview" = "container/computed-tables-and-files/overview.md" }, + { "Computed Tables" = "container/computed-tables-and-files/computed-tables.md" }, + { "Computed Files" = "container/computed-tables-and-files/computed-files.md" }, + { "Computed Table VS File" = "container/computed-tables-and-files/computed-table-vs-file.md" }, + ] }, + { "Computed Join" = "container/computed-join.md" }, + { "Data Preview" = "container/data-preview.md" }, + { "Lineage" = [ + { "Getting Started" = "container/lineage/getting-started.md" }, + { "Deep Dive" = [ + { "Introduction" = "container/lineage/deep-dive/introduction.md" }, + { "How Lineage Works" = "container/lineage/deep-dive/how-lineage-works.md" }, + { "Lineage Sources" = "container/lineage/deep-dive/lineage-sources.md" }, + { "Reading the Graph" = "container/lineage/deep-dive/reading-the-graph.md" }, + { "Field-level Lineage" = "container/lineage/deep-dive/field-level-lineage.md" }, + ] }, + { "How-tos" = [ + { "Add an Upstream Connection" = "container/lineage/how-tos/add-upstream-connection.md" }, + { "Add a Downstream Connection" = "container/lineage/how-tos/add-downstream-connection.md" }, + { "Delete an Edge" = "container/lineage/how-tos/delete-an-edge.md" }, + { "Expand the Graph" = "container/lineage/how-tos/expand-the-graph.md" }, + { "Focus on a Field" = "container/lineage/how-tos/focus-on-a-field.md" }, + { "Use the Toolbar" = "container/lineage/how-tos/use-the-toolbar.md" }, + { "View Anomalies" = "container/lineage/how-tos/view-anomalies.md" }, + ] }, + { "API" = "container/lineage/api.md" }, + { "FAQ" = "container/lineage/faq.md" }, + ] }, + ] }, + { "Fields" = [ + { "Overview" = "fields/field-profiles.md" }, + { "Status" = [ + { "Getting Started" = "fields/field-status/overview.md" }, + { "Deep Dive" = [ + { "Introduction" = "fields/field-status/concepts/understanding-field-status.md" }, + { "Status Types" = "fields/field-status/concepts/field-status-types.md" }, + { "Lifecycle" = "fields/field-status/concepts/field-status-lifecycle.md" }, + { "Field Masking" = "fields/field-status/concepts/field-masking.md" }, + { "Merge Fields" = "fields/field-status/concepts/merge-fields.md" }, + ] }, + { "Managing" = [ + { "Filtering by Status" = "fields/field-status/managing-field-status/filtering-by-status.md" }, + { "Mask a Field" = "fields/field-status/managing-field-status/mask-a-field.md" }, + { "Unmask a Field" = "fields/field-status/managing-field-status/unmask-a-field.md" }, + { "Audit Log" = "fields/field-status/managing-field-status/masking-audit-log.md" }, + { "Exclude a Field" = "fields/field-status/managing-field-status/exclude-a-field.md" }, + { "Restore a Field" = "fields/field-status/managing-field-status/restore-a-field.md" }, + { "Delete a Field" = "fields/field-status/managing-field-status/delete-a-field.md" }, + { "Merge Fields" = "fields/field-status/managing-field-status/merge-fields.md" }, + ] }, + { "API" = "fields/field-status/concepts/field-status-api.md" }, + { "FAQ" = "fields/field-status/concepts/field-status-faq.md" }, + ] }, + { "Computed Fields" = [ + { "Overview" = "fields/computed-fields/overview.md" }, + { "Transformation Types" = "fields/computed-fields/transformation-types.md" }, + { "Computed Fields Details" = "fields/computed-fields/computed-fields-details.md" }, + { "Add Computed Fields" = "fields/computed-fields/add-computed-fields.md" }, + ] }, + ] }, + { "Operations" = [ + { "Sync" = [ + { "Sync" = "operations/sync/sync.md" }, + ] }, + { "Profile" = [ + { "Profile" = "operations/profile/profile.md" }, + ] }, + { "Scan" = [ + { "Scan" = "operations/scan/scan.md" }, + ] }, + { "External Scan" = [ + { "External Scan" = "operations/external-scan/external-scan.md" }, + ] }, + { "Export Operation" = [ + { "Export Operation" = "operations/export-operation/export-operation.md" }, + ] }, + { "Materialize Operation" = [ + { "Materialize Operation" = "operations/materialize-operation/materialize-operation.md" }, + ] }, + { "Promote" = [ + { "Overview" = "operations/promote/overview.md" }, + { "Deep Dive" = [ + { "Getting Started" = "operations/promote/deep-dive/getting-started.md" }, + { "Promote Types" = "operations/promote/deep-dive/promote-types.md" }, + { "Entity Matching" = "operations/promote/deep-dive/entity-matching.md" }, + { "Permissions" = "operations/promote/deep-dive/permissions.md" }, + { "Use Cases" = "operations/promote/deep-dive/use-cases.md" }, + ] }, + { "Managing Promotions" = [ + { "Promote Quality Checks" = "operations/promote/managing-promotions/promote-quality-checks.md" }, + { "Promote Computed Fields" = "operations/promote/managing-promotions/promote-computed-fields.md" }, + { "Promote Computed Tables" = "operations/promote/managing-promotions/promote-computed-tables.md" }, + { "Promote Computed Files" = "operations/promote/managing-promotions/promote-computed-files.md" }, + { "View Promotion Results" = "operations/promote/managing-promotions/view-promotion-results.md" }, + ] }, + { "API" = "operations/promote/api.md" }, + { "FAQ" = "operations/promote/faq.md" }, + ] }, + ] }, + { "Weight" = [ + { "Weight Mechanism" = "weight/weighting.md" }, + ] }, + { "Data Quality Checks" = [ + { "Overview" = "data-quality-checks/overview-of-a-check.md" }, + { "Authored" = "data-quality-checks/authored-check.md" }, + { "AI Managed" = [ + { "Getting Started" = "data-quality-checks/ai-managed/getting-started.md" }, + { "Deep Dive" = [ + { "Introduction" = "data-quality-checks/ai-managed/introduction.md" }, + { "How AI Managed Checks Work" = "data-quality-checks/ai-managed/how-ai-managed-checks-work.md" }, + { "AI Managed Checks in Practice" = "data-quality-checks/ai-managed/in-practice.md" }, + { "Permissions" = "data-quality-checks/ai-managed/permissions.md" }, + ] }, + { "Managing" = [ + { "Edit an AI Managed Check" = "data-quality-checks/ai-managed/edit.md" }, + ] }, + { "API" = "data-quality-checks/ai-managed/api.md" }, + { "FAQ" = "data-quality-checks/ai-managed/faq.md" }, + ] }, + { "Rule Types" = [ + { "Rule Types Overview" = "data-quality-checks/rule-types-overview.md" }, + { "After Date Time" = "data-quality-checks/after-date-check.md" }, + { "Aggregation Comparison" = "data-quality-checks/aggregation-comparison-check.md" }, + { "Any Not Null" = "data-quality-checks/any-not-null-check.md" }, + { "Before Date Time" = "data-quality-checks/before-date-time-check.md" }, + { "Between" = "data-quality-checks/between-check.md" }, + { "Between Times" = "data-quality-checks/between-times-check.md" }, + { "Contains Credit Card" = "data-quality-checks/contains-credit-card-check.md" }, + { "Contains Email" = "data-quality-checks/contains-email-check.md" }, + { "Contains Social Security Number" = "data-quality-checks/contains-social-security-number-check.md" }, + { "Contains Url" = "data-quality-checks/contains-url.md" }, + { "Data Diff" = "data-quality-checks/data-diff-check.md" }, + { "Distinct Count" = "data-quality-checks/distinct-count-check.md" }, + { "Entity Resolution" = "data-quality-checks/entity-resolution.md" }, + { "Equal to" = "data-quality-checks/equal-to-check.md" }, + { "Equal to Field" = "data-quality-checks/equal-to-field-check.md" }, + { "Exists In" = "data-quality-checks/exists-in-check.md" }, + { "Expected Schema" = "data-quality-checks/expected-schema-check.md" }, + { "Expected Values" = "data-quality-checks/expected-values-check.md" }, + { "Field Count" = "data-quality-checks/field-count-check.md" }, + { "Freshness Checks" = "data-quality-checks/freshness-check.md" }, + { "Greater Than" = "data-quality-checks/greater-than-check.md" }, + { "Greater Than Field" = "data-quality-checks/greater-than-field-check.md" }, + { "Is Address" = "data-quality-checks/is-address.md" }, + { "Is Credit Card" = "data-quality-checks/is-credit-card-check.md" }, + { "Is Replica Of" = "data-quality-checks/is-replica-of-check.md" }, + { "Is Type" = "data-quality-checks/is-type-check.md" }, + { "Less Than" = "data-quality-checks/less-than-check.md" }, + { "Less Than Field" = "data-quality-checks/less-than-field-check.md" }, + { "Matches Pattern" = "data-quality-checks/matches-pattern-check.md" }, + { "Max Length" = "data-quality-checks/max-length-check.md" }, + { "Max Partition Size" = "data-quality-checks/max-partition-size-check.md" }, + { "Max Value" = "data-quality-checks/max-value-check.md" }, + { "Metric" = "data-quality-checks/metric-check.md" }, + { "Min Length" = "data-quality-checks/min-length-check.md" }, + { "Min Partition Size" = "data-quality-checks/min-partition-size-check.md" }, + { "Min Value" = "data-quality-checks/min-value-check.md" }, + { "Not Exists In" = "data-quality-checks/not-exists-in-check.md" }, + { "Not Future" = "data-quality-checks/not-future-check.md" }, + { "Not Negative" = "data-quality-checks/not-negative-check.md" }, + { "Not Null" = "data-quality-checks/not-null-check.md" }, + { "Positive" = "data-quality-checks/positive-check.md" }, + { "Predicted By" = "data-quality-checks/predicted-by-check.md" }, + { "Required Values" = "data-quality-checks/required-values-check.md" }, + { "Satisfies Expression" = "data-quality-checks/satisfies-expression-check.md" }, + { "Sum" = "data-quality-checks/sum-check.md" }, + { "Time Distribution Size" = "data-quality-checks/time-distribution-size-check.md" }, + { "Unique" = [ + { "Introduction" = "data-quality-checks/unique/introduction.md" }, + { "How It Works" = "data-quality-checks/unique/how-it-works.md" }, + { "Examples" = "data-quality-checks/unique/examples.md" }, + { "API" = "data-quality-checks/unique/api.md" }, + { "FAQ" = "data-quality-checks/unique/faq.md" }, + ] }, + { "Volumetric Checks" = "data-quality-checks/volumetric-check.md" }, + ] }, + { "Check Templates" = "data-quality-checks/checks-template.md" }, + { "Apply Check Template for Quality Check" = "data-quality-checks/apply-check-template-for-quality-checks.md" }, + { "Export Check Templates" = "data-quality-checks/export-check-templates.md" }, + ] }, + { "Datastore Checks" = [ + { "Checks" = "datastore-checks/checks-datastore.md" }, + { "Manage Checks" = [ + { "Overview" = "datastore-checks/overview.md" }, + { "Draft Checks" = "datastore-checks/draft-checks.md" }, + { "Activate Draft Check" = "datastore-checks/activate-draft-check.md" }, + { "Archive Checks" = "datastore-checks/archive-check.md" }, + { "Activate Archived Checks" = "datastore-checks/activate-archived-checks.md" }, + { "Draft Archived Checks" = "datastore-checks/draft-archived-checks.md" }, + { "Restore Archived Checks" = "datastore-checks/restore-archived-checks.md" }, + { "Edit Checks" = "datastore-checks/edit-checks.md" }, + { "Delete Checks" = "datastore-checks/delete-checks.md" }, + { "Dry Run" = "datastore-checks/dry-run.md" }, + { "Clone Check" = "datastore-checks/clone-check.md" }, + { "Quality Check Template" = "datastore-checks/quality-check-template.md" }, + { "Mark Check Favorite" = "datastore-checks/check-favorite.md" }, + { "Filter and Sort" = "datastore-checks/filter-and-sort.md" }, + { "Quality Check Migration" = "datastore-checks/quality-check-migration.md" }, + ] }, + ] }, + { "Observability" = [ + { "Overview" = "observability/observability.md" }, + { "Observability Categories" = [ + { "Measures" = "observability/measures.md" }, + { "Metric" = "observability/metric-check.md" }, + { "Volumetric" = "observability/volumetric.md" }, + { "Freshness" = "observability/freshness.md" }, + ] }, + { "Manage Observability" = [ + { "Overview" = "observability/manage-observability.md" }, + { "Edit Check" = "observability/edit-check.md" }, + { "Edit Threshold" = "observability/edit-threshold.md" }, + { "Edit Maximum Age" = "observability/edit-maximum-age.md" }, + { "Mark Check as Favorite" = "observability/mark-check.md" }, + { "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" }, + ] }, + ] }, + { "Explore" = [ + { "Overview" = "explore/overview-of-explore.md" }, + { "Insights" = "explore/insights.md" }, + { "Activity" = "explore/activity.md" }, + { "Profiles" = "explore/profiles.md" }, + { "Observability" = "explore/observability.md" }, + { "Checks" = "explore/checks.md" }, + { "Anomalies" = "explore/anomalies.md" }, + ] }, + { "Flows" = [ + { "Overview" = "flows/overview.md" }, + { "Add Flow" = "flows/add-flow.md" }, + { "Flow Entry" = "flows/flow-entry.md" }, + { "Trigger Node" = "flows/trigger-node.md" }, + { "Actions Node" = [ + { "Overview" = "flows/actions-node/overview-action.md" }, + { "Operations" = "flows/actions-node/operations.md" }, + { "Anomaly" = [ + { "Introduction" = "flows/actions-node/anomaly/introduction.md" }, + { "Archive" = "flows/actions-node/anomaly/archive-anomaly-action.md" }, + { "Delete" = "flows/actions-node/anomaly/delete-anomaly-action.md" }, + ] }, + { "Notifications" = [ + { "Overview" = "flows/actions-node/notifications/overview.md" }, + { "Message Variables" = "flows/actions-node/notifications/message-variables.md" }, + { "In App" = [ + { "Overview" = "flows/actions-node/notifications/in-app/overview.md" }, + { "API" = "flows/actions-node/notifications/in-app/api.md" }, + { "FAQ" = "flows/actions-node/notifications/in-app/faq.md" }, + ] }, + { "Email" = [ + { "Overview" = "flows/actions-node/notifications/email/overview.md" }, + { "API" = "flows/actions-node/notifications/email/api.md" }, + { "FAQ" = "flows/actions-node/notifications/email/faq.md" }, + ] }, + { "Slack" = [ + { "Overview" = "flows/actions-node/notifications/slack/overview.md" }, + { "API" = "flows/actions-node/notifications/slack/api.md" }, + { "FAQ" = "flows/actions-node/notifications/slack/faq.md" }, + ] }, + { "Microsoft Teams" = [ + { "Overview" = "flows/actions-node/notifications/microsoft-teams/overview.md" }, + { "API" = "flows/actions-node/notifications/microsoft-teams/api.md" }, + { "FAQ" = "flows/actions-node/notifications/microsoft-teams/faq.md" }, + ] }, + { "PagerDuty" = [ + { "Overview" = "flows/actions-node/notifications/pagerduty/overview.md" }, + { "API" = "flows/actions-node/notifications/pagerduty/api.md" }, + { "FAQ" = "flows/actions-node/notifications/pagerduty/faq.md" }, + ] }, + { "FAQ" = "flows/actions-node/notifications/faq.md" }, + ] }, + { "Workflow" = "flows/actions-node/workflow.md" }, + { "Ticketing" = "flows/actions-node/ticketing.md" }, + ] }, + { "View and Track Flow Executions" = "flows/view-created-flows.md" }, + { "Manage Flow" = [ + { "Clone a Flows" = "flows/clone-a-flow.md" }, + { "Execute Manual Flow" = "flows/execute-manual-flows.md" }, + { "Abort Flow" = "flows/abort.md" }, + { "Sort Flow" = "flows/sort-flow.md" }, + { "Edit Flow" = "flows/edit-flow.md" }, + { "Delete Flow" = "flows/delete-flow.md" }, + { "Deactivate Flow" = "flows/deactivate-flow.md" }, + { "Activate Flows" = "flows/activate-flow.md" }, + { "Clone An Action" = "flows/clone-an-action.md" }, + { "Move An Action Node" = "flows/move-an-action-node.md" }, + ] }, + ] }, + { "Tags" = [ + { "Overview" = "tags/overview.md" }, + { "External Tags" = "tags/external-tag.md" }, + { "Manage Tags" = [ + { "Add Tag" = "tags/add-tag.md" }, + { "Applying Tag" = "tags/applying-a-tag.md" }, + { "Edit Tag" = "tags/edit-tag.md" }, + { "Filter and Sort" = "tags/filter-and-sort.md" }, + { "Delete Tag" = "tags/delete-tag.md" }, + ] }, + ] }, + { "Agent Q" = [ + { "Overview" = "agent-q/overview.md" }, + { "Deep Dive" = [ + { "MCP" = "agent-q/deep-dive/mcp.md" }, + { "Agent Q in Action" = "agent-q/deep-dive/in-action.md" }, + { "Conversations, Responses & Context" = "agent-q/deep-dive/conversations.md" }, + { "Best Practices" = "agent-q/deep-dive/best-practices.md" }, + { "Agent Q Limits" = "agent-q/deep-dive/limits.md" }, + { "Agentic API" = "agent-q/deep-dive/agentic.md" }, + ] }, + { "Managing" = [ + { "Connecting External AI Clients" = "agent-q/managing/connecting-external-ai-clients.md" }, + { "Add Integration" = "agent-q/managing/add-integration.md" }, + { "Update Integration" = "agent-q/managing/update-integration.md" }, + { "Remove Integration" = "agent-q/managing/remove-integration.md" }, + { "Start a New Conversation" = "agent-q/managing/start-a-new-conversation.md" }, + { "Resume a Conversation" = "agent-q/managing/resume-a-conversation.md" }, + { "Rename a Conversation" = "agent-q/managing/rename-a-conversation.md" }, + { "Archive a Conversation" = "agent-q/managing/archive-a-conversation.md" }, + { "Restore a Conversation" = "agent-q/managing/restore-a-conversation.md" }, + { "Delete a Conversation" = "agent-q/managing/delete-a-conversation.md" }, + { "Search Conversations" = "agent-q/managing/search-conversations.md" }, + { "Chat Interface Tips" = "agent-q/managing/chat-interface-tips.md" }, + ] }, + { "API" = "agent-q/api.md" }, + { "FAQ" = "agent-q/faq.md" }, + ] }, + { "Settings" = [ + { "Overview" = "settings/overview.md" }, + { "Connections" = "settings/connections/manage-connections.md" }, + { "Integrations" = [ + { "Overview" = "settings/integrations/overview.md" }, + { "Single Sign-On" = "settings/integrations/sso/sso.md" }, + { "Compute" = "settings/integrations/compute/compute.md" }, + { "Workflow" = "settings/integrations/workflow/workflow.md" }, + { "Analytics" = "settings/integrations/analytics/analytics.md" }, + { "Data Catalogs" = [ + { "Overview" = "settings/integrations/data-catalogs/overview.md" }, + { "Atlan" = "settings/integrations/data-catalogs/atlan.md" }, + { "Alation" = "settings/integrations/data-catalogs/alation.md" }, + { "Microsoft Purview" = "settings/integrations/data-catalogs/microsoft-purview.md" }, + { "Collibra" = "settings/integrations/data-catalogs/collibra.md" }, + { "DataHub" = "settings/integrations/data-catalogs/datahub.md" }, + { "External Tag Propagation" = "settings/integrations/data-catalogs/external-tag-propagation.md" }, + { "Display Names and Descriptions" = "settings/integrations/data-catalogs/display-names-and-descriptions.md" }, + ] }, + { "Alerting" = [ + { "Overview" = "settings/integrations/alerting/overview.md" }, + { "Slack" = "settings/integrations/alerting/slack.md" }, + { "Microsoft Teams" = "settings/integrations/alerting/msft_teams.md" }, + { "PagerDuty" = [ + { "Overview" = "settings/integrations/alerting/pagerduty/overview.md" }, + { "Deep Dive" = "settings/integrations/alerting/pagerduty/deep-dive.md" }, + { "API" = "settings/integrations/alerting/pagerduty/pagerduty-api.md" }, + { "FAQ" = "settings/integrations/alerting/pagerduty/pagerduty-faq.md" }, + { "Managing PagerDuty" = [ + { "Add Integration" = "settings/integrations/alerting/pagerduty/managing-pagerduty/add-integration.md" }, + { "Edit Integration" = "settings/integrations/alerting/pagerduty/managing-pagerduty/edit-integration.md" }, + { "Remove Integration" = "settings/integrations/alerting/pagerduty/managing-pagerduty/remove-integration.md" }, + ] }, + ] }, + ] }, + { "Ticketing" = [ + { "Overview" = "settings/integrations/ticketing/ticketing.md" }, + { "Jira" = [ + { "Introduction" = "settings/integrations/ticketing/jira/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/integrations/ticketing/jira/deep-dive/how-it-works.md" }, + { "Permissions" = "settings/integrations/ticketing/jira/deep-dive/permissions.md" }, + ] }, + { "Managing" = [ + { "Configure Jira" = "settings/integrations/ticketing/jira/managing/configure-jira.md" }, + { "Add Connection" = "settings/integrations/ticketing/jira/managing/add-connection.md" }, + { "Edit Connection" = "settings/integrations/ticketing/jira/managing/edit-connection.md" }, + { "Unlink Connection" = "settings/integrations/ticketing/jira/managing/unlink-connection.md" }, + { "Create Ticket" = "settings/integrations/ticketing/jira/managing/create-ticket.md" }, + { "Link Existing Ticket" = "settings/integrations/ticketing/jira/managing/link-existing-ticket.md" }, + { "Unlink Ticket" = "settings/integrations/ticketing/jira/managing/unlink-ticket.md" }, + { "Tips & Tricks" = "settings/integrations/ticketing/jira/managing/tips-and-tricks.md" }, + ] }, + { "FAQ" = "settings/integrations/ticketing/jira/faq.md" }, + ] }, + { "ServiceNow" = [ + { "Introduction" = "settings/integrations/ticketing/servicenow/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/integrations/ticketing/servicenow/deep-dive/how-it-works.md" }, + { "Permissions" = "settings/integrations/ticketing/servicenow/deep-dive/permissions.md" }, + ] }, + { "Managing" = [ + { "Configure ServiceNow" = "settings/integrations/ticketing/servicenow/managing/configure-servicenow.md" }, + { "Add Connection" = "settings/integrations/ticketing/servicenow/managing/add-connection.md" }, + { "Edit Connection" = "settings/integrations/ticketing/servicenow/managing/edit-connection.md" }, + { "Unlink Connection" = "settings/integrations/ticketing/servicenow/managing/unlink-connection.md" }, + { "Create Ticket" = "settings/integrations/ticketing/servicenow/managing/create-ticket.md" }, + { "Link Existing Ticket" = "settings/integrations/ticketing/servicenow/managing/link-existing-ticket.md" }, + { "Unlink Ticket" = "settings/integrations/ticketing/servicenow/managing/unlink-ticket.md" }, + { "Find ServiceNow Values" = "settings/integrations/ticketing/servicenow/managing/find-servicenow-values.md" }, + { "Tips & Tricks" = "settings/integrations/ticketing/servicenow/managing/tips-and-tricks.md" }, + ] }, + { "FAQ" = "settings/integrations/ticketing/servicenow/faq.md" }, + ] }, + ] }, + ] }, + { "Security" = [ + { "Getting Started" = "settings/security/overview.md" }, + { "Users" = [ + { "Introduction" = "settings/security/users/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/security/users/how-it-works.md" }, + { "Permissions" = "settings/security/users/permissions.md" }, + { "Best Practices" = "settings/security/users/best-practices.md" }, + ] }, + { "User Roles" = [ + { "How It Works" = "settings/security/users/roles/overview.md" }, + { "Admin" = "settings/security/users/roles/admin.md" }, + { "Manager" = "settings/security/users/roles/manager.md" }, + { "Member" = "settings/security/users/roles/member.md" }, + ] }, + { "Managing" = [ + { "Edit User" = "settings/security/users/managing/edit-user.md" }, + { "Deactivate User" = "settings/security/users/managing/deactivate-user.md" }, + { "Reactivate User" = "settings/security/users/managing/reactivate-user.md" }, + { "Sort Users" = "settings/security/users/managing/sort-users.md" }, + { "Filter Users" = "settings/security/users/managing/filter-users.md" }, + { "List Columns" = "settings/security/users/managing/list-columns.md" }, + ] }, + { "API" = "settings/security/users/api.md" }, + { "FAQ" = "settings/security/users/faq.md" }, + ] }, + { "Teams" = [ + { "Introduction" = "settings/security/teams/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/security/teams/how-it-works.md" }, + { "Best Practices" = "settings/security/teams/best-practices.md" }, + { "Membership Strategy" = "settings/security/teams/membership-strategy.md" }, + ] }, + { "Team Permissions" = [ + { "How It Works" = "settings/security/teams/team-permissions/overview.md" }, + { "Editor" = "settings/security/teams/team-permissions/editor.md" }, + { "Author" = "settings/security/teams/team-permissions/author.md" }, + { "Drafter" = "settings/security/teams/team-permissions/drafter.md" }, + { "Viewer" = "settings/security/teams/team-permissions/viewer.md" }, + { "Reporter" = "settings/security/teams/team-permissions/reporter.md" }, + ] }, + { "Managing" = [ + { "Add Team" = "settings/security/teams/managing/add-team.md" }, + { "Edit Team" = "settings/security/teams/managing/edit-team.md" }, + { "Delete Team" = "settings/security/teams/managing/delete-team.md" }, + { "Sort Teams" = "settings/security/teams/managing/sort-teams.md" }, + { "List Columns" = "settings/security/teams/managing/list-columns.md" }, + ] }, + { "API" = "settings/security/teams/api.md" }, + { "FAQ" = "settings/security/teams/faq.md" }, + ] }, + { "Service Users" = [ + { "Introduction" = "settings/security/service-users/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/security/service-users/deep-dive/how-it-works.md" }, + { "Permissions" = "settings/security/service-users/deep-dive/permissions.md" }, + { "Best Practices" = "settings/security/service-users/deep-dive/best-practices.md" }, + ] }, + { "Managing" = [ + { "Create Service User" = "settings/security/service-users/managing/create-service-user.md" }, + { "Edit Service User" = "settings/security/service-users/managing/edit-service-user.md" }, + { "Deactivate Service User" = "settings/security/service-users/managing/deactivate-service-user.md" }, + { "Reactivate Service User" = "settings/security/service-users/managing/reactivate-service-user.md" }, + { "Generate Token" = "settings/security/service-users/managing/generate-token.md" }, + { "Sort Service Users" = "settings/security/users/managing/sort-users.md" }, + { "Filter Service Users" = "settings/security/users/managing/filter-users.md" }, + { "List Columns" = "settings/security/users/managing/list-columns.md" }, + ] }, + { "API" = "settings/security/service-users/api.md" }, + { "FAQ" = "settings/security/service-users/faq.md" }, + ] }, + ] }, + { "Access Tokens" = [ + { "Getting Started" = "settings/access-tokens/getting-started.md" }, + { "Personal Token" = [ + { "Introduction" = "settings/access-tokens/personal-token/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/access-tokens/personal-token/deep-dive/how-it-works.md" }, + { "Permissions" = "settings/access-tokens/personal-token/deep-dive/permissions.md" }, + { "Best Practices" = "settings/access-tokens/personal-token/deep-dive/best-practices.md" }, + ] }, + { "Managing" = [ + { "Generate Token" = "settings/access-tokens/personal-token/managing/generate-token.md" }, + { "Revoke Token" = "settings/access-tokens/personal-token/managing/revoke-token.md" }, + { "Restore Token" = "settings/access-tokens/personal-token/managing/restore-token.md" }, + { "Delete Token" = "settings/access-tokens/personal-token/managing/delete-token.md" }, + { "List Columns" = "settings/access-tokens/personal-token/managing/list-columns.md" }, + ] }, + { "API" = "settings/access-tokens/personal-token/api.md" }, + { "FAQ" = "settings/access-tokens/personal-token/faq.md" }, + ] }, + { "Service Token" = [ + { "Introduction" = "settings/access-tokens/service-token/introduction.md" }, + { "Deep Dive" = [ + { "How It Works" = "settings/access-tokens/service-token/deep-dive/how-it-works.md" }, + { "Permissions" = "settings/access-tokens/service-token/deep-dive/permissions.md" }, + { "Best Practices" = "settings/access-tokens/service-token/deep-dive/best-practices.md" }, + ] }, + { "Managing" = [ + { "Generate Service Token" = "settings/access-tokens/service-token/managing/generate-service-token.md" }, + { "Revoke Service Token" = "settings/access-tokens/service-token/managing/revoke-service-token.md" }, + { "Restore Service Token" = "settings/access-tokens/service-token/managing/restore-service-token.md" }, + { "Delete Service Token" = "settings/access-tokens/service-token/managing/delete-service-token.md" }, + { "List Columns" = "settings/access-tokens/service-token/managing/list-columns.md" }, + ] }, + { "API" = "settings/access-tokens/service-token/api.md" }, + { "FAQ" = "settings/access-tokens/service-token/faq.md" }, + ] }, + ] }, + { "Status" = [ + { "Getting Started" = "settings/status/getting-started.md" }, + { "Deep Dive" = [ + { "Platform Status" = "settings/status/deep-dive/platform-status.md" }, + { "Private Routes" = "settings/status/deep-dive/private-routes.md" }, + { "Permissions" = "settings/status/deep-dive/permissions.md" }, + ] }, + { "Managing" = [ + { "Refresh Status Summary" = "settings/status/managing/refresh-status-summary.md" }, + { "Restart Dataplane" = "settings/status/managing/restart-dataplane.md" }, + { "Copy Status Summary" = "settings/status/managing/copy-status-summary.md" }, + ] }, + { "API" = "settings/status/api.md" }, + { "FAQ" = "settings/status/faq.md" }, + ] }, + ] }, + { "FAQ" = [ + "quality-scores/what-are-quality-scores.md", + ] }, + { "Misc" = [ + { "Deployment Options" = "deployments/overview.md" }, + { "Self-Hosted Deployment" = [ + { "Deployment Guide" = "deployments/self-hosted-deployment.md" }, + { "OIDC Authentication" = "deployments/oidc-configuration.md" }, + { "Auth0 Authentication" = "deployments/auth0-setup.md" }, + { "SMTP Configuration" = "deployments/smtp-configuration.md" }, + ] }, + { "Databricks Deployment" = "deployments/databricks-deployment.md" }, + { "IAM Role Authentication" = "deployments/iam-role-authentication.md" }, + { "External Automation" = [ + { "Overview" = "operation-automation/overview.md" }, + { "Linux Machine" = "operation-automation/linux-machine.md" }, + { "Windows Machine" = "operation-automation/windows-machine.md" }, + { "Automated Setup Using Qualytics CLI" = "operation-automation/automated-setup-using-qualytics-cli.md" }, + ] }, + "dfs-globbing/how-dfs-filename-globbing-works.md", + "glossary.md", + ] }, + { "Managed Deployment" = [ + { "Overview" = "managed-deployment/overview.md" }, + { "SSO Setup" = "managed-deployment/sso/overview.md" }, + { "Directory Sync" = [ + { "Introduction" = "managed-deployment/directory-sync/introduction.md" }, + { "Supported Providers" = "managed-deployment/directory-sync/supported-providers.md" }, + { "Managing" = [ + { "Microsoft Entra" = "managed-deployment/directory-sync/managing/ms-entra.md" }, + { "Okta" = "managed-deployment/directory-sync/managing/okta.md" }, + { "OneLogin" = "managed-deployment/directory-sync/managing/onelogin.md" }, + { "JumpCloud" = "managed-deployment/directory-sync/managing/jumpcloud.md" }, + ] }, + ] }, + ] }, + { "Self-Hosted" = [ + { "License" = [ + { "Getting Started" = "self-hosted/license/getting-started.md" }, + { "Deep Dive" = [ + { "How It Works" = "self-hosted/license/deep-dive/how-it-works.md" }, + { "Permissions" = "self-hosted/license/deep-dive/permissions.md" }, + ] }, + { "Managing" = [ + { "Update License" = "self-hosted/license/managing/update-license.md" }, + { "Generate License Request" = "self-hosted/license/managing/generate-license-request.md" }, + ] }, + { "API" = "self-hosted/license/api.md" }, + { "FAQ" = "self-hosted/license/faq.md" }, + ] }, + ] }, + ] }, + { "Qualytics CLI" = [ + { "Overview" = "cli/overview.md" }, + { "Setup" = [ + { "Installing Python" = "cli/python-installation.md" }, + { "Installing Qualytics CLI" = "cli/installing-qualytics-cli.md" }, + ] }, + { "Authentication" = "cli/authentication.md" }, + { "Connections" = "cli/connections.md" }, + { "Datastores" = "cli/datastores.md" }, + { "Containers" = "cli/containers.md" }, + { "Quality Checks" = "cli/quality-checks.md" }, + { "Operations" = "cli/operations.md" }, + { "Anomalies" = "cli/anomalies.md" }, + { "Users" = "cli/users.md" }, + { "Teams" = "cli/teams.md" }, + { "Tags" = "cli/tags.md" }, + { "Config as Code" = "cli/config-as-code.md" }, + { "MCP Server" = "cli/mcp-server.md" }, + { "Automation & CI/CD" = "cli/automation.md" }, + { "Examples & Use Cases" = [ + "cli/examples/index.md", + { "Datastores" = [ + { "Onboard a single datastore" = "cli/examples/onboard-single-datastore.md" }, + { "Bulk datastore onboarding" = "cli/examples/bulk-datastore-onboarding.md" }, + ] }, + { "Operations" = [ + { "Daily sync, profile, and scan" = "cli/examples/daily-pipeline.md" }, + { "Targeted scans" = "cli/examples/targeted-scans.md" }, + { "Incremental scans" = "cli/examples/incremental-scans.md" }, + ] }, + { "Quality Checks" = [ + { "Bulk-create quality checks" = "cli/examples/bulk-create-quality-checks.md" }, + { "Promote checks Dev to Prod" = "cli/examples/promote-checks-dev-prod.md" }, + { "Audit and clean up draft checks" = "cli/examples/audit-draft-checks.md" }, + { "Manage check templates" = "cli/examples/manage-check-templates.md" }, + ] }, + { "Anomalies" = [ + { "Bulk anomaly triage" = "cli/examples/bulk-anomaly-triage.md" }, + { "Daily triage automation" = "cli/examples/triage-automation.md" }, + ] }, + { "Computed Containers" = [ + { "Bulk import computed tables" = "cli/examples/bulk-import-computed-tables.md" }, + { "Build a computed join" = "cli/examples/build-computed-join.md" }, + ] }, + { "Configuration as Code" = [ + { "Export and import full configuration" = "cli/examples/export-import-config.md" }, + { "Drift detection" = "cli/examples/drift-detection.md" }, + ] }, + { "Automation" = [ + { "Scheduled metadata exports" = "cli/examples/scheduled-metadata-exports.md" }, + { "GitHub Actions pipelines" = "cli/examples/github-actions-pipelines.md" }, + ] }, + { "AI Integration" = [ + { "Connect MCP clients" = "cli/examples/connect-mcp-clients.md" }, + ] }, + ] }, + ] }, + { "API docs" = "https://demo.qualytics.io/api/docs" }, + { "Changelog" = [ + "changelog.md", + "changelog-2025.md", + "changelog-2024.md", + "changelog-2023.md", + ] }, +] + +# ---------------------------------------------------------------------------- +# Theme +# ---------------------------------------------------------------------------- +[project.theme] +name = "material" +variant = "modern" +custom_dir = "overrides" +logo = "assets/logo-light.svg" +favicon = "assets/favicon.ico" +features = [ + "navigation.footer", + "navigation.indexes", + "navigation.instant", + "navigation.path", + "navigation.sections", + "navigation.tabs", + "navigation.top", + "navigation.tracking", + "content.action.edit", + "content.action.view", + "content.code.copy", + "content.code.annotate", + "content.tables.sortable", +] + +[project.theme.font] +text = "Manrope" + +[[project.theme.palette]] +scheme = "default" +primary = "white" +toggle = { icon = "material/brightness-4", name = "Switch to dark mode" } + +[[project.theme.palette]] +scheme = "slate" +primary = "white" +toggle = { icon = "material/brightness-7", name = "Switch to light mode" } + +# ---------------------------------------------------------------------------- +# Extra (analytics, feedback widget, macro variables) +# ---------------------------------------------------------------------------- +[project.extra] +homepage = "https://qualytics.ai" +comparator_short_desc = "Specifies how variations are handled, allowing for slight deviations within a defined margin of error." + +[project.extra.analytics] +provider = "google" +property = "G-46N5E3NXG0" + +[project.extra.analytics.feedback] +title = "Was this page helpful?" + +[[project.extra.analytics.feedback.ratings]] +icon = "material/emoticon-sad-outline" +name = "This page could be improved" +data = 0 +note = 'Thanks for your feedback! Help us improve this page by using our issue tracker for this user guide.' + +[[project.extra.analytics.feedback.ratings]] +icon = "material/emoticon-happy-outline" +name = "This page was helpful" +data = 1 +note = "Thanks for your feedback!" + +# ---------------------------------------------------------------------------- +# Markdown extensions (emoji/superfences functions referenced by string; +# Zensical resolves them. material.extensions -> zensical.extensions natively.) +# ---------------------------------------------------------------------------- +[project.markdown_extensions.admonition] +[project.markdown_extensions.attr_list] +[project.markdown_extensions.def_list] +[project.markdown_extensions.md_in_html] +[project.markdown_extensions.tables] +[project.markdown_extensions.pymdownx.details] +[project.markdown_extensions.pymdownx.keys] +[project.markdown_extensions.pymdownx.snippets] +[project.markdown_extensions.pymdownx.inlinehilite] + +[project.markdown_extensions.pymdownx.tabbed] +alternate_style = true + +[project.markdown_extensions.pymdownx.highlight] +anchor_linenums = true + +[project.markdown_extensions.pymdownx.superfences] +custom_fences = [ + { name = "mermaid", class = "mermaid", format = "pymdownx.superfences.fence_code_format" }, +] + +[project.markdown_extensions.pymdownx.emoji] +emoji_index = "zensical.extensions.emoji.twemoji" +emoji_generator = "zensical.extensions.emoji.to_svg"