Files
dogfather-universe/workspace/assets/js/treff-regeln.js
T
DogFatherGitandClaude Opus 5 8e140724f2 Der Rollenname steht in keiner ausgelieferten Datei mehr
pruef-modi-wortleck war rot und meldete 17 Fundstellen -- seit Wochen,
bei jedem Lauf. Eine Warnung, die immer kommt, wird ueberlesen, und
dann auch die echte.

ERST GEMESSEN, OB DIE REGEL UEBERHAUPT NOCH GILT. Seit dem 11.09. gibt
es die eigene Adresse crew. mit einem offenen Modi-Knopf an der Wand --
es waere gut moeglich gewesen, dass die Pruefung etwas bewacht, das es
nicht mehr gibt. Sie gilt: pruef-modi-verborgen setzt mit 80 Pruefungen
durch, dass ein Manager keinen Modi sieht.

UND DABEI KAM ETWAS SCHLIMMERES HERAUS. Auf der echten Seite gemessen:

  /workspace/start.html                 302   (Anmeldung noetig)
  /workspace/assets/js/talente.js       200   25 KB Quelltext
  /workspace/assets/js/chat.js          200   85 KB
  /workspace/assets/css/entwicklung.css 200   34 KB

Jede Datei unter workspace/ ist OHNE JEDE ANMELDUNG aus dem offenen
Netz abrufbar. Der verborgene Zugang stand also nicht in einer Datei,
die "jeder herunterlaedt, der angemeldet ist" -- sondern in einer, die
man einfach abrufen kann.

Die Rollentabelle in workspace.js sagt seit dem 11.09. genau das
Richtige dazu: "Der Name steht hier und NICHT in einer Datei, die jeder
herunterlaedt -- ausgeliefert wird er nur an den, der ihn selbst
traegt, und an die, die ihn sehen duerfen." Danach ist jetzt gebaut,
ueberall:

  - talente.js hatte `rolle: 'modi'` fest im Text, dazu den Namen im
    Codekasten und im Rechtevergleich. Die Seite FRAGT ihn jetzt ab;
    /talente/lage liefert ihn, und die Route geht nur an DogFather und
    die rechte Hand.
  - Der Regeltext des Treffs nennt den Namen weiterhin -- Filipe hat am
    11.09. ausdruecklich gewaehlt, dass die Community ihn sieht. Er
    kommt jetzt als DATEN mit der Antwort, nicht als fester Text.
  - Das Feld hiess selbst `modi_frist_tage`. Das Muster \bmodi\b trifft
    das nicht, weil danach ein Unterstrich folgt -- ein Leck durch eine
    Luecke im Muster, nicht durch eine Entscheidung. Heisst jetzt
    `pause_frist_tage`.
  - Die uebrigen elf Fundstellen waren Kommentare. Umformuliert, ohne
    dass sie weniger erklaeren.

Ergebnis: 17 -> 0. Ohne Ausnahmeliste, ohne die Pruefung zu entschaerfen.

ZWEI LOECHER, DIE ICH DABEI SELBST GERISSEN HAETTE:

  darfAnlegen wurde aus `lage` gerechnet -- aber ichHolen() laeuft VOR
  laden(), also war `lage` noch null. Der Wert waere dauerhaft falsch
  gewesen und der Knopf nie erschienen. Jetzt ist es eine Frage statt
  eines Wertes, beantwortet beim Zeichnen. Gefunden beim Nachsehen der
  Reihenfolge, nicht im Testlauf -- deshalb steht die Frage ab jetzt in
  pruef-uebergang.

  Und im HTML des Treffs steht als Ersatzfassung "jemandem aus dem
  Team". Kommt der Name nicht an, bleibt sie stehen, die Seite sieht
  vollkommen richtig aus, und niemand merkt es. Ein Platzhalter "…"
  waere aufgefallen; eine richtige Ersatzfassung faellt nicht auf.
  pruef-neue-seiten prueft jetzt, dass wirklich der Name dasteht.

  pruef-modi-wortleck        0 Fehler (vorher 17 Fundstellen)
  pruef-uebergang 65 (vorher 61), pruef-neue-seiten 97 (vorher 93)
  pruef-modi-verborgen 80, pruef-nachwuchs 123, pruef-treff 66,
  pruef-treff-werkzeuge 70, pruef-css-klassen -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 16:59:34 +02:00

93 lines
3.8 KiB
JavaScript
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.
/* =====================================================================
Die Zahlen im Regeltext (11.09.2026)
Dieses Skript schreibt nichts dazu -- es setzt nur die Zahlen ein,
die im Text stehen muessen: Fristen, Stufen, Mindestalter, wie lange
jemand aus dem Team eine Pause geben darf.
WARUM UEBERHAUPT EIN SKRIPT FUER FUENF ZAHLEN
Weil sie sonst zweimal existieren wuerden: einmal als Regel im Code
(DABEI_TAGE, STAMM_TAGE, MINDESTALTER ...) und einmal als Wort in
der HTML-Datei. Beim naechsten Nachjustieren waere eine von beiden
geaendert worden, und der Regeltext haette etwas anderes versprochen
als der Server tut. Das faellt niemandem auf -- und wer es bemerkt,
glaubt dem Text, nicht dem Verhalten.
Ein Regeltext, der sich selbst widerspricht, ist ausserdem rechtlich
das Gegenteil dessen, wofuer er da ist.
WENN DIE ANTWORT AUSBLEIBT, bleibt "…" stehen. Das ist Absicht: Eine
fehlende Zahl sieht man, eine falsche nicht.
===================================================================== */
(() => {
const $ = (id) => document.getElementById(id);
const melde = (t) => {
const f = $('fehler');
if (f) { f.textContent = t; f.hidden = !t; }
};
(async () => {
let r;
try {
const a = await fetch('/workspace/api/treff/regeln', { credentials: 'same-origin' });
if (a.status === 401) { location.assign('/workspace/'); return; }
if (!a.ok) { melde('Die Zahlen konnten nicht geladen werden. Der Text gilt trotzdem.'); return; }
r = await a.json();
} catch {
melde('Die Zahlen konnten nicht geladen werden. Der Text gilt trotzdem.');
return;
}
/* Die drei Stufen -- aus der Antwort gebaut, nicht aus drei festen
Zeilen. Wer eine vierte Stufe einbaut, bekommt sie hier von
selbst; eine feste Liste haette sie unterschlagen, ohne dass
irgendwo etwas rot wird. */
const liste = $('stufen');
if (liste && Array.isArray(r.stufen)) {
const was = {
neu: 'Lesen und bei Wünschen mitstimmen.',
dabei: `Ab ${r.dabei_tage} Tagen: Du kannst im Treff schreiben, `
+ 'Wünsche einstellen und dich bei „Mitmachen“ melden.',
stamm: `Ab ${r.stamm_tage} Tagen und ${r.stamm_beitraege} eigenen Beiträgen: `
+ 'Du kannst Clips und Bilder einstellen – sie erscheinen, sobald '
+ 'jemand aus dem Team sie freigegeben hat.',
};
liste.textContent = '';
for (const s of r.stufen) {
const li = document.createElement('li');
const stark = document.createElement('strong');
stark.textContent = s.name;
li.append(stark, ' – ', was[s.schluessel] || '');
liste.append(li);
}
}
if ($('alter')) {
$('alter').textContent =
`Mindestalter: ${r.mindestalter} Jahre. Wer jünger ist, hat hier nichts `
+ 'verloren – nicht weil wir es kompliziert machen wollen, sondern weil '
+ 'der Treff zu einem Stream für Erwachsene gehört.';
}
/* WEN MAN ANSPRICHT -- mit dem Namen aus den Daten.
Im HTML steht „jemandem aus dem Team". Das ist kein Platzhalter,
sondern eine Fassung, die auch dann stimmt, wenn das Skript nicht
laeuft -- ein Satz mit einem sichtbaren Loch darin waere
schlechter als einer, der etwas allgemeiner ist. */
if ($('kontakt-wem') && r.rolle_name) {
$('kontakt-wem').textContent = `einem ${r.rolle_name}`;
}
if ($('ausschluss')) {
$('ausschluss').textContent =
`Ein ${r.rolle_name} kann eine Pause von bis zu ${r.pause_frist_tage} Tagen geben. `
+ 'Alles, was länger gilt, und jeder endgültige Ausschluss ist DogFathers '
+ 'Entscheidung. Jede dieser Entscheidungen wird mit Grund festgehalten – '
+ 'auch, damit man sie zurücknehmen kann.';
}
})();
})();