diff --git a/apps/app/src/components/promptbox/PromptBoxInternal.tsx b/apps/app/src/components/promptbox/PromptBoxInternal.tsx
index 514924688..8f5dfb840 100644
--- a/apps/app/src/components/promptbox/PromptBoxInternal.tsx
+++ b/apps/app/src/components/promptbox/PromptBoxInternal.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import { atom, useAtom } from "jotai";
 import { RESET, atomWithStorage } from "jotai/utils";
 import type {
@@ -1132,6 +1133,7 @@ export function PromptBoxInternal({
   promptBoxRef,
   focusEndKey,
 }: PromptBoxInternalProps) {
+  renderProbe("PromptBoxInternal");
   const focusComposerShortcut = useAppCommandShortcut("composer.focus");
   const {
     isSubmitting = false,
diff --git a/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx b/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx
index e1b991ad2..288019ca6 100644
--- a/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx
+++ b/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import {
   useCallback,
   useEffect,
@@ -270,6 +271,7 @@ function EmbeddedThreadChatHostedFooter({
   scrollOverlay,
   surface,
 }: EmbeddedThreadChatHostedFooterProps) {
+  renderProbe("EmbeddedThreadChatHostedFooter");
   return (
     <div
       data-thread-window=""
diff --git a/apps/app/src/components/thread/timeline/ThreadTimelineRows.tsx b/apps/app/src/components/thread/timeline/ThreadTimelineRows.tsx
index 5dadc1e2e..30b1c11ab 100644
--- a/apps/app/src/components/thread/timeline/ThreadTimelineRows.tsx
+++ b/apps/app/src/components/thread/timeline/ThreadTimelineRows.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import {
   createContext,
   memo,
@@ -1637,6 +1638,7 @@ function TimelineRowView({
   showAssistantMessageActions,
   spacing,
 }: TimelineRowViewProps) {
+  renderProbe("TimelineRowView");
   const horizontalPadding = timelineRowHorizontalPadding(spacing);
   const { onTitleAction, resolveSegmentLinkHref } =
     useTimelineRendererStaticContext();
@@ -1744,6 +1746,7 @@ function TimelineExpandableRowView({
   horizontalPadding,
   row,
 }: TimelineExpandableRowViewProps) {
+  renderProbe("TimelineExpandableRowView");
   const { onTitleAction, resolveSegmentLinkHref } =
     useTimelineRendererStaticContext();
   const {
@@ -1940,6 +1943,7 @@ function ThreadTimelineRowsComponent(props: ThreadTimelineRowsProps) {
 }
 
 function ThreadTimelineRowsForTimelineView(props: ThreadTimelineRowsProps) {
+  renderProbe("ThreadTimelineRows");
   const getViewRows = useTimelineViewRowsCache();
   const rows = useMemo(
     () => getViewRows(props.timelineRows),
diff --git a/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx b/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx
index 978011b31..6b41497a6 100644
--- a/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx
+++ b/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import { useEffect, useMemo, useState, type ReactNode } from "react";
 import type {
   ActiveThinking,
@@ -178,6 +179,7 @@ export function ThreadTimelineSurface({
   unreadDividerPlacement,
   workspaceRootPath,
 }: ThreadTimelineSurfaceProps) {
+  renderProbe("ThreadTimelineSurface");
   const preferredTheme = usePreferredTheme();
   const showActiveThinking =
     activeThinking !== null && ongoingIndicatorLabel === undefined;
diff --git a/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx b/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx
index bc2815413..0832ff124 100644
--- a/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx
+++ b/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import { useCallback, useMemo, useRef, useState } from "react";
 import { createPortal } from "react-dom";
 import { NavLink, useNavigate } from "react-router-dom";
@@ -346,6 +347,7 @@ export function ThreadDetailPromptArea({
   composerFocusRequestNonce,
   thread,
 }: ThreadDetailPromptAreaProps) {
+  renderProbe("ThreadDetailPromptArea");
   const navigate = useNavigate();
   const defaultExecutionOptionsQuery = useThreadDefaultExecutionOptions(
     thread.id,
diff --git a/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx b/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx
index fe23cf36a..6fa495375 100644
--- a/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx
+++ b/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import { useMemo, type ComponentProps, type ReactNode } from "react";
 import { Skeleton } from "@bb/shared-ui/skeleton";
 import { cn } from "@bb/shared-ui/lib/utils";
@@ -78,6 +79,7 @@ function ThreadDetailSecondaryContentBody({
   secondaryPanel,
   timeline,
 }: ThreadDetailSecondaryContentProps) {
+  renderProbe("ThreadDetailSecondaryContentBody");
   const composerHost = usePluginComposerHost();
   const { renderBrowserDeck, ...threadSecondaryPanelProps } = secondaryPanel;
 
diff --git a/apps/app/src/views/thread-detail/ThreadDetailView.tsx b/apps/app/src/views/thread-detail/ThreadDetailView.tsx
index a2a4724bd..a8d1e5942 100644
--- a/apps/app/src/views/thread-detail/ThreadDetailView.tsx
+++ b/apps/app/src/views/thread-detail/ThreadDetailView.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import {
   useCallback,
   useEffect,
@@ -503,6 +504,7 @@ export function ThreadDetailView(props: ThreadDetailViewProps) {
 }
 
 function ThreadDetailViewInternal(props: ThreadDetailViewInternalProps) {
+  renderProbe("ThreadDetailViewInternal");
   const { projectId, threadId } = props;
   const { isFocused, navigateInPane, onRequestClose, isBoundedPane } =
     usePaneContext();
diff --git a/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx b/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx
index 7d323f95c..7c112546e 100644
--- a/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx
+++ b/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
 import type { ReactNode } from "react";
 import type { ThreadTimelineUnreadDividerPlacement } from "@/components/thread/timeline";
 import type { PromptMentionLinkResolver } from "@/components/promptbox/editor/prompt-mention-link";
@@ -27,6 +28,7 @@ export function ThreadTimelinePane({
   footer,
   ...surface
 }: ThreadTimelinePaneProps) {
+  renderProbe("ThreadTimelinePane");
   return (
     <EmbeddedThreadChat
       variant="hosted-footer"
