dev: Historie von den Produktiv-SQL-Dumps bereinigt, lokale Dateien mit Personenbezug gelöscht
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run

- Zuordnung alter zu neuen Commit-Hashes in dev/archive/commit-map-2026-10-09.txt
- Git-Deploy-Protokoll: Eintrag und einmaliger Server-Abgleich (Tags mit
  --force holen, gc), Speicherbereinigung in Forgejo und auf dem NAS
- README und Roadmap 1.1/1.4 nachgeführt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-10-09 11:30:49 +00:00
parent 8e3554bf91
commit 421c0d92f9
4 changed files with 544 additions and 11 deletions

View file

@ -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) |

View file

@ -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: <x-portal.pr-presubmit-check> 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): <x-portal.page-header> + 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: <x-portal.empty-state> + admin/press-releases/index umgestellt
8690425 1c75e61 5.4: empty-state auf customer/press-releases + customer/press-kits ausgerollt
9ee77c8 505852f 5.4: <x-portal.table-pagination> + 13 Wrapper ersetzt
c829624 587d1fd 5.5: <x-portal.alert> + 6 Flash-Bloecke umgestellt
fc91f29 b1b832d 5.5: <x-session-status> + 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: <x-password-input> + 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

View file

@ -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.

View file

@ -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] |
---