Skip to content

fix(replay-vision): apply scanner conditions to on-demand recordings browser#73015

Draft
fivestarspicy wants to merge 1 commit into
masterfrom
posthog-code/vision-scan-recordings-apply-filter
Draft

fix(replay-vision): apply scanner conditions to on-demand recordings browser#73015
fivestarspicy wants to merge 1 commit into
masterfrom
posthog-code/vision-scan-recordings-apply-filter

Conversation

@fivestarspicy

Copy link
Copy Markdown
Contributor

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

ScanFromRecordings mounted sessionRecordingsPlaylistLogic without a filters prop, 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:

  • recordingsQueryToUniversalFilters accepts RecordingsQuery | null | undefined and returns only the condition dimensions, which is why the fix overlays it onto getDefaultFilters() rather than passing it raw (the logic uses props.filters verbatim, with no merge against defaults).
  • The scanner detail scene guards rendering until scanner is loaded, so scanner.query is available when this component mounts.
  • Import ordering matches the oxfmt convention already used in 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

  • Publish to changelog?
  • Alert Sales and Marketing teams?

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 sessionRecordingsPlaylistLogic seeds its initial filters.

I first considered passing recordingsQueryToUniversalFilters(scanner.query) straight in as props.filters, but that helper drops date_from/date_to/order, and the logic uses props.filters without merging defaults — so the raw version would have left the preview with no date range or sort. Overlaying the conversion onto getDefaultFilters() keeps a sane recent-recordings window while applying the scanner's conditions.


Created with PostHog from a Slack thread

…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
@trunk-io

trunk-io Bot commented Jul 22, 2026

Copy link
Copy Markdown

Merging to master in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

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

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Bundle size — 🔺 +86 B (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 64.66 MiB · 🔺 +86 B (+0.0%)

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

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%)

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants