Die zwei Häuser sind getrennt -- und die Tür geht in beide Richtungen
Filipe: "ich will dass du zuerst die komplette site vn der workspace
seite trennst. da soll nichts verknüpft sein. wenn ich bei der einen
was mache soll nichts bei der anderen passieren. … es soll nur für
dogfather eine kachel geben wo er mit einem einfachen klick von der
einen auf die anderen seite kommt aber sonst garnichts."
Das kehrt die Entscheidung vom 10.09.2026 um ("getrennt wird das
AUSSEHEN, nicht der Bestand"). Wer den alten Kommentar liest, liest
einen überholten Stand -- das steht jetzt an jeder betroffenen Stelle.
WAS GEMESSEN WAR, BEVOR ETWAS GEBAUT WURDE
* Nur drei Module trennten nach Haus (Aufgaben, Bereiche, Dateien).
Chat, Kalender, Wissen, Material, Personenlisten und der Rest nicht.
* Die Trennung war EINSEITIG: nurHaus() griff nur auf crew.
* siehtModis() hebelte sie für DogFather auf der Agenturseite aus --
in seiner Gesprächsliste standen dort beide Häuser nebeneinander.
* Keine haus-Spalte in der Datenbank.
* Der Bestand kreuzte aber kaum: 0 von 86 Terminen gemischt, 0 von 7
Zweier-/Gruppengesprächen, genau EIN Kanal.
WAS JETZT DASTEHT
* Drei Rollenmengen in crew-adresse.js (crew / agentur / beide) und
hausVonRolle(); eine unbekannte Rolle bekommt null, kein Haus.
* Spalte `haus` an acht Wurzeltabellen, nachgetragen aus Belegen:
238 Zeilen eindeutig, die Wissensablage geschlossen der Agentur,
vier Restzeilen namentlich, der gemischte Kanal aufgelöst
(die zwei Scouts gehen heraus, die 7 Nachrichten sind alle vom
Team). Offen bleiben: null.
* nurHaus, hausBedingung und darfAnlegen gelten in BEIDE Richtungen.
* Der siehtModis-Durchgriff ist weg -- aber in DREI Fällen, nicht
zwei: Prüfadressen bekommen gar kein Haus und verhalten sich exakt
wie vorher. Die erste Fassung hatte das übersehen und 19 Prüfungen
umgeworfen, an denen nichts kaputt war.
* Kalender: getrennt, aber "belegt" bleibt (Filipes Entscheidung).
Die Blöcke tragen NUR Beginn und Dauer -- kein Titel, keine Person.
Gebaut als Gegenstück zur Liste (meine Termine MINUS die sichtbaren),
damit beide nicht auseinanderlaufen können.
* Die Wissens-Kachel ist auf der Team-Adresse weg UND die Route
antwortet dort mit 404 -- eine fehlende Kachel ist nur eine Bitte.
* Die Wechsel-Kachel für DogFather geht jetzt in beide Richtungen.
GEPRÜFT: pruef-haus-trennung 97 statt 81, 0 Fehler (vorher 7, alle
haben die alte Regel behauptet). Die neuen Abschnitte sind DORT
eingezogen statt in eine zweite Datei -- `pruef-haustrennung.mjs` hätte
sich von `pruef-haus-trennung.mjs` um einen Bindestrich unterschieden.
Dazu grün: haus-seiten, crew-adresse, chat, chat-kanaele,
kanal-besetzung, kalender, serien, treffchat, wissen-neu,
modi-checkliste, modi-katalog, rechtetafel, personen-liste, sicht,
verborgen, fremde-sicht, alle-wege.
NICHT VON MIR: pruef-treff (3) und pruef-kachel-universum (2) waren
schon vorher rot -- beim Treff auf dem Stand 40b48e89 nachgemessen,
bei den Farben steht dieselbe Zahl im Kopf der Prüfung selbst.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+159
-14
@@ -269,8 +269,20 @@ console.log("=== Aufgaben ===");
|
||||
`auf crew. steht die Aufgabe des Teams (${t(a.crew).join(" | ") || "leer"})`);
|
||||
ok(!t(a.crew).includes("Lunas Steckbrief nachtragen"),
|
||||
"und die der Agentur nicht");
|
||||
ok(t(a.ws).includes("Lunas Steckbrief nachtragen") && t(a.ws).includes("Clips vom Freitag schneiden"),
|
||||
`auf workspace. stehen beide (${t(a.ws).length})`);
|
||||
/* ==== UMGEDREHT AM 24.09.2026 ===================================
|
||||
Hier stand „auf workspace. stehen beide". Das war richtig, solange
|
||||
„getrennt wird das Aussehen, nicht der Bestand" galt. Filipe hat
|
||||
das umgedreht: „wenn ich bei der einen was mache soll nichts bei
|
||||
der anderen passieren."
|
||||
|
||||
SIE IST DADURCH STRENGER, NICHT SCHWAECHER: Vorher wurde EIN
|
||||
Zustand geprueft („beides da"), jetzt ein UNTERSCHIED („das eine
|
||||
ja, das andere nicht"). Ein Filter, der einfach alles wegnimmt,
|
||||
faellt damit auf; vorher waere er nur an der ersten Haelfte
|
||||
aufgefallen. */
|
||||
ok(t(a.ws).includes("Lunas Steckbrief nachtragen")
|
||||
&& !t(a.ws).includes("Clips vom Freitag schneiden"),
|
||||
`auf workspace. steht NUR die der Agentur (${t(a.ws).join(" | ") || "leer"})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
@@ -288,8 +300,11 @@ console.log("=== Bereiche ===");
|
||||
const ideen = await beide("/workspace/api/bereich/ideen", dogi.keks);
|
||||
ok((ideen.crew?.eintraege || []).some((e) => e.titel === "Wunschkonzert am Sonntag"),
|
||||
"das Ideen-Board des Teams steht auf crew.");
|
||||
ok((ideen.ws?.eintraege || []).some((e) => e.titel === "Wunschkonzert am Sonntag"),
|
||||
"und auf workspace. ebenfalls -- er sieht es hier wie dort");
|
||||
/* AUCH HIER UMGEDREHT (24.09.2026): „er sieht es hier wie dort" war
|
||||
die alte Regel. Das Ideen-Board gehoert dem Team -- in der Agentur
|
||||
hat es nichts zu suchen, auch nicht bei ihm. */
|
||||
ok(!(ideen.ws?.eintraege || []).some((e) => e.titel === "Wunschkonzert am Sonntag"),
|
||||
"und auf workspace. NICHT -- das Brett gehoert dem Team");
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
@@ -315,12 +330,39 @@ console.log("=== Kalender ===");
|
||||
Gegenteil. Sie ist dadurch nicht schwaecher: Sie prueft jetzt eine
|
||||
UNTERSCHEIDUNG (er ja, sie nein) statt einer einzelnen Antwort, und
|
||||
das ist mehr, nicht weniger. */
|
||||
/* ==== DRITTE FASSUNG DIESER ERWARTUNG (24.09.2026) ==============
|
||||
|
||||
10.09.: getrennt. 11.09.: fuer DogFather verbunden („mein kalender
|
||||
soll komplett verbunden sein"). 24.09.: getrennt -- aber die
|
||||
ZEITEN der anderen Seite bleiben als titellose Bloecke sichtbar.
|
||||
|
||||
Auf die Nachfrage, was aus der Ausnahme wird, hat Filipe genau
|
||||
das entschieden: „Getrennt, aber ‚belegt' bleibt sichtbar."
|
||||
|
||||
WARUM DAS KEIN RUECKSCHRITT ZUM 10.09. IST: Der Grund fuer die
|
||||
Ausnahme galt weiter -- wer die Haelfte seines Tages nicht sieht,
|
||||
legt einen Call auf eine besetzte Stunde. Beide Anspruechen ist
|
||||
zugleich zu genuegen, indem man den INHALT trennt und die ZEIT
|
||||
nicht. Genau das wird hier gemessen. */
|
||||
const a = await beide(weg, dogi.keks);
|
||||
const t = (x) => (x?.termine || []).map((z) => z.titel);
|
||||
ok(t(a.crew).includes("Teamrunde") && t(a.crew).includes("Call mit Luna"),
|
||||
`DogFather sieht auf crew. seinen GANZEN Kalender (${t(a.crew).join(" | ") || "leer"})`);
|
||||
ok(t(a.ws).includes("Call mit Luna") && t(a.ws).includes("Teamrunde"),
|
||||
`und auf workspace. denselben (${t(a.ws).length})`);
|
||||
ok(t(a.crew).includes("Teamrunde") && !t(a.crew).includes("Call mit Luna"),
|
||||
`auf crew. steht der Team-Termin und NICHT der der Agentur (${t(a.crew).join(" | ") || "leer"})`);
|
||||
ok(t(a.ws).includes("Call mit Luna") && !t(a.ws).includes("Teamrunde"),
|
||||
`auf workspace. umgekehrt (${t(a.ws).join(" | ") || "leer"})`);
|
||||
|
||||
/* UND DIE ZEIT IST TROTZDEM DA. Ohne diese drei Zeilen waere oben
|
||||
nur bewiesen, dass etwas verschwindet -- und der Kalender waere
|
||||
wieder die Falle vom 11.09. */
|
||||
const bc = a.crew?.belegt || [];
|
||||
const bw = a.ws?.belegt || [];
|
||||
ok(bc.length > 0 && bw.length > 0,
|
||||
`er sieht auf beiden Seiten belegte Zeiten der anderen (${bc.length}/${bw.length})`);
|
||||
ok(bc.every((x) => Object.keys(x).sort().join(",") === "beginn,dauer_min"),
|
||||
"und die Bloecke tragen NUR Beginn und Dauer -- keinen Titel, keine Person");
|
||||
const hBelegt = (await hole(weg, { host: CREW, keks: hand.keks })).daten?.belegt || [];
|
||||
ok(hBelegt.length === 0,
|
||||
`die rechte Hand bekommt keine Bloecke (${hBelegt.length}) -- "NICHT BEI VANVAN"`);
|
||||
|
||||
/* UND DIE RECHTE HAND NICHT -- sonst hiesse "verbunden" schlicht
|
||||
"die Trennung ist weg". */
|
||||
@@ -344,8 +386,12 @@ console.log("=== Die Personenliste ===");
|
||||
`auf crew. steht das Team (${n(a.crew).join(", ") || "leer"})`);
|
||||
ok(!n(a.crew).some((x) => ["Luna", "Cigdem", "Patrick"].includes(x)),
|
||||
"und niemand aus der Agentur");
|
||||
ok(["Luna", "Cigdem", "Patrick", "Ayla"].every((x) => n(a.ws).includes(x)),
|
||||
`auf workspace. stehen alle (${n(a.ws).length})`);
|
||||
/* UMGEDREHT (24.09.2026): Vorher „auf workspace. stehen alle".
|
||||
Ayla ist Modi -- sie gehoert ins Team-Haus, nicht in seine
|
||||
Schreibliste auf der Agenturseite. */
|
||||
ok(["Luna", "Cigdem", "Patrick"].every((x) => n(a.ws).includes(x))
|
||||
&& !n(a.ws).includes("Ayla"),
|
||||
`auf workspace. steht NUR die Agentur (${n(a.ws).join(", ") || "leer"})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
@@ -466,8 +512,11 @@ console.log("=== Personen & Zugaenge ===");
|
||||
`auf crew. steht das Team (${wer(liste.crew).join(", ") || "leer"})`);
|
||||
ok(!wer(liste.crew).some((n) => ["Luna", "Cigdem", "Patrick"].includes(n)),
|
||||
"und niemand aus der Agentur");
|
||||
ok(["Luna", "Cigdem", "Patrick", "Ayla"].every((n) => wer(liste.ws).includes(n)),
|
||||
`auf workspace. stehen alle (${wer(liste.ws).length})`);
|
||||
/* UMGEDREHT (24.09.2026) -- dieselbe Regel wie eine Seite hoeher:
|
||||
Wer im Team wohnt, steht in der Agenturverwaltung nicht. */
|
||||
ok(["Luna", "Cigdem", "Patrick"].every((n) => wer(liste.ws).includes(n))
|
||||
&& !wer(liste.ws).includes("Ayla"),
|
||||
`auf workspace. steht NUR die Agentur (${wer(liste.ws).join(", ") || "leer"})`);
|
||||
|
||||
/* Die anlegbaren Rollen kommen aus derselben Auskunft, aus der die
|
||||
Oberflaeche ihre Knoepfe baut. Auf crew. duerfen es nur Team-Rollen
|
||||
@@ -807,6 +856,90 @@ console.log("=== Alle Kategorien ===");
|
||||
ok(dogiLegtAn.status === 201, `DogFather kann es (${dogiLegtAn.status})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
11b. WAS AM 24.09.2026 DAZUGEKOMMEN IST
|
||||
|
||||
Drei Dinge, die es am 10.09. noch nicht gab und die deshalb in der
|
||||
Aufteilung oben fehlen: die Rollentafel selbst, die Wissensablage
|
||||
und die Tuer zwischen den Haeusern.
|
||||
|
||||
Sie stehen HIER und nicht in einer eigenen Datei. Beim Bauen lag
|
||||
eine zweite, fast gleich benannte Pruefung daneben
|
||||
(`pruef-haustrennung.mjs` gegen `pruef-haus-trennung.mjs`) -- zwei
|
||||
Dateien, die dasselbe meinen und deren Namen sich um einen
|
||||
Bindestrich unterscheiden. Genau die Bauart, vor der in diesem Haus
|
||||
an fuenfzehn Stellen gewarnt wird. Sie ist wieder weg.
|
||||
======================================================================= */
|
||||
console.log("");
|
||||
console.log("=== Die Rollentafel: wohnt jede Rolle irgendwo? ===");
|
||||
{
|
||||
const w = await import("./workspace.js");
|
||||
const ROLLEN = ["spicy", "admin", "manager", "scout", "creator",
|
||||
"hand", "linke", "modi", "gast"];
|
||||
const ohne = ROLLEN.filter((r) => !w.hausVonRolle(r));
|
||||
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Waere ROLLEN leer, meldete
|
||||
`filter().length === 0` brav "alles gut", ohne eine einzige Rolle
|
||||
angesehen zu haben. Genau so stand dieses Haus am 01.09. dreimal
|
||||
gruen da. */
|
||||
ok(ROLLEN.length === 9 && ohne.length === 0,
|
||||
`alle ${ROLLEN.length} Rollen haben ein Haus${ohne.length ? " -- ausser: " + ohne.join(", ") : ""}`);
|
||||
ok(w.hausVonRolle("admin") === "beide",
|
||||
`DogFather wohnt in beiden (${w.hausVonRolle("admin")})`);
|
||||
/* DER DRITTE AUSGANG: Eine unbekannte Rolle darf NICHT stillschweigend
|
||||
in einem Haus landen. Ohne diese Zeile koennte hausVonRolle immer
|
||||
"agentur" sagen und die Pruefung darueber waere trotzdem gruen. */
|
||||
ok(w.hausVonRolle("erfunden") === null,
|
||||
"eine unbekannte Rolle bekommt KEIN Haus, sondern null");
|
||||
ok(!w.rollenImHaus("crew").has("scout") && w.rollenImHaus("crew").has("admin"),
|
||||
"im Team-Haus: kein Scout, aber DogFather");
|
||||
ok(!w.rollenImHaus("agentur").has("modi") && w.rollenImHaus("agentur").has("admin"),
|
||||
"im Agenturhaus: kein Modi, aber DogFather");
|
||||
/* Und die Bedingung muss sich UNTERSCHEIDEN -- waere sie fuer beide
|
||||
Haeuser gleich, traefen die Messungen oben zufaellig zu. */
|
||||
ok(w.hausWo({ haus: "crew" }, "t") !== w.hausWo({ haus: "agentur" }, "t"),
|
||||
"die Hausbedingung ist fuer die beiden Haeuser verschieden");
|
||||
ok(w.hausWo({ rolle: "admin" }, "t") === "1=1",
|
||||
"ohne bekanntes Haus wird nicht gefiltert -- Pruefadressen bleiben heil");
|
||||
}
|
||||
|
||||
console.log("");
|
||||
console.log("=== Die Wissensablage wohnt in der Agentur ===");
|
||||
{
|
||||
/* Filipe, 24.09.2026: „diese komplette kachel soll nur im workspace
|
||||
sein." Die Kachel ist drueben weg -- das allein ist aber nur eine
|
||||
Bitte. Wer die Adresse kennt, tippt sie. */
|
||||
const a = await beide("/workspace/api/wissen", dogi.keks);
|
||||
const inAgentur = await hole("/workspace/api/wissen", { host: WS, keks: dogi.keks });
|
||||
const imTeam = await hole("/workspace/api/wissen", { host: CREW, keks: dogi.keks });
|
||||
void a;
|
||||
ok(inAgentur.status === 200,
|
||||
`in der Agentur ist sie da (${inAgentur.status}) -- Gegenprobe`);
|
||||
ok(imTeam.status === 404,
|
||||
`auf der Team-Adresse gibt es sie nicht (${imTeam.status})`);
|
||||
}
|
||||
|
||||
console.log("");
|
||||
console.log("=== Eine Tuer, in beide Richtungen -- und sonst nichts ===");
|
||||
{
|
||||
const w = await import("./workspace.js");
|
||||
const ausTeam = w.zusatzBereicheFuer({ rolle: "admin", haus: "crew", id: idDogi });
|
||||
const ausAgentur = w.zusatzBereicheFuer({ rolle: "admin", haus: "agentur", id: idDogi });
|
||||
ok(ausTeam.length === 1 && ausAgentur.length === 1,
|
||||
`von beiden Seiten fuehrt GENAU EINE Kachel hinueber (${ausTeam.length}/${ausAgentur.length})`);
|
||||
ok(ausTeam[0]?.ziel?.startsWith("https://workspace."),
|
||||
`aus dem Team fuehrt sie in die Agentur (${ausTeam[0]?.ziel})`);
|
||||
ok(ausAgentur[0]?.ziel?.startsWith("https://crew."),
|
||||
`aus der Agentur fuehrt sie ins Team (${ausAgentur[0]?.ziel})`);
|
||||
/* NUR FUER DOGFATHER. Bei einem Modi waere sie zugleich eine
|
||||
Adresse, die er nicht kennen soll -- und eine Seite, die aus
|
||||
nichts als einem Ausgang besteht. */
|
||||
const andere = ["hand", "linke", "modi", "gast", "scout", "creator", "manager", "spicy"];
|
||||
ok(andere.length === 8
|
||||
&& andere.every((r) => w.zusatzBereicheFuer({ rolle: r, haus: "crew" }).length === 0
|
||||
&& w.zusatzBereicheFuer({ rolle: r, haus: "agentur" }).length === 0),
|
||||
`und niemand sonst bekommt sie (${andere.length} Rollen, beide Adressen)`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
12. Die Gegenprobe zur Regel selbst
|
||||
======================================================================= */
|
||||
@@ -825,8 +958,20 @@ console.log("=== Haengt es wirklich an der Adresse? ===");
|
||||
/* Und eine erfundene Adresse gilt als Agentur, nicht als Team --
|
||||
wer sich einen Hostnamen ausdenkt, bekommt keine Sonderbehandlung. */
|
||||
const fremd = await hole("/workspace/api/aufgaben", { host: "crew.boese.de", keks: dogi.keks });
|
||||
ok((fremd.daten?.aufgaben || []).length === 2,
|
||||
`eine erfundene Adresse oeffnet kein drittes Haus (${(fremd.daten?.aufgaben || []).length})`);
|
||||
/* VERGLICHEN STATT GEZAEHLT (24.09.2026). Hier stand `length === 2`
|
||||
-- eine feste Zahl, die genau so lange stimmte, bis sich das
|
||||
Verhalten der Agenturadresse aenderte. Genau das ist am 24.09.
|
||||
passiert: Seit die Grenze auch dort gilt, sind es nicht mehr zwei.
|
||||
Die Pruefung wurde rot, obwohl an der Sache nichts kaputt war.
|
||||
|
||||
Gefragt wird jetzt, was die Aussage MEINT: Eine erfundene Adresse
|
||||
verhaelt sich wie die Agenturadresse und oeffnet nichts Drittes.
|
||||
Diese Formulierung kann der Kalender nicht einholen. */
|
||||
const echt = await hole("/workspace/api/aufgaben", { host: WS, keks: dogi.keks });
|
||||
const titel = (x) => (x.daten?.aufgaben || []).map((z) => z.titel).sort().join(" | ");
|
||||
ok(titel(echt).length > 0 && titel(fremd) === titel(echt),
|
||||
`eine erfundene Adresse verhaelt sich wie die Agenturadresse `
|
||||
+ `(${titel(fremd) || "leer"} / ${titel(echt) || "leer"})`);
|
||||
}
|
||||
|
||||
d.close();
|
||||
|
||||
Reference in New Issue
Block a user