@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,186 @@
1
+ # Plan de développement — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #3** (DEVRULES §9) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+ **Couche** : N1 · **Pile** : `mosta-optimization-stack` · **Licence** : AGPL-3.0-or-later
5
+
6
+ Amont : `00-ETAPE-INAUGURALE`, `ETUDE-ETAT-ART-…`, `AUDIT-EXISTANT-…`.
7
+
8
+ ---
9
+
10
+ ## 1 · Périmètre
11
+
12
+ **Le module décrit, valide et projette. Il n'exécute rien et ne stocke rien.**
13
+
14
+ | dans le périmètre | hors périmètre, et où cela vit |
15
+ |---|---|
16
+ | la **fiche** `kind` et sa validation | l'exécution d'un solveur → `@mostajs/ro-pla` |
17
+ | la **projection** en `mostajs-devtest/1` | la validation de ce plan → `@mostajs/qa-engine` |
18
+ | l'**instanciation tracée** dans une application | l'activation sous condition → `@mostajs/assistant-pilote` |
19
+ | l'**index** du corpus (qui emploie quoi) | l'efficacité et le retour d'usage → `@mostajs/skill-library` |
20
+ | — | la **persistance** : les fiches sont des **fichiers versionnés** (§3) |
21
+
22
+ ## 2 · Architecture
23
+
24
+ ```
25
+ kinds/*.kind.mjs ← LE CORPUS : une fiche = un fichier versionné
26
+ │ defineKind()
27
+
28
+ src/kind.js cœur PUR — définir, valider
29
+ src/projection.js fiche(s) ──► mostajs-devtest/1 (lu par qa-engine, importé par qatrax)
30
+ src/instance.js fiche + application ──► instance TRACÉE (ce qui a été affiné)
31
+ src/catalogue.js charger le corpus, chercher, indexer les emplois
32
+ src/index.js surface publique
33
+ ```
34
+
35
+ **Aucune I/O dans le cœur.** `catalogue.js` est le seul à lire des fichiers, et il reçoit son
36
+ chemin — il ne le devine pas.
37
+
38
+ ## 3 · La décision de stockage, et son motif
39
+
40
+ **Les fiches sont des FICHIERS VERSIONNÉS. Les données d'usage vont en base — ailleurs.**
41
+
42
+ | | la fiche | les données d'usage |
43
+ |---|---|---|
44
+ | nature | document éditorial | journal qui s'accumule |
45
+ | durée de vie | se relit six mois plus tard | s'entasse et se purge |
46
+ | ce qui l'écrit | un humain, en discutant | l'exécution |
47
+ | support | **fichier versionné** (le modèle ADR) | **dépôt injecté** — `skill-library`, journal `assistant-pilote` |
48
+
49
+ > Les deux ne se rangent pas au même endroit **parce qu'ils n'ont pas la même durée de vie**.
50
+ > Mettre les fiches en base leur ferait perdre l'historique de discussion qui fait leur valeur ;
51
+ > mettre le journal en fichiers le rendrait ingérable au premier millier de lignes.
52
+
53
+ ## 4 · La surface publique (contrat 0.1.0)
54
+
55
+ ```js
56
+ // — définir et valider —
57
+ defineKind(fiche) -> Kind (gelé) // refuse au montage, en NOMMANT ce qui manque
58
+ validateKind(fiche) -> string[] // la liste complète, pour corriger d'un coup
59
+ VERDICTS = ['propose','eprouve','retenu','ecarte']
60
+
61
+ // — projeter, sans inventer de format —
62
+ toDevtest(kinds, { project, prefix }) -> plan mostajs-devtest/1
63
+
64
+ // — réutiliser ou AFFINER, en traçant —
65
+ instantiate(kind, { app, prefix, affine? }) -> Instance // porte kind, kindVersion, affinages
66
+ diffInstance(instance) -> string[] // ce que cette application a changé, et pourquoi
67
+
68
+ // — le corpus —
69
+ loadCatalogue(dir) -> Kind[] // seule I/O du module
70
+ findKinds(kinds, { domaine?, texte?, verdict? }) -> Kind[]
71
+ ```
72
+
73
+ ### Les champs de la fiche
74
+
75
+ | champ | requis | motif |
76
+ |---|---|---|
77
+ | `ref` (`KIND-…`) | ✔ | l'identité, stable entre applications |
78
+ | `enonce` | ✔ | la question, **dans les mots du métier** |
79
+ | `domaine` | — | vocabulaire OUVERT, tenu au §5.bis |
80
+ | `version` | — | ce qui permet à une instance de dire **contre quoi** elle a été écrite |
81
+ | `besoins` | — | la **forme** de données exigée — jamais la donnée |
82
+ | `utilisation` | — | quand, et par qui |
83
+ | `succes` | **✔** | sans critère écrit, **tout résultat paraît bon** |
84
+ | `erreurs` | **✔** | `{titre, consequence}` — une fiche sans façon connue de se tromper n'apprend rien, et c'est la seule raison de reprendre une fiche |
85
+ | `test` | — | `{action, attendu}` — projeté en essais |
86
+ | `efficacite` | — | renvoi vers `skill-library`, jamais recalculé ici |
87
+ | `evaluation` | — | idem |
88
+ | `verdict` | — | `propose` \| `eprouve` \| `retenu` \| **`ecarte`** — une fiche écartée **reste**, avec son motif |
89
+ | `origine` | — | d'où la fiche a été tirée : l'incident qui l'a fait naître |
90
+
91
+ ⚠️ **`succes` et `erreurs` sont les deux seuls champs exigés en plus de l'énoncé.** C'est délibéré :
92
+ ce sont ceux qu'on omet, et ce sont ceux qui servent.
93
+
94
+ ⚠️ **Chaque erreur porte sa CONSÉQUENCE.** « Ne pas oublier le périmètre » ne se retient pas ;
95
+ « sans lui, tout parent lit le dossier de tous les élèves » se retient. Leçon de CWE et d'OWASP.
96
+
97
+ ## 5 · Jalons
98
+
99
+ | version | contenu | porte de sortie |
100
+ |---|---|---|
101
+ | **0.1.0** | fiche + validation + projection + instanciation + corpus initial (5 fiches tirées d'incidents réels) | §11.1 : essais mjs-unit verts, plan DEVTEST à trois trous nuls |
102
+ | 0.2.0 | index inverse des emplois (B5), `findKinds` enrichi, premières fiches **agronomie** et **électronique** | corpus ≥ 15 fiches, ≥ 2 applications instanciées |
103
+ | 0.3.0 | pont `assistant-pilote` : une fiche déclare son `kind` ro-pla et devient une question activable | une question née d'une fiche, activée en production |
104
+
105
+ ### Le corpus initial de 0.1.0 — **des incidents réels, pas des suppositions**
106
+
107
+ | fiche | tirée de | domaine |
108
+ |---|---|---|
109
+ | `KIND-PERIMETRE-01` — une permission ouvre une capacité, jamais un périmètre | ATC (3 emplois), RestoTrax | `acces` |
110
+ | `KIND-ECRITURE-HORS-SCHEMA-01` — écrire un champ non déclaré le fait disparaître en base | ATC frais, `coaching` | `donnees` |
111
+ | `KIND-MAJ-PARTIELLE-01` — écrire `undefined` écrase la valeur existante | `@mostajs/coaching` | `donnees` |
112
+ | `KIND-ACQUIS-01` — consulter un acquis ne doit pas l'effacer | `@mostajs/elearning` | `apprentissage` |
113
+ | `KIND-DONNEE-INSUFFISANTE-01` — un calcul sur trop peu de données doit REFUSER, en chiffrant ce qui manque | RestoTrax, ATC | `decision` |
114
+
115
+ ## 5.bis · Les DOMAINES du catalogue
116
+
117
+ Un `domaine` regroupe les fiches d'un même métier. Le vocabulaire est **ouvert** — un domaine
118
+ s'ajoute quand une fiche l'exige, jamais « au cas où ».
119
+
120
+ ### Domaines TRANSVERSES — ceux du corpus 0.1.0
121
+
122
+ | domaine | ce qu'il porte | état |
123
+ |---|---|---|
124
+ | `acces` | capacité vs périmètre, cumul de rôles, gardes d'instance | **éprouvé** — 3 emplois |
125
+ | `donnees` | écriture hors schéma, mise à jour partielle, divergence mémoire/base | **éprouvé** |
126
+ | `apprentissage` | acquis, progression, avancement | **éprouvé** |
127
+ | `decision` | refuser sur données insuffisantes, chiffrer ce qui manque · l'écriture gardée | **éprouvé** |
128
+ | `integration` | fournisseurs externes : classes d'échec, repli, diagnostic | **éprouvé** — ajouté le 02/09/2026 depuis le CRM/TRADING |
129
+
130
+ ### Domaines MÉTIER — déclarés, à instruire
131
+
132
+ ⚠️ **Aucune fiche n'y sera écrite avant d'avoir un cas réel.** C'est la règle tirée d'ATT&CK et de
133
+ CWE (état de l'art §3.bis d) : *un catalogue nourri d'idées grossit vite et ne sert jamais*. Les
134
+ questions ci-dessous sont des **pistes**, en `verdict: propose`, et le seront tant qu'un incident
135
+ ou un exploitant ne les aura pas confirmées.
136
+
137
+ | domaine | catalogue métier existant | pistes de questions | familles `ro-pla` |
138
+ |---|---|---|---|
139
+ | **`btp`** — Bâtiment et Travaux Publics | DTU, CCTG/CCTP, Eurocodes | planning de chantier sous ressources · affectation équipes/engins · rotation des coffrages · approvisionnement et évacuation · arbitrage coût/délai/pénalités · chemin critique et marges | `scheduling`, `assignment`, `flow`, `multiobjective` |
140
+ | **`alimentaire`** | **HACCP**, paquet hygiène, traçabilité amont/aval | formulation au moindre coût sous contraintes nutritionnelles · ordonnancement avec temps de changement de série · DLC et rotation des lots · prévision de la demande · maîtrise des pertes | `lp`, `scheduling`, `simulation`, `milp` |
141
+ | **`elevage`** | plans de rationnement, protocoles de prophylaxie | **ration au moindre coût** sous contraintes nutritionnelles · allotement des animaux · calendrier de mises bas et de prophylaxie · appariement de reproduction · suivi de croissance | `lp`, `scheduling`, `assignment`, `simulation` |
142
+ | **`agronomie`** | itinéraires techniques | affectation parcelle → culture · rotation pluriannuelle · calendrier de travaux sous fenêtres météo · irrigation sous débit · arbitrage rendement/eau/intrants | `assignment`, `csp`, `scheduling`, `flow`, `multiobjective` |
143
+ | **`apiculture`** — ruches et production de miel | guides de bonnes pratiques apicoles, réglementation sanitaire, traçabilité des lots | **transhumance** : quelles ruches vers quel emplacement · calendrier des miellées sous fenêtres de floraison · dimensionnement du cheptel et des hausses · suivi sanitaire (varroa) et états de colonie · prévision de récolte · **assemblage de lots** de miel sous contraintes | `assignment`, `scheduling`, `markov`, `simulation`, `lp` |
144
+ | **`electronique`** | *design rules*, *application notes* | placement et routage sous contraintes · ordonnancement de tests de cartes · diagnostic de panne · tolérancement et rendement de série | `scheduling`, `decision`, `markov`, `simulation` |
145
+
146
+ ⚠️ **Deux avertissements que ces domaines imposent, et qu'aucun domaine transverse ne posait :**
147
+
148
+ - **La saisonnalité n'a pas la même échelle selon le domaine.** En restauration, deux saisons
149
+ complètes font deux semaines ; en grande culture, **deux ans**. La fiche
150
+ `KIND-DONNEE-INSUFFISANTE-01` devra porter son seuil **en nombre de cycles**, jamais en jours —
151
+ sinon elle mentira dans quatre domaines sur six.
152
+
153
+ - **⚠️ `apiculture` est le cas EXTRÊME, et c'est pour cela qu'il est précieux.** Une miellée dure
154
+ quelques jours par an : la fenêtre d'observation n'est pas seulement annuelle, elle est
155
+ **ponctuelle**. Un apiculteur qui exploite depuis dix ans dispose de **dix points**, et aucun
156
+ n'est comparable à l'autre — floraison, météo, état du cheptel changent tout. Aucune prévision
157
+ statistique n'y tient, et **le dire est plus utile que le calculer**. Ce domaine est donc le
158
+ meilleur banc d'essai de `KIND-DONNEE-INSUFFISANTE-01` : s'il refuse proprement en apiculture, il
159
+ refusera partout. À l'inverse, une fiche qui conseillerait sur dix points **sans le signaler**
160
+ serait démasquée là d'abord.
161
+ - **`electronique` et `btp` posent leurs questions LÀ OÙ LE MODULE NE TOURNE PAS** — sur
162
+ l'embarqué, sur le chantier. La fiche devra distinguer **où la question se pose** de **où elle se
163
+ calcule** : c'est un champ que le corpus transverse n'a jamais eu besoin d'avoir.
164
+
165
+ > **La ration au moindre coût** (`elevage`) et **la formulation** (`alimentaire`) sont le même
166
+ > problème que le *diet problem* de Stigler — l'un des premiers problèmes résolus par le simplexe,
167
+ > en 1945. `ro-pla` le porte déjà (`simplex`, kind `lp`). C'est le meilleur candidat pour la
168
+ > première fiche métier : le moteur existe, la question est ancienne, et les erreurs sont connues.
169
+
170
+ ---
171
+
172
+ ## 6 · Risques
173
+
174
+ | risque | effet | parade |
175
+ |---|---|---|
176
+ | **Le catalogue reste vide** | on retombe sur le copier-coller entre projets | 0.1.0 part avec **5 fiches d'incidents réels** ; une fiche naît d'un défaut trouvé, jamais d'une idée |
177
+ | **Le catalogue devient exhaustif** | plus personne ne le lit (leçon OWASP) | `verdict: ecarte` conservé **avec motif** ; `findKinds` par domaine |
178
+ | **La fiche diverge du code** | le catalogue a raison contre les faits | la projection est **rejouée** dans le plan DEVTEST de l'application : les trois trous qatrax la surveillent comme le reste |
179
+ | **L'affinage se dégrade en recopie** | on revient à l'état actuel | `instantiate` **exige** de nommer ce qui est affiné ; `diffInstance` le rend lisible |
180
+ | **Deux formats de plan** | qatrax devrait apprendre | **aucun format nouveau** — projection en `mostajs-devtest/1`, validée par `qa-engine` |
181
+
182
+ ## 7 · Dépendances
183
+
184
+ - **runtime** : aucune. Le cœur est pur.
185
+ - **développement** : `@mostajs/mjs-unit` (§11.1.bis) ; `@mostajs/qa-engine` pour **éprouver** que
186
+ ce qui est projeté est accepté par le parseur officiel — dépendance d'essai, pas de production.
@@ -0,0 +1,80 @@
1
+ # Plan de publication — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #9** (DEVRULES §9) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+
5
+ ---
6
+
7
+ ## 1 · Coordonnées
8
+
9
+ | | |
10
+ |---|---|
11
+ | npm | `@mostajs/kind-catalog` — **nom vérifié libre le 02/09/2026** · accès `public` |
12
+ | GitHub | `apolocine/mosta-kind-catalog` |
13
+ | Licence | AGPL-3.0-or-later |
14
+ | Version | **0.1.0** — première publication |
15
+ | Pile | `mostajs/mosta-optimization-stack/`, aux côtés de `ro-pla` |
16
+ | Couche | **N1** — ne dépend que de `qa-engine` (N1), en développement seulement |
17
+
18
+ ## 2 · Ce qui part dans le paquet
19
+
20
+ `src/` · `kinds/` · `docs/` · `llms.txt` · `README.md` · `CHANGELOG.md`
21
+
22
+ ⚠️ **`kinds/` EST le produit.** Un catalogue publié sans son corpus n'est qu'un validateur. C'est
23
+ la raison pour laquelle `files` le porte explicitement.
24
+
25
+ ⚠️ **`@mostajs/qa-engine` reste une dépendance de DÉVELOPPEMENT.** Le module produit la forme du
26
+ plan ; il n'a pas besoin du parseur pour fonctionner — seulement pour **prouver** que ce qu'il
27
+ produit est accepté. En faire une dépendance de production imposerait le moteur QA à tout
28
+ consommateur.
29
+
30
+ ## 3 · Contrôles avant publication (bloquants)
31
+
32
+ | # | contrôle | commande |
33
+ |---|---|---|
34
+ | 1 | essais verts | `npm test` → 21/21 |
35
+ | 2 | corpus valide | `T-CORP-1` (dans la suite) |
36
+ | 3 | projection acceptée par le parseur officiel | `T-KC-5`, `T-CORP-3` |
37
+ | 4 | plan DEVTEST valide, **trois trous à zéro** | `parseDevtestPlan` + correspondance |
38
+ | 5 | `llms.txt` à jour de la surface réelle | relecture |
39
+ | 6 | manifeste `version` = `package.json` | — |
40
+ | 7 | **sources de l'état de l'art vérifiées** | ⚠️ **RESTE À FAIRE** — le #1 est écrit hors ligne |
41
+
42
+ ⚠️ **Le contrôle 7 est ouvert, et il bloque la publication de l'article #8**, pas celle du paquet :
43
+ l'article cite Withall, EARS, CWE, Stigler, Aamodt & Plaza par titre et année, sans URL ni page.
44
+
45
+ | 8 | **provenance du contenu** — corpus employés, conditions, attributions | `docs/09bis-MATRICE-SOURCING-KIND-CATALOG.md` |
46
+
47
+ ⚠️ **Le contrôle 8 ne bloque pas le paquet non plus** : les 12 fiches sont issues de nos incidents
48
+ ou adossées à des faits, et **aucune ne reprend de texte**. Il bloque en revanche l'emploi de
49
+ nouveaux corpus comme matière — voir la matrice, §6.
50
+
51
+ ## 4 · Séquence
52
+
53
+ ```
54
+ 1. npm test # 21/21
55
+ 2. relire CHANGELOG et llms.txt
56
+ 3. npm publish --access public
57
+ 4. attendre la propagation du registre # elle a pris plusieurs minutes le 01/09
58
+ 5. vérifier : npm view @mostajs/kind-catalog version
59
+ 6. git tag v0.1.0 && git push --tags
60
+ 7. pousser le plan DEVTEST vers qatrax
61
+ ```
62
+
63
+ ⚠️ **La propagation npm n'est pas immédiate.** Le 01/09/2026, une publication a rendu
64
+ `+ @mostajs/coaching@0.2.0` puis est restée invisible plusieurs minutes, avec un `409 Cannot
65
+ publish over previously staged version` à la reprise. **Attendre, ne pas republier.**
66
+
67
+ ## 5 · Après la publication
68
+
69
+ | quand | quoi |
70
+ |---|---|
71
+ | aussitôt | instancier `KIND-PERIMETRE-01` dans **ATC** — la fiche est née là, elle doit y retourner |
72
+ | aussitôt | instancier `KIND-DONNEE-INSUFFISANTE-01` dans **RestoTrax** |
73
+ | ces deux instances | donnent le premier chiffre d'**emplois par fiche**, le KPI du #5 |
74
+ | ensuite | premier `terrain` agricole → faire passer `KIND-ROTATION-CULTURALE-01` de `propose` à `eprouve` |
75
+
76
+ ## 6 · Versions suivantes (rappel du #3)
77
+
78
+ - **0.2.0** — index inverse des emplois exposé, premières fiches issues du terrain métier.
79
+ - **0.3.0** — pont `assistant-pilote` : une fiche déclare son `kind` `ro-pla` et devient une
80
+ question activable sous condition de données.
@@ -0,0 +1,66 @@
1
+ # Plan de suivi — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #5** (DEVRULES §9) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+
5
+ ---
6
+
7
+ ## 1 · Ce qu'on mesure, et pourquoi ce n'est PAS le volume
8
+
9
+ Un catalogue se vante naturellement de sa taille. **Le volume ne prouve rien** : CWE compte plus de
10
+ mille entrées et ce que les équipes lisent, c'est l'OWASP Top 10.
11
+
12
+ Les indicateurs ci-dessous sont choisis pour être **réfutables** : chacun peut se dégrader, et sa
13
+ dégradation dit quelque chose de vrai.
14
+
15
+ ## 2 · Les indicateurs produit
16
+
17
+ | KPI | définition | seuil d'alerte | ce que sa dégradation signifie |
18
+ |---|---|---|---|
19
+ | **Taux éprouvé** | fiches `eprouve`+`retenu` / total | **< 30 %** ou **> 90 %** | trop bas : le catalogue est une bibliothèque d'intentions. Trop haut : on se décerne l'expérience, ou l'on a cessé d'explorer |
20
+ | **Erreurs par fiche** | `erreursCataloguees` / total | **< 2** | les fiches deviennent des titres — c'est le champ qui porte la valeur, et le premier à s'atrophier |
21
+ | **Emplois par fiche** | instances / fiches | **< 1,5** après 3 applications | les fiches ne sont pas reprises : soit illisibles, soit trop spécifiques |
22
+ | **Taux d'affinage** | instances portant ≥ 1 affinage / instances | **> 70 %** | la fiche canonique ne décrit plus la réalité : elle doit être révisée, pas contournée |
23
+ | **Fiches jamais employées** | fiches à zéro instance après 2 applications | **> 40 %** | on écrit pour écrire |
24
+ | **Défauts attrapés** | essais projetés qui ont ÉCHOUÉ au moins une fois | — | **le seul indicateur de valeur** : une fiche qui n'a jamais rien attrapé n'a jamais servi |
25
+ | **Domaines peuplés** | domaines avec ≥ 1 fiche / domaines déclarés | **< 80 %** | un domaine déclaré et vide est une promesse non tenue |
26
+
27
+ ⚠️ **Le KPI qui compte est « défauts attrapés ».** Les autres décrivent l'hygiène du catalogue ;
28
+ celui-là dit s'il sert. Il ne se lit pas dans le module — il se lit dans **qatrax**, sur les essais
29
+ issus de la projection.
30
+
31
+ ## 3 · Où chaque chiffre se lit
32
+
33
+ | chiffre | source | commande |
34
+ |---|---|---|
35
+ | taux éprouvé, erreurs, domaines, provenances | `statsCatalogue()` | `node -e "…"` ou l'outil de rapport |
36
+ | emplois, taux d'affinage | `emplois(instances)` | l'application déclare ses instances |
37
+ | défauts attrapés | **qatrax** — exécutions des essais projetés | `qatrax.amia.fr/runs` |
38
+ | cohérence du corpus | `auditCatalogue()` | joué à chaque exécution des essais (`T-CORP-1`) |
39
+
40
+ ## 4 · Observabilité — ce que le module N'A PAS
41
+
42
+ **Aucun runtime, donc aucune alerte runtime.** Le module n'écoute aucun port, n'ouvre aucune
43
+ connexion, ne journalise rien. Il n'y a ni latence, ni taux d'erreur, ni saturation à surveiller.
44
+
45
+ Ce qui se surveille, ce sont **deux portes**, et elles sont déjà dans l'intégration continue :
46
+
47
+ 1. `auditCatalogue()` non vide → **le corpus est cassé**, la projection de toutes les fiches l'est
48
+ aussi. Bloquant.
49
+ 2. la projection refusée par `parseDevtestPlan` → **un plan invalide partirait chez qatrax**.
50
+ Bloquant.
51
+
52
+ ## 5 · La revue périodique — trimestrielle
53
+
54
+ Une fiche vieillit sans que rien ne le signale : c'est le risque propre à un corpus éditorial, et
55
+ aucun indicateur automatique ne le voit. La revue est donc **humaine**, et courte :
56
+
57
+ | on regarde | on décide |
58
+ |---|---|
59
+ | les fiches à **taux d'affinage élevé** | réviser la fiche canonique — le terrain a parlé |
60
+ | les fiches **jamais employées** après deux applications | `ecarte`, **avec motif** — jamais supprimer |
61
+ | les fiches `propose` **anciennes** | trouver un `terrain` ou un `incident`, ou assumer qu'elles restent proposées |
62
+ | les **domaines déclarés et vides** | peupler ou retirer la déclaration |
63
+ | les **erreurs nouvellement rencontrées** en production | les ajouter à la fiche existante plutôt que d'en créer une |
64
+
65
+ ⚠️ **Rien ne se supprime.** Une fiche écartée reste, avec son motif : celle qui disparaît sera
66
+ réinventée, avec les mêmes espoirs et le même échec.
@@ -0,0 +1,79 @@
1
+ # Plan de test — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #4** (DEVRULES §9) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+ **Cadre** : `@mostajs/mjs-unit` (§11.1.bis) · **Plan qatrax** : `docs/DEVTEST-PLAN.kind-catalog.json`
5
+
6
+ ---
7
+
8
+ ## 1 · Ce que ces essais doivent tenir — et ce qu'ils ne peuvent pas
9
+
10
+ Un catalogue de fiches n'a **aucun comportement à l'exécution**. Les essais ne peuvent donc pas
11
+ prouver qu'une fiche est *juste* — cela se prouve en l'appliquant, dans l'application, et c'est le
12
+ plan DEVTEST de cette application qui le fait.
13
+
14
+ **Ce que ces essais tiennent, c'est ce qui rendrait le catalogue NUISIBLE :**
15
+
16
+ | risque | pourquoi il est pire que l'absence de catalogue |
17
+ |---|---|
18
+ | une fiche **sans critère de succès** entre au corpus | elle donne un cadre à des réponses qu'on ne peut pas juger — **tout résultat paraît bon**, avec l'autorité d'une fiche |
19
+ | une fiche **sans erreur connue** entre au corpus | on la reprend en croyant hériter d'une expérience, et l'on hérite d'un titre |
20
+ | une erreur **sans conséquence** | « ne pas oublier X » ne se retient pas ; le lecteur passe |
21
+ | la **projection produit un plan invalide** | le plan part chez qatrax, y est refusé ou — pire — accepté et faux |
22
+ | l'**affinage n'est pas tracé** | « réutiliser » se dégrade en « recopier », et l'on revient à l'état d'avant le module |
23
+ | deux fiches portent la **même `ref`** | mille projets citent la même chose : l'identité doit être unique, comme `CWE-79` |
24
+
25
+ ## 2 · La matrice de couverture
26
+
27
+ | exigence | ce qu'elle garantit | essais |
28
+ |---|---|---|
29
+ | **SPEC-KC-01** — une fiche inutilisable est refusée AU MONTAGE, en nommant tout ce qui manque | on ne découvre pas le manque à la projection, quand le plan part | T-KC-1 · T-KC-2 · T-KC-3 |
30
+ | **SPEC-KC-02** — chaque erreur porte sa CONSÉQUENCE | un avertissement sans conséquence ne se retient pas (leçon CWE/OWASP) | T-KC-4 |
31
+ | **SPEC-KC-03** — la projection produit un plan `mostajs-devtest/1` que le parseur OFFICIEL accepte | qatrax lit sans rien apprendre ; aucun second format | T-KC-5 · T-KC-6 · T-KC-7 |
32
+ | **SPEC-KC-04** — instancier EXIGE de nommer ce qui est affiné, et le trace | l'écart tracé est ce qui fait vivre un catalogue | T-KC-8 · T-KC-9 |
33
+ | **SPEC-KC-05** — le corpus est cohérent : `ref` uniques, verdicts connus, domaines déclarés | l'identité et la lisibilité du corpus | T-KC-10 · T-KC-11 |
34
+ | **SPEC-KC-06** — le module N'EXÉCUTE RIEN et NE STOCKE RIEN | c'est le produit, pas une prudence de première version | T-KC-12 |
35
+
36
+ ## 3 · Les cas de test
37
+
38
+ | réf | intitulé | action | attendu |
39
+ |---|---|---|---|
40
+ | **T-KC-1** | une fiche sans `succes` est refusée | définir sans critère de succès | refus nommant `succes` — *sans critère écrit, tout résultat paraît bon* |
41
+ | **T-KC-2** | une fiche sans `erreurs` est refusée | définir sans erreur connue | refus nommant `erreurs` — *une fiche qui n'apprend rien n'a pas de raison d'être reprise* |
42
+ | **T-KC-3** | le refus liste TOUT ce qui manque, d'un coup | définir une fiche vide | tous les manques dans un seul message — corriger un manque pour en découvrir un autre fait abandonner |
43
+ | **T-KC-4** | une erreur sans `consequence` est refusée | erreur réduite à un titre | refus nommant l'index et le champ |
44
+ | **T-KC-5** | la projection est acceptée par `parseDevtestPlan` | projeter le corpus, le passer au **parseur officiel** de `@mostajs/qa-engine` | `ok: true`, zéro erreur — *c'est le seul juge qui compte : celui de qatrax* |
45
+ | **T-KC-6** | chaque `test` de la fiche devient un essai relié à son exigence | projeter une fiche à deux épreuves | deux `tests`, `specRef` pointant l'exigence, `steps` portant action et attendu |
46
+ | **T-KC-7** | le préfixe d'application isole les références | projeter pour `ATC` puis pour `RESTO` | aucune collision de `ref` entre les deux plans |
47
+ | **T-KC-8** | instancier SANS rien affiner est permis, et se voit | instancier tel quel | instance avec `affinages: []` — la réutilisation à l'identique est le cas normal |
48
+ | **T-KC-9** | un affinage NON DÉCLARÉ est refusé | instancier en changeant un champ hors `affine` | refus — *sinon « réutiliser » se dégrade en « recopier »* |
49
+ | **T-KC-10** | deux fiches ne peuvent pas partager une `ref` | charger un corpus avec doublon | refus nommant la `ref` et les deux fichiers |
50
+ | **T-KC-11** | un `verdict` inconnu est refusé ; `ecarte` est CONSERVÉ | verdict fantaisiste, puis `ecarte` | refus du premier ; le second reste au corpus **avec son motif** — une fiche écartée qui disparaît sera réinventée |
51
+ | **T-KC-12** | le module n'écrit RIEN et n'appelle AUCUN solveur | exercer toute la surface avec un dépôt et un solveur **piégés** | zéro touche — *une garantie tenue par la seule intention se perd à la version suivante* |
52
+
53
+ ## 4 · Les essais du CORPUS lui-même
54
+
55
+ Le corpus n'est pas du code, mais il se contrôle — et ces contrôles valent pour toute fiche
56
+ ajoutée plus tard, y compris dans les domaines métier.
57
+
58
+ | réf | contrôle | motif |
59
+ |---|---|---|
60
+ | **T-CORP-1** | chaque fiche du corpus passe `validateKind` sans reproche | une fiche livrée cassée casse la projection de toutes |
61
+ | **T-CORP-2** | chaque fiche `eprouve` ou `retenu` porte au moins une `origine` | *l'alimentation se fait par incidents, jamais par idées* (état de l'art §3.bis d) — une fiche éprouvée sans origine est une idée déguisée |
62
+ | **T-CORP-3** | le corpus entier se projette en un plan valide | le corpus est livrable en bloc |
63
+ | **T-CORP-4** | tout `domaine` employé figure au §5.bis du plan de développement | un domaine surgi sans déclaration échappe à la revue |
64
+
65
+ ## 5 · Ce qui n'est PAS testé ici, et où cela l'est
66
+
67
+ | non testé ici | où |
68
+ |---|---|
69
+ | qu'une fiche décrive une exigence **juste** | dans l'application qui l'instancie — son plan DEVTEST |
70
+ | qu'un moteur réponde bien à la question | `@mostajs/ro-pla` (59 essais) |
71
+ | que l'efficacité mesurée soit correcte | `@mostajs/skill-library` |
72
+ | qu'une question soit activable au bon moment | `@mostajs/assistant-pilote` (13 essais) |
73
+
74
+ ## 6 · Portes de sortie (§11.1)
75
+
76
+ - essais **verts**, exécutés par `test-scripts/run-tests.sh` via `@mostajs/mjs-unit` ;
77
+ - plan `docs/DEVTEST-PLAN.kind-catalog.json` **valide** au sens de `parseDevtestPlan` ;
78
+ - les **trois trous qatrax à zéro** : `unmatched`, `notRun`, `withoutAutoRef` ;
79
+ - chaque nom d'essai porte sa **référence en tête**.
@@ -0,0 +1,46 @@
1
+ # Mots-clés & sites — `@mostajs/kind-catalog`
2
+
3
+ **Livrable #8** (part 1/2) · **Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-02
4
+
5
+ > ⚠️ **Aucun volume de recherche n'est chiffré ici.** Ce document est écrit hors ligne : avancer un
6
+ > nombre de requêtes mensuelles serait exactement le « chiffre plausible tiré de rien » que ce
7
+ > module combat. Les intentions ci-dessous sont raisonnées, à confirmer par un outil avant campagne.
8
+
9
+ ## 1 · Intentions de recherche visées
10
+
11
+ | intention | expression probable | notre réponse |
12
+ |---|---|---|
13
+ | **réutiliser des exigences** | *reusable requirement patterns*, *catalogue d'exigences réutilisables* | la fiche `kind` et sa projection |
14
+ | **ne pas refaire les mêmes erreurs** | *known failure modes software*, *catalogue de modes de défaillance* | le champ `erreurs`, avec conséquence |
15
+ | **relier exigences et tests** | *requirements to test traceability*, *traçabilité exigence essai* | projection en `mostajs-devtest/1`, lue par qatrax |
16
+ | **aide à la décision métier** | *optimisation agricole*, *aide à la décision élevage*, *ordonnancement chantier* | les fiches métier + `ro-pla` |
17
+ | **savoir quand ne PAS conclure** | *insufficient data forecasting*, *combien de données pour prévoir* | `KIND-DONNEE-INSUFFISANTE-01` |
18
+
19
+ ## 2 · Mots-clés
20
+
21
+ **Cœur** : catalogue d'exigences · fiche d'exigence réutilisable · modes de défaillance connus ·
22
+ traçabilité exigence → test · plan Dev+Test · réutilisation d'exigences entre projets.
23
+
24
+ **Métier** : optimisation agricole · rotation culturale · ration au moindre coût · formulation
25
+ alimentaire · ordonnancement de chantier · traçabilité de lot HACCP · transhumance apicole ·
26
+ diagnostic séquentiel de panne.
27
+
28
+ **Longue traîne — c'est là que se trouve le lecteur qualifié** :
29
+ « combien de saisons avant de prévoir un rendement » · « pourquoi ma prévision est fausse avec peu
30
+ de données » · « comment réutiliser les exigences d'un projet à l'autre » · « catalogue d'erreurs
31
+ de conception logicielle » · « un rôle ne doit pas ouvrir tout le périmètre ».
32
+
33
+ ## 3 · Où publier
34
+
35
+ | support | angle |
36
+ |---|---|
37
+ | site MostaJS — page module | technique, avec la projection en exemple |
38
+ | dev.to / Medium | « Ce que CWE nous apprend sur les exigences » |
39
+ | LinkedIn | l'angle métier : refuser de conclure est un argument de vente |
40
+ | npm README | la surface, en dix lignes |
41
+ | revues professionnelles agricoles | `KIND-ROTATION-CULTURALE-01` et `KIND-FORMULATION-MOINDRE-COUT-01` |
42
+
43
+ ## 4 · Ce qu'on ne fera PAS
44
+
45
+ Aucune promesse de « intelligence artificielle » : le module ne calcule rien, et un mot-clé qui
46
+ attire un lecteur déçu coûte plus qu'il ne rapporte.