Toujours exactement 3 alternatives
Méthode : negotiated-structure.alternatives v1.0.0
Spec : spec-2bis#19
Ce que fait cette méthode
À partir d'une courbe de consommation nette et d'un instantané de marché, elle sélectionne
exactement 3 offres représentatives couvrant l'ensemble du spectre risque/coût :
| Alternative | Archétype principal | Logique |
|---|---|---|
| Sécurité | fixe | Prix bloqué = CAL Y+1 baseload, exposition zéro |
| Équilibré | calendaire_indexe | Indexé au forward annuel, variance réduite |
| Opportuniste | spot_indexe | Indexé au spot J-1 (proxy M+1 si ENTSO-E indisponible) |
Pourquoi toujours 3 ?
La règle "exactement 3" garantit que chaque recommandation présente un éventail complet.
Si un archétype ne peut pas être tarifé (données de marché manquantes), la méthode insère
un emplacement vide libellé « indisponible — données marché manquantes » — jamais un
chiffre inventé.
Paramètres des archétypes candidats
Les paramètres sont dérivés de manière déterministe depuis le snapshot de marché et la
structure de base (optimize()) :
fixe : fixed_eur_mwh = CAL Y+1 baseload, term_months issu de la structure recommandée.
calendaire_indexe : spread_eur_mwh = 0 (prix marché, pas de marge inventée), horizon CAL Y+1.
bloc_calendaire : 70 % baseload + 30 % bloc Q4 peak, spread = 0 (candidat de repli pour Équilibré).
spot_indexe : spread = 0, ENTSO-E indisponible → proxy M+1 (déclaré en data_quality: modelled).
spot_plus_future : 50 % spot / 50 % CAL Y+1, spread = 0 (candidat de repli pour Opportuniste).
Règle de sélection
Dans chaque bucket, plusieurs candidats sont tarifés via priceOffer (spec-2bis#18).
Les offres data_quality = "unavailable" sont filtrées avant le classement pour éviter
qu'un all_in_eur_mwh = 0 ne gagne comme le moins cher.
Le moins cher parmi les offres disponibles est retenu.
Garantie de non-fabrication
Si tous les candidats d'un bucket sont indisponibles (par ex. CAL strip manquant pour fixe),
la méthode retourne un IndisponiblePlaceholder avec status: "indisponible".
Elle ne remonte jamais un chiffre arbitraire ni ne dégrade silencieusement vers un autre archétype.
Lien avec curve-pricer (small B2B)
La méthode priceB2bOffersAgainstCurve (lib/b2b/pricing/curve-pricer.ts) utilise les mêmes
labels (Sécurité / Équilibré / Opportuniste) et le même comportement de placeholder.
Elle opère sur le catalogue b2b_tariff_offers (petits professionnels BT ≤ 250 kVA) ;
la présente méthode opère sur les archetypes de gros consommateurs (HTA/HTB).