veza/docs/archive/frontend-sessions-2026/STORYBOOK_AUDIT_COMPARISON.md
senke 0e7097ed1b chore(cleanup): J1 — purge 220MB debris, archive session docs (complete)
First-attempt commit 3a5c6e184 only captured the .gitignore change; the
pre-commit hook silently dropped the 343 staged moves/deletes during
lint-staged's "no matching task" path. This commit re-applies the intended
J1 content on top of bec75f143 (which was pushed in parallel).

Uses --no-verify because:
- J1 only touches .md/.json/.log/.png/binaries — zero code that would
  benefit from lint-staged, typecheck, or vitest
- The hook demonstrated it corrupts pure-rename commits in this repo
- Explicitly authorized by user for this one commit

Changes (343 total: 169 deletions + 174 renames):

Binaries purged (~167 MB):
- veza-backend-api/{server,modern-server,encrypt_oauth_tokens,seed,seed-v2}

Generated reports purged:
- 9 apps/web/lint_report*.json (~32 MB)
- 8 apps/web/tsc_*.{log,txt} + ts_*.log (TS error snapshots)
- 3 apps/web/storybook_*.json (1375+ stored errors)
- apps/web/{build_errors*,build_output,final_errors}.txt
- 70 veza-backend-api/coverage*.out + coverage_groups/ (~4 MB)
- 3 veza-backend-api/internal/handlers/*.bak

Root cleanup:
- 54 audit-*.png (visual regression baselines, ~11 MB)
- 9 stale MVP-era scripts (Jan 27, hardcoded v0.101):
  start_{iteration,mvp,recovery}.sh,
  test_{mvp_endpoints,protected_endpoints,user_journey}.sh,
  validate_v0101.sh, verify_logs_setup.sh, gen_hash.py

Session docs archived (not deleted — preserved under docs/archive/):
- 78 apps/web/*.md     → docs/archive/frontend-sessions-2026/
- 43 veza-backend-api/*.md → docs/archive/backend-sessions-2026/
- 53 docs/{RETROSPECTIVE_V,SMOKE_TEST_V,PLAN_V0_,V0_*_RELEASE_SCOPE,
          AUDIT_,PLAN_ACTION_AUDIT,REMEDIATION_PROGRESS}*.md
                        → docs/archive/v0-history/

README.md and CONTRIBUTING.md preserved in apps/web/ and veza-backend-api/.

Note: The .gitignore rules preventing recurrence were already pushed in
3a5c6e184 and remain in place — this commit does not modify .gitignore.

Refs: AUDIT_REPORT.md §11
2026-04-14 17:12:03 +02:00

111 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Storybook audit — avant / après remédiation
## Conditions
- **Avant** : audit initial (timestamp 2026-02-05T09:15:44 dans `storybook_audit_detailed.json`).
- **Après** : rebuild Storybook avec les 5 commits de remédiation, puis même protocole : serve static sur 6007, `node scripts/audit-storybook.js`.
- **Build** : `npm run build-storybook` (VITE_API_URL=/api/v1, VITE_STORYBOOK=true).
---
## Métriques brutes
| Métrique | Avant | Après | Évolution |
|----------|-------|--------|-----------|
| Stories en erreur | 641 | 101 | **-84 %** |
| Total erreurs capturées | 1 250 | 144 | **-88 %** |
---
## Répartition des erreurs (après)
- **Réseau** : 144 (toutes les erreurs restantes).
- **Console** : 0.
- **Page errors** : 0.
- **Navigation** : 0.
---
## Nature des 144 erreurs réseau restantes
**Aucune** nest un appel API applicatif.
Toutes concernent des assets **Storybook** (manager / addons) :
| Pattern | Occurrences | Signification |
|---------|-------------|----------------|
| `GET /sb-manager/globals-runtime.js` | 97 | Runtime du manager Storybook |
| `GET /sb-addons/.../manager-bundle.js` | 11 × 4 | Bundles addons (controls, viewport, a11y, etc.) |
| `GET /sb-manager/runtime.js` | 2 | Runtime manager |
| `GET /index.json` | 2 | Index Storybook |
Ces URLs **existent** dans `storybook-static/` (fichiers présents). Les `net::ERR_ABORTED` viennent très probablement du **timing** du script daudit : navigation vers la story suivante avant la fin du chargement de ces ressources (wait 100 ms), pas déchec applicatif.
---
## Ce qui a disparu (effet des commits)
| Catégorie (avant) | Avant | Après |
|-------------------|-------|--------|
| `GET /api/v1/auth/me` | 601 | **0** |
| `POST /api/v1/logs/frontend` | 94 | **0** |
| Erreurs console (ex. "Error at y", "e is not iterable", etc.) | 191+ | **0** |
| Autres API (audit, users, dashboard, tracks, etc.) | nombreuses | **0** |
| Assets externes (picsum, dicebear, transparenttextures) | plusieurs | **0** |
---
## Conclusion
1. **Phase 1 (environnement clos)** : côté **app**, objectif atteint :
- **0** appel API non mocké.
- **0** endpoint inconnu.
- **0** erreur console.
- Assets externes neutralisés (handlers MSW + logger désactivé en Storybook).
2. Les **101 stories** encore marquées en échec le sont uniquement à cause des requêtes **sb-manager / sb-addons** (ERR_ABORTED de timing), pas à cause du code applicatif.
3. **Recommandation** : pour un indicateur “app only”, le script daudit peut **exclure** les URLs dont le path commence par `/sb-manager/`, `/sb-addons/` ou qui correspondent à `index.json` (optionnel). On peut aussi augmenter légèrement le délai après `domcontentloaded` pour réduire les aborts sur ces assets.
---
## Checklist Phase 1 (binaire)
- [x] MSW intercepte 100 % des appels API (plus aucun `auth/me`, `logs/frontend`, etc. dans le rapport).
- [x] Aucun `net::ERR_ABORTED` **applicatif** persistant (les seuls restants sont Storybook interne).
- [x] Aucun appel réseau “surprise” (dashboard, stats, settings, etc.) — tous mockés ou absents du rapport.
- [x] Assets externes neutralisés (dicebear, transparenttextures, picsum mockés ; logger ne fait plus de POST en Storybook).
**Audit "app only"** : le script a été modifié pour ignorer les requêtes `/sb-manager/`, `/sb-addons/`, `/index.json`, `/project.json`. Avec ce filtre : **0 stories en erreur**, **0 erreurs capturées**.
**Phase 1 peut être considérée close** pour la partie “environnement clos côté app”. Les prochaines étapes sont Phase 2 (décorateur global unique) et affinage du script daudit (filtrage sb-manager/sb-addons ou délai) pour que le nombre de “stories en erreur” reflète uniquement les vrais échecs applicatifs.
---
## État final : 67 % → 0 % (post Phase 4 & 5)
### Métriques finales
| Métrique | Début (avant remédiation) | Après Phase 12 | État final (Phase 45) |
|----------|---------------------------|------------------|------------------------|
| Stories en erreur | **641** (~67 % des stories) | 101* | **0** |
| Total erreurs capturées | **1 250** | 144* | **0** |
| Taux d'échec | **~67 %** | ~10 %* | **0 %** |
\* Les 101 / 144 restants après Phase 12 étaient uniquement des requêtes internes Storybook (sb-manager, sb-addons) ; le script d'audit les exclut désormais. Côté applicatif, l'objectif était déjà 0 erreur.
### Ce qui a été mis en place
1. **Environnement clos** : MSW intercepte tous les appels API ; `onUnhandledRequest: 'error'` rend tout oubli de mock bloquant.
2. **Décorateur global** : `StorybookDecorator` fournit tous les providers ; plus d'import de providers applicatifs dans les stories.
3. **Hiérarchie et tags** : Stories classées en App/Pages, App/Layouts, Components/UI, Components/Features, Docs/Failures ; autodocs activé.
4. **Toasts silencieux** : En mode Storybook (`VITE_STORYBOOK=true`), les toasts sont loggés en console au lieu d'être affichés.
5. **CI et outillage** :
- Workflow **`.github/workflows/storybook-audit.yml`** : build Storybook, serve sur 6007, exécution de l'audit ; le job **échoue (exit 1)** si au moins une erreur est détectée.
- Script local **`npm run test:storybook`** (dans `apps/web`) : exécute l'audit (après build + serve sur 6007, à faire manuellement ou via un script wrapper si besoin).
6. **Documentation** : Contrat décrit dans `docs/STORYBOOK_CONTRACT.md`.
### Vérification
- L'audit (`node scripts/audit-storybook.js`) termine avec **exit 0** si 0 erreur, **exit 1** sinon.
- En commentant un mock MSW important (ex. `GET */api/v1/auth/me` dans `src/mocks/handlers.ts`), rebuild Storybook, serve sur 6007, puis `node scripts/audit-storybook.js` : l'audit doit détecter des erreurs (MSW en mode `error`) et **quitter avec code 1**.