Skip to content

docs: align master with current docs branch#2178

Closed
devin-ai-integration[bot] wants to merge 931 commits intomasterfrom
docs
Closed

docs: align master with current docs branch#2178
devin-ai-integration[bot] wants to merge 931 commits intomasterfrom
docs

Conversation

@devin-ai-integration
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration bot commented Apr 8, 2026

Summary

Merges the docs branch into master to synchronize all accumulated documentation changes. This includes:

  • Mintlify v4 migration: Snippet syntax changed from <Snippet file="..." /> to ESM import-based <ComponentName />, and snippet directory renamed from _snippets/ to snippets/
  • New documentation pages: Lightdash BI integration, CI/CD code review, MCP server, Python SDK, performance monitoring, DuckDB/Dremio/Spark/Fabric/SQL Server/Vertica support, OAuth M2M for Databricks, and more
  • Navigation & card updates: docs.json restructured with new sections; BI integration cards updated
  • Kapa AI widget: Added "Ask Elementary AI" widget to docs
  • Various doc fixes: Broken links, typos, screenshot updates, clarified instructions

Non-docs changes also included in the docs branch:

  • pyproject.toml and packages.yml: version bump 0.15.1 → 0.18.3
  • .pre-commit-config.yaml: added mintlify-validate hook
  • .gitignore: added dbt_packages/
  • dev-requirements.txt: removed types-pkg-resources
  • docs/Dockerfile: updated to Node 20.3.0, removed mintlify install step

Review & Testing Checklist for Human

  • Version bumps (0.15.1 → 0.18.3) in pyproject.toml and elementary/monitor/dbt_project/packages.yml — verify these are intended for master and won't conflict with the current release state
  • New mintlify-validate pre-commit hook — this will fail for any contributor without mintlify CLI installed. Confirm this is acceptable or should be gated
  • Deleted _snippets/ directory — all old-style snippet files were removed as part of Mintlify v4 migration. Verify no remaining code on master references the old _snippets/ paths
  • Merge conflicts — since both branches have ~30 divergent commits, review the merge result carefully for any dropped or duplicated changes
  • Spot-check a few doc pages on the Mintlify preview to confirm the import-based snippet syntax renders correctly

Notes

  • The diff is very large (~1400+ lines of cumulative changes) because docs and master have diverged significantly. Most changes are documentation-only, but the non-docs changes listed above warrant careful review.
  • The dbt_packages/ gitignore entry and types-pkg-resources removal are minor housekeeping but should be confirmed as compatible with master's current state.

Link to Devin session: https://app.devin.ai/sessions/e56abb358db34b84956c5b78d163f348
Requested by: @arbiv


Open with Devin

Summary by CodeRabbit

  • New Features

    • Comprehensive Elementary Cloud Platform documentation and features guide
    • AI agents (Ella) for governance, triage, test recommendations, performance optimization, and catalog discovery
    • Python SDK for data quality monitoring
    • Elementary MCP Server integration support
    • Best practices guides for detection, governance, and incident response
    • Home page redesign with integrated navigation
  • Documentation

    • Expanded data tests and anomaly detection configuration guides
    • Setup and quickstart documentation reorganization
    • Integration guides for BI tools, code repos, data warehouses
    • Security and compliance documentation
    • Release notes consolidated by product version
  • Refactor

    • Documentation structure migrated to Mintlify configuration
    • MDX component imports standardized
    • Test configuration format updated for consistency

NoyaOffer and others added 30 commits September 17, 2025 13:26
* snowflake docs: change to include key-pair configuration

* small fix

* small fix

* also refer to private key in CLI docs
Add an MCP section to the docs homepage
* change docs to match dbt fusion

* fix broken links

* change comment

* add a mintlify hook that works

* dbt-fusion: initial page

* dbt-fusion page in docs side tree

* troubleshooting fixes

* dbt fusion guide - add more details about upgrading from dbt-core

* dbt-fusion: docs fixes
- Convert all <Snippet file="..."> usage to ES6 import statements
- Update 124 files across the documentation
- Use PascalCase component names derived from filenames
- Maintain absolute paths starting with /snippets/
- Preserve all existing content and functionality

This migration aligns with Mintlify's recommended snippet syntax for better
developer experience and standard React/JSX conventions.
- Update all import statements to use correct _snippets directory
- Fix 123 files with incorrect import paths
- Ensure local documentation can find snippet files correctly
- Rename _snippets directory to snippets to match Mintlify expectations
- Revert import paths back to /snippets/ format
- Fix 124 files with corrected import paths
- Ensure local documentation can properly load snippet content
- Update dbt package version from 0.19.1 to 0.20.0 in quickstart-package-install.mdx
- Update Docker example to use v0.20.0

Version references now align with actual Elementary versions:
- dbt package: 0.20.0
- CLI: 0.20.0
- Create /snippets/integrations/dbt-fusion.mdx with shared content
- Update OSS dbt-fusion.mdx to use the snippet
- Create cloud dbt-fusion.mdx to use the snippet
- Add dbt Fusion card to transformation-and-orchestration-cards.mdx
- Add dbt Fusion to docs.json navigation under Transformation & Orchestration
- Both OSS and cloud pages now reference the same content for maintainability

This branch is created fresh from the docs branch to ensure proper base.
Add dbt Fusion integration to cloud section with shared snippet
* catalog -> governance

* add glue docs

* BI small docs fixes

* small fix to privatelink docs

* small fixes

* add glue and atlan icons + fix ask us link

* doc fix
NoyaOffer and others added 17 commits March 20, 2026 09:52
…o prevent visibility confusion

Add explanation of the default fallback behavior for resource filters,
a Warning callout, an example update, and a new FAQ entry — based on
a recurring support pattern where customers set filters but left the
default on Read-only, causing all unfiltered assets to remain visible.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ks (#2169)

* docs: add OAuth M2M authentication as recommended option for Databricks

Co-Authored-By: Itamar Hartstein <haritamar@gmail.com>

* databricks docs - oauth m2m screenshots + fixes

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Itamar Hartstein <haritamar@gmail.com>
Documents the six new elementary generic tests that return context columns
alongside failing rows: not_null_with_context, accepted_range_with_context,
expect_column_values_to_not_be_null_with_context,
expect_column_values_to_be_unique_with_context,
expect_column_values_to_match_regex_with_context,
relationships_with_context.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-docs-improvement

Emphasise Delta log access scope
Rename floating button to Ask AI, update email gate and placeholder
copy, and fix modal title via data-modal-title (not Docs AI suffix).

Made-with: Cursor
- Await HubSpot form submit before storing email and opening Kapa; surface API errors
- Treat HubSpot 2xx bodies with errors array as failure
- Block common personal email domains client-side (API often still returns 200)
- Show work-email message only after submit, not when clearing stale localStorage

Made-with: Cursor
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

👋 @devin-ai-integration[bot]
Thank you for raising your pull request.
Please make sure to add tests and document all user-facing changes.
You can do this by editing the docs files in this pull request.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 8, 2026

📝 Walkthrough

Walkthrough

A comprehensive documentation restructuring and migration project that transitions from a legacy documentation configuration to a new Mintlify-based site structure. Updates include infrastructure changes (Node.js version, pre-commit hooks, .gitignore), creation of a new homepage with React components and home page configuration, migration of snippet-based documentation to MDX component imports, addition of extensive cloud features documentation, Python SDK guides, and reorganization of dbt package documentation with updated configuration patterns for anomaly detection and data tests.

Changes

Cohort / File(s) Summary
Configuration & Infrastructure
.gitignore, .pre-commit-config.yaml, dev-requirements.txt, docs/Dockerfile
Updated build dependencies, added dbt_packages directory to ignore, configured mintlify link validation pre-commit hook, upgraded Node.js base image to 20.3.0.
Documentation Configuration
docs/mint.json, docs/docs.json
Removed legacy mint.json configuration (387 lines) and added comprehensive new docs.json Mintlify configuration (705 lines) with navigation structure, branding, analytics, and URL redirects.
Homepage & Marketing
docs/home.mdx, docs/kapa-widget.js, docs/key-features.mdx
Created new homepage with React component exports for feature cards, integrations, and footer (1114 lines); added Kapa AI widget script for email capture and AI assistance (325 lines); updated key features page navigation links.
Documentation Site Content
docs/changelog.mdx, docs/culture.mdx, docs/what-is-elementary.mdx, docs/cloud-vs-oss.mdx
Added changelog with release notes and visual components, culture/operating principles guide, product overview, and Cloud vs OSS comparison documentation.
Cloud Platform Documentation
docs/cloud/.../*.mdx (~80+ new files)
Extensive addition of Cloud feature documentation including AI agents (catalog, governance, triage, test recommendation, performance), anomaly detection monitors, alerts & incidents, data lineage, data tests, governance, MCP server, Python SDK, integrations (alerts, BI, DWH, code repos, security), best practices, and quick-start guides.
OSS CLI & Guides
docs/oss/.../*.mdx (~40+ new files)
Added OSS quickstart guides (alerts, report generation, tests, support), integration pages for data warehouses and tools, deployment documentation, performance alerts guides, and release notes (0.16.0–0.19.2).
dbt Package Documentation
docs/data-tests/.../*.mdx (~60+ new files)
Comprehensive dbt package documentation including AI data validations, anomaly detection configuration parameters, schema validation tests, test result samples, singular tests, package models, and release notes (0.18.1–0.20.1); removed legacy package-models and dbt-artifacts pages.
Snippet Migration & Refactoring
Multiple docs/*/.../*.mdx files
Systematic migration from <Snippet file="..." /> syntax to explicit MDX imports and component rendering (e.g., import ComponentName from '...' followed by <ComponentName />), applied across cloud, OSS, and guides sections.
Data Tests Configuration Restructuring
docs/data-tests/anomaly-detection-*/, docs/data-tests/*/...mdx
Updated YAML configuration examples from tests: to data_tests: and moved test parameters under arguments: blocks; added AiGenerateTest component imports throughout; updated configuration semantics for anomaly monitors, freshness/volume tests, and schema validations.
Removed Obsolete Pages
docs/features/*/...mdx, docs/dbt/dbt-artifacts.mdx, docs/dbt/package-models.mdx, docs/cloud/guides/alert-rules.mdx, docs/_snippets/.../...mdx
Deleted legacy feature pages (automated-monitors, catalog, ci, column-level-lineage, config-as-code, data-tests, elementary-alerts, integrations, lineage, multi-env), removed dbt artifacts/package-models documentation, deleted obsolete guide/snippet content no longer referenced.
Integration Documentation
docs/cloud/integrations/*/...mdx (~30+ files)
Added comprehensive integration documentation for alert destinations (email, Jira, Linear, PagerDuty, ServiceNow, Slack, MS Teams, Opsgenie), BI tools (Looker, Tableau, Mode, Sigma, Power BI, Thoughtspot, Hex, Explo, Lightdash), DWH connections (Snowflake, BigQuery, Redshift, Databricks, Postgres, Athena, ClickHouse, Dremio, DuckDB, Fabric, Spark, SQL Server, Trino, Vertica), code repositories (GitHub, GitLab, Azure DevOps, Bitbucket), governance/metadata (Atlan), log streaming (Datadog, Splunk, GCS), and transformation/orchestration tools (dbt Fusion).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

The review requires careful assessment of a very large and heterogeneous change set spanning infrastructure, configuration, extensive new documentation content, component architecture refactoring (snippet migration), YAML schema changes across dozens of files, and reorganization of information hierarchy. While many changes are documentation-only (lower cognitive load per file), the sheer volume, variety of patterns (configuration, React components, MDX markup, YAML examples), and structural reorganization demand systematic verification that no content was lost, links remain valid, examples follow new patterns consistently, and the new site structure supports intended navigation and discoverability.

Possibly related PRs

  • Ele 5194 docs for us samples #2082: Shares identical repository-level and docs changes including .gitignore updates, mintlify pre-commit hook configuration, Dockerfile base image upgrade, and numerous MDX/snippet documentation edits, indicating parallel or closely-coordinated work.

🐰 A rabbit hops through docs so grand,
New pages built across the land,
From mint to Mintlify we've grown,
A homepage now, a seed we've sown!
React components, snippets refactored bright,
Elementary shines with features in sight! ✨📚

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch docs

devin-ai-integration[bot]

This comment was marked as resolved.

…oes-elementary-work to .mdx

Co-Authored-By: Yosef Arbiv <yosef.arbiv@gmail.com>
@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Superseded by #2179 which contains only docs/ directory changes (no non-docs file changes). This PR can be closed.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
docs/cloud/integrations/dwh/bigquery.mdx (1)

2-3: ⚠️ Potential issue | 🟡 Minor

Fix product-name capitalization in page metadata.

On Line 2 and Line 3, use BigQuery (capital Q) for consistent vendor branding.

Suggested fix
-title: "Connect to Bigquery"
-sidebarTitle: "Bigquery"
+title: "Connect to BigQuery"
+sidebarTitle: "BigQuery"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/integrations/dwh/bigquery.mdx` around lines 2 - 3, Update the page
metadata keys in this file by changing the values of title and sidebarTitle from
"Bigquery" to the correctly capitalized vendor name "BigQuery"; specifically
edit the title and sidebarTitle entries in the front-matter block so both read
"BigQuery" to ensure consistent product-name capitalization.
docs/cloud/manage-team.mdx (1)

22-22: ⚠️ Potential issue | 🟡 Minor

Add alt text to the image for accessibility.

Line 22 has no alt attribute.

Proposed fix
-  <img src="https://res.cloudinary.com/diuctyblm/image/upload/v1704363455/add_users_xdicwh.png" />
+  <img src="https://res.cloudinary.com/diuctyblm/image/upload/v1704363455/add_users_xdicwh.png" alt="Invite users screen in Elementary Cloud Team settings" />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/manage-team.mdx` at line 22, The <img> tag in
docs/cloud/manage-team.mdx is missing an alt attribute; update the <img
src="https://res.cloudinary.com/diuctyblm/image/upload/v1704363455/add_users_xdicwh.png"
/> element to include a descriptive alt text (e.g., alt="Add users to team
screen" or similar) so the image is accessible to screen readers and meets
accessibility requirements.
docs/data-tests/anomaly-detection-configuration/detection-period.mdx (1)

18-18: ⚠️ Potential issue | 🟡 Minor

Grammar error: "are" should be "is".

"detection_period" is singular, so the verb should be "is set" not "are set".

Proposed fix
-If the detection_period are set to 2 days, only data points in the last 2 days will be included in the detection period and could be flagged anomalous.
+If the detection_period is set to 2 days, only data points in the last 2 days will be included in the detection period and could be flagged anomalous.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/anomaly-detection-configuration/detection-period.mdx` at line
18, Fix the grammar in the sentence containing "detection_period": replace "are
set to 2 days" with "is set to 2 days" so the verb agrees with the singular noun
"detection_period" (i.e., change the phrase to "If the detection_period is set
to 2 days, only data points in the last 2 days will be included...").
🟠 Major comments (27)
docs/cloud/integrations/governance/atlan.mdx-21-26 (1)

21-26: ⚠️ Potential issue | 🟠 Major

The “Atlan API Key” steps are incomplete for actually generating a key.

This section currently describes creating a Persona and permissions, but it doesn’t include the actual API key creation step/path in Atlan. Please add the explicit final step(s) to generate and copy the API key so users can complete setup without guessing.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/integrations/governance/atlan.mdx` around lines 21 - 26, Update
the "### Atlan API Key" section in atlan.mdx to include the missing final steps
for creating and copying the API key: after creating the Persona and assigning
permissions, instruct users to open the Atlan web UI, navigate to Admin >
Personas (or the Persona settings), select the newly created Persona, go to the
"API Keys" (or "Credentials") tab, click "Create API Key", copy the displayed
secret immediately (it will only be shown once), and store it securely;
reference the "### Atlan API Key" heading and ensure the new steps are added as
numbered steps after the permission list so users can complete key generation
without guessing.
.pre-commit-config.yaml-51-51 (1)

51-51: ⚠️ Potential issue | 🟠 Major

Make mintlify-validate rely on deterministic exit codes, not output text.

Line 51 depends on an exact output string (no broken links found), which is fragile and unmaintainable. The mintlify broken-links command uses exit codes to signal status: exit 0 means no broken links, non-zero means broken links found. Use bash -e to enforce immediate failure on non-zero exit codes rather than parsing output text.

Proposed hardening
-        entry: bash -c "cd docs && mintlify broken-links | tee /dev/stderr | grep -q 'no broken links found'"
+        entry: bash -e -c "cd docs && mintlify broken-links"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.pre-commit-config.yaml at line 51, Replace the fragile output-based check
in the pre-commit hook entry with an exit-code based invocation: update the
"entry" that runs "mintlify broken-links" so it runs under a shell that fails
immediately on non-zero exit (e.g., use bash -e or set -o errexit) after
changing to the docs directory; remove the tee/grep pipeline that looks for "no
broken links found" so the hook relies solely on mintlify's exit code to
indicate success or failure.
docs/cloud/best-practices/governance-for-observability.mdx-20-27 (1)

20-27: ⚠️ Potential issue | 🟠 Major

Fix invalid YAML in examples (extra colon and indentation).

These snippets won’t parse as valid YAML (owner: :"..." and tab-indented YAML blocks), which can break onboarding flows.

Proposed fix
 models:
-	analytics:
+  analytics:
     marketing:
-	    +tags: marketing
-	    public:
-		    +tags: marketing-public
+      +tags: marketing
+      public:
+        +tags: marketing-public
@@
       meta:
-        owner: :"@analytics.engineer"
+        owner: "@analytics.engineer"
         subscribers:
         - "@marketing.data.analyst"
         - "@another.marketing.data.analyst"
@@
       meta:
-        owner: :"@data.engineer"
+        owner: "@data.engineer"
         subscribers: "@analytics.engineer"

Also applies to: 43-55, 109-119

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/best-practices/governance-for-observability.mdx` around lines 20 -
27, The YAML examples in the docs contain invalid syntax and tab indentation;
update the snippet under the models/analytics/marketing example so keys/values
use proper YAML (no stray extra colon after owner, use owner: "value" format),
replace tab characters with two-space or two-space-per-indent, and normalize
nesting so mappings like models -> analytics -> marketing -> tags/public are
valid (use a tags sequence or quoted string values, e.g., tags: ["marketing"] or
tags: - marketing). Apply the same fixes to the other affected snippets
referenced (lines 43-55 and 109-119).
docs/data-tests/data-freshness-sla.mdx-37-48 (1)

37-48: ⚠️ Potential issue | 🟠 Major

Correct invalid YAML list marker in the configuration snippet.

-- elementary.data_freshness_sla: is invalid YAML; it should be a single list marker.

Proposed fix
   data_tests:
-    &nbsp;&nbsp;-- elementary.data_freshness_sla:
+    &nbsp;&nbsp;- elementary.data_freshness_sla:
       &nbsp;&nbsp;&nbsp;&nbsp;arguments:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/data-freshness-sla.mdx` around lines 37 - 48, The YAML
snippet uses an invalid list marker ("-- elementary.data_freshness_sla:");
change it to a single dash list item ("- elementary.data_freshness_sla:") and
ensure the following block (arguments and keys like timestamp_column, sla_time,
timezone, day_of_week, day_of_month, where_expression) remains correctly
indented under that list item so the example becomes valid YAML.
docs/oss/quickstart/stay-updated.mdx-86-140 (1)

86-140: ⚠️ Potential issue | 🟠 Major

Add explicit consent/privacy notice for email capture.

This form sends user email to HubSpot, but there is no nearby privacy disclosure/consent text. That’s a privacy/compliance gap.

Proposed fix
       <form onSubmit={handleSubmit} style={{ display: 'flex', gap: '10px', flexWrap: 'wrap' }}>
@@
         {status === 'error' && (
           <p style={{ width: '100%', color: '#dc2626', fontSize: '13px', margin: '4px 0 0' }}>
             Something went wrong — try again or <a href="https://elementary-data.com/community" style={{ color: '#dc2626', textDecoration: 'underline' }}>join Slack</a> instead.
           </p>
         )}
+        <p style={{ width: '100%', fontSize: '12px', margin: '4px 0 0', opacity: 0.8 }}>
+          By subscribing, you agree to receive product updates. See our{" "}
+          <a href="/privacy-policy" style={{ textDecoration: 'underline' }}>Privacy Policy</a>.
+        </p>
       </form>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/oss/quickstart/stay-updated.mdx` around lines 86 - 140, Add an explicit
privacy/consent disclosure near the newsletter form (the <form
onSubmit={handleSubmit}> block) that informs users their email will be sent to
HubSpot and links to the privacy policy; include a required checkbox (e.g.,
consentCheckbox state updated via setConsent) or a visible statement that the
user agrees by submitting, ensure the submit button (uses status to
disable/loading) remains disabled until consent is given, and add accessible
semantics (aria-describedby on the <input> email field pointing to the
disclosure) so the consent is programmatically associated with the email
capture.
docs/data-tests/execution-sla.mdx-38-47 (1)

38-47: ⚠️ Potential issue | 🟠 Major

Fix invalid YAML list marker in the config example.

-- elementary.execution_sla: is invalid YAML and should be - elementary.execution_sla:.

Proposed fix
   data_tests:
-    &nbsp;&nbsp;-- elementary.execution_sla:
+    &nbsp;&nbsp;- elementary.execution_sla:
       &nbsp;&nbsp;&nbsp;&nbsp;arguments:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/execution-sla.mdx` around lines 38 - 47, The YAML example
under the data_tests block uses an invalid list marker "--
elementary.execution_sla"; update the code sample to use a valid YAML list item
marker by replacing "-- elementary.execution_sla:" with "-
elementary.execution_sla:" so the example correctly shows a list entry for the
elementary.execution_sla test and its arguments (sla_time, timezone,
day_of_week, day_of_month).
docs/oss/quickstart/stay-updated.mdx-21-35 (1)

21-35: ⚠️ Potential issue | 🟠 Major

Add a request timeout to avoid indefinite loading state.

If the HubSpot request hangs, the UI can stay in loading forever. Add AbortController + timeout.

Proposed fix
   const handleSubmit = async (e) => {
     e.preventDefault();
     if (!email) return;
     setStatus('loading');
+    const controller = new AbortController();
+    const timeoutId = setTimeout(() => controller.abort(), 10000);

     try {
       const res = await fetch(
         `https://api.hsforms.com/submissions/v3/integration/submit/${HUBSPOT_PORTAL_ID}/${HUBSPOT_FORM_ID}`,
         {
           method: 'POST',
           headers: { 'Content-Type': 'application/json' },
+          signal: controller.signal,
           body: JSON.stringify({
             fields: [{ name: 'email', value: email }],
             context: {
               pageUri: typeof window !== 'undefined' ? window.location.href : '',
               pageName: 'Elementary Docs - Stay Updated',
             },
           }),
         }
       );
       if (res.ok) {
         setStatus('success');
         setEmail('');
       } else {
         setStatus('error');
       }
     } catch {
       setStatus('error');
+    } finally {
+      clearTimeout(timeoutId);
     }
   };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/oss/quickstart/stay-updated.mdx` around lines 21 - 35, The fetch call
that submits to HubSpot using HUBSPOT_PORTAL_ID/HUBSPOT_FORM_ID should use an
AbortController with a timeout so the UI doesn't remain stuck in loading; create
an AbortController, pass controller.signal to fetch, start a setTimeout that
calls controller.abort() after a chosen timeout (e.g., 5–10s), and clearTimeout
when the request completes or errors; also handle the abort case (AbortError) in
the surrounding try/catch so loading state is cleared and user feedback is
given.
docs/cloud/features/performance-monitoring/performance-monitoring.mdx-21-29 (1)

21-29: ⚠️ Potential issue | 🟠 Major

Use camelCase JSX props and title for iframe accessibility.

React JSX requires camelCased DOM attributes:

  • frameborderframeBorder
  • allowfullscreenallowFullScreen
  • alt is not valid for iframes; use title instead for the accessible name
Proposed fix
 <iframe
 width="700"
 height="400"
 src="https://res.cloudinary.com/diuctyblm/video/upload/v1719746949/9_-_Performance_-_white_wurwra.mp4"
-frameborder="0"
+frameBorder="0"
 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
-allowfullscreen
-alt="Elementary Models Duration tab"
+allowFullScreen
+title="Elementary Models Duration tab"
 >
 </iframe>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/features/performance-monitoring/performance-monitoring.mdx` around
lines 21 - 29, Update the iframe JSX attributes to use camelCase and an
accessible name: change frameborder to frameBorder, allowfullscreen to
allowFullScreen, remove the invalid alt attribute and replace it with a title
that describes the iframe (e.g., "Elementary Models Duration tab"), and keep
other attributes (width, height, src, allow) unchanged so the iframe renders and
is accessible in React.
docs/kapa-widget.js-49-60 (1)

49-60: ⚠️ Potential issue | 🟠 Major

Don't retain email addresses indefinitely in localStorage.

This stores PII with no expiry or opt-out path, so the email persists across sessions and on shared machines. Prefer sessionStorage, or store a short-lived token/TTL and clear it after inactivity.

Also applies to: 249-250

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/kapa-widget.js` around lines 49 - 60, getStoredEmail and storeEmail
currently persist raw email in localStorage indefinitely; change them to avoid
retaining PII by either switching to sessionStorage (use sessionStorage.getItem
/ setItem) or implement a short-lived token/TTL: when storing, save an object
with {value: emailOrToken, expiresAt: timestamp} and on get, return null if
expiresAt < Date.now(); also ensure any catch blocks clear expired/invalid
entries and provide a clear/remove function (e.g., removeStoredEmail) to support
opt-out/inactivity clearing.
docs/kapa-widget.js-181-186 (1)

181-186: ⚠️ Potential issue | 🟠 Major

Add a programmatic label for the email field.

The placeholder is not a reliable accessible name. Add a <label> or at least aria-label="Work email" so screen-reader users can understand the field.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/kapa-widget.js` around lines 181 - 186, The email input element
(variable input) lacks an accessible name; modify the code around where input is
created to provide one by either creating a <label> element with text "Work
email", set input.id and associate the label via label.htmlFor = input.id and
insert the label before appending input to form, or at minimum set
input.setAttribute('aria-label', 'Work email'); ensure the chosen approach
updates the same input variable and that form.appendChild uses the labeled
input.
docs/cloud/features/data-tests/custom-sql-tests.mdx-25-31 (1)

25-31: ⚠️ Potential issue | 🟠 Major

Add alt text to the workflow screenshots.

These images show required UI steps, so leaving alt off makes the flow much harder to follow with a screen reader.

Also applies to: 46-52

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/features/data-tests/custom-sql-tests.mdx` around lines 25 - 31,
The screenshots inside the Frame component lack alt text; update the <img>
elements (the ones nested under Frame and the surrounding div) to include
descriptive alt attributes that summarize the UI step shown (e.g., "Custom SQL
test step: create test query" or similar), and apply the same fix to the other
occurrence mentioned; ensure alt text is concise, screen-reader friendly, and
reflects the specific UI action or screen in each image.
docs/home.mdx-821-900 (1)

821-900: ⚠️ Potential issue | 🟠 Major

Don't default clickable cards to #.

FeatureCard always renders an anchor when comingSoon is false, even if no real link was passed. The Data health scores card at Line 301 already hits this path, so it looks interactive but just jumps to the top of the page. Only render <a> when link is truthy, or mark the card as coming soon until the target doc exists.

🔧 Suggested fix
 export const FeatureCard = ({
   heading = "Your Title",
   description = "Your description here",
   icon = "flag",
-  link = "#",
+  link,
   showCloudFeature = true,
   comingSoon = false,
 }) => {
@@
-if (comingSoon) {
+if (comingSoon || !link) {
 return (
 
 <div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}>
   <CardContent />
 </div>
 ); }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/home.mdx` around lines 821 - 900, FeatureCard currently always renders
an <a> when comingSoon is false, causing cards with the default link "#" to
appear clickable but do nothing; change the logic so the component only renders
an anchor when the link prop is truthy and otherwise renders a non-interactive
wrapper (or mark as comingSoon). Specifically: update the default prop for link
(e.g. link = "" or undefined) and modify the final render in FeatureCard/
CardContent so if (comingSoon) render the existing non-clickable div with class
"home__feature-card--coming-soon", else if (link) render <a href={link} ...>
otherwise render a plain <div className="home__feature-card"> (no target or
href) to avoid defaulting to "#". Ensure class names and CardContent usage
remain the same.
docs/cloud/best-practices/triage-and-response.mdx-40-49 (1)

40-49: ⚠️ Potential issue | 🟠 Major

Fix the YAML example before publishing.

This snippet is not copy-pastable as written: the indentation uses tabs instead of spaces, and the tags value is not valid YAML syntax. Readers who paste this into a schema file will encounter a parse error.

🔧 Suggested fix
 data_tests:
   - unique:
-		  config:
-		    error_if: ">10"
-        meta:
+      config:
+        error_if: ">10"
+        meta:
           description: "More than 10 duplicate records arriving from the source, as this is a staging table"
           owner: "@data.provider"
-          tags: "critical", "mongo-db", "raw-production-replica"
+          tags: ["critical", "mongo-db", "raw-production-replica"]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/best-practices/triage-and-response.mdx` around lines 40 - 49, The
YAML example under the data_tests -> unique entry uses tabs and an invalid tags
value; fix it by converting all indentation to spaces (use consistent 2 or 4
spaces) and change meta.tags to a proper YAML sequence (e.g., tags: ["critical",
"mongo-db", "raw-production-replica"] or a dash-prefixed list) while keeping
config.error_if under config (config.error_if) and meta.description/meta.owner
correctly indented.
docs/kapa-widget.js-63-75 (1)

63-75: ⚠️ Potential issue | 🟠 Major

Wait for Kapa script to load before calling open.

The loadKapaScript() function appends the third-party widget asynchronously without tracking when it finishes loading. When openKapa() is called (after form submission or button click with stored email), it just checks if window.Kapa exists and calls open() immediately—but if the script hasn't finished loading, the call does nothing. Keep a shared load promise so openKapa() waits for the script to fully initialize before attempting to open the widget.

🔧 Suggested direction
+  var kapaReady = null;
+
   function openKapa(email) {
-    window.kapaSettings = {
-      user: {
-        email: email,
-        uniqueClientId: email,
-      },
-    };
-    if (window.Kapa && typeof window.Kapa.open === 'function') {
-      window.Kapa.open();
-    } else if (typeof window.Kapa === 'function') {
-      window.Kapa('open');
-    }
+    return loadKapaScript().then(function () {
+      window.kapaSettings = {
+        user: {
+          email: email,
+          uniqueClientId: email,
+        },
+      };
+      if (window.Kapa && typeof window.Kapa.open === 'function') {
+        window.Kapa.open();
+      } else if (typeof window.Kapa === 'function') {
+        window.Kapa('open');
+      }
+    });
   }
@@
   function loadKapaScript() {
-    var script = document.createElement('script');
-    script.src = 'https://widget.kapa.ai/kapa-widget.bundle.js';
-    script.async = true;
-    script.setAttribute('data-website-id', 'e558d15b-d976-4a89-b2f0-e33ee6dab58b');
-    script.setAttribute('data-project-name', 'Ask Elementary AI');
-    script.setAttribute('data-modal-title', 'Ask Elementary AI');
-    script.setAttribute('data-modal-title-ask-ai', 'Ask Elementary AI');
-    script.setAttribute('data-modal-title-search', 'Ask Elementary AI');
-    script.setAttribute('data-modal-ask-ai-input-placeholder', 'Ask any question about Elementary...');
-    script.setAttribute('data-project-color', '#FF20B8');
-    script.setAttribute('data-project-logo', 'https://res.cloudinary.com/do5hrgokq/image/upload/v1771424391/Elementary_2025_Pink_Mark_Black_Frame_rbexli.png');
-    script.setAttribute('data-button-hide', 'true');
-    document.head.appendChild(script);
+    if (kapaReady) return kapaReady;
+    kapaReady = new Promise(function (resolve, reject) {
+      var script = document.createElement('script');
+      script.src = 'https://widget.kapa.ai/kapa-widget.bundle.js';
+      script.async = true;
+      script.onload = resolve;
+      script.onerror = reject;
+      script.setAttribute('data-website-id', 'e558d15b-d976-4a89-b2f0-e33ee6dab58b');
+      script.setAttribute('data-project-name', 'Ask Elementary AI');
+      script.setAttribute('data-modal-title', 'Ask Elementary AI');
+      script.setAttribute('data-modal-title-ask-ai', 'Ask Elementary AI');
+      script.setAttribute('data-modal-title-search', 'Ask Elementary AI');
+      script.setAttribute('data-modal-ask-ai-input-placeholder', 'Ask any question about Elementary...');
+      script.setAttribute('data-project-color', '#FF20B8');
+      script.setAttribute('data-project-logo', 'https://res.cloudinary.com/do5hrgokq/image/upload/v1771424391/Elementary_2025_Pink_Mark_Black_Frame_rbexli.png');
+      script.setAttribute('data-button-hide', 'true');
+      document.head.appendChild(script);
+    });
+    return kapaReady;
   }
@@
   function init() {
-    loadKapaScript();
     if (document.readyState === 'loading') {
       document.addEventListener('DOMContentLoaded', injectButtonAndPopover);
     } else {
       injectButtonAndPopover();
     }

Also applies to: 299-317

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/kapa-widget.js` around lines 63 - 75, openKapa currently calls
window.Kapa immediately and can run before the third-party script finishes
loading; change loadKapaScript to set and return a shared promise (e.g.,
window.kapaLoadPromise) that resolves when the external script's onload runs and
the widget is initialized, then update openKapa to await that promise before
invoking window.Kapa (handle both the object with open method and function-call
form) so the open() call always executes after the script has fully loaded.
docs/data-tests/schema-tests/schema-changes-from-baseline.mdx-105-108 (1)

105-108: ⚠️ Potential issue | 🟠 Major

Fix invalid YAML structure in the Sources example.

At Line 106, elementary.schema_changes_from_baseline is missing a trailing : before nested config, so the snippet is not valid YAML.

Suggested fix
         data_tests:
-          - elementary.schema_changes_from_baseline
+          - elementary.schema_changes_from_baseline:
               config:
                 tags: ["elementary"]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/schema-tests/schema-changes-from-baseline.mdx` around lines
105 - 108, The YAML snippet under data_tests is invalid because the test name
elementary.schema_changes_from_baseline is missing a trailing colon before its
nested config; update that entry so the test key is followed by a colon (i.e.,
elementary.schema_changes_from_baseline:) and ensure the nested block (config:
and tags) is properly indented under that key to produce valid YAML.
docs/data-tests/anomaly-detection-configuration/update_timestamp_column.mdx-30-34 (1)

30-34: ⚠️ Potential issue | 🟠 Major

Fix the test identifier in the YAML example to match the documented test.

Line 31 incorrectly uses elementary.event_timestamp_column, which is not a valid test identifier. The page itself states this is "Configuration for the test event_freshness_anomalies" (line 13), and the canonical test documentation uses elementary.event_freshness_anomalies in all working examples. Change the test identifier to elementary.event_freshness_anomalies so users can run the example as-is.

Suggested fix
     data_tests:
-      - elementary.event_timestamp_column:
+      - elementary.event_freshness_anomalies:
           arguments:
             event_timestamp_column: "event_timestamp"
             update_timestamp_column: "created_at"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/anomaly-detection-configuration/update_timestamp_column.mdx`
around lines 30 - 34, Update the YAML example under the data_tests block to use
the correct test identifier: replace the invalid test name
elementary.event_timestamp_column with elementary.event_freshness_anomalies so
the example matches the documented test; locate the YAML snippet that defines
data_tests and change the test key from elementary.event_timestamp_column to
elementary.event_freshness_anomalies while keeping the arguments
(event_timestamp_column, update_timestamp_column) unchanged.
docs/data-tests/anomaly-detection-tests/column-anomalies.mdx-111-114 (1)

111-114: ⚠️ Potential issue | 🟠 Major

Fix invalid YAML in the data_tests example.

The snippet at lines 111–114 is malformed. elementary.volume_anomalies is missing the list item marker (-) and colon (:), making it invalid YAML that users cannot copy/paste as-is.

Proposed fix
   - name: users
     ## if no timestamp is configured, elementary will monitor without time filtering
     data_tests:
-      elementary.volume_anomalies
-        config:
-          tags: ['elementary']
+      - elementary.volume_anomalies:
+          config:
+            tags: ['elementary']
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/anomaly-detection-tests/column-anomalies.mdx` around lines
111 - 114, The YAML under the data_tests example is malformed: the entry for
elementary.volume_anomalies must be a list item with a mapping. Edit the block
so data_tests contains a list entry (use a leading "-" for the test) and include
a colon to make it a mapping key (i.e., convert the malformed line referencing
elementary.volume_anomalies into a proper list item mapping with config as its
nested mapping), updating the symbols shown (data_tests and
elementary.volume_anomalies and config) accordingly.
docs/cloud/integrations/alerts/servicenow.mdx-9-12 (1)

9-12: ⚠️ Potential issue | 🟠 Major

Add alt text to screenshots.

These images are instructional and currently missing alt, which hurts accessibility for screen-reader users.

Example fix pattern
 <img
   src="https://res.cloudinary.com/do5hrgokq/image/upload/v1751788473/servicenow_create_ticket_ztpeaw.png"
   width="500"
+  alt="ServiceNow create ticket button in Elementary incident page"
 />

Also applies to: 21-24, 31-34, 44-47, 60-63, 71-73, 84-87, 99-102, 109-111, 122-124, 133-135, 143-145, 164-166

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/integrations/alerts/servicenow.mdx` around lines 9 - 12, Add
descriptive alt attributes to each <img> tag (e.g., the one with src
"servicenow_create_ticket_ztpeaw.png") so screenshots are accessible to screen
readers; update every image instance listed (lines groups 9-12, 21-24, 31-34,
44-47, 60-63, 71-73, 84-87, 99-102, 109-111, 122-124, 133-135, 143-145, 164-166)
with concise alt text that describes the screenshot content and purpose (for
example "ServiceNow create ticket form showing fields X, Y, Z").
docs/cloud/guides/start-using-elementary-checklist.md-11-14 (1)

11-14: ⚠️ Potential issue | 🟠 Major

Add list marker to all checklist items to enable proper task-list rendering.

All checklist items in this file use [ ] without the required list marker. Convert each to - [ ] so the checklists render correctly in Markdown renderers.

✅ Proposed fix pattern
-[ ] In the [Catalog](/cloud/features/collaboration-and-communication/catalog), identify and mark three [critical assets](/cloud/features/data-governance/critical_assets)
+- [ ] In the [Catalog](/cloud/features/collaboration-and-communication/catalog), identify and mark three [critical assets](/cloud/features/data-governance/critical_assets)

Apply the same - prefix to all 27 checklist rows throughout this file.

Affected lines: 11–14, 20–24, 29–32, 37–40, 45–47, 52–54, 59–62, 69–72, 77–79.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/guides/start-using-elementary-checklist.md` around lines 11 - 14,
The checklist items use bare "[ ]" markers so they don't render as task lists;
update every checklist row in this document (e.g., the lines containing "In the
[Catalog]...", "Add or update [descriptions, tags, and owners]...", "Leverage
the [Governance AI agent]...", "View [end-to-end, column-level lineage]...") to
use the Markdown task-list format by prefixing each with "- " (i.e., change "[
]" to "- [ ]") for all 27 checklist lines throughout the file so they render
correctly.
docs/cloud/integrations/security-and-connectivity/okta.mdx-35-35 (1)

35-35: ⚠️ Potential issue | 🟠 Major

Role names are inconsistent across the page.

Line 35 lists predefined roles as Admin / Can Write / Can Read, but Lines 132-143 use Can Edit. Please standardize terminology to avoid incorrect Okta group-to-role mapping.

Also applies to: 132-143

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/integrations/security-and-connectivity/okta.mdx` at line 35, The
doc uses inconsistent role names: update all occurrences so the predefined roles
are consistently "Admin", "Can Write", and "Can Read" (replace any "Can Edit"
instances). Specifically, change the text fragment that currently lists "Admin /
Can Write / Can Read" and the later section that mentions "Can Edit" (lines
showing Okta group-to-role mappings) so they all use "Can Write"; also review
and update any Okta group-to-role mapping examples to reflect the same
standardized role names.
docs/cloud/guides/set-up-elementary.mdx-61-62 (1)

61-62: ⚠️ Potential issue | 🟠 Major

Clarify the AI features enablement step.

The instruction “Elementary to open AI Features” is unclear/incomplete and may block users from completing setup. Replace with a clear action (e.g., “Contact Elementary support to enable AI features for your account”).

Proposed fix
-- Elementary to open AI Features
+- Contact Elementary support to enable AI features for your account
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/guides/set-up-elementary.mdx` around lines 61 - 62, Replace the
ambiguous line "Elementary to open AI Features" with a clear, actionable
instruction; specifically update the text to something like "Contact Elementary
support to enable AI features for your account" (or similar wording) so users
know to reach out to Elementary support to have AI features turned on; locate
and update the exact string "Elementary to open AI Features" in the document and
ensure surrounding context flows grammatically with the new sentence.
docs/cloud/features/data-tests/test-coverage-screen.mdx-65-67 (1)

65-67: ⚠️ Potential issue | 🟠 Major

Add alt text to the screenshot image.

Line 66 image is missing an alt attribute, which hurts accessibility and screen-reader usability.

Proposed fix
 <img
   src="https://res.cloudinary.com/do5hrgokq/image/upload/v1751200138/coverage-weight_xyz9gf.png"
+  alt="Coverage score weighting configuration"
 />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/features/data-tests/test-coverage-screen.mdx` around lines 65 -
67, The <img> element showing the coverage screenshot (src
"https://res.cloudinary.com/do5hrgokq/image/upload/v1751200138/coverage-weight_xyz9gf.png")
is missing an alt attribute; add a concise, descriptive alt text (for example:
alt="Test coverage screen showing coverage percentage and weight graph") to the
<img> tag in test-coverage-screen.mdx to improve accessibility and screen-reader
usability.
docs/oss/general/troubleshooting.mdx-179-191 (1)

179-191: ⚠️ Potential issue | 🟠 Major

Fix the indentation of code fence delimiters in this accordion.

Lines 184 and 187 have code fence delimiters indented with 10 spaces, which exceeds Markdown's 0-3 space limit. This causes MDX to misinterpret them as content rather than delimiters, breaking the rendering. Remove the excessive indentation from the closing fence on line 184 and opening fence on line 187.

🛠️ Suggested formatting
  If you use Snowflake:
  ```
  {% materialization test, adapter='snowflake' %}
    {{ return(elementary.materialization_test_snowflake()) }}
  {% endmaterialization %}
  ```

  If you use any other DWH:
  ```
  {% materialization test, default %}
    {{ return(elementary.materialization_test_default()) }}
  {% endmaterialization %}
  ```
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/oss/general/troubleshooting.mdx` around lines 179 - 191, The closing and
opening triple-backtick code-fence delimiters inside the accordion for the two
examples ("If you use Snowflake:" and "If you use any other DWH:") are
over-indented and treated as content; remove the extra leading spaces so each
fence starts at column 0 (i.e., align the closing fence after the Snowflake
example and the opening fence before the second example to the left margin),
ensuring both ``` delimiters are not indented beyond 0-3 spaces and the fenced
blocks render correctly.
docs/data-tests/anomaly-detection-tests/Anomaly-troubleshooting-guide.mdx-15-20 (1)

15-20: ⚠️ Potential issue | 🟠 Major

Add whitespace before inline YAML comments to fix broken configurations.

In YAML, # only starts a comment when preceded by whitespace. As written, created_at# becomes the literal value of timestamp_column, making these snippets unusable. This affects the configuration examples at lines 20 and 146.

Suggested fix
-        timestamp_column: created_at# If this is configured, you have a timestamp-based test
+        timestamp_column: created_at # If this is configured, you have a timestamp-based test
-        timestamp_column: created_at# Check if specified correctly
+        timestamp_column: created_at # Check if specified correctly
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/anomaly-detection-tests/Anomaly-troubleshooting-guide.mdx`
around lines 15 - 20, The YAML examples for the data_tests block (the
elementary.volume_anomalies entry) have inline comments attached directly to
values (e.g., timestamp_column: created_at#...) so the comment is parsed as part
of the value; update these examples to insert a space before the hash so the
comment is recognized (e.g., timestamp_column: created_at # ...). Locate the
snippet containing the data_tests list and the elementary.volume_anomalies
example and fix all similar occurrences (including the other example noted for
timestamp_column) by adding a space before each '#' used as an inline comment.
docs/cloud/integrations/security-and-connectivity/aws-privatelink-integration.mdx-56-59 (1)

56-59: ⚠️ Potential issue | 🟠 Major

Replace wildcard subnet notation with valid CIDR blocks throughout.

10.0.1.x, 10.0.2.x, and 10.0.3.x are not valid CIDR notation for AWS security groups, which require proper format like 10.0.1.0/24 or 10.0.1.0/32. Users will fail validation when attempting to configure these ranges. Replace all instances with the correct CIDR blocks:

  • Lines 56-59 (Snowflake section)
  • Lines 126-129 (Databricks section)
  • Lines 196-199 (GitHub Enterprise Server section)

Use consistent formatting across all three locations.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@docs/cloud/integrations/security-and-connectivity/aws-privatelink-integration.mdx`
around lines 56 - 59, The docs use invalid subnet notation like "10.0.1.x" in
the Snowflake "Add the Elementary IP to allowlist" section (and the
corresponding Databricks and GitHub Enterprise Server sections), which will fail
AWS CIDR validation; replace each instance with proper CIDR blocks (e.g.,
10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24 or /32 if single-IP intent) and ensure the
same CIDR formatting and punctuation is applied consistently in the Snowflake,
Databricks, and GitHub Enterprise Server sections.
docs/cloud/features/ci.mdx-55-61 (1)

55-61: ⚠️ Potential issue | 🟠 Major

Update the optional customization section to clarify that pull_request.paths must also be updated.

If a user follows the optional models-path: "dbt/models/" example without updating the pull_request.paths filter, the workflow will never trigger—the path filter still watches models/** while the actual models are in dbt/models/. Add a note in the "customize the action" section warning that users changing models-path must also update the pull_request.paths filter in the workflow trigger, or provide the updated paths as part of the example configuration.

The suggested diff in the original comment would break the default setup where models are at the repository root. The base example at lines 55–61 is correct for the standard layout; the issue is that the optional customization at lines 98–110 doesn't adequately document this dependency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cloud/features/ci.mdx` around lines 55 - 61, Update the "customize the
action" section to warn that changing the models-path requires updating the
workflow trigger's pull_request.paths filter (reference the `models-path` option
and the `pull_request.paths` filter), and either add a short note stating this
dependency or include an alternate example showing `pull_request.paths` adjusted
for `dbt/models/**` and `dbt/**/*.yml` alongside `dbt_project.yml`; do not
change the default base example that assumes models at the repo root.
docs/data-tests/dbt/package-models.mdx-49-52 (1)

49-52: ⚠️ Potential issue | 🟠 Major

Correct the environment variable naming in lines 49-52 and throughout this section.

The section states that metadata can be set via DBT_<COLUMN_NAME> environment variables and uses DBT_JOB_NAME as an example. However, the field list below (lines 69-81) documents the actual env var names without the DBT_ prefix: JOB_ID, JOB_NAME, JOB_URL, and ACCOUNT_ID. This contradicts the stated rule. Additionally, the collect-job-data.mdx documentation confirms the correct generic format is JOB_NAME, JOB_ID, JOB_URL (without DBT_ prefix), with orchestrator-specific variations like DBT_CLOUD_JOB_ID. Update lines 49-52 to document the correct naming convention so readers know which environment variable names actually populate these columns.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/dbt/package-models.mdx` around lines 49 - 52, Update the
wording that claims env vars use the DBT_ prefix: change the rule to say the
generic environment variable names are the bare column names (e.g., JOB_NAME,
JOB_ID, JOB_URL, ACCOUNT_ID) and use JOB_NAME/JOB_ID as the example, and note
that orchestrator-specific variants may exist (e.g., DBT_CLOUD_JOB_ID) as
exceptions; make the same correction everywhere in this section so the example
and the field list (JOB_ID, JOB_NAME, JOB_URL, ACCOUNT_ID) and
collect-job-data.mdx are consistent.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: df92761c-2ded-48fa-9acc-5220e95a4815

📥 Commits

Reviewing files that changed from the base of the PR and between 4b52f6b and 7644749.

⛔ Files ignored due to path filters (1)
  • docs/elementary_orange_favicon.png is excluded by !**/*.png
📒 Files selected for processing (299)
  • .gitignore
  • .pre-commit-config.yaml
  • dev-requirements.txt
  • docs/Dockerfile
  • docs/_snippets/cloud/integrations/athena.mdx
  • docs/_snippets/cloud/integrations/cards-groups/bi-cards.mdx
  • docs/_snippets/cloud/integrations/cards-groups/cloud-integrations-cards.mdx
  • docs/_snippets/cloud/integrations/cards-groups/connect-dwh-cards.mdx
  • docs/_snippets/cloud/integrations/databricks.mdx
  • docs/_snippets/dwh/bigquery/cli_service_account.mdx
  • docs/_snippets/dwh/bigquery/cloud_service_account.mdx
  • docs/_snippets/dwh/databricks/create_service_principal.mdx
  • docs/_snippets/faq/question-schema.mdx
  • docs/_snippets/faq/question-test-results-sample.mdx
  • docs/_snippets/oss/oss-introduction-opening.mdx
  • docs/_snippets/oss/oss-introduction.mdx
  • docs/_snippets/products-cards.mdx
  • docs/_snippets/profiles/all-profiles.mdx
  • docs/changelog.mdx
  • docs/cloud/ai-agents/catalog-agent.mdx
  • docs/cloud/ai-agents/governance-agent.mdx
  • docs/cloud/ai-agents/overview.mdx
  • docs/cloud/ai-agents/performance-cost-agent.mdx
  • docs/cloud/ai-agents/test-recommendation-agent.mdx
  • docs/cloud/ai-agents/triage-resolution-agent.mdx
  • docs/cloud/best-practices/detection-and-coverage.mdx
  • docs/cloud/best-practices/governance-for-observability.mdx
  • docs/cloud/best-practices/introduction.mdx
  • docs/cloud/best-practices/triage-and-response.mdx
  • docs/cloud/cloud-vs-oss.mdx
  • docs/cloud/features.mdx
  • docs/cloud/features/alerts-and-incidents/alert-configuration.mdx
  • docs/cloud/features/alerts-and-incidents/alert-destinations.mdx
  • docs/cloud/features/alerts-and-incidents/alert-rules.mdx
  • docs/cloud/features/alerts-and-incidents/alerts-and-incidents-overview.mdx
  • docs/cloud/features/alerts-and-incidents/incident-digest.mdx
  • docs/cloud/features/alerts-and-incidents/incident-management.mdx
  • docs/cloud/features/alerts-and-incidents/incidents.mdx
  • docs/cloud/features/alerts-and-incidents/owners-and-subscribers.mdx
  • docs/cloud/features/anomaly-detection/automated-freshness.mdx
  • docs/cloud/features/anomaly-detection/automated-monitors.mdx
  • docs/cloud/features/anomaly-detection/automated-volume.mdx
  • docs/cloud/features/anomaly-detection/metrics.mdx
  • docs/cloud/features/anomaly-detection/monitor-dwh-assets.mdx
  • docs/cloud/features/anomaly-detection/monitors-configuration.mdx
  • docs/cloud/features/anomaly-detection/monitors-feedback.mdx
  • docs/cloud/features/anomaly-detection/monitors-overview.mdx
  • docs/cloud/features/ci.mdx
  • docs/cloud/features/collaboration-and-communication/audit_logs/overview.mdx
  • docs/cloud/features/collaboration-and-communication/audit_logs/system-logs.mdx
  • docs/cloud/features/collaboration-and-communication/audit_logs/user-activity-logs.mdx
  • docs/cloud/features/collaboration-and-communication/catalog.mdx
  • docs/cloud/features/collaboration-and-communication/data-health.mdx
  • docs/cloud/features/collaboration-and-communication/data-observability-dashboard.mdx
  • docs/cloud/features/collaboration-and-communication/data-quality-dimensions.mdx
  • docs/cloud/features/collaboration-and-communication/saved-views.mdx
  • docs/cloud/features/config-as-code.mdx
  • docs/cloud/features/data-governance/ai-descriptions.mdx
  • docs/cloud/features/data-governance/critical_assets.mdx
  • docs/cloud/features/data-governance/manage-metadata.mdx
  • docs/cloud/features/data-lineage/column-level-lineage.mdx
  • docs/cloud/features/data-lineage/exposures-lineage.mdx
  • docs/cloud/features/data-lineage/lineage.mdx
  • docs/cloud/features/data-tests/custom-sql-tests.mdx
  • docs/cloud/features/data-tests/data-tests-overview.mdx
  • docs/cloud/features/data-tests/dbt-tests.mdx
  • docs/cloud/features/data-tests/schema-validation-test.mdx
  • docs/cloud/features/data-tests/test-coverage-screen.mdx
  • docs/cloud/features/elementary-alerts.mdx
  • docs/cloud/features/gpg-signed-commits.mdx
  • docs/cloud/features/integrations.mdx
  • docs/cloud/features/multi-env.mdx
  • docs/cloud/features/performance-monitoring/performance-alerts.mdx
  • docs/cloud/features/performance-monitoring/performance-monitoring.mdx
  • docs/cloud/features/roles-and-permissions.mdx
  • docs/cloud/general/ai-privacy-policy.mdx
  • docs/cloud/general/security-and-privacy.mdx
  • docs/cloud/guides/alert-rules.mdx
  • docs/cloud/guides/alerts-configuration.mdx
  • docs/cloud/guides/collect-job-data.mdx
  • docs/cloud/guides/collect-source-freshness.mdx
  • docs/cloud/guides/dev-prod-configuration.mdx
  • docs/cloud/guides/enable-slack-alerts.mdx
  • docs/cloud/guides/reduce-on-run-end-time.mdx
  • docs/cloud/guides/set-up-elementary-checklist.md
  • docs/cloud/guides/set-up-elementary.mdx
  • docs/cloud/guides/start-using-elementary-checklist.md
  • docs/cloud/guides/start-using-elementary.mdx
  • docs/cloud/guides/sync-scheduling.mdx
  • docs/cloud/guides/troubleshoot.mdx
  • docs/cloud/integrations/alerts/email.mdx
  • docs/cloud/integrations/alerts/jira.mdx
  • docs/cloud/integrations/alerts/linear.mdx
  • docs/cloud/integrations/alerts/ms-teams.mdx
  • docs/cloud/integrations/alerts/opsgenie.mdx
  • docs/cloud/integrations/alerts/pagerduty.mdx
  • docs/cloud/integrations/alerts/servicenow.mdx
  • docs/cloud/integrations/alerts/slack.mdx
  • docs/cloud/integrations/bi/connect-bi-tool.mdx
  • docs/cloud/integrations/bi/explo.mdx
  • docs/cloud/integrations/bi/hex.mdx
  • docs/cloud/integrations/bi/lightdash.mdx
  • docs/cloud/integrations/bi/looker.mdx
  • docs/cloud/integrations/bi/mode.mdx
  • docs/cloud/integrations/bi/power-bi.mdx
  • docs/cloud/integrations/bi/sigma.mdx
  • docs/cloud/integrations/bi/tableau.mdx
  • docs/cloud/integrations/bi/thoughtspot.mdx
  • docs/cloud/integrations/code-repo/azure-devops.mdx
  • docs/cloud/integrations/code-repo/bitbucket.mdx
  • docs/cloud/integrations/code-repo/connect-code-repo.mdx
  • docs/cloud/integrations/code-repo/github.mdx
  • docs/cloud/integrations/code-repo/gitlab.mdx
  • docs/cloud/integrations/dwh/athena.mdx
  • docs/cloud/integrations/dwh/bigquery.mdx
  • docs/cloud/integrations/dwh/clickhouse.mdx
  • docs/cloud/integrations/dwh/databricks.mdx
  • docs/cloud/integrations/dwh/dremio.mdx
  • docs/cloud/integrations/dwh/duckdb.mdx
  • docs/cloud/integrations/dwh/fabric.mdx
  • docs/cloud/integrations/dwh/postgres.mdx
  • docs/cloud/integrations/dwh/redshift.mdx
  • docs/cloud/integrations/dwh/snowflake.mdx
  • docs/cloud/integrations/dwh/spark.mdx
  • docs/cloud/integrations/dwh/sqlserver.mdx
  • docs/cloud/integrations/dwh/trino.mdx
  • docs/cloud/integrations/dwh/vertica.mdx
  • docs/cloud/integrations/elementary-integrations.mdx
  • docs/cloud/integrations/governance/atlan.mdx
  • docs/cloud/integrations/log-streaming/datadog.mdx
  • docs/cloud/integrations/log-streaming/gcs.mdx
  • docs/cloud/integrations/log-streaming/splunk.mdx
  • docs/cloud/integrations/metadata-layer/glue.mdx
  • docs/cloud/integrations/security-and-connectivity/aws-privatelink-integration.mdx
  • docs/cloud/integrations/security-and-connectivity/ms-entra.mdx
  • docs/cloud/integrations/security-and-connectivity/okta.mdx
  • docs/cloud/integrations/transformation-and-orchestration/dbt-fusion.mdx
  • docs/cloud/introduction.mdx
  • docs/cloud/main_introduction.mdx
  • docs/cloud/manage-team.mdx
  • docs/cloud/mcp/intro.mdx
  • docs/cloud/mcp/mcp-tools.mdx
  • docs/cloud/mcp/overview.mdx
  • docs/cloud/mcp/recommended-rules.mdx
  • docs/cloud/mcp/setup-guide.mdx
  • docs/cloud/onboarding/connect-data-warehouse.mdx
  • docs/cloud/onboarding/quickstart-dbt-package.mdx
  • docs/cloud/onboarding/signup.mdx
  • docs/cloud/python-sdk/overview.mdx
  • docs/cloud/python-sdk/setup-guide.mdx
  • docs/cloud/python-sdk/usage-examples.mdx
  • docs/cloud/quickstart.mdx
  • docs/cloud/resources/ai-agents.mdx
  • docs/cloud/resources/business-case-data-observability-platform.mdx
  • docs/cloud/resources/community.mdx
  • docs/cloud/resources/how-does-elementary-work.mdx
  • docs/cloud/resources/pricing.mdx
  • docs/cloud/what-is-elementary.mdx
  • docs/culture.mdx
  • docs/data-tests/add-elementary-tests.mdx
  • docs/data-tests/ai-data-tests/ai_data_validations.mdx
  • docs/data-tests/ai-data-tests/supported-platforms/bigquery.mdx
  • docs/data-tests/ai-data-tests/supported-platforms/data-lakes.mdx
  • docs/data-tests/ai-data-tests/supported-platforms/databricks.mdx
  • docs/data-tests/ai-data-tests/supported-platforms/redshift.mdx
  • docs/data-tests/ai-data-tests/supported-platforms/snowflake.mdx
  • docs/data-tests/ai-data-tests/unstructured_data_validations.mdx
  • docs/data-tests/anomaly-detection-configuration/anomaly-direction.mdx
  • docs/data-tests/anomaly-detection-configuration/anomaly-exclude-metrics.mdx
  • docs/data-tests/anomaly-detection-configuration/anomaly-params.mdx
  • docs/data-tests/anomaly-detection-configuration/anomaly-sensitivity.mdx
  • docs/data-tests/anomaly-detection-configuration/column-anomalies.mdx
  • docs/data-tests/anomaly-detection-configuration/detection-delay.mdx
  • docs/data-tests/anomaly-detection-configuration/detection-period.mdx
  • docs/data-tests/anomaly-detection-configuration/dimensions.mdx
  • docs/data-tests/anomaly-detection-configuration/event_timestamp_column.mdx
  • docs/data-tests/anomaly-detection-configuration/exclude-final-results.mdx
  • docs/data-tests/anomaly-detection-configuration/exclude_detection_period_from_training.mdx
  • docs/data-tests/anomaly-detection-configuration/exclude_prefix.mdx
  • docs/data-tests/anomaly-detection-configuration/exclude_regexp.mdx
  • docs/data-tests/anomaly-detection-configuration/fail_on_zero.mdx
  • docs/data-tests/anomaly-detection-configuration/ignore_small_changes.mdx
  • docs/data-tests/anomaly-detection-configuration/seasonality.mdx
  • docs/data-tests/anomaly-detection-configuration/time-bucket.mdx
  • docs/data-tests/anomaly-detection-configuration/timestamp-column.mdx
  • docs/data-tests/anomaly-detection-configuration/training-period.mdx
  • docs/data-tests/anomaly-detection-configuration/update_timestamp_column.mdx
  • docs/data-tests/anomaly-detection-configuration/where-expression.mdx
  • docs/data-tests/anomaly-detection-tests-oss-vs-cloud.mdx
  • docs/data-tests/anomaly-detection-tests/Anomaly-troubleshooting-guide.mdx
  • docs/data-tests/anomaly-detection-tests/all-columns-anomalies.mdx
  • docs/data-tests/anomaly-detection-tests/column-anomalies.mdx
  • docs/data-tests/anomaly-detection-tests/dimension-anomalies.mdx
  • docs/data-tests/anomaly-detection-tests/event-freshness-anomalies.mdx
  • docs/data-tests/anomaly-detection-tests/freshness-anomalies.mdx
  • docs/data-tests/anomaly-detection-tests/volume-anomalies.mdx
  • docs/data-tests/data-freshness-sla.mdx
  • docs/data-tests/dbt/dbt-artifacts.mdx
  • docs/data-tests/dbt/dbt-package.mdx
  • docs/data-tests/dbt/on-run-end_hooks.mdx
  • docs/data-tests/dbt/package-models.mdx
  • docs/data-tests/dbt/quickstart-package.mdx
  • docs/data-tests/dbt/reduce-on-run-end-time.mdx
  • docs/data-tests/dbt/release-notes/releases/0.18.1.mdx
  • docs/data-tests/dbt/release-notes/releases/0.18.2.mdx
  • docs/data-tests/dbt/release-notes/releases/0.18.3.mdx
  • docs/data-tests/dbt/release-notes/releases/0.19.0.mdx
  • docs/data-tests/dbt/release-notes/releases/0.19.1.mdx
  • docs/data-tests/dbt/release-notes/releases/0.19.2.mdx
  • docs/data-tests/dbt/release-notes/releases/0.19.3.mdx
  • docs/data-tests/dbt/release-notes/releases/0.19.4.mdx
  • docs/data-tests/dbt/release-notes/releases/0.20.0.mdx
  • docs/data-tests/dbt/release-notes/releases/0.20.1.mdx
  • docs/data-tests/dbt/singular-tests.mdx
  • docs/data-tests/dbt/upgrade-package.mdx
  • docs/data-tests/execution-sla.mdx
  • docs/data-tests/how-anomaly-detection-works.mdx
  • docs/data-tests/introduction.mdx
  • docs/data-tests/python-tests.mdx
  • docs/data-tests/schema-tests/exposure-tests.mdx
  • docs/data-tests/schema-tests/json-schema.mdx
  • docs/data-tests/schema-tests/schema-changes-from-baseline.mdx
  • docs/data-tests/schema-tests/schema-changes.mdx
  • docs/data-tests/test-result-samples.mdx
  • docs/data-tests/volume-threshold.mdx
  • docs/data-tests/with-context-tests.mdx
  • docs/dbt/dbt-artifacts.mdx
  • docs/dbt/package-models.mdx
  • docs/docs.json
  • docs/features/automated-monitors.mdx
  • docs/features/catalog.mdx
  • docs/features/ci.mdx
  • docs/features/column-level-lineage.mdx
  • docs/features/config-as-code.mdx
  • docs/features/data-tests.mdx
  • docs/features/elementary-alerts.mdx
  • docs/features/integrations.mdx
  • docs/features/lineage.mdx
  • docs/features/multi-env.mdx
  • docs/guides/modules-overview/dbt-package.mdx
  • docs/home.mdx
  • docs/kapa-widget.js
  • docs/key-features.mdx
  • docs/mint.json
  • docs/oss/cli-commands.mdx
  • docs/oss/cli-install.mdx
  • docs/oss/deployment-and-configuration/docker.mdx
  • docs/oss/deployment-and-configuration/elementary-in-production.mdx
  • docs/oss/deployment-and-configuration/slack.mdx
  • docs/oss/deployment-and-configuration/teams.mdx
  • docs/oss/general/community-and-support.mdx
  • docs/oss/general/faq.mdx
  • docs/oss/general/troubleshooting.mdx
  • docs/oss/guides/alerts/alerts-configuration.mdx
  • docs/oss/guides/alerts/elementary-alerts.mdx
  • docs/oss/guides/alerts/send-slack-alerts.mdx
  • docs/oss/guides/alerts/send-teams-alerts.mdx
  • docs/oss/guides/collect-dbt-source-freshness.mdx
  • docs/oss/guides/collect-job-data.mdx
  • docs/oss/guides/generate-report-ui.mdx
  • docs/oss/guides/performance-alerts.mdx
  • docs/oss/guides/reduce-on-run-end-time.mdx
  • docs/oss/integrations/athena.mdx
  • docs/oss/integrations/bigquery.mdx
  • docs/oss/integrations/clickhouse.mdx
  • docs/oss/integrations/databricks.mdx
  • docs/oss/integrations/dbt-fusion.mdx
  • docs/oss/integrations/dbt.mdx
  • docs/oss/integrations/dremio.mdx
  • docs/oss/integrations/duckdb.mdx
  • docs/oss/integrations/fabric.mdx
  • docs/oss/integrations/postgres.mdx
  • docs/oss/integrations/redshift.mdx
  • docs/oss/integrations/snowflake.mdx
  • docs/oss/integrations/spark.mdx
  • docs/oss/integrations/sqlserver.mdx
  • docs/oss/integrations/trino.mdx
  • docs/oss/integrations/vertica.mdx
  • docs/oss/oss-introduction.mdx
  • docs/oss/quickstart/quickstart-alerts.mdx
  • docs/oss/quickstart/quickstart-cli-package.mdx
  • docs/oss/quickstart/quickstart-cli.mdx
  • docs/oss/quickstart/quickstart-prod.mdx
  • docs/oss/quickstart/quickstart-report.mdx
  • docs/oss/quickstart/quickstart-support.mdx
  • docs/oss/quickstart/quickstart-tests.mdx
  • docs/oss/quickstart/stay-updated.mdx
  • docs/oss/release-notes/releases/0.16.0.mdx
  • docs/oss/release-notes/releases/0.16.1.mdx
  • docs/oss/release-notes/releases/0.16.2.mdx
  • docs/oss/release-notes/releases/0.17.0.mdx
  • docs/oss/release-notes/releases/0.18.0.mdx
  • docs/oss/release-notes/releases/0.18.1.mdx
  • docs/oss/release-notes/releases/0.18.2.mdx
  • docs/oss/release-notes/releases/0.18.3.mdx
  • docs/oss/release-notes/releases/0.19.0.mdx
  • docs/oss/release-notes/releases/0.19.1.mdx
  • docs/oss/release-notes/releases/0.19.2.mdx
  • docs/oss/release-notes/releases/0.19.3.mdx
💤 Files with no reviewable changes (30)
  • dev-requirements.txt
  • docs/_snippets/cloud/integrations/athena.mdx
  • docs/_snippets/dwh/databricks/create_service_principal.mdx
  • docs/_snippets/oss/oss-introduction.mdx
  • docs/_snippets/products-cards.mdx
  • docs/_snippets/cloud/integrations/cards-groups/bi-cards.mdx
  • docs/_snippets/cloud/integrations/cards-groups/connect-dwh-cards.mdx
  • docs/_snippets/dwh/bigquery/cli_service_account.mdx
  • docs/_snippets/dwh/bigquery/cloud_service_account.mdx
  • docs/_snippets/cloud/integrations/databricks.mdx
  • docs/_snippets/faq/question-schema.mdx
  • docs/_snippets/faq/question-test-results-sample.mdx
  • docs/cloud/guides/alert-rules.mdx
  • docs/features/catalog.mdx
  • docs/features/ci.mdx
  • docs/features/multi-env.mdx
  • docs/features/automated-monitors.mdx
  • docs/dbt/dbt-artifacts.mdx
  • docs/features/data-tests.mdx
  • docs/guides/modules-overview/dbt-package.mdx
  • docs/features/config-as-code.mdx
  • docs/features/lineage.mdx
  • docs/features/elementary-alerts.mdx
  • docs/features/integrations.mdx
  • docs/_snippets/oss/oss-introduction-opening.mdx
  • docs/mint.json
  • docs/dbt/package-models.mdx
  • docs/_snippets/profiles/all-profiles.mdx
  • docs/features/column-level-lineage.mdx
  • docs/_snippets/cloud/integrations/cards-groups/cloud-integrations-cards.mdx

Comment on lines +164 to +167
data_tests:
elementary.volume_anomalies
tags: ['elementary']
config:
tags: ['elementary']
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix YAML syntax error - missing list marker and colon.

The YAML structure is malformed. The test name is missing the list marker (-) and the colon (:) required for a mapping entry.

🐛 Proposed fix
   data_tests:
-        elementary.volume_anomalies
-          config:
-            tags: ['elementary']
+      - elementary.volume_anomalies:
+          config:
+            tags: ['elementary']
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/data-tests/add-elementary-tests.mdx` around lines 164 - 167, YAML under
the data_tests key is malformed: add the missing list marker and mapping colon
so the test name becomes a proper list entry and mapping (e.g., make
"elementary.volume_anomalies" a list item under data_tests and ensure it has a
colon before its nested config), updating the block that contains data_tests,
elementary.volume_anomalies, config, and tags accordingly.

Comment on lines +39 to +41
**3. Validate that the CLI has a working connection profile in the [right path and format](https://docs.elementary-data.com/oss/cli-install#how-to-create-profiles-yml)**

- **Check that the connection profile exists in the right path and format**
- **Check that the connection profile points to the elementary package schema**
- Default path: `HOME_DIR/.dbt/profiles.yml` . If saved elsewhere, make sure to run dbt run and dbt test with `—profiles-dir <profiles.yml path>`
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cat -n docs/oss/general/troubleshooting.mdx | sed -n '35,45p'

Repository: elementary-data/elementary

Length of output: 873


🌐 Web query:

dbt --profiles-dir flag directory vs file path specification

💡 Result:

dbt --profiles-dir expects a directory path, not a path to the profiles.yml file itself.

  • dbt will look for a file literally named profiles.yml inside the directory you pass via --profiles-dir. The CLI help text is explicit: “Directory containing profiles.yml”. [1]
  • Same convention is documented by other dbt-integrating tools (e.g., SQLFluff’s dbt templater): profiles_dir is “the directory that contains the profiles.yml file”. [2]

Examples

  • If your file is at /etc/dbt/profiles.yml, use:
    • dbt build --profiles-dir /etc/dbt
  • Default location (when you don’t set it) is typically ~/.dbt/ (so the file is ~/.dbt/profiles.yml). [2]

If you pass a file path (e.g., --profiles-dir /etc/dbt/profiles.yml), dbt will treat it as a directory and then effectively look for /etc/dbt/profiles.yml/profiles.yml, which usually fails.

Sources: [1] [2]


Fix the --profiles-dir flag syntax and semantics on line 41.

The flag requires a directory path (the directory containing profiles.yml), not the file path itself. Users copying this example will encounter failures because dbt will attempt to look for profiles.yml/profiles.yml.

Additionally, fix the non-standard HOME_DIR placeholder to use ~ and correct the em dash to a regular hyphen.

🛠️ Suggested update
-  Default path: `HOME_DIR/.dbt/profiles.yml` . If saved elsewhere, make sure to run dbt run and dbt test with `—profiles-dir <profiles.yml path>`
+  Default path: `~/.dbt/profiles.yml`. If saved elsewhere, make sure to run `dbt run --profiles-dir ~/.dbt` and `dbt test --profiles-dir ~/.dbt`
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
**3. Validate that the CLI has a working connection profile in the [right path and format](https://docs.elementary-data.com/oss/cli-install#how-to-create-profiles-yml)**
- **Check that the connection profile exists in the right path and format**
- **Check that the connection profile points to the elementary package schema**
- Default path: `HOME_DIR/.dbt/profiles.yml` . If saved elsewhere, make sure to run dbt run and dbt test with `—profiles-dir <profiles.yml path>`
**3. Validate that the CLI has a working connection profile in the [right path and format](https://docs.elementary-data.com/oss/cli-install#how-to-create-profiles-yml)**
- Default path: `~/.dbt/profiles.yml`. If saved elsewhere, make sure to run `dbt run --profiles-dir ~/.dbt` and `dbt test --profiles-dir ~/.dbt`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/oss/general/troubleshooting.mdx` around lines 39 - 41, Update the CLI
docs line that currently shows `HOME_DIR/.dbt/profiles.yml` and `—profiles-dir
<profiles.yml path>`: change the placeholder to use `~/.dbt/profiles.yml` and
correct the flag usage to `--profiles-dir <profiles directory>` (i.e., pass the
directory containing profiles.yml, not the file itself) and replace the em dash
with a regular hyphen in `--profiles-dir`; mention that the directory should be
the parent folder of `profiles.yml` so dbt can find `profiles.yml` correctly.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/docs.json`:
- Around line 662-664: The PostHog project key is hardcoded in the docs.json
("posthog" -> "apiKey") which risks abuse; remove the hardcoded value and change
configuration to read the PostHog write key from an environment-specific secret
(e.g., POSTHOG_API_KEY) or secrets manager, ensure you document/validate that
domain/origin restrictions are enabled on the PostHog project and that separate
projects/keys are used per environment (dev/staging/prod), and add a note or
script to support rotation/revocation if abuse is detected.

In `@docs/home.mdx`:
- Around line 846-879: The cloud badge div (rendered when showCloudFeature is
true) is non-interactive but set as tabbable via tabIndex={0}; remove the
tabIndex attribute from the element with className
"home__feature-card__cloud-feature-tag" (the cloud badge rendered in the
showCloudFeature block) so it is no longer focusable by keyboard, and if the
element is purely decorative also ensure it has no interactive handlers or add
aria-hidden="true" if needed.
- Around line 796-799: The footer entry with label "Cloud vs OSS" currently uses
the stale href "/overview/cloud-vs-oss"; update that href value to the correct
path "/cloud/cloud-vs-oss" so the link matches other docs references and
resolves correctly (identify the object with label "Cloud vs OSS" and change its
href string).
- Around line 833-908: Summary: Cards defaulting link="#" produce dead anchor
CTAs; render a non-anchor when there is no real URL. Fix: change the render
logic that currently always returns <a href={link}...> to check the prop link
(and the comingSoon branch) and only render an anchor when link is a real URL
(e.g., truthy and not "#" or "javascript:void(0)"). For CardContent rendering,
use the existing CardContent component and return a semantic non-interactive
wrapper (e.g., <div className="home__feature-card">) or a <button/role="link">
fallback when link is missing; ensure you keep the comingSoon branch that
returns the coming-soon wrapper and preserve class names/home__feature-card
modifiers so styles and a11y (tabIndex on cloud tag) remain intact.
- Around line 7-10: Replace all HTML `class` attributes with React `className`
in this MDX file so JSX uses the correct prop: update occurrences like `<div
class="home__page">`, `<div class="home__container">`, and `<div
class="home__hero-layout">` to use `className` instead (note `section` already
has `className`). Search the file for any remaining `class="..."` and change
them to `className="..."`, keeping the existing class token values unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9f6ae413-f266-437a-9510-a1a757e5a810

📥 Commits

Reviewing files that changed from the base of the PR and between 7644749 and b2f9284.

📒 Files selected for processing (3)
  • docs/cloud/integrations/pipeline/fivetran.mdx
  • docs/docs.json
  • docs/home.mdx
✅ Files skipped from review due to trivial changes (1)
  • docs/cloud/integrations/pipeline/fivetran.mdx

Comment on lines +662 to +664
"posthog": {
"apiKey": "phc_56XBEzZmh02mGkadqLiYW51eECyYKWPyecVwkGdGUfg"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

Is a PostHog key with prefix phc_ a public project API key intended for client-side usage, and what are the security best practices (domain restrictions, rotation, and what must never be exposed)?

💡 Result:

Yes. A key with prefix phc_ is a PostHog Project API key (write-only, used for event ingestion) and is intended to be used in client-side SDKs/snippets (it’s the credential for PostHog’s “public POST-only endpoints”).[1][2][3]

Security best practices

1) Understand what “public” means (and the real risk)

  • A phc_... key can’t read your data or call admin/private endpoints; it’s for sending events.[1][2]
  • But if someone copies it, they can spam/poison your analytics (send fake events). So treat it as “public but abuseable,” not as a secret.

2) Domain restrictions / origin controls

  • Don’t rely on the key itself for strong domain-locking. In general, browsers can spoof/omit Origin/Referer in non-browser clients, so domain “restrictions” are at best an abuse-reduction measure.
  • Practical mitigations:
    • Use separate PostHog projects per environment (dev/staging/prod) so test/spam doesn’t pollute production.
    • Consider a reverse proxy (your domain → PostHog ingest) to (a) reduce ad-blocker breakage and (b) add your own rate limiting/WAF rules in front of ingestion.

3) Rotation

  • Rotate the phc_ key if it leaks, if you suspect event spam, or on a regular schedule.
  • Use a two-key transition where possible (deploy new key everywhere, then deprecate the old one) to avoid data gaps.

4) What must never be exposed client-side

  • Personal API keys (often shown as phx_...) — these are for private endpoints and can grant broad access.[1][4]
  • Anything that can read data, manage projects, configure feature flags, access recordings, or otherwise hit PostHog’s private API surface (i.e., credentials used with https://us.posthog.com / https://eu.posthog.com private endpoints, not the ingest hosts).[1]

Sources: n8n’s PostHog credential docs (public POST-only endpoints use Project API key; private endpoints require Personal API key), and PostHog’s official GitHub Action README calling the Project API Key “write-only.”[1][2]


Confirm hardcoding of PostHog project key aligns with security policy and implement domain/environment controls.

Line 663 contains phc_56XBEzZmh02mGkadqLiYW51eECyYKWPyecVwkGdGUfg, which is a PostHog Project API key (write-only, public, intended for client-side usage). While this key cannot read data or access admin functions, it is still abusable—others can send false events to poison analytics. Confirm with your team that:

  • Hardcoding it in the repo is allowed by security policy
  • PostHog project has domain restrictions or origin controls enabled
  • You use separate projects per environment (dev/staging/prod) to contain test/spam events
  • A rotation schedule is in place if abuse is suspected
🧰 Tools
🪛 Betterleaks (1.1.1)

[high] 663-663: Detected a PostHog Project API Key, which may expose product analytics data and event tracking to unauthorized access.

(posthog-project-api-key)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/docs.json` around lines 662 - 664, The PostHog project key is hardcoded
in the docs.json ("posthog" -> "apiKey") which risks abuse; remove the hardcoded
value and change configuration to read the PostHog write key from an
environment-specific secret (e.g., POSTHOG_API_KEY) or secrets manager, ensure
you document/validate that domain/origin restrictions are enabled on the PostHog
project and that separate projects/keys are used per environment
(dev/staging/prod), and add a note or script to support rotation/revocation if
abuse is detected.

Comment on lines +7 to +10
<div class="home__page">
<section className="home__hero-section">
<div class="home__container">
<div class="home__hero-layout">
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Does Mintlify v4 / MDX custom page JSX require classNameinstead ofclasson HTML tags? Ifclassis used in.mdx, does it produce React invalid DOM property warnings or validation issues?

💡 Result:

Yes—when authoring JSX inside Mintlify v4 MDX pages, you should use className, not class.

  • Mintlify’s own MDX “custom layout” and React-component examples use className on normal HTML tags like <div> (because that markup is treated as React/JSX). [1], [2]
  • MDX’s documentation also shows that those “HTML-looking” tags in .mdx are JSX, and specifically notes that React expects className. [3]
  • React’s JSX rules state that because class is reserved, you write className instead, and if you get it wrong React will print a console warning. [4]

So if you write <div class="..."> in a Mintlify .mdx page, you should expect React “Invalid DOM property class. Did you mean className?”-style warnings (and it can also trip React/JSX linting/validation rules). [4]

Sources: [1] [2] [3] [4]


Replace all class attributes with className in JSX tags throughout this file.

Mintlify v4 MDX pages treat HTML tags as React JSX, which requires className instead of class. Using class will trigger React console warnings ("Invalid DOM property class. Did you mean className?") and may fail validation. This file mixes both attributes and needs standardization before merge.

Example fix
-<div class="home__page">
+<div className="home__page">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div class="home__page">
<section className="home__hero-section">
<div class="home__container">
<div class="home__hero-layout">
<div className="home__page">
<section className="home__hero-section">
<div class="home__container">
<div class="home__hero-layout">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/home.mdx` around lines 7 - 10, Replace all HTML `class` attributes with
React `className` in this MDX file so JSX uses the correct prop: update
occurrences like `<div class="home__page">`, `<div class="home__container">`,
and `<div class="home__hero-layout">` to use `className` instead (note `section`
already has `className`). Search the file for any remaining `class="..."` and
change them to `className="..."`, keeping the existing class token values
unchanged.

Comment on lines +796 to +799
{ label: "Governance", href: "https://www.elementary-data.com/governance-and-discovery" },
{ label: "Enabling business users", href: "https://www.elementary-data.com/business-users" },
{ label: "Integrations", href: "https://www.elementary-data.com/integrations" },
{ label: "Cloud vs OSS", href: "/overview/cloud-vs-oss" },
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd -i 'cloud-vs-oss*' docs
rg -n 'cloud-vs-oss' docs

Repository: elementary-data/elementary

Length of output: 1011


Fix the stale footer link to Cloud vs OSS comparison page.

Line 799 references /overview/cloud-vs-oss, but the actual page is located at /cloud/cloud-vs-oss (as used on line 251 and across all other documentation references). This will result in a broken link in the footer.

Fix
-      { label: "Cloud vs OSS", href: "/overview/cloud-vs-oss" },
+      { label: "Cloud vs OSS", href: "/cloud/cloud-vs-oss" },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{ label: "Governance", href: "https://www.elementary-data.com/governance-and-discovery" },
{ label: "Enabling business users", href: "https://www.elementary-data.com/business-users" },
{ label: "Integrations", href: "https://www.elementary-data.com/integrations" },
{ label: "Cloud vs OSS", href: "/overview/cloud-vs-oss" },
{ label: "Governance", href: "https://www.elementary-data.com/governance-and-discovery" },
{ label: "Enabling business users", href: "https://www.elementary-data.com/business-users" },
{ label: "Integrations", href: "https://www.elementary-data.com/integrations" },
{ label: "Cloud vs OSS", href: "/cloud/cloud-vs-oss" },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/home.mdx` around lines 796 - 799, The footer entry with label "Cloud vs
OSS" currently uses the stale href "/overview/cloud-vs-oss"; update that href
value to the correct path "/cloud/cloud-vs-oss" so the link matches other docs
references and resolves correctly (identify the object with label "Cloud vs OSS"
and change its href string).

Comment on lines +833 to +908
link = "#",
showCloudFeature = true,
comingSoon = false,
}) => {
const CardContent = () => (
<div className="home__feature-card__container">
<div className="home__feature-card__header" style={{ position: "relative", paddingRight: showCloudFeature ? 60 : 0 }}>
<div className="home__feature-card__header-content">
<div className="home__feature-card__icon">
<Icon icon={icon} size={24} color="#7e7e7e" />
</div>
<h3 className="home__feature-card__heading">{heading}</h3>
</div>
{showCloudFeature && (
<div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
<span className="cloud-feature-icon">
<svg
width="18"
height="12"
viewBox="0 0 18 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g>
<path
d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z"
fill="#FF20B8"
/>
<g>
<path
d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z"
fill="white"
/>
<path
d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z"
fill="white"
/>
<path
d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z"
fill="white"
/>
</g>
</g>
</svg>
</span>
<span className="cloud-feature-text">Cloud Feature</span>
</div>
)}
</div>
<div className="home__feature-card__description-block">
<p className="home__feature-card__description">{description}</p>
</div>
{comingSoon && (
<div className="home__feature-card__coming-soon-overlay">
<div className="home__feature-card__coming-soon-message">
Coming Soon
</div>
</div>
)}
</div>
);

if (comingSoon) {
return (

<div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}>
<CardContent />
</div>
); }

return (

<a href={link} className="home__feature-card" target="_self">
<CardContent />
</a>
); };
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Don’t fall back to href="#" for cards without a real destination.

Line 833 defaults link to "#" and Line 905 always renders an anchor, so cards without a real URL become dead CTAs. The current “Data health scores” card already hits this path.

Safer fallback
 export const FeatureCard = ({
   heading = "Your Title",
   description = "Your description here",
   icon = "flag",
-  link = "#",
+  link,
   showCloudFeature = true,
   comingSoon = false,
 }) => {
@@
-if (comingSoon) {
-return (
-
-<div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}>
-  <CardContent />
-</div>
-); }
+if (comingSoon) {
+  return (
+    <div className={`home__feature-card ${comingSoon ? "home__feature-card--coming-soon" : ""}`}>
+      <CardContent />
+    </div>
+  );
+}
+
+if (!link) {
+  return (
+    <div className="home__feature-card">
+      <CardContent />
+    </div>
+  );
+}
 
 return (
-
 <a href={link} className="home__feature-card" target="_self">
   <CardContent />
 </a>
 ); };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/home.mdx` around lines 833 - 908, Summary: Cards defaulting link="#"
produce dead anchor CTAs; render a non-anchor when there is no real URL. Fix:
change the render logic that currently always returns <a href={link}...> to
check the prop link (and the comingSoon branch) and only render an anchor when
link is a real URL (e.g., truthy and not "#" or "javascript:void(0)"). For
CardContent rendering, use the existing CardContent component and return a
semantic non-interactive wrapper (e.g., <div className="home__feature-card">) or
a <button/role="link"> fallback when link is missing; ensure you keep the
comingSoon branch that returns the coming-soon wrapper and preserve class
names/home__feature-card modifiers so styles and a11y (tabIndex on cloud tag)
remain intact.

Comment on lines +846 to +879
{showCloudFeature && (
<div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
<span className="cloud-feature-icon">
<svg
width="18"
height="12"
viewBox="0 0 18 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g>
<path
d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z"
fill="#FF20B8"
/>
<g>
<path
d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z"
fill="white"
/>
<path
d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z"
fill="white"
/>
<path
d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z"
fill="white"
/>
</g>
</g>
</svg>
</span>
<span className="cloud-feature-text">Cloud Feature</span>
</div>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove the stray keyboard focus stop from the cloud badge.

Line 847 makes a non-interactive label tabbable. That adds noise for keyboard users, but there’s nothing to activate once focus lands on it.

Minimal fix
-          <div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
+          <div className="home__feature-card__cloud-feature-tag" style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{showCloudFeature && (
<div className="home__feature-card__cloud-feature-tag" tabIndex={0} style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
<span className="cloud-feature-icon">
<svg
width="18"
height="12"
viewBox="0 0 18 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g>
<path
d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z"
fill="#FF20B8"
/>
<g>
<path
d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z"
fill="white"
/>
<path
d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z"
fill="white"
/>
<path
d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z"
fill="white"
/>
</g>
</g>
</svg>
</span>
<span className="cloud-feature-text">Cloud Feature</span>
</div>
{showCloudFeature && (
<div className="home__feature-card__cloud-feature-tag" style={{ position: "absolute", top: 0, right: 0, transform: "none" }}>
<span className="cloud-feature-icon">
<svg
width="18"
height="12"
viewBox="0 0 18 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g>
<path
d="M14.5125 4.53C14.2606 3.25329 13.5732 2.10364 12.5678 1.27743C11.5624 0.451225 10.3013 -0.000294182 9 1.43803e-07C6.8325 1.43803e-07 4.95 1.23 4.0125 3.03C2.91018 3.14912 1.89075 3.67141 1.15012 4.49649C0.409478 5.32158 -0.000128776 6.39126 3.03696e-08 7.5C3.03696e-08 9.9825 2.0175 12 4.5 12H14.25C16.32 12 18 10.32 18 8.25C18 6.27 16.4625 4.665 14.5125 4.53Z"
fill="#FF20B8"
/>
<g>
<path
d="M8.62497 6.0357H5.23658C4.82978 6.0357 4.5 6.3555 4.5 6.74999C4.5 7.14448 4.82978 7.46428 5.23658 7.46428H8.62497C9.03177 7.46428 9.36155 7.14448 9.36155 6.74999C9.36155 6.3555 9.03177 6.0357 8.62497 6.0357Z"
fill="white"
/>
<path
d="M11.2634 3.75H7.87503C7.46823 3.75 7.13845 4.0698 7.13845 4.46429C7.13845 4.85878 7.46823 5.17857 7.87503 5.17857H11.2634C11.6702 5.17857 12 4.85878 12 4.46429C12 4.0698 11.6702 3.75 11.2634 3.75Z"
fill="white"
/>
<path
d="M10.3947 8.32143H7.00627C6.59947 8.32143 6.26969 8.64122 6.26969 9.03571C6.26969 9.4302 6.59947 9.75 7.00627 9.75H10.3947C10.8015 9.75 11.1312 9.4302 11.1312 9.03571C11.1312 8.64122 10.8015 8.32143 10.3947 8.32143Z"
fill="white"
/>
</g>
</g>
</svg>
</span>
<span className="cloud-feature-text">Cloud Feature</span>
</div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/home.mdx` around lines 846 - 879, The cloud badge div (rendered when
showCloudFeature is true) is non-interactive but set as tabbable via
tabIndex={0}; remove the tabIndex attribute from the element with className
"home__feature-card__cloud-feature-tag" (the cloud badge rendered in the
showCloudFeature block) so it is no longer focusable by keyboard, and if the
element is purely decorative also ensure it has no interactive handlers or add
aria-hidden="true" if needed.

@arbiv arbiv closed this Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.