Files
dogfather-universe/workspace/treff-moderation.html
T
DogFatherGitandClaude Opus 5 5e503463f5 Chat: die GIF-Kiste des Rudels -- und eine Luecke in der Sicherung
Filipe: "dan will ich auch dass man im chat auch sprachnachrichten und
gifts reinschicken kann. also nur die modis rechte linke hand und
dogfather."

ICH LESE "gifts" ALS GIFs -- die bewegten Bildchen -- und sage das
ausdruecklich, statt es stillschweigend anzunehmen. Im Zusammenhang
("im chat reinschicken", direkt neben Sprachnachrichten) passt nichts
anderes. Sollte er Geschenke gemeint haben, sagt er es, und dann baue
ich das.

EINE EIGENE KISTE STATT GIPHY ODER TENOR
----------------------------------------
Beide brauchen ein Konto und einen Schluessel und bekommen bei jedem
Tastendruck mit, wonach hier gesucht wird -- an eine fremde Firma, aus
einem Arbeitsplatz heraus, in dem sonst nichts nach aussen geht. Dazu
kosten sie ab einer Menge Geld. Beides steht quer zu dem, wie dieses
Haus gebaut ist.

Die Kiste laeuft auf demselben Server wie alles andere, kostet nichts
und wird mit der Zeit besser statt schlechter: Was darin liegt, hat das
Team ausgesucht. Zehn gute GIFs, die alle kennen, sind im Alltag mehr
wert als zehn Millionen fremde -- ein Katalog mit allem ist nicht mehr
Auswahl, sondern weniger.

HABEN WIR DAS SCHON? WIRD AM INHALT BEANTWORTET
-----------------------------------------------
Der Schluessel ist der SHA-256 der Datei. Ueber den NAMEN zu
vergleichen waere die naheliegende Abkuerzung -- und sie versagt genau
dort, wo Dateien "giphy.gif", "giphy(1).gif" und "download.gif"
heissen, also fast immer. Dasselbe Bild waere dreimal dieselbe Kachel.

Dasselbe GIF zweimal hineinzulegen ist deshalb KEIN Fehler: Es ist
drin, und genau das wollte man. Eine Absage waere formal richtig und im
Erleben falsch.

DAS WICHTIGSTE STUECK: ES WIRD KOPIERT, NICHT VERWIESEN
-------------------------------------------------------
Eine Nachricht zurueckzunehmen entfernt ihre Datei von der Platte. Laege
ein Kachel-GIF in demselben Ordner und mehrere Nachrichten zeigten
darauf, naehme das Zuruecknehmen EINER Nachricht das GIF fuer alle
anderen mit -- und in drei Gespraechen stuende ab da ein kaputtes Bild.
Das ist die Sorte Fehler, die erst Wochen spaeter auffaellt und dann
nicht mehr zu reparieren ist.

Deshalb liegt die Kiste in einem eigenen Ordner (chat-gifs/), und beim
Verschicken wird kopiert. Danach ist es ein ganz normaler Anhang: im
Verlauf, in der Suche, zuruecknehmbar, unter derselben Nachtruhe. Keine
zweite Sorte Nachricht mit eigenen Rechten und eigenem Loeschen.

Geprueft wird genau das: GIF hineinlegen, verschicken, aus der Kiste
nehmen -- und danach steht das verschickte immer noch im Gespraech.

"ALSO NUR" GILT AUCH HIER
-------------------------
Ansehen, hineinlegen, verschicken: alle drei nur fuer Team Dogi und
DogFather (istTeamDogi). Der Satz stand im selben Atemzug wie die
Sprachnachrichten; es gibt keinen Grund, warum er fuer das eine gelten
sollte und fuer das andere nicht. Gemessen auch am Knopf vorbei:
403/403/403.

AUGENSCHONEND -- HIER EINE ECHTE FRAGE, KEINE FORMSACHE
--------------------------------------------------------
Zwoelf gleichzeitig laufende Bildchen sind das Gegenteil von ruhig. Wer
"Bewegung reduzieren" gesetzt hat, bekommt deshalb STEHENDE Bilder: das
erste Einzelbild, im Browser auf eine Zeichenflaeche gemalt (kostet
keine zweite Datei), und es laeuft erst, wenn man es anfasst oder mit
der Tastatur darauf steht.

Fuer alle anderen laufen sie. Eine GIF-Auswahl, in der sich nichts
bewegt, ist eine, in der man nicht sieht, was man verschickt -- deshalb
steht dazu eine Gegenprobe in der Pruefung.

NEBENBEFUND, UND ER WIEGT SCHWERER ALS DIE GIFS
-----------------------------------------------
Weil die Kiste einen neuen Datenordner braucht, lief
tools/wiederherstellung-proben.mjs -- und meldete, dass der Ordner
"material" seit dem 22.09. NICHT gesichert wird. 2,4 MB
Materialbibliothek auf dem Server, nach einem Plattenausfall weg, ohne
dass die taegliche Meldung je etwas gesagt haette. Genau die Luecke,
wegen der diese Probe ueberhaupt gebaut wurde -- und sie hat sie
gefunden, weil sie die Ordner aus dem QUELLTEXT liest statt aus einer
gepflegten Liste.

Eingetragen. Danach frisch geholt und zurueckgespielt: 18 von 18 gruen,
"DIE SICHERUNG LAESST SICH ZURUECKSPIELEN" (vorher 3 Fehler).

Dabei war die Gegenprobe daneben selbst kaputt: Sie prueft, ob ein
erfundener Ordner als fehlend erkannt wird, und verlangte dafuer
`=== 1`. Das setzt voraus, dass sonst nichts fehlt. An dem Tag, an dem
wirklich etwas fehlte, wurde sie rot und zeigte damit auf sich selbst
statt auf den Fund -- zwei Meldungen, eine Ursache, und die zweite
lenkt von der ersten ab. Jetzt zaehlt sie die Differenz.

GEPRUEFT
--------
pruef-chat-anhaenge: 109 Pruefungen, 0 Fehler (vorher 86, davor 60).
pruef-chat, pruef-chat-aufloesen (126), pruef-chat-optik: gruen.
tools/wiederherstellung-proben: 18 von 18.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-23 02:07:56 +02:00

139 lines
5.6 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>Meldungen &amp; Maßnahmen · Das Rudel</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=202609230207" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609230207" />
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
</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">Das&nbsp;Rudel</a> · Meldungen</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 inhalt--breit">
<section class="kopf-zeile">
<div>
<p class="marke">Das Rudel · Moderation</p>
<h1 class="titel">Meldungen &amp; Maßnahmen</h1>
<p class="unterzeile">
Was gemeldet wurde, was entfernt wurde und mit welcher Begründung –
alles an einer Stelle.
</p>
</div>
</section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- ==================================================================
WARUM DIESE SEITE EXISTIERT
Die Schnittstellen dafür gab es zuerst, die Seite nicht. Eine
Meldung, die nur über eine Schnittstelle abrufbar ist, ist keine
Meldung — sie ist eine Zeile in einer Datenbank, die niemand
liest. Der DSA verlangt in Artikel 16, dass Meldungen
BEARBEITET werden; ohne eine Stelle, an der sie erscheinen,
wäre das ein Versprechen an eine Schublade.
DREI ABSCHNITTE, IN DIESER REIHENFOLGE: Was liegt an (Meldungen)
— was wurde getan (Entfernt) — wer ist gesperrt (Maßnahmen). Wer
diese Seite öffnet, hat fast immer die erste Frage.
============================================================== -->
<!-- WAS HEREINKOMMT (17.09.2026). Steht GANZ OBEN, vor den offenen
Meldungen: Eine Meldung setzt voraus, dass jemand etwas gesehen
hat. Wer acht Bretter durchklicken muss, um zu sehen, ob etwas
Neues da ist, tut es nicht achtmal am Tag -- und was niemand
ansieht, moderiert auch niemand. -->
<section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Was hereinkommt</h2>
<div class="treff-abschnitt__inhalt">
<p>
Die neuesten Beiträge aus allen Bereichen der Community –
an einer Stelle, damit niemand acht Bretter durchklicken muss.
</p>
</div>
<div id="zulauf" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section>
<section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Offene Meldungen</h2>
<div class="treff-abschnitt__inhalt">
<p>
Zu jeder Entscheidung gehört ein Satz. Er wird festgehalten –
auch damit man später weiß, warum etwas so entschieden wurde.
</p>
</div>
<div id="meldungen" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section>
<section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Entfernt</h2>
<div class="treff-abschnitt__inhalt">
<p>
Was entfernt wurde, und warum. Die Begründung überlebt den Beitrag –
das ist der Sinn der Sache
<span class="leise">(Digital Services Act, Artikel 17)</span>.
</p>
</div>
<div id="entfernt" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section>
<section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Die Mitglieder</h2>
<div class="treff-abschnitt__inhalt">
<p>
Wer da ist, seit wann, auf welcher Stufe – und wer gerade eine Pause
hat. Von hier aus wird gehandelt; die Stufe steht nur hier und
<strong>nie</strong> neben dem Namen im Rudel.
</p>
</div>
<div id="mitglieder" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section>
<section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Hinweise, Pausen, Ausschlüsse</h2>
<div class="treff-abschnitt__inhalt">
<p id="leiter">…</p>
</div>
<div id="massnahmen" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section>
</main>
<script src="assets/js/meldung.js?v=202609230207" defer></script>
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
<script src="assets/js/wahl.js?v=202609230207" defer></script>
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
<script src="assets/js/installieren.js?v=202609230207" defer></script>
<script src="assets/js/kopf.js?v=202609230207" defer></script>
<script src="assets/js/treff-moderation.js?v=202609230207" defer></script>
</body>
</html>