Skip to content

Telemetry: Add sidebar filter telemetry for change detection#34533

Merged
valentinpalkovic merged 12 commits into
nextfrom
worktree-cuddly-dazzling-hopcroft
Apr 29, 2026
Merged

Telemetry: Add sidebar filter telemetry for change detection#34533
valentinpalkovic merged 12 commits into
nextfrom
worktree-cuddly-dazzling-hopcroft

Conversation

@valentinpalkovic
Copy link
Copy Markdown
Contributor

@valentinpalkovic valentinpalkovic commented Apr 13, 2026

Closes #

What I did

Added a sidebar-filter telemetry event to track usage of built-in tag filters (_docs, _play, _test) and change detection status filters (new, modified, affected) in the sidebar.

The event fires in two scenarios:

  • Interaction: when a user toggles a filter in the sidebar UI (action: include / exclude / remove)
  • URL: when a user visits Storybook with filters pre-set via URL params (shared links/bookmarks)

Each event includes the full active filter state and per-filter story counts. User-defined tag filters are explicitly excluded from telemetry.

Telemetry emission is owned by the manager-api stories module — FilterPanel.tsx only calls the public API, and the API emits the canonical post-mutation payload. A single emitFilterTelemetry(trigger, changed?) helper services both the URL-init path and the interaction path. addFilters / removeFilters use a FILTER_KEYS const map so tag and status share one code path.

Checklist for Contributors

Testing

The changes in this PR are covered in the following automated tests:

  • stories
  • unit tests
  • integration tests
  • end-to-end tests

Unit tests cover:

  • code/core/src/shared/status-store/index.test.tscountStatusesByValue aggregation behaviour
  • code/core/src/core-server/server-channel/telemetry-channel.test.tsSIDEBAR_FILTER_CHANGED channel listener forwards to telemetry('sidebar-filter', payload)

Manual testing

Caution

This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!

Already verified end-to-end

Tested live in the internal Storybook UI (yarn storybook:ui) with STORYBOOK_TELEMETRY_DEBUG=1 and disableTelemetry: false, observing the actual telemetry payloads emitted from the server channel:

Scenario Verified payload
Toggle Documentation ON via checkbox trigger: "interaction", changed.action: "include", _docs in activeTagFilters.included, storyCounts._docs: 60
Toggle Documentation OFF via checkbox changed.action: "remove", no _docs in active filters, _docs not in storyCounts
Click exclude (X) on Documentation changed.action: "exclude", _docs in activeTagFilters.excluded
Toggle New status filter ON changed.filterType: "status", changed.filterId: "status-value:new", changed.action: "include"
Fresh load with ?tags=$play trigger: "url", _play in activeTagFilters.included, storyCounts._play: 339
Toggle a user-defined tag (e.g. vitest) No telemetry event emitted (filtered out before emit)

Reproduction steps

  1. Enable change detection in code/.storybook/main.ts: features: { changeDetection: true } (already set in this branch)
  2. Set disableTelemetry: false in code/.storybook/main.ts and run with STORYBOOK_TELEMETRY_DEBUG=1 yarn storybook:ui
  3. Open http://localhost:6006, open the Tag filters dialog from the sidebar search
  4. Toggle a built-in tag (e.g. Documentation) → terminal logs [telemetry] block with eventType: "sidebar-filter" and trigger: "interaction"
  5. Click the exclude (X) button next to it → another event with action: "exclude"
  6. Toggle a status filter (e.g. New) → event with filterType: "status"
  7. Toggle a user-defined tag → no event emitted
  8. Open a fresh tab at http://localhost:6006/?tags=$play&path=/story/<any> → URL-triggered event fires once with trigger: "url"

Documentation

  • Add or update documentation reflecting your changes
  • If you are deprecating/removing a feature, make sure to update MIGRATION.MD

Checklist for Maintainers

  • When this PR is ready for testing, make sure to add ci:normal, ci:merged or ci:daily GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found in code/lib/cli-storybook/src/sandbox-templates.ts

  • Make sure this PR contains one of the labels below:

    Available labels
    • bug: Internal changes that fixes incorrect behavior.
    • maintenance: User-facing maintenance tasks.
    • dependencies: Upgrading (sometimes downgrading) dependencies.
    • build: Internal-facing build tooling & test updates. Will not show up in release changelog.
    • cleanup: Minor cleanup style change. Will not show up in release changelog.
    • documentation: Documentation only changes. Will not show up in release changelog.
    • feature request: Introducing a new feature.
    • BREAKING CHANGE: Changes that break compatibility in some way with current major version.
    • other: Changes that don't fit in the above categories.

🦋 Canary release

This PR does not have a canary release associated. You can request a canary release of this pull request by mentioning the @storybookjs/core team here.

core team members can create a canary release here or locally with gh workflow run --repo storybookjs/storybook publish.yml --field pr=<PR_NUMBER>

Summary by CodeRabbit

  • New Features

    • Telemetry for sidebar filter actions and URL-triggered filter state, emitting a "sidebar-filter" event and a global sidebar-filter-changed event.
  • Bug Fixes

    • Avoided false story-selection failures in mobile when sidebar links are hidden.
  • Improvements

    • Consolidated sidebar filter update logic and added shared status-counting helpers; added utilities to compute telemetry payloads for projected filter changes.
  • Tests

    • Added tests for status-counting, telemetry payloads, and telemetry channel handling.

valentinpalkovic and others added 3 commits April 13, 2026 13:19
In mobile mode, clicking a story calls setMobileMenuOpen(false), which
starts a 300ms exit transition on the Modal. After it completes, children
are unmounted (unmountOnExit: true). On slow sandboxes like Angular webpack,
by the time waitForURL resolves the tree is already unmounted, so the
storyLink locator finds nothing and toHaveAttribute fails with
"element(s) not found". URL verification already confirms correct
navigation, so we safely skip the attribute check when the element is gone.

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

Adds a new channel event emitted when users toggle tag/status filters in the
sidebar (interaction) or load Storybook with filters pre-set via URL params (url).
The telemetry channel forwards the payload to the sidebar-filter event type.

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

- stories.ts: extract addFilters/removeFilters helpers to deduplicate the
  identical set-manipulation logic in addTagFilters, addStatusFilters,
  removeTagFilters, and removeStatusFilters
- FilterPanel.tsx: collapse the duplicated just-changed filter lookup in
  emitFilterTelemetry into a single ternary + shared assignment

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 13, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a new core event SIDEBAR_FILTER_CHANGED and telemetry event 'sidebar-filter'; emits it both on URL-derived init and on user sidebar interactions, wires server telemetry channel to forward the payload, introduces status-count helpers and shared filter add/remove logic, and adds tests and a globals export.

Changes

Cohort / File(s) Summary
Core events & globals
code/core/src/core-events/index.ts, code/core/src/manager/globals/exports.ts, code/core/src/telemetry/types.ts
Added and exported SIDEBAR_FILTER_CHANGED; added 'sidebar-filter' to telemetry EventType; exposed new core event in global exports.
Telemetry channel & tests
code/core/src/core-server/server-channel/telemetry-channel.ts, code/core/src/core-server/server-channel/telemetry-channel.test.ts
Telemetry channel listens for SIDEBAR_FILTER_CHANGED and forwards payload as 'sidebar-filter'; tests added/mocked to verify listener registration and forwarding.
Manager API init & refactor
code/core/src/manager-api/modules/stories.ts
Refactored tag/status add/remove into shared helpers; on init after fetchIndex() emits SIDEBAR_FILTER_CHANGED when URL-derived built-in filters exist, including computed per-filter story counts.
Sidebar UI, utils & tests
code/core/src/manager/components/sidebar/FilterPanel.tsx, code/core/src/manager/components/sidebar/FilterPanel.utils.ts, code/core/src/manager/components/sidebar/FilterPanel.utils.test.ts
Emit SIDEBAR_FILTER_CHANGED for built-in tag/status interactions; added computeFilterTelemetryPayload and FilterTelemetryChanged type; added tests validating payloads for include/exclude/remove actions.
Status store & tests
code/core/src/shared/status-store/index.ts, code/core/src/shared/status-store/index.test.ts
Added countStatusesByValue(allStatuses) and fullStatusStore.countByValue() with unit tests covering counts and empty-store behavior.
Filter data hook
code/core/src/manager/components/sidebar/useFilterData.tsx
Switched status-count aggregation to use countStatusesByValue.
E2E helper
code/e2e-tests/util.ts
Made post-navigation assertion robust to mobile by checking sidebar link visibility before asserting data-selected.

Sequence Diagram

sequenceDiagram
    participant User
    participant FilterPanel
    participant StoriesModule
    participant TelemetryChannel
    participant Telemetry

    rect rgba(100, 150, 200, 0.5)
    Note over StoriesModule,Telemetry: URL-based initialization flow
    StoriesModule->>StoriesModule: init() completes fetchIndex()
    StoriesModule->>StoriesModule: detect built-in URL filters & compute storyCounts
    StoriesModule->>TelemetryChannel: emit(SIDEBAR_FILTER_CHANGED, {trigger: "url", ...})
    TelemetryChannel->>Telemetry: emit('sidebar-filter', payload)
    end

    rect rgba(150, 200, 100, 0.5)
    Note over User,Telemetry: User-driven filter interaction
    User->>FilterPanel: click checkbox / invert
    FilterPanel->>FilterPanel: computeFilterTelemetryPayload(...)
    FilterPanel->>TelemetryChannel: emit(SIDEBAR_FILTER_CHANGED, {trigger: "interaction", changed, ...})
    TelemetryChannel->>Telemetry: emit('sidebar-filter', payload)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
code/core/src/core-server/server-channel/telemetry-channel.test.ts (1)

7-11: Consider using spy: true option for mocks.

Per coding guidelines, Vitest mocks should use the spy: true option. While the current mock implementation works correctly, aligning with the project's mocking conventions would improve consistency.

♻️ Suggested refactor
-vi.mock('storybook/internal/telemetry', () => ({
-  telemetry: vi.fn(),
-  getLastEvents: vi.fn().mockResolvedValue({}),
-  getSessionId: vi.fn().mockResolvedValue('test-session-id'),
-}));
+vi.mock('storybook/internal/telemetry', { spy: true });

Then set up mock implementations in a beforeEach block:

beforeEach(() => {
  vi.mocked(telemetry).mockImplementation(vi.fn());
  vi.mocked(getLastEvents).mockResolvedValue({});
  vi.mocked(getSessionId).mockResolvedValue('test-session-id');
});

As per coding guidelines: "Use vi.mock() with the spy: true option for all package and file mocks in Vitest tests" and "Implement mock behaviors in beforeEach blocks in Vitest tests".

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

In `@code/core/src/core-server/server-channel/telemetry-channel.test.ts` around
lines 7 - 11, Update the Vitest mocks to use the spy option and move mock
behavior setup into a beforeEach: change the top-level
vi.mock('storybook/internal/telemetry', ...) call to
vi.mock('storybook/internal/telemetry', () => ({ telemetry: vi.fn(),
getLastEvents: vi.fn(), getSessionId: vi.fn() }), { spy: true }), then in the
test file add a beforeEach that uses
vi.mocked(telemetry).mockImplementation(vi.fn()),
vi.mocked(getLastEvents).mockResolvedValue({}), and
vi.mocked(getSessionId).mockResolvedValue('test-session-id') so the mocked
behavior is configured per-test; reference the telemetry, getLastEvents, and
getSessionId symbols when applying these changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@code/core/src/core-server/server-channel/telemetry-channel.test.ts`:
- Around line 7-11: Update the Vitest mocks to use the spy option and move mock
behavior setup into a beforeEach: change the top-level
vi.mock('storybook/internal/telemetry', ...) call to
vi.mock('storybook/internal/telemetry', () => ({ telemetry: vi.fn(),
getLastEvents: vi.fn(), getSessionId: vi.fn() }), { spy: true }), then in the
test file add a beforeEach that uses
vi.mocked(telemetry).mockImplementation(vi.fn()),
vi.mocked(getLastEvents).mockResolvedValue({}), and
vi.mocked(getSessionId).mockResolvedValue('test-session-id') so the mocked
behavior is configured per-test; reference the telemetry, getLastEvents, and
getSessionId symbols when applying these changes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 69ff6dd0-f974-451b-a522-cd49e80193e0

📥 Commits

Reviewing files that changed from the base of the PR and between 0521e2d and 3da50fc.

📒 Files selected for processing (8)
  • code/core/src/core-events/index.ts
  • code/core/src/core-server/server-channel/telemetry-channel.test.ts
  • code/core/src/core-server/server-channel/telemetry-channel.ts
  • code/core/src/manager-api/modules/stories.ts
  • code/core/src/manager/components/sidebar/FilterPanel.tsx
  • code/core/src/manager/globals/exports.ts
  • code/core/src/telemetry/types.ts
  • code/e2e-tests/util.ts

@nx-cloud
Copy link
Copy Markdown

nx-cloud Bot commented Apr 13, 2026

View your CI Pipeline Execution ↗ for commit ab03ec5

Command Status Duration Result
nx run-many -t compile,check,knip,test,lint,fmt... ✅ Succeeded 8m 46s View ↗

☁️ Nx Cloud last updated this comment at 2026-04-13 14:43:13 UTC

…ounting loops

Add a canonical countStatusesByValue(allStatuses) helper to the shared
status-store module, expose it as fullStatusStore.countByValue(), and
replace the three independent status-counting loops in useStatusFilterEntries,
stories.ts telemetry init, and FilterPanel.utils.ts with calls to this
single implementation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@code/core/src/manager-api/modules/stories.ts`:
- Around line 1272-1277: The loop over targetStatuses should emit a count of 0
for active status filters that have no matches; update the logic in the block
that reads targetStatuses, statusCounts (from fullStatusStore.countByValue())
and storyCounts so that for each statusValue you assign storyCounts[statusValue]
= statusCounts[statusValue] ?? 0 (or equivalent check for undefined) instead of
skipping when undefined, ensuring every active filter in targetStatuses is
present in storyCounts.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b9f4282f-0b7e-4d74-b0c4-69cdd7bfbf73

📥 Commits

Reviewing files that changed from the base of the PR and between 3da50fc and b0350cf.

📒 Files selected for processing (5)
  • code/core/src/manager-api/modules/stories.ts
  • code/core/src/manager/components/sidebar/FilterPanel.utils.ts
  • code/core/src/manager/components/sidebar/useFilterData.tsx
  • code/core/src/shared/status-store/index.test.ts
  • code/core/src/shared/status-store/index.ts
✅ Files skipped from review due to trivial changes (1)
  • code/core/src/manager/components/sidebar/FilterPanel.utils.ts

Comment thread code/core/src/manager-api/modules/stories.ts Outdated
valentinpalkovic and others added 2 commits April 13, 2026 16:32
…lemetry

Extract computeFilterTelemetryPayload() as a pure helper that applies
the pending action to the current filter arrays before emitting, so the
SIDEBAR_FILTER_CHANGED payload always reflects the state after the
toggle rather than the stale pre-change React state.

Also removes the partial workaround that only fixed storyCounts but left
activeTagFilters/activeStatusFilters stale, and drops the unnecessary
async keyword from the telemetry-channel handler.

Adds 19 unit tests covering all action/filterType combinations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@code/core/src/core-server/server-channel/telemetry-channel.test.ts`:
- Around line 7-16: The mock of 'storybook/internal/telemetry' should use
Vitest's spy-based mocking and move behavior setup into beforeEach: change
vi.mock(...) to include the { spy: true } option, remove inline mock
implementations for telemetry, getLastEvents, getSessionId,
isTelemetryModuleEnabled, and setTelemetryEnabled, and in beforeEach import the
module with await import('storybook/internal/telemetry') then wrap it with
vi.mocked(..., true) and assign mock implementations there (e.g.,
mocked.getLastEvents.mockResolvedValue({}),
mocked.getSessionId.mockResolvedValue('test-session-id'),
mocked.isTelemetryModuleEnabled.mockReturnValue(true), mocked.telemetry =
vi.fn(), mocked.setTelemetryEnabled = vi.fn()) so tests use spy-mocks and follow
repository conventions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 02afdf30-4b4e-4a77-b23a-821f6479414e

📥 Commits

Reviewing files that changed from the base of the PR and between ab03ec5 and 8a8dc87.

📒 Files selected for processing (4)
  • code/core/src/core-server/server-channel/telemetry-channel.test.ts
  • code/core/src/core-server/server-channel/telemetry-channel.ts
  • code/core/src/manager/components/sidebar/useFilterData.tsx
  • code/core/src/telemetry/types.ts
✅ Files skipped from review due to trivial changes (1)
  • code/core/src/telemetry/types.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • code/core/src/manager/components/sidebar/useFilterData.tsx

Comment thread code/core/src/core-server/server-channel/telemetry-channel.test.ts
…and remount

- FilterPanel reads post-commit state via api.getState() and awaits filter
  mutations before emitting, so successive rapid toggles report the true
  active filter set instead of the previous render's stale props.
- URL telemetry in stories.ts is guarded by a module-level flag so manager
  remounts/HMR don't re-fire the event for the same page load.
- URL telemetry omits status filters when features.changeDetection is off,
  matching the sidebar gating in useFilterData.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
code/core/src/manager-api/modules/stories.ts (1)

1287-1291: ⚠️ Potential issue | 🟠 Major

Keep active status filters in storyCounts even when they match nothing.

If an active URL status filter has zero matches, countByValue() can omit that key and this loop drops the filter from the payload entirely. Emit 0 instead so every active status filter is represented consistently.

Suggested fix
         const statusCounts = fullStatusStore.countByValue();
         for (const statusValue of targetStatuses) {
-          if (statusCounts[statusValue] !== undefined) {
-            storyCounts[statusValue] = statusCounts[statusValue];
-          }
+          storyCounts[statusValue] = statusCounts[statusValue] ?? 0;
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@code/core/src/manager-api/modules/stories.ts` around lines 1287 - 1291, The
loop that builds storyCounts uses fullStatusStore.countByValue() (statusCounts)
and currently skips keys not present, causing active filters in targetStatuses
to be omitted when zero; update the loop over targetStatuses so that for each
statusValue you set storyCounts[statusValue] = statusCounts[statusValue] ?? 0
(or otherwise assign 0 when statusCounts has no entry) to guarantee every active
status filter from targetStatuses appears in storyCounts even if there are zero
matches.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@code/core/src/manager-api/modules/stories.ts`:
- Around line 1264-1273: The telemetry currently counts built-in tag defaults as
URL-triggered because initialIncluded/initialExcluded fall back to defaultTags
when tags is absent; change detection should only mark filters as trigger: 'url'
when the corresponding query param actually exists. Update the logic around
initialIncluded/initialExcluded and
includedStatusesForTelemetry/excludedStatusesForTelemetry to check the presence
of the query params (e.g. a truthy tags variable for tags and the statuses query
param for statuses) before using them for telemetry; keep using
changeDetectionEnabled but gate
includedStatusesForTelemetry/excludedStatusesForTelemetry and the builtIn tag
detection on the actual query-param presence so defaults from defaultTags or
presets are not counted as URL-driven filters.

---

Duplicate comments:
In `@code/core/src/manager-api/modules/stories.ts`:
- Around line 1287-1291: The loop that builds storyCounts uses
fullStatusStore.countByValue() (statusCounts) and currently skips keys not
present, causing active filters in targetStatuses to be omitted when zero;
update the loop over targetStatuses so that for each statusValue you set
storyCounts[statusValue] = statusCounts[statusValue] ?? 0 (or otherwise assign 0
when statusCounts has no entry) to guarantee every active status filter from
targetStatuses appears in storyCounts even if there are zero matches.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7fd35daf-6275-41db-b1b7-f3c69bd09eaf

📥 Commits

Reviewing files that changed from the base of the PR and between 8a8dc87 and 85e2890.

📒 Files selected for processing (2)
  • code/core/src/manager-api/modules/stories.ts
  • code/core/src/manager/components/sidebar/FilterPanel.tsx

Comment thread code/core/src/manager-api/modules/stories.ts Outdated
valentinpalkovic and others added 2 commits April 28, 2026 13:25
Move SIDEBAR_FILTER_CHANGED emission out of FilterPanel.tsx and into
the manager-api stories module so the API owns the post-mutation
state. Drop the projection helper, the 220-line FilterPanel utility
test, and the standalone countByValue store method. Collapse the
addFilters/removeFilters key plumbing into a FILTER_KEYS map.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
emitFilterTelemetry crashed in stories.test.ts when state.includedTagFilters
was undefined; restore the `?? []` defensive read present in the previous
FilterPanel-side implementation.

Also tighten the mobile data-selected check in the e2e helper: isVisible()
could pass before the drawer unmounted, leaving toHaveAttribute to fail on
a missing element. Switch to a short-timeout assertion wrapped in try/catch
so navigation success (already confirmed via waitForURL) is the source of
truth on mobile.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread code/core/src/manager/components/sidebar/FilterPanel.utils.ts Outdated
Comment thread code/core/src/manager-api/modules/stories.ts Outdated
Comment thread code/core/src/manager-api/modules/stories.ts Outdated
@valentinpalkovic
Copy link
Copy Markdown
Contributor Author

@copilot Fix requested comments

…port and extract BUILT_IN_TAG_IDS constant

Agent-Logs-Url: https://github.com/storybookjs/storybook/sessions/43a8888e-777f-4c0c-b3b3-c92ff976c9b1

Co-authored-by: valentinpalkovic <5889929+valentinpalkovic@users.noreply.github.com>
@storybook-app-bot
Copy link
Copy Markdown

Package Benchmarks

Commit: 049ad28, ran on 29 April 2026 at 11:15:07 UTC

The following packages have significant changes to their size or dependencies:

@storybook/cli

Before After Difference
Dependency count 184 184 0
Self size 782 KB 782 KB 0 B
Dependency size 68.20 MB 68.22 MB 🚨 +18 KB 🚨
Bundle Size Analyzer Link Link

@storybook/codemod

Before After Difference
Dependency count 177 177 0
Self size 32 KB 32 KB 0 B
Dependency size 66.73 MB 66.74 MB 🚨 +18 KB 🚨
Bundle Size Analyzer Link Link

@valentinpalkovic valentinpalkovic merged commit d561c88 into next Apr 29, 2026
122 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants