This commit is contained in:
team 1
2026-05-07 15:06:50 +02:00
parent f136bec0d7
commit d3ae51c551
16 changed files with 235 additions and 148 deletions

View File

@@ -0,0 +1,134 @@
# RetrieX Patch 44 - Runtime Answer Guard / Shop Follow-up Cleanup
## Ziel
Dieser Patch behandelt drei Fehler außerhalb der p43 YAML-/Listen-/Maps-Konsolidierung:
1. Sporadische endlos lange Produktlisten, bei denen ein letztes Shop-Produkt wiederholt wird.
2. Falscher einleitender Satz bei direkten Zubehör-/Kabel-Shopfragen wie `zeige mir Anschlusskabel für pH/Redox`.
3. Falsche Shop-Follow-up-Query `schaue` bei `schaue im shop` nach einer vorherigen fachlichen Frage.
## Änderungen
### 1. Runtime-Schutz gegen Endlosantworten
Dateien:
- `src/Agent/AgentRunner.php`
- `src/Config/AgentRunnerConfig.php`
- `config/retriex/agent.yaml`
Änderung:
- Neuer konfigurierbarer `final_answer_guard`.
- Stoppt die finale LLM-Ausgabe, wenn eine Antwort zu lang wird oder dieselbe relevante Antwortzeile zu oft wiederholt wird.
- Der Guard läuft im finalen Streaming-Pfad und ist generisch: keine Chlor-, Schwimmbad-, Testomat- oder Produkt-Sonderlogik.
- Bei Abbruch wird ein kurzer Hinweis ausgegeben statt endlos weiterzustreamen.
### 2. Ollama Output-Cap
Dateien:
- `src/Infrastructure/OllamaClient.php`
- `config/retriex/model.yaml`
- `config/services.yaml`
- `src/Config/RetriexEffectiveConfigProvider.php`
Änderung:
- Neuer Parameter `retriex.llm.num_predict: 2048`.
- Wird als Ollama-Option `num_predict` gesendet.
- Wichtig für Installationen mit blockierender Ollama-Generierung (`stream=false`), damit Runaway-Ausgaben bereits auf Modellseite begrenzt werden.
### 3. `schaue im shop` als Meta-Shop-Follow-up
Datei:
- `config/retriex/language.yaml`
Änderung:
- Ergänzt zentrale User-Instruction-Terme: `schaue`, `schau`, `schauen`, `nachschauen`.
- Dadurch wird `schaue im shop` wie `suche im shop` als Meta-Shop-Follow-up behandelt und kann den vorherigen Kontext verwenden, statt die Suchquery `schaue` zu senden.
### 4. Zubehörantwort-Hardening
Datei:
- `config/retriex/prompt.yaml`
Änderung:
- Verstärkt Antwortregeln für direkte Zubehör-/Kabel-Shopfragen.
- Bei passenden Shop-Treffern soll nicht mit einer fehlenden Hauptgerät-/Messgeräte-Aussage begonnen werden.
- Das verhindert Sätze wie sinngemäß „kein sicher belegter Testomat für pH-Messung“, wenn der Nutzer Anschlusskabel für pH/Redox angefragt hat.
## Geänderte Dateien
- `config/retriex/agent.yaml`
- `config/retriex/language.yaml`
- `config/retriex/model.yaml`
- `config/retriex/prompt.yaml`
- `config/services.yaml`
- `src/Agent/AgentRunner.php`
- `src/Config/AgentRunnerConfig.php`
- `src/Config/RetriexEffectiveConfigProvider.php`
- `src/Infrastructure/OllamaClient.php`
## Lokale Prüfungen
Ausgeführt:
```bash
php -l src/Agent/AgentRunner.php
php -l src/Config/AgentRunnerConfig.php
php -l src/Infrastructure/OllamaClient.php
php -l src/Config/RetriexEffectiveConfigProvider.php
python3 -c 'YAML parse check for changed YAML files'
```
Ergebnis:
- PHP-Syntax der geänderten PHP-Dateien: grün.
- YAML-Parsing der geänderten YAML-Dateien: grün.
- Konfigurations-Sanity für `schaue/schau` und `shop`: grün.
Nicht vollständig lokal ausführbar:
```bash
php bin/console mto:agent:config:validate
```
Grund: Im entpackten ZIP ist kein `vendor/` enthalten; `bin/console` bricht mit `Dependencies are missing. Try running "composer install".` ab.
## Nach dem Einspielen bitte prüfen
```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
```
## Manuelle Regressionen
1. `ich würde gern chlor im schwinnbad messen`
- Erwartung: keine endlose Wiederholung des letzten Produkts.
- Falls das Modell trotzdem wiederholt, muss die Antwort durch den Guard abbrechen.
2. `zeige mir Anschlusskabel für pH/Redox`
- Erwartung: Zubehör-/Kabeltreffer direkt listen.
- Kein einleitender Satz über fehlenden Testomat oder fehlendes pH-Messgerät.
3. Dialog:
- `welche indikatoren gibt es für die messung von freiem chlor`
- danach: `schaue im shop`
- Erwartung: Shop-Follow-up nutzt den vorherigen Kontext, nicht die Query `schaue`.
## Hinweise
- Keine Retrieval-, Ranking- oder Produktmatching-Logik wurde geändert.
- Keine neuen fachlichen Token-/Produktlisten im PHP-Core.
- Neue fachliche/sprachliche Begriffe liegen in YAML.
- Der Runtime-Guard ist bewusst generisch und konfigurierbar.

View File

@@ -0,0 +1,81 @@
# RetrieX Patch p53 - Config Layout Cleanup / Shop Runtime Grouping
## Ziel
Dieser Patch gruppiert bestehende Shop-Runtime-Konfiguration in `config/retriex/agent.yaml` unter `shop_runtime`, ohne fachliche Logik zu ändern.
Der Patch ist rein mechanisch:
- keine neue Profil-/Layer-Architektur
- keine neuen Defaults
- keine neuen Token-/Stringlisten
- keine Ranking-, Retrieval- oder Shopware-Kriterienänderung
- keine LLM-Verhaltensänderung
## Geänderte Dateien
- `config/retriex/agent.yaml`
- `config/retriex/vocabulary.yaml`
- `src/Config/AgentRunnerConfig.php`
- `src/Config/RetriexEffectiveConfigProvider.php`
## Neue Gruppierung
Die bisherigen Runtime-Blöcke wurden wie folgt verschoben:
| Alter Pfad | Neuer Pfad |
| --- | --- |
| `direct_shop_result_answer` | `shop_runtime.direct_answer` |
| `shop_prompt.current_input_preservation` | `shop_runtime.query_cleanup.current_input_preservation` |
| `shop_prompt.query_stopword_cleanup` | `shop_runtime.query_cleanup.stopword_cleanup` |
| `shop_prompt.product_attribute_query_cleanup` | `shop_runtime.attribute_cleanup` |
| `shop_prompt.context_usage` | `shop_runtime.context_resolution.context_usage` |
| `shop_prompt.context_anchor_enrichment` | `shop_runtime.context_resolution.history_anchor_enrichment` |
| `shop_prompt.meta_query_guard` | `shop_runtime.context_resolution.meta_query_guard` |
| `shop_prompt.rag_anchor_enrichment` | `shop_runtime.context_resolution.rag_anchor_enrichment` |
| `shop_prompt.direct_result_guard` | `shop_runtime.result_identity` |
| `shop_prompt.length_sort` | `shop_runtime.answer_constraints.length_sort` |
| `shop_prompt.length_filter` | `shop_runtime.answer_constraints.length_filter` |
`final_answer_guard` bleibt bewusst außerhalb von `shop_runtime`, weil er allgemeiner Runtime-/LLM-Ausgabeschutz ist.
`shop_prompt` enthält nach dem Cleanup nur noch den eigentlichen Shop-Query-Optimizer-Prompt und dessen Sprach-/Prompt-Regeln.
## Vocabulary Views
Die Vocabulary-View-Pfade wurden passend zur neuen Layout-Struktur umbenannt, ohne die zugrunde liegenden Listen zu verändern:
- `agent.shop_prompt.current_input_preservation_terms` -> `agent.shop_runtime.query_cleanup.current_input_preservation_terms`
- `agent.shop_prompt.context_anchor_enrichment.trigger_terms` -> `agent.shop_runtime.context_resolution.history_anchor_enrichment.trigger_terms`
Die referenzierten Term-Gruppen bleiben unverändert.
## Lokale Prüfungen
Ausgeführt im entpackten Patch-Arbeitsstand:
```bash
php -l src/Config/AgentRunnerConfig.php
php -l src/Config/RetriexEffectiveConfigProvider.php
python3 - <<'PY'
import yaml
for f in ['config/retriex/agent.yaml', 'config/retriex/vocabulary.yaml']:
yaml.safe_load(open(f, encoding='utf-8'))
PY
```
Zusätzlich wurde per YAML-Strukturvergleich geprüft, dass die verschobenen Runtime-Blöcke ihre bisherigen Werte behalten. Nur die zwei Vocabulary-View-Pfadnamen wurden mechanisch an das neue Layout angepasst.
## Nicht lokal ausführbar
Die Symfony-Console-Checks konnten in dieser Umgebung nicht vollständig ausgeführt werden, weil der ZIP-Stand kein `vendor/` enthält.
## Empfohlene Projektchecks 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
```

View File

@@ -0,0 +1,140 @@
# RetrieX Patch p54 - Single-Genre Configuration Surface
## Ziel
Dieser Patch macht die Konfiguration **genre-faehig fuer eine Installation mit genau einem Genre**.
Er baut **keine** Multi-Genre-, Multi-Tenant- oder SaaS-Umschaltung. Es gibt keinen Request-/Host-/API-Key-Resolver und keine Laufzeit-Auswahl zwischen mehreren Genres.
Stattdessen fuehrt der Patch eine zentrale Konfigurationsflaeche ein, die alle fuer eine spaetere Umwidmung relevanten Parametergruppen sichtbar macht:
- Produktrollen
- Produktattribute und Constraints
- Marken und kanonische Begriffe
- Intent-/Routing-Signale
- Follow-up-/Kontextanker
- Shopquery-Runtime
- Ergebnisidentitaet und Antwortregeln
- Search Repair
- Retrieval-/Language-Begriffe
- Shopdaten-Mapping
- Governance-/Regression-Guardrails
Damit ist klar dokumentiert, welche Parameter fuer ein anderes Genre wie Fashion, Moebel, Ersatzteile oder Elektronik geprueft und angepasst werden muessen.
## Bewusste Nicht-Ziele
- Keine Multi-Domain-/Multi-Genre-Architektur
- Keine Tenant-Logik
- Keine Runtime-Umschaltung pro Request
- Keine neuen fachlichen Defaults
- Keine neuen Tokenlisten im PHP-Core
- Keine Ranking-, Retrieval- oder Shopware-Kriterienaenderung
- Keine LLM-Verhaltensaenderung
- Keine Umbenennung bestehender Rollen wie `device`/`accessory`
## Geaenderte Dateien
```text
config/retriex/genre.yaml
config/services.yaml
src/Config/GenreConfig.php
src/Config/RetriexEffectiveConfigProvider.php
src/Config/ConfigSourceAuditProvider.php
```
## Neue Datei `config/retriex/genre.yaml`
Die neue Datei enthaelt:
```yaml
retriex.genre.config:
id: water_analysis
label: 'Water analysis / measurement devices'
mode: single_installation_single_genre
adaptation_surface:
...
```
`adaptation_surface` ist ein nach Umwidmungsbereichen gruppiertes Inventar. Die dort genannten `paths` zeigen auf bestehende effektive oder rohe Config-Pfade.
Wichtig: Die Eintraege verschieben noch keine fachlichen Werte physisch in `genre.yaml`. Der Patch ist absichtlich ein sicherer Oberflaechen-/Guardrail-Schritt. Bestehende Configs bleiben weiterhin die Quelle der Runtime-Werte.
## Neue Klasse `GenreConfig`
`src/Config/GenreConfig.php` kapselt die neue Genre-Konfiguration:
- `getId()`
- `getLabel()`
- `getMode()`
- `getDescription()`
- `getAdaptationSurface()`
- `toArray()`
Die Klasse enthaelt keine PHP-only Fachlisten.
## Effective Config / Validation
`RetriexEffectiveConfigProvider` gibt nun zusaetzlich den Bereich `genre` aus und validiert:
- `genre.id` ist gesetzt
- `genre.mode` ist gesetzt
- `genre.adaptation_surface` ist eine nicht-leere Map
- jede Gruppe enthaelt eine nicht-leere `paths`-Liste
- referenzierte Pfade werden gegen effektive Config und rohe Symfony-Parameterpfade geprueft
Unbekannte Pfade erzeugen Warnungen, keine Runtime-Fehler. So werden veraltete Surface-Eintraege sichtbar, ohne die Installation hart zu blockieren.
## Config Source Audit
`ConfigSourceAuditProvider` kennt nun auch:
```text
GenreConfig => retriex.genre.config
```
Damit wird die neue Config-Klasse im Audit sauber einem YAML-Parameter zugeordnet.
## Lokale Pruefungen
Ausgefuehrt im entpackten Patch-Arbeitsstand:
```bash
php -l src/Config/GenreConfig.php
php -l src/Config/RetriexEffectiveConfigProvider.php
php -l src/Config/ConfigSourceAuditProvider.php
```
Ergebnis: alle PHP-Lints gruen.
Zusaetzlich wurden alle YAML-Dateien unter `config/retriex/*.yaml` per Python/YAML-Parser geprueft.
Ergebnis: YAML-Parsing gruen.
Die `genre.adaptation_surface.paths` wurden statisch gegen die vorhandenen Config-Pfade geprueft.
Ergebnis: keine fehlenden Pfadreferenzen.
## Nicht lokal ausfuehrbar
`bin/console` konnte lokal nicht ausgefuehrt werden, weil im ZIP kein `vendor/` enthalten ist:
```text
Dependencies are missing. Try running "composer install".
```
## Empfohlene Projektchecks nach dem 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
```
## Naechster moeglicher Schritt
Wenn p54 gruen ist, koennte ein spaeterer Patch einzelne besonders genreabhaengige Werte schrittweise physisch in diese Surface ueberfuehren oder von dort referenzieren.
Das sollte separat und klein passieren, z. B. zuerst nur Produktrollen/Vocabulary-Views, ohne Runtime-Logik zu aendern.

View File

@@ -0,0 +1,89 @@
# RetrieX Patch p55b - Genre Config Values Validation Hotfix
## Purpose
Small follow-up hotfix for p55 Single-Genre Config Values.
p55 correctly added `configuration_values` to `config/retriex/genre.yaml`, but the effective config output used by `mto:agent:config:validate` did not expose this block. As a result, validation reported:
```text
Config validation failed: genre.configuration_values must be a non-empty map.
```
The patch also corrects two stale `adaptation_surface.product_roles` path references for the `no_llm_fallback` product role vocabulary-view indirection.
## Scope
Changed files:
- `config/retriex/genre.yaml`
- `src/Config/RetriexEffectiveConfigProvider.php`
## Changes
### Effective config exposure
`RetriexEffectiveConfigProvider::genreConfig()` now includes:
```php
'configuration_values' => $this->genreConfig->getConfigurationValues(),
```
This makes the p55 value surface visible to the existing config validation path.
### Path reference cleanup
The stale paths:
```text
agent.no_llm_fallback.product_roles.main_device_request_keywords
agent.no_llm_fallback.product_roles.accessory_product_keywords
```
were replaced with the current vocabulary-view config paths:
```text
agent.no_llm_fallback.product_roles.vocabulary_views.main_device_request_keywords
agent.no_llm_fallback.product_roles.vocabulary_views.accessory_product_keywords
```
The same path spelling was corrected in the corresponding `configuration_values.product_roles.no_llm_fallback_terms.source_paths` metadata.
## Non-goals
This patch does not:
- wire runtime behavior to `genre.yaml`
- introduce multi-genre or tenant logic
- add new product terms
- add new defaults
- change ranking, retrieval, Shopware criteria or LLM behavior
- move legacy values out of their existing files
## Local checks
Performed locally in the extracted project without `vendor/`:
```bash
php -l src/Config/GenreConfig.php
php -l src/Config/RetriexEffectiveConfigProvider.php
php -l src/Config/ConfigSourceAuditProvider.php
```
YAML parsing was also checked for all files under `config/retriex/*.yaml`.
A lightweight path check verified that the two corrected `no_llm_fallback` paths now point to existing raw config locations.
Full Symfony console checks could not be executed locally because the ZIP does not contain `vendor/`.
## Recommended project checks
After applying the patch in the full project, run:
```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
```

View File

@@ -0,0 +1,148 @@
# RetrieX Patch p55 - Single-Genre Config Values
## Ziel
Dieser Patch ist der erste Schritt nach p54, um RetrieX fuer eine **eine Installation = ein Genre**-Konfiguration vorzubereiten.
p54 war die Landkarte (`adaptation_surface`). p55 fuegt nun in `config/retriex/genre.yaml` eine erste zentrale Werteflaeche hinzu:
```yaml
retriex.genre.config:
configuration_values:
product_roles:
product_attributes:
brands_and_canonical_terms:
intent_and_routing:
context_resolution:
shop_query_runtime:
result_identity_and_answer_policy:
search_repair:
retrieval_and_language:
shop_data_mapping:
governance_and_regression:
```
Die Werte sind aus dem aktuellen stabilen Wasseranalyse-/Messgeraete-Genre uebernommen. Dadurch ist erstmals an einer zentralen Stelle sichtbar, welche konkreten fachlichen Werte bei einer spaeteren Umwidmung, z. B. auf Fashion, Moebel, Ersatzteile oder Elektronik, ersetzt werden muessten.
## Bewusste Nicht-Ziele
- Keine Multi-Genre-Loesung
- Keine Tenant-Logik
- Keine Runtime-Umschaltung pro Request
- Keine SaaS-/Host-/API-Key-Auswahl
- Keine fachliche Logikaenderung
- Keine neuen fachlichen Tokenlisten im PHP-Core
- Keine Ranking-, Retrieval- oder Shopware-Kriterienaenderung
- Keine LLM-Verhaltensaenderung
- Keine Entfernung alter Config-Pfade
- Kein p56-Wiring
Die Runtime liest nach diesem Patch weiterhin die bisherigen Config-Dateien und Pfade. `configuration_values` ist die neue zentrale Pflege-/Migrationsflaeche, aber noch nicht die fuehrende Runtime-Quelle.
## Geaenderte Dateien
```text
config/retriex/genre.yaml
src/Config/GenreConfig.php
src/Config/RetriexEffectiveConfigProvider.php
RETRIEX_PATCH_55_SINGLE_GENRE_CONFIG_VALUES_README.md
```
## Wichtigste Aenderungen
### `config/retriex/genre.yaml`
Neu ist der Block:
```yaml
configuration_values:
...
```
Er enthaelt die aktuellen genreabhaengigen Werte gruppiert nach denselben Bereichen wie `adaptation_surface`:
- Produktrollen und Shop-/Prompt-Views
- Produktattribute und numerische Constraints
- Marken, Canonical Terms und Query-Enrichment
- Intent- und Routing-Signale
- Follow-up-/Kontextanker
- Shopquery-Runtime
- Result-Identity und Antwort-/Grounding-Regeln
- Search Repair
- Retrieval-/Language-Begriffe
- Shopdaten-Mapping
- Governance-/Regression-Guardrails
Jeder Unterbereich enthaelt `source_paths`, damit nachvollziehbar bleibt, aus welchen bestehenden Runtime-Pfaden die Werte stammen.
### `GenreConfig`
Neue Zugriffsmethoden:
```php
getConfigurationValues(): array
getConfigurationValueGroup(string $group): array
```
Diese Methoden stellen die neue Werteflaeche bereit, ohne die Runtime bereits darauf umzustellen.
### `RetriexEffectiveConfigProvider`
Die Config-Validierung prueft nun zusaetzlich:
- `genre.configuration_values` ist eine nicht-leere Map
- jede Werte-Gruppe ist eine nicht-leere Map
- fuer jede `adaptation_surface`-Gruppe existiert eine passende `configuration_values`-Gruppe
Fehlende Value-Gruppen wuerden als Warnung sichtbar; strukturell falsche Value-Gruppen als Fehler.
## Warum p55 noch kein Wiring macht
p55 soll bewusst risikoarm bleiben. Die alten Pfade bleiben fuehrend, damit bestehende Regressionen und Shop-/RAG-Verhalten unveraendert bleiben.
Der naechste Schritt waere ein separater Patch:
```text
p56 Single-Genre Config Wiring
```
Dort koennen ausgewaehlte Getter oder ein zentraler Effective-Provider bevorzugt aus `genre.configuration_values` lesen und bei fehlenden Werten auf die alten Pfade zurueckfallen.
## Lokale Pruefungen
Ausgefuehrt im entpackten Patch-Arbeitsstand:
```bash
php -l src/Config/GenreConfig.php
php -l src/Config/RetriexEffectiveConfigProvider.php
```
Ergebnis: beide PHP-Lints gruen.
Zusaetzlich wurden alle YAML-Dateien unter `config/retriex/*.yaml` per Python/YAML-Parser geprueft.
Ergebnis: YAML-Parsing gruen.
Zusaetzlich wurde geprueft:
- `adaptation_surface` hat 11 Gruppen
- `configuration_values` hat dieselben 11 Gruppen
- keine `adaptation_surface`-Gruppe ohne entsprechende Werte-Gruppe
## Nicht lokal ausfuehrbar
`bin/console` konnte lokal nicht ausgefuehrt werden, weil im ZIP kein `vendor/` enthalten ist:
```text
Dependencies are missing. Try running "composer install".
```
## Empfohlene Projektchecks nach dem 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
```

View File

@@ -0,0 +1,62 @@
# RetrieX Patch p56 - Single-Genre Config Wiring
## Ziel
Dieser Patch macht die in p55 eingefuehrte `config/retriex/genre.yaml` fuer eine erste, risikoarme Auswahl fachlicher Runtime-Parameter zur bevorzugten Quelle.
Es bleibt strikt bei: eine Installation = ein Genre. Es gibt keine Multi-Genre-Umschaltung, keinen Tenant-Kontext und keinen Request-/Host-Resolver.
## Was geaendert wurde
- `GenreConfig` erhaelt typisierte Value-Getter fuer Listen, Maps, Strings, Booleans und Integer unter `configuration_values`.
- `DomainVocabularyConfig` liest bevorzugt passende Genre-Werte fuer zentrale Produktrollen, Shop-/Prompt-Views, Search-Repair-Views und relevante Vocabulary-Maps.
- `CommerceQueryParserConfig` liest bevorzugt Genre-Werte fuer `known_brands` und `search_token_canonical_map`.
- `QueryEnricherConfig` liest bevorzugt Genre-Werte fuer Query-Enrichment-Regeln.
- `CommerceIntentConfig` liest bevorzugt Genre-Werte fuer Commerce-Signale, Advisory-Patterns, Farben und Groessen.
- `AgentRunnerConfig` liest bevorzugt Genre-Werte fuer ausgewaehlte Shop-Runtime-Listen, Kontextanker, Direct-Answer-Texte und Laengen-Constraint-Patterns.
- `config/services.yaml` verdrahtet `GenreConfig` in diese Config-Fassaden.
## Nicht geaendert
- Keine neue Profil-/Layer-Architektur.
- Keine Multi-Domain-/Tenant-Loesung.
- Keine neuen fachlichen Listen.
- Keine Shopware-Kriterien-, Ranking-, Retrieval- oder LLM-Verhaltensaenderung.
- Legacy-YAML-Pfade bleiben als Fallback erhalten.
## Erwartetes Verhalten
Da p55 die aktuellen Werte bereits identisch gespiegelt hat, sollte sich das Laufzeitverhalten nicht aendern. Der Unterschied ist nur die bevorzugte Pflegequelle fuer die verdrahteten Parameter.
## Geaenderte Dateien
- `config/services.yaml`
- `src/Config/AgentRunnerConfig.php`
- `src/Config/CommerceIntentConfig.php`
- `src/Config/CommerceQueryParserConfig.php`
- `src/Config/DomainVocabularyConfig.php`
- `src/Config/GenreConfig.php`
- `src/Config/QueryEnricherConfig.php`
## Lokale Checks
```bash
php -l src/Config/AgentRunnerConfig.php
php -l src/Config/CommerceIntentConfig.php
php -l src/Config/CommerceQueryParserConfig.php
php -l src/Config/DomainVocabularyConfig.php
php -l src/Config/GenreConfig.php
php -l src/Config/QueryEnricherConfig.php
```
YAML-Parsing fuer alle Dateien unter `config/retriex/*.yaml`.
Projektchecks nach dem 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
```

View File

@@ -0,0 +1,64 @@
# RetrieX Patch p57 - Single-Genre Source Audit / Legacy Cleanup Guard
## Ziel
Dieser Patch ist der naechste kleine Schritt nach p56. Er loescht noch keine Legacy-YAML-Werte, sondern haertet die zentrale Single-Genre-Pflegeflaeche fuer den spaeteren Cleanup.
Es bleibt strikt bei: eine Installation = ein Genre. Es gibt keine Multi-Genre-Umschaltung, keinen Tenant-Kontext und keinen Request-/Host-Resolver.
## Warum dieser Schritt
Nach p55/p56 sind viele fachliche Werte bevorzugt in `config/retriex/genre.yaml` gepflegt, waehrend die alten Pfade als Fallback bestehen bleiben. Damit diese Uebergangsphase kontrollierbar bleibt, muessen die in `genre.configuration_values.*.source_paths` dokumentierten Legacy-/Effective-Pfade selbst validierbar und auditierbar sein.
p57 macht diese Source-Path-Metadaten maschinenlesbar und sichtbar.
## Was geaendert wurde
- `GenreConfig` erhaelt `getConfigurationValueSourcePaths()`.
- `RetriexEffectiveConfigProvider` validiert nun auch die `source_paths` unter `genre.configuration_values` gegen bekannte effektive bzw. Legacy-Config-Pfade.
- `ConfigSourceAuditProvider` sammelt die Single-Genre-Source-Path-Metadaten fuer `mto:agent:config:audit-source --json`.
- `ConfigSourceAuditCommand --details` zeigt zusaetzlich eine Tabelle der Single-Genre-Source-Pfade.
## Nicht geaendert
- Keine Fachlogik-Aenderung.
- Keine neuen fachlichen Listen.
- Keine neuen Defaults.
- Keine Entfernung von Legacy-Fallback-Werten.
- Keine Shopware-Kriterien-, Ranking-, Retrieval- oder LLM-Verhaltensaenderung.
- Keine Multi-Genre-/Tenant-Loesung.
## Erwartetes Verhalten
Das Antwortverhalten bleibt unveraendert. Der Unterschied ist nur, dass die zentrale Genre-Konfiguration besser validiert und auditierbar ist.
Wenn spaeter ein falscher oder veralteter `source_paths`-Eintrag in `genre.yaml` entsteht, meldet `mto:agent:config:validate` eine Warnung statt den Fehler unbemerkt zu lassen.
## Geaenderte Dateien
- `src/Config/GenreConfig.php`
- `src/Config/RetriexEffectiveConfigProvider.php`
- `src/Config/ConfigSourceAuditProvider.php`
- `src/Command/ConfigSourceAuditCommand.php`
- `RETRIEX_PATCH_57_SINGLE_GENRE_SOURCE_AUDIT_README.md`
## Lokale Checks
```bash
php -l src/Config/GenreConfig.php
php -l src/Config/RetriexEffectiveConfigProvider.php
php -l src/Config/ConfigSourceAuditProvider.php
php -l src/Command/ConfigSourceAuditCommand.php
```
YAML-Parsing fuer alle Dateien unter `config/retriex/*.yaml`.
Projektchecks nach dem 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
```

View File

@@ -0,0 +1,81 @@
# RetrieX Patch p58 - Single-Genre Legacy Value Reduction
## Ziel
Dieser Patch ist der erste kontrollierte Legacy-Cleanup nach p56/p57.
Es bleibt strikt bei: eine Installation = ein Genre. Es gibt keine Multi-Genre-Umschaltung, keinen Tenant-Kontext und keinen Request-/Host-Resolver.
## Warum dieser Schritt
p55 hat die aktuellen fachlichen Wasseranalyse-/Messgeraete-Werte in `config/retriex/genre.yaml` gespiegelt. p56 hat eine erste sichere Auswahl dieser Werte als bevorzugte Runtime-Quelle verdrahtet. p57 hat die `source_paths` dieser zentralen Genre-Werte validierbar und auditierbar gemacht.
p58 reduziert nun die erste Welle doppelter Legacy-Wertpflege: Werte, die p56 bereits bevorzugt aus `genre.yaml` liest, werden an ihren alten Pfaden zu leeren Platzhaltern reduziert. Die Pfade bleiben vorhanden, damit Validierung, Audit und Source-Path-Dokumentation weiterhin stabil bleiben.
## Was geaendert wurde
Reduziert wurden ausschliesslich bereits verdrahtete Legacy-Werte in:
- `config/retriex/agent.yaml`
- Shopquery-Stopword-Cleanup-Terms
- direkte Attribut-/Vergleichs-Patterns
- referenzielle Kontextterme
- History-Anchor-Patterns und Template
- Meta-Query-Guard-Terms
- RAG-Anchor-Enrichment-Patterns/-Terms
- Result-Identity-Listen
- Laengenfilter-/Sortierpatterns
- Direct-Shop-Answer-Texte
- `config/retriex/commerce.yaml`
- `commerce_query.known_brands`
- `commerce_query.search_token_canonical_map`
- `config/retriex/intent.yaml`
- Commerce-Strong-Signals
- Advisory-Signals und Advisory-Patterns
- Size-/Color-Terms
- Explicit-Commerce-Intent-Patterns
- `config/retriex/query_enrichment.yaml`
- Query-Enrichment-Regeln
## Nicht geaendert
- Keine Fachlogik-Aenderung.
- Keine neuen fachlichen Listen.
- Keine neuen Defaults.
- Keine Shopware-Kriterien-, Ranking-, Retrieval- oder LLM-Verhaltensaenderung.
- Keine Multi-Genre-/Tenant-Loesung.
- Keine Entfernung von Legacy-Pfaden.
- Keine Reduktion der noch nicht voll entkoppelten `vocabulary.yaml`-Include-Ketten.
## Erwartetes Verhalten
Das Antwortverhalten soll unveraendert bleiben. Die reduzierten Legacy-Werte sind identisch in `genre.configuration_values` vorhanden und werden durch p56 bevorzugt gelesen. Die alten Pfade bleiben als leere Fallback-/Audit-Platzhalter erhalten.
Damit wird die zentrale Single-Genre-Pflegeflaeche staerker: Fuer eine spaetere Umwidmung auf ein anderes Genre sollen diese Werte in `genre.yaml` gepflegt werden, nicht mehr parallel in den alten Runtime-Dateien.
## Lokale Pruefung
Durchgefuehrt:
```bash
python3 - <<'PY'
# YAML-Parsing fuer alle Dateien unter config/retriex/*.yaml und config/services.yaml
PY
```
Zusaetzlich wurde statisch geprueft:
- 32 reduzierte Legacy-Pfade hatten vor der Reduktion identische Werte in `genre.configuration_values`.
- dieselben 32 Legacy-Pfade sind nach der Reduktion leer, aber weiterhin vorhanden.
`bin/console` konnte lokal nicht ausgefuehrt werden, weil im ZIP kein `vendor/` enthalten ist.
## Projektchecks nach dem 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
```

View File

@@ -0,0 +1,75 @@
# RetrieX Patch p59B - Genre Adaptation Surface Cleanup
## Ziel
p59A hat leere Legacy-`source_paths` aus `genre.configuration_values` entfernt und native Genre-Werte mit `origin: genre_native` markiert. p59B räumt nun die darüber liegende `genre.adaptation_surface` auf.
Die `adaptation_surface` soll nicht mehr als Sammelliste alter YAML-Pfade verstanden werden. Sie ist jetzt eine Review-/Orientierungsfläche mit zwei klar getrennten Kategorien:
- `value_paths`: native Pflegepunkte innerhalb von `genre.configuration_values`
- `review_paths`: noch bewusst sichtbare nicht-leere technische, frozen oder runtime-nahe Pfade außerhalb von `genre.configuration_values`
## Änderungen
### `config/retriex/genre.yaml`
- Entfernt das alte generische Feld `adaptation_surface.*.paths` vollständig.
- Entfernt 82 leere Legacy-Inventarpfade aus der `adaptation_surface`.
- Entfernt 20 nicht mehr auflösbare/stale Legacy-Inventarpfade aus der `adaptation_surface`.
- Fügt 47 native `value_paths` hinzu, die direkt auf `configuration_values.*` zeigen.
- Behält 32 nicht-leere technische/frozen/runtime-nahe Pfade als `review_paths`.
### `src/Config/RetriexEffectiveConfigProvider.php`
- `validateGenre()` akzeptiert jetzt die neue `adaptation_surface`-Struktur.
- `value_paths` werden gegen `genre.configuration_values` validiert.
- `review_paths` werden gegen die effektive Konfiguration validiert.
- Das alte Feld `paths` bleibt bewusst kompatibel validierbar, ist aber in `genre.yaml` nicht mehr im Einsatz.
## Nicht geändert
- Keine Runtime-Logik geändert.
- Keine Retrieval-/Prompt-/Shop-/Scoring-Logik geändert.
- Keine Genre-Werte geändert.
- Keine frozen Source-Path-Hashes geändert.
- Keine `configuration_values.*.source_paths` geändert.
## Ergebnis der lokalen Prüfungen
Lokale Prüfungen ohne Projekt-Dependencies:
- `genre.yaml` ist parsebar.
- PHP-Lint grün für die geänderte Config-Klasse.
- Adaptation-Surface-Simulation:
- 11 Surface-Gruppen
- 47 `value_paths`
- 32 `review_paths`
- 0 alte `paths`-Felder
- 0 unbekannte `value_paths`
- 0 unbekannte `review_paths`
- Source-of-Truth-Simulation weiterhin grün:
- 17 Value-Nodes mit `source_paths`
- 39 deklarierte Source-Pfade
- 37 frozen non-empty Legacy-Pfade
- 2 runtime-resolved Pfade
- 0 Fehler
Symfony-Checks konnten lokal nicht ausgeführt werden, weil die ZIP kein `vendor/` enthält.
## Empfohlene Projektchecks nach Einspielen
```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
```
## Folgepatch-Idee
p59C kann die 32 verbliebenen `review_paths` klassifizieren:
- echte technische Config, die nicht nach `genre.yaml` gehört
- frozen Fallbacks, die nach weiterem Rewiring entfernt werden können
- runtime-resolved Werte, die bewusst außerhalb der Genre-Pflege bleiben

View File

@@ -0,0 +1,134 @@
# RetrieX Patch p59 - Complete Genre Wiring
## Ziel
Dieser Patch schliesst die Genre-Verdrahtung weiter ab: noch nicht oder nur indirekt verdrahtete fachliche Parameter lesen nun bevorzugt aus `config/retriex/genre.yaml`.
Wichtig: p59 loescht keine Werte aus Legacy-YAMLs. Die alten Pfade bleiben als Fallback aktiv. Damit ist der Patch bewusst ein reiner Wiring-Schritt und bereitet p60 vor.
## Warum dieser Schritt
p55 bis p58 haben die zentrale Single-Genre-Pflegeflaeche aufgebaut, erste Runtime-Flows an `genre.yaml` angeschlossen und bereits verdrahtete Legacy-Werte kontrolliert reduziert.
p59 erweitert diese bevorzugte Genre-Leselogik auf die verbliebenen fachlichen Oberflaechen, insbesondere:
- `vocabulary.yaml` Include-/View-/Map-Ketten
- `prompt.yaml` fachliche Antwort-, Format- und Grounding-Regeln
- `search_repair.yaml` fachliche Suchreparatur-Patterns und Candidate-Terms
- `retrieval.yaml` Exact-Selection- und fachliche Retrieval-Begriffe
- `language.yaml` `protected_terms`
- `governance.yaml` fachliche Regression-/Guardrail-Erwartungen
- fachliche Intent-/Routing-Restwerte fuer Commerce/Sales
- Commercial-Table-Follow-up-Anker in `agent.yaml`
## Was geaendert wurde
### Genre-Konfiguration
`config/retriex/genre.yaml` wurde um fehlende, bereits bestehende fachliche Werte ergaenzt. Die Werte wurden aus den bisherigen Legacy-Pfaden uebernommen, nicht neu erfunden.
Ergaenzt wurden insbesondere:
- Shop-Semantic-Search-Tokens aus `vocabulary.views.shop.semantic_search_tokens`
- technische Prompt-Keywords aus `vocabulary.views.prompt.technical_product_keywords`
- Measurement-Evidence-Maps aus `vocabulary.maps.prompt.measurement_evidence_guard`
- Safety-Doc-/Safety-Word-Retrieval-Views aus `vocabulary.views.retrieval.*`
### Runtime-/Config-Facades
Folgende Config-Klassen lesen neue fachliche Werte bevorzugt aus `GenreConfig` und fallen sonst auf die bestehenden Legacy-Pfade zurueck:
- `DomainVocabularyConfig`
- `PromptBuilderConfig`
- `SearchRepairConfig`
- `NdjsonHybridRetrieverConfig`
- `LanguageCleanupConfig`
- `GovernanceConfig`
- `SalesIntentConfig`
- `CommerceIntentConfig`
- `AgentRunnerConfig`
### Dependency Injection
`config/services.yaml` injiziert `GenreConfig` nun auch in die neu verdrahteten Config-Facades.
## Nicht geaendert
- Keine Legacy-Wertloeschung.
- Keine Reduktion von `vocabulary.yaml`, `prompt.yaml`, `search_repair.yaml`, `retrieval.yaml`, `language.yaml` oder `governance.yaml`.
- Keine neuen fachlichen Defaults im PHP-Core.
- Keine neuen harten Token-/Stringlisten im PHP-Core.
- Keine Multi-Genre-/Tenant-Umschaltung.
- Keine Aenderung an `model.yaml`, `vector.yaml`, `index.yaml`, `runtime.yaml`, Cache-/Pfad-Konfiguration, LLM-Timeouts, Embedding-Modellen, Chunk-Groessen, technischen Stream Guards oder allgemeinem `final_answer_guard`.
- Keine Shopware-Kriterien-, Ranking-, Retrieval-Scoring- oder LLM-Logik-Aenderung.
## Erwartetes Verhalten
Das fachliche Antwortverhalten soll unveraendert bleiben. Fuer die verdrahteten Werte gilt nun:
1. `genre.yaml` ist bevorzugte Quelle.
2. Die bisherigen Legacy-Pfade bleiben Fallback.
3. p60 kann danach die verbleibenden doppelten Legacy-Werte sicher reduzieren.
Damit bleibt das Zielbild sauber getrennt:
- `genre.yaml` sagt, was fachlich relevant ist.
- Agent/Commerce/Prompt/Retrieval/Search-Repair/Language/Governance sagen, wie diese Werte verarbeitet, validiert oder auditiert werden.
## Lokale Pruefung
Durchgefuehrt:
```bash
php -l src/Config/DomainVocabularyConfig.php
php -l src/Config/PromptBuilderConfig.php
php -l src/Config/SearchRepairConfig.php
php -l src/Config/NdjsonHybridRetrieverConfig.php
php -l src/Config/LanguageCleanupConfig.php
php -l src/Config/GovernanceConfig.php
php -l src/Config/SalesIntentConfig.php
php -l src/Config/CommerceIntentConfig.php
php -l src/Config/AgentRunnerConfig.php
```
Alle PHP-Syntaxchecks waren gruen.
```bash
python3 - <<'PY'
# YAML-Parsing fuer alle Dateien unter config/retriex/*.yaml
PY
```
Alle `config/retriex/*.yaml` Dateien konnten geparst werden.
Zusaetzlich wurde skriptbasiert geprueft, dass die neu verdrahteten Genre-Werte den bisherigen Legacy-Werten entsprechen. Geprueft wurden unter anderem:
- Vocabulary-Views und Vocabulary-Maps
- Prompt-Regeln und technische Keywords
- Search-Repair-Patterns und Candidate-Terms
- Retrieval-Safety-Views und Language-Protected-Terms
- Governance-/Regression-Guardrail-Werte
- Sales-/Commerce-Intent-Restwerte
- Commercial-Table-Follow-up-Anker
Ergebnis: `RESULT PASS`.
`bin/console` konnte lokal nicht ausgefuehrt werden, weil im ZIP kein `vendor/` enthalten ist:
```text
Dependencies are missing. Try running "composer install".
```
## Projektchecks nach dem 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
```
## Naechster Schritt
Wenn p59 gruen ist, kann p60 folgen: `Legacy Value Reduction Final`. Erst dort werden die verbleibenden doppelten fachlichen Werte aus den Legacy-YAMLs entfernt oder auf leere Fallback-Platzhalter reduziert.

View File

@@ -0,0 +1,92 @@
# RetrieX Patch p60b - Prompt Measurement Vocabulary View Hotfix
## Ziel
p60b behebt den nach p60 beobachteten Fehler:
```text
RetrieX prompt vocabulary view "prompt.measurement_evidence_guard.generic_positive_context_terms" resolved to an empty list.
```
## Ursache
p60 hat die Legacy-Werte in `config/retriex/vocabulary.yaml` korrekt auf leere Fallback-Strukturen reduziert. Dabei wurde sichtbar, dass die Prompt-Measurement-Evidence-Views zwar bereits in `genre.yaml` gepflegt werden, aber noch nicht unter den vom Prompt verwendeten View-Pfaden verdrahtet waren.
Die vorhandene Genre-Verdrahtung deckte bereits die Agent-Pfade ab:
```text
agent.rag_evidence_guard.*
```
Der Prompt nutzt jedoch diese Pfade:
```text
prompt.measurement_evidence_guard.*
```
Dadurch fiel der Prompt nach p60 auf die nun leere Legacy-View zurück und brach korrekt mit einer Empty-List-Validierung ab.
## Umsetzung
`src/Config/DomainVocabularyConfig.php` erhält zusätzliche View-Mappings für die Prompt-Measurement-Evidence-Views:
```text
prompt.measurement_evidence_guard.accessory_lookup_guard_terms
prompt.measurement_evidence_guard.accessory_lookup_passthrough_terms
prompt.measurement_evidence_guard.generic_positive_context_terms
prompt.measurement_evidence_guard.generic_negative_context_terms
```
Alle vier lesen nun bevorzugt dieselben genrezentralen Werte wie die bereits vorhandenen Agent-RAG-Evidence-Views:
```text
result_identity_and_answer_policy.measurement_evidence_guard_terms.*
```
## Wichtig
- Keine YAML-Werte wurden wiederhergestellt.
- Keine neuen fachlichen Werte wurden im PHP-Core eingefügt.
- Keine Runtime-Logik wurde fachlich geändert.
- Der Patch ist ein reiner Genre-Wiring-Hotfix für einen von p60 sichtbar gemachten fehlenden View-Alias.
- Die p60-Legacy-Reduktion bleibt erhalten.
## Lokale Checks
Ausgeführt:
```bash
php -l src/Config/DomainVocabularyConfig.php
```
Ergebnis: OK.
Zusätzlich wurde skriptbasiert geprüft, dass alle vier Prompt-Measurement-Evidence-Views nach p60b über `genre.yaml` nicht-leer auflösbar sind:
```text
accessory_lookup_guard_terms: 7 Werte
accessory_lookup_passthrough_terms: 9 Werte
generic_positive_context_terms: 19 Werte
generic_negative_context_terms: 5 Werte
```
YAML-Parsing aller `config/retriex/*.yaml`: OK.
Nicht lokal ausführbar wegen fehlendem `vendor/`:
```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
```
## Empfohlene Checks 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
```

View File

@@ -0,0 +1,133 @@
# RetrieX Patch p60 - Legacy Value Reduction Final
## Ziel
p60 reduziert die nach p59 noch doppelt gepflegten fachlichen Legacy-Werte in den verbleibenden YAML-Dateien.
Die fachlichen Werte bleiben in `config/retriex/genre.yaml` erhalten und werden durch p59 bereits bevorzugt gelesen. Die alten Legacy-Pfade bleiben als Fallback-Struktur bestehen, enthalten aber nur noch leere Platzhalter oder neutrale No-Match-Regex-Platzhalter.
## Wichtig
- Keine PHP-Runtime-Logik geändert.
- Keine neuen harten Token-/Stringlisten im PHP-Core.
- `genre.yaml` bleibt unverändert und enthält weiterhin die fachlichen Werte.
- Technische Verarbeitungsschichten bleiben bestehen.
- Technische Konfigurationen wie Runtime, Model, Vector, Index, Cache, Chunking, Stream Guards und allgemeine Final-Answer-Guards wurden nicht verschoben.
## Geänderte Dateien
- `config/retriex/vocabulary.yaml`
- `config/retriex/search_repair.yaml`
- `config/retriex/retrieval.yaml`
- `config/retriex/language.yaml`
- `config/retriex/prompt.yaml`
- `config/retriex/governance.yaml`
## Reduzierte Bereiche
### vocabulary.yaml
Die durch `DomainVocabularyConfig` bereits aus `genre.yaml` gelesenen Klassen, Views und Maps wurden auf leere Fallbacks reduziert, unter anderem:
- Produktrollen: Device-/Accessory-/Requested-Accessory-Code-Klassen
- Shop-Views: Device-/Accessory-Query, Product, Focus und Semantic-Search-Tokens
- Prompt-Views: Main-Device-/Accessory-/Technical-Product-Keywords
- Search-Repair-Views: Direct-Attribute-, Candidate-, Accessory- und Specificity-Listen
- Retrieval-Views: Generic Product Tokens, Short Model Tokens, Reagent/Safety/Device/Document Looks-Like-Listen
- Measurement-Evidence-Maps und Accessory-Focus-Maps
### prompt.yaml
Die fachlichen Antwortregeln, die seit p59 aus `genre.yaml` gelesen werden, wurden reduziert:
- `output_priority.technical_rules`
- `response_format.technical_rules`
- `response_format.accessory_rules`
- `fact_grounding.technical_rules`
- `fact_grounding.with_shop_rules`
Allgemeine Prompt-Struktur, Labels, Budgets, Shop-Record-Regeln und technische Renderregeln bleiben unverändert.
### search_repair.yaml
Die fachlichen Search-Repair-Listen und Muster wurden reduziert:
- `direct_product_attribute_lookup`
- `specific_model_candidate_patterns`
- genreabhängige Candidate-/Accessory-/Requested-Code-Patterns
Für skalare Regex-Fallbacks werden neutrale gültige No-Match-Platzhalter `/(?!)/u` verwendet, damit YAML-/Regex-Validierung nicht durch leere Strings fehlschlägt.
### retrieval.yaml
Die Exact-Selection-Fachbegriffe wurden reduziert:
- `exact_selection_token_variant_prefixes`
- Indicator-Frage-/Phrase-/Tabellenmuster
- Required-Primary-/Context-Terme
Technische Retrieval-Parameter und nicht genrebezogene Retrieval-Einstellungen bleiben unverändert.
### language.yaml
Die Legacy-`protected_terms` wurden auf einen leeren Fallback reduziert.
Generische Stopword-Gruppen, Cleanup-Profile, Normalisierung, ASCII-Transliteration, Separatoren und Dash-Äquivalente bleiben bewusst in `language.yaml`, weil sie Sprach-/Verarbeitungsschicht und nicht reine Genre-Pflegefläche sind.
### governance.yaml
Die fachlichen Regression-/Guardrail-Erwartungen wurden reduziert:
- `regression_baseline.*` fachliche Token, Werte, Keyword- und Shop-Query-Erwartungen
- `language.protected_stopword_terms`
- `core_pattern_audit.domain_marker_terms`
Technische Audit-Regeln wie Source Roots, excluded paths, suspicious calls, allowed literal patterns und Snippet-Limits bleiben in `governance.yaml`.
## Lokale Validierung
Ausgeführt:
```bash
python3 - <<'PY'
# YAML parse for config/retriex/*.yaml
PY
```
Ergebnis: YAML parse OK.
Zusatzcheck:
- 83 reduzierte Legacy-Pfade geprüft.
- Alle reduzierten Pfade enthalten leere Platzhalter bzw. gültige No-Match-Regex-Fallbacks.
- `genre.yaml` wurde nicht verändert.
Nicht ausführbar in diesem ZIP:
```bash
php bin/console mto:agent:config:validate
```
Grund:
```text
Dependencies are missing. Try running "composer install".
```
## Empfohlene Checks 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
```
## Nächster Patch
Nach grünem p60:
- p61 Genre Source-of-Truth Guard
p61 sollte dann erzwingen, dass neue fachliche Listen nicht wieder außerhalb von `genre.yaml` landen und dass Legacy-Pfade leer/Fallback bleiben.

View File

@@ -0,0 +1,141 @@
# RetrieX Patch p61 - Genre Source-of-Truth Guard
## Ziel
p61 schliesst die Genre-Source-of-Truth-Arbeit nach p59/p60/p60b ab.
Der Patch verschiebt keine fachlichen Werte mehr. Stattdessen erzwingt er per Validate/Audit, dass `genre.yaml` die zentrale Pflegequelle fuer genreabhaengige Werte bleibt und Legacy-Pfade nur noch als leere oder explizit eingefrorene Fallbacks dienen.
## Umfang
Geaendert bzw. ergaenzt:
- `config/retriex/governance.yaml`
- `src/Config/GenreSourceOfTruthGuard.php`
- `src/Config/RetriexEffectiveConfigProvider.php`
- `src/Config/ConfigSourceAuditProvider.php`
- `src/Command/ConfigSourceAuditCommand.php`
## Was der Guard prueft
### 1. Vollstaendige Genre-Werte
`genre.configuration_values` muss eine nicht-leere Map sein.
Fuer jede Gruppe in `genre.adaptation_surface` muss eine entsprechende Gruppe in `genre.configuration_values` existieren.
### 2. Source-Path-Abdeckung
Genre-Wertknoten mit direkter Payload muessen selbst `source_paths` deklarieren oder von einem Parent-Knoten mit `source_paths` abgedeckt sein.
`source_paths` muessen nicht-leere Strings sein und duerfen innerhalb eines Wertknotens nicht doppelt vorkommen.
### 3. Gueltige Source-Pfade
Alle `source_paths` werden gegen die effektive bzw. roh geladene RetrieX-Konfiguration validiert.
Unbekannte Source-Pfade erzeugen jetzt einen Validate-Fehler.
### 4. Legacy-Fallbacks sind leer oder eingefroren
Fuer jeden deklarierten Source-Pfad gilt:
- leerer Legacy-Wert: OK, Status `legacy_fallback_empty`
- runtime-/env-aufgeloester Pfad: OK, Status `legacy_runtime_resolved_allowed`
- nicht-leerer Legacy-Wert mit passendem Hash: OK, Status `legacy_frozen_non_empty`
- nicht-leerer Legacy-Wert ohne registrierten Hash: Fehler
- nicht-leerer Legacy-Wert mit abweichendem Hash: Fehler
Damit brechen Validate/Audit, wenn neue fachliche Listen wieder ausserhalb von `genre.yaml` landen oder eingefrorene Legacy-Werte veraendert werden.
## Warum eingefrorene Fallback-Hashes?
Einige Legacy-Pfade enthalten weiterhin technische Fallback-/Wiring-Werte oder noch nicht entfernte Legacy-Defaults, die im aktuellen gruenen Stand nicht geloescht werden sollten. p61 friert diese Werte per SHA-256-Hash ein.
Dadurch bleibt der aktuelle Stand kompatibel, aber kuenftige Aenderungen an diesen Legacy-Pfaden muessen bewusst ueber `genre.yaml` erfolgen.
## Audit-Ausgabe
`mto:agent:config:audit-source --details` zeigt zusaetzlich:
- `genre_source_of_truth_violations`
- `genre_source_of_truth_fallback_empty`
- `genre_source_of_truth_frozen_non_empty`
- Detailtabelle `Genre source-of-truth guard`
Die Detailtabelle zeigt pro Genre-Wert:
- Genre value path
- Legacy/effective source path
- State
- Hash
## Validate-/Audit-Verhalten
`mto:agent:config:validate` fuehrt den Guard aus und gibt Fehler aus, wenn die Source-of-Truth-Regeln verletzt sind.
`mto:agent:config:audit-source` gibt bei Source-of-Truth-Fehlern jetzt `Command::FAILURE` zurueck.
## Lokale Checks
Ausgefuehrt:
```bash
php -l src/Config/GenreSourceOfTruthGuard.php
php -l src/Config/RetriexEffectiveConfigProvider.php
php -l src/Config/ConfigSourceAuditProvider.php
php -l src/Command/ConfigSourceAuditCommand.php
```
Alle PHP-Lints: OK.
```bash
python3 - <<'PY'
# YAML parse config/retriex/*.yaml
PY
```
YAML parse: OK.
Zusatzcheck:
- Source-of-Truth-Guard-Simulation gegen den aktuellen Stand: 0 Fehler
- Ergebnisstatus der Simulation: leer/frozen/runtime erlaubt
Nicht lokal ausfuehrbar:
```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
```
Grund:
Das ZIP enthaelt kein `vendor/`.
Fehler:
```text
Dependencies are missing. Try running "composer install".
```
## Empfohlene Checks 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
```
## Abschlussbild
Nach p61 gilt:
- `genre.yaml` ist die zentrale fachliche Source of Truth.
- Legacy-YAMLs sind technische Verarbeitungsschichten bzw. leere/eingefrorene Fallbacks.
- Neue fachliche Listen ausserhalb von `genre.yaml` werden durch Validate/Audit verhindert.
- Technische Runtime-/Model-/Vector-/Index-Konfiguration bleibt weiterhin ausserhalb von `genre.yaml`.