diff --git a/.github/scripts/validate.py b/.github/scripts/validate.py index 1fe23b1..8aa533f 100644 --- a/.github/scripts/validate.py +++ b/.github/scripts/validate.py @@ -50,9 +50,14 @@ 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: @@ -60,6 +65,7 @@ def load_config() -> dict: 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", [])), } @@ -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: @@ -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, @@ -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 diff --git a/entries/2025-12-01-global-studio-button.md b/entries/2025-12-01-global-studio-button.md new file mode 100644 index 0000000..5b467a3 --- /dev/null +++ b/entries/2025-12-01-global-studio-button.md @@ -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 +--- + diff --git a/entries/2025-12-02-warehouse-recommendation-columns.md b/entries/2025-12-02-warehouse-recommendation-columns.md new file mode 100644 index 0000000..9ce0cd5 --- /dev/null +++ b/entries/2025-12-02-warehouse-recommendation-columns.md @@ -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 +--- + diff --git a/entries/2025-12-04-access-rule-and-ownership-cost-preview.md b/entries/2025-12-04-access-rule-and-ownership-cost-preview.md new file mode 100644 index 0000000..5bf0abf --- /dev/null +++ b/entries/2025-12-04-access-rule-and-ownership-cost-preview.md @@ -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 +--- + diff --git a/entries/2025-12-06-knowledge-engine-v2-template-forking.md b/entries/2025-12-06-knowledge-engine-v2-template-forking.md new file mode 100644 index 0000000..08f92a0 --- /dev/null +++ b/entries/2025-12-06-knowledge-engine-v2-template-forking.md @@ -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 +--- + diff --git a/entries/2025-12-08-sidebar-opens-on-hover.md b/entries/2025-12-08-sidebar-opens-on-hover.md new file mode 100644 index 0000000..9d48fab --- /dev/null +++ b/entries/2025-12-08-sidebar-opens-on-hover.md @@ -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 +--- + diff --git a/entries/2025-12-10-gen2-compute-in-cost-savings.md b/entries/2025-12-10-gen2-compute-in-cost-savings.md new file mode 100644 index 0000000..62192b6 --- /dev/null +++ b/entries/2025-12-10-gen2-compute-in-cost-savings.md @@ -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 +--- + diff --git a/entries/2025-12-12-query-analysis-agent.md b/entries/2025-12-12-query-analysis-agent.md new file mode 100644 index 0000000..61ead2a --- /dev/null +++ b/entries/2025-12-12-query-analysis-agent.md @@ -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. diff --git a/entries/2025-12-14-query-count-metrics.md b/entries/2025-12-14-query-count-metrics.md new file mode 100644 index 0000000..1c8bad4 --- /dev/null +++ b/entries/2025-12-14-query-count-metrics.md @@ -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 +--- + diff --git a/entries/2025-12-16-access-control-metadata-page.md b/entries/2025-12-16-access-control-metadata-page.md new file mode 100644 index 0000000..115a244 --- /dev/null +++ b/entries/2025-12-16-access-control-metadata-page.md @@ -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 +--- + diff --git a/entries/2025-12-18-tasks-page-for-custom-workloads.md b/entries/2025-12-18-tasks-page-for-custom-workloads.md new file mode 100644 index 0000000..866a3dd --- /dev/null +++ b/entries/2025-12-18-tasks-page-for-custom-workloads.md @@ -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 +--- + diff --git a/entries/2025-12-20-slack-reports-with-images.md b/entries/2025-12-20-slack-reports-with-images.md new file mode 100644 index 0000000..2ddc0e1 --- /dev/null +++ b/entries/2025-12-20-slack-reports-with-images.md @@ -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 +--- + diff --git a/entries/2025-12-22-optimal-warehouse-size-recommendations.md b/entries/2025-12-22-optimal-warehouse-size-recommendations.md new file mode 100644 index 0000000..0c4b00d --- /dev/null +++ b/entries/2025-12-22-optimal-warehouse-size-recommendations.md @@ -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 +--- + diff --git a/entries/2025-12-24-table-optimization-agent.md b/entries/2025-12-24-table-optimization-agent.md new file mode 100644 index 0000000..32063e2 --- /dev/null +++ b/entries/2025-12-24-table-optimization-agent.md @@ -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 +--- + diff --git a/entries/2025-12-26-prompt-library-with-context-filtering.md b/entries/2025-12-26-prompt-library-with-context-filtering.md new file mode 100644 index 0000000..0358a05 --- /dev/null +++ b/entries/2025-12-26-prompt-library-with-context-filtering.md @@ -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 +--- + diff --git a/entries/2025-12-28-dbt-workload-metrics.md b/entries/2025-12-28-dbt-workload-metrics.md new file mode 100644 index 0000000..48f71f8 --- /dev/null +++ b/entries/2025-12-28-dbt-workload-metrics.md @@ -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 +--- + diff --git a/entries/2025-12-30-subscriptions-v2.md b/entries/2025-12-30-subscriptions-v2.md new file mode 100644 index 0000000..a1cd213 --- /dev/null +++ b/entries/2025-12-30-subscriptions-v2.md @@ -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. diff --git a/entries/2026-01-01-workload-sorting-and-filtering.md b/entries/2026-01-01-workload-sorting-and-filtering.md new file mode 100644 index 0000000..339b6fb --- /dev/null +++ b/entries/2026-01-01-workload-sorting-and-filtering.md @@ -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 +--- + diff --git a/entries/2026-01-04-search-and-filters-on-datamates.md b/entries/2026-01-04-search-and-filters-on-datamates.md new file mode 100644 index 0000000..6b28a12 --- /dev/null +++ b/entries/2026-01-04-search-and-filters-on-datamates.md @@ -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 +--- + diff --git a/entries/2026-01-07-ownership-conflict-indicators.md b/entries/2026-01-07-ownership-conflict-indicators.md new file mode 100644 index 0000000..1c6431d --- /dev/null +++ b/entries/2026-01-07-ownership-conflict-indicators.md @@ -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 +--- + diff --git a/entries/2026-01-10-azure-sso-support.md b/entries/2026-01-10-azure-sso-support.md new file mode 100644 index 0000000..18469e8 --- /dev/null +++ b/entries/2026-01-10-azure-sso-support.md @@ -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 +--- + diff --git a/entries/2026-01-13-pre-execution-query-optimization.md b/entries/2026-01-13-pre-execution-query-optimization.md new file mode 100644 index 0000000..6498ed0 --- /dev/null +++ b/entries/2026-01-13-pre-execution-query-optimization.md @@ -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. diff --git a/entries/2026-01-16-databricks-full-platform-support.md b/entries/2026-01-16-databricks-full-platform-support.md new file mode 100644 index 0000000..d2ea7a2 --- /dev/null +++ b/entries/2026-01-16-databricks-full-platform-support.md @@ -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. diff --git a/entries/2026-01-19-custom-workload-tags.md b/entries/2026-01-19-custom-workload-tags.md new file mode 100644 index 0000000..91e3c42 --- /dev/null +++ b/entries/2026-01-19-custom-workload-tags.md @@ -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 +--- + diff --git a/entries/2026-01-22-workloads-time-interval-aggregation.md b/entries/2026-01-22-workloads-time-interval-aggregation.md new file mode 100644 index 0000000..ba2d1ae --- /dev/null +++ b/entries/2026-01-22-workloads-time-interval-aggregation.md @@ -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 +--- + diff --git a/entries/2026-01-25-dbt-cloud-integrations.md b/entries/2026-01-25-dbt-cloud-integrations.md new file mode 100644 index 0000000..c3687f5 --- /dev/null +++ b/entries/2026-01-25-dbt-cloud-integrations.md @@ -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 +--- + diff --git a/entries/2026-01-28-global-studio-launched-for-everyone.md b/entries/2026-01-28-global-studio-launched-for-everyone.md new file mode 100644 index 0000000..dfa874f --- /dev/null +++ b/entries/2026-01-28-global-studio-launched-for-everyone.md @@ -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. diff --git a/entries/2026-02-01-evaluation-system-improvements.md b/entries/2026-02-01-evaluation-system-improvements.md new file mode 100644 index 0000000..a154c9b --- /dev/null +++ b/entries/2026-02-01-evaluation-system-improvements.md @@ -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 +--- + diff --git a/entries/2026-02-08-sku-cost-page-databricks.md b/entries/2026-02-08-sku-cost-page-databricks.md new file mode 100644 index 0000000..33ff5f2 --- /dev/null +++ b/entries/2026-02-08-sku-cost-page-databricks.md @@ -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 +--- + diff --git a/entries/2026-02-15-new-insightsection-ui.md b/entries/2026-02-15-new-insightsection-ui.md new file mode 100644 index 0000000..4bbc70b --- /dev/null +++ b/entries/2026-02-15-new-insightsection-ui.md @@ -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 +--- + diff --git a/entries/2026-02-22-ai-services-cost-monitoring.md b/entries/2026-02-22-ai-services-cost-monitoring.md new file mode 100644 index 0000000..a5d9bdf --- /dev/null +++ b/entries/2026-02-22-ai-services-cost-monitoring.md @@ -0,0 +1,13 @@ +--- +title: AI Services cost monitoring page +date: 2026-02-22 +products: [snowflake-app, databricks-app] +tag: new +emoji: 📊 +authors: ["Cost Insights Team:DOLLAR"] +description: Track AI cost with graphs and summary tables +--- + +AI Services has a dedicated cost monitoring page. Graphs show daily and monthly spend broken down by model, gateway, and which agent or skill made the call. + +The summary table at the bottom calls out outliers: agents whose cost-per-task spiked, gateways getting hit more than expected, models that are quietly migrating up the price tier. Click through any row to see the underlying queries and the conversations that triggered them. diff --git a/entries/2026-02-28-knowledge-engine-ux-enhancements.md b/entries/2026-02-28-knowledge-engine-ux-enhancements.md new file mode 100644 index 0000000..48c4656 --- /dev/null +++ b/entries/2026-02-28-knowledge-engine-ux-enhancements.md @@ -0,0 +1,13 @@ +--- +title: Knowledge Engine UX enhancements +date: 2026-02-28 +products: [datamates, dbt-power-user] +tag: improved +emoji: 🧠 +authors: ["Knowledge Engine Team:GLOBE"] +description: Improved docs and onboarding experience +--- + +The Knowledge Engine onboarding now walks you through your first three connections — warehouse, lineage source, and ownership data — with inline previews so you can see what each one unlocks before committing. + +Docs got a full pass too. The "what counts as context" page now has a working example for each of the four context types, and every page links to the exact MCP tool that consumes it. diff --git a/entries/2026-05-13-changelog-launch.md b/entries/2026-05-13-changelog-launch.md index 2860537..d48edb7 100644 --- a/entries/2026-05-13-changelog-launch.md +++ b/entries/2026-05-13-changelog-launch.md @@ -4,8 +4,22 @@ date: 2026-05-13 products: [dbt-power-user, snowflake-app, databricks-app, altimate-code, datamates] tag: new emoji: 📜 +authors: ["Anand Gupta:ROBOT", "Claude Opus 4.7:CHIP"] +description: A new GitHub-backed source for the changelog — any engineer can ship an entry by opening a PR. --- -The changelog at [altimate.ai/changelog](https://altimate.ai/changelog) is now sourced from a separate public repo. Any engineer can ship an entry by opening a PR — no website redeploy required, and new entries appear within a few minutes of merge. +The changelog at [altimate.ai/changelog](https://altimate.ai/changelog) is now sourced from a separate public repo at [github.com/AltimateAI/changelog](https://github.com/AltimateAI/changelog). Any engineer can ship an entry by opening a PR. No website redeploy required — new entries appear on the page within a few minutes of merge. -See [the contributor guide](https://github.com/AltimateAI/changelog) for the format and CI rules. +## How to add an entry + +Three options, in order of friction: + +1. **`/changelog-add`** — run Claude Code in the repo and let it draft the entry from a one-line description. +2. **Hand-write** the markdown using the template in [the README](https://github.com/AltimateAI/changelog). +3. **`/changelog-polish`** — paste a draft you wrote, get a STYLE.md-aware rewrite back. + +CI validates the schema on every PR — frontmatter, body length, link allowlist, no internal jargon. A pre-commit hook runs the same checks locally so you catch failures before pushing. + +## What you can put in an entry + +Everything you'd want to share with a customer: links, screenshots, embedded Loom or YouTube videos, code snippets, and a `// SHIPPED BY` footer crediting the engineers who built it. Each author picks a pixel-art avatar that flips in place when the page loads. diff --git a/products.yml b/products.yml index c54acf8..d1da47f 100644 --- a/products.yml +++ b/products.yml @@ -16,6 +16,28 @@ products: # Hosts allowed in body links, hero media, and image sources. # Anything outside this list is rejected at CI to keep the changelog free of # random third-party embeds. +# Pixel-art keys engineers can pick as their byline avatar. Each name maps +# to a 32x32 pixel illustration in altimate-website/src/components/v2/illustrations.js. +# Keep this in sync if illustrations are added/removed there. +author_pixels: + - HUMAN + - ROBOT + - GLOBE + - BOLT + - HEX + - TERMINAL + - TEAM + - ORBIT + - COIN + - ALERT + - HOURGLASS + - DOLLAR + - BRACKETS + - CODE_WINDOW + - GRID + - STACK + - CHIP + allowed_hosts: - youtube.com - www.youtube.com