Skip to content

fix(aio): prevent trace search stack overflow from URL sync loop - #71088

Merged
Radu-Raicea merged 1 commit into
masterfrom
posthog-code/fix-ai-obs-trace-search-url-loop
Jul 15, 2026
Merged

fix(aio): prevent trace search stack overflow from URL sync loop#71088
Radu-Raicea merged 1 commit into
masterfrom
posthog-code/fix-ai-obs-trace-search-url-loop

Conversation

@Radu-Raicea

@Radu-Raicea Radu-Raicea commented Jul 15, 2026

Copy link
Copy Markdown
Member

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-fired urlToAction, which called setSearchQuery again. 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) in aiObservabilityTraceLogic: urlToAction sets it before dispatching setSearchQuery, 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 whose search param contains a space ([cite] , the production trigger) and asserts the query is applied without being written back to the URL (router.actions.replace not 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

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

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 at setSearchQuery in aiObservabilityTraceLogic.ts with a sample URL containing a spaced search query. Skills invoked: /investigating-error-issue and /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

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
@github-actions

Copy link
Copy Markdown
Contributor

Hey @Radu-Raicea! 👋

It looks like your git author email on this PR isn't your @posthog.com address (radu@raicea.com). Since you're on the PostHog team, it's worth pointing your local git author email at your @posthog.com address. Why it matters:

  • Consistent work identity in git history — internal tooling that attributes commits to team members keys off your @posthog.com address.
  • Keeps team contributions easy to tell apart from external community ones when scanning history.

You can fix it for this repo with:

git config user.email "you@posthog.com"

Or set it globally with git config --global user.email "you@posthog.com". No need to redo this PR — just a nudge for next time. 🙂

@Radu-Raicea
Radu-Raicea marked this pull request as ready for review July 15, 2026 14:13
@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Bundle size — no change

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

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 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.22 MiB · 22 files no change ███░░░░░░░ 28.4% of 4.29 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.15 MiB · 2,979 files no change █████████░ 88.1% of 9.25 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.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%)

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ❌ build failed

The preview didn't come up for commit 953ab2d. See the build log for the failing step. It'll retry on the next push.

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team July 15, 2026 14:13
@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "fix(aio): prevent trace search stack ove..." | Re-trigger Greptile

@Radu-Raicea Radu-Raicea added the stamphog Request AI approval (no full review) label Jul 15, 2026

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@Radu-Raicea
Radu-Raicea enabled auto-merge (squash) July 15, 2026 14:23
@trunk-io

trunk-io Bot commented Jul 15, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

@Radu-Raicea
Radu-Raicea merged commit 1b1af86 into master Jul 15, 2026
336 of 349 checks passed
@Radu-Raicea
Radu-Raicea deleted the posthog-code/fix-ai-obs-trace-search-url-loop branch July 15, 2026 15:30
@deployment-status-posthog

deployment-status-posthog Bot commented Jul 15, 2026

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-07-15 16:00 UTC Run
prod-us ✅ Deployed 2026-07-15 16:19 UTC Run
prod-eu ✅ Deployed 2026-07-15 16:21 UTC Run

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

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant