# RetrieX Patch p20i – Standalone Shop Query History Isolation

## Ziel

Dieser Patch behebt die beobachtete Query-Kontamination bei expliziten Shop-Suchen wie:

```text
shop testomat 808
```

Vor p20i wurde der Shop-Query-Optimizer immer mit dem aktuellen Prompt **und** dem Commerce-Verlauf aufgerufen. Wenn im Verlauf zuvor eine Grenzwert-/Indikatortabelle vorkam, konnte das LLM die eigentlich neue, konkrete Shop-Suche fälschlich zu folgender Query erweitern:

```text
testomat 808 indikator
```

Erwartet ist bei einem expliziten neuen Shop-Prompt:

```text
testomat 808
```

## Ursache im Code

Die Ursache wurde im realen Codepfad verifiziert:

- `AgentRunner::buildCommerceHistoryContext()` baut immer den Commerce-Verlauf.
- Dieser Verlauf wurde direkt an `buildOptimizedShopQuery()` übergeben.
- `AgentRunnerConfig::getShopPrompt()` fügt den Verlauf als `RECENT CONVERSATION CONTEXT` in den LLM-Optimizer-Prompt ein.
- Das LLM durfte dadurch alte Kontextanker wie `Indikator` übernehmen, obwohl der aktuelle Prompt mit `shop testomat 808` eine neue konkrete Suche startet.

## Lösung

p20i trennt den allgemeinen Commerce-Verlauf vom tatsächlich für die Shop-Query erlaubten Verlauf:

- Neuer interner Kontext: `$shopQueryHistoryContext`
- Für referenzielle Follow-ups bleibt Verlauf erlaubt, z. B.:
  - `die tabelle mit preisen`
  - `suche im shop`
  - `was kostet der indikator`
- Für explizite Standalone-Produktqueries mit Modellanker wird der Verlauf aus Optimizer, Preview, Search und Repair entfernt, z. B.:
  - `shop testomat 808`
  - `testomat 808 preis`
- Zusätzlich schützt `guardStandaloneOptimizedShopQuery()` gegen LLM-Optimizer-Ausgaben, die bei einer Standalone-Modellquery einen nicht im aktuellen Prompt enthaltenen Kontextanker wie `indikator` hinzufügen.

## Geänderte Dateien

- `src/Agent/AgentRunner.php`
- `src/Config/AgentRunnerConfig.php`
- `src/Config/RetriexEffectiveConfigProvider.php`
- `config/retriex/agent.yaml`

## Erwartete Tests

### Neuer Regressionsfall

```text
shop testomat 808
```

Erwartung:

- Shop wird angefragt.
- Gesendete Suchquery: `testomat 808`
- Nicht mehr: `testomat 808 indikator`
- Quelle: nur Shopsystem, kein Chatverlauf als aktive Shop-Query-Quelle.

### Bestehende Follow-up-Fälle müssen weiterhin funktionieren

```text
welche grenzwerte kann der testomat 808 messen
die tabelle mit preisen
```

Erwartung:

- Shop wird weiterhin angefragt.
- Verlauf darf verwendet werden.
- Query sinngemäß: `Testomat 808 indikator`

```text
Was ist der niedrigste Grenzwert für die Wasserhärte, welcher mit einem Testomaten überwacht werden kann?
mit welchem indikator wird der wert gemessen
was kpstet der indikator
```

Erwartung:

- LLM-/Routing-Normalisierung bleibt erhalten.
- Referenzieller Indikator-Preis-Follow-up darf weiterhin Verlauf nutzen.

## Lokale Prüfungen in dieser Umgebung

Ausgeführt:

```bash
php -l src/Agent/AgentRunner.php
php -l src/Config/AgentRunnerConfig.php
php -l src/Config/RetriexEffectiveConfigProvider.php
python3 -c 'import yaml; yaml.safe_load(open("config/retriex/agent.yaml"))'
```

Nicht ausführbar in dieser Umgebung:

```bash
bin/console mto:agent:config:validate
bin/console mto:agent:regression:test
bin/console mto:agent:config:audit-source --details
bin/console mto:agent:config:audit-patterns --details
```

Grund: Die hochgeladene ZIP enthält keine installierten Composer-Dependencies (`vendor/`).

## Pflichtchecks nach Einspielen

```bash
bin/console cache:clear
bin/console mto:agent:config:validate
bin/console mto:agent:regression:test
bin/console mto:agent:config:audit-source --details
bin/console mto:agent:config:audit-patterns --details
```

Bei OPcache/PHP-FPM: PHP-FPM bzw. Container neu laden.
