diff --git a/server/kampagne-bild-lesen.mjs b/server/kampagne-bild-lesen.mjs index bd14512a..1a20618d 100644 --- a/server/kampagne-bild-lesen.mjs +++ b/server/kampagne-bild-lesen.mjs @@ -482,10 +482,58 @@ export function leseBild(text) { Statt die Startzeile noch genauer zu suchen, wird gesagt, was KEINE Aufgabe ist. Das haelt auch, wenn die Seite die Bloecke einmal anders anordnet. */ - const KEINE_AUFGABE = /Endet\s*in|Endetin|Phasendetails|Leistung|Ziele erreichen/i; + /* WAS DIE PHASENUEBERSCHRIFT IST -- UND WAS NUR SO KLINGT + (berichtigt 08.10.2026, nach dem ersten echten Einsatz). + + Hier stand ein Muster, das JEDE Zeile wegwarf, in der + „Ziele erreichen“, „Leistung“, „Phasendetails“ oder „Endet in“ + irgendwo vorkam. Das trifft die Ueberschrift -- und leider auch + Aufgaben, die zufaellig dieselben Woerter benutzen. Gemessen: + + WEG „Ziele erreichen für mehr Reichweite“ + WEG „Deine Leistung steigern“ + bleibt „An 20 Tagen Ziele für optimierte Bildqualität erreichen“ + + Die ersten beiden sind gewoehnliche Ziele und haetten bleiben + muessen. Im Protokoll steht, dass Filipes erster echter Versuch + am 08.10.2026 mit ZWEI Aufgaben ankam, waehrend auf seinem Bild + DREI stehen -- und er die Kachel danach geloescht hat. + + DIE UEBERSCHRIFT ERKENNT MAN AN ZWEI DINGEN, nicht an einem + Wort: + 1. Sie traegt den Countdown („Endet in 23 Tage 22 : 50 : 44“) + -- also das Wort UND Ziffern dahinter. + 2. Oder sie ist KURZ und besteht fast nur aus dem + Ueberschriftwort. + Eine Aufgabe ist ein Satz mit einer Anweisung darin; sie traegt + keinen Countdown und ist laenger. + + IM ZWEIFEL BLEIBT DIE ZEILE. Eine Ueberschrift zu viel in der + Hakenliste ist ein Schoenheitsfehler, den man in zwei Sekunden + loescht. Eine fehlende Aufgabe merkt niemand -- bis jemand sie + nicht erfuellt. */ + const KEINE_AUFGABE = (zeile) => { + const nur = String(zeile).replace(AUFZAEHLUNG, "").trim(); + /* Mit Countdown: das ist die Ueberschrift. */ + if (/Endet\s*in/i.test(nur) && /[0-9]/.test(nur)) return true; + /* Oder die Zeile IST die Ueberschrift und sonst nichts. + GENAU, NICHT NUR AM ANFANG (berichtigt beim Gegenlesen, + 08.10.2026): Mit einer Wortgrenze statt eines Zeilenendes fiel + „Ziele erreichen für mehr Reichweite“ durch -- eine + gewoehnliche Aufgabe, die zufaellig so anfaengt. Eine + Ueberschrift steht allein in ihrer Zeile; alles, was danach + weitergeht, ist ein Satz. + Die Zeichen am Ende sind das, was die Texterkennung gern + anhaengt: Punkt, Doppelpunkt, ein Strich, ein Trennpunkt. */ + if (/^(Phasendetails|Ziele erreichen|Creator.{0,3}innen.Leistung)[\s.:·|-]*$/i + .test(nur)) { + return true; + } + return false; + }; for (const z of alle.slice(ab)) { if (!AUFZAEHLUNG.test(z)) continue; - if (KEINE_AUFGABE.test(z)) continue; + if (KEINE_AUFGABE(z)) continue; /* EIN PUNKT AM ENDE IST FAST IMMER ZUFALL. Gemessen kam „Geh LIVE für 900 Minuten.“ heraus, auf der Seite steht es ohne Punkt. Eine Aufgabe ist eine Beschriftung, kein Satz; diff --git a/server/pruef-kampagne-bild.mjs b/server/pruef-kampagne-bild.mjs index 9a6b3a58..ef8a1700 100644 --- a/server/pruef-kampagne-bild.mjs +++ b/server/pruef-kampagne-bild.mjs @@ -135,6 +135,53 @@ melde("=== 1. Aus dem Erkennungstext wird eine Kachel ==="); ok(!g.kuer.aufgaben.some((a) => /Endet|Ziele erreichen|Leistung/i.test(a)), " und die Phasenueberschrift mit ihrem Countdown ist keine"); + /* ---- EINE AUFGABE DARF HEISSEN, WIE SIE WILL (08.10.2026) --- + + GEFUNDEN IM ECHTEN BETRIEB, nicht beim Bauen: Filipes erster + Versuch am 08.10.2026 kam laut Protokoll mit ZWEI Aufgaben an, + waehrend auf seinem Bild DREI standen — und er hat die Kachel + danach geloescht. + + Die Ursache war die Regel, die die Phasenueberschrift + aussortiert. Sie warf jede Zeile weg, in der „Ziele erreichen“, + „Leistung“ oder „Phasendetails“ IRGENDWO vorkam — also auch + gewoehnliche Ziele, die zufaellig dieselben Woerter benutzen. + Eine Ueberschriftenregel, die Aufgaben verschluckt. + + IM ZWEIFEL BLEIBT DIE ZEILE. Eine Ueberschrift zu viel in der + Hakenliste loescht man in zwei Sekunden. Eine fehlende Aufgabe + merkt niemand — bis jemand sie nicht erfuellt. */ + { + const mitFallen = [ + "Kampagne mit Fallen", + "Gruppenname Kampagne mit Fallen Zeitzone Europe/Berlin", + "Daten 01.10.2026 ~ 31.10.2026", + "@ Ziele erreichen Endetin 23 Tage 22 : 50 : 44", + "· Ziele erreichen für mehr Reichweite", + "· Deine Leistung steigern", + "· An 20 Tagen Ziele für optimierte Bildqualität erreichen", + "· Phasendetails im Kalender eintragen", + ].join("\n"); + const g2 = leseBild(mitFallen); + ok(g2.kuer.aufgaben.length === 4, + `vier Aufgaben, obwohl drei davon Ueberschriftwoerter tragen ` + + `(${g2.kuer.aufgaben.length}): ${JSON.stringify(g2.kuer.aufgaben)}`); + ok(g2.kuer.aufgaben.includes("Ziele erreichen für mehr Reichweite"), + " „Ziele erreichen für mehr Reichweite“ ist eine Aufgabe"); + ok(g2.kuer.aufgaben.includes("Deine Leistung steigern"), + " „Deine Leistung steigern“ auch"); + /* GEGENPROBE: Die ECHTE Ueberschrift mit ihrem Countdown faellt + weiterhin heraus. Ohne sie waere „alles bleibt stehen“ auch + dann gruen, wenn gar nichts mehr aussortiert wird. */ + ok(!g2.kuer.aufgaben.some((a) => /Endetin|Endet in/i.test(a)), + " die Zeile MIT Countdown bleibt draussen"); + /* Und eine Zeile, die NUR aus dem Ueberschriftwort besteht, + ebenfalls -- sonst stuende „Phasendetails“ als Haken da. */ + const nurWort = leseBild([...mitFallen.split("\n"), "· Phasendetails"].join("\n")); + ok(!nurWort.kuer.aufgaben.includes("Phasendetails"), + " und eine Zeile, die nur das Wort ist, auch"); + } + ok(g.kuer.einleitung === "Zusätzliche Prämien für das Team im Oktober.", `die Beschreibung: ${JSON.stringify(g.kuer.einleitung)}`); ok(g.kuer.steckbrief.verbund === "Spicy Media",