@mostajs/kind-catalog 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 (38) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +103 -0
  3. package/docs/00-ETAPE-INAUGURALE-KIND-CATALOG.md +105 -0
  4. package/docs/03bis-PROMPT-IMAGE-OBJECTIF-KIND-CATALOG.md +99 -0
  5. package/docs/09bis-MATRICE-SOURCING-KIND-CATALOG.md +176 -0
  6. package/docs/10-PRESENTATION-COMMERCIALE-KIND-CATALOG.md +140 -0
  7. package/docs/11-SLIDES-COMMERCIAL-KIND-CATALOG.md +154 -0
  8. package/docs/12-DOC-TECHNIQUE-KIND-CATALOG.md +164 -0
  9. package/docs/13-SLIDES-DEV-KIND-CATALOG.md +162 -0
  10. package/docs/14-PROMPT-IMAGE-KIND-CATALOG.md +88 -0
  11. package/docs/15-REVUE-SECURITE-KIND-CATALOG.md +98 -0
  12. package/docs/16-DPIA-CONFORMITE-KIND-CATALOG.md +100 -0
  13. package/docs/ARTICLE-SEO-KIND-CATALOG.md +96 -0
  14. package/docs/AUDIT-EXISTANT-KIND-CATALOG.md +127 -0
  15. package/docs/DEVTEST-PLAN.kind-catalog.json +412 -0
  16. package/docs/ETUDE-ETAT-ART-KIND-CATALOG-02092026.md +207 -0
  17. package/docs/PLAN-DEV-KIND-CATALOG.md +186 -0
  18. package/docs/PLAN-PUBLICATION-KIND-CATALOG.md +80 -0
  19. package/docs/PLAN-SUIVI-MONITORING.md +66 -0
  20. package/docs/PLAN-TESTS.md +79 -0
  21. package/docs/SEO-KEYWORDS-KIND-CATALOG.md +46 -0
  22. package/docs/articles/01-ARTICLE-KIND-CATALOG.md +229 -0
  23. package/kinds/acces.kind.mjs +48 -0
  24. package/kinds/apprentissage.kind.mjs +25 -0
  25. package/kinds/chiffres.kind.mjs +80 -0
  26. package/kinds/decision.kind.mjs +88 -0
  27. package/kinds/donnees.kind.mjs +108 -0
  28. package/kinds/ecran-service.kind.mjs +71 -0
  29. package/kinds/integration.kind.mjs +83 -0
  30. package/kinds/metier-optimisation.kind.mjs +210 -0
  31. package/kinds/traces.kind.mjs +39 -0
  32. package/llms.txt +34 -0
  33. package/package.json +46 -0
  34. package/src/catalogue.js +98 -0
  35. package/src/index.js +4 -0
  36. package/src/instance.js +85 -0
  37. package/src/kind.js +152 -0
  38. package/src/projection.js +76 -0
@@ -0,0 +1,88 @@
1
+ # Prompt d'image — le RÉSULTAT de `@mostajs/kind-catalog`
2
+
3
+ **Livrable #14** (DEVRULES §9) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+ **Version illustrée** : 0.1.0
5
+
6
+ > Le **#3.bis** montrait la cible **planifiée**, validée avant le code. Celui-ci montre ce qui est
7
+ > **réellement livré**. Les deux se comparent : l'écart est la mesure honnête de ce qui a dérivé.
8
+
9
+ ---
10
+
11
+ ## 1 · L'écart avec l'image de l'objectif — à lire d'abord
12
+
13
+ | ce que le #3.bis annonçait | ce qui est livré | écart |
14
+ |---|---|---|
15
+ | quatre stations : incident → fiche → projection → applications | **identique** | — |
16
+ | flèche de retour « écart tracé » | **identique** (`instantiate` + `emplois`) | — |
17
+ | bande de domaines, quatre pleines et cinq en contour | **dix domaines**, quatre pleins et **six** en contour | +1 : `apiculture`, demandée le 02/09 |
18
+ | deux boîtes grisées : `ro-pla`, `skill-library` | **identiques** | — |
19
+ | — | **une case « provenance » sur la fiche** | **AJOUT** — la règle « aucune fiche avant un cas réel » a été corrigée en cours de route |
20
+ | — | **un compteur : 12 fiches · 39 erreurs · 50 % éprouvé** | **AJOUT** — le chiffre qui engage |
21
+
22
+ **Le seul écart de fond est la provenance.** Le plan initial interdisait toute fiche sans incident
23
+ maison ; cela aurait laissé le catalogue vide dans six métiers où le savoir existe depuis des
24
+ décennies. La règle a été déplacée : elle porte sur le **galon** (`eprouve`), plus sur l'entrée.
25
+ L'image du résultat doit le montrer — c'est la décision la plus importante du cycle.
26
+
27
+ ## 2 · Ce que l'image doit faire comprendre
28
+
29
+ 1. Une fiche **naît d'une source déclarée** — incident, terrain, **ou corpus établi**.
30
+ 2. Le **verdict** dit ce qu'elle a traversé ; il ne se décerne pas.
31
+ 3. Elle **descend dans le plan de test** du projet.
32
+ 4. Ce que le terrain lui fait dire **remonte**.
33
+ 5. Le module **ne calcule rien et ne range rien**.
34
+
35
+ ## 3 · Le prompt
36
+
37
+ ```
38
+ Schéma technique 16:9, fond blanc cassé, style diagramme d'architecture logicielle sobre,
39
+ traits fins, palette restreinte : gris ardoise, un bleu profond pour le flux principal,
40
+ un rouge sombre réservé aux erreurs, un vert sourd réservé au verdict éprouvé.
41
+ Typographie sans-serif, étiquettes courtes.
42
+
43
+ Flux horizontal de gauche à droite en quatre stations reliées par des flèches pleines :
44
+
45
+ (1) TROIS sources empilées, chacune sur une ligne, avec sa pastille :
46
+ « corpus établi » (norme, guide) — pastille creuse ;
47
+ « terrain » (praticien nommé) — pastille demi-pleine ;
48
+ « incident » (défaut constaté, daté) — pastille pleine, liseré rouge sombre.
49
+ Légende : « toute fiche déclare d'où elle vient ».
50
+
51
+ (2) une carte-document aux cases visibles — énoncé, besoins, succès,
52
+ ERREURS (case plus haute, bordée de rouge sombre, portant « + conséquence »),
53
+ épreuve, PROVENANCE, VERDICT (petit galon vert sourd « éprouvé »).
54
+ Légende : « KIND — écrite une fois ».
55
+ Note discrète sous la carte : « éprouvé exige un fait — on ne se décerne pas l'expérience ».
56
+
57
+ (3) la carte se dédouble en deux blocs étiquetés « exigences » et « essais »,
58
+ marqués « mostajs-devtest/1 », légende « lue par l'outil de suivi, sans rien lui apprendre ».
59
+ Un petit fanion « draft » sur les exigences issues de fiches seulement proposées.
60
+
61
+ (4) trois fenêtres d'application alignées, la troisième vide et marquée « le prochain »,
62
+ recevant chacune la même carte. Légende « réutilisée ».
63
+
64
+ Flèche de retour fine, en pointillés, de (4) vers (2), étiquetée
65
+ « l'écart tracé — ce que cette application a affiné, et pourquoi ».
66
+
67
+ Bande inférieure de pastilles de domaines : quatre PLEINES
68
+ (accès, données, apprentissage, décision) puis six en CONTOUR SEUL
69
+ (BTP, alimentaire, élevage, apiculture, agronomie, électronique).
70
+
71
+ Encart chiffré en bas à droite, discret, en trois lignes :
72
+ « 12 fiches · 39 erreurs cataloguées · 50 % éprouvé ».
73
+
74
+ Marge droite, hors du flux, deux boîtes grisées reliées par des traits fins :
75
+ « ro-pla — les moteurs » et « skill-library — l'efficacité mesurée »,
76
+ sous-titre « composés, pas réécrits ».
77
+
78
+ Pas de cylindre de base de données, pas d'engrenage, pas de flèche circulaire autour du
79
+ module, pas d'arbre de classement, pas de logo, pas de visage, pas de métaphore.
80
+ ```
81
+
82
+ ## 4 · Critère d'acceptation
83
+
84
+ Mêmes trois questions que le #3.bis, plus une quatrième propre au résultat :
85
+
86
+ 4. *Une fiche tirée d'une norme a-t-elle sa place au catalogue ?* → **oui, en `propose`**.
87
+
88
+ Si la réponse est « non », l'image reproduit la règle **abandonnée**, et elle est refaite.
@@ -0,0 +1,98 @@
1
+ # Revue de sécurité & abus — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #15** (DEVRULES §9, §11.2 — **informatif**) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com>
4
+ **Date** : 2026-09-02 · **Version** : 0.1.0
5
+
6
+ ---
7
+
8
+ ## 1 · Surface d'attaque — ce qui existe vraiment
9
+
10
+ | surface | présente ? | note |
11
+ |---|---|---|
12
+ | port réseau, serveur | **non** | le module n'écoute rien |
13
+ | base de données, dépôt | **non** | il ne stocke rien |
14
+ | appel sortant (HTTP, DNS) | **non** | aucune dépendance de production |
15
+ | secret, clé, jeton | **non** | il n'en manipule aucun |
16
+ | exécution de code | **OUI** | `loadCatalogue()` **importe des modules** |
17
+ | entrée utilisateur | oui, indirecte | les fiches, et les données passées à `instantiate` |
18
+ | sortie vers un tiers | oui | le plan projeté part vers **qatrax** |
19
+
20
+ ## 2 · ⚠️ LE RISQUE PRINCIPAL — le corpus est du CODE, pas de la donnée
21
+
22
+ `loadCatalogue(dir)` fait un `import()` dynamique de chaque `*.kind.mjs`. **Charger un corpus, c'est
23
+ exécuter du code**, avec tous les droits du processus appelant.
24
+
25
+ | acteur | scénario | conséquence |
26
+ |---|---|---|
27
+ | qui peut écrire dans `kinds/` | dépose un `.kind.mjs` malveillant | **exécution arbitraire** au premier `loadCatalogue()` — lecture de secrets, exfiltration, tout |
28
+ | un contributeur du dépôt | glisse un effet de bord dans une fiche | idem, revu comme un « document » alors que c'est du code |
29
+ | une chaîne d'intégration | charge un corpus tiers non audité | idem, sur la machine de build |
30
+
31
+ **Ce n'est pas un défaut du module : c'est la conséquence du choix « fiches = fichiers versionnés ».**
32
+ Le même choix donne l'historique, la relecture et la discussion — il faut en payer le prix.
33
+
34
+ ### Mesures
35
+
36
+ | mesure | état |
37
+ |---|---|
38
+ | **une fiche se revoit comme du code**, pas comme un document — revue obligatoire en PR | **règle, à tenir** |
39
+ | **ne jamais charger un corpus dont on ne contrôle pas l'écriture** (téléversement, dossier partagé, dépendance non épinglée) | **règle, à tenir** |
40
+ | `T-KC-12` interdit déjà `require(`, `writeFile`, `createConnection` **dans `src/`** | ✔ automatisé |
41
+ | ⚠️ **aucun contrôle équivalent sur `kinds/`** — une fiche PEUT faire ce qu'elle veut | **ouvert** |
42
+ | corpus **déclaratif** (JSON/YAML) plutôt qu'exécutable | **écarté en 0.1.0** — perdrait `defineKind()` et sa validation au montage. **À rouvrir** si un corpus tiers devient un cas d'usage |
43
+
44
+ **Recommandation pour 0.2.0** : étendre le contrôle de `T-KC-12` aux fichiers de `kinds/` (aucun
45
+ `import` autre que `defineKind`, aucun appel de fonction hors `defineKind`). Cela ne supprime pas le
46
+ risque — un fichier importé s'exécute — mais il le rend visible en revue et en CI.
47
+
48
+ ## 3 · Ce que la validation NE vérifie PAS
49
+
50
+ **La provenance est déclarative.** `validateKind` contrôle la **forme** d'une origine — un `type`
51
+ connu, une `source` non vide — **jamais sa vérité**. Rien n'empêche d'écrire :
52
+
53
+ ```js
54
+ origine: [{ type: 'incident', source: 'inventé de toutes pièces', date: '2026-09-02' }]
55
+ verdict: 'eprouve'
56
+ ```
57
+
58
+ **Le module ne peut pas le détecter, et ne le prétend pas.** C'est une garantie **de procédure**,
59
+ pas de technique : la revue de la fiche, et l'exigence que l'`origine` d'un incident cite un
60
+ fichier et une date **vérifiables dans le dépôt**.
61
+
62
+ > C'est la limite honnête du dispositif, et elle doit être dite au client comme à l'investisseur :
63
+ > le taux éprouvé mesure une **discipline**, pas une preuve cryptographique.
64
+
65
+ ## 4 · Autres scénarios d'abus
66
+
67
+ | scénario | conséquence | parade |
68
+ |---|---|---|
69
+ | une fiche injecte du contenu dans `description` (le plan projeté part chez qatrax) | contenu arbitraire affiché dans l'outil de suivi | qatrax échappe ses sorties ; **la vraie parade est la revue de la fiche** |
70
+ | deux applications choisissent le même `prefix` | leurs exigences collisionnent dans un même qatrax | **non détecté par le module** — convention d'organisation ; `T-KC-7` prouve seulement que des préfixes distincts isolent |
71
+ | `ref` réutilisée après un `ecarte` | on cite une fiche pour une autre | `auditCatalogue` détecte le doublon **dans un même corpus**, pas dans le temps |
72
+ | déni de service par corpus géant | `loadCatalogue` charge tout en mémoire | usage hors ligne, en CI ; **non traité**, et assumé |
73
+
74
+ ## 5 · §11.2 — OWASP LLM : NON APPLICABLE, et voici pourquoi
75
+
76
+ Aucun modèle de langage n'est employé : ni invite, ni sortie de modèle, ni outil à effet de bord.
77
+ **Aucune injection d'invite n'est possible faute d'invite.**
78
+
79
+ Cette absence est une **conséquence**, pas un oubli. Le jour où une reformulation en langue
80
+ naturelle serait ajoutée — par exemple pour rédiger une fiche à partir d'un récit d'incident —
81
+ cette porte devra être franchie, et cette section réécrite.
82
+
83
+ ## 6 · Effets de bord — le contrôle qui tient
84
+
85
+ `T-KC-12` exerce toute la surface publique contre un dépôt **piégé** et compte les touches : zéro.
86
+ Il relit aussi les sources pour interdire `require(`, l'import de `ro-pla`, `writeFile` et
87
+ `createConnection` hors de `catalogue.js`.
88
+
89
+ **Une garantie tenue par la seule intention se perd à la version suivante.** Celle-ci est comptée.
90
+
91
+ ## 7 · Synthèse
92
+
93
+ | | |
94
+ |---|---|
95
+ | risque **élevé** | **le corpus est du code exécutable** — §2 |
96
+ | risque **moyen** | provenance déclarative, non vérifiable — §3 |
97
+ | risque **faible** | collision de préfixes, contenu injecté dans le plan — §4 |
98
+ | **hors sujet** | secrets, réseau, stockage, LLM |
@@ -0,0 +1,100 @@
1
+ # DPIA & conformité — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #16** (DEVRULES §9, §11.3 — **informatif**) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com>
4
+ **Date** : 2026-09-02 · **Version** : 0.1.0
5
+
6
+ ---
7
+
8
+ ## 1 · Le module traite-t-il des données personnelles ?
9
+
10
+ **Réponse courte : pas dans son fonctionnement — mais son CORPUS peut en contenir.**
11
+
12
+ | ce que le module manipule | donnée personnelle ? |
13
+ |---|---|
14
+ | l'énoncé, les besoins, les critères de succès d'une fiche | non |
15
+ | les erreurs connues et leurs conséquences | non |
16
+ | le plan projeté (`mostajs-devtest/1`) | non |
17
+ | **le champ `origine`** | **OUI, potentiellement** |
18
+
19
+ ## 2 · ⚠️ Le point à traiter : `origine.type = 'terrain'`
20
+
21
+ La définition retenue est : *« le dire d'un praticien, **nommé et daté** »*. Nommer un praticien,
22
+ c'est traiter une donnée personnelle — et le fichier est **versionné, publié sur npm, et poussé sur
23
+ GitHub**. Autrement dit : **public, indexable et pratiquement indélébile**.
24
+
25
+ Trois traitements distincts, à ne pas confondre :
26
+
27
+ | cas | donnée | risque |
28
+ |---|---|---|
29
+ | `type: 'reference'` | un titre, un auteur d'ouvrage, une norme | **aucun** — donnée bibliographique publique |
30
+ | `type: 'incident'` | un fichier, une date, une application | **aucun** en principe — sauf si le chemin ou le message contient un nom |
31
+ | **`type: 'terrain'`** | **le nom d'une personne physique** | **réel** — publication, durée illimitée, hors de son contrôle |
32
+
33
+ ### La règle retenue
34
+
35
+ > **Un `terrain` se cite par son RÔLE et son organisation, jamais par son nom** — sauf accord
36
+ > écrit de l'intéressé, mentionné dans la source.
37
+ >
38
+ > `source: 'chef de culture, exploitation X, entretien du 12/09/2026'` ✔
39
+ > `source: 'M. Untel'` ✘
40
+
41
+ **Motif** : la valeur documentaire est identique — ce qui compte est la **qualité** de celui qui
42
+ parle, pas son identité — et le risque disparaît. Un nom n'ajoute rien à la fiche ; il ajoute une
43
+ obligation à vie.
44
+
45
+ ⚠️ **Cette règle n'est PAS contrôlée par le code en 0.1.0.** `validateKind` vérifie que `source`
46
+ n'est pas vide, pas qu'elle est anonymisée. C'est une **règle de revue**, et elle doit figurer dans
47
+ la revue de toute fiche `terrain`.
48
+
49
+ ## 3 · Les autres traitements
50
+
51
+ **Chemins de fichiers et messages d'incident.** Une origine `incident` cite un fichier et une date.
52
+ Un chemin peut contenir un nom d'utilisateur (`/home/prenom/…`). **À normaliser à la racine du
53
+ dépôt** avant publication — le corpus livré aujourd'hui n'en contient aucun, vérifiable.
54
+
55
+ **Aucun transfert.** Le module n'émet aucune requête. Le plan projeté est poussé vers **qatrax**,
56
+ instance de l'éditeur — pas de tiers, pas de sous-traitant hors périmètre.
57
+
58
+ **Aucune conservation.** Le module ne stocke rien : il n'y a ni durée de conservation, ni purge à
59
+ définir. Ce qui se conserve, ce sont les **fichiers** du dépôt, avec l'historique git.
60
+
61
+ ## 4 · Souveraineté
62
+
63
+ | | |
64
+ |---|---|
65
+ | hébergement du corpus | dépôt de l'éditeur + npm (registre public) |
66
+ | dépendances de production | **aucune** — donc aucune chaîne d'approvisionnement à auditer côté runtime |
67
+ | appels sortants | **aucun** |
68
+ | licence | **AGPL-3.0-or-later** — le code reste ouvert et vérifiable |
69
+
70
+ ## 5 · Droits des personnes — la difficulté propre à un corpus versionné
71
+
72
+ Si une fiche `terrain` nommait une personne et que celle-ci demandait l'effacement :
73
+
74
+ - **retirer la mention** de la fiche : faisable, immédiat ;
75
+ - **effacer l'historique git** : possible mais lourd (réécriture, `--force-with-lease`, coordination
76
+ des clones) ;
77
+ - **effacer les versions npm déjà publiées** : **impossible en pratique** — dépublier est
78
+ déconseillé et les copies existent.
79
+
80
+ > **C'est précisément pourquoi la règle du §2 est préventive et non curative.** On n'écrit pas un
81
+ > nom qu'on ne pourra pas retirer.
82
+
83
+ ## 6 · Recommandations
84
+
85
+ | # | recommandation | échéance |
86
+ |---|---|---|
87
+ | 1 | citer les `terrain` par **rôle + organisation + date**, jamais par nom | **immédiat**, règle de revue |
88
+ | 2 | normaliser les chemins de fichiers à la racine du dépôt dans les `incident` | immédiat |
89
+ | 3 | ajouter un contrôle automatique : refuser une `source` qui ressemble à un nom propre isolé | **0.2.0** — imparfait par nature, mais il attrape l'étourderie |
90
+ | 4 | mentionner cette section dans le gabarit de revue d'une fiche `terrain` | immédiat |
91
+
92
+ ## 7 · Verdict
93
+
94
+ **Traitement de données personnelles : marginal et évitable.** Aucun DPIA complet n'est requis pour
95
+ le module lui-même. La seule exposition réelle est le champ `origine.terrain`, et elle se referme
96
+ par une **règle d'écriture** — pas par une mesure technique.
97
+
98
+ ⚠️ Ce document couvre **le module**. Une application qui l'emploie traite, elle, des données
99
+ personnelles (élèves, clients, exploitants) : son propre DPIA reste entier et ne s'appuie pas sur
100
+ celui-ci.
@@ -0,0 +1,96 @@
1
+ # Ce que les catalogues d'erreurs nous apprennent sur les exigences
2
+
3
+ **Livrable #8** (part 2/2) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+
5
+ ---
6
+
7
+ ## Un défaut coûte deux fois : la première pour le trouver, la seconde pour le retrouver
8
+
9
+ En une semaine, sur deux applications en production — une école de langues, un restaurant — nous
10
+ avons trouvé cinq défauts. Aucun ne plantait. Tous étaient silencieux :
11
+
12
+ - une note d'élève enregistrée **sans son niveau**, découverte douze écrans plus loin, quand le
13
+ certificat a répondu « aucun niveau atteint » sur un élève qui avait ses notes ;
14
+ - un secrétariat porteur du droit de lire les dossiers familiaux, et dont **l'écran s'ouvrait sur
15
+ une liste vide** — la capacité sans le périmètre, c'est-à-dire rien ;
16
+ - une leçon terminée qui **redevenait à faire** quand l'élève la relisait ;
17
+ - un compte-rendu **écrasé** par la correction de la note qui l'accompagnait ;
18
+ - une reprise de données qui annonçait « 2 lignes reprises » et dont le travail **avait disparu le
19
+ lendemain**, écrasé par l'application vivante.
20
+
21
+ Cinq défauts, cinq domaines différents, une seule chose en commun : **aucun n'était nouveau**. Ils
22
+ ont tous une littérature, un nom, parfois une norme. Et pourtant rien ne les attendait.
23
+
24
+ ## La sécurité a résolu ce problème il y a vingt ans
25
+
26
+ Personne, en sécurité applicative, ne redécouvre l'injection SQL. Elle porte un numéro — `CWE-89` —
27
+ et cette entrée porte sa description, **ses conséquences**, ses exemples et sa détection. Un
28
+ scanner la connaît. Un développeur peut la citer. Elle désigne la même chose pour tout le monde
29
+ depuis vingt ans.
30
+
31
+ Trois choses font que ce catalogue marche, et elles ne sont pas évidentes :
32
+
33
+ **1. Chaque entrée porte sa conséquence.** « Valider les entrées » ne se retient pas. « Sans
34
+ validation, l'utilisateur choisit la requête » se retient. C'est la différence entre une consigne
35
+ et un avertissement.
36
+
37
+ **2. Il est nourri par des faits.** ATT&CK ne consigne que des techniques **observées**. Un
38
+ catalogue nourri d'idées grossit vite et ne sert jamais.
39
+
40
+ **3. Il est branché.** CWE alimente des scanners. C'est ce qui le rend appliqué plutôt que
41
+ consulté.
42
+
43
+ ## L'exigence, elle, n'a jamais eu son CWE
44
+
45
+ Il existe pourtant un catalogue de patrons d'exigences réutilisables — *Software Requirement
46
+ Patterns*, Stephen Withall, 2007. Excellent, complet. **Et il est resté un livre**, parce qu'il
47
+ n'était branché à rien.
48
+
49
+ C'est l'écart que nous occupons : une fiche qui porte l'**énoncé**, les **critères de succès**, les
50
+ **erreurs connues avec leur conséquence** et les **épreuves** — et qui **descend dans le plan de
51
+ test du projet**. Pas dans un document parallèle : dans le plan que l'équipe exécute déjà.
52
+
53
+ ## Le champ qui change tout : « erreurs »
54
+
55
+ Voici ce que porte notre fiche sur le périmètre d'accès, tirée mot pour mot de la production :
56
+
57
+ > **la capacité est prise pour le périmètre** → *un enseignant pointe la séance d'un collègue, un
58
+ > parent lit le dossier d'un autre enfant — avec exactement les mêmes droits, et l'écran ne montre
59
+ > rien d'anormal.*
60
+ >
61
+ > **le cumul de rôles desserre la garde** → *ajouter un rôle ÉLARGIT le périmètre — c'est l'inverse
62
+ > de ce qu'une garde doit faire.*
63
+ >
64
+ > **le champ porteur est vide** → *`undefined === undefined` vaut vrai : l'instance est donnée à
65
+ > tout le monde, et seuls les enregistrements incomplets sont touchés.*
66
+
67
+ Un développeur qui lit cela avant d'écrire ne perdra pas la semaine que nous avons perdue.
68
+
69
+ ## Ce que le métier nous a appris en retour
70
+
71
+ Nous avons ouvert le catalogue à six métiers : BTP, alimentaire, élevage, apiculture, agronomie,
72
+ électronique. Chacun a **son propre catalogue depuis des décennies** — DTU, HACCP, plans de
73
+ rationnement, guides de bonnes pratiques, *design rules*. Et deux d'entre eux nous ont corrigés :
74
+
75
+ **HACCP va plus loin que CWE.** Pour chaque danger, il exige non seulement la conséquence, mais
76
+ **ce qu'on fait quand la limite est franchie**. Un catalogue d'erreurs *actionnable*.
77
+
78
+ **L'apiculture nous a appris à refuser.** Une miellée dure quelques jours par an. Un apiculteur de
79
+ dix ans d'expérience dispose de **dix points**, dont aucun n'est comparable à l'autre. Aucune
80
+ prévision statistique n'y tient — et le dire vaut mieux que le calculer. Cela nous a fait corriger
81
+ une fiche transverse : **un seuil de données s'exprime en cycles, jamais en jours.** Deux saisons
82
+ font deux semaines en restauration, deux ans en grande culture.
83
+
84
+ ## Un outil qui sait refuser
85
+
86
+ C'est peut-être le point le plus contre-intuitif. Un outil d'aide à la décision qui répond toujours
87
+ inspire confiance jusqu'au premier chiffre invérifiable. Un outil qui dit *« il manque onze jours
88
+ d'observation »* se corrige.
89
+
90
+ « Pas disponible » n'apprend rien. « Il manque onze jours » se corrige. C'est toute la différence,
91
+ et elle tient dans une phrase de la fiche.
92
+
93
+ ---
94
+
95
+ **`@mostajs/kind-catalog`** — AGPL-3.0-or-later. 12 fiches, 39 erreurs cataloguées, 10 domaines.
96
+ Le catalogue ne calcule rien : il décrit, valide, et projette dans le plan de test du projet.
@@ -0,0 +1,127 @@
1
+ # Audit de l'existant — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #2** (DEVRULES §9) · application de la **règle d'or §0** · **cas C** (§2)
4
+
5
+ **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
6
+ **Emplacement retenu** : `mostajs/mosta-optimization-stack/` — aux côtés de `ro-pla`
7
+ *(décision du 02/09/2026 : « sa place est avec les ro-pla »)*
8
+
9
+ ---
10
+
11
+ ## 4.1 · Le besoin
12
+
13
+ **Directive du 02/09/2026** :
14
+
15
+ > *le catalogue dans un module à part que qatrax pourra lire, et que les kinds soient réutilisés ou
16
+ > affinés pour toute nouvelle utilisation dans les applications passées et futures.*
17
+
18
+ Un **kind** est une **fiche d'exigence réutilisable** : une question qu'un métier se pose, avec ce
19
+ qu'il faut pour y répondre, comment on l'éprouve, à quoi on reconnaît une bonne réponse, et **les
20
+ façons connues de se tromper**. Aujourd'hui, cette matière existe — mais éparpillée et non
21
+ réutilisable :
22
+
23
+ | où elle vit aujourd'hui | ce qui s'y trouve | pourquoi c'est perdu |
24
+ |---|---|---|
25
+ | `docs/DEVTEST-PLAN.*.json` (une par application) | exigences, essais, refus attendus | **recopiés** d'un projet à l'autre, jamais reliés |
26
+ | `llms.txt` (237 modules) | `RÔLE`, `PIÈGES` | lisibles par un humain, **pas projetables** |
27
+ | `SOLVEURS` de RestoTrax, `solveursDe()` d'ATC | question, condition, seuils | **deux écritures du même raisonnement** |
28
+ | têtes de fichiers, CHANGELOGs | les défauts trouvés et pourquoi | **jamais** relus par un autre projet |
29
+
30
+ Le coût est mesurable dans cette seule session : quatre défauts trouvés en recette ATC
31
+ (note sans niveau, capacité sans périmètre, page annonçant un incrément livré, écriture sqljs hors
32
+ application) sont **génériques** — ils reparaîtront ailleurs, et rien ne les y attend.
33
+
34
+ ## 4.2 · Application de la règle d'or (§0)
35
+
36
+ | module candidat | ce qu'il fait | pourquoi il ne suffit pas |
37
+ |---|---|---|
38
+ | **`@mostajs/qa-engine`** (`./devtest`) | lit, valide et importe un plan `mostajs-devtest/1` | il **valide un plan d'application**, il ne porte aucun **catalogue réutilisable** : rien n'y est partagé entre projets |
39
+ | **`@mostajs/skill-library`** | mémorise des **recettes** de résolution par signature, avec indice d'efficacité | elle sait *comment bien résoudre*, pas *si la question mérite d'être posée ni ce qui la rend fausse*. **Complémentaire, pas substituable** |
40
+ | **`@mostajs/ro-pla`** (`listSolvers`, `pickBest`) | registre de **dialectes** par `kind` technique | son `kind` est un type de problème mathématique, pas une **exigence métier** |
41
+ | **`@mostajs/dialect-registry`** | sélection d'implémentation par nom | mécanisme de choix, sans contenu |
42
+ | **`@mostajs/rules`**, **`@mostajs/intent-router`** | règles d'exécution, routage d'intention | décident **à l'exécution** ; une fiche `kind` se lit **avant** d'écrire du code |
43
+
44
+ **Conclusion : cas C**, mais un cas C **mince**, qui compose `qa-engine` et voisine `skill-library`.
45
+
46
+ ## 4.3 · L'argumentation — les trois décisions structurantes
47
+
48
+ ### a) Un kind ne définit AUCUN format nouveau : il se PROJETTE en `mostajs-devtest/1`
49
+
50
+ C'est la façon la plus sûre de rendre le catalogue lisible par qatrax : **ne rien lui apprendre**.
51
+ Une fiche se projette en `specs` + `tests` du plan que qatrax parse déjà depuis toujours.
52
+
53
+ > Inventer un second format aurait demandé un second validateur, un second import, un second
54
+ > écran — et le jour où les deux divergent, c'est le catalogue qui aurait raison contre les faits.
55
+
56
+ ### b) Le catalogue est un CORPUS DE FICHIERS ; les instances vivent dans les applications
57
+
58
+ Une fiche `kind` est un **document éditorial** : elle se lit, se discute, se relit six mois plus
59
+ tard, et son historique est celui d'un fichier versionné. Elle ne va pas en base.
60
+
61
+ Ce qui va en base, c'est ce que produit son **usage** — exécutions, indices d'efficacité, retours
62
+ d'utilisateur — et cela appartient déjà à `skill-library` et au journal d'`assistant-pilote`.
63
+
64
+ **Les deux ne se rangent pas au même endroit parce qu'ils n'ont pas la même durée de vie : la
65
+ fiche se relit, le journal s'entasse.**
66
+
67
+ ### c) RÉUTILISER ou AFFINER — et l'affinage se TRACE
68
+
69
+ Une application n'utilise pas une fiche : elle l'**instancie**. L'instance porte
70
+ `kind`, `kindVersion`, ses `refs` propres, et **la liste de ce qu'elle a affiné**. C'est ce qui
71
+ rend l'affinage sûr dans les deux sens :
72
+
73
+ - **vers l'avant** — on sait quelles applications emploient un kind, donc qui prévenir quand il
74
+ change ;
75
+ - **vers l'arrière** — une application ancienne dit ce qu'elle avait dû changer, et cet écart est
76
+ **la première matière** de la version suivante de la fiche.
77
+
78
+ > Sans cette trace, « réutiliser » se dégrade en « recopier », et l'on revient à l'état actuel :
79
+ > quatre plans DEVTEST qui se ressemblent sans jamais se parler.
80
+
81
+ ## 4.4 · Discussion du besoin — ce que le module NE fera PAS
82
+
83
+ - **Il n'exécute rien.** Ni solveur, ni essai, ni règle. Il décrit et projette.
84
+ - **Il ne stocke rien.** Aucun schéma, aucun dépôt, aucun `register` de persistance.
85
+ - **Il ne remplace pas les plans d'application.** Un plan reste propre à son application ; le
86
+ catalogue lui fournit des exigences **déjà écrites et déjà éprouvées ailleurs**.
87
+ - **Il ne classe pas les kinds par algorithme.** Un kind est une **question**, pas un dialecte :
88
+ `ro-pla` en propose 23 pour 12 familles, et plusieurs questions métier partagent le même moteur.
89
+
90
+ ## 4.5 · Documentation technique — la surface ENVISAGÉE
91
+
92
+ > ⚠️ **Esquisse, pas contrat.** La surface définitive est fixée par le livrable **#3**
93
+ > (`PLAN-DEV-KIND-CATALOG.md`) et éprouvée par le **#4** (`PLAN-TESTS.md`). Rien ne se code avant.
94
+
95
+ ```js
96
+ import { defineKind, validateKind, toDevtest, instantiate, catalogue } from '@mostajs/kind-catalog';
97
+
98
+ const k = defineKind({
99
+ ref: 'KIND-PERIMETRE-01',
100
+ enonce: 'Une permission ouvre une CAPACITÉ, jamais un PÉRIMÈTRE.',
101
+ domaine: 'acces',
102
+ besoins: [{ nom: 'lien d’appartenance', forme: '(agent, instance) => bool' }],
103
+ utilisation: 'Toute application où un rôle agit sur des instances qui ne sont pas toutes siennes.',
104
+ succes: ['le porteur agit sur les siennes', 'il est refusé sur celles d’autrui'],
105
+ erreurs: [
106
+ { titre: 'le cumul de rôles desserre la garde', consequence: 'ajouter un rôle ÉLARGIT le périmètre' },
107
+ { titre: 'le champ porteur est vide', consequence: '`undefined === undefined` donne l’instance à tout le monde' },
108
+ ],
109
+ test: [{ action: 'agir sur l’instance d’un autre', attendu: 'refus, sans nommer l’instance' }],
110
+ verdict: 'eprouve',
111
+ });
112
+
113
+ toDevtest([k], { project: { key: 'atc', name: 'ATC' }, prefix: 'ATC' }); // → mostajs-devtest/1
114
+ instantiate(k, { prefix: 'ATC', affine: { succes: [...] } }); // → instance TRACÉE
115
+ ```
116
+
117
+ - **Couche N1** (générique transverse) : dépend de `@mostajs/qa-engine` pour la **conformité** de
118
+ ce qu'il projette, et de rien d'autre.
119
+ - **Aucune dépendance runtime lourde**, aucune UI, aucun stockage.
120
+
121
+ ## 5 · Verdict de l'audit
122
+
123
+ **Cas C** — un module à créer, mais **mince** : quatre besoins précis (B1, B2, B4, B5 de l'étape
124
+ inaugurale) et rien d'autre. Tout le reste est composé, sans extension d'aucun module existant.
125
+
126
+ La suite du §9 s'applique dans l'ordre : **#3** plan de développement, **#3.bis** image de
127
+ l'OBJECTIF, **#4** plan de test — **puis** le code.