fix(aio): prevent trace search stack overflow from URL sync loop - #71088
Conversation
The trace view's search box and the URL were wired in a two-way loop: setSearchQuery wrote the query into the URL, urlToAction read it back and called setSearchQuery again. The value-only guard meant to break this could stay unequal forever for queries the URL builder and the browser encode/read differently (e.g. containing a space), recursing until the call stack overflowed (RangeError: Maximum call stack size exceeded). Add a re-entrancy flag so a URL-sourced query is never written back to the URL, breaking the loop regardless of how the query string encodes. Generated-By: PostHog Code Task-Id: a90c80d6-329c-49ca-ac2d-def57fa46a3f
|
Hey @Radu-Raicea! 👋 It looks like your git author email on this PR isn't your
You can fix it for this repo with: git config user.email "you@posthog.com"Or set it globally with |
🤖 CI report✅ Bundle size — no changeUncompressed size of every built Total: 64.80 MiB · no change No file changed by more than 1000 B. Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report ✅ Eager graph — within budgetHow 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
🟢 Largest files eagerly shipped from
|
| 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.1 KiB | ../node_modules/.pnpm/posthog-js@1.401.0/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 |
| 235.5 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 222.7 KiB | ../node_modules/.pnpm/posthog-js@1.401.0/node_modules/posthog-js/dist/module.js |
| 164.0 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 |
| 106.1 KiB | src/lib/api.ts |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 92.7 KiB | ../packages/quill/packages/quill/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
✅ Dist folder size — 🔺 +848 B (+0.0%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1308.72 MiB · 🔺 +848 B (+0.0%)
🦔 Hogbox preview · ❌ build failedThe preview didn't come up for commit |
|
Reviews (1): Last reviewed commit: "fix(aio): prevent trace search stack ove..." | Re-trigger Greptile |
There was a problem hiding this comment.
Contained frontend bug fix in a single kea logic file with a regression test covering the exact failure mode; author is on the owning team with strong recent familiarity, no unresolved concerns, and no risky-territory surface touched.
- Author wrote 75% of the modified lines and has 21 merged PRs in these paths (familiarity STRONG).
- 👍 on the PR from greptile-apps[bot], hex-security-app[bot].
Gate mechanics and policy version
| Gate | Result | |
|---|---|---|
| prerequisites | ✓ | all clear |
| deny-list | ✓ | no deny categories matched |
| size | ✓ | 19L, 1F substantive, 39L/2F incl. docs/generated/snapshots — within ceiling |
| tier | ✓ | T1-agent / T1b-small (39L, 2F, single-area, fix) |
| stamphog 2.0.0b3 | .stamphog/policy.yml @ 0c6df20 · reviewed head 953ab2d |
Problem
The AI observability trace view throws
RangeError: Maximum call stack size exceeded(a stack overflow) when certain search queries are entered. The search box and the URL were wired in a two-way loop:setSearchQuery's listener wrote the query into the URL (router.actions.replace), which re-firedurlToAction, which calledsetSearchQueryagain. A value-only guard (searchQuery !== currentSearchInUrl) was meant to break the loop, but for queries the URL builder and the browser encode/read differently (e.g. one containing a space), the comparison never converged — the two actions recursed synchronously until the stack overflowed and the tab crashed. Surfaced via an error tracking alert; low volume so far but the search feature is broken for the affected inputs.Origin: Slack thread
Changes
Added a re-entrancy flag (
cache.settingSearchFromUrl) inaiObservabilityTraceLogic:urlToActionsets it before dispatchingsetSearchQuery, and the listener skips the URL write-back when it's set. This breaks the loop structurally, regardless of how the query string encodes. The existing value-guard is kept as an optimization to avoid unnecessary history churn.How did you test this code?
Added one regression test in
aiObservabilityTraceLogic.test.ts: pushes a trace URL whosesearchparam contains a space ([cite], the production trigger) and asserts the query is applied without being written back to the URL (router.actions.replacenot called) — i.e. no re-entrant write-back that would recurse. Removing the guard reintroduces the write-back this test forbids.Note: this environment has no
node_modules, so I (the agent) could not run jest or the typecheck locally. The change is a small, self-contained kea logic edit.Automatic notifications
Docs update
No user-facing docs affected.
🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Investigated an error tracking issue from a Slack thread using the PostHog MCP error-tracking tools (
query-error-tracking-issues-list,query-error-tracking-issue-events), which pointed atsetSearchQueryinaiObservabilityTraceLogic.tswith a sample URL containing a spaced search query. Skills invoked:/investigating-error-issueand/writing-tests.Considered an encoding-agnostic fix by comparing the fully-built target URL against the current URL, but the exact round-trip through kea-router's decoder couldn't be verified in this environment; the re-entrancy flag is the standard kea pattern for URL⟷state sync loops and is robust to encoding quirks, so it was chosen instead.
Created with PostHog from a Slack thread