@mostajs/kind-catalog 0.2.0 → 0.4.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 +120 -0
- package/docs/DEVTEST-PLAN.kind-catalog.json +255 -0
- package/docs/EPREUVE-01-RESTOTRAX-06092026.md +177 -0
- package/docs/EPREUVE-02-LABTRAX-06092026.md +152 -0
- package/docs/PLAN-DEV-KIND-CATALOG.md +52 -1
- package/docs/PROPOSITION-REGLE-RELIRE-LE-PLAN.md +210 -0
- package/kinds/chiffres.kind.mjs +8 -1
- package/kinds/decision.kind.mjs +1 -0
- package/kinds/integration.kind.mjs +1 -0
- package/kinds/traces.kind.mjs +13 -0
- package/llms.txt +11 -0
- package/package.json +1 -1
- package/src/diagnostic.js +209 -0
- package/src/index.js +1 -0
- package/src/kind.js +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,126 @@
|
|
|
2
2
|
|
|
3
3
|
**Auteur** : Dr Hamid MADANI <drmdh@msn.com>
|
|
4
4
|
|
|
5
|
+
## 0.4.0 — 2026-09-06
|
|
6
|
+
|
|
7
|
+
### Corrigé — le faux positif des épreuves rétrospectives, en trois temps
|
|
8
|
+
|
|
9
|
+
L'épreuve n° 1 (RestoTrax) a signalé `KIND-SUPPRESSION-DATEE-01` **5 fois sur 5** alors que le plan
|
|
10
|
+
portait la règle explicitement, sous un autre vocabulaire. Trois causes distinctes, toutes dans mon
|
|
11
|
+
propre test de couverture, découvertes en les levant l'une après l'autre :
|
|
12
|
+
|
|
13
|
+
1. **La couverture se juge sur le `titre` d'une erreur, plus sur sa `consequence`.** La conséquence
|
|
14
|
+
est **notre** prose : elle explique le coût à qui lit la fiche, et un plan n'a aucune raison de
|
|
15
|
+
la contenir. L'inclure rendait une erreur d'autant plus « non couverte » qu'elle était **bien
|
|
16
|
+
expliquée**, et une exigence courte mais explicite ne pouvait **jamais** couvrir une erreur
|
|
17
|
+
verbeuse. Seuil de reconnaissance : `Math.min(2, nombre de mots du titre)`.
|
|
18
|
+
2. **Les `synonymes` d'une fiche sont des RADICAUX, rapprochés par préfixe.** Écrits en mots
|
|
19
|
+
entiers, ils demandaient d'énumérer toutes les flexions du français — `supprimer`, `supprime`,
|
|
20
|
+
`supprimée`, `supprimées`… — liste qu'on croit finie et qui ne l'est jamais : la première version
|
|
21
|
+
tenait neuf mots pour un seul groupe et laissait passer `supprimée`. Un radical de **quatre
|
|
22
|
+
lettres au moins** ; plus court, il cesse de désigner (`dat` attraperait `dattes`).
|
|
23
|
+
3. **Les mots-clés sont retenus à partir de QUATRE lettres**, et non cinq. `date`, `note`, `vote`,
|
|
24
|
+
`lieu`, `taux` étaient écartés — c'est-à-dire, très souvent, **le mot qui distingue** : « le
|
|
25
|
+
retrait est un simple drapeau, sans **date** » ne retenait que `retrait`, `simple`, `drapeau`, et
|
|
26
|
+
l'exigence qui disait « horodatés » ne pouvait pas la couvrir. Les mots vides de quatre lettres
|
|
27
|
+
sont écartés **nommément**, par la liste `VIDES`, pas par leur longueur.
|
|
28
|
+
|
|
29
|
+
Effet cumulé sur le plan initial de RestoTrax : **35 → 23 erreurs signalées**, la règle en cause
|
|
30
|
+
passant de **5/5 à 1/5**. La seule erreur qui subsiste — « la restauration recrée un objet neuf » —
|
|
31
|
+
n'est **pas** un faux positif : ce plan ne dit rien d'une restauration.
|
|
32
|
+
|
|
33
|
+
Contrôle de non-régression sur le plan initial de LabTrax : total **inchangé à 11**. Le seuil à
|
|
34
|
+
quatre lettres n'a ajouté aucun bruit.
|
|
35
|
+
|
|
36
|
+
### Ajouté
|
|
37
|
+
|
|
38
|
+
- **`synonymes`** — champ déclaré d'une fiche : des groupes de radicaux qui désignent la même chose
|
|
39
|
+
dans le vocabulaire du domaine. Aucun rapprochement lexical ne peut **deviner** que
|
|
40
|
+
« désactivation » vaut « retrait » : cela se déclare, comme le reste de la fiche. Un groupe d'un
|
|
41
|
+
seul mot est écarté au montage — il ne relie rien. Six groupes posés sur `KIND-SUPPRESSION-DATEE-01`.
|
|
42
|
+
- **`motsCles` et `normaliser`** sont exportés : les décisions de découpage sont désormais
|
|
43
|
+
vérifiables du dehors (`T-KC-26`).
|
|
44
|
+
|
|
45
|
+
### Éprouvé
|
|
46
|
+
|
|
47
|
+
- `SPEC-KC-10` et cinq essais — `T-KC-22` à `T-KC-26` — gardent chacune des trois décisions ci-dessus,
|
|
48
|
+
**y compris celles qui refusent** : un radical trop court, un groupe d'un seul mot. 37 essais verts.
|
|
49
|
+
- **`docs/EPREUVE-02-LABTRAX-06092026.md`** — deuxième épreuve rétrospective, sur un objet qui en
|
|
50
|
+
valait un : le plan initial de LabTrax comptait **16 exigences**, le plan atteint en compte **49**.
|
|
51
|
+
Résultat : **3 anticipés · 3 divergents · 5 sans objet · 0 contredit**, pour un rappel utile de
|
|
52
|
+
**3 sur 33** et un coût de lecture d'une minute. La double borne écarte **11 fiches sur 21** — et
|
|
53
|
+
six des fiches écartées retombent mot pour mot sur des exigences que LabTrax a dû écrire, ce qui
|
|
54
|
+
démontre que la borne est indispensable : sans elle j'aurais publié 18 % au lieu de 9 %.
|
|
55
|
+
- `docs/EPREUVE-01-RESTOTRAX-06092026.md` reçoit un **addendum** ; ses chiffres d'origine ne sont pas
|
|
56
|
+
réécrits — un rapport d'épreuve qu'on réécrit ne mesure plus rien.
|
|
57
|
+
|
|
58
|
+
### Contrôle d'avant-publication — deux défauts trouvés, tous deux dans la surface publiée
|
|
59
|
+
|
|
60
|
+
Six contrôles passés avant de publier, dont deux ont mordu :
|
|
61
|
+
|
|
62
|
+
| contrôle | relevé |
|
|
63
|
+
|---|---|
|
|
64
|
+
| **verdicts des 21 fiches** | ✓ **0 injustifié.** Les 14 `eprouve` portent chacune au moins une origine `incident` ou `terrain` ; les 6 `propose` n'ont que des `reference`. `auditCatalogue()` rend une liste vide |
|
|
65
|
+
| **surface publiée éprouvée** | ❌ **6 des 24 exports n'étaient touchés par aucun essai** : `AFFINABLES`, `PLAN_VERSION`, `PROVENANCES`, `blocDeFiche`, `marqueur`, `normaliser`. Une constante exportée est un **contrat** : celui qui construit une fiche la lit pour savoir ce qui est admis, et si elle diverge de ce que le code applique, elle envoie droit dans le mur — c'est exactement le défaut qu'avait `validateKind`, qui déclarait « verdict inconnu » sur un verdict qu'il posait lui-même. Fermé par `SPEC-KC-11` et `T-KC-27`..`T-KC-31` |
|
|
66
|
+
| **`llms.txt` (#6)** | ❌ **`synonymes` n'y était pas déclaré** — un champ neuf que le lecteur-machine ne connaissait pas, alors que c'est précisément le document qui existe pour qu'il le connaisse. `diagnostiquer`, `motsCles` et `normaliser` y manquaient aussi, ainsi que les deux pièges de la couverture. Corrigé |
|
|
67
|
+
| README, poids, binaires exclus | ✓ 103,9 kB, 43 fichiers, aucun PDF ni PNG |
|
|
68
|
+
| correspondance plan ↔ code | ✓ 42 essais, 42 entrées au plan, aucun orphelin |
|
|
69
|
+
| chiffres périmés dans les livrables | ✓ aucun |
|
|
70
|
+
|
|
71
|
+
Les deux essais qui ont échoué en s'écrivant l'ont fait **par ma faute, non par celle du code** : le
|
|
72
|
+
refus de provenance existait bien (mon motif de recherche ne collait pas), et `instantiate` exige un
|
|
73
|
+
`motif` par champ affiné — garde délibérée que j'avais contournée au lieu de l'éprouver. Elle est
|
|
74
|
+
désormais éprouvée, ainsi que le refus d'un affinage qui **casse** la fiche : on n'affine pas jusqu'à
|
|
75
|
+
détruire l'exigence.
|
|
76
|
+
|
|
77
|
+
## 0.3.0 — 2026-09-04
|
|
78
|
+
|
|
79
|
+
### Ajouté — `diagnostiquer()` : le tranchant « AMÉLIORER »
|
|
80
|
+
|
|
81
|
+
Lire le plan d'une application et lui dire **ce qui lui manque**. Livrable en une heure, sur un
|
|
82
|
+
plan qu'on nous donne, sans toucher au code.
|
|
83
|
+
|
|
84
|
+
> *« Votre plan porte quatre exigences de périmètre. La fiche en connaît six erreurs. Trois ne sont
|
|
85
|
+
> mentionnées nulle part chez vous — voici lesquelles, et ce qu'elles coûtent. »*
|
|
86
|
+
|
|
87
|
+
**Les deux sorties sont DÉCOUPLÉES, et c'est le point.** Elles n'ont pas le même optimum, et les
|
|
88
|
+
lier faisait taire l'une pour l'autre :
|
|
89
|
+
|
|
90
|
+
- les **occurrences** proposées demandent de la **précision** — à deux mots communs, le diagnostic
|
|
91
|
+
proposait **vingt-sept** occurrences pour une seule règle : personne ne confirme vingt-sept
|
|
92
|
+
lignes. Seuil porté à cinq, liste courte ;
|
|
93
|
+
- les **erreurs non couvertes** demandent du **rappel** — c'est le livrable, et taire celle qui
|
|
94
|
+
manque coûte bien plus que d'en proposer une déjà couverte. Elles sont cherchées dans **tout** le
|
|
95
|
+
plan, et rendues **même quand aucune exigence n'a pu être rapprochée**.
|
|
96
|
+
|
|
97
|
+
Une règle **transverse** rend ses erreurs dans tous les cas ; une règle **métier** seulement si une
|
|
98
|
+
exigence l'a désignée — sinon un plan universitaire recevrait les pièges de l'apiculture.
|
|
99
|
+
|
|
100
|
+
**Il propose, il n'applique pas** (`T-KC-21`), et **chaque candidat rend les mots qui l'ont
|
|
101
|
+
désigné** (`T-KC-17`) : un score opaque ne se conteste pas, donc il ne se corrige jamais. C'est
|
|
102
|
+
`KIND-ECRITURE-GARDEE-01` appliqué à l'outil lui-même.
|
|
103
|
+
|
|
104
|
+
**Il ne modifie pas le plan qu'il lit** (`T-KC-20`).
|
|
105
|
+
|
|
106
|
+
### Enrichi — l'âge d'une donnée, et non son effacement
|
|
107
|
+
|
|
108
|
+
`KIND-CHIFFRE-SANS-SOURCE-01` gagne **TicketFlow 2.0** et **`@mostajs/paiement-tpe`** — quatre
|
|
109
|
+
projets indépendants — et deux erreurs que ces projets ont fait apparaître :
|
|
110
|
+
|
|
111
|
+
- **la valeur périmée est présentée sans son âge** → *elle a l'air normale, donc personne ne la
|
|
112
|
+
vérifie. Un affichage périmé qui a l'air normal coûte plus cher qu'un affichage qui avoue son
|
|
113
|
+
âge : le second se corrige, le premier se propage en décision.*
|
|
114
|
+
- **la valeur périmée est simplement effacée** → *on perd la dernière valeur CONNUE, souvent
|
|
115
|
+
utile. Les deux remèdes ne se valent pas : DATER conserve l'information, BASCULER la jette.*
|
|
116
|
+
|
|
117
|
+
C'est la nuance que CollabTrax (« bascule en sans données ») et TicketFlow (« file au 04/09 à
|
|
118
|
+
11h12 ») ont résolue différemment. La fiche porte désormais les deux, avec leur compromis.
|
|
119
|
+
|
|
120
|
+
`@mostajs/paiement-tpe` y entre par son `sonder()` qui rend `'inconnu'` et jamais `false` — *« qui
|
|
121
|
+
ferait croire l'appareil en panne alors qu'on n'en sait rien »*.
|
|
122
|
+
|
|
123
|
+
**21 fiches · 86 erreurs cataloguées · 38 incidents · 32 essais.**
|
|
124
|
+
|
|
5
125
|
## 0.2.0 — 2026-09-03
|
|
6
126
|
|
|
7
127
|
### Ajouté — `enrichir()` : projeter pour CRÉER, enrichir pour EXPLOITER
|
|
@@ -47,6 +47,24 @@
|
|
|
47
47
|
"title": "ENRICHIR les occurrences existantes plutôt que RECOPIER la règle dans le plan de l'application",
|
|
48
48
|
"priority": "critical",
|
|
49
49
|
"status": "verified"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"ref": "SPEC-KC-09",
|
|
53
|
+
"title": "DIAGNOSTIQUER un plan existant : proposer les occurrences, NOMMER les erreurs qu'il ne mentionne pas",
|
|
54
|
+
"priority": "critical",
|
|
55
|
+
"status": "verified"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"ref": "SPEC-KC-10",
|
|
59
|
+
"title": "Le test de couverture porte sur le TITRE d'une erreur, et le vocabulaire du domaine se DÉCLARE",
|
|
60
|
+
"priority": "critical",
|
|
61
|
+
"status": "verified"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"ref": "SPEC-KC-11",
|
|
65
|
+
"title": "La surface publiée ne promet rien que rien ne vérifie : chaque constante exportée est éprouvée CONTRE le code qui l'applique",
|
|
66
|
+
"priority": "critical",
|
|
67
|
+
"status": "verified"
|
|
50
68
|
}
|
|
51
69
|
],
|
|
52
70
|
"realisations": [
|
|
@@ -112,6 +130,33 @@
|
|
|
112
130
|
"artifact": "src/enrichir.js",
|
|
113
131
|
"progress": 100,
|
|
114
132
|
"status": "done"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"ref": "REL-KC-09",
|
|
136
|
+
"specRef": "SPEC-KC-09",
|
|
137
|
+
"kind": "feature",
|
|
138
|
+
"title": "diagnostiquer() · rapportDiagnostic()",
|
|
139
|
+
"artifact": "src/diagnostic.js",
|
|
140
|
+
"progress": 100,
|
|
141
|
+
"status": "done"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"ref": "REL-KC-10",
|
|
145
|
+
"specRef": "SPEC-KC-10",
|
|
146
|
+
"kind": "fix",
|
|
147
|
+
"title": "couverture sur le titre seul · champ `synonymes` · canonisation par fiche",
|
|
148
|
+
"artifact": "src/diagnostic.js + src/kind.js",
|
|
149
|
+
"progress": 100,
|
|
150
|
+
"status": "done"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"ref": "REL-KC-11",
|
|
154
|
+
"specRef": "SPEC-KC-11",
|
|
155
|
+
"kind": "test",
|
|
156
|
+
"title": "cinq essais de contrat sur les six exports que la suite ne touchait pas",
|
|
157
|
+
"artifact": "test-scripts/unit/catalogue.test.mjs",
|
|
158
|
+
"progress": 100,
|
|
159
|
+
"status": "done"
|
|
115
160
|
}
|
|
116
161
|
],
|
|
117
162
|
"tests": [
|
|
@@ -492,6 +537,216 @@
|
|
|
492
537
|
"expected": "les entrées projetées disparaissent, celles de l'application survivent"
|
|
493
538
|
}
|
|
494
539
|
]
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
"ref": "T-KC-17",
|
|
543
|
+
"specRef": "SPEC-KC-09",
|
|
544
|
+
"type": "automated",
|
|
545
|
+
"priority": "critical",
|
|
546
|
+
"title": "T-KC-17 — le diagnostic PROPOSE une occurrence et rend LES MOTS qui l'ont désignée",
|
|
547
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-17",
|
|
548
|
+
"steps": [
|
|
549
|
+
{
|
|
550
|
+
"action": "auditer un plan qui porte une exigence de périmètre",
|
|
551
|
+
"expected": "l'occurrence est proposée avec les mots communs — un score opaque ne se conteste pas, donc il ne se corrige jamais"
|
|
552
|
+
}
|
|
553
|
+
]
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
"ref": "T-KC-18",
|
|
557
|
+
"specRef": "SPEC-KC-09",
|
|
558
|
+
"type": "automated",
|
|
559
|
+
"priority": "critical",
|
|
560
|
+
"title": "T-KC-18 — il NOMME les erreurs connues que le plan ne mentionne nulle part",
|
|
561
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-18",
|
|
562
|
+
"steps": [
|
|
563
|
+
{
|
|
564
|
+
"action": "auditer un plan d'une seule exigence",
|
|
565
|
+
"expected": "les manques sont nommés, chacun avec sa conséquence"
|
|
566
|
+
}
|
|
567
|
+
]
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"ref": "T-KC-19",
|
|
571
|
+
"specRef": "SPEC-KC-09",
|
|
572
|
+
"type": "automated",
|
|
573
|
+
"priority": "critical",
|
|
574
|
+
"title": "T-KC-19 — les deux sorties sont DÉCOUPLÉES : une règle transverse parle même sans occurrence",
|
|
575
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-19",
|
|
576
|
+
"steps": [
|
|
577
|
+
{
|
|
578
|
+
"action": "auditer un plan sans rapport avec le catalogue",
|
|
579
|
+
"expected": "les règles transverses rendent leurs erreurs ; les règles métier se taisent — sinon un plan de bordereaux reçoit les pièges de l'apiculture"
|
|
580
|
+
}
|
|
581
|
+
]
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
"ref": "T-KC-20",
|
|
585
|
+
"specRef": "SPEC-KC-09",
|
|
586
|
+
"type": "automated",
|
|
587
|
+
"priority": "critical",
|
|
588
|
+
"title": "T-KC-20 — le diagnostic NE MODIFIE PAS le plan qu'il lit",
|
|
589
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-20",
|
|
590
|
+
"steps": [
|
|
591
|
+
{
|
|
592
|
+
"action": "auditer puis comparer le plan",
|
|
593
|
+
"expected": "intact — un audit qui change son objet ne distingue plus ce qui venait du plan"
|
|
594
|
+
}
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"ref": "T-KC-21",
|
|
599
|
+
"specRef": "SPEC-KC-09",
|
|
600
|
+
"type": "automated",
|
|
601
|
+
"priority": "critical",
|
|
602
|
+
"title": "T-KC-21 — le rapport dit que les rapprochements sont PROPOSÉS, jamais appliqués",
|
|
603
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-21",
|
|
604
|
+
"steps": [
|
|
605
|
+
{
|
|
606
|
+
"action": "relire le rapport rendu",
|
|
607
|
+
"expected": "la mention y est, ainsi que l'explicabilité — c'est KIND-ECRITURE-GARDEE-01 appliqué à l'outil lui-même"
|
|
608
|
+
}
|
|
609
|
+
]
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
"ref": "T-KC-22",
|
|
613
|
+
"specRef": "SPEC-KC-10",
|
|
614
|
+
"type": "automated",
|
|
615
|
+
"priority": "critical",
|
|
616
|
+
"title": "T-KC-22 — la CONSÉQUENCE n'entre pas dans le test de couverture",
|
|
617
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-22",
|
|
618
|
+
"steps": [
|
|
619
|
+
{
|
|
620
|
+
"action": "une erreur au titre reconnu mais à la conséquence verbeuse",
|
|
621
|
+
"expected": "couverte — la conséquence est notre prose ; un plan n'a aucune raison de la contenir, et l'inclure pénalisait les erreurs bien expliquées"
|
|
622
|
+
}
|
|
623
|
+
]
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
"ref": "T-KC-23",
|
|
627
|
+
"specRef": "SPEC-KC-10",
|
|
628
|
+
"type": "automated",
|
|
629
|
+
"priority": "critical",
|
|
630
|
+
"title": "T-KC-23 — les SYNONYMES déclarés relient deux vocabulaires du même domaine",
|
|
631
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-23",
|
|
632
|
+
"steps": [
|
|
633
|
+
{
|
|
634
|
+
"action": "un plan disant « désactivation supprimée » contre une fiche disant « retrait effacé », sans puis avec synonymes",
|
|
635
|
+
"expected": "non reconnue sans, reconnue avec — aucun rapprochement lexical ne peut deviner l'équivalence, elle est propre au domaine"
|
|
636
|
+
}
|
|
637
|
+
]
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
"ref": "T-KC-24",
|
|
641
|
+
"specRef": "SPEC-KC-10",
|
|
642
|
+
"type": "automated",
|
|
643
|
+
"priority": "critical",
|
|
644
|
+
"title": "T-KC-24 — un groupe de synonymes d'un seul mot est ignoré, il ne relie rien",
|
|
645
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-24",
|
|
646
|
+
"steps": [
|
|
647
|
+
{
|
|
648
|
+
"action": "déclarer un groupe à un mot",
|
|
649
|
+
"expected": "écarté au montage"
|
|
650
|
+
}
|
|
651
|
+
]
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
"ref": "T-KC-25",
|
|
655
|
+
"specRef": "SPEC-KC-10",
|
|
656
|
+
"type": "automated",
|
|
657
|
+
"priority": "critical",
|
|
658
|
+
"title": "T-KC-25 — un radical trop court est écarté : il ne désignerait plus rien",
|
|
659
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-25",
|
|
660
|
+
"steps": [
|
|
661
|
+
{
|
|
662
|
+
"action": "déclarer un radical de trois lettres (`dat`) et un plan parlant de « dattes »",
|
|
663
|
+
"expected": "écarté — sous quatre lettres un radical cesse de désigner, et un rapprochement injustifiable est pire que pas de rapprochement"
|
|
664
|
+
}
|
|
665
|
+
]
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"ref": "T-KC-26",
|
|
669
|
+
"specRef": "SPEC-KC-10",
|
|
670
|
+
"type": "automated",
|
|
671
|
+
"priority": "critical",
|
|
672
|
+
"title": "T-KC-26 — un mot de QUATRE lettres désigne, et il porte souvent tout le sens",
|
|
673
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-26",
|
|
674
|
+
"steps": [
|
|
675
|
+
{
|
|
676
|
+
"action": "extraire les mots-clés d'une phrase portant `date`, `note`, `vote`, `lieu` et des mots vides de quatre lettres",
|
|
677
|
+
"expected": "les porteurs de sens sont retenus, les mots vides écartés nommément — le seuil à cinq lettres écartait le mot qui DISTINGUE"
|
|
678
|
+
}
|
|
679
|
+
]
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
"ref": "T-KC-27",
|
|
683
|
+
"specRef": "SPEC-KC-11",
|
|
684
|
+
"type": "automated",
|
|
685
|
+
"priority": "critical",
|
|
686
|
+
"title": "T-KC-27 — PROVENANCES est exactement ce que `defineKind` admet en origine",
|
|
687
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-27",
|
|
688
|
+
"steps": [
|
|
689
|
+
{
|
|
690
|
+
"action": "monter une fiche avec chacune des provenances déclarées, puis avec une provenance hors liste",
|
|
691
|
+
"expected": "les trois déclarées passent ; l'inconnue est refusée et le refus ÉNUMÈRE les admises — sinon la constante ne dit rien à qui construit une fiche"
|
|
692
|
+
}
|
|
693
|
+
]
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
"ref": "T-KC-28",
|
|
697
|
+
"specRef": "SPEC-KC-11",
|
|
698
|
+
"type": "automated",
|
|
699
|
+
"priority": "critical",
|
|
700
|
+
"title": "T-KC-28 — PLAN_VERSION est exactement ce que `toDevtest` écrit dans le plan",
|
|
701
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-28",
|
|
702
|
+
"steps": [
|
|
703
|
+
{
|
|
704
|
+
"action": "projeter une fiche et relire le champ `plan`",
|
|
705
|
+
"expected": "identique à la constante — qatrax lit ce champ pour accepter le plan"
|
|
706
|
+
}
|
|
707
|
+
]
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"ref": "T-KC-29",
|
|
711
|
+
"specRef": "SPEC-KC-11",
|
|
712
|
+
"type": "automated",
|
|
713
|
+
"priority": "critical",
|
|
714
|
+
"title": "T-KC-29 — AFFINABLES est exactement ce qu'`instantiate` accepte d'affiner",
|
|
715
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-29",
|
|
716
|
+
"steps": [
|
|
717
|
+
{
|
|
718
|
+
"action": "affiner chacun des sept champs déclarés, puis un champ hors liste, puis sans motif, puis avec une valeur qui casse la fiche",
|
|
719
|
+
"expected": "les sept passent ; le champ hors liste, l'affinage sans motif et l'affinage qui invalide la fiche sont tous trois refusés"
|
|
720
|
+
}
|
|
721
|
+
]
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"ref": "T-KC-30",
|
|
725
|
+
"specRef": "SPEC-KC-11",
|
|
726
|
+
"type": "automated",
|
|
727
|
+
"priority": "critical",
|
|
728
|
+
"title": "T-KC-30 — `marqueur` est ce qui rend `enrichir` idempotent, et il est DANS le bloc rendu",
|
|
729
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-30",
|
|
730
|
+
"steps": [
|
|
731
|
+
{
|
|
732
|
+
"action": "chercher le marqueur de la fiche dans le bloc qu'elle engendre",
|
|
733
|
+
"expected": "présent — sans lui un second enrichissement recollerait tout une deuxième fois"
|
|
734
|
+
}
|
|
735
|
+
]
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
"ref": "T-KC-31",
|
|
739
|
+
"specRef": "SPEC-KC-11",
|
|
740
|
+
"type": "automated",
|
|
741
|
+
"priority": "critical",
|
|
742
|
+
"title": "T-KC-31 — `normaliser` retire la casse, les accents et la ponctuation, et rien d'autre",
|
|
743
|
+
"autoRef": "test-scripts/unit/catalogue.test.mjs::T-KC-31",
|
|
744
|
+
"steps": [
|
|
745
|
+
{
|
|
746
|
+
"action": "normaliser une phrase accentuée et ponctuée, puis `null`",
|
|
747
|
+
"expected": "texte réduit aux mots en minuscules sans accents ; `null` rend la chaîne vide et ne lève pas"
|
|
748
|
+
}
|
|
749
|
+
]
|
|
495
750
|
}
|
|
496
751
|
]
|
|
497
752
|
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Épreuve rétrospective n° 1 — RestoTrax
|
|
2
|
+
|
|
3
|
+
**Protocole** : `PROPOSITION-REGLE-RELIRE-LE-PLAN.md` §5.bis
|
|
4
|
+
**Auteur** : Dr Hamid MADANI <drmdh@msn.com> · **Date** : 2026-09-06
|
|
5
|
+
**Objet** : diagnostiquer le plan **initial** du lot assistant-pilote de RestoTrax, et comparer au
|
|
6
|
+
résultat réellement atteint.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1 · Le dispositif
|
|
11
|
+
|
|
12
|
+
| | |
|
|
13
|
+
|---|---|
|
|
14
|
+
| plan initial | `docs/DEVTEST-PLAN.assistant-pilote.json`, commit `9781b2f` du **31/08/2026** — « état de production, avant restructuration » |
|
|
15
|
+
| contenu | **14 exigences, 18 essais** |
|
|
16
|
+
| corpus complet | **21 fiches** |
|
|
17
|
+
| **corpus retenu** | **13 fiches** — 8 écartées par la double borne |
|
|
18
|
+
|
|
19
|
+
### La double borne a écarté 8 fiches, et elle a dit pourquoi
|
|
20
|
+
|
|
21
|
+
| écartée | motif |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `KIND-DONNEE-INSUFFISANTE-01` · `KIND-ECRITURE-GARDEE-01` · `KIND-REFUS-LISIBLE-01` | **origine du projet jugé** — nées d'incidents de RestoTrax |
|
|
24
|
+
| `KIND-ACQUIS-01` · `KIND-MAJ-PARTIELLE-01` · `KIND-ECRITURE-HORS-APPLICATION-01` · `KIND-FORMULAIRE-ROUTE-01` · `KIND-CONSIGNER-APRES-SUCCES-01` | **postérieures au plan** |
|
|
25
|
+
|
|
26
|
+
**C'est le bon comportement, et il coûte.** Les trois premières décrivent exactement ce que RestoTrax
|
|
27
|
+
a corrigé après le 31/08 — et l'outil **n'avait pas le droit** de les employer, puisqu'elles ont été
|
|
28
|
+
écrites *depuis* ces corrections. Un score qui les aurait comptées aurait été flatteur et faux.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2 · Ce que l'outil a dit
|
|
33
|
+
|
|
34
|
+
**35 erreurs signalées, sur 7 règles.** Deux règles rapprochées d'au moins une exigence.
|
|
35
|
+
|
|
36
|
+
| règle | erreurs signalées | occurrences reconnues |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `KIND-CHIFFRE-SANS-SOURCE-01` | 7 / 7 | 2 |
|
|
39
|
+
| `KIND-PERIMETRE-01` | 6 / 6 | 0 |
|
|
40
|
+
| `KIND-SUPPRESSION-DATEE-01` | 5 / 5 | 1 |
|
|
41
|
+
| `KIND-ECHEC-FOURNISSEUR-01` | 5 / 5 | 0 |
|
|
42
|
+
| `KIND-DEPENDANCE-DISTANTE-01` | 5 / 5 | 0 |
|
|
43
|
+
| `KIND-SORTIE-GENEREE-01` | 4 / 4 | 0 |
|
|
44
|
+
| `KIND-ECRITURE-HORS-SCHEMA-01` | 3 / 4 | 0 |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3 · Le classement — et il est mauvais
|
|
49
|
+
|
|
50
|
+
Ce que RestoTrax a **réellement** fait après le 31/08 : la migration vers `@mostajs/assistant-pilote`
|
|
51
|
+
(02/09, trois tables renommées), la normalisation de l'identifiant de connexion et la correction du
|
|
52
|
+
message de refus (02/09).
|
|
53
|
+
|
|
54
|
+
| classe | règles | erreurs | détail |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| **anticipé** | **1 partiellement** | 1 sur 35 | `KIND-ECRITURE-HORS-SCHEMA-01` — *« la migration ne SAIT PAS altérer une table existante »*. RestoTrax a bien renommé trois tables le 02/09, et la bascule n'a été franche **que parce qu'elles étaient vides en production**. Le risque signalé était réel |
|
|
57
|
+
| **FAUX POSITIF** | **1** | **5** | `KIND-SUPPRESSION-DATEE-01` — voir §4 |
|
|
58
|
+
| **sans objet** | 5 | ~29 | tableau de bord, périmètre d'instance, fournisseur externe, sortie générée, dépendance distante : **le lot pilote n'en porte aucun** |
|
|
59
|
+
| **contredit** | 0 | 0 | — |
|
|
60
|
+
|
|
61
|
+
**Ce que RestoTrax a effectivement corrigé après le 31/08 venait de fiches ÉCARTÉES par la borne.**
|
|
62
|
+
L'outil ne pouvait pas le savoir — et c'est correct. **Mais cela signifie que, sur cet essai, le
|
|
63
|
+
rappel utile est proche de zéro pour un coût de lecture de 35 erreurs.**
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 4 · ⚠️ Le faux positif — la découverte de cet essai
|
|
68
|
+
|
|
69
|
+
L'outil a signalé **5 erreurs sur 5** pour `KIND-SUPPRESSION-DATEE-01`, comme « non mentionnées
|
|
70
|
+
nulle part ». Or le plan initial porte :
|
|
71
|
+
|
|
72
|
+
> **`PIL-14`** — *« Activation, désactivation et conseils sont tous horodatés et **conservés** par
|
|
73
|
+
> l'ORM, refus compris »*
|
|
74
|
+
>
|
|
75
|
+
> **`TPIL-14`** — *« la désactivation est **DATÉE, pas effacée** »*
|
|
76
|
+
|
|
77
|
+
**La règle est couverte, explicitement, et par une exigence ET un essai.** Le rapprochement a
|
|
78
|
+
échoué parce que **les deux textes disent la même chose avec d'autres mots** : la fiche parle de
|
|
79
|
+
*retrait*, *pierre tombale*, *attribué*, *restauration* ; le plan parle de *désactivation*,
|
|
80
|
+
*horodatés*, *conservés*.
|
|
81
|
+
|
|
82
|
+
**Conséquence directe : le compte des « erreurs non couvertes » est GONFLÉ.** Le rappel du
|
|
83
|
+
mécanisme est meilleur que sa précision ne le laisse croire — mais un lecteur qui vérifie cinq
|
|
84
|
+
signalements pour découvrir qu'ils portent sur une exigence déjà tenue cesse de lire au troisième.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 5 · ⚠️ Le second défaut — la borne porte sur l'ORIGINE, pas sur le CONTENU
|
|
89
|
+
|
|
90
|
+
Une fiche retenue peut avoir été **enrichie après** la date du plan. Mesuré :
|
|
91
|
+
|
|
92
|
+
| règle retenue | origines postérieures au 31/08 |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `KIND-PERIMETRE-01` | **3** |
|
|
95
|
+
| `KIND-CHIFFRE-SANS-SOURCE-01` | **2** |
|
|
96
|
+
| `KIND-SUPPRESSION-DATEE-01` | **2** |
|
|
97
|
+
| `KIND-ECRITURE-HORS-SCHEMA-01` | **2** |
|
|
98
|
+
| `KIND-DEPENDANCE-DISTANTE-01` | **2** |
|
|
99
|
+
|
|
100
|
+
Exemple : deux des sept erreurs de `KIND-CHIFFRE-SANS-SOURCE-01` — celles sur **l'âge d'une valeur
|
|
101
|
+
périmée** — ont été ajoutées le **04/09**, depuis TicketFlow. L'outil « aurait dit » le 31/08 des
|
|
102
|
+
choses qu'il ne pouvait pas savoir.
|
|
103
|
+
|
|
104
|
+
**Le protocole est donc incomplet** : il faudrait borner au niveau de **chaque erreur**, ce qui
|
|
105
|
+
suppose de dater les erreurs individuellement — elles ne le sont pas aujourd'hui.
|
|
106
|
+
|
|
107
|
+
⚠️ **Et ce défaut est provisoirement infranchissable** : le corpus a **cinq jours**, les plans en ont
|
|
108
|
+
plusieurs mois. Aucune fiche ne précède vraiment les plans qu'on veut juger.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 6 · Conclusion de l'essai n° 1
|
|
113
|
+
|
|
114
|
+
**L'essai ne valide pas la règle. Il ne l'écarte pas non plus — il montre qu'elle n'est pas encore
|
|
115
|
+
éprouvable.**
|
|
116
|
+
|
|
117
|
+
| mesure | valeur | lecture |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| **rappel utile** | ~1 sur 35 | très faible **sur ce lot** |
|
|
120
|
+
| **coût de lecture** | 35 erreurs, dont 5 sur une exigence déjà tenue | élevé |
|
|
121
|
+
| **faux positifs démontrés** | **1 règle, 5 erreurs** | défaut de mécanisme, corrigeable |
|
|
122
|
+
| **fuite de la borne de contenu** | 5 règles sur 7 | défaut de protocole, non corrigeable aujourd'hui |
|
|
123
|
+
|
|
124
|
+
### Trois enseignements, et ils valent plus que le score
|
|
125
|
+
|
|
126
|
+
1. **Le rapprochement lexical produit des faux positifs sur du vocabulaire divergent.** Deux textes
|
|
127
|
+
qui disent la même chose autrement ne se reconnaissent pas. C'est corrigeable — synonymes
|
|
128
|
+
déclarés par fiche, ou rapprochement sur les **épreuves** plutôt que sur les intitulés.
|
|
129
|
+
2. **Un plan de LOT n'est pas un plan d'APPLICATION.** Cinq des sept règles signalées portent sur
|
|
130
|
+
des sujets que le lot pilote ne traite pas. Diagnostiquer le plan **complet** de RestoTrax — et
|
|
131
|
+
non celui d'un lot — donnerait un résultat tout autre. **L'essai a mal choisi son objet.**
|
|
132
|
+
3. **La double borne fonctionne, et elle est coûteuse.** Elle a écarté les trois fiches qui
|
|
133
|
+
décrivaient exactement les corrections à venir. C'est la preuve qu'elle mord — et la raison pour
|
|
134
|
+
laquelle un corpus jeune ne peut pas être éprouvé sur des plans anciens.
|
|
135
|
+
|
|
136
|
+
### Ce que je recommande avant l'essai n° 2
|
|
137
|
+
|
|
138
|
+
| # | action |
|
|
139
|
+
|---|---|
|
|
140
|
+
| 1 | **corriger le faux positif** : rapprocher aussi sur les épreuves, ou déclarer des synonymes par fiche |
|
|
141
|
+
| 2 | **prendre le plan COMPLET** d'une application, pas celui d'un lot |
|
|
142
|
+
| 3 | **dater les erreurs individuellement** dans les fiches — sans quoi la borne de contenu restera une fiction |
|
|
143
|
+
| 4 | **choisir un projet dont le plan est postérieur** à une partie du corpus — CollabTrax (03/08) et LabTrax (31/08) sont de meilleurs candidats que RestoTrax |
|
|
144
|
+
|
|
145
|
+
⚠️ **Et il reste possible que la règle soit écartée.** Cet essai ne le dit pas encore : il dit que
|
|
146
|
+
l'instrument n'est pas prêt, non que l'idée est fausse. Les deux conclusions sont différentes, et
|
|
147
|
+
les confondre serait la faute que ce document existe pour éviter.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Addendum du 06/09/2026 — le faux positif est corrigé, en trois temps
|
|
152
|
+
|
|
153
|
+
> Les chiffres du corps de ce rapport sont ceux de `@mostajs/kind-catalog` **0.3.0** et restent tels
|
|
154
|
+
> quels : un rapport d'épreuve ne se réécrit pas, sinon on perd la mesure de ce qui a été corrigé.
|
|
155
|
+
|
|
156
|
+
Le faux positif du §4 — `KIND-SUPPRESSION-DATEE-01` signalée **5 fois sur 5** alors que `PIL-14` et
|
|
157
|
+
`TPIL-14` la portaient explicitement — avait **trois** causes, et non une. Elles ne sont apparues
|
|
158
|
+
qu'en les levant l'une après l'autre :
|
|
159
|
+
|
|
160
|
+
| correctif | ce que je m'étais trompé à faire | erreurs signalées | la règle |
|
|
161
|
+
|---|---|---|---|
|
|
162
|
+
| 0.3.0 | — | **35** | 5/5 |
|
|
163
|
+
| couverture sur le **titre** seul | j'exigeais qu'un plan contienne aussi la `consequence` — qui est **notre** prose, écrite pour qui lit la fiche. Une erreur d'autant plus « non couverte » qu'elle était **bien expliquée** | **27** | 3/5 |
|
|
164
|
+
| synonymes au **radical** | je les avais écrits en mots entiers : il fallait énumérer toutes les flexions du français. Neuf mots pour un seul groupe, et `supprimée` passait quand même | **26** | 2/5 |
|
|
165
|
+
| mots-clés à partir de **4 lettres** | `date`, `note`, `vote`, `lieu` étaient écartés — c'est-à-dire **le mot qui distingue**. « le retrait est un simple drapeau, sans **date** » ne retenait que `retrait`, `simple`, `drapeau`, et l'exigence qui disait « horodatés » ne pouvait pas la couvrir | **23** | **1/5** |
|
|
166
|
+
|
|
167
|
+
**La conclusion du §4 est confirmée, sa cause est corrigée, et son remède initial était insuffisant.**
|
|
168
|
+
J'avais proposé « rapprocher aussi sur les épreuves, ou déclarer des synonymes » : les synonymes
|
|
169
|
+
seuls ne retiraient qu'**une** erreur sur cinq. Les deux autres causes étaient dans mon propre test
|
|
170
|
+
de couverture.
|
|
171
|
+
|
|
172
|
+
L'erreur qui subsiste — *« la restauration recrée un objet neuf »* — n'est **pas** un faux positif :
|
|
173
|
+
le plan de RestoTrax ne dit rien d'une restauration. Elle reste signalée à juste titre.
|
|
174
|
+
|
|
175
|
+
Contrôle de non-régression : le même correctif appliqué au plan de LabTrax laisse le total
|
|
176
|
+
**inchangé à 11** — le seuil à quatre lettres n'a ajouté aucun bruit. Voir
|
|
177
|
+
[`EPREUVE-02-LABTRAX-06092026.md`](EPREUVE-02-LABTRAX-06092026.md).
|