mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-22 14:38:10 +02:00
refactor(ai): simplify guardrail - protection is now a strong signal, not mandatory override
This commit is contained in:
1 parent
8b73363550
commit
32164572aa
2 files changed
+8
-17
No files matched your search
@@ -22,8 +22,8 @@ IMPORTANT : La gamme C est RÉSERVÉE aux produits saisonniers et gérée MANUEL
|
|||||||
|
|
||||||
--- ORDRE DE PRIORITÉ (STRICT) ---
|
--- ORDRE DE PRIORITÉ (STRICT) ---
|
||||||
|
|
||||||
1. GARDE-FOU PROTECTION : Si isProtected = true (Nouveauté / Dernier Produit / Top30) → A obligatoire.
|
1. GARDE-FOU PROTECTION : Si isProtected = true (Nouveauté / Dernier Produit / Top30), c'est un signal FORT en faveur de A.
|
||||||
EXCEPTION : La protection est déjà neutralisée pour les produits à CA réseau < 10€ ou marge ≤ 0%. Si tu ne vois pas le signal 🛡️, le produit n'est PAS protégé.
|
Cependant, si les performances réelles du produit sont clairement insuffisantes (CA dérisoire, marge nulle ou négative), tu PEUX passer outre la protection et recommander Z avec justification.
|
||||||
|
|
||||||
2. SEUIL PLANCHER ABSOLU (règle critique) :
|
2. SEUIL PLANCHER ABSOLU (règle critique) :
|
||||||
Si isLowContribution = true [poids CA < 0.5% ET poids QTÉ < 0.5% du fournisseur]
|
Si isLowContribution = true [poids CA < 0.5% ET poids QTÉ < 0.5% du fournisseur]
|
||||||
|
|||||||
@@ -269,25 +269,16 @@ export class ContextProfiler {
|
|||||||
medianMarge
|
medianMarge
|
||||||
);
|
);
|
||||||
|
|
||||||
// 8. Gardes-fous
|
// 8. Gardes-fous (signaux, pas des verdicts — Mary décide au final)
|
||||||
// Neutralisation : un produit à CA réseau trivial (< 10€) ou marge ≤ 0%
|
const isProtected =
|
||||||
// n'a pas d'activité économique réelle. Le protéger serait absurde.
|
|
||||||
const rawCa = target.totalCa ?? 0;
|
|
||||||
const rawMarge = target.tauxMarge ?? 0;
|
|
||||||
const isEconomicallyViable = rawCa >= 10 && rawMarge > 0;
|
|
||||||
|
|
||||||
const isProtected = isEconomicallyViable && (
|
|
||||||
scoring.decision.isRecent ||
|
scoring.decision.isRecent ||
|
||||||
scoring.decision.isTop30Supplier ||
|
scoring.decision.isTop30Supplier ||
|
||||||
scoring.decision.isLastProduct
|
scoring.decision.isLastProduct;
|
||||||
);
|
|
||||||
|
|
||||||
let protectionReason = "";
|
let protectionReason = "";
|
||||||
if (isProtected) {
|
if (scoring.decision.isRecent) protectionReason = "Nouveauté (< 3 mois de données)";
|
||||||
if (scoring.decision.isRecent) protectionReason = "Nouveauté (< 3 mois de données)";
|
else if (scoring.decision.isTop30Supplier) protectionReason = "Top 30% CA Fournisseur";
|
||||||
else if (scoring.decision.isTop30Supplier) protectionReason = "Top 30% CA Fournisseur";
|
else if (scoring.decision.isLastProduct) protectionReason = "Dernière référence du fournisseur";
|
||||||
else if (scoring.decision.isLastProduct) protectionReason = "Dernière référence du fournisseur";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 9. Règle absolue
|
// 9. Règle absolue
|
||||||
const scoreCritique = (target.score ?? 0) < 20;
|
const scoreCritique = (target.score ?? 0) < 20;
|
||||||
|
|||||||
Reference in new issue
Block a user