fix(studio): convert tableCreateGeneratePolicies flag to multivariate for PostHog experimentation (#41706)

Co-authored-by: pamelachia <26612111+pamelachia@users.noreply.github.com>
This commit is contained in:
Sean Oliverandpamelachia authored and GitHub committed 2026-01-04 20:12:57 -08:00
1 parent a6ef6c8a75
commit 1077b50a5b
3 files changed
+26 -12

No files matched your search

@@ -26,6 +26,7 @@ import { RetrieveTableResult } from 'data/tables/table-retrieve-query'
import { getTables } from 'data/tables/tables-query'
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
import { isValidExperimentVariant } from 'hooks/misc/useTableCreateGeneratePolicies'
import { useConfirmOnClose, type ConfirmOnCloseModalProps } from 'hooks/ui/useConfirmOnClose'
import { usePHFlag } from 'hooks/ui/useFlag'
import { useUrlState } from 'hooks/ui/useUrlState'
@@ -140,7 +141,7 @@ export const SidePanelEditor = ({
const { data: project } = useSelectedProjectQuery()
const { data: org } = useSelectedOrganizationQuery()
const getImpersonatedRoleState = useGetImpersonatedRoleState()
const generatePoliciesFlag = usePHFlag<boolean>('tableCreateGeneratePolicies')
const generatePoliciesFlag = usePHFlag<string>('tableCreateGeneratePolicies')
const [isEdited, setIsEdited] = useState<boolean>(false)
@@ -551,10 +552,10 @@ export const SidePanelEditor = ({
}
// Track experiment conversion if user is in the experiment
if (generatePoliciesFlag !== undefined) {
if (isValidExperimentVariant(generatePoliciesFlag)) {
track('table_create_generate_policies_experiment_converted', {
experiment_id: 'tableCreateGeneratePolicies',
variant: generatePoliciesFlag ? 'treatment' : 'control',
variant: generatePoliciesFlag,
has_rls_enabled: isRLSEnabled,
has_rls_policies: generatedPolicies.length > 0,
has_generated_policies: generatedPolicies.length > 0,
@@ -8,6 +8,19 @@ import { useTrack } from 'lib/telemetry/track'
dayjs.extend(utc)
export type TableCreateGeneratePoliciesVariant = 'control' | 'variation'
const VALID_VARIANTS: TableCreateGeneratePoliciesVariant[] = ['control', 'variation']
export function isValidExperimentVariant(
value: unknown
): value is TableCreateGeneratePoliciesVariant {
return (
typeof value === 'string' &&
VALID_VARIANTS.includes(value as TableCreateGeneratePoliciesVariant)
)
}
interface UseTableCreateGeneratePoliciesOptions {
/**
* Whether this is a new table being created
@@ -38,12 +51,12 @@ export function useTableCreateGeneratePolicies({
projectInsertedAt,
}: UseTableCreateGeneratePoliciesOptions): UseTableCreateGeneratePoliciesResult {
const track = useTrack()
const tableCreateGeneratePoliciesFlag = usePHFlag<boolean>('tableCreateGeneratePolicies')
const tableCreateGeneratePoliciesFlag = usePHFlag<string>('tableCreateGeneratePolicies')
const hasTrackedExposure = useRef(false)
const enabled = useMemo(() => {
if (!IS_PLATFORM) return false
if (!tableCreateGeneratePoliciesFlag) return false
if (tableCreateGeneratePoliciesFlag !== 'variation') return false
return true
}, [tableCreateGeneratePoliciesFlag])
@@ -51,7 +64,7 @@ export function useTableCreateGeneratePolicies({
if (!IS_PLATFORM) return
if (hasTrackedExposure.current) return
if (!isNewRecord) return
if (tableCreateGeneratePoliciesFlag === undefined) return
if (!isValidExperimentVariant(tableCreateGeneratePoliciesFlag)) return
if (!projectInsertedAt) return
try {
@@ -61,7 +74,7 @@ export function useTableCreateGeneratePolicies({
const daysSinceCreation = dayjs.utc().diff(insertedDate, 'day')
track('table_create_generate_policies_experiment_exposed', {
experiment_id: 'tableCreateGeneratePolicies',
variant: tableCreateGeneratePoliciesFlag ? 'treatment' : 'control',
variant: tableCreateGeneratePoliciesFlag,
days_since_project_creation: daysSinceCreation,
})
hasTrackedExposure.current = true
+5 -5
View File
@@ -2046,9 +2046,9 @@ export interface TableCreateGeneratePoliciesExperimentConvertedEvent {
*/
experiment_id: 'tableCreateGeneratePolicies'
/**
* Experiment variant: 'control' (feature disabled) or 'treatment' (feature enabled)
* Experiment variant: 'control' (feature disabled) or 'variation' (feature enabled)
*/
variant: 'control' | 'treatment'
variant: 'control' | 'variation'
/**
* Whether RLS was enabled on the table
*/
@@ -2058,7 +2058,7 @@ export interface TableCreateGeneratePoliciesExperimentConvertedEvent {
*/
has_rls_policies: boolean
/**
* Whether AI-generated policies were used (only possible in treatment)
* Whether AI-generated policies were used (only possible in variation)
*/
has_generated_policies: boolean
}
@@ -2080,9 +2080,9 @@ export interface TableCreateGeneratePoliciesExperimentExposedEvent {
*/
experiment_id: 'tableCreateGeneratePolicies'
/**
* Experiment variant: 'control' (feature disabled) or 'treatment' (feature enabled)
* Experiment variant: 'control' (feature disabled) or 'variation' (feature enabled)
*/
variant: 'control' | 'treatment'
variant: 'control' | 'variation'
/**
* Days since project creation (to segment by new user cohorts)
*/