feat(planning): explain and trace planning decisions

This commit is contained in:
nessar committed 2026-08-31 00:02:45 +02:00
1 parent 609b3dece9
commit d7a13b0b1e
24 files changed
+6073 -342

No files matched your search

+98 -1
View File
@@ -104,7 +104,104 @@
"conflict": "Die Verpflichtungen können nicht gemeinsam erfüllt werden.",
"incomplete": "Die Berechnung wurde vor Abschluss aller Qualitätsstufen beendet.",
"error": "Bei der Planung ist ein unerwarteter Fehler aufgetreten.",
"complete": "Plan berechnet."
"complete": "Plan berechnet.",
"whyPlacement": "Warum diese Platzierung",
"placementNavigation": "Navigation der Platzierungserklärungen",
"placement": "Platzierung",
"placements": "Platzierungen",
"decision": "Entscheidung",
"of": "von",
"first": "Erste Platzierung",
"previous": "Vorherige Platzierung",
"next": "Nächste Platzierung",
"last": "Letzte Platzierung",
"balance": "Anspruch",
"rules": "Regeln",
"noRules": "Keine Regel",
"supporting": "Unterstützende Platzierung",
"yes": "Ja",
"no": "Nein",
"remaining": "Verbleibender Anspruch nach der Platzierung",
"timeOffPeriod": "Freizeitzeitraum",
"firstDecisive": "Erstes entscheidendes Ziel",
"contributions": "Beiträge",
"objectiveVector": "Vollständiger Zielvektor",
"finalMetrics": "Kennzahlen des endgültigen Plans",
"unplacedAtRisk": "Nicht platzierter gefährdeter Urlaub",
"holidayWeekValue": "Wert der Feiertagswochen",
"shortSequenceDeficit": "Defizit kurzer Arbeitsfolgen",
"supportingPlacements": "Unterstützende Platzierungen",
"preferenceSatisfaction": "Erfüllung der Präferenzen",
"removedRestoredComparison": "Platzierung entfernt und wiederhergestellt",
"fullComparison": "Vollständige Zielvektoren vorher und nachher",
"comparisonHelp": "Vergleich des endgültigen Plans ohne diese Platzierung und nach ihrer Wiederherstellung.",
"counterfactual": "Alternative Termine",
"hypothetical": "Nur hypothetisch: Der optimierte Plan bleibt unverändert. Wählen Sie ein Datum im Horizont aus.",
"counterfactualLoading": "Alle Daten im Horizont werden analysiert…",
"counterfactualReady": "Alternative Termine sind bereit.",
"counterfactualError": "Alternative Termine konnten nicht berechnet werden.",
"eligible": "Geeignet",
"ineligible": "Nicht geeignet",
"historical": "Status der ursprünglichen Suche",
"reason": "Grund",
"explanationError": "Die Erklärung konnte nicht erstellt werden.",
"conflictDetails": "Warum kein Plan die Verpflichtungen erfüllt",
"conflictingRules": "Konfligierende Regeln",
"bottleneck": "Engpass",
"incompleteDetails": "Vor dem Abbruch abgeschlossene Schritte",
"incumbentExplanation": "Dies erklärt den besten gültigen Zwischenstand; spätere Qualitätsstufen wurden nicht abgeschlossen.",
"completedStages": "Abgeschlossene Schritte",
"uncompletedStages": "Unterbrochene oder nicht gestartete Schritte",
"none": "Keine",
"currentPlacement": "Aktuell erklärte Platzierung",
"outsideHorizon": "Kontextdatum außerhalb des Planungshorizonts",
"traceTitle": "Erweitert: ursprüngliche Entscheidungsspur",
"traceLoading": "Der Plan ist fertig; seine Entscheidungsspur wird noch geladen…",
"traceUnavailable": "Für dieses Ergebnis ist keine Entscheidungsspur verfügbar.",
"phases": "Spurphasen",
"firstPhase": "Erste Phase",
"previousPhase": "Vorherige Phase",
"nextPhase": "Nächste Phase",
"lastPhase": "Letzte Phase",
"decisions": "Atomare Entscheidungen",
"firstDecision": "Erste Entscheidung",
"previousDecision": "Vorherige Entscheidung",
"nextDecision": "Nächste Entscheidung",
"lastDecision": "Letzte Entscheidung",
"replay": "Entscheidungszustand",
"before": "Vorher",
"after": "Nachher",
"finalPlan": "Endgültiger Plan",
"dates": "Daten",
"candidates": "Kandidaten",
"previousCandidates": "Vorherige Kandidatenseite",
"nextCandidates": "Nächste Kandidatenseite",
"page": "Seite",
"compareAlternatives": "Diesen Kandidaten im gesamten Horizont vergleichen",
"tieBreak": "Entscheidungskriterium",
"deltas": "Zustandsänderungen",
"activations": "erworbene Aktivierungen",
"noDecisions": "Diese Phase enthält keine atomare Entscheidung.",
"traceStatuses": {
"chosen": "Ausgewählt",
"evaluated-rejected": "Bewertet und abgelehnt",
"pruned": "Verworfen",
"not-examined": "Nicht untersucht",
"ineligible": "Nicht geeignet"
},
"tracePhaseStatuses": {
"completed": "Abgeschlossen",
"interrupted": "Unterbrochen",
"not-run": "Nicht ausgeführt"
},
"traceChanges": {
"added": "Durch diese Entscheidung hinzugefügt",
"moved-from": "Von diesem Datum verschoben",
"moved-to": "Auf dieses Datum verschoben",
"removed": "Durch diese Entscheidung entfernt",
"shared": "Durch diese Entscheidung geteilt",
"unchanged": "Durch diese Entscheidung unverändert"
}
},
"benchmark": {
"title": "Benchmark der Urlaubsplanung",
+98 -1
View File
@@ -104,7 +104,104 @@
"conflict": "The obligations cannot be satisfied together.",
"incomplete": "Calculation stopped before all quality stages completed.",
"error": "The planner encountered an unexpected error.",
"complete": "Plan calculated."
"complete": "Plan calculated.",
"whyPlacement": "Why this placement",
"placementNavigation": "Placement explanation navigation",
"placement": "Placement",
"placements": "placements",
"decision": "Decision",
"of": "of",
"first": "First placement",
"previous": "Previous placement",
"next": "Next placement",
"last": "Last placement",
"balance": "Entitlement",
"rules": "Rules",
"noRules": "No rule",
"supporting": "Supporting placement",
"yes": "Yes",
"no": "No",
"remaining": "Remaining entitlement after placement",
"timeOffPeriod": "Time-off period",
"firstDecisive": "First decisive objective",
"contributions": "Contributions",
"objectiveVector": "Full objective vector",
"finalMetrics": "Final plan metrics",
"unplacedAtRisk": "Unplaced at-risk leave",
"holidayWeekValue": "Public-holiday week value",
"shortSequenceDeficit": "Short work-sequence deficit",
"supportingPlacements": "Supporting placements",
"preferenceSatisfaction": "Preference satisfaction",
"removedRestoredComparison": "Placement removed and restored",
"fullComparison": "Full before-and-after objective vectors",
"comparisonHelp": "This compares the final plan without this placement with the final plan after restoring it.",
"counterfactual": "Date alternatives",
"hypothetical": "Hypothetical only: the optimized plan is unchanged. Select any date in the horizon to inspect it.",
"counterfactualLoading": "Analyzing every date in the horizon…",
"counterfactualReady": "Date alternatives are ready.",
"counterfactualError": "Date alternatives could not be calculated.",
"eligible": "Eligible",
"ineligible": "Ineligible",
"historical": "Original search status",
"reason": "Reason",
"explanationError": "The explanation could not be produced.",
"conflictDetails": "Why no plan can satisfy the obligations",
"conflictingRules": "Conflicting rules",
"bottleneck": "Bottleneck",
"incompleteDetails": "What completed before calculation stopped",
"incumbentExplanation": "This explains the best valid incumbent; later quality stages did not complete.",
"completedStages": "Completed stages",
"uncompletedStages": "Interrupted or unstarted stages",
"none": "None",
"currentPlacement": "Current explained placement",
"outsideHorizon": "Context date outside the planning horizon",
"traceTitle": "Advanced: original decision trace",
"traceLoading": "The plan is ready; its decision trace is still loading…",
"traceUnavailable": "No decision trace is available for this result.",
"phases": "Trace phases",
"firstPhase": "First phase",
"previousPhase": "Previous phase",
"nextPhase": "Next phase",
"lastPhase": "Last phase",
"decisions": "Atomic decisions",
"firstDecision": "First decision",
"previousDecision": "Previous decision",
"nextDecision": "Next decision",
"lastDecision": "Last decision",
"replay": "Decision state",
"before": "Before",
"after": "After",
"finalPlan": "Final plan",
"dates": "Dates",
"candidates": "Candidates",
"previousCandidates": "Previous candidate page",
"nextCandidates": "Next candidate page",
"page": "Page",
"compareAlternatives": "Compare this candidate across the horizon",
"tieBreak": "Tie-break",
"deltas": "State changes",
"activations": "earned activations",
"noDecisions": "This phase recorded no atomic decision.",
"traceStatuses": {
"chosen": "Chosen",
"evaluated-rejected": "Evaluated and rejected",
"pruned": "Pruned",
"not-examined": "Not examined",
"ineligible": "Ineligible"
},
"tracePhaseStatuses": {
"completed": "Completed",
"interrupted": "Interrupted",
"not-run": "Not run"
},
"traceChanges": {
"added": "Added by this decision",
"moved-from": "Moved from this date",
"moved-to": "Moved to this date",
"removed": "Removed by this decision",
"shared": "Shared by this decision",
"unchanged": "Unchanged by this decision"
}
},
"benchmark": {
"title": "Leave planner benchmark",
+98 -1
View File
@@ -104,7 +104,104 @@
"conflict": "Las obligaciones no se pueden satisfacer juntas.",
"incomplete": "El cálculo se detuvo antes de completar todas las etapas de calidad.",
"error": "El planificador encontró un error inesperado.",
"complete": "Plan calculado."
"complete": "Plan calculado.",
"whyPlacement": "Por qué esta asignación",
"placementNavigation": "Navegación por las explicaciones de las asignaciones",
"placement": "Asignación",
"placements": "asignaciones",
"decision": "Decisión",
"of": "de",
"first": "Primera asignación",
"previous": "Asignación anterior",
"next": "Asignación siguiente",
"last": "Última asignación",
"balance": "Derecho",
"rules": "Reglas",
"noRules": "Sin regla",
"supporting": "Asignación de apoyo",
"yes": "Sí",
"no": "No",
"remaining": "Derecho restante tras la asignación",
"timeOffPeriod": "Período de descanso",
"firstDecisive": "Primer objetivo decisivo",
"contributions": "Contribuciones",
"objectiveVector": "Vector completo de objetivos",
"finalMetrics": "Métricas del plan final",
"unplacedAtRisk": "Vacaciones en riesgo sin asignar",
"holidayWeekValue": "Valor de semanas con festivos",
"shortSequenceDeficit": "Déficit de secuencias cortas de trabajo",
"supportingPlacements": "Asignaciones de apoyo",
"preferenceSatisfaction": "Satisfacción de preferencias",
"removedRestoredComparison": "Asignación eliminada y restaurada",
"fullComparison": "Vectores de objetivos completos antes y después",
"comparisonHelp": "Compara el plan final sin esta asignación y después de restaurarla.",
"counterfactual": "Fechas alternativas",
"hypothetical": "Solo hipotético: el plan optimizado no cambia. Selecciona una fecha del horizonte para inspeccionarla.",
"counterfactualLoading": "Analizando cada fecha del horizonte…",
"counterfactualReady": "Las fechas alternativas están listas.",
"counterfactualError": "No se pudieron calcular las fechas alternativas.",
"eligible": "Válida",
"ineligible": "No válida",
"historical": "Estado de la búsqueda original",
"reason": "Motivo",
"explanationError": "No se pudo generar la explicación.",
"conflictDetails": "Por qué ningún plan satisface las obligaciones",
"conflictingRules": "Reglas en conflicto",
"bottleneck": "Cuello de botella",
"incompleteDetails": "Lo completado antes de detener el cálculo",
"incumbentExplanation": "Esto explica el mejor plan válido encontrado; las etapas de calidad posteriores no se completaron.",
"completedStages": "Etapas completadas",
"uncompletedStages": "Etapas interrumpidas o no iniciadas",
"none": "Ninguno",
"currentPlacement": "Asignación explicada actualmente",
"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…",
"traceUnavailable": "No hay una traza de decisiones disponible para este resultado.",
"phases": "Fases de la traza",
"firstPhase": "Primera fase",
"previousPhase": "Fase anterior",
"nextPhase": "Fase siguiente",
"lastPhase": "Última fase",
"decisions": "Decisiones atómicas",
"firstDecision": "Primera decisión",
"previousDecision": "Decisión anterior",
"nextDecision": "Decisión siguiente",
"lastDecision": "Última decisión",
"replay": "Estado de la decisión",
"before": "Antes",
"after": "Después",
"finalPlan": "Plan final",
"dates": "Fechas",
"candidates": "Candidatos",
"previousCandidates": "Página de candidatos anterior",
"nextCandidates": "Página de candidatos siguiente",
"page": "Página",
"compareAlternatives": "Comparar este candidato en todo el horizonte",
"tieBreak": "Desempate",
"deltas": "Cambios de estado",
"activations": "activaciones obtenidas",
"noDecisions": "Esta fase no registró ninguna decisión atómica.",
"traceStatuses": {
"chosen": "Elegido",
"evaluated-rejected": "Evaluado y rechazado",
"pruned": "Podado",
"not-examined": "No examinado",
"ineligible": "No válido"
},
"tracePhaseStatuses": {
"completed": "Completada",
"interrupted": "Interrumpida",
"not-run": "No ejecutada"
},
"traceChanges": {
"added": "Añadido por esta decisión",
"moved-from": "Movido desde esta fecha",
"moved-to": "Movido a esta fecha",
"removed": "Eliminado por esta decisión",
"shared": "Compartido por esta decisión",
"unchanged": "Sin cambios por esta decisión"
}
},
"benchmark": {
"title": "Prueba del planificador de vacaciones",
+98 -1
View File
@@ -104,7 +104,104 @@
"conflict": "Les obligations ne peuvent pas être satisfaites ensemble.",
"incomplete": "Le calcul s’est arrêté avant la fin des critères de qualité.",
"error": "Le planificateur a rencontré une erreur inattendue.",
"complete": "Plan calculé."
"complete": "Plan calculé.",
"whyPlacement": "Pourquoi ce placement",
"placementNavigation": "Navigation entre les explications des placements",
"placement": "Placement",
"placements": "placements",
"decision": "Décision",
"of": "sur",
"first": "Premier placement",
"previous": "Placement précédent",
"next": "Placement suivant",
"last": "Dernier placement",
"balance": "Droit",
"rules": "Règles",
"noRules": "Aucune règle",
"supporting": "Placement de soutien",
"yes": "Oui",
"no": "Non",
"remaining": "Droit restant après placement",
"timeOffPeriod": "Période de repos",
"firstDecisive": "Premier objectif décisif",
"contributions": "Contributions",
"objectiveVector": "Vecteur d’objectifs complet",
"finalMetrics": "Métriques du plan final",
"unplacedAtRisk": "Congés à risque non placés",
"holidayWeekValue": "Valeur des semaines fériées",
"shortSequenceDeficit": "Déficit des courtes séquences travaillées",
"supportingPlacements": "Placements de soutien",
"preferenceSatisfaction": "Satisfaction des préférences",
"removedRestoredComparison": "Placement retiré puis rétabli",
"fullComparison": "Vecteurs d’objectifs complets avant et après",
"comparisonHelp": "Comparaison du plan final sans ce placement puis après son rétablissement.",
"counterfactual": "Dates alternatives",
"hypothetical": "Hypothèse uniquement : le plan optimisé ne change pas. Sélectionnez une date de l’horizon pour l’inspecter.",
"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.",
"eligible": "Éligible",
"ineligible": "Inéligible",
"historical": "Statut de la recherche originale",
"reason": "Raison",
"explanationError": "L’explication n’a pas pu être produite.",
"conflictDetails": "Pourquoi aucun plan ne satisfait les obligations",
"conflictingRules": "Règles en conflit",
"bottleneck": "Goulot d’étranglement",
"incompleteDetails": "Étapes terminées avant l’arrêt du calcul",
"incumbentExplanation": "Cette explication concerne le meilleur plan valide trouvé ; les étapes de qualité suivantes ne sont pas terminées.",
"completedStages": "Étapes terminées",
"uncompletedStages": "Étapes interrompues ou non démarrées",
"none": "Aucun",
"currentPlacement": "Placement expliqué actuellement",
"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…",
"traceUnavailable": "Aucune trace de décision n’est disponible pour ce résultat.",
"phases": "Phases de la trace",
"firstPhase": "Première phase",
"previousPhase": "Phase précédente",
"nextPhase": "Phase suivante",
"lastPhase": "Dernière phase",
"decisions": "Décisions atomiques",
"firstDecision": "Première décision",
"previousDecision": "Décision précédente",
"nextDecision": "Décision suivante",
"lastDecision": "Dernière décision",
"replay": "État de la décision",
"before": "Avant",
"after": "Après",
"finalPlan": "Plan final",
"dates": "Dates",
"candidates": "Candidats",
"previousCandidates": "Page de candidats précédente",
"nextCandidates": "Page de candidats suivante",
"page": "Page",
"compareAlternatives": "Comparer ce candidat sur tout l’horizon",
"tieBreak": "Critère de départage",
"deltas": "Changements d’état",
"activations": "activations acquises",
"noDecisions": "Cette phase n’a enregistré aucune décision atomique.",
"traceStatuses": {
"chosen": "Choisi",
"evaluated-rejected": "Évalué et rejeté",
"pruned": "Élagué",
"not-examined": "Non examiné",
"ineligible": "Inéligible"
},
"tracePhaseStatuses": {
"completed": "Terminée",
"interrupted": "Interrompue",
"not-run": "Non exécutée"
},
"traceChanges": {
"added": "Ajouté par cette décision",
"moved-from": "Déplacé depuis cette date",
"moved-to": "Déplacé vers cette date",
"removed": "Retiré par cette décision",
"shared": "Partagé par cette décision",
"unchanged": "Inchangé par cette décision"
}
},
"benchmark": {
"title": "Benchmark du planificateur de congés",