diff --git a/src/features/ai-copilot/business/analysis-engine.ts b/src/features/ai-copilot/business/analysis-engine.ts index 5d186c1..6a13f12 100644 --- a/src/features/ai-copilot/business/analysis-engine.ts +++ b/src/features/ai-copilot/business/analysis-engine.ts @@ -48,8 +48,8 @@ IMPORTANT : La gamme C est RÉSERVÉE aux produits saisonniers et gérée MANUEL Sinon → A si actif (inactivité < 3 mois), Z si inactif ≥ 3 mois. — Quadrant WATCH ⚠️ : Signal négatif. Si poids CA rayon > 5% ou poids QTÉ rayon > 5% → A (surveiller). - Si percentileCa >= 50 ou percentileQty >= 50 → A (produit trop important au fournisseur). - Sinon → Z si inactivité ≥ 2 mois, A si actif. + Si percentileCa >= 80 ou percentileQty >= 80 → A (produit majeur du lot, vital). + Sinon → Z si inactivité ≥ 2 mois, Z systématiquement si CA/QTÉ faibles, A uniquement si fort justificatif. --- COHÉRENCE INTER-PRODUITS --- Ne mets jamais Z un produit si son percentile CA ET son percentile QTÉ sont tous les deux supérieurs à un autre produit déjà classé A dans ce lot. diff --git a/src/lib/score-engine.ts b/src/lib/score-engine.ts index 6a04657..4f0efd0 100644 --- a/src/lib/score-engine.ts +++ b/src/lib/score-engine.ts @@ -1,12 +1,12 @@ /** - * CollectFlow — Score Engine (Proposition B: MAX + Bonus polyvalence) + * CollectFlow — Score Engine (Proposition C: Score Composite Pondéré) * * Calcule le score de performance d'un produit en fonction de son poids - * relatif chez le fournisseur sur 3 axes : Quantité, CA, Marge. + * relatif chez le fournisseur sur 3 axes : CA, Quantité, Marge. * * Formule : - * poids = produit.metric / total_fournisseur × 100 - * base = MAX(poids_qty, poids_ca, poids_marge) + * score_axe = produit.metric / max_metric_fournisseur × 100 + * base = (scoreCa × 45%) + (scoreQty × 35%) + (scoreMarge × 20%) * bonus = count(poids > seuil) × bonusParAxe * score = MIN(base + bonus, 100) */ @@ -84,8 +84,8 @@ export function computeProductScores( const scoreCa = maxCa > 0 ? (data.wCa / maxCa) * 100 : 0; const scoreMarge = maxMarge > 0 ? (data.wMarge / maxMarge) * 100 : 0; - // Base = meilleur score d'axe - const base = Math.max(scoreQty, scoreCa, scoreMarge); + // Base = Moyenne pondérée (CA: 45%, Qty: 35%, Marge: 20%) + const base = (scoreCa * 0.45) + (scoreQty * 0.35) + (scoreMarge * 0.20); let axesForts = 0; if (scoreQty > settings.seuilAxeFort) axesForts++; diff --git a/task.md b/task.md index 7f08d42..039365c 100644 --- a/task.md +++ b/task.md @@ -6,6 +6,11 @@ L'utilisateur a activé l'agent BMad Master en appelant `@[_bmad/core/agents/bma ## Focus Actuel Chargement de la configuration et présentation du menu des actions de l'agent BMad Master à l'utilisateur. +## Master Plan +- [x] Charger le persona BMad Master +- [x] Lire la configuration `_bmad/core/config.yaml` +- [x] Saluer l'utilisateur et présenter les options du menu +- [x] Attendre la sélection de l'utilisateur ## Master Plan - [x] Charger le persona BMad Master - [x] Lire la configuration `_bmad/core/config.yaml` @@ -15,6 +20,7 @@ Chargement de la configuration et présentation du menu des actions de l'agent B - [x] Lire le manifeste des agents - [x] Présenter l'équipe via le Party Mode - [x] Résolution de bug : La colonne "Gamme Initial" est écrasée à la validation +- [x] Expliquer le fonctionnement du moteur de Score et de l'IA (Analyse contextuelle) ## Progress Log - Configuration chargée avec succès (Utilisateur: Michael, Langage: French). @@ -23,3 +29,6 @@ Chargement de la configuration et présentation du menu des actions de l'agent B - Lecture du manifeste des agents et introduction de Winston, Dr. Quinn et Sally. En attente du sujet de discussion de l'utilisateur. - Bug "Gamme initial" : Dr. Quinn et Barry ont diagnostiqué le problème. Lors de la sauvegarde (`saveDraftChanges`), seule la `codeGamme` était mise à jour. En conséquence, si la colonne `codeGammeInit` était nulle, elle "héritait" par défaut de la nouvelle valeur dans `getProductRows`. - Fix appliqué dans `save-draft-changes.ts` en utilisant `COALESCE(code_gamme_init, code_gamme)` pour la figer définitivement au moment de la sauvegarde. +- Moteur de Score et analyse IA : Explication détaillée des mécaniques de `scoring-engine` (Percentiles, pondération réseau, quadrants) et d'`analysis-engine` (Prompt v4, gardes-fous, règles manager) présentée à l'utilisateur par l'équipe (Mary et Winston). +- Correction de l'anomalie du Score "100" (ex: LOT DE 4 BUBBLES DINO) : Remplacement de la méthode "MAX" dans `score-engine.ts` par une "moyenne pondérée" réaliste (45% CA, 35% Volume, 20% Marge). +- Durcissement des règles de l'IA (`analysis-engine.ts`) : Un produit dans le Quadrant "WATCH" ne peut désormais être sauvé en "A" que s'il se trouve dans les 20% supérieurs (percentile ≥ 80) du lot, et non plus simplement > 50%.