screen2: EIN Resuemee statt neun -- mit Schritt und Team-Bezug

Filipe: "ich will dass das viel schoener aussieht und nicht so ein
scheiss durcheinander, man wird ja bekloppt. das resume unten auf
jeder frage hab ich auch schon mehrmals gesagt muss weg ich will ein
ganzes gesamtresume was die leute animiert und pusht immer und mega
geile super team loesungen findet aber auch individuel so dass jeder
sich selber auch verbessert und steigert fuers team."

WAS WEG IST
Der Block "Was dein Verlauf sagt" -- eine Zeile JE FRAGE, jede mit
Titel, Marke, Einordnung aus der Forschung und einem "Was hilft". Bei
neun Fragen neun Kaesten untereinander. Genau das meint "man wird ja
bekloppt": Wenn alles gleich wichtig aussieht, ist nichts wichtig,
und man liest keinen davon.

WAS AN SEINE STELLE TRITT -- UND NICHTS VERLIERT
Die Erkenntnisse sind nicht weg, sie sind zusammengefasst:

  DEIN NAECHSTER SCHRITT. Genau EINER, zu der Sache, die am meisten
  haengt. Kernfragen zuerst -- sie werden in jeder Runde gestellt, ihr
  "hakt" wiegt schwerer als das einer Zusatzfrage, die alle vier
  Runden vorbeikommt. Haengt nichts, nimmt er die Sache, die noch
  WAECHST: "nichts zu tun" ist nur fuer den richtig, bei dem alles
  laeuft. Die Einordnung aus der Forschung steht daneben -- einmal
  statt neunmal, als Grund, warum es dieser Schritt ist.

  WAS DAS TEAM DAVON HAT. Abgeleitet aus der Lage, nicht erfunden.
  Ein "gemeinsam schaffen wir das" an jemanden, bei dem fuenf von
  neun Sachen haken, ist das Gegenteil von Hilfe -- in der schwersten
  Lage ist der Team-Bezug deshalb eine Entlastung ("im Team ist
  gerade nichts von dir gefragt"), keine Aufforderung. Vier Lagen,
  vier Saetze. Die Pruefung verlangt ausdruecklich, dass es KEIN
  Spruch ist, der immer passt.

ZWEI DINGE, DIE ERST DAS BILD GEZEIGT HAT
1. "Die Menge passt gerade" stand ZWEIMAL untereinander -- einmal im
   Thema-Block, gleich darunter als Schritt. Kein Messwert meldet das;
   im Bildschirmfoto sah es aus wie ein Fehler. Der Thema-Block nennt
   die Titel jetzt nur noch, wenn es mehrere sind.
2. "Wenn du eine Sache angehst, dann die: Die Menge passt gerade" --
   die Fragetitel im Katalog sind SAETZE, keine Substantive. Jetzt
   "Fang hier an: 'Die Menge passt gerade'".

EIN FUND DER PRUEFUNG: Die TikTok-Quelle war beim Umzug ins Fazit
verlorengegangen. Filipe hatte sie ausdruecklich bestellt ("eine
professionelle auch mit infos und so aus aller welt was tiktok
angeht"). pruef-befinden hat es gemeldet.

Die Pruefung verlangte bis heute das GEGENTEIL -- eine Zeile je
Frage, zu jeder eine Einordnung. Sie ist beim Umbau rot geworden,
richtig so. Jetzt prueft sie, dass unter den Fragen KEIN Resuemee
mehr steht, dass es GENAU EINEN Schritt gibt (nicht "mindestens
einen" -- das waere auch bei neun gruen) und dass der Schritt Inhalt
hat, nicht nur einen Kasten.

pruef-befinden 116/0 (war 113), pruef-resuemee 35/0,
pruef-entwicklung 48/0, pruef-css-klassen 30/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-22 09:35:36 +02:00
co-authored by Claude Opus 5
parent 39276ef2ee
commit af56f97f4c
44 changed files with 879 additions and 670 deletions
+53 -21
View File
@@ -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");
+80 -2
View File
@@ -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,
+7 -1
View File
@@ -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