pruef-gifs war nicht kaputt, sondern nachts rot -- und ein Weg war ungeprüft

DIE ZWEI FEHLER AUS DEM LETZTEN LAUF WAREN KEINE FEHLER AM PRODUKT.

    FEHL das GIF steht danach wirklich im Verlauf
    FEHL und die Tafel geht zu -- man will sehen, wie es ankommt

Gemessen statt geraten: eine Sonde, die jede Anfrage mitschreibt. Die
Antwort stand sofort da, um 04:30 Uhr:

    POST /workspace/api/chat/raeume/1/gif
    403 {"fehler":"Das Rudel schläft. Ab 06:00 Uhr geht es weiter …",
         "nachtruhe":{"zu":true,"ab":0,"bis":6,"minuten":90}}

Die Pruefung klickte „das erste Gespraech in der Liste". Das erste ist
der TREFF, den der Server beim Start selbst anlegt -- und im Treff gilt
die Nachtruhe von 0 bis 6 Uhr. Also: tagsueber gruen, nachts rot, seit
es diese Pruefung gibt. Es ist derselbe Fehler wie am 06.09. im Shop
(„ein Test, der die Wanduhr als Annahme benutzt, misst irgendwann das
Gegenteil") -- dort ein Oeffnungstermin, hier ein Raum mit Nachtruhe.

Warum es nie jemandem auffiel: Fuer Dogfather Universe gibt es keinen
naechtlichen Pruefdienst (nachgesehen: `systemctl list-timers` kennt nur
`vandiy-pruefung` und `runone-pruefung`). Die Pruefung lief immer nur
dann, wenn jemand sie von Hand startete -- und das war bisher nie
nachts.

WAS GEAENDERT IST

1. pruef-gifs legt ein eigenes Gespraech mit Miss an und oeffnet GENAU
   DAS. Fuer ein normales Gespraech gibt es keine Nachtruhe; die Messung
   gilt jetzt rund um die Uhr. Findet es den Knopf nicht, bricht es laut
   ab statt still auf nichts zu klicken.

   Gemessen, 04:40 Uhr:
     verschicken: {"vorher":0,"nachher":1,"imVerlauf":true,
                   "adressen":["/workspace/api/chat/anhang/1"],
                   "tafelZu":true}
   17 Pruefungen, 0 Fehler. Und nebenbei belegt die Adresse, was der
   Quelltext behauptet: Das GIF wird KOPIERT und haengt danach als
   ganz normaler Anhang an der Nachricht.

2. DIE NACHTRUHE IST NICHT UNTER DEN TISCH GEFALLEN -- sie steht jetzt
   dort, wo sie hingehoert: in pruef-treffchat (110 -> 114). Dort wird
   das Fenster ueber die EINSTELLUNG verschoben, nicht ueber die
   Systemuhr, und beide Zustaende kommen in einem Lauf vor.

   DENN DER GIF-WEG WAR DORT ALS EINZIGER DER DREI UEBERHAUPT NICHT
   GEPRUEFT. Im Quelltext steht neben der Regel woertlich: „Sie nur
   beim Text und beim Anhang zu pruefen hiesse, dass man nachts zwar
   nicht schreiben, aber ein GIF schicken kann -- der Weg, den jeder
   findet, der es einmal versucht." Genau dieser Weg hatte keine
   Pruefung. Der Kommentar hat den Fehler beschrieben und nicht
   verhindert -- dieselbe Luecke wie beim Spaltenverlust vom 11.09.

   Gemessen, beide Zweige in einem Lauf:
     Fenster 7–9 Uhr, jetzt 4 -> 404 „Dieses GIF gibt es nicht mehr."
     Fenster 4–6 Uhr, jetzt 4 -> 403 „Das Rudel schläft. Ab 06:00 …"

   ZWEI ENTSCHEIDUNGEN DABEI, beide mit Grund:
   · Gefragt wird als DogFather, nicht als Gast. Die GIF-Kiste gehoert
     dem Rudel; ein Gast bekaeme seine 403 von der falschen Schranke
     (`nurRudel`) -- gruen, ohne die Nachtruhe je beruehrt zu haben.
   · Mit einer Nummer, die es NICHT gibt. Kommt trotzdem die
     Nachtruhe-Absage, steht die Schranke VOR dem Nachschlagen.
     Stuende sie dahinter, verriete der Server nachts an der Nummer,
     welche GIFs es gibt.

AM PRODUKT IST NICHTS GEAENDERT. Nur zwei Pruefdateien -- kein Stempel,
kein Neustart noetig.

GEPRUEFT: pruef-gifs 17 ok (vorher 15 ok / 2 FEHL) ·
pruef-treffchat 114 ok (vorher 110).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-02 04:36:14 +02:00
co-authored by Claude Opus 5
parent 34a227605c
commit 87a3a14978
2 changed files with 88 additions and 4 deletions
+47 -3
View File
@@ -57,7 +57,7 @@ function anlegen(name, rolle, code) {
return d.prepare("SELECT last_insert_rowid() AS id").get().id;
}
anlegen("Filipe", "admin", "CODE-DOGI-0001");
anlegen("Miss", "modi", "CODE-MODI-0001");
const idMiss = anlegen("Miss", "modi", "CODE-MODI-0001");
anlegen("Luna", "creator", "CODE-CREA-0001");
d.close();
@@ -96,9 +96,53 @@ try {
(Zeile 810), nicht geraten. Mein erster Versuch probierte drei
erfundene Namen und traf keinen; der Raum blieb zu, und der
GIF-Knopf deshalb verborgen. */
await seite.evaluate(() => {
document.querySelector(".chat-raum__knopf")?.click();
/* ==== EIN GANZ NORMALES GESPRAECH, NICHT DAS ERSTE DER LISTE ======
(02.10.2026 -- und das ist eine Zeitbombe, die hochgegangen ist)
Hier stand `document.querySelector(".chat-raum__knopf")?.click()`
-- also „nimm das erste Gespraech". Das erste ist der TREFF, den
der Server beim Start selbst anlegt. Und im Treff gilt die
Nachtruhe: zwischen 0 und 6 Uhr weist der Server jedes Schreiben
mit 403 ab, Text, Anhang und GIF.
FOLGE: Diese Pruefung war tagsueber gruen und nachts rot --
seit es sie gibt. Gemessen um 04:30 Uhr, und die Antwort stand
im Protokoll:
403 {"fehler":"Das Rudel schläft. Ab 06:00 Uhr geht es
weiter …","nachtruhe":{"zu":true,"ab":0,"bis":6}}
Nicht das GIF war kaputt, sondern die Uhr war eine Annahme. Das
ist derselbe Fehler wie am 06.09. im Shop („ein Test, der die
Wanduhr als Annahme benutzt, misst irgendwann das Gegenteil") --
dort war es ein Oeffnungstermin, hier ein Raum mit Nachtruhe.
Deshalb wird jetzt ein eigenes Gespraech mit Miss angelegt und
GENAU DAS geoeffnet: Fuer ein normales Gespraech gibt es keine
Nachtruhe, die Messung gilt rund um die Uhr.
UND DIE NACHTRUHE IST NICHT UNGEPRUEFT GEBLIEBEN: Sie steht
jetzt in pruef-treffchat, wo das Zeitfenster richtig gesetzt
wird (ueber die Einstellung, nicht ueber die Systemuhr) und
beide Zustaende in einem Lauf vorkommen. Dort war der GIF-Weg
als einziger der drei noch gar nicht geprueft. */
await seite.evaluate(async (id) => {
await fetch("/workspace/api/chat/direkt", {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "same-origin",
body: JSON.stringify({ mit: id }),
});
}, idMiss);
await seite.reload({ waitUntil: "networkidle" });
await seite.waitForSelector(".chat-raum__knopf", { timeout: 8000 });
const zuMiss = seite.locator(".chat-raum__knopf", { hasText: "Miss" }).first();
/* LAUT ABBRECHEN, WENN ES IHN NICHT GIBT. Ein stilles
`?.click()` auf nichts waere wieder eine Messung, die „der Raum
ist zu" meldet und den Grund verschweigt. */
await zuMiss.waitFor({ timeout: 8000 });
await zuMiss.click();
try {
await seite.waitForFunction(
() => { const k = document.getElementById("gif-auf"); return k && !k.hidden; },
+40
View File
@@ -335,6 +335,34 @@ let treffId = null;
{ cookie: kGast, "Content-Type": "image/png" }, { egal: 1 });
ok(anhang.code === 403, `auch kein Anhang (${anhang.code})`);
/* ==== UND DAS GIF (02.10.2026) ==================================
Neben dieser Regel steht in workspace-chat.js woertlich: „Sie
nur beim Text und beim Anhang zu pruefen hiesse, dass man
nachts zwar nicht schreiben, aber ein GIF schicken kann -- der
Weg, den jeder findet, der es einmal versucht."
Genau dieser dritte Weg war bis heute der einzige, den keine
Pruefung je gegangen ist. Der Kommentar hat den Fehler
beschrieben und nicht verhindert -- dieselbe Sorte Luecke wie
beim Spaltenverlust vom 11.09.
GEFRAGT WIRD ALS DOGFATHER, nicht als Gast. Die GIF-Kiste
gehoert dem Rudel; ein Gast bekaeme seine 403 von der FALSCHEN
Schranke (`nurRudel`), und die Messung waere wertlos -- grün,
ohne die Nachtruhe je berührt zu haben.
UND MIT EINER NUMMER, DIE ES NICHT GIBT. Das ist Absicht:
Kommt trotzdem die Nachtruhe-Absage, steht die Schranke VOR
dem Nachschlagen. Stuende sie dahinter, verriete der Server
nachts an der Nummer, welche GIFs es gibt. */
const gifNachts = await ruf(`/workspace/api/chat/raeume/${treffId}/gif`, CREW, "POST",
{ cookie: kDogi }, { gif_id: 999999 });
ok(gifNachts.code === 403, `auch kein GIF (${gifNachts.code})`);
ok(/schläft/i.test(json(gifNachts).fehler || ""),
"und zwar wegen der Nachtruhe, nicht wegen der Nummer: "
+ `„${(json(gifNachts).fehler || "").slice(0, 44)}…“`);
/* GELESEN WERDEN DARF DIE GANZE NACHT. Sonst waere es keine
Nachtruhe, sondern eine geschlossene Tuer -- und wer nachts
nachsehen will, was los war, koennte es nicht. */
@@ -366,6 +394,18 @@ let treffId = null;
} else {
ok(a.code === 201 || a.code === 200, `ein Gast kann schreiben (${a.code})`);
ok(b.code === 201 || b.code === 200, `ein Modi auch (${b.code})`);
/* DIE GEGENPROBE ZUM GIF. Dieselbe Anfrage, dieselbe erfundene
Nummer wie im Nachtzweig -- bei Tag MUSS die Absage vom
Nachschlagen kommen und nicht von der Nachtruhe. Ohne diese
Zeile waere „auch kein GIF" oben auch dann gruen, wenn die
Schranke rund um die Uhr zu waere. */
const gifTags = await ruf(`/workspace/api/chat/raeume/${treffId}/gif`, CREW, "POST",
{ cookie: kDogi }, { gif_id: 999999 });
ok(gifTags.code === 404,
`beim GIF antwortet bei Tag das Nachschlagen, nicht die Nachtruhe (${gifTags.code})`);
ok(!/schläft/i.test(json(gifTags).fehler || ""),
` und kein Wort von Schlaf („${(json(gifTags).fehler || "").slice(0, 44)}")`);
}
if (!NACHTLAUF) {