diff --git a/design-system/apps/design-lab/src/preview/FlowChatToolGallery.css b/design-system/apps/design-lab/src/preview/FlowChatToolGallery.css
index dc8cdab64c..336f7a7149 100644
--- a/design-system/apps/design-lab/src/preview/FlowChatToolGallery.css
+++ b/design-system/apps/design-lab/src/preview/FlowChatToolGallery.css
@@ -10,6 +10,25 @@
margin-top: 42px;
}
+.flow-chat-tool-sequence {
+ display: grid;
+ min-inline-size: 0;
+ gap: var(--openbitfun-space-5);
+}
+
+.flow-chat-tool-sequence__rows {
+ min-inline-size: 0;
+}
+
+.flow-chat-tool-sequence__rows > * + * {
+ margin-block-start: var(--openbitfun-control-flow-chat-flow-item-gap);
+}
+
+.flow-chat-tool-sequence__rows > [data-openbitfun-component='flow-chat-tool-card'][data-openbitfun-attention='ambient'][data-openbitfun-expanded-shell='false']
+ + [data-openbitfun-component='flow-chat-tool-card'][data-openbitfun-attention='ambient'][data-openbitfun-expanded-shell='false'] {
+ margin-block-start: 0;
+}
+
.flow-chat-tool-gallery > .component-catalog-section-heading {
margin-block: 0 -8px;
padding-top: 34px;
diff --git a/design-system/apps/design-lab/src/preview/FlowChatToolGallery.tsx b/design-system/apps/design-lab/src/preview/FlowChatToolGallery.tsx
index 2b17f1d87a..c6cb713c5d 100644
--- a/design-system/apps/design-lab/src/preview/FlowChatToolGallery.tsx
+++ b/design-system/apps/design-lab/src/preview/FlowChatToolGallery.tsx
@@ -2,6 +2,9 @@ import {
ArrowRight,
Eye,
} from "lucide-react";
+import { useState } from "react";
+import { TabGroup } from "@openbitfun/ui";
+import { AgentWaitToolCard, SkillToolCard, TerminalControlToolCard, TodoToolCard } from "@openbitfun/ui/flow-chat";
import { useI18n } from "../i18n";
import { getComponentDescription } from "../i18n/componentMetadata";
import {
@@ -28,6 +31,47 @@ const productOwnedToolExamples = [
"PatchCanvas",
] as const;
+function ToolSequencePreview() {
+ const { t } = useI18n();
+ const [status, setStatus] = useState<"running" | "completed" | "error">("running");
+ const [expanded, setExpanded] = useState(false);
+ const completed = status === "completed";
+ return
{t("components.flowChat.toolsDescription")}
+{t("components.flowChat.dedicatedDescription")}
+ModelThinkingDisplay · ExploreGroupRenderer · RuntimeStatusSlot
{productOwnedToolExamples.join(" · ")}
diff --git a/design-system/packages/design-tokens/src/system.tokens.json b/design-system/packages/design-tokens/src/system.tokens.json
index 32fb07dbbd..e0a6abf81c 100644
--- a/design-system/packages/design-tokens/src/system.tokens.json
+++ b/design-system/packages/design-tokens/src/system.tokens.json
@@ -495,19 +495,21 @@
"flowChat": {
"$description": "Shared FlowChat rhythm for product and package-owned conversation surfaces.",
"$type": "dimension",
- "flowItemGap": { "$value": "0.42rem" },
+ "rowIconSize": { "$value": "{control.icon.sizeSm}" },
+ "rowIconGap": { "$value": "{space.1}" },
+ "flowItemGap": { "$value": "{space.2}" },
"turnGap": { "$value": "{space.4}" },
- "inlineGap": { "$value": "0.35rem" },
- "controlGap": { "$value": "0.5rem" },
- "controlPaddingBlock": { "$value": "0.35rem" },
+ "inlineGap": { "$value": "{space.1}" },
+ "controlGap": { "$value": "{space.2}" },
+ "controlPaddingBlock": { "$value": "{space.1}" },
"controlPaddingInline": { "$value": "0.75rem" },
"contentPaddingInline": { "$value": "3rem" },
"contentPaddingInlineMobile": { "$value": "1.5rem" },
- "cardGap": { "$value": "0.42rem" },
+ "cardGap": { "$value": "{control.flowChat.flowItemGap}" },
"cardRadius": { "$value": "{radius.base}" },
"cardPaddingBlock": { "$value": "0.625rem" },
"cardPaddingInline": { "$value": "0.75rem" },
- "cardExpandedPaddingBlock": { "$value": "0.5rem" },
+ "cardExpandedPaddingBlock": { "$value": "{space.2}" },
"cardExpandedPaddingInline": { "$value": "0.625rem" },
"codeBlockPaddingBlock": { "$value": "0.55rem" },
"codeBlockPaddingInline": { "$value": "0.75rem" }
diff --git a/design-system/packages/ui/README.md b/design-system/packages/ui/README.md
index 9242c36222..c9ae0daf6b 100644
--- a/design-system/packages/ui/README.md
+++ b/design-system/packages/ui/README.md
@@ -440,3 +440,17 @@ long description while metadata and sibling actions retain their own slots.
Lab Patterns includes long paths, large change counts, expandable detail and
disabled actions. The current Web UI has no direct ActivityItem consumer;
FlowChat ambient tool cards keep their separate presentation contract.
+
+Ambient FlowChat summaries, product thinking/explore headers and runtime status
+share a 14px icon column followed by a 4px gap. The icon column starts at the
+transcript body edge; heading text starts 18px after that edge. Loading, tool
+and disclosure glyphs occupy that same column. Expanded thinking prose remains
+aligned with the body edge; bordered tool detail retains its own content inset.
+The 12px/4px Figma inline trace is a smaller typography scene; the existing
+product 14px glyph size is retained when applying its gap to these summaries.
+
+FlowChat vertical composition uses an 8px item/section gap and 4px inline gap.
+Collapsed ambient tool runs use their 22px minimum line boxes without extra
+spacing between adjacent rows; expanded/prominent cards retain the section gap.
+The enclosing composition owns those gaps, and card bodies own their internal
+padding. The Lab tool sequence demonstrates both arrangements with real cards.
diff --git a/design-system/packages/ui/src/flow-chat/tool-cards/ActivityToolCards.tsx b/design-system/packages/ui/src/flow-chat/tool-cards/ActivityToolCards.tsx
index fcba529cd3..53028e269c 100644
--- a/design-system/packages/ui/src/flow-chat/tool-cards/ActivityToolCards.tsx
+++ b/design-system/packages/ui/src/flow-chat/tool-cards/ActivityToolCards.tsx
@@ -52,6 +52,7 @@ function ActivityToolCardBase({
) : undefined}
icon={(