97 lines
3.9 KiB
Markdown
97 lines
3.9 KiB
Markdown
|
|
# Algorithme de Découverte Veza — Documentation Auditable
|
||
|
|
|
||
|
|
**Version** : 1.0.0-rc1
|
||
|
|
**Date** : 2026-03-13
|
||
|
|
**Référence** : ORIGIN_FEATURES_REGISTRY.md §30, ORIGIN_BUSINESS_LOGIC.md
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Principes fondamentaux
|
||
|
|
|
||
|
|
1. **Chronologique, pas algorithmique** — Le feed affiche les contenus par date de création, du plus récent au plus ancien
|
||
|
|
2. **Tags et genres déclaratifs** — Les créateurs choisissent leurs genres (max 3) et tags (max 10)
|
||
|
|
3. **Pas de classement par popularité** — play_count et like_count ne sont JAMAIS utilisés dans le tri
|
||
|
|
4. **Artistes émergents = artistes établis** — Un artiste avec 0 écoute a la même visibilité qu'un artiste avec 1M d'écoutes
|
||
|
|
5. **Auditable et testable** — Des tests automatisés vérifient l'absence de biais
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Mécanismes de découverte
|
||
|
|
|
||
|
|
### 1. Feed chronologique (`GET /api/v1/feed`)
|
||
|
|
- **Tri** : `ORDER BY tracks.created_at DESC, tracks.id DESC`
|
||
|
|
- **Source** : Pistes des artistes suivis par l'utilisateur
|
||
|
|
- **Pagination** : Curseur keyset (created_at, id)
|
||
|
|
- **Fichier** : `veza-backend-api/internal/core/feed/service.go:77`
|
||
|
|
|
||
|
|
### 2. Découverte par genre (`GET /api/v1/discover/genre/:genre`)
|
||
|
|
- **Tri** : `ORDER BY tracks.created_at DESC, tracks.id DESC`
|
||
|
|
- **Source** : Pistes associées au genre déclaré
|
||
|
|
- **Fichier** : `veza-backend-api/internal/core/discover/service.go:193`
|
||
|
|
|
||
|
|
### 3. Découverte par tag (`GET /api/v1/discover/tag/:tag`)
|
||
|
|
- **Tri** : `ORDER BY tracks.created_at DESC, tracks.id DESC`
|
||
|
|
- **Source** : Pistes associées au tag déclaré
|
||
|
|
- **Fichier** : `veza-backend-api/internal/core/discover/service.go:251`
|
||
|
|
|
||
|
|
### 4. Playlists éditoriales (`GET /api/v1/discover/playlists/editorial`)
|
||
|
|
- **Tri** : `ORDER BY playlists.created_at DESC`
|
||
|
|
- **Source** : Playlists curatorées manuellement (humain, pas algorithme)
|
||
|
|
- **Fichier** : `veza-backend-api/internal/core/discover/service.go:381`
|
||
|
|
|
||
|
|
### 5. Recherche (`GET /api/v1/search`)
|
||
|
|
- **Moteur** : Elasticsearch fulltext
|
||
|
|
- **Critères** : Correspondance textuelle (titre, artiste, tags)
|
||
|
|
- **Pas de boost par popularité**
|
||
|
|
|
||
|
|
### 6. Trending hashtags (`GET /api/v1/social/trending`)
|
||
|
|
- Tendances de **hashtags de conversation** (sujets de discussion)
|
||
|
|
- PAS de tendances de pistes musicales
|
||
|
|
- **Fichier** : `veza-backend-api/internal/core/social/trending_service.go`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Ce que l'algorithme ne fait PAS
|
||
|
|
|
||
|
|
| Interdit | Raison |
|
||
|
|
|----------|--------|
|
||
|
|
| Tri par play_count | Biais de popularité |
|
||
|
|
| Tri par like_count | Biais de popularité |
|
||
|
|
| Collaborative filtering | Profilage comportemental |
|
||
|
|
| Content-based filtering ML | IA/ML interdit |
|
||
|
|
| "Trending" basé sur les écoutes | Biais de popularité |
|
||
|
|
| "Featured" basé sur l'engagement | Dark pattern |
|
||
|
|
| Optimisation pour la rétention | Manipulation |
|
||
|
|
| A/B testing sur le tri | Optimisation engagement |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Métriques de popularité
|
||
|
|
|
||
|
|
- `play_count` et `like_count` existent en base pour les **analytics créateur privés**
|
||
|
|
- Ces champs portent le tag `json:"-"` → **jamais sérialisés dans les réponses API publiques**
|
||
|
|
- Le frontend n'affiche ces métriques **qu'au créateur** de la piste (dans son tableau de bord)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Tests automatisés
|
||
|
|
|
||
|
|
Fichier : `veza-backend-api/internal/core/discover/ethical_bias_test.go`
|
||
|
|
|
||
|
|
| Test | Vérifie |
|
||
|
|
|------|---------|
|
||
|
|
| `TestDiscovery_NoPlayCountBias_GenreBrowse` | Track 0 plays (récent) apparaît avant track 1M plays (ancien) |
|
||
|
|
| `TestDiscovery_NoPlayCountBias_TagBrowse` | Même vérification pour la découverte par tag |
|
||
|
|
| `TestDiscovery_EmergingArtistVisibility` | Artiste émergent pas démotivé par la popularité |
|
||
|
|
| `TestDiscovery_MetricsNotExposedInJSON` | play_count et like_count absents du JSON sérialisé |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Audit
|
||
|
|
|
||
|
|
Ce document, combiné aux tests automatisés et au code source, permet un **audit indépendant complet** de l'algorithme de découverte. Toutes les clauses ORDER BY du backend sont vérifiables dans les fichiers source référencés.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Conforme à ORIGIN_FEATURES_REGISTRY.md §30 : "L'algorithme est documenté, explicable, et auditable"*
|