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
| Endpoint | Method | Description |
|---|
/api/admin/users/{user_id}/flag-overrides | GET | List overrides for a user |
/api/admin/users/{user_id}/flag-overrides | POST | Create override for user |
/api/admin/users/{user_id}/flag-overrides/{flag_name} | GET | Get specific override |
/api/admin/users/{user_id}/flag-overrides/{flag_name} | PATCH | Update override |
/api/admin/users/{user_id}/flag-overrides/{flag_name} | DELETE | Remove override |
/api/admin/feature-flags/{flag_name}/user-overrides | GET | List all user overrides for a flag |
/api/flags/me | GET | Get 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
- User-specific override (if enabled and not expired)
- User targeting rules (from Phase 2)
- Scheduled variant changes (from Phase 3)
- 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
| Action | Admin | Viewer |
|---|
| List user overrides | Yes | Yes |
| Create override | Yes | No |
| Update override | Yes | No |
| Delete override | Yes | No |
| View own overrides | Yes | Yes |
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
| Aspect | Scheduled Changes | User Overrides |
|---|
| Scope | All users | Individual user |
| Timing | Future date/time | Immediate (with optional expiry) |
| Purpose | Gradual rollout | Testing/debugging |
| Location | Feature Flags > Scheduled Changes tab | Feature Flags > User Overrides tab |
| Icon | Calendar | User badge |
Migration Path
- Create database migration
- Implement service layer
- Add API endpoints with tests
- Build admin UI components
- Update SDK client
- Update documentation
Dependencies
- Phase 2: Targeting rules (completed)
- Phase 3: Real-time updates (completed)
- User management system (existing)
Estimated Effort
| Component | Complexity |
|---|
| Database schema | Low |
| Service layer | Medium |
| API endpoints | Medium |
| Admin UI | Medium |
| SDK updates | Low |
| Tests | Medium |
| Documentation | Low |
Success Criteria