feat(replay): allow group properties in vision scanner filters#73019
Conversation
The scanner setup "Recording filters" step hand-rolled its own taxonomic group list and omitted group properties, even though the main recordings playlist filters and the scanner's own Run tab include them. There's no technical limitation: the RecordingsQuery filters support group properties everywhere else. Append the project's group taxonomic types from groupsModel so group analytics users can scope scanners by group property, matching the recordings list behavior. Generated-By: PostHog Code Task-Id: 21724131-2427-44b9-ba49-6817c4b98cdd
|
😎 This pull request was merged. |
🦔 Hogbox preview · ✅ ready▶ Open the preview
commit |
There was a problem hiding this comment.
Trivial, single-file consumer-side change adding group properties to an existing taxonomic filter list, matching the description; no risky territory and author is on the owning team.
- Author wrote 0% of the modified lines and has 28 merged PRs in these paths (familiarity MODERATE).
- 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
| Gate | Result | |
|---|---|---|
| prerequisites | ✓ | all clear |
| deny-list | ✓ | no deny categories matched |
| size | ✓ | 12L, 1F substantive — within ceiling |
| tier | ✓ | T1-agent / T1a-trivial (12L, 1F, single-area, feat) |
| stamphog 2.0.0b3 | .stamphog/policy.yml @ 56a5e6e · reviewed head f51a339 |
🤖 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 | no change | ████████░░ 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 — 🔺 +510 B (+0.0%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1357.18 MiB · 🔺 +510 B (+0.0%)
Problem
Group analytics users (and folks scanning their book of business) can't filter Replay Vision scanners by group properties. The scanner setup "Recording filters" step is the one place in the app where you set up which sessions a scanner watches, but its Taxonomic filter didn't offer group properties as a filter category.
There's no technical reason for this. The scanner query is a
RecordingsQuery, the same type the main recordings playlist filters produce, and group properties are valid filters there. The scanner's own "Run" tab (which reuses the shared recordings filter component) already surfaces them. The setup step just hand-rolled its own taxonomic group list and left group properties out.Raised in this Slack thread.
Changes
ScannerTriggers.tsxnow appends the project's group taxonomic types (fromgroupsModel) to the Taxonomic filter's group list, so each configured group type shows up as a filterable category. This mirrors how the recordings list builds its filter taxonomy.Everything else in the list stays as-is. Group properties are appended after the existing categories, so nothing in the top positions moves.
How did you test this code?
I (Claude, via the PostHog Slack app) ran the frontend typecheck (
pnpm --filter=@posthog/frontend typescript:check) and lint/format fix — both clean. I did not run the app manually or add automated tests; this is a small consumer-side config change (which group types the existing filter component is told to render).🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Investigated a Slack request asking whether there was any technical limitation preventing Replay Vision scanners from filtering on group properties. Confirmed there isn't: the setup step's
SCANNER_FILTER_TYPESarray simply omitted group properties, diverging from the main recordings playlist filters and the scanner's own Run tab (both of which spreadgroupsTaxonomicTypesfromgroupsModel). Fix mirrors that existing pattern rather than introducing anything new.Invoked the
/modifying-taxonomic-filterskill. This is a consumer call-site change (whichtaxonomicGroupTypesare passed in), not a change to the TaxonomicFilter component, its ordering, promotion, or enum, so no cross-variant mirroring was required.Created with PostHog from a Slack thread