Skip to content

Release HyperDX#2378

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Open

Release HyperDX#2378
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@hyperdx/api@2.29.0

Minor Changes

  • 9119de5: Add unique MongoDB index on accessKey field in User model to eliminate full collection scans during API key authentication. This could cause startup failures if any existing users share duplicate accessKey values.
  • b798f91: Add connection management endpoints to the external API (/api/v2/connections), supporting list, get, create, update, and delete with Bearer token authentication. Passwords are write-only and never returned by the API.
  • f126d5b: Support number-tile color authoring through the external dashboards API. The v2 REST API and OpenAPI spec now accept color (a palette token) and colorRules (ordered conditional color rules, last match wins) on builder number tiles, and color on raw SQL number tiles, matching what the in-product number-tile editor persists. Color rules accept the numeric and equality operators the editor offers (gt, gte, lt, lte, between, eq, neq). Existing dashboards keep working: tiles saved before the palette was renamed to hue names are normalized to the current token names on read.

Patch Changes

  • 998ea5d: feat: Add option to fit time chart y-axis lower bound

  • ee90738: fix: Add sourceId to MCP Raw SQL Tile schema

  • 9a7e392: fix: Add missing numberFormats, compareToPreviousPeriod fields to MCP Schemas

  • cdd7ca0: fix(mcp): reduce describe_source timeouts by using rollup tables for map key discovery

  • 8261b46: fix: inline parametric aggregate function arguments instead of passing as query parameters

  • 8164492: fix(mcp): improve alias field descriptions and examples for readable chart legends

  • a19ba54: feat(mcp): add patch_dashboard, get_dashboard_tile, search_dashboards tools

    Add three new MCP dashboard tools for granular operations:

    • hyperdx_get_dashboard_tile — retrieve a single tile by tileId
    • hyperdx_patch_dashboard — update name/tags and/or replace one tile
      without resubmitting the full dashboard
    • hyperdx_search_dashboards — search by name and/or tags

    Fix empty parameter schema on patch/search tools caused by Zod
    .refine() wrapping. Document Lucene substring matching limitations
    prominently in tool descriptions and query guide prompt.

    Breaking (minor): Tile name on hyperdx_save_dashboard now requires
    at least 1 character (.min(1)). Previously empty string "" was accepted
    and silently persisted as a blank title. Callers sending name: "" will
    now receive a validation error.

  • 7e7159a: fix(mcp): improve error hints and fix readonly mode for query safety settings

    Switch MCP ClickHouse safety settings from readonly=1 to readonly=2 so
    max_execution_time and max_result_rows are actually applied (readonly=1
    silently rejects all setting changes).

    Improve DateTime64 cast error hint to recommend parseDateTime64BestEffort()
    which works on both DateTime and DateTime64 columns, replacing
    toDateTime64() which only works on DateTime64.

    Add error hint for unknown column/identifier errors directing agents to
    call describe_source before retrying.

  • f34a31f: Support number-tile color in the MCP dashboard tools. save_dashboard and patch_dashboard now accept a static color and conditional colorRules on builder number tiles, and a static color on raw SQL number tiles, matching the external REST dashboards API.

  • f6bda8c: refactor(mcp): simplify ObjectId validation with shared helpers and schema-level checks

    Add mcpError() and validateObjectId() utilities to reduce boilerplate
    across MCP tool handlers. Move ObjectId validation into Zod input schemas
    for always-required ID fields, eliminating inline checks entirely. Remaining
    conditional checks use the new one-liner helper.

  • f326ccf: fix(mcp): quote multi-word aliases in orderBy and steer event-pattern usage

    Quote resolved aliases that are not bare identifiers (e.g. "P95 Latency")
    in resolveOrderBy output, in both the direct alias-match and aggFn-match
    paths. Previously an unquoted multi-word alias produced SQL-invalid
    ORDER BY output. Incoming orderBy values are stripped of surrounding
    double-quote/backtick quoting before matching, so agents that already quote
    the alias resolve correctly without being double-quoted.

    Also document the alias-quoting requirement in the orderBy schema
    descriptions, and update the clickstack_event_patterns tool description to
    steer agents toward it (over clickstack_search / clickstack_table) when
    exploring what messages, errors, or events exist.

  • 750b8af: feat(mcp): add denoise option to clickstack_search tool

    Add a denoise boolean parameter to the MCP clickstack_search tool that
    automatically filters out high-frequency repetitive event patterns from
    search results, mirroring the web app's "Denoise Results" feature.

    When enabled, the tool samples 10k random events, mines patterns using
    the Drain algorithm, identifies noisy patterns (>10% of sample), and
    filters them out of result rows. Returns filtered rows plus metadata
    listing removed patterns with estimated counts.

    Extracts shared denoise constants (DENOISE_SAMPLE_SIZE,
    DENOISE_NOISE_THRESHOLD) into @hyperdx/common-utils so the web app
    and MCP server use the same values.

  • caba7c2: fix: Nudge agents towards macros in raw SQL tiles

  • f113ea3: fix(mcp): add ClickHouse safety settings (max_execution_time, max_result_rows, readonly) for MCP query execution

  • 60a91e4: fix(mcp): remove max_result_rows from MCP safety settings

    Remove the hardcoded max_result_rows=100000 setting from MCP query
    execution. Some ClickHouse connections impose profile constraints that
    cap max_result_rows below our default, causing SETTING_CONSTRAINT_VIOLATION
    errors. The remaining safety settings (max_execution_time=30, readonly=2)
    and trimToolResponse provide sufficient protection.

    Add a SETTING_CONSTRAINT_VIOLATION error hint so constrained settings
    surface actionable guidance instead of raw ClickHouse errors.

  • e03971b: refactor(theme): rename chart palette tokens from chart-1..10 to hue-named
    (chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX
    and ClickStack

    Stored configs from the initial color picker ([HDX-1360] feat(app): number tile static color picker #2265) keep working.
    ChartPaletteTokenSchema stays strict (a plain z.enum, so its z.input
    matches z.output — wrapping it in z.preprocess would poison
    validateRequest's req.body inference all the way up to
    Dashboard.tiles[i].config.color). Migration of legacy chart-1 .. chart-10
    happens at five complementary points so no entry or wire-format path can slip
    through, all composing over a single shared walker
    (walkRawDashboardTileColors in common-utils) so the per-tile traversal
    stays in lockstep:

    • Fetch-time / write-time (React): normalizeDashboardTileColors in
      packages/app/src/dashboard.ts heals dashboards on read
      (useDashboards / fetchLocalDashboards / fetchDashboards) and on write
      (useUpdateDashboard / useCreateDashboard). Unresolvable color strings
      (stale hexes, hand-edited values, forward-rolled future tokens) are
      preserved so the user's chosen value survives a render pass — the strict
      server-side schema surfaces a clear error on next save instead of the
      normalizer quietly dropping the field.
    • JSON import: DBDashboardImportPage runs
      normalizeRawDashboardTileColors on the parsed JSON before the strict
      DashboardTemplateSchema.safeParse, so templates exported from a
      pre-rename deploy import cleanly.
    • Server-side GET response healing: getDashboards / getDashboard in
      packages/api/src/controllers/dashboard.ts rewrite legacy tile colors on
      the way out. Pre-rename Mongo docs are served on the wire as
      hue-named tokens so non-React HTTP clients (CI scripts, stale bundle
      tabs during a rolling deploy, the external API) can round-trip
      GET → PATCH without ever resurrecting chart-N through the strict
      schema.
    • Server-side write shim: the dashboards POST / PATCH routes mount
      a request-body preprocessor that rewrites legacy tile colors before
      validateRequest runs ChartPaletteTokenSchema. Catches non-React
      HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts,
      MCP, the upcoming external-API parity work) for a one-release
      deprecation window without weakening the schema's input/output equality.
      The dashboard provisioner task applies the same shim before parsing
      on-disk template files.
    • Render-time (belt-and-suspenders): DBNumberChart and
      ColorSwatchInput also call resolveChartPaletteToken for tiles
      constructed in memory between fetch and save (ChartEditor form
      state, unit-test fixtures, hand-rolled Tile literals).

    The migration preserves the HyperDX slot ordering from [HDX-1360] feat(app): number tile static color picker #2265 (slot 1 = brand
    green, slot 2 = blue, etc.).

    ClickStack legacy color caveat: Pre-rename ClickStack used a different slot
    ordering than HyperDX (--color-chart-1 was brand blue #437eef, not brand
    green). The migration map uses HyperDX slot ordering, so any ClickStack
    dashboard saved via [HDX-1360] feat(app): number tile static color picker #2265 with color: 'chart-1' will flip from blue to
    Observable green after migration. We chose this trade-off deliberately over
    branching the legacy map by active theme: LEGACY_CHART_PALETTE_TOKEN_MAP lives
    in common-utils (shared with the API), and migration is one-shot persisted on
    next save — theme-branching would couple common-utils to browser DOM state and
    still produce wrong results for users whose active theme changed since the
    original pick. Affected users can manually re-pick the desired hue via the (now
    hue-labeled) color picker.

    The categorical palette is based on Observable 10, with chart-blue swapped to
    #437eef to match the brand link color
    (--click-global-color-text-link-default); all other hues are straight from
    Observable 10. The palette resolves identically on both themes — picking
    chart-blue always renders the brand blue. Brand identity for charts moves
    entirely into the semantic layer: --color-chart-success and --color-chart-info
    resolve to categorical chart-green (#3ca951) and chart-blue (#437eef) on
    both HyperDX and ClickStack, so success fills, info-level logs, and the
    matching multi-series slots all read consistently across brands.

    Internally, JS (CATEGORICAL_HEX_BY_TOKEN in packages/app/src/utils.ts) is
    the source of truth for categorical hues — getColorFromCSSVariable and
    getColorFromCSSToken skip getComputedStyle for categorical tokens since the
    palette is unified across themes. The matching --color-chart-{hue} CSS vars in
    _tokens.scss remain as a stylesheet-author affordance (inline var() use,
    devtools inspection) and a hook for any future per-brand override. Semantic
    tokens still resolve through getComputedStyle because they genuinely vary per
    theme.

  • adac913: refactor(mcp): rename all MCP tool prefixes from hyperdx_ to clickstack_

    Rename the MCP server name from hyperdx to clickstack and update all 19
    tool names (e.g. hyperdx_searchclickstack_search), along with
    descriptions, prompts, error messages, and test references.

  • 03f9dd7: feat: add an optional Section field to data sources

    Sources can now carry an optional free-text Section label, set from the source
    settings form. The value is persisted and returned by GET /api/v2/sources, so
    external API consumers can read it. This lays the groundwork for grouping and
    searching sources by section in the source selector.

  • fc3ef2d: fix(alerts): populate {{attributes.*}} template variables for tile/chart alerts from group-by fields

  • 81e524c: feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector.

  • 55a255a: refactor(metrics): unify AttributesHash to variadic cityHash64 across Map and
    JSON metric schemas

    Sum / Gauge / Histogram metric queries now compute AttributesHash as
    cityHash64(ScopeAttributes, ResourceAttributes, Attributes) for both
    Map(LowCardinality(String), String) and JSON attribute columns. Previously
    the Map-schema path wrapped the three maps in mapConcat() before hashing,
    and the JSON-schema path used the variadic form; the schema-detection
    ClickHouse round-trip and the attrHashExpr helper / isJsonSchema
    plumbing are gone.

    Compatibility:

    • Per-row AttributesHash values change for every Map-schema metric row,
      but the hash is recomputed inside CTEs on every query — no materialized
      view, projection, ALIAS column, or cache persists it, so no downstream
      consumer is affected (audit: OSS only).
    • Cross-scope same-key behaviour shifts: two rows that carry the same
      logical key in different attribute scopes (e.g. host in
      ResourceAttributes for one emission and host in Attributes for the
      next) now hash distinctly and land in separate series. Previously the
      mapConcat path collapsed them into one series. This only matters when an
      OTel collector processor promotes attributes across scopes mid-stream;
      most SDKs emit attributes in stable scopes. The new behaviour is captured
      by an integration test in packages/api/src/clickhouse/__tests__.

    HDX-4466.

  • Updated dependencies [998ea5d]

  • Updated dependencies [ee90738]

  • Updated dependencies [8261b46]

  • Updated dependencies [bf6e1f2]

  • Updated dependencies [677e3f7]

  • Updated dependencies [89949b1]

  • Updated dependencies [747352f]

  • Updated dependencies [750b8af]

  • Updated dependencies [caba7c2]

  • Updated dependencies [e03971b]

  • Updated dependencies [adac913]

  • Updated dependencies [c74744a]

  • Updated dependencies [03f9dd7]

  • Updated dependencies [81e524c]

  • Updated dependencies [55a255a]

    • @hyperdx/common-utils@0.21.0

@hyperdx/app@2.29.0

Minor Changes

  • 9af8cba: feat: add Browser RUM dashboard template

    • New "Browser RUM" template in the dashboards gallery for browser sessions instrumented with the HyperDX Browser SDK (or any OTel browser instrumentation emitting a rum.sessionId resource attribute)
    • Performance Overview section: page-view/session/error KPIs, Core Web Vitals (LCP/INP/CLS) p75, median/p75/p90 page-load percentiles, and long-task health
    • Page Views Breakdown section: traffic grouped by URL, browser (parsed from the http.user_agent the document-load instrumentation emits), country, and device size (derived from screen.xy)
    • Errors section with tabs for an overview, JS exceptions (by message and by page), and failing API calls
    • Five dashboard-level filters: Service, Environment, Service Version, Page URL, and Country
    • Top Countries tile and the Country filter populate when the OTel collector's geoip processor is enabled (geo can't be derived in the browser)
  • b6a4b3b: feat: lazy-load dashboard tiles based on viewport visibility

    Dashboard tiles now only run their ClickHouse queries once they scroll into the browser viewport, instead of every tile querying on page load. A tile loads the first time it becomes visible and keeps its data afterward. This significantly reduces the number of queries fired when opening dashboards with many tiles.

  • e03971b: refactor(theme): rename chart palette tokens from chart-1..10 to hue-named
    (chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX
    and ClickStack

    Stored configs from the initial color picker ([HDX-1360] feat(app): number tile static color picker #2265) keep working.
    ChartPaletteTokenSchema stays strict (a plain z.enum, so its z.input
    matches z.output — wrapping it in z.preprocess would poison
    validateRequest's req.body inference all the way up to
    Dashboard.tiles[i].config.color). Migration of legacy chart-1 .. chart-10
    happens at five complementary points so no entry or wire-format path can slip
    through, all composing over a single shared walker
    (walkRawDashboardTileColors in common-utils) so the per-tile traversal
    stays in lockstep:

    • Fetch-time / write-time (React): normalizeDashboardTileColors in
      packages/app/src/dashboard.ts heals dashboards on read
      (useDashboards / fetchLocalDashboards / fetchDashboards) and on write
      (useUpdateDashboard / useCreateDashboard). Unresolvable color strings
      (stale hexes, hand-edited values, forward-rolled future tokens) are
      preserved so the user's chosen value survives a render pass — the strict
      server-side schema surfaces a clear error on next save instead of the
      normalizer quietly dropping the field.
    • JSON import: DBDashboardImportPage runs
      normalizeRawDashboardTileColors on the parsed JSON before the strict
      DashboardTemplateSchema.safeParse, so templates exported from a
      pre-rename deploy import cleanly.
    • Server-side GET response healing: getDashboards / getDashboard in
      packages/api/src/controllers/dashboard.ts rewrite legacy tile colors on
      the way out. Pre-rename Mongo docs are served on the wire as
      hue-named tokens so non-React HTTP clients (CI scripts, stale bundle
      tabs during a rolling deploy, the external API) can round-trip
      GET → PATCH without ever resurrecting chart-N through the strict
      schema.
    • Server-side write shim: the dashboards POST / PATCH routes mount
      a request-body preprocessor that rewrites legacy tile colors before
      validateRequest runs ChartPaletteTokenSchema. Catches non-React
      HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts,
      MCP, the upcoming external-API parity work) for a one-release
      deprecation window without weakening the schema's input/output equality.
      The dashboard provisioner task applies the same shim before parsing
      on-disk template files.
    • Render-time (belt-and-suspenders): DBNumberChart and
      ColorSwatchInput also call resolveChartPaletteToken for tiles
      constructed in memory between fetch and save (ChartEditor form
      state, unit-test fixtures, hand-rolled Tile literals).

    The migration preserves the HyperDX slot ordering from [HDX-1360] feat(app): number tile static color picker #2265 (slot 1 = brand
    green, slot 2 = blue, etc.).

    ClickStack legacy color caveat: Pre-rename ClickStack used a different slot
    ordering than HyperDX (--color-chart-1 was brand blue #437eef, not brand
    green). The migration map uses HyperDX slot ordering, so any ClickStack
    dashboard saved via [HDX-1360] feat(app): number tile static color picker #2265 with color: 'chart-1' will flip from blue to
    Observable green after migration. We chose this trade-off deliberately over
    branching the legacy map by active theme: LEGACY_CHART_PALETTE_TOKEN_MAP lives
    in common-utils (shared with the API), and migration is one-shot persisted on
    next save — theme-branching would couple common-utils to browser DOM state and
    still produce wrong results for users whose active theme changed since the
    original pick. Affected users can manually re-pick the desired hue via the (now
    hue-labeled) color picker.

    The categorical palette is based on Observable 10, with chart-blue swapped to
    #437eef to match the brand link color
    (--click-global-color-text-link-default); all other hues are straight from
    Observable 10. The palette resolves identically on both themes — picking
    chart-blue always renders the brand blue. Brand identity for charts moves
    entirely into the semantic layer: --color-chart-success and --color-chart-info
    resolve to categorical chart-green (#3ca951) and chart-blue (#437eef) on
    both HyperDX and ClickStack, so success fills, info-level logs, and the
    matching multi-series slots all read consistently across brands.

    Internally, JS (CATEGORICAL_HEX_BY_TOKEN in packages/app/src/utils.ts) is
    the source of truth for categorical hues — getColorFromCSSVariable and
    getColorFromCSSToken skip getComputedStyle for categorical tokens since the
    palette is unified across themes. The matching --color-chart-{hue} CSS vars in
    _tokens.scss remain as a stylesheet-author affordance (inline var() use,
    devtools inspection) and a hook for any future per-brand override. Semantic
    tokens still resolve through getComputedStyle because they genuinely vary per
    theme.

  • 418567f: feat: trace panel inline split detail

Patch Changes

  • 56c5866: fix(search-filters): prevent nested filter dropdowns from disappearing on reopen

  • 998ea5d: feat: Add option to fit time chart y-axis lower bound

  • 20fabc6: feat: add a "Connect your AI assistant" section to Team Settings

    A new section on the Team Settings page (Integrations tab, above the API Keys
    card) lets a user install the HyperDX MCP server in Claude Code, Cursor,
    VS Code + Copilot, Codex CLI, or any MCP-compatible host without hand-rolling
    JSON. Per-host snippets carry the user's personal access key so the install
    works against the existing /api/mcp route without extra setup.

  • 8e52cef: feat(dashboard): auto-resize font in number tiles to fit container

    Number tiles now automatically scale their font size to fit the available
    width, preventing text overflow on narrow tiles and making better use of
    space on wide ones. Includes an error boundary so a single broken tile
    does not crash the entire dashboard.

  • 31b8781: feat(chart-explorer): duplicate a series in the chart builder

    Add a Duplicate button to each series row in the chart builder that inserts a
    copy of that series directly below it, so building a near-identical variant
    (for example avg and p95 of the same column) no longer requires re-entering
    every field by hand. "Add Series" still creates a blank series. The copy
    starts with an empty alias so it does not collide with the original's alias in
    the generated SQL.

  • 65931e3: feat(search): make active filter pills editable in place

    Clicking an active filter pill under the search bar now opens a small menu to copy the value, flip the filter polarity (include vs exclude), or switch to a different value of the same field, without removing and re-adding the filter. The polarity is preserved when changing the value, and the one-click remove on each pill is unchanged. Range and not-applied pills keep their remove-only behavior.

  • 7152d2b: feat: Use optimistic updates for favorites

  • 497d50b: feat: Allow selecting the column or SQL expression used for event pattern grouping (with shareable URL state)

  • 052315b: fix: improve contrast of excluded search filter pills

    Excluded ("!=") filter pills above the search results used a saturated red background with red text and a red remove button, which made them hard to read in the light theme. They now use a soft red tint with a readable accent, legible in both light and dark themes.

  • 8261b46: fix: inline parametric aggregate function arguments instead of passing as query parameters

  • bf6e1f2: feat(charts): the time-chart series limit is now configured per chart in the Display Settings drawer instead of as a workspace-wide team setting (the team "Time Chart Series Limit" setting is removed). It is disabled by default — charts fetch every series and no __hdx_series_limit CTE is emitted — and is cleared back to disabled by emptying the field. The control only appears for builder line/bar charts; the limit and its Generated SQL preview now come from the chart's own config. When a limit is set, chunked time-chart queries keep a consistent top-N series set: previously each time-window chunk ranked its own top-N, so charts could render more series than the limit and adjacent windows disagreed; the ranking is now pinned to the newest chunk window for every chunk so the union across chunks equals the limit.

  • 712ba11: fix: Navigate to the dashboard listing page after deleting a dashboard

  • 2130775: fix(row-panel): mergePath now emits string-key subscripts for Map columns,
    preventing a crash when expanding rows with numeric-looking attribute keys

    mergePath converted numeric path segments to 1-based array subscripts
    ([N+1]) regardless of whether the parent column was a Map or an Array.
    On a Map(String, String) column this produced SQL like LogAttributes[2],
    which ClickHouse rejects with Illegal types of arguments: Map(String, String), UInt8 for function arrayElement. The grid row
    "expand" view failed for any row whose attribute path included a
    numeric-looking key under a Map column.

    mergePath now accepts a mapColumns argument alongside jsonColumns.
    For Map-typed parents, sub-keys always render as string subscripts
    (Map['1']) regardless of whether the key looks numeric. The three
    callers (useAutoCompleteOptions, DBRowJsonViewer via the row panels,
    DBSearchPageFilters) now thread Map-column names from the source
    schema. A new useMapColumns hook mirrors useJsonColumns.

    Fixes HDX-4369.

  • 2cecc9f: Dashboard table tiles configured with a row-click action now show a trailing arrow-up-right icon at the right edge of each row, revealed on hover, with a small tooltip that names the destination. Actionable rows get a stronger background highlight on hover to reinforce interactivity before the user sees the arrow fade in. The icon click navigates to the same URL as a row click, with all the standard native browser behaviors (cmd-click new tab, middle-click new tab, right-click context menu).

  • 750b8af: feat(mcp): add denoise option to clickstack_search tool

    Add a denoise boolean parameter to the MCP clickstack_search tool that
    automatically filters out high-frequency repetitive event patterns from
    search results, mirroring the web app's "Denoise Results" feature.

    When enabled, the tool samples 10k random events, mines patterns using
    the Drain algorithm, identifies noisy patterns (>10% of sample), and
    filters them out of result rows. Returns filtered rows plus metadata
    listing removed patterns with estimated counts.

    Extracts shared denoise constants (DENOISE_SAMPLE_SIZE,
    DENOISE_NOISE_THRESHOLD) into @hyperdx/common-utils so the web app
    and MCP server use the same values.

  • 9d71399: fix(z-index): keep sticky header below drawers and drawers above the fullscreen tile modal

    Two related z-index regressions:

    • PageHeader was pinned at z-index: 100, but app drawers opt into a
      much lower stack via ZIndexContext (contextZIndex + 10, so a
      top-level drawer renders at z-index: 10). The sticky header therefore
      floated above the drawer overlay. The header now sits at z-index: 2 so
      drawer overlays reliably cover the page chrome while the header still
      wins against normal scrolling content.
    • FullscreenPanelModal used Mantine's default modal z-index (200) and
      didn't propagate it through ZIndexContext. Clicking a row in a
      fullscreen search tile opened a DBRowSidePanel drawer at z-index: 10
      that was hidden behind the modal. The modal now follows the existing
      contextZIndex + 10 pattern and wraps its children in a
      ZIndexContext.Provider, so child drawers stack on top of it.
  • 538a1c4: chore: migrate the custom Dashboard page to shared PageLayout / PageHeader. Breadcrumbs, the editable dashboard name, dashboard actions (Favorite, Tags, Menu), and the "Created by … Updated …" meta now live in a single page header, while the query toolbar (SQL/Lucene WHERE, time range, granularity, Live, refresh, edit filters, Run) is pinned to the top of the scroll container as a dedicated sticky row — the chrome above scrolls away and only the toolbar follows the user. The "Updated …" meta moves to the right side of the breadcrumbs row instead of sitting as a separate body line.

    PageHeader gains a stickyRow slot that any page can use to declare a single row that should be the only pinned element, with the rest of the header treated as scrolling chrome. Other pages are unaffected — a PageHeader without stickyRow keeps the existing fully-sticky behavior.

  • e492280: feat: add source field suggestions

  • defbe1f: Add Cmd/Ctrl+Enter support for running raw SQL chart queries from the SQL editor.

  • c74744a: fix: fallback to body or implicit column expression when other empty

  • d1d91d7: feat(service-map): server-side filtering, latency percentiles, throughput & focus

    The Service Map gains server-side filtering (Lucene/SQL where plus a
    service-name multi-select with inbound/outbound neighbor expansion), latency
    percentiles (p50/p95/p99) and request throughput (req/s) in node and edge
    tooltips, a "Focus" action to scope the map to a service and its immediate
    dependencies, and node sizing by total throughput (incoming + outgoing).
    Percentiles are computed server-side via a single GROUPING SETS query.

  • b763ba6: fix: next-runtime-env runtime env var injection fixed for images

  • 53e8bd1: fix: Fix height of source select RHS menu

  • 2a68145: feat(source-picker): chip + kebab menu UX

  • f95687b: Fix the database, table, and connection dropdowns being clipped inside the source setup modal. The dropdowns now render in a portal, so the full list is visible and scrollable when configuring or editing a source.

  • 48e19e8: Suggest existing section names in the source form's Section field. The field is now an autocomplete fed by the sections already in use, so a new source can reuse an existing section instead of retyping it (which is how a section ends up split into near-duplicates like "Billing" and "billing"). The field stays free-text, so any new section name is still accepted.

  • 03f9dd7: feat: add an optional Section field to data sources

    Sources can now carry an optional free-text Section label, set from the source
    settings form. The value is persisted and returned by GET /api/v2/sources, so
    external API consumers can read it. This lays the groundwork for grouping and
    searching sources by section in the source selector.

  • fdb18f2: Group the data source selector by section and add tag-style search. When sources have a Section assigned, the selector lists them under section headers; search matches on both the source name and its section, so a section name acts as a tag (typing "billing" returns every source in the Billing section, including ones whose name does not contain "billing"). The selector stays flat until at least one source has a section, so deployments that have not adopted sections see no change. The grouped dropdown is also widened and pinned to the picker's left edge so section headers and source names are not cramped.

  • 34aa906: Show each source's Section on the Manage Sources list. A sectioned source now displays its section, with a folder icon, in the dimmed metadata row alongside its connection and table, so the list mirrors the grouped selector. Sources without a section are unchanged.

  • 81e524c: feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector.

  • bc5cd00: feat: emphasize the series nearest the cursor in multi-series time charts. The nearest line is thickened and the others fade back, and its tooltip row is bolded while the rest dim, so a value is easy to trace back to its line.

  • a6e7dcd: chore: Make error states consistent across chart types

  • Updated dependencies [9119de5]

  • Updated dependencies [998ea5d]

  • Updated dependencies [ee90738]

  • Updated dependencies [9a7e392]

  • Updated dependencies [b798f91]

  • Updated dependencies [cdd7ca0]

  • Updated dependencies [8261b46]

  • Updated dependencies [bf6e1f2]

  • Updated dependencies [677e3f7]

  • Updated dependencies [89949b1]

  • Updated dependencies [747352f]

  • Updated dependencies [8164492]

  • Updated dependencies [a19ba54]

  • Updated dependencies [7e7159a]

  • Updated dependencies [f34a31f]

  • Updated dependencies [f6bda8c]

  • Updated dependencies [f326ccf]

  • Updated dependencies [750b8af]

  • Updated dependencies [caba7c2]

  • Updated dependencies [f113ea3]

  • Updated dependencies [f126d5b]

  • Updated dependencies [60a91e4]

  • Updated dependencies [e03971b]

  • Updated dependencies [adac913]

  • Updated dependencies [c74744a]

  • Updated dependencies [03f9dd7]

  • Updated dependencies [fc3ef2d]

  • Updated dependencies [81e524c]

  • Updated dependencies [55a255a]

    • @hyperdx/api@2.29.0
    • @hyperdx/common-utils@0.21.0

@hyperdx/common-utils@0.21.0

Minor Changes

  • e03971b: refactor(theme): rename chart palette tokens from chart-1..10 to hue-named
    (chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX
    and ClickStack

    Stored configs from the initial color picker ([HDX-1360] feat(app): number tile static color picker #2265) keep working.
    ChartPaletteTokenSchema stays strict (a plain z.enum, so its z.input
    matches z.output — wrapping it in z.preprocess would poison
    validateRequest's req.body inference all the way up to
    Dashboard.tiles[i].config.color). Migration of legacy chart-1 .. chart-10
    happens at five complementary points so no entry or wire-format path can slip
    through, all composing over a single shared walker
    (walkRawDashboardTileColors in common-utils) so the per-tile traversal
    stays in lockstep:

    • Fetch-time / write-time (React): normalizeDashboardTileColors in
      packages/app/src/dashboard.ts heals dashboards on read
      (useDashboards / fetchLocalDashboards / fetchDashboards) and on write
      (useUpdateDashboard / useCreateDashboard). Unresolvable color strings
      (stale hexes, hand-edited values, forward-rolled future tokens) are
      preserved so the user's chosen value survives a render pass — the strict
      server-side schema surfaces a clear error on next save instead of the
      normalizer quietly dropping the field.
    • JSON import: DBDashboardImportPage runs
      normalizeRawDashboardTileColors on the parsed JSON before the strict
      DashboardTemplateSchema.safeParse, so templates exported from a
      pre-rename deploy import cleanly.
    • Server-side GET response healing: getDashboards / getDashboard in
      packages/api/src/controllers/dashboard.ts rewrite legacy tile colors on
      the way out. Pre-rename Mongo docs are served on the wire as
      hue-named tokens so non-React HTTP clients (CI scripts, stale bundle
      tabs during a rolling deploy, the external API) can round-trip
      GET → PATCH without ever resurrecting chart-N through the strict
      schema.
    • Server-side write shim: the dashboards POST / PATCH routes mount
      a request-body preprocessor that rewrites legacy tile colors before
      validateRequest runs ChartPaletteTokenSchema. Catches non-React
      HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts,
      MCP, the upcoming external-API parity work) for a one-release
      deprecation window without weakening the schema's input/output equality.
      The dashboard provisioner task applies the same shim before parsing
      on-disk template files.
    • Render-time (belt-and-suspenders): DBNumberChart and
      ColorSwatchInput also call resolveChartPaletteToken for tiles
      constructed in memory between fetch and save (ChartEditor form
      state, unit-test fixtures, hand-rolled Tile literals).

    The migration preserves the HyperDX slot ordering from [HDX-1360] feat(app): number tile static color picker #2265 (slot 1 = brand
    green, slot 2 = blue, etc.).

    ClickStack legacy color caveat: Pre-rename ClickStack used a different slot
    ordering than HyperDX (--color-chart-1 was brand blue #437eef, not brand
    green). The migration map uses HyperDX slot ordering, so any ClickStack
    dashboard saved via [HDX-1360] feat(app): number tile static color picker #2265 with color: 'chart-1' will flip from blue to
    Observable green after migration. We chose this trade-off deliberately over
    branching the legacy map by active theme: LEGACY_CHART_PALETTE_TOKEN_MAP lives
    in common-utils (shared with the API), and migration is one-shot persisted on
    next save — theme-branching would couple common-utils to browser DOM state and
    still produce wrong results for users whose active theme changed since the
    original pick. Affected users can manually re-pick the desired hue via the (now
    hue-labeled) color picker.

    The categorical palette is based on Observable 10, with chart-blue swapped to
    #437eef to match the brand link color
    (--click-global-color-text-link-default); all other hues are straight from
    Observable 10. The palette resolves identically on both themes — picking
    chart-blue always renders the brand blue. Brand identity for charts moves
    entirely into the semantic layer: --color-chart-success and --color-chart-info
    resolve to categorical chart-green (#3ca951) and chart-blue (#437eef) on
    both HyperDX and ClickStack, so success fills, info-level logs, and the
    matching multi-series slots all read consistently across brands.

    Internally, JS (CATEGORICAL_HEX_BY_TOKEN in packages/app/src/utils.ts) is
    the source of truth for categorical hues — getColorFromCSSVariable and
    getColorFromCSSToken skip getComputedStyle for categorical tokens since the
    palette is unified across themes. The matching --color-chart-{hue} CSS vars in
    _tokens.scss remain as a stylesheet-author affordance (inline var() use,
    devtools inspection) and a hook for any future per-brand override. Semantic
    tokens still resolve through getComputedStyle because they genuinely vary per
    theme.

Patch Changes

  • 998ea5d: feat: Add option to fit time chart y-axis lower bound

  • ee90738: fix: Add sourceId to MCP Raw SQL Tile schema

  • 8261b46: fix: inline parametric aggregate function arguments instead of passing as query parameters

  • bf6e1f2: feat(charts): the time-chart series limit is now configured per chart in the Display Settings drawer instead of as a workspace-wide team setting (the team "Time Chart Series Limit" setting is removed). It is disabled by default — charts fetch every series and no __hdx_series_limit CTE is emitted — and is cleared back to disabled by emptying the field. The control only appears for builder line/bar charts; the limit and its Generated SQL preview now come from the chart's own config. When a limit is set, chunked time-chart queries keep a consistent top-N series set: previously each time-window chunk ranked its own top-N, so charts could render more series than the limit and adjacent windows disagreed; the ranking is now pinned to the newest chunk window for every chunk so the union across chunks equals the limit.

  • 677e3f7: fix: Skip rendering empty aggConditions

  • 89949b1: Adding filters to dashboard exports. Implemented validation on dashboard imports to catch potential issues with generated JSON or manually tweaked JSON.

  • 747352f: feat: add direct_read optimization for filters

  • 750b8af: feat(mcp): add denoise option to clickstack_search tool

    Add a denoise boolean parameter to the MCP clickstack_search tool that
    automatically filters out high-frequency repetitive event patterns from
    search results, mirroring the web app's "Denoise Results" feature.

    When enabled, the tool samples 10k random events, mines patterns using
    the Drain algorithm, identifies noisy patterns (>10% of sample), and
    filters them out of result rows. Returns filtered rows plus metadata
    listing removed patterns with estimated counts.

    Extracts shared denoise constants (DENOISE_SAMPLE_SIZE,
    DENOISE_NOISE_THRESHOLD) into @hyperdx/common-utils so the web app
    and MCP server use the same values.

  • caba7c2: fix: Nudge agents towards macros in raw SQL tiles

  • adac913: refactor(mcp): rename all MCP tool prefixes from hyperdx_ to clickstack_

    Rename the MCP server name from hyperdx to clickstack and update all 19
    tool names (e.g. hyperdx_searchclickstack_search), along with
    descriptions, prompts, error messages, and test references.

  • c74744a: fix: fallback to body or implicit column expression when other empty

  • 03f9dd7: feat: add an optional Section field to data sources

    Sources can now carry an optional free-text Section label, set from the source
    settings form. The value is persisted and returned by GET /api/v2/sources, so
    external API consumers can read it. This lays the groundwork for grouping and
    searching sources by section in the source selector.

  • 81e524c: feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector.

  • 55a255a: refactor(metrics): unify AttributesHash to variadic cityHash64 across Map and
    JSON metric schemas

    Sum / Gauge / Histogram metric queries now compute AttributesHash as
    cityHash64(ScopeAttributes, ResourceAttributes, Attributes) for both
    Map(LowCardinality(String), String) and JSON attribute columns. Previously
    the Map-schema path wrapped the three maps in mapConcat() before hashing,
    and the JSON-schema path used the variadic form; the schema-detection
    ClickHouse round-trip and the attrHashExpr helper / isJsonSchema
    plumbing are gone.

    Compatibility:

    • Per-row AttributesHash values change for every Map-schema metric row,
      but the hash is recomputed inside CTEs on every query — no materialized
      view, projection, ALIAS column, or cache persists it, so no downstream
      consumer is affected (audit: OSS only).
    • Cross-scope same-key behaviour shifts: two rows that carry the same
      logical key in different attribute scopes (e.g. host in
      ResourceAttributes for one emission and host in Attributes for the
      next) now hash distinctly and land in separate series. Previously the
      mapConcat path collapsed them into one series. This only matters when an
      OTel collector processor promotes attributes across scopes mid-stream;
      most SDKs emit attributes in stable scopes. The new behaviour is captured
      by an integration test in packages/api/src/clickhouse/__tests__.

    HDX-4466.

@hyperdx/hdx-eval@0.2.0

Minor Changes

  • 5bd1c68: feat: add AI eval framework for benchmarking MCP servers

    New @hyperdx/hdx-eval package for benchmarking AI agents against
    observability MCP servers. Generates deterministic synthetic telemetry
    with planted anomalies, spawns Claude Code as an SRE agent, records full
    trajectories, and grades answers using programmatic checks and an
    LLM-as-judge.

    Includes 5 scenarios (error-root-cause, latency-spike, noisy-signals,
    segmented-regression, service-health-check), MCP-agnostic N-way
    comparison, blinded judging, and a web viewer for browsing results.

Patch Changes

  • 6a80031: Support multi-model comparison in eval batches via comma-separated --model flag

@hyperdx/otel-collector@2.29.0

Patch Changes

  • a5dfce4: fix(otel-collector): only enable the prometheus remote-write exporter in
    standalone mode when CLICKHOUSE_PROMETHEUS_METRICS_ENDPOINT is set

    The standalone collector config used to unconditionally declare a
    prometheusremotewrite exporter and a metrics/promql pipeline. When
    CLICKHOUSE_PROMETHEUS_METRICS_ENDPOINT was unset the exporter rendered
    with an empty endpoint and every metrics batch failed to export.

    The exporter and pipeline have been moved to
    docker/otel-collector/config.standalone.promql.yaml, which is now only
    loaded by entrypoint.sh when CLICKHOUSE_PROMETHEUS_METRICS_ENDPOINT is
    non-empty. This mirrors the OpAMP-managed gating in
    packages/api/src/opamp/controllers/opampController.ts (which already
    only adds the exporter when IS_PROMQL_ENABLED is true).

    No action required if CLICKHOUSE_PROMETHEUS_METRICS_ENDPOINT is set; the
    behavior is unchanged. If it was unset, the collector now stops emitting
    the failing prometheus-remote-write attempts.

@vercel

vercel Bot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyperdx-oss Ready Ready Preview, Comment Jun 18, 2026 5:04am
hyperdx-storybook Ready Ready Preview, Comment Jun 18, 2026 5:04am

Request Review

@github-actions github-actions Bot force-pushed the changeset-release/main branch 2 times, most recently from 905736a to e55a29b Compare June 1, 2026 11:56
@github-actions github-actions Bot force-pushed the changeset-release/main branch from e55a29b to 3483c9b Compare June 1, 2026 12:57
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 3483c9b to 61212e6 Compare June 1, 2026 15:49
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 61212e6 to 8a6b93d Compare June 1, 2026 17:45
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 8a6b93d to dae12c6 Compare June 1, 2026 21:00
@github-actions github-actions Bot force-pushed the changeset-release/main branch from dae12c6 to c6c4bc4 Compare June 2, 2026 13:50
@github-actions github-actions Bot force-pushed the changeset-release/main branch from c6c4bc4 to 78ced46 Compare June 2, 2026 14:25
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 78ced46 to 47a828b Compare June 2, 2026 16:46
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 47a828b to d3f337e Compare June 2, 2026 18:06
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 5b2430f to 3174214 Compare June 4, 2026 12:24
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 3174214 to 96b87f1 Compare June 4, 2026 15:01
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 96b87f1 to 4c6a220 Compare June 4, 2026 15:12
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 4c6a220 to e45fa2f Compare June 4, 2026 17:38
@github-actions github-actions Bot force-pushed the changeset-release/main branch from e45fa2f to 904049f Compare June 4, 2026 18:21
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 904049f to eac40dc Compare June 4, 2026 19:16
@github-actions github-actions Bot force-pushed the changeset-release/main branch from eac40dc to 49af301 Compare June 4, 2026 20:30
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 49af301 to 6f70379 Compare June 4, 2026 21:56
@greptile-apps

greptile-apps Bot commented Jun 5, 2026

Copy link
Copy Markdown

Greptile Summary

This is an automated Changesets release PR bumping @hyperdx/api, @hyperdx/app, and @hyperdx/otel-collector to 2.29.0, @hyperdx/common-utils to 0.21.0, and @hyperdx/hdx-eval to 0.2.0. All 60 changeset files are consumed, CHANGELOGs are generated, package versions and .env image tags are updated.

  • API: unique MongoDB index on accessKey, new /api/v2/connections endpoints, number-tile color support in external dashboards API, MCP tool renames from hyperdx_ to clickstack_ prefix, and multiple MCP query-safety and alias-quoting fixes.
  • App: lazy-load dashboard tiles by viewport, Browser RUM dashboard template, inline trace panel split, service-map server-side filtering with latency percentiles, chart palette token rename (chart-1..10 → hue-named), and numerous UX fixes.
  • otel-collector: prometheus remote-write exporter is now only loaded when CLICKHOUSE_PROMETHEUS_METRICS_ENDPOINT is set.

Confidence Score: 5/5

Standard automated release PR — no code changes, only version bumps, CHANGELOG generation, and changeset file removal. Safe to merge.

All changes are generated by the Changesets action: package version increments, CHANGELOG entries, .env tag updates, and yarn.lock resolution updates. The underlying feature and fix commits were already merged and reviewed individually. No logic is touched here.

No files require special attention beyond the minor CHANGELOG tool-name inconsistency in packages/api/CHANGELOG.md.

Important Files Changed

Filename Overview
packages/api/CHANGELOG.md Adds 2.29.0 release notes; contains minor tool-name inconsistency where a19ba54 entry uses old hyperdx_ prefixes for MCP tools that are renamed to clickstack_ in the same release
packages/app/CHANGELOG.md Adds 2.29.0 release notes for the app package covering lazy-load, UI polish, service map improvements, and dashboard changes
packages/common-utils/CHANGELOG.md Adds 0.21.0 release notes covering chart palette token rename, metrics hash unification, and shared denoise constants
.env Bumps CODE_VERSION and IMAGE_VERSION_SUB_TAG from 2.28.0 to 2.29.0; no secrets present, file contains only docker-compose configuration defaults
packages/api/package.json Bumps package version to 2.29.0 and updates @hyperdx/common-utils dependency to ^0.21.0
yarn.lock Updates @hyperdx/common-utils version resolution from ^0.20.0 to ^0.21.0 across three workspace packages

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    CS[Changesets Action] -->|bumps versions| PKG[package.json files]
    CS -->|generates| CL[CHANGELOG.md files]
    CS -->|deletes| CF[.changeset/*.md files]
    CS -->|updates| ENV[.env CODE_VERSION]
    CS -->|updates| YL[yarn.lock]

    PKG --> API[api 2.28.0 → 2.29.0]
    PKG --> APP[app 2.28.0 → 2.29.0]
    PKG --> CU[common-utils 0.20.0 → 0.21.0]
    PKG --> EVAL[hdx-eval 0.1.0 → 0.2.0]
    PKG --> OTEL[otel-collector 2.28.0 → 2.29.0]

    API -->|depends on| CU
    APP -->|depends on| CU
    APP -->|depends on| API
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    CS[Changesets Action] -->|bumps versions| PKG[package.json files]
    CS -->|generates| CL[CHANGELOG.md files]
    CS -->|deletes| CF[.changeset/*.md files]
    CS -->|updates| ENV[.env CODE_VERSION]
    CS -->|updates| YL[yarn.lock]

    PKG --> API[api 2.28.0 → 2.29.0]
    PKG --> APP[app 2.28.0 → 2.29.0]
    PKG --> CU[common-utils 0.20.0 → 0.21.0]
    PKG --> EVAL[hdx-eval 0.1.0 → 0.2.0]
    PKG --> OTEL[otel-collector 2.28.0 → 2.29.0]

    API -->|depends on| CU
    APP -->|depends on| CU
    APP -->|depends on| API
Loading

Reviews (50): Last reviewed commit: "chore(release): bump HyperDX app/package..." | Re-trigger Greptile

Comment thread packages/api/CHANGELOG.md

### Minor Changes

- 9119de5f: Add unique MongoDB index on accessKey field in User model to eliminate full collection scans during API key authentication. This could cause startup failures if any existing users share duplicate accessKey values.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Missing pre-upgrade mitigation guidance for MongoDB unique index

The changelog correctly warns that adding a unique index on accessKey in the User model "could cause startup failures if any existing users share duplicate accessKey values," but it provides no remediation path. Operators upgrading a production instance with duplicate accessKey documents in MongoDB will experience a hard startup failure with no documented way to recover (e.g., no shell command to detect duplicates beforehand or deduplicate them). Consider adding a pre-upgrade check command — something like db.users.aggregate([{$group:{_id:"$accessKey",count:{$sum:1}}},{$match:{count:{$gt:1}}}]) — to the release notes or a migration guide so operators can verify their data before applying this version.

Fix in Claude Code Fix in Conductor Fix in Cursor Fix in Codex

wrn14897
wrn14897 previously approved these changes Jun 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor Author

🔴 Tier 4 — Critical

Touches auth, data models, config, tasks, OTel pipeline, ClickHouse, or CI/CD.

Why this tier:

  • Critical-path files (2):
    • packages/otel-collector/CHANGELOG.md
    • packages/otel-collector/package.json
  • Cross-layer change: touches frontend (packages/app) + backend (packages/api) + shared utils (packages/common-utils)

Review process: Deep review from a domain expert. Synchronous walkthrough may be required.
SLA: Schedule synchronous review within 2 business days.

Stats
  • Production files changed: 7
  • Production lines changed: 20
  • Branch: changeset-release/main
  • Author: github-actions[bot]

To override this classification, remove the review/tier-4 label and apply a different review/tier-* label. Manual overrides are preserved on subsequent pushes.

@github-actions

Copy link
Copy Markdown
Contributor Author

E2E Test Results

All tests passed • 198 passed • 3 skipped • 1368s

Status Count
✅ Passed 198
❌ Failed 0
⚠️ Flaky 6
⏭️ Skipped 3

Tests ran across 4 shards in parallel.

View full report →

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review/tier-4 Critical — deep review + domain expert sign-off

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant