feat: add per-user feature flag infrastructure (#788)
* feat: add transcoder test matrix with CI
- test-matrix.py: tests 5 input formats (AIFF, FLAC, WAV, MP3, M4A) x 3 output formats (MP3, M4A, WAV)
- CI workflow runs on PRs touching transcoder or test scripts
- uses uv inline script dependencies for portability
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add per-user feature flag infrastructure
adds database-level feature flags for gradual feature rollout:
- `enabled_flags` column on artists table (string array)
- `has_flag()` helper in `_internal/feature_flags.py`
- flags exposed via `/auth/me` response
- admin script for enabling/disabling flags per user
this enables hiding features from users until explicitly enabled,
supporting controlled rollout of experimental features like lossless uploads.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: move feature flags to dedicated table
instead of storing flags on the Artist model (which conflates "artist"
with "user"), use a separate feature_flags table with a foreign key to
artists.did.
- new FeatureFlag model with user_did + flag unique constraint
- async helper functions: has_flag, get_user_flags, enable_flag, disable_flag
- /auth/me fetches flags from dedicated table
- admin script updated to use new table-based approach
- migration creates feature_flags table
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: add feature flags documentation
explains the feature flag system: database schema, checking flags in
backend/frontend code, admin script usage, and rollout strategy.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
authored by