#103 — Bug — Smart-Add ignoriert Mengen-Präfix und globale Kategorie-Wissensbasis #106

Closed
opened 2026-08-18 13:14:06 +02:00 by lena · 0 comments
lena commented 2026-08-18 13:14:06 +02:00 (Migrated from git.butzei.de)

Story: Bug — Smart-Add ignoriert Mengen-Präfix und globale Kategorie-Wissensbasis

As a Nutzer der Einkaufsliste,
I want to dass Smart-Add eine bereits im Text enthaltene Menge (z. B. "5 Dosen Kokosmilch") und eine
bereits bekannte Kategorie (z. B. "Gurke" → Obst & Gemüse) automatisch erkennt,
so that ich nicht bei jedem Hinzufügen erneut nach Menge und Kategorie gefragt werde, obwohl das System
das längst wissen könnte.

Hintergrund / Root Cause (verifiziert im Code, 2026-08-08): Es gibt zwei parallele Backend-Pfade:
AddOrActivateShoppingProductCommandHandler (der "Plain Fallback") strippt eine Mengen-Präfix aus dem
Namen (ShoppingQuantityPrefixParser.Strip) und summiert sie korrekt mit einer vorhandenen Menge; er ruft
außerdem ShoppingCategoryResolver.ResolveFromKnowledgeBase — die aus #90 stammende, per Seed-CSV
befüllte globale Produkt→Kategorie-Zuordnung — nicht selbst auf (das übernehmen
CreateShoppingProductCommandHandler/AddOrActivateShoppingProductCommandHandler bereits serverseitig).
Das Problem liegt im Frontend: SmartAddInput.tsx's submit() nimmt diesen Fallback-Pfad nur, wenn der
ML-Worker noch nicht bereit ist oder die Eingabe kürzer als 2 Zeichen ist — für jede normale Eingabe (Worker
bereit, ≥2 Zeichen, kein starker Produkt-/Kategorie-Treffer im lokalen Embedding-Korpus) wird stattdessen
setCategoryPickerOpen(true) aufgerufen. Der resultierende createInCategory-Pfad (a) übergibt den
ungestrippten Namen (inkl. Mengen-Präfix) an den serverseitigen Dubletten-Check, wodurch z. B. "3
Bananen" nie mit dem existierenden Produkt "Bananen" gematcht wird und stattdessen als neues Produkt "3
Bananen" mit Menge null angelegt wird (das vom Nutzer beobachtete "Überschreiben" statt Summieren ist ein
Symptom dieser Namens-Nichtübereinstimmung), und (b) ruft nie
ShoppingCategoryResolver.ResolveFromKnowledgeBase auf, sondern verlangt immer eine manuelle
Kategorie-Auswahl über den Picker-Dialog.

Acceptance criteria:

  • Bevor der Kategorie-Picker-Dialog geöffnet wird, wird die Eingabe serverseitig gegen die globale
    Produkt→Kategorie-Wissensbasis geprüft (dieselbe Logik wie ShoppingCategoryResolver .ResolveFromKnowledgeBase); bei einem Treffer wird das Produkt direkt in die passende (ggf. auf der
    Liste noch anzulegende) Kategorie einsortiert, ohne Nachfrage.
  • Ein am Anfang der Eingabe stehendes Mengen-Präfix (z. B. "5 Dosen Kokosmilch", "3 Bananen") wird vor
    jedem Namens-Abgleich und jeder Produkterstellung abgetrennt (ShoppingQuantityPrefixParser-Logik),
    egal über welchen der Smart-Add-Pfade (Produkt-Treffer, Kategorie-Treffer, manueller Picker, Plain
    Fallback) das Produkt am Ende angelegt/aktiviert wird.
  • Erkennt Smart-Add sowohl Menge als auch Kategorie automatisch, entfällt die
    Mengen-Bestätigungs-Popup für diesen Fall vollständig (keine überflüssige Nachfrage für Werte, die
    schon aus dem Text bekannt sind).
  • Ein existierendes Produkt gleichen Namens (nach Abtrennen der Menge, case-insensitiv) wird über
    jeden Smart-Add-Pfad korrekt erkannt und seine Menge summiert statt eine Dublette anzulegen — die
    Regression aus dem Beispiel "5 Bananen vorhanden + 3 Bananen hinzugefügt → 8" ist damit behoben.
  • Weder Menge noch Kategorie automatisch bestimmbar: Verhalten bleibt wie heute (Kategorie-Picker bzw.
    Mengen-Popup erscheinen weiterhin).

Out of scope for this story:

  • Das lokale ML-Embedding-Matching selbst (Produkt-/Kategorie-Vorschlags-Chips) — bleibt unverändert als
    zusätzliche Abkürzung on top of der jetzt korrekt greifenden Backend-Logik.
  • Mehrzeiliges Einfügen (siehe eigene Story #108, die auf dieser hier aufbaut).
# Story: Bug — Smart-Add ignoriert Mengen-Präfix und globale Kategorie-Wissensbasis **As a** Nutzer der Einkaufsliste, **I want to** dass Smart-Add eine bereits im Text enthaltene Menge (z. B. "5 Dosen Kokosmilch") und eine bereits bekannte Kategorie (z. B. "Gurke" → Obst & Gemüse) automatisch erkennt, **so that** ich nicht bei jedem Hinzufügen erneut nach Menge und Kategorie gefragt werde, obwohl das System das längst wissen könnte. **Hintergrund / Root Cause (verifiziert im Code, 2026-08-08):** Es gibt zwei parallele Backend-Pfade: `AddOrActivateShoppingProductCommandHandler` (der "Plain Fallback") strippt eine Mengen-Präfix aus dem Namen (`ShoppingQuantityPrefixParser.Strip`) und summiert sie korrekt mit einer vorhandenen Menge; er ruft außerdem `ShoppingCategoryResolver.ResolveFromKnowledgeBase` — die aus `#90` stammende, per Seed-CSV befüllte globale Produkt→Kategorie-Zuordnung — nicht selbst auf (das übernehmen `CreateShoppingProductCommandHandler`/`AddOrActivateShoppingProductCommandHandler` bereits serverseitig). Das Problem liegt im Frontend: `SmartAddInput.tsx`'s `submit()` nimmt diesen Fallback-Pfad nur, wenn der ML-Worker noch nicht bereit ist oder die Eingabe kürzer als 2 Zeichen ist — für jede normale Eingabe (Worker bereit, ≥2 Zeichen, kein starker Produkt-/Kategorie-Treffer im lokalen Embedding-Korpus) wird stattdessen `setCategoryPickerOpen(true)` aufgerufen. Der resultierende `createInCategory`-Pfad (a) übergibt den **ungestrippten** Namen (inkl. Mengen-Präfix) an den serverseitigen Dubletten-Check, wodurch z. B. "3 Bananen" nie mit dem existierenden Produkt "Bananen" gematcht wird und stattdessen als neues Produkt "3 Bananen" mit Menge `null` angelegt wird (das vom Nutzer beobachtete "Überschreiben" statt Summieren ist ein Symptom dieser Namens-Nichtübereinstimmung), und (b) ruft nie `ShoppingCategoryResolver.ResolveFromKnowledgeBase` auf, sondern verlangt immer eine manuelle Kategorie-Auswahl über den Picker-Dialog. **Acceptance criteria:** - [ ] Bevor der Kategorie-Picker-Dialog geöffnet wird, wird die Eingabe serverseitig gegen die globale Produkt→Kategorie-Wissensbasis geprüft (dieselbe Logik wie `ShoppingCategoryResolver .ResolveFromKnowledgeBase`); bei einem Treffer wird das Produkt direkt in die passende (ggf. auf der Liste noch anzulegende) Kategorie einsortiert, ohne Nachfrage. - [ ] Ein am Anfang der Eingabe stehendes Mengen-Präfix (z. B. "5 Dosen Kokosmilch", "3 Bananen") wird vor jedem Namens-Abgleich und jeder Produkterstellung abgetrennt (`ShoppingQuantityPrefixParser`-Logik), egal über welchen der Smart-Add-Pfade (Produkt-Treffer, Kategorie-Treffer, manueller Picker, Plain Fallback) das Produkt am Ende angelegt/aktiviert wird. - [ ] Erkennt Smart-Add sowohl Menge als auch Kategorie automatisch, entfällt die Mengen-Bestätigungs-Popup für diesen Fall vollständig (keine überflüssige Nachfrage für Werte, die schon aus dem Text bekannt sind). - [ ] Ein existierendes Produkt gleichen Namens (nach Abtrennen der Menge, case-insensitiv) wird über **jeden** Smart-Add-Pfad korrekt erkannt und seine Menge summiert statt eine Dublette anzulegen — die Regression aus dem Beispiel "5 Bananen vorhanden + 3 Bananen hinzugefügt → 8" ist damit behoben. - [ ] Weder Menge noch Kategorie automatisch bestimmbar: Verhalten bleibt wie heute (Kategorie-Picker bzw. Mengen-Popup erscheinen weiterhin). **Out of scope for this story:** - Das lokale ML-Embedding-Matching selbst (Produkt-/Kategorie-Vorschlags-Chips) — bleibt unverändert als zusätzliche Abkürzung on top of der jetzt korrekt greifenden Backend-Logik. - Mehrzeiliges Einfügen (siehe eigene Story `#108`, die auf dieser hier aufbaut).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
robert/todo#106
No description provided.