Repository navigation
feat(flags): deliver flag calls to destinations on flag_evaluations_mode 2 - #113654
Conversation
…ode 2 On FLAG_EVALUATIONS_ONLY, the flag-evaluations fork sends each forked $feature_flag_called to a new realtime_only_events output when INGESTION_OUTPUT_REALTIME_ONLY_EVENTS_TOPIC is set. ClickHouse does not read that topic, so the call stays out of the events table while the CDP consumers can still deliver it. With the topic unset, the fork removes the call from emission. CdpEventsConsumer takes its topic and group from CDP_EVENTS_CONSUMER_TOPIC and CDP_EVENTS_CONSUMER_GROUP_ID, so a second deployment can read the new topic. The hogflow subscription matcher reads it when CDP_HOGFLOW_SUBSCRIPTION_MATCHER_REALTIME_ONLY_EVENTS_TOPIC is set. Claude-Session: https://claude.ai/code/session_01EvZDsoSPrQzLQit6kYQydV
|
😎 Merged successfully - details. |
🤖 CI report🚨 Trunk lane — universal laneThis PR is assigned to the universal lane. It cannot merge in parallel with other PRs, so it can take longer to merge. Ask dev-ex if you think this is wrong.
|
| Function | Location | Complexity | Limit |
|---|---|---|---|
renderWorkflowLogMessage |
products/workflows/frontend/Workflows/logs/log-utils.tsx:23 |
13 | 10 |
✅ Duplication (Python) — clean
New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.
✅ Duplication (TypeScript) — clean
New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.
🚨 Comment density — 8% of added code lines are comments (21 of 271)
This section warns when comments are more than 3% of the code lines a PR adds, and alerts above 6%. Before agent-assisted PRs, the typical share was about 2%. Only full-line comments count. Docstrings, generated files, snapshots, migrations, and workflow files are left out.
Comments that restate the code, record how the change came about, or narrate the next line add noise for the next reader. Keep the comments that explain a reason the code cannot show, and remove the rest. See .agents/skills/writing-code-comments/SKILL.md for the house rules.
Files with the most added comment lines:
| File | Comment lines | Added lines |
|---|---|---|
nodejs/src/ingestion/config.ts |
6 | 10 |
nodejs/src/ingestion/common/steps/event-processing/fork-flag-evaluations-step.ts |
4 | 23 |
nodejs/src/cdp/consumers/cdp-hogflow-subscription-matcher.consumer.ts |
3 | 27 |
products/workflows/frontend/Workflows/logs/log-utils.tsx |
3 | 5 |
nodejs/src/cdp/utils.ts |
2 | 7 |
nodejs/src/ingestion/common/steps/event-processing/fork-flag-evaluations-step.test.ts |
2 | 66 |
nodejs/src/ingestion/pipelines/analytics/event-subpipeline.ts |
1 | 9 |
This check does not block merging. It updates on every push and clears when the share drops.
⚠️ Bundle size — 🔺 +247.3 KiB (+0.3%)
Uncompressed size of every built .js bundle, compared against the base branch.
Total: 76.75 MiB · 🔺 +247.3 KiB (+0.3%)
| File | Size | Δ vs base |
|---|---|---|
render-query/src/render-query/render-query.js |
25.67 MiB | 🔺 +144.7 KiB (+0.6%) |
exporter/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.62_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/react-shadow.esm-DFvHTPVL.js |
76.7 KiB | 🔺 +76.7 KiB (new) |
posthog-app/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.62_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/react-shadow.esm-DFvHTPVL.js |
76.7 KiB | 🔺 +76.7 KiB (new) |
exporter/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.60_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/react-shadow.esm-B4-N-ucD.js |
removed | 🟢 -76.7 KiB (-100.0%) |
posthog-app/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.60_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/react-shadow.esm-B4-N-ucD.js |
removed | 🟢 -76.7 KiB (-100.0%) |
posthog-app/_parent/products/workflows/frontend/WorkflowsScene.js |
48.5 KiB | 🔺 +22.3 KiB (+85.2%) |
posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene.js |
86.2 KiB | 🟢 -17.5 KiB (-16.9%) |
posthog-app/_parent/products/ai_gateway/frontend/AIGatewayScene.js |
removed | 🟢 -16.0 KiB (-100.0%) |
posthog-app/_parent/products/autoresearch/frontend/AutoresearchNewScene.js |
28.7 KiB | 🔺 +11.9 KiB (+70.2%) |
posthog-app/src/scenes/data-pipelines/batch-exports/BatchExportScene.js |
79.4 KiB | 🔺 +11.7 KiB (+17.3%) |
posthog-app/src/scenes/experiments/Experiment.js |
308.3 KiB | 🔺 +10.8 KiB (+3.6%) |
posthog-app/_parent/products/autoresearch/frontend/AutoresearchPipelineScene.js |
65.7 KiB | 🔺 +10.8 KiB (+19.6%) |
toolbar/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.62_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/chunk-react-shadow.esm-DFvHTPVL.js |
7.8 KiB | 🔺 +7.8 KiB (new) |
toolbar/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.60_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/chunk-react-shadow.esm-B4-N-ucD.js |
removed | 🟢 -7.8 KiB (-100.0%) |
posthog-app/src/layout/today/TodaySpaceHoverCard.js |
removed | 🟢 -6.9 KiB (-100.0%) |
posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene.js |
75.9 KiB | 🔺 +6.8 KiB (+9.8%) |
posthog-app/_parent/products/metrics/frontend/MetricsScene.js |
25.0 KiB | 🟢 -6.5 KiB (-20.7%) |
posthog-app/_parent/products/business_intelligence/frontend/BusinessIntelligenceScene.js |
104.5 KiB | 🔺 +6.3 KiB (+6.5%) |
exporter/src/queries/schema.js |
1.26 MiB | 🔺 +5.4 KiB (+0.4%) |
posthog-app/src/queries/schema.js |
1.26 MiB | 🔺 +5.4 KiB (+0.4%) |
posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene.js |
102.0 KiB | 🔺 +4.5 KiB (+4.6%) |
posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsAccountScene/CustomerAnalyticsAccountScene.js |
62.7 KiB | 🔺 +3.6 KiB (+6.1%) |
posthog-app/src/layout/today/TodaySpacesPane.js |
34.1 KiB | 🟢 -3.1 KiB (-8.3%) |
posthog-app/_parent/products/canvas/frontend/scene/CanvasScene.js |
70.8 KiB | 🔺 +2.9 KiB (+4.3%) |
posthog-app/src/scenes/dashboard/dashboards/Dashboards.js |
35.2 KiB | 🔺 +2.7 KiB (+8.4%) |
exporter/src/exporter/scenes/ExporterNotebookScene.js |
3.74 MiB | 🔺 +2.6 KiB (+0.1%) |
posthog-app/src/scenes/project-homepage/today/TodayHome.js |
13.1 KiB | 🔺 +2.6 KiB (+24.4%) |
posthog-app/src/layout/today/TodayProductsSidebar.js |
6.3 KiB | 🔺 +2.4 KiB (+62.2%) |
posthog-app/src/scenes/feature-flags/FeatureFlag.js |
132.9 KiB | 🔺 +2.4 KiB (+1.9%) |
posthog-app/src/scenes/marketing-analytics/MarketingAnalyticsScene.js |
158.4 KiB | 🔺 +2.1 KiB (+1.4%) |
posthog-app/_parent/products/tasks/frontend/spaces/SpacesScene.js |
11.8 KiB | 🔺 +1.5 KiB (+14.4%) |
exporter/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.62_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/dist.js |
1.2 KiB | 🔺 +1.2 KiB (new) |
posthog-app/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.62_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/dist.js |
1.2 KiB | 🔺 +1.2 KiB (new) |
toolbar/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.62_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/chunk-dist.js |
1.2 KiB | 🔺 +1.2 KiB (new) |
exporter/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.60_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/dist.js |
removed | 🟢 -1.2 KiB (-100.0%) |
posthog-app/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.60_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/dist.js |
removed | 🟢 -1.2 KiB (-100.0%) |
toolbar/_parent/node_modules/.pnpm/@posthog+hedgehog-mode@0.0.60_prop-types@15.8.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/hedgehog-mode/dist/chunk-dist.js |
removed | 🟢 -1.2 KiB (-100.0%) |
posthog-app/_parent/products/business_intelligence/frontend/BIWorksheetsScene.js |
8.8 KiB | 🔺 +1.1 KiB (+14.8%) |
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.65 MiB · 23 files | 🔺 +4.4 KiB (+0.3%) | █████████░ 89.8% of 1.84 MiB |
logged-out boot: index + App + bootApp (preloaded by every page, including /login)src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts |
3.80 MiB · 675 files | 🔺 +10.6 KiB (+0.3%) | █████████░ 94.3% of 4.03 MiB |
authenticated shell (every logged-in page)src/scenes/AuthenticatedShell.tsx |
7.74 MiB · 2,456 files | 🔺 +30.7 KiB (+0.4%) | █████████░ 92.8% of 8.34 MiB |
dashboard scenesrc/scenes/dashboard/Dashboard.tsx |
9.97 MiB · 3,538 files | 🔺 +47.2 KiB (+0.5%) | █████████░ 91.3% of 10.92 MiB |
today home pathsrc/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx |
7.76 MiB · 2,466 files | 🔺 +27.5 KiB (+0.3%) | █████████░ 90.4% of 8.58 MiB |
events scenesrc/scenes/activity/explore/EventsScene.tsx |
9.59 MiB · 3,389 files | 🔺 +46.4 KiB (+0.5%) | █████████░ 91.3% of 10.51 MiB |
replay detail scenesrc/scenes/session-recordings/detail/SessionRecordingDetail.tsx |
12.29 MiB · 4,185 files | 🔺 +39.9 KiB (+0.3%) | ████████░░ 78.2% of 15.72 MiB |
🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/dashboards/frontend/widgets/previews/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 zod/v4/locales/de.js stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/today/TodayReportPage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/activity/explore/EventsScene.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/index.tsx |
| 1.3 KiB | src/RootErrorBoundary.tsx |
| 912 B | ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js |
| 839 B | src/scenes/ChunkLoadErrorBoundary.tsx |
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
| Size | File |
|---|---|
| 316.7 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs |
| 220.8 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 |
| 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 |
| 99.8 KiB | src/lib/api.ts |
| 92.8 KiB | src/products.tsx |
| 69.0 KiB | src/lib/lemon-ui/icons/icons.tsx |
| 40.7 KiB | src/lib/utils/eventUsageLogic.ts |
| 38.7 KiB | ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js |
| 33.9 KiB | ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js |
| 29.0 KiB | ../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.js |
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
| Size | File |
|---|---|
| 316.7 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs |
| 281.0 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 220.8 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 |
| 153.7 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 |
| 112.3 KiB | ../packages/quill/packages/quill/dist/index.js |
| 99.8 KiB | src/lib/api.ts |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 92.8 KiB | src/products.tsx |
| 90.6 KiB | ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js |
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
| Size | File |
|---|---|
| 316.7 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs |
| 281.0 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 220.8 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 |
| 181.9 KiB | src/queries/validators.js |
| 153.7 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 |
| 112.3 KiB | ../packages/quill/packages/quill/dist/index.js |
| 99.8 KiB | src/lib/api.ts |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 92.8 KiB | src/products.tsx |
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
| Size | File |
|---|---|
| 316.7 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs |
| 281.0 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 220.8 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 |
| 153.7 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 |
| 112.3 KiB | ../packages/quill/packages/quill/dist/index.js |
| 99.8 KiB | src/lib/api.ts |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 92.8 KiB | src/products.tsx |
| 90.6 KiB | ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js |
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
| Size | File |
|---|---|
| 316.7 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs |
| 281.0 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 220.8 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 |
| 181.9 KiB | src/queries/validators.js |
| 153.7 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 |
| 112.3 KiB | ../packages/quill/packages/quill/dist/index.js |
| 99.8 KiB | src/lib/api.ts |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 92.8 KiB | src/products.tsx |
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
| Size | File |
|---|---|
| 316.7 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs |
| 316.0 KiB | ../node_modules/.pnpm/posthog-js@1.438.1_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js |
| 281.0 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 220.8 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 |
| 181.9 KiB | src/queries/validators.js |
| 153.7 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 |
| 112.3 KiB | ../packages/quill/packages/quill/dist/index.js |
| 99.8 KiB | src/lib/api.ts |
| 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.24 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.24 MiB · 19 files | 🔺 +3.5 KiB (+0.2%) | ████░░░░░░ 39.1% of 5.72 MiB |
| Deferred (lazy) | 2.18 MiB · 44 files | 🔺 +73.2 KiB (+3.4%) | n/a — loads on demand |
Loader dist/toolbar.js |
1.2 KiB | no change | █░░░░░░░░░ 6.0% of 19.5 KiB |
Largest eagerly-shipped chunks
| Size | File |
|---|---|
| 861.3 KiB | dist/toolbar/toolbar-app-NVPQAEP5.css |
| 669.8 KiB | dist/toolbar/chunk-chunk-G4SZFXYJ.js |
| 259.4 KiB | dist/toolbar/chunk-chunk-YKNMISGG.js |
| 138.2 KiB | dist/toolbar/chunk-chunk-UC3W3UE3.js |
| 131.8 KiB | dist/toolbar/chunk-chunk-FDH2IBXT.js |
| 75.2 KiB | dist/toolbar/toolbar-app-G6JVKXLU.js |
| 69.0 KiB | dist/toolbar/chunk-chunk-TSAL54PB.js |
| 35.6 KiB | dist/toolbar/chunk-chunk-ECCIHXAA.js |
| 21.7 KiB | dist/toolbar/chunk-chunk-T3C2GF5C.js |
| 6.8 KiB | dist/toolbar/chunk-chunk-DV7IWQNF.js |
Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile
✅ Dist folder size — 🔺 +4.42 MiB (+0.4%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1010.05 MiB · 🔺 +4.42 MiB (+0.4%)
⚠️ Playwright — 1 flaky
🎭 Playwright report · View test results →
- Inline editing insight description via compact card popover (chromium)
These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!
✅ Hogbox preview — ready, open the preview
▶ Open the preview
| 🔑 Login | test@posthog.com / 12345678 (demo data) |
| 🧩 Running | this PR's backend and frontend, on the PostHog :master base |
| 🔗 Link | stable across rebuilds: a re-push swaps the box underneath, the URL stays |
| 🔒 Access | tailnet only (PostHog VPN) |
| 🛠️ Admin | inspect & debug state in hogland |
| 💤 Idle | sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen |
commit f4c00f6 · box box-746a2857ce88 · ready in 1180s (push → usable) · build log · rebuilds on every push, torn down on close
🦔 PostHog Review reviewed this pull requestFound 0 must fix, 1 should fix, 0 consider. Published 1 finding (view the review). Resolved comments: 2 left for you |
There was a problem hiding this comment.
🔵 Needs a closer look
Delivery through the new CDP topic remains unverified, and the documented rollout omits the separate legacy-plugin consumer.
1 open finding
What changed in this PR
Adds an opt-in path for mode-2 flag calls to reach realtime destinations and workflows without storing them in the events table.
Changes:
- Routes eligible flag calls to a dedicated realtime-only Kafka topic.
- Adds configurable CDP subscriptions while preserving current defaults.
- Extends routing, fallback, and payload tests.
| File | Description |
|---|---|
| posthog/kafka_client/topics.py | Defines the Python topic constant. |
| nodejs/tests/ingestion/flag-evaluations-e2e.test.ts | Checks routed payloads and person properties. |
| nodejs/tests/helpers/kafka.ts | Registers the test topic. |
| nodejs/tests/helpers/ingestion-outputs.ts | Adds the test output. |
| nodejs/src/ingestion/pipelines/analytics/outputs/registry.ts | Registers realtime-only output configuration. |
| nodejs/src/ingestion/pipelines/analytics/joined-ingestion-pipeline.ts | Extends supported output types. |
| nodejs/src/ingestion/pipelines/analytics/event-subpipeline.ts | Allows realtime-only event routing. |
| nodejs/src/ingestion/ingestion-consumer.ts | Extends consumer configuration and output types. |
| nodejs/src/ingestion/config.ts | Adds disabled-by-default routing settings. |
| nodejs/src/ingestion/common/steps/event-processing/fork-flag-evaluations-step.ts | Retargets eligible calls and avoids duplicate warnings. |
| nodejs/src/ingestion/common/steps/event-processing/fork-flag-evaluations-step.test.ts | Tests routing, fallbacks, and oversized messages. |
| nodejs/src/ingestion/common/flag-evaluations/flag-evaluations-service.ts | Derives routing enablement from configuration. |
| nodejs/src/ingestion/common/flag-evaluations/flag-evaluations-service.test.ts | Tests topic-based enablement. |
| nodejs/src/common/outputs/index.ts | Defines the realtime-only output type. |
| nodejs/src/common/config/kafka-topics.ts | Defines the Node.js topic constant. |
| nodejs/src/cdp/consumers/cdp-hogflow-subscription-matcher.consumer.ts | Adds an optional realtime-only stream. |
| nodejs/src/cdp/consumers/cdp-hogflow-subscription-matcher.consumer.test.ts | Tests optional consumer creation. |
| nodejs/src/cdp/consumers/cdp-events.consumer.ts | Reads topic/group defaults from configuration. |
| nodejs/src/cdp/config.ts | Adds CDP subscription settings. |
| docker/kafka/topics.txt | Provisions the local topic. |
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (4)
Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 11 remain after this review. 📝 WalkthroughWalkthroughThe ingestion pipeline adds a configurable Priority: ➖ Normal Merge Risk: ⚪ Minimal · up to The new routing is opt-in, and the supplied coverage addresses its fallback and consumption paths. No concrete merge-blocking regression is established. Architecture SummaryArchitecture risk: 🔵 Low · up to The change affects 4 systems. Changed systems: Architecture concerns Review detailsSystems and components
Before / after behavior
🚥 Pre-merge checks | ✅ 1✨ Finishing Touches 💡 1📝 Generate docstrings
🧪 Generate unit tests (beta)
🛠️ Fix failing CI checks 💡
Comment |
|
PostHog Review alpha 🦔 If you find any issues helpful - please reply "valid", "invalid", etc., for evaluation purposes 🙏 |
|
The events page reads flag calls from flag_evaluations only when the link names the event. On flag_evaluations_mode 2 a flag call has no events row, so destination and workflow log links without the name open an empty page. Links to other events stay unchanged. Claude-Session: https://claude.ai/code/session_01EvZDsoSPrQzLQit6kYQydV
|
Risk: No findings This PR routes mode-2 Sentinel reviewed |
There was a problem hiding this comment.
Not approved — this change needs a human reviewer.
Re-adding the stamphog label gives the same result unless the changed files change.
stamphog can't approve this pull request, and the refusal is final. Two gates failed. The deny-list gate flagged the workflows delivery paths, such as products/workflows/frontend/Workflows/logs/log-utils.tsx, which stamphog approves only for authors on team-workflows. The tier gate classified the change as T2-never, since it is a cross-cutting feature touching 24 files and 347 lines across ingestion, CDP consumers, and workflows.
Next, ask a human reviewer, ideally someone on team-workflows, to review this pull request. You could also split it, for example by separating the ingestion fork and topic changes from the CDP consumer and workflows log link changes, so each part gets reviewed on its own.
Gate mechanics and policy version
| Gate | Result | |
|---|---|---|
| prerequisites | ✓ | all clear |
| deny-list | ✗ | matches: workflows_delivery (stamphog approves these paths only for authors on team-workflows) |
| size | ✓ | 141L, 15F substantive, 347L/24F incl. docs/generated/snapshots — within ceiling |
| tier | ✗ | classified as T2-never: T2-never (347L, 24F, cross-cutting, feat) |
| stamphog 2.4.1 | .stamphog/policy.yml @ unknown · reviewed head f4c00f6 |
|
/trunk merge |

Problem
$feature_flag_calledin realtime destinations, event-triggered workflows and legacy plugins.clickhouse_events_json, and every CDP consumer reads that topic.clickhouse_flag_evaluationsrow is a poor substitute input, because it carries no person properties.Part of the feasibility review for #88126.
Changes
realtime_only_events_jsontopic instead of dropping it.eventstable.clickhouse_events_jsonwould have carried, person properties included.events: fork off, team excluded, invalid flag key, past retention, fork error, orINGESTION_FLAG_EVALUATIONS_ONLY_DISABLED.CdpEventsConsumerreads its topic and group fromCDP_EVENTS_CONSUMER_TOPICandCDP_EVENTS_CONSUMER_GROUP_ID, so a second deployment can read the new topic.CDP_HOGFLOW_SUBSCRIPTION_MATCHER_REALTIME_ONLY_EVENTS_TOPICis set.flag_evaluations, because a mode-2 call has noeventsrow.events, and the activity page filtered to flag calls misses them the same way.cdp-legacy-on-eventdeployment that reads the new topic with its own consumer group would restore them without a code change. This PR leaves it out.CdpEventsConsumerwas rejected. Its dead-letter service flushes one shared failure buffer per batch, so concurrent streams could commit offsets before failure records exist.Before, on mode 2:
flowchart LR flagCall([Mode 2 flag call]) --> fork[Fork step] fork --> fe[(clickhouse_flag_evaluations)] fe --> table[flag_evaluations table] fork -. removed .-> none[Not produced] ej[(clickhouse_events_json)] --> cdp[CDP consumers] classDef phBlue fill:#1d4aff,stroke:#1d4aff,color:#fff; classDef phRed fill:#f54e00,stroke:#f54e00,color:#fff; classDef phYellow fill:#f9bd2b,stroke:#f9bd2b,color:#000; classDef phGray fill:#e5e7eb,stroke:#c7ccd1,color:#000; class flagCall phYellow; class fork phBlue; class fe,ej,table,none phGray; class cdp phRed;After, on mode 2 with the topic set:
flowchart LR flagCall([Mode 2 flag call]) --> fork[Fork step] fork --> fe[(clickhouse_flag_evaluations)] fe --> table[flag_evaluations table] fork --> emit[Emit event] emit --> ro[(realtime_only_events_json)] ro --> cdp[CDP consumers] classDef phBlue fill:#1d4aff,stroke:#1d4aff,color:#fff; classDef phRed fill:#f54e00,stroke:#f54e00,color:#fff; classDef phYellow fill:#f9bd2b,stroke:#f9bd2b,color:#000; classDef phGray fill:#e5e7eb,stroke:#c7ccd1,color:#000; class flagCall phYellow; class fork,emit phBlue; class fe,ro,table phGray; class cdp phRed;Note
Nothing changes in production when this PR deploys. The new topic keys default to
'', and the CDP keys default to today's topic and group. Rollout order:realtime_only_events_jsonin each region, with the same retention andmax.message.bytesasclickhouse_events_json.cdp-processed-eventsconsumer with the topic and group overrides, set the matcher topic, and add lag andabsent()alerts.INGESTION_OUTPUT_REALTIME_ONLY_EVENTS_TOPICon every lane that setsINGESTION_OUTPUT_FLAG_EVALUATIONS_TOPIC.Warning
eventsproduce.INGESTION_OUTPUT_REALTIME_ONLY_EVENTS_TOPICrolls back to dropping the calls.emitted_events*TopHog sums andeventProcessedAndIngestedCounternow count routed calls. Useingestion_outputs_*{output}to tell the two outputs apart.A follow-up PR lifts the picker hide in destination filters, mappings and workflow event filters, after step 3 is live in both regions.
How did you test this code?
Test rationale:
fork-flag-evaluations-step.test.ts: the mode-2 case runs with routing on and off. It fails if a routed call is dropped or the$experiment_exposurecopy is retargeted.eventsfails.it.eachcatches a second ingestion warning for one event.flag-evaluations-service.test.ts: routing stays off for an empty topic, which would fail every produce at runtime.cdp-hogflow-subscription-matcher.consumer.test.ts: the wiring test fails if the matcher creates the fifth consumer on an empty topic, which failsstart().flag-evaluations-e2e.test.ts: the mode-2 case asserts the realtime copy carriesperson_propertiesfrom$set, andeventsholds only$experiment_exposure. Only a Kafka round trip catches a topic-key typo or an unregistered output.utils.test.ts: fails if a flag-call link loses the event name, or if another event's link gains it.log-utils.test.tsx: the same check for the workflow log link.Run locally: those six files and
cdp-events-consumer.test.ts.Run by hand: the 11 local scenarios in the manual plan below, which all passed.
No mode-2 call reached
clickhouse_events_json, so every mode-2 delivery came through the new consumers.Not run: the four Dev scenarios, which need the charts changes.
Manual test plan
The unit and e2e tests cover the routing decision, the produced payload, the oversize warning, and the matcher's consumer wiring. This plan covers what crosses the topic boundary: CDP delivery, workflow wakes, mode changes, rollback, and the dev rollout.
Local setup
.env.developmentkeepsINGESTION_FLAG_EVALUATIONS_MODE=dual_write,INGESTION_FLAG_EVALUATIONS_TEAMS=*andINGESTION_OUTPUT_FLAG_EVALUATIONS_TOPIC=clickhouse_flag_evaluations. SetINGESTION_OUTPUT_REALTIME_ONLY_EVENTS_TOPIC=realtime_only_events_jsonandCDP_HOGFLOW_SUBSCRIPTION_MATCHER_REALTIME_ONLY_EVENTS_TOPIC=realtime_only_events_json, then start the stack. Start a second plugin server withPLUGIN_SERVER_MODE=cdp-processed-events,CDP_EVENTS_CONSUMER_TOPIC=realtime_only_events_json,CDP_EVENTS_CONSUMER_GROUP_ID=cdp-realtime-only-events-consumerandHTTP_SERVER_PORT=6760. Put a test organization on mode 2 with the flags staff tool. Confirm both plugin servers return 200 on/_health.Destinations
$feature_flag_calledwith the person property filterplan = pro. Send a$feature_flag_calledwith$feature_flag,$feature_flag_responseand$set: {plan: 'pro'}. Confirm the destination's logs show one delivery. Confirm ClickHouseeventshas no row for that uuid, andflag_evaluationshas one.$feature_flag_calledfrom a person withoutplan = pro. Confirm the destination does NOT fire.EXPERIMENT_EXPOSURE_DUPLICATION_TEAMSand restart ingestion. Create a second destination that matches$experiment_exposure. Send a flag call with a variant string response. Confirm each destination fires exactly once.Workflows
$feature_flag_calledwith one webhook step. Send a flag call. Confirm one workflow run appears and its step fires once.$pageviewwith a wait-until step on$feature_flag_called. Send a$pageviewand confirm the job parks incyclotron_jobs. Send a flag call for the same person. Confirm the job wakes and continues.No double send
realtime_only_events_jsonreceives no message (kcat -C -t realtime_only_events_json -o end).events.INGESTION_FLAG_EVALUATIONS_ONLY_DISABLED=trueand restart ingestion. Send a flag call on mode 2. Confirm the destination fires once, the call lands inevents, andrealtime_only_events_jsonreceives nothing.Rollback and failure
INGESTION_OUTPUT_REALTIME_ONLY_EVENTS_TOPICand restart ingestion. Send a flag call on mode 2. Confirm the destination does NOT fire,eventshas no row, andflag_evaluationshas one.INGESTION_OUTPUT_REALTIME_ONLY_EVENTS_TOPICto a topic that does not exist. Restart ingestion. Confirm startup fails with a topic check error that names the topic. (Local Redpanda creates the topic during the failed check, so only the first startup fails locally.)Dev, after the charts changes
ingestion_outputs_latency_seconds_count{output="realtime_only_events"}rises, andingestion_outputs_errors_total{output="realtime_only_events"}stays at zero.kminion_kafka_consumer_group_topic_partition_lag{topic_name="realtime_only_events_json"}stays near zero forcdp-realtime-only-events-consumerandcdp-hogflow-subscription-matcher-realtime-only-events-consumer.absent()alerts andFlagEvaluationsForkStalleddo NOT fire. Confirmingestion_flag_evaluations_events_total{outcome="flag_evaluations_only"}keeps counting.ingestion_outputs_batch_size_count{output="realtime_only_events"}stays flat.The
test-new-events-schemalabel is not needed. The diff changes Node ingestion routing only, and no Python test reads event properties differently.👉 Stay up-to-date with PostHog coding conventions for a smoother review.
Release status
Docs update
None. No doc under
docs/covers flag evaluations modes.🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Agent: Claude Code, Opus 5.5 (
claude-opus-5-5)/writing-tests,/writing-code-comments,/simplify,comment-cleanup,/reviewing-with-coderabbit,/writing-pr-descriptions.--deep, reported one finding. The matcher's_parseKafkaBatchswallows dependency errors, so a failed team lookup skips a call. I rejected it for this PR: the existingclickhouse_events_jsonstream shares that parser, and the new stream keeps parity with it. Changing retry behavior for both streams belongs in a separate PR.https://claude.ai/code/session_01EvZDsoSPrQzLQit6kYQydV