- Old code archived on archive/legacy-v0 and feat/T1-auth - Main contains only requirements and analysis docs - UI Prototype: https://webspace.media-on.de/leocrm-prototype-x7k2p9/ - Ready for Phase 2: Architecture design
28 KiB
Requirements Review: requirements.md
Datum: 2026-06-28
Reviewer: Requirements Analyst (automatisiert)
Datei: /a0/usr/workdir/dev-projects/leocrm/requirements.md
Zeilen: 2131
Feature-IDs: ~141 aktive + 16 archivierte = ~157 total
Status der Datei: Finalisiert — ready_for_ui (laut Header)
Section 1: Konsistenz-Issues
1.1 Plugin-System vs. Core-Feature Widerspruch (CRITICAL)
Der zentrale Widerspruch der Datei.
F-PLUGIN-01 (Zeile 848-851) deklariert:
„Die Module sollen als Plugins realisiert sein, sodass das CRM später durch Plugins erweitert werden kann. Module (Mail, Kalender, Dateien, Tags) sind Plugins."
F-PLUGIN-02 (Zeile 857-860) definiert Plugin-Schnittstelle, Lifecycle-Hooks, Plugin-Manifest.
Gleichzeitig werden genau diese Module als detaillierte Core-Features mit konkreten HTTP-Endpunkten, DB-Schemas und Test-Szenarien spezifiziert:
- F-DMS-01 bis F-DMS-07 (Zeilen 991-1083): DMS mit
POST /api/dms/folders,PATCH /api/dms/files/{id}, etc. - F-CAL-01 bis F-CAL-18 (Zeilen 1397-1662): Kalender mit
POST /api/calendar/entries,GET /api/calendar/kanban, etc. - F-MAIL-01 bis F-MAIL-19 (Zeilen 1668-1951): Mail mit
POST /api/mail/send, IMAP IDLE, SMTP, PGP, etc. - F-TAG-01 bis F-TAG-04 (Zeilen 1173-1223): Tags mit
POST /api/tags/assign, etc.
Widerspruch: Wenn Module Plugins sind, dann gehören ihre detaillierten Feature-Spezifikationen (Endpunkte, DB-Schemas, Test-Szenarien) NICHT in die Core-Requirements. Der Core definiert die Plugin-Schnittstelle; das Plugin definiert seine eigenen Features. So wie es jetzt ist, wird das Plugin-System deklariert, aber dann werden die „Plugin-Module" im Core-Requirements-Dokument detailliert spezifiziert — als wären sie Core-Features.
F-CORE-01 bis F-CORE-13 (Zeilen 864-953) definieren Core-Infrastruktur (Event Bus, Tenant-Isolation, Plugin-Migration, Service Container, API-First, Async Queue, Caching, Storage, Import/Export, PDF-Gen, Notification Service). Diese sind allesamt Architekturentscheidungen, keine Requirements.
Fazit: Die Datei versucht gleichzeitig zu sagen „ diese Module sind Plugins" UND „ diese Module sind Core-Features mit konkreten Implementierungsdetails". Das ist ein architektonischer Widerspruch, der in der Architektur-Phase aufgelöst werden muss — nicht in den Requirements.
1.2 Multi-Tenant (F-AUTH-07) vs. ältere Requirements ohne Tenant-Kontext (WARNING)
F-AUTH-07 (Zeile 135-138) deklariert Multi-Tenant als v1-Feature:
„Das System ist Multi-Tenant-fähig. Mehrere Firmen (Tenants) können im System verwaltet werden. Daten sind pro Tenant isoliert."
F-CORE-02 (Zeile 871-874) spezifiziert tenant_id auf allen Tabellen, ORM-Middleware für automatisches Query-Scoping.
Annahme 1 (Zeile 1978): „v1 ist Multi-Tenant (Multi-Company) — mehrere Firmen (Tenants) im System."
Aber: Die früher geschriebenen Requirements (F-AUTH-01 bis F-CONT-07, Zeilen 57-410) erwähnen Tenant-Kontext an keiner Stelle:
- F-AUTH-01 (Login): kein Tenant-Bezug
- F-AUTH-03 (User-Verwaltung): kein Tenant-Bezug — aber in Multi-Tenant muss ein User einem Tenant zugeordnet sein
- F-COMP-01 (Firma anlegen): kein
tenant_idin Feld-Tabelle (Zeile 156-186) - F-CONT-01 (Kontakt anlegen): kein
tenant_idin Feld-Tabelle (Zeile 300-333) - F-COMP-05 (Pagination): kein Tenant-Filter erwähnt
- F-COMP-06 (Suche): kein Tenant-Scoping erwähnt
Fazit: Multi-Tenant wurde später hinzugefügt und die frühen Requirements wurden nicht nachträglich aktualisiert. Das führt zu einer Lücke: Wie verhält sich F-COMP-01 (Firma anlegen) in Multi-Tenant-Kontext? Wird die Firma automatisch dem aktiven Tenant zugeordnet? Kann ein User Firmen in mehreren Tenants anlegen? Diese Fragen sind in den Requirements nicht beantwortet.
1.3 KI-Copilot (F-AI-01) mit voller API-Kontrolle vs. ältere UI-only-Flow-Requirements (WARNING)
F-AI-01 (Zeile 798-806) deklariert:
„Der Copilot hat Zugriff auf die volle API und soll alles steuern können — Daten abfragen, erstellen, bearbeiten, löschen, Aktionen auslösen, Workflows triggern."
F-CORE-06 (Zeile 899-902) deklariert API-First:
„Alle Core-Features und Plugin-Features sind primär über die API nutzbar. Die UI ist ein API-Client."
Aber: Mehrere Requirements beschreiben nur UI-Flows ohne API-Bezug:
- F-UI-01 (Responsive Design, Zeile 495-503): nur CSS-Breakpoints, kein API-Bezug
- F-UI-02 (i18n, Zeile 509-517): nur Frontend-Library, kein API-Bezug
- F-UI-03 (Toast-Notifications, Zeile 523-531): nur Frontend-Komponente
- F-UI-04 (Loading-States, Zeile 537-545): nur Frontend-State
- F-UI-05 (Empty-States, Zeile 551-559): nur Frontend-Komponente
- F-UI-06 (Confirmation-Dialogs, Zeile 565-573): nur Frontend-Modal
- F-UI-08 (Datenansichten, Zeile 579-582): nur Frontend-Toggle
Einschränkung: Diese UI-Requirements sind legitimerweise UI-only — sie beschreiben Präsentationslogik, keine Datenoperationen. F-CORE-06 sollte explizit ausschließen, dass reine UI-Präsentations-Features keine API-Entpunkte benötigen. Aktuell ist die Formulierung „alle Features über API nutzbar" zu breit und suggeriert, dass auch Toast-Notifications einen API-Endpunkt haben müssten.
Zusätzlicher Befund: F-AI-01 und F-CORE-06 wurden retroaktiv hinzugefügt. Die ursprünglichen Requirements (v0.1, archiviert in Appendix A, Zeile 2089-2128) beschreiben Jinja2-Templates und SQLite — eine völlig andere Architektur. Die Datei hat also mindestens drei Evolutionsschichten:
- v0.1: Single-Tenant, Jinja2, SQLite (archiviert)
- v0.3: React SPA, PostgreSQL, RBAC (Hauptteil)
- v0.5+: Multi-Tenant, Plugin-System, API-First, KI-Copilot, Mail/Kalender/DMS (hinzugefügt)
Die Schichten wurden nicht vollständig integriert — Rückbezüge fehlen.
1.4 Auth-Mechanismus-Unschärfe (WARNING)
F-AUTH-01 (Zeile 58): „Session-basierte Auth mit HttpOnly+Secure+SameSite=Strict Cookie"
F-AUTH-02 (Zeile 72-78): Test-Szenario sagt „Token wird entfernt" und Akzeptanzkriterium sagt „Server-Token-Blacklist optional für v1" — das suggeriert Token-basierte Auth (JWT?), nicht Session-basierte Auth.
F-INT-02 (Zeile 714-722): „API-Endpunkte sind via Session-Cookie authentifiziert" aber erwähnt auch „Optional: API-Key für externe Integrationen".
F-SEC-03 (Zeile 616-624): „Session läuft nach 8h ab" — aber „Token gültig <8h" und „Token nach 8h → API gibt 401" — wieder Token-Sprache.
Fazit: Die Datei wechselt inkonsistent zwischen „Session" und „Token". Entweder es ist Session-basiert (Cookie + Server-Side Session Store) oder Token-basiert (JWT Stateless). Das muss entschieden und einheitlich formuliert werden.
Section 2: Requirements vs. Bauanleitung Assessment
2.1 Enthaltene Implementierungsdetails
Die Datei enthält massiv Implementierungsdetails, die in eine Requirements-Spec nicht gehören:
HTTP-Endpunkte (Architektur, nicht Requirement)
Jedes einzelne Akzeptanzkriterium spezifiziert konkrete HTTP-Endpunkte mit Pfaden, HTTP-Methoden, Query-Parametern und Response-Codes:
POST /api/auth/login(Zeile 65)GET /api/companies/{id}(Zeile 207)DELETE /api/companies/{id}?cascade=true|false(Zeile 235)GET /api/contacts?page=1&page_size=25&sort_by=last_name&sort_order=asc(Zeile 396)POST /api/dms/files/upload(Zeile 1013)GET /api/dms/files/{id}/preview(Zeile 1041)POST /api/calendar/entries(Zeile 1439)GET /api/calendar/kanban?period=this_week(Zeile 1419)POST /api/mail/send(Zeile 1693)GET /api/mail/search?q=angebot&folder=inbox(Zeile 1709)- ...und dutzende weitere
Problem: Der Endpunkt-Pfad ist eine Architekturentscheidung. Ein Requirement sagt „User kann sich einloggen" — der Pfad /api/auth/login ist Implementierung.
DB-Schema-Definitionen (Architektur, nicht Requirement)
- F-COMP-01 (Zeilen 156-186): Vollständige Feld-Tabelle mit Typen:
String(100),Integer,Decimal,Picklist,FK→Company,Text(32000), etc. — das ist ein DB-Schema - F-CONT-01 (Zeilen 300-333): Vollständige Feld-Tabelle für Kontakte mit Typen
- F-COMP-07 (Zeile 277):
audit_logTabellenname - F-COMP-08 (Zeile 291):
deletion_logTabellenname - F-CONT-07 (Zeile 424):
company_contactsN:M-Tabellenname - F-CORE-02 (Zeile 872):
tenant_idFeld auf allen Tabellen - F-MAIL-03 (Zeile 1709):
tsvector-Index,mail_body_tsv,mail_subject_tsv - F-CAL-12 (Zeile 1572):
user_calendar_visibilityTabellenname - F-CAL-15 (Zeile 1614):
assigned_to: user_idFeldname
Problem: Feldnamen, -typen und Tabellennamen sind Implementierungsdetails, die in das DB-Schema der Architektur gehören.
Technologie-Entscheidungen (Architektur, nicht Requirement)
- F-CORE-07 (Zeile 907): „Celery + Redis oder RQ + Redis" — Technologie-Wahl
- F-CORE-08 (Zeile 914): „Redis als Cache-Backend" — Technologie-Wahl
- F-CORE-10 (Zeile 928): „S3-kompatibles Storage (z.B. MinIO)" — Technologie-Wahl
- F-MAIL-02 (Zeile 1693): „DOMPurify" — Library-Wahl
- F-MAIL-12 (Zeile 1846): „python-gnupg" — Library-Wahl
- F-UI-02 (Zeile 517): „react-i18next" — Library-Wahl
- F-DMS-04 (Zeile 1034): „PDF.js" — Library-Wahl
- F-DATA-03 (Zeile 459): „Pydantic-Schemas" — Library-Wahl
- F-INFRA-03 (Zeile 666): „Python logging mit JSON-Formatter" — Library-Wahl
Protokoll-Details (Architektur, nicht Requirement)
- F-MAIL-01 (Zeile 1670): „IMAP4rev1 (RFC 3501)", „IMAP IDLE (RFC 2177)"
- F-MAIL-02 (Zeile 1693): „multipart/mixed", „SMTP-Versand"
- F-MAIL-05 (Zeile 1733): „References- und In-Reply-To-Header (RFC 5322)"
- F-MAIL-18 (Zeile 1929): „AES-256, Key via Env-Var"
- F-CAL-08 (Zeile 1516): „RRULE (RFC 5545)"
- F-CAL-09 (Zeile 1530): „RFC 5545 konform"
- F-MAIL-18 (Zeile 1929): „IMAP MOVE (RFC 6851)"
Frontend-Komponenten-Namen (Architektur, nicht Requirement)
- F-CAL-01 (Zeile 1405):
CalendarViewKomponente - F-CAL-02 (Zeile 1419):
KanbanCalendarKomponente - F-FILEUI-01 (Zeile 1321):
FileBrowser,SidebarTree,MainViewKomponenten - F-FILEUI-02 (Zeile 1335):
BreadcrumbKomponente - F-FILEUI-03 (Zeile 1349):
ContextMenuKomponente - F-FILEUI-04 (Zeile 1363): Multi-Select-State in
FileBrowser - F-MAIL-05 (Zeile 1741):
ThreadViewKomponente
Farbcodes und UI-Implementierung (Architektur, nicht Requirement)
- F-CAL-06 (Zeile 1485):
{appointment+normal: "#3B82F6", task+normal: "#F59E0B", *+follow_up: "#F97316", *+private: "#9CA3AF"}— konkrete Hex-Codes - F-COMP-04 (Zeile 235):
deleted_at = NOW— SQL-Ausdruck - F-FILEUI-02 (Zeile 1335): „Materialized Path oder rekursive Abfrage" — DB-Pattern
- F-FILEUI-06 (Zeile 1391): „HTML5 Drag & Drop API" — Browser-API
- F-FILEUI-05 (Zeile 1377): „XMLHttpRequest (für Progress-Events) oder WebSocket" — Technologie
Algorithmus- und Logik-Details (Architektur, nicht Requirement)
- F-MAIL-07 (Zeilen 1762-1771): Regelauswertungs-Reihenfolge, Background-Worker-Trigger
- F-MAIL-08 (Zeile 1786):
vacation_sent_log, No-Reply-Erkennung: „noreply", „no-reply", „donotreply" - F-CAL-08 (Zeile 1516): Recurrence-Instanz-Generierung, Exception-Handling
- F-CAL-15 (Zeile 1614): Notification-Versand bei Zuweisung
2.2 Schätzung des Anteils
| Kategorie | Zeilen (geschätzt) | Anteil |
|---|---|---|
| Genuine Requirements (das WAS) | ~700-750 | ~35% |
| — Projektbeschreibung, Domain Knowledge | ~25 | |
| — Feature-Anforderung-Texte („User kann...") | ~250 | |
| — Test-Szenarien (Verhalten, nicht Implementation) | ~300 | |
| — Non-funktionale Anforderungen | ~20 | |
| — Annahmen, Non-Goals, Checkliste, Open Questions | ~155 | |
| Architektur/Implementierung (das HOW) | ~1380-1430 | ~65% |
| — HTTP-Endpunkte in Akzeptanzkriterien | ~400 | |
| — DB-Schema-Definitionen (Feld-Tabellen, Typen) | ~150 | |
| — F-CORE-01 bis F-CORE-13 (Architekturentscheidungen) | ~100 | |
| — F-PLUGIN-01/02 (Plugin-System-Architektur) | ~20 | |
| — F-WF-01 (Workflow-Engine-Architektur) | ~10 | |
| — Protokoll-Details (RFCs, IMAP, SMTP) | ~80 | |
| — Technologie-/Library-Wahlen | ~60 | |
| — Frontend-Komponenten-Namen | ~40 | |
| — Farbcodes, SQL-Ausdrücke, Algorithmus-Details | ~50 | |
| — Redundanzen (F-FILE vs F-DMS, F-SCHED vs F-CORE-07) | ~100 | |
| — Historische/archivierte Requirements (Appendix A) | ~40 | |
| — Formatierung, Leerzeilen, Trennlinien | ~370 |
Fazit: Die Datei ist zu ~35% eine Requirements-Spec und zu ~65% eine Architektur-/Implementierungs-Dokumentation. Sie hat den Charakter einer Bauanleitung angenommen, nicht den einer Anforderungsspezifikation.
Section 3: Empfehlung
3.1 Was in requirements.md bleiben sollte
Genuine Requirements — das WAS:
- Projektbeschreibung (Zeilen 10-14) — Was ist das Projekt?
- Domain Knowledge (Zeilen 17-31) — Fachliche Begriffe und Referenzen
- Tech-Stack-Entscheidungen (Zeilen 34-52) — Hohe-Level-Entscheidungen (Backend, DB, Frontend, Deployment)
- Feature-Anforderungstexte — Die „Anforderung:"-Absätze jedes Features, bereinigt um Implementierungsdetails:
- F-AUTH-01 bis F-AUTH-08: Was muss die Auth können?
- F-COMP-01 bis F-COMP-08: Was muss Firmen-Management können?
- F-CONT-01 bis F-CONT-07: Was muss Kontakt-Management können?
- F-DATA-01 bis F-DATA-06: Was muss Daten-Management können?
- F-UI-01 bis F-UI-08: Was muss die UI bieten?
- F-SEC-01 bis F-SEC-03: Welche Sicherheitsanforderungen?
- F-INFRA-01 bis F-INFRA-04: Welche Infrastrukturanforderungen?
- F-MIG-01: Was muss Migration/Import können?
- F-INT-01: Welche Integrationsanforderung?
- F-TEST-01: Welche Test-Strategie?
- F-ENV-01: Welche Environment-Anforderung?
- F-DOC-01: Welche Doku-Anforderung?
- F-PERF-01: Welche Performance-Anforderung?
- F-SEARCH-01: Was muss die globale Suche können?
- F-NAV-01: Welche Navigation?
- F-SET-01: Welche Einstellungen?
- F-DMS-01 bis F-DMS-07: Was muss DMS können? (ohne Endpunkte)
- F-LINK-01 bis F-LINK-06: Was muss Verknüpfung können? (ohne Endpunkte)
- F-TAG-01 bis F-TAG-04: Was muss Tagging können? (ohne Endpunkte)
- F-PERM-01 bis F-PERM-06: Welche Berechtigungs-Requirements? (ohne Endpunkte)
- F-FILEUI-01 bis F-FILEUI-06: Welche UI-Requirements für Datei-Browser? (ohne Komponentennamen)
- F-CAL-01 bis F-CAL-18: Was muss Kalender können? (ohne Endpunkte, ohne Farbcodes)
- F-MAIL-01 bis F-MAIL-19: Was muss Mail können? (ohne Protokoll-Details)
- F-AI-01: Was muss der KI-Copilot können?
- F-SCHED-01: Welche Background-Job-Anforderung?
- Test-Szenarien — Aber bereinigt: nur Verhalten beschreiben („User klickt X → Y passiert"), keine Implementierung („
deleted_at = NOWgesetzt", „tsvector-Index") - Non-funktionale Anforderungen (Zeilen 1957-1973) — Bleiben, aber Metriken ohne Library-Namen
- Annahmen (Zeilen 1976-1999) — Bleiben
- Non-Goals (Zeilen 2001-2046) — Bleiben
- Discovery-Checkliste (Zeilen 2049-2073) — Bleibt
- Open Questions (Zeilen 2077-2085) — Bleibt
3.2 Was nach architecture.md verschoben werden sollte
Architektur/Implementierung — das HOW:
-
F-CORE-01 bis F-CORE-13 (Zeilen 864-953): Komplett in architecture.md
- Event Bus, Tenant-Isolation (
tenant_id), Plugin-Migration, UI-Plugin-Framework, Service Container/DI, API-First (Endpunkt-Versionierung/api/v1/), Async Job Queue (Celery/Redis), Caching (Redis), Storage-Backend (S3/MinIO), Import/Export Service, PDF-Gen, Notification Service
- Event Bus, Tenant-Isolation (
-
F-PLUGIN-01, F-PLUGIN-02 (Zeilen 848-860): Plugin-System-Architektur → architecture.md
- Plugin-Schnittstelle, Manifest-Format, Lifecycle-Hooks, Abhängigkeiten
-
F-WF-01 (Zeile 812-815): Workflow-Engine-Architektur → architecture.md
- Hybrid-Ansatz, Code-Engine vs. konfigurierbare Regeln
-
Alle HTTP-Endpunkt-Spezifikationen: → architecture.md (API-Contract-Sektion)
POST /api/auth/login,GET /api/companies/{id}, etc.- Request/Response-Body-Formate
- Query-Parameter-Spezifikationen
- HTTP-Status-Codes
-
Alle DB-Schema-Definitionen: → architecture.md (DB-Schema-Sektion)
- Feld-Tabellen mit Typen (F-COMP-01 Zeilen 156-186, F-CONT-01 Zeilen 300-333)
- Tabellennamen (
audit_log,deletion_log,company_contacts,user_calendar_visibility) tenant_id-Feld-Spezifikationtsvector-Index-Spezifikation
-
Protokoll-Details: → architecture.md
- IMAP4rev1, IMAP IDLE, IMAP MOVE, SMTP-Auth
- RFC 5545 (RRULE), RFC 5322 (Threading)
- PGP-Verschlüsselung (python-gnupg)
- DOMPurify-Sanitization
- AES-256-Verschlüsselung für Passwörter
-
Frontend-Komponenten-Architektur: → architecture.md (Frontend-Architektur-Sektion)
- Komponenten-Namen (
CalendarView,KanbanCalendar,FileBrowser,Breadcrumb,ContextMenu,ThreadView) - State-Management (
Multi-Select-State,user_calendar_visibility) - HTML5 Drag & Drop API, XMLHttpRequest
- Materialized Path Pattern
- Komponenten-Namen (
-
Farbcodes und UI-Mappings: → architecture.md oder design-system.md
- Hex-Codes für Kalender-Typen
- Farb-Mapping-Logik
-
Algorithmus-Details: → architecture.md
- Mail-Regel-Auswertung
- Auto-Reply-Logik (No-Reply-Erkennung,
vacation_sent_log) - Recurrence-Instanz-Generierung
- Thread-Gruppierung
-
F-FILE-01 bis F-FILE-04 (Zeilen 955-985): Duplikate von F-DMS/F-PERM — entfernen oder konsolidieren
-
F-SCHED-01 (Zeile 784-792): Duplikat von F-CORE-07 — konsolidieren
-
Appendix A: Historische Anforderungen (Zeilen 2089-2128): In separates
changelog.mdoder entfernen
3.3 Wie die Widersprüche (Plugin vs. Core-Feature) aufgelöst werden können
Option A: Module sind Core-Features (empfohlen für v1/v2)
- Entferne F-PLUGIN-01, F-PLUGIN-02, F-CORE-01 bis F-CORE-13 aus requirements.md
- Module (Mail, Kalender, DMS, Tags) sind Core-Features mit Requirements
- Plugin-System ist ein Non-Goal für v1/v2 („Plugin-System für spätere Versionen")
- Vorteil: Konsistent, weniger Komplexität, schneller implementierbar
- Nachteil: Weniger Erweiterbarkeit
Option B: Module sind Plugins
- Core-Requirements definieren nur Plugin-Schnittstelle und Core-Infrastruktur
- Plugin-Requirements (Mail, Kalender, DMS) werden in separate Plugin-Specs ausgelagert
- Core-Requirements sagen: „Das System unterstützt Plugins. Plugin 'Mail' muss X können. Plugin 'Kalender' muss Y können."
- Die detaillierten Feature-Spezifikationen (F-MAIL-, F-CAL-, F-DMS-*) wandern in Plugin-Requirements
- Vorteil: Saubere Trennung, Erweiterbarkeit
- Nachteil: Mehr Dokumentation, mehr Komplexität, Over-Engineering für ein Mini-CRM
Empfehlung: Option A für v1/v2. Ein Mini-CRM mit 10 concurrent Users braucht kein Plugin-System. Das Plugin-System ist ein Architektur-Non-Goal für v1/v2. Die Module werden als Core-Features implementiert. Wenn Erweiterbarkeit später benötigt wird, kann ein Plugin-System in v3+ hinzugefügt werden. F-PLUGIN-01, F-PLUGIN-02, F-CORE-01 bis F-CORE-13 werden zu Non-Goals.
Section 4: Spezifische Konflikte (Tabelle)
| ID/Zeile | Issue | Severity | Vorschlag |
|---|---|---|---|
| F-PLUGIN-01 (848) vs F-DMS/F-CAL/F-MAIL | Module als Plugins deklariert, aber als Core-Features mit Endpunkten/DB-Schemas spezifiziert | critical | Plugin-System als Non-Goal für v1/v2; Module als Core-Features deklarieren |
| F-FILE-01-04 (955-985) vs F-DMS-01-07 (991-1083) | F-FILE und F-DMS beschreiben dasselbe Modul mit unterschiedlichen IDs. F-FILE-01 (Datei-Explorer) = F-DMS-01 (Ordner-Struktur), F-FILE-03 (PDF-Preview) = F-DMS-04, F-FILE-04 (OnlyOffice) = F-DMS-05 | critical | F-FILE-01 bis F-FILE-04 entfernen; durch F-DMS-Referenzen ersetzen |
| F-FILE-03 (973) vs F-DMS-04 (1033) | Beide spezifizieren PDF-Preview im Browser — Duplikat | critical | F-FILE-03 entfernen; F-DMS-04 behalten (detaillierter) |
| F-FILE-04 (982) vs F-DMS-05 (1047) | Beide spezifizieren OnlyOffice-Integration — Duplikat | critical | F-FILE-04 entfernen; F-DMS-05 behalten (detaillierter) |
| F-FILE-02 (964) vs F-PERM-03/04 (1257-1279) | F-FILE-02 (Datei-Sharing) ist vereinfachte Version von F-PERM-03/04 — Redundanz | warning | F-FILE-02 entfernen; F-PERM-03/04 als maßgeblich deklarieren |
| F-SCHED-01 (784) vs F-CORE-07 (906) | Beide beschreiben Background-Jobs/Async-Queue — F-SCHED-01 ist vereinfachte Version von F-CORE-07 | warning | F-SCHED-01 entfernen; F-CORE-07 in architecture.md verschieben; Requirement „lange Operationen als Background-Job" in requirements.md behalten |
| F-DATA-01/02 (430-452) vs F-CORE-11 (934) | CSV/Excel-Export (F-DATA) überlappt mit Generic Import/Export Service (F-CORE-11) | warning | F-CORE-11 in architecture.md; F-DATA-01/02 in requirements.md behalten (das WAS); F-CORE-11 beschreibt das HOW |
| F-AUTH-07 (135) vs F-AUTH-01-F-CONT-07 (57-410) | Multi-Tenant deklariert, aber frühe Requirements erwähnen Tenant-Kontext nicht | warning | Frühe Requirements um Tenant-Bezug ergänzen: „Firma wird dem aktiven Tenant zugeordnet", „Suche ist Tenant-gefiltert" |
| F-AUTH-01 (58) vs F-AUTH-02 (72-78) | F-AUTH-01: „Session-basiert", F-AUTH-02: „Token wird entfernt", „Server-Token-Blacklist" — inkonsistente Terminologie | warning | Einheitlich „Session" verwenden; Token-Blacklist entfernen oder klar als Session-Invalidierung benennen |
| F-SEC-03 (616) vs F-AUTH-01 (58) | F-SEC-03 spricht von „Token" („Token gültig <8h", „Token nach 8h → 401"), F-AUTH-01 von „Session-Cookie" | warning | Einheitlich Session-basiert formulieren; „Session läuft nach 8h ab" |
| F-CORE-06 (899) vs F-UI-01-06 (495-573) | API-First („alle Features über API") vs. reinen UI-Features ohne API-Bezug (Toast, Loading-States, Empty-States) | warning | F-CORE-06 einschränken: „Alle Daten- und Funktions-Features über API nutzbar; reine UI-Präsentations-Features (Loading-States, Toasts) ausgenommen" |
| F-AUTH-06 (126) vs F-AUTH-04 (98) | F-AUTH-06 (Multi-User mit Rollen) überlappt mit F-AUTH-04 (RBAC) — F-AUTH-06 ist detailliertere Version | warning | Zusammenführen oder F-AUTH-06 als Erweiterung von F-AUTH-04 kennzeichnen |
| F-AUTH-08 (144) vs F-AUTH-04/06 (98-129) | F-AUTH-08 (Feld-Ebene-Granularität) erweitert F-AUTH-04/06, wird aber nicht kreuzreferenziert | warning | F-AUTH-08 als Unterpunkt von F-AUTH-04/06 integrieren oder explizit referenzieren |
| F-SEARCH-01 (821) vs F-COMP-06 (255)/F-CONT-06 (402) | Globale Suche überlappt mit Firmen-/Kontakt-Suche — keine klare Abgrenzung | warning | F-SEARCH-01 als übergeordnete Suche deklarieren; F-COMP-06/F-CONT-06 als Modul-Suche mit Querverweis |
| F-INT-01 (700) vs F-MAIL-02 (1683) | E-Mail-Integration für Passwort-Reset (F-INT-01) ist Subset des vollen Mail-Moduls (F-MAIL-02) | info | F-INT-01 als v1-Requirement behalten; F-MAIL-02 als v2-Erweiterung kennzeichnen; F-INT-01 bei F-MAIL-02 referenzieren |
| F-CAL-10 (1536) vs Non-Goals (2028) | F-CAL-10 (Ressourcen-Booking) als „Optional für später (post-v2)" markiert, hat aber volle Test-Szenarien und Akzeptanzkriterien | warning | Entweder zu Non-Goals verschieben oder als v2-Feature belassen mit klarer Markierung „post-v2" |
| F-COMP-01 Feldtabelle (156-186) | DB-Schema mit Typen (String(100), Integer, Decimal) in Requirements | info | Feldliste als „Felder, die erfasst werden" in requirements.md; Typen und Constraints in architecture.md |
| F-CONT-01 Feldtabelle (300-333) | DB-Schema mit Typen in Requirements | info | Analog zu F-COMP-01 |
| F-COMP-04 (235) | deleted_at = NOW (SQL-Ausdruck) in Akzeptanzkriterium |
info | „Firma wird als gelöscht markiert (Soft-Delete)" — ohne SQL |
| F-CONT-07 (424) | company_contacts Tabellenname in Akzeptanzkriterium |
info | „N:M-Verknüpfung wird erstellt" — ohne Tabellennamen |
| F-CAL-06 (1485) | Hex-Farbcodes in Akzeptanzkriterium | info | „Farbe wird basierend auf Typ zugeordnet" — Farbwerte in design-system.md |
| F-CAL-08 (1516) | RRULE (RFC 5545) in Akzeptanzkriterium | info | „Wiederholungsmuster werden unterstützt" — RFC-Referenz in architecture.md |
| F-MAIL-03 (1709) | tsvector-Index in Akzeptanzkriterium |
info | „Volltext-Suche über alle Mails" — Index-Strategie in architecture.md |
| F-MAIL-01 (1677) | „IMAP IDLE-Listener läuft als Background-Task" in Akzeptanzkriterium | info | „Neue Mails werden innerhalb von 5 Sekunden angezeigt" — Implementierung in architecture.md |
| F-MAIL-02 (1693) | „DOMPurify" in Akzeptanzkriterium | info | „HTML wird sanitisiert" — Library in architecture.md |
| F-MAIL-12 (1846) | „python-gnupg" in Akzeptanzkriterium | info | „PGP-Verschlüsselung wird unterstützt" — Library in architecture.md |
| F-FILEUI-01 (1321) | FileBrowser, SidebarTree, MainView Komponentennamen |
info | „Datei-Browser mit Baum-Ansicht und Hauptbereich" — Komponentennamen in architecture.md |
| F-FILEUI-02 (1335) | „Materialized Path oder rekursive Abfrage" in Akzeptanzkriterium | info | „Pfad wird aus Ordner-Hierarchie generiert" — Pattern in architecture.md |
| F-FILEUI-06 (1391) | „HTML5 Drag & Drop API" in Akzeptanzkriterium | info | „Drag & Drop wird unterstützt" — API in architecture.md |
| F-FILEUI-05 (1377) | „XMLHttpRequest oder WebSocket" in Akzeptanzkriterium | info | „Upload-Progress wird angezeigt" — Technologie in architecture.md |
| F-CORE-07 (907) | „Celery + Redis oder RQ + Redis" — Technologie-Wahl in Requirements | info | Komplett in architecture.md |
| F-CORE-08 (914) | „Redis als Cache-Backend" — Technologie-Wahl in Requirements | info | Komplett in architecture.md |
| F-CORE-10 (928) | „S3-kompatibles Storage (z.B. MinIO)" — Technologie-Wahl in Requirements | info | Komplett in architecture.md |
| F-CORE-02 (872) | tenant_id-Feld-Spezifikation in Requirements |
info | „Daten sind pro Tenant isoliert" — tenant_id in architecture.md |
| DISCOVERY_CHECK (2131) | Behauptet features_with_ids=127/127 — tatsächlich sind es ~141 aktive Feature-IDs |
warning | Zählung korrigieren oder klären, welche Features gezählt wurden |
| F-DATA-05 fehlt | Springt von F-DATA-04 (Zeile 472) zu F-DATA-06 (Zeile 481) — F-DATA-05 existiert nicht | info | Entweder F-DATA-05 nachtragen oder Nummerierung korrigieren |
| F-UI-07 fehlt | Springt von F-UI-06 (Zeile 565) zu F-UI-08 (Zeile 579) — F-UI-07 existiert nicht | info | Entweder F-UI-07 nachtragen oder Nummerierung korrigieren |
| F-COMP-07 (269) vs F-COMP-08 (283) | Audit-Log und DSGVO-Löschung haben überlappende Belange (beide behandeln Logging von Löschungen), Interaktion nicht dokumentiert | info | Klarstellen: Audit-Log = schreibende Aktionen; DSGVO-Löschung = harte Löschung inkl. Audit-Log-Einträgen, separate deletion_log |
| NF-06 (1966) | Code-Struktur (api/, models/, schemas/, services/, tests/) in nicht-funktionaler Anforderung |
info | In architecture.md verschieben; in requirements.md: „Code-Struktur ist klar getrennt" |
| Appendix A (2089-2128) | Historische v0.1-Requirements mit veralteten Tech-Stack (Jinja2, SQLite, Python 3.11) | info | In changelog.md verschieben oder entfernen; verwirrend in requirements.md |
Zusammenfassung
| Metrik | Wert |
|---|---|
| Gesamtzeilen | 2131 |
| Aktive Feature-IDs | ~141 |
| Genuine Requirements-Anteil | ~35% |
| Architektur/Implementierungs-Anteil | ~65% |
| Critical Issues | 4 |
| Warning Issues | 14 |
| Info Issues | 21 |
| Empfehlung | Requirements bereinigen, ~65% nach architecture.md verschieben, Plugin-System als Non-Goal für v1/v2 |
Urteil: Die Datei ist eine Mischung aus Requirements-Spec und Architektur-Dokument. Sie hat den Charakter einer Bauanleitung angenommen. Für eine saubere Trennung sollten ~65% des Inhalts in architecture.md verschoben werden. Die verbleibende requirements.md sollte nur das WAS beschreiben — nicht das HOW.