# RetrieX Patch 43N - Language Cleanup Group Sets

## Goal

Reduce repeated cleanup-profile group compositions in `language.yaml` without changing effective cleanup behavior.

## Changes

- Added optional `stopword_group_sets` and `phrase_group_sets` to `config/retriex/language.yaml`.
- Moved repeated `de_core` + `conversation` profile composition into `stopword_group_sets.de_conversation`.
- Moved repeated `user_instruction` phrase composition into `phrase_group_sets.user_instruction`.
- Updated `LanguageCleanupConfig` to resolve group sets before local profile groups.
- Existing `stopword_groups`, `phrase_groups`, and `meta_term_groups` remain supported.

## Non-goals

- No new domain/runtime logic.
- No scoring changes.
- No prompt-rule changes.
- No retrieval changes.
- No admin UI changes.
- No new hard-coded fachliche lists in PHP core.

## Expected effective behavior

The effective cleanup profile outputs remain identical to p43M:

- `commerce_query`: same stopwords, phrases, meta terms, protected terms.
- `rag_evidence`: same stopwords, phrases, meta terms, protected terms.
- `retrieval_reference_cleanup`: same stopwords, phrases, meta terms, protected terms.
- `shop_context_fallback`: same stopwords, phrases, meta terms, protected terms.

## Local checks performed

```bash
php -l src/Config/LanguageCleanupConfig.php
php -l src/Config/GovernanceConfig.php
php -l src/Config/AgentRunnerConfig.php
php -l src/Config/PromptBuilderConfig.php
php -l src/Config/SearchRepairConfig.php
python3 YAML parse check for config/retriex/*.yaml
python3 effective p43M-vs-p43N cleanup profile comparison
php LanguageCleanupConfig effective resolver comparison
```

The local `bin/console` checks could not be executed in this artifact environment because the ZIP does not include `vendor/` and Composer dependencies are unavailable here.
