fix(andreknie.de): harden personal data lifecycle #2
@@ -0,0 +1,763 @@
|
||||
# andreknie.de Findings Remediation Plan
|
||||
|
||||
Status: Umsetzungsanleitung, noch nicht abgearbeitet
|
||||
|
||||
Zielgruppe: Nachfolgendes Codex-Modell, insbesondere Luna
|
||||
|
||||
Letzter Review: 2026-07-28
|
||||
|
||||
## 1. Auftrag und Arbeitsgrenzen
|
||||
|
||||
Dieser Plan beschreibt die schrittweise Behebung der Findings aus dem vollstaendigen
|
||||
Review aller Seiten, Komponenten und relevanten Backend-Flows von andreknie.de.
|
||||
|
||||
Wichtig:
|
||||
|
||||
- Nicht alle Arbeitspakete auf einmal umsetzen.
|
||||
- Zu Beginn eines neuen Tasks genau ein vom Benutzer ausgewaehltes Arbeitspaket
|
||||
bearbeiten.
|
||||
- Vor der Implementierung den aktuellen Stand erneut lesen und die Findings
|
||||
verifizieren.
|
||||
- Keine unaufgeforderten Refactorings ausserhalb des ausgewaehlten Pakets.
|
||||
- Bestehende Benutzer-Aenderungen im Worktree nicht zuruecksetzen.
|
||||
- Keine echten Kontakt-, Newsletter- oder Speaker-CV-Anfragen in Produktion
|
||||
absenden.
|
||||
- Personenbezogene Produktionsdaten niemals in Logs, Antworten, Screenshots,
|
||||
Commits oder Test-Fixtures uebernehmen.
|
||||
|
||||
## 2. Verbindlicher Repository-Kontext
|
||||
|
||||
### 2.1 Source of Truth
|
||||
|
||||
Arbeitsverzeichnis:
|
||||
|
||||
```text
|
||||
C:\Coding\Orchestrator
|
||||
```
|
||||
|
||||
Component:
|
||||
|
||||
```text
|
||||
C:\Coding\Orchestrator\privat\CV\andreknie.de
|
||||
```
|
||||
|
||||
Hub:
|
||||
|
||||
```text
|
||||
https://git.d-hive.de/ankn/Orchestrator.git
|
||||
```
|
||||
|
||||
Foederiertes Spoke-Repository:
|
||||
|
||||
```text
|
||||
https://git.d-hive.de/dHive/andreknie.de.git
|
||||
```
|
||||
|
||||
Nicht verwenden:
|
||||
|
||||
- Das alte GitHub-Repository. Es ist veraltet.
|
||||
- Eine separate lokale Clone-Kopie von andreknie.de.
|
||||
- Direkte Aenderungen ausserhalb des Orchestrator-Monorepos.
|
||||
|
||||
### 2.2 Vor jeder Arbeit lesen
|
||||
|
||||
Vom Orchestrator-Root:
|
||||
|
||||
```text
|
||||
AGENTS.md
|
||||
.agents/AGENTS.md
|
||||
.kiro/steering/*.md
|
||||
privat/CV/andreknie.de/README.md
|
||||
privat/CV/andreknie.de/DEPLOYMENT-PLAN.md
|
||||
privat/CV/andreknie.de/.gitea/workflows/deploy.yml
|
||||
privat/CV/andreknie.de/FINDINGS-REMEDIATION-PLAN.md
|
||||
```
|
||||
|
||||
Dabei haben die aktuellen System- und Benutzeranweisungen Vorrang. Fuer
|
||||
versionierte Aenderungen gilt der in den Repository-Regeln beschriebene
|
||||
Feature-Branch-, Commit-, Push- und Pull-/Merge-Request-Ablauf. Nicht direkt auf
|
||||
`master` oder `main` pushen.
|
||||
|
||||
### 2.3 Gitea und Foederation
|
||||
|
||||
- Gitea wird ueber `tea` mit Browser-Authentifizierung verwendet.
|
||||
- Lokales Tool:
|
||||
|
||||
```text
|
||||
C:\Coding\tools\tea\tea.exe
|
||||
```
|
||||
|
||||
- Gitea-Login: `dhive`
|
||||
- Der Runner arbeitet im foederierten Spoke.
|
||||
- Deployment erst nach erfolgreichem Review und Merge.
|
||||
- Vor einem Deployment die aktuellen Orchestrator-/Federationsanleitungen
|
||||
erneut lesen. Keine eigene Synchronisationsvariante erfinden.
|
||||
- Workflow-Status nach dem Merge im Spoke mit `tea actions runs` pruefen.
|
||||
- Live-Deployment erst als erfolgreich melden, wenn der Gitea-Run erfolgreich
|
||||
ist und die konkrete Aenderung auf `https://andreknie.de` verifiziert wurde.
|
||||
|
||||
## 3. Technischer Ausgangspunkt
|
||||
|
||||
Stack:
|
||||
|
||||
- React 19
|
||||
- React Router 7
|
||||
- Vite 8
|
||||
- Express 5
|
||||
- Caddy
|
||||
- Datei-basiertes CMS aus Markdown und YAML
|
||||
- Gitea Actions Deployment
|
||||
|
||||
Relevante Befehle im Component-Verzeichnis:
|
||||
|
||||
```powershell
|
||||
& 'C:\Users\knie\.cache\codex-runtimes\codex-primary-runtime\dependencies\bin\fallback\pnpm.cmd' run build
|
||||
& 'C:\Users\knie\.cache\codex-runtimes\codex-primary-runtime\dependencies\bin\fallback\pnpm.cmd' run test
|
||||
.\node_modules\.bin\eslint.CMD src server plugins vite.config.js
|
||||
```
|
||||
|
||||
Hinweise:
|
||||
|
||||
- Der volle Lint ueber das gesamte Repository erfasst alte generierte Dateien
|
||||
unter `site/assets` und ist deshalb fuer gezielte Source-Pruefungen nicht
|
||||
aussagekraeftig.
|
||||
- Fuer UI-Tests den lokalen Vite-Server starten und Desktop sowie Mobil mit
|
||||
Browser-Automation pruefen.
|
||||
- Relevante Viewports:
|
||||
- Desktop: 1440 x 900
|
||||
- Mobile: 375 x 844
|
||||
- Mobile: 390 x 844
|
||||
- Mobile: 430 x 932
|
||||
- Nach Tests alle selbst gestarteten lokalen Server beenden.
|
||||
|
||||
## 4. Allgemeiner Ablauf fuer jedes Arbeitspaket
|
||||
|
||||
1. Repository-Regeln und diesen Plan lesen.
|
||||
2. `git status --short --branch` im Orchestrator pruefen.
|
||||
3. Bei fremden Aenderungen nicht zuruecksetzen; Ueberschneidungen sorgfaeltig
|
||||
analysieren.
|
||||
4. Aktuellen Hub-Stand per Fast-Forward aktualisieren.
|
||||
5. Einen aussagekraeftigen Feature-Branch erstellen.
|
||||
6. Nur die Dateien des ausgewaehlten Arbeitspakets bearbeiten.
|
||||
7. Relevante Unit-, Integrations- und Browser-Tests ausfuehren.
|
||||
8. Build und gezielten Source-Lint ausfuehren.
|
||||
9. Diff auf Scope, Secrets, generierte Artefakte und unbeabsichtigte
|
||||
Content-Aenderungen pruefen.
|
||||
10. Conventional Commit erstellen.
|
||||
11. Branch zum Gitea-Hub pushen und Pull-/Merge-Request erstellen.
|
||||
12. PR/MR pruefen; nicht ohne erfolgreiche Quality Gates mergen.
|
||||
13. Nach Freigabe mergen und den dokumentierten Hub-and-Spoke-
|
||||
Federationsablauf ausfuehren.
|
||||
14. Gitea-Deployment beobachten.
|
||||
15. Live nur die betroffenen Funktionen read-only pruefen. Keine echten
|
||||
Formulare absenden.
|
||||
|
||||
## 5. Prioritaet 1: Datenschutz und Ausfallsicherheit
|
||||
|
||||
Branch-Vorschlag:
|
||||
|
||||
```text
|
||||
fix/andreknie-data-lifecycle
|
||||
```
|
||||
|
||||
### 5.1 Token-Lebenszyklus korrigieren
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
server/services/confirmationToken.js
|
||||
server/routes/contact.js
|
||||
server/routes/talk-request.js
|
||||
server/routes/newsletter.js
|
||||
src/pages/Datenschutz.jsx
|
||||
```
|
||||
|
||||
Aktuelles Problem:
|
||||
|
||||
- Bestaetigte Tokens bleiben durch die Cleanup-Bedingung dauerhaft erhalten.
|
||||
- Die Token-Datei enthaelt personenbezogene Formulardaten.
|
||||
- Bestaetigte Tokens werden vor erfolgreichem Abschluss des Folgeprozesses
|
||||
verbraucht.
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Token-Zustaende explizit modellieren, mindestens `pending` und `processing`.
|
||||
2. Eine atomare Funktion einfuehren, die einen gueltigen Token fuer die
|
||||
Verarbeitung reserviert, ihn aber noch nicht endgueltig entfernt.
|
||||
3. Nach erfolgreichem Folgeprozess den Token vollstaendig aus der Datei
|
||||
entfernen.
|
||||
4. Bei einem Folgefehler den Token wieder auf `pending` setzen oder eine
|
||||
kontrollierte Wiederholung erlauben.
|
||||
5. Abgelaufene Tokens unabhaengig vom bisherigen Status entfernen.
|
||||
6. Bestaetigte personenbezogene Payloads nicht als Historie behalten.
|
||||
7. Gleichzeitige Aufrufe weiterhin durch den vorhandenen Mutex schuetzen.
|
||||
8. Keine Tokenwerte oder Payloads loggen.
|
||||
9. Vor einer Bereinigung bestehender Produktionsdaten eine Sicherung nach dem
|
||||
vorhandenen Betriebs-/Backup-Verfahren vorsehen. Keine Produktionsdateien
|
||||
aus dem lokalen Task heraus manipulieren.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Unit: Ein neuer Token ist vor Ablauf gueltig.
|
||||
- Unit: Ein abgelaufener Token wird abgelehnt und entfernt.
|
||||
- Unit: Ein erfolgreich verarbeiteter Token wird entfernt.
|
||||
- Unit: Ein fehlgeschlagener Folgeprozess laesst einen kontrollierten Retry zu.
|
||||
- Unit: Zwei parallele Bestaetigungen erzeugen genau einen Folgeprozess.
|
||||
- Unit: Cleanup entfernt abgelaufene pending/processing-Datensaetze.
|
||||
- Unit: Cleanup behaelt keine erfolgreich verarbeiteten personenbezogenen
|
||||
Payloads.
|
||||
- Integration Kontakt: Erfolgreicher Mailversand fuehrt zu Success-Redirect.
|
||||
- Integration Kontakt: Mailfehler fuehrt nicht zum endgueltigen Tokenverlust.
|
||||
- Integration Newsletter: Wiederholte Bestaetigung erzeugt keinen doppelten
|
||||
Subscriber.
|
||||
- Integration Talk Request: Gleiches Verhalten wie beim Kontaktformular.
|
||||
|
||||
Akzeptanzkriterien:
|
||||
|
||||
- Kein erfolgreich verarbeiteter Token verbleibt in `pending-tokens.json`.
|
||||
- Ein temporaerer Mailfehler vernichtet keine Anfrage.
|
||||
- Ein Token kann nicht zwei Stakeholder-Mails oder zwei Newsletter-Eintraege
|
||||
erzeugen.
|
||||
- Tests enthalten nur synthetische Daten.
|
||||
|
||||
### 5.2 SMTP-Konfiguration und Fehlerverhalten haerten
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
server/services/mailer.js
|
||||
server/index.js
|
||||
server/routes/contact.js
|
||||
server/routes/talk-request.js
|
||||
server/routes/newsletter.js
|
||||
server/routes/speaker-cv.js
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Produktionsbetrieb ohne notwendige SMTP-Konfiguration nicht stillschweigend
|
||||
als erfolgreichen Versand behandeln.
|
||||
2. Konfigurationspruefung beim Serverstart oder einen eindeutigen
|
||||
`mailerReady`-Status einfuehren.
|
||||
3. Healthcheck so erweitern, dass die Mail-Konfiguration ohne Ausgabe von
|
||||
Secrets als bereit/nicht bereit erkennbar ist.
|
||||
4. Nutzerfreundliche Fehlerantwort liefern, wenn kein Versand moeglich ist.
|
||||
5. Serverlogs auf technische IDs und Fehlertypen begrenzen.
|
||||
6. Speaker-CV-Lead nur gemaess klarer Reihenfolge speichern und versenden;
|
||||
Wiederholungen duerfen keine unkontrollierten Duplikate erzeugen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Unit: Mailer meldet fehlende Konfiguration als nicht bereit.
|
||||
- Unit: Keine SMTP-Zugangsdaten erscheinen in Fehlern oder Logs.
|
||||
- Integration: Route liefert bei fehlendem Mailer keinen falschen Erfolg.
|
||||
- Integration: SMTP-Fehler wird mit passendem HTTP-Status behandelt.
|
||||
- Integration: Erfolgsfall bleibt unveraendert.
|
||||
- Integration Speaker CV: Fehlendes PDF und Mailfehler werden getrennt
|
||||
behandelt.
|
||||
|
||||
Akzeptanzkriterien:
|
||||
|
||||
- Keine UI-Erfolgsmeldung, wenn nachweislich keine Mail ausgeloest werden konnte.
|
||||
- Healthcheck offenbart keine Secrets.
|
||||
- Bestehender erfolgreicher Produktionsflow bleibt kompatibel.
|
||||
|
||||
### 5.3 Datenschutztext mit Implementierung synchronisieren
|
||||
|
||||
Betroffene Datei:
|
||||
|
||||
```text
|
||||
src/pages/Datenschutz.jsx
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Erst nach Festlegung und Implementierung der Speicherfristen anpassen.
|
||||
2. Kontakt, Vortragsanfrage, Newsletter, Ressourcen und Speaker CV getrennt
|
||||
beschreiben.
|
||||
3. Aufbewahrungsdauer beziehungsweise Loeschkriterium konkret benennen.
|
||||
4. Widerrufs- oder Abmeldeweg fuer Newsletter eindeutig nennen.
|
||||
5. Keine rechtlichen Behauptungen erfinden; bei fachlicher Unsicherheit Text
|
||||
als pruefbeduerftig kennzeichnen und den Benutzer um Freigabe bitten.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Browser: Datenschutzseite bei Desktop und Mobile ohne Layoutfehler.
|
||||
- Content-Review: Jede Aussage entspricht dem implementierten Datenfluss.
|
||||
- Linktest: Alle genannten Mailadressen und internen Links sind korrekt.
|
||||
|
||||
## 6. Prioritaet 2: Mobile Nutzbarkeit und Ressourcen
|
||||
|
||||
Branch-Vorschlag:
|
||||
|
||||
```text
|
||||
fix/andreknie-mobile-navigation
|
||||
```
|
||||
|
||||
### 6.1 Bottom-Dock mobil korrigieren
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/components/BottomDock.jsx
|
||||
src/components/BottomDock.css
|
||||
src/index.css
|
||||
src/pages/Home.css
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Mobile Informationsarchitektur festlegen:
|
||||
- bevorzugt weniger primaere Dock-Eintraege plus Menue, oder
|
||||
- ein horizontal scrollbares Dock mit klarer Bedienbarkeit.
|
||||
2. Dock-Hoehe als CSS-Variable definieren.
|
||||
3. Global ausreichend unteren Inhaltsabstand reservieren.
|
||||
4. `env(safe-area-inset-bottom)` beruecksichtigen.
|
||||
5. Touch-Ziele mindestens 44 x 44 CSS-Pixel gross halten.
|
||||
6. Primaere Hero-CTAs duerfen zu keinem Zeitpunkt vom Dock verdeckt werden.
|
||||
7. Footer, Kontaktformular, About-Profil und lange Detailseiten pruefen.
|
||||
8. Desktop-Dock nicht unbeabsichtigt veraendern.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Browser 375 x 844: Hero-Buttons vollstaendig sichtbar und klickbar.
|
||||
- Browser 390 x 844: Kein Text oder Formularfeld durch Dock verdeckt.
|
||||
- Browser 430 x 932: Safe-Area und Footer funktionieren.
|
||||
- Browser 1440 x 900: Desktop-Dock unveraendert.
|
||||
- DOM-Messung: Dock liegt innerhalb des Viewports.
|
||||
- DOM-Messung: Dokument besitzt keinen horizontalen Overflow.
|
||||
- Tastatur: Jeder sichtbare Dock-Eintrag ist erreichbar.
|
||||
- Screenshot-Vergleich fuer Home, About, Contact und Article Detail.
|
||||
|
||||
Akzeptanzkriterien:
|
||||
|
||||
- Kein Dock-Overlay auf CTAs, Formularen oder Footer-Inhalten.
|
||||
- Kein horizontaler Seitenoverflow.
|
||||
- Mobile Touch-Ziele bleiben ergonomisch.
|
||||
|
||||
### 6.2 Ressourcen-Flow entscheiden und umsetzen
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/pages/Resources.jsx
|
||||
src/hooks/useFormSubmit.js
|
||||
src/utils/validation.js
|
||||
server/routes/resource-download.js
|
||||
content/resources/*
|
||||
src/pages/Datenschutz.jsx
|
||||
```
|
||||
|
||||
Vor Implementierung Benutzerentscheidung einholen:
|
||||
|
||||
- Variante A: Freier direkter Download ohne Lead-Erfassung.
|
||||
- Variante B: Download nach erfolgreicher Lead-Erfassung.
|
||||
- Variante C: Ressourcen-Seite bis zur Befuellung ausblenden.
|
||||
|
||||
Fuer Variante B:
|
||||
|
||||
1. Formular mit Name, E-Mail, Unternehmen, Resource-ID und Honeypot erstellen.
|
||||
2. Vorhandene Validierung verwenden statt duplizieren.
|
||||
3. API-Antwort auswerten und nur die serverseitig gelieferte Download-URL
|
||||
verwenden.
|
||||
4. Lade-, Validierungs-, Fehler- und Erfolgszustand implementieren.
|
||||
5. Resource-ID serverseitig gegen eine Allowlist vorhandener Ressourcen
|
||||
validieren, nicht nur gegen ein Zeichenmuster.
|
||||
6. Datenschutztext und Speicherfristen anpassen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Unit: Client- und Servervalidierung fuer alle Pflichtfelder.
|
||||
- Unit: Unbekannte Resource-ID wird abgelehnt.
|
||||
- Integration: Gueltige Anfrage liefert erwartete lokale Download-URL.
|
||||
- Integration: Honeypot erzeugt keine Lead-Datei.
|
||||
- Integration: Fehler beim Speichern liefert keinen Download-Erfolg.
|
||||
- Browser: Download-Button besitzt eine echte Funktion.
|
||||
- Browser: Fehler- und Ladezustand sind sichtbar und zugaenglich.
|
||||
- Security: Keine Pfadmanipulation ueber Resource-ID.
|
||||
|
||||
Akzeptanzkriterien:
|
||||
|
||||
- Kein sichtbarer Button ohne Funktion.
|
||||
- Download und Datenschutzerklaerung entsprechen derselben gewaehlten Variante.
|
||||
|
||||
## 7. Prioritaet 3: SEO und Dokumentstruktur
|
||||
|
||||
Branch-Vorschlag:
|
||||
|
||||
```text
|
||||
fix/andreknie-seo
|
||||
```
|
||||
|
||||
### 7.1 SEOHead normalisieren
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
index.html
|
||||
src/components/SEOHead.jsx
|
||||
src/pages/*.jsx
|
||||
public/images/*
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. API von `SEOHead` eindeutig machen: `title` ist immer ohne Brand-Suffix.
|
||||
2. Brand-Suffix zentral genau einmal hinzufuegen.
|
||||
3. Statische Metadaten in `index.html` als kompatiblen Fallback gestalten,
|
||||
sodass React Helmet keine konkurrierenden doppelten Tags erzeugt.
|
||||
4. Canonical-Link ergaenzen.
|
||||
5. Open-Graph- und Twitter-Metadaten vervollstaendigen.
|
||||
6. Ein tatsaechlich vorhandenes OG-Bild bereitstellen.
|
||||
7. Jede Route mit individuellem Titel, Description und Canonical versehen.
|
||||
8. Artikel und Kniepunkte aus ihren Content-Metadaten versorgen.
|
||||
9. 404-Seite mit `noindex,follow` auszeichnen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Unit fuer `SEOHead`: Brand erscheint genau einmal.
|
||||
- Unit: Relative und absolute Bild-URLs werden korrekt behandelt.
|
||||
- Browser je Route: genau ein aktiver Titel.
|
||||
- Browser je Route: genau eine Description.
|
||||
- Browser je Route: genau ein Canonical-Link.
|
||||
- Browser Artikel: Titel und Description stammen aus dem Artikel.
|
||||
- Browser Kniepunkt: Titel, Description, URL und Bild stimmen mit der Ausgabe
|
||||
ueberein.
|
||||
- Asset-Test: OG-Bild liefert lokal und live HTTP 200.
|
||||
- Build: Keine Helmet- oder React-Warnungen.
|
||||
|
||||
Akzeptanzkriterien:
|
||||
|
||||
- Kein Titel enthaelt `Dr. Andre Knie` doppelt.
|
||||
- Keine konkurrierenden Description-Tags.
|
||||
- Alle 15 Routen haben passende Metadaten.
|
||||
|
||||
### 7.2 Ueberschriften und Landmarks korrigieren
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/pages/Articles.jsx
|
||||
src/pages/ArticleSingle.jsx
|
||||
src/pages/KniepunktIssue.jsx
|
||||
plugins/vite-plugin-content.js
|
||||
content/kniepunkt/*
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Artikeluebersicht und Artikeldetail mit einem `main`-Landmark versehen.
|
||||
2. Kniepunkt-Titel nur einmal als `h1` rendern.
|
||||
3. Bevorzugt Markdown-Content beim Build normalisieren oder den ersten
|
||||
redundanten H1 kontrolliert entfernen.
|
||||
4. Keine pauschale Regex-Manipulation verwenden, wenn ein Markdown-AST oder
|
||||
`marked`-Hook die Struktur sicherer bearbeiten kann.
|
||||
5. Ueberschriftenhierarchie in allen Detailseiten pruefen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Browser: Jede Route besitzt genau ein `main`.
|
||||
- Browser: Jede normale Seite besitzt genau ein `h1`.
|
||||
- Unit Content-Plugin: Markdown mit und ohne initiales H1 wird korrekt gerendert.
|
||||
- Regression: Bestehende Artikelkoerper verlieren keine Inhalte.
|
||||
|
||||
## 8. Prioritaet 4: Barrierefreiheit
|
||||
|
||||
Branch-Vorschlag:
|
||||
|
||||
```text
|
||||
fix/andreknie-accessibility
|
||||
```
|
||||
|
||||
### 8.1 Navigation und Formulare
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/components/Navigation.jsx
|
||||
src/components/BottomDock.jsx
|
||||
src/pages/Contact.jsx
|
||||
src/components/NewsletterSignup.jsx
|
||||
src/components/SpeakerCvRequest.jsx
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Jedem Dock-Link einen zugreifbaren Namen geben.
|
||||
2. Aktive Route mit `aria-current="page"` markieren, auch auf Detailrouten.
|
||||
3. Hamburger um `aria-expanded` und `aria-controls` ergaenzen.
|
||||
4. Label zwischen `Menue oeffnen` und `Menue schliessen` wechseln.
|
||||
5. Menue per Escape schliessbar machen.
|
||||
6. Formularlabels mit eindeutigen `id`/`htmlFor` verbinden.
|
||||
7. Fehlertexte mit `aria-describedby` verknuepfen.
|
||||
8. Serverfehler und Erfolgsmeldungen ueber `aria-live` bekanntgeben.
|
||||
9. Honeypots mit `hidden` oder einer gleichwertigen robusten Loesung vollstaendig
|
||||
aus Accessibility- und Tab-Reihenfolge entfernen.
|
||||
10. Sichtbare Fokusdarstellung fuer Suchfelder und Buttons sicherstellen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Component-Test Navigation: `aria-expanded` folgt dem Menuezustand.
|
||||
- Component-Test Navigation: Escape schliesst das Menue.
|
||||
- Component-Test BottomDock: Jeder Link hat einen Namen.
|
||||
- Component-Test Forms: Labels sind programmatisch zugeordnet.
|
||||
- Component-Test Forms: Fehler referenzieren das richtige Feld.
|
||||
- Tastaturtest: Komplette Navigation ohne Maus.
|
||||
- Browser-Snapshot: Honeypot erscheint nicht im Accessibility-Baum.
|
||||
- Browser-Snapshot: Dock-Links besitzen eindeutige Namen.
|
||||
|
||||
### 8.2 Testimonials und Logos
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/components/TestimonialSlider.jsx
|
||||
src/components/TestimonialSlider.css
|
||||
src/components/LogoMarquee.jsx
|
||||
src/components/LogoMarquee.css
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Nur einen logischen Satz Testimonials fuer Assistenztechnologien exponieren.
|
||||
2. Technische Loop-Kopien mit `aria-hidden="true"` ausblenden.
|
||||
3. Sichtbaren aktiven Eintrag beziehungsweise Carousel-Position semantisch
|
||||
bekanntgeben.
|
||||
4. Pfeile und Scrollbereich per Tastatur bedienbar machen.
|
||||
5. Logo-Duplikate fuer Screenreader ausblenden.
|
||||
6. Animationen bei Fokus/Hover pausierbar machen.
|
||||
7. Bestehendes visuelles Endlosverhalten und Zentrierung erhalten.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Component-Test: Bei drei Testimonials werden fuer Screenreader nur drei
|
||||
logische Inhalte exponiert.
|
||||
- Browser-Snapshot: Keine 27 vorgelesenen Testimonials.
|
||||
- Browser-Snapshot: Keine dreifach vorgelesenen Logos.
|
||||
- Desktop: zehnmal rechts und zehnmal links ohne sichtbaren Sprung.
|
||||
- Mobile: Swipe bleibt funktionsfaehig.
|
||||
- Tastatur: Vor/zurueck funktioniert und Fokus bleibt sichtbar.
|
||||
|
||||
### 8.3 Reduced Motion und Canvas-Lebenszyklus
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/index.css
|
||||
src/pages/Home.css
|
||||
src/components/BottomDock.css
|
||||
src/components/LogoMarquee.css
|
||||
src/components/StatsCube.css
|
||||
src/components/BackgroundPattern.jsx
|
||||
src/components/DotCloudIcon.jsx
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Zentrale `prefers-reduced-motion: reduce`-Regeln ergaenzen.
|
||||
2. Endlos-CSS-Animationen stoppen oder auf einen statischen Zustand setzen.
|
||||
3. Canvas-Animationen bei Reduce Motion nicht starten.
|
||||
4. Canvas-Animationen pausieren, wenn der Tab verborgen ist.
|
||||
5. Optional Intersection Observer verwenden, damit nicht sichtbare Canvas-
|
||||
Komponenten keine Frames berechnen.
|
||||
6. `getComputedStyle` nicht in jedem Animationsframe erneut lesen.
|
||||
7. Debug-Logs aus `DotCloudIcon` entfernen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Browser mit Reduce Motion: keine Endlosanimationen.
|
||||
- Browser normal: Design und Interaktion bleiben erhalten.
|
||||
- Component-Test: `requestAnimationFrame` wird beim Unmount abgebrochen.
|
||||
- Component-Test: Reduce Motion startet keinen Animationsloop.
|
||||
- Console-Test: Keine DotCloud-Debugausgaben.
|
||||
|
||||
## 9. Prioritaet 5: Performance, Dependencies und Deployment
|
||||
|
||||
Branch-Vorschlag:
|
||||
|
||||
```text
|
||||
perf/andreknie-initial-load
|
||||
```
|
||||
|
||||
### 9.1 Initialen Bundle verkleinern
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
src/App.jsx
|
||||
src/hooks/useContent.js
|
||||
plugins/vite-plugin-content.js
|
||||
vite.config.js
|
||||
```
|
||||
|
||||
Umsetzung in zwei getrennten Schritten:
|
||||
|
||||
1. Routen mit `React.lazy` und `Suspense` code-splitten.
|
||||
2. Danach Content-Auslieferung umbauen:
|
||||
- Listenmetadaten von vollstaendigen HTML-Bodies trennen.
|
||||
- Detailinhalte nur fuer die aufgerufene Detailseite laden.
|
||||
- Build-Zeit-Generierung beibehalten; kein unnoetiges neues CMS einfuehren.
|
||||
3. Einen stabilen Ladezustand ohne Layoutsprung bereitstellen.
|
||||
4. Chunk-Grenzwert als CI-Pruefung dokumentieren.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Build: mehrere Route-Chunks statt eines einzigen App-Chunks.
|
||||
- Bundle-Messung vor/nachher dokumentieren.
|
||||
- Zielwert initiales JS: deutlich unter dem aktuellen Build von ca. 805 KB
|
||||
unkomprimiert.
|
||||
- Browser: Direktaufruf jeder Route funktioniert.
|
||||
- Browser: Reload einer Detailroute funktioniert hinter Caddy-Fallback.
|
||||
- Browser: Keine leeren Seiten waehrend Lazy Loading.
|
||||
- Regression: Alle 62 Artikel, 48 Kniepunkte und 19 Podcast-Eintraege bleiben
|
||||
erreichbar.
|
||||
|
||||
### 9.2 Dependency-Findings bearbeiten
|
||||
|
||||
Betroffene Dateien:
|
||||
|
||||
```text
|
||||
package.json
|
||||
package-lock.json
|
||||
```
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. `npm audit --omit=dev` erneut ausfuehren.
|
||||
2. React-Router-Advisory auf Anwendbarkeit pruefen.
|
||||
3. Keine automatische Downgrade-Empfehlung ungeprueft anwenden.
|
||||
4. Auf eine nachweislich gefixte kompatible Version aktualisieren.
|
||||
5. Router-Verhalten aller Routen testen.
|
||||
6. Audit als CI-Schritt einbauen, wenn das Repository dies ohne instabile
|
||||
Netzwerkfehler erlaubt.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- `npm audit --omit=dev`
|
||||
- Build und Source-Lint.
|
||||
- Direktnavigation und Client-Navigation aller Routen.
|
||||
- Browser Back/Forward.
|
||||
- 404 und Detailrouten.
|
||||
|
||||
### 9.3 Deployment-Artefakte bereinigen
|
||||
|
||||
Betroffene Datei:
|
||||
|
||||
```text
|
||||
.gitea/workflows/deploy.yml
|
||||
```
|
||||
|
||||
Aktuelles Problem:
|
||||
|
||||
- Neue `dist/assets` werden nach `site/assets` kopiert.
|
||||
- Alte gehashte Dateien werden nicht entfernt.
|
||||
- Aktueller Bestand beim Review: 29 Dateien, ca. 28.5 MB.
|
||||
|
||||
Umsetzung:
|
||||
|
||||
1. Neues Build zuerst in ein separates Release-Verzeichnis kopieren.
|
||||
2. Vollstaendigkeit des Releases pruefen.
|
||||
3. `site` atomar oder kontrolliert auf den neuen Stand umschalten.
|
||||
4. Rollback ueber ein klar begrenztes vorheriges Release ermoeglichen.
|
||||
5. Nicht mit einer ungesicherten rekursiven Loeschung auf einem berechneten
|
||||
Pfad arbeiten.
|
||||
6. Caddy-Konfiguration und Umami-Dateien nicht versehentlich entfernen.
|
||||
7. Alte Releases nach einer definierten Anzahl kontrolliert bereinigen.
|
||||
|
||||
Vorgesehene Tests:
|
||||
|
||||
- Workflow-Test auf Feature-Branch ohne Produktionsumschaltung, falls
|
||||
Infrastruktur dies unterstuetzt.
|
||||
- Build-Artefakt enthaelt `index.html`, aktuelle JS-/CSS-Dateien und Assets.
|
||||
- Keine Referenz in `index.html` zeigt auf eine geloeschte Datei.
|
||||
- Rollback-Test auf das unmittelbar vorherige Release.
|
||||
- Nach Deployment: Startseite und eine Detailroute liefern HTTP 200.
|
||||
- Live: HTML referenziert genau den neuen Bundle-Hash.
|
||||
- Live: Umami-Script und CSP bleiben erhalten.
|
||||
|
||||
## 10. Abschluss-Quality-Gates je Paket
|
||||
|
||||
Pflicht:
|
||||
|
||||
```powershell
|
||||
& 'C:\Users\knie\.cache\codex-runtimes\codex-primary-runtime\dependencies\bin\fallback\pnpm.cmd' run build
|
||||
& 'C:\Users\knie\.cache\codex-runtimes\codex-primary-runtime\dependencies\bin\fallback\pnpm.cmd' run test
|
||||
.\node_modules\.bin\eslint.CMD src server plugins vite.config.js
|
||||
git diff --check
|
||||
git status --short
|
||||
```
|
||||
|
||||
Zusaetzlich je nach Paket:
|
||||
|
||||
- Backend: Integrations-Tests der betroffenen Routes.
|
||||
- UI: Desktop- und Mobile-Browserpruefung.
|
||||
- Accessibility: DOM-/Accessibility-Snapshot und Tastaturpruefung.
|
||||
- SEO: Anzahl und Inhalt aller Head-Tags kontrollieren.
|
||||
- Performance: Buildgroessen vor/nachher festhalten.
|
||||
- Deployment: Gitea-Run und Live-Bundle verifizieren.
|
||||
|
||||
Ein Paket ist erst fertig, wenn:
|
||||
|
||||
- alle vorgesehenen Tests gruen sind,
|
||||
- keine unerklaerten Warnungen neu hinzugekommen sind,
|
||||
- der Diff auf das Paket begrenzt ist,
|
||||
- PR/MR erstellt und geprueft wurde,
|
||||
- bei beauftragtem Deployment der Gitea-Run erfolgreich ist,
|
||||
- die konkrete Aenderung live verifiziert wurde.
|
||||
|
||||
## 11. Empfohlene Paket-Reihenfolge
|
||||
|
||||
1. Datenschutz und Ausfallsicherheit
|
||||
2. Mobiles Bottom-Dock
|
||||
3. SEO und Dokumentstruktur
|
||||
4. Barrierefreiheit
|
||||
5. Ressourcen-Flow nach Benutzerentscheidung
|
||||
6. Performance und Dependencies
|
||||
7. Deployment-Artefakte
|
||||
|
||||
Die Pakete 1 und 2 haben den groessten unmittelbaren Nutzen. SEO und
|
||||
Barrierefreiheit koennen danach unabhaengig bearbeitet werden. Die
|
||||
Content-/Bundle-Architektur sollte erst angefasst werden, wenn die funktionalen
|
||||
Flows stabil und ausreichend getestet sind.
|
||||
|
||||
## 12. Startprompt fuer einen neuen Codex-Chat
|
||||
|
||||
Der Benutzer ersetzt `<ARBEITSPAKET>` durch genau eines der oben beschriebenen
|
||||
Pakete.
|
||||
|
||||
```text
|
||||
Arbeite im Orchestrator-Monorepo unter C:\Coding\Orchestrator an andreknie.de.
|
||||
Die Source of Truth ist ausschliesslich
|
||||
C:\Coding\Orchestrator\privat\CV\andreknie.de. Verwende nicht das alte
|
||||
GitHub-Repository und keine separate Clone-Kopie.
|
||||
|
||||
Lies zuerst vollstaendig:
|
||||
- C:\Coding\Orchestrator\AGENTS.md
|
||||
- C:\Coding\Orchestrator\.agents\AGENTS.md
|
||||
- die relevanten Dateien unter C:\Coding\Orchestrator\.kiro\steering\
|
||||
- C:\Coding\Orchestrator\privat\CV\andreknie.de\README.md
|
||||
- C:\Coding\Orchestrator\privat\CV\andreknie.de\DEPLOYMENT-PLAN.md
|
||||
- C:\Coding\Orchestrator\privat\CV\andreknie.de\.gitea\workflows\deploy.yml
|
||||
- C:\Coding\Orchestrator\privat\CV\andreknie.de\FINDINGS-REMEDIATION-PLAN.md
|
||||
|
||||
Setze ausschliesslich dieses Arbeitspaket aus dem Plan um:
|
||||
<ARBEITSPAKET>
|
||||
|
||||
Vorgehen:
|
||||
1. Verifiziere den aktuellen Stand und das Finding.
|
||||
2. Erstelle einen Feature-Branch nach den Repository-Regeln.
|
||||
3. Implementiere nur den Scope des ausgewaehlten Pakets.
|
||||
4. Fuehre alle im Plan vorgesehenen Tests sowie Build, Tests und gezielten
|
||||
Source-Lint aus.
|
||||
5. Pruefe Desktop und Mobile, sofern UI betroffen ist.
|
||||
6. Zeige mir danach Findings, Aenderungen, Testergebnisse und verbleibende
|
||||
Risiken.
|
||||
7. Nutze Gitea und die dokumentierte Hub-and-Spoke-Foederation. Nicht direkt
|
||||
auf master/main pushen.
|
||||
8. Erstelle einen PR/MR, aber merge und deploye erst, wenn ich das in diesem
|
||||
Chat ausdruecklich freigebe.
|
||||
|
||||
Schuetze personenbezogene Daten und Secrets. Sende keine echten Formulare in
|
||||
der Live-Umgebung ab. Erfinde keine Deployment- oder Federationsschritte,
|
||||
sondern halte dich an die vorhandenen Anleitungen.
|
||||
```
|
||||
Reference in New Issue
Block a user