fix(replay-vision): apply scanner conditions to on-demand recordings browser#73015
fix(replay-vision): apply scanner conditions to on-demand recordings browser#73015fivestarspicy wants to merge 1 commit into
Conversation
…browser The On-demand tab's "Pick from your recordings" browser mounted sessionRecordingsPlaylistLogic with no filters prop, so it always showed the latest recordings instead of the ones matching the scanner's scan conditions. Seed the browser's initial filters from the scanner's query, overlaying the condition dimensions (events/actions/properties/duration/test accounts) onto the default recent-recordings date range and sort order. Users can still widen or clear the filters. Generated-By: PostHog Code Task-Id: a2547295-f969-4fe6-b1bb-421427f6dd1a
|
Merging to
After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here |
🤖 CI report
|
| Root | Eager (shipped) | Δ vs base | Budget |
|---|---|---|---|
entry (logged-out pages, app bootstrap)src/index.tsx |
1.24 MiB · 22 files | no change | ███░░░░░░░ 27.5% of 4.51 MiB |
authenticated shell (every logged-in page)src/scenes/AuthenticatedShell.tsx |
8.21 MiB · 3,000 files | 🔺 +9 B (+0.0%) | ████████░░ 84.5% of 9.71 MiB |
🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
Largest files eagerly shipped from src/index.tsx
| Size | File |
|---|---|
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 24.6 KiB | ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js |
| 6.3 KiB | ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js |
| 4.5 KiB | ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js |
| 3.9 KiB | ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js |
| 1.4 KiB | ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js |
| 1.3 KiB | src/RootErrorBoundary.tsx |
| 912 B | ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js |
| 789 B | src/scenes/ChunkLoadErrorBoundary.tsx |
| 762 B | src/index.tsx |
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
| Size | File |
|---|---|
| 281.3 KiB | ../node_modules/.pnpm/posthog-js@1.406.2/node_modules/posthog-js/dist/rrweb.js |
| 267.7 KiB | ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js |
| 236.0 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 224.7 KiB | ../node_modules/.pnpm/posthog-js@1.406.2/node_modules/posthog-js/dist/module.js |
| 167.1 KiB | src/queries/validators.js |
| 154.3 KiB | ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js |
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 105.8 KiB | src/lib/api.ts |
| 94.0 KiB | ../packages/quill/packages/quill/dist/index.js |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479
✅ Toolbar bundle — eager 2.18 MiB within budget
What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.
| Metric | Size | Δ vs base | Budget |
|---|---|---|---|
| Eager (shipped) entry + static imports |
2.18 MiB · 17 files | no change | ████░░░░░░ 38.1% of 5.72 MiB |
| Deferred (lazy) | 2.07 MiB · 33 files | no change | n/a — loads on demand |
Loader dist/toolbar.js |
1.1 KiB | no change | █░░░░░░░░░ 5.8% of 19.5 KiB |
Largest eagerly-shipped chunks
| Size | File |
|---|---|
| 713.8 KiB | dist/toolbar/toolbar-app-HY7HJI4V.css |
| 543.6 KiB | dist/toolbar/chunk-chunk-UG3THN3N.js |
| 484.2 KiB | dist/toolbar/chunk-chunk-QS5AHYGW.js |
| 133.6 KiB | dist/toolbar/chunk-chunk-MCXISDMN.js |
| 131.8 KiB | dist/toolbar/chunk-chunk-T5KY5WYR.js |
| 71.0 KiB | dist/toolbar/toolbar-app-UDDFB6JG.js |
| 69.0 KiB | dist/toolbar/chunk-chunk-27JL52RE.js |
| 35.6 KiB | dist/toolbar/chunk-chunk-XVKSNBZ7.js |
| 20.9 KiB | dist/toolbar/chunk-chunk-CS7W2KTV.js |
| 12.2 KiB | dist/toolbar/chunk-chunk-PIK3PADE.js |
Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile
✅ Dist folder size — 🔺 +1.1 KiB (+0.0%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1357.18 MiB · 🔺 +1.1 KiB (+0.0%)
Problem
When you create a Replay Vision scanner and open its On-demand tab to "scan recent recordings", the "Pick from your recordings" browser ignored the scan conditions you set on the scanner. It just showed the latest recordings, so the preview didn't reflect the sessions the scanner will actually run against.
Changes
ScanFromRecordingsmountedsessionRecordingsPlaylistLogicwithout afiltersprop, so the logic fell back to its default (recent recordings, empty filter group).Now it seeds the browser's initial filters from the scanner's own
query. Only the condition dimensions (events, actions, properties, duration, test accounts) live on the scanner query, so those are overlaid onto the default recent-recordings date range and sort order. That gives you "recent recordings matching this scanner's conditions" rather than "all recent recordings". The filter bar stays editable, so you can still widen or clear it.Note: the playlist logic persists filters per scanner, so this seeds the first time you open the tab for a scanner. After you manually change the filters, your choice sticks.
How did you test this code?
I (the PostHog Slack app agent) did not run the app or the frontend typecheck — this environment has no installed
node_modules. I verified statically that:recordingsQueryToUniversalFiltersacceptsRecordingsQuery | null | undefinedand returns only the condition dimensions, which is why the fix overlays it ontogetDefaultFilters()rather than passing it raw (the logic usesprops.filtersverbatim, with no merge against defaults).scanneris loaded, soscanner.queryis available when this component mounts.ScannerTriggers.tsx.Worth a manual pass by the team: open a scanner's On-demand tab and confirm the browser is pre-filtered to the scanner's conditions.
Automatic notifications
Docs update
🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Driven by Cory Slater from a Slack thread while dogfooding Replay Vision scanners for Error Tracking. Authored by the PostHog Slack app agent (Claude). No repo skills were required for this change; I used the Explore agent to locate the On-demand tab wiring, then traced how
sessionRecordingsPlaylistLogicseeds its initial filters.I first considered passing
recordingsQueryToUniversalFilters(scanner.query)straight in asprops.filters, but that helper dropsdate_from/date_to/order, and the logic usesprops.filterswithout merging defaults — so the raw version would have left the preview with no date range or sort. Overlaying the conversion ontogetDefaultFilters()keeps a sane recent-recordings window while applying the scanner's conditions.Created with PostHog from a Slack thread