Skip to content

feat(web): Product analytics page: events, funnels and paths - #2172

Open
Makisuo wants to merge 18 commits into
refactor/funnel-step-builder-kitfrom
feat/product-analytics-page
Open

Makisuo wants to merge 18 commits into
refactor/funnel-step-builder-kitfrom
feat/product-analytics-page

chore(lint): product analytics page on the effect collection helpers

477ddce
Select commit
Loading
Failed to load commit list.
Maple Review Bot / Maple / review succeeded Nov 14, 2026 in 10m 43s

Confidence 10/10 · No issues found

🟢 Confidence 10/10 · safe to merge. New page plus a stricter org-scope guard on ingest, the guard pinned by a foreign org_id test; the page's states are pinned by scene tests.
no findings · tests covered · risk high · 2/2 new units observable

Adds a /product-analytics page (events, funnels, paths) on the shared step builder and filter rail, a demo-seed generator for sessions and product events, and makes the ingest org guard read org_id. Safe to merge. The open McpQueryErrors traced to apps/web/src/page/registry.ts come from the agent's MCP registry; this diff only registers the new route there and does not fix them.

  • /product-analytics holds the URL-borne funnel and paths definition and debounces typed steps 450 ms
  • navigate writes the drafts into every navigation and keeps a blank anchor the URL omits
  • analyticsFilterRail is extracted to the kit, with Traffic and Event sections optional
  • The ingest org guard also refuses a row whose org_id names another org

Production impact

Open errors in the changed files (2)
Issue Service Occurrences File
@maple/mcp/errors/McpQueryError (7 issues) maple-ai 33 apps/web/src/page/registry.ts
@maple/mcp/errors/McpQueryError (3 issues) maple-chat 15 apps/web/src/page/registry.ts

After this merges, Maple checks whether they stop.

What was checked
  • navigate keeps model.steps/model.anchor when the URL omits a blank Page anchor (update.ts:79), so picking a kind survives Depth/Direction/filter changes
  • Web analytics keeps its Traffic group and Event section through view-filters.ts:34-51
  • routeWindowStep re-requests every slot on a non-window change, so a pick refetches the funnel/paths key
Observability coverage: 2 of 2 changes observable
Change Kind Observable Evidence
Product events reads (getProductEventNames, getProductEventsFunnelWidget, getProductEventsPathsWidget) outbound query yes Existing WarehouseQueryService.compiledQuery call sites; QueryEngine.getProductEventNames spans appear in the PR's preview trace table
Demo seed session_replays / product_events writes warehouse write yes Reuses ingestAll in DemoService.ts:56, the already-traced ingest path

477ddce · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.