Rundgang: drei Schritte fuer die Community, fuenf fuers Team

Bauplan Kapitel 10 verlangt "Community drei Schritte, Team-Rollen
fuenf Schritte (zusaetzlich 'Deine Aufgaben' und die Gruppen ...)".
Gemessen hatte die Community bisher FUENF -- sie bekam auch die beiden
Arbeitslisten gezeigt, "Was ist dran" und "Deine Aufgaben". Auf ihrer
Zentrale stehen beide Kaesten zwar, aber leer; eine Station, die vor
einem leeren Kasten erklaert, was dort sonst steht, ist schlechter als
keine.

WO DIE ENTSCHEIDUNG LIEGT, UND WARUM NICHT IN rundgang.js:
Der Server schickt mit der Einweisung jetzt `team: true/false`
(abgeleitet aus AUSSEN_ROLLEN, nicht aus einer zweiten Liste von
Rollennamen). `rundgang.js` siebt damit und kennt weiterhin keinen
einzigen Rollennamen. Haette ich die Rollen dort hineingeschrieben,
waere jede spaeter dazukommende Rolle stillschweigend eine Teamrolle --
und niemand kaeme auf die Idee, in einer Datei ueber Begruessungen
nach Rechten zu suchen.

ZWEI SIEBE, UND BEIDE SIND NOETIG: `nurTeam` nimmt der Community die
Arbeitslisten, `querySelector` nimmt jedem das, was auf SEINER
Zentrale gar nicht steht. Ohne das zweite bliebe der Rundgang vor
einem Kasten stehen, den es nicht gibt.

Dazu zwei Kleinigkeiten, beide beim Nachmessen aufgefallen:
  * Die Begruessung sagte "In fuenf Minuten"; im Bauplan steht "In
    zwei Minuten". Fuenf Minuten sind eine Ankuendigung, die abschreckt
    -- und bei drei Schritten auch nicht wahr.
  * Ohne Namen stand dort "Willkommen im Creator Workspace". Dieselbe
    Datei laeuft auf beiden Adressen; bei Team Dogi war das das
    falsche Haus. Jetzt nur "Willkommen!" -- kein Haus zu nennen ist
    besser als das falsche.

GEPRUEFT (pruef-anleitung 137 -> 148):
Die Zaehlung wird nicht nachgebildet, sondern AUSGEFUEHRT: Die
Stationsliste und der Siebausdruck werden aus der echten Datei geholt
und laufen zweimal, mit team=false und team=true. Ein Muster ("steht
da istTeam?") waere gruen, sobald das Wort in einem Kommentar steht --
genau der Fall, der am 04.10. bei pruef-anruf-klingelt aufgefallen ist.
Gegenprobe gefahren: Sieb entfernt -> drei FEHL, Anzahl bleibt 148
(kein stilles Ueberspringen). Dazu eine Zeile, die festhaelt, dass in
rundgang.js kein Rollenname steht, auf dem Code ohne Kommentare.

Im Browser nachgemessen (mess-anleitung-crew, echte Anmeldung, 390 px,
HTTPS-Vorbau wegen HSTS): Community 3 Stationen, Rechte Hand 5, beide
mit der neuen Begruessung.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-06 16:52:51 +02:00
co-authored by Claude Opus 5
parent 8aaadbd403
commit f09a0c3456
50 changed files with 852 additions and 694 deletions
+79
View File
@@ -890,6 +890,85 @@ ok(eDogi.code === 200 && eDogi.j?.zeigen === false,
d5.close();
}
/* =====================================================================
DREI SCHRITTE FUER DIE COMMUNITY, FUENF FUERS TEAM
---------------------------------------------------------------------
Bauplan Kapitel 10: "Community drei Schritte ... Team-Rollen fuenf
Schritte (zusaetzlich 'Deine Aufgaben' und die Gruppen ...)".
Gemessen wird das in ZWEI Haelften, weil die Entscheidung an zwei
Stellen liegt:
1. Der Server sagt Ja/Nein ("team"). Das ist die Stelle, an der
die Rolle vorkommt -- `rundgang.js` kennt absichtlich keinen
einzigen Rollennamen, sonst muesste jede neue Rolle dort
nachgetragen werden und waere sonst stillschweigend Team.
2. Der Browser siebt damit die Stationen.
Die zweite Haelfte wird hier NICHT nachgebildet, sondern
AUSGEFUEHRT: Stationsliste und Siebausdruck werden aus der echten
Datei geholt und laufen zweimal -- einmal mit team=true, einmal mit
team=false. Ein Muster ("steht da istTeam?") waere gruen, sobald das
Wort irgendwo in einem Kommentar steht; der Ausdruck selbst kann
nicht luegen. Und der zweite Lauf ist gleich die Gegenprobe: Faellt
das Sieb weg, kommen beide Male fuenf heraus, und beide Zeilen
schlagen an. */
melde("\n=== Rundgang: drei Schritte / fuenf Schritte ===");
{
const erwartet = { gast: false, modi: true, linke: true, hand: true };
for (const [rolle, soll] of Object.entries(erwartet)) {
const e = await einweisung(rolle, CREW_HOST);
ok(e.j?.team === soll,
`${rolle}: Server meldet team=${soll} (bekommen ${e.j?.team})`);
}
/* Das Agenturhaus arbeitet -- dort ist jede Rolle eine Teamrolle.
Diese Zeile ist die Gegenrichtung zum Gast: Sie beweist, dass das
Feld nicht einfach immer dasselbe antwortet. */
const eCre = await einweisung("creator");
ok(eCre.j?.team === true, `creator: Server meldet team=true (${eCre.j?.team})`);
const quelle = readFileSync(
new URL("../workspace/assets/js/rundgang.js", import.meta.url), "utf8");
/* Die Stationsliste aus der echten Datei, als Ausdruck ausgefuehrt. */
const anfang = quelle.indexOf("const STATIONEN = [");
const ende = quelle.indexOf("\n ];", anfang);
const liste = anfang >= 0 && ende > anfang
? vm.runInNewContext(quelle.slice(anfang + "const STATIONEN = ".length, ende + 4))
: null;
ok(Array.isArray(liste) && liste.length === 5,
`fuenf Stationen in rundgang.js (${liste?.length})`);
ok(Array.isArray(liste) && liste.filter((s) => s.nurTeam).length === 2,
`davon zwei nur fuers Team (${liste?.filter((s) => s.nurTeam).length})`);
/* Der Siebausdruck, ebenfalls aus der echten Datei. Faellt er weg,
ist das KEIN Ueberspringen, sondern ein Fehlschlag: Die Aussage
"die Community bekommt drei" waere dann unbewiesen, und genau das
ist der Zustand, den diese Pruefung verhindern soll. */
const m = quelle.match(/\.filter\(\(s\) => \((s\.nurTeam[^\n]*?)\)\)/);
ok(!!m, `der Siebausdruck steht in rundgang.js${m ? "" : " — NICHT gefunden"}`);
if (m && Array.isArray(liste)) {
const sieb = (istTeam) =>
liste.filter(vm.runInNewContext(`(s) => (${m[1]})`, { istTeam })).length;
ok(sieb(false) === 3, `Community: drei Stationen (${sieb(false)})`);
ok(sieb(true) === 5, `Teamrolle: fuenf Stationen (${sieb(true)})`);
} else {
ok(false, "Community/Team-Zaehlung nicht durchfuehrbar — Siebausdruck fehlt");
ok(false, "Community/Team-Zaehlung nicht durchfuehrbar — Siebausdruck fehlt");
}
/* KEIN ROLLENNAME IN rundgang.js. Der Grund steht im Kopf der
Datei; diese Zeile haelt ihn fest, damit die naechste Rolle nicht
per Hand nachgetragen werden muss. */
const nurCode = quelle
.replace(/\/\*[\s\S]*?\*\//g, " ")
.replace(/(^|[^:])\/\/[^\n]*/g, "$1 ");
const gefunden = ["'gast'", '"gast"', "'hand'", "'modi'", "'linke'", "'creator'"]
.filter((w) => nurCode.includes(w));
ok(gefunden.length === 0,
`kein Rollenname im Code von rundgang.js${gefunden.length ? " — " + gefunden.join(", ") : ""}`);
}
/* ---------- Abschluss ------------------------------------------------ */
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
console.log(`\n${fehler ? "FEHLER: " + fehler : "Alles in Ordnung"} — ${geprueft} Prüfungen`);