# DOGFATHER UNIVERSE — Arbeitsanweisungen

Lies zuerst die ausführliche Projekt-Doku im Vault: `DogFather Website.md` und
`DogFather Website - Offene Punkte.md` (falls von dort aus zugreifbar). Dieses File ist die
kompakte, technische Checkliste für direkte Arbeit in diesem Ordner.

## Perfektions-Anspruch (ausdrücklicher Wunsch, 02.08.2026)

Nicht nur das explizit Genannte umsetzen, sondern mitdenken und proaktiv vervollständigen —
auch das, was der Nutzer vergisst zu erwähnen, aber offensichtlich zur Aufgabe gehört.
Kontinuierlich verbessern, nicht nur einmalig abhaken. Bei jedem "Tagescheck" auch die eigene
zuletzt geleistete Arbeit fachlich re-auditieren, nicht nur Uptime prüfen.

## Vor jeder neuen Aufgabe kurz durchgehen

1. **i18n ist Pflicht bei jedem sichtbaren Text**: alle 5 Sprachen sofort mitliefern — de,
   de-CH (ECHTER Schweizerdeutscher Dialekt, nicht nur ß→ss), en, fr, pt. Gilt auch für Texte,
   die nur per JS gesetzt werden (`window.dogiUebersetzen()` / `window.dogiFeld()` in
   `assets/js/main.js` nutzen), nicht nur `data-i18n`-Attribute.
   - **Bekannter Bug-Klassiker**: `<h3>` in Karten-Grids ohne `data-i18n` (nur `<p>` darunter
     übersetzt) → gemischtsprachige Anzeige. Vor Abschluss IMMER:
     `grep -noP '<h[1-4][^>]*>[^<]*</h[1-4]>' <seite>.html | grep -v data-i18n` — jeden Treffer
     bewusst freigeben (Eigenname/dynamisch `${...}`) oder fixen.
2. **Validieren vor jedem Deploy**: `node --check` je geänderter `.js`, plus Key/Sprachen-Check:
   ```bash
   node -e "
   const fs=require('fs');
   const html=fs.readFileSync('<seite>.html','utf8');
   const keysInHtml=[...new Set([...html.matchAll(/data-i18n=\"([^\"]+)\"/g)].map(m=>m[1]))];
   global.window = {};
   eval(fs.readFileSync('assets/js/i18n-<seite>.js','utf8'));
   const dict = window.I18N_PAGE;
   let missingLang=[];
   for(const k of keysInHtml){ for(const lang of ['de','de-CH','en','fr','pt']){ if(!dict[k] || !dict[k][lang]) missingLang.push(k+':'+lang); } }
   console.log('Keys HTML:', keysInHtml.length, 'Keys dict:', Object.keys(dict).length, 'Fehlende Sprachen:', missingLang);
   "
   ```
   Muss `Fehlende Sprachen: []` zeigen. Bei HTML-Edits zusätzlich Tag-Balance prüfen (öffnende
   == schließende `div`/`section`/`a`/`p`/`h1-h3`).
3. **Nach jedem Deploy live verifizieren** (nicht nur der "Success"-Meldung von `wrangler`
   glauben): headless Chrome via CDP starten, Sprache umschalten, tatsächlichen Text auslesen.
4. **Chrome-Testprozesse NIE mit `taskkill /F /IM chrome.exe`** — killt alle echten Chrome-
   Fenster des Nutzers. Immer nur per exakter PID oder `--user-data-dir`-Profilname gezielt
   beenden (z.B. `Get-CimInstance Win32_Process -Filter "Name='chrome.exe'" | Where-Object {
   $_.CommandLine -match '<eindeutiger-profilname>' } | Stop-Process`).
5. Wenn der Nutzer "Screen"/"screen" sagt, ist immer "Screenshot" gemeint.
6. Nach Verifikation aufräumen: temporäre Dateien/Chrome-Profile entfernen.
7. Nach größeren Batches (viele Seiten parallel via Subagenten): eigenständigen Nachaudit-Sweep
   über das GESAMTE Projekt fahren, nicht nur die zuletzt bearbeiteten Dateien — Fehler stecken
   erfahrungsgemäß auch in älteren, scheinbar fertigen Seiten (Muster/Konvention entstand erst
   später).
8. Commit-Nachrichten immer auf Deutsch, präzise, mit Begründung ("warum", nicht nur "was").

## Projekt-Fakten (Kurzfassung)

- Statisches HTML/CSS/Vanilla-JS, kein Build-Tool, kein Bundler.
- Deploy: `npx wrangler deploy` aus diesem Ordner (Cloudflare Workers Static Assets).
- i18n-Engine in `assets/js/main.js`: `I18N_CORE` (sitewide), `window.I18N_PAGE` (pro Seite aus
  `assets/js/i18n-<seite>.js`), `t()`/`window.dogiUebersetzen()`/`window.dogiFeld()`.
- Personendaten (Scouts/Modis/Creator) in `assets/js/data-*.js` — role/bio/bioHtml/intro/quote
  sind mehrsprachige Objekte `{ de, "de-CH", en, fr, pt }`, aufgelöst über `window.dogiFeld()`.
- Nur Persona-Namen öffentlich (Dogfather/Dogi) — keine echten bürgerlichen Daten ohne
  ausdrückliche Freigabe.
- Fotos/Bilder nur nach expliziter Freigabe verwenden, nicht eigenständig in privaten Ordnern
  suchen.
