Zwei Pruefungen waren rot, weil etwas richtig gemacht wurde

pruef-auskunft und pruef-treff-werkzeuge -- beide bestraften eine
Verbesserung. Das ist die unangenehmste Sorte roter Pruefung: Wer sie
zweimal so erlebt, faengt an, rote Laeufe zu erklaeren statt sie zu
lesen.

1. "DIE COMMUNITY HAT KEINEN STECKBRIEF"

   So stand es woertlich in der Bedingung. Am 19.09. hat Filipe genau
   das Gegenteil entschieden -- "jeder soll ein steckbrief haben, jeder
   der ein account hat ... jeder soll genau wie ich foto und so
   hinzufuegen koennen" -- und die Community hat seitdem einen.

   Was die Zeile schuetzen wollte, steht in ihrem eigenen Kommentar:
   "Ohne die zweite Stelle haette die Gruppe mit den wenigsten Rechten
   auch dieses nicht -- und sie ist die groesste." Die Sorge ist
   richtig und hat mit der Anzahl der Seiten nichts zu tun. Die Frage
   lautet: KOMMT JEDE ROLLE AN IHRE AUSKUNFT?

   Genau das wird jetzt gemessen -- welche Seiten den Knopf tragen,
   aus den Dateien gelesen statt aufgezaehlt, und ob jede der acht
   Rollen mindestens eine davon erreichen darf, aus der Rechtetafel
   gelesen statt angenommen. Mit Gegenprobe (eine erfundene Rolle
   erreicht keine) und mit der Zahl in der Bedingung.

2. "DIE COMMUNITY STEHT BEI 8 VON 33"

   Hier stand `community.seiten < 5`. Die Zahl stimmte an dem Tag, an
   dem sie geschrieben wurde. Seither hat der Treff eigene Seiten
   bekommen -- Regeln, Steckbrief, Hilfe, Draussen -- und die
   Community steht bei acht. Die Pruefung war rot, WEIL der Treff
   gewachsen ist. Dieselbe Fehlerklasse wie die Umbruchschwelle vom
   06.09.: Wer eine Zahl notiert, notiert einen Zustand, keine Regel.

   Gemeint war eine ORDNUNG: Ein Mitglied sieht weniger als die
   Moderation, die weniger als die rechte Hand, die weniger als
   DogFather. Nachgemessen 8 / 19 / 25 / 32 von 33. Geprueft wird
   jetzt das Verhaeltnis -- und zusaetzlich, dass die Community das
   Minimum ueber ALLE acht Rollen ist, nicht nur in dieser Kette. Das
   bleibt richtig, wenn der Treff weiterwaechst, und faellt sofort
   auf, wenn jemand die Reihenfolge versehentlich umdreht.

pruef-auskunft         46/0  (war 46, davon 1 rot)
pruef-treff-werkzeuge  73/0  (war 70, davon 1 rot)

Damit sind alle vier Pruefungen gruen, die heute frueh rot waren.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-21 13:12:36 +02:00
co-authored by Claude Opus 5
parent 95d753791d
commit 9d4a40ff58
2 changed files with 124 additions and 15 deletions
+55 -3
View File
@@ -562,9 +562,61 @@ melde("=== 8. Der Regeltext ===");
const t = json(meine);
ok(meine.code === 200 && t.seiten?.length === rechte.alleSeiten().length,
`DogFather bekommt alle ${t.seiten?.length} Seiten`);
const community = (t.rollen || []).find((x) => x.schluessel === "gast");
ok(community && community.seiten < 5,
`und die Community steht bei ${community?.seiten} von ${t.seiten?.length}`);
/* EINE FESTE ZAHL IST EINE RECHNUNG VON GESTERN (berichtigt
21.09.2026).
Hier stand `community.seiten < 5`. Die Zahl stimmte an dem Tag,
an dem sie geschrieben wurde. Seither hat der Treff eigene Seiten
bekommen -- Regeln, Steckbrief, Hilfe, Draussen -- und die
Community steht bei acht. Die Pruefung war damit rot, WEIL der
Treff gewachsen ist. Dieselbe Fehlerklasse wie die Umbruchschwelle
vom 06.09.: Wer eine Zahl notiert, notiert einen Zustand, keine
Regel.
DIE AUSSAGE, DIE GEMEINT WAR, IST EINE ORDNUNG, KEINE GRENZE:
Ein Mitglied sieht weniger als die Moderation, die weniger als die
rechte Hand, die weniger als DogFather. Wer Rechte vergibt, darf
diese Reihenfolge nicht versehentlich umdrehen -- und genau das
faellt an einer Zahl nicht auf, an der Ordnung sofort.
Nachgemessen am 21.09.: 8 / 19 / 25 / 32 von 33 Seiten. Die Zahlen
stehen hier nur als Beleg; gemessen wird ihr Verhaeltnis, und das
bleibt richtig, wenn der Treff weiterwaechst. */
const zahl = (schluessel) =>
(t.rollen || []).find((x) => x.schluessel === schluessel)?.seiten;
const kette = ["gast", "modi", "hand", "admin"].map((r) => [r, zahl(r)]);
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG. Fehlte eine Rolle in der
Auskunft, waere `undefined < undefined` schlicht false -- aber
`[...].every(...)` ueber eine leere Liste waere wahr. Deshalb
zuerst: Sind ueberhaupt alle vier da? */
ok(kette.every(([, n]) => Number.isFinite(n)),
`die Auskunft nennt alle vier: ${kette.map(([r, n]) => `${r} ${n}`).join(", ")}`);
const steigt = kette.every(([, n], i) => i === 0 || n > kette[i - 1][1]);
ok(steigt,
steigt
? `und sie stehen in der richtigen Ordnung `
+ `(${kette.map(([r, n]) => `${r} ${n}`).join(" < ")} von ${t.seiten?.length})`
: `DIE ORDNUNG STIMMT NICHT: `
+ `${kette.map(([r, n]) => `${r} ${n}`).join(", ")} -- jemand `
+ `weiter unten sieht mehr als jemand weiter oben`);
/* UND DIE COMMUNITY IST DAS MINIMUM UEBER ALLE ROLLEN, nicht nur in
dieser Kette: Die Agentur steht daneben, nicht darueber, und auch
ihr gegenueber darf ein Mitglied nicht mehr Seiten haben. */
const alleZahlen = (t.rollen || []).filter((x) => Number.isFinite(x.seiten));
ok(alleZahlen.length >= 4 && alleZahlen.every((x) => x.schluessel === "gast"
|| x.seiten > zahl("gast")),
`die Community hat die wenigsten von allen ${alleZahlen.length} Rollen `
+ `(${zahl("gast")} von ${t.seiten?.length})`);
/* GEGENPROBE: Kann diese Ordnung ueberhaupt "nein" sagen? Umgekehrt
gelesen muss dieselbe Rechnung falsch herauskommen -- sonst waere
sie eine Bestaetigungsmaschine. */
const rueckwaerts = [...kette].reverse();
ok(!rueckwaerts.every(([, n], i) => i === 0 || n > rueckwaerts[i - 1][1]),
"Gegenprobe: umgekehrt gelesen faellt dieselbe Rechnung durch");
}
/* ------------------------------------------------------------------- */