Arbeitsschloss: zwei Sitzungen sehen sich jetzt

HEUTE ZWEIMAL NUR GUTGEGANGEN. Zwei Claude-Sitzungen arbeiteten
gleichzeitig in diesem Verzeichnis, ohne voneinander zu wissen.
Keine hat etwas falsch gemacht — sie konnten es nicht wissen.

  * Beide haben `git add -A` benutzt. Haette die eine
    unfestgeschriebene Arbeit der anderen im Baum gehabt, waere sie
    mitcommittet worden — unter fremdem Namen, in einer fremden
    Begruendung, und niemandem waere es aufgefallen. Nachgesehen:
    diesmal war nichts dabei.
  * Beide haben den Stempellauf gestartet. Der schreibt 45 Dateien
    um. Wer dort eine offen hatte, bekam sie unter den Haenden weg
    geaendert.

Dasselbe hat in RunOne am 03.09.2026 sieben Minuten Ausfall
gekostet. Dort gibt es seitdem `arbeitsschloss.sh`; diese Fassung
uebernimmt seine Lehren.

WAS ES IST UND WAS NICHT. Es ist kein Riegel — wer wirklich muss,
kommt vorbei. Es beantwortet die eine Frage, die heute niemand
beantworten konnte: „arbeitet hier gerade sonst jemand?"

Die teuren Fehler liegen bei einem Schloss alle in derselben
Richtung: Es blockiert zu viel und wird deshalb abgeschafft. Also:

  * Es blockiert NICHT, wenn das Schloss DEINES ist. RunOnes erste
    Fassung fragte „ist abgeschlossen" statt „haelt es jemand
    anders" — damit haette, wer ordentlich abschliesst, nie mehr
    ausliefern koennen. Dafuer gibt es `fremd`.
  * Es VERFAELLT nach zwei Stunden, und dass da jemand war, steht
    beim Uebernehmen dabei.
  * Es blockiert NICHT, wenn es selbst unlesbar ist — dritter
    Ausgang, kein Stillstand.
  * Notausgang: SCHLOSS_ZWANG=ja git commit …

DAS PROBLEM, AN DEM RUNONE HAENGT, IST HIER GELOEST. Dort faellt die
Kennung im Zweifel auf den Systembenutzer zurueck, und zwei
Claudian-Sitzungen laufen BEIDE als `claudian` — die Sicherung griff
ausgerechnet zwischen den zwei Faellen nicht, fuer die sie gebaut
wurde. Deshalb ist dort `export ARBEITER=…` Pflicht, und Pflicht
heisst: man vergisst es.

Hier steht `CLAUDE_CODE_SESSION_ID` in jeder Sitzung und ist je
Sitzung verschieden (nachgesehen, 36 Zeichen UUID). Zwei Sitzungen
auf demselben Windows-Benutzer unterscheiden sich damit von selbst,
ohne dass jemand etwas tun muss. Reihenfolge: ARBEITER, dann
Sitzungskennung, dann Benutzername MIT Warnung.

NIEMAND MUSS DARAN DENKEN:
  * die beiden Stempelwerkzeuge nehmen es selbst und geben es selbst
    frei — auch nach einem Absturz und bei Strg+C (wie `bauen.sh` im
    Shop; eines, an das man denken muss, wird vergessen und ab da
    umgangen)
  * `tools/git-haken/pre-commit` bricht jeden Commit ab, solange
    jemand ANDERS das Schloss haelt. Das ist die Stelle, die heute
    gefehlt hat: `git add -A` ist der Griff, den man ohne Nachdenken
    macht, und gegen einen Reflex hilft keine Regel auf Papier.
  * `core.hooksPath` statt `.git/hooks` — letzteres ist nicht
    versioniert und waere nach einem Klon genau dann leer, wenn es
    gebraucht wird.

GEPRUEFT, server/pruef-arbeitsschloss.mjs: 33 Pruefungen, 0 Fehler —
in einem WEGWERF-Verzeichnis mit eigenem git, damit kein echtes
Schloss angefasst wird. Darunter am echten git:

    ohne Schloss committen        -> geht      (0)
    mit dem EIGENEN Schloss       -> geht      (0)
    mit einem FREMDEN Schloss     -> bricht ab (1), nennt wer und warum
    und es stehen genau ZWEI Commits da, nicht drei
    SCHLOSS_ZWANG=ja              -> kommt vorbei
    ohne das Schloss-Werkzeug     -> laesst durch

Dazu: verfallenes Schloss laesst durch, mit laengerer Frist blockt
dasselbe Schloss wieder (Gegenprobe), unlesbarer Inhalt und
unlesbarer Zeitstempel blockieren nicht.

Portnummern nach der neuen Pruefdatei nachgemessen: Pruefbereich bis
5415, 462 Nummern, 0 Kollisionen. pruef-struktur 75/0,
pruef-fingermass 5/0, pruef-ports 10/0.

In DEPLOY.md steht es jetzt an erster Stelle — eine Sicherung, von
der nur der weiss, der sie gebaut hat, ist die erste, die umgangen
wird.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-01 20:04:28 +02:00
co-authored by Claude Opus 5
parent 1afb38258c
commit 603319a145
102 changed files with 1956 additions and 1199 deletions
+6 -6
View File
@@ -11,15 +11,15 @@
<title>Ablauf — Dogfather Webdesign</title>
<meta name="description" content="Von der Anfrage bis zur Übergabe: sieben Schritte, jeweils mit dem, was du machst, was ich mache und was am Ende dabei herauskommt." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* Zeitstrahl: die Linie verbindet die Nummernkreise. Sie liegt hinter
den Kreisen (z-index) und endet beim letzten Schritt, damit sie nicht
@@ -188,7 +188,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-ablauf.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-ablauf.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
</body>
</html>
+7 -7
View File
@@ -11,15 +11,15 @@
<title>Projekt anfragen — Dogfather Webdesign</title>
<meta name="description" content="Vier kurze Schritte zu deiner unverbindlichen Projektanfrage. Kostenlos, ohne Vertrag, mit Zusammenfassung vor dem Absenden." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* ---------- Schrittanzeige ----------
Zeigt alle vier Schritte gleichzeitig statt nur "3 von 4". Man sieht
@@ -423,8 +423,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-anfrage.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/wd-anfrage.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-anfrage.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
<script src="/assets/js/wd-anfrage.js?v=202610012001"></script>
</body>
</html>
+2 -2
View File
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<html lang="de">
<head>
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta charset="UTF-8" />
<!-- viewport-fit=cover ist die Voraussetzung dafuer, dass env(safe-area-inset-*)
ueberhaupt einen Wert liefert. Ohne diese Angabe gibt jedes env() null zurueck
+6 -6
View File
@@ -11,15 +11,15 @@
<title>Häufige Fragen — Dogfather Webdesign</title>
<meta name="description" content="Preise, Dauer, Inhalte, Änderungen, Hosting, Rechte, Zahlung und Veröffentlichung — offen beantwortet." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
.fq-thema { scroll-margin-top: 90px; }
.fq-thema + .fq-thema { margin-top: clamp(2rem, 4vw, 3rem); }
@@ -200,7 +200,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-faq.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-faq.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
</body>
</html>
+10 -10
View File
@@ -11,18 +11,18 @@
<title>Dogfather Webdesign — individuelle Webseiten, persönlich umgesetzt</title>
<meta name="description" content="Individuell gebaute Webseiten statt Baukasten: Onepager ab 300 €, professionelle Websites ab 500 €, Shops ab 1.000 €. Klare Preise, klare Zeitrahmen, eine feste Ansprechperson." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<!-- Als App installierbar auf Handy und Computer. iOS ignoriert das
Manifest für das Startbildschirm-Symbol vollständig und nimmt NUR
apple-touch-icon — deshalb beides. -->
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* ---------- Nur auf der Startseite gebraucht ---------- */
@@ -115,7 +115,7 @@
Das Skript ganz unten blendet es nur ein, wenn man in dieser
Browser-Sitzung gerade erst durch die Zugangswand gekommen ist. -->
<div class="wd-intro" id="wd-intro" hidden>
<img class="wd-intro-logo" src="/assets/img/logo-dogfather-transparent.png?v=202610011927" alt="" width="472" height="476" />
<img class="wd-intro-logo" src="/assets/img/logo-dogfather-transparent.png?v=202610012001" alt="" width="472" height="476" />
<p class="wd-intro-gruss" id="wd-intro-gruss">Willkommen</p>
<p class="wd-intro-unter" data-i18n="intro_unter">Dogfather Webdesign — Vorabversion</p>
<button type="button" class="wd-intro-skip" id="wd-intro-skip" data-i18n="intro_ueberspringen">Überspringen</button>
@@ -263,7 +263,7 @@
<div class="wd-grid wd-grid--2" style="margin-top:2.2rem">
<article class="wd-karte wd-projekt wd-auf">
<img class="wd-projekt-bild" src="/assets/img/wd-projekt-universe.jpg?v=202610011927"
<img class="wd-projekt-bild" src="/assets/img/wd-projekt-universe.jpg?v=202610012001"
alt="Startseite von dogfather-universe.com" width="1200" height="750" loading="lazy" decoding="async"
data-i18n-attr="alt:pf_universe_alt" />
<div class="wd-projekt-text">
@@ -289,7 +289,7 @@
Hinweisbalken ganz oben wurde bewusst weggeschnitten — er
gehört nicht in ein Portfolio. -->
<article class="wd-karte wd-karte--lila wd-projekt wd-auf">
<img class="wd-projekt-bild" src="/assets/img/wd-projekt-vandiy.jpg?v=202610011927"
<img class="wd-projekt-bild" src="/assets/img/wd-projekt-vandiy.jpg?v=202610012001"
alt="Startseite von vans-diy-bastelbedarf.com" width="1200" height="696" loading="lazy" decoding="async"
data-i18n-attr="alt:pf_shop_alt" />
<div class="wd-projekt-text">
@@ -357,7 +357,7 @@
<section class="wd-abschnitt wd-abschnitt--gehoben">
<div class="wd-container">
<div class="wd-portrait-grid">
<img class="wd-portrait wd-auf" src="/assets/img/wd-dogfather-portrait.jpg?v=202610011927"
<img class="wd-portrait wd-auf" src="/assets/img/wd-dogfather-portrait.jpg?v=202610012001"
alt="Dogfather" width="900" height="1125" loading="lazy" decoding="async"
data-i18n-attr="alt:wd_foto_alt" />
<div>
@@ -426,8 +426,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-index.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-index.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
<script>
/* ---------------------------------------------------------------------
Marken-Intro (Masterplan S.3, Schritt 02: "Nach erfolgreichem Code
+6 -6
View File
@@ -11,15 +11,15 @@
<title>Leistungen — Dogfather Webdesign</title>
<meta name="description" content="Onepager, professionelle Website, Shop und Verwaltungsseiten: was jeweils enthalten ist, was extra kostet und wo die Grenze verläuft." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* Sprungmarken.
Frueher eine waagerecht wischbare Leiste. Rueckmeldung 22.08.2026:
@@ -416,7 +416,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-leistungen.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-leistungen.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
</body>
</html>
+7 -7
View File
@@ -10,15 +10,15 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>Kundenportal — Dogfather Webdesign</title>
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/portal-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/portal-32.png?v=202610012001" />
<meta name="theme-color" content="#924985" />
<link rel="manifest" href="/webdesign/portal.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/portal-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/portal-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
.po-login { max-width: 440px; margin: clamp(1.5rem,6vh,4rem) auto; }
@@ -199,8 +199,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-portal.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/wd-portal.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-portal.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
<script src="/assets/js/wd-portal.js?v=202610012001"></script>
</body>
</html>
+12 -12
View File
@@ -11,15 +11,15 @@
<title>Portfolio — Dogfather Webdesign</title>
<meta name="description" content="Echte Projekte statt erfundener Beispiele: Website, Onlineshop, Spieleseite, Buchhaltung, Auswertung und eine Rechtsplattform — jeweils mit Ausgangslage, Lösung und Ergebnis." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* GENAU zwei Projekte nebeneinander.
@@ -160,7 +160,7 @@
dazukommt. -->
<div class="pfo-raster">
<article class="wd-karte pfo-projekt wd-auf">
<img class="pfo-bild" src="/assets/img/wd-projekt-universe.jpg?v=202610011927"
<img class="pfo-bild" src="/assets/img/wd-projekt-universe.jpg?v=202610012001"
alt="Startseite von dogfather-universe.com" width="1200" height="750" loading="lazy" decoding="async"
data-i18n-attr="alt:p1_alt" />
<div class="pfo-inhalt">
@@ -211,7 +211,7 @@
<!-- ---------------- Projekt 2 ---------------- -->
<article class="wd-karte wd-karte--lila pfo-projekt wd-auf">
<img class="pfo-bild" src="/assets/img/wd-projekt-vandiy.jpg?v=202610011927"
<img class="pfo-bild" src="/assets/img/wd-projekt-vandiy.jpg?v=202610012001"
alt="Startseite von vans-diy-bastelbedarf.com" width="1200" height="696" loading="lazy" decoding="async"
data-i18n-attr="alt:p2_alt" />
<div class="pfo-inhalt">
@@ -261,7 +261,7 @@
<!-- ---------------- Projekt 3 ---------------- -->
<article class="wd-karte wd-karte--aqua pfo-projekt wd-auf">
<img class="pfo-bild" src="/assets/img/wd-projekt-zockeranstalt.jpg?v=202610011927"
<img class="pfo-bild" src="/assets/img/wd-projekt-zockeranstalt.jpg?v=202610012001"
alt="Startseite von zockeranstalt.dogfather-universe.com" width="1200" height="750" loading="lazy" decoding="async"
data-i18n-attr="alt:p3_alt" />
<div class="pfo-inhalt">
@@ -311,7 +311,7 @@
<!-- ---------------- Projekt 4 ---------------- -->
<article class="wd-karte wd-karte--vip pfo-projekt wd-auf">
<img class="pfo-bild" src="/assets/img/wd-projekt-buchhaltung.jpg?v=202610011927"
<img class="pfo-bild" src="/assets/img/wd-projekt-buchhaltung.jpg?v=202610012001"
alt="Anmeldeseite von buchhaltung.vans-diy-bastelbedarf.com" width="1200" height="750" loading="lazy" decoding="async"
data-i18n-attr="alt:p4_alt" />
<div class="pfo-inhalt">
@@ -362,7 +362,7 @@
<!-- ---------------- Projekt 5 ---------------- -->
<article class="wd-karte wd-karte--premium pfo-projekt wd-auf">
<img class="pfo-bild" src="/assets/img/wd-projekt-analyse.jpg?v=202610011927"
<img class="pfo-bild" src="/assets/img/wd-projekt-analyse.jpg?v=202610012001"
alt="Startseite von analyse.dogfather-universe.com, die Gesichter sind zum Schutz der Beteiligten unkenntlich gemacht" width="1200" height="750" loading="lazy" decoding="async"
data-i18n-attr="alt:p5_alt" />
<div class="pfo-inhalt">
@@ -416,7 +416,7 @@
<!-- ---------------- Projekt 6 ---------------- -->
<article class="wd-karte wd-karte--premium pfo-projekt wd-auf">
<img class="pfo-bild" src="/assets/img/wd-projekt-safeaddress.jpg?v=202610011927"
<img class="pfo-bild" src="/assets/img/wd-projekt-safeaddress.jpg?v=202610012001"
alt="Zugangswand von safeaddress.dogfather-universe.com, die Gesichter sind zum Schutz der Beteiligten unkenntlich gemacht" width="1200" height="750" loading="lazy" decoding="async"
data-i18n-attr="alt:p6_alt" />
<div class="pfo-inhalt">
@@ -495,7 +495,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-portfolio.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-portfolio.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
</body>
</html>
+6 -6
View File
@@ -10,12 +10,12 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>Impressum, AGB &amp; Datenschutz — Dogfather Webdesign</title>
<meta name="description" content="Impressum, Allgemeine Geschäftsbedingungen, Widerrufsbelehrung und Datenschutzerklärung für Dogfather Webdesign." />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<meta name="theme-color" content="#564e95" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
</head>
<body class="wd">
<div id="wd-kopf"></div>
@@ -409,7 +409,7 @@
<!-- Das Woerterbuch MUSS vor wd-core geladen werden: Der Kern liest
window.I18N_WD beim Uebersetzen, und was noch nicht da ist, kann er
nicht einsetzen. -->
<script src="/assets/js/i18n-wd-rechtliches.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-rechtliches.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
</body>
</html>
+1 -1
View File
@@ -34,7 +34,7 @@
Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den
Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten
Stand fest. */
const CACHE_NAME = "dogfather-webdesign-202610011927";
const CACHE_NAME = "dogfather-webdesign-202610012001";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */
+7 -7
View File
@@ -11,15 +11,15 @@
<title>Über Dogfather — Dogfather Webdesign</title>
<meta name="description" content="Keine Agentur, keine Ticketnummer: wer hier baut, wie gearbeitet wird und woran das gelernt wurde." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
.ue-kopf { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.5rem, 4vw, 3rem); align-items: center; }
/* Auf dem Handy zuerst der Text, dann das Bild: sonst schiebt ein
@@ -48,7 +48,7 @@
<div class="wd-container">
<div class="ue-kopf">
<div class="ue-kopf-bild">
<img class="ue-portrait wd-auf" src="/assets/img/wd-dogfather-portrait.jpg?v=202610011927"
<img class="ue-portrait wd-auf" src="/assets/img/wd-dogfather-portrait.jpg?v=202610012001"
alt="Dogfather" width="900" height="1125" fetchpriority="high" decoding="async"
data-i18n-attr="alt:ue_foto_alt" />
</div>
@@ -146,7 +146,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-ueber.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-ueber.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
</body>
</html>
+22 -22
View File
@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>Verwaltung — Dogfather Webdesign</title>
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/wdverwalt-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/wdverwalt-32.png?v=202610012001" />
<meta name="theme-color" content="#b44f5e" />
<!-- EIGENES Manifest, nicht das des Webdesign-Bereichs (26.08.2026).
@@ -34,11 +34,11 @@
Nachgemessen, nicht vermutet: verwaltung.html antwortet ohne
Ausweis mit 302 auf zugang.html. -->
<link rel="manifest" href="/webdesign/verwaltung.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/wdverwalt-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/wdverwalt-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="DF Verwaltung" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* =====================================================================
Verwaltungsbereich — bewusst NUR AUF DEUTSCH.
@@ -106,32 +106,32 @@
:root {
/* Rueckfall, falls das Kennzeichen mal fehlt: Dann sieht es aus wie
die Uebersicht, statt gar nicht. */
--vw-motiv: url("/assets/img/cryo-wappen.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-wappen-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-wappen.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-wappen-klein.webp?v=202610012001");
--vw-farbe: var(--wd-blau-rgb);
--vw-blick: center top;
}
[data-vw-bereich="uebersicht"] {
--vw-motiv: url("/assets/img/cryo-wappen.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-wappen-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-wappen.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-wappen-klein.webp?v=202610012001");
--vw-farbe: var(--wd-blau-rgb);
--vw-blick: 76% 52%;
}
[data-vw-bereich="anfragen"] {
--vw-motiv: url("/assets/img/cryo-ring.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-ring-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-ring.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-ring-klein.webp?v=202610012001");
--vw-farbe: var(--wd-aqua-rgb);
--vw-blick: 72% 46%;
}
[data-vw-bereich="projekte"] {
--vw-motiv: url("/assets/img/cryo-monolith.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-monolith-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-monolith.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-monolith-klein.webp?v=202610012001");
--vw-farbe: var(--wd-lila-rgb);
--vw-blick: 80% 46%;
}
[data-vw-bereich="kunden"] {
--vw-motiv: url("/assets/img/cryo-thron.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-thron-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-thron.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-thron-klein.webp?v=202610012001");
/* Prism Indigo -- hier unbedenklich, weil es NUR Flaeche und Kante
faerbt. Als Schriftfarbe faellt es durch (3,25:1), deshalb steht
weiter unten ausdruecklich, dass die Schrift davon unberuehrt
@@ -140,8 +140,8 @@
--vw-blick: 84% 52%;
}
[data-vw-bereich="zahlungen"] {
--vw-motiv: url("/assets/img/cryo-kristall.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-kristall-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-kristall.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-kristall-klein.webp?v=202610012001");
--vw-farbe: var(--wd-gold-rgb);
/* Oberer Streifen: zeigt die geschwungenen Kristallbänder statt der
flachen Mitte -- siehe die .vw-buehne-Ausnahme weiter unten, die
@@ -149,8 +149,8 @@
--vw-blick: center 15%;
}
[data-vw-bereich="postfach"] {
--vw-motiv: url("/assets/img/cryo-ring.webp?v=202610011927");
--vw-motiv-klein: url("/assets/img/cryo-ring-klein.webp?v=202610011927");
--vw-motiv: url("/assets/img/cryo-ring.webp?v=202610012001");
--vw-motiv-klein: url("/assets/img/cryo-ring-klein.webp?v=202610012001");
--vw-farbe: var(--wd-ion-rgb);
/* Bewusst der andere Bildrand als bei "Anfragen": gleiches Bild,
voellig anderer Ausschnitt. */
@@ -190,7 +190,7 @@
inset: 0;
z-index: 0;
pointer-events: none;
background: var(--vw-motiv, url("/assets/img/cryo-wappen.webp?v=202610011927"))
background: var(--vw-motiv, url("/assets/img/cryo-wappen.webp?v=202610012001"))
center center / cover no-repeat;
/* Kein Zoom: "cover" zeigt bei einem 16:9-Motiv auf einem
ueblichen Bildschirm praktisch das ganze Bild. */
@@ -298,7 +298,7 @@
deshalb hier der Bildmittelpunkt, wo bei allen Motiven das
Hauptgeschehen sitzt. */
.vw-buehne {
background-image: var(--vw-motiv-klein, url("/assets/img/cryo-wappen-klein.webp?v=202610011927"));
background-image: var(--vw-motiv-klein, url("/assets/img/cryo-wappen-klein.webp?v=202610012001"));
background-position: center center;
}
/* Auf kleinen Schirmen liegt mehr Inhalt uebereinander, also etwas
@@ -942,7 +942,7 @@
rgb(3 8 16 / .92) 100%);
}
@media (max-width: 900px) {
.vw-login.wd-motiv::before { background-image: url("/assets/img/cryo-wappen-klein.webp?v=202610011927"); }
.vw-login.wd-motiv::before { background-image: url("/assets/img/cryo-wappen-klein.webp?v=202610012001"); }
}
/* ---------- Kopfleiste ---------- */
@@ -2395,7 +2395,7 @@
<div class="vw-detail-blatt" id="vw-detail-blatt"></div>
</div>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
<script>
/* =====================================================================
Verwaltung: Anfragen ansehen, Status ändern, Notizen, Archivieren.
+7 -7
View File
@@ -11,12 +11,12 @@
<title>Vertrag widerrufen — Dogfather Webdesign</title>
<meta name="description" content="Elektronische Widerrufsfunktion nach § 356a BGB — Vertrag online widerrufen, mit sofortiger Eingangsbestätigung." />
<meta name="robots" content="noindex, follow" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<meta name="theme-color" content="#564e95" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
</head>
<body class="wd">
<div id="wd-kopf"></div>
@@ -143,8 +143,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-widerruf.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/wd-widerruf.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-widerruf.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
<script src="/assets/js/wd-widerruf.js?v=202610012001"></script>
</body>
</html>
+9 -9
View File
@@ -14,7 +14,7 @@
nicht ausgeliefert wird; dieses meta wirkt auch dann, wenn die Datei
einmal ohne den Server geöffnet wird. -->
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610011927" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/webdesign-32.png?v=202610012001" />
<meta name="theme-color" content="#564e95" />
<!-- Auch hier Manifest und Symbol: die Zugangswand ist der ERSTE
Bildschirm überhaupt, also auch der, von dem aus installiert wird.
@@ -22,12 +22,12 @@
und führte dazu, dass eine Installation nur eine nackte Verknüpfung
ohne Symbol ergab. -->
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/webdesign-180.png?v=202610012001" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610011927" />
<link rel="stylesheet" href="/assets/css/main.css?v=202610012001" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=202610012001" />
<style>
/* =====================================================================
Zugangswand — nur hier gebraucht, deshalb bewusst NICHT in
@@ -115,7 +115,7 @@
<div class="zg-mitte">
<div class="zg-logo">
<img src="/assets/img/logo-dogfather-transparent.png?v=202610011927" alt="" width="472" height="476" />
<img src="/assets/img/logo-dogfather-transparent.png?v=202610012001" alt="" width="472" height="476" />
</div>
<span class="wd-eyebrow" data-i18n="zg_eyebrow">Nicht öffentlich bis zur Freigabe</span>
@@ -127,7 +127,7 @@
<!-- Karte 1: Dogfather -->
<form class="wd-karte wd-karte--kappe zg-karte zg-karte--dogfather" id="zg-form-dogfather" novalidate>
<div class="zg-karte-kopf">
<img class="zg-foto" src="/assets/img/wd-dogfather-karte.jpg?v=202610011927" alt="" width="76" height="76" />
<img class="zg-foto" src="/assets/img/wd-dogfather-karte.jpg?v=202610012001" alt="" width="76" height="76" />
<div>
<h2 class="zg-name" data-i18n="zg_dogfather">Dogfather</h2>
<p class="zg-rolle" data-i18n="zg_rolle">Volladministrator</p>
@@ -152,7 +152,7 @@
<!-- Karte 2: VanVan — gleiche Struktur, gleiche Rechte, eigene Farbwelt -->
<form class="wd-karte wd-karte--lila wd-karte--kappe zg-karte zg-karte--vanvan" id="zg-form-vanvan" novalidate>
<div class="zg-karte-kopf">
<img class="zg-foto" src="/assets/img/wd-vanvan-karte.jpg?v=202610011927" alt="" width="76" height="76" />
<img class="zg-foto" src="/assets/img/wd-vanvan-karte.jpg?v=202610012001" alt="" width="76" height="76" />
<div>
<h2 class="zg-name" data-i18n="zg_vanvan">VanVan</h2>
<p class="zg-rolle" data-i18n="zg_rolle">Volladministrator</p>
@@ -182,8 +182,8 @@
</div>
</main>
<script src="/assets/js/i18n-wd-zugang.js?v=202610011927"></script>
<script src="/assets/js/wd-core.js?v=202610011927"></script>
<script src="/assets/js/i18n-wd-zugang.js?v=202610012001"></script>
<script src="/assets/js/wd-core.js?v=202610012001"></script>
<script>
(function () {
"use strict";