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`. -->
-
-
+
+
-
+