diff --git a/apps/web/src/components/Rail.tsx b/apps/web/src/components/Rail.tsx
index 11c4ad6..f8cd562 100644
--- a/apps/web/src/components/Rail.tsx
+++ b/apps/web/src/components/Rail.tsx
@@ -240,57 +240,64 @@ function SessionRowItem({
-
+
+
+ {session.title}
+
+ {session.pendingApprovals > 0 && (
+
+ {session.pendingApprovals}
+
+ )}
+ {row.unread && (
+
+ )}
+
+
+ {formatRelativeTime(session.updatedAt, nowMs)}
+
+ {session.status !== null ? (
+
+ ) : (
+ stateLabel !== "" && {stateLabel}
+ )}
+
+
+ }
+ />
+
+
+ {session.title}
+ {session.model}
+
+
+
{controller !== null && address !== null && (
-
+ }
/>
-
{group.project.name}
- {group.host.kind === "remote" && (
-
-
- {group.host.name}
-
- )}
- {group.host.kind === "local" &&
- group.host.profileId !== undefined &&
- group.host.profileId !== "default" && (
-
-
- {group.host.name}
+
+
+ {group.project.name}
+
+ {group.host.kind === "remote" ? "Remote host" : "Host profile"}: {group.host.name}
- )}
-
- {!group.expanded && group.unreadCount > 0 && (
-
- )}
- {!group.expanded && group.groupStatus !== null && (
-
- )}
- {group.sessions.length}
-
+
+
+
{allowCreate && chooseCreateProfile ? (
diff --git a/apps/web/test/mobile-touch-targets.test.tsx b/apps/web/test/mobile-touch-targets.test.tsx
index d631b7e..a361e99 100644
--- a/apps/web/test/mobile-touch-targets.test.tsx
+++ b/apps/web/test/mobile-touch-targets.test.tsx
@@ -160,6 +160,21 @@ describe("phone touch targets", () => {
expect(session).toContain("Enter focus mode");
expect(session).toContain("⌘⇧F");
expect(rail).toContain("flex min-h-11 min-w-0 flex-1 items-center");
+ // Folder names and session titles are the rail's visible hierarchy and
+ // wrap up to two lines. Host and model identifiers stay available in hover
+ // tooltips instead of competing for the narrow row width; a non-default
+ // host icon stays inline so touch surfaces (where tooltips never fire)
+ // keep the host differentiator. The model lives tooltip-only.
+ expect(rail).toContain("min-w-0 flex-1 line-clamp-2 break-words font-medium text-foreground text-xs");
+ expect(rail).toContain("line-clamp-2 break-words text-foreground text-sm leading-5");
+ expect(rail).not.toContain("modelMonogram");
+ expect(rail).toContain('group.host.kind === "remote" && (');
+ expect(rail).toContain('Cable aria-hidden="true" className="size-3 shrink-0 text-muted-foreground"');
+ expect(rail).toContain("collisionPadding={8}");
+ expect(rail).toContain('aria-label={`${group.project.name}, ${group.sessions.length}');
+ expect(rail).toContain('Remote host" : "Host profile"');
+ expect(rail).toContain("break-words font-mono text-muted-foreground");
+ expect(rail).not.toContain('truncate font-mono text-[11px]">{session.model}');
// Project-row create actions are labeled `New`, stay 44px on touch, and
// announce that the chosen OMP profile owns the session.
expect(rail.match(/flex h-11 shrink-0 [^"]*sm:h-6/g)).toHaveLength(2);
diff --git a/packages/ui/src/primitives/tooltip.tsx b/packages/ui/src/primitives/tooltip.tsx
index 9e9f7a8..4288250 100644
--- a/packages/ui/src/primitives/tooltip.tsx
+++ b/packages/ui/src/primitives/tooltip.tsx
@@ -20,6 +20,8 @@ function TooltipPopup({
sideOffset = 4,
side = "top",
anchor,
+ collisionPadding,
+ collisionAvoidance,
children,
...props
}: TooltipPrimitive.Popup.Props & {
@@ -27,6 +29,8 @@ function TooltipPopup({
side?: TooltipPrimitive.Positioner.Props["side"];
sideOffset?: TooltipPrimitive.Positioner.Props["sideOffset"];
anchor?: TooltipPrimitive.Positioner.Props["anchor"];
+ collisionPadding?: TooltipPrimitive.Positioner.Props["collisionPadding"];
+ collisionAvoidance?: TooltipPrimitive.Positioner.Props["collisionAvoidance"];
}) {
return (
@@ -34,6 +38,8 @@ function TooltipPopup({
align={align}
anchor={anchor}
className="pointer-events-none z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom,transform] duration-(--motion-duration-base) ease-(--motion-ease-out) data-instant:transition-none"
+ collisionAvoidance={collisionAvoidance}
+ collisionPadding={collisionPadding}
data-slot="tooltip-positioner"
side={side}
sideOffset={sideOffset}
diff --git a/provenance/t3code/imports/f0-20260711.json b/provenance/t3code/imports/f0-20260711.json
index 9f3ed4d..a894699 100644
--- a/provenance/t3code/imports/f0-20260711.json
+++ b/provenance/t3code/imports/f0-20260711.json
@@ -24,7 +24,7 @@
"sourceBlobSha": "442c394ec220c204ab82aff6b76b3a2e4701e8a8",
"targetPath": "packages/ui/src/primitives/tooltip.tsx",
"classification": "adapted",
- "checksum": "sha256:a1b46b18a02855a3fdf1953086c6e39823c44b41292bafd40f4fb14386615c9e"
+ "checksum": "sha256:53c76a9d6fc7a7ebedac1e32be5962eb782ea30a464a6a1cb2c52802dade419d"
},
{
"sourcePath": "apps/web/src/components/ui/dialog.tsx",