diff --git a/server/pruef-befinden.mjs b/server/pruef-befinden.mjs index e60af365..980a8b7f 100644 --- a/server/pruef-befinden.mjs +++ b/server/pruef-befinden.mjs @@ -803,28 +803,57 @@ melde("=== 8. Die Analyse im Browser ==="); await seite.goto(`http://127.0.0.1:${PORT}/workspace/befinden.html`, { waitUntil: "networkidle" }); await seite.waitForTimeout(1000); + /* EIN RESUEMEE, NICHT NEUN (umgedreht am 22.09.2026). + ================================================================ + Bis hierher verlangte diese Stelle das GEGENTEIL: eine Zeile je + Frage, zu jeder eine Einordnung. Genau das hat Filipe mehrfach + abgeschafft ("das resume unten auf jeder frage hab ich auch schon + mehrmals gesagt muss weg ich will ein ganzes gesamtresume"). + + Die Pruefung ist beim Umbau ROT geworden -- richtig so, sie hat + die Aenderung bemerkt. Und sie hat dabei etwas gerettet: Die + TikTok-Quelle war beim Umzug ins Fazit verlorengegangen, und die + hatte Filipe ausdruecklich bestellt. */ const a = await seite.evaluate(() => ({ - da: document.getElementById("analyse-block")?.hidden === false, - satz: document.getElementById("analyse-satz")?.textContent.trim() || "", - zeilen: document.querySelectorAll(".b-analyse__zeile").length, - ersteMarke: document.querySelector(".b-analyse__zeile")?.dataset.ton || "", - welt: document.querySelectorAll(".b-analyse__welt").length, - hilft: document.querySelectorAll(".b-analyse__hilft").length, - quellen: [...document.querySelectorAll(".b-analyse__quelle-hin")].map((x) => x.href), - blank: [...document.querySelectorAll(".b-analyse__quelle-hin")] + alterBlock: !!document.getElementById("analyse-block"), + alteZeilen: document.querySelectorAll(".b-analyse__zeile").length, + fazitDa: document.getElementById("fazit-block")?.hidden === false, + schrittDa: document.getElementById("fazit-schritt")?.hidden === false, + schrittTitel: document.getElementById("fazit-schritt-titel")?.textContent.trim() || "", + schrittWas: document.getElementById("fazit-schritt-was")?.textContent.trim() || "", + schrittWelt: document.getElementById("fazit-schritt-welt")?.textContent.trim() || "", + team: document.getElementById("fazit-team")?.textContent.trim() || "", + quellen: [...document.querySelectorAll(".b-fazit__quelle-hin")].map((x) => x.href), + blank: [...document.querySelectorAll(".b-fazit__quelle-hin")] .every((x) => x.rel.includes("noopener")), })); - ok(a.da, "die Analyse steht auf der Seite"); - ok(a.zeilen === anzahlFragen, - `mit allen ${anzahlFragen} Fragen (${a.zeilen})`); - /* DAS MUSTER STEHT OBEN. Alphabetisch oder in Katalogreihenfolge - müsste man es suchen -- und wer sucht, liest es beim zweiten Mal - nicht mehr. */ - ok(a.ersteMarke === "hakt", - `und das, was seit mehreren Runden hakt, steht zuoberst (${a.ersteMarke})`); - ok(a.welt === anzahlFragen, - `zu jeder der ${anzahlFragen} Zeilen die Einordnung (${a.welt})`); - ok(a.hilft === 1, `ein Rat, genau dort, wo es hakt (${a.hilft})`); + + ok(!a.alterBlock && a.alteZeilen === 0, + `unter den Fragen steht KEIN Resuemee mehr (${a.alteZeilen} Zeilen)`); + ok(a.fazitDa, "stattdessen EIN Gesamtresuemee"); + + /* DER SCHRITT: genau einer, mit Inhalt. Eine Pruefung, die nur + fragt "ist der Kasten da", waere auch bei leerem Text gruen. */ + ok(a.schrittDa, "es nennt einen naechsten Schritt"); + ok(a.schrittWas.length > 40, + `und der sagt konkret, was hilft (${a.schrittWas.length} Zeichen)`); + ok(a.schrittWelt.length > 40, + `mit dem Grund daneben, warum es dieser ist (${a.schrittWelt.length} Zeichen)`); + + /* GENAU EINER. "Mindestens einer" waere auch bei neun gruen -- also + genau bei dem Zustand, den Filipe abgeschafft hat. */ + const wieVieleSchritte = await seite.evaluate( + () => document.querySelectorAll(".b-fazit__schritt").length); + ok(wieVieleSchritte === 1, `und zwar genau einen (${wieVieleSchritte})`); + + ok(a.team.length > 30, `das Team kommt vor (${a.team.length} Zeichen)`); + /* DER TEAM-SATZ IST ABGELEITET, NICHT IMMER DERSELBE. Ein Spruch, + der bei jeder Lage gleich lautet, wird beim dritten Mal + ueberlesen. Geprueft wird das hier ueber den Server (Abschnitt + zum Resuemee), hier nur, dass er ueberhaupt zur Lage passt. */ + ok(!/gemeinsam schaffen wir/i.test(a.team), + "und ist kein Spruch, der immer passt"); + ok(a.quellen.length === 3, `${a.quellen.length} Quellen stehen darunter`); ok(a.quellen.some((x) => /tiktok/i.test(x)), "darunter eine zu TikTok — danach hatte Filipe ausdrücklich gefragt"); @@ -931,8 +960,11 @@ melde("=== 8. Die Analyse im Browser ==="); : `bei 430 px liegt kein Text auf Text (${enge.geprueft} Absätze verglichen)`); await seite.setViewportSize({ width: 1280, height: 1000 }); if (process.env.SCHIRM) { - await seite.locator("#analyse-block").screenshot( - { path: "C:/Users/qciga/Documents/Obelix/DogiHompage/blick.png" }); + /* Zielt seit dem 22.09.2026 auf das Gesamtresuemee -- den Block + darunter gibt es nicht mehr. Ohne diese Zeile brach der Lauf + mit SCHIRM=1 ab, und zwar erst ganz am Ende. */ + await seite.locator("#fazit-block").screenshot( + { path: "C:/Users/qciga/Documents/Obelix/DogiHompage/blick-fazit.png" }); } ok(konsole.length === 0, konsole.length ? "Fehler im Browser: " + konsole[0].slice(0, 90) : "keine Fehler im Browser"); diff --git a/server/workspace-befinden-resuemee.js b/server/workspace-befinden-resuemee.js index 4948582f..4f401b62 100644 --- a/server/workspace-befinden-resuemee.js +++ b/server/workspace-befinden-resuemee.js @@ -104,7 +104,7 @@ const klein = (t) => (t ? t[0].toLowerCase() + t.slice(1) : t); * @param vorher Die Antworten der VORIGEN Runde, oder null * @returns {{moeglich, kopf, traegt, thema, schluss, zahlen}} */ -export function resuemeeVon(antworten, punkte, felder, vorher = null) { +export function resuemeeVon(antworten, punkte, felder, vorher = null, einordnung = {}) { const gefragt = punkte.filter((p) => antworten?.[p.schluessel]); /* DRITTER AUSGANG. Ohne Antworten gibt es nichts zusammenzufassen -- @@ -221,9 +221,80 @@ export function resuemeeVon(antworten, punkte, felder, vorher = null) { schluss = "Nächste Runde in zwei Wochen. Bis dahin: nichts zu tun."; } + /* ---- EIN SCHRITT, NICHT NEUN (22.09.2026) ------------------------ + Filipe: "das resume unten auf jeder frage hab ich auch schon + mehrmals gesagt muss weg ich will ein ganzes gesamtresume ... + aber auch individuel so dass jeder sich selber auch verbessert + und steigert fuers team." + + Vorher stand unter JEDER Frage eine Einordnung und ein "Was + hilft" -- bei neun Fragen neun Ratschlaege auf einmal. Das ist + keine Hilfe, sondern eine Maengelliste mit Fussnoten. Wer neun + Dinge gleichzeitig angehen soll, geht keins an. + + Jetzt genau EINER: der zu der Sache, die am meisten haengt. + Kernfragen zuerst -- sie werden in jeder Runde gestellt, ihr + "hakt" wiegt also schwerer als das einer Zusatzfrage, die alle + vier Runden vorbeikommt. + + Und wenn nichts hakt, ist der Schritt trotzdem einer: dann der + zu der Sache, die noch WAECHST. "Nichts zu tun" ist fuer jemanden, + bei dem alles laeuft, der richtige Satz -- aber nur dann. */ + const schrittKandidaten = haktP.length ? haktP : waechstP; + const schrittP = [...schrittKandidaten] + .sort((a, b) => (b.kern ? 1 : 0) - (a.kern ? 1 : 0))[0] || null; + const e = schrittP ? (einordnung[schrittP.schluessel] || {}) : {}; + const schritt = schrittP && e.hilft + ? { + titel: schrittP.titel, + was: e.hilft, + /* Die Einordnung aus der Forschung steht EINMAL da, nicht + neunmal -- als Grund, warum dieser Schritt der richtige ist. + Ohne sie waere es ein Ratschlag; mit ihr ist es einer, den + jemand nachgeprueft hat. */ + welt: e.welt || null, + haengt: !!haktP.length, + } + : null; + + /* ---- WAS DAS TEAM DAVON HAT -------------------------------------- + Filipe: "mega geile super team loesungen findet aber auch + individuel". + + DER SATZ WIRD ABGELEITET, NICHT ERFUNDEN. Ein Team-Spruch, der + immer derselbe ist, wird beim dritten Mal ueberlesen -- und ein + "gemeinsam schaffen wir das" an jemanden, bei dem gerade fuenf + von neun Sachen haken, ist das Gegenteil von Hilfe. + + Vier Lagen, vier verschiedene Saetze. Und in der schwersten ist + der Team-Bezug KEINE Aufforderung, sondern eine Entlastung: Wer + viel traegt, braucht nicht zu hoeren, dass er auch noch etwas + fuers Team tun soll. */ + let team; + if (haktP.length >= n / 2 && n > 0) { + team = "Im Team ist gerade nichts von dir gefragt. Wenn du magst, sag " + + "einem Menschen, wie es steht – das ist alles, und es reicht."; + } else if (haktP.length) { + team = themaFeld && themaN > 1 + ? `Wahrscheinlich bist du damit nicht allein: „${feldName(themaFeld.schluessel)}" ` + + "hakt selten nur bei einem. Es in der Runde anzusprechen löst es oft " + + "für mehrere auf einmal." + : "Eine Sache, die bei dir hakt, hakt selten nur bei dir. Wer sie ausspricht, " + + "löst sie oft für mehr als sich selbst."; + } else if (traegtListe.length) { + team = `Was bei dir gerade trägt – ${klein(traegtListe[0].titel)} – ist genau das, ` + + "wonach jemand anderes gerade sucht. Zwei Sätze darüber in der Runde sind " + + "mehr wert als jede Anleitung."; + } else { + team = "Wenn du in der nächsten Runde etwas merkst, das anderen helfen würde: " + + "sag es. Das ist der kürzeste Weg, wie aus einzelnen Leuten ein Team wird."; + } + return { moeglich: true, kopf, + schritt, + team, traegt: traegtListe, thema: themaFeld && themaN > 0 ? { @@ -237,7 +308,14 @@ export function resuemeeVon(antworten, punkte, felder, vorher = null) { ? satz(`Wenn du nur an einer Stelle hinschaust, dann hier: „${feldName(themaFeld.schluessel)}" ` + `– da stehen ${themaN} der Haken beieinander. Das ist selten Zufall`) : satz(`Wenn du nur an einer Stelle hinschaust, dann hier: „${feldName(themaFeld.schluessel)}"`), - titel: haktP.filter((p) => p.feld === themaFeld.schluessel).map((p) => p.titel), + /* DIE TITEL NUR, WENN ES MEHRERE SIND (22.09.2026). + Bei genau einem stand er zweimal untereinander: einmal hier + und gleich darunter als "Dein naechster Schritt". Im Bild + sah das aus wie ein Fehler -- gefunden hat es kein Messwert, + sondern der Blick auf den Bildschirm. */ + titel: themaN > 1 + ? haktP.filter((p) => p.feld === themaFeld.schluessel).map((p) => p.titel) + : [], } : null, schluss, diff --git a/server/workspace-befinden.js b/server/workspace-befinden.js index bfa11654..472c1752 100644 --- a/server/workspace-befinden.js +++ b/server/workspace-befinden.js @@ -514,8 +514,14 @@ befindenRouter.get("/workspace/api/befinden", angemeldet, (req, res) => { zweite Liste dort waere die, die beim siebten Feld vergessen wird. */ felder: BEFINDEN_FELDER, + /* DIE EINORDNUNGEN WANDERN INS GESAMTRESUEMEE (22.09.2026). + Vorher standen sie unter jeder einzelnen Frage -- bei neun + Fragen neun Ratschlaege. Jetzt geht genau EINER hinein, zu + der Sache, die am meisten haengt. Sie werden durchgereicht + statt importiert: workspace-befinden-resuemee.js haengt so + von nichts ab, und der Ringschluss bleibt aus. */ resuemee: resuemeeVon(fazitAntworten, fazitPunkte, BEFINDEN_FELDER, - fazitVergleich), + fazitVergleich, EINORDNUNG), /* WORAUF SIE SICH BEZIEHT -- die Seite sagt das dazu. „Was das zusammen heisst" ueber eine Runde von vorgestern ist etwas anderes als ueber die, die man gerade ausfuellt, und wer das diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 4c64c379..065cc8f1 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`. --> - - + + - +