refactor(ai): simplify guardrail - protection is now a strong signal, not mandatory override

This commit is contained in:
Michael committed 2026-02-27 15:20:15 +01:00
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) ---
1. GARDE-FOU PROTECTION : Si isProtected = true (Nouveauté / Dernier Produit / Top30) → A obligatoire.
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é.
1. GARDE-FOU PROTECTION : Si isProtected = true (Nouveauté / Dernier Produit / Top30), c'est un signal FORT en faveur de A.
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) :
Si isLowContribution = true [poids CA < 0.5% ET poids QTÉ < 0.5% du fournisseur]
@@ -269,25 +269,16 @@ export class ContextProfiler {
medianMarge
);
// 8. Gardes-fous
// Neutralisation : un produit à CA réseau trivial (< 10€) ou marge ≤ 0%
// 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 && (
// 8. Gardes-fous (signaux, pas des verdicts — Mary décide au final)
const isProtected =
scoring.decision.isRecent ||
scoring.decision.isTop30Supplier ||
scoring.decision.isLastProduct
);
scoring.decision.isLastProduct;
let protectionReason = "";
if (isProtected) {
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.isLastProduct) protectionReason = "Dernière référence du fournisseur";
}
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.isLastProduct) protectionReason = "Dernière référence du fournisseur";
// 9. Règle absolue
const scoreCritique = (target.score ?? 0) < 20;