Wie geht es dir: achtzehn Fragen in sechs Feldern, eine Zusammenfassung

Sechs Fragen mehr (jetzt 18), und alle in sechs Feldern gegliedert:
Last & Erholung, Miteinander, Sinn & Anerkennung, Klarheit &
Rueckhalt, Grenzen & Sicherheit, Weiterkommen & Ausblick. Die Felder
sind nicht ausgedacht -- es sind die Gebiete, die die Forschung zu
belasteten Rollen durchgehend abfragt.

Die drei neuen Luecken, die sie schliessen: Schlaf (zeigt Erschoepfung
frueher als jede andere Frage), Widersprechen (der Kern dessen, was
psychologische Sicherheit heisst) und Mitreden (viel Anforderung bei
wenig Einfluss ist die Kombination, aus der Erschoepfung entsteht).
Jede neue Frage hat ihre belegte Einordnung -- eine Frage ohne
Grundlage ist eine Frage, die jemand gut fand.

DIE ROTATION MUSSTE NEU. Der Katalog ist nach Themen sortiert; wer
daraus drei aufeinanderfolgende nimmt, bekommt drei aus demselben
Feld. Jetzt wird der Ring vorher verzahnt -- erst je eine Frage aus
jedem Feld, dann je eine zweite. Ein Fenster trifft damit von selbst
verschiedene Felder.

Ein erster Anlauf reservierte feste Plaetze fuer die kernlosen
Felder. Begruendet mit einer Auswertung je Feld, die es gar nicht
gibt -- und er kostete: zwoelf Runden, bis jede Frage einmal gestellt
war, fast ein halbes Jahr. Gefunden hat das pruef-befinden.mjs, nicht
das Nachdenken. Mit dem verzahnten Ring und vier Plaetzen je Runde
sind es vier Runden.

DIE EINE ZUSAMMENFASSUNG AM ENDE, nicht eine je Kategorie. Sie sagt
in dieser Reihenfolge: die Lage in einem Satz, was traegt (benannt,
nicht als Zahl), hoechstens EINE Sache zum Hinschauen, ein Schluss,
der zur Lage passt. Umgekehrt waere es eine Maengelliste mit
Trostpflaster, und so etwas beantwortet man beim naechsten Mal nicht
mehr ehrlich.

ZUR FRAGE NACH DER BESTEN KOSTENLOSEN MOEGLICHKEIT: bewusst KEINE
KI. Das sind Gesundheitsdaten (wer nachts wach liegt, wer angefeindet
wird, wer ans Aufhoeren denkt) -- deshalb sind sie im ganzen Haus als
nurSelbst markiert. Kostenlose KI-Angebote bezahlt man mit den Daten.
Ein Sprachmodell erfindet ausserdem, und zwar ueberzeugend. Und ein
fremder Dienst faellt aus. Jeder Grund reicht einzeln. Die
Begruendung steht ausfuehrlich in workspace-befinden-resuemee.js.

Nebenbefund behoben: Die Zusammenfassung blieb direkt NACH einer
abgeschlossenen Runde leer -- da ist keine Antwort mehr "frisch".
Genau der Moment, in dem man sie sehen will.

Auch eine Pruefung korrigiert: Sie verbot den Text "entwicklung.js"
irgendwo in der Datei und schlug an einem Kommentar an, der die
Serverdatei benennt. Sie misst jetzt die Skript-Quellen.

pruef-befinden.mjs 112/0, pruef-resuemee.mjs 35/0 (neu).

Offener Befund, aelter als diese Aenderung: pruef-entwicklung.mjs
meldet "ein Modi: keine Kachel fuehrt mehr ersatzweise auf die
Entwicklungsseite" -- auch ohne diese Commits.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-20 19:45:14 +02:00
co-authored by Claude Opus 5
parent 1bdeccc054
commit 2719bd9b88
8 changed files with 1387 additions and 167 deletions
+118 -4
View File
@@ -213,12 +213,51 @@ melde("=== 2. Sechs Fragen, ein Rhythmus ===");
passiert, wenn der Versatz und die Zahl der Fragen einen
gemeinsamen Teiler haben. */
{
/* DIE GRENZE WIRD GERECHNET, NICHT EINGETRAGEN (20.09.2026).
Hier stand fest „6 Runden". Das war richtig, solange es sieben
wechselnde Fragen bei drei je Runde gab. Mit dreizehn Fragen ist
es nur noch Zufall, ob die Zahl passt -- und eine Pruefung, die
bei jedem Katalogzuwachs von Hand nachgestellt werden muss, wird
irgendwann nachgestellt, statt den Fehler zu zeigen.
Der Anspruch ist stattdessen: Es darf nicht laenger dauern, als
es MUSS, plus eine Runde Luft. Weniger als ceil(wechselnde /
Plaetze) geht rechnerisch nicht; mehr als eine Runde darueber
heisst, dass die Auswahl sich im Kreis dreht.
GENAU SO IST DER FEHLER AUFGEFALLEN, den diese Zeile gefunden
hat: Eine erste Fassung der feldbewussten Rotation brauchte
ZWOELF Runden statt vier -- fast ein halbes Jahr, bis jede Frage
einmal gestellt war. */
const wechselnde = kat.ENTWICKLUNG_SELBST.filter((p) => !p.kern).length;
const mindestens = Math.ceil(wechselnde / modul.ZUSATZ_PRO_RUNDE);
const grenze = mindestens + 1;
const gesehen = new Set();
for (let r = 0; r < 6; r++) {
let gebraucht = null;
for (let r = 0; r < grenze * 4; r++) {
for (const p of modul.fragenFuer(idFrida, r).alle) gesehen.add(p.schluessel);
if (gebraucht === null && gesehen.size === kat.ENTWICKLUNG_SELBST.length) {
gebraucht = r + 1;
}
}
ok(gesehen.size === kat.ENTWICKLUNG_SELBST.length,
`über sechs Runden kommt jede der ${kat.ENTWICKLUNG_SELBST.length} Fragen dran (${gesehen.size})`);
`jede der ${kat.ENTWICKLUNG_SELBST.length} Fragen kommt überhaupt dran (${gesehen.size})`);
ok(gebraucht !== null && gebraucht <= grenze,
`und zwar in ${gebraucht} Runden — rechnerisch nötig sind ${mindestens}, erlaubt ${grenze}`);
/* UND JEDE RUNDE STREUT ÜBER DIE FELDER. Vier Zusatzfragen aus
demselben Feld waeren kein Befinden mehr, sondern ein Interview
zu einem Thema -- genau das passiert, wenn der Ring dem nach
Themen sortierten Katalog folgt. */
let engste = 99;
for (let r = 0; r < 12; r++) {
const felder = new Set(modul.fragenFuer(idFrida, r).zusatz.map((p) => p.feld));
engste = Math.min(engste, felder.size);
}
ok(engste >= Math.min(3, modul.ZUSATZ_PRO_RUNDE),
`auch die engste Runde streut über mindestens 3 Felder (${engste})`);
/* Und die Auswahl ist STABIL: derselbe Stand, dieselbe Liste.
Zufall hiesse, dass bei jedem Neuladen etwas anderes dasteht. */
ok(modul.fragenFuer(idFrida, 2).alle.map((p) => p.schluessel).join()
@@ -411,8 +450,32 @@ melde("=== 5. Eine Seite, ein Zweck ===");
ok(!/personen-block|meine-karte|abweichung/.test(b),
"und keinen einzigen Abschnitt über andere Menschen");
ok(/befinden\.js/.test(b) && !/entwicklung\.js/.test(b),
"sie lädt ihr eigenes Skript, nicht das der Entwicklungsseite");
/* DIE SKRIPT-QUELLEN, NICHT DER ROHE TEXT (korrigiert 20.09.2026).
Hier stand `!/entwicklung\.js/.test(b)` -- eine Textsuche ueber die
GANZE Datei. Die schlug an einem KOMMENTAR an, der voellig zu
Recht die Serverdatei `workspace-entwicklung.js` benennt. Die
Pruefung meldete damit einen Fehler an einer Stelle, an der nichts
kaputt war, und stand der eigentlichen Frage im Weg.
Die eigentliche Frage lautet: Welche Dateien LAEDT die Seite? Die
steht in den `src`-Angaben und nirgends sonst. Dieselbe Lehre wie
bei pruef-schranke am 19.09.: Wer Text sucht, misst Text -- nicht
die Sache. */
const quellen = [...b.matchAll(/<script[^>]+src="([^"]+)"/g)]
/* Nur der Dateiname -- ohne Pfad und ohne Versionsstempel. Damit
braucht es hier kein Muster, das man falsch schreiben kann: Ein
Vergleich auf Gleichheit hat keine Randfaelle. (Der erste Anlauf
benutzte eine Wortgrenze in der Zeichenkette und bekam dadurch
ein echtes Steuerzeichen in die Datei -- die Pruefung verglich
danach gegen etwas, das es nirgends gibt, und die Gegenprobe war
still gruen. Genau die Sorte Pruefung, die nichts prueft.) */
.map((m) => m[1].split("?")[0].split("/").pop());
ok(quellen.length > 0, `die Seite laedt ueberhaupt Skripte (${quellen.length})`);
ok(quellen.includes("befinden.js"),
`sie laedt ihr eigenes Skript (${quellen.join(", ")})`);
ok(!quellen.includes("entwicklung.js"),
"und nicht das der Entwicklungsseite — zwei Stände wären zwei Wahrheiten");
}
/* =======================================================================
@@ -766,6 +829,57 @@ melde("=== 8. Die Analyse im Browser ===");
ok(a.quellen.some((x) => /tiktok/i.test(x)),
"darunter eine zu TikTok — danach hatte Filipe ausdrücklich gefragt");
ok(a.blank, "die Verweise öffnen ohne Zugriff aufs eigene Fenster (noopener)");
/* ---- DIE FELDER UND DIE EINE ZUSAMMENFASSUNG (20.09.2026) --------
Filipe: „viel mehr fragen aber kategorisiert … und am ende EINE
gesamte zusammenfassung."
Gemessen wird hier NICHT, ob ein Text dasteht, sondern:
* dass die Fragen unter Überschriften stehen -- und zwar unter
MEHREREN, sonst ist es eine Überschrift über allem und keine
Gliederung;
* dass jede Frage unter einer steht und keine darüber hängt;
* dass die Zusammenfassung GENAU EINMAL vorkommt. Eine je
Kategorie war ausdrücklich nicht gewünscht, und eine Prüfung,
die nur "mindestens eine" verlangt, würde sechs durchlassen. */
const g = await seite.evaluate(() => {
const felder = [...document.querySelectorAll("#fragen .e-feld")];
const fragen = [...document.querySelectorAll("#fragen .e-punkt")];
/* Wie viele Fragen stehen VOR der ersten Überschrift? Jede davon
hängt ohne Thema in der Luft. */
const ersteFeldPos = felder.length
? [...document.getElementById("fragen").children].indexOf(felder[0]) : -1;
const kinder = [...document.getElementById("fragen").children];
const heimatlos = kinder.slice(0, ersteFeldPos < 0 ? kinder.length : ersteFeldPos)
.filter((k) => k.classList.contains("e-punkt")).length;
const fazit = document.getElementById("fazit-block");
return {
felder: felder.length,
feldNamen: felder.map((f) => f.querySelector(".e-feld__wort")?.textContent.trim()),
fragen: fragen.length,
heimatlos,
fazitDa: fazit && fazit.hidden === false,
fazitAnzahl: document.querySelectorAll(".b-fazit").length,
kopf: document.getElementById("fazit-kopf")?.textContent.trim() || "",
traegt: document.querySelectorAll("#fazit-traegt-liste li").length,
schluss: document.getElementById("fazit-schluss")?.textContent.trim() || "",
zahlen: document.getElementById("fazit-zahlen")?.textContent.trim() || "",
};
});
ok(g.felder >= 3,
`die Fragen stehen unter ${g.felder} Feldüberschriften — nicht in einer Reihe`);
ok(g.heimatlos === 0,
`keine Frage hängt über der ersten Überschrift (${g.heimatlos})`);
ok(g.feldNamen.every((x) => x && x.length > 3),
`jede Überschrift hat einen Namen (${g.feldNamen.join(", ")})`);
ok(g.fazitDa === true, "die Zusammenfassung steht am Ende der Fragen");
ok(g.fazitAnzahl === 1,
`und zwar GENAU EINMAL (${g.fazitAnzahl}) — eine je Kategorie war ausdrücklich nicht gewünscht`);
ok(g.kopf.length > 30, `mit einem ganzen Satz („${g.kopf.slice(0, 52)}…")`);
ok(g.schluss.length > 20, `und einem Schlusssatz („${g.schluss.slice(0, 46)}…")`);
ok(/\d+ Fragen aus \d+ Feldern/.test(g.zahlen),
`die Belegzahlen stehen darunter („${g.zahlen}")`);
if (process.env.SCHIRM) {
await seite.locator("#analyse-block").screenshot(
{ path: "C:/Users/qciga/Documents/Obelix/DogiHompage/blick.png" });