docling-studio/docs/audit/reports/release-0.3.1/12-performance.md
Pier-Jean Malandrino f6030bb2f1 fix(docs): resolve mkdocs strict mode build failure (#145)
- Add all process docs to mkdocs.yml nav (15 missing pages)
- Replace relative links to files outside docs/ with absolute GitHub URLs
- Add docs/audit/ directory (templates + reports)
- Add validation config to allow unlisted audit reports as info-level
2026-04-10 15:11:29 +02:00

63 lines
2.5 KiB
Markdown

# Rapport d'audit : Performance & Ressources
**Release** : 0.3.1
**Date** : 2026-04-10
**Auditeur** : claude-code
---
## Score de compliance
| Metrique | Valeur |
|----------|--------|
| Items conformes | 10 / 13 |
| Score | 86 / 100 |
| Ecarts CRITICAL | 0 |
| Ecarts MAJOR | 0 |
| Ecarts MINOR | 3 |
| Ecarts INFO | 0 |
---
## Ecarts constates
### [MIN] Pas de mecanisme d'annulation/debounce sur les requetes API frontend
- **Localisation** : `frontend/src/shared/api/http.ts`, `frontend/src/features/analysis/store.ts`
- **Constat** : `apiFetch` utilise `fetch()` brut sans support `AbortController`. Les requetes de polling peuvent se chevaucher.
- **Regle violee** : 12.2.3 — Les requetes API ont un mecanisme d'annulation ou de debounce
- **Remediation** : Ajouter le support `AbortController` dans `apiFetch`.
### [MIN] Logo de 879 KB non optimise
- **Localisation** : `frontend/src/assets/logo.png`
- **Constat** : Le logo fait 879 KB, excessif pour une image de logo (devrait etre < 50 KB).
- **Regle violee** : 12.2.5 Les assets lourds sont optimises
- **Remediation** : Convertir en SVG ou WebP, ou compresser significativement.
### [MIN] Nginx sans configuration de cache pour les fichiers statiques
- **Localisation** : `nginx.conf`, `frontend/nginx.conf`
- **Constat** : Aucune directive `expires`, `Cache-Control` ou `add_header Cache-Control` pour les assets statiques. Vite produit des noms hashes qui sont safe a cacher agressivement.
- **Regle violee** : 12.3.1 Nginx a une configuration de cache pour les fichiers statiques
- **Remediation** : Ajouter `location ~* \.(js|css|png|svg|ico|woff2?)$ { expires 1y; add_header Cache-Control "public, immutable"; }`
---
## Points positifs
- Zero requete N+1 : queries optimisees avec JOIN, LIMIT/OFFSET
- Fichiers uploades correctement geres (persistants, nettoyes a la suppression avec protection path-traversal)
- `MAX_CONCURRENT_ANALYSES` configure et respecte via semaphore asyncio
- Conversion Docling correctement deplacee hors event loop via `asyncio.to_thread()`
- Upload en streaming (chunks de 64 KB)
- Watchers Vue automatiquement nettoyes par le lifecycle des composants
- Event listeners supprimes dans `onBeforeUnmount` (mousemove, mouseup, ResizeObserver)
- Polling avec `stopPolling()` qui clear interval et timeout
- `computed` utilises correctement plutot que des fonctions dans les templates
- Reponses API de taille raisonnable (`has_document_json: bool` au lieu du blob complet)
- Health check leger (`SELECT 1`)
---
## Verdict partiel : GO