Files
dogfather-universe/workspace/befinden.html
T
DogFatherGitandClaude Opus 5 10e24b0c93 Kampagnen-Kachel aus einem TikTok-Link -- Etappe 2 bis 4
Der Auftrag ist damit fertig: Im Agentur-Bereich gibt es ein Feld, in
das die ganze Einladungsnachricht eingefuegt wird -- und daraus
entsteht eine Agentur-Event-Kachel mit Titel, Zeitraum, Banner,
Aufgaben zum Abhaken, Regeln, Ligen und Preisen. Gemessen 38 ms vom
Einfuegen bis zur Kachel.

ETAPPE 2 -- DER WEG NACH DRAUSSEN (helfer-tiktok.mjs)
  linkAusText holt die Adresse aus dem Fliesstext, damit niemand sie
  heraussuchen muss. folgeUmleitung geht Sprung fuer Sprung
  (redirect "manual", hoechstens fuenf) und schickt JEDE
  Zwischenadresse durch istTikTok -- bisher folgte holeMitFrist den
  Umleitungen selbst, und istTikTok hatte nur die EINGABE gesehen.
  Das ist die einzige Stelle im Haus, an der unser Server eine
  fremdbestimmte Adresse abruft.

  holeSeite zieht die Grenze von 3 MB BEIM LESEN, nicht hinterher: Wer
  arrayBuffer() abwartet und dann die Laenge ansieht, hat die 50 MB
  schon im Speicher. Frist 12 s statt 8 -- gemessen 750 ms allein beim
  Ursprungsserver, dazu 1,1 MB Uebertragung.

  bildAdresseErlaubt kam beim Bauen dazu, nicht aus dem Bauplan: Die
  Banneradresse steht in der Seite, die TikTok ausliefert, ist also
  FREMDBESTIMMT. Ohne Schranke wuerde unser Server abrufen, was dort
  steht -- auch http://127.0.0.1:4100/ oder 169.254.169.254. Elf
  Faelle durchgemessen.

ETAPPE 3 -- DIE ROUTE (workspace-kampagne.js, 5 Spalten, 1 Index)
  Rechte aus istLeitung, nicht neu erfunden. Bremse 20 je Stunde, VOR
  dem ersten Abruf nach draussen -- eine Bremse hinter dem Abruf
  bremst den fremden Server nicht. Dublettenpruefung zweimal: im Code
  (faengt den Normalfall) und als eindeutiger Index (faengt den
  Wettlauf zweier gleichzeitiger Aufrufe).

  'kampagne_schon_da' zaehlt bei der Bremse MIT (gefunden von der
  Pruefung): Zuerst zaehlten nur Erfolg und Fehlschlag -- wer denselben
  Link wieder und wieder einfuegt, bekommt jedes Mal "schon da" und
  loeste jedes Mal einen Abruf aus, ohne gezaehlt zu werden. Gemessen:
  21 Versuche, 0 gebremst.

  Der Regeltext wird SICHTBAR gekuerzt, an einer Abschnittsgrenze.
  Gipfelstuermer ergibt 7474 Zeichen, das Feld fasst 6000 (TEXT_MAX),
  und die PUT-Route lehnt mehr ab: Ungekuerzt entstuende eine Kachel,
  die DogFather OEFFNEN, aber nicht SPEICHERN kann -- er aendert ein
  Wort und bekommt eine Fehlermeldung ueber etwas, das er nie getippt
  hat. Verloren geht nichts: kampagne_daten traegt das Gelesene
  gegliedert.

ETAPPE 4 -- DIE OBERFLAECHE
  Ein Textbereich (die Einladung ist mehrzeilig), der Knopf gibt sich
  nach 15 s von selbst frei, die Meldung steht neben dem Feld und
  nennt den Grund im Klartext. Ob jemand darf, sagt der Server ueber
  darf_kampagne_einlesen in /api/ich -- keine Rollenliste im Browser.

  Gemessen auf 412 und 1280 px (bild-kampagne.mjs, 20 Messungen):
  Knopf 44 px, Kontrast 7,68:1, nichts liegt auf dem Knopf, kein
  Ueberlauf, keine Bewegung bei prefers-reduced-motion. Die
  Antwortzeile steht auf .9rem statt der hausweiten .76rem -- dort
  erscheint, was der Server geantwortet hat, und eine Fehlermeldung in
  12 px liest niemand zweimal. Die hausweite Klasse bleibt unberuehrt.

VIERZEHN SABOTAGEN, VIERZEHN TREFFER
  Sieben an kampagne-lesen.mjs (Etappe 1) und sieben an Route und Weg:
  Umleitung ungeprueft folgen, Tag nach Serverzeit, Dublettenpruefung
  weglassen, dem fremden Server den Bildtyp glauben, Bremse
  abschalten, Bremse wieder blind fuer Dubletten, jeden einlesen
  lassen. Jede wurde bemerkt, jede im erwarteten Abschnitt.

  EINE BLIEB ZUERST BLIND, und das war lehrreich: Nimmt man die
  Dublettenpruefung aus dem Code, faengt der INDEX es auf -- die
  Antwort ist dieselbe, die Pruefung blieb gruen. Kein Schaden, aber
  ein blinder Fleck. Jetzt unterscheidet die Pruefung am
  Protokolltext, WELCHE der beiden Sicherungen gegriffen hat.

VIER VORBESTEHENDE BEFUNDE MIT ERLEDIGT
  willkommen.html hatte kein theme-color, kein Manifest, kein
  apple-touch-icon. Drei Zeilen sind billiger und haltbarer als eine
  Ausnahme in der Pruefung.

  workspace-anleitung.js bildete den Tag "ab wann geht mehr" aus UTC.
  Wer zwischen 00:00 und 02:00 beitritt, bekam einen Termin, der einen
  Tag zu frueh war. workspace.js hat dafuer jetzt tagLokalVon(zeitpunkt,
  versatz) -- und tagLokal ist nur noch ein Aufruf davon. Es gibt also
  WENIGER Rechenwege als vorher, nicht mehr.

  pruef-anleitung.mjs legte Testdaten auf den UTC-Tag und waere
  zwischen 00:00 und 02:00 rot gewesen, ohne dass etwas kaputt ist.

  mess-anleitung-crew.mjs rechnete seinen zweiten Port als PORT + 1.
  Das sieht aus wie eine Ableitung und ist keine: portNummer
  ueberspringt gesperrte Nummern, und dann gehoert PORT + 1 der
  naechsten DATEI.

  pruef-struktur ist damit zum ersten Mal vollstaendig gruen.

GEPRUEFT (alle gruen, keine Zahl gesunken)
  pruef-kampagne 96 (neu) · pruef-kampagne-lesen 108 · pruef-video 74 ·
  pruef-eventkarte 94 · pruef-agentur 62 · pruef-anleitung 196 ·
  pruef-portnummern 41 (war 40 mit einem Fehler) · pruef-struktur,
  pruef-zeichen 8, pruef-ports 10, pruef-buehnen-fest 13,
  pruef-css-klassen 39, pruef-haus-trennung 107, pruef-lesbarkeit,
  pruef-tippziele, pruef-deutsche-texte 12, pruef-formulare,
  pruef-fingermass 5, pruef-workspace-seiten, pruef-tempo-workspace

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-07 17:14:26 +02:00

213 lines
9.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Wie geht's dir? · Spicy &amp; Dogi</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610071712" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610071712" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610071712" />
<link rel="stylesheet" href="assets/css/start.css?v=202610071712" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610071712" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610071712" />
<link rel="stylesheet" href="assets/css/module.css?v=202610071712" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610071712" />
</head>
<body class="start">
<div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" />
</svg>
<span class="zurueck-knopf__text">Zurück</span>
</button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Wie geht's dir?</span></p>
<div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div>
</header>
<main class="inhalt">
<!-- ==================================================================
DIESE SEITE GEHÖRT DEM MENSCHEN, DER SIE ÖFFNET.
Hier steht kein anderer Name, keine Beobachtung über jemanden und
keine Zahl, die jemand anders sieht. Genau das war der Grund für
die eigene Seite: Die Kachel verspricht „die Antworten sieht nur
du" – und führte vorher auf eine Seite voller anderer Leute.
Was DogFather sieht, ist eine einzige Zahl ohne Namen: wie viele
im Team es gerade schwer haben. Nicht wer, nicht womit.
============================================================== -->
<section class="kopf-zeile">
<div>
<p class="marke">Für dich</p>
<h1 class="titel">Wie geht's dir?</h1>
<!-- ================================================================
DIE EINE AUSNAHME GEHÖRT DAZU (ergänzt 19.09.2026).
Hier stand: „Niemand aus dem Team sieht deine Antworten – auch
DogFather nicht." Punkt. Das ist fast wahr und deshalb
gefährlich: Aus denselben Antworten entsteht eine Ampel für die
Leitung (workspace-entwicklung.js). Sie ist sauber gebaut – sie
nennt keine Namen, keinen Punkt, kein Datum, und unter drei
Personen schweigt sie ganz. Aber sie existiert.
Der ehrliche Satz war längst geschrieben und wurde vom Server
sogar mitgeliefert (`block.text`) – nur hat ihn nie jemand
angezeigt. Er steht jetzt hier im HTML und nicht im Skript:
Wer diese Seite öffnet, soll ihn lesen, BEVOR er tippt, nicht
nachdem ein Abruf zurückgekommen ist.
Wenn jemand später davon erfährt und die Seite hatte „niemand"
gesagt, ist das Vertrauen weg – und mit ihm die ganze Funktion.
============================================================= -->
<p class="unterzeile">
Ein paar Fragen über dich. Deine Antworten liest niemand – auch
DogFather nicht.
</p>
<p class="unterzeile unterzeile--zusatz">
Das Einzige, was nach außen dringt: ob es im Team gerade
<em>jemandem</em> zu viel ist. Ohne Namen, ohne Frage, ohne Datum –
und erst ab drei Personen im Team, weil es darunter dasselbe wäre
wie ein Name.
</p>
</div>
</section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- Der Rhythmus. Steht VOR den Fragen: Wer hereinkommt, soll zuerst
wissen, ob gerade etwas von ihm erwartet wird. -->
<section class="b-takt" id="takt" hidden>
<p class="b-takt__satz" id="takt-satz">…</p>
<button type="button" class="knopf knopf--klein" id="takt-knopf" hidden>Runde abschließen</button>
</section>
<section id="fragen-block" class="b-flaeche">
<!-- WIE WEIT BIN ICH? (23.09.2026)
---------------------------------------------------------
Filipe: „ich will dass diese seite viel übersichtlicher
aussieht, es soll eine riesßen kachel sein wo alles viel
besser und geiler aussieht."
Auf einer Seite, die man AUSFÜLLT, heißt übersichtlich vor
allem: wissen, wie viel noch kommt. Der Kasten darüber sagt
„9 von 18 Fragen dran" — das ist die Runde, nicht der eigene
Stand. Dieses Band sagt den eigenen.
`aria-live="polite"`: Wer nicht hinsieht, bekommt den neuen
Stand vorgelesen, sobald er eine Frage beantwortet. -->
<div class="b-stand" id="b-stand" hidden aria-live="polite">
<div class="b-stand__bahn"><i class="b-stand__fuellung" id="b-stand-balken"></i></div>
<p class="b-stand__wort" id="b-stand-wort"></p>
</div>
<div id="fragen" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section>
<!-- ===================================================================
DIE EINE ZUSAMMENFASSUNG (20.09.2026)
Filipe: „am ende von allen fragen will ich eine gesamte
zusammenfassung, nicht bei jeder frage oder kategorie eine,
sondern EINE gesamte am ende. eine motivierende zusammenfassung
für die person."
SIE STEHT DIREKT UNTER DEN FRAGEN und über dem Verlauf. Das ist
Absicht: Sie handelt von dem, was man gerade angetippt hat —
Verlauf und Musteranalyse handeln von den Runden davor und
brauchen mindestens zwei. Diese hier gibt es beim ersten Mal.
GERECHNET HAT SIE DER SERVER (workspace-befinden-resuemee.js).
Dort steht auch, warum hier bewusst KEINE KI hängt: Das sind
Gesundheitsdaten, ein Sprachmodell erfindet, und ein fremder
Dienst fällt aus. Alle drei Gründe reichen einzeln.
=================================================================== -->
<section class="b-fazit" id="fazit-block" hidden aria-live="polite">
<h2 class="e-abschnitt">Was das zusammen heißt</h2>
<p class="b-fazit__kopf" id="fazit-kopf"></p>
<div class="b-fazit__traegt" id="fazit-traegt" hidden>
<p class="b-fazit__schild">Das trägt gerade</p>
<ul class="b-fazit__liste" id="fazit-traegt-liste"></ul>
</div>
<p class="b-fazit__thema" id="fazit-thema" hidden></p>
<!-- ================================================================
DEIN NAECHSTER SCHRITT (22.09.2026)
Filipe: "das resume unten auf jeder frage ... muss weg ich will
ein ganzes gesamtresume ... aber auch individuel so dass jeder
sich selber auch verbessert und steigert fuers team."
Vorher stand unter jeder der neun Fragen ein eigener Ratschlag.
Neun Ratschlaege auf einmal sind keine Hilfe, sondern eine
Maengelliste -- wer neun Dinge gleichzeitig angehen soll, geht
keins an. Hier steht genau EINER, zu der Sache, die am meisten
haengt, mit dem Grund daneben, warum es dieser ist.
============================================================ -->
<div class="b-fazit__schritt" id="fazit-schritt" hidden>
<p class="b-fazit__schild">Dein nächster Schritt</p>
<p class="b-fazit__schritt-titel" id="fazit-schritt-titel"></p>
<p class="b-fazit__schritt-was" id="fazit-schritt-was"></p>
<p class="b-fazit__schritt-welt leise" id="fazit-schritt-welt" hidden></p>
</div>
<!-- Der Team-Teil. Abgeleitet aus der Lage, nicht immer derselbe
Spruch: Ein "gemeinsam schaffen wir das" an jemanden, bei dem
fuenf von neun Sachen haken, ist das Gegenteil von Hilfe. -->
<p class="b-fazit__team" id="fazit-team" hidden></p>
<p class="b-fazit__schluss" id="fazit-schluss"></p>
<p class="b-fazit__zahlen leise" id="fazit-zahlen"></p>
<p class="b-fazit__quelle leise" id="fazit-quelle" hidden></p>
</section>
<!-- Der Verlauf. Nur für die Person selbst – er wird nirgends sonst
im Haus gelesen. Er steht unter den Fragen, weil er sie erklärt
und nicht ersetzt. -->
<section class="b-verlauf" id="verlauf-block" hidden>
<h2 class="e-abschnitt">Wie es sich entwickelt</h2>
<p class="b-verlauf__satz" id="verlauf-satz">…</p>
<div id="verlauf" class="b-verlauf__gitter"></div>
</section>
<!-- WAS FRUEHER HIER STAND (bis 22.09.2026)
Ein Block "Was dein Verlauf sagt" mit EINER ZEILE JE FRAGE --
Titel, Marke, Einordnung aus der Forschung und ein "Was hilft".
Bei neun Fragen waren das neun Kaesten untereinander.
Filipe: "ich will dass das viel schoener aussieht und nicht so
ein scheiss durcheinander, man wird ja bekloppt. das resume
unten auf jeder frage hab ich auch schon mehrmals gesagt muss
weg."
Die Erkenntnisse sind nicht verloren: Die staerkste davon steht
jetzt oben im Gesamtresuemee als "Dein naechster Schritt" -- mit
derselben Einordnung, aber einmal statt neunmal. -->
</main>
<script src="assets/js/meldung.js?v=202610071712" defer></script>
<script src="assets/js/nachfrage.js?v=202610071712" defer></script>
<script src="assets/js/wahl.js?v=202610071712" defer></script>
<script src="assets/js/bereiche.js?v=202610071712" defer></script>
<script src="assets/js/installieren.js?v=202610071712" defer></script>
<script src="assets/js/kopf.js?v=202610071712" defer></script>
<script src="assets/js/glocke.js?v=202610071712" defer></script>
<script src="assets/js/holen.js?v=202610071712" defer></script>
<script src="assets/js/befinden.js?v=202610071712" defer></script>
</body>
</html>