First-attempt commit3a5c6e184only 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 ofbec75f143(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 in3a5c6e184and remain in place — this commit does not modify .gitignore. Refs: AUDIT_REPORT.md §11
5.7 KiB
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 n’est 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 d’audit : 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
-
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).
-
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.
-
Recommandation : pour un indicateur “app only”, le script d’audit 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èsdomcontentloadedpour réduire les aborts sur ces assets.
Checklist Phase 1 (binaire)
- MSW intercepte 100 % des appels API (plus aucun
auth/me,logs/frontend, etc. dans le rapport). - Aucun
net::ERR_ABORTEDapplicatif persistant (les seuls restants sont Storybook interne). - Aucun appel réseau “surprise” (dashboard, stats, settings, etc.) — tous mockés ou absents du rapport.
- 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 d’audit (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 1–2 | État final (Phase 4–5) |
|---|---|---|---|
| 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 1–2 é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
- Environnement clos : MSW intercepte tous les appels API ;
onUnhandledRequest: 'error'rend tout oubli de mock bloquant. - Décorateur global :
StorybookDecoratorfournit tous les providers ; plus d'import de providers applicatifs dans les stories. - Hiérarchie et tags : Stories classées en App/Pages, App/Layouts, Components/UI, Components/Features, Docs/Failures ; autodocs activé.
- Toasts silencieux : En mode Storybook (
VITE_STORYBOOK=true), les toasts sont loggés en console au lieu d'être affichés. - 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(dansapps/web) : exécute l'audit (après build + serve sur 6007, à faire manuellement ou via un script wrapper si besoin).
- Workflow
- 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/medanssrc/mocks/handlers.ts), rebuild Storybook, serve sur 6007, puisnode scripts/audit-storybook.js: l'audit doit détecter des erreurs (MSW en modeerror) et quitter avec code 1.