diff --git a/dev/README.md b/dev/README.md index d67ab1b8..4386aedb 100644 --- a/dev/README.md +++ b/dev/README.md @@ -39,13 +39,15 @@ liegen in `archive/`. ## Lokal / gitignored (nicht committen) -Enthalten personenbezogene Daten oder Schlüssel. Was damit passiert, steht in -der Roadmap unter 1.4. +Am 09.10.2026 gelöscht: Medien-Staging der Legacy-Migration (`migration/`, +7,4 GB), Legacy-DB-Dumps (`archive/migration-2026/sql/`), Postman-Collection +und Activity-Logs der Alt-APIs (`api/`), Bounce-Adressliste (`newsletter/`), +Produktions-Log (`2026-10/`). Die Muster in `.gitignore` bleiben, damit solche +Dateien nie wieder versioniert werden. **Personenbezogene Daten und Schlüssel +gehören nicht unter `dev/`.** + +Die Git-Historie wurde am selben Tag von den SQL-Dumps bereinigt; seitdem +sind alle Commit-Hashes neu. Alte Hashes in Doku und Commit-Nachrichten +lassen sich über [`archive/commit-map-2026-10-09.txt`](archive/commit-map-2026-10-09.txt) +auflösen. -| Pfad | Inhalt | -| --- | --- | -| `migration/` | Medien-Staging der Legacy-Migration (~7 GB), Quelle für `legacy:migrate-media` | -| `archive/migration-2026/sql/` | Legacy-DB-Dumps vom 23.04.2026 | -| `api/` | Postman-Collection (enthält API-Keys) und Activity-Logs der Alt-APIs | -| `newsletter/` | Bounce-Adressliste für `newsletter:import-bounces` | -| `2026-10/laravel.log` | Produktions-Log vom 08.10.2026 (Fehler in v1.6.1 behoben) | diff --git a/dev/archive/commit-map-2026-10-09.txt b/dev/archive/commit-map-2026-10-09.txt new file mode 100644 index 00000000..44e8d5ec --- /dev/null +++ b/dev/archive/commit-map-2026-10-09.txt @@ -0,0 +1,510 @@ +# Commit-Hashes vor und nach der Historienbereinigung vom 09.10.2026 +# +# Die Produktiv-SQL-Dumps (dev/migration 2026/sql) wurden aus allen Commits +# entfernt; Inhalt und Reihenfolge sind sonst unverändert, die Hashes sind neu. +# Verweise in der Doku und in Commit-Nachrichten nennen die alten Hashes. +# Spalten: alt neu Betreff (chronologisch) + +5b8bdf4 313270b 12-05-2026 Frontend dev +092ee0e 8bfa378 13-05-2026 Frontend DEV + HUB +0a3e52d 36810ac 19-05-2026 Rebrand Pressekonto, Hub-Flux UI und Legacy-Media-Migration +9b47296 9844b41 Rebrand Hub+Flux +d2ba22c 36c6499 create PM v0.5 +e8c47b7 fd1f6bd 22-05-2026 Optimierung der User und Admin Panels +4bb9094 a8d1228 29-05-2026 Optimierungen Fixes am Code +0efabaf ba0ee12 Multi-Domain-Asset-Infrastruktur: geteilte Vite-Konfiguration und DomainAssetContext +a000238 48993f5 User Panel: Phase-8-Abschluss, Titelbild/Lizenzen/Zeitzonen und KI-Pruef-Pipeline +8d8d957 b2b5ff0 Doku: Status-Sync 11./12.06., Decision-Update Preisstruktur und Phase-9-Plan +4419d9f 6b0ca3f Phase 9 Block 1: Gelb-Routing Direkt-Live, Slot-Verbrauch bei Veroeffentlichung, Submit-Gate +d548f4b d2501ca Phase 9D: Tarif-Datenmodell, Cashier und hybride Rechnungskreise STR-/MAN- +1cd4d8e 9f610f4 P6.6: legacy:grandfather-subscriptions — aktive Legacy-Abos aus dem Rechnungsarchiv migrieren +894a943 808d94f USt-Behandlung: Netto-Preise, VatResolver und Steuer-Ausweis im MAN-Kreis +62e6b7e a9dd565 Doku: zentrale Billing-Referenz und Status-Sync Phase 9D +38fab64 b804dba Phase 9E (Backbone): Stripe-Produkt-Sync und Webhook-Verarbeitung mit STR-Spiegelung +c8dc99c ed99ee2 Phase 9E (Abschluss): Checkout-Flows und Plan-Kontingent statt Quota-Stub +23ac8bc 7818c57 Phase 9F: Tarif-Seite mit Stripe-Checkout und Billing Portal +6a82e2a 5555be4 Buchungs-Seite: Feinschliff nach Review +8f3261d 840cc0d Checkout: Stripe-Tax-Adressanforderung erfüllen +bda755f c5907da Admin-Zahlungsmodul: Zahlungs-Übersicht + Tarif-Verwaltung mit Stripe-Sync +036a534 b126254 Responsive-Härtung: Seiten-Header, Kontextleiste, Stat-Cards +afcca34 d07b138 User-Panel-Restarbeiten: PM-Guard, Profil-Rework, USt-ID-Prüfung, Buchungspflicht-Adresse +b714551 6ba260e Profil-Feinschliff: Pflicht-Badges, Fokus-Fix, Submit-Modal auf Switches +5a8da0c ad75886 PM-Vorschau: Workflow oben + farbig, Metadaten, saubere Inhalts-Typografie +25ea91d 1f31e10 Verlinkung & Backlinks: systemseitige rel-Auszeichnung (Decision-Update 11.06.) +a7c30d4 a193097 Titelbild-Upload: Bildrechte in 5 Schritten + große Bildvorschau +6e0b2b1 5ca76c7 Titelbild: Bildnachweis als Pflichtfeld, Lizenzdetail-Reset bei Typwechsel +cc7b3c3 ced39dd KI-generierte Bilder: eigener Lizenztyp, Anbieter-Bestätigung, Kennzeichnung +284d029 b52751f PM-Vorschau: Firma & Pressekontakt zusammengeführt, Sprache als Badge am Portal +970b490 4052225 PM-Vorschau: Firmen-Kachel im Stil der Firmenübersicht +ad74133 234772b Doku-Abschluss 12.06.: README-Stand, weiteres/-Index, Next Steps (Phase-2/Magic-Link, Duplicate-Content) +ec4aa1d ce5d6c9 Detailplan Umsetzungsphase: Launch-Slice aus Decision-Updates + Merkliste +c804f3b e54f6e2 WS-1: Canonical- & OpenGraph-Meta zentral im Web-Layout +94cb209 f06650a WS-6: E-Mail-Verifizierung, Auth-Flow-Fixes & Legacy-Rollen-Sicherheitsfix +980763c c6b2b67 WS-2: Firmen-Scope für PMs & Magic-Link-Zugang für Pressekontakte +84f7eb3 55d974f Doku: Sicherheits- & Deployment-Hinweise (Auth, Rollen, Verifizierung) +d98d297 f28b698 Security-Härtung Login & Magic-Link (Review 16.06.) +f4ca452 512057c Security: 2FA-Bypass beheben & Login-Pfade konsolidieren +ae79d5b 42b4288 Security: JSON-Login durchläuft die is_active-/Verifizierungschecks +068a5a4 265d1fd WS-6: Google-Login via Laravel Socialite +6c6b9e0 fec2148 WS-2: Magic-Link für Firmen & Pressekontakte vereinheitlicht + Schreibzugriff +fe10adb 46d7ae3 WS-6: Google-Redirect-URI klargestellt (Portal-Domain, .de) + lokaler Testhinweis +2a62204 6431139 WS-6: Google-Redirect-URI auf Live-Domain pressekonto.com korrigiert +95007da 9bce9af WS-3: Recht & Compliance – Rechts-Kern (DSGVO/Persönlichkeitsrecht/Melden + Queue) +6668f49 eaae1e6 WS-3 abgeschlossen dokumentiert: B abgedeckt, A nach Phase 2 verschoben +be7d179 f87c470 WS-4: Bestandsschutz-Abrechnung – gekoppelte Kündigung + Admin-Sichtbarkeit +afefa86 c82c237 WS-4: Bestandsschutz im Kundenbereich als echtes Paket darstellen +a054720 57afcab WS-5: Buchungs-Gate launch-ready – proaktiver Dashboard-Hinweis +253141c 3a1d2e6 Frontend: Editorial-Relaunch der öffentlichen Strecke + Ausgaben-Routing +a2ff47e 7dbc238 WS-7: Live-Deployment-Checkliste + WS-6/WS-7 als erledigt dokumentiert +5a9aab7 97d69a1 Migration: PM-Datum korrekt übernehmen, UUID stabil, Zwei-Phasen-Runbook +b63cd26 1306849 Credit-Wallet + Ledger + Tier-Preisableitung (Fundament) +3e88442 460a255 Pruefzaehler + Pruefkontingent (Decision-Update Phase-2 vorgezogen) +c7a4c8b 0ff874e Boost-Geschaeftslogik (Decision-Update 2.2) +69411b4 c89589b Proof-PDF + Extra-PM-Verkauf ueber die Credit-Wallet (Decision-Update 2.1/2.3) +344aac0 bd7022f Wallet-Topup ueber Stripe (Credit-Pakete mit Bonus-Staffel) +77a4476 31bef7a UI: Credit-Wallet-Hub + Per-PM Add-ons im Backend-Pressekonto +3c61900 dac8fe0 UI-Feinschliff Buchungen: Tarife oben, Credits darunter, Preisliste, USt.-Modal +44b6761 2c41711 Veroeffentlichungs-Gate: proaktive Buchungs-Meldung + Schalter test-stabil +764d56e 7822929 Fix: kein Datenverlust beim 'Buchung auswaehlen' aus dem Submit-Modal +dd5a937 6a7483e Doku: Credit-Oekonomie in WS-7-Checkliste + Umsetzungsstand im Decision-Update +82abdf6 0618080 Doku: Umsetzungsstand der Credit-Oekonomie im Decision-Update +028b059 326ff9b Editorial-Frontend: oeffentliche Unterseiten, Preise & Linkpflege +5feaa8a 624fca6 Zeitzone Europe/Berlin: unnoetige UTC-Konvertierung entfernt +e962cc2 bcac326 Fix: Umbrueche bleiben beim Bearbeiten von Legacy-PMs erhalten +af99189 4ab7460 Status-Widget: immer verfuegbarer Buchungsueberblick in der Topbar +c43ef6a 7de0db3 Status-Widget: kompakte Topbar statt hoher Header-Leiste +3da3353 1ff1cc3 WS-8: N+1 entschaerfen und PM-Zugriffsmuster konsolidieren +1c5eede 1aa4391 WS-8: doppelte Logik konsolidieren (Tags, Kontakt-Query, Billing) +58b427f 7d03ded i18n: Default-Locale auf Deutsch umstellen (Basis fuer EN-Umschaltung) +446aada e96a118 Paket-Vorteile: dynamische, im Admin pflegbare Vorteilsliste je Tarif +474153a f6a8143 Preise-Seite: dynamische Tarif-Vorteile aus dem Plan anzeigen +1ac5bad 052b214 i18n: Auth-Views vollstaendig uebersetzbar machen (Readiness) +39f0af7 6cb7b79 Doku: Launch-Vorbereitung 18.06. (Status-Widget, WS-8, i18n, Paket-Vorteile) +a82964d c7bd940 Optimierung Phase 0: Korrektheit & Security +a5f3ddd 554a731 Optimierung Phase 1: Aufraeumen / toter Code +6cc4c2c 0344ac2 Optimierung 2.1: Admin-PM-Editoren nutzen Tags-Trait +26d5f1a 64349ce Optimierung 2.2: InteractsWithPressReleaseScheduling-Trait +1ee6710 fa995e3 Optimierung 2.3: formRules() via ProvidesPressReleaseFormRules +5ed60c1 b41d34e Optimierung 2.4: Kanonische Pre-Submit-Checkliste +64b16cd 8c53146 Optimierung 2.5: Kontakt-Helfer + tagSuggestionsFor zentralisiert +5d6a949 83d2ee6 Optimierung 2.6: reprocessAfterContentChange im PressReleaseService +28e9064 86ba6c1 Optimierung 2.7: Company::scopeSearchByTerm fuer die Admin-Combobox +af86a16 3a18a2b Optimierung 2.9: HandlesAdminPressReleaseActions::findAdminPR() +a3b069e 153bac7 Optimierung 2.8: Blade-Component +82455c3 6a1240b Doku: Phase 2 im Entwicklungsplan als abgeschlossen markiert +9ddfab6 dba7691 Optimierung 3.1: Company::scopeAccessibleBy() zentralisiert Firmenzugriff +2bf431c 4fc46b0 Optimierung 3.2: API-PR-Ownership-Scope + zentrale Eager-Loads +f2c349a 9a93903 Optimierung 3.3: totes SetDomainUrl entfernt +9ed429f 31d407d Optimierung 3.4: Performance (Logging terminable, Single-Purchase memoisiert) +4466858 b255d90 Optimierung 3.5: Kleinere Zentralisierungen (VAT, findByEmail, Waehrung, Provisioning) +0d0edf1 31e01e4 Optimierung 3.6: Zugriffs-Gates und getrennte Impersonation-Sperre +6961cac 4c80b93 Doku: Phase 3 im Entwicklungsplan abgeschlossen markiert (3.1-3.3 nachgezogen) +f20a95f 987a5a2 Optimierung 4.2: Published-Release-Query ueber PressRelease-Scopes zentralisiert +714a5cd e5a63bc Optimierung 4.1: Web-Portal-/Domain-Kontext extrahiert +3f68052 7625ec7 Optimierung 4.3/4.4 (Preise): Page-Data-Service + Invokable Controller +01f3f7f 418a2bc Optimierung 4.3/4.4 (Suche): Page-Data-Service + Invokable Controller +debcf81 fef6bbc Optimierung 4.3/4.4 (Veroeffentlichen): Page-Data-Service + Invokable Controller +e36f917 a2179ea Optimierung 4.3/4.4 (Newsrooms): Page-Data-Service + Invokable Controller +f17e9a9 179dd8e Optimierung 4.3/4.4 (Newsroom-Detail): Page-Data-Service + Invokable Controller +e19a209 ee74126 Optimierung 4.3/4.4 (Kategorie): Page-Data-Service + Invokable Controller +f3aa27d e879a38 Optimierung 4.3/4.4 (Release-Detail): Page-Data-Service + Invokable Controller +241d67c 43c83ca Optimierung 4.3/4.4 (Home): Page-Data-Service + Invokable Controller +b0353ab 8e0aeda Doku: Phase 4 im Entwicklungsplan abgeschlossen markiert (4.1-4.4) +54bab7e a8958c1 Optimierung 5.1: Tabellen-Concerns (Sortierung, Volltext-Heuristik, Stats) +6bf6a09 89842ac Optimierung 5.2 (Teil 1): ProvidesUserFormRules-Concern +178adb0 69395ef Optimierung 5.3 (Teil 1): Contact::displayName() +abe9a0a 4067911 Optimierung 5.3 (Teil 2): Category::localizedName() +8141fe8 dc68404 Doku: Phase-5.3-Fortschritt (displayName/localizedName erledigt, Rest UI-lastig) +dc4e397 63071a0 Doku: Stand & Wiedereinstieg-Abschnitt im Entwicklungsplan +be1284d 055fd5c Optimierung 5.3: toten portalBadgeColor()-Helfer entfernt +1a30b13 c16b0b7 Doku: portalBadgeColor()-Klaerung im Plan vermerkt (toter Code entfernt) +38884a5 ed1aa07 Perf-Fix: User::accessibleCompanyIds() hydratisiert keine Company-Models mehr +6a406bf 07d98ed Perf: accessibleBy() nutzt company_id-Subquery statt materialisiertem whereIn +7d6b97f 580c918 Perf: Status-Counts der PM-Uebersicht via UNION statt OR-GROUP-BY +6d4965a 83bb2a7 5.4 (Teil 1): + categories/create umgestellt +d2d88ed af15e84 5.4 (Teil 2): page-header in categories/* + companies/create,edit umgestellt +0087489 f3a9c42 Fix: fehlendes .search-wrap-Styling (Suchfeld in /admin/me/firmen unsichtbar) +0c373f5 2a3b561 5.4 (Teil 3): page-header in users/* + contacts/* umgestellt +b9811b7 1eb2243 5.4 (Teil 4): page-header size=lg-Variante + press-releases/* + companies/index +25a4095 27a77bf 5.4 (Teil 5): page-header in roles/* + footer-codes/* + presets/* +8e90eb2 feda8be 5.4 (Teil 6): page-header in payments/invoices/legal/coupons/reports/newsletter +ed396eb 077d313 5.4: + admin/press-releases/index umgestellt +8690425 1c75e61 5.4: empty-state auf customer/press-releases + customer/press-kits ausgerollt +9ee77c8 505852f 5.4: + 13 Wrapper ersetzt +c829624 587d1fd 5.5: + 6 Flash-Bloecke umgestellt +fc91f29 b1b832d 5.5: + 4 Auth-Seiten umgestellt +2b9d1b6 6b1d84f Doku: 5.4 abgeschlossen + 5.5 Teil-Stand im Entwicklungsplan +9e6f775 1729e35 5.2: gemeinsamen Firmen-Sync-Kern als User::syncCompaniesWithRoles() gezogen +dbbf8a4 9fadfe6 5.5: + 6 Auth-Passwortfelder umgestellt +7c5518d 1503d3a Fix: rollenlose aktive Nutzer -> Backfill-Command + Import-Nachlauf +6523a13 0e08d8a 5.5: Auth-Components abgeschlossen (funktional gegengetestet) + Plan-Stand +dd16bed 55d0804 5.3: PressReleaseStatus::badgeClass() zentralisiert + toten statusColor-Code entfernt +7803a12 349991a 5.2: User-Formular-Feldraster in Blade-Components (role/billing) extrahiert +a25355e 90f3245 Plan: Phase 5 vollstaendig abgeschlossen (5.2/5.3/5.5 auf erledigt) +17b586f db7c1df Perf: customer press-releases-Liste ueber UNION statt OR-Paginate +26586d4 1a612e0 R0.1: tote Dev-Varianten-Routen entfernt (fehlende Views -> 500 auf BP24) +fc7213e cb2fe97 Plan: Release-Entwicklungsplan (R0-R6) aus Vier-Achsen-Analyse konsolidiert +f02adf1 a4184af R0.2: gdpr_consent_at bei allen Registrierungspfaden befuellen (DSGVO) +c678e3a f9e3c64 R0.3: Newsletter-Sync-Binding config-aware + ehrliche Test-Sync-Meldung +b64aa9f 17eaa80 R0.4: Seeder produktionssicher (PlanSeeder, keine Fake-Stripe-IDs, Dev-User-Guard) +8653abd c3db80c R0.5: eigene Fehlerseiten 403/404/419/500/503 (self-contained, domain-aware) +c9641e9 ad2879d R1.1: Buchungs-Gate geprueft + safe-by-default; Legacy-Buchungspfade festgeschrieben +f762c5b 54a2e64 R1.3: Quota-Reset als fester Bestandteil des Tarif-Modells festgeschrieben +36e1907 1e9c2f9 Plan: R0 komplett + R1.1/R1.3 erledigt +229ac11 a4d054b R2.1: Kontaktformular-Backend (Controller + Mailable + Brand-Empfaenger) +a4ae82c 4e4aff1 Fix: legal-request-Honeypot nickt Bots wieder still ab +e90bb3c 9875e7b R2.1 (Web): Kontaktformular auf der Kontakt-Seite aktiviert +d1f32e0 5226f5d Plan: R2.1 erledigt + naechste Schritte notiert +66190f2 f6edb4a R2.2: HubPageData - Plan-Katalog + echte Plattform-Kennzahlen fuer die Hub-Landing +bf81709 8d4b3b5 R2.2/R2.3 (Web): Hub-Landing live-faehig - datengetriebene Tarife, ehrliche Inhalte +1417753 38d7cca Plan: R2.2/R2.3 erledigt (Hub-Ueberarbeitung + Plan-Katalog-Pipeline verifiziert) +0acccee 47d03ec Hub (Web): Auth-aware CTAs, Kontakt-Modal statt Mailto, Pruefung-Wording +603ca73 88d6935 Kontakt: Hub-Domain-Anfragen gehen an die pressekonto-Brand-Adresse +268332c 515e249 Recht (Web): Vertrag-widerrufen-Button + zweistufiges Widerrufs-Modal im Hub +4ea3bae 8c0bf00 Recht: Online-Widerruf ohne Login (gesetzlicher Widerrufsbutton) - Backend +e852416 8001280 Plan: Online-Widerruf (R3.0) erledigt + Follow-ups notiert +6621b03 d6461f5 Admin: Widerrufe laufen in der Recht-&-Compliance-Queue auf +c7450da 258502b Hub (Web): statische Seiten (Rechtstexte, API, FAQ ...) rendern das Hub-Geruest +981be2f 239ec57 Plan: Rechtstexte-Architektur referenziert + Hub-Geruest-Vorarbeit notiert +8b8f299 1c3a52a Recht: Kuendigungsbutton nach Par. 312k BGB - Backend + Admin-Queue +6b2356e 52bc534 Recht (Web): Vertraege-hier-kuendigen-Button + Bestaetigungsseite im Hub +244c2ab 20d5398 Recht: Erloeschensklausel-Checkbox im Publikationsflow (Par. 356 BGB) +a6c3aa6 b855cbf Plan: Kuendigungsbutton (R3.0b) + Erloeschens-Checkbox (R3.0c) erledigt +c2d22c6 e9643e6 SEO: host-aware sitemap.xml + dynamische robots.txt je Domain +dd09663 6e5d67c Web: Marketing-Seiten brand-aware (Titel/Meta) statt 'Business Portal 24' +2850d0f 7494f19 Plan: R2.4 SEO-Basics erledigt (Sitemap, robots, Meta) +e4d154c f5bf282 Deploy: .env.example vervollstaendigt + Deploy-Runbook (R5.1/R5.2) +770fda7 2d1c7aa Web (R4): tote Alt-Frontend-Fragmente entfernt +7d2a312 d34088e Web (R3.2): Marketing-Platzhalterseiten zurueckgebaut +03b644e 5537041 Plan: R4.1/R4.2 Aufraeumen + R3.2 Rueckbau erledigt +46f1829 acb2a19 Doku (R6.6): veraltete migration-2026-Dokus mit Verweis-Banner versehen +5c2ef28 89550da Security (R6.2): Haertung nach Audit +27c92d5 f46795b Plan: R6.2 Security-Review + R6.6 Doku-Sync erledigt +b36ecf7 9c9f7f7 Hub-Inhalte: Claims korrigiert + Widerrufs-UI zurueckgebaut (B2B-only, E2) +ca777f2 73fc382 Web-Inhalte auf echten Funktionsstand: FAQ, Hilfe, Veroeffentlichen +136ecc8 0645d1d R3.2: Kontakt-/Ueber-uns-Routen zurueckgebaut, Spoke-Footer bereinigt +43f563c f3a95c8 API-Doku: echte Referenz statt Fantasie-Features +c195878 d577ff5 R3.1: Rechtstexte eingebaut — Impressum, AGB v0.6, Richtlinien, Meldeverfahren +28b5980 545eb52 Preise nach Leistungsbeschreibung v0.2: B2B-Satz, Credit-Anker, Regeln +110f97d fc13038 T2neu: Archiv-Hinweis vor Submit ersetzt Erloeschens-Checkbox (B2B, E2) +e2758ff efe7f86 Plan: Hub-Inhalts-Audit + Rechtstexte-Einbau dokumentiert (E2 B2B-only) +6438444 99ab47b Datenschutzerklaerung v0.3 eingebaut, Cookie-Seite zurueckgebaut +6f9a68b 8916bcc T1neu: Unternehmer-Pflicht-Checkbox im Checkout, protokolliert mit AGB-Version +1e15042 f0cd11a Plan: Datenschutz v0.3 + Cookie-Rueckbau + T1neu in R3.1 dokumentiert +c523224 9832869 System-Mails im pressekonto-CI: zentrales E-Mail-Layout fuer alle Transaktionsmails +14b1822 9d3eef6 Plan: Tagesabschluss 03.07. dokumentiert (Rechtstexte komplett, T1neu, Mail-CI) +4f07104 43397ad Zentrale Rechts-E-Mail info@pressekonto.com fuer alle Rechtstexte +b90e59a 3940d46 Umami-Webanalyse eingebaut, bis zum Go-Live deaktiviert +7624064 dc2b2b0 Plan: Klaerungsliste Rechtstexte komplett beantwortet (06.07.) +196f83a 7510e76 E3: Rechtstext-Versionierung in der DB (legal_documents) +c54c694 0bec71f Ablehnungskategorien live aus der DB (rejection_categories) +5337a14 61a677a T13: Melde-Links sichtbar unter jeder Pressemitteilung +979e6b1 2a9be7a T10: DSA-Meldeformulare mit URL-Feld, Vorgangsnummer und Eingangsbestaetigung +cc77e60 198be38 T12: Depublikations-Checkout mit Tombstone (config-gated) +361560f fac15f7 Plan: R3.1 komplett — Rechtstexte-System fertig (Suite: 956 gruen) +9a9e313 90fd171 Depublikations-Preis festgelegt: 35 Euro netto (O6, User 06.07.) +d0ffe66 d754ef4 QA-Luecke geschlossen: Legacy-Medien-URLs redirecten wieder (301) +6ef4a0d 73f414e R6.1: QA-Checkliste erstellt, Vorpruefung abgeschlossen +3364fd1 3cd7395 Fix: Bestandsschutz ohne explizites Vertragsende zaehlte nie als aktiv +616b784 91992ac Uebernahme bestehender Legacy-API-Integrationen (Keys, Auth, Pfade) +5200686 387d41a Plan + QA-Checkliste: Legacy-Fixes vom 06.07. dokumentiert +5d199f0 3320aaa Rechnungsadressen der Bestandskunden aus dem Legacy-Archiv uebernehmen +b3474a3 bfad13a Spoke-Frontend-Audit: Fake-Inhalte raus, Newsletter-Rueckbau, echte Boersendaten, EN-Lokalisierung +b53af92 2c7b556 Produktiv-SQL-Dumps enttrackt (Security-Review-Befund R6.2) +8f90e6f 339ae5d Plan: Adress-Import, Key-Import-Verifikation und Git-Hygiene 06.07. dokumentiert +08b49a2 1904ea5 Platzhalter-Eintraege ("spaeter") aus der Panel-Seitennavigation entfernt +9ff0a6c b7bbf6d Panel-Navigation: Buchungen zu Finanzen, neue Gruppe Portale +62fbafa 15387d0 QA-Befunde A4: 2FA-Bestätigungsschritt + sicherer E-Mail-Wechsel +af9f238 b42e0e3 2FA-Challenge: Fehlversuch crasht nicht mehr (Route two-factor.login fehlt) +e7d5d58 4fe0882 QA-Checkliste: A1-A4 manuell abgenommen (07.07., inkl. 2FA-Fixes) +fa4bc06 d1c9763 Buchungs-Modal: Dark-Mode-lesbare Preistabelle + aufgeraeumtes Layout +4b7403b 54213ca Stripe Checkout: automatic_tax aktiviert (USt fehlte in der Session) +4cda4d3 2a8fd01 STR-Spiegelung: USt aus total_taxes lesen (Stripe-API ohne tax-Feld) +7e571ee 5166fc7 Rechnungsseite: neue STR/MAN-Rechnungen gelistet, STR bei Stripe verlinkt +6eedaa4 304c581 Checkout: Profil-Rechnungsadresse als Stripe-Rechnungsempfaenger +256aca6 af15660 Checkout: Wallet-Daten duerfen Profil-Rechnungsadresse nicht ueberschreiben +9e76e24 b3780e0 Tarifwechsel im Buchungs-Modal: Abo-Swap mit anteiliger Verrechnung +9a95a69 db65c2e Suche: Volltext-Index + Fix fuer doppelte Alpine-Instanz +090a893 14994e4 PM-Vorschau: echtes Portal-Design, Direkt-Button und Portal-Switch +4b7f6d3 388ca0e Downgrade-Vorkehrungen: Kontingent-Sperre beim Tarifwechsel, Gutschriften nicht spiegeln +ef2b4fe 80e04e2 Downgrades ohne Gutschrift: Tarifwechsel nach unten erst zum Periodenende +c040f39 c4ccc75 Rechnungs-Seite: Archiv-Filter entfernt, Altsystem-Archiv nur für Bestandskunden +fcfbbd4 acd241b PM-Editor: Ablehnungsbegründung direkt auf der Bearbeiten-Seite anzeigen +2a46aed 0f8f0b2 Einreichen-Modal: Panel-Struktur und fixierter Kontingent-Badge +dfb8de9 9600a4f Add-ons: Modal statt Toast bei fehlendem Credit-Guthaben +a21d635 d7f17bb PM-Detailseite: Depublikations-Sektion ans Seitenende verschoben +46ce2c1 930760a single_purchases: type-ENUM um depublication erweitern +9b55e11 28de92e PM-Detailseite: Direktlinks zur öffentlichen Seite je Portal +1ef1e13 881a583 Depublikation: abgebrochener Checkout blockiert nicht mehr +30c407f e457e7a Profilfeld users.agency_name für Übermittler-Attribution +621fc05 402fa4a legacy:migrate-agency-names: Agentur-Namen → users.agency_name +365971a a62a5ee PM-Detailseite: Attributions-Zeile Urheber/Übermittler +56fe5ea 85fddbf Attribution: Übermittler aus users.agency_name statt Agentur-Firma +0b3c6cc 59ac67a companies:retire-agency-type: Firmen-Typ „Agentur" abschaffen +26ce254 3ff95bc UI: Agentur-Angaben im Profil, Firmen-Typ-Auswahl entfernt +c1382ce d57f6b5 Agentur-Attribution: Plan abgehakt, Abnahme-Status 08.07. dokumentiert +723d51c f6882b6 Depublikation: Kauf als eingelöst markieren, Rechnung & Bestätigungs-Mail +f8e8f3e fe8bd2b Buchungsseite: Verlauf mit Kauftyp, Erfolgsmeldungen grün +6c4fd0c 3297179 USt-ID vor jeder Buchung per eVatR gegenprüfen, Stripe-Tax-IDs abgleichen +1822dcb 74e82eb Form-Hooks: Fehl-Scroll aufs erste Feld bei Live-Validation behoben +c387048 807fbc1 KI-Kennzeichnung (Art. 50 KI-VO): Pflicht-Deklaration für Text & Bilder +2882bc4 f11e8aa PM-Editor UX: Kategorie in die Schreibfläche, Bild-Upload als Modal-Flow +75d7baa a254bbd Depublikation: Credit-Preis auf 35 (O6), Preis-Tests nachgezogen +c2ec18b ac870a4 Buchungsseite: Buchungs- und Verlaengerungsdatum des Abos aus Stripe +dc65cfc 07e0bc5 API-Doku: OpenAPI-Spec aus public/ statt geloeschtem docs/ ausliefern +1ad2e54 6984846 Monitoring (R5.3): Betriebs-Alerts fuer Scheduler-/Queue-Ausfaelle +ef5de54 c6b5ec8 Release-Doku: Stand 09.07. nachgezogen; Runbook FULLTEXT-Fenster + Monitoring +72e6a3c fd8e050 Backend-WIP: Kontakt-Queue, Page-Cache, Validierungs-Feedback, i18n +79658bd d1939f6 Web-Frontend: Umbau Spokes/Hub, Kontakt-Widget (contact-launcher) +80a37f8 60d0d9b Release-Doku: Commit-Session vermerkt + Wiedereinstieg fuer morgen +644f860 8f59704 PM-Tracking: Ereignis-Log fuer Aufrufe + Shares (press_release_events) +34ec14d 34f0e0f Web-Frontend: Aufrufe-Anzeige + Share-Tracking auf der PM-Detailseite +2ef41a4 0603fe5 R2.5: legal-request-Hinweistexte final (Wortlaut aus Meldeverfahren v0.1) +bb6a0a0 460e092 QA-Checkliste B-G vertieft (Nachpruefung 10.07.) +56ea3d0 459b339 Dev-Stack: Queue-Worker lauscht auch auf der classification-Queue +813cbd2 01e175e R4.3: Karten-Metadaten-Logik als PressRelease-Praesentations-Helper +9b2409e 3843e53 Web-Frontend: Kartenkomponenten auf PressRelease-Helper umgestellt (R4.3) +5c91e2e 92af015 API: KI-Deklaration als v1-Pflichtfeld, Legacy-Default fuer /service (Entscheidung 10.07.) +c778e41 b185985 Web-Frontend: /api-Doku mit KI-Deklarationsfeldern (curl-Beispiele + Hinweis) +fef4573 5a35242 API-Legacy-Paritaet: Arbeitsdokument mit Alt-Vertrag, Log-Auswertung, Schrittplan +a3fd361 6a45ebf Legacy-API-Paritaet S1+S2: connektar-Flow verhaltensgleich + KI-Schalter +2820385 d9f25ae S4: legacy:seed-api-testdata — API-Testkunde nach connektar-Muster +00f67c4 7a573ca Mail-Routing: API-Einlieferung ueber Status-Log-Quelle erkennen +de532fe 9cb53b1 API: nicht-numerische Routen-IDs als 404 statt TypeError/500 +3ae57d9 b26dc90 Admin-PM-Liste: KI-Pruefungs-Modal + geschaerfte KI-Prompts +c883656 93d7f6d Add-ons: Kaufbestaetigung vor Credit-Abbuchung + deutlichere Buttons +dc2a344 0cda194 KI-Kennzeichnung: 2 Optionen im Submit-Modal + Labels auf Detailseite +744e87d 0665553 Werbeplaetze reaktiviert: Eigenwerbe-Slots oeffnen das Kontakt-Widget +bbcdc72 df6b245 Web: Boost-Platzierung auf Start- und Branchenseite ausspielen +927523c 47c1cac PM-Liste: Hinweis auf laufende Boost-Platzierung unter dem Status +06d80b2 484e062 KI-Klassifikation: Substanzpruefung gegen Gruen-Durchrutscher +51da374 d5b8064 E-Mail-Praeferenzen: Opt-out je Mail-Typ + One-Click-Unsubscribe ohne Login +6e1267f cc61bf2 Add-on-Modal: Pflicht-Schalter + Verlaengerungs-Hinweis bei laufendem Boost +9d6ef50 6be387c Boost-Buchung invalidiert gecachte Start- und Branchenseiten sofort +b1be14e 0677728 Doku: Boost-Platzierung offene Punkte (Hero-Slider, Boost-Begrenzung) fuer Montag +4853d48 0474d22 Boost-Slot-Grenzen (5/3) + Kategorie-Boost zum halben Satz +7a32c66 6796fa4 Preise-Seite: zwei Boost-Stufen inkl. Slot-Hinweis in der Leistungsnote +d92e0f6 842d6a2 Doku: Boost-Platzierung entschieden + umgesetzt (Slot-Grenzen, Kategorie-Boost) +92d1ac2 0cddf5f Add-on-Panel zeigt freie Boost-Plaetze je Stufe +8657311 4f2be1e PM-Uebersicht: Rubrik unter Portal, Boost-moeglich-Hinweis, gruener Haken +7b3a4d7 6f96e4a PM-Detailseite: Inhaltspruefung (Gruen/Gelb/Rot) + Qualitaets-Score sichtbar +b3fdd6f 3295f47 deps: Sicherheits-Updates (Framework/Symfony/Guzzle) einspielen (H6) +7043ea8 aae4569 billing: Nebenläufigkeit & Idempotenz härten (H4, Stripe, Boost-Slots) +0b35c3b 6e84266 press-releases: Publish-Rechte, Quota-Races & Slug vereinheitlichen +000ae93 6250b0b media: PM-Medien privat ausliefern + Vorschau-Signatur (M4, M5, Fix#4/#5) +299837d 39e13d6 security: Host-Whitelist & Legacy-API-Key-Übergabe härten (H5, M11) +4078319 77f8f9c security: Rechteausweitung schließen & Admin-Panel feingranular gaten (K1, H1, H2, M8) +6764fb9 8f517e9 security: Stored-XSS über page_url im Kontaktformular schließen (H3) +ea8d017 fe1525b auth/mail: Magic-Link-2FA (M1) + Mailversand über die Queue +1afcc36 5a49292 newsletter: Bestätigung/Ownership beim Re-Abo korrigieren (M7) +22975e7 23cbd0b performance: Caching, deferred Tracking & externe Timeouts (H7, M12, M13) +573e4ca 830aca5 admin: Betriebsüberwachung im Backend (Queue-Worker & Deployment-Checks) +198ce15 e51fe6f chore: persönliche VS-Code-Workspace-Datei aus dem Repo entfernen +6f6cb13 74f71f7 docs: Audit-Protokoll, KI-Kennzeichnung & Release-Notizen +a546378 700f5e6 dashboard/errors: Onboarding-Card „Erste Schritte" & Hub-Styling der Fehlerseiten +244b7ba ce59cbb auth: Selbst-Registrierungen nicht mehr als Legacy-Bestand einstufen +8a695fd 0b01929 profil: Speichern-Buttons für Persönliche Daten und Konto & Sicherheit +4cc74c2 67f6906 billing: Stripe-Webhook von der Basic-Auth ausnehmen +ff2eee0 425467b billing: asynchrone Zahlarten (PayPal, SEPA) korrekt erfüllen +71b247b e32431e billing: Zahlungsbestätigung per Mail nach jeder Buchung +f1dcb9c 37bcf73 billing: Blindkopie der Zahlungsbestätigung an LEGAL_CONTACT_EMAIL +5585a26 a574898 billing: Stripe-Belege auf Deutsch und sprechende Produktnamen +991af42 3a11963 admin: Aktivitäts-Verlauf unter Reports ▸ Verlauf +7c252ab a3671ba emails: Portal-Wortmarken im Mail-Header ergänzen +47f224f 3e85537 web: Kategorie-Badge im Feed bricht auf Mobile sauber um +6253b36 9c67fc6 docs: Cutover-Runbook für den Go-Live (Legacy-Import & Umschaltung) +c70e175 dec5249 web: Responsive-/Mobile-Fixes fürs öffentliche Frontend +379688f 2ea64ad web: Strukturierte Daten (JSON-LD) und SEO-Metas fürs öffentliche Frontend +b8e2735 07d89a0 web: Preise-Seite zeigt unter Weitere Leistungen nur noch Depublizieren +50d9208 a130299 billing: Veröffentlichungsnachweis mit Titelbild, Bildrechten und Rich-Text +4c73ba0 3151b1f legacy: privatize-media überspringt unmigrierte Legacy-Bildzeilen, --prune-missing löscht sie +2765afe 7971656 legacy: fix-timestamps liest Legacy-Schema-Namen aus der DB-Config statt hartkodiert +3842fbc 9be4731 billing: Abo-Kündigungen aus dem Stripe-Portal im Aktivitäts-Verlauf +263f030 22b7bd3 docs: Runbooks auf den echten Migrationsstand nachgezogen (16.07.) +4668cfc a0c2e66 legacy: --since-Delta für legacy:import + Importer setzen Timestamps wieder korrekt +c8a292e d212230 docs: Cutover-Delta nutzt --since, Medien-Delta-Hinweis +622cd4e 5011f28 legacy: API-Key-Import löst E-Mail-gemergte User über legacy_import_map auf +da189c0 bd4ad85 web: Stale-while-revalidate-Cache für die öffentlichen Seitendaten +6fcc825 3d10cbf web: Startseiten-Feed cachen + Index gegen Filesort der Feed-Query +e69ded4 acf6721 web: www-Hosts lösen aufs Apex-Domain-Theme auf statt aufs Portal-Fallback +fcf8304 42e56a7 web: www-Hosts leiten kanonisch per 301 auf die Apex-Domain +3d1bf38 58c773b web: Domain-spezifische Favicons und App-Icons für alle drei Marken (R5.4) +665c94f 6a4c4d8 docs: dev-Doku für den Live-Betrieb neu sortiert — Archiv + Betrieb + Roadmap +8aba835 783b9da docs: verschobene Doku-Pfade in Code-Kommentaren nachgezogen +7b27ec5 8743bcb Release: Go-Live Pressekonto (20.07.2026) +99f10e6 fa30336 docs: R6.5 in der Roadmap abgehakt (Merge nach main + Tag v1.0.0) +e59e132 e3ce626 admin: PM-Detailseite verlinkt Firma, Autor und Firmen-Benutzer +33e84af d411e6c admin: Verlauf protokolliert jede versendete E-Mail +f327853 215cbcb admin: internes Newsletter-Modul mit Filtern, Protokoll und Abmeldung +80c5f03 ab0030d web: Mail-Abmeldungen landen im Aktivitäts-Verlauf +3f4679f 37e543e admin: Credits und freie PMs ohne Zahlung gutschreiben +ed458b6 5bf9f84 admin: Verlauf protokolliert den Gang zur Stripe-Zahlung +17e22d2 921c533 admin: Benutzer-Übersicht verlinkt die Detailseite zusätzlich zur Schnellansicht +45dc4ce 9b73972 kunde: PM-Liste zeigt Firmen-Kontext unter der Headline und Bild-Thumbnails +021ee2d 58c0cc3 admin: Newsletter mit Abmelde-Liste, Follow-up-Filtern und gedrosseltem Versand +04b49c5 b4b2e01 recht: Meldeverfahren v2 Phasen 1-4 — Re-Sync-Sperre, Anonymisierung, Magic-Link-Intake, Self-Service-Korrektur +e6eca9c 9afbedd recht: Meldeverfahren v2 Phasen 5+7 — DSGVO-Strukturformular, 10-€-Checkout mit KI-Vorprüfung, Triage & Panel-Modal +8fc18c2 f8728c5 technik: Volltext-Indizes von press_releases in eine eigene Suchtabelle auslagern +d14cb84 6a34ab4 technik: Aufrufe über ein Ereignis-Log zählen statt im Request +2024df9 0c8e94a web: Entfernung mit 410 Gone als Alternative zur Löschung +48d401e 982de2a api: Ziel-Portal einer Einreichung explizit auflösen statt vom Konto erben +49182ec e634af0 newsletter: Unzustellbare Adressen aus beiden Empfängerlisten nehmen +eb1eba4 f6934f5 mail: Anrede an den tatsächlichen Empfänger binden +e746ded e783adc technik: Statische Analyse wieder aussagekräftig machen +8d41669 a85f6ba db: Index auf companies.email +81d9c43 ac4b959 dev: Bestandsaufnahme und Umsetzungsprotokoll zum Code-Durchgang 01.09. +aab2240 c497628 reports: Basiswerte für die Konversionsmessung (Roadmap 0.1 und 0.2) +2391c85 748a0d4 reports: Aufrufe nach Alter aufschlüsseln und Basiswerte festhalten +2691a4d 45f2d90 conversion: Konversionsleiter mit Herkunft auf dem Magic-Link-Token (Block 0) +e536e52 8df6b9e companies: Trockenlauf zur Newsroom-Konsolidierung (Roadmap 1a.1) +5d0570b 7c40a0c companies: Tippfehler und Zusätze im Trockenlauf als dieselbe Firma erkennen +5e46ff9 a0ac32c companies: Adress-Klassifizierung persistieren (Roadmap 1a.2, E1 = 3) +5e5414a c17e4b9 dev: Live-Trockenlauf der Adress-Klassifizierung protokolliert +e2f7cf1 8a1e79a dev: scharfer Klassifizierungslauf auf Live protokolliert +00af8b1 77318dc companies: Aufrufe als Veröffentlichungsnachweis im Altbestand werten +982bd6e 66d8398 api: Token-Gate erkennt aktive Stripe-Abos +8b86b88 2aebb9d companies: Zusammenführung im Bestand, rückabwickelbar (Roadmap 1a.3) +1368e2c f3e7aca dev: Live-Trockenlauf der Zusammenführung protokolliert +202cf34 235c20c companies: Zusammenführungen zum Nachprüfen auflisten +cd16fd1 b91f41d dev: Live-Läufe der Zusammenführung protokolliert +d60f31d 4303266 dev: kompletten Live-Lauf der Zusammenführung protokolliert +8baca9d 8dad652 api: neue Firmen dem bestehenden Newsroom zuordnen (Roadmap 1a.4) +0be476b 0f52e9f dev: Block 1a in der Roadmap als erledigt markiert, 1a.4-Entscheidung festgehalten +abfcd77 a3e0042 newsroom: Seite verschwindet mit der letzten veröffentlichten Meldung (Roadmap 1b.1/1b.5) +9143cc4 0c1c072 newsroom: Verwaltungszugang „Diesen Newsroom verwalten" (Roadmap 1b.2) +0101488 7f714fb newsroom: Hinweis „Diesen Newsroom verwalten“ auf der Seite und in der Mail (Roadmap 1b.4, E4) +079477a a69b021 web: Melden- und Verwaltungsblock auf der Meldungsseite hervorheben +87f95fb 85b039e newsroom: Beschreibung pflegen, durch die Rot-Ebene geprüft (Roadmap 1b.3) +0a658bb 8bf40ee mail: zentrale Bounce-Suppression mit Versand-Gate und Circuit Breaker (Roadmap 1b.6, Schritte 1–2) +e800065 f9c97cc mail: Rückläufer aus dem Bounce-Postfach lesen (Roadmap 1b.6, Schritt 3) +e84c277 e7e12b9 admin: Mail-Sperrliste, Markierung nicht erreichbarer Newsrooms (Roadmap 1b.6, Schritt 4) +71d9639 6e159ec deps: Composer- und npm-Pakete innerhalb der Constraints aktualisiert +fddfd8a 4cefdf7 mail: Bounce-Abruf liest RFC 6533, All-Inkl-Freitext und ganze INBOX +ada41cb f581e1e mail: Kontakterreichbarkeit - Formpruefung, Domainpruefung, Einlieferer-Bericht +36691a5 a00f9dc billing: MAN-Rechnungen fuer Ueberweisungskunden bearbeiten, hold-Altlast bereinigen +09ec866 3ef1b84 customer: Sichtbarkeit belegen - Aufrufe im Verlauf, Newsroom-Uebersicht (Roadmap 1c) +58bc82a 7fb5a2f billing: tote Null-Pruefungen auf NOT-NULL-Spalten entfernt (phpstan) +c08c9e5 5f7fbd0 web: Hilfeseite "Was eine gute Pressemitteilung ausmacht", Hinweis in der Ablehnungsmail (Roadmap 1d.1, 1d.2, 1d.6) +0692d89 13716b9 press-releases: begrenzter Pruefkreislauf mit Admin-Queue (Roadmap 1d.4, E3) +35db30e 9380937 mail: adressbezogene Abmeldung fuer Empfaenger ohne Konto (Roadmap 1d.3) +4fd1db7 4dffb13 press-releases: Mail "wird persoenlich geprueft" beim Block, Blade-Guard fuer @php-Bloecke (Roadmap 1d, Nachtrag) +87ca908 5d8e379 companies: Kurzfelder des Profils ohne Links, Adressen und Spam (NoPromotionalText) +99ffd01 8ea5e52 companies: Links aus Firmennamen normalisieren — API-Eingang und Bestandsbefehl +713024b 8cd76df companies: Befehl zum Deaktivieren der Legacy-Linkspam-Registrierungen +b74f881 b60a28d web: Entitaeten im JSON-LD verknuepft, News-Sitemap und llms.txt (Roadmap 2.1, 2.2, 2.7) +84ea617 4616bb7 web: Jahresarchiv je Branche, Kategoriebeschreibungen, Portalname im Titel (Roadmap 2.3) +b6e4bc5 106edb1 web: Transparenzseiten — was kostet, ohne Abo, loeschen/aendern (Roadmap 2.4) +1fd6d2c c96c8a6 web: Transparenz-Navigation ueber der Headline der Preisseite (Roadmap 2.4) +6446e19 134af42 web: Unter-Navigation Preise/Transparenz auf allen vier Seiten mit aktivem Punkt +7088d09 951b6c4 web: Crawler-Abruf-Protokoll und Panel „Auslieferung" ohne Google-Link (Anhang 1: 1c.0, 1c.1, 1c.6) +6c4618a 6b87282 admin: Indexierungsstatus aus der Search Console, Kundenansicht vorbereitet und zu (Anhang 1: 1c.4, E8) +f1648a0 3751386 web: Erstquelle-Absatz in der Veröffentlichungsmail, vierte Transparenzseite „kostenlos veröffentlichen" (Anhang 1: 1d, 2.4, E7) +b44fded 3c6fb69 admin: URL Inspection immer auf en-US abfragen +10c91ac d9e181a docs: Search Console live, Schlüsseldateien ausgeschlossen, Kontingent erklärt +447dc4c 87558ab web: Hilfe in der Topleiste neben FAQ; 2.5/E5 geschlossen +ee267c6 4edb915 web: Doppelveröffentlichung — Prüfsumme, kanonische Zuordnung (aus bis E9), Quellenauskunft, noindex im Portal (Anhang 2) +4c17a17 5dcaf4e web: E9 und E10 entschieden — Zuordnung aktiv, eine Adresse je statischer Seite, Hub-Portalseiten leiten weiter +24c1bbf edb2d49 web: Portal-Inhalte sind auf dem Hub nicht mehr erreichbar (Anhang 2, E10) +0ab53bf 1d76f5a auth: Firmenrechte nur aus nachgewiesener Adresse, 2FA auf allen Login-Wegen (Audit Block 1, Deploy A) +62202a4 301bca3 auth: automatische Firmenrechte mit Herkunft und Entzug, Nachweis vor Sicherheitsaktionen (Audit Block 1, Deploy C) +a7f991f eeb1cde newsletter: jeden Empfänger genau einmal, atomarer Start, Wiederanlauf (Audit Block 2, Deploy B) +f235156 72432fd web/api/ki: Soft Deletes wieder wirksam, Caches bei Firmenwechsel, KI-Ergebnis an Inhalt gebunden (Audit Block 3+4, Deploy D) +375f4df 9a88e82 billing/dev: Vertragsende in der MAN-Abrechnung, Rechnungslauf ohne Tageskappe, Qualitätsgates (Audit Block 5+6, Deploy E) +4fa9859 226fb81 dev: Umsetzungsprotokoll und Live-Schritte zum Audit-Entwicklungsplan +ec6705e 207f103 tests: Kategorie-Portal in den API-Tests festlegen +c882194 2e8c081 tests: Titel in der MAN-PDF-Adresse festlegen +fb03fb1 c46dfd3 dev: Protokoll — Gesamtsuite grün, zwei zufallsabhängige Tests festgezurrt +1cd9fd1 eb95b3b billing: Vertragsablauf bedingt beenden, Kundenmail nachholbar (Block 7, U11/U12) +235d392 05cf53e security/api/betrieb: Fortify-2FA-Nebenwege gesperrt, Policy nur für aktive Super-Admins, Nachprüfungen aus dem Umsetzungsaudit (Block 7, U08–U10, U13, 7.1, 7.2, 7.5) +ea68362 082e6bb ki/quota: Hash-Bindung atomar bis in den Publish-Lock, roter Re-Check lehnt ab, Kontingent-Altbestand (Block 7, U02–U04) +7819527 1c421c0 dev: Umsetzungsaudit vom 18.09. abgelegt, Block 7 mit Abgleich, Entscheidungen E7–E9 und Protokoll im Entwicklungsplan +3ea9688 c26bdff admin: Bericht „Indexierung & Abrufe" — Rolle Erstquelle/Kopie, Quellenbefund, Crawler-Abrufe; Schlüsselpfad ab Projektwurzel +b8c6af5 5122624 auth: automatische Firmenzuordnung beim Wegfall der E-Mail-Grundlage entfernen statt senken (Block 7.13, U01, E7) +2ec6169 85d7c2b betrieb: Logs je Thema in Tagesdateien (billing, ki, monitoring, market); Doku: Duplicate-Content-Decision durch Anhang 2 abgelöst +b423650 e2ef4de admin: Search-Console-Vorgabe für businessportal24 auf die .com-Property +d0c7194 9d5e5a0 web: RSS-Feeds je Branche und je Portal (Roadmap 3.1); dev: Sichtung des Ordners, Protokoll-Teile umnummeriert +23811ad ff75159 web: RSS-Feed je Newsroom, RSS-Übersichtsseite, „RSS" in der Topleiste (Roadmap 3.1, Nachtrag) +44d0bb6 fc70067 web: Abruf-Protokoll der RSS-Feeds — Reader-Dienst, gemeldete Abonnenten, Admin-Bericht, Panel (Roadmap 3.1) +e620ef3 2b042d6 web: Datenschutzerklärung — Abschnitt 5a „Eigene Nutzungsstatistiken ohne Personenbezug", Frist 395 Tage (Roadmap 0.7) +dab14dc eb65802 press-releases: assign-canonicals leert Seiten- und Sitemap-Caches; dev: Live-Lauf 21.09.2026 protokolliert (9.221 Paare) +f9019ee 1c38c82 reports: Kohortenalter ab Stichtag statt ab --to; legacy:settle-unpaid kennt bereits ersetzte Quellen; dev: Basiswert 0.1 vom Live-System ausgewertet +5ef123c 2b5960b dev: Basiswert 0.1 abgeschlossen — Kohorte 28–55 Tage am Stichtag 21.09.2026 (Median 122 / 314), Nach-Deploy-Stand +605d853 6df36c9 dev: Roadmap Block 0 — 0.2 bis 0.6 als erledigt geführt (Stand Protokoll Teil 2) +b624f80 83cb6e1 assets: Inter (18pt-Schnitte) mit OFL 1.1 für den eingebrannten Bildnachweis (Bildkennzeichnung O4) +e9bdff3 214aea8 images: Datenmodell, Textarchiv, Herkunftsprüfung und gemeinsamer Uploader für Formular v2 (Bildkennzeichnung Block A) +40953d6 3d3ddc2 images: Titelbild-Formular v2, Admin-Upload mit Kundenbestätigung, Entfernen mit Sofortlöschung (Bildkennzeichnung Block B) +65ac72c 24184f1 api: Bildupload v1 unter Formular v2 (Pflichtfelder, Kennung des Wortlauts, Bestätigung mit Token), Legacy-Bildupload abgeschaltet, API-Doku (Bildkennzeichnung Block C) +2124ffd 9f44546 web/admin/pdf: gemeinsame Bildnachweis-Auflösung, Detailfenster am Artikelbild, Bestätigungsstand in Kunden- und Adminansicht, Wortwahl „automatisierte Prüfung" (Bildkennzeichnung Block D) +46b89e1 da167b7 images: Lebenszyklus — Veröffentlichungsgate, published_ever_at, Snapshot der veröffentlichten Fassung, Sofortlöschung, Legacy-Bereinigung, Beweiszugriff, Korrekturweg (Bildkennzeichnung Block E) +0240c14 b5b7041 archive: Beweisarchiv — verschlüsselte Einträge, Legal Hold, Purge mit Tombstone, Restore-Abgleich, Auslöser und Admin-Seite (Bildkennzeichnung Block F) +62723b5 075d0d9 legal/web: Zustimmungsgate je Dokumentversion (aus bis AGB 0.7), OG-Variante mit eingebranntem Bildnachweis, Nachweis in Teasern (Bildkennzeichnung Blöcke G und H) +3b613fa 70e15d5 images: press-release-images:regenerate-variants --only=og für den Bestand, Testhelfer eindeutig benannt (Bildkennzeichnung H.1) +0e5cd20 8bb7049 images: KI-Vorab-Check für Titelbilder — Vision-Sichtung mit definiertem Ausgang je Befund, Admin-Queue, Protokoll und Archiv-Snapshot (Bildkennzeichnung Block K) +6d558cd bcd02f2 web: KI-Badge am Artikelbild nach rechts unten, damit es das Nachweis-Zeichen links nicht überlappt (Bildkennzeichnung D.2) +d99f55e aaeee24 admin: Management ▸ Bilder — Liste aller Titelbilder mit PM-Link, Nachweis, Kennzeichnung, Bestätigungsstand und KI-Vorab-Check, Filter nach Sichtung/Zustand/Ausgang (Bildkennzeichnung) +4e34c3d 34fa342 tests/legal: Testdatenbank-Guard vor den DB-Traits, Flags in phpunit.xml gepinnt, Zustimmung an gezeigte Fassung gebunden (Umsetzungsaudit 25.09.: N22, N06, 5.3) +48129e9 2a2215b audit: Nacharbeit Umsetzungsaudit 25.09.2026 — Bildfreigabe, Beweisarchiv, KI-Atomarität, Berichte (Block 8, N01–N05, N07, N08, N10–N21, 5.1, 5.2) +b80cce6 c38bceb dev: Entwicklungsplan Block 8 — Abgleich Umsetzungsaudit 25.09., Entscheidungen E10–E18, Live-Schritte, Protokoll +97cd8f9 c6543eb dev: Entscheidungen E10–E18 vom Betreiber bestätigt (25.09.2026) +21e8871 05cd604 dev: Bildkennzeichnung — Deploy 1, 2 und 2b am 28.09.2026 live, Protokoll +98c465b 80536ab dev: Bildkennzeichnung — Deploy 1b live (Formular v2 an, Testkonto geprüft), Precheck und Gate bleiben aus +cf07723 1a11fb6 WIP-Schnappschuss vor Migration 2026-09-28 (uncommittete Änderungen von technik/betriebsfixes-2026-09) +1d417f8 1ccb4a8 auth/security: API-Firmenzuordnung nur für Mitglieder oder Allowlist, Google-Vorabübernahme geschlossen, gemeinsamer Login-Abschluss (Umsetzungsaudit 29.09.: R-01, K-04, K-07, K-08, B-10) +c2e0b85 d6e49c1 web/seo: Änderungsdatum unabhängig von Aufrufen, EN-URLs in Sitemap und Legacy-API, signierte Bounce-Referenz, Merge/Canonical konsistent (Umsetzungsaudit 29.09.: R-02 bis R-11, N17, N18, OPT-1, OPT-2; 02.10.: O01) +dfb0513 3dbc3fa tests: gemeinsamer Testhelfer, DB_URL-Guard vor RefreshDatabase, Larastan voller Scope ohne Meldung (Umsetzungsaudit 29.09.: Q-01, Q-02; 02.10.: O02) +f0eeef0 c82f279 press-releases/jobs: Scheduler respektiert manuelle Prüfung und kommt an Blockaden vorbei, Newsletter-Versand per Schalter gesperrt, kurze Scheduler-Sperren (Umsetzungsaudit 29.09.: K-01, K-02, K-05, K-06, K-09, E9, OPT-8, OPT-9; 02.10.: O06) +5ec252d f1c0e27 images: nur freigegebene Bilder in Feed und PDF, versionierte Veröffentlichungssnapshots, Bestätigung an das gezeigte Bild gebunden, getrennte Rückhaltegründe (Umsetzungsaudit 29.09.: B-01 bis B-14, N09, OPT-3 bis OPT-5; 02.10.: O03) +7cd84b2 60650ba archive: Auftragstabelle statt Marker, exklusiver Abschluss, Quarantäne, Restore über Payload-Identität und signierte Exporte, Schlüsselrotation (Umsetzungsaudit 29.09.: A-01 bis A-15, OPT-6, 5.1 d; 02.10.: O04, O05, O07, O08) +aa47e11 4a7e496 dev: Umsetzungsaudits 29.09. und 02.10., Entwicklungsplan Blöcke 9 und 10 mit bestätigten Entscheidungen E19–E34 und Deploy-Plan, Runbook ergänzt +2701588 448643b dev: Commit-Hashes der Blöcke 9 und 10 im Protokoll nachgetragen +f2ed268 2079dfd deps: Composer-Update (Laravel 12.69.3, Livewire 4.4.7, Flux 2.20.1, Fortify 1.40.0), league/commonmark 2.10.3 behebt zwei Advisories; Sentry-SDKs für GlitchTip (sentry/sentry-laravel, @sentry/browser) +8769a71 d884eb7 monitoring: Betriebsüberwachung Phase 1 — GlitchTip (Server- und Browserfehler), Fehlersignale ohne Exception, /health mit Scheduler-Herzschlag, ntfy-Alarme, fehlgeschlagene Anmeldungen im Verlauf, Umami im Kundenbereich, Versionsnummer +22b62df 8690165 dev: Monitoring-Plan (Phasen 1–3, Entscheidungen M1–M9, Protokoll), Deploy-Checkliste v1.1.0, Runbook um Versionsdatei und Composer-Schritt ergänzt +df7ebdc 9a05cb9 mcp: Context7-API-Schlüssel aus .mcp.json und .codex/config.toml entfernt — kommt jetzt aus CONTEXT7_API_KEY +33dc991 c837ef9 dev: Deploy-Checkliste v1.1.0 — Paket gebaut, Entwicklerdateien aus der Paketliste ausgenommen +8a64bd7 2dda9ec dev: Deploy-Checkliste — Server braucht kein Git +b1cec16 984d001 chore: docs/ aus dem Repository — lebt im Obsidian-Vault (Devcontainer-Mount), Q-05 entschieden; entpackte Deploy-Pakete ignoriert +cd18832 01d68c2 dev: Deploy v1.1.0 am 05.10.2026 live — Protokoll in Deploy-Checkliste, Entwicklungsplan (Blöcke 9/10) und Monitoring-Plan +f288ab6 1d7ce9e dev: Roadmap — Volt entfernen und auf Livewire-4-Single-File-Components umstellen (Umfang, Schritte) +4ca099f dd688e5 dev: KAS-Passwort erledigt — SSH-Zugang des Altsystems geändert und deaktiviert, KAS-Hosting bleibt für die Postfächer +73da704 129de4f deploy: Git-Deploy per Tag — dev/betrieb/deploy.sh, Ablauf und einmalige Umstellung in git-deploy.md, Runbook §10; public/build wird versioniert +e316734 168a1cd build: Assets für v1.1.1 +2f02acc 17dceec tests: Testsuite meldet nicht mehr an GlitchTip — Sentry-DSNs in phpunit.xml geleert, Wächtertest; Produktions-Logs unter dev/ ignoriert +16af374 3fd3ac0 fix: Registrierung — Platzhalter serverseitig übersetzt statt als Alpine-Ausdruck (GlitchTip browser-pressekonto 15), Wächtertest; Promise-Ablehnungen mit Typ und Inhalt (10); vertippte artisan-Befehle nicht melden (server-pressekonto 9) +a90f24a df557e4 search-console: vorübergehende Google-Fehler einmal wiederholt und nur als Warnung protokolliert, Portal-Abbruch nach fünf Fehlern in Folge, Zeitbudget 40 Minuten (GlitchTip server-pressekonto 11–14) +88b4feb 9e35c73 dev: GlitchTip-Dokumentation (dev/glitch-tip) — Überblick, Meldewege, API-Abruf, Ablauf zur Fehlerbehebung, Regeln, Protokoll der Einträge; Verweis in CLAUDE.md +072fd62 3a6cb6a dev: GlitchTip-Doku auf Git-Deploy umgestellt (Release-Datei schreibt deploy.sh) +eb2bf0b 88f343d build: Assets für v1.1.2 +92709d8 2a61122 fix: eigene Flux-Icons ins Repository — macOS-Muster "Icon" in der .gitignore traf bei core.ignorecase auch resources/views/flux/icon/ +79bb6cf 5782297 dev: Git-Deploy live seit v1.1.3 (06.10.2026) — Protokoll, Befunde der Umwandlung, Runbook §10 und GlitchTip-Doku angepasst +31da9ea 2cde728 livewire: Volt entfernt — Komponenten als Livewire-4-Single-File-Components, Route::livewire(), Livewire::test(); livewire/volt deinstalliert +a5bf331 6d03d8d billing: Rechnungsversand — PDF im Anhang der Zahlungsmail, optionale Rechnungs-E-Mail, Stripe-Rechnungs-PDF direkt aus dem Kundenbereich +debf094 da9411b dev: Deploy v1.2.0 (Volt entfernt) im Git-Deploy-Protokoll +bc5e151 9f806de dev: Git-Deploy — FPM-Reload ohne Passwort getestet, PK_FPM_RELOAD ungesetzt lassen; Nginx-Fehlerlog ausgewertet, process_control_timeout bewusst nicht gesetzt +06e37c9 2c25eea dev: Monitoring-Plan — Nachtrag fehlgeschlagene Anmeldungen (Befund, Auswertung) und Einrichtung des externen Monitors (Uptime Kuma, ntfy, zweite Ebene) +0aaee12 05535aa auth: fehlgeschlagene Anmeldungen mit Einstieg (livewire/fortify/two-factor); unbekannte Adressen als Tageszähler statt Verlaufseintrag, Kachel im Systemstatus, Löschfrist 90 Tage +ce6e8b4 c223daa deploy: Worker-Prüfung am Ende von deploy.sh — monitoring:queue-probe stellt einen Test-Job ein und wartet bis 60 s; ohne Worker Exit 3 mit Hinweis +dfc7ed1 3b4448a dev: Worker-Ausfall 06.10. dokumentiert — Runbook ohne pauschales queue:retry all, Vorgehen bei stehendem Worker, externer Monitor erledigt (status.adametz.media) +c385ad9 d083110 dev: Deploy v1.3.2 im Git-Deploy-Protokoll (Worker-Prüfung 4 s, Supervisor enabled) +2215826 32e1349 dev: Baukasten Git-Deploy und Betriebsüberwachung für andere Laravel-Projekte (dev/git-deploy-monitoring) — Anleitungen, Checkliste, Vorlagen für Laravel, deploy.sh und Monitoring-Server +d1d2ab3 fd8dd74 ops: Lokale Datenbank gegen fremde Testläufe absichern — DB_* nicht mehr als Container-Umgebung, Agenten-Regel, Testdatenbank-Pflicht im Baukasten +1c07fcb bae8347 security: Sicherheitsaudit 07.10.2026 (S-01–S-06) behoben, Passkeys und Zweitfaktor-Pflicht für Admins +5dc3bf5 8045ef1 build: Assets für v1.4.0 +c76e420 af72810 fix: Abgleich der Firmenrechte entzieht Bestandskonten ohne E-Mail-Bestätigung nicht mehr pauschal alle Rechte — memberships:resync-auto mit Probelauf und Notbremse +6eb7c08 f693226 dev: Deploy v1.4.0 und v1.4.1 im Git-Deploy-Protokoll, Release-Stand im Sicherheitsaudit und Entwicklungsplan +6d85d29 e77d9e7 feat: API-Zugang endet mit der Buchung, optionales Ablaufdatum für API-Tokens +7fa310f 3def447 security: Proxy-Vertrauen nur noch lokal, HSTS in Produktion, Tests ohne echte ntfy-Pushes +0048682 798ae75 dev: Deploy v1.5.0 im Git-Deploy-Protokoll +35a49cc 077e522 dev: Phase 4 im Sicherheits-Entwicklungsplan auf Stand v1.5.0/v1.6.0 +c751d4e 5dfd622 security: Andere Geräte abmelden, IP-weites Login-Limit, dauerhafte Sperrmarke, Passwortregeln, CSP im Melde-Modus +f92d1e0 9c4962f build: npm-Advisories für shell-quote und source-map-js behoben +6a86fa4 65086ca dev: Deploy v1.6.0 im Git-Deploy-Protokoll +28e78f5 75e206d dev: Imagick als Server-Voraussetzung, Wiedervorlage der Restpunkte im Sicherheits-Entwicklungsplan +69aaef4 b06f5a8 build: Assets für v1.6.1 +87ad433 bbc2b60 fix: Imagick in der Betriebsüberwachung, Scanner-Anfragen an Livewire als 400, abgebrochene Alpine-Übergänge nicht mehr melden +43420f0 61f449f dev: Deploy v1.6.1 im Git-Deploy-Protokoll +64d53a5 010258a build: Assets für v1.7.0 +9cb39b6 b3bcc43 dev: Entwicklungsplan Spamschutz, Wiedervorlage der Nacharbeiten nach dem Deploy +beae7e2 06d2889 feat: Spamschutz für Kontakt-Widget und Registrierung mit Cloudflare Turnstile +70ed7d1 35fd2f6 dev: Deploy v1.7.0 im Git-Deploy-Protokoll, Spamschutz-Nacharbeiten erledigt +3376f01 8e3554b dev: Doku aufgeräumt, neue Roadmap als einzige Liste offener Punkte diff --git a/dev/betrieb/git-deploy.md b/dev/betrieb/git-deploy.md index 1e321833..b28e3f27 100644 --- a/dev/betrieb/git-deploy.md +++ b/dev/betrieb/git-deploy.md @@ -266,3 +266,24 @@ Ausfall des Anbieters keinen Deploy abbricht. | 08.10.2026 | `v1.6.0` | Mit Migration (`users.sessions_revoked_at_ms`, Batch 22). Härtung aus Phase 4 des Sicherheitsaudits: „Andere Geräte abmelden“, IP-weites Login-Limit (20 Fehlversuche in 15 Minuten), dauerhafte Session-Sperrmarke, Passwörter ab 12 Zeichen mit Leak-Abgleich, CSP im Melde-Modus (`storage/logs/csp-*.log`), npm `shell-quote`/`source-map-js`. Nach dem Deploy: Header `content-security-policy-report-only` vorhanden, Umami- und GlitchTip-Host in `script-src`/`connect-src`. CSP-Log in einigen Tagen auswerten. | | 08.10.2026 | `v1.6.1` | Vorher auf dem Server `php8.4-imagick` installiert und FPM neu geladen: Die Erweiterung fehlte auf Live, Herkunftsprüfung und KI-Vorab-Check der Bilder liefen seitdem ins Leere. Release: Zeile „PHP-Erweiterung Imagick“ in der Betriebsüberwachung, gebaute Livewire-Anfragen von Scannern (GlitchTip 38, 39) als 400 statt 500/419, Browser-Filter für abgebrochene Alpine-Übergänge (GlitchTip 18). Keine Migration. Nach dem Deploy: Betriebsüberwachung „Imagick ist geladen“. | | 09.10.2026 | `v1.7.0` | Spamschutz für Kontakt-Widget und Registrierung (Cloudflare Turnstile, Inhaltsfilter mit Spam-Quarantäne, Namensregel bei der Registrierung). Bei nicht erreichbarem Cloudflare wird durchgelassen und markiert. Keine Migration. Vorher: Turnstile-Keys in der `.env`, Widget im Cloudflare-Dashboard mit allen drei Live-Hostnamen. Nach dem Deploy: Kontakt-Widget im Browser getestet, Betriebsüberwachung „Spamschutz (Cloudflare Turnstile)“ grün. `contact-messages:quarantine-spam`: 152 Anliegen in die Quarantäne, 130 offen (Rest per Sammelaktion), echte Korrekturanfragen blieben offen. `users:prune-bot-registrations` nach freigegebenem Probelauf ausgeführt, danach `USERS_PRUNE_BOT_REGISTRATIONS=true` und `config:cache`. | +| 09.10.2026 | Historie bereinigt | Die Produktiv-SQL-Dumps vom 23.04. (`dev/migration 2026/sql`, ~290 MB, Kundendaten) lagen seit `5b8bdf4` in der Historie und auf beiden Remotes. Mit `git filter-branch` aus allen Branches und Tags entfernt; Dateibäume und Commitzahlen aller 21 Refs unverändert, **alle Hashes neu** (Zuordnung alt → neu: [`commit-map-2026-10-09.txt`](../archive/commit-map-2026-10-09.txt)). Tags `v1.0.0`–`v1.7.0` neu gesetzt, gleicher Inhalt. Force-Push auf `origin` und `NAS`, danach einmalig der Server-Abgleich unten. | + +### Einmalig nach der Historienbereinigung (09.10.2026) + +`deploy.sh` holt Tags ohne `--force` und würde an den neu gesetzten Tags +scheitern („would clobber existing tag“). Auf dem Server einmal: + +```bash +cd ~/pressekonto.com +git status --porcelain # muss leer sein +git fetch --force --tags --prune origin +git checkout --quiet --detach v1.7.0 # gleicher Inhalt, neuer Hash — keine Dateiänderung +git reflog expire --expire=now --all && git gc --prune=now +git count-objects -vH # size-pack deutlich unter 300 MB +``` + +`RELEASE` bleibt `v1.7.0`, ein Deploy ist nicht nötig. Danach läuft +`deploy.sh` wie gewohnt. Jeder andere Klon (weitere Rechner) wird neu geklont. +In Forgejo und auf dem NAS die Speicherbereinigung des Repositorys anstoßen, +sonst bleiben die alten Objekte dort bis zur nächsten automatischen +Bereinigung liegen. diff --git a/dev/roadmap.md b/dev/roadmap.md index fa94180a..8bbb6f6c 100644 --- a/dev/roadmap.md +++ b/dev/roadmap.md @@ -55,10 +55,10 @@ oder Release versehen. | # | Punkt | Quelle | Aufwand | |---|---|---|---| -| 1.1 | **Produktiv-SQL-Dumps in der Git-Historie.** `dev/migration 2026/sql/*.sql` (Snapshot 23.04., ~290 MB, Kundendaten) wurde am 12.05. committet (`5b8bdf4`) und am 06.07. nur enttrackt (`b53af92`). Die Blobs sind von `main` erreichbar und liegen auf **beiden Remotes** (origin, NAS) und in jedem Klon, also vermutlich auch im Git-Deploy-Checkout auf dem Server. Entscheidung: Historie mit `git filter-repo` bereinigen und force-pushen (alle Klone neu, Server-Checkout neu) oder bewusst belassen und dokumentieren. | [Release-Plan R6.2](archive/release/entwicklungsplan-release.md) | M | +| ~~1.1~~ | ~~**Produktiv-SQL-Dumps in der Git-Historie.**~~ **Lokal bereinigt 09.10.2026** (`git filter-branch`, alle Branches und Tags, Inhalt unverändert, Hashes neu, Zuordnung in [`commit-map-2026-10-09.txt`](archive/commit-map-2026-10-09.txt)). **Offen:** Force-Push auf `origin` und `NAS`, Server-Abgleich ([git-deploy.md, Einmalig nach der Historienbereinigung](betrieb/git-deploy.md)), Speicherbereinigung in Forgejo und auf dem NAS, andere Klone neu klonen. | [Release-Plan R6.2](archive/release/entwicklungsplan-release.md) | S [LIVE] | | 1.2 | **Schlüssel rotieren**, deren Rotation nirgends belegt ist: OpenAI, Google OAuth, Mail-Zugang (K2 vom 14.07.), Context7 (stand in `.mcp.json`, Git-Historie), Connektar-API-Keys (Legacy-Keys liefen über Test-Kanäle), MySQL-Root lokal (Git-Historie). | [optimize 14.07. K2](archive/optimize/optimize-14-07-2026.md), [Deploy v1.1.0 F](archive/betrieb/deploy-v1.1.0.md), [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md) | S [EXTERN] | | 1.3 | **Dev-Container neu erstellen.** `docker-compose.yml` ist bereinigt, im laufenden Container sind `DB_CONNECTION` … `DB_PASSWORD` aber weiter als Umgebungsvariablen gesetzt — genau die Ursache des Datenverlusts vom 07.10. Danach lokalen `APP_KEY` reparieren (33 statt 44 Zeichen, ungültig) und Cloudflare-Testkeys in die lokale `.env`. | [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md), [Spamschutz](sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md) | S | -| 1.4 | **Lokale Dateien mit Personenbezug** sichern bzw. löschen (alle gitignored): `dev/archive/migration-2026/sql/` (905 MB Dumps), `dev/migration/` (7,4 GB Medien-Staging; nach Backup), `dev/2026-10/laravel.log` (Produktions-Log 08.10., Fehler in v1.6.1 behoben), `dev/newsletter/mail-address.md` (47 Bounce-Adressen; nach bestätigtem Import), `dev/api/` (Postman mit API-Keys, Activity-Logs der Alt-APIs bis 10.07.), `storage/app/private/restore-company-user-auto-2026-10-07.sql`. | [dev/README](README.md) | S | +| ~~1.4~~ | ~~**Lokale Dateien mit Personenbezug**~~ — **gelöscht 09.10.2026:** `dev/migration/` (7,4 GB), `dev/archive/migration-2026/sql/` (905 MB), `dev/api/`, `dev/newsletter/`, `dev/2026-10/`, `storage/app/private/restore-company-user-auto-2026-10-07.sql`. | [dev/README](README.md) | — | | 1.5 | **Alte Backups auf dem Server löschen:** `~/deploy-v1.1.0.tgz`, `~/backup-vor-v1.1.0.tgz`, `~/backup-vor-git.tgz`, `~/vor-git/`. | [git-deploy.md](betrieb/git-deploy.md) | S [LIVE] | ---