R6.1: QA-Checkliste erstellt, Vorpruefung abgeschlossen

dev/release/qa-checkliste.md loest Par. 15 der Scope-Doku ab: jeder
Punkt mit Beleg-Tests aus der gruenen Suite bzw. konkreten manuellen
Browser-/Staging-Schritten, inkl. Testzugaenge und Reihenfolge.
Befunde der Vorpruefung: /thumbnails-Redirect fehlte (separat gefixt,
d0ffe66); Newsletter-Double-Opt-In bewusst vertagt und als
Nicht-Blocker dokumentiert. Offen bleiben die manuellen Durchgaenge
(User) und die Staging-Punkte (R6.3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-06 10:16:21 +00:00
parent d0ffe664b8
commit 6ef4a0d061
2 changed files with 76 additions and 1 deletions

View file

@ -117,7 +117,7 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G
## Phase R6 — QA & Go-Live (teils extern/Ops)
- [ ] **R6.1 Manuelle QA-Checkliste durcharbeiten** — `dev/migration 2026/06-FEATURES-SCOPE.md` §15 (komplett offen): Logins inkl. 2FA + Magic-Link, Portal-Scoping, PM-Workflow Admin+Customer, Image-Upload, Blacklist, Stripe-Checkout inkl. Webhook + Invoice-PDF, Grandfathering, Legacy-Rechnungen, API (Sanctum + Abweisung alter api_key), Thumbnail-Redirect, Scheduler. Dabei auch verifizieren, was die (veraltete) Frontend-Konzept-Doku noch als offen führt (Branchen-/Kategorieseite, Veröffentlichen-Landing — im Code existieren `KategorieController`/`VeroeffentlichenController` bereits → visuell abnehmen statt neu bauen).
- [~] **R6.1 Manuelle QA-Checkliste durcharbeiten** — **Vorprüfung + aktualisierte Checkliste erledigt 06.07.:** `dev/release/qa-checkliste.md` ersetzt §15 der Scope-Doku (jeder Punkt mit Beleg-Tests bzw. konkreten manuellen Schritten; Testzugänge, Reihenfolge lokal → Staging). **Befunde:** (1) /thumbnails-Redirect fehlte trotz „ANGEPASST"-Vermerk → gebaut (`LegacyMediaRedirectController` + Tests, 301 auf neue Storage-URLs für PM-Bilder/Logos). (2) Newsletter-DOI unvollständig → bewusst vertagt, kein Launch-Blocker (kein öffentliches Formular verlinkt), vor Newsletter-Aktivierung DOI-Flow bauen. **Offen:** manuelle Browser-Durchgänge (User) — Kategorieseite/Veröffentlichen-Landing erst nach Abschluss des laufenden Frontend-Umbaus abnehmen; Stripe-/Scheduler-/Mail-Punkte beim Staging-Rehearsal (R6.3).
- [x] **R6.2 Security-Review** — Audit + Härtung erledigt 03.07. **Solide befunden:** CSRF (Stripe-Webhook via Signatur, keine Ausnahmen), Magic-Link-Krypto (64-Zeichen-Token, sha256-gehasht, atomare Einmalverwendung), HTMLPurifier-Sanitizing der PM-Texte, Raw-Queries durchgängig mit Bindings, IDOR-Schutz doppelt (Scope + Policy), BasicAuth timing-sicher, Session host-only korrekt fürs Hub-and-Spoke-Setup. **Gefixt:** Security-Header-Middleware (app-seitig), Logo-Upload im Company-Create über ImageService (vorher SVG/XSS möglich), Rate-Limits für Passwort-Reset/Registrierung/Consume-Routen, `EnsureUserIsCustomer` als persistente Livewire-Middleware. Tests: `SecurityHardeningTest`. **Offen/bewusst:** CSP separat einführen (Livewire/Alpine-Inline-Strategie nötig); Token-Abilities werden auf API-Routen nicht feingranular geprüft (ein Scope für alles — ok, solange keine eingeschränkten Tokens ausgegeben werden); Draft-PM-Anhänge nur per URL-Obscurity (dokumentierter MVP-Tradeoff); HSTS am Proxy setzen; **[USER-ENTSCHEIDUNG] Legacy-SQL-Dumps (`dev/migration 2026/sql/*.sql`, Produktivdaten!) sind im Git getrackt — enttracken + ggf. History bereinigen.**
- [ ] **R6.3 Staging-Import-Rehearsal** — Datenimport gegen produktiven Legacy-Snapshot auf Staging (mehrfach als der offene Vollständigkeitsnachweis referenziert, P6.10/P11.3). Achtung: `mysql_businessportal`-Verbindung lokal ist nur ein ~April-Snapshot — fürs Rehearsal echten aktuellen Dump ziehen. **[EXTERN: Server/Snapshot]**
- [ ] **R6.4 Go-Live-Kette** — Go-Live-Mailing (Passwort-Reset) + API-Kunden-Mailing: Code fertig, **finale Texte + Freigabeliste [EXTERN]**; DNS-Cutover `pressekonto.de`; Legacy-System read-only während Final-Import; alte Symfony-Server abschalten. *(= P11.x)*

View file

@ -0,0 +1,75 @@
# Manuelle QA-Checkliste (R6.1) — Stand 06.07.2026
Quelle: `dev/migration 2026/06-FEATURES-SCOPE.md` §15, aktualisiert auf den echten
Funktionsstand. **Vorprüfung 06.07. (Claude):** Jeder Punkt wurde gegen Code und
Testsuite geprüft; „Automatisiert belegt" heißt: der Flow ist End-to-End auf
HTTP-/Service-Ebene durch grüne Tests abgedeckt — manuell bleibt die visuelle
Abnahme im Browser. Testzugänge lokal: `admin@pressekonto.test` / `password`
(Admin), `test@example.com` / `password` (Customer, Seeder).
Empfohlene Reihenfolge: erst lokal durchklicken, dann dieselbe Liste beim
Staging-Rehearsal (R6.3) mit echtem Datenbestand wiederholen.
## A. Login & Konto
- [ ] **Admin-Login inkl. 2FA** — Automatisiert: `Auth/AuthenticationTest`, `Auth/TwoFactorLoginTest`. Manuell: 2FA im Portal einrichten (QR-Code scannen), abmelden, Login mit TOTP-Code und einmal mit Recovery-Code.
- [ ] **Customer-Login via Magic-Link** — Automatisiert: `Auth/MagicLinkLoginTest` (TTL 15 Min., Einmalverwendung). Manuell: Link anfordern, Mail-Optik (neues CI-Layout) prüfen, Login klappt, zweiter Klick auf denselben Link wird abgewiesen.
- [ ] **Customer-Login via Passwort + Google** — Automatisiert: `Auth/AuthenticationTest`, `Auth/GoogleLoginTest`. Manuell: Google-Round-Trip geht erst live mit echter Domain (WS-7-Checkliste).
- [ ] **Passwort-Reset-Flow** (kritisch fürs Go-Live-Mailing) — Automatisiert: `Auth/PasswordResetTest`, Mail-CI: `Mail/EmailBrandingTest`. Manuell: Reset anfordern → Mail → neues Passwort → Login.
- [ ] **Registrierung + E-Mail-Verifizierung** — Automatisiert: `Auth/RegistrationTest`, `Auth/EmailVerificationTest`. Manuell: einmal komplett durchlaufen inkl. Freischaltung.
## B. Admin-Backend
- [ ] **Portal-Scoping-Filter** (Presseecho-only / BP24-only / alle) — Automatisiert: `PressReleaseCompanyScopeTest`, PortalScope-Abdeckung in Admin-Tests. Manuell: Filter in PM-/Firmen-/User-Listen umschalten und Stichproben zählen.
- [ ] **PM-Workflow Admin**: Create → Draft → Publish → Mail an Autor → sichtbar im Frontend — Automatisiert: `Admin/AdminPressReleaseActionsTest`, `Admin/AdminPressReleaseSchedulingTest`, `Admin/AdminPressReleaseShowTest`. Manuell: einmal komplett, Frontend-Sichtbarkeit auf beiden Spokes prüfen.
- [ ] **Recht & Compliance-Queue** — Automatisiert: `LegalRequestTest`, `Web/ReportFormTest` (Vorgangsnummern, Eingangsbestätigung). Manuell: Meldung über /melden/rechtswidrig absenden → taucht mit M-Nummer in der Queue auf → erledigen.
- [ ] **Admin-Statuswechsel/Depublikation sichtbar** — Automatisiert: `Billing/DepublicationTest` (Tombstone 410). Manuell: depublizierte PM im Frontend aufrufen (Entfernt-Hinweis statt Inhalt).
## C. Customer-Panel
- [ ] **PM-Workflow Customer**: Create → Draft → Submit → Admin sieht zur Prüfung — Automatisiert: `PressReleaseBookingGateTest` (Submit-Gate), `PressReleaseQuotaTest`, `PressReleaseWithdrawalWaiverTest` (Archiv-Hinweis T2neu). Manuell: einmal komplett inkl. Submit-Modal (4 Schalter).
- [ ] **Image-Upload**: mehrere Bilder, Preview-Flag, Rechteangaben — Automatisiert: `PressReleaseImageLicenseTest`, `SyncPressReleaseImagesTest`, Api-Upload: `Api/V1/PressReleaseImageApiTest` (16 MB, jpg/png/webp). Manuell: Drag&Drop, Sortierung, Preview-Wechsel visuell.
- [ ] **Company-Logo-Upload** — Automatisiert: `SecurityHardeningTest` (ImageService, kein SVG/XSS). Manuell: Logo hochladen, Varianten in Firmenübersicht + Newsroom prüfen.
- [ ] **Blacklist blockiert Publish** — Automatisiert: `PressReleaseBlacklistTest`. Manuell: PM mit Blacklist-Wort einreichen → automatische Ablehnung mit Begründung.
- [ ] **Buchungsseite komplett**: Abo, Einzel-PM, Credits, Unternehmer-Checkbox (T1neu) — Automatisiert: `Billing/BookingsPageTest`, `Billing/CheckoutFlowTest`, `CreditTopupTest`. Manuell: Modal-Optik, USt-Aufschlüsselung, Checkbox-Zwang.
## D. Billing & Stripe (Staging mit Stripe-Testmode)
- [ ] **Stripe-Checkout End-to-End inkl. Webhook** — Automatisiert: `Billing/CheckoutFlowTest`, `Billing/StripeWebhookProcessingTest`, `CreditTopupTest` (Gutschrift genau einmal). Manuell auf Staging: echter Testmode-Checkout (Karte 4242…), Webhook via `stripe listen`, Buchung erscheint im Panel.
- [ ] **Rechnungen**: STR-Kreis (Stripe/Billing-Portal) + MAN-Kreis (`billing:generate-manual-invoices`) — Automatisiert: `Billing/InvoiceNumberGeneratorTest`, `Billing/ManualInvoiceGenerationTest`. Manuell: Rechnung im Stripe-Billing-Portal abrufbar.
- [ ] **Grandfathering**: Alt-Abo wird korrekt angezeigt/weiterberechnet, Bestandskunde sieht keinen Buchungs-Hinweis — Automatisiert: `Billing/GrandfatherLegacySubscriptionsTest`, `Billing/HasActiveBookingTest`, `Billing/LegacyBundleTest`. Manuell: mit echtem Grandfather-User nach dem Staging-Import (R6.3).
- [ ] **Legacy-Rechnungen im Archiv** (Admin + Customer, PDF) — Automatisiert: `Admin/AdminLegacyInvoiceArchiveTest`, `LegacyInvoiceArchiveCommandTest`. Manuell: PDF-Download eines Altbelegs.
- [ ] **Depublikations-Checkout** (35 € netto) — Automatisiert: `Billing/DepublicationTest`. Manuell auf Staging: einmal komplett bis Tombstone.
## E. API v1
- [ ] **`POST /v1/press-releases` mit Sanctum-Token** — Automatisiert: `Api/V1/PressReleaseApiTest`, `PressReleaseSubmitApiTest`, `PressReleaseImageApiTest`, `CustomerDataApiTest`. Manuell: Token im Kundenkonto erzeugen (setzt aktive Buchung voraus), curl-Workflow aus der /api-Doku durchspielen.
- [ ] **Alter `api_key`-Parameter wird abgewiesen** (mit Migrationshinweis) — Automatisiert: `ApiAccessSecurityAndLoggingTest` (Middleware `RejectLegacyApiKeys`). Manuell: entfällt.
- [ ] **Rate-Limit 60/min** — Automatisiert: abgedeckt. Manuell: entfällt.
## F. Frontend Spokes + Hub
- [ ] **Alter `/thumbnails/...`-Link redirectet** — **Lücke am 06.07. gefunden und geschlossen** (Scope-Doku führte den Redirect fälschlich als „ANGEPASST"): `LegacyMediaRedirectController`, Tests `Web/LegacyMediaRedirectTest`. Manuell nach Staging-Import: 2–3 echte Alt-URLs aus dem Live-Portal stichprobenartig aufrufen.
- [ ] **Legacy-.html-Redirects** (Startseite, FAQ, Newsrooms, Detail-URLs) — Automatisiert: `Web/LegacyRedirectTest`. Manuell: Stichprobe mit echten Alt-URLs nach Staging-Import.
- [ ] **Kategorieseite + Veröffentlichen-Landing visuell abnehmen** (Frontend-Konzept-Doku führt sie noch als „offen", Code existiert) — Automatisiert: `Web/CategoryPageTest`, `Web/VeroeffentlichenPageTest`/`StaticPagesTest`. Manuell: visuelle Abnahme — **Achtung: Web-Frontend wird gerade umgebaut (User, 06.07.), Abnahme erst danach.**
- [ ] **Rechtsseiten auf allen drei Domains** (Impressum, AGB, Datenschutz, Richtlinien, Melden, Kündigung) — Automatisiert: `Web/StaticPagesTest`, `Web/HubStaticPageShellTest`, `Legal/LegalDocumentTest`. Manuell: Sichtprüfung Hub + beide Spokes, Links im Footer.
- [ ] **Sitemap/robots je Host** — Automatisiert: `Web/SitemapRobotsTest`. Manuell: /sitemap.xml und /robots.txt auf allen drei Hosts aufrufen.
## G. Betrieb (Staging/Live, Ops)
- [ ] **Scheduler greift** — Vorgeprüft 06.07.: `schedule:list` zeigt 6 Tasks (magic-links:purge, press-releases:purge-drafts, publish-scheduled, billing:generate-manual-invoices, reset-monthly-quota, market:refresh). Manuell auf Staging: Cron-Eintrag + `php artisan schedule:run` + `queue:work` laufen (Runbook WS-7).
- [ ] **KI-Queue**: PM einreichen → Worker klassifiziert, kein Stau in `jobs`/`failed_jobs` — Automatisiert: `PressReleaseClassificationJobTest`. Manuell: mit echtem `OPENAI_API_KEY` auf Staging.
- [ ] **Mail-Zustellung real** (nicht `log`), Absender/SPF/DKIM — nur Staging/Live [EXTERN].
- [ ] **Umami**: `UMAMI_ENABLED=true` erst beim Go-Live; danach Snippet je Domain im Quelltext prüfen (`Web/UmamiSnippetTest` sichert die IDs).
## Nicht Teil von R6.1
- **Import-Rehearsal** gegen produktiven Snapshot → eigener Punkt **R6.3** [EXTERN: Server/Snapshot].
- **Newsletter Double-Opt-In End-to-End**: bewusst **vertagt** (Release-Plan „Bewusst NICHT im Plan": echte Newsletter-Sync bleibt No-Op; R0.3 macht das Binding nur ehrlich). Die API v1 legt Subscriptions unbestätigt an (`is_confirmed=false` + Token) — ein Bestätigungs-/Versandweg existiert noch nicht. Vor Aktivierung des Newsletters: DOI-Flow bauen. Kein öffentliches Anmeldeformular verlinkt → kein Launch-Blocker.
- **Frontend-Redesign-Abnahme**: Web-Frontend (Startseiten, Feeds, Kategorie) ist am 06.07. in Arbeit (User) — visuelle Abnahme + betroffene Web-Tests nach Abschluss des Umbaus.
## Befunde der Vorprüfung 06.07.
1. **/thumbnails-Redirect fehlte** (Scope-Doku behauptete „ANGEPASST") → gebaut + getestet (siehe F).
2. **Newsletter-DOI unvollständig** → bewusst vertagt, dokumentiert (siehe oben).
3. Alles Übrige aus §15 ist durch die grüne Suite (957 Tests) auf Funktionsebene belegt; offen ist die **visuelle bzw. operative Abnahme** im Browser und auf Staging.