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:
1 parent
0ce33cc9d6
commit
01c87d1e44
20 files changed
+7625
-1001
No files matched your search
@@ -119,10 +119,16 @@
|
||||
"next": "Nächste Platzierung",
|
||||
"last": "Letzte Platzierung",
|
||||
"remaining": "Ungenutzte Tage im endgültigen Plan",
|
||||
"balanceRemaining": "verbleibend",
|
||||
"counterfactual": "Alternative Termine",
|
||||
"counterfactualLoading": "Alle Daten im Horizont werden analysiert…",
|
||||
"counterfactualReady": "Alternative Termine sind bereit.",
|
||||
"counterfactualError": "Alternative Termine konnten nicht berechnet werden.",
|
||||
"retryCounterfactual": "Datumsanalyse erneut versuchen",
|
||||
"historicalEligibilityLoading": "Prüfe, an welchen Tagen dieses Urlaubsguthaben verfügbar war …",
|
||||
"historicalEligibilityReady": "Die historische Datumseignung ist bereit.",
|
||||
"historicalEligibilityError": "Die historische Datumseignung konnte nicht geprüft werden.",
|
||||
"retryHistoricalEligibility": "Historische Datumseignung erneut prüfen",
|
||||
"eligible": "Geeignet",
|
||||
"ineligible": "Nicht geeignet",
|
||||
"historical": "Status der ursprünglichen Suche",
|
||||
@@ -140,6 +146,7 @@
|
||||
"outsideHorizon": "Kontextdatum außerhalb des Planungshorizonts",
|
||||
"traceTitle": "Erweitert: ursprüngliche Entscheidungsspur",
|
||||
"traceLoading": "Der Plan ist fertig; seine Entscheidungsspur wird noch geladen…",
|
||||
"traceReady": "Der Plan ist fertig und seine Entscheidungsspur wurde geladen.",
|
||||
"traceUnavailable": "Für dieses Ergebnis ist keine Entscheidungsspur verfügbar.",
|
||||
"phases": "Spurphasen",
|
||||
"firstPhase": "Erste Phase",
|
||||
@@ -200,6 +207,7 @@
|
||||
"leaveUsed": "Dieses Datum nutzt 1 Tag aus „{balance}“.",
|
||||
"expires": "Dieses Guthaben ist nutzbar bis",
|
||||
"linkedRules": "Zugehörige Regeln:",
|
||||
"atRiskContribution": "Schützt Urlaub, der zu verfallen droht.",
|
||||
"impact": "Was dieser Tag verändert",
|
||||
"impactHelp": "Vergleichen Sie den gesamten Plan mit und ohne diesen Urlaubstag. Alle anderen Urlaubstermine bleiben gleich; nur geänderte Werte werden angezeigt.",
|
||||
"criterion": "Im gesamten Plan",
|
||||
@@ -218,6 +226,10 @@
|
||||
"withCandidate": "Mit diesem Kandidaten",
|
||||
"comparisonUnavailable": "Der Vergleich für das ursprüngliche Datum ist nicht verfügbar. Daher lässt sich die Änderung nicht anzeigen.",
|
||||
"objectives": {
|
||||
"obligation-validity": {
|
||||
"label": "Unerfüllte Verpflichtungen",
|
||||
"help": "Anzahl nicht erfüllter Pflichtregeln. Ein gültiger Plan hat den Wert null."
|
||||
},
|
||||
"unplaced-at-risk": {
|
||||
"label": "Noch nicht genutzte Tage mit Verfallsrisiko",
|
||||
"help": "Ungenutzte Tage, die im Planungszeitraum verfallen. Weniger ist besser."
|
||||
@@ -282,6 +294,10 @@
|
||||
"expires": "Verfällt am",
|
||||
"criteria": "Die Prioritäten des Planers",
|
||||
"criteriaHelp": "Von oben nach unten lesen: Der erste Unterschied hat Vorrang. Wählen Sie ein Kriterium, um seine Berechnung zu sehen.",
|
||||
"traceImpactTitle": "Auswirkung dieses Zweigs auf den Gesamtplan",
|
||||
"traceImpactHelp": "Diese Werte vergleichen den vollständigen Zustand vor und nach diesem Zweig. Sie zeigen seine Auswirkungen, aber nicht, warum der Planer ihn gewählt hat.",
|
||||
"traceStageTitle": "Tatsächlicher Vergleich in dieser Planungsstufe",
|
||||
"traceStageHelp": "Diese Rohwerte wurden bei dieser Entscheidung verglichen; der erste Unterschied erklärt den Status des Zweigs. Die Tabelle zum Gesamtplan unten zeigt die Auswirkung dieser Wahl.",
|
||||
"firstDifference": "Erster Unterschied",
|
||||
"higher": "Höher ist besser",
|
||||
"lower": "Niedriger ist besser",
|
||||
|
||||
@@ -119,10 +119,16 @@
|
||||
"next": "Next placement",
|
||||
"last": "Last placement",
|
||||
"remaining": "Unused days in the final plan",
|
||||
"balanceRemaining": "remaining",
|
||||
"counterfactual": "Date alternatives",
|
||||
"counterfactualLoading": "Analyzing every date in the horizon…",
|
||||
"counterfactualReady": "Date alternatives are ready.",
|
||||
"counterfactualError": "Date alternatives could not be calculated.",
|
||||
"retryCounterfactual": "Retry date analysis",
|
||||
"historicalEligibilityLoading": "Checking which dates this leave could use…",
|
||||
"historicalEligibilityReady": "Original date eligibility is ready.",
|
||||
"historicalEligibilityError": "Original date eligibility could not be checked.",
|
||||
"retryHistoricalEligibility": "Retry date eligibility check",
|
||||
"eligible": "Eligible",
|
||||
"ineligible": "Ineligible",
|
||||
"historical": "Original search status",
|
||||
@@ -140,6 +146,7 @@
|
||||
"outsideHorizon": "Context date outside the planning horizon",
|
||||
"traceTitle": "Advanced: original decision trace",
|
||||
"traceLoading": "The plan is ready; its decision trace is still loading…",
|
||||
"traceReady": "The plan is ready and its decision trace has loaded.",
|
||||
"traceUnavailable": "No decision trace is available for this result.",
|
||||
"phases": "Trace phases",
|
||||
"firstPhase": "First phase",
|
||||
@@ -200,6 +207,7 @@
|
||||
"leaveUsed": "This date uses 1 day from {balance}.",
|
||||
"expires": "Use this balance by",
|
||||
"linkedRules": "Linked rules:",
|
||||
"atRiskContribution": "Protects leave at risk of expiry.",
|
||||
"impact": "What this day changes",
|
||||
"impactHelp": "Compare the whole plan with and without this day of leave. All other leave dates stay the same; only changed totals are shown.",
|
||||
"criterion": "Across your plan",
|
||||
@@ -218,6 +226,10 @@
|
||||
"withCandidate": "With this candidate",
|
||||
"comparisonUnavailable": "The comparison for the original date is unavailable, so the change cannot be shown.",
|
||||
"objectives": {
|
||||
"obligation-validity": {
|
||||
"label": "Unmet obligations",
|
||||
"help": "Number of required obligations left unsatisfied. A valid plan has zero."
|
||||
},
|
||||
"unplaced-at-risk": {
|
||||
"label": "Leave left at risk of expiry",
|
||||
"help": "Unused days expiring within the planning period. Fewer is better."
|
||||
@@ -282,6 +294,10 @@
|
||||
"expires": "Expires on",
|
||||
"criteria": "The planner’s priorities",
|
||||
"criteriaHelp": "Read from top to bottom: the first difference takes priority. Select a criterion to see how it is calculated.",
|
||||
"traceImpactTitle": "Full-plan effect of this branch",
|
||||
"traceImpactHelp": "These values compare the complete state before and after this branch. They show its impact; they do not explain why the planner chose it.",
|
||||
"traceStageTitle": "Actual stage comparison",
|
||||
"traceStageHelp": "These raw values were compared at this decision; the first difference explains the candidate’s status. The full-plan table below shows the effect after this choice.",
|
||||
"firstDifference": "First difference",
|
||||
"higher": "Higher is better",
|
||||
"lower": "Lower is better",
|
||||
|
||||
@@ -119,10 +119,16 @@
|
||||
"next": "Asignación siguiente",
|
||||
"last": "Última asignación",
|
||||
"remaining": "Días sin usar en el plan final",
|
||||
"balanceRemaining": "restantes",
|
||||
"counterfactual": "Fechas alternativas",
|
||||
"counterfactualLoading": "Analizando cada fecha del horizonte…",
|
||||
"counterfactualReady": "Las fechas alternativas están listas.",
|
||||
"counterfactualError": "No se pudieron calcular las fechas alternativas.",
|
||||
"retryCounterfactual": "Reintentar el análisis de fechas",
|
||||
"historicalEligibilityLoading": "Comprobando qué fechas podía usar este permiso…",
|
||||
"historicalEligibilityReady": "La elegibilidad histórica de las fechas está lista.",
|
||||
"historicalEligibilityError": "No se pudo comprobar la elegibilidad histórica de las fechas.",
|
||||
"retryHistoricalEligibility": "Reintentar la comprobación de elegibilidad",
|
||||
"eligible": "Válida",
|
||||
"ineligible": "No válida",
|
||||
"historical": "Estado de la búsqueda original",
|
||||
@@ -140,6 +146,7 @@
|
||||
"outsideHorizon": "Fecha de contexto fuera del horizonte de planificación",
|
||||
"traceTitle": "Avanzado: traza de decisiones original",
|
||||
"traceLoading": "El plan está listo; su traza de decisiones aún se está cargando…",
|
||||
"traceReady": "El plan está listo y se ha cargado su traza de decisiones.",
|
||||
"traceUnavailable": "No hay una traza de decisiones disponible para este resultado.",
|
||||
"phases": "Fases de la traza",
|
||||
"firstPhase": "Primera fase",
|
||||
@@ -200,6 +207,7 @@
|
||||
"leaveUsed": "Esta fecha usa 1 día del saldo «{balance}».",
|
||||
"expires": "Usa este saldo hasta el",
|
||||
"linkedRules": "Reglas vinculadas:",
|
||||
"atRiskContribution": "Protege permisos que podrían vencer.",
|
||||
"impact": "Qué cambia con este día",
|
||||
"impactHelp": "Compara todo el plan con y sin este día de permiso. Las demás fechas no cambian; solo se muestran los totales que varían.",
|
||||
"criterion": "En todo tu plan",
|
||||
@@ -218,6 +226,10 @@
|
||||
"withCandidate": "Con este candidato",
|
||||
"comparisonUnavailable": "La comparación de la fecha original no está disponible, por lo que no se puede mostrar el cambio.",
|
||||
"objectives": {
|
||||
"obligation-validity": {
|
||||
"label": "Obligaciones sin cumplir",
|
||||
"help": "Número de reglas obligatorias incumplidas. Un plan válido tiene cero."
|
||||
},
|
||||
"unplaced-at-risk": {
|
||||
"label": "Días sin usar que podrían vencer",
|
||||
"help": "Días sin planificar que vencen durante el período. Menos es mejor."
|
||||
@@ -282,6 +294,10 @@
|
||||
"expires": "Vence el",
|
||||
"criteria": "Las prioridades del cálculo",
|
||||
"criteriaHelp": "Lee de arriba abajo: la primera diferencia tiene prioridad. Selecciona un criterio para ver cómo se calcula.",
|
||||
"traceImpactTitle": "Efecto de esta rama en el plan completo",
|
||||
"traceImpactHelp": "Estos valores comparan el estado completo antes y después de esta rama. Muestran su efecto, no por qué el planificador la eligió.",
|
||||
"traceStageTitle": "Comparación real en esta etapa",
|
||||
"traceStageHelp": "Estos valores brutos se compararon en esta decisión; la primera diferencia explica el estado de la opción. La tabla del plan completo muestra el efecto de esta elección.",
|
||||
"firstDifference": "Primera diferencia",
|
||||
"higher": "Más es mejor",
|
||||
"lower": "Menos es mejor",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user