Neue Rolle: die linke Hand
Aus dem Auftrag vom 21.09.2026, Abschnitt 6: "Die linke Hand erhaelt
grundsaetzlich dieselben Rechte wie die rechte Hand in allen Bereichen,
die die Modis, Aufgaben, Aufgabenzuweisungen, Uebersichten,
Kommunikation und Auswertungen betreffen. Die linke Hand darf keine
neuen Personen oder Accounts hinzufuegen. Die linke Hand darf keine
privaten bzw. persoenlichen Bereiche oder Informationen von Dogfather
sehen."
GEMESSEN VOR DEM BAUEN: Die Rolle "hand" steht an 35 Stellen im
Servercode und 17-mal in der Rechtetafel. Haette ich ueberall ein
"linke" danebengeschrieben, waere die naechste Stelle, die jemand
hinzufuegt, die erste, die es vergisst -- und eine vergessene Stelle
heisst hier: Die linke Hand sieht etwas nicht, ohne dass jemand merkt,
warum.
DESHALB EINE REGEL STATT DREISSIG ABSCHRIFTEN:
WIE_RECHTE_HAND = new Set(["hand", "linke"]) in workspace.js
istHand(person) fuer die Faehigkeiten
eine Schleife ueber SEITEN fuer die Rechtetafel
Die Schleife gibt der linken Hand jede Seite der rechten -- ausser
fuenf, und jede davon steht mit Grund da:
personen.html legt Personen an
bewerbungen.html fuehrt zu neuen Personen
talente.html fuehrt zu neuen Personen
hilfe.html vertraulicher Meldeweg
rechte.html Rechteverwaltung
Gemessen: 25 Seiten fuer die rechte Hand, 20 fuer die linke. Als
Kacheln: 30 gegen 26 -- die vier verbotenen erscheinen gar nicht erst,
statt beim Antippen abgelehnt zu werden.
ZWEI DINGE, DIE ERST DAS MESSEN GEZEIGT HAT:
(1) OHNE KACHEL AUF DER ANMELDEWAND GIBT ES DIE ROLLE NICHT. Die
Anmeldung sucht `WHERE rolle = ?` auf die angetippte Kachel -- es
gibt keinen rollenuebergreifenden Sonderweg, auch nicht auf der
Crew-Wand. Eine linke Hand haette sich mit dem richtigen Code
NIEMALS anmelden koennen, und der Fehler haette ausgesehen wie ein
falscher Code.
(2) DIE REIHENFOLGE DER DATENBANK-UMSTELLUNG ZAEHLT.
`checkListeErweitern` baut die CHECK-Regel NEU aus der Liste, die
man ihm gibt. Mein Schritt stand zuerst bei der rechten Hand --
der Schritt fuer "gast" darunter nahm die Rolle damit wieder
heraus, denn seine Liste kennt sie nicht. Die Kette ist kumulativ;
neue Schritte gehoeren ans ENDE. Das steht jetzt auch dort.
Dazu zwei kleinere Funde beim Bauen:
- Meine erste Ableitung aenderte die Rollenliste AN ORT UND STELLE.
Mehrere Seiten teilen sich dieselbe Liste (`ALLE`) -- das haette
die Rolle allen Seiten gegeben, die sie benutzen, auch einer
Ausnahme. Faellt nicht auf, solange keine Ausnahme `ALLE` benutzt.
Jetzt eine Kopie je Seite.
- ROLLEN_NAME fehlte der Eintrag: Die linke Hand haette ueberall
"linke" geheissen statt "Linke Hand". Gefunden hat das
pruef-rechtetafel, weil sie diese Tabelle gegen ROLLEN haelt.
Ihre Meldung nennt jetzt, WELCHE Liste was vermisst -- vorher
zeigte sie beim Fehlschlag nur eine der beiden.
NICHT BEKOMMEN -- und jedes einzeln begruendet im Code:
Personen anlegen (ANLEGBAR.linke = []), Rollen aendern
(darfRollenWechseln), Bewerbungen, der vertrauliche Meldeweg. Beim
Meldeweg ist es bewusst das kleinere Recht: Ein Wort von Filipe
oeffnet ihn, eine versehentlich gelesene Meldung laesst sich nicht
zurueckholen.
UNBERUEHRT GEBLIEBEN, obwohl dort "hand" steht:
workspace-leistung.js:406 -- dort heisst "hand" nicht die Rolle,
sondern "von Hand eingetragen".
Am laufenden System gemessen: Datenbank nimmt die Rolle, Anmeldung
HTTP 200, 26 Kacheln, darf_verteilen = true, personen/hilfe/rechte
antworten mit 302, aufgaben und teamlage mit 200.
pruef-rechtetafel 19/0 (war 18/1), pruef-schranke 39/0,
pruef-umstellung 18/0.
This commit is contained in:
+81
-9
@@ -98,7 +98,44 @@ const SITZUNG_TAGE = 180;
|
||||
const SITZUNG_MS = SITZUNG_TAGE * 86400_000;
|
||||
const VERSUCHE_MAX = 8; // pro IP
|
||||
const VERSUCHE_FENSTER_MIN = 10;
|
||||
const ROLLEN = new Set(["spicy", "admin", "manager", "scout", "creator", "hand", "modi", "gast"]);
|
||||
const ROLLEN = new Set(["spicy", "admin", "manager", "scout", "creator",
|
||||
"hand", "linke", "modi", "gast"]);
|
||||
|
||||
/* ===== DIE LINKE HAND (21.09.2026) ==================================
|
||||
|
||||
Filipe, aus dem Auftrag: *"Die linke Hand erhaelt grundsaetzlich
|
||||
dieselben Rechte wie die rechte Hand in allen Bereichen, die die
|
||||
Modis, Aufgaben, Aufgabenzuweisungen, Uebersichten, Kommunikation
|
||||
und Auswertungen betreffen. Die linke Hand darf keine neuen Personen
|
||||
oder Accounts hinzufuegen. Die linke Hand darf keine privaten bzw.
|
||||
persoenlichen Bereiche oder Informationen von Dogfather sehen."*
|
||||
|
||||
DESHALB EINE MENGE UND NICHT DREISSIG ABSCHRIFTEN. Die Rolle "hand"
|
||||
steht an 35 Stellen im Servercode. Haette ich ueberall ein "linke"
|
||||
danebengeschrieben, waere die naechste Stelle, die jemand
|
||||
hinzufuegt, die erste, die es vergisst -- und eine vergessene Stelle
|
||||
heisst hier: Die linke Hand sieht etwas nicht, ohne dass jemand
|
||||
merkt, warum. Genau diese Falle hat das Haus am 11.09. schon einmal
|
||||
Datenspalten gekostet.
|
||||
|
||||
WAS AUSDRUECKLICH NICHT DAZUGEHOERT -- und warum jedes einzeln:
|
||||
|
||||
- Personen anlegen (ANLEGBAR) ausdruecklich im Auftrag
|
||||
- Bewerbungen lesen das ist der Weg, auf dem
|
||||
Personen hinzukommen
|
||||
- Rollen aendern Kontoverwaltung, nicht
|
||||
Aufgabenverwaltung
|
||||
- der vertrauliche Meldeweg das Empfindlichste im Haus;
|
||||
im Zweifel das kleinere Recht.
|
||||
Ein Wort von Filipe kehrt das
|
||||
um -- eine versehentlich
|
||||
gelesene Meldung nicht.
|
||||
|
||||
Die Menge steht hier oben, VOR allem, was sie benutzt. */
|
||||
export const WIE_RECHTE_HAND = new Set(["hand", "linke"]);
|
||||
|
||||
/** Hat diese Person die Team-Rechte einer Hand (rechts oder links)? */
|
||||
export const istHand = (person) => !!person && WIE_RECHTE_HAND.has(person.rolle);
|
||||
|
||||
/* DIE EINE REIHENFOLGE, IN DER ROLLEN UEBERALL ERSCHEINEN.
|
||||
|
||||
@@ -125,7 +162,8 @@ const ROLLEN = new Set(["spicy", "admin", "manager", "scout", "creator", "hand",
|
||||
'gast' (Community) steht mit Absicht NICHT in der Liste: Sie faellt
|
||||
dadurch ans Ende (siehe ELSE unten), und das ist richtig -- die
|
||||
Community ist keine Stufe im Team. */
|
||||
export const ROLLEN_REIHE = ["spicy", "admin", "hand", "manager", "scout", "creator", "modi"];
|
||||
export const ROLLEN_REIHE = ["spicy", "admin", "hand", "linke", "manager",
|
||||
"scout", "creator", "modi"];
|
||||
|
||||
/* DIE ROLLEN MIT EINER KACHEL AUF DER ANMELDESEITE.
|
||||
|
||||
@@ -168,7 +206,8 @@ const ROLLEN_KACHEL = new Set(["spicy", "admin", "manager", "scout", "creator"])
|
||||
* 10.09. waere wieder umgeworfen worden. Er hat sich fuer die vierte
|
||||
* Kachel entschieden; der Preis ist damit bewusst bezahlt und nicht
|
||||
* uebersehen. */
|
||||
const CREW_KACHEL = new Set(["admin", "hand", "modi", "gast"]);
|
||||
/* Die linke Hand meldet sich ueber dieselbe Wand an wie die rechte. */
|
||||
const CREW_KACHEL = new Set(["admin", "hand", "linke", "modi", "gast"]);
|
||||
|
||||
/** Die Rollen mit einer Kachel auf der Zugangswand von treff.
|
||||
*
|
||||
@@ -231,7 +270,7 @@ export const istDogFather = (person) => !!person && person.rolle === "admin";
|
||||
spicy und manager bleiben drin: Auf der Agenturseite verteilen sie
|
||||
seit jeher Aufgaben, und daran soll sich nichts aendern. */
|
||||
export const darfAufgabenVerteilen = (person) =>
|
||||
istLeitung(person) || person?.rolle === "hand";
|
||||
istLeitung(person) || istHand(person);
|
||||
|
||||
/* ===== WER DARF EINE ROLLE AENDERN -- UND ZU WELCHER? (20.09.2026) ==
|
||||
|
||||
@@ -396,6 +435,12 @@ const ANLEGBAR = {
|
||||
spicy: ["spicy", "manager", "scout", "creator"],
|
||||
/* Ein Manager stellt Creator ein, die er dann auch betreut. */
|
||||
manager: ["creator"],
|
||||
/* DIE LINKE HAND LEGT NIEMANDEN AN (21.09.2026) -- ausdruecklich im
|
||||
Auftrag. Sie stuende auch ohne diese Zeile auf [] (darfAnlegen
|
||||
nimmt `?? []`), aber dann saehe es aus wie vergessen. Eine
|
||||
ausdrueckliche leere Liste ist eine Entscheidung, eine fehlende
|
||||
Zeile ist eine Luecke. */
|
||||
linke: [],
|
||||
};
|
||||
|
||||
/** Welche Rollen darf diese Person anlegen? Immer ein Feld, nie null —
|
||||
@@ -449,6 +494,11 @@ export function darfAnlegen(person) {
|
||||
export const darfRollenWechseln = (person) =>
|
||||
!!person && (person.rolle === "admin" || person.rolle === "spicy"
|
||||
|| person.rolle === "hand");
|
||||
/* OHNE "linke" -- UND DAS IST ABSICHT, KEIN VERGESSEN (21.09.2026).
|
||||
Eine Rolle zu aendern ist Kontoverwaltung. Der Auftrag sagt zur
|
||||
linken Hand ausdruecklich "keine neuen Personen oder Accounts
|
||||
hinzufuegen"; wer Rollen vergeben kann, kann sich selbst und andere
|
||||
zu allem machen, was es gibt. Deshalb hier die kleinere Antwort. */
|
||||
|
||||
/* WER FUEHRT TEAM DOGI? (10.09.2026)
|
||||
*
|
||||
@@ -463,7 +513,7 @@ export const darfRollenWechseln = (person) =>
|
||||
* vergisst. Der Eingang ruft ab jetzt hierher.
|
||||
*/
|
||||
export const fuehrtTeamDogi = (person) =>
|
||||
!!person && (person.rolle === "admin" || person.rolle === "hand");
|
||||
!!person && (person.rolle === "admin" || istHand(person));
|
||||
|
||||
/* =======================================================================
|
||||
SPICY MEDIA (07.09.2026)
|
||||
@@ -650,6 +700,12 @@ export const ROLLEN_NAME = {
|
||||
scout: "Scout",
|
||||
creator: "Creator",
|
||||
hand: "Rechte Hand",
|
||||
/* DIE LINKE HAND (21.09.2026). Ohne diesen Eintrag heisst sie
|
||||
ueberall dort, wo der Rollenname steht -- im Treff, an einem
|
||||
Beitrag, in der Personenliste -- schlicht "linke". Gefunden hat
|
||||
das pruef-rechtetafel, weil sie diese Tabelle gegen ROLLEN haelt
|
||||
und rot wird, sobald eine Rolle nur in einer der beiden steht. */
|
||||
linke: "Linke Hand",
|
||||
modi: "Modi",
|
||||
/* DIE COMMUNITY (11.09.2026). Der Name steht hier und NICHT in einer
|
||||
Datei, die jeder herunterlaedt -- ausgeliefert wird er nur an den,
|
||||
@@ -1316,7 +1372,7 @@ export const TREFF_BRETTER = [...new Set([
|
||||
/* Wer den Treff ueberhaupt sehen darf: die Community selbst und das
|
||||
Team von Dogi. Die Agentur ausdruecklich nicht -- Creator, Scouts und
|
||||
Spicy Media haben mit den Zuschauern dieses Streams nichts zu tun. */
|
||||
export const TREFF_ROLLEN = new Set(["gast", "modi", "hand", "admin"]);
|
||||
export const TREFF_ROLLEN = new Set(["gast", "modi", "hand", "linke", "admin"]);
|
||||
|
||||
/* DER VERTRAULICHE MELDEWEG (19.09.2026).
|
||||
|
||||
@@ -1479,7 +1535,7 @@ const TREFF_MIT_EIGENEM = [...TREFF_BEREICHE, HILFE_KACHEL, STECKBRIEF_KACHEL_TR
|
||||
|
||||
export function bereicheFuer(person) {
|
||||
if (person?.rolle === "modi") return MODI_MIT_TREFF;
|
||||
if (person?.rolle === "hand") return HAND_MIT_TREFF;
|
||||
if (istHand(person)) return HAND_MIT_TREFF;
|
||||
/* DIE COMMUNITY SIEHT DEN TREFF UND SONST NICHTS (11.09.2026) --
|
||||
seit dem 19.09. plus den eigenen Steckbrief. */
|
||||
if (person?.rolle === "gast") return TREFF_MIT_EIGENEM;
|
||||
@@ -1865,7 +1921,7 @@ export function kategoriePersonen(person) {
|
||||
/* Ein Modi arbeitet ausschliesslich an eigenen Aufgaben -- dort gilt
|
||||
sie immer, unabhaengig davon, wen er eintraegt. */
|
||||
if (person.rolle === "modi") return null;
|
||||
if (person.rolle !== "admin" && person.rolle !== "hand") return [];
|
||||
if (person.rolle !== "admin" && !istHand(person)) return [];
|
||||
try {
|
||||
/* Auch die rechte Hand selbst: Sie traegt Aufgaben ein -- fuer
|
||||
andere UND fuer sich. Waere ihre eigene Nummer nicht dabei,
|
||||
@@ -1884,10 +1940,12 @@ export function kategoriePersonen(person) {
|
||||
die anderen zu stellen: Sie haelt den Ueberblick, sie steht nicht
|
||||
darueber. */
|
||||
const HAND_ROLLENTEXT = "Rechte Hand · du hast alles im Blick und entscheidest mit";
|
||||
const LINKE_ROLLENTEXT = "Linke Hand · du fuehrst das Team durch den Tag";
|
||||
|
||||
export function rollentextFuer(person) {
|
||||
if (person?.rolle === "modi") return MODI_ROLLENTEXT;
|
||||
if (person?.rolle === "hand") return HAND_ROLLENTEXT;
|
||||
if (person?.rolle === "linke") return LINKE_ROLLENTEXT;
|
||||
/* DIE COMMUNITY HATTE NUR EIN WORT (nachgetragen 19.09.2026).
|
||||
|
||||
Bei jeder anderen Rolle steht unter dem Titel ein Satz. Beim
|
||||
@@ -3417,6 +3475,20 @@ function umstellungen(d) {
|
||||
Transaktion, Indizes zurueck. */
|
||||
checkListeErweitern(d, "personen", "rolle", "gast",
|
||||
["spicy", "admin", "manager", "scout", "creator", "modi", "hand", "gast"], jetztStempel);
|
||||
/* DIE LINKE HAND (21.09.2026) -- UND SIE STEHT MIT ABSICHT GANZ
|
||||
UNTEN, NICHT BEI DER RECHTEN HAND.
|
||||
|
||||
`checkListeErweitern` baut die Regel NEU aus der Liste, die man
|
||||
ihm gibt. Stand mein Schritt weiter oben, nahm der Schritt fuer
|
||||
"gast" darunter die Rolle wieder heraus -- seine Liste kennt sie
|
||||
ja nicht. Die Kette ist kumulativ und deshalb von der Reihenfolge
|
||||
abhaengig; wer hier etwas einschiebt, gehoert ans ENDE.
|
||||
|
||||
Ohne diesen Schritt laesst die Datenbank die Rolle nicht zu -- und
|
||||
zwar erst beim ersten echten Anlegen, nicht beim Start. */
|
||||
checkListeErweitern(d, "personen", "rolle", "linke",
|
||||
["spicy", "admin", "manager", "scout", "creator", "modi", "hand",
|
||||
"gast", "linke"], jetztStempel);
|
||||
|
||||
/* DER BEREICH FUER DAS IDEEN-BOARD (10.09.2026, Kapitel 5.6).
|
||||
|
||||
@@ -6452,7 +6524,7 @@ export function protokollLesen(anzahl = 20) {
|
||||
* -- und das sagt bei der Community ueberall Nein. Zwei verschiedene
|
||||
* Fragen, zwei verschiedene Funktionen; wer sie in eine legt, kann
|
||||
* spaeter nicht mehr sagen, welche gerade zugeschlagen hat. */
|
||||
const HAUS_TEAM_ROLLEN = new Set(["admin", "hand", "modi", "gast"]);
|
||||
const HAUS_TEAM_ROLLEN = new Set(["admin", "hand", "linke", "modi", "gast"]);
|
||||
|
||||
function nurHaus(ids, person) {
|
||||
if (person?.haus !== "crew") return ids;
|
||||
|
||||
Reference in New Issue
Block a user