Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 52 additions & 4 deletions .github/scripts/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,22 @@
LEADING_HEADING_RE = re.compile(r"^\s*#{1,6}\s+\S", re.MULTILINE)

ALLOWED_FRONTMATTER_KEYS = {
"title", "date", "products", "tag", "emoji", "hero", "draft", "description",
"title", "date", "products", "tag", "emoji", "hero", "draft",
"description", "authors",
}

# `authors` accepts lines of the form "Name:PIXEL_KEY". The split is at the
# *last* colon so names can contain colons if needed.
AUTHOR_RE = re.compile(r"^(.+):([A-Z][A-Z_]*)$")


def load_config() -> dict:
with CONFIG_PATH.open() as fh:
config = yaml.safe_load(fh)
return {
"product_slugs": {p["slug"] for p in config.get("products", [])},
"allowed_hosts": {h.lower() for h in config.get("allowed_hosts", [])},
"author_pixels": set(config.get("author_pixels", [])),
}


Expand Down Expand Up @@ -177,6 +183,36 @@ def check_frontmatter(
if draft is not None and not isinstance(draft, bool):
errors.append(f"{rel}: draft must be a boolean if present")

# authors (optional) — list of "Name:PIXEL_KEY" strings
authors = front.get("authors")
if authors is not None:
if not isinstance(authors, list) or not authors:
errors.append(
f"{rel}: authors must be a non-empty list of "
f"\"Name:PIXEL_KEY\" strings if present"
)
else:
for author in authors:
if not isinstance(author, str):
errors.append(f"{rel}: author {author!r} must be a string")
continue
match = AUTHOR_RE.match(author.strip())
if not match:
errors.append(
f"{rel}: author {author!r} must be formatted as "
f"\"Full Name:PIXEL_KEY\" (e.g. \"Anand Gupta:ROBOT\")"
)
continue
name, pixel = match.group(1).strip(), match.group(2)
if not name:
errors.append(f"{rel}: author has empty name in {author!r}")
if pixel not in config["author_pixels"]:
valid = ", ".join(sorted(config["author_pixels"]))
errors.append(
f"{rel}: author pixel {pixel!r} not allowed. "
f"Pick one of: {valid}"
)

# hero (optional)
hero = front.get("hero")
if hero is not None:
Expand All @@ -197,12 +233,20 @@ def check_frontmatter(
return errors


def check_body(rel: Path, body: str, config: dict) -> list[str]:
def check_body(
rel: Path, body: str, has_description: bool, config: dict
) -> list[str]:
errors: list[str] = []

stripped = body.strip()
if not stripped:
errors.append(f"{rel}: body is empty — add at least one sentence")
# One-liner entries can use just the `description` field with no
# markdown body — but every entry must have at least one of them.
if not has_description:
errors.append(
f"{rel}: entry has no content — set `description` in frontmatter "
f"or write a body paragraph"
)
return errors

# The card already renders the title — bodies should open with prose,
Expand Down Expand Up @@ -305,7 +349,11 @@ def validate_entry(path: Path, config: dict) -> list[str]:
return errors

errors.extend(check_frontmatter(rel, front, filename_date, config))
errors.extend(check_body(rel, fm_match.group(2), config))
has_description = bool(
isinstance(front.get("description"), str)
and front.get("description").strip()
)
errors.extend(check_body(rel, fm_match.group(2), has_description, config))

return errors

Expand Down
9 changes: 9 additions & 0 deletions entries/2025-12-01-global-studio-button.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Global Studio button
date: 2025-12-01
products: [dbt-power-user, snowflake-app, databricks-app]
tag: new
emoji: 🌐
description: Launch Altimate Studio from any page
---

8 changes: 8 additions & 0 deletions entries/2025-12-02-warehouse-recommendation-columns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Warehouse recommendation columns
date: 2025-12-02
products: [snowflake-app, databricks-app]
emoji: 🏢
description: See recommended warehouse size directly in tables
---

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Access rule and ownership cost preview
date: 2025-12-04
products: [snowflake-app, databricks-app]
tag: new
emoji: 👥
description: Preview cost impact before changing access rules
---

9 changes: 9 additions & 0 deletions entries/2025-12-06-knowledge-engine-v2-template-forking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Knowledge Engine v2 template forking
date: 2025-12-06
products: [datamates, dbt-power-user]
tag: improved
emoji: 🔗
description: Fork curated KB templates to your own workspace
---

8 changes: 8 additions & 0 deletions entries/2025-12-08-sidebar-opens-on-hover.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Sidebar opens on hover
date: 2025-12-08
products: [snowflake-app, databricks-app, datamates]
emoji: 🎨
description: Navigation sidebar reveals on hover for more workspace
---

8 changes: 8 additions & 0 deletions entries/2025-12-10-gen2-compute-in-cost-savings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Gen2 compute in cost savings
date: 2025-12-10
products: [snowflake-app]
emoji: 💎
description: Potential and actual savings now incorporate Snowflake gen2 pricing
---

13 changes: 13 additions & 0 deletions entries/2025-12-12-query-analysis-agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
title: Query analysis agent
date: 2025-12-12
products: [snowflake-app, databricks-app]
tag: new
emoji: 🗺️
authors: ["AI Agents Team:CHIP", "Studio Team:ORBIT"]
description: AI-powered deep analysis of individual queries
---

Click any query in the workload view and the analysis agent walks through it: which scans dominate the cost, which predicates are getting pruned (and which aren't), where clustering would help, and whether the same shape has been run before with different parameters.

Output lands as an inline report with a one-paragraph summary, a cost-saving estimate, and a "try this rewrite" suggestion. The agent runs on the platform's standard reasoning trace so you can audit how it reached every conclusion before acting on it.
8 changes: 8 additions & 0 deletions entries/2025-12-14-query-count-metrics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Query count metrics
date: 2025-12-14
products: [snowflake-app, databricks-app]
emoji: 💡
description: New metric to track query volumes alongside cost
---

9 changes: 9 additions & 0 deletions entries/2025-12-16-access-control-metadata-page.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Access Control Metadata page
date: 2025-12-16
products: [snowflake-app, databricks-app]
tag: new
emoji: 🔑
description: Visualize ClickHouse access control policies
---

9 changes: 9 additions & 0 deletions entries/2025-12-18-tasks-page-for-custom-workloads.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Tasks page for custom workloads
date: 2025-12-18
products: [snowflake-app, databricks-app]
tag: new
emoji: 📂
description: Drill into individual tasks within workload runs
---

8 changes: 8 additions & 0 deletions entries/2025-12-20-slack-reports-with-images.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Slack reports with images
date: 2025-12-20
products: [snowflake-app, databricks-app]
emoji: 🔔
description: Reports now include charts and visuals in Slack notifications
---

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Optimal warehouse size recommendations
date: 2025-12-22
products: [snowflake-app, databricks-app]
emoji: 📉
description: Right-size warehouses based on workload patterns
---

9 changes: 9 additions & 0 deletions entries/2025-12-24-table-optimization-agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Table optimization agent
date: 2025-12-24
products: [snowflake-app, databricks-app]
tag: new
emoji: 🏗️
description: AI agent recommends table-level optimizations
---

9 changes: 9 additions & 0 deletions entries/2025-12-26-prompt-library-with-context-filtering.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Prompt Library with context filtering
date: 2025-12-26
products: [dbt-power-user, altimate-code]
tag: new
emoji: 🧩
description: Browse and filter prompts by agent context
---

9 changes: 9 additions & 0 deletions entries/2025-12-28-dbt-workload-metrics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: dbt workload metrics
date: 2025-12-28
products: [snowflake-app, dbt-power-user]
tag: new
emoji: 📊
description: Track dbt run cost and performance over time
---

13 changes: 13 additions & 0 deletions entries/2025-12-30-subscriptions-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
title: Subscriptions v2
date: 2025-12-30
products: [snowflake-app, databricks-app, datamates]
tag: new
emoji: 🎯
authors: ["Platform Team:BOLT"]
description: Redesigned alerting and notification subscriptions
---

Subscriptions v2 reduces alert fatigue. Subscriptions now group by warehouse, by workload, and by ownership, so you get one notification per pattern instead of one per spike.

Channel routing supports Slack threads and Teams cards as first-class destinations alongside email. The redesigned manager page lets you preview what you'd actually receive over the trailing 30 days before saving, so you can tune thresholds before they start paging people.
8 changes: 8 additions & 0 deletions entries/2026-01-01-workload-sorting-and-filtering.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Workload sorting and filtering on run list
date: 2026-01-01
products: [snowflake-app, databricks-app]
emoji: 📋
description: Sort runs by cost, duration, and more
---

8 changes: 8 additions & 0 deletions entries/2026-01-04-search-and-filters-on-datamates.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Search and filters on Datamates page
date: 2026-01-04
products: [datamates]
emoji: 🔎
description: Find data teammates faster with visibility controls
---

8 changes: 8 additions & 0 deletions entries/2026-01-07-ownership-conflict-indicators.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Ownership conflict indicators
date: 2026-01-07
products: [snowflake-app, databricks-app]
emoji: ⚠️
description: See which teams have overlapping ownership rules
---

9 changes: 9 additions & 0 deletions entries/2026-01-10-azure-sso-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Azure SSO support
date: 2026-01-10
products: [snowflake-app, databricks-app, datamates, altimate-code, dbt-power-user]
tag: new
emoji: 🔐
description: Single sign-on for Azure AD tenants
---

13 changes: 13 additions & 0 deletions entries/2026-01-13-pre-execution-query-optimization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
title: Pre-execution query optimization tools
date: 2026-01-13
products: [snowflake-app, databricks-app, datamates]
tag: new
emoji: 🤖
authors: ["AI Agents Team:CHIP", "Anand Gupta:ROBOT"]
description: Optimize SQL before it runs via MCP
---

When an agent or a person asks to run a query, the optimizer steps in before execution. It checks the predicate against clustering keys, looks for `SELECT *` on wide tables, flags joins missing predicates, and proposes a rewrite.

The agent sees the proposal as a suggestion it can apply automatically. The human sees it as an inline diff in their IDE. Either way, the optimization runs through the MCP layer — so it works from CLI, IDE, Studio, and any agent built on the Altimate platform, with no separate setup per surface.
13 changes: 13 additions & 0 deletions entries/2026-01-16-databricks-full-platform-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
title: Databricks full platform support
date: 2026-01-16
products: [databricks-app]
tag: new
emoji: ⚡
authors: ["Databricks Team:HEX"]
description: Cost projections, opportunities, query costs, and filters
---

The Databricks App now matches everything that was on the Snowflake side: cost projections across SKUs, optimization opportunities flagged automatically, query-level cost attribution, and the same filter and grouping primitives.

Connect once through Datamates and the catalog, lineage, and cost views populate. If you're running a hybrid Snowflake plus Databricks stack, both warehouses feed the same workload views and the same governance rules — no two-tool sprawl.
9 changes: 9 additions & 0 deletions entries/2026-01-19-custom-workload-tags.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: Custom workload tags
date: 2026-01-19
products: [snowflake-app, databricks-app]
tag: new
emoji: 🏷️
description: Tag and categorize queries with custom labels
---

8 changes: 8 additions & 0 deletions entries/2026-01-22-workloads-time-interval-aggregation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Workloads time interval aggregation
date: 2026-01-22
products: [snowflake-app, databricks-app]
emoji: 📈
description: Aggregate workload charts by custom time periods
---

9 changes: 9 additions & 0 deletions entries/2026-01-25-dbt-cloud-integrations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: dbt Cloud integrations
date: 2026-01-25
products: [dbt-power-user]
tag: new
emoji: 🔌
description: Connect dbt Cloud directly to Altimate
---

13 changes: 13 additions & 0 deletions entries/2026-01-28-global-studio-launched-for-everyone.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
title: Global Studio launched for everyone
date: 2026-01-28
products: [dbt-power-user, snowflake-app, databricks-app]
tag: new
emoji: 🚀
authors: ["Studio Team:ORBIT", "Anand Gupta:ROBOT"]
description: AI-powered assistant available across all pages
---

Studio is now available everywhere on the platform, not just inside the dbt Power User extension. Open it from any page and ask questions across your entire data stack: queries against Snowflake, lineage in Databricks, dbt model context, and incident history all in one conversation.

The same skills, tools, and governance you configure once apply to every conversation. Behind it sits the Datamates MCP engine, so every connection is validated and every credential is managed centrally. Studio doesn't ask for warehouse credentials per session — it pulls them through Datamates so engineers and analysts don't share passwords.
8 changes: 8 additions & 0 deletions entries/2026-02-01-evaluation-system-improvements.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: Evaluation system improvements
date: 2026-02-01
products: [datamates, altimate-code]
emoji: ⚙️
description: New selectors, pagination, and run evaluation refactor
---

9 changes: 9 additions & 0 deletions entries/2026-02-08-sku-cost-page-databricks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title: SKU Cost page for Databricks
date: 2026-02-08
products: [databricks-app]
tag: new
emoji: 💰
description: Granular Databricks billing breakdown
---

8 changes: 8 additions & 0 deletions entries/2026-02-15-new-insightsection-ui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: New InsightSection UI enabled by default
date: 2026-02-15
products: [snowflake-app, databricks-app, datamates]
emoji: 🔍
description: Redesigned insight cards across the product
---

Loading
Loading