Docs / Raw

Feature Flags Phase 4 - User Overrides

Sourced from docs/feature-flags/PHASE_4_USER_OVERRIDES_PLAN.md

Edit on GitHub

Feature Flags Phase 4: User Overrides Implementation Plan

Overview

Phase 4 extends the feature flags system with per-user overrides, allowing administrators to:

  • Set specific flag values for individual users
  • Test new features with select beta users before broader rollout
  • Debug issues by forcing specific flag states for affected users
  • Implement personalized feature experiences

Implementation Tasks

1. Database Schema

New Table: user_flag_overrides

CREATE TABLE user_flag_overrides ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, flag_name VARCHAR(255) NOT NULL, override_value JSONB NOT NULL, enabled BOOLEAN DEFAULT true, reason VARCHAR(500), created_by VARCHAR(255) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), expires_at TIMESTAMP WITH TIME ZONE, UNIQUE(user_id, flag_name) ); CREATE INDEX idx_user_flag_overrides_user ON user_flag_overrides(user_id); CREATE INDEX idx_user_flag_overrides_flag ON user_flag_overrides(flag_name); CREATE INDEX idx_user_flag_overrides_expires ON user_flag_overrides(expires_at) WHERE expires_at IS NOT NULL;

2. Backend API Endpoints

EndpointMethodDescription
/api/admin/users/{user_id}/flag-overridesGETList overrides for a user
/api/admin/users/{user_id}/flag-overridesPOSTCreate override for user
/api/admin/users/{user_id}/flag-overrides/{flag_name}GETGet specific override
/api/admin/users/{user_id}/flag-overrides/{flag_name}PATCHUpdate override
/api/admin/users/{user_id}/flag-overrides/{flag_name}DELETERemove override
/api/admin/feature-flags/{flag_name}/user-overridesGETList all user overrides for a flag
/api/flags/meGETGet current user's flag values (includes overrides)

3. Service Layer Updates

UserFlagOverrideService

class UserFlagOverrideService: async def get_user_overrides(self, user_id: str) -> Dict[str, Any] async def set_override(self, user_id: str, flag_name: str, value: Any, **kwargs) -> Override async def remove_override(self, user_id: str, flag_name: str) -> bool async def get_flag_value_for_user(self, flag_name: str, user_id: str) -> Any async def cleanup_expired_overrides(self) -> int

Flag Resolution Priority

  1. User-specific override (if enabled and not expired)
  2. User targeting rules (from Phase 2)
  3. Scheduled variant changes (from Phase 3)
  4. Default flag value

4. Admin UI Components

UserOverridesPanel

  • List view of all users with overrides
  • Search/filter by user email or flag name
  • Bulk enable/disable overrides

UserOverrideEditor

  • Select user (autocomplete search)
  • Select flag (dropdown with current value shown)
  • Set override value (type-aware input)
  • Optional expiration date
  • Reason field for audit

Integration with Existing UI

  • Add "User Overrides" tab in Feature Flags page
  • Add override indicator on user management page
  • Show override count badge on flags with user overrides

5. SDK Client Methods

interface FlagClient { // Existing methods getFlag(flagName: string): FlagValue; // New methods for Phase 4 getUserFlags(): Record<string, FlagValue>; hasOverride(flagName: string): boolean; getOverrideInfo(flagName: string): OverrideInfo | null; }

6. RBAC Permissions

ActionAdminViewer
List user overridesYesYes
Create overrideYesNo
Update overrideYesNo
Delete overrideYesNo
View own overridesYesYes

7. Monitoring & Metrics

# New Prometheus metrics user_flag_overrides_total = Counter( 'voiceassist_user_flag_overrides_total', 'Total user flag overrides', ['flag_name', 'action'] # action: created, updated, deleted ) user_flag_overrides_active = Gauge( 'voiceassist_user_flag_overrides_active', 'Currently active user overrides', ['flag_name'] )

8. Testing Plan

Unit Tests

  • Override resolution priority
  • Expiration handling
  • Concurrent override updates
  • Invalid user/flag handling

Integration Tests

  • RBAC enforcement (similar to scheduled changes tests)
  • Override persistence across sessions
  • Real-time propagation of override changes
  • Cleanup of expired overrides

9. Documentation Updates

  • Update Admin Guide with User Overrides section
  • Add API reference for new endpoints
  • Update SDK documentation
  • Add troubleshooting guide for override conflicts

UI/UX Distinction: Scheduled Changes vs User Overrides

AspectScheduled ChangesUser Overrides
ScopeAll usersIndividual user
TimingFuture date/timeImmediate (with optional expiry)
PurposeGradual rolloutTesting/debugging
LocationFeature Flags > Scheduled Changes tabFeature Flags > User Overrides tab
IconCalendarUser badge

Migration Path

  1. Create database migration
  2. Implement service layer
  3. Add API endpoints with tests
  4. Build admin UI components
  5. Update SDK client
  6. Update documentation

Dependencies

  • Phase 2: Targeting rules (completed)
  • Phase 3: Real-time updates (completed)
  • User management system (existing)

Estimated Effort

ComponentComplexity
Database schemaLow
Service layerMedium
API endpointsMedium
Admin UIMedium
SDK updatesLow
TestsMedium
DocumentationLow

Success Criteria

  • User overrides can be created/updated/deleted via API
  • Admin UI provides intuitive override management
  • Override resolution follows correct priority
  • Expired overrides are automatically cleaned up
  • Real-time updates propagate override changes
  • All RBAC permissions enforced
  • 90%+ test coverage for new code
Beginning of guide
End of guide