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>
27 KiB
Entwicklungsplan: Release-Fertigstellung Pressekonto
Konsolidiert aus vier Analysen vom 03.07.2026 (dev-Doku-Abgleich, Web-Frontend-Bestandsaufnahme, Backend-Baustellen, Deploy-Readiness). Reihenfolge nach Risiko/Nutzen: erst Korrektheit & kaputte Pfade, dann Release-Entscheidungen (Billing), dann Frontend-Fertigstellung, dann Aufräumen, dann Deploy/QA. Ergänzt
dev/optimize/entwicklungsplan.md(Phasen 0–5 dort abgeschlossen; dessen Phase 6 ist hier als R4 aufgenommen).
Stand & Wiedereinstieg (zuletzt: 03.07.2026)
Phase R0 komplett; R1 bis auf [EXTERN] fertig; R2.1 erledigt. Erledigt: R0.1–R0.5 (Variant-Routen raus, gdpr_consent_at in allen drei Registrierungspfaden, Newsletter-Binding config-aware + fail-fast, Seeder produktionssicher inkl. PlanSeeder + Dev-User-Guard, Fehlerseiten 403/404/419/500/503 self-contained) · R1.1 (Gate safe-by-default true, Legacy-/Grandfathered-Pfade per Test festgeschrieben, Scope-Logik war korrekt) · R1.3 (Quota-Reset als finales Tarif-Modell-Verhalten dokumentiert).
Offen in R1 (alle [EXTERN]): R1.2 Stripe-Live-Sync, R1.4 Preisfreigabe, R1.5 Refund-Entscheidung.
R2.1 Kontaktformular komplett (Backend + Web-Form, Brand-Empfaenger via CONTACT_EMAIL_-Keys [EXTERN: echte Adressen]). Bonus-Fix: legal-request-Honeypot nickt Bots wieder still ab (size:0-Regel verriet die Falle).
03.07. nachmittags (User-Vorgaben): Preise/Limits der Buchungsseite sind die abgestimmte Wahrheit; Pipeline verifiziert: admin/payments/plans pflegt Plan-DB (inkl. Vorteile zeilenweise) -> erscheint auf Buchungsseite, oeffentlicher Preise-Seite, pricing-teaser UND (neu) Hub. Vorteilstexte selbst sind noch nicht final [EXTERN: User passt sie im Admin-UI an — schlaegt automatisch ueberall durch].
R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-Grid aus Plan::active() via neuem HubPageData, echte Plattform-Kennzahlen statt erfundener, Fake-Kundenliste raus, alle toten Links beseitigt, unhaltbare Claims entschaerft, Footer-Rechtslinks auf /de/-Seiten der Hub-Domain). Hub-Rechtsseiten sind erreichbar, brauchen aber weiterhin finale Texte (R3.1).
Naechste Schritte: R2.4 (Sitemap/robots/meta) ohne User-Input machbar; R3 Inhalte + R1.2 Stripe-Live [EXTERN].
03.07. abends — Hub-Inhalts-Audit + Rechtstexte (Entscheidung E2: B2B-only!): Alle Hub-/Web-Inhalte gegen den echten Funktionsstand geprueft und korrigiert (Startseiten-Claims, FAQ, Hilfe, Veroeffentlichen, API-Doku inkl. OpenAPI); kontakt/ueber-uns zurueckgebaut; Rechtstexte aus docs/legal eingebaut (Impressum echt, AGB v0.6, /richtlinien, /melden); Widerrufs-UI raus (E2), Submit-Modal auf Archiv-Hinweis (T2neu); Preise nach Leistungsbeschreibung v0.2. Details in R3.0–R3.2.
03.07. spaet — Rechtstexte komplett + T1neu + Mail-CI (TAGESABSCHLUSS, Suite: 935 gruen): Datenschutzerklaerung v0.3 host-aware eingebaut (Hub-/Spoke-Bausteine, Magic-Link 15 Min., Stripe Payments Europe); Cookie-Seite zurueckgebaut (301 -> /datenschutz, Cookies stehen in Abschnitt 4, kein Banner). T1neu umgesetzt: Unternehmer-Pflicht-Checkbox im Buchungs-Modal, protokolliert in booking_confirmations (Timestamp/IP/AGB-Version aus config/legal.php), CheckoutController erzwingt zeitnahe Bestaetigung serverseitig. System-Mails auf zentrales pressekonto-CI-Layout umgestellt (components/emails/layout, inkl. Framework-Auth-Mails via toMailUsing, EmailBrandingTest).
06.07. — Zentrale Rechts-E-Mail (User-Entscheidung): info@pressekonto.com ist die Haupt-E-Mail fuer alle rechtlichen Anliegen; zentral in config/legal.php (LEGAL_CONTACT_EMAIL), alle fuenf Rechtsseiten (Impressum, AGB, Datenschutz, /melden, /richtlinien) nutzen sie domainuebergreifend. Support-/Redaktionskontakt bleibt je Brand (CONTACT_EMAIL_), REPORT_EMAIL_ ist nur noch optionales separates DSA-Postfach. Live-Domain bestaetigt .com (Deployment-Checkliste), nicht .de.
06.07. — Umami eingebaut + Klaerungsliste KOMPLETT beantwortet: Umami-Snippets (dev/release/umami.md, sys.adametz.media) je Brand in config/domains.php (brand.umami_website_id), gerendert via x-web.umami im web-master-Layout — per UMAMI_ENABLED=false deaktiviert bis zum Go-Live (User-Vorgabe; Checklisten-Punkt in WS-7 ergaenzt). User bestaetigt: Server-Fristen (Logs 14 Tage, Backups 4 Wochen) stimmen, Stripe-Entitaet (Stripe Payments Europe, Dublin) passt. Inhaltliche Freigaben erteilt: AGB par. 1 (3) Portalliste via Hub-#familie ok · AGB par. 11 (3) Kuendigungsseiten-Ergaenzung ok · Depublikations-Preis neutral ohne Betrag ok (bis T12) · Medienprivileg-Zitierung bleibt vorsichtig (par. 57 Abs. 1 MStV) bis anwaltliche Praezisierung · /melden-Aenderungsweg ueber Magic-Links fuer Launch ok. Damit sind die Rechtstexte inhaltlich final; offen nur noch [EXTERN] (anwaltliche Freigabe, Postfach info@pressekonto.com).
06.07. — R3.1-Restbacklog KOMPLETT umgesetzt (Suite: 956 gruen): (a) E3-Versionierung: legal_documents-Tabelle (type/version/effective_from, Fassungen unloeschbar, zukuenftige erst ab Stichtag; LegalDocument::current(), Seeder mit den 5 aktuellen Fassungen) + legal_document_id an booking_confirmations (T1neu referenziert jetzt die konkrete AGB-Fassung; config/legal.php nur noch Fallback). (b) rejection_categories-DB: /richtlinien rendert aktive Kategorien live (Seeder K1–K6; deaktivieren statt loeschen). (c) T13: Melde-Zeile sichtbar unter jedem Artikel. (d) T10: Formulare /melden/rechtswidrig (DSA Art. 16 inkl. Wahrheitsversicherung) + /melden/kontaktdaten (DSGVO) mit URL-Feld und automatischem PM-Match; Vorgangsnummer M-{id}; unverzuegliche Eingangsbestaetigung + internes Postfach-Mail (auch im Per-PM-Flow); Admin-Queue zeigt Vorgangsnummer/URL/Name. (e) T12: Depublikations-Checkout (Panel auf der Kunden-PM-Seite mit T1neu-Checkbox + Doppelausweis, Stripe-Ad-hoc-Charge, Webhook depubliziert → Status archived + depublished_at, oeffentliche URL zeigt Tombstone mit 410). Preis entschieden (O6, User 06.07.): 35 EUR netto — Default 3500 in config/billing.php, per BILLING_DEPUBLICATION_PRICE_CENTS ueberschreibbar (0 deaktiviert). Go-Live: beide Seeder in WS-7-Checkliste.
Wiedereinstieg / naechste Schritte:
Klaerungsliste Rechtstexteerledigt 06.07.;R3.1-Restbacklogerledigt 06.07. (siehe oben).- [EXTERN]: Postfach
info@pressekonto.comanlegen (Haupt-Rechts-Mail, 06.07.); CONTACT_EMAIL_-Support-Postfaecher je Brand; REPORT_EMAIL_ optional · R1.2 Stripe-Live · R1.4 Preisfreigabe · R5.4 Favicons · anwaltliche Freigabe AGB v0.6/Datenschutz v0.3. (Depublikations-Preisentschieden: 35 EUR netto.) - Phase-2-Rest (bewusst nach Launch): T11-Ausbau DSA-Queue (Basis existiert) · englische Rechtstexte (O-C, nach Sprachvarianten-Entscheidung) · oeffentliche Versionshistorie der Rechtstexte (O-D) · Ablehnungs-Mails mit Kategorie-Link (rejection_categories im Reject-Flow verdrahten).
- Dann: R6.1 manuelle QA-Checkliste, R6.3 Staging-Rehearsal, R6.4 Go-Live-Kette, R6.5 Git-Hygiene (Branch fix/zeitzone-europe-berlin liegt ~130 Commits vor main — mergen, sobald freigegeben). Offen bleibt ausserdem die User-Entscheidung zu den Legacy-SQL-Dumps in
dev/migration 2026/sql/(enttracken vor Repo-Sharing).
Ausgangslage (Stand 03.07.2026)
- Testsuite komplett grün: 838 passed, 1 skipped (3.678 Assertions, ~70 s).
- Branch:
fix/zeitzone-europe-berlin, 73 Commits vormain, 62 davon ungepusht.mainhat nichts Neues → Merge/Push ist Teil des Release (R6.5). - Keine Debug-Reste (
dd/dump/Test-Routen) im Backend; Mailables vollständig mit Views; Scheduler (5 Tasks) angeschlossen. - Wichtig:
dev/migration 2026/12-NAECHSTE-SCHRITTE.mdist teilweise veraltet — Stripe/Billing (dort „Phase 8 komplett offen") ist lautdev/frontend/hub-flux/PROGRESS.mdseit 12.06. umgesetzt (Checkout, Webhooks, Tarif-Admin, Grandfathering). Restaufwand-Schätzungen von dort nicht übernehmen. - Nachgelagert (User-Entscheidung 03.07.): kompletter getesteter Flow fürs User-Panel — bewusst NICHT Teil dieses Plans.
Arbeitsregeln (für jeden Schritt)
- Test-First bei Korrektheits-/Verhaltensänderungen (R0–R2): erst Pest-Test, dann ändern.
- Tests gezielt laufen:
php artisan test --compact --filter=<Name>(wir sind bereits im Sail-Container). - Nach PHP-Änderungen: Pint (
--dirty). - Web-Frontend (
resources/views/web/**,components/web/**) gehört dem User → separat committen, vor jedem Löschen bestätigen lassen. resources/views/components/layouts/app/sidebar.blade.phpgehört dem User und bleibt aus allen Commits ausgeschlossen (git reset -q -- …vor jedemgit add).- Jeder Schritt = ein eigener, fokussierter Commit.
- Punkte mit [EXTERN] brauchen Input vom User/Auftraggeber (Texte, Entscheidungen, Zugänge) — früh anstoßen, parallel weiterarbeiten.
Phase R0 — Korrektheit & kaputte Pfade (klein, sofort, Test-First)
- R0.1 Variant-Routen reparieren —
routes/web.php:211-227:/variant-1+/variant-2verweisen für die Businessportal-Domain aufweb.businessportal24-variant-float-glow/-glass-gradient— diese Views existieren nicht → 500. Entscheidung: Routen entfernen (Design-Experimente sind abgeschlossen) oder aufweb.businessportal24zurückfallen. Regressionstest. - R0.2
gdpr_consent_atim Registrierungsflow befüllen — Feld existiert (Model-Cast + Migration), wird aber nirgends geschrieben (verifiziert 03.07.). Bei Registrierung (FortifyCreateNewUser), Magic-Link-/Social-Provisioning (CustomerAccountProvisioner) setzen. DSGVO-relevant. Test-First. (= rev-1 aus migration-Doku) - R0.3 Newsletter-Sync-Binding ehrlich machen —
AppServiceProvider.php:47bindetNewsletterSyncClientunconditional anNullNewsletterSyncClient;NEWSLETter_SYNC_ENABLED=truebewirkt nichts, das Admin-UI (admin/newsletter/sync) suggeriert aber eine funktionierende Sync. Fürs Release: No-Op bleibt (echte Sync ist nachgelagert), aber Binding config-aware machen und im Admin-UI den Placeholder-Status sichtbar ausweisen. Test. - R0.4 Seeder produktionssicher machen —
PlanSeeder(Starter/Business/Pro/Agency) wird vonDatabaseSeedernicht aufgerufen → in den Produktions-Seed-Pfad aufnehmen (eigenerProductionSeederoder Aufnahme + Guard).PaymentOptionSeederschreibt Platzhalter (prod_placeholder_monthly,price_placeholder_monthly, …) → echte IDs viabilling:sync-stripe-plansbzw. Seed anpassen (R1.2-Abhängigkeit).- Test-User (
admin@pressekonto.test,test@example.com, Passwortpassword) inDatabaseSeedernur noch inlocal/testinganlegen.
- R0.5 Fehlerseiten erstellen —
resources/views/errors/existiert nicht → 404/500/503 (mind. 404 + 503 theme-/domain-aware fürs Web, neutrale Variante fürs Portal). Render-Tests.
Phase R1 — Backend-Release-Entscheidungen (Billing/Gates)
- R1.1 Buchungs-/Tarif-Gate prüfen & bereinigen (User-Vorgabe 03.07.) — Das Gate muss vollständig geprüft und bereinigt werden; Legacy-Buchungen müssen funktionieren (Bestandskunden mit Alt-Abo/Grandfathering dürfen veröffentlichen). Ist-Stand beim Testen: ohne gebuchtes Paket keine Veröffentlichung möglich (Gate lokal scharf via
.env:BILLING_ENFORCE_BOOKING=true) — Soll-Verhalten bestätigt. Teilschritte:- Alle Gate-Pfade durchgehen:
User::hasActiveBooking(),hasUnlimitedPressReleaseQuota,openSinglePurchaseCount(),UserPaymentOption::scopeActiveNow()/scopeGrandfatheredNow(), Submit-Gate imPressReleaseService. - Legacy-Buchungen end-to-end testen: migrierter User mit Alt-Abo (grandfathered, gültiges
grandfathered_until) kann einreichen/veröffentlichen; abgelaufener Bestandsschutz wird korrekt geblockt (NULL = abgelaufen, Entscheidung 19.06.). - Config-Default absichern:
config/billing.phpdefaultfalse— bei vergessenem Prod-Env-Key lieferthasActiveBooking()für alletrue→ Default auftruedrehen oder Runbook-Pflichtkey;.env.examplekorrigieren. - Suite + manueller Submit-Flow (mit/ohne Buchung, mit Legacy-Buchung) gegengetestet.
- Alle Gate-Pfade durchgehen:
- R1.2 Stripe produktiv vorbereiten —
billing:sync-stripe-plansgegen Live-Mode ausführen (bislang nur Test-Mode);STRIPE_PRICE_SINGLE_PMsetzen (sonst ist Einzel-PM-Checkout stumm deaktiviert,CheckoutController.php:58); Plan-stripe_price_id_monthly/_yearlygepflegt (sonst Abo-Checkout deaktiviert). Danach Checkout-Smoke-Test inkl. Webhook. [EXTERN: Live-Stripe-Zugang] - R1.3 Quota-Reset-Provisorium festschreiben —
ResetMonthlyPressReleaseQuotaist als „temporärer Stub bis zum echten Tarif-/Credit-Modul" markiert, läuft aber monatlich per Scheduler. Prüfen ob das Verhalten fürs Release korrekt ist (Zusammenspiel mit Credit-Wallet/Add-ons); Doc-Kommentar aktualisieren oder Logik ersetzen. - R1.4 Preise/Lineup final abstimmen —
PreisePageData.php:44TODO („Lineup/Preise hängen am Bookings-/Magic-Link-Rework"): öffentliche Preisseite (correction/update/depublish-Pfade) gegen finale Preisliste prüfen. [EXTERN: Preisfreigabe] - R1.5 Refund-Workflow: Entscheidung — laut hub-flux offen. Empfehlung: nachgelagert (Refunds initial direkt im Stripe-Dashboard), Entscheidung dokumentieren.
Phase R2 — Web-Frontend funktional fertigstellen
- R2.1 Kontaktformular anbinden —
kontakt.blade.php:52TODO: aktuell nurmailto:, kein Form/Handler; Telefon/Adresse sind Fake-Daten. Umsetzung analogLegalRequestController(POST-Controller + Validierung + Honeypot +throttle+ Mailversand an konfigurierbare Adresse). Feature-Tests. Echte Kontaktdaten [EXTERN]. - R2.2 Hub-Pricing datengetrieben —
pressekonto.blade.php:401/469/538: 3 hartcodierte Pricing-<article>s (0 €/49 €/149 €) →<x-web.pricing-teaser>(iteriertPlan::active(), wird von beiden Spokes schon genutzt). Beseitigt Drift-Risiko zum Plan-Katalog. (= alt Phase 6.1) - R2.3 Tote
href="#"-Links in Live-Seiten fixen — pressekonto (16×, u. a. Kundenlogos + Support-/Datenschutz-Links), release-detail (3×, Share-Aktionen),hub/top-utility-bar(3×),events-week/highlight-card. Echte Ziele setzen oder Elemente entfernen. - R2.4 SEO-Basics — Erledigt 03.07.: Host-aware
sitemap.xml(Hub: Landing + Rechts-/Info-Seiten; Spokes: zusätzlich Kategorien, öffentliche Newsrooms, alle im Archiv sichtbaren PMs des Portals; 1h-Cache pro Host).robots.txtjetzt dynamische Route mit Sitemap-Verweis + Disallow (/admin, /login, /register, Suche) — die statischepublic/robots.txtwurde entfernt (Deploy-Hinweis: nicht wieder anlegen, sie würde die Route verschatten). karriere/partner/presse/team: Brand pro Request viaWebPortalContext(statt hartcodiert „Business Portal 24") + Meta-Descriptions; bp24-Home auf config-getriebenes meta_title/meta_description-Muster vereinheitlicht. Sitemap listet bewusst nur die de-Edition (en-Entscheidung offen, s. Rechtstexte-Doku O3) und lässt Suche + Marketing-Platzhalterseiten (R3.2) draußen. Tests:SitemapRobotsTest. - R2.5 legal-request-Hinweistexte finalisieren —
legal-request.blade.php:8/65: Texte je Anfragetyp als „ENTWURF" markiert. [EXTERN: finale Texte]
Phase R3 — Inhalte [EXTERN, früh anstoßen, parallelisierbar]
- R3.0 Online-Widerruf (gesetzlicher Widerrufsbutton) — Umgesetzt 03.07., danach per Entscheidung E2 (B2B-only,
docs/legal/Entscheidung.mdv2.0) zurückgebaut: Das Angebot richtet sich ausschließlich an Unternehmer (§ 14 BGB), ein Widerrufsrecht besteht nicht — Button + Modal aus Hub-Footer/Static-Shell entfernt, Widerrufsbelehrung archiviert. Backend (POST /widerruf,withdrawal_requests, Mails, Admin-Queue) bleibt schlafend erhalten und ist bei B2C-Öffnung reaktivierbar. - R3.0b Kündigungsbutton — Erledigt 03.07.: „Verträge hier kündigen"-Button (Hub-Footer + jetzt auch Spoke-Footer) → öffentliche Bestätigungsseite
/de/kuendigungohne Login → persistierttermination_requests+ sofortige Zugangsbestätigung per Mail + Betreiber-Mail; Admin-Queue mit K-Vorgängen. Einordnung nach E2: § 312k ist im B2B keine Pflicht — der Selfservice bleibt bewusst als Anti-Zombie-Standard (T3neu). - R3.0c Erlöschens-Checkbox → Archiv-Hinweis (T2neu) — Die § 356-Erlöschens-Bestätigung entfiel mit E2 (B2B-only); an ihrer Stelle verlangt das Einreichungs-Modal jetzt die von AGB § 13 Abs. 1 geforderte Bestätigung der dauerhaften Archivierung (Depublikation nur als kostenpflichtiger Service, gesetzliche Ansprüche unberührt). Zeitpunkt wird weiter als
withdrawal_waiver_consented_atprotokolliert (Spaltenname historisch — Umbenennung optional). Index-Schnell-Submit (wire:confirm) bleibt durch das gemeinsame Modal ersetzt. - R3.1 Rechtstexte final (Code komplett; Rest nur [EXTERN]) — Inhalte eingebaut 03.07. (Quelle:
docs/legal/*, untracked): Impressum (echte Anbieterdaten adametz.media/Bielefeld, DDG, MStV, DSA-Kontaktpunkt via neuerREPORT_EMAIL_*-Keys), AGB v0.6 (B2B-Fassung, §§ 1–16, interne Anwalts-Anmerkungen entfernt, Version zentral inconfig/legal.php), Datenschutzerklärung v0.3 (host-aware Bausteine: Hub Kundenkonto/Login/Stripe, Spokes Medienprivileg/Newsroom/Änderungslinks; Magic-Link-TTL 15 Min. aus dem Code, Logs 14 Tage, Stripe Payments Europe), neue Seiten/richtlinien(Rahmentext + K1–K6 statisch) und/melden(DSA/DSGVO/Änderung/Depublikation, verdrahtet mit den bestehenden Melde-Links je PM); Cookie-Seite zurückgebaut (User-Entscheidung: Cookies in Datenschutz Abschnitt 4, kein Banner; 301 auf /datenschutz). T1neu erledigt: Unternehmer-Pflicht-Checkbox im Buchungs-Modal, protokolliert inbooking_confirmations(Timestamp, IP, AGB-Version); CheckoutController verlangt serverseitig eine zeitnahe Bestätigung (30 Min.) für Abo/Einzel-PM/Topup. Footer + Sitemap ergänzt; Preise-Seite nach Leistungsbeschreibung v0.2 (B2B-Satz, T9-Credit-Anker, Slots/Credits/Boost/Partner-Blöcke, T16-Wording inkl. PlanSeeder). Restbacklog erledigt 06.07. (Details im Stand-Block oben): legal_documents-Versionierung + legal_document_id an Buchungen (E3), rejection_categories-DB live auf /richtlinien, T10-Meldeformulare mit Vorgangsnummer + Eingangsbestätigung, T12-Depublikations-Checkout mit Tombstone (config-gated), T13-Melde-Zeile an jeder PM; Umami eingebaut (aus bis Go-Live), zentrale Rechts-Mail info@pressekonto.com. Noch offen [EXTERN]: anwaltliche Freigabe AGB v0.6/Datenschutz v0.3 · Postfach info@pressekonto.com. (Depublikations-Preis entschieden: 35 EUR netto, O6.) - R3.2 Marketing-Seiten: Inhalt oder Rückbau — Entschieden + umgesetzt 03.07. (User: Rückbau):
presse,team,karriere,partnerund (2. Runde)kontakt,ueber-unssamt Routen entfernt (erfundene Adresse/Telefon/Anfahrt bzw. Team/Kennzahlen/Timeline); GET-Alt-Pfade → 301 Startseite,kontakt.store-POST bleibt fürs Hub-Modal, Spoke-Footer-Kontakt als mailto (Fallback Betreiber-Postfach bis R2.1).hilfeundfaqinhaltlich auf den echten Funktionsstand gebracht (tote #-Links raus, echte Limits/Features),veroeffentlichenvom Fantasie-Preismodell („ab 89 €", Credits je PM, Cross-Publishing separat) auf echte Konditionen umgestellt (datengetrieben viaVeroeffentlichenPageData).api-Seite komplett neu als echte Referenz + OpenAPIdocs/api/v1.yml(Route lief vorher auf nie existierende Datei → 500 aus Hub-Footer/FAQ).
Phase R4 — Web-Frontend aufräumen (= alt Phase 6; vor jedem Löschen bestätigen)
Kontext (User, 03.07.): Bei der Frontend-Entwicklung gab es eine alte Version — es können noch Fragmentseiten aus dieser Version herumliegen. Die Funde unten (examples/, altes engl. Header/Footer-Layout, welcome, brand-mark, Variant-Views) passen dazu; beim Aufräumen gezielt nach weiteren Alt-Fragmenten suchen (auch in
components/web/**und ungerouteten Blades).
- R4.1 Tote Dateien entfernen — Erledigt 03.07. (User-Freigabe):
web/examples/(4 Demo-Views),welcome,home(„B2IN"-Fragment),brand-mark-View (die gleichnamige, viel genutzte Komponente bleibt),layouts/web-master-test, altes engl.layouts/header+footer— alle per grep verifiziert (inkl. dynamischer Auflösung). - R4.2 Tote Komponenten entfernt — Erledigt 03.07.: die 12 gelisteten
x-web-Komponenten + 7 zusätzlich gefundene Chain-Dead-Komponenten (main-navigation,breadcrumb,page-header,content-layout,article-card,section-header,sidebar-widget— nur von examples/ bzw. anderen toten Kandidaten referenziert). Verwaiste.highlights-slider-CSS-Regeln mit entfernt, Web-Build gegengeprüft. Suite grün. - R4.3 Dedup (optional, nice-to-have) — Release-Card-Vereinheitlichung, Industrie-Icon-Map → Config, Inline-SVGs → Icon-Set,
<x-web.container>(alt 6.2/6.3). Nur wenn Zeit; kein Release-Blocker.
Phase R5 — Deploy-Readiness
- R5.1
.env.examplevervollständigen — Erledigt 03.07.: alle projektspezifischen Keys ergänzt und dokumentiert (Multi-DomainAPP_PORTAL_*/APP_PRESSEECHO_*/APP_BUSINESSPORTAL_*/APP_PROTOCOL,SANCTUM_STATEFUL_DOMAINS, Legacy-DBs, Stripe/Cashier/Billing inkl.STRIPE_PRICE_SINGLE_PM+BILLING_OWN_VAT_ID, KIOPENAI_*/CLASSIFICATION_*/CONTENT_SCORE_*,NEWSLETTER_SYNC_*,VITE_DEV_SERVER_URL,SESSION_SECURE_COOKIE-Prod-Hinweis). Werte selbst (Live-Keys, Adressen) bleiben [EXTERN]. - R5.2 Deploy-Runbook schreiben — Erledigt 03.07.:
dev/release/deploy-runbook.md— Server-Voraussetzungen, Prod-.env-Solltabelle, Build-/Release-Schritte (composer,npm run build, storage:link, migrate --force, Stammdaten-Seeder, Caches, queue:restart), Queue-Worker (Queueclassification, systemd-Beispiel), Cron/Scheduler (5 Tasks mit Ausfall-Folgen), Stripe-Webhook, Erst-Einrichtung (Legacy-Import-Reihenfolge), Smoke-Test-Checkliste, Rollback. Enthält den robots.txt-Deploy-Hinweis aus R2.4. - R5.3 Monitoring/Alerting entscheiden — kein Sentry o. ä. installiert; Scheduler-/Queue-Failure-Alerting fehlt. Minimalvorschlag:
schedule-onFailure-Mail + Log-Rotation; optional Sentry. [EXTERN: Entscheidung] - R5.4 Favicons je Domain —
domains:generate-faviconserzeugt bewusst leere Platzhalter-Dateien; echte Favicons für pressekonto/presseecho/businessportal24 deployen. [EXTERN: Assets]
Phase R6 — QA & Go-Live (teils extern/Ops)
- [~] R6.1 Manuelle QA-Checkliste durcharbeiten — Vorprüfung + aktualisierte Checkliste erledigt 06.07.:
dev/release/qa-checkliste.mdersetzt §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). - 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,
EnsureUserIsCustomerals 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) - R6.5 Git-Hygiene — Branch
fix/zeitzone-europe-berlin(73 Commits vormain) pushen und nachmainmergen; danach Release-Tag. Die dreiuser_filter_presets-Migrations zusammenführen (rev-5, „Hygiene vor Go-Live") optional davor. - R6.6 Doku-Sync — Erledigt 03.07.:
12-NAECHSTE-SCHRITTE.md+08-PROGRESS.mdtragen deutliche Verweis-Banner auf den aktiven Release-Plan (Phase 8/Stripe als erledigt markiert, Test-Stand korrigiert).
Bewusst NACHGELAGERT (kein Teil dieses Release-Plans)
- Kompletter getesteter User-Panel-Flow (User-Entscheidung 03.07.2026).
- Echte Newsletter-Sync-Implementierung (No-Op bleibt, R0.3 macht es nur ehrlich); Newsletter-Subscriber-Admin/CSV (P3.7, vertagt).
- Coupons (UI-Skeleton, D-16 vertagt), Google-Login (Socialite), Regionen-Übersichten
/region/{slug}(301-Redirect bleibt), Blacklist-Admin-UI (Config reicht), PM-Nice-to-haves (Inline-Edit, Bulk, In-App-Notifications, Permission-Granularität). - Legacy-Logging/-Performance-Deployments (betreffen nur das Alt-System als Überbrückung bis zum Cutover).
- Performance-Polishing aus
11-NOCH-ZU-TUN-OPTIMIERUNGEN.md(Slow-Query-Auswertung braucht echte Live-Daten). - Coverage-Ziel 70 % / arch()-Tests /
test --parallel(P10.1–10.3) — Suite ist grün, Ausbau nachgelagert.
Reihenfolge-Empfehlung (TL;DR)
- R0 sofort — kaputte Pfade, DSGVO, Seeder, Fehlerseiten (alles klein, Test-First).
- [EXTERN]-Punkte parallel anstoßen — Rechtstexte (R3.1), Stripe-Live-Zugang (R1.2), Enforce-Booking-Entscheidung (R1.1), Kontaktdaten (R2.1), Mailing-Texte (R6.4). Das sind die längsten Wartezeiten.
- R1 + R2 — Billing scharf + Frontend funktional (Kern der Fertigstellung).
- R4 + R5 — Aufräumen + Deploy-Runbook, sobald R1/R2 stehen.
- R6 — QA, Security, Rehearsal, Cutover.