# Domain Slices Backlog

Stand: 2026-03-31

Dieses Backlog gruppiert die offenen Arbeiten nach fachlichen/domänischen Blöcken statt nach Dateien.
Die Schätzungen sind Restaufwand auf Basis des aktuellen Worktrees und können sich nach Befund leicht ändern.

Aktuell geschnittene Domänenslices: `7`
Grobe Gesamtdauer über alle noch offenen Slices: `25-41h`

## Statuslegende

- `in_progress`: wird aktiv bearbeitet
- `ready`: fachlich geschnitten, kann als nächster Block umgesetzt werden
- `blocked`: fachlich bekannt, aber aktuell von anderem Slice abhängig
- `done`: abgeschlossen und validiert

## Offene Slices

| #   | Slice                                                             | Status      | Restaufwand | Kernziel                                                                                                 |
| --- | ----------------------------------------------------------------- | ----------- | ----------: | -------------------------------------------------------------------------------------------------------- |
| 1   | Timeline Interaction, Overlays, Hover, SSE-State                  | in_progress |       6-10h | Stabile Timeline ohne Render-/Overlay-/Drag-Artefakte, auch bei View-Wechseln und Live-Updates           |
| 2   | Holiday/Vacation Correctness and Explainability                   | in_progress |        1-3h | Feiertage und Urlaube konsistent in Timeline, Chargeability, Forecasts, Assistant und UI-Erklärungen     |
| 3   | Assistant Parity, Policy Auto-Exposure, Advanced Queries          | in_progress |        5-8h | Assistant kennt und nutzt denselben Berechtigungs- und Datenraum wie der Nutzer, inkl. komplexer Queries |
| 4   | Reports, Templates/Blueprints, Export Completeness                | in_progress |        4-6h | Report Builder mit speicherbaren Vorlagen und vollständigen Exportgrößen wie SAH und Bezugsfaktoren      |
| 5   | Notifications, Tasks, Broadcasts, Reminder Reliability            | in_progress |        3-5h | Robuste Inbox-/Broadcast-/Reminder-Flows ohne leere Fanout- oder Persistenzkanten                        |
| 6   | Dashboard, Widgets, Explainability, First-Load Stability          | in_progress |        4-6h | Dashboard zuverlässig ladbar, Widgets kompakt, nachvollziehbar und per Detail-Toggle kontrollierbar      |
| 7   | DB Safety, Env Loading, Migration/Seed Discipline, Naming Cleanup | in_progress |        2-4h | Keine Raw-Prisma/Env-Fallen, kein versehentliches Seeding, keine operativen `planarchy`-Reste            |

## Umsetzungshinweise

- Slice 1 ist der größte technische Risikoblock und beeinflusst direkt wahrnehmbare UX.
- Slice 2 und 3 hängen fachlich teilweise zusammen, können nach Slice 1 parallelisiert werden.
- Slice 4 profitiert von Slice 2, weil Feiertags-/Urlaubslogik als Export- und Reportgröße sichtbar werden muss.
- Slice 7 bleibt als Guardrail-Block parallel im Hintergrund wichtig, sollte aber keine Produktarbeit blockieren.

## Arbeitsliste

1. Slice 1: Timeline Interaction, Overlays, Hover, SSE-State
2. Slice 2: Holiday/Vacation Correctness and Explainability
3. Slice 3: Assistant Parity, Policy Auto-Exposure, Advanced Queries
4. Slice 4: Reports, Templates/Blueprints, Export Completeness
5. Slice 5: Notifications, Tasks, Broadcasts, Reminder Reliability
6. Slice 6: Dashboard, Widgets, Explainability, First-Load Stability
7. Slice 7: DB Safety, Env Loading, Migration/Seed Discipline, Naming Cleanup

## Abhaklog

- [x] Assistant-Testlandschaft entlang echter Domänengrenzen weiter zerlegt und vollständig grün validiert
- [x] Staffing Read Pipeline Split: gemeinsame holiday-/absence-aware Capacity-Zusammenfassung aus `staffing-suggestions-read.ts` und `staffing-best-project-resource.ts` in `staffing-capacity-summary.ts` extrahiert und gegen fokussierte Staffing-/Assistant-Regressionen validiert
- [x] Vacation Read Separation: Holiday-/Deduction-Preview-Shaping aus `vacation-read.ts` in `vacation-read-support.ts` extrahiert und gegen Vacation-Auth-/Router-Regressionen validiert
- [ ] Slice 1: Timeline Interaction, Overlays, Hover, SSE-State
      Fortschritt:
      Live `cellWidthRef` statt stale Snapshot im Drag-Pfad verdrahtet.
      Projekt-Drag zentralisiert finalisiert, sodass MouseUp/Canvas-Up nicht mehr parallel mutieren.
      `document`-Listener für Projekt-Drag, Allocation-Drag und Multi-Select werden beim Unmount sauber entfernt.
      Timeline-Popovers schließen bei Scroll/Resize nicht mehr sofort, sondern bleiben stabil sichtbar.
      Query-Refresh wird pro aktivem Timeline-Kontext statt nur einmal pro Mount erzwungen.
      Session-Loading und SSE-Reconnect werden gehärtet, damit erste Route-Loads nicht in einem leeren Zwischenzustand hängen bleiben.
      Vacation-SSE und lokale Planning-Invalidierung laden jetzt auch `vacation.list` nach, damit Urlaubsbalken ohne Reload konsistent bleiben.
      Allocation-Handles und Move-Flächen stoppen jetzt `mousedown` sauber, damit Resource-/Project-Row-Canvases nicht parallel Range-Selektion starten.
- [ ] Slice 2: Holiday/Vacation Correctness and Explainability
      Fortschritt:
      Vacation-Deduction-Snapshots werden im UI bereits in `MyVacationsClient` erklärt.
      Dieselbe Ableitung wird jetzt auch im Vacation-Kalender per Hover-Tooltip genutzt.
      Holiday-Editor-Vorschau zeigt jetzt Scope-/Source-Zusammenfassung plus aufgeloeste Feiertage mit Scope.
      `entitlement.getBalanceDetail`, Assistant-Tool `get_vacation_balance` und `BalanceCard` nutzen jetzt denselben holiday-/deduction-aware Explainability-Pfad inkl. Vacation-Breakdown, Holiday-Basis und ausgeschlossenen Feiertagen.
      Fokussierte Validierung für Entitlement-/Assistant-Balance und Web-Typecheck ist grün; Alt-Snapshots respektieren weiter persistierte `deductedDays`, während fehlende Snapshots wieder korrekt auf kanonische Feiertagsauflösung zurückfallen.
      Entitlement-Jahresübersicht, Assistant-`get_entitlement_summary` und die Manager-Übersicht tragen jetzt auch `countryCode`, `countryName`, `federalState` und `metroCityName`, damit regionale Feiertagsunterschiede als Bezugsgröße sichtbar bleiben.
      Assistant-`run_report` liefert für `resource_month` jetzt zusätzlich einen Explainability-Block mit Holiday-/Absence-/Location-Basis, fehlenden empfohlenen Bezugsgrößen und Interpretationshinweisen zur SAH-Ableitung.
      Chargeability-Detailpfad und Assistant-`get_chargeability_report` tragen jetzt ebenfalls einen Explainability-Block mit Ortsbezug, Herleitungsfeldern, Formeln und aktiven Filtern, damit dieselbe SAH-/Holiday-/Absence-Logik auch im Forecast-Readmodel transparent ist.
      Chargeability-Frontend zeigt dieselbe Berechnungsbasis jetzt kompakt an; der Excel-Export enthält zusätzlich ein Explainability-Sheet mit Formeln, Filtern und Bezugsgrößen.
      Budget-Forecast-Readmodel, Dashboard-Detail und Assistant-`get_budget_forecast` tragen jetzt ebenfalls eine kompakte Burn-Herleitung mit Base-vs-Adjusted-Burn, Holiday-/Absence-Abzügen, Holiday-aware-vs-Fallback-Assignments und Anzahl der Kalenderkontexte; das Widget zeigt diese Herleitung nur im Detailmodus an.
      Project-Health-Readmodel, Dashboard-Detail und Assistant-`get_project_health` tragen jetzt ebenfalls eine explizite Budget-Herleitung mit Base-vs-Adjusted-Spend, Holiday-/Absence-Abzügen, Holiday-aware-vs-Fallback-Assignments und Kalenderkontexten; das Widget zeigt diese Basis nur im Detailmodus an.
      Nächster Fokus: verbleibende Forecast-/Widget-Parität derselben Ableitungen schließen.
- [ ] Slice 3: Assistant Parity, Policy Auto-Exposure, Advanced Queries
      Fortschritt:
      Tool-Sichtbarkeit und Laufzeit-Guarding auf gemeinsame Registry-/Access-Metadaten gezogen.
      Estimate-Tools tragen jetzt explizite Rollen-/Permission-/Cost-Metadaten statt impliziter Alt-Policy.
      Fokussierte Assistant-Policy-Regressionstests laufen gegen dieselbe zentrale Quelle.
      Tool-Selektion priorisiert Holiday-/Vacation-/Entitlement- sowie Dashboard-/Report-Anfragen jetzt gezielter, damit diese Tools unter dem OpenAI-128-Limit erhalten bleiben.
      Top-Level-Chat-/Approval-/Prompt-Orchestrierung ist jetzt in `assistant-procedure-support.ts` und `assistant-system-prompt.ts` extrahiert; API-Typecheck plus fokussierte Assistant-Suite laufen wieder grün.
      Produktive AI-Fallbacks, Admin-UI-Platzhalter und Settings-Default im Frontend zeigen jetzt konsistent `gpt-5.4` statt alter `gpt-4o-mini`-Defaults; die fokussierte Assistant-/Settings-/Insights-Suite dafür ist grün validiert.
- [ ] Slice 4: Reports, Templates/Blueprints, Export Completeness
      Fokus:
      Report-Templates/Blueprints, SAH-/Bezugsgrößen-Vollständigkeit und Export-Parität zur UI weiterziehen.
      Fortschritt:
      Report Builder exponiert Template-Beschreibung und Shared-Status jetzt auch im Frontend statt nur im Backend-Vertrag.
      Gespeicherter Template-Status vs. lokal geänderte Builder-Konfiguration wird jetzt explizit angezeigt, damit lokale Draft-Änderungen nicht mehr wie persistierte Vorlagen wirken.
      Duplicate-Template-Saves werden jetzt fachlich als `CONFLICT` mit verständlicher Meldung statt als roher DB-Fehler zurückgegeben.
      `resource_month`-Explainability ist jetzt im gemeinsamen Report-Pfad statt nur im Assistant-Sonderfall verdrahtet; der Builder zeigt dieselbe Holiday-/Absence-/SAH-Basis kompakt im Result-Header an.
      `resource_month`-Exporte laufen jetzt als XLSX mit separatem Explainability-Sheet, damit SAH-/Kalender-/Feiertagslogik im Export nachvollziehbar bleibt ohne Logik in Excel neu aufzubauen.
      Der `resource_month`-Blueprint-/Preset-Katalog kommt jetzt aus einem gemeinsamen Backend-Vertrag inklusive Runtime-Output-Schema statt aus lokalem Frontend-Hardcode; fokussierte Router-/Typecheck-Validierung dafür ist grün.
      `resource`, `project` und `assignment` tragen jetzt zusätzliche Bezugsgrößen wie Blueprint, Client Unit, Enterprise ID, Value Score, Shoring-/Onshore-Felder sowie Resource-/Project-Kontext an Assignments in den Report-Spaltenkatalog.
      Nächster Fokus: verbleibende Report-/Export-Vollständigkeit an echten Nutzerflows prüfen, insbesondere Frontend-/Export-Verhalten außerhalb von `resource_month`.
- [ ] Slice 5: Notifications, Tasks, Broadcasts, Reminder Reliability
      Fortschritt:
      Notification-/Reminder-/Webhook-Testtrio ist grün validiert.
      Zukünftige Scheduled Broadcasts mit Task-/Approval-Metadaten werden jetzt hart abgewiesen, damit `taskAction`/`dueDate` nicht still verloren gehen.
      Broadcast-Fanout mappt jetzt auch verlorene `sourceId`-/Sender-Referenzen stabil auf fachliche `NOT_FOUND`-Fehler statt rohe FK-Fehler.
      Nicht-terminale Task-Statuswechsel bereinigen jetzt `completedAt`/`completedBy` deterministisch, damit wiedergeöffnete Tasks fachlich und technisch konsistent bleiben.
      Wiederkehrende Reminder ziehen `nextRemindAt` nach Downtime jetzt direkt auf den ersten Termin nach `now` vor, damit überfällige Serien-Erinnerungen nicht auf jedem Scheduler-Tick erneut feuern.
      Task-Reassignment mappt fehlende `assigneeId`-Referenzen jetzt über den gemeinsamen Notification-Fehlerpfad stabil auf `NOT_FOUND`, statt rohe FK-Fehler aus dem Core-Router nach oben zu reichen.
      Immediate Broadcasts werden jetzt ohne `$transaction` hart abgewiesen, damit es keinen nicht-atomaren Fan-out-Fallback mit Teilpersistenz mehr gibt.
      Broadcast-Fanout gegen fehlende Empfänger ist jetzt ebenfalls fokussiert abgesichert: `userId`-FK-Verlust im Recipient-Create mappt stabil auf fachliches `NOT_FOUND`, ohne Broadcast-Finalisierung, SSE oder E-Mail-Nebenwirkungen.
      Direkte Router-Writes für `notification.create` und `notification.createTask` nutzen jetzt denselben kontextsensitiven Notification-Fehlerpfad wie Assistant/Broadcast, sodass fehlende Recipient-/Sender-Referenzen als fachliche `NOT_FOUND`-Fehler statt rohe Prisma-FKs herauskommen.
      `executeTaskAction` blockt jetzt auch `DISMISSED` als terminalen Zustand und läuft nur noch transaktional, damit Domain-Aktion und Task-Abschluss nicht mehr auseinanderlaufen; die Assistant-Test-Helpers spiegeln denselben Transaction-Contract jetzt ebenfalls.
      Reminder-Updates und -Deletes sind jetzt auch gegen Missing-/Wrong-Owner-Fälle fokussiert regressionsgesichert, damit die fachliche `NOT_FOUND`-Oberfläche stabil bleibt.
      `assignTask` fängt jetzt auch den Read-then-Update-Race auf gelöschte Tasks sauber als fachliches `NOT_FOUND` ab; Missing-Task- und Wrong-Category-Pfade sind auf Router-Ebene zusätzlich abgesichert.
      Nächster Fokus: verbleibende Persistenz-/Broadcast-Kanten schließen.
- [ ] Slice 6: Dashboard, Widgets, Explainability, First-Load Stability
      Fortschritt:
      Peak Times komprimiert die Summary-Leiste jetzt in drei kompakte Pills statt großer redundanter Karten.
      Zusatztexte und Erklärinfos bleiben dort jetzt konsequent hinter dem Details-Toggle.
      Budget Forecast reduziert Summary-Helfertexte und sekundäre Zeilendetails jetzt ebenfalls sauber bei `Details off`.
      Dashboard-Layout-Hydration überschreibt beim First Load lokale Nutzeraktionen nicht mehr, wenn DB-Layout und erste Interaktion race-condition-artig aufeinandertreffen; fokussierte Hook-/Widget-Tests dafür sind grün.
      Top-Value-Ressourcen tragen jetzt auch `countryName` durch Readmodel, API-Detailpfad und Widget-Lokationsanzeige, damit Kalender-/Feiertagsbezug nicht nur als Kürzel sichtbar ist.
      Top-Value trägt jetzt zusätzlich `valueScoreBreakdown` und `valueScoreUpdatedAt` bis in API-/Assistant-Detailpfade und Widget-Hover durch, damit die Score-Herleitung nachvollziehbar bleibt ohne den Default-View mit Text zu überladen.
      Peak Times trägt jetzt pro Periode `calendarContextCount` plus kompakte `calendarLocations` aus dem Application-Layer bis in Widget-Hover, Detailpanel und `get_dashboard_detail`, damit regionale Feiertags-/Standortbasis auch für Auslastungsspitzen sichtbar bleibt.
- [ ] Slice 7: DB Safety, Env Loading, Migration/Seed Discipline, Naming Cleanup
      Fortschritt:
      Repo-Wrapper für Env-Laden sind gesetzt; aktuelle Assistant-, Import/Export- und Insights-Tests sowie der Web-Typecheck laufen grün.
      Operative Altspuren `planarchy` kommen derzeit noch über einen Symlink-Pfad und einzelne Logs/Artefakte hinein und werden weiter bereinigt.
      `pnpm db:prisma -- ...` prüft jetzt für destruktive oder schemawirksame Prisma-Kommandos hart, dass `DATABASE_URL` wirklich auf `nexus` zeigt; falsche Ziele wie `planarchy` werden vor jedem Prisma-Zugriff blockiert.
      Aktive Worker:
      Worker A: Slice 5 Notification-/Broadcast-Persistenzkanten.
      Worker B: Slice 2 Holiday-/Vacation-Explainability in Forecast-/Widget-Parität.
      Lokal: Slice 1 Timeline-Stabilität, Slice 3 Assistant-Parity, Slice 7 DB-/Env-Guardrails und Naming-Cleanup.

## Validierter Stand

- Assistant-Regressionen: `8` fokussierte Testdateien, `36` Tests grün.
- Assistant-/Settings-/Insights-/AI-Defaults: `8` fokussierte Testdateien, `30` Tests grün.
- Web-Typecheck: `pnpm --filter @nexus/web exec tsc -p tsconfig.typecheck.json --noEmit` grün.
- Timeline/SSE-Regressionen: `pnpm --filter @nexus/api exec vitest run src/__tests__/timeline-router.test.ts src/__tests__/sse-subscription-policy.test.ts` grün (`15` Tests).
- Dashboard WidgetContainer: `pnpm --filter @nexus/web exec vitest run src/components/dashboard/WidgetContainer.test.tsx` grün (`2` Tests).
- Insights Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/insights-router.test.ts src/__tests__/insights-procedure-support.test.ts` grün (`9` Tests).
- Country Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/country-router.test.ts src/__tests__/country-procedure-support.test.ts src/__tests__/country-support.test.ts` grün (`12` Tests).
- Holiday Calendar Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/holiday-calendar-router.test.ts src/__tests__/holiday-calendar-router-auth.test.ts src/__tests__/holiday-calendar-procedure-support.test.ts src/__tests__/holiday-calendar-support.test.ts src/__tests__/holiday-calendar-write-support.test.ts` grün (`26` Tests).
- Dispo Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/dispo-router.test.ts src/__tests__/dispo-procedure-support.test.ts src/__tests__/dispo-management-support.test.ts` grün (`10` Tests).
- Org Unit + Import/Export Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/org-unit-router.test.ts src/__tests__/org-unit-procedure-support.test.ts src/__tests__/org-unit-support.test.ts src/__tests__/import-export-router.test.ts src/__tests__/import-export-procedure-support.test.ts` grün (`19` Tests).
- Estimate Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/estimate-router.test.ts` grün (`45` Tests).
- Import/Export Procedure Support: `pnpm --filter @nexus/api exec vitest run src/__tests__/import-export-procedure-support.test.ts` grün (`5` Tests).
- Assistant Tool Selection: `pnpm --filter @nexus/api exec vitest run src/__tests__/assistant-tool-selection.test.ts` grün (`3` Tests).
- Assistant Split Regression Runner: `pnpm --filter @nexus/api test:assistant-split` als explizite Fünf-Batch-Regression plus API-Typecheck etabliert; deckt jetzt auch `export_projects_csv`, Holiday-Resolution-Fehlerpfade und `get_timeline_holiday_overlays` ab.
- Assistant Report Read: `pnpm --filter @nexus/api exec vitest run src/__tests__/assistant-tools-report-read.test.ts` grün (`3` Tests).
- Report Router: `pnpm --filter @nexus/api exec vitest run src/__tests__/report-router.test.ts` grün (`8` Tests).
- Report Explainability/Export Parity: `pnpm --filter @nexus/api exec vitest run src/__tests__/report-router.test.ts src/__tests__/assistant-tools-report-read.test.ts` grün (`11` Tests), `pnpm --filter @nexus/web exec vitest run src/components/reports/reportBuilderExplainability.test.ts` grün (`2` Tests).
- Report Blueprint Catalog Contract: `pnpm --filter @nexus/api exec vitest run src/__tests__/report-router.test.ts` grün (`9` Tests), `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün, `pnpm --filter @nexus/web exec vitest run src/components/reports/reportBuilderExplainability.test.ts` grün (`2` Tests).
- Report Column Coverage Expansion: `pnpm --filter @nexus/api exec vitest run src/__tests__/report-router.test.ts` grün (`11` Tests), `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün.
- Chargeability Report Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/chargeability-report-router.test.ts src/__tests__/assistant-tools-chargeability-report.test.ts` grün (`7` Tests).
- Notification Router + Reminder Scheduler: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-router.test.ts src/__tests__/reminder-scheduler.test.ts` grün (`41` Tests).
- Project Health Explainability: `pnpm --filter @nexus/application exec vitest run src/__tests__/dashboard.test.ts -t "excludes regional public holidays from project health budget usage"` grün (`1` Test), `pnpm --filter @nexus/api exec vitest run src/__tests__/dashboard-router.test.ts -t "getProjectHealthDetail"` grün (`1` Test), `pnpm --filter @nexus/api exec vitest run src/__tests__/assistant-tools-dashboard-project-health.test.ts` grün (`1` Test).
- Dashboard Top Value Country Context: `pnpm --filter @nexus/api exec vitest run src/__tests__/dashboard-procedure-support.test.ts src/__tests__/dashboard-router.test.ts` grün (`19` Tests).
- Dashboard Top Value Explainability: `pnpm --filter @nexus/application exec vitest run src/__tests__/dashboard.test.ts -t "enforces visible-role filtering for top value resources"` grün (`1` Test), `pnpm --filter @nexus/api exec vitest run src/__tests__/dashboard-procedure-support.test.ts src/__tests__/dashboard-router.test.ts src/__tests__/assistant-tools-dashboard-detail.test.ts` grün (`20` Tests), `pnpm --filter @nexus/web exec vitest run src/components/dashboard/widgets/TopValueWidget.test.tsx` grün (`1` Test).
- Peak Times Calendar Explainability: `pnpm --filter @nexus/application exec vitest run src/__tests__/dashboard.test.ts -t "peak times"` grün (`4` Tests aktiv, `17` geskippt), `pnpm --filter @nexus/web exec vitest run src/components/dashboard/widgets/PeakTimesWidget.test.tsx` grün (`1` Test), `pnpm --filter @nexus/api exec vitest run src/__tests__/dashboard-procedure-support.test.ts src/__tests__/assistant-tools-dashboard-detail.test.ts` grün (`4` Tests).
- Notification Task Reopen Reliability: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-router.test.ts` grün (`37` Tests).
- Notification Task Assignment Reference Guard: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-procedure-support.test.ts src/__tests__/notification-router.test.ts` grün (`46` Tests).
- Notification Immediate Broadcast Transaction Guard: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-router.test.ts` grün (`40` Tests).
- Notification Broadcast Recipient Reference Guard: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-procedure-support.test.ts src/__tests__/notification-router.test.ts` grün (`49` Tests), `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün.
- Notification Direct Create/CreateTask Reference Guard: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-procedure-support.test.ts src/__tests__/notification-router.test.ts src/__tests__/assistant-tools-notification-create-errors.test.ts src/__tests__/assistant-tools-task-create-errors.test.ts` grün (`60` Tests), `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün.
- Notification Task Action Transaction Guard: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-router.test.ts src/__tests__/assistant-tools-task-action-guards.test.ts src/__tests__/assistant-tools-task-action-execution.test.ts src/__tests__/assistant-tools-task-action-assignment-errors.test.ts src/__tests__/assistant-tools-task-action-vacation-errors.test.ts` grün (`56` Tests), `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün.
- Notification Reminder Ownership + AssignTask Race Guard: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-router.test.ts` grün (`51` Tests), `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün.
- Notification Support + Assistant Router: `pnpm --filter @nexus/api exec vitest run src/__tests__/notification-procedure-support.test.ts src/__tests__/notification-router.test.ts src/__tests__/notification-router-auth.test.ts src/__tests__/assistant-router.test.ts src/__tests__/assistant-router-auth.test.ts src/__tests__/assistant-chat-loop.test.ts src/__tests__/assistant-chat-response.test.ts src/__tests__/assistant-tool-selection.test.ts src/__tests__/assistant-approvals.test.ts src/__tests__/assistant-procedure-support.test.ts` grün (`74` Tests).
- Assistant Broadcast Validation: `pnpm --filter @nexus/api exec vitest run src/__tests__/assistant-tools-broadcast-send-validation-errors.test.ts` grün (`3` Tests).
- Staffing Read Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/staffing-router.test.ts src/__tests__/assistant-tools-holiday-staffing-suggestions.test.ts src/__tests__/assistant-tools-advanced-resource-ranking.test.ts` grün (`32` Tests).
- Vacation Read Slice: `pnpm --filter @nexus/api exec vitest run src/__tests__/vacation-router.test.ts src/__tests__/vacation-router-auth.test.ts` grün (`58` Tests).
- API-Typecheck: `pnpm --filter @nexus/api exec tsc -p tsconfig.json --noEmit --pretty false` grün.

## API Router Slice Inventory

Diese Liste ist die vollständige Arbeitsinventur für den aktuellen Architektur-Track
`packages/api/src/router`.
Ziel ist nicht eine inhaltliche Neuschreibung, sondern dünne Top-Level-Router:
Zod/Input, Permission-Wiring und Orchestrierung wandern in gezielte `*-procedure-support.ts`
oder benachbarte Support-Module, Verhalten und öffentliche Contracts bleiben stabil.

### Status

- `done`: bereits sauber extrahiert oder als dünner Kompositionsrouter erreicht
- `ready_now`: sinnvoller nächster Slice ohne bekannte Blocker
- `later`: fachlich sinnvoll, aber größer oder stärker querliegend
- `monitor`: aktuell dünn genug; nur anfassen, wenn dort neue Logik wächst
- `excluded_for_now`: bewusst aus dem aktuellen Batch ausgenommen

### Vollständige Router-Liste

| Router                     | Status           | Priorität | Sinnvolle Slices                                                                                                                            |
| -------------------------- | ---------------- | --------: | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `allocation.ts`            | done             |         - | Aggregator bereits dünn; nur Support-Module weiter pflegen                                                                                  |
| `assistant.ts`             | done             |         - | top-level chat, approval payloads und system prompt in Support-Module extrahiert                                                            |
| `audit-log.ts`             | monitor          |         4 | Optional: list/detail reads und filter-building trennen, falls Auth/Wiring wächst                                                           |
| `blueprint.ts`             | done             |         - | summary/list reads, identifier reads, CRUD, role-preset mutation und global-field procedures in `blueprint-procedure-support.ts` extrahiert |
| `calculation-rules.ts`     | monitor          |         4 | Aktuell klein; nur bei zusätzlicher Write-/Audit-Logik extrahieren                                                                          |
| `chargeability-report.ts`  | excluded_for_now |         - | Bewusst zurückgestellt; erst nach Freigabe des geblockten Bereichs                                                                          |
| `client.ts`                | done             |         - | list/tree reads, identifier reads, CRUD/deactivate und sort-order batch mutation in `client-procedure-support.ts` extrahiert                |
| `comment.ts`               | done             |         - | Bereits in `comment-procedure-support.ts` ausgelagert                                                                                       |
| `computation-graph.ts`     | monitor          |         4 | Bereits Kompositionsrouter; nur bei zusätzlicher Orchestrierung weiter schneiden                                                            |
| `country.ts`               | done             |         - | list/identifier reads, country CRUD, metro-city CRUD                                                                                        |
| `dashboard.ts`             | excluded_for_now |         - | Bewusst zurückgestellt; hoher Querschnitt und paralleler Scope                                                                              |
| `dispo.ts`                 | done             |         - | workbook input schemas, staging/validation, staged-read procedures, resolve/commit/cancel mutations                                         |
| `effort-rule.ts`           | done             |         - | list/detail reads, CRUD/default toggle, preview und apply-rules mutation in `effort-rule-procedure-support.ts` extrahiert                   |
| `entitlement.ts`           | excluded_for_now |         - | Bewusst zurückgestellt; größerer Fachblock                                                                                                  |
| `estimate.ts`              | done             |         - | commercial reads, demand line writes, phasing, version workflow, aggregate read models                                                      |
| `experience-multiplier.ts` | done             |         - | list/detail reads, CRUD/default toggle, preview und apply-rules mutation in `experience-multiplier-procedure-support.ts` extrahiert         |
| `holiday-calendar.ts`      | done             |         - | calendar CRUD, entry CRUD; catalog/resolution reads sind schon separat                                                                      |
| `import-export.ts`         | done             |         - | export reads, import preview/validation, file-bound orchestration                                                                           |
| `insights.ts`              | done             |         - | anomaly/summary reads, cached narrative read, AI narrative mutation                                                                         |
| `management-level.ts`      | done             |         - | group reads/writes, level writes/delete und Audit-Orchestrierung in `management-level-procedure-support.ts` extrahiert                      |
| `notification.ts`          | later            |         3 | Top-Level ist tragbar; nächster sinnvoller Schritt ist die weitere Zerlegung von `notification-procedure-support.ts`                        |
| `org-unit.ts`              | done             |         - | list/tree reads, identifier reads, CRUD/deactivate                                                                                          |
| `project.ts`               | monitor          |         4 | Bereits stark komponiert; optional nur `list` und `getById` separat ziehen                                                                  |
| `rate-card.ts`             | done             |         - | list/detail/match reads, card CRUD, line CRUD und replace-lines in `rate-card-procedure-support.ts` extrahiert                              |
| `report.ts`                | done             |         - | Bereits in `report-template-procedure-support.ts` ausgelagert                                                                               |
| `resource.ts`              | monitor          |         4 | Top-Level dünn; tieferliegende Shared-Read-Module sind separat zu betrachten                                                                |
| `role.ts`                  | done             |         - | Bereits in `role-procedure-support.ts` ausgelagert                                                                                          |
| `scenario.ts`              | done             |         - | Bereits in `scenario-procedure-support.ts` ausgelagert                                                                                      |
| `settings.ts`              | done             |         - | Bereits in `settings-procedure-support.ts` ausgelagert                                                                                      |
| `staffing.ts`              | done             |         - | Aggregator bereits dünn                                                                                                                     |
| `system-role-config.ts`    | monitor          |         4 | Klein genug; nur bei wachsender Audit-/Validation-Logik schneiden                                                                           |
| `timeline.ts`              | done             |         - | Bereits auf dünnen Aggregator umgestellt                                                                                                    |
| `user.ts`                  | excluded_for_now |         - | Bewusst zurückgestellt; hoher Querschnitt und paralleler Scope                                                                              |
| `utilization-category.ts`  | monitor          |         4 | Klein genug; nur bei zusätzlicher Komplexität schneiden                                                                                     |
| `vacation.ts`              | done             |         - | Bereits auf dünnen Aggregator umgestellt                                                                                                    |
| `webhook.ts`               | monitor          |         4 | Noch tragbar; optional später read/write separation                                                                                         |

### Empfohlene Reihenfolge

1. Phase-2-Hotspots mit `Vacation Read Separation`
2. Phase-2-Hotspots mit `Staffing Read Pipeline Split`
3. `notification.ts` via weiterer Zerlegung von `notification-procedure-support.ts`
4. `entitlement.ts` nach Abschluss der Holiday-/Vacation-Parität
5. `dashboard.ts` nur bei erneutem Wachstum im API-Router
6. `user.ts` nur, falls dort wieder Top-Level-Orchestrierung anwächst

### Phase 2: Tieferliegende Hotspots Hinter Bereits Dünnen Routern

Diese Slices betreffen nicht mehr primär den Top-Level-Router, sondern große Read-/Procedure-Module
im selben Architektur-Track. Sie sind sinnvoll, sobald der aktuelle Router-Arbeitsvorrat abgearbeitet ist.

| Slice                              | Priorität | Betroffene Module                                                                                      | Ziel                                                                                                                                                              |
| ---------------------------------- | --------: | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Allocation Mutation Decomposition  |         1 | `allocation-assignment-procedures.ts`                                                                  | Assignment-Transaktionen, Audit, Events, Webhooks und Budget-Folgelogik weiter trennen                                                                            |
| Vacation Read Separation           |         1 | `vacation-read.ts`, `vacation-management-procedures.ts`                                                | Ownership, Anonymisierung, Holiday-Preview und Query-Varianten sauberer schneiden                                                                                 |
| Resource Shared Read Decomposition |         1 | `resource-read-shared.ts`, `resource-summary-read-procedure-support.ts`, `resource-identifier-read.ts` | Summary-/Detail-Selects, Identifier-Selects und Mapper aus `resource-read-shared.ts` in fokussierte Helper extrahieren; oeffentliche Read-Vertraege stabil halten |
| Estimate Write Router Slimming     |         1 | `estimate.ts` plus benachbarte Estimate-Module                                                         | Write-Orchestrierung, version workflow und error translation aus dem Router ziehen                                                                                |
| Staffing Read Pipeline Split       |         1 | `staffing-suggestions-read.ts`, `staffing-capacity-read.ts`, `staffing-best-project-resource.ts`       | gemeinsame Load-/Ranking-/Response-Pipeline extrahieren                                                                                                           |
| Report Engine by Execution Mode    |         2 | `report-query-engine.ts`, `report-query-config.ts`                                                     | generische Reports, `resource_month`-Sonderfall und Exportpfade klar trennen                                                                                      |
| Computation Graph Read Model Split |         2 | `computation-graph-resource.ts`, `computation-graph-project.ts`                                        | Snapshot-Building, Forecasting und Graph-Assembly entkoppeln                                                                                                      |

### Explizit Ausgeschlossen Im Aktuellen Batch

- `packages/api/src/router/assistant-tools.ts`
- `packages/api/src/router/assistant-tools/*`
- `packages/api/src/router/chargeability-report.ts`
- `packages/api/src/router/dashboard.ts`
- `packages/api/src/router/entitlement.ts`
- `packages/api/src/router/notification.ts`
- `packages/api/src/router/resource-summary-read.ts`
- `packages/api/src/router/user.ts`
- `packages/api/src/__tests__/timeline-router.test.ts`
- `packages/api/src/__tests__/vacation-router.test.ts`

### Bereits Erledigte Router-Slices In Dieser Serie

- `timeline`: read schemas, holiday/project/allocation/shift support extrahiert
- `vacation`: create procedures extrahiert
- `comment`: comment procedures extrahiert
- `scenario`: scenario procedures extrahiert
- `report`: report template procedures extrahiert
- `role`: role write procedures extrahiert
- `settings`: settings procedures extrahiert
- `rate-card`: rate-card procedures extrahiert
- `effort-rule`: effort-rule procedures extrahiert
- `experience-multiplier`: experience-multiplier procedures extrahiert
- `management-level`: management-level procedures extrahiert
- `blueprint`: blueprint procedures extrahiert
- `client`: client procedures extrahiert
- `country`: read-/write-procedures in `country-procedure-support.ts` validiert
- `holiday-calendar`: write-procedures in `holiday-calendar-procedure-support.ts` validiert
- `dispo`: staged import/read/write procedures in `dispo-procedure-support.ts` validiert
- `import-export`: file-bound orchestration in `import-export-procedure-support.ts` validiert
- `insights`: procedure support und nullable-settings-Haertung validiert
- `org-unit`: read-/write-procedures in `org-unit-procedure-support.ts` validiert
- `estimate`: write/orchestration, rate lookup und Fehlertranslation in `estimate-procedure-support.ts` validiert
- `assistant`: chat-/approval-/prompt orchestration in `assistant-procedure-support.ts` und `assistant-system-prompt.ts` validiert
