From 01b0aad66d0697acf6b115cfeb7f71b61e853cf0 Mon Sep 17 00:00:00 2001 From: Matt Brockman Date: Thu, 16 Jul 2026 15:48:16 -0700 Subject: [PATCH 1/2] Target feature flags by stable team ID Remove dashboard slugs from the LaunchDarkly context so routing identifiers cannot become targeting inputs. Existing Dashboard project rules and targets use team context keys only. --- src/app/dashboard/[teamSlug]/agents/page.tsx | 1 - src/app/dashboard/[teamSlug]/byoc/page.tsx | 1 - src/app/dashboard/[teamSlug]/layout.tsx | 1 - src/app/dashboard/[teamSlug]/usage/page.tsx | 4 +--- src/core/modules/feature-flags/context.ts | 1 - .../feature-flags/launchdarkly-openfeature-provider.server.ts | 1 - src/features/dashboard/sandboxes/list/feature-flag.server.ts | 2 +- tests/unit/feature-flags.test.ts | 2 -- 8 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/app/dashboard/[teamSlug]/agents/page.tsx b/src/app/dashboard/[teamSlug]/agents/page.tsx index 89f14af89..2d46d922a 100644 --- a/src/app/dashboard/[teamSlug]/agents/page.tsx +++ b/src/app/dashboard/[teamSlug]/agents/page.tsx @@ -41,7 +41,6 @@ export default async function AgentsPage({ params }: AgentsPageProps) { }, team: { id: teamId.data, - slug: teamSlug, }, }) diff --git a/src/app/dashboard/[teamSlug]/byoc/page.tsx b/src/app/dashboard/[teamSlug]/byoc/page.tsx index 7598b57e7..2f1aa0e68 100644 --- a/src/app/dashboard/[teamSlug]/byoc/page.tsx +++ b/src/app/dashboard/[teamSlug]/byoc/page.tsx @@ -38,7 +38,6 @@ export default async function ByocPage({ params }: ByocPageProps) { }, team: { id: teamId.data, - slug: teamSlug, }, }) diff --git a/src/app/dashboard/[teamSlug]/layout.tsx b/src/app/dashboard/[teamSlug]/layout.tsx index 6e2e31b13..6b61bd932 100644 --- a/src/app/dashboard/[teamSlug]/layout.tsx +++ b/src/app/dashboard/[teamSlug]/layout.tsx @@ -69,7 +69,6 @@ export default async function DashboardLayout({ ? { id: team.id, name: team.name, - slug: teamSlug, } : undefined diff --git a/src/app/dashboard/[teamSlug]/usage/page.tsx b/src/app/dashboard/[teamSlug]/usage/page.tsx index 2ae97b742..444fa75b5 100644 --- a/src/app/dashboard/[teamSlug]/usage/page.tsx +++ b/src/app/dashboard/[teamSlug]/usage/page.tsx @@ -35,9 +35,7 @@ export default async function UsagePage({ email: authContext.user.email ?? undefined, }, team: - teamId.ok && teamId.data - ? { id: teamId.data, slug: teamSlug } - : undefined, + teamId.ok && teamId.data ? { id: teamId.data } : undefined, }) const result = await getUsage({ teamSlug }) diff --git a/src/core/modules/feature-flags/context.ts b/src/core/modules/feature-flags/context.ts index 8881bb6dc..3a46faaf2 100644 --- a/src/core/modules/feature-flags/context.ts +++ b/src/core/modules/feature-flags/context.ts @@ -5,7 +5,6 @@ export type FeatureFlagContext = { } team?: { id: string - slug?: string name?: string } } diff --git a/src/core/modules/feature-flags/launchdarkly-openfeature-provider.server.ts b/src/core/modules/feature-flags/launchdarkly-openfeature-provider.server.ts index 57d40d648..7f8c84e0b 100644 --- a/src/core/modules/feature-flags/launchdarkly-openfeature-provider.server.ts +++ b/src/core/modules/feature-flags/launchdarkly-openfeature-provider.server.ts @@ -50,7 +50,6 @@ export function createOpenFeatureEvaluationContext( targetingKey: context.team.id, ...definedStringAttributes({ name: context.team.name, - slug: context.team.slug, }), }, } diff --git a/src/features/dashboard/sandboxes/list/feature-flag.server.ts b/src/features/dashboard/sandboxes/list/feature-flag.server.ts index 2115999cd..31546265d 100644 --- a/src/features/dashboard/sandboxes/list/feature-flag.server.ts +++ b/src/features/dashboard/sandboxes/list/feature-flag.server.ts @@ -22,6 +22,6 @@ export async function isNewSandboxListEnabled(teamSlug: string) { id: authContext.user.id, email: authContext.user.email ?? undefined, }, - team: teamId ? { id: teamId, slug: teamSlug } : undefined, + team: teamId ? { id: teamId } : undefined, }) } diff --git a/tests/unit/feature-flags.test.ts b/tests/unit/feature-flags.test.ts index ea554d398..5c761e36f 100644 --- a/tests/unit/feature-flags.test.ts +++ b/tests/unit/feature-flags.test.ts @@ -11,7 +11,6 @@ const context = { }, team: { id: 'team-id', - slug: 'team-slug', name: 'Team Name', }, } satisfies FeatureFlagContext @@ -192,7 +191,6 @@ describe('createOpenFeatureEvaluationContext', () => { team: { targetingKey: 'team-id', name: 'Team Name', - slug: 'team-slug', }, }) }) From 17aae60a350f828e9d101650ee248b7878f368cd Mon Sep 17 00:00:00 2001 From: matthewlouisbrockman <18491105+matthewlouisbrockman@users.noreply.github.com> Date: Thu, 16 Jul 2026 22:53:24 +0000 Subject: [PATCH 2/2] style: apply biome formatting --- src/app/dashboard/[teamSlug]/usage/page.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/dashboard/[teamSlug]/usage/page.tsx b/src/app/dashboard/[teamSlug]/usage/page.tsx index 444fa75b5..383c1ff02 100644 --- a/src/app/dashboard/[teamSlug]/usage/page.tsx +++ b/src/app/dashboard/[teamSlug]/usage/page.tsx @@ -34,8 +34,7 @@ export default async function UsagePage({ id: authContext.user.id, email: authContext.user.email ?? undefined, }, - team: - teamId.ok && teamId.data ? { id: teamId.data } : undefined, + team: teamId.ok && teamId.data ? { id: teamId.data } : undefined, }) const result = await getUsage({ teamSlug })