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": "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",