This commit is contained in:
team 1
2026-05-10 18:03:56 +02:00
parent 36485027e6
commit fbd8de64d0
12 changed files with 745 additions and 67 deletions

View File

@@ -0,0 +1,79 @@
# RetrieX Patch p86h - Multi Product Follow-up Split Lookup Completion
## Ziel
p86e/p86g konnten referenzielle Produktlisten-Follow-ups bereits weg von schwachen Meta-Queries wie `links zu aus` auf Produktanker aus dem Verlauf aufloesen. In einem Multi-Produkt-Fall blieb aber eine kombinierte Shopquery sichtbar und teilweise wirksam, z. B.:
```text
testomat 2000 cal 808
```
Diese kombinierte Query kann nur einen Teil der gemeinten Produkte treffen oder ueber Beschreibungen/Zubehoer unpassende Treffer liefern.
## Problem
p86g pruefte zwar die Produktidentitaet, stoppte aber sobald mindestens ein passender Treffer vorhanden war. Dadurch wurden fehlende Verlaufanker nicht separat nachgesucht.
Beispiel:
```text
Vorherige Antwort nennt:
- Testomat 2000 CAL
- Testomat 808
Follow-up:
gebe mir links zu den produkten aus dem shop
Primaere Query:
testomat 2000 cal 808
```
Wenn die primaere Query nur `Testomat 2000 CAL` fand, wurde nicht mehr separat nach `testomat 808` gesucht.
## Loesung
p86h erweitert die p86g-Logik:
1. Bestehende Shop-Treffer werden weiterhin gegen die Produktidentitaeten der Verlaufanker gefiltert.
2. Danach wird ermittelt, welche Verlaufanker bereits abgedeckt sind.
3. Wenn bei mehreren Ankern mindestens einer fehlt, werden die Produktanker separat nachgesucht.
4. Bereits gefundene Identitaetstreffer und separate Anchor-Lookup-Treffer werden dedupliziert gemerged.
5. Die abgeschlossene Shop-Meta-Anzeige zeigt bei referenziellen Produktlisten-Follow-ups die verwendeten Anchor-Queries, z. B.:
```text
testomat 2000 cal | testomat 808
```
## Guardrails
Der Patch ist bewusst eng begrenzt:
- nur referenzielle Produktlisten-/Shoplink-Follow-ups
- keine neue Intent-Erkennung
- keine Aenderung an Retrieval, Ranking, Scoring oder Shop-Matching
- keine harte Produktliste im Core
- keine Sonderlogik fuer medizinische Geraete
- p84 LAB-CL-Kuerzel, p85b SIO2-Anker und Accessory-/Indicator-Flows bleiben unberuehrt
## Geaenderte Dateien
- `src/Agent/AgentRunner.php`
- `patch_history/RETRIEX_PATCH_86H_MULTI_PRODUCT_FOLLOWUP_SPLIT_LOOKUP_README.md`
## Lokale Checks
```text
php -l src/Agent/AgentRunner.php
find src -name '*.php' -print0 | xargs -0 -n1 php -l
YAML parse OK
vendor missing - console checks skipped
```
Console-Checks muessen in einer Umgebung mit `vendor/` ausgefuehrt werden:
```text
php bin/console mto:agent:config:validate
php bin/console mto:agent:regression:test
php bin/console mto:agent:config:audit-source --details
php bin/console mto:agent:config:audit-patterns --details
```

View File

@@ -0,0 +1,68 @@
# RetrieX Patch p86j - Multi Product Split Query Meta Clarity
## Ziel
Referenzielle Produktlisten-Follow-ups wie:
```text
gebe mir links zu den produkten aus dem shop
```
koennen seit p86i mehrere Produktanker als getrennte Shopware-Suchen ausfuehren. Die UI zeigte diese Einzelqueries jedoch weiterhin als zusammengefuehrte Semikolon-Zeile unter `Gesendete Suchquery`, z. B.:
```text
testomat 2000 self clean; testomat 2000 cal; testomat 808
```
Das war missverstaendlich, weil die Shopware-API keine Pipe-/Semikolon-Syntax als einzelne Query versteht.
## Aenderung
- Split-Produktlisten-Follow-ups werden in der Shop-Meta-Card nun als `Gesendete Einzelqueries` dargestellt.
- Jede Einzelquery wird separat gerendert, statt zu einer Semikolon- oder Pipe-Query zusammengefuehrt zu werden.
- Die technische Ausfuehrung aus p86i bleibt erhalten: `searchProductListFollowUpSplitLookupQueries()` fuehrt weiterhin einzelne, begrenzte und sequenzielle `searchShop()`-Aufrufe pro Produktanker aus.
- Die bestehende semikolonbasierte Display-Formatierung wurde entfernt, damit sie nicht versehentlich wieder als Shopware-Query interpretiert wird.
- Die Commerce-Search-Logs enthalten nun zusaetzlich `individualShopQueries`, wenn Split-Lookups vorbereitet wurden.
- Der einzelne Referenzanker-Guard wird bei bereits identitaetsgefilterten Split-Lookup-Ergebnissen uebersprungen, damit ein Treffer zu `Testomat 2000 self clean` nicht spaeter `Testomat 2000 CAL` oder `Testomat 808` aus der zusammengefuehrten Anzeige-Query herausfiltert.
## Bewusst nicht geaendert
- Keine Async-/Parallelisierung. Der Store-API-Pfad ist synchron; Async waere ein separater, groesserer Service-Umbau.
- Keine Aenderung an Intent-Erkennung, Retrieval, Scoring, Ranking oder Shop-Matching.
- Keine neue Produkt-/Marken-Sonderlogik.
- Keine Veraenderung normaler Einzel-Shopqueries.
## Erwartung
Vorher:
```text
Gesendete Suchquery
testomat 2000 self clean; testomat 2000 cal; testomat 808
```
Nachher:
```text
Gesendete Einzelqueries
testomat 2000 self clean
testomat 2000 cal
testomat 808
```
## Geaenderte Dateien
- `src/Agent/AgentRunner.php`
- `config/retriex/chat-messages.yaml`
- `src/Config/ChatMessagesConfig.php`
- `public/assets/styles/base.css`
## Lokale Checks
```text
find src -name '*.php' -print0 | xargs -0 -n1 php -l
python yaml parse for config/retriex/*.yaml
static check: no semicolon display formatter remains
```
Alle lokalen Checks waren gruen. Symfony-Console-Checks muessen in der Zielumgebung mit `vendor/` ausgefuehrt werden.

View File

@@ -0,0 +1,77 @@
# RetrieX Patch p86k - YAML-backed Product Anchor Canonicalization
## Zweck
p86j hat die Multi-Product-Link-Follow-up-Logik verbessert, aber der Core-Pattern-Audit meldete danach einen Warnfund in `src/Agent/AgentRunner.php`:
```text
preg_match('/\btestomat(?:®)?\b.*$/iu', $anchor, $match)
```
p86k entfernt dieses domain-sensitive Pattern aus dem PHP-Core und verlagert die fachliche Start-/Familien-Erkennung in `config/retriex/genre.yaml`.
## Änderung
- `AgentRunner::canonicalizeProductListAnchor()` nutzt keine hart codierte Produktfamilie mehr.
- Neuer YAML-backed Trim-Schritt `trimProductListAnchorToConfiguredStart()`:
- liest `context_resolution.product_list_followup.canonical_start_patterns`
- akzeptiert Named Group `anchor`, Fallback auf Gruppe 1 oder Full Match
- Produktfamilien-Erkennung liest nun aus:
- `context_resolution.product_list_followup.canonical_family_terms`
- `AgentRunnerConfig` stellt Accessor-Methoden bereit.
- `RetriexEffectiveConfigProvider` validiert die neuen YAML-Werte.
## Keine fachliche Änderung
Der Patch ändert nicht:
- Intent-Erkennung
- Retrieval
- Scoring
- Ranking
- Shop-Matching
- Split-Request-Logik aus p86i/p86j
- LAB-CL-Kürzelschutz aus p84
- SiO2-Geräteanker aus p85b
## Erwartung
Der bisherige Effekt bleibt erhalten:
```text
Systembeschreibung Der Testomat® 2000 CAL
=> testomat 2000 cal
```
Die dafür nötige Produktfamilienlogik liegt nun in YAML statt im PHP-Core.
## Lokale Checks
Ausgeführt im Patch-Arbeitsverzeichnis:
```bash
find src -name '*.php' -print0 | xargs -0 -n1 php -l
python3 - <<'PY'
from pathlib import Path
import yaml
for path in Path('config/retriex').glob('*.yaml'):
yaml.safe_load(path.read_text(encoding='utf-8'))
print('YAML parse OK')
PY
grep -RIn "preg_match.*testomat\|testomat.*preg_match" src/Agent/AgentRunner.php
```
Ergebnis:
- PHP lint OK
- YAML parse OK
- kein `preg_match` mit `testomat` in `AgentRunner.php`
## Noch in Zielumgebung ausführen
```bash
php bin/console mto:agent:config:validate
php bin/console mto:agent:regression:test
php bin/console mto:agent:config:audit-source --details
php bin/console mto:agent:config:audit-patterns --details
```

View File

@@ -0,0 +1,77 @@
# RetrieX Patch p86i - Multi Product Split Shopware Requests
## Ziel
Referenzielle Produktlisten-Follow-ups wie
```text
gebe mir links zu den produkten aus dem shop
```
sollen bei mehreren Produktankern keine kombinierte Pseudo-Query mehr an Shopware senden.
Vorher konnte aus dem Verlauf eine zusammengeführte Query entstehen, z. B.:
```text
testomat 2000 cal 808
```
oder als Anzeige/Repair-Query eine Pipe-Liste:
```text
testomat 2000 self clean | testomat 2000 cal | testomat 808
```
Diese Pipe-/Kombi-Query ist für die Shopware-API keine gültige Einzelproduktsuche.
## Änderung
p86i führt einen engen Split-Lookup-Pfad nur für referenzielle Produktlisten-Follow-ups ein:
1. Produktanker werden aus Verlauf/RAG wie bisher generisch extrahiert.
2. Wenn mindestens zwei Produktanker vorhanden sind, wird keine kombinierte Produktlisten-Query an Shopware gesendet.
3. Stattdessen werden echte separate Shopware-Suchen ausgeführt, z. B.:
```text
testomat 2000 self clean
testomat 2000 cal
testomat 808
```
4. Ergebnisse werden per Produktidentität gefiltert und dedupliziert zusammengeführt.
5. Die Query-Anzeige nutzt Semikolon-Trennung als reine Anzeige der Einzelabfragen, keine Pipe-Syntax.
## Scope / Guardrails
Der Patch ist bewusst eng begrenzt:
- nur für `isReferentialProductListShopFollowUpPrompt()`
- nur wenn mindestens zwei Produktanker gefunden wurden
- keine Änderung für normale Einzel-Shopqueries
- keine Änderung an Intent-Erkennung, RAG-Retrieval, Ranking, Scoring oder Shop-Matching
- keine feste Produktliste im Core
- keine Sonderlogik für medizinische Geräte
- kein pauschales `gerät => testomat`
- bestehende Identity-Filterung aus p86g/p86h bleibt aktiv
## Async-Bewertung
Die getrennten Lookups werden bewusst sequenziell und durch `max_anchors` begrenzt ausgeführt.
Der vorhandene `ShopSearchService::search()` / `StoreApiClient`-Pfad ist synchron aufgebaut. Eine echte parallele Store-API-Ausführung würde einen breiteren Service-/HTTP-Client-Umbau erfordern und wurde bewusst nicht in diesen kleinen Hotfix aufgenommen, um keine unrelated Shop-Flows zu riskieren.
## Lokale Checks
```text
php -l src/Agent/AgentRunner.php
find src -name '*.php' -print0 | xargs -0 -n1 php -l
YAML parse OK
```
Symfony-Console-Checks müssen in der Zielumgebung mit `vendor/` ausgeführt werden:
```text
php bin/console mto:agent:config:validate
php bin/console mto:agent:regression:test
php bin/console mto:agent:config:audit-source --details
php bin/console mto:agent:config:audit-patterns --details
```