diff --git a/server/pruef-haus-trennung.mjs b/server/pruef-haus-trennung.mjs index dec18a2e..14bffd05 100644 --- a/server/pruef-haus-trennung.mjs +++ b/server/pruef-haus-trennung.mjs @@ -192,8 +192,64 @@ console.log("=== Was DogFather zu sehen bekommt ==="); `auf workspace. bleibt die Kachelliste die der Datei (${a.ws?.bereiche === null ? "null" : "eigene Liste"})`); ok(Array.isArray(a.crew?.bereiche) && a.crew.bereiche.length > 0, `auf crew. schickt der Server eine eigene (${a.crew?.bereiche?.length})`); - ok(aufWs.includes("Rückmeldung"), - "und die Team-Kachel steht dort ebenfalls -- er sieht seine Daten auch dort"); + /* HIER STAND DAS GEGENTEIL -- UND DAS IST EINE ENTSCHEIDUNG VON + FILIPE, KEINE KORREKTUR (21.09.2026). + + Bis heute verlangte diese Zeile, dass die Team-Kachel + "Rueckmeldung" AUCH auf der Agenturadresse steht: "er sieht seine + Daten auch dort". Gemessen am 21.09. waren es siebzehn solcher + Kacheln -- Dein Team, Ideen-Board, Rueckmeldung, Wer sieht was, + Entwicklung, Werdegang, Talente und der ganze Treff samt + Moderation. + + Filipe: "ich will dass du im workspace alles von team dogi weg + nimmst ... die kacheln von team dogi soll ich nur bei team dogi + sehen und die von workspace nur bei workspace bitte. ich will + keine mischung mehr von kacheln. wie gesagt nur die der kalender + soll verbunden sein von dogfather sonst nichts." + + GEPRUEFT WIRD JETZT DIE TRENNUNG, und zwar in beide Richtungen: + Kein Brett von Team Dogi auf der Agenturadresse -- und trotzdem + kein Sackgassen-Ende, denn EINE Tuer bleibt. Eine Tuer ist keine + Mischung: Sie zeigt kein Brett, sie geht hinueber. + + WARUM DIE LISTE AUS DER ANTWORT VON crew. KOMMT und nicht hier + steht: Was "Team Dogi" ist, entscheidet der Server. Schriebe ich + die Namen hier ab, waere die Pruefung beim naechsten neuen Brett + blind -- genau die Sorte Abschrift, die heute schon dreimal + gealtert ist. */ + const teamNamen = new Set(aufCrew.filter((n) => n !== "Kalender")); + const durchgerutscht = aufWs.filter((n) => teamNamen.has(n)); + ok(durchgerutscht.length === 0, + durchgerutscht.length + ? `AUF workspace. STEHEN NOCH KACHELN VON TEAM DOGI: ${durchgerutscht.join(", ")}` + : `auf workspace. steht kein einziges Brett von Team Dogi ` + + `(geprueft gegen ${teamNamen.size} Kacheln von crew.)`); + + /* DIE ZAHL GEHOERT IN DIE BEDINGUNG. Waere `teamNamen` leer -- weil + crew. nichts liefert oder die Antwort sich aendert --, waere + "nichts durchgerutscht" wahr und wertlos. */ + ok(teamNamen.size >= 10, + `crew. liefert ${teamNamen.size} eigene Kacheln, gegen die geprueft wird`); + + /* UND DER WEG HINUEBER BLEIBT. Ohne ihn waere von der Agenturseite + aus kein Team Dogi mehr erreichbar -- man muesste die Adresse + tippen. Das ist die Sackgasse, die dieses Haus nicht baut. */ + const tuer = (a.ws?.bereiche_zusatz || []).filter((k) => k.aussen); + ok(tuer.length === 1, + tuer.length === 1 + ? `eine Tuer fuehrt hinueber ("${tuer[0].name}")` + : `ERWARTET WIRD GENAU EINE TUER, gefunden: ${tuer.length}`); + ok(tuer[0]?.ziel?.startsWith("https://"), + `und sie zeigt auf die andere Adresse (${tuer[0]?.ziel || "KEINE"})`); + + /* DER KALENDER IST DIE EINE AUSNAHME, die Filipe ausdruecklich + wollte: "nur was ich im kalender eintrage soll ich im workspace + sehen und im team dogi". Er steht deshalb auf BEIDEN Seiten -- + und die Termine selbst werden nirgends nach Haus gefiltert, + nachgemessen in workspace-kalender.js. */ + ok(aufCrew.includes("Kalender"), + "der Kalender steht auf crew."); /* Und keine doppelt: bereicheFuer liefert auf crew. schon die Team-Liste, zusatzBereicheFuer muss dort schweigen. */ diff --git a/server/pruef-rueckmeldung.mjs b/server/pruef-rueckmeldung.mjs index 28e92cfd..976655d7 100644 --- a/server/pruef-rueckmeldung.mjs +++ b/server/pruef-rueckmeldung.mjs @@ -118,6 +118,34 @@ const rufe = (keks, weg, koerper, methode = "GET") => }); const holen = async (keks, weg) => (await rufe(keks, weg)).json(); +/* MIT EINER BESTIMMTEN ADRESSE FRAGEN -- UND WARUM NICHT MIT `fetch` + (21.09.2026). + + Welches Haus jemand sieht, entscheidet der Host der EINZELNEN + Anfrage. Eine Anmeldung ueber die Crew-Wand genuegt nicht, wenn die + naechste Abfrage an 127.0.0.1 geht. + + `fetch` kann das nicht: `Host` ist ein verbotener Kopfzeilenname und + wird STILLSCHWEIGEND verworfen -- kein Fehler, keine Warnung, die + Anfrage geht einfach an die falsche Adresse. Genau deshalb benutzt + auch `anmelden()` weiter unten schon `http.request` statt `fetch`. + Eine halbe Stunde Suche waere das gewesen, haette die Pruefung nicht + Kachel fuer Kachel gemeldet, was sie findet. */ +const holenVon = (keks, weg, wand) => new Promise((fertig, schief) => { + const a = httpAnfrage({ + host: "127.0.0.1", port: PORT, path: weg, method: "GET", + headers: { Cookie: keks, Host: wand }, + }, (antwort) => { + let text = ""; + antwort.on("data", (s2) => { text += s2; }); + antwort.on("end", () => { + try { fertig(JSON.parse(text || "{}")); } catch { fertig({}); } + }); + }); + a.on("error", schief); + a.end(); +}); + const dogi = await anmelden("admin", "CODE-DOGI-0001"); const hand = await anmelden("hand", "CODE-HAND-0001"); const ayla = await anmelden("modi", "CODE-TEAM-0001"); @@ -283,8 +311,23 @@ console.log("=== Kein Versteck in anderen Bereichen ==="); console.log(""); console.log("=== Die Kachel ==="); { + /* GEFRAGT WIRD IM EIGENEN HAUS (21.09.2026). + + Bis heute fragte dieser Abschnitt ueber 127.0.0.1 -- also ueber + eine Pruefadresse, auf der die Agentursicht gilt. Solange + DogFather dort auch die Kacheln von Team Dogi bekam, fiel das + nicht auf. + + Seit dem 21.09. bekommt er sie dort nicht mehr: Filipe wollte + "keine mischung mehr von kacheln", Team Dogi steht nur noch auf + seiner eigenen Adresse. Die Pruefung war damit rot, ohne dass die + Kachel fehlt -- sie hat nur am falschen Ort gesucht. + + Gefragt wird deshalb mit dem Host der Crew-Wand, also genau dort, + wo diese Kachel zuhause ist. */ + const CREW_WAND = "crew.dogfather-universe.com"; const kacheln = async (keks) => { - const i = await holen(keks, "/workspace/api/ich"); + const i = await holenVon(keks, "/workspace/api/ich", CREW_WAND); return [...(i.bereiche || []), ...(i.bereiche_zusatz || [])]; }; for (const [wer, keks] of [["DogFather", dogi.keks], ["die rechte Hand", hand.keks], diff --git a/server/pruef-start-ansicht.mjs b/server/pruef-start-ansicht.mjs index 7f9fe27a..8e7f1a6c 100644 --- a/server/pruef-start-ansicht.mjs +++ b/server/pruef-start-ansicht.mjs @@ -292,10 +292,57 @@ for (const [breite, wie] of [[1440, "Computer"], [390, "Handy"]]) { Sortierregel in start.js schiebt ausdruecklich NUR die drei hinteren ans Ende. Ein erster Versuch schrieb auch die vorderen fest und hat diese Prueflinie sofort rot gemacht -- zu Recht. */ - const ERWARTETE_GRUPPEN = ["Rund um das Team", "Täglich", "Rund um den Creator", - "Team & System", "Team Dogi", "Entwicklung & Nachwuchs", "Moderation", "Community"]; - ok(JSON.stringify(r.gruppen.map((g) => g.name)) === JSON.stringify(ERWARTETE_GRUPPEN), - `${ERWARTETE_GRUPPEN.length} Gruppen in dieser Reihenfolge (${r.gruppen.map((g) => g.name).join(" · ")})`); + /* DIE REGEL STATT DER AUFZAEHLUNG (21.09.2026). + + Hier standen acht Gruppennamen in fester Reihenfolge. Am + 21.09.2026 hat Filipe die Kacheln getrennt -- "ich will keine + mischung mehr von kacheln" --, und auf der Agenturadresse stehen + seitdem fuenf statt acht. Die Zeile war rot, obwohl genau das + Gewuenschte passiert ist. + + WAS SIE WIRKLICH SCHUETZEN SOLLTE, steht im Kommentar darueber: + "Die Community steht ganz unten, denn dort stehen Namen und + Saetze von Zuschauern." Das ist eine Aussage ueber die + REIHENFOLGE, nicht ueber den Bestand -- und sie bleibt richtig, + egal wie viele Gruppen es gibt. + + GEPRUEFT WIRD SIE DESHALB BEDINGT: Ist die Community da, steht + sie zuletzt. Ist die Moderation da, steht sie direkt davor. Auf + einer Adresse, auf der es beide nicht gibt, misst die Zeile + nichts -- und sagt das auch, statt gruen zu tun. */ + const namen = r.gruppen.map((g) => g.name); + ok(namen.length >= 3, `${namen.length} Gruppen (${namen.join(" · ")})`); + + const stelle = (n) => namen.indexOf(n); + const community = stelle("Community"); + const moderation = stelle("Moderation"); + + if (community === -1 && moderation === -1) { + /* DRITTER AUSGANG: Auf dieser Adresse gibt es beide nicht. Das ist + kein Befund -- aber auch kein bestandener Test. */ + console.log(" -- auf dieser Adresse gibt es weder Community noch Moderation"); + } else { + ok(community === -1 || community === namen.length - 1, + community === -1 + ? "keine Community-Gruppe auf dieser Adresse" + : `die Community steht ganz unten (Platz ${community + 1} von ${namen.length})`); + ok(moderation === -1 || community === -1 || moderation === community - 1, + moderation === -1 + ? "keine Moderations-Gruppe auf dieser Adresse" + : `die Moderation direkt davor (Platz ${moderation + 1})`); + } + + /* UND DIE ARBEIT STEHT VORN. Das ist die andere Haelfte derselben + Aussage: Wer den Arbeitsplatz oeffnet, soll nicht an fremden + Namen vorbeiscrollen, um an seine Aufgaben zu kommen. */ + const arbeit = namen.findIndex((n) => n === "Täglich"); + ok(arbeit === -1 || community === -1 || arbeit < community, + arbeit === -1 + ? "keine Gruppe „Täglich“ auf dieser Adresse" + : community === -1 + ? `die tägliche Arbeit steht auf Platz ${arbeit + 1}; eine Community-Gruppe ` + + "gibt es hier nicht, also ist nichts zu vergleichen" + : `die tägliche Arbeit steht vor der Community (${arbeit + 1} vor ${community + 1})`); /* WIE VIELE KACHELN? Nicht abgeschrieben, sondern aus bereiche.js gezaehlt (06.09.2026). diff --git a/server/pruef-treff.mjs b/server/pruef-treff.mjs index 172c2f4f..09d292d1 100644 --- a/server/pruef-treff.mjs +++ b/server/pruef-treff.mjs @@ -420,8 +420,28 @@ let namen = []; ok(modiAlles.includes(MOD) && !namen.includes(MOD), `und genau eine mehr, die die Community NICHT hat: ${MOD}`); - const b = JSON.parse((await roh("/workspace/api/ich", HAUS, { cookie: kDogi })).text); - const beiDogi = (b.bereiche_zusatz || []).filter((k) => k.gruppe === "Community").map((k) => k.name); + /* AUF DER TEAM-ADRESSE GEFRAGT, NICHT AUF DER AGENTUR- (21.09.2026). + + Hier stand `HAUS`, also workspace. -- und die Zeile war richtig, + solange DogFather dort auch die Bretter des Treffs bekam. + + Seit dem 21.09. bekommt er sie dort nicht mehr. Filipe: "ich will + dass du im workspace alles von team dogi weg nimmst ... ich will + keine mischung mehr von kacheln." Der Treff steht nur noch auf + seiner eigenen Adresse; von der Agenturseite fuehrt genau EINE + Tuer hinueber. + + Die Aussage bleibt dieselbe -- "DogFather sieht dieselben Bretter + wie die Community" --, sie wird nur dort gemessen, wo diese + Bretter zuhause sind. Auf der Agenturadresse waere sie ab jetzt + eine Frage nach etwas, das dort nicht sein soll. */ + const b = JSON.parse((await roh("/workspace/api/ich", CREW, { cookie: kDogi })).text); + /* AUF crew. STEHEN SIE IN `bereiche`, NICHT IN `bereiche_zusatz`: + Dort ist der Treff sein Zuhause und keine Zugabe. Gesucht wird + deshalb in beiden Listen -- so misst die Zeile dasselbe, egal von + welcher Adresse sie kommt. */ + const beiDogi = [...(b.bereiche || []), ...(b.bereiche_zusatz || [])] + .filter((k) => k.gruppe === "Community").map((k) => k.name); /* DogFather sieht den Meldeweg sehr wohl -- er beantwortet ihn. */ /* Auch hier: MOD steht in der Gruppe "Moderation", nicht in "Community". `beiDogi` ist nach Gruppe gefiltert und kann ihn diff --git a/server/workspace.js b/server/workspace.js index 6c2dd2b8..42ebdf3a 100644 --- a/server/workspace.js +++ b/server/workspace.js @@ -34,7 +34,7 @@ import { darfSeite, OHNE_ANMELDUNG, seitenFuer } from "./rechte.js"; import { treffTabellen, treffSperreLesen, MINDESTALTER } from "./treff-tabellen.js"; import { hilfeTabellen } from "./hilfe-tabellen.js"; import { sitzungPasstZurAdresse, istOhneModiAdresse, istCrewAdresse, istPruefAdresse, AUSSEN_ROLLEN, - TEAM_DOGI_ROLLEN } from "./crew-adresse.js"; + TEAM_DOGI_ROLLEN, CREW_ADRESSE } from "./crew-adresse.js"; /* Weitergereicht, damit die Fachmodule sie wie alles andere aus workspace.js beziehen und nicht wissen muessen, wo sie wohnt. */ export { TEAM_DOGI_ROLLEN }; @@ -1439,6 +1439,15 @@ export function darfTelefonieren(person) { function nurOffeneKacheln(liste, person) { if (!Array.isArray(liste) || !person) return liste; return liste.filter((k) => { + /* EINE KACHEL, DIE HINAUSFUEHRT, HAT HIER KEINE SEITE (21.09.2026). + + Unten wird aus dem Ziel ein Pfad gebaut ("/workspace/" + ziel) + und die Rechtetafel gefragt. Bei einer vollstaendigen Adresse -- + der Tuer zu Team Dogi -- kaeme dabei + "/workspace/https://crew..." heraus, das steht in keiner Tafel, + und die Kachel waere lautlos verschwunden. Lautlos ist das + Schlimme daran: Man sucht den Fehler dann bei der Rolle. */ + if (k?.aussen) return true; const ziel = String(k?.ziel || ""); if (!ziel) return true; const pfad = "/workspace/" + ziel.split("?")[0]; @@ -2005,71 +2014,93 @@ const TEAM_GRUPPE = { gruppeNach: "Team & System", }; -const ZUSATZ_BEREICHE = { - admin: [ - { ...TEAM_GRUPPE, ...EINGANG_KACHEL, gruppe: TEAM_GRUPPE.gruppe, - gruppeUnter: TEAM_GRUPPE.gruppeUnter }, - { - ...TEAM_GRUPPE, - name: "Ideen-Board", unter: "Gesammelt und nach Dringlichkeit sortiert", - zeichen: "content", ton: 23, ziel: "bereich.html?b=ideen", szene: "portal", - }, - /* DIESELBE Kachel wie im Team, nur in seiner Gruppe. Name, Ton und - Ziel sind Wort fuer Wort dieselben -- wer sie hier anders nennt, - hat zwei Namen fuer eine Sache, und das Team liest den einen, - DogFather den anderen. */ - { - ...TEAM_GRUPPE, - name: "Rückmeldung", unter: "Was gut läuft, was hakt – in beide Richtungen", - zeichen: "reports", ton: 25, ziel: "bereich.html?b=rueckmeldung", szene: "lounge", - }, - /* Eine eigene Gruppe, direkt hinter Team Dogi: Was ueber Menschen - aufgeschrieben wird, steht nicht zwischen den taeglichen - Werkzeugen. */ - /* WER SIEHT WAS (11.09.2026). +/* ===================================================================== + KEINE MISCHUNG MEHR (21.09.2026) - Filipe: "egal welche Rolle oder Person hinzugefuegt wird, soll - immer nur das sehen, was ich erlaube." + Filipe: "ich will dass du im workspace alles von team dogi weg + nimmst. nur was ich im kalender eintrage soll ich im workspace sehen + und im team dogi. aber die kacheln von team dogi soll ich nur bei + team dogi sehen und die von workspace nur bei workspace bitte. ich + will keine mischung mehr von kacheln. wie gesagt nur die der kalender + soll verbunden sein von dogfather sonst nichts." - Dazu gehoert, dass er es nachsehen kann. Die Seite rechnet die - Uebersicht aus derselben Tafel, aus der die Schranke ihre - Entscheidung holt (rechte.js) -- eine von Hand gepflegte - Uebersicht waere eine zweite Wahrheit, und ausgerechnet die, der - man glaubt. + --------------------------------------------------------------------- + WAS HIER BIS HEUTE STAND - IN "Team & System" UND NICHT BEI DEN PERSONEN: Es geht nicht um - Menschen, sondern um das Haus. */ - { - ...TEAM_GRUPPE, ...RECHTE_KACHEL, - gruppe: TEAM_GRUPPE.gruppe, gruppeUnter: TEAM_GRUPPE.gruppeUnter, - }, - { ...ENTWICKLUNG_KACHEL, gruppeNach: TEAM_GRUPPE.gruppe }, - { ...WERDEGANG_KACHEL, gruppeNach: TEAM_GRUPPE.gruppe }, - { ...TALENTE_KACHEL, gruppeNach: TEAM_GRUPPE.gruppe }, - /* DER TREFF -- GANZ UNTEN, UND ZWAR ABSICHTLICH. + Eine Liste ZUSATZ_BEREICHE mit siebzehn Kacheln, die auf der + AGENTURADRESSE an DogFathers Seite gehaengt wurden: Dein Team, + Ideen-Board, Rueckmeldung, Wer sieht was, Entwicklung, Werdegang, + Talente -- und der ganze Treff samt Moderation. Nachgemessen am + 21.09.2026 bekam er dort 0 eigene Kacheln und 17 fremde; auf der + Team-Adresse 30, in sechs Gruppen, aus beiden Haeusern. - Filipe zu den beiden Gruppen darueber: "das sind private - informationen von meiner community." Dasselbe gilt hier, nur - noch deutlicher: Im Treff stehen Namen und Saetze von Leuten, - die nichts mit der Agentur zu tun haben. + Der Gedanke dahinter war gut gemeint: Er soll ueberall an alles + herankommen. Die Wirkung war eine Seite, auf der zwei Betriebe + uebereinanderliegen -- und zwar genau der Zustand, den dieselbe + Datei am 10.09. fuer die andere Richtung schon als Fehler erkannt + hatte ("Fuenfundzwanzig Kacheln, von denen zwei Drittel Creator, + Scouts und Agentur betreffen, waeren dort Fenster in ein Haus, in + dem er gerade nicht ist"). - Ohne `gruppeNach` haengt eine Gruppe hinten an -- genau richtig. - Wer sich den Bildschirm teilt oder jemandem ueber die Schulter - schauen laesst, hat sie dann nicht als Erstes im Blick. */ - ...TREFF_BEREICHE, - TREFF_MODERATION_KACHEL, - ], -}; + --------------------------------------------------------------------- + DIE EINE AUSNAHME IST DER KALENDER -- UND SIE BRAUCHT NICHTS -/* NICHT AUF DER TEAM-ADRESSE (10.09.2026). Dort liefert bereicheFuer() - ohnehin schon die Kacheln des Teams -- Eingang, Ideen-Board und - Rueckmeldung stuenden sonst zweimal auf der Seite, einmal in - "Taeglich" und einmal in "Team Dogi". Zwei gleiche Kacheln sind - schlimmer als eine fehlende: Man klickt die falsche und sucht den - Unterschied. */ + Nachgemessen: Die Terminabfragen in workspace-kalender.js filtern + NICHT nach Haus. Was er eintraegt, steht ohnehin auf beiden + Adressen. Die Verbindung, die er will, existiert also bereits; sie + musste nicht gebaut, sondern nur nicht zerschnitten werden. + + --------------------------------------------------------------------- + EINE TUER IST KEINE MISCHUNG + + Ohne Ersatz waere von der Agenturadresse aus kein Weg mehr zu Team + Dogi sichtbar -- er muesste die Adresse tippen. Das ist die Sorte + Sackgasse, die dieses Haus nicht baut. Statt siebzehn Brettern steht + dort jetzt EINE Kachel, die hinuebergeht. + + SIE VERRAET NICHTS: Sie kommt vom Server und nur fuer die, die zu + Team Dogi gehoeren. In keiner ausgelieferten Datei steht sie, und + ein Manager bekommt sie nie zu sehen -- genau wie bei den Kacheln, + die sie ersetzt. + ===================================================================== */ export function zusatzBereicheFuer(person) { + /* Auf der Team-Adresse liefert bereicheFuer() ohnehin die Kacheln des + Teams. Eine Tuer zu dem Haus, in dem man schon steht, waere ein + Knopf, der nichts tut. */ if (person?.haus === "crew") return []; - return ZUSATZ_BEREICHE[person?.rolle] || []; + + /* NUR DOGFATHER UND VANVAN -- also `admin`. + + Der erste Entwurf gab die Tuer auch an TEAM_DOGI_ROLLEN (die + rechte Hand und die Moderation). Das war falsch, und pruef-modi + -checkliste hat es sofort gemeldet: "Modi bekommt 1 + Zusatzkachel(n), erwartet keine". + + WARUM ES FALSCH IST: Wer NUR zu Team Dogi gehoert, hat auf der + Agenturadresse gar nichts zu suchen -- die Tuer waere dort seine + einzige Kachel, also eine Seite, die aus nichts als einem Ausgang + besteht. Und sie wuerde eine Adresse nennen, die auf dieser Seite + niemand nennen soll. + + `admin` ist der einzige Fall, der wirklich zwei Haeuser hat. */ + if (person?.rolle !== "admin") return []; + + return [{ + gruppe: "Team Dogi", + gruppeUnter: "Das andere Haus \u2014 eigene Seite, eigene Daten", + name: "Zu Team Dogi", + unter: "Der Treff, das Team und die Moderation \u2014 auf ihrer eigenen Adresse", + zeichen: "hinaus", + ton: 40, + szene: "portal", + ziel: CREW_ADRESSE + "/workspace/start.html", + /* AUSSEN heisst: Diese Kachel fuehrt aus dem Haus hinaus. Ohne das + Merkmal wuerde nurOffeneKacheln() sie wegfiltern -- es baut aus + dem Ziel einen Pfad ("/workspace/" + ziel) und fragt die + Rechtetafel. Bei einer vollstaendigen Adresse kommt dabei + Unsinn heraus, und die Kachel verschwaende lautlos. */ + aussen: true, + }]; } /* scrypt-Parameter. N=2^15 braucht auf diesem Server rund 150 ms — spürbar diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 54a2b0ca..9223dcd2 100644 --- a/workspace/anruf-probe.html +++ b/workspace/anruf-probe.html @@ -16,15 +16,15 @@ verdeckt. Gefunden hat es pruef-struktur. Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> - - + + - +