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.
- package/README.md +153 -0
- package/dist/connectors.js +76 -0
- package/dist/decisions.js +67 -0
- package/dist/embeddings.js +98 -0
- package/dist/evals.js +172 -0
- package/dist/finding-identity.js +229 -0
- package/dist/handbook.js +98 -0
- package/dist/paths.js +62 -0
- package/dist/profile.js +79 -0
- package/dist/reviews.js +99 -0
- package/dist/server.js +1136 -0
- package/dist/skills.js +57 -0
- package/dist/state.js +48 -0
- package/handbook-embeddings.json +1 -0
- package/package.json +46 -0
- package/skills/EVALS.md +122 -0
- package/skills/README.md +59 -0
- package/skills/_shared/delivery-modes.md +12 -0
- package/skills/_shared/execution-contract.md +43 -0
- package/skills/_shared/issue-schema.md +25 -0
- package/skills/_shared/severity-model.md +16 -0
- package/skills/analyze-figma/evals/cases.json +140 -0
- package/skills/analyze-url/evals/cases.json +136 -0
- package/skills/better-accessibility/SKILL.md +141 -0
- package/skills/better-accessibility/evals/cases.json +83 -0
- package/skills/better-components/SKILL.md +125 -0
- package/skills/better-components/evals/cases.json +77 -0
- package/skills/better-consistency/SKILL.md +125 -0
- package/skills/better-consistency/evals/cases.json +77 -0
- package/skills/better-forms/SKILL.md +135 -0
- package/skills/better-forms/evals/cases.json +78 -0
- package/skills/better-interface/SKILL.md +143 -0
- package/skills/better-interface/evals/cases.json +80 -0
- package/skills/better-layout/SKILL.md +132 -0
- package/skills/better-layout/evals/cases.json +81 -0
- package/skills/better-navigation/SKILL.md +170 -0
- package/skills/better-navigation/evals/cases.json +131 -0
- package/skills/better-performance/SKILL.md +195 -0
- package/skills/better-performance/evals/cases.json +114 -0
- package/skills/better-responsive/SKILL.md +123 -0
- package/skills/better-responsive/evals/cases.json +77 -0
- package/skills/better-states/SKILL.md +129 -0
- package/skills/better-states/evals/cases.json +78 -0
- package/skills/better-writing/SKILL.md +138 -0
- package/skills/better-writing/evals/cases.json +77 -0
- package/skills/review-ai-product/SKILL.md +231 -0
- package/skills/review-ai-product/evals/cases.json +120 -0
- package/skills/review-data-security/SKILL.md +210 -0
- package/skills/review-data-security/evals/cases.json +138 -0
- package/skills/review-figma-hygiene/SKILL.md +186 -0
- package/skills/review-figma-hygiene/evals/cases.json +158 -0
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "designwithai-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"description": "Le serveur designwithai pour ton éditeur : audite ton produit, trace les corrections, et fait remonter les résultats dans ton tableau de bord.",
|
|
7
|
+
"keywords": ["mcp", "design-system", "audit", "claude", "cursor"],
|
|
8
|
+
"homepage": "https://designwithai.fr",
|
|
9
|
+
"bin": {
|
|
10
|
+
"designwithai-mcp": "dist/server.js"
|
|
11
|
+
},
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=20"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"skills",
|
|
18
|
+
"handbook-embeddings.json",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"test": "tsx scripts/test-finding-identity.ts && tsx scripts/check-goldens.ts",
|
|
24
|
+
"start": "node dist/server.js",
|
|
25
|
+
"dev": "tsx src/server.ts",
|
|
26
|
+
"embed": "node scripts/embed.mjs",
|
|
27
|
+
"prepack": "node scripts/prepack.mjs && npm run build",
|
|
28
|
+
"postpack": "node scripts/prepack.mjs --clean"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.30.0"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@huggingface/transformers": "^4.2.0"
|
|
35
|
+
},
|
|
36
|
+
"peerDependenciesMeta": {
|
|
37
|
+
"@huggingface/transformers": {
|
|
38
|
+
"optional": true
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^20",
|
|
43
|
+
"tsx": "^4",
|
|
44
|
+
"typescript": "^5"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/skills/EVALS.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Banc d'éval des skills
|
|
2
|
+
|
|
3
|
+
Ce que le Handbook prêche (Vol.2 Ch.06 : geler un dataset d'éval), les skills le
|
|
4
|
+
tiennent. Chaque skill peut être **prouvé** sur un corpus, pas seulement décrit.
|
|
5
|
+
C'est la barrière concurrentielle : on démontre que le skill détecte, reste dans
|
|
6
|
+
son périmètre, et refuse quand l'artefact est insuffisant.
|
|
7
|
+
|
|
8
|
+
## Le corpus
|
|
9
|
+
|
|
10
|
+
Un fichier par skill : `skills/<skill>/evals/cases.json` — un tableau de cas.
|
|
11
|
+
Chaque cas couvre un `kind` :
|
|
12
|
+
|
|
13
|
+
- `conformant` — rien à trouver (teste les faux positifs) ;
|
|
14
|
+
- `obvious-defect` — défauts nets (teste la détection) ;
|
|
15
|
+
- `subtle-defect` — défauts fins (teste la finesse) ;
|
|
16
|
+
- `out-of-scope` — les défauts sont du ressort d'un AUTRE skill (teste le périmètre) ;
|
|
17
|
+
- `insufficient` — pas d'artefact exploitable (teste le refus).
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"id": "layout-obvious-dashboard",
|
|
22
|
+
"skill": "better-layout",
|
|
23
|
+
"kind": "obvious-defect",
|
|
24
|
+
"delivery_mode": "ai-builder",
|
|
25
|
+
"artifact": "Description, code ou URL de l'écran…",
|
|
26
|
+
"golden": {
|
|
27
|
+
"expected_findings": ["ce qu'un bon audit DOIT trouver", "…"],
|
|
28
|
+
"forbidden_findings": ["ce qu'il ne doit PAS dire (hors périmètre, invention)"],
|
|
29
|
+
"expected_verdict": "FAIL",
|
|
30
|
+
"should_refuse": false
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Les juges serveur, au même banc
|
|
36
|
+
|
|
37
|
+
Deux juges ne sont pas des skills : `analyze-url` et `analyze-figma` tournent
|
|
38
|
+
dans les fonctions serveur, avec leur propre grille (`_shared/model.ts`). Ils
|
|
39
|
+
n'en jugent pas moins en production, et un juge non prouvé ne devrait pas juger.
|
|
40
|
+
Leur corpus vit donc au même endroit que les autres —
|
|
41
|
+
`skills/analyze-url/evals/cases.json`, `skills/analyze-figma/evals/cases.json` —
|
|
42
|
+
**sans `SKILL.md`**.
|
|
43
|
+
|
|
44
|
+
Ce n'est pas une convention de rangement, c'est ce que le code fait déjà :
|
|
45
|
+
`loadCases` et `getCase` parcourent tous les dossiers de `skills/`, tandis que
|
|
46
|
+
`loadSkills` n'enregistre que ceux qui portent un `SKILL.md`. Un dossier
|
|
47
|
+
corpus-seul est donc visible du banc et invisible du catalogue — le serveur
|
|
48
|
+
continue d'annoncer dix skills, pas douze. Aucun outil de code n'a été touché
|
|
49
|
+
pour ça.
|
|
50
|
+
|
|
51
|
+
Leurs artefacts ne sont pas décrits, ils sont **figés tels que le juge les
|
|
52
|
+
reçoit** : la sortie réelle de `extractSkeleton` pour les pages, celle de
|
|
53
|
+
`fetchFigmaSummary` pour les maquettes. Un cas d'éval qui paraphraserait le
|
|
54
|
+
matériau ne prouverait rien du juge qui tourne.
|
|
55
|
+
|
|
56
|
+
## Le cycle (via le MCP)
|
|
57
|
+
|
|
58
|
+
1. `list_eval_cases(skill)` — les cas disponibles (golden jamais révélée).
|
|
59
|
+
2. `get_eval_case(case_id)` — l'artefact **à l'aveugle**. On applique le skill dessus.
|
|
60
|
+
3. `score_review(case_id, findings, verdict, refused)` — score contre la golden.
|
|
61
|
+
4. `skill_scorecard(skill)` — l'agrégat.
|
|
62
|
+
|
|
63
|
+
## Les métriques
|
|
64
|
+
|
|
65
|
+
- **Détection** : part des `expected_findings` retrouvés (recouvrement de tokens ≥ 0,5).
|
|
66
|
+
- **Périmètre** : aucun `forbidden_findings` signalé.
|
|
67
|
+
- **Faux positifs** : cas `conformant`/`out-of-scope` où le skill a inventé un
|
|
68
|
+
problème **significatif** — un finding hors golden dont la sévérité est
|
|
69
|
+
`majeur`, `critique` ou `bloquant` (sévérité absente ou inconnue : comptée comme
|
|
70
|
+
significative, le doute ne protège pas le skill). Les `mineur` et `note` ne
|
|
71
|
+
comptent pas : un audit de bout en bout produit légitimement des remarques de
|
|
72
|
+
faible sévérité sur un produit sain.
|
|
73
|
+
- **Verdict** : quand la golden fixe un `expected_verdict`, il doit être rendu
|
|
74
|
+
**et** correspondre — un verdict manquant est un échec.
|
|
75
|
+
- **Refus** : `should_refuse` respecté sur les cas insuffisants.
|
|
76
|
+
|
|
77
|
+
Un cas **passe** si : refus correct, périmètre respecté, verdict conforme (quand
|
|
78
|
+
un `expected_verdict` est fixé), détection ≥ 75 %, et — pour un cas sans défaut —
|
|
79
|
+
aucun faux positif significatif.
|
|
80
|
+
|
|
81
|
+
Plafond assumé du matcher : il compare des mots de contenu (mots vides écartés) et
|
|
82
|
+
exige au moins deux mots partagés dès que la phrase en compte deux — donc sur une
|
|
83
|
+
phrase interdite de deux mots, une violation qui n'en partage qu'un n'est pas
|
|
84
|
+
attrapée. Limite connue du recouvrement lexical, à lever plus tard par une
|
|
85
|
+
approche sémantique.
|
|
86
|
+
|
|
87
|
+
Conséquence directe sur l'écriture des goldens : le matcher écarte les mots
|
|
88
|
+
vides **et tout token de deux caractères ou moins**, chiffres compris. Une
|
|
89
|
+
golden écrite « espacements 14, 15 et 16 côte à côte » ne pèse que deux mots
|
|
90
|
+
utiles (`espacements`, `cote`) et passe sous le plancher de deux mots partagés :
|
|
91
|
+
le constat le plus juste du monde n'y sera jamais apparié. C'est un vrai manqué
|
|
92
|
+
du banc, pas une hypothèse. **Une phrase de golden porte au moins trois mots de
|
|
93
|
+
contenu, et ne repose jamais sur des nombres seuls** — les nombres restent utiles
|
|
94
|
+
pour la lisibilité humaine, mais ils ne comptent pas pour l'appariement.
|
|
95
|
+
|
|
96
|
+
Seconde règle, apprise au même prix : **une phrase interdite s'écrit avec des
|
|
97
|
+
mots que le constat juste n'emploierait pas.** Le matcher se contente de 50 % de
|
|
98
|
+
recouvrement, or un cas travaille toujours dans un vocabulaire étroit —
|
|
99
|
+
« autorisation » et « relevés » sur un corpus sécurité, « lien » et « suivi » sur
|
|
100
|
+
un corpus navigation. Une interdite courte, faite des mots du domaine, se
|
|
101
|
+
déclenche sur la bonne réponse et s'affiche en « périmètre violé » pour un juge
|
|
102
|
+
irréprochable. Écris-la sur l'ACTE fautif (« recommander de fusionner… »,
|
|
103
|
+
« prétendre que… », « reprocher l'absence de… »), pas sur l'objet du cas.
|
|
104
|
+
|
|
105
|
+
`npm test` (côté `mcp/`) tient les deux règles : `scripts/check-goldens.ts`
|
|
106
|
+
bloque une `expected_findings` non reconnaissable (elle ferait échouer un cas à
|
|
107
|
+
tort) et une `forbidden_findings` que le matcher reconnaît dans une
|
|
108
|
+
`expected_findings` du même cas (elle punirait une review correcte). Il signale
|
|
109
|
+
une `forbidden_findings` trop courte, qui ne fait que laisser passer une
|
|
110
|
+
violation.
|
|
111
|
+
|
|
112
|
+
Corollaire pour les goldens : n'encode pas le verdict ou la recommandation dans
|
|
113
|
+
`expected_findings` (ce ne sont pas des problèmes trouvés). Le verdict se prouve
|
|
114
|
+
par `expected_verdict`, la discipline par `forbidden_findings`, l'intention par
|
|
115
|
+
`note`.
|
|
116
|
+
|
|
117
|
+
## Ajouter un skill au banc
|
|
118
|
+
|
|
119
|
+
Crée `skills/<skill>/evals/cases.json` avec 5+ cas couvrant les `kind`. Écris la
|
|
120
|
+
golden à la main, depuis le périmètre du skill — pas depuis ce que le modèle
|
|
121
|
+
produit aujourd'hui (même règle que le dataset gelé du Ch.06). Les résultats
|
|
122
|
+
sont stockés hors dépôt dans `.designwithai/evals/` (`DWAI_EVALS_PATH`).
|
package/skills/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Skills — bibliothèque opérationnelle
|
|
2
|
+
|
|
3
|
+
10 skills pour auditer, corriger et industrialiser les interfaces. Ce ne sont
|
|
4
|
+
pas des prompts génériques : ce sont des **rôles spécialisés à frontières
|
|
5
|
+
explicites**. Les experts analysent une dimension précise ; les orchestrateurs
|
|
6
|
+
sélectionnent, coordonnent et agrègent les experts sans dupliquer leur travail.
|
|
7
|
+
|
|
8
|
+
Chaque skill possède un périmètre fermé, des preuves obligatoires, un format de
|
|
9
|
+
sortie stable et des critères de validation.
|
|
10
|
+
|
|
11
|
+
## Socle partagé
|
|
12
|
+
|
|
13
|
+
Importé par tous les skills — voir `_shared/` :
|
|
14
|
+
|
|
15
|
+
- [`execution-contract.md`](_shared/execution-contract.md) — mode d'exécution, hiérarchie des preuves, règles de scope, priorisation, format de sortie, règle anti-générique.
|
|
16
|
+
- [`issue-schema.md`](_shared/issue-schema.md) — le schéma commun d'un problème.
|
|
17
|
+
- [`severity-model.md`](_shared/severity-model.md) — sévérités et verdict global.
|
|
18
|
+
- [`delivery-modes.md`](_shared/delivery-modes.md) — la matrice des modes de delivery.
|
|
19
|
+
|
|
20
|
+
## Les skills
|
|
21
|
+
|
|
22
|
+
| Skill | Rôle | Ce qu'il couvre |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| [`better-layout`](better-layout/SKILL.md) | Design expert | Composition, spacing, hiérarchie et densité |
|
|
25
|
+
| [`better-accessibility`](better-accessibility/SKILL.md) | Quality expert | Accessibilité fonctionnelle et technique |
|
|
26
|
+
| [`better-writing`](better-writing/SKILL.md) | Content expert | UX writing et microcopy produit |
|
|
27
|
+
| [`better-responsive`](better-responsive/SKILL.md) | Design expert | Comportements multi-viewport |
|
|
28
|
+
| [`better-states`](better-states/SKILL.md) | Interaction expert | États, transitions et récupération |
|
|
29
|
+
| [`better-forms`](better-forms/SKILL.md) | UX expert | Formulaires et saisie de données |
|
|
30
|
+
| [`better-components`](better-components/SKILL.md) | System expert | Architecture et réutilisation des composants |
|
|
31
|
+
| [`better-consistency`](better-consistency/SKILL.md) | System expert | Cohérence transversale du produit |
|
|
32
|
+
| [`better-interface`](better-interface/SKILL.md) | Orchestrator | Orchestration de la revue d'interface |
|
|
33
|
+
| [`review-ai-product`](review-ai-product/SKILL.md) | Product orchestrator | Audit de production-readiness d'un produit construit avec un générateur IA |
|
|
34
|
+
|
|
35
|
+
## Règles d'orchestration
|
|
36
|
+
|
|
37
|
+
- **Un expert ne déclenche pas automatiquement un autre expert.** Il signale la dépendance et renvoie le contexte utile.
|
|
38
|
+
- **Un orchestrateur peut appeler plusieurs experts.** Il doit expliquer pourquoi chacun est activé.
|
|
39
|
+
- **La même cause racine ne doit pas devenir cinq tickets.** L'orchestrateur fusionne les impacts tout en conservant les critères spécifiques.
|
|
40
|
+
- **`review-ai-product` possède la priorité sur la sécurité et les données.** Les corrections UI ne passent jamais avant un risque bloquant de permission, secret ou intégrité.
|
|
41
|
+
- **`better-interface` possède la priorité sur l'ordre de correction visuel.** Il traite d'abord fondations, composants et patterns, puis occurrences locales.
|
|
42
|
+
|
|
43
|
+
## Modes de delivery
|
|
44
|
+
|
|
45
|
+
Le champ `supports` de chaque skill (`ai-builder` / `traditional` / `hybrid`)
|
|
46
|
+
correspond au `deliveryMode` du site et du serveur MCP (`traditional` = la valeur
|
|
47
|
+
`classique` du reste du projet). Chaque skill a une section « Adaptation au mode
|
|
48
|
+
de delivery ».
|
|
49
|
+
|
|
50
|
+
## Intégration
|
|
51
|
+
|
|
52
|
+
Ces `SKILL.md` sont la **forme canonique et portable**. Deux surfaces possibles,
|
|
53
|
+
sans réécrire le contenu :
|
|
54
|
+
|
|
55
|
+
- **Claude Code** — copier ou lier un dossier de skill sous `.claude/skills/` pour l'invoquer comme slash-command (`/better-layout`) dans ce dépôt. Le frontmatter `name` + `description` est déjà au format attendu.
|
|
56
|
+
- **Serveur MCP** — exposer chaque skill comme *prompt* MCP (voir `mcp/`), pour que Claude ou un IDE les invoque avec le contexte du Handbook.
|
|
57
|
+
|
|
58
|
+
Ordre recommandé (page « Organisation » du document source) : tester chaque skill
|
|
59
|
+
sur un artefact différent **avant** de construire les orchestrateurs sur eux.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Matrice des modes de delivery
|
|
2
|
+
|
|
3
|
+
Chaque skill adapte ses contrôles au mode de construction du produit. Les modes
|
|
4
|
+
correspondent au `deliveryMode` du site et du serveur MCP (`ai-builder` /
|
|
5
|
+
`classique` / `hybride` ; le frontmatter des skills note `traditional` pour
|
|
6
|
+
`classique`, historique du document source).
|
|
7
|
+
|
|
8
|
+
| Mode | Source de vérité probable | Risque dominant | Vérification attendue |
|
|
9
|
+
|---|---|---|---|
|
|
10
|
+
| **AI Builder** | Générateur IA + dépôt synchronisé + backend / BaaS | Régressions de génération, duplication, dette invisible | Comparaison avant/après, routes, données, permissions |
|
|
11
|
+
| **Classique** | Figma + Design System + code + Storybook | Perte d'information entre conception et développement | Mapping design/code, tests, critères d'acceptation |
|
|
12
|
+
| **Hybride** | Plusieurs sources en concurrence | Divergence et responsabilités floues | Décision explicite de source canonique par couche |
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Contrat commun à tous les skills
|
|
2
|
+
|
|
3
|
+
À inclure dans chaque skill ou à importer comme règle partagée. Il empêche les
|
|
4
|
+
audits vagues, les recommandations hors scope et les modifications dangereuses.
|
|
5
|
+
|
|
6
|
+
## 1. Mode d'exécution
|
|
7
|
+
|
|
8
|
+
- **Diagnostiquer par défaut.** Le skill analyse et produit des recommandations. Il ne modifie aucun fichier, écran, base de données ou environnement sans demande explicite.
|
|
9
|
+
- **Proposer avant de patcher.** Quand une correction de code est demandée, le skill décrit d'abord le périmètre, les fichiers concernés, les risques et le plan de vérification.
|
|
10
|
+
- **Travailler par lot cohérent.** Une correction vise un problème ou un groupe fortement lié. Éviter les refontes diffuses qui rendent les régressions impossibles à isoler.
|
|
11
|
+
- **Vérifier après action.** Toute modification est suivie d'une vérification ciblée puis d'un contrôle de non-régression sur les zones adjacentes.
|
|
12
|
+
|
|
13
|
+
## 2. Hiérarchie des preuves
|
|
14
|
+
|
|
15
|
+
- **Preuve directe.** Le problème est visible dans une capture, reproductible dans le produit, identifiable dans le code ou démontré par un test.
|
|
16
|
+
- **Preuve croisée.** Plusieurs artefacts convergent : Figma, production, Storybook, code, analytics ou retours utilisateurs.
|
|
17
|
+
- **Inférence.** Le problème est probable mais non démontré. Le marquer comme hypothèse et indiquer la vérification nécessaire.
|
|
18
|
+
- **Absence de preuve.** Le skill ne conclut pas. Il demande ou liste les informations manquantes dans la section Blocages.
|
|
19
|
+
|
|
20
|
+
## 3. Règles de scope
|
|
21
|
+
|
|
22
|
+
- **Rester dans le mandat.** Chaque skill analyse uniquement sa dimension. Il peut signaler une dépendance vers un autre skill, mais ne développe pas l'audit hors scope.
|
|
23
|
+
- **Respecter l'intention produit.** Ne pas transformer la proposition de valeur, les règles métier ou la direction visuelle sans demande explicite.
|
|
24
|
+
- **Préserver la source de vérité.** Identifier Figma, le code, Storybook, les tokens, le générateur IA ou la production comme source de référence. En cas de conflit, le signaler avant toute correction.
|
|
25
|
+
- **Ne pas inventer.** Ne pas supposer des utilisateurs, des contraintes, des données, des états ou des objectifs absents des artefacts.
|
|
26
|
+
|
|
27
|
+
## 4. Priorisation
|
|
28
|
+
|
|
29
|
+
- **Bloquant.** Empêche une action essentielle, expose un risque de sécurité, détruit des données ou rend le produit inutilisable pour un groupe d'utilisateurs.
|
|
30
|
+
- **Critique.** Cause fréquente d'échec, de perte de compréhension ou de non-conformité sur un parcours principal.
|
|
31
|
+
- **Majeur.** Dégrade nettement l'efficacité, la cohérence, la maintenance ou la qualité perçue.
|
|
32
|
+
- **Mineur.** Défaut local à faible impact, mais réel et vérifiable.
|
|
33
|
+
- **Note.** Observation utile, opportunité ou dette à documenter sans action immédiate.
|
|
34
|
+
|
|
35
|
+
## 5. Format de sortie
|
|
36
|
+
|
|
37
|
+
- **Résumé exécutif.** Verdict en cinq lignes maximum, dimensions analysées, niveau de confiance et principaux risques.
|
|
38
|
+
- **Contexte et limites.** Artefacts reçus, éléments absents, viewports, routes ou composants couverts.
|
|
39
|
+
- **Problèmes priorisés.** Registre structuré conforme au schéma commun (voir `issue-schema.md`).
|
|
40
|
+
- **Plan de correction.** Ordre d'action, dépendances, effort relatif et vérifications.
|
|
41
|
+
- **Critères de sortie.** Conditions permettant de conclure que la revue est réussie.
|
|
42
|
+
|
|
43
|
+
> **Règle anti-générique.** Chaque recommandation doit inclure une localisation, une preuve et un critère d'acceptation. « Améliorer la hiérarchie » ou « rendre plus accessible » n'est jamais une sortie acceptable sans préciser où, pourquoi et comment valider.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Schéma commun d'un problème
|
|
2
|
+
|
|
3
|
+
Tout problème rapporté par un skill suit ce schéma.
|
|
4
|
+
|
|
5
|
+
| Champ | Exigence |
|
|
6
|
+
|---|---|
|
|
7
|
+
| **ID** | Identifiant stable, par exemple `LAYOUT-03`. |
|
|
8
|
+
| **Sévérité** | Bloquant, critique, majeur, mineur ou note (voir `severity-model.md`). |
|
|
9
|
+
| **Localisation** | Route, écran, composant, viewport, fichier ou ligne. |
|
|
10
|
+
| **Preuve** | Observation concrète. Jamais une impression vague. |
|
|
11
|
+
| **Impact** | Conséquence utilisateur, produit, maintenance ou risque. |
|
|
12
|
+
| **Correction** | Action minimale et cohérente, pas une refonte automatique. |
|
|
13
|
+
| **Critères d'acceptation** | Conditions observables permettant de valider le correctif. |
|
|
14
|
+
| **Confiance** | Élevée, moyenne ou faible, selon les preuves disponibles. |
|
|
15
|
+
|
|
16
|
+
Le préfixe d'ID est propre à chaque skill : `LAYOUT`, `A11Y`, `COPY`, `RESP`,
|
|
17
|
+
`STATE`, `FORM`, `COMP`, `CONS`, `NAV` (better-navigation), `UI`
|
|
18
|
+
(better-interface), `SEC` (review-data-security), `FIG`
|
|
19
|
+
(review-figma-hygiene), `SHIP` (review-ai-product).
|
|
20
|
+
|
|
21
|
+
Un préfixe ne change jamais en traversant un orchestrateur. Les constats de
|
|
22
|
+
`review-data-security` remontent dans un audit complet avec leurs identifiants
|
|
23
|
+
`SEC`, jamais renumérotés : le suivi de progression apparie les constats d'une
|
|
24
|
+
passe à l'autre, et renuméroter ferait réapparaître les mêmes problèmes comme
|
|
25
|
+
nouveaux.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Modèle de sévérité et verdict global
|
|
2
|
+
|
|
3
|
+
## Sévérité d'un problème
|
|
4
|
+
|
|
5
|
+
- **Bloquant.** Empêche une action essentielle, expose un risque de sécurité, détruit des données ou rend le produit inutilisable pour un groupe d'utilisateurs.
|
|
6
|
+
- **Critique.** Cause fréquente d'échec, de perte de compréhension ou de non-conformité sur un parcours principal.
|
|
7
|
+
- **Majeur.** Dégrade nettement l'efficacité, la cohérence, la maintenance ou la qualité perçue.
|
|
8
|
+
- **Mineur.** Défaut local à faible impact, mais réel et vérifiable.
|
|
9
|
+
- **Note.** Observation utile, opportunité ou dette à documenter sans action immédiate.
|
|
10
|
+
|
|
11
|
+
## Verdict global
|
|
12
|
+
|
|
13
|
+
- **PASS.** Aucun problème bloquant ou critique. Les corrections restantes n'empêchent pas l'usage prévu.
|
|
14
|
+
- **PASS WITH FIXES.** Le produit peut avancer après un lot limité de corrections clairement identifiées.
|
|
15
|
+
- **FAIL.** Au moins un problème bloquant ou plusieurs problèmes critiques empêchent la mise à disposition ou la validation.
|
|
16
|
+
- **BLOCKED.** Les artefacts ou accès sont insuffisants pour produire un verdict fiable.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "figma-conformant-lecture-partielle",
|
|
4
|
+
"skill": "analyze-figma",
|
|
5
|
+
"kind": "conformant",
|
|
6
|
+
"delivery_mode": "classique",
|
|
7
|
+
"artifact": "Fichier : Cabinet Lauzun — produit\nDernière modification : 2026-08-11T09:24:31Z\nATTENTION : fichier volumineux — ma lecture s'est arrêtée après 6000 éléments. Ce qui suit est un ÉCHANTILLON, pas l'intégralité du fichier. Ne conclus donc jamais qu'un élément « manque » ou « n'existe pas ».\nPages : 4 — Fondations, Composants, Écrans, Archives\nCadres : 1212 (dont 1212 en auto-layout)\nCalques de texte : 26\nStyles publiés dans la bibliothèque : 68\n\nÉCRANS DE PREMIER NIVEAU (1212)\n - Fondations › Palette\n - Fondations › Échelle typographique\n - Composants › Composant 0\n - Composants › Composant 1\n - Composants › Composant 2\n - Composants › Composant 3\n - Composants › Composant 4\n - Composants › Composant 5\n - Composants › Composant 6\n - Composants › Composant 7\n - Composants › Composant 8\n - Composants › Composant 9\n - Composants › Composant 10\n - Composants › Composant 11\n - Composants › Composant 12\n - Composants › Composant 13\n - Composants › Composant 14\n - Composants › Composant 15\n - Composants › Composant 16\n - Composants › Composant 17\n - Composants › Composant 18\n - Composants › Composant 19\n - Composants › Composant 20\n - Composants › Composant 21\n - Composants › Composant 22\n - Composants › Composant 23\n - Composants › Composant 24\n - Composants › Composant 25\n - Composants › Composant 26\n - Composants › Composant 27\n - Composants › Composant 28\n - Composants › Composant 29\n - Composants › Composant 30\n - Composants › Composant 31\n - Composants › Composant 32\n - Composants › Composant 33\n - Composants › Composant 34\n - Composants › Composant 35\n - Composants › Composant 36\n - Composants › Composant 37\n - Composants › Composant 38\n - Composants › Composant 39\n - Écrans › Écran 001 · Tableau de bord\n - Écrans › Écran 002 · Liste des dossiers\n - Écrans › Écran 003 · Détail dossier\n\nPOLICES ET GRAISSES EMPLOYÉES (3)\n - Inter 400\n - Inter 500\n - Inter 600\n\nTAILLES DE TEXTE EMPLOYÉES (4) : 16, 20, 24, 32\nRAYONS D'ANGLE EMPLOYÉS (3) : 4, 8, 16\nESPACEMENTS EMPLOYÉS (4) : 8, 16, 24, 32\n\nCOULEURS DE REMPLISSAGE, LES PLUS FRÉQUENTES (3 distinctes)\n - #ffffff — 432 usages\n - #f7f8fa — 390 usages\n - #111827 — 390 usages\n\nCOMPOSANTS RÉUTILISÉS (4)\n - Bouton — 1210 instances\n - Champ — 1210 instances\n - Carte — 1170 instances\n - Entête — 1170 instances\n\nCALQUES RESTÉS AU NOM PAR DÉFAUT (0)\n (aucun)\n\nFAUX TEXTES REPÉRÉS (0)\n (aucun)\n\nTEXTES DE LA MAQUETTE (26)\n - Fondations › « Couleurs de la marque »\n - Fondations › « Inter 12 / 14 / 16 / 20 / 24 / 32 / 40 »\n - Écrans › « Dossier 1 — ouvert le 01/03/2026 »\n - Écrans › « Dossier 2 — ouvert le 02/03/2026 »\n - Écrans › « Dossier 3 — ouvert le 03/03/2026 »\n - Écrans › « Dossier 4 — ouvert le 04/03/2026 »\n - Écrans › « Dossier 5 — ouvert le 05/03/2026 »\n - Écrans › « Dossier 6 — ouvert le 06/03/2026 »\n - Écrans › « Dossier 7 — ouvert le 07/03/2026 »\n - Écrans › « Dossier 8 — ouvert le 08/03/2026 »\n - Écrans › « Dossier 9 — ouvert le 09/03/2026 »\n - Écrans › « Dossier 10 — ouvert le 01/03/2026 »\n - Écrans › « Dossier 11 — ouvert le 02/03/2026 »\n - Écrans › « Dossier 12 — ouvert le 03/03/2026 »\n - Écrans › « Dossier 13 — ouvert le 04/03/2026 »\n - Écrans › « Dossier 14 — ouvert le 05/03/2026 »\n - Écrans › « Dossier 15 — ouvert le 06/03/2026 »\n - Écrans › « Dossier 16 — ouvert le 07/03/2026 »\n - Écrans › « Dossier 17 — ouvert le 08/03/2026 »\n - Écrans › « Dossier 18 — ouvert le 09/03/2026 »\n - Écrans › « Dossier 19 — ouvert le 01/03/2026 »\n - Écrans › « Dossier 20 — ouvert le 02/03/2026 »\n - Écrans › « Dossier 21 — ouvert le 03/03/2026 »\n - Écrans › « Dossier 22 — ouvert le 04/03/2026 »\n - Écrans › « Dossier 23 — ouvert le 05/03/2026 »\n - Écrans › « Dossier 24 — ouvert le 06/03/2026 »",
|
|
8
|
+
"golden": {
|
|
9
|
+
"expected_findings": [],
|
|
10
|
+
"forbidden_findings": [
|
|
11
|
+
"la maquette ne montre aucun état vide",
|
|
12
|
+
"aucun écran d'erreur n'est prévu",
|
|
13
|
+
"aucun état de chargement représenté",
|
|
14
|
+
"il manque un écran de connexion",
|
|
15
|
+
"seuls quarante-cinq écrans sont nommés",
|
|
16
|
+
"aucun faux texte repéré, donc la maquette est incomplète"
|
|
17
|
+
],
|
|
18
|
+
"expected_verdict": "PASS",
|
|
19
|
+
"should_refuse": false,
|
|
20
|
+
"note": "LE CAS DU FICHIER TRONQUÉ. La lecture s'est arrêtée au 6000ᵉ élément et le matériau le dit en tête, en toutes lettres. Tout ce qui suit est un échantillon : 45 noms d'écrans sur 1212, 26 textes sur un fichier qui en compte davantage. Conclure d'un tel extrait qu'un état, un écran ou un texte « manque » est un raisonnement par absence doublé d'une lecture partielle — la faute que ce cas mesure. Ce qui EST observable est bon : 1212 cadres tous en auto-layout, quatre composants réutilisés plus de mille fois, trois rayons, quatre espacements, une seule police, 68 styles publiés. Un fichier tenu."
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "figma-conformant-textes-coupes",
|
|
25
|
+
"skill": "analyze-figma",
|
|
26
|
+
"kind": "conformant",
|
|
27
|
+
"delivery_mode": "classique",
|
|
28
|
+
"artifact": "Fichier : Cabinet Lauzun — textes\nDernière modification : 2026-08-12T15:02:00Z\nLecture complète du fichier.\nPages : 1 — Écrans\nCadres : 5 (dont 5 en auto-layout)\nCalques de texte : 10\nStyles publiés dans la bibliothèque : 22\n\nÉCRANS DE PREMIER NIVEAU (5)\n - Écrans › 01 · Accueil\n - Écrans › 02 · Conservation\n - Écrans › 03 · Extraction\n - Écrans › 04 · Rappel\n - Écrans › 05 · Paramètres\n\nPOLICES ET GRAISSES EMPLOYÉES (1)\n - Inter 400\n\nTAILLES DE TEXTE EMPLOYÉES (1) : 16\nRAYONS D'ANGLE EMPLOYÉS (1) : 8\nESPACEMENTS EMPLOYÉS (2) : 16, 24\n\nCOULEURS DE REMPLISSAGE, LES PLUS FRÉQUENTES (1 distinctes)\n - #ffffff — 5 usages\n\nCOMPOSANTS RÉUTILISÉS (2)\n - Bouton — 4 instances\n - Champ — 2 instances\n\nCALQUES RESTÉS AU NOM PAR DÉFAUT (0)\n (aucun)\n\nFAUX TEXTES REPÉRÉS (0)\n (aucun)\n\nTEXTES DE LA MAQUETTE (10)\n - Écrans › « Vos dossiers sont conservés cinq ans après leur clôture, puis archivés automatiquement. Vous recevez un rappel un mois avant l'archivage, et vous pouvez à tout […coupé par ma lecture, pas par la maquette] »\n - Écrans › « Vos dossiers »\n - Écrans › « Vos dossiers sont conservés cinq ans après leur clôture, puis archivés automatiquement. Vous recevez un rappel un mois avant l'archivage, et vous pouvez à tout […coupé par ma lecture, pas par la maquette] »\n - Écrans › « Conservation des pièces »\n - Écrans › « Demandez l'extraction de toutes les pièces d'un dossier au format PDF. Le fichier vous est envoyé par courriel dans l'heure, et reste téléchargeable pendant sep […coupé par ma lecture, pas par la maquette] »\n - Écrans › « Extraction des pièces »\n - Écrans › « Un mois avant l'archivage, un rappel est envoyé au responsable du dossier ainsi qu'aux membres qui l'ont consulté au cours des six derniers mois. »\n - Écrans › « Rappel avant archivage »\n - Écrans › « Paramètres du cabinet »\n - Écrans › « Enregistrer les modifications »",
|
|
29
|
+
"golden": {
|
|
30
|
+
"expected_findings": [],
|
|
31
|
+
"forbidden_findings": [
|
|
32
|
+
"des textes sont tronqués dans la maquette",
|
|
33
|
+
"phrases coupées au milieu d'un mot",
|
|
34
|
+
"textes incomplets à finir",
|
|
35
|
+
"la maquette ne montre aucun état vide",
|
|
36
|
+
"aucun écran d'erreur n'est prévu"
|
|
37
|
+
],
|
|
38
|
+
"expected_verdict": "PASS",
|
|
39
|
+
"should_refuse": false,
|
|
40
|
+
"note": "LE BUG DE TRONCATURE, corrigé pendant la première analyse réelle et gelé ici. Trois textes de la maquette portent la mention « […coupé par ma lecture, pas par la maquette] » : la coupure est NOTRE fait, la maquette est entière. Rapporter une troncature revient à reprocher au produit ce que notre lecture lui a fait — c'est exactement ce qui s'était produit avant que la marque ne soit ajoutée. Le fichier est par ailleurs sain : une police, une taille, un rayon, deux composants réutilisés, aucun calque au nom par défaut, 22 styles publiés."
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "figma-obvious-sans-systeme",
|
|
45
|
+
"skill": "analyze-figma",
|
|
46
|
+
"kind": "obvious-defect",
|
|
47
|
+
"delivery_mode": "ai-builder",
|
|
48
|
+
"artifact": "Fichier : TaskFlow app\nDernière modification : 2026-08-05T18:40:12Z\nLecture complète du fichier.\nPages : 1 — Page 1\nCadres : 46 (dont 0 en auto-layout)\nCalques de texte : 92\nStyles publiés dans la bibliothèque : 0\n\nÉCRANS DE PREMIER NIVEAU (46)\n - Page 1 › Frame 1\n - Page 1 › Group 2\n - Page 1 › Rectangle 3\n - Page 1 › Frame 4\n - Page 1 › Group 5\n - Page 1 › Rectangle 6\n - Page 1 › Frame 7\n - Page 1 › Group 8\n - Page 1 › Rectangle 9\n - Page 1 › Frame 10\n - Page 1 › Group 11\n - Page 1 › Rectangle 12\n - Page 1 › Frame 13\n - Page 1 › Group 14\n - Page 1 › Rectangle 15\n - Page 1 › Frame 16\n - Page 1 › Group 17\n - Page 1 › Rectangle 18\n - Page 1 › Frame 19\n - Page 1 › Group 20\n - Page 1 › Rectangle 21\n - Page 1 › Frame 22\n - Page 1 › Group 23\n - Page 1 › Rectangle 24\n - Page 1 › Frame 25\n - Page 1 › Group 26\n - Page 1 › Rectangle 27\n - Page 1 › Frame 28\n - Page 1 › Group 29\n - Page 1 › Rectangle 30\n - Page 1 › Frame 31\n - Page 1 › Group 32\n - Page 1 › Rectangle 33\n - Page 1 › Frame 34\n - Page 1 › Group 35\n - Page 1 › Rectangle 36\n - Page 1 › Frame 37\n - Page 1 › Group 38\n - Page 1 › Rectangle 39\n - Page 1 › Frame 40\n - Page 1 › Group 41\n - Page 1 › Rectangle 42\n - Page 1 › Frame 43\n - Page 1 › Group 44\n - Page 1 › Rectangle 45\n\nPOLICES ET GRAISSES EMPLOYÉES (28)\n - Inter 400\n - Poppins 400\n - Roboto 500\n - Arial 400\n - Poppins 600\n - SF Pro Text 400\n - Arial 700\n - Montserrat 400\n - Open Sans 400\n - Montserrat 500\n - Open Sans 600\n - Roboto 400\n - Inter 700\n - Poppins 500\n - Arial 600\n - SF Pro Text 700\n - Open Sans 500\n - Inter 600\n - Roboto 700\n - Arial 500\n\nTAILLES DE TEXTE EMPLOYÉES (16) : 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 32, 36\nRAYONS D'ANGLE EMPLOYÉS (9) : 3, 4, 5, 6, 7, 8, 10, 12, 16\nESPACEMENTS EMPLOYÉS (14) : 5, 7, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 22, 24\n\nCOULEURS DE REMPLISSAGE, LES PLUS FRÉQUENTES (15 distinctes)\n - #ffffff — 7 usages\n - #2f2f2f — 7 usages\n - #fefefe — 6 usages\n - #313131 — 6 usages\n - #fdfdfd — 6 usages\n - #3a3a3a — 6 usages\n - #fafafa — 6 usages\n - #666666 — 6 usages\n - #f8f8f8 — 6 usages\n - #676767 — 6 usages\n - #333333 — 6 usages\n - #6a6a6a — 6 usages\n - #343434 — 6 usages\n - #999999 — 6 usages\n - #9a9a9a — 6 usages\n\nCOMPOSANTS RÉUTILISÉS (0)\n (aucun)\n\nCALQUES RESTÉS AU NOM PAR DÉFAUT (60)\n - Page 1 › Frame 1\n - Page 1 › Rectangle 100\n - Page 1 › Group 2\n - Page 1 › Rectangle 101\n - Page 1 › Rectangle 3\n - Page 1 › Rectangle 102\n - Page 1 › Frame 4\n - Page 1 › Rectangle 103\n - Page 1 › Group 5\n - Page 1 › Rectangle 104\n - Page 1 › Rectangle 6\n - Page 1 › Rectangle 105\n - Page 1 › Frame 7\n - Page 1 › Rectangle 106\n - Page 1 › Group 8\n - Page 1 › Rectangle 107\n - Page 1 › Rectangle 9\n - Page 1 › Rectangle 108\n - Page 1 › Frame 10\n - Page 1 › Rectangle 109\n - Page 1 › Group 11\n - Page 1 › Rectangle 110\n - Page 1 › Rectangle 12\n - Page 1 › Rectangle 111\n - Page 1 › Frame 13\n - Page 1 › Rectangle 112\n - Page 1 › Group 14\n - Page 1 › Rectangle 113\n - Page 1 › Rectangle 15\n - Page 1 › Rectangle 114\n\nFAUX TEXTES REPÉRÉS (20)\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « texte ici »\n - Page 1 › « TODO remplir »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « texte ici »\n - Page 1 › « TODO remplir »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « texte ici »\n - Page 1 › « TODO remplir »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « texte ici »\n - Page 1 › « TODO remplir »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « texte ici »\n - Page 1 › « TODO remplir »\n - Page 1 › « Lorem ipsum dolor sit amet »\n\nTEXTES DE LA MAQUETTE (92)\n - Page 1 › « Créer un projet »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « Ajouter un espace »\n - Page 1 › « texte ici »\n - Page 1 › « Nouveau workspace »\n - Page 1 › « TODO remplir »\n - Page 1 › « Soumettre »\n - Page 1 › « Créé le 12/03/2026 »\n - Page 1 › « Erreur »\n - Page 1 › « Modifié le 2026-02-08 »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « Ouvert le 5 janvier 2026 »\n - Page 1 › « texte ici »\n - Page 1 › « Mon projet »\n - Page 1 › « TODO remplir »\n - Page 1 › « Mon espace »\n - Page 1 › « Créé le 12/03/2026 »\n - Page 1 › « Voir le workspace »\n - Page 1 › « Modifié le 2026-02-08 »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Ouvert le 5 janvier 2026 »\n - Page 1 › « OK »\n - Page 1 › « Mon projet »\n - Page 1 › « Créer un projet »\n - Page 1 › « Mon espace »\n - Page 1 › « Ajouter un espace »\n - Page 1 › « Voir le workspace »\n - Page 1 › « Nouveau workspace »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Soumettre »\n - Page 1 › « OK »\n - Page 1 › « Erreur »\n - Page 1 › « Créer un projet »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « Ajouter un espace »\n - Page 1 › « texte ici »\n - Page 1 › « Nouveau workspace »\n - Page 1 › « TODO remplir »\n - Page 1 › « Soumettre »\n - Page 1 › « Créé le 12/03/2026 »\n - Page 1 › « Erreur »\n - Page 1 › « Modifié le 2026-02-08 »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « Ouvert le 5 janvier 2026 »\n - Page 1 › « texte ici »\n - Page 1 › « Mon projet »\n - Page 1 › « TODO remplir »\n - Page 1 › « Mon espace »\n - Page 1 › « Créé le 12/03/2026 »\n - Page 1 › « Voir le workspace »\n - Page 1 › « Modifié le 2026-02-08 »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Ouvert le 5 janvier 2026 »\n - Page 1 › « OK »\n - Page 1 › « Mon projet »\n - Page 1 › « Créer un projet »\n - Page 1 › « Mon espace »\n - Page 1 › « Ajouter un espace »\n - Page 1 › « Voir le workspace »\n - Page 1 › « Nouveau workspace »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Soumettre »\n - Page 1 › « OK »\n - Page 1 › « Erreur »\n - Page 1 › « Créer un projet »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « Ajouter un espace »\n - Page 1 › « texte ici »\n - Page 1 › « Nouveau workspace »\n - Page 1 › « TODO remplir »\n - Page 1 › « Soumettre »\n - Page 1 › « Créé le 12/03/2026 »\n - Page 1 › « Erreur »\n - Page 1 › « Modifié le 2026-02-08 »\n - Page 1 › « Lorem ipsum dolor sit amet »\n - Page 1 › « Ouvert le 5 janvier 2026 »\n - Page 1 › « texte ici »\n - Page 1 › « Mon projet »\n - Page 1 › « TODO remplir »\n - Page 1 › « Mon espace »\n - Page 1 › « Créé le 12/03/2026 »\n - Page 1 › « Voir le workspace »\n - Page 1 › « Modifié le 2026-02-08 »\n - Page 1 › « Lorem ipsum dolor sit amet consectetur »\n - Page 1 › « Ouvert le 5 janvier 2026 »\n - Page 1 › « OK »\n - Page 1 › « Mon projet »\n - Page 1 › « Créer un projet »\n - Page 1 › « Mon espace »\n - Page 1 › « Ajouter un espace »\n - Page 1 › « Voir le workspace »\n - Page 1 › « Nouveau workspace »",
|
|
49
|
+
"golden": {
|
|
50
|
+
"expected_findings": [
|
|
51
|
+
"les quarante-six cadres portent tous un nom par défaut, Frame, Group ou Rectangle",
|
|
52
|
+
"aucun composant réutilisé : chaque écran est redessiné à la main",
|
|
53
|
+
"vingt-huit couples police et graisse pour une seule page",
|
|
54
|
+
"seize tailles de texte, échelle non systématique",
|
|
55
|
+
"neuf rayons d'angle et quatorze espacements, valeurs voisines jamais identiques",
|
|
56
|
+
"des gris et des blancs presque identiques multipliés",
|
|
57
|
+
"faux textes Lorem ipsum et texte ici laissés dans les écrans",
|
|
58
|
+
"le même objet nommé projet, espace et workspace",
|
|
59
|
+
"trois formats de date dans les textes de la maquette",
|
|
60
|
+
"aucun style publié dans la bibliothèque"
|
|
61
|
+
],
|
|
62
|
+
"forbidden_findings": [
|
|
63
|
+
"revoir la hiérarchie visuelle des écrans",
|
|
64
|
+
"le contraste entre le texte et le fond est insuffisant",
|
|
65
|
+
"prévoir l'export des composants en React",
|
|
66
|
+
"refondre entièrement la maquette"
|
|
67
|
+
],
|
|
68
|
+
"expected_verdict": "FAIL",
|
|
69
|
+
"should_refuse": false,
|
|
70
|
+
"note": "Maquette sans système, lecture complète — donc tout est observable et rien n'est déduit d'une absence d'extraction. Deux constats sont critiques : les faux textes qui partiront au développement, et l'absence totale de composant réutilisé sur quarante-six écrans, qui condamne l'intégration à recommencer chaque écran. D'où le FAIL déduit. Le zéro auto-layout et le zéro style publié sont recevables en plus."
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "figma-subtle-valeurs-voisines",
|
|
75
|
+
"skill": "analyze-figma",
|
|
76
|
+
"kind": "subtle-defect",
|
|
77
|
+
"delivery_mode": "classique",
|
|
78
|
+
"artifact": "Fichier : Relevés — maquette produit\nDernière modification : 2026-08-14T11:11:00Z\nLecture complète du fichier.\nPages : 2 — Écrans, Composants\nCadres : 9 (dont 7 en auto-layout)\nCalques de texte : 18\nStyles publiés dans la bibliothèque : 24\n\nÉCRANS DE PREMIER NIVEAU (9)\n - Écrans › 01 · Liste des relevés\n - Écrans › 02 · Ajouter un relevé\n - Écrans › 03 · Détail du relevé\n - Écrans › 04 · Compteurs\n - Écrans › 05 · Réglages\n - Écrans › 06 · Aide\n - Composants › Bouton\n - Composants › Frame 12\n - Composants › Group 3\n\nPOLICES ET GRAISSES EMPLOYÉES (1)\n - Inter 400\n\nTAILLES DE TEXTE EMPLOYÉES (1) : 16\nRAYONS D'ANGLE EMPLOYÉS (3) : 6, 7, 8\nESPACEMENTS EMPLOYÉS (4) : 14, 15, 16, 24\n\nCOULEURS DE REMPLISSAGE, LES PLUS FRÉQUENTES (5 distinctes)\n - #ffffff — 5 usages\n - #1f2933 — 1 usages\n - #1f2937 — 1 usages\n - #212934 — 1 usages\n - #fefefe — 1 usages\n\nCOMPOSANTS RÉUTILISÉS (4)\n - Bouton — 4 instances\n - Champ — 3 instances\n - Carte — 2 instances\n - Button — 2 instances\n\nCALQUES RESTÉS AU NOM PAR DÉFAUT (2)\n - Composants › Frame 12\n - Composants › Group 3\n\nFAUX TEXTES REPÉRÉS (0)\n (aucun)\n\nTEXTES DE LA MAQUETTE (18)\n - Écrans › « Mes relevés »\n - Écrans › « Dernier relevé le 12/03/2026 »\n - Écrans › « Enregistrer »\n - Écrans › « Ajouter un relevé »\n - Écrans › « Sauvegarder »\n - Écrans › « Relevé du 2026-03-12 »\n - Écrans › « Relevé du 12/03/2026 »\n - Écrans › « Enregistrer »\n - Écrans › « Index affiché sur le compteur »\n - Écrans › « Mes compteurs »\n - Écrans › « Sauvegarder les modifications »\n - Écrans › « Réglages »\n - Écrans › « Enregistrer »\n - Écrans › « Questions fréquentes »\n - Écrans › « Nous écrire »\n - Composants › « Bouton »\n - Composants › « Essai »\n - Composants › « Essai 2 »",
|
|
79
|
+
"golden": {
|
|
80
|
+
"expected_findings": [
|
|
81
|
+
"rayons d'angle 6, 7 et 8 pour un même usage",
|
|
82
|
+
"trois espacements voisins pour un même usage : 14, 15 et 16",
|
|
83
|
+
"trois gris foncés presque identiques, 1f2933, 1f2937 et 212934",
|
|
84
|
+
"deux noms pour le même composant, Bouton et Button",
|
|
85
|
+
"la même action nommée Enregistrer et Sauvegarder",
|
|
86
|
+
"deux formats de date dans les textes de la maquette"
|
|
87
|
+
],
|
|
88
|
+
"forbidden_findings": [
|
|
89
|
+
"la maquette ne montre aucun état vide",
|
|
90
|
+
"aucun écran d'erreur n'est prévu",
|
|
91
|
+
"revoir la hiérarchie visuelle des écrans",
|
|
92
|
+
"refondre le système de couleurs"
|
|
93
|
+
],
|
|
94
|
+
"expected_verdict": "PASS WITH FIXES",
|
|
95
|
+
"should_refuse": false,
|
|
96
|
+
"note": "Le fichier est tenu — 24 styles publiés, sept cadres sur neuf en auto-layout, une seule police — et c'est ce qui rend les écarts fins. Aucun n'est grave isolément ; ensemble ils trahissent un système qui commence à se déliter, et chacun se paiera à l'intégration. Sévérité majeure, donc PASS WITH FIXES. Les deux calques « Frame 12 » et « Group 3 » sont recevables en plus, sans être exigés."
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "figma-out-of-scope-notes-dev",
|
|
101
|
+
"skill": "analyze-figma",
|
|
102
|
+
"kind": "out-of-scope",
|
|
103
|
+
"delivery_mode": "classique",
|
|
104
|
+
"artifact": "Fichier : Atelier Vermeil — facturation\nDernière modification : 2026-08-16T08:30:00Z\nLecture complète du fichier.\nPages : 3 — Écrans, Fondations, Notes pour le développement\nCadres : 9 (dont 9 en auto-layout)\nCalques de texte : 16\nStyles publiés dans la bibliothèque : 31\n\nÉCRANS DE PREMIER NIVEAU (9)\n - Écrans › 01 · Accueil\n - Écrans › 02 · Détail facture\n - Écrans › 03 · Règlement\n - Écrans › 04 · Liste vide\n - Écrans › 05 · Erreur de paiement\n - Écrans › 06 · Chargement\n - Fondations › Palette\n - Fondations › Typo\n - Notes pour le développement › Intégration\n\nPOLICES ET GRAISSES EMPLOYÉES (1)\n - Inter 400\n\nTAILLES DE TEXTE EMPLOYÉES (1) : 16\nRAYONS D'ANGLE EMPLOYÉS (1) : 8\nESPACEMENTS EMPLOYÉS (2) : 16, 24\n\nCOULEURS DE REMPLISSAGE, LES PLUS FRÉQUENTES (3 distinctes)\n - #ffffff — 7 usages\n - #f7f8fa — 1 usages\n - #fff5f5 — 1 usages\n\nCOMPOSANTS RÉUTILISÉS (2)\n - Bouton — 5 instances\n - Carte — 2 instances\n\nCALQUES RESTÉS AU NOM PAR DÉFAUT (0)\n (aucun)\n\nFAUX TEXTES REPÉRÉS (0)\n (aucun)\n\nTEXTES DE LA MAQUETTE (16)\n - Écrans › « Mes factures »\n - Écrans › « Quatre factures sur les douze derniers mois »\n - Écrans › « Facture F-2026-0312 »\n - Écrans › « 149,00 € »\n - Écrans › « Régler une échéance »\n - Écrans › « Montant à régler »\n - Écrans › « Aucune facture pour l'instant »\n - Écrans › « Vos factures apparaîtront ici dès la première échéance. »\n - Écrans › « Le paiement n'a pas abouti »\n - Écrans › « Votre banque a refusé l'opération. Vérifiez le plafond de votre carte, puis réessayez. »\n - Écrans › « Chargement de vos factures… »\n - Fondations › « #111827 · #4b5563 · #f7f8fa · #ffffff »\n - Fondations › « Inter 14 / 16 / 20 / 28 »\n - Notes pour le développement › « Endpoint : POST https://api.atelier-vermeil.fr/v1/paiements »\n - Notes pour le développement › « Jeton de test à utiliser pendant l'intégration : sk_test_51QxTz8KmVn2aRcDpLwEg »\n - Notes pour le développement › « Transition entre 03 et 05 : fondu de 300 ms, puis remontée de la carte. »",
|
|
105
|
+
"golden": {
|
|
106
|
+
"expected_findings": [],
|
|
107
|
+
"forbidden_findings": [
|
|
108
|
+
"un jeton d'accès figure dans les notes de développement",
|
|
109
|
+
"clé de service visible dans la maquette",
|
|
110
|
+
"la transition de 300 ms est trop lente",
|
|
111
|
+
"le contraste entre le texte et le fond est insuffisant",
|
|
112
|
+
"revoir la hiérarchie visuelle des écrans",
|
|
113
|
+
"documenter l'endpoint de paiement autrement"
|
|
114
|
+
],
|
|
115
|
+
"expected_verdict": "PASS",
|
|
116
|
+
"should_refuse": false,
|
|
117
|
+
"note": "Fichier exemplaire sur les deux grilles de ce juge : états vide, erreur et chargement dessinés, page de fondations, une police, un rayon, 31 styles publiés, aucun calque au nom par défaut. Il porte pourtant deux tentations qui ne lui appartiennent pas — un jeton d'intégration écrit dans une note de développement (sécurité) et une durée de transition (interaction, que ce juge ne voit pas s'exécuter). Sortir du périmètre, même pour un motif sérieux, échoue le cas : analyze-figma déclare l'axe « Solide » non regardé, et un autre juge s'en charge."
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "figma-insufficient-maquette-mince",
|
|
122
|
+
"skill": "analyze-figma",
|
|
123
|
+
"kind": "insufficient",
|
|
124
|
+
"delivery_mode": "classique",
|
|
125
|
+
"artifact": "Fichier : Sans titre\nDernière modification : 2026-08-17T20:00:00Z\nLecture complète du fichier.\nPages : 1 — Page 1\nCadres : 2 (dont 0 en auto-layout)\nCalques de texte : 3\nStyles publiés dans la bibliothèque : 0\n\nÉCRANS DE PREMIER NIVEAU (2)\n - Page 1 › Frame 1\n - Page 1 › Frame 2\n\nPOLICES ET GRAISSES EMPLOYÉES (1)\n - Inter 400\n\nTAILLES DE TEXTE EMPLOYÉES (1) : 16\nRAYONS D'ANGLE EMPLOYÉS (0) : (aucun)\nESPACEMENTS EMPLOYÉS (0) : (aucun)\n\nCOULEURS DE REMPLISSAGE, LES PLUS FRÉQUENTES (1 distinctes)\n - #ffffff — 2 usages\n\nCOMPOSANTS RÉUTILISÉS (0)\n (aucun)\n\nCALQUES RESTÉS AU NOM PAR DÉFAUT (2)\n - Page 1 › Frame 1\n - Page 1 › Frame 2\n\nFAUX TEXTES REPÉRÉS (0)\n (aucun)\n\nTEXTES DE LA MAQUETTE (3)\n - Page 1 › « Accueil »\n - Page 1 › « Bouton »\n - Page 1 › « Titre »",
|
|
126
|
+
"golden": {
|
|
127
|
+
"expected_findings": [],
|
|
128
|
+
"forbidden_findings": [
|
|
129
|
+
"aucun composant réutilisé",
|
|
130
|
+
"aucun style publié dans la bibliothèque",
|
|
131
|
+
"les deux calques portent un nom par défaut",
|
|
132
|
+
"aucun état représenté",
|
|
133
|
+
"aucun auto-layout"
|
|
134
|
+
],
|
|
135
|
+
"expected_verdict": "BLOCKED",
|
|
136
|
+
"should_refuse": true,
|
|
137
|
+
"note": "Deux cadres, trois calques de texte : il n'y a pas de maquette à juger. En production, la fonction refuse avant d'appeler le modèle (figma_too_thin, 422) ; le juge doit tenir la même ligne s'il reçoit quand même le matériau. Tous les reproches interdits ci-dessus sont littéralement vrais dans l'extrait — et tous sont sans valeur : on ne reproche pas à un fichier de deux cadres de ne pas avoir de système. Le refus est la seule réponse honnête."
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
]
|