designwithai-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +153 -0
  2. package/dist/connectors.js +76 -0
  3. package/dist/decisions.js +67 -0
  4. package/dist/embeddings.js +98 -0
  5. package/dist/evals.js +172 -0
  6. package/dist/finding-identity.js +229 -0
  7. package/dist/handbook.js +98 -0
  8. package/dist/paths.js +62 -0
  9. package/dist/profile.js +79 -0
  10. package/dist/reviews.js +99 -0
  11. package/dist/server.js +1136 -0
  12. package/dist/skills.js +57 -0
  13. package/dist/state.js +48 -0
  14. package/handbook-embeddings.json +1 -0
  15. package/package.json +46 -0
  16. package/skills/EVALS.md +122 -0
  17. package/skills/README.md +59 -0
  18. package/skills/_shared/delivery-modes.md +12 -0
  19. package/skills/_shared/execution-contract.md +43 -0
  20. package/skills/_shared/issue-schema.md +25 -0
  21. package/skills/_shared/severity-model.md +16 -0
  22. package/skills/analyze-figma/evals/cases.json +140 -0
  23. package/skills/analyze-url/evals/cases.json +136 -0
  24. package/skills/better-accessibility/SKILL.md +141 -0
  25. package/skills/better-accessibility/evals/cases.json +83 -0
  26. package/skills/better-components/SKILL.md +125 -0
  27. package/skills/better-components/evals/cases.json +77 -0
  28. package/skills/better-consistency/SKILL.md +125 -0
  29. package/skills/better-consistency/evals/cases.json +77 -0
  30. package/skills/better-forms/SKILL.md +135 -0
  31. package/skills/better-forms/evals/cases.json +78 -0
  32. package/skills/better-interface/SKILL.md +143 -0
  33. package/skills/better-interface/evals/cases.json +80 -0
  34. package/skills/better-layout/SKILL.md +132 -0
  35. package/skills/better-layout/evals/cases.json +81 -0
  36. package/skills/better-navigation/SKILL.md +170 -0
  37. package/skills/better-navigation/evals/cases.json +131 -0
  38. package/skills/better-performance/SKILL.md +195 -0
  39. package/skills/better-performance/evals/cases.json +114 -0
  40. package/skills/better-responsive/SKILL.md +123 -0
  41. package/skills/better-responsive/evals/cases.json +77 -0
  42. package/skills/better-states/SKILL.md +129 -0
  43. package/skills/better-states/evals/cases.json +78 -0
  44. package/skills/better-writing/SKILL.md +138 -0
  45. package/skills/better-writing/evals/cases.json +77 -0
  46. package/skills/review-ai-product/SKILL.md +231 -0
  47. package/skills/review-ai-product/evals/cases.json +120 -0
  48. package/skills/review-data-security/SKILL.md +210 -0
  49. package/skills/review-data-security/evals/cases.json +138 -0
  50. package/skills/review-figma-hygiene/SKILL.md +186 -0
  51. package/skills/review-figma-hygiene/evals/cases.json +158 -0
@@ -0,0 +1,195 @@
1
+ ---
2
+ name: better-performance
3
+ description: Juge pourquoi un produit est lent — poids et découpage des bundles, images, listes longues, cascades de requêtes, cache et re-rendus évitables, coût du chargement perçu. Grille chiffrée quand un seuil existe, refus quand il n'y a ni code ni mesure.
4
+ version: 1.0
5
+ category: performance-expert
6
+ role: Performance expert
7
+ execution_mode: performance-audit
8
+ supports: [ai-builder, traditional, hybrid]
9
+ inputs: [code, bundle-report, traces, measurements, url]
10
+ outputs: [measurement-table, bottleneck-map, risk-register, correction-plan]
11
+ invoked_by: [review-ai-product, better-interface]
12
+ relays: [better-states, better-navigation]
13
+ ---
14
+
15
+ # /better-performance
16
+
17
+ **Rôle** : Performance expert · **Mode par défaut** : audit de performance.
18
+
19
+ Voir le [contrat commun](../_shared/execution-contract.md), le [schéma de problème](../_shared/issue-schema.md) (préfixe `PERF`), le [modèle de sévérité](../_shared/severity-model.md) et la [matrice des modes](../_shared/delivery-modes.md).
20
+
21
+ ## Mission
22
+
23
+ Répondre à « pourquoi c'est lent » par une **mesure ou une structure fautive localisée**. Jamais par une impression. C'est la grille la plus objectivable du parc, et c'est sa raison d'être : sur ce sujet, tout le monde a un avis et presque personne n'a un chiffre.
24
+
25
+ Ce skill porte **la grille de performance de la maison**. `review-ai-product` l'exécute au lieu de la redécrire, `better-interface` l'appelle quand la lenteur est le symptôme rapporté.
26
+
27
+ ## Périmètre strict
28
+
29
+ **Analyse** : poids et découpage du code livré, images, listes longues, cascades de requêtes, cache et re-rendus évitables, et le **coût** du chargement perçu.
30
+
31
+ **La frontière avec `better-states`, écrite une fois pour toutes** :
32
+
33
+ > **L'état d'attente appartient à `better-states`. Son COÛT appartient ici.**
34
+
35
+ Qu'un écran affiche un squelette plutôt qu'un vide, que le message d'attente dise quoi que ce soit, que le bouton se désactive pendant l'envoi : `better-states`. Que l'attente dure 4,2 s, qu'elle vienne de vingt-quatre requêtes en série, qu'elle soit évitable : ici. Un skill qui recommande « ajouter un squelette de chargement » a franchi la frontière — le squelette masque le coût, il ne le supprime pas.
36
+
37
+ **N'analyse pas** : la sécurité et l'accès aux données (`review-data-security`), les chemins entre écrans (`better-navigation`), la formulation d'un message d'attente (`better-writing`).
38
+
39
+ ## Ce que le skill exige pour parler
40
+
41
+ **Sans code ni mesure, il n'y a pas d'audit de performance.** L'impression de lenteur n'est pas une preuve, et ce skill rend `BLOCKED` plutôt que de la convertir en constat.
42
+
43
+ | Entrée | Ce qui devient jugeable |
44
+ |---|---|
45
+ | **Mesures de terrain** (Core Web Vitals du produit réel) | Le vécu, chiffré. La référence la plus forte. |
46
+ | **Trace de chargement** (requêtes, séquence, durées) | Cascades, requêtes en série, temps réel de chaque étape. |
47
+ | **Rapport de build** (taille par entrée, dépendances) | Poids livré, découpage, doublons de bibliothèques. |
48
+ | **Code** (composants, requêtes, boucles) | Structures fautives : N+1, absence de mémoïsation, listes non virtualisées. |
49
+ | **Une URL seule** | Presque rien sans mesure associée — demander la mesure. |
50
+ | **« C'est lent chez moi »** | Rien. `BLOCKED`, avec la liste de ce qu'il faut fournir. |
51
+
52
+ Une structure fautive lue dans le code est un constat recevable **sans mesure**, à condition de dire ce qu'elle coûte en nature (« vingt-quatre requêtes en série là où une jointure suffirait ») et de ne pas inventer une durée qu'on n'a pas mesurée.
53
+
54
+ ## Les seuils, et d'où ils viennent
55
+
56
+ La grille cite des chiffres. Elle dit **toujours** de quelle nature ils sont — sans quoi elle simule une rigueur qu'elle n'a pas.
57
+
58
+ ### Seuils mesurés, largement partagés
59
+
60
+ | Indicateur | Bon | Mauvais | Ce qu'il mesure |
61
+ |---|---|---|---|
62
+ | **LCP** | ≤ 2,5 s | > 4 s | Quand le contenu principal devient visible. |
63
+ | **INP** | ≤ 200 ms | > 500 ms | La réponse à une interaction. |
64
+ | **CLS** | ≤ 0,1 | > 0,25 | Les sauts de mise en page pendant le chargement. |
65
+
66
+ Et les limites de perception, stables depuis des décennies : **100 ms** — la réaction paraît instantanée ; **1 s** — le fil de la pensée tient, un retour visuel devient nécessaire ; **10 s** — l'attention décroche, il faut une progression et une sortie.
67
+
68
+ ### Conventions d'atelier, à citer comme telles
69
+
70
+ Aucune norme ne les fixe. Elles servent de repère, pas de verdict, et se disent au conditionnel :
71
+
72
+ - **Poids de code livré** sur la première route : au-delà d'environ 200 Ko compressés de JavaScript, le coût devient sensible sur mobile en réseau contraint. Repère, pas règle.
73
+ - **Listes** : au-delà de quelques centaines de lignes réellement présentes dans le document, la virtualisation ou la pagination se pose. Le seuil dépend du poids de chaque ligne.
74
+ - **Images** : servir plus du double des pixels réellement affichés est du gaspillage mesurable ; le rapport entre dimensions servies et affichées est la preuve, pas le poids seul.
75
+
76
+ > **Un chiffre cité sans sa nature est un chiffre qui ment.** « LCP à 5,1 s, au-delà du seuil de 4 s » est un constat. « Le bundle fait 1,9 Mo, c'est trop » n'en est pas un tant qu'on n'a pas dit que 200 Ko est un repère d'atelier et non une norme.
77
+
78
+ ## La grille
79
+
80
+ ### 1. Poids et découpage du code livré
81
+
82
+ - Taille par point d'entrée, et ce qui la compose. Une bibliothèque lourde chargée pour un usage marginal est le cas le plus fréquent.
83
+ - **Doublons** : deux bibliothèques qui font la même chose, ou la même incluse deux fois en versions différentes.
84
+ - Ce qui est chargé d'emblée alors qu'il ne sert qu'après une interaction, ou sur une autre route.
85
+ - Polices : nombre de fichiers, formats, et si le texte attend leur arrivée pour s'afficher.
86
+
87
+ ### 2. Images
88
+
89
+ - Dimensions servies contre dimensions affichées — le rapport est la preuve.
90
+ - Format : les formats modernes divisent le poids sans perte visible.
91
+ - Chargement différé pour ce qui est hors de l'écran initial, **jamais** pour ce qui y est : différer l'image principale dégrade le LCP au lieu de l'améliorer.
92
+ - Dimensions déclarées : leur absence provoque les sauts de mise en page que mesure le CLS.
93
+
94
+ ### 3. Listes longues
95
+
96
+ - Nombre de lignes réellement présentes dans le document, pas dans les données.
97
+ - Ce que coûte une ligne : une ligne riche à trois cents exemplaires pèse plus que mille lignes simples.
98
+ - Pagination, chargement progressif ou virtualisation — le choix dépend de l'usage, pas de la mode.
99
+
100
+ ### 4. Cascades de requêtes
101
+
102
+ - **N+1** : une requête de liste suivie d'une requête par élément. La signature la plus courante et la plus coûteuse.
103
+ - **Séquences évitables** : des requêtes qui s'attendent alors qu'elles ne dépendent pas les unes des autres.
104
+ - **Cascade de rendu** : un composant qui attend son parent pour commencer à charger ce qu'il aurait pu demander en même temps.
105
+ - Requêtes déclenchées à chaque frappe ou à chaque défilement sans limitation.
106
+
107
+ ### 5. Cache et re-rendus
108
+
109
+ - Ce qui est redemandé alors que rien n'a changé.
110
+ - Re-rendus déclenchés par une valeur recréée à chaque passage, là où la structure du composant les rendait évitables.
111
+ - Absence de cache sur des données stables, ou cache si long que l'écran ment sur l'état réel.
112
+
113
+ ### 6. Le coût du chargement perçu
114
+
115
+ - Ce que la personne voit pendant l'attente relève de `better-states` ; **combien de temps elle attend, et pourquoi, relève d'ici.**
116
+ - Le travail fait avant le premier affichage utile, et ce qui pourrait attendre.
117
+ - Une attente qui dépasse dix secondes sans progression ni sortie est un problème de performance **et** d'état : le signaler, et passer la partie état.
118
+
119
+ ## Sévérité sur cet axe
120
+
121
+ | Sévérité | Sur cet axe |
122
+ |---|---|
123
+ | **Bloquant** | Une tâche essentielle devient impraticable : l'écran ne répond plus, l'attente dépasse la patience et n'offre ni progression ni sortie, l'appareil sature. |
124
+ | **Critique** | Un indicateur mesuré dans la zone « mauvaise » sur un parcours principal. Une cascade qui multiplie l'attente d'un facteur visible. Une liste qui fige l'écran à l'usage réel. |
125
+ | **Majeur** | Poids nettement au-delà du repère sans raison identifiée. Images servies plusieurs fois trop grandes. Requêtes en série évitables. Re-rendus systématiques sur un écran fréquenté. |
126
+ | **Mineur** | Gaspillage réel mais sans effet mesurable sur le vécu. |
127
+ | **Note** | Optimisation possible, sans preuve d'impact — à documenter, pas à faire. |
128
+
129
+ **Une sévérité ne se fonde jamais sur une impression.** Sans mesure ni structure fautive localisée, il n'y a pas de constat, donc pas de sévérité.
130
+
131
+ ## Séquence d'audit obligatoire
132
+
133
+ 1. **Déclarer les entrées.** Ce qui a été reçu, et ce qui manque. Refuser s'il n'y a ni code ni mesure.
134
+ 2. **Nommer le parcours** et l'appareil ou le réseau de référence. « Lent » n'a pas de sens sans les deux.
135
+ 3. **Poser les mesures disponibles** dans un tableau, avec leur nature et leur origine.
136
+ 4. **Chercher les structures fautives dans le code**, indépendamment des mesures.
137
+ 5. **Rapprocher les deux** : quelle structure explique quelle mesure. Une mesure sans cause identifiée reste une mesure, pas un constat.
138
+ 6. **Chiffrer le gain attendu** quand c'est possible, sinon le dire.
139
+ 7. **Ordonner par rapport gain / coût**, jamais par ordre d'apparition.
140
+ 8. **Signaler les dépendances** vers `better-states` ou `better-navigation` sans développer leur audit.
141
+
142
+ ## Anti-patterns à refuser
143
+
144
+ - Écrire « ça semble lent », « ça pourrait être optimisé », « les performances sont perfectibles ».
145
+ - Citer un chiffre sans dire s'il s'agit d'une mesure, d'un standard ou d'un repère d'atelier.
146
+ - Recommander une optimisation sans mesure ni structure fautive derrière.
147
+ - Proposer d'ajouter un squelette de chargement en guise de correction — c'est masquer le coût, pas le réduire.
148
+ - Différer le chargement de l'image principale de l'écran.
149
+ - Recommander une réécriture pour un gain non chiffré.
150
+ - Optimiser un écran rare avant un écran fréquenté.
151
+ - Confondre le nombre de lignes dans les données et le nombre de lignes dans le document.
152
+
153
+ ## Contrat de sortie exact
154
+
155
+ ```
156
+ # Verdict
157
+ - Verdict: PASS | PASS WITH FIXES | FAIL | BLOCKED
158
+ - Parcours audité, appareil et réseau de référence
159
+ - Entrées reçues / manquantes
160
+
161
+ # Mesures
162
+ Indicateur | Valeur | Nature (mesure terrain | standard | repère d'atelier) | Origine
163
+
164
+ # Causes localisées
165
+ Symptôme mesuré | Structure fautive | Fichier ou requête | Gain attendu
166
+
167
+ # Problèmes priorisés
168
+ PERF-XX | Sévérité | Localisation | Preuve chiffrée ou structurelle | Impact | Correction | Critères | Confiance
169
+
170
+ # Non mesuré
171
+ - Ce qui n'a pas pu être établi, et ce qu'il faudrait pour le mesurer
172
+
173
+ # À passer à un autre skill
174
+ - Constat pressenti -> skill concerné (sans le développer)
175
+ ```
176
+
177
+ ## Critères de qualité du skill
178
+
179
+ - Chaque constat porte une mesure ou une structure fautive localisée — jamais une impression.
180
+ - Chaque chiffre cité dit sa nature : mesure, standard ou repère d'atelier.
181
+ - Le parcours, l'appareil et le réseau de référence sont nommés.
182
+ - Les corrections sont ordonnées par gain rapporté au coût.
183
+ - Ce qui n'a pas pu être mesuré figure en clair, et non en silence.
184
+ - Aucune recommandation ne masque un coût au lieu de le réduire.
185
+
186
+ ## Exemple d'invocation
187
+
188
+ ```
189
+ /better-performance
190
+ Parcours: écran « Mes factures », le plus consulté
191
+ Entrées: trace de chargement (24 requêtes), rapport de build, code des composants
192
+ Référence: mobile milieu de gamme, réseau 4G
193
+ Symptôme rapporté: « la liste met plusieurs secondes à s'afficher »
194
+ Objectif: identifier la cause et chiffrer le gain avant d'engager le travail
195
+ ```
@@ -0,0 +1,114 @@
1
+ [
2
+ {
3
+ "id": "perf-conformant-releves",
4
+ "skill": "better-performance",
5
+ "kind": "conformant",
6
+ "delivery_mode": "classique",
7
+ "artifact": "ENTRÉES REÇUES\n- Mesures de terrain sur 30 jours (produit réel, 12 400 sessions).\n- Trace de chargement de l'écran le plus consulté.\n- Rapport de build.\n- Code des composants de l'écran.\n\nPARCOURS AUDITÉ : « Mes relevés », écran le plus consulté.\nRÉFÉRENCE : mobile milieu de gamme, réseau 4G.\n\nMESURES DE TERRAIN (75e centile)\n LCP 1,9 s\n INP 120 ms\n CLS 0,04\n\nTRACE DE CHARGEMENT\n 1 document HTML 180 ms\n 2 bundle principal 240 ms (en parallèle du 3)\n 3 police Inter, 2 fichiers woff2 90 ms (en parallèle du 2)\n 4 requête liste des relevés 160 ms (une seule, avec ses compteurs joints)\n Total jusqu'au contenu principal : 1,9 s (mesure de terrain ci-dessus).\n\nRAPPORT DE BUILD\n entrée principale : 148 Ko compressés (JavaScript)\n route /consommation : 62 Ko compressés, chargée à la demande\n une seule bibliothèque de graphiques, chargée uniquement sur /consommation\n aucune dépendance en double\n\nIMAGES\n courbe-consommation.avif : servie en 720x360, affichée en 720x360,\n dimensions déclarées dans le balisage, hors écran initial et différée.\n\nLISTE\n « Mes relevés » affiche 24 lignes réellement présentes dans le document.\n Au-delà de 50, une pagination prend le relais.\n\nCODE\n La liste est mémoïsée sur la clé des données. Les gestionnaires sont stables.\n La recherche est limitée à une requête toutes les 300 ms de frappe.",
8
+ "golden": {
9
+ "expected_findings": [],
10
+ "forbidden_findings": [
11
+ "réduire encore le poids du bundle principal",
12
+ "reprocher l'absence de virtualisation sur la liste",
13
+ "recommander de différer le chargement des polices",
14
+ "prétendre que les mesures pourraient être meilleures"
15
+ ],
16
+ "expected_verdict": "PASS",
17
+ "should_refuse": false,
18
+ "note": "Tout est dans la zone bonne : LCP, INP et CLS mesurés sur le terrain, une seule requête pour la liste, 148 Ko livrés, image au bon format et aux bonnes dimensions, liste bornée, mémoïsation en place, frappe limitée. Le piège de ce cas est l'optimisation gratuite : 148 Ko est sous le repère, 24 lignes ne réclament pas de virtualisation, et une police en woff2 chargée en parallèle n'est pas un défaut. Recommander une optimisation sans preuve d'impact est exactement ce que ce skill interdit — et un constat sans mesure ni structure fautive n'a pas de sévérité."
19
+ }
20
+ },
21
+ {
22
+ "id": "perf-obvious-factures",
23
+ "skill": "better-performance",
24
+ "kind": "obvious-defect",
25
+ "delivery_mode": "ai-builder",
26
+ "artifact": "ENTRÉES REÇUES\n- Mesures de terrain sur 30 jours (produit réel, 8 900 sessions).\n- Trace de chargement de l'écran le plus consulté.\n- Rapport de build.\n- Code des composants.\n\nPARCOURS AUDITÉ : « Mes factures », écran le plus consulté du produit.\nRÉFÉRENCE : mobile milieu de gamme, réseau 4G.\n\nMESURES DE TERRAIN (75e centile)\n LCP 6,4 s\n INP 610 ms\n CLS 0,31\n\nTRACE DE CHARGEMENT\n 1 document HTML 210 ms\n 2 bundle principal 3 100 ms\n 3 requête liste des factures 180 ms\n 4-27 requête de détail de paiement, une par facture, EN SÉRIE\n 24 requêtes, 140 ms en moyenne chacune, 3 360 ms cumulés\n 28 requête des préférences d'affichage 120 ms (ne dépend d'aucune autre,\n déclenchée après la 27)\n\nRAPPORT DE BUILD\n entrée principale : 1 940 Ko compressés (JavaScript)\n trois bibliothèques de graphiques incluses : chart.js, recharts, apexcharts\n moment.js et date-fns présentes toutes les deux\n lodash importé en entier pour deux fonctions\n la bibliothèque de graphiques est chargée sur toutes les routes, alors qu'un\n seul écran affiche un graphique\n\nIMAGES\n entete-facture.png : servie en 2400x1200, affichée en 600x300,\n aucune dimension déclarée dans le balisage\n logo-partenaire.png : servi en 1200x1200, affiché en 48x48\n Les deux sont dans l'écran initial et portent l'attribut de chargement différé.\n\nLISTE\n « Mes factures » construit 1 850 lignes dans le document, toutes présentes en\n même temps. Chaque ligne contient un graphique de miniature.\n\nCODE\n Le tableau reçoit à chaque rendu un objet d'options recréé sur place, et une\n fonction de tri redéfinie dans le corps du composant.\n La recherche déclenche une requête à chaque frappe, sans limitation.",
27
+ "golden": {
28
+ "expected_findings": [
29
+ "vingt-quatre requêtes de détail exécutées en série après la liste",
30
+ "le LCP mesuré dépasse largement le seuil au-delà duquel il est mauvais",
31
+ "trois bibliothèques de graphiques cohabitent dans la même entrée",
32
+ "deux bibliothèques de dates présentes ensemble, moment et date-fns",
33
+ "la bibliothèque de graphiques est chargée sur toutes les routes sans y servir",
34
+ "images servies plusieurs fois plus grandes que leur affichage",
35
+ "chargement différé appliqué aux images de l'écran initial",
36
+ "dimensions absentes dans le balisage, ce que traduit le décalage mesuré",
37
+ "mille huit cent cinquante lignes construites simultanément dans le document",
38
+ "options et fonction de tri recréées à chaque rendu du tableau",
39
+ "une requête déclenchée à chaque frappe sans limitation"
40
+ ],
41
+ "forbidden_findings": [
42
+ "ajouter un squelette de chargement pendant l'attente",
43
+ "réécrire l'écran avec une autre bibliothèque de composants",
44
+ "reprocher la formulation des intitulés de colonnes",
45
+ "prétendre que le seuil de deux cents kilo-octets est une norme"
46
+ ],
47
+ "expected_verdict": "FAIL",
48
+ "should_refuse": false,
49
+ "note": "Le catalogue complet, et tout est chiffré ou structurellement localisé : aucun constat ne repose sur une impression. LCP et CLS dans la zone mauvaise sur le parcours le plus consulté, cascade de 24 requêtes en série, bundle dix fois au-dessus du repère, images en 2400 px pour 600 px affichés, différé appliqué à l'envers. Le bloquant est la liste de 1 850 lignes avec un graphique chacune, qui fige l'appareil. Deux pièges : proposer un squelette de chargement masque le coût au lieu de le réduire, et le repère des 200 Ko doit être cité comme repère d'atelier, jamais comme norme."
50
+ }
51
+ },
52
+ {
53
+ "id": "perf-subtle-cascade-et-cache",
54
+ "skill": "better-performance",
55
+ "kind": "subtle-defect",
56
+ "delivery_mode": "hybride",
57
+ "artifact": "ENTRÉES REÇUES\n- Mesures de terrain sur 30 jours (produit réel, 5 200 sessions).\n- Trace de chargement.\n- Rapport de build.\n- Code des composants de l'écran.\n\nPARCOURS AUDITÉ : « Détail d'un dossier », deuxième écran le plus consulté.\nRÉFÉRENCE : mobile milieu de gamme, réseau 4G.\n\nMESURES DE TERRAIN (75e centile)\n LCP 2,9 s\n INP 180 ms\n CLS 0,06\n\nTRACE DE CHARGEMENT\n 1 document HTML 190 ms\n 2 bundle principal 420 ms\n 3 requête du dossier 210 ms\n 4 requête des pièces 230 ms déclenchée APRÈS la 3, alors\n qu'elle ne dépend que de l'identifiant présent dans l'adresse\n 5 requête des membres 200 ms déclenchée APRÈS la 4, même\n remarque\n\nRAPPORT DE BUILD\n entrée principale : 190 Ko compressés (JavaScript)\n aucune dépendance en double\n l'éditeur de texte riche (140 Ko) est chargé avec l'entrée principale ; il ne\n sert que si la personne clique sur « Ajouter une note », ce que font 6 % des\n sessions selon les mesures fournies\n\nIMAGES\n apercu-piece.webp : servie en 1600x900, affichée en 400x225,\n dimensions déclarées, hors écran initial et différée.\n\nLISTE\n L'écran affiche 40 pièces au maximum, toutes présentes dans le document.\n\nCODE\n Le composant d'en-tête est mémoïsé. La liste des pièces ne l'est pas, mais\n elle ne se re-rend qu'au changement du dossier.\n Le cache des données du dossier expire après 24 h ; les mesures montrent que\n les pièces sont modifiées plusieurs fois par jour, et deux tickets de support\n signalent une pièce ajoutée qui n'apparaît pas avant rechargement.",
58
+ "golden": {
59
+ "expected_findings": [
60
+ "trois requêtes s'enchaînent alors que deux ne dépendent que de l'adresse",
61
+ "l'éditeur de texte riche est livré à toutes les sessions pour six pour cent d'usage",
62
+ "le cache de vingt-quatre heures ment sur des données modifiées plusieurs fois par jour"
63
+ ],
64
+ "forbidden_findings": [
65
+ "reprocher l'absence de virtualisation sur la liste",
66
+ "ajouter un squelette de chargement pendant l'attente",
67
+ "les mesures sont dans la zone mauvaise",
68
+ "réécrire l'écran avec une autre bibliothèque de composants"
69
+ ],
70
+ "expected_verdict": "PASS WITH FIXES",
71
+ "should_refuse": false,
72
+ "note": "Aucune mesure n'est dans le rouge : LCP à 2,9 s est au-delà du bon sans atteindre le mauvais, INP et CLS sont bons. Les défauts sont donc STRUCTURELS, pas mesurés — et c'est ce que ce cas exige de savoir faire : deux requêtes qui s'attendent sans raison, 140 Ko livrés à tout le monde pour 6 % d'usage, et un cache dont la durée contredit la fréquence réelle de changement, avec deux tickets de support en preuve. Que des majeures, donc PASS WITH FIXES. Le piège inverse : 40 lignes ne réclament aucune virtualisation."
73
+ }
74
+ },
75
+ {
76
+ "id": "perf-out-of-scope-attente-muette",
77
+ "skill": "better-performance",
78
+ "kind": "out-of-scope",
79
+ "delivery_mode": "classique",
80
+ "artifact": "ENTRÉES REÇUES\n- Mesures de terrain sur 30 jours (produit réel, 3 100 sessions).\n- Trace de chargement.\n- Rapport de build.\n- Code des composants, et captures des écrans du parcours.\n\nPARCOURS AUDITÉ : « Réserver un créneau », tunnel en trois écrans.\nRÉFÉRENCE : mobile milieu de gamme, réseau 4G.\n\nMESURES DE TERRAIN (75e centile)\n LCP 1,7 s\n INP 95 ms\n CLS 0,02\n\nTRACE DE CHARGEMENT\n 1 document HTML 170 ms\n 2 bundle principal 210 ms\n 3 requête des créneaux 190 ms (une seule, pour la semaine entière)\n Aucune requête en série. Aucune requête redondante entre les trois écrans :\n les créneaux chargés au premier écran servent aux deux suivants.\n\nRAPPORT DE BUILD\n entrée principale : 121 Ko compressés\n aucune dépendance en double, aucune bibliothèque inutilisée\n\nIMAGES\n Aucune image dans ce parcours.\n\nLISTE\n L'écran des créneaux affiche 42 lignes dans le document.\n\nCODE\n Les données de créneaux sont mises en cache 60 s, cohérent avec leur fréquence\n de changement. Aucun re-rendu déclenché par une valeur recréée.\n\nCE QUE MONTRENT LES CAPTURES ET LES TEXTES\n Pendant les 190 ms de chargement des créneaux, l'écran reste blanc : aucun\n indicateur, aucun squelette, rien n'annonce que quelque chose arrive.\n L'écran de confirmation affiche « Valider » sans dire ce qui sera validé.\n Quand aucun créneau n'est libre, l'écran affiche « Aucun résultat ».\n Le bouton d'envoi ne se désactive pas pendant la soumission : deux tickets de\n support signalent des réservations en double.",
81
+ "golden": {
82
+ "expected_findings": [],
83
+ "forbidden_findings": [
84
+ "l'écran reste blanc sans indicateur pendant le chargement",
85
+ "le bouton de validation ne dit pas ce qu'il valide",
86
+ "la liste vide se contente d'annoncer aucun résultat",
87
+ "le bouton d'envoi ne se désactive pas pendant la soumission"
88
+ ],
89
+ "expected_verdict": "PASS",
90
+ "should_refuse": false,
91
+ "note": "LA FRONTIÈRE AVEC better-states, à l'état pur. Les mesures sont bonnes, une seule requête sert les trois écrans, le cache est cohérent, rien à reprocher au coût. Et le matériau montre quatre vrais défauts d'ÉTAT : écran blanc pendant 190 ms, libellé muet, état vide sans suite, double soumission possible. Ils appartiennent à better-states et better-writing. La règle du skill le dit : l'état d'attente est à states, son coût est ici — et 190 ms ne sont pas un coût. Les signaler en dépendance est prévu par le contrat de sortie ; en faire des constats échoue le cas."
92
+ }
93
+ },
94
+ {
95
+ "id": "perf-insufficient-cest-lent",
96
+ "skill": "better-performance",
97
+ "kind": "insufficient",
98
+ "delivery_mode": "ai-builder",
99
+ "artifact": "ENTRÉES REÇUES\n- Une adresse : https://mon-app.exemple.fr\n- Un message.\n\nLE MESSAGE\n « C'est lent. Surtout le tableau de bord, je crois. Sur mon téléphone c'est\n pire que sur mon ordinateur. Un client m'a dit la même chose la semaine\n dernière. Vous pouvez regarder ? »\n\nCE QUI N'A PAS ÉTÉ FOURNI\n Aucune mesure, ni de terrain ni de laboratoire.\n Aucune trace de chargement.\n Aucun rapport de build.\n Aucun accès au code.\n Aucune indication d'appareil, de réseau ni de parcours précis.\n\nCE QUI A ÉTÉ TENTÉ\n L'adresse répond. La page se dessine dans le navigateur. Aucune mesure n'a été\n prise : le juge n'a pas d'outil de mesure sur ce produit, et une observation à\n l'œil n'est pas une mesure.",
100
+ "golden": {
101
+ "expected_findings": [],
102
+ "forbidden_findings": [
103
+ "le tableau de bord charge trop de données au démarrage",
104
+ "commencer par découper le bundle en plusieurs entrées",
105
+ "la lenteur vient probablement des images non optimisées",
106
+ "prétendre que rien d'anormal n'a été observé sur ce produit",
107
+ "recommander de différer le chargement des polices"
108
+ ],
109
+ "expected_verdict": "BLOCKED",
110
+ "should_refuse": true,
111
+ "note": "Une impression de lenteur, deux témoignages, et rien d'autre. C'est le cas qui définit ce skill : sans mesure ni code, il n'y a pas d'audit de performance, et une observation à l'œil n'est pas une mesure. Les deux trahisons sont piégées. Le diagnostic au flair d'abord — « ça doit être les images », « commence par découper le bundle » — qui est ce que tout le monde fait sur ce sujet et qui envoie travailler au hasard. La rassurance ensuite : « rien d'anormal observé » alors que rien n'a été mesuré. La sortie attendue demande ce qui manque : une mesure de terrain, une trace, un rapport de build, et le parcours précis."
112
+ }
113
+ }
114
+ ]
@@ -0,0 +1,123 @@
1
+ ---
2
+ name: better-responsive
3
+ description: Définit et vérifie le comportement réel d'une interface entre mobile, tablette, desktop et contenus extrêmes ; le responsive n'est pas une réduction proportionnelle du desktop.
4
+ version: 1.0
5
+ category: design-expert
6
+ role: Design expert
7
+ execution_mode: multi-viewport-audit
8
+ supports: [ai-builder, traditional, hybrid]
9
+ inputs: [image, url, code, figma]
10
+ outputs: [behavior-matrix, issue-register, transformation-rules, test-plan]
11
+ relays: [better-layout, better-components, better-states, better-accessibility]
12
+ ---
13
+
14
+ # /better-responsive
15
+
16
+ **Rôle** : Design expert · **Mode par défaut** : audit multi-viewport.
17
+
18
+ Voir le [contrat commun](../_shared/execution-contract.md), le [schéma de problème](../_shared/issue-schema.md) (préfixe `RESP`), le [modèle de sévérité](../_shared/severity-model.md) et la [matrice des modes](../_shared/delivery-modes.md).
19
+
20
+ ## Mission
21
+
22
+ Garantir que l'interface conserve sa priorité, sa compréhension et son action principale quand l'espace, le contenu et le mode d'interaction changent. Le responsive n'est pas une réduction proportionnelle du desktop.
23
+
24
+ ## Déclenchement
25
+
26
+ Débordements, composants qui rétrécissent mal, navigation mobile fragile, tableaux ou modals, ou écrans générés pour un seul viewport.
27
+
28
+ - **Entrées minimales** : au moins deux viewports ou un artefact testable. Idéalement contenu long et états réels.
29
+ - **N'analyse pas** la qualité générale du layout sur un seul viewport, sauf lorsqu'elle empêche l'adaptation.
30
+ - **Principe** : spécifier le comportement entre les points de rupture plutôt que choisir des breakpoints arbitraires.
31
+
32
+ ## Scénarios obligatoires
33
+
34
+ | Scénario | Objectif |
35
+ |---|---|
36
+ | **Petit mobile** | Détecter compression, débordement, actions inaccessibles et scroll horizontal. |
37
+ | **Grand mobile** | Vérifier navigation, barres fixes, clavier logiciel et orientation. |
38
+ | **Tablette / intermédiaire** | Détecter la zone souvent oubliée où ni le mobile ni le desktop ne fonctionnent correctement. |
39
+ | **Desktop standard** | Valider largeur de lecture, densité et équilibre. |
40
+ | **Large desktop** | Éviter étirement excessif, lignes trop longues et vide sans intention. |
41
+ | **Contenu extrême** | Titres longs, traductions, valeurs élevées, listes vides ou très longues. |
42
+
43
+ ## Séquence d'analyse obligatoire
44
+
45
+ 1. **Identifier les priorités.** Lister ce qui doit rester visible, accessible ou compréhensible à chaque largeur.
46
+ 2. **Cartographier les transformations.** Pour chaque bloc : conserver, empiler, déplacer, condenser, masquer avec alternative, transformer ou rendre scrollable.
47
+ 3. **Tester les conteneurs.** Largeur maximale, marges, gutters, colonnes, cartes, grilles et zones fixes.
48
+ 4. **Tester la navigation.** Menu, tabs, breadcrumbs, actions secondaires, retour et orientation dans le produit.
49
+ 5. **Tester les composants complexes.** Tableaux, charts, filtres, formulaires, modals, drawers, éditeurs et drag-and-drop.
50
+ 6. **Tester les interactions tactiles.** Cibles, espacement, gestures, hover-only, clavier logiciel et éléments collants.
51
+ 7. **Tester le contenu réel.** Longueurs extrêmes, erreurs, chargement, empty state et données partielles.
52
+ 8. **Spécifier les règles.** Décrire le comportement attendu, pas seulement « optimiser mobile ».
53
+
54
+ ## Règles de décision
55
+
56
+ - **Prioriser plutôt que cacher.** Si une information disparaît sur mobile, justifier son importance moindre et fournir un accès alternatif si nécessaire.
57
+ - **Transformer le pattern lorsque nécessaire.** Un tableau desktop peut devenir liste, cartes, colonnes prioritaires ou vue détaillée ; pas un tableau miniaturisé.
58
+ - **Éviter les hauteurs fixes.** Le contenu dynamique, le zoom et la traduction doivent pouvoir s'étendre.
59
+ - **Préserver l'action principale.** Les CTA essentiels ne doivent pas se déplacer dans une zone imprévisible ou être masqués par le clavier.
60
+ - **Contrôler les sticky elements.** Barres fixes, headers et footers ne doivent pas réduire excessivement la zone utile ni masquer du contenu.
61
+ - **Tester entre les breakpoints.** Les défauts apparaissent souvent à 700-900 px ou lors de redimensionnements progressifs.
62
+
63
+ ## Adaptation au mode de delivery
64
+
65
+ - **AI Builder.** Vérifier les classes générées, les breakpoints par défaut, les widths fixes, les scroll containers imbriqués et les changements involontaires sur desktop après correction mobile.
66
+ - **Classique.** Rattacher les comportements aux primitives de layout, aux tokens de breakpoint et aux stories responsive.
67
+ - **Hybride.** Aligner la spécification responsive entre Figma, implémentation générée et code maintenu.
68
+
69
+ ## Anti-patterns à refuser
70
+
71
+ - Réduire toutes les tailles et espaces de 20 % sur mobile.
72
+ - Masquer des fonctionnalités importantes sans alternative.
73
+ - Ajouter un scroll horizontal global pour éviter de traiter les composants.
74
+ - Spécifier uniquement 375 px et 1440 px.
75
+ - Utiliser des hauteurs fixes pour des cartes contenant du texte dynamique.
76
+ - Transformer tous les éléments en colonne sans hiérarchiser.
77
+
78
+ ## Contrat de sortie exact
79
+
80
+ ```
81
+ # Résumé exécutif
82
+ - Verdict par famille de viewport
83
+ - Parcours ou composants à risque
84
+
85
+ # Matrice responsive
86
+ Zone / composant | Petit mobile | Grand mobile | Tablette | Desktop | Large desktop | Règle
87
+
88
+ # Problèmes priorisés
89
+ RESP-XX | Sévérité | Viewport | Localisation | Preuve | Impact | Correction | Critères | Confiance
90
+
91
+ # Règles de transformation
92
+ - Ordre de contenu
93
+ - Navigation
94
+ - Actions
95
+ - Tableaux et données
96
+ - Overlays
97
+ - Contenu extrême
98
+
99
+ # Plan de test
100
+ - Dimensions minimales
101
+ - Redimensionnement continu
102
+ - Clavier logiciel
103
+ - Orientation
104
+ - Zoom / texte agrandi
105
+ ```
106
+
107
+ ## Critères de qualité du skill
108
+
109
+ - Le skill couvre au moins un viewport intermédiaire, pas uniquement mobile et desktop.
110
+ - Chaque masquage ou transformation est justifié par la priorité du contenu.
111
+ - Les scénarios de contenu extrême sont explicitement testés.
112
+ - Les corrections ne cassent pas les viewports déjà valides.
113
+ - Les règles sont assez précises pour être implémentées et testées.
114
+
115
+ ## Exemple d'invocation
116
+
117
+ ```
118
+ /better-responsive
119
+ Artefact: dashboard React en production
120
+ Viewports: 360, 768, 1024, 1440 px
121
+ Objectif: préserver les filtres, KPI et action « Créer une alerte »
122
+ Mode: audit + spécification, sans patch
123
+ ```
@@ -0,0 +1,77 @@
1
+ [
2
+ {
3
+ "id": "responsive-conformant-table",
4
+ "skill": "better-responsive",
5
+ "kind": "conformant",
6
+ "delivery_mode": "classique",
7
+ "artifact": "Liste de commandes. Sur desktop : tableau 6 colonnes. Sur mobile : transformé en cartes prioritaires (n° commande, montant, statut, action). Barre d'action collante qui ne masque pas le contenu et reste au-dessus du clavier logiciel. Testé à 375, 768, 1024 et 1440 : pas de scroll horizontal, contenu long géré.",
8
+ "golden": {
9
+ "expected_findings": [],
10
+ "forbidden_findings": ["revoir la hiérarchie visuelle du desktop", "inventer un problème mono-viewport"],
11
+ "expected_verdict": "PASS",
12
+ "should_refuse": false
13
+ }
14
+ },
15
+ {
16
+ "id": "responsive-obvious-scroll",
17
+ "skill": "better-responsive",
18
+ "kind": "obvious-defect",
19
+ "delivery_mode": "ai-builder",
20
+ "artifact": "Dashboard généré. Sur mobile 375px : scroll horizontal global, le tableau desktop est juste miniaturisé (illisible). Le CTA principal est masqué par le clavier logiciel à l'ouverture d'un champ. Breakpoints définis uniquement à 375px et 1440px.",
21
+ "golden": {
22
+ "expected_findings": [
23
+ "scroll horizontal global sur mobile",
24
+ "tableau miniaturisé au lieu d'être transformé en liste ou cartes",
25
+ "CTA principal masqué par le clavier logiciel",
26
+ "breakpoints limités à 375 et 1440, pas de viewport intermédiaire"
27
+ ],
28
+ "forbidden_findings": ["revoir la stratégie produit", "réécrire les libellés"],
29
+ "expected_verdict": "FAIL",
30
+ "should_refuse": false
31
+ }
32
+ },
33
+ {
34
+ "id": "responsive-subtle-tablet",
35
+ "skill": "better-responsive",
36
+ "kind": "subtle-defect",
37
+ "delivery_mode": "classique",
38
+ "artifact": "Page de réglages. Impeccable à 375px et à 1440px. Mais à 768px (tablette) la sidebar et le contenu se chevauchent, et une carte de résumé a une hauteur fixe qui tronque un texte traduit plus long.",
39
+ "golden": {
40
+ "expected_findings": [
41
+ "zone tablette 768px cassée, chevauchement sidebar / contenu",
42
+ "hauteur fixe qui tronque un contenu dynamique ou traduit"
43
+ ],
44
+ "forbidden_findings": ["refonte complète", "changer la palette"],
45
+ "expected_verdict": "PASS WITH FIXES",
46
+ "should_refuse": false
47
+ }
48
+ },
49
+ {
50
+ "id": "responsive-out-of-scope-hierarchy",
51
+ "skill": "better-responsive",
52
+ "kind": "out-of-scope",
53
+ "delivery_mode": "classique",
54
+ "artifact": "Page d'accueil. Le comportement responsive est correct à tous les viewports (reflow, navigation, contenu extrême gérés). Le seul souci est sur le desktop : la hiérarchie typographique entre titre et sous-titre est plate.",
55
+ "golden": {
56
+ "expected_findings": [],
57
+ "forbidden_findings": ["hiérarchie typographique plate", "revoir la hiérarchie visuelle desktop"],
58
+ "expected_verdict": "PASS",
59
+ "should_refuse": false,
60
+ "note": "Défaut mono-viewport de hiérarchie = better-layout. N'empêche pas l'adaptation, donc hors périmètre responsive."
61
+ }
62
+ },
63
+ {
64
+ "id": "responsive-insufficient",
65
+ "skill": "better-responsive",
66
+ "kind": "insufficient",
67
+ "delivery_mode": "classique",
68
+ "artifact": "Une seule capture desktop à 1440px, sans code, sans autre viewport, sans variation de contenu.",
69
+ "golden": {
70
+ "expected_findings": [],
71
+ "forbidden_findings": ["conclure sur le comportement mobile", "affirmer un défaut de reflow"],
72
+ "expected_verdict": "BLOCKED",
73
+ "should_refuse": true,
74
+ "note": "Un seul viewport ne permet pas d'évaluer l'adaptation. Le skill doit demander ≥ 2 viewports ou un artefact testable."
75
+ }
76
+ }
77
+ ]
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: better-states
3
+ description: Rend explicites les états d'un écran, d'un composant ou d'un parcours, ainsi que leurs transitions, messages et voies de récupération, sans inventer les règles métier.
4
+ version: 1.0
5
+ category: interaction-expert
6
+ role: Interaction expert
7
+ execution_mode: state-model-audit
8
+ supports: [ai-builder, traditional, hybrid]
9
+ inputs: [image, prototype, code, url]
10
+ outputs: [state-inventory, transition-matrix, copy, test-matrix]
11
+ relays: [better-writing, better-forms, better-accessibility, better-responsive]
12
+ ---
13
+
14
+ # /better-states
15
+
16
+ **Rôle** : Interaction expert · **Mode par défaut** : state model et audit.
17
+
18
+ Voir le [contrat commun](../_shared/execution-contract.md), le [schéma de problème](../_shared/issue-schema.md) (préfixe `STATE`), le [modèle de sévérité](../_shared/severity-model.md) et la [matrice des modes](../_shared/delivery-modes.md).
19
+
20
+ ## Mission
21
+
22
+ Empêcher les interfaces de s'effondrer dès que les données, le réseau, les permissions ou les actions sortent du scénario idéal. Le skill modélise les états visibles, les transitions et la récupération sans inventer les règles métier.
23
+
24
+ ## Déclenchement
25
+
26
+ Produit conçu uniquement en happy path, états absents, erreurs génériques, chargements fragiles ou transitions ambiguës.
27
+
28
+ - **Entrées minimales** : écran, composant ou flow avec son objectif et ses données principales.
29
+ - **Un état est incomplet si** l'utilisateur ne sait pas ce qui se passe, ce qu'il peut faire, si son action a été prise en compte ou comment récupérer.
30
+
31
+ ## Taxonomie des états
32
+
33
+ | Famille | États typiques | Question |
34
+ |---|---|---|
35
+ | **Interaction** | Default, hover, focus, pressed, selected, disabled, read-only. | Que peut faire l'utilisateur maintenant ? |
36
+ | **Données** | Initial, loading, loaded, empty, partial, stale, syncing. | Quelles données sont disponibles et à quel niveau de fiabilité ? |
37
+ | **Résultat** | Success, warning, error, conflict, cancelled, timeout. | Quel est le résultat et que faire ensuite ? |
38
+ | **Accès** | Unauthenticated, unauthorized, permission required, expired. | Pourquoi l'accès est-il limité et comment le récupérer ? |
39
+ | **Système** | Offline, degraded, maintenance, rate-limited, unsupported. | Le service peut-il fonctionner et sous quelles limites ? |
40
+ | **Processus** | Draft, queued, processing, completed, failed, retrying. | Où est l'opération dans le temps ? |
41
+
42
+ ## Périmètre strict
43
+
44
+ - **Analyse** : états visibles, transitions, déclencheurs, persistance, feedback, récupération, données partielles, concurrence, actions disponibles et cohérence des messages.
45
+ - **N'analyse pas** la stratégie métier qui détermine les permissions ou statuts. Il documente les questions non résolues.
46
+
47
+ ## Séquence d'analyse obligatoire
48
+
49
+ 1. **Définir l'objet suivi.** Page, ressource, action, upload, génération, paiement, synchronisation ou autre processus.
50
+ 2. **Lister les états existants.** À partir des écrans, du code, de la base, des statuts ou de la documentation.
51
+ 3. **Lister les états manquants.** Réseau lent, zéro donnée, permission, conflit, erreur partielle, expiration, double soumission, reprise.
52
+ 4. **Tracer les transitions.** Événement déclencheur, état source, état cible, délai, annulation, retry et persistance.
53
+ 5. **Vérifier le feedback.** Message, indicateur, blocage ou possibilité de poursuivre pendant chaque transition.
54
+ 6. **Vérifier la récupération.** Retry, retour, sauvegarde de brouillon, annulation, support, résolution du conflit.
55
+ 7. **Vérifier la cohérence.** Les mêmes états emploient les mêmes patterns, textes et comportements.
56
+ 8. **Produire la matrice de test.** Chaque état doit être déclenchable et vérifiable.
57
+
58
+ ## Règles de décision
59
+
60
+ - **Loading n'est pas unique.** Distinguer chargement initial, rechargement, action locale, génération longue et synchronisation en arrière-plan.
61
+ - **Empty n'est pas no result.** Un produit jamais configuré ne demande pas la même réponse qu'une recherche sans résultat.
62
+ - **Disabled doit avoir une cause.** Quand l'utilisateur peut raisonnablement se demander pourquoi, expliquer la condition ou proposer l'action nécessaire.
63
+ - **Success doit confirmer le résultat réel.** Ne pas annoncer un succès avant la persistance ou la confirmation serveur.
64
+ - **Error doit préserver le travail.** Éviter de vider un formulaire ou de perdre un brouillon après un échec récupérable.
65
+ - **Les opérations longues doivent être traçables.** Afficher progression ou statut, permettre de quitter la page et retrouver le résultat lorsque possible.
66
+ - **Les conflits doivent être explicites.** Édition concurrente, version obsolète ou données modifiées ne doivent pas être écrasées silencieusement.
67
+
68
+ ## Adaptation au mode de delivery
69
+
70
+ - **AI Builder.** Vérifier les états codés uniquement côté client, les données fictives, les mutations optimistes non compensées, les loaders globaux et les erreurs Supabase non exposées.
71
+ - **Classique.** Relier la state machine aux contrats API, composants, stories et tests.
72
+ - **Hybride.** Comparer les statuts en base, les états d'interface et les règles métier documentées. Éliminer les traductions contradictoires.
73
+
74
+ ## Anti-patterns à refuser
75
+
76
+ - Un spinner plein écran pour toute opération.
77
+ - Un toast comme seul feedback d'une action importante.
78
+ - Un bouton désactivé sans explication.
79
+ - Une erreur générique qui détruit les données saisies.
80
+ - Confondre liste vide, filtre sans résultat et erreur de chargement.
81
+ - Ajouter des états non supportés par le backend en les présentant comme existants.
82
+
83
+ ## Contrat de sortie exact
84
+
85
+ ```
86
+ # Objet et parcours
87
+ - Ressource ou opération suivie
88
+ - Tâche utilisateur
89
+ - Source des statuts
90
+
91
+ # Inventaire des états
92
+ État | Déclencheur | Affichage | Actions disponibles | Persistance | Sortie
93
+
94
+ # Transitions
95
+ ÉTAT A -> événement -> ÉTAT B | délai | retry | annulation | edge cases
96
+
97
+ # Problèmes priorisés
98
+ STATE-XX | Sévérité | État / transition | Preuve | Impact | Correction | Critères | Confiance
99
+
100
+ # Copy et feedback nécessaires
101
+ - Message
102
+ - Action principale
103
+ - Action secondaire
104
+ - Annonce accessible
105
+
106
+ # Matrice de test
107
+ - Précondition
108
+ - Action
109
+ - Résultat attendu
110
+ - Données préservées
111
+ ```
112
+
113
+ ## Critères de qualité du skill
114
+
115
+ - Tous les états critiques du parcours sont identifiés ou explicitement marqués comme inconnus.
116
+ - Chaque erreur récupérable possède une voie de récupération.
117
+ - Les transitions sont reliées à une source de statut réelle.
118
+ - Le skill distingue loading initial, action locale et traitement long.
119
+ - La matrice est testable en QA ou automatisation.
120
+
121
+ ## Exemple d'invocation
122
+
123
+ ```
124
+ /better-states
125
+ Parcours: génération d'un rapport IA
126
+ Statuts backend: queued, processing, completed, failed
127
+ Objectif: permettre à l'utilisateur de quitter puis revenir
128
+ Mode: state model + critères de test
129
+ ```