Files
dogfather-universe/workspace/bereich.html
T
DogFatherGit 285038f400 Der vertrauliche Meldeweg vergisst jetzt -- und sagt, bis wann
Zwei Entscheidungen, die offenstanden. Beide getroffen, nachdem
gemessen war, was wirklich da ist.

1. WIE LANGE BLEIBEN ABGESCHLOSSENE FAELLE?  90 Tage.

Die Entscheidung war bereits getroffen: `AUFBEWAHRUNG_TAGE = 90` steht
seit dem 19.09. in hilfe-tabellen.js, mit Begruendung ("ein Fall kommt
manchmal wieder auf"). Nur hat sie NIEMAND durchgesetzt --
`hilfeAufraeumen()` gab es, und der einzige Aufrufer war ihre eigene
Pruefung. Der Kommentar darueber behauptete "Wird beim Start
aufgerufen (siehe index.js)"; das war nie wahr.

Jetzt steht die Regel in workspace-aufbewahrung.js, dem Loeschkonzept,
das sich selbst durchsetzt -- beim Start und danach taeglich. Die
zweite Fassung in workspace-hilfe.js ist WEG, nicht doppelt: Zwei
DELETEs auf dieselben Daten waeren morgen verschieden, und der
Unterschied fiele erst auf, wenn er zaehlt.

GEMESSEN VOR DEM EINSCHALTEN:
  In der echten Datenbank steht heute KEIN einziger Fall. Der erste
    Lauf loescht nichts, und der erste Fall kann fruehestens in drei
    Monaten 90 Tage alt werden. Jetzt einschalten ist frei -- spaeter
    waere es der riskante Moment gewesen.
  PRAGMA foreign_keys steht im Dienst auf 1, und hilfe_nachrichten
    traegt ON DELETE CASCADE. An einem echten Fall mit Nachricht
    nachgemessen: vorher 1/1, nachher 0/0. Ohne diese Messung waere
    der Fall verschwunden und der eigentliche Text liegengeblieben.

2. SOLL EIN GESCHLOSSENER FALL WIEDER ZU OEFFNEN SEIN?  Nein.

Im Kopf von workspace-hilfe.js steht: "EIN GESCHLOSSENER FALL IST
GESCHLOSSEN. Auch fuer die Leitung -- sonst ist 'zugemacht' eine
Meinung und keine Tatsache." Das ist eine gute Regel, und sie bleibt.

Nachgemessen, dass sie auch traegt: Ein Melder kann seinen
geschlossenen Fall weiter LESEN, und ein geschlossener Fall zaehlt
nicht gegen das Limit von drei offenen. Wer eine Wiederholung melden
will, kann das also jederzeit -- die Bauweise ist stimmig.

NUR WUSSTE DAS NIEMAND. Dort stand ein Satz: "Dieser Fall ist
abgeschlossen (Datum)." Jetzt stehen drei -- und sie beantworten die
drei Fragen, die man in dem Moment hat:
  Kann ich noch schreiben?   Nein, und er laesst sich nicht oeffnen.
  Bleibt das hier stehen?    Bis zum TT.MM.JJJJ, dann geloescht.
  Und wenn es wieder passiert? Neu melden, der alte zaehlt nicht mit.

Das Datum kommt vom Server (`lesbar_bis`), die Frist ebenso -- sie
steht nur an EINER Stelle. Und sie steht jetzt auch im Dialog BEIM
Schliessen: Wer eine Uhr startet, soll das vorher wissen, nicht
danach.

OHNE UHRZEIT, und das ist kein Schoenheitsgrund: Ein Fall, der am
20.09. um 14:04 (Sommerzeit) geschlossen wird, verfaellt 90 Tage
spaeter um 13:04 -- die Uhr wird dazwischen zurueckgestellt. Richtig
gerechnet, sieht aus wie ein Fehler. Wer eine Stunde sucht, die es
nicht gibt, hat Zeit verloren.

UND DIE URSACHE, DAMIT ES NICHT WIEDER PASSIERT:
hilfe_faelle kam am 19.09. dazu, das Loeschkonzept ist vom 15.09., und
nichts hat die beiden je verglichen. Neue Pruefung in
pruef-aufbewahrung: Jede Tabelle mit einer Spalte, die "hier ist etwas
zu Ende" sagt, MUSS im Konzept stehen.
  Kein "jede Tabelle muss drinstehen": 46 Tabellen, 41 mit
  Personenbezug -- das gaebe 38 Meldungen, von denen fast alle falsch
  waeren (sie sind ueber personen_geloescht gedeckt). Eine Pruefung,
  die 38-mal meldet, wo einmal richtig waere, wird abgeschaltet.
  Gesucht wird das schmale Merkmal: GENAU ZWEI Tabellen im Haus tragen
  so eine Spalte. Beide jetzt im Konzept -- hilfe_faelle mit Frist,
  aufgaben ausdruecklich OHNE (erledigte Aufgaben sind
  Arbeitsdokumentation, keine Meldung ueber einen Menschen).

pruef-hilfe 84/0 (war 59) -- darunter zehn neue am Bildschirm:
"drei Saetze statt einem", "sie stehen untereinander, nicht
nebeneinander" (ein <p> in einem <p> waere ungueltig, der Container
ist jetzt ein <div>), "und WANN, mit Datum".
pruef-aufbewahrung 45/0 (war 41), mit Gegenprobe.
2026-09-20 14:10:38 +02:00

268 lines
13 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>Bereich · Spicy & Dogi</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201409" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201409" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201409" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201409" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201409" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201409" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201409" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201409" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201409" />
</head>
<body class="start">
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
Pseudo-Elements -- body hat nur ::before und ::after. -->
<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>
<!-- Der innere span.marke__text fehlte hier als einziger Seite. Damit
griffen weder die Überlauf-Kürzung noch der Rang im Schriftzug --
aufgefallen erst, als die Seitenprüfung die Marke auf allen
dreizehn Seiten nachgesehen hat. -->
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> ·
<span id="marke-bereich">…</span></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" id="ober">Betreuung</p>
<h1 class="titel" id="titel">…</h1>
<p class="unterzeile" id="unterzeile"></p>
</div>
<button type="button" class="knopf knopf--klein" id="neu-oeffnen">Neuer Eintrag</button>
</section>
<form class="neu" id="neu" hidden>
<!-- STARTHILFE (18.09.2026). Ein leeres Feld ist der haeufigste
Grund, warum ein Brett still bleibt, obwohl viele mitlesen.
Die Zeile verschwindet, sobald jemand selbst tippt -- Hilfe,
die stehen bleibt, wenn man sie nicht mehr braucht, ist im Weg. -->
<div class="starthilfe" id="starthilfe" hidden>
<p class="starthilfe__wort">Kein Anfang? Nimm eines davon und schreib es um:</p>
<div class="starthilfe__reihe" id="starthilfe-reihe"></div>
</div>
<div class="neu__raster">
<div>
<label class="feld-schild" for="f-art">Art</label>
<select id="f-art"></select>
</div>
<div>
<label class="feld-schild" for="f-datum" id="schild-datum">Datum</label>
<input id="f-datum" type="date" />
<!-- WAS DAS DATUM BEWIRKT (17.09.2026). Das Feld ist mit heute
vorbelegt und hiess bisher nur "Datum" -- dass ein Tag in der
Zukunft den Zettel in den Kalender bringt, konnte niemand
wissen. Der Satz aendert sich mit der Eingabe: Ein fester
Hinweis beantwortet die Frage nicht, die man gerade hat. -->
<p class="feld-hinweis" id="hinweis-datum" aria-live="polite"></p>
</div>
<!-- DIE UHRZEIT (17.09.2026). Nur dort sichtbar, wo Termine
stehen. Optional: Viele Termine haben keine Uhrzeit ("diese
Woche", "im Oktober"), und ein Pflichtfeld haette dafuer eine
erfundene erzwungen. Ohne sie zaehlt der Countdown in Tagen. -->
<div id="feld-uhrzeit" hidden>
<label class="feld-schild" for="f-uhrzeit">Uhrzeit</label>
<input id="f-uhrzeit" type="time" />
<p class="feld-hinweis">Wenn du sie weißt. Dann zählt der Countdown in Stunden.</p>
</div>
<!-- Nur bei Agentur-Events: das Ende des Zeitraums. Der Beginn ist
das Feld darueber -- ein zweites Datumsfeld daneben liest sich
als Spanne, ein Feld "Zeitraum" mit Text darin nicht. -->
<div id="feld-ende" hidden>
<label class="feld-schild" for="f-ende">Bis</label>
<input id="f-ende" type="date" />
</div>
<!-- Was DogFather dafuer tun muesste. Nur in Bereichen, die das
Feld kennen (siehe BEREICHE.angebote) -- sonst bleibt es
verborgen und wird auch nicht mitgeschickt. -->
<div id="feld-einsatz" hidden>
<label class="feld-schild" for="f-einsatz" id="einsatz-schild">Einsatz</label>
<input id="f-einsatz" type="text" maxlength="300"
placeholder="z. B. Termin ansagen und den Gast einladen" />
</div>
<!-- FÜRS TEAM ODER NUR AN DOGFATHER (10.09.2026, Kapitel 5).
Steht nur dort, wo der Bereich es vorsieht -- der Server sagt
das über `einstellung.vertraulich`, nicht diese Datei.
Es ist ein Schalter mit zwei Zuständen und keine Auswahlliste:
Es gibt genau zwei Antworten, und eine davon ist der
Normalfall. -->
<div id="feld-vertraulich" hidden>
<label class="feld-schild" for="f-vertraulich">Wer darf das lesen?</label>
<label class="vertraulich-zeile">
<input type="checkbox" id="f-vertraulich" />
<span>
<strong>Nur DogFather</strong>
<em>Sonst liest es das ganze Team – auch die rechte Hand.</em>
</span>
</label>
</div>
<div id="feld-dringlich" hidden>
<label class="feld-schild" for="f-dringlich" id="dringlich-schild">Dringlichkeit</label>
<select id="f-dringlich">
<option value="hoch">hoch</option>
<option value="mittel" selected>mittel</option>
<option value="niedrig">niedrig</option>
</select>
</div>
<div id="feld-bewertung" hidden>
<label class="feld-schild" for="f-bewertung" id="bewertung-schild">Bewertung (1–5)</label>
<select id="f-bewertung">
<option value="">—</option>
<option value="1">1 – schwach</option>
<option value="2">2</option>
<option value="3">3 – solide</option>
<option value="4">4</option>
<option value="5">5 – stark</option>
</select>
</div>
<div id="feld-creator" hidden>
<label class="feld-schild" for="f-creator" id="schild-creator">Creator</label>
<select id="f-creator"><option value="">—</option></select>
<p class="feld-hinweis" id="hinweis-creator" hidden></p>
</div>
</div>
<div class="neu__zeile">
<label class="feld-schild" for="f-titel" id="schild-titel">Überschrift</label>
<input id="f-titel" maxlength="160" required />
</div>
<div class="neu__zeile">
<label class="feld-schild" for="f-text" id="schild-text">Text <span class="leise">(optional)</span></label>
<textarea id="f-text" rows="4" maxlength="6000"></textarea>
</div>
<!-- ==== Nur bei Agentur-Events ====================================
Zwei Felder, die den Unterschied zwischen einem Aufruf und einer
Aktion ausmachen, an der jemand teilnehmen kann: WAS ist zu tun
(und was springt dabei heraus) und WAS GILT dabei. Beides stand
bisher irgendwo im Fliesstext oder gar nicht -- und jede
Rueckfrage dazu kostet eine Nachricht. -->
<div class="neu__zeile" id="feld-aufgaben" hidden>
<label class="feld-schild" for="f-aufgaben">Aufgaben
<span class="leise">– womit sammelt man Punkte, was gibt es zu gewinnen</span></label>
<textarea id="f-aufgaben" rows="5" maxlength="6000"
placeholder="z. B.&#10;· 1 Punkt je Live-Stunde&#10;· 3 Punkte je neuem Abo&#10;· Platz 1 gewinnt …"></textarea>
</div>
<div class="neu__zeile" id="feld-regeln" hidden>
<label class="feld-schild" for="f-regeln">Regeln
<span class="leise">– was zählt, was nicht, bis wann</span></label>
<textarea id="f-regeln" rows="5" maxlength="6000"
placeholder="z. B.&#10;· Nur Streams auf dem eigenen Konto&#10;· Punkte zählen bis 23:59 am letzten Tag"></textarea>
</div>
<p class="fehler" id="neu-fehler" role="alert" aria-live="polite"></p>
<div class="neu__knoepfe">
<button type="submit" class="knopf knopf--klein" id="neu-speichern">Eintragen</button>
<button type="button" class="abmelden" id="neu-abbrechen">Abbrechen</button>
</div>
</form>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- DER COUNTDOWN STEHT GANZ OBEN, noch vor den Filtern.
Zuerst stand er UNTER dem Startkatalog -- und der schob die
Antwort auf "wann ist der naechste Stream" von 458 px auf
1488 px, also aus dem ersten Handybildschirm heraus.
Gefunden hat das nicht das Auge, sondern pruef-countdown:
Das Abnahmekriterium aus Stufe 2 wurde rot, als Stufe 5
dazukam.
Die Regel dahinter: Ein WERKZEUG (fuer das Team) draengt
nie eine ANTWORT (fuer alle) nach unten. -->
<section id="countdown" class="countdown" hidden></section>
<!-- DER NAECHSTE SCHRITT. Was hier steht, entscheidet der Server --
er kennt die Rolle, und Rollennamen stehen in keiner Datei, die
jeder herunterladen kann. Derzeit genau eine Stelle: der Weg zur
Anfrage auf dem Brett "Mitmachen".
UEBER DEM FILTER, weil es eine ANTWORT ist und kein Werkzeug --
dieselbe Regel, die den Countdown nach oben gebracht hat. -->
<section id="weiter" class="bw-tor" hidden></section>
<div class="filter" id="filter"></div>
<!-- Fertige Punkte zum Uebernehmen -- nur in Bereichen, fuer die es
welche gibt (derzeit LIVE-Analyse). -->
<!-- Unterweisungen mit beidseitiger Bestaetigung. Nur im Bereich
"Schutz & Regeln" -- dort gehoeren Richtlinien hin. -->
<div id="schulung" hidden></div>
<div id="vorlagen" hidden></div>
<!-- DER COUNTDOWN. Nur bei "Was ansteht": Die einzige Frage, die
ein Zuschauer dort wirklich hat, ist WANN -- und sie gehoert
gross beantwortet, nicht in Zeile vier. -->
<!-- DER STARTKATALOG (17.09.2026). Nur fuer das Team und nur,
solange es etwas zu holen gibt. Ein Brett, das nur aus
Filterknoepfen und "Noch kein Eintrag" besteht, sieht nicht
neu aus, sondern aufgegeben. -->
<!-- EIN VIDEO EINLESEN (17.09.2026), Stufe A des Video-Plans.
Nur bei den Highlights und nur fuer das Team. Link einfuegen,
den Rest macht der Server: Titel, Coverbild, Kanal. -->
<section id="videoholen" class="videoholen" hidden>
<form id="video-form" class="videoholen__form">
<label class="feld-schild" for="video-url">Video-Link einfügen</label>
<div class="videoholen__zeile">
<input id="video-url" type="url" inputmode="url"
placeholder="https://www.tiktok.com/@dogfather0804/video/…" />
<button type="submit" class="knopf knopf--klein" id="video-holen">Holen</button>
</div>
<p class="feld-hinweis" id="video-hinweis">Titel und Coverbild kommen von selbst. Es zählen nur deine drei Kanäle.</p>
</form>
</section>
<section id="startkatalog" class="startkatalog" hidden></section>
<div id="liste" aria-busy="true"><p class="leise">Einträge werden geladen …</p></div>
</main>
<script src="assets/js/meldung.js?v=202609201409" defer></script>
<script src="assets/js/nachfrage.js?v=202609201409" defer></script>
<script src="assets/js/wahl.js?v=202609201409" defer></script>
<script src="assets/js/bereiche.js?v=202609201409" defer></script>
<script src="assets/js/kopf.js?v=202609201409" defer></script>
<script src="assets/js/glocke.js?v=202609201409" defer></script>
<script src="assets/js/checkliste.js?v=202609201409" defer></script>
<script src="assets/js/ampel.js?v=202609201409" defer></script>
<script src="assets/js/schulung.js?v=202609201409" defer></script>
<script src="assets/js/vorlagen.js?v=202609201409" defer></script>
<script src="assets/js/bereich.js?v=202609201409" defer></script>
</body>
</html>