From 18f5522612a0d927292f8d208d2306458e659d92 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 21 Jul 2026 09:08:46 +0200 Subject: [PATCH] Konzept-Raterei enger: keine fremden Konzepte an laufende Karten haengen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Datei-Fallback darf den Dateinamen ueber den Kartentitel raten. Live gesehen: eine gerade LAUFENDE neue ARM-Karte zeigte das alte arm-ui-Konzept, als waere es ihr Ergebnis — ein einzelnes gemeinsames Wort ("arm") reichte. - Titel-Raterei nur noch bei FERTIGEN Karten; laeuft eine noch, zaehlt allein ein im Text genannter Pfad. - Und sie braucht jetzt zwei gemeinsame Woerter oder ein langes (>=6 Zeichen), damit nicht irgendeine Datei auf irgendeine Karte passt. Co-Authored-By: Claude Opus 4.8 --- backend/services/ideen.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/backend/services/ideen.py b/backend/services/ideen.py index df74e24..fb74a42 100644 --- a/backend/services/ideen.py +++ b/backend/services/ideen.py @@ -736,17 +736,24 @@ _KONZEPT_PFAD_RX = re.compile(r"(?:~|/home/[A-Za-z0-9_.-]+)?/?konzepte/([A-Za-z0 def _lokales_konzept(text: str, titel: str = "") -> tuple | None: - """(pfad, inhalt) einer Konzept-Datei aus ~/konzepte — aus dem Text oder per Titel geraten.""" + """(pfad, inhalt) einer Konzept-Datei aus ~/konzepte — aus dem Text oder per Titel geraten. + + `titel` nur setzen, wenn die Karte FERTIG ist: sonst hängt die Raterei einer gerade + laufenden Karte das Konzept ihres Vorgängers an (live gesehen 21.07. — eine neue + ARM-Karte zeigte das alte ARM-Konzept, als wäre es ihr Ergebnis). + """ kandidaten: list[str] = [] m = _KONZEPT_PFAD_RX.search(text or "") if m: kandidaten.append(m.group(1)) - # Kein Pfad genannt (aeltere Karten): ueber den Titel raten — grobe Wortschnittmenge - # zwischen Dateiname und Kartentitel, nur bei einem eindeutigen Treffer. + # Kein Pfad genannt (aeltere Karten): ueber den Titel raten — Wortschnittmenge zwischen + # Dateiname und Kartentitel. Streng: EIN Treffer, und ein einzelnes kurzes Allerweltswort + # („arm") reicht nicht — sonst passt irgendeine Datei auf irgendeine Karte. if not kandidaten and titel and _KONZEPT_DIR.is_dir(): worte = {w for w in re.findall(r"[a-z0-9]{3,}", titel.lower())} treffer = [p.name for p in _KONZEPT_DIR.glob("*.md") - if worte & set(re.findall(r"[a-z0-9]{3,}", p.stem.lower()))] + if (lambda g: len(g) >= 2 or any(len(w) >= 6 for w in g))( + worte & set(re.findall(r"[a-z0-9]{3,}", p.stem.lower())))] if len(treffer) == 1: kandidaten.append(treffer[0]) for name in kandidaten: @@ -815,7 +822,9 @@ def konzept_of(task_id: str) -> dict: def _datei_antwort(repo: str | None = None) -> dict | None: """Konzept aus ~/konzepte als vollwertige Antwort — der zweite Ablage-Ort.""" - lokal = _lokales_konzept(haystack, titel) + # Titel-Raterei nur bei fertigen Karten (sonst erbt eine laufende Karte das + # Konzept ihres Vorgängers); läuft sie noch, zählt allein ein genannter Pfad. + lokal = _lokales_konzept(haystack, titel if task_status == "done" else "") if not lokal: return None pfad, inhalt = lokal