- 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
63 lines
2.5 KiB
Markdown
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
|