feat(planning): complete verified explanations and trace delivery (#46)

Implement plan explanations, original decision traces, calendar replay, and worker counterfactual analysis. Preserve incomplete checkpoints and conflict reasons, with accessible navigation and localized comparison details.

Keep planning outcomes independent of tracing and bound worker delivery with receiver acknowledgements. Retain complete candidate history while releasing temporary buffers and benchmark references.

Validated with 201 tests, app/spec type checks, lint, production build, baseline outcome comparisons, and repeated loaded browser measurements. Document performance and remaining limits.
This commit is contained in:
nessar committed 2026-10-03 16:26:56 +02:00
1 parent 0ce33cc9d6
commit 01c87d1e44
20 files changed
+7625 -1001

No files matched your search

+16
View File
@@ -119,10 +119,16 @@
"next": "Placement suivant",
"last": "Dernier placement",
"remaining": "Jours non utilisés dans le planning final",
"balanceRemaining": "restants",
"counterfactual": "Dates alternatives",
"counterfactualLoading": "Analyse de chaque date de l’horizon…",
"counterfactualReady": "Les dates alternatives sont prêtes.",
"counterfactualError": "Les dates alternatives n’ont pas pu être calculées.",
"retryCounterfactual": "Relancer l’analyse des dates",
"historicalEligibilityLoading": "Vérification des dates utilisables pour ce congé…",
"historicalEligibilityReady": "L’éligibilité historique des dates est prête.",
"historicalEligibilityError": "L’éligibilité historique des dates n’a pas pu être vérifiée.",
"retryHistoricalEligibility": "Revérifier l’éligibilité historique",
"eligible": "Éligible",
"ineligible": "Inéligible",
"historical": "Statut de la recherche originale",
@@ -140,6 +146,7 @@
"outsideHorizon": "Date de contexte hors de l’horizon de planification",
"traceTitle": "Avancé : trace des décisions originales",
"traceLoading": "Le plan est prêt ; sa trace de décision est encore en cours de chargement…",
"traceReady": "Le plan est prêt et sa trace de décision est chargée.",
"traceUnavailable": "Aucune trace de décision n’est disponible pour ce résultat.",
"phases": "Phases de la trace",
"firstPhase": "Première phase",
@@ -200,6 +207,7 @@
"leaveUsed": "Cette date utilise 1 jour du solde « {balance} ».",
"expires": "Solde à utiliser au plus tard le",
"linkedRules": "Règles liées :",
"atRiskContribution": "Protège des congés à risque d’expiration.",
"impact": "Ce que ce jour change",
"impactHelp": "Comparez tout le planning avec et sans ce jour de congé. Les autres dates restent identiques ; seuls les totaux qui changent sont affichés.",
"criterion": "Sur tout le planning",
@@ -218,6 +226,10 @@
"withCandidate": "Avec ce candidat",
"comparisonUnavailable": "La comparaison pour la date initiale est indisponible ; la différence ne peut donc pas être affichée.",
"objectives": {
"obligation-validity": {
"label": "Obligations non satisfaites",
"help": "Nombre de règles obligatoires non respectées. Un plan valide en compte zéro."
},
"unplaced-at-risk": {
"label": "Congés risquant d’expirer sans être utilisés",
"help": "Jours non posés expirant pendant la période planifiée. Moins, c’est mieux."
@@ -282,6 +294,10 @@
"expires": "Expire le",
"criteria": "Les priorités du calcul",
"criteriaHelp": "Lisez de haut en bas : la première différence est prioritaire. Sélectionnez un critère pour comprendre son calcul.",
"traceImpactTitle": "Effet de cette branche sur le plan complet",
"traceImpactHelp": "Ces valeurs comparent l’état complet avant et après cette branche. Elles montrent son effet, pas pourquoi le calcul l’a choisie.",
"traceStageTitle": "Comparaison réelle à cette étape",
"traceStageHelp": "Ces valeurs brutes ont été comparées lors de cette décision ; la première différence explique le statut de la possibilité. Le tableau du plan complet ci-dessous montre l’effet de ce choix.",
"firstDifference": "Première différence",
"higher": "Plus, c’est mieux",
"lower": "Moins, c’est mieux",