@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.
- package/CHANGELOG.md +136 -0
- package/README.md +103 -0
- package/docs/00-ETAPE-INAUGURALE-KIND-CATALOG.md +105 -0
- package/docs/03bis-PROMPT-IMAGE-OBJECTIF-KIND-CATALOG.md +99 -0
- package/docs/09bis-MATRICE-SOURCING-KIND-CATALOG.md +176 -0
- package/docs/10-PRESENTATION-COMMERCIALE-KIND-CATALOG.md +140 -0
- package/docs/11-SLIDES-COMMERCIAL-KIND-CATALOG.md +154 -0
- package/docs/12-DOC-TECHNIQUE-KIND-CATALOG.md +164 -0
- package/docs/13-SLIDES-DEV-KIND-CATALOG.md +162 -0
- package/docs/14-PROMPT-IMAGE-KIND-CATALOG.md +88 -0
- package/docs/15-REVUE-SECURITE-KIND-CATALOG.md +98 -0
- package/docs/16-DPIA-CONFORMITE-KIND-CATALOG.md +100 -0
- package/docs/ARTICLE-SEO-KIND-CATALOG.md +96 -0
- package/docs/AUDIT-EXISTANT-KIND-CATALOG.md +127 -0
- package/docs/DEVTEST-PLAN.kind-catalog.json +412 -0
- package/docs/ETUDE-ETAT-ART-KIND-CATALOG-02092026.md +207 -0
- package/docs/PLAN-DEV-KIND-CATALOG.md +186 -0
- package/docs/PLAN-PUBLICATION-KIND-CATALOG.md +80 -0
- package/docs/PLAN-SUIVI-MONITORING.md +66 -0
- package/docs/PLAN-TESTS.md +79 -0
- package/docs/SEO-KEYWORDS-KIND-CATALOG.md +46 -0
- package/docs/articles/01-ARTICLE-KIND-CATALOG.md +229 -0
- package/kinds/acces.kind.mjs +48 -0
- package/kinds/apprentissage.kind.mjs +25 -0
- package/kinds/chiffres.kind.mjs +80 -0
- package/kinds/decision.kind.mjs +88 -0
- package/kinds/donnees.kind.mjs +108 -0
- package/kinds/ecran-service.kind.mjs +71 -0
- package/kinds/integration.kind.mjs +83 -0
- package/kinds/metier-optimisation.kind.mjs +210 -0
- package/kinds/traces.kind.mjs +39 -0
- package/llms.txt +34 -0
- package/package.json +46 -0
- package/src/catalogue.js +98 -0
- package/src/index.js +4 -0
- package/src/instance.js +85 -0
- package/src/kind.js +152 -0
- 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.
|