Konzept-Raterei enger: keine fremden Konzepte an laufende Karten haengen

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 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-21 09:08:46 +02:00
parent 0cea01c699
commit 18f5522612
+14 -5
View File
@@ -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