23 KiB
23 KiB
LeoCRM — Kompletter Test-Plan
Erstellt: 2026-08-21 Prinzip: Echte Tests gegen Produktion — keine Mocks Ziel: 100% Abdeckung aller Module, Plugins, Verbindungen, Rechte, Security
1. Smoke Tests (Basis-Funktionalität)
1.1 System Health
GET /api/v1/health→ 200, status=healthy- DB Verbindung → up
- Redis Verbindung → up
- Storage → up
- Worker → up, queue_length=0
1.2 Auth & Login
POST /api/v1/auth/login(admin) → 200, csrf_tokenPOST /api/v1/auth/login(falsches Passwort) → 401POST /api/v1/auth/login(nicht existierender User) → 401- Session-Cookie ist HttpOnly
- CSRF-Token wird zurückgegeben
POST /api/v1/auth/logout→ 200
1.3 Frontend laden
GET /→ index.html mit JS-ReferenzenGET /login→ Login-Seite rendertGET /assets/index-*.js→ 200- Service Worker Kill-Switch aktiv auf /sw.js
- Cache-Control: no-cache auf index.html
1.4 Plugins aktiv
GET /api/v1/plugins→ 200, alle 25 Plugins aktiv- Jedes Plugin hat Routes registriert
- Jedes Plugin hat Models in DB
2. Backend API Tests (alle 480+ Endpunkte)
2.1 Contacts
GET /api/v1/contacts→ 200, PaginatedResponseGET /api/v1/contacts?page=1&page_size=25→ 200GET /api/v1/contacts?search=test→ 200GET /api/v1/contacts?type=company→ 200GET /api/v1/contacts?type=person→ 200GET /api/v1/contacts?folder_id={id}→ 200GET /api/v1/contacts?sort_by=displayname&sort_order=asc→ 200POST /api/v1/contacts(person) → 201, idPOST /api/v1/contacts(company) → 201, idPOST /api/v1/contacts(missing required fields) → 422GET /api/v1/contacts/{id}→ 200, contact detailGET /api/v1/contacts/{id}(non-existent) → 404PUT /api/v1/contacts/{id}→ 200, updatedPUT /api/v1/contacts/{id}(invalid data) → 422DELETE /api/v1/contacts/{id}→ 204DELETE /api/v1/contacts/{id}?hard=true→ 204GET /api/v1/contacts/{id}/persons→ 200POST /api/v1/contacts/{id}/persons→ 201PUT /api/v1/contacts/{id}/persons/{pid}→ 200DELETE /api/v1/contacts/{id}/persons/{pid}→ 204
2.2 Contact Folders
GET /api/v1/contact-folders→ 200POST /api/v1/contact-folders→ 201PUT /api/v1/contact-folders/{id}→ 200DELETE /api/v1/contact-folders/{id}→ 204PUT /api/v1/contact-folders/contacts/{cid}/move→ 200GET /api/v1/contact-folders/{id}/permissions→ 200POST /api/v1/contact-folders/{id}/permissions→ 201PUT /api/v1/contact-folders/{id}/permissions/{pid}→ 200DELETE /api/v1/contact-folders/{id}/permissions/{pid}→ 204
2.3 Mail
GET /api/v1/mail/accounts→ 200POST /api/v1/mail/accounts→ 201 (IMAP account)PUT /api/v1/mail/accounts/{id}→ 200DELETE /api/v1/mail/accounts/{id}→ 204POST /api/v1/mail/accounts/{id}/sync→ 200, synced countGET /api/v1/mail/accounts/{id}/folders→ 200GET /api/v1/mail/messages?account_id={id}→ 200GET /api/v1/mail/messages/{id}→ 200POST /api/v1/mail/messages(send) → 201PATCH /api/v1/mail/messages/{id}(mark read/unread) → 200DELETE /api/v1/mail/messages/{id}→ 204POST /api/v1/mail/accounts/{id}/folders(IMAP create) → 201
2.4 Calendar
GET /api/v1/calendars→ 200POST /api/v1/calendars→ 201PUT /api/v1/calendars/{id}→ 200DELETE /api/v1/calendars/{id}→ 204GET /api/v1/calendar/entries?start=...&end=...→ 200POST /api/v1/calendar/entries→ 201PUT /api/v1/calendar/entries/{id}→ 200DELETE /api/v1/calendar/entries/{id}→ 204GET /api/v1/calendar/entries?calendar_id={id}→ 200
2.5 Tasks
GET /api/v1/tasks?page=1&page_size=25→ 200GET /api/v1/tasks?status=open→ 200GET /api/v1/tasks?priority=high→ 200POST /api/v1/tasks→ 201GET /api/v1/tasks/{id}→ 200PATCH /api/v1/tasks/{id}→ 200DELETE /api/v1/tasks/{id}→ 204PATCH /api/v1/tasks/{id}/status→ 200
2.6 Wiki
GET /api/v1/wiki/articles?page_size=100→ 200GET /api/v1/wiki/articles?category_id={id}→ 200GET /api/v1/wiki/articles?search=test→ 200POST /api/v1/wiki/articles(with slug) → 201GET /api/v1/wiki/articles/{id}→ 200PATCH /api/v1/wiki/articles/{id}→ 200DELETE /api/v1/wiki/articles/{id}→ 204GET /api/v1/wiki/articles/{id}/versions→ 200POST /api/v1/wiki/articles/{id}/versions/{ver}/restore→ 200GET /api/v1/wiki/categories→ 200POST /api/v1/wiki/categories→ 201
2.7 Tags
GET /api/v1/tags→ 200 (with parent_id, applicable_to, icon)POST /api/v1/tags(with new fields) → 201PATCH /api/v1/tags/{id}→ 200DELETE /api/v1/tags/{id}→ 204POST /api/v1/tags/assign→ 201DELETE /api/v1/tags/assign→ 204POST /api/v1/tags/bulk-assign→ 200GET /api/v1/tags/{id}/entities→ 200
2.8 DMS
GET /api/v1/dms/files?page=1&page_size=25→ 200POST /api/v1/dms/files(upload) → 201GET /api/v1/dms/files/{id}→ 200DELETE /api/v1/dms/files/{id}→ 204GET /api/v1/dms/folders→ 200POST /api/v1/dms/folders→ 201GET /api/v1/dms/trash→ 200
2.9 Reports
GET /api/v1/reports/templates→ 200POST /api/v1/reports/templates→ 201PUT /api/v1/reports/templates/{id}→ 200DELETE /api/v1/reports/templates/{id}→ 204GET /api/v1/reports/presets→ 200POST /api/v1/reports/generate→ 200 (blob)POST /api/v1/reports/presets/{key}/generate→ 200 (blob)
2.10 Kommunikation
GET /api/v1/comm/conversations→ 200POST /api/v1/comm/conversations(with metadata) → 200GET /api/v1/comm/conversations/{id}→ 200PATCH /api/v1/comm/conversations/{id}→ 200DELETE /api/v1/comm/conversations/{id}→ 200GET /api/v1/comm/conversations/{id}/messages→ 200POST /api/v1/comm/conversations/{id}/messages→ 200POST /api/v1/comm/conversations/{id}/pin→ 200POST /api/v1/comm/conversations/{id}/mark-read→ 200GET /api/v1/comm/block-types→ 200GET /api/v1/comm/miniapps→ 200- WebSocket
/api/v1/comm/ws→ connect + receive messages
2.11 AI Assistant
GET /api/v1/ai/providers→ 200POST /api/v1/ai/providers→ 201PUT /api/v1/ai/providers/{id}→ 200DELETE /api/v1/ai/providers/{id}→ 200GET /api/v1/ai/models→ 200POST /api/v1/ai/models→ 201PUT /api/v1/ai/models/{id}→ 200DELETE /api/v1/ai/models/{id}→ 200GET /api/v1/ai/presets→ 200POST /api/v1/ai/presets→ 201PUT /api/v1/ai/presets/{id}→ 200DELETE /api/v1/ai/presets/{id}→ 200GET /api/v1/ai/agents→ 200POST /api/v1/ai/agents→ 201PUT /api/v1/ai/agents/{id}→ 200DELETE /api/v1/ai/agents/{id}→ 200GET /api/v1/ai/tools→ 200GET /api/v1/ai/folders→ 200POST /api/v1/ai/folders→ 201PUT /api/v1/ai/folders/{id}→ 200DELETE /api/v1/ai/folders/{id}→ 200POST /api/v1/ai/conversations/{id}/stream→ SSE stream with GLM 5.2 responseGET /api/v1/ai/conversations/{id}/messages→ 200GET /api/v1/ai/sessions→ 404 (removed in Phase 2)
2.12 Workflows
GET /api/v1/workflows→ 200POST /api/v1/workflows→ 201GET /api/v1/workflows/{id}→ 200PUT /api/v1/workflows/{id}→ 200DELETE /api/v1/workflows/{id}→ 204POST /api/v1/workflows/{id}/execute→ 200GET /api/v1/workflows/{id}/instances→ 200
2.13 Search
GET /api/v1/search?q=test→ 200, results arrayGET /api/v1/search?q=test&entity_type=contact→ 200GET /api/v1/search?q=test&entity_type=wiki→ 200GET /api/v1/search?q=test&entity_type=ai_chat→ 200 (searches comm_messages)GET /api/v1/search/providers→ 200
2.14 Notifications
GET /api/v1/notifications→ 200PATCH /api/v1/notifications/{id}(mark read) → 200DELETE /api/v1/notifications/{id}→ 204GET /api/v1/notifications/types→ 200
2.15 Audit Log
GET /api/v1/audit-log?page=1&page_size=25→ 200GET /api/v1/audit-log?entity_type=contact→ 200GET /api/v1/audit-log?action=create→ 200- Audit-Eintrag wird bei jeder Mutation erstellt
2.16 Users & Roles & Groups
GET /api/v1/users→ 200POST /api/v1/users→ 201PATCH /api/v1/users/{id}→ 200DELETE /api/v1/users/{id}→ 204GET /api/v1/roles→ 200POST /api/v1/roles→ 201 (with permissions dict)PUT /api/v1/roles/{id}→ 200DELETE /api/v1/roles/{id}→ 204GET /api/v1/groups→ 200POST /api/v1/groups→ 201PUT /api/v1/groups/{id}→ 200DELETE /api/v1/groups/{id}→ 204
2.17 Plugins
GET /api/v1/plugins→ 200, 25 pluginsGET /api/v1/plugins/{name}→ 200POST /api/v1/plugins/{name}/activate→ 200POST /api/v1/plugins/{name}/deactivate→ 200
2.18 Settings
GET /api/v1/system-settings→ 200PUT /api/v1/system-settings→ 200GET /api/v1/users/me/preferences→ 200PUT /api/v1/users/me/preferences→ 200
2.19 Entity Permissions
GET /api/v1/entity-permissions?entity_type=contact→ 200POST /api/v1/entity-permissions→ 201DELETE /api/v1/entity-permissions/{id}→ 204
2.20 Webhooks
GET /api/v1/webhooks→ 200POST /api/v1/webhooks→ 201DELETE /api/v1/webhooks/{id}→ 204POST /api/v1/webhooks/{id}/test→ 200
2.21 Saved Views & Filters
GET /api/v1/saved-views→ 200POST /api/v1/saved-views→ 201DELETE /api/v1/saved-views/{id}→ 204GET /api/v1/saved-filters→ 200POST /api/v1/saved-filters→ 201
2.22 Custom Fields
GET /api/v1/custom-field-definitions?entity=contact→ 200POST /api/v1/custom-field-definitions→ 201PUT /api/v1/custom-field-definitions/{id}→ 200DELETE /api/v1/custom-field-definitions/{id}→ 204GET /api/v1/contacts/{id}/custom-fields→ 200PUT /api/v1/contacts/{id}/custom-fields→ 200
2.23 Compliance
GET /api/v1/compliance/incidents→ 200POST /api/v1/compliance/incidents→ 201
2.24 Attachments
GET /api/v1/attachments→ 200POST /api/v1/attachments(upload) → 201GET /api/v1/attachments/{id}→ 200DELETE /api/v1/attachments/{id}→ 204
3. Frontend Tests
3.1 TypeScript
npx tsc --noEmit→ clean (0 errors)
3.2 Build
npm run build→ successful
3.3 vitest Unit Tests
- Alle
src/__tests__/Dateien ausführen - DmsPage Tests → passed
- Alle anderen Test-Dateien → passed
3.4 Playwright E2E Tests
- Alle
e2e/Dateien ausführen - Login Flow → passed
- Navigation → passed
- Contact CRUD → passed
- Mail → passed
3.5 Browser UI Tests (live)
- Login-Seite rendert mit Formular
- Dashboard lädt nach Login
- Contacts-Seite lädt mit 3-Spalten Layout
- Mail-Seite lädt mit IMAP-Mails
- Calendar-Seite lädt mit Kalender
- Tasks-Seite lädt mit 3-Spalten Layout
- Wiki-Seite lädt mit WYSIWYG Editor
- Tags-Seite lädt (unter Settings)
- Reports-Seite lädt
- Communication-Seite lädt mit AI Chat
- Settings-Seite lädt
- System Dashboard lädt
- Keine Console-Fehler auf irgendeiner Seite
4. Datenbank Tests
4.1 Schema
- Alembic Version: 0140
- Alle Tabellen existieren (130+)
- Alle Foreign Keys existieren (159+)
- Alle Indexes existieren (590+)
- Alle Unique Constraints existieren
- JSONB Spalten: metadata, applicable_to, config
- TSVECTOR Spalten: search_tsv
- Vector Spalten: embedding (768)
4.2 RLS (Row Level Security)
- 109 Tabellen mit RLS aktiviert
app.current_tenant_idwird vonset_tenant_context()gesetzt- User sieht nur eigene Tenant-Daten
- Cross-Tenant Query gibt leere Ergebnisse
4.3 Migrationen
- Alle 140 Migrationen angewendet
- Migration Hashes korrekt (migration_hashes.txt)
- 0137: AI Chat Tables entfernt
- 0138: Tags parent_id, applicable_to, icon
- 0139: Report templates folder_id
- 0140: Comm conversations folder_id
4.4 Daten-Integrität
- AI Provider: Ollama Cloud (is_default=true)
- AI Model: GLM 5.2 (is_active=true)
- AI Preset: GLM 5.2 Default (is_active=true)
- AI Agent: LeoCRM Assistant (is_default=true, is_active=true)
- Mail Account: admin@media-on.de (is_active=true)
- Sales Role: erstellt mit Berechtigungen
- AI Chat Tables: entfernt (0 Einträge)
- Comm Conversations mit conversation_type=ai: vorhanden
- Mail Messages: synchronisiert (>0)
5. Rechte-System Tests
5.1 Admin User (volle Rechte)
- Contacts: GET=200, POST=201, PUT=200, DELETE=204
- Mail: GET=200, POST=201
- Calendar: GET=200, POST=201
- Tasks: GET=200, POST=201
- Wiki: GET=200, POST=201
- Tags: GET=200, POST=201
- DMS: GET=200, POST=201
- Reports: GET=200, POST=201
- Comm: GET=200, POST=200
- AI Providers: GET=200, POST=201
- AI Agents: GET=200, POST=201
- Users: GET=200, POST=201
- Roles: GET=200, POST=201
- Groups: GET=200, POST=201
- Plugins: GET=200
- Workflows: GET=200, POST=201
- Settings: GET=200, PUT=200
- Audit: GET=200
- Webhooks: GET=200, POST=201
- Notifications: GET=200
- Search: GET=200
5.2 Sales User (Sales-Rolle: contacts:read+write, mail:read, calendar:read, tags:read, tasks:read+write, wiki:read, communication:read+write, dms:read, reports:read)
- Contacts: GET=200, POST=201 (write erlaubt)
- Mail: GET=200 (read erlaubt)
- Calendar: GET=200 (read erlaubt)
- Tags: GET=200 (read erlaubt)
- Tasks: GET=200, POST=201 (write erlaubt)
- Wiki: GET=200 (read erlaubt)
- Comm: GET=200, POST=200 (write erlaubt)
- DMS: GET=200 (read erlaubt)
- Reports: GET=200 (read erlaubt)
- AI Providers: GET=403 (kein ai:config)
- AI Agents: GET=403 (kein ai:agents)
- Users: GET=403 (kein settings:read)
- Roles: GET=403 (kein settings:read)
- Plugins: GET=403 (kein settings:read)
- Settings: GET=403 (kein settings:read)
- Audit: GET=403 (kein audit:read)
- Webhooks: GET=403 (kein settings:read)
5.3 Reader User (keine Berechtigungen)
- Contacts: GET=403, POST=403
- Mail: GET=403
- Calendar: GET=403
- Tags: GET=403, POST=403
- Tasks: GET=403, POST=403
- Wiki: GET=403, POST=403
- AI Providers: GET=403
- Users: GET=403
5.4 Field-Level Permissions
- Feld
contacts.email_1auf 'readonly' → User kann lesen aber nicht ändern - Feld
contacts.phone_1auf 'hidden' → User kann nicht sehen
5.5 Entity-Permissions
- User A hat 'read' auf Contact X → kann lesen
- User B hat keine Permission auf Contact X → kann nicht lesen
- User A hat 'write' auf Contact X → kann ändern
5.6 Gruppen-Permissions
- Gruppe 'Sales' hat contacts:read → alle Gruppen-Mitglieder können Contacts lesen
- User wird Gruppe hinzugefügt → bekommt Gruppen-Berechtigungen
- User wird aus Gruppe entfernt → verliert Gruppen-Berechtigungen
6. Cross-Tenant Security Tests
- Tenant A User fragt Contacts ab → sieht nur Tenant A Contacts
- Tenant A User fragt Contact ID aus Tenant B ab → 404
- Tenant A User versucht Contact aus Tenant B zu ändern → 404
- Tenant A User versucht Contact aus Tenant B zu löschen → 404
- RLS Policy aktiv auf allen 109 Tabellen
set_tenant_context()wird bei jedem Request aufgerufen
7. Plugin-Verbindungen Tests
7.1 AI ↔ Kommunikation
- AI Chat erstellt comm_conversation mit metadata.conversation_type=ai
- AI Streaming schreibt Messages in comm_messages
- AI Messages werden in Kommunikation angezeigt
- categorizeConversation erkennt AI Chats an metadata
7.2 AI ↔ Search (Unified Search)
- AI Chat Provider sucht in comm_messages (nicht ai_chat_messages)
- Search Results zeigen AI Chat Messages
- Search filtert nach conversation_type=ai
7.3 Tags ↔ Contacts
- Tag wird Contact zugewiesen (POST /tags/assign)
- Contact hat Tag in tags Feld
- Contact kann nach Tag gefiltert werden
- Tag wird von Contact entfernt (DELETE /tags/assign)
7.4 Tags ↔ andere Module
- Tags mit applicable_to=['contact'] → nur für Contacts verfügbar
- Tags mit applicable_to=['file'] → nur für DMS verfügbar
- Tags mit applicable_to=['calendar_entry'] → nur für Calendar verfügbar
7.5 Wiki ↔ Search
- Wiki Artikel erscheint in Unified Search
- Search nach Wiki Artikel Titel → gefunden
- Search nach Wiki Artikel Content → gefunden
7.6 DMS ↔ Contacts
- Datei wird mit Contact verknüpft (entity_link)
- Contact Detail zeigt verknüpfte Dateien
- Datei wird von Contact entknüpft
7.7 Mail ↔ Contacts
- E-Mail wird mit Contact verknüpft
- Contact Detail zeigt verknüpfte E-Mails
7.8 Calendar ↔ Tasks
- Task mit due_date erscheint im Calendar
- Calendar Entry kann mit Task verknüpft werden
7.9 Permissions ↔ alle Plugins
- Jedes Plugin nutzt require_permission Dependency
- Plugin Route ohne Berechtigung → 403
- Plugin Route mit Berechtigung → 200
7.10 Notifications ↔ alle Plugins
- Contact erstellt → Notification generiert
- Task erstellt → Notification generiert
- Mail empfangen → Notification generiert
- AI Chat Message → Notification generiert
7.11 Audit ↔ alle Plugins
- Contact Create → Audit Log Eintrag
- Contact Update → Audit Log Eintrag
- Contact Delete → Audit Log Eintrag
- Tag Create → Audit Log Eintrag
- Task Create → Audit Log Eintrag
- Wiki Create → Audit Log Eintrag
- Mail Send → Audit Log Eintrag
7.12 Workflows ↔ Plugins
- Workflow kann Contact erstellen (Step Handler)
- Workflow kann Task erstellen (Step Handler)
- Workflow kann Notification senden (Step Handler)
7.13 AI ↔ CRM API Tool
- AI Agent kann call_crm_api Tool verwenden
- AI Agent ruft Contacts API auf → bekommt Ergebnisse
- AI Agent erstellt Contact über Tool → Contact existiert
7.14 Search ↔ alle Provider
- Contact Search Provider → findet Contacts
- DMS Search Provider → findet Dateien
- Wiki Search Provider → findet Artikel
- AI Chat Search Provider → findet AI Chat Messages
- Tag Search Provider → findet Tags
- Mail Search Provider → findet E-Mails
- Calendar Search Provider → findet Termine
- Task Search Provider → findet Tasks
8. Code-Logik Tests
8.1 Python Imports
from app.main import app→ OKfrom app.models import *→ OK (keine AIChatSession/AIChatMessage)- Alle Plugin Routes importierbar
- Alle Services importierbar
- Keine ImportError in irgend einem Modul
8.2 Model Validierung
- Tag Model hat parent_id, applicable_to, icon
- CommConversation Model hat folder_id
- ReportTemplate Model hat folder_id
- AIChatSession/AIChatMessage/AIChatAttachment entfernt
- AIConversation/AIMessage entfernt
8.3 Schema Validierung
- TagCreate akzeptiert parent_id, applicable_to, icon
- TagUpdate akzeptiert parent_id, applicable_to, icon
- ConversationCreate akzeptiert metadata
- WikiArticleCreate benötigt slug
8.4 Service Logik
- create_conversation speichert metadata
- stream_chat_comm schreibt in comm_messages
- get_comm_messages liest aus comm_messages
- AI Chat Search Provider sucht in comm_messages
9. Performance Tests
GET /api/v1/contacts?page=1&page_size=25→ < 200msGET /api/v1/search?q=test→ < 500msGET /api/v1/health→ < 50ms- Frontend Load Time → < 3s
- DB Query für Contacts mit RLS → < 100ms
10. Security Tests
10.1 CSRF
- POST ohne X-CSRF-Token → 403
- POST mit gültigem X-CSRF-Token → 200/201
- POST mit falschem X-CSRF-Token → 403
10.2 Auth
- GET ohne Session-Cookie → 401
- GET mit abgelaufener Session → 401
- Session-Cookie ist HttpOnly
- Session-Cookie ist Secure (HTTPS)
10.3 Input Validation
- POST mit invalid JSON → 422
- POST mit SQL Injection (
'; DROP TABLE--) → 422 oder safe - POST mit XSS (
<script>alert(1)</script>) → sanitized - GET mit Path Traversal (
../../../etc/passwd) → 404
10.4 Rate Limiting
- AI Chat Streaming hat Rate Limit
- Login hat Rate Limit
- API hat General Rate Limit
11. Cleanup Tests
- Test-User (sales@test.com, reader@test.com) werden nach Tests gelöscht
- Test-Daten (Contacts, Tags, Tasks, Wiki Articles) werden nach Tests gelöscht
- Test-Role (Sales) wird nach Tests gelöscht
- Keine Test-Daten bleiben in Produktion
Ausführungs-Reihenfolge
- Smoke Tests (1.) — schnell, prüft ob System läuft
- Code-Logik Tests (8.) — prüft Imports und Models
- Datenbank Tests (4.) — prüft Schema und Daten
- Backend API Tests (2.) — alle Endpunkte durchtesten
- Rechte-System Tests (5.) — mit verschiedenen Usern
- Cross-Tenant Security Tests (6.) — Tenant-Isolation
- Plugin-Verbindungen Tests (7.) — alle Plugin-Interaktionen
- Frontend Tests (3.) — vitest, Playwright, Browser
- Performance Tests (9.) — Response Times
- Security Tests (10.) — CSRF, XSS, Rate Limiting
- Cleanup Tests (11.) — Test-Daten entfernen
Test-User
| User | Rolle | Berechtigungen | |
|---|---|---|---|
| Admin | admin@media-on.de | admin | : (volle Rechte) |
| Sales | sales@test.com | Sales | contacts:read+write, mail:read, calendar:read, tags:read, tasks:read+write, wiki:read, communication:read+write, dms:read, reports:read |
| Reader | reader@test.com | viewer | keine |
Prinzipien
- Echte Tests gegen Produktion — keine Mocks
- Jeder Test wird mit curl/HTTP gegen https://crm.media-on.de ausgeführt
- Datenbank-Tests via SSH → psql auf Produktions-DB
- Frontend-Tests mit vitest + Playwright + Browser
- Test-Daten werden nach Tests gelöscht
- Jeder Bug wird sofort gefixt und deployt
- Ergebnisse werden dokumentiert