gold.decision_vector est la couche de scoring. Il lit decision_context
et émet une ligne par (organization_id, variant_id, shop_id, snapshot_date, domain) portant
un vecteur de risque — des scores dans [0, 1] — plus la porte des actions
(allowed_actions / forbidden_actions) et une piste d’audit (applied_rules).
variant_id / shop_id sont NOT NULL ici (la clé MERGE l’exige), bien qu’elles soient
nullables en amont sur decision_context.
La STRUCT scores
Une seule STRUCT NOT NULL porte les champs de score de chaque domaine côte à côte. Les
sous-champs sont nullables : une ligne remplie par un domaine laisse NULL les sous-champs des
autres — gardant la table d’une seule forme entre domaines. La non-nullité du domaine
rempli est garantie par construction : chaque entrée NULL en amont est ramenée à une valeur
neutre avant le scoring.
La porte des actions
Chaque ligne porte aussi trois tableauxNOT NULL :
allowed_actions— la base émet le domaine lui-même, p. ex.["restock"].forbidden_actions—[]en v1.1 ; de futures règles SOURCING / SIZING le rempliront.applied_rules— piste d’audit, toujours non vide (size(applied_rules) > 0). Le premier élément est un qualifieur de domaine (p. ex.markdown_domain_qualifier:v1) ; les suivants sont les IDs des règles métier de scoring qui se sont déclenchées.
Scoring par domaine
- Restock
- Rebalance
- Markdown
Source : Défauts NULL :
build_decision_vector/scoring.py. Toutes les pondérations sont des constantes de
module.restock_urgency ∈ [0, 1]stockout_risk ∈ [0, 1]overstock_risk ∈ [0, 1]days_of_cover → 30 (neutre), forecast_30d → 0 (pas de demande),
gross_margin_pct → 0, aged_stock_flag → false. Une ligne tout-NULL score (0, 0, 0).Validation
- Erreurs (échouent la tâche) :
decision_vector_not_empty,decision_vector_required_fields,decision_vector_pk_unique,decision_vector_applied_rules_non_empty,decision_vector_domain_allowed_v11, et des bornesBETWEEN 0 AND 1(NULL-safe) sur les scores rebalance (surplus_score,deficit_score,transfer_urgency). - Avertissements : contrôles de plage sur les scores restock (
restock_urgency,stockout_risk,overstock_risk).
Les pondérations de scoring sont des constantes de module aujourd’hui ; le réglage passe par
une PR revue, pas par un bouton de réglages. Un futur chemin de calibration pourra les
exposer via les réglages gold une fois que les données de production le justifieront.
Source
- Schéma :
pipelines/shared/schemas/gold/decision_vector.py - Scoring :
build_decision_vector/{scoring.py, scoring_markdown.py},build_decision_vector_rebalance/scoring_rebalance.py - Lookup markdown :
pipelines/shared/config/markdown_discount_lookup.yaml - Doc repo :
docs/gold/decision-vector.md

